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.
This commit is contained in:
nethack.rankin
2004-01-04 08:54:16 +00:00
parent 62e46878b1
commit b8991129a8
4 changed files with 32 additions and 39 deletions
+2
View File
@@ -11,6 +11,8 @@ fix message when pushing a boulder into a pool while riding
plural of "Nazgul" is "Nazgul" not "Nazguls" plural of "Nazgul" is "Nazgul" not "Nazguls"
trap messages referring to named steed were ackwardly worded when hallucination trap messages referring to named steed were ackwardly worded when hallucination
overrode use of the name 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 Platform- and/or Interface-Specific Fixes
+11 -5
View File
@@ -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. */ /* 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. */
@@ -132,12 +132,18 @@ unsigned seed; /* for semi-controlled randomization */
boolean boolean
can_reach_floor() can_reach_floor()
{ {
return (boolean)(!u.uswallow && struct trap *t;
if (u.uswallow) return FALSE;
#ifdef STEED #ifdef STEED
/* Restricted/unskilled riders can't reach the floor */ /* Restricted/unskilled riders can't reach the floor */
!(u.usteed && P_SKILL(P_RIDING) < P_BASIC) && if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) return FALSE;
#endif #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)) && Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) &&
(!u.uundetected || !is_hider(youmonst.data) || (!u.uundetected || !is_hider(youmonst.data) ||
u.umonnum == PM_TRAPPER)); u.umonnum == PM_TRAPPER));
+15 -23
View File
@@ -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. */ /* 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. */
@@ -1913,8 +1913,8 @@ dopickup()
} }
} }
if (is_lava(u.ux, u.uy)) { if (is_lava(u.ux, u.uy)) {
if (Wwalking || is_floater(youmonst.data) || is_clinger(youmonst.data) if (Wwalking || is_floater(youmonst.data) ||
|| (Flying && !Breathless)) { is_clinger(youmonst.data) || (Flying && !Breathless)) {
You_cant("reach the bottom to pick things up."); You_cant("reach the bottom to pick things up.");
return(0); return(0);
} else if (!likes_lava(youmonst.data)) { } else if (!likes_lava(youmonst.data)) {
@@ -1922,29 +1922,21 @@ dopickup()
return(0); return(0);
} }
} }
if(!OBJ_AT(u.ux, u.uy)) { if (!OBJ_AT(u.ux, u.uy)) {
There("is nothing here to pick up."); There("is nothing here to pick up.");
return(0); return 0;
} }
if (!can_reach_floor()) { if (!can_reach_floor()) {
#ifdef STEED if (traphere && uteetering_at_seen_pit(traphere))
if (u.usteed && P_SKILL(P_RIDING) < P_BASIC)
You("aren't skilled enough to reach from %s.",
y_monnam(u.usteed));
else
#endif
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."); You("cannot reach the bottom of the pit.");
return(0); #ifdef STEED
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;
} }
return (pickup(-count)); return (pickup(-count));
+4 -11
View File
@@ -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. */ /* 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. */
@@ -408,19 +408,12 @@ int what; /* should be a long */
/* no pickup if levitating & not on air or water level */ /* no pickup if levitating & not on air or water level */
if (!can_reach_floor()) { 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); read_engr_at(u.ux, u.uy);
return (0); 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 /* multi && !context.run means they are in the middle of some other
* action, or possibly paralyzed, sleeping, etc.... and they just * action, or possibly paralyzed, sleeping, etc.... and they just
* teleported onto the object. They shouldn't pick it up. * teleported onto the object. They shouldn't pick it up.