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
#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')
}
/* 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)
} else
pline("That door is closed.");
}
- } else if (mode == TEST_TRAV)
+ } else if (mode == TEST_TRAV || mode == TEST_TRAP)
goto testdiag;
return FALSE;
}
/* 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 . . */
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) {