]> granicus.if.org Git - nethack/commitdiff
crushed to death by a gas spore's explosion
authorPatR <rankin@nethack.org>
Mon, 21 Aug 2017 22:50:36 +0000 (15:50 -0700)
committerPatR <rankin@nethack.org>
Mon, 21 Aug 2017 22:50:36 +0000 (15:50 -0700)
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....

doc/fixes36.1
src/dbridge.c
src/explode.c
src/mon.c

index 7324c9eac8e4d6317d067a733a06b5b2e216c9ff..ed5d98304410cc7a9d33c0f79d0112397667edf9 100644 (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
index 0d0421862f01f81dc2038b51e169f8ea9c474ff4..bf03f8d4aa5cdc65fe482a4b6ea47b1a74b960f3 100644 (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*/
index 74dfcdae20c1857c297f8bbbf3ca1ff07b99b2a8..50674f087e2f41da52e7308af0e1f6a90d69bfb6 100644 (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) {
index 466de5c3134c6afb351c61d22165e33c1425b8b2..118b58a8ee6f5b92d0c4022c1f7b09c6b6a6b952 100644 (file)
--- 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;
         }
     }