Unify domove and lookaround trap/liquid avoidance code

Nearly same code was in two places - the only difference was
how g.context.run == 1 was handled.  Previously, if you were
blind, and knew about the water or lava, you still ran into it.
Now, we always avoid the dunking if running/rushing.
This commit is contained in:
Pasi Kallinen
2022-02-25 21:49:38 +02:00
parent 54df272f50
commit f88dce6970

View File

@@ -1997,6 +1997,55 @@ impaired_movement(xchar *x, xchar *y)
return FALSE;
}
static boolean
avoid_moving_on_trap(xchar x, xchar y, boolean msg)
{
struct trap *trap;
if ((trap = t_at(x, y)) && trap->tseen) {
if (msg && flags.mention_walls)
You("stop in front of %s.",
an(trapname(trap->ttyp, FALSE)));
return TRUE;
}
return FALSE;
}
static boolean
avoid_moving_on_liquid(xchar x, xchar y, boolean msg)
{
if (!Levitation && !Flying && !is_clinger(g.youmonst.data)
&& is_pool_or_lava(x, y) && levl[x][y].seenv) {
if (msg && flags.mention_walls)
You("stop at the edge of the %s.",
hliquid(is_pool(x,y) ? "water" : "lava"));
return TRUE;
}
return FALSE;
}
/* when running/rushing, avoid stepping on a known trap or pool of liquid.
returns TRUE if avoided. */
static boolean
avoid_running_into_trap_or_liquid(xchar x, xchar y)
{
if (!g.context.run)
return FALSE;
if (avoid_moving_on_trap(x,y, TRUE)) {
nomul(0);
g.context.move = 0;
return TRUE;
}
if (Blind && avoid_moving_on_liquid(x,y, TRUE)) {
nomul(0);
g.context.move = 0;
return TRUE;
}
return FALSE;
}
/* trying to move out-of-bounds? */
static boolean
move_out_of_bounds(xchar x, xchar y)
{
@@ -2105,25 +2154,8 @@ domove_core(void)
if (move_out_of_bounds(x,y))
return;
if (((trap = t_at(x, y)) && trap->tseen)
|| (Blind && !Levitation && !Flying && !is_clinger(g.youmonst.data)
&& is_pool_or_lava(x, y) && levl[x][y].seenv)) {
if (g.context.run >= 2) {
if (flags.mention_walls) {
if (trap && trap->tseen) {
You("stop in front of %s.",
an(trapname(trap->ttyp, FALSE)));
} else if (is_pool_or_lava(x,y) && levl[x][y].seenv) {
You("stop at the edge of the %s.",
hliquid(is_pool(x,y) ? "water" : "lava"));
}
}
nomul(0);
g.context.move = 0;
return;
} else
nomul(0);
}
if (avoid_running_into_trap_or_liquid(x, y))
return;
if (u.ustuck && (x != u.ustuck->mx || y != u.ustuck->my)) {
if (!next2u(u.ustuck->mx, u.ustuck->my)) {
@@ -3147,7 +3179,6 @@ lookaround(void)
int i, x0 = 0, y0 = 0, m0 = 1, i0 = 9;
int corrct = 0, noturn = 0;
struct monst *mtmp;
struct trap *trap;
/* Grid bugs stop if trying to move diagonal, even if blind. Maybe */
/* they polymorphed while in the middle of a long move. */
@@ -3237,31 +3268,15 @@ lookaround(void)
corrct++;
}
continue;
} else if ((trap = t_at(x, y)) && trap->tseen) {
} else if (avoid_moving_on_trap(x, y, infront)) {
if (g.context.run == 1)
goto bcorr; /* if you must */
if (infront) {
if (flags.mention_walls)
You("stop in front of %s.",
an(trapname(trap->ttyp, FALSE)));
if (infront)
goto stop;
}
continue;
} else if (is_pool_or_lava(x, y)) {
/* water and lava only stop you if directly in front, and stop
* you even if you are running
*/
if (!Levitation && !Flying && !is_clinger(g.youmonst.data)
&& infront) {
/* No Wwalking check; otherwise they'd be able
* to test boots by trying to SHIFT-direction
* into a pool and seeing if the game allowed it
*/
if (flags.mention_walls)
You("stop at the edge of the %s.",
hliquid(is_pool(x,y) ? "water" : "lava"));
} else if (avoid_moving_on_liquid(x, y, infront)) {
if (infront)
goto stop;
}
continue;
} else { /* e.g. objects or trap or stairs */
if (g.context.run == 1)