From d72700c0708d4b78a57a8d75184543bbfef6c6a9 Mon Sep 17 00:00:00 2001 From: "nethack.allison" Date: Tue, 19 Aug 2003 02:52:03 +0000 Subject: [PATCH] animating quest guardian statues Also a related bug: the guard against animating a unique monster via tossing a statue onto a statue trap location, was causing stone to flesh to silently ignore any statue of a unique monster which seemed very uncharacteristic of the spell. After this patch, statues of quest guardians and statues of unique monsters will animate as shape-shifters posing as those monsters, not the monsters themselves. --- doc/fixes34.2 | 2 ++ src/trap.c | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/fixes34.2 b/doc/fixes34.2 index 3dd82b5b5..98ec44bb9 100644 --- a/doc/fixes34.2 +++ b/doc/fixes34.2 @@ -130,6 +130,8 @@ there was no check for iron bars in dokick() so it defaulted to "empty space" if you couldn't see the rat created in a sink for some reason other than blindness, you would get "Eek there's it in the sink." digging a pit while stuck in the floor should always free the player +quest guardians can no longer be created via stone-to-flesh on their statue +stone-to-flesh no longer silently ignored by a statue of a unique monster Platform- and/or Interface-Specific Fixes diff --git a/src/trap.c b/src/trap.c index 987f99897..69a7b7d80 100644 --- a/src/trap.c +++ b/src/trap.c @@ -433,11 +433,20 @@ int *fail_reason; * [detected or guessed] location of a statue trap. Normally the * uppermost statue is the one which would be activated. */ - if (mptr->geno & G_UNIQ) { + if ((mptr->geno & G_UNIQ) && cause != ANIMATE_SPELL) { if (fail_reason) *fail_reason = AS_MON_IS_UNIQUE; return (struct monst *)0; } - mon = makemon(mptr, x, y, (cause == ANIMATE_SPELL) ? + if (cause == ANIMATE_SPELL && + ((mptr->geno & G_UNIQ) || mptr->msound == MS_GUARDIAN)) { + /* Statues of quest guardians or unique monsters + * will not stone-to-flesh as the real thing. + */ + mon = makemon(&mons[PM_DOPPELGANGER], x, y, + NO_MINVENT|MM_NOCOUNTBIRTH|MM_ADJACENTOK); + if (mon) (void) newcham(mon, mptr, FALSE, FALSE); + } else + mon = makemon(mptr, x, y, (cause == ANIMATE_SPELL) ? (NO_MINVENT | MM_ADJACENTOK) : NO_MINVENT); } -- 2.40.0