key use by pets

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.
This commit is contained in:
nethack.rankin
2005-10-11 04:22:18 +00:00
parent fb6cbd37e7
commit c1393e508f
3 changed files with 19 additions and 7 deletions

View File

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

View File

@@ -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))) {
@@ -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;
@@ -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)

View File

@@ -1138,10 +1138,13 @@ postmov:
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); */