diff --git a/doc/fixes34.4 b/doc/fixes34.4 index a7d53d69b..a5b327a7e 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -177,6 +177,7 @@ wish request for " armor" will match item named " 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 diff --git a/src/dogmove.c b/src/dogmove.c index 7779e5c02..8add2faff 100644 --- a/src/dogmove.c +++ b/src/dogmove.c @@ -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) diff --git a/src/monmove.c b/src/monmove.c index 43cd4f7e5..85c2b46fa 100644 --- a/src/monmove.c +++ b/src/monmove.c @@ -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); */