From c1393e508f05dda4c32b292d202c6bc82f48a354 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Tue, 11 Oct 2005 04:22:18 +0000 Subject: [PATCH] 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. --- doc/fixes34.4 | 1 + src/dogmove.c | 16 ++++++++++++---- src/monmove.c | 9 ++++++--- 3 files changed, 19 insertions(+), 7 deletions(-) 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); */ -- 2.50.1