fix #H260 - escaping lava let you stay there indefinitely
<email deleted>, escaping from being stuck by lava via jumping--or simply walking--got you out of the lava while being at the same location. You could then stay there for as long as you liked without falling back in. This makes a lava and water check on turns where time passes but hero hasn't moved, performing a subset of spoteffects(). I think the water case only matters when using wizard mode to wish for a pool or moat, which gets created at hero's feet without making him fall in (unlike wishing for lava, where hero does immediately fall in).
This commit is contained in:
@@ -284,6 +284,7 @@ zapping closing or breaking magic up or down from beneath an open drawbridge's
|
|||||||
portcullis failed if bridge orientation was north-to-south (Valk quest)
|
portcullis failed if bridge orientation was north-to-south (Valk quest)
|
||||||
sinking into lava didn't track passage of time properly
|
sinking into lava didn't track passage of time properly
|
||||||
sinking into lava eventually burns away slime; sitting in it always does
|
sinking into lava eventually burns away slime; sitting in it always does
|
||||||
|
after escaping lava by foot, if hero doesn't move he'll fall back in
|
||||||
suppress corpse from bones data if death is due to being dissolved in lava
|
suppress corpse from bones data if death is due to being dissolved in lava
|
||||||
suppress "you rise from the dead" if game ends due to be turned into slime
|
suppress "you rise from the dead" if game ends due to be turned into slime
|
||||||
don't give erroneous "<mon> disppears" message for hero poly'd into quantum
|
don't give erroneous "<mon> disppears" message for hero poly'd into quantum
|
||||||
|
|||||||
@@ -777,6 +777,7 @@ E boolean FDECL(test_move, (int, int, int, int, int));
|
|||||||
E void NDECL(domove);
|
E void NDECL(domove);
|
||||||
E void NDECL(invocation_message);
|
E void NDECL(invocation_message);
|
||||||
E void FDECL(spoteffects, (BOOLEAN_P));
|
E void FDECL(spoteffects, (BOOLEAN_P));
|
||||||
|
E void NDECL(stayeffects);
|
||||||
E char *FDECL(in_rooms, (XCHAR_P,XCHAR_P,int));
|
E char *FDECL(in_rooms, (XCHAR_P,XCHAR_P,int));
|
||||||
E boolean FDECL(in_town, (int,int));
|
E boolean FDECL(in_town, (int,int));
|
||||||
E void FDECL(check_special_room, (BOOLEAN_P));
|
E void FDECL(check_special_room, (BOOLEAN_P));
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* SCCS Id: @(#)allmain.c 3.5 2007/02/16 */
|
/* SCCS Id: @(#)allmain.c 3.5 2007/03/12 */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -321,6 +321,8 @@ boolean resuming;
|
|||||||
!In_endgame(&u.uz) && !BClairvoyant &&
|
!In_endgame(&u.uz) && !BClairvoyant &&
|
||||||
!(moves % 15) && !rn2(2)) do_vicinity_map();
|
!(moves % 15) && !rn2(2)) do_vicinity_map();
|
||||||
if (u.utrap && u.utraptype == TT_LAVA) sink_into_lava();
|
if (u.utrap && u.utraptype == TT_LAVA) sink_into_lava();
|
||||||
|
/* when/if hero escapes from lava, he can't just stay there */
|
||||||
|
else if (!u.umoved) stayeffects();
|
||||||
|
|
||||||
} /* actual time passed */
|
} /* actual time passed */
|
||||||
|
|
||||||
|
|||||||
23
src/hack.c
23
src/hack.c
@@ -1,4 +1,4 @@
|
|||||||
/* SCCS Id: @(#)hack.c 3.5 2007/02/10 */
|
/* SCCS Id: @(#)hack.c 3.5 2007/03/12 */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -1741,6 +1741,27 @@ stillinwater:;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* called if hero stays in the same spot while time passes */
|
||||||
|
void
|
||||||
|
stayeffects()
|
||||||
|
{
|
||||||
|
/* leave the trickier cases to spoteffects()... */
|
||||||
|
if (u.uinwater) {
|
||||||
|
if (!is_pool(u.ux, u.uy)) spoteffects(FALSE);
|
||||||
|
} else if ((is_pool(u.ux, u.uy) || is_lava(u.ux, u.uy)) &&
|
||||||
|
!(u.ustuck || Levitation || Flying)) {
|
||||||
|
#ifdef STEED
|
||||||
|
if (u.usteed)
|
||||||
|
spoteffects(FALSE);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (is_lava(u.ux, u.uy))
|
||||||
|
(void)lava_effects();
|
||||||
|
else if (!Wwalking)
|
||||||
|
(void)drown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* returns first matching monster */
|
/* returns first matching monster */
|
||||||
STATIC_OVL struct monst *
|
STATIC_OVL struct monst *
|
||||||
monstinroom(mdat,roomno)
|
monstinroom(mdat,roomno)
|
||||||
|
|||||||
Reference in New Issue
Block a user