From a bug report: you could vomit when polymorphed into a rat but real life
rats can't/don't vomit. The latter was confirmed by <Someone> and <Someone>.
While testing a fix for this, I discovered a couple of other problems.
Healing magic which cured sickness failed to heal Vomiting (potion or
spell; unicorn horn deals with them separately). Enlightenment failed to
report Vomiting (it's not shown on the status line). Most significant was
that vomiting_dialogue() called vomit() twice (also make_confused() and
make_stunned() three times for every once intended). It was dividing the
remaining turns by 3 and then using that value to decide what to do, but
only message display took into account that the same divided value would
occur on 3 consecutive turns (or just 2 for the final countdown to 0,
because dialog routine gets called before timed-property decrement).
hangup save took place during level change; leaving the level by any
means other than triggering the portal would reactivate it
hero wasn't allowed to affix candles to the candelabrum while underwater
+non-unicorn horn healing magic which cures sickness now also cures vomiting
+vomiting/nauseated state is included in enlightenment feedback
+vomiting countdown actually triggered the final vomit code twice
+rats aren't capable of vomiting
Platform- and/or Interface-Specific Fixes
E boolean FDECL(breakarm, (struct permonst *));
E boolean FDECL(sliparm, (struct permonst *));
E boolean FDECL(sticks, (struct permonst *));
+E boolean FDECL(cantvomit, (struct permonst *));
E int FDECL(num_horns, (struct permonst *));
/* E boolean FDECL(canseemon, (struct monst *)); */
E struct attack *FDECL(dmgtype_fromattack, (struct permonst *,int,int));
-/* SCCS Id: @(#)cmd.c 3.5 2007/01/12 */
+/* SCCS Id: @(#)cmd.c 3.5 2007/02/05 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
if (Stoned) you_are("turning to stone","");
if (Slimed) you_are("turning into slime","");
if (Strangled) you_are((u.uburied) ? "buried" : "being strangled","");
+ if (Vomiting) you_are("nauseated","");
if (Glib) {
Sprintf(buf, "slippery %s", makeplural(body_part(FINGER)));
you_have(buf,"");
-/* SCCS Id: @(#)eat.c 3.5 2007/01/24 */
+/* SCCS Id: @(#)eat.c 3.5 2007/02/05 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
void
vomit() /* A good idea from David Neves */
{
- make_sick(0L, (char *) 0, TRUE, SICK_VOMITABLE);
+ if (cantvomit(youmonst.data))
+ /* doesn't cure food poisoning; message assumes that we aren't
+ dealing with some esoteric body_part() */
+ Your("jaw gapes convulsively.");
+ else
+ make_sick(0L, (char *)0, TRUE, SICK_VOMITABLE);
nomul(-2);
nomovemsg = You_can_move_again;
}
-/* SCCS Id: @(#)mondata.c 3.5 2006/11/24 */
+/* SCCS Id: @(#)mondata.c 3.5 2007/02/05 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
attacktype(ptr,AT_HUGS)));
}
+boolean
+cantvomit(ptr)
+struct permonst *ptr;
+{
+ /* rats and mice are incapable of vomitting;
+ which other creatures have the same limitation? */
+ if (ptr->mlet == S_RODENT &&
+ ptr != &mons[PM_ROCK_MOLE] &&
+ ptr != &mons[PM_WOODCHUCK])
+ return TRUE;
+ return FALSE;
+}
+
/* number of horns this type of monster has on its head */
int
num_horns(ptr)
-/* SCCS Id: @(#)potion.c 3.5 2006/11/29 */
+/* SCCS Id: @(#)potion.c 3.5 2007/02/05 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
if(u.uhp > u.uhpmax) u.uhp = (u.uhpmax += nxtra);
}
}
- if(cureblind) make_blinded(0L,TRUE);
- if(curesick) make_sick(0L, (char *) 0, TRUE, SICK_ALL);
+ if (cureblind) make_blinded(0L, TRUE);
+ if (curesick) {
+ make_vomiting(0L, TRUE);
+ make_sick(0L, (char *)0, TRUE, SICK_ALL);
+ }
context.botl = 1;
return;
}
-/* SCCS Id: @(#)timeout.c 3.5 2006/07/08 */
+/* SCCS Id: @(#)timeout.c 3.5 2007/02/05 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
STATIC_OVL void
vomiting_dialogue()
{
- register long i = (Vomiting & TIMEOUT) / 3L;
-
- if ((((Vomiting & TIMEOUT) % 3L) == 2) && (i >= 0)
- && (i < SIZE(vomiting_texts)))
- You(vomiting_texts[SIZE(vomiting_texts) - i - 1]);
-
- switch ((int) i) {
- case 0:
- stop_occupation();
- morehungry(20);
- vomit();
- break;
- case 2:
+ const char *txt = 0;
+ long v = (Vomiting & TIMEOUT);
+
+ /* note: nhtimeout() hasn't decremented timed properties for the
+ current turn yet, so we use Vomiting-1 here */
+ switch ((int)(v - 1L)) {
+ case 14: txt = vomiting_texts[0]; break;
+ case 11: txt = vomiting_texts[1]; break;
+ case 6:
make_stunned(HStun + d(2,4), FALSE);
if (!Popeye(VOMITING)) stop_occupation();
- /* fall through */
- case 3:
+ /*FALLTHRU*/
+ case 9:
make_confused(HConfusion + d(2,4), FALSE);
if (multi > 0) nomul(0);
break;
+ case 8: txt = vomiting_texts[2]; break;
+ case 5: txt = vomiting_texts[3]; break;
+ case 2: txt = vomiting_texts[4];
+ if (cantvomit(youmonst.data)) txt = "gag uncontrolably.";
+ break;
+ case 0:
+ stop_occupation();
+ if (!cantvomit(youmonst.data)) morehungry(20);
+ vomit();
+ break;
+ default: break;
}
+ if (txt) You("%s", txt);
exercise(A_CON, FALSE);
}