]> granicus.if.org Git - nethack/commitdiff
liquid_flow when digging pit
authorPatR <rankin@nethack.org>
Fri, 1 May 2020 07:42:18 +0000 (00:42 -0700)
committerPatR <rankin@nethack.org>
Fri, 1 May 2020 07:42:18 +0000 (00:42 -0700)
Part of github issue #338 that isn't about shops:  objects at the
spot where a dug pit fills with lava (or water) weren't being
effected by that.

While fixing it, I noticed that hero's steed wasn't affected either.
Also, when conjoined pits are filled in, monsters other than the
steed are at risk but weren't being handled.  Presumably they fell
in on their next move.

doc/fixes37.0
src/dig.c

index 7c9fd4680fab9ac2e0e60a2a3e7cfec54662233a..eac27182f70aaf7d8a49704c4b02d84df56afb74 100644 (file)
@@ -168,6 +168,9 @@ failed untrap while mounted that moved hero onto the trap would leave steed
        with stale coordinates, triggering warnings if 'sanity_check' is On
 when hold_another_object() fails while hero is swallowed, drop the item into
        swallower's inventory instead of onto the floor
+when digging a pit results in it being filled by adjacent pool or lava, any
+       objects at the spot weren't subjected to water or fire damage;
+       also, riding hero's steed wasn't subjected to immersion either
 
 
 Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
index 05cdbbdd7a77192e40133c35b571f82a46004a8b..ad565aac71008c87d8a729fb120efff075d54ca5 100644 (file)
--- a/src/dig.c
+++ b/src/dig.c
@@ -739,6 +739,8 @@ schar typ;
 struct trap *ttmp;
 const char *fillmsg;
 {
+    struct obj *objchain;
+    struct monst *mon;
     boolean u_spot = (x == u.ux && y == u.uy);
 
     if (ttmp)
@@ -748,11 +750,18 @@ const char *fillmsg;
 
     if (fillmsg)
         pline(fillmsg, hliquid(typ == LAVAPOOL ? "lava" : "water"));
-    if (u_spot && !(Levitation || Flying)) {
+    /* handle object damage before hero damage; affects potential bones */
+    if ((objchain = g.level.objects[x][y]) != 0) {
         if (typ == LAVAPOOL)
-            (void) lava_effects();
-        else if (!Wwalking)
-            (void) drown();
+            fire_damage_chain(objchain, TRUE, TRUE, x, y);
+        else
+            water_damage_chain(objchain, TRUE);
+    }
+    /* damage to the hero */
+    if (u_spot) {
+        (void) pooleffects(FALSE);
+    } else if ((mon = m_at(x, y)) != 0) {
+        (void) minliquid(mon);
     }
 }
 
@@ -1685,6 +1694,12 @@ pit_flow(trap, filltyp)
 struct trap *trap;
 schar filltyp;
 {
+    /*
+     * FIXME?
+     *  liquid_flow() -> pooleffects() -> {drown(),lava_effects()}
+     *  might kill the hero; the game will end and if that leaves bones,
+     *  remaining conjoined pits will be left unprocessed.
+     */
     if (trap && filltyp != ROOM && is_pit(trap->ttyp)) {
         struct trap t;
         int idx;