From: PatR Date: Thu, 7 Jan 2016 09:53:06 +0000 (-0800) Subject: fix #H4181 - strange death messages X-Git-Tag: NetHack-3.6.1_RC01~1061 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9fae6217786305dd4c5fdd7961c9f4674fdac625;p=nethack fix #H4181 - strange death messages "Petrified by , while getting stoned." -- multi_reason "while getting stoned" explains why no last-second recovery could be made, but doesn't explain how the petrification happened, so suppress it. "Died of starvation, while fainted from lack of food." -- nethack does not display this; presumeably the IRC death notices for NAO are generated from xlogfile entries. Change 'while fainted from lack of food' to 'while fainted' at time of death if reason for death is starvation. The longer version is accurate but sounds fairly silly. When starvation is set in motion, set it up before checking whether the initial faint triggers falling on a wielded cockatrice corpse, so that fainting isn't applied after recovery in case of life-saving. --- 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));