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

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. */
/* 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));

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. */
/* 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()) {
#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
#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.
*/
if (traphere && uteetering_at_seen_pit(traphere))
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));

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