From b8991129a8578153e68b314744b11dca78814a0e Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sun, 4 Jan 2004 08:54:16 +0000 Subject: [PATCH] pit access Fix the recently reported problem: " If there is a corpse in a pit, you have to enter the pit in order to pick " it up, however you are can eat it without being in the pit. If pit bottoms aren't reachable, then can_reach_floor() needs to know about it. I suspect that this change is likely to create some other bugs though. --- doc/fixes34.4 | 2 ++ src/engrave.c | 16 +++++++++++----- src/hack.c | 34 +++++++++++++--------------------- src/pickup.c | 15 ++++----------- 4 files changed, 30 insertions(+), 37 deletions(-) diff --git a/doc/fixes34.4 b/doc/fixes34.4 index 8d98d7862..b4de9d8d2 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -11,6 +11,8 @@ fix message when pushing a boulder into a pool while riding plural of "Nazgul" is "Nazgul" not "Nazguls" trap messages referring to named steed were ackwardly worded when hallucination overrode use of the name +some actions such as eating corpses off the floor didn't check whether hero + could reach the bottom of a pit Platform- and/or Interface-Specific Fixes diff --git a/src/engrave.c b/src/engrave.c index 080dc1d85..aa36bbe8f 100644 --- a/src/engrave.c +++ b/src/engrave.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)engrave.c 3.4 2001/11/04 */ +/* SCCS Id: @(#)engrave.c 3.4 2004/01/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -132,12 +132,18 @@ unsigned seed; /* for semi-controlled randomization */ boolean can_reach_floor() { - return (boolean)(!u.uswallow && + struct trap *t; + + if (u.uswallow) return FALSE; #ifdef STEED - /* Restricted/unskilled riders can't reach the floor */ - !(u.usteed && P_SKILL(P_RIDING) < P_BASIC) && + /* Restricted/unskilled riders can't reach the floor */ + if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) return FALSE; #endif - (!Levitation || + if ((t = t_at(u.ux, u.uy)) != 0 && uteetering_at_seen_pit(t) && + !Flying) + return FALSE; + + return (boolean)((!Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) && (!u.uundetected || !is_hider(youmonst.data) || u.umonnum == PM_TRAPPER)); diff --git a/src/hack.c b/src/hack.c index 4431e679d..0e809d911 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)hack.c 3.4 2003/04/30 */ +/* SCCS Id: @(#)hack.c 3.4 2004/01/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1913,8 +1913,8 @@ dopickup() } } if (is_lava(u.ux, u.uy)) { - if (Wwalking || is_floater(youmonst.data) || is_clinger(youmonst.data) - || (Flying && !Breathless)) { + if (Wwalking || is_floater(youmonst.data) || + is_clinger(youmonst.data) || (Flying && !Breathless)) { You_cant("reach the bottom to pick things up."); return(0); } else if (!likes_lava(youmonst.data)) { @@ -1922,29 +1922,21 @@ dopickup() return(0); } } - if(!OBJ_AT(u.ux, u.uy)) { - There("is nothing here to pick up."); - return(0); + if (!OBJ_AT(u.ux, u.uy)) { + There("is nothing here to pick up."); + return 0; } if (!can_reach_floor()) { + if (traphere && uteetering_at_seen_pit(traphere)) + You("cannot reach the bottom of the pit."); #ifdef STEED - if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) - You("aren't skilled enough to reach from %s.", - y_monnam(u.usteed)); - else + else if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) + You("aren't skilled enough to reach from %s.", + y_monnam(u.usteed)); #endif + else You("cannot reach the %s.", surface(u.ux,u.uy)); - return(0); - } - - if (traphere && uteetering_at_seen_pit(traphere)) { - /* Allow pickup from holes and trap doors that you escaped from - * because that stuff is teetering on the edge just like you, but - * not pits, because there is an elevation discrepancy with stuff - * in pits. - */ - You("cannot reach the bottom of the pit."); - return(0); + return 0; } return (pickup(-count)); diff --git a/src/pickup.c b/src/pickup.c index b93a89fb5..23cb0272b 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)pickup.c 3.4 2003/07/27 */ +/* SCCS Id: @(#)pickup.c 3.4 2004/01/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -408,19 +408,12 @@ int what; /* should be a long */ /* no pickup if levitating & not on air or water level */ if (!can_reach_floor()) { - if ((multi && !context.run) || (autopickup && !flags.pickup)) + if ((multi && !context.run) || + (autopickup && !flags.pickup) || + (ttmp && uteetering_at_seen_pit(ttmp))) read_engr_at(u.ux, u.uy); return (0); } - if (ttmp && uteetering_at_seen_pit(ttmp)) { - /* Allow pickup from holes and trap doors that you escaped - * from because that stuff is teetering on the edge just - * like you, but not pits, because there is an elevation - * discrepancy with stuff in pits. - */ - read_engr_at(u.ux, u.uy); - return(0); - } /* multi && !context.run means they are in the middle of some other * action, or possibly paralyzed, sleeping, etc.... and they just * teleported onto the object. They shouldn't pick it up. -- 2.40.0