crushed to death by a gas spore's explosion

From the newsgroup, remarking on an usual cause of death seen at NAO.
Surviving a gas spore's explosion (via hit points, not from life-saving)
left "gas spore's explosion" as stale killer.name.  Being killed by
opening a drawbridge (but not by closing or breaking one) only assigned
killer.name if it didn't already have a value, so the stale reason got
used:  crushed to death by a gas spore's explosion.

This fixes it two ways:  clear the stale value after surviving the
explosion, and assign a specific reason when opening the drawbridge.

This also removes stale reason for death set up by various drawbridge
activity.  For the usual case, the hero only survives by life-saving
which does its own clearing of killer.name.  But there might have been
cases where it was being set for the hero when operating on a monster,
so no life-saving involved.  The drawbridge code is not the easiest
code to navigate....
This commit is contained in:
PatR
2017-08-21 15:50:36 -07:00
parent eadecb1baf
commit 0ad33783f0
4 changed files with 31 additions and 24 deletions

View File

@@ -414,6 +414,9 @@ the "bonesid" written into bones files when they're created so that they can
be validated when loaded was incorrect for bones in the quest branch
("QBar.2" ended up being "ar.2", "QKni.4" ended up as "ni.4", and so
forth) but worked anyway, because validation used same incorrect value
surviving a gas spore's explosion would leave that explosion as a stale reason
for death which might show up strangely ("crushed to death by a gas
spore's explosion" when killed by an opening drawbridge)
Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 dbridge.c $NHDT-Date: 1449269914 2015/12/04 22:58:34 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.35 $ */
/* NetHack 3.6 dbridge.c $NHDT-Date: 1503355815 2017/08/21 22:50:15 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.39 $ */
/* Copyright (c) 1989 by Jean-Christophe Collet */
/* NetHack may be freely redistributed. See license for details. */
@@ -230,7 +230,6 @@ int *x, *y;
* dir is the direction.
* flag must be put to TRUE if we want the drawbridge to be opened.
*/
boolean
create_drawbridge(x, y, dir, flag)
int x, y, dir;
@@ -375,7 +374,6 @@ struct entity *etmp;
* Generates capitalized entity name, makes 2nd -> 3rd person conversion on
* verb, where necessary.
*/
STATIC_OVL const char *
E_phrase(etmp, verb)
struct entity *etmp;
@@ -397,7 +395,6 @@ const char *verb;
/*
* Simple-minded "can it be here?" routine
*/
STATIC_OVL boolean
e_survives_at(etmp, x, y)
struct entity *etmp;
@@ -486,7 +483,6 @@ int xkill_flags, how;
/*
* These are never directly affected by a bridge or portcullis.
*/
STATIC_OVL boolean
automiss(etmp)
struct entity *etmp;
@@ -498,7 +494,6 @@ struct entity *etmp;
/*
* Does falling drawbridge or portcullis miss etmp?
*/
STATIC_OVL boolean
e_missed(etmp, chunks)
struct entity *etmp;
@@ -536,7 +531,6 @@ boolean chunks;
/*
* Can etmp jump from death?
*/
STATIC_OVL boolean
e_jumps(etmp)
struct entity *etmp;
@@ -604,6 +598,11 @@ struct entity *etmp;
}
} else {
if (crm->typ == DRAWBRIDGE_DOWN) {
if (is_u(etmp)) {
killer.format = NO_KILLER_PREFIX;
Strcpy(killer.name,
"crushed to death underneath a drawbridge");
}
pline("%s crushed underneath the drawbridge.",
E_phrase(etmp, "are")); /* no jump */
e_died(etmp,
@@ -639,11 +638,10 @@ struct entity *etmp;
/*
* Here's where we try to do relocation. Assumes that etmp is not
* arriving
* at the portcullis square while the drawbridge is falling, since this
* square
* would be inaccessible (i.e. etmp started on drawbridge square) or
* unnecessary (i.e. etmp started here) in such a situation.
* arriving at the portcullis square while the drawbridge is
* falling, since this square would be inaccessible (i.e. etmp
* started on drawbridge square) or unnecessary (i.e. etmp started
* here) in such a situation.
*/
debugpline0("Doing relocation.");
newx = oldx;
@@ -654,12 +652,10 @@ struct entity *etmp;
debugpline0("Checking new square for occupancy.");
if (relocates && (e_at(newx, newy))) {
/*
* Standoff problem: one or both entities must die, and/or both
* switch
* places. Avoid infinite recursion by checking first whether the
* other
* entity is staying put. Clean up if we happen to move/die in
* recursion.
* Standoff problem: one or both entities must die, and/or
* both switch places. Avoid infinite recursion by checking
* first whether the other entity is staying put. Clean up if
* we happen to move/die in recursion.
*/
struct entity *other;
@@ -763,10 +759,12 @@ struct entity *etmp;
}
}
/* clear stale reason for death before returning */
#define nokiller() (killer.name[0] = '\0', killer.format = 0)
/*
* Close the drawbridge located at x,y
*/
void
close_drawbridge(x, y)
int x, y;
@@ -823,12 +821,12 @@ int x, y;
newsym(x, y);
newsym(x2, y2);
block_point(x2, y2); /* vision */
nokiller();
}
/*
* Open the drawbridge located at x,y
*/
void
open_drawbridge(x, y)
int x, y;
@@ -870,12 +868,12 @@ int x, y;
unblock_point(x2, y2); /* vision */
if (Is_stronghold(&u.uz))
u.uevent.uopened_dbridge = TRUE;
nokiller();
}
/*
* Let's destroy the drawbridge located at x,y
*/
void
destroy_drawbridge(x, y)
int x, y;
@@ -898,6 +896,7 @@ int x, y;
|| (lev1->drawbridgemask & DB_UNDER) == DB_LAVA) {
struct obj *otmp2;
boolean lava = (lev1->drawbridgemask & DB_UNDER) == DB_LAVA;
if (lev1->typ == DRAWBRIDGE_UP) {
if (cansee(x2, y2))
pline_The("portcullis of the drawbridge falls into the %s!",
@@ -999,6 +998,7 @@ int x, y;
do_entity(etmp1);
}
}
nokiller();
}
/*dbridge.c*/

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 explode.c $NHDT-Date: 1496103440 2017/05/30 00:17:20 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.49 $ */
/* NetHack 3.6 explode.c $NHDT-Date: 1503355817 2017/08/21 22:50:17 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.50 $ */
/* Copyright (C) 1990 by Ken Arromdee */
/* NetHack may be freely redistributed. See license for details. */
@@ -90,7 +90,9 @@ int expltype;
if (olet == MON_EXPLODE) {
str = killer.name;
do_hallu = Hallucination && strstri(str, "'s explosion");
do_hallu = (Hallucination
&& (strstri(str, "'s explosion")
|| strstri(str, "s' explosion")));
adtyp = AD_PHYS;
} else
switch (abs(type) % 10) {

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 mon.c $NHDT-Date: 1502753408 2017/08/14 23:30:08 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.242 $ */
/* NetHack 3.6 mon.c $NHDT-Date: 1503355818 2017/08/21 22:50:18 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.243 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1994,6 +1994,8 @@ boolean was_swallowed; /* digestion */
Sprintf(killer.name, "%s explosion", s_suffix(mdat->mname));
killer.format = KILLED_BY_AN;
explode(mon->mx, mon->my, -1, tmp, MON_EXPLODE, EXPL_NOXIOUS);
killer.name[0] = '\0';
killer.format = 0;
return FALSE;
}
}