fix #H4181 - strange death messages
"Petrified by <foo>, 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.
This commit is contained in:
@@ -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 <monster> (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
|
||||
|
||||
@@ -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;
|
||||
|
||||
38
src/end.c
38
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 <foo>, while getting stoned" -- "while getting stoned"
|
||||
prevented any last-second recovery, but it was not the cause of
|
||||
"petrified by <foo>" */
|
||||
{ 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 <foo> 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));
|
||||
|
||||
Reference in New Issue
Block a user