From: nethack.allison Date: Tue, 19 Aug 2003 02:52:03 +0000 (+0000) Subject: animating quest guardian statues X-Git-Tag: MOVE2GIT~1846 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d72700c0708d4b78a57a8d75184543bbfef6c6a9;p=nethack 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. --- 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); }