fatal explosion feedback (trunk only)

From the newsgroup:
    As you read the scroll, it disappears.
    The scroll erupts in a tower of flame!
    Your spellbook of force bolt catches fire and burns!
    [...]
    Your potion of paralysis boils and explodes!
    Something seems to be holding you.
    Do you want your possessions idenified?
This character survived the burning and boiling objects then succumbed
to the initial flame explosion.

     A fatal explosion calls done() without any explanation.  Or rather,
it dated to the time where it would immediately follow "the scroll erupts
in flame" (or "you are caught in <some kind of> explosion") without the
chance for intervening messages.  Then when item destruction was moved
sooner (for bones file purposes), message sequencing was left dangling.
This patch adds a new "it was fatal" message in front of done().
This commit is contained in:
nethack.rankin
2009-01-05 00:35:39 +00:00
parent 76350a5348
commit 8c90e9ae7b
4 changed files with 17 additions and 8 deletions

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)explode.c 3.5 2007/04/27 */
/* SCCS Id: @(#)explode.c 3.5 2009/01/04 */
/* Copyright (C) 1990 by Ken Arromdee */
/* NetHack may be freely redistributed. See license for details. */
@@ -361,6 +361,7 @@ int expltype;
str = hallu_buf;
}
You("are caught in the %s!", str);
iflags.last_msg = PLNMSG_CAUGHT_IN_EXPLOSION;
}
/* do property damage first, in case we end up leaving bones */
if (adtyp == AD_FIRE) burn_away_slime();
@@ -400,14 +401,17 @@ int expltype;
killer.format = NO_KILLER_PREFIX;
Sprintf(killer.name, "caught %sself in %s own %s",
uhim(), uhis(), str);
} else if (!strncmpi(str,"tower of flame", 8) ||
!strncmpi(str,"fireball", 8)) {
killer.format = KILLED_BY_AN;
Strcpy(killer.name, str);
} else {
killer.format = KILLED_BY;
killer.format = (!strcmpi(str, "tower of flame") ||
!strcmpi(str, "fireball")) ?
KILLED_BY_AN : KILLED_BY;
Strcpy(killer.name, str);
}
if (iflags.last_msg == PLNMSG_CAUGHT_IN_EXPLOSION ||
iflags.last_msg == PLNMSG_TOWER_OF_FLAME) /*seffects()*/
pline("It is fatal.");
else
pline_The("%s is fatal.", str);
/* Known BUG: BURNING suppresses corpse in bones data,
but done does not handle killer reason correctly */
done((adtyp == AD_FIRE) ? BURNING : DIED);