From 9a2eb370e70482d13e9a9de5b4561b5c3e509a69 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Mon, 21 Dec 2015 17:31:04 +0200 Subject: [PATCH] Make travel consider traps like closed doors 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 | 2 ++ include/hack.h | 1 + src/hack.c | 15 ++++++++++----- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/doc/fixes36.1 b/doc/fixes36.1 index b3dd4b19d..41c835997 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -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 diff --git a/include/hack.h b/include/hack.h index 319f4d344..fc31dd887 100644 --- a/include/hack.h +++ b/include/hack.h @@ -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') diff --git a/src/hack.c b/src/hack.c index 3e606f6be..a3886457c 100644 --- a/src/hack.c +++ b/src/hack.c @@ -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) { -- 2.40.0