pets and tripe

This fixes a very, very, old bug.  I don't think there's been a version
since pets were introduced that doesn't have it.
--Ken A
This commit is contained in:
arromdee
2002-01-18 03:15:10 +00:00
parent 0e46369056
commit d3a78f0634
3 changed files with 49 additions and 5 deletions
-4
View File
@@ -133,10 +133,6 @@ Reported but unconfirmed bugs:
catching a signal. catching a signal.
-- Reported problem with loss of hit points for no apparent reason until -- Reported problem with loss of hit points for no apparent reason until
player was left with 1 out of 1 hit points. player was left with 1 out of 1 hit points.
-- Walking around in the Gnomish Town, when I suddenly noticed my cat
wasn't following me around anymore. It appeared to be hanging around
somewhere near an outer wall of a food shop, on the other side of which
was lying a tripe ration and would not move. [Boudewijn Waijers]
-- Monsters were displayed as 'I' (unseen monster) but were referred to by -- Monsters were displayed as 'I' (unseen monster) but were referred to by
name. [Irina] name. [Irina]
-- A wand of secret door detection self-identified while engraving even -- A wand of secret door detection self-identified while engraving even
+1
View File
@@ -393,6 +393,7 @@ blessed full healing can reciver at most half of other lost levels
golden glow when praying will recover lost level if blessed full healing could golden glow when praying will recover lost level if blessed full healing could
gaining a level while polymorphed increases current monst hit points as well gaining a level while polymorphed increases current monst hit points as well
as latent human (or whatever) hit points as latent human (or whatever) hit points
pets should not try to go after food that they can't reach
Platform- and/or Interface-Specific Fixes Platform- and/or Interface-Specific Fixes
+48 -1
View File
@@ -16,6 +16,8 @@ STATIC_DCL int FDECL(dog_invent,(struct monst *,struct edog *,int));
STATIC_DCL int FDECL(dog_goal,(struct monst *,struct edog *,int,int,int)); STATIC_DCL int FDECL(dog_goal,(struct monst *,struct edog *,int,int,int));
STATIC_DCL struct obj *FDECL(DROPPABLES, (struct monst *)); STATIC_DCL struct obj *FDECL(DROPPABLES, (struct monst *));
STATIC_DCL boolean can_reach_food(struct monst *,XCHAR_P,XCHAR_P,XCHAR_P,
XCHAR_P);
STATIC_OVL struct obj * STATIC_OVL struct obj *
DROPPABLES(mon) DROPPABLES(mon)
@@ -381,7 +383,8 @@ int after, udist, whappr;
continue; continue;
if (cursed_object_at(nx, ny)) if (cursed_object_at(nx, ny))
continue; continue;
if (otyp < MANFOOD) { if (otyp < MANFOOD &&
can_reach_food(mtmp, mtmp->mx, mtmp->my, nx, ny)) {
if (otyp < gtyp || DDIST(nx,ny) < DDIST(gx,gy)) { if (otyp < gtyp || DDIST(nx,ny) < DDIST(gx,gy)) {
gx = nx; gx = nx;
gy = ny; gy = ny;
@@ -778,6 +781,50 @@ dognext:
return(1); return(1);
} }
/* Hack to prevent a dog from being endlessly stuck near a piece of food that
* it can't reach, such as caught in a teleport scroll niche. It recursively
* checks to see if the squares inbetween are good. The checking could be a
* little smarter; a full check would probably be useful in m_move() too.
* Since the maximum food distance is 5, this should never be more than 5 calls
* deep.
*/
STATIC_OVL boolean
can_reach_food(mon, mx, my, fx, fy)
struct monst *mon;
xchar mx, my, fx, fy;
{
int i, j;
int dist;
if (mx == fx && my == fy) return TRUE;
if (!isok(mx, my)) return FALSE; /* should not happen */
dist = dist2(mx, my, fx, fy);
for(i=mx-1; i<=mx+1; i++) {
for(j=my-1; j<=my+1; j++) {
if (!isok(i, j))
continue;
if (dist2(i, j, fx, fy) >= dist)
continue;
if (IS_ROCK(levl[i][j].typ) && !passes_walls(mon->data) &&
(!may_dig(i,j) || !tunnels(mon->data)))
continue;
if (IS_DOOR(levl[i][j].typ) &&
(levl[i][j].doormask & (D_CLOSED | D_LOCKED)))
continue;
if (is_pool(i, j) && !is_swimmer(mon->data))
continue;
if (is_lava(i, j) && !likes_lava(mon->data))
continue;
if (sobj_at(BOULDER,i,j) && !throws_rocks(mon->data))
continue;
if (can_reach_food(mon, i, j, fx, fy))
return TRUE;
}
}
return FALSE;
}
#endif /* OVL0 */ #endif /* OVL0 */
#ifdef OVLB #ifdef OVLB