From 1dcaa1621bc7150871792501a9390dd931ff3e4d Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sat, 1 Jan 2011 00:34:19 +0000 Subject: [PATCH] fix #H2210 - unlocking a mimic masquerading as a door (trunk only) 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 | 2 ++ src/lock.c | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 6f21a3923..153584242 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -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 diff --git a/src/lock.c b/src/lock.c index 037253d0c..0fce4639c 100644 --- a/src/lock.c +++ b/src/lock.c @@ -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 !" */ + stumble_onto_mimic(mtmp); + return PICKLOCK_LEARNED_SOMETHING; } if(!IS_DOOR(door->typ)) { if (is_drawbridge_wall(cc.x,cc.y) >= 0)