]> granicus.if.org Git - nethack/commitdiff
animating quest guardian statues
authornethack.allison <nethack.allison>
Tue, 19 Aug 2003 02:52:03 +0000 (02:52 +0000)
committernethack.allison <nethack.allison>
Tue, 19 Aug 2003 02:52:03 +0000 (02:52 +0000)
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
src/trap.c

index 3dd82b5b5d3963521ee446973daf2187aa657b09..98ec44bb9fb2e8c24e997c9ba319f72ab1dc5bcf 100644 (file)
@@ -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
index 987f99897086ba37d6d9e734361bca62e427a57c..69a7b7d80a6182a95cb8e0127ae1a1066c1fd8cd 100644 (file)
@@ -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);
        }