From d302e6252be60cbb63ef4ce7de7dc446ae710e64 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Tue, 13 Mar 2007 03:13:09 +0000 Subject: [PATCH] fix #H260 - escaping lava let you stay there indefinitely , 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). --- doc/fixes34.4 | 1 + include/extern.h | 1 + src/allmain.c | 4 +++- src/hack.c | 23 ++++++++++++++++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/doc/fixes34.4 b/doc/fixes34.4 index 047999184..e8691b75f 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -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 " disppears" message for hero poly'd into quantum diff --git a/include/extern.h b/include/extern.h index 99357a47d..690769faf 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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)); diff --git a/src/allmain.c b/src/allmain.c index b951518e0..b9d329097 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -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 */ diff --git a/src/hack.c b/src/hack.c index bd339e546..d3d51b7f6 100644 --- a/src/hack.c +++ b/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)