From: nethack.rankin Date: Tue, 11 Oct 2005 04:22:18 +0000 (+0000) Subject: key use by pets X-Git-Tag: MOVE2GIT~1223 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c1393e508f05dda4c32b292d202c6bc82f48a354;p=nethack 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. --- 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); */