Skip to content

Commit

Permalink
key use by pets
Browse files Browse the repository at this point in the history
     Spotted when fixing the Rogue level digging/phasing bug:  pet movement
was setting up the wrong flag for pets who happened to be carrying a key.
This wasn't particularly noticeable because they tended to drop keys right
after picking them up.  And apparently the checks elsewhere in movement
prevented that wrong flag from having any effect; once I changed it so that
pets would hang on to keys, I never saw them break a door down with one.
Now they'll keep keys, similar to unicorn horns and pick-axes, and use them
properly.  The door unlocking message needed a tweak because it assumed
that the opener was on the far side trying to reach you and looked quite
odd when you could see the action taking place.

     I've put this into the fixes file as a new feature rather than a fix.
  • Loading branch information
nethack.rankin committed Oct 11, 2005
1 parent fb6cbd3 commit c1393e5
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 7 deletions.
1 change: 1 addition & 0 deletions doc/fixes34.4
Expand Up @@ -177,6 +177,7 @@ wish request for "<something> armor" will match item named "<something> mail"
Fire Brand and Frost Brand have a chance to avoid taking rust damage
support ^R (and ^L in numpad mode) to request display repaint during direction
choosing and location choosing prompting modes
intelligent pets will use keys to unlock doors


Platform- and/or Interface-Specific New Features
Expand Down
16 changes: 12 additions & 4 deletions src/dogmove.c
Expand Up @@ -25,12 +25,14 @@ register struct monst *mon;
{
register struct obj *obj;
struct obj *wep = MON_WEP(mon);
boolean item1 = FALSE, item2 = FALSE;
boolean item1 = FALSE, item2 = FALSE, item3 = FALSE;

if (is_animal(mon->data) || mindless(mon->data))
item1 = item2 = TRUE;
item1 = item2 = item3 = TRUE;
if (!tunnels(mon->data) || !needspick(mon->data))
item1 = TRUE;
if (nohands(mon->data) || verysmall(mon->data))
item3 = TRUE;
for(obj = mon->minvent; obj; obj = obj->nobj) {
if (!item1 && is_pick(obj) && (obj->otyp != DWARVISH_MATTOCK
|| !which_armor(mon, W_ARMS))) {
Expand All @@ -41,6 +43,10 @@ register struct monst *mon;
item2 = TRUE;
continue;
}
if (!item3 && obj->otyp == SKELETON_KEY) {
item3 = TRUE;
continue;
}
if (!obj->owornmask && obj != wep) return obj;
}
return (struct obj *)0;
Expand Down Expand Up @@ -588,8 +594,10 @@ register int after; /* this is extra fast monster movement */
You("get released!");
}
if (!nohands(mtmp->data) && !verysmall(mtmp->data)) {
allowflags |= OPENDOOR;
if (m_carrying(mtmp, SKELETON_KEY)) allowflags |= BUSTDOOR;
allowflags |= OPENDOOR;
if (m_carrying(mtmp, SKELETON_KEY)) allowflags |= UNLOCKDOOR;
/* note: the Wizard and Riders can unlock doors without a key;
they won't use that ability if someone manages to tame them */
}
if (is_giant(mtmp->data)) allowflags |= BUSTDOOR;
if (tunnels(mtmp->data)
Expand Down
9 changes: 6 additions & 3 deletions src/monmove.c
Expand Up @@ -1138,10 +1138,13 @@ register int after;
if(mb_trapped(mtmp)) return(2);
} else {
if (flags.verbose) {
if (canseeit)
You_see("a door unlock and open.");
if (canseemon(mtmp))
pline("%s unlocks and opens a door.",
Monnam(mtmp));
else if (canseeit)
You_see("a door unlock and open.");
else if (!Deaf)
You_hear("a door unlock and open.");
You_hear("a door unlock and open.");
}
here->doormask = D_ISOPEN;
/* newsym(mtmp->mx, mtmp->my); */
Expand Down

0 comments on commit c1393e5

Please sign in to comment.