From: PatR Date: Mon, 21 Aug 2017 22:50:36 +0000 (-0700) Subject: crushed to death by a gas spore's explosion X-Git-Tag: NetHack-3.6.1_RC01~412^2~16 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0ad33783f0c9005d1baf05fee3172e488a4bc803;p=nethack 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.... --- diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 7324c9eac..ed5d98304 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -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 diff --git a/src/dbridge.c b/src/dbridge.c index 0d0421862..bf03f8d4a 100644 --- a/src/dbridge.c +++ b/src/dbridge.c @@ -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*/ diff --git a/src/explode.c b/src/explode.c index 74dfcdae2..50674f087 100644 --- a/src/explode.c +++ b/src/explode.c @@ -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) { diff --git a/src/mon.c b/src/mon.c index 466de5c31..118b58a8e 100644 --- a/src/mon.c +++ b/src/mon.c @@ -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; } }