diff --git a/src/eat.c b/src/eat.c index 40c7a4399..cff0a12fd 100644 --- a/src/eat.c +++ b/src/eat.c @@ -3181,7 +3181,8 @@ vomit() /* A good idea from David Neves */ dealing with some esoteric body_part() */ Your("jaw gapes convulsively."); } else { - make_sick(0L, (char *) 0, TRUE, SICK_VOMITABLE); + if (Sick && (u.usick_type & SICK_VOMITABLE) != 0) + make_sick(0L, (char *) 0, TRUE, SICK_VOMITABLE); /* if not enough in stomach to actually vomit then dry heave; vomiting_dialog() gives a vomit message when its countdown reaches 0, but only if u.uhs < FAINTING (and !cantvomit()) */ diff --git a/src/potion.c b/src/potion.c index 6904bc315..281a2e4a3 100644 --- a/src/potion.c +++ b/src/potion.c @@ -113,6 +113,7 @@ const char *cause; /* sickness cause */ boolean talk; int type; { + struct kinfo *kptr; long old = Sick; #if 0 @@ -148,11 +149,17 @@ int type; context.botl = TRUE; } + kptr = find_delayed_killer(SICK); if (Sick) { exercise(A_CON, FALSE); - delayed_killer(SICK, KILLED_BY_AN, cause); + if (!old || !kptr) { + int kpfx = ((cause && !strcmp(cause, "#wizintrinsic")) + ? KILLED_BY : KILLED_BY_AN); + + delayed_killer(SICK, kpfx, cause); + } } else - dealloc_killer(find_delayed_killer(SICK)); + dealloc_killer(kptr); } void diff --git a/src/timeout.c b/src/timeout.c index a75fc66b9..1360f1132 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -136,10 +136,19 @@ stoned_dialogue() nomul(-3); /* can't move anymore */ multi_reason = "getting stoned"; nomovemsg = You_can_move_again; /* not unconscious */ + /* "your limbs have turned to stone" so terminate wounded legs */ + if ((HWounded_legs & TIMEOUT) != 0L && !u.usteed) + set_itimeout(&HWounded_legs, 0L); break; - case 2: + case 2: /* turned to stone */ if ((HDeaf & TIMEOUT) > 0L && (HDeaf & TIMEOUT) < 5L) set_itimeout(&HDeaf, 5L); /* avoid Hear_again at tail end */ + /* if also vomiting or turning into slime, stop those */ + if ((Vomiting & TIMEOUT) != 0L) + set_itimeout(&Vomiting, 0L), context.botl = 1; + if ((Slimed & TIMEOUT) != 0L) + set_itimeout(&Slimed, 0L), context.botl = 1; + break; default: break; } @@ -318,15 +327,25 @@ slime_dialogue() } else pline1(buf); } - if (i == 3L) { /* limbs becoming oozy */ + + switch (i) { + case 3L: /* limbs becoming oozy */ HFast = 0L; /* lose intrinsic speed */ if (!Popeye(SLIMED)) stop_occupation(); if (multi > 0) nomul(0); + break; + case 2L: /* skin begins to peel */ + if ((HDeaf & TIMEOUT) > 0L && (HDeaf & TIMEOUT) < 5L) + set_itimeout(&HDeaf, 5L); /* avoid Hear_again at tail end */ + break; + case 1L: /* turning into slime */ + /* if also turning to stone, stop doing that (no message) */ + if ((Stoned & TIMEOUT) != 0L) + set_itimeout(&Stoned, 0L), context.botl = 1; + break; } - if (i == 2L && (HDeaf & TIMEOUT) > 0L && (HDeaf & TIMEOUT) < 5L) - set_itimeout(&HDeaf, 5L); /* avoid Hear_again at tail end */ exercise(A_DEX, FALSE); }