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)
|
||||
sinking into lava didn't track passage of time properly
|
||||
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 "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
|
||||
|
||||
@@ -777,6 +777,7 @@ E boolean FDECL(test_move, (int, int, int, int, int));
|
||||
E void NDECL(domove);
|
||||
E void NDECL(invocation_message);
|
||||
E void FDECL(spoteffects, (BOOLEAN_P));
|
||||
E void NDECL(stayeffects);
|
||||
E char *FDECL(in_rooms, (XCHAR_P,XCHAR_P,int));
|
||||
E boolean FDECL(in_town, (int,int));
|
||||
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. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -321,6 +321,8 @@ boolean resuming;
|
||||
!In_endgame(&u.uz) && !BClairvoyant &&
|
||||
!(moves % 15) && !rn2(2)) do_vicinity_map();
|
||||
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 */
|
||||
|
||||
|
||||
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. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -1741,6 +1741,27 @@ stillinwater:;
|
||||
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 */
|
||||
STATIC_OVL struct monst *
|
||||
monstinroom(mdat,roomno)
|
||||
|
||||
Reference in New Issue
Block a user