diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 12386fc24..b2c3197ca 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -88,6 +88,7 @@ make mimics mimicing walls or trees also block light stepping onto lava destroyed non-fireproof water walking boots but left other vulnerable boot types intact fix death reason when eating tainted glob of (not corpse) +fix death reason when petrified (avoid redundant 'while getting stoned') use appropriate place name for drum of earthquake shakes fix unmapped branch stairs on sokoban level redraw map when hilite_pile is toggled to display the highlighting diff --git a/src/eat.c b/src/eat.c index 7591b9cc3..13a394405 100644 --- a/src/eat.c +++ b/src/eat.c @@ -2838,14 +2838,14 @@ boolean incr; /* stop what you're doing, then faint */ stop_occupation(); You("faint from lack of food."); - if (!Levitation) - selftouch("Falling, you"); incr_itimeout(&HDeaf, duration); nomul(-duration); multi_reason = "fainted from lack of food"; nomovemsg = "You regain consciousness."; afternmv = unfaint; newhs = FAINTED; + if (!Levitation) + selftouch("Falling, you"); } } else if (u.uhunger < -(int) (200 + 20 * ACURR(A_CON))) { u.uhs = STARVED; diff --git a/src/end.c b/src/end.c index 5e5231856..7e53467e7 100644 --- a/src/end.c +++ b/src/end.c @@ -503,6 +503,42 @@ int how; return; } +/* some special cases for overriding while-helpless reason */ +static const struct { + int why, unmulti; + const char *exclude, *include; +} death_fixups[] = { + /* "petrified by , while getting stoned" -- "while getting stoned" + prevented any last-second recovery, but it was not the cause of + "petrified by " */ + { STONING, 1, "getting stoned", (char *) 0 }, + /* "died of starvation, while fainted from lack of food" is accurate + but sounds a fairly silly (and doesn't actually appear unless you + splice together death and while-helpless from xlogfile) */ + { STARVING, 0, "fainted from lack of food", "fainted" }, +}; + +/* clear away while-helpless when the cause of death caused that + helplessness (ie, "petrified by while getting stoned") */ +STATIC_DCL void +fixup_death(how) +int how; +{ + int i; + + for (i = 0; i < SIZE(death_fixups); ++i) + if (death_fixups[i].why == how + && !strcmp(death_fixups[i].exclude, multi_reason)) { + if (death_fixups[i].include) /* substitute an alternate reason */ + multi_reason = death_fixups[i].include; + else /* remove the helplessness reason */ + multi_reason = (char *) 0; + if (death_fixups[i].unmulti) /* possibly hide helplessness */ + multi = 0L; + break; + } +} + #if defined(WIN32) && !defined(SYSCF) #define NOTIFY_NETHACK_BUGS #endif @@ -1002,6 +1038,8 @@ int how; if (how == ESCAPED || how == PANICKED) killer.format = NO_KILLER_PREFIX; + fixup_death(how); /* actually, fixup multi_reason */ + if (how != PANICKED) { /* these affect score and/or bones, but avoid them during panic */ taken = paybill((how == ESCAPED) ? -1 : (how != QUIT));