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:
nethack.rankin
2007-03-13 03:13:09 +00:00
parent f67a4547ac
commit d302e6252b
4 changed files with 27 additions and 2 deletions

View File

@@ -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

View File

@@ -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));

View File

@@ -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 */

View File

@@ -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)