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:
95
src/hack.c
95
src/hack.c
@@ -1997,6 +1997,55 @@ impaired_movement(xchar *x, xchar *y)
|
|||||||
return FALSE;
|
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
|
static boolean
|
||||||
move_out_of_bounds(xchar x, xchar y)
|
move_out_of_bounds(xchar x, xchar y)
|
||||||
{
|
{
|
||||||
@@ -2105,25 +2154,8 @@ domove_core(void)
|
|||||||
if (move_out_of_bounds(x,y))
|
if (move_out_of_bounds(x,y))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (((trap = t_at(x, y)) && trap->tseen)
|
if (avoid_running_into_trap_or_liquid(x, y))
|
||||||
|| (Blind && !Levitation && !Flying && !is_clinger(g.youmonst.data)
|
return;
|
||||||
&& 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 (u.ustuck && (x != u.ustuck->mx || y != u.ustuck->my)) {
|
if (u.ustuck && (x != u.ustuck->mx || y != u.ustuck->my)) {
|
||||||
if (!next2u(u.ustuck->mx, 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 i, x0 = 0, y0 = 0, m0 = 1, i0 = 9;
|
||||||
int corrct = 0, noturn = 0;
|
int corrct = 0, noturn = 0;
|
||||||
struct monst *mtmp;
|
struct monst *mtmp;
|
||||||
struct trap *trap;
|
|
||||||
|
|
||||||
/* Grid bugs stop if trying to move diagonal, even if blind. Maybe */
|
/* Grid bugs stop if trying to move diagonal, even if blind. Maybe */
|
||||||
/* they polymorphed while in the middle of a long move. */
|
/* they polymorphed while in the middle of a long move. */
|
||||||
@@ -3237,31 +3268,15 @@ lookaround(void)
|
|||||||
corrct++;
|
corrct++;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
} else if ((trap = t_at(x, y)) && trap->tseen) {
|
} else if (avoid_moving_on_trap(x, y, infront)) {
|
||||||
if (g.context.run == 1)
|
if (g.context.run == 1)
|
||||||
goto bcorr; /* if you must */
|
goto bcorr; /* if you must */
|
||||||
if (infront) {
|
if (infront)
|
||||||
if (flags.mention_walls)
|
|
||||||
You("stop in front of %s.",
|
|
||||||
an(trapname(trap->ttyp, FALSE)));
|
|
||||||
goto stop;
|
goto stop;
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
} else if (is_pool_or_lava(x, y)) {
|
} else if (avoid_moving_on_liquid(x, y, infront)) {
|
||||||
/* water and lava only stop you if directly in front, and stop
|
if (infront)
|
||||||
* 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"));
|
|
||||||
goto stop;
|
goto stop;
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
} else { /* e.g. objects or trap or stairs */
|
} else { /* e.g. objects or trap or stairs */
|
||||||
if (g.context.run == 1)
|
if (g.context.run == 1)
|
||||||
|
|||||||
Reference in New Issue
Block a user