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.
This commit is contained in:
Pasi Kallinen
2015-12-21 17:31:04 +02:00
parent c86ae780c4
commit 9a2eb370e7
3 changed files with 13 additions and 5 deletions

View 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) {