]> granicus.if.org Git - nethack/commitdiff
guardian corpse, statue animation follow-up
authornethack.allison <nethack.allison>
Tue, 19 Aug 2003 14:41:54 +0000 (14:41 +0000)
committernethack.allison <nethack.allison>
Tue, 19 Aug 2003 14:41:54 +0000 (14:41 +0000)
- fix ring of protection from shape changers causing
  real monster to be created.
- add ability to get the character class monster from
  genus() or the species.
- use the character class monster when animating
  guardian corpses.

include/extern.h
src/mon.c
src/objnam.c
src/sounds.c
src/trap.c

index 1f905b89d2c21387f9470a63255fd3b630f7884b..cadf63eeba0aa2e2f1d00f2f4f047bec8c3a15e3 100644 (file)
@@ -1098,7 +1098,7 @@ E struct mkroom *FDECL(search_special, (SCHAR_P));
 /* ### mon.c ### */
 
 E int FDECL(undead_to_corpse, (int));
-E int FDECL(genus, (int));
+E int FDECL(genus, (int,int));
 E int FDECL(pm_to_cham, (int));
 E int FDECL(minliquid, (struct monst *));
 E int NDECL(movemon);
index ac46115d9b1d5248cd5154009798ad5792bc1788..7337fe9d31171c73f1b3a88d81e4caca91d43b2f 100644 (file)
--- a/src/mon.c
+++ b/src/mon.c
@@ -86,30 +86,31 @@ int mndx;
 
 /* Convert the monster index of some monsters (such as quest guardians)
  * to their generic species type.
+ *
+ * Return associated character class monster, rather than species
+ * if mode is 1.
  */
 int
-genus(mndx)
-int mndx;
+genus(mndx, mode)
+int mndx, mode;
 {
        switch (mndx) {
 /* Quest guardians */
-       case PM_STUDENT:
-       case PM_CHIEFTAIN:
-       case PM_NEANDERTHAL:
-       case PM_ATTENDANT:
-       case PM_PAGE:
-       case PM_ABBOT:
-       case PM_ACOLYTE:
-       case PM_HUNTER:
-       case PM_THUG:
-       case PM_ROSHI:
+       case PM_STUDENT:     mndx = mode ? PM_VALKYRIE  : PM_HUMAN; break;
+       case PM_CHIEFTAIN:   mndx = mode ? PM_BARBARIAN : PM_HUMAN; break;
+       case PM_NEANDERTHAL: mndx = mode ? PM_CAVEMAN   : PM_HUMAN; break;
+       case PM_ATTENDANT:   mndx = mode ? PM_HEALER    : PM_HUMAN; break;
+       case PM_PAGE:        mndx = mode ? PM_KNIGHT    : PM_HUMAN; break;
+       case PM_ABBOT:       mndx = mode ? PM_MONK      : PM_HUMAN; break;
+       case PM_ACOLYTE:     mndx = mode ? PM_PRIEST    : PM_HUMAN; break;
+       case PM_HUNTER:      mndx = mode ? PM_RANGER    : PM_HUMAN; break;
+       case PM_THUG:        mndx = mode ? PM_ROGUE     : PM_HUMAN; break;
+       case PM_ROSHI:       mndx = mode ? PM_SAMURAI   : PM_HUMAN; break;
 #ifdef TOURIST
-       case PM_GUIDE:
+       case PM_GUIDE:       mndx = mode ? PM_TOURIST   : PM_HUMAN; break;
 #endif
-       case PM_WARRIOR:
-       case PM_APPRENTICE:
-               mndx = PM_HUMAN;
-               break;
+       case PM_APPRENTICE:  mndx = mode ? PM_WIZARD    : PM_HUMAN; break;
+       case PM_WARRIOR:     mndx = mode ? PM_VALKYRIE  : PM_HUMAN; break;
        default:
                if (mndx >= LOW_PM && mndx < NUMMONS) {
                        struct permonst *ptr = &mons[mndx];
index 1b5d22d37c2163d0cb8f23acd52a95bc324c6b9e..dbe637f16e924f45576ee47abe65ebe5342a1e69 100644 (file)
@@ -2560,7 +2560,7 @@ typfnd:
                               or of ordinary one being forced to such */
                            if (otmp->timed) obj_stop_timers(otmp);
                            if (mons[mntmp].msound == MS_GUARDIAN)
-                               otmp->corpsenm = genus(mntmp);
+                               otmp->corpsenm = genus(mntmp,1);
                            else
                                otmp->corpsenm = mntmp;
                            start_corpse_timeout(otmp);
index a50b1b17a073a560420c1446cc5e11752a4482f0..ebd51aa75fa01f8ef12a6a75e5b62166c87f9164 100644 (file)
@@ -438,7 +438,7 @@ register struct monst *mtmp;
     /* Make sure its your role's quest quardian; adjust if not */
     if (ptr->msound == MS_GUARDIAN && ptr != &mons[urole.guardnum]) {
        int mndx = monsndx(ptr);
-       ptr = &mons[genus(mndx)];
+       ptr = &mons[genus(mndx,1)];
     }
 
     /* be sure to do this before talking; the monster might teleport away, in
index 69a7b7d80a6182a95cb8e0127ae1a1066c1fd8cd..94db47ebf37f39e93a76693574673d9a2d13d1a9 100644 (file)
@@ -444,7 +444,16 @@ int *fail_reason;
                 */
                mon = makemon(&mons[PM_DOPPELGANGER], x, y,
                        NO_MINVENT|MM_NOCOUNTBIRTH|MM_ADJACENTOK);
-               if (mon) (void) newcham(mon, mptr, FALSE, FALSE);
+               if (mon) {
+                       /* makemon() will set mon->cham to
+                        * CHAM_ORDINARY if hero is wearing
+                        * ring of protection from shape changers
+                        * when makemon() is called, so we have to
+                        * check the field before calling newcham().
+                        */
+                       if (mon->cham == CHAM_DOPPELGANGER)
+                               (void) newcham(mon, mptr, FALSE, FALSE);
+               }
            } else
                mon = makemon(mptr, x, y, (cause == ANIMATE_SPELL) ?
                        (NO_MINVENT | MM_ADJACENTOK) : NO_MINVENT);