]> granicus.if.org Git - nethack/commitdiff
fix #H2210 - unlocking a mimic masquerading as a door (trunk only)
authornethack.rankin <nethack.rankin>
Sat, 1 Jan 2011 00:34:19 +0000 (00:34 +0000)
committernethack.rankin <nethack.rankin>
Sat, 1 Jan 2011 00:34:19 +0000 (00:34 +0000)
     From a bug report, attempting to use a key,
lock pick, or credit card on an open doorway that contained a mimic posing
as a closed door reported "that doorway has no door" or "you cannot lock
an open door" as if no monster was present, and failed to find the mimic.

doc/fixes35.0
src/lock.c

index 6f21a392350d2137fcde122f6fd2e82e5cb759fe..15358424202b101bc6b55f561e64c68d1ea5afa2 100644 (file)
@@ -340,6 +340,8 @@ fix writing feedback "the spellbook warps strangely, then turns parchment"
 make stone artifacts usually resist stone-to-flesh
 when reading an unknown scroll and learning it, discovery of teleporation was
        too late if hero happened to land on another scroll of teleportation
+using an unlocking tool on a closed door which was actually a mimic reported
+       that there was no door to unlock instead of exposing the mimic
 
 
 Platform- and/or Interface-Specific Fixes
index 037253d0c455c5c887461578a86761e55a764347..0fce4639c200f2c1237e2f44d23e7837093e64be 100644 (file)
@@ -387,9 +387,10 @@ pick_lock(pick)
            }
 
            door = &levl[cc.x][cc.y];
-           if ((mtmp = m_at(cc.x, cc.y)) && canseemon(mtmp)
-                       && mtmp->m_ap_type != M_AP_FURNITURE
-                       && mtmp->m_ap_type != M_AP_OBJECT) {
+           mtmp = m_at(cc.x, cc.y);
+           if (mtmp && canseemon(mtmp) &&
+                       mtmp->m_ap_type != M_AP_FURNITURE &&
+                       mtmp->m_ap_type != M_AP_OBJECT) {
 #ifdef TOURIST
                if (picktyp == CREDIT_CARD &&
                    (mtmp->isshk || mtmp->data == &mons[PM_ORACLE]))
@@ -398,6 +399,14 @@ pick_lock(pick)
 #endif
                    pline("I don't think %s would appreciate that.", mon_nam(mtmp));
                return PICKLOCK_LEARNED_SOMETHING;
+           } else if (mtmp && mtmp->m_ap_type == M_AP_FURNITURE &&
+                       /* not IS_DOOR() here; for M_AP_FURNITURE, mappearance
+                          holds a map symbol rather than a topology type */
+                       (mtmp->mappearance == S_vcdoor ||
+                        mtmp->mappearance == S_hcdoor)) {
+               /* "The door actually was a <mimic>!" */
+               stumble_onto_mimic(mtmp);
+               return PICKLOCK_LEARNED_SOMETHING;
            }
            if(!IS_DOOR(door->typ)) {
                if (is_drawbridge_wall(cc.x,cc.y) >= 0)