more #802 - lava running
From entrez, then modified possibly beyond recognition: don't run or travel onto lava even with known safe lava-walking because that isn't 100% safe. But if already on/over lava, allow moving onto adjacent lava in that situation.
This commit is contained in:
62
src/hack.c
62
src/hack.c
@@ -16,7 +16,8 @@ static void check_buried_zombies(coordxy, coordxy);
|
|||||||
static schar u_simple_floortyp(coordxy, coordxy);
|
static schar u_simple_floortyp(coordxy, coordxy);
|
||||||
static boolean swim_move_danger(coordxy, coordxy);
|
static boolean swim_move_danger(coordxy, coordxy);
|
||||||
static boolean domove_bump_mon(struct monst *, int);
|
static boolean domove_bump_mon(struct monst *, int);
|
||||||
static boolean domove_attackmon_at(struct monst *, coordxy, coordxy, boolean *);
|
static boolean domove_attackmon_at(struct monst *, coordxy, coordxy,
|
||||||
|
boolean *);
|
||||||
static boolean domove_fight_ironbars(coordxy, coordxy);
|
static boolean domove_fight_ironbars(coordxy, coordxy);
|
||||||
static boolean domove_swap_with_pet(struct monst *, coordxy, coordxy);
|
static boolean domove_swap_with_pet(struct monst *, coordxy, coordxy);
|
||||||
static boolean domove_fight_empty(coordxy, coordxy);
|
static boolean domove_fight_empty(coordxy, coordxy);
|
||||||
@@ -859,15 +860,17 @@ invocation_pos(coordxy x, coordxy y)
|
|||||||
&& x == g.inv_pos.x && y == g.inv_pos.y);
|
&& x == g.inv_pos.x && y == g.inv_pos.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return TRUE if (dx,dy) is an OK place to move
|
/* return TRUE if (dx,dy) is an OK place to move;
|
||||||
* mode is one of DO_MOVE, TEST_MOVE, TEST_TRAV, or TEST_TRAP
|
mode is one of DO_MOVE, TEST_MOVE, TEST_TRAV, or TEST_TRAP */
|
||||||
*/
|
|
||||||
boolean
|
boolean
|
||||||
test_move(coordxy ux, coordxy uy, coordxy dx, coordxy dy, int mode)
|
test_move(
|
||||||
|
coordxy ux, coordxy uy,
|
||||||
|
coordxy dx, coordxy dy, /* these are -1|0|+1, not coordinates */
|
||||||
|
int mode)
|
||||||
{
|
{
|
||||||
coordxy x = ux + dx;
|
coordxy x = ux + dx;
|
||||||
coordxy y = uy + dy;
|
coordxy y = uy + dy;
|
||||||
register struct rm *tmpr = &levl[x][y];
|
struct rm *tmpr = &levl[x][y];
|
||||||
struct rm *ust;
|
struct rm *ust;
|
||||||
|
|
||||||
g.context.door_opened = FALSE;
|
g.context.door_opened = FALSE;
|
||||||
@@ -1033,14 +1036,19 @@ test_move(coordxy ux, coordxy uy, coordxy dx, coordxy dy, int mode)
|
|||||||
/* Pick travel path that does not require crossing a trap.
|
/* Pick travel path that does not require crossing a trap.
|
||||||
* Avoid water and lava using the usual running rules.
|
* Avoid water and lava using the usual running rules.
|
||||||
* (but not u.ux/u.uy because findtravelpath walks toward u.ux/u.uy) */
|
* (but not u.ux/u.uy because findtravelpath walks toward u.ux/u.uy) */
|
||||||
if (g.context.run == 8 && (mode != DO_MOVE)
|
if (g.context.run == 8 && (mode != DO_MOVE) && !u_at(x, y)) {
|
||||||
&& (x != u.ux || y != u.uy)) {
|
|
||||||
struct trap *t = t_at(x, y);
|
struct trap *t = t_at(x, y);
|
||||||
|
|
||||||
if ((t && t->tseen)
|
if ((t && t->tseen && t->ttyp != VIBRATING_SQUARE)
|
||||||
|| (!Levitation && !Flying && !Known_lwalking
|
|| ((!Levitation && !Flying
|
||||||
&& !(is_pool(x, y) && Known_wwalking)
|
/* FIXME: should be using lastseentyp[x][y] rather than
|
||||||
&& is_pool_or_lava(x, y) && levl[x][y].seenv)
|
seen vector (ditto for WATERWALL below) */
|
||||||
|
&& levl[x][y].seenv && is_pool_or_lava(x, y))
|
||||||
|
/* is_lava(ux,uy): don't move onto/over lava with known
|
||||||
|
lava-walking because it isn't completely safe, but do
|
||||||
|
continue to move over lava if already doing so */
|
||||||
|
? (is_lava(x, y) && Known_lwalking && is_lava(u.ux, u.uy))
|
||||||
|
: Known_wwalking) /* must be seen && is_pool() to get here */
|
||||||
|| (IS_WATERWALL(levl[x][y].typ) && levl[x][y].seenv))
|
|| (IS_WATERWALL(levl[x][y].typ) && levl[x][y].seenv))
|
||||||
return (mode == TEST_TRAP);
|
return (mode == TEST_TRAP);
|
||||||
}
|
}
|
||||||
@@ -1606,12 +1614,15 @@ swim_move_danger(coordxy x, coordxy y)
|
|||||||
&& !Stunned && !Confusion && levl[x][y].seenv
|
&& !Stunned && !Confusion && levl[x][y].seenv
|
||||||
&& (is_pool(x, y) || is_lava(x, y) || liquid_wall)) {
|
&& (is_pool(x, y) || is_lava(x, y) || liquid_wall)) {
|
||||||
|
|
||||||
/* FIXME: This can be exploited to identify the ring of fire resistance
|
/* FIXME: This can be exploited to identify ring of fire resistance
|
||||||
* if the player is wearing it unidentified and has identified
|
* if the player is wearing it unidentified and has identified
|
||||||
* fireproof boots of water walking and is walking over lava. However,
|
* fireproof boots of water walking and is walking over lava. However,
|
||||||
* this is such a marginal case that it may not be worth fixing. */
|
* this is such a marginal case that it may not be worth fixing. */
|
||||||
if ((is_pool(x, y) && !Known_wwalking)
|
if ((is_pool(x, y) && !Known_wwalking)
|
||||||
|| (is_lava(x, y) && !Known_lwalking)
|
/* is_lava(ux,uy): don't move onto/over lava with known
|
||||||
|
lava-walking because it isn't completely safe, but do
|
||||||
|
continue to move over lava if already doing so */
|
||||||
|
|| (is_lava(x, y) && !Known_lwalking && !is_lava(u.ux, u.uy))
|
||||||
|| liquid_wall) {
|
|| liquid_wall) {
|
||||||
if (g.context.nopick) {
|
if (g.context.nopick) {
|
||||||
/* moving with m-prefix */
|
/* moving with m-prefix */
|
||||||
@@ -2067,11 +2078,20 @@ avoid_moving_on_trap(coordxy x, coordxy y, boolean msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
avoid_moving_on_liquid(coordxy x, coordxy y, boolean msg)
|
avoid_moving_on_liquid(
|
||||||
|
coordxy x, coordxy y,
|
||||||
|
boolean msg)
|
||||||
{
|
{
|
||||||
if ((g.context.run < 2 || g.context.travel || is_pool_or_lava(u.ux, u.uy))
|
boolean in_air = (Levitation || Flying);
|
||||||
&& (Levitation || Flying || Known_lwalking
|
|
||||||
|| (is_pool(x, y) && Known_wwalking))
|
/* don't stop if you're not on a transition between terrain types... */
|
||||||
|
if ((levl[x][y].typ == levl[u.ux][u.uy].typ
|
||||||
|
/* or you are using shift-dir running and the transition isn't
|
||||||
|
dangerous... */
|
||||||
|
|| (g.context.run < 2 && (!is_lava(x, y) || in_air))
|
||||||
|
|| g.context.travel)
|
||||||
|
/* and you know you won't fall in */
|
||||||
|
&& (in_air || Known_lwalking || (is_pool(x, y) && Known_wwalking))
|
||||||
&& !IS_WATERWALL(levl[x][y].typ)) {
|
&& !IS_WATERWALL(levl[x][y].typ)) {
|
||||||
/* XXX: should send 'is_clinger(g.youmonst.data)' here once clinging
|
/* XXX: should send 'is_clinger(g.youmonst.data)' here once clinging
|
||||||
polyforms are allowed to move over water */
|
polyforms are allowed to move over water */
|
||||||
|
|||||||
Reference in New Issue
Block a user