]> granicus.if.org Git - nethack/commitdiff
Make travel consider traps like closed doors
authorPasi Kallinen <paxed@alt.org>
Mon, 21 Dec 2015 15:31:04 +0000 (17:31 +0200)
committerPasi Kallinen <paxed@alt.org>
Mon, 21 Dec 2015 15:36:14 +0000 (17:36 +0200)
Test case: U-shaped corridor, with a known trap in it.
Before this change, travel would try to move straight at
the target, bumping the wall or walking into a dead-end.
After this, travel will go along the corridor and then stop
right before the trap.

Original patch via AceHack by Alex Smith.

doc/fixes36.1
include/hack.h
src/hack.c

index b3dd4b19d986a13bad2ae21f15513741ab8d65ed..41c8359975e4c57f06be758c64781f3ad7a5a804 100644 (file)
@@ -50,6 +50,8 @@ add novel to discoveries list after reading one
 putting gold into hero-owned container on shop floor gave free credit
 stack splitting for dipping large quantities of potions was done poorly
 dipping fruit juice into enlightenment gave different result than the inverse
+make travel walk up to a trap and stop when the trap blocks the only
+       way forward, instead of trying to go straight line
 
 
 Platform- and/or Interface-Specific Fixes
index 319f4d344e04d706c9aa1cfbf357da9b57fdfe59..fc31dd887e216dff65755d14bfe56bbc87f2a067 100644 (file)
@@ -277,6 +277,7 @@ NEARDATA extern coord bhitpos; /* place where throw or zap hits or stops */
 #define DO_MOVE 0   /* really doing the move */
 #define TEST_MOVE 1 /* test a normal move (move there next) */
 #define TEST_TRAV 2 /* test a future travel location */
+#define TEST_TRAP 3 /* check if a future travel loc is a trap */
 
 /*** some utility macros ***/
 #define yn(query) yn_function(query, ynchars, 'n')
index 3e606f6beb25b786ac3b5aa4a755f078d38a45b9..a3886457c45cac03902aeda871b5d9bf534426e9 100644 (file)
@@ -657,7 +657,7 @@ xchar x, y;
 }
 
 /* return TRUE if (dx,dy) is an OK place to move
- * mode is one of DO_MOVE, TEST_MOVE or TEST_TRAV
+ * mode is one of DO_MOVE, TEST_MOVE, TEST_TRAV, or TEST_TRAP
  */
 boolean
 test_move(ux, uy, dx, dy, mode)
@@ -747,7 +747,7 @@ int mode;
                         } else
                             pline("That door is closed.");
                     }
-                } else if (mode == TEST_TRAV)
+                } else if (mode == TEST_TRAV || mode == TEST_TRAP)
                     goto testdiag;
                 return FALSE;
             }
@@ -790,15 +790,19 @@ int mode;
     /* Pick travel path that does not require crossing a trap.
      * Avoid water and lava using the usual running rules.
      * (but not u.ux/u.uy because findtravelpath walks toward u.ux/u.uy) */
-    if (context.run == 8 && mode != DO_MOVE && (x != u.ux || y != u.uy)) {
+    if (context.run == 8
+        && (mode == TEST_MOVE || mode == TEST_TRAP)
+        && (x != u.ux || y != u.uy)) {
         struct trap *t = t_at(x, y);
 
         if ((t && t->tseen)
             || (!Levitation && !Flying && !is_clinger(youmonst.data)
                 && is_pool_or_lava(x, y) && levl[x][y].seenv))
-            return FALSE;
+            return (mode == TEST_TRAP);
     }
 
+    if (mode == TEST_TRAP) return FALSE; /* do not move through traps */
+
     ust = &levl[ux][uy];
 
     /* Now see if other things block our way . . */
@@ -923,7 +927,8 @@ boolean guess;
                     if (!isok(nx, ny))
                         continue;
                     if ((!Passes_walls && !can_ooze(&youmonst)
-                         && closed_door(x, y)) || sobj_at(BOULDER, x, y)) {
+                         && closed_door(x, y)) || sobj_at(BOULDER, x, y)
+                        || test_move(x, y, nx-x, ny-y, TEST_TRAP)) {
                         /* closed doors and boulders usually
                          * cause a delay, so prefer another path */
                         if (travel[x][y] > radius - 3) {