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

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

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.