]> granicus.if.org Git - nethack/commitdiff
cham changes (trunk only)
authornethack.allison <nethack.allison>
Tue, 15 Jun 2004 11:38:32 +0000 (11:38 +0000)
committernethack.allison <nethack.allison>
Tue, 15 Jun 2004 11:38:32 +0000 (11:38 +0000)
This is a foundation patch for patches to follow.
- use a full short index for mon->cham field.
- The current system of providing CHAM_XXX values
  was limited to the 3 bits allocated in the bitfield and invalidated
  save/bones if the field was expanded.
- The current system didn't provide an easy backwards  change
  if multiple monster types wanted to use the bit, there was a one
  to one mapping:  For instance, if you wanted a CHAM_VAMPIRE,
  and you wanted vampires, vampire lords, and Vlad to use it, you
  would have to have CHAM_VAMPIRE, CHAM_VAMPIRE_LORD,
  and CHAM_VLAD defined to achieve that with the one-to-one backward
  mapping.
- This new way just uses the mon[] index in the mon->cham field and
  eliminates the need for CHAM_XXX  (CHAM_ORDINARY is still used).
- no longer requires the cham_to_pm mappings

22 files changed:
doc/fixes35.0
include/extern.h
include/mondata.h
include/monflag.h
include/monst.h
include/patchlevel.h
src/allmain.c
src/apply.c
src/cmd.c
src/dogmove.c
src/eat.c
src/fountain.c
src/mhitu.c
src/minion.c
src/mon.c
src/monst.c
src/muse.c
src/pline.c
src/polyself.c
src/potion.c
src/trap.c
src/zap.c

index 1e9beea2f53fa4bd2339249dacd2845b1a6b4145..f9660cd5362071200ce1ec4dbe3d7ccd8a8b66e7 100644 (file)
@@ -127,4 +127,5 @@ removed OVLx section dividers previously  used for TRAMPOLINE overlay system
 move all flags that are system or port specific from flag struct to sysflags 
        struct which is used only if SYSFLAGS is defined
 all fields in flags struct are unconditionally present
+monst cham field now a short and uses mons[] index
 
index c7c6f06c521f5de992764a60afcaceb500244d26..6d0ebf8060db539881076888cd06cafdfba334aa 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)extern.h   3.4     2003/03/14      */
+/*     SCCS Id: @(#)extern.h   3.4     2004/06/12      */
 /* Copyright (c) Steve Creps, 1988.                              */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -1187,6 +1187,7 @@ E void NDECL(restartcham);
 E void FDECL(restore_cham, (struct monst *));
 E boolean FDECL(hideunder, (struct monst*));
 E void FDECL(mon_animal_list, (BOOLEAN_P));
+E int FDECL(select_newcham_form, (struct monst *));
 E int FDECL(newcham, (struct monst *,struct permonst *,BOOLEAN_P,BOOLEAN_P));
 E int FDECL(can_be_hatched, (int));
 E int FDECL(egg_type_from_parent, (int,BOOLEAN_P));
@@ -1580,7 +1581,7 @@ E void NDECL(self_invis_message);
 
 E void NDECL(set_uasmon);
 E void NDECL(change_sex);
-E void FDECL(polyself, (BOOLEAN_P));
+E void FDECL(polyself, (int));
 E int FDECL(polymon, (int));
 E void NDECL(rehumanize);
 E int NDECL(dobreathe);
index dd37dc872d2e0daceb76c05998846a4988fcdf4e..f76520ef23f5013464904b641cf93bb30090b3b6 100644 (file)
@@ -75,6 +75,7 @@
 #define herbivorous(ptr)       (((ptr)->mflags1 & M1_HERBIVORE) != 0L)
 #define metallivorous(ptr)     (((ptr)->mflags1 & M1_METALLIVORE) != 0L)
 #define polyok(ptr)            (((ptr)->mflags2 & M2_NOPOLY) == 0L)
+#define is_shapeshifter(ptr)   (((ptr)->mflags2 & M2_SHAPESHIFTER) != 0L)
 #define is_undead(ptr)         (((ptr)->mflags2 & M2_UNDEAD) != 0L)
 #define is_were(ptr)           (((ptr)->mflags2 & M2_WERE) != 0L)
 #define is_elf(ptr)            (((ptr)->mflags2 & M2_ELF) != 0L)
index 5af876dde61af03faa3f92b0a229f69a24a28116..b849584d6f9793234ff70c629e41c6508a03249c 100644 (file)
 #define M2_PRINCE      0x00000800L     /* is an overlord to its kind */
 #define M2_MINION      0x00001000L     /* is a minion of a deity */
 #define M2_GIANT       0x00002000L     /* is a giant */
+#define M2_SHAPESHIFTER        0x00004000L     /* is a shapeshifting species */
 #define M2_MALE                0x00010000L     /* always male */
 #define M2_FEMALE      0x00020000L     /* always female */
 #define M2_NEUTER      0x00040000L     /* neither male nor female */
index 9996ffcb3f44b1c013056bd7ef63e2520c543234..c98239905452a371187266fc115c5faa85cb9bc1 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)monst.h    3.4     1999/01/04      */
+/*     SCCS Id: @(#)monst.h    3.4     2004/06/12      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -42,6 +42,8 @@ struct monst {
        struct permonst *data;
        unsigned m_id;
        short mnum;             /* permanent monster index number */
+       short cham;             /* if shapeshifter, orig mons[] idx goes here */
+#define CHAM_ORDINARY  0       /* not a shapechanger */
        short movement;         /* movement points (derived from permonst definition and added effects */
        uchar m_lev;            /* adjusted difficulty level of monster */
        aligntyp malign;        /* alignment of this monster, relative to the
@@ -67,48 +69,43 @@ struct monst {
        Bitfield(minvis,1);     /* currently invisible */
        Bitfield(invis_blkd,1); /* invisibility blocked */
        Bitfield(perminvis,1);  /* intrinsic minvis value */
-       Bitfield(cham,3);       /* shape-changer */
-/* note: lychanthropes are handled elsewhere */
-#define CHAM_ORDINARY          0       /* not a shapechanger */
-#define CHAM_CHAMELEON         1       /* animal */
-#define CHAM_DOPPELGANGER      2       /* demi-human */
-#define CHAM_SANDESTIN         3       /* demon */
-#define CHAM_MAX_INDX          CHAM_SANDESTIN
+       Bitfield(mcan,1);       /* has been cancelled */
+       Bitfield(mburied,1);    /* has been buried */
        Bitfield(mundetected,1);        /* not seen in present hiding place */
                                /* implies one of M1_CONCEAL or M1_HIDE,
                                 * but not mimic (that is, snake, spider,
                                 * trapper, piercer, eel)
                                 */
 
-       Bitfield(mcan,1);       /* has been cancelled */
-       Bitfield(mburied,1);    /* has been buried */
        Bitfield(mspeed,2);     /* current speed */
        Bitfield(permspeed,2);  /* intrinsic mspeed value */
        Bitfield(mrevived,1);   /* has been revived from the dead */
        Bitfield(mavenge,1);    /* did something to deserve retaliation */
-
        Bitfield(mflee,1);      /* fleeing */
+       Bitfield(mcansee,1);    /* cansee 1, temp.blinded 0, blind 0 */
+
        Bitfield(mfleetim,7);   /* timeout for mflee */
+       Bitfield(msleeping,1);  /* asleep until woken */
 
-       Bitfield(mcansee,1);    /* cansee 1, temp.blinded 0, blind 0 */
        Bitfield(mblinded,7);   /* cansee 0, temp.blinded n, blind 0 */
+       Bitfield(mstun,1);      /* stunned (off balance) */
 
-       Bitfield(mcanmove,1);   /* paralysis, similar to mblinded */
        Bitfield(mfrozen,7);
+       Bitfield(mcanmove,1);   /* paralysis, similar to mblinded */
 
-       Bitfield(msleeping,1);  /* asleep until woken */
-       Bitfield(mstun,1);      /* stunned (off balance) */
        Bitfield(mconf,1);      /* confused */
        Bitfield(mpeaceful,1);  /* does not attack unprovoked */
        Bitfield(mtrapped,1);   /* trapped in a pit, web or bear trap */
        Bitfield(mleashed,1);   /* monster is on a leash */
        Bitfield(isshk,1);      /* is shopkeeper */
        Bitfield(isminion,1);   /* is a minion */
-
        Bitfield(isgd,1);       /* is guard */
        Bitfield(ispriest,1);   /* is a priest */
+
        Bitfield(iswiz,1);      /* is the Wizard of Yendor */
        Bitfield(wormno,5);     /* at most 31 worms on any level */
+                               /* 2 free bits */
+
 #define MAX_NUM_WORMS  32      /* should be 2^(wormno bitfield size) */
 
        long mstrategy;         /* for monsters with mflag3: current strategy */
index 15abc3f0019b87be86f3bb855396c09e48308afb..fefd12b97f3fed8dc814c0d1d2eb37d4537ecdf7 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)patchlevel.h       3.4     2004/05/24      */
+/*     SCCS Id: @(#)patchlevel.h       3.4     2004/06/12      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -13,7 +13,7 @@
  * Incrementing EDITLEVEL can be used to force invalidation of old bones
  * and save files.
  */
-#define EDITLEVEL      12
+#define EDITLEVEL      14
 
 #define COPYRIGHT_BANNER_A \
 "NetHack, Copyright 1985-2004"
index 02fdfa7f00dbc5dc01813bdbc609b8a26374e188..a2664fd3a61b9f48636ef29c8bb9a54931bd89aa 100644 (file)
@@ -251,7 +251,7 @@ moveloop()
                                    stop_occupation();
                                else
                                    nomul(0);
-                               if (change == 1) polyself(FALSE);
+                               if (change == 1) polyself(0);
                                else you_were();
                                change = 0;
                            }
index a31ce2b9f902cd076cae261a4d949c7339c549ad..c2138aa20f947e165f853a8ec77fab34bad2e3ea 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)apply.c    3.4     2003/11/18      */
+/*     SCCS Id: @(#)apply.c    3.4     2004/06/12      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
index 78054caac0b904f6f771decd64b3c871ca85bca3..c434f0ed20378e227c11d211fb75ca8a69993a7e 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -636,7 +636,7 @@ wiz_panic()
 STATIC_PTR int
 wiz_polyself()
 {
-        polyself(TRUE);
+        polyself(1);
         return 0;
 }
 
index fe0b90db23cd7174b1cd018b38ad98aed7b4e961..0bbdc57cd39f513f74b8575b820f9487afd85e99 100644 (file)
@@ -920,7 +920,7 @@ finish_meating(mtmp)
 struct monst *mtmp;
 {
        mtmp->meating = 0;
-       if (mtmp->m_ap_type && mtmp->mappearance && !mtmp->cham) {
+       if (mtmp->m_ap_type && mtmp->mappearance && mtmp->cham == CHAM_ORDINARY) {
                /* was eating a mimic and now appearance needs resetting */
                mtmp->m_ap_type = 0;
                mtmp->mappearance = 0;
index c91ac4e856c279f90707cbaef14a243e3f9f6f68..cb4339517546db98721333636c2afe4e9fbfd077 100644 (file)
--- a/src/eat.c
+++ b/src/eat.c
@@ -875,7 +875,7 @@ register int pm;
         /* case PM_SANDESTIN: */
                if (!Unchanging) {
                    You_feel("a change coming over you.");
-                   polyself(FALSE);
+                   polyself(0);
                }
                break;
            case PM_MIND_FLAYER:
index e585a3450f739534615d44cb58969ab610b0c11f..f7480abf575fa46f631b379e040113fbbec308f2 100644 (file)
@@ -581,7 +581,7 @@ drinksink()
                case 10: pline("This water contains toxic wastes!");
                        if (!Unchanging) {
                                You("undergo a freakish metamorphosis!");
-                               polyself(FALSE);
+                               polyself(0);
                        }
                        break;
                /* more odd messages --JJB */
index 7c50a98c9267f556fd6289ef376fd7065443702c..ff0b6bc04cbcebb45f6fe672c3433a3e91ec35a3 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)mhitu.c    3.4     2003/11/26      */
+/*     SCCS Id: @(#)mhitu.c    3.4     2004/06/12      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -467,14 +467,14 @@ mattacku(mtmp)
        }
 
 /*     Special demon handling code */
-       if(!mtmp->cham && is_demon(mdat) && !range2
+       if((mtmp->cham == CHAM_ORDINARY) && is_demon(mdat) && !range2
           && mtmp->data != &mons[PM_BALROG]
           && mtmp->data != &mons[PM_SUCCUBUS]
           && mtmp->data != &mons[PM_INCUBUS])
            if(!mtmp->mcan && !rn2(13)) msummon(mtmp);
 
 /*     Special lycanthrope handling code */
-       if(!mtmp->cham && is_were(mdat) && !range2) {
+       if((mtmp->cham == CHAM_ORDINARY) && is_were(mdat) && !range2) {
 
            if(is_human(mdat)) {
                if(!rn2(5 - (night() * 2)) && !mtmp->mcan) new_were(mtmp);
index ec5265ef016016ef41a36bcc45b0d3d55afd4ad0..618c45eb3cfe0f8afca0203f8cdaa08639861bd0 100644 (file)
@@ -136,7 +136,7 @@ boolean talk;
     }
 }
 
-#define Athome (Inhell && !mtmp->cham)
+#define Athome (Inhell && (mtmp->cham == CHAM_ORDINARY))
 
 int
 demon_talk(mtmp)               /* returns 1 if it won't attack. */
index cf958b598188c641d61720fe94b6a67508952eb2..2355b857f66e4414c9a28bd98c88298392f43eaa 100644 (file)
--- a/src/mon.c
+++ b/src/mon.c
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)mon.c      3.4     2004/05/21      */
+/*     SCCS Id: @(#)mon.c      3.4     2004/06/12      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -120,30 +120,21 @@ int mndx, mode;
        return mndx;
 }
 
-/* convert monster index to chameleon index */
+/* return monster index if chameleon, or CHAM_ORDINARY if not */
 int
 pm_to_cham(mndx)
 int mndx;
 {
-       int mcham;
+       int mcham = CHAM_ORDINARY;
 
-       switch (mndx) {
-       case PM_CHAMELEON:      mcham = CHAM_CHAMELEON; break;
-       case PM_DOPPELGANGER:   mcham = CHAM_DOPPELGANGER; break;
-       case PM_SANDESTIN:      mcham = CHAM_SANDESTIN; break;
-       default: mcham = CHAM_ORDINARY; break;
-       }
+       /*
+        * As of 3.5.0 we just check M2_SHAPESHIFTER instead of having a
+        * big switch statement with hardcoded shapeshifter types here.
+        */
+       if (mndx > LOW_PM && is_shapeshifter(&mons[mndx])) mcham = mndx;
        return mcham;
 }
 
-/* convert chameleon index to monster index */
-STATIC_VAR short cham_to_pm[] = {
-               NON_PM,         /* placeholder for CHAM_ORDINARY */
-               PM_CHAMELEON,
-               PM_DOPPELGANGER,
-               PM_SANDESTIN,
-};
-
 /* for deciding whether corpse will carry along full monster data */
 #define KEEPTRAITS(mon)        ((mon)->isshk || (mon)->mtame ||                \
                         unique_corpstat(mon->data) ||                  \
@@ -1458,8 +1449,10 @@ register struct monst *mtmp;
 
        mptr = mtmp->data;              /* save this for m_detach() */
        /* restore chameleon, lycanthropes to true form at death */
-       if (mtmp->cham)
-           set_mon_data(mtmp, &mons[cham_to_pm[mtmp->cham]], -1);
+       if (mtmp->cham != CHAM_ORDINARY) {
+           set_mon_data(mtmp, &mons[mtmp->cham], -1);
+           mtmp->cham = CHAM_ORDINARY;
+       }
        else if (mtmp->data == &mons[PM_WEREJACKAL])
            set_mon_data(mtmp, &mons[PM_HUMAN_WEREJACKAL], -1);
        else if (mtmp->data == &mons[PM_WEREWOLF])
@@ -2174,10 +2167,10 @@ rescham()
        for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
                if (DEADMONSTER(mtmp)) continue;
                mcham = (int) mtmp->cham;
-               if (mcham) {
-                       mtmp->cham = CHAM_ORDINARY;
-                       (void) newcham(mtmp, &mons[cham_to_pm[mcham]],
+               if (mcham != CHAM_ORDINARY) {
+                       (void) newcham(mtmp, &mons[mcham],
                                       FALSE, FALSE);
+                       mtmp->cham = CHAM_ORDINARY;
                }
                if(is_were(mtmp->data) && mtmp->data->mlet != S_HUMAN)
                        new_were(mtmp);
@@ -2218,9 +2211,9 @@ struct monst *mon;
 
        if (Protection_from_shape_changers) {
            mcham = (int) mon->cham;
-           if (mcham) {
+           if (mcham != CHAM_ORDINARY) {
                mon->cham = CHAM_ORDINARY;
-               (void) newcham(mon, &mons[cham_to_pm[mcham]], FALSE, FALSE);
+               (void) newcham(mon, &mons[mcham], FALSE, FALSE);
            } else if (is_were(mon->data) && !is_human(mon->data)) {
                new_were(mon);
            }
@@ -2234,7 +2227,7 @@ STATIC_OVL boolean
 restrap(mtmp)
 register struct monst *mtmp;
 {
-       if(mtmp->cham || mtmp->mcan || mtmp->m_ap_type ||
+       if((mtmp->cham != CHAM_ORDINARY) || mtmp->mcan || mtmp->m_ap_type ||
           cansee(mtmp->mx, mtmp->my) || rn2(3) || (mtmp == u.ustuck) ||
           (sensemon(mtmp) && distu(mtmp->mx, mtmp->my) <= 2))
                return(FALSE);
@@ -2313,24 +2306,39 @@ pick_animal()
        return animal_list[rn2(animal_list_count)];
 }
 
-STATIC_OVL int
+int
 select_newcham_form(mon)
 struct monst *mon;
 {
        int mndx = NON_PM;
 
        switch (mon->cham) {
-           case CHAM_SANDESTIN:
+           case PM_SANDESTIN:
                if (rn2(7)) mndx = pick_nasty();
                break;
-           case CHAM_DOPPELGANGER:
+           case PM_DOPPELGANGER:
                if (!rn2(7)) mndx = pick_nasty();
                else if (rn2(3)) mndx = rn1(PM_WIZARD - PM_ARCHEOLOGIST + 1,
                                            PM_ARCHEOLOGIST);
                break;
-           case CHAM_CHAMELEON:
+           case PM_CHAMELEON:
                if (!rn2(3)) mndx = pick_animal();
                break;
+           case PM_VLAD_THE_IMPALER:
+           case PM_VAMPIRE_LORD:
+           case PM_VAMPIRE:
+               if (mon_has_special(mon) &&  /* ensure Vlad can carry it still */
+                   mon->cham == PM_VLAD_THE_IMPALER) {
+                       mndx = PM_VLAD_THE_IMPALER;
+                       break;
+               }
+               if (!rn2(10) && mon->cham != PM_VAMPIRE) {
+                       /* VAMPIRE_LORD || VLAD */
+                       mndx = PM_WOLF;
+                       break;
+               }
+               mndx = !rn2(4) ? PM_FOG_CLOUD : PM_VAMPIRE_BAT;
+               break;
            case CHAM_ORDINARY:
              {
                struct obj *m_armr = which_armor(mon, W_ARM);
@@ -2649,12 +2657,12 @@ void
 kill_genocided_monsters()
 {
        struct monst *mtmp, *mtmp2;
-       boolean kill_cham[CHAM_MAX_INDX+1];
+       boolean kill_cham[NUMMONS];
        int mndx;
 
        kill_cham[CHAM_ORDINARY] = FALSE;       /* (this is mndx==0) */
-       for (mndx = 1; mndx <= CHAM_MAX_INDX; mndx++)
-         kill_cham[mndx] = (mvitals[cham_to_pm[mndx]].mvflags & G_GENOD) != 0;
+       for (mndx = LOW_PM; mndx < NUMMONS; mndx++)
+         kill_cham[mndx] = (mvitals[mndx].mvflags & G_GENOD) != 0;
        /*
         * Called during genocide, and again upon level change.  The latter
         * catches up with any migrating monsters as they finally arrive at
@@ -2671,7 +2679,7 @@ kill_genocided_monsters()
            if (DEADMONSTER(mtmp)) continue;
            mndx = monsndx(mtmp->data);
            if ((mvitals[mndx].mvflags & G_GENOD) || kill_cham[mtmp->cham]) {
-               if (mtmp->cham && !kill_cham[mtmp->cham])
+               if ((mtmp->cham != CHAM_ORDINARY) && !kill_cham[mtmp->cham])
                    (void) newcham(mtmp, (struct permonst *)0, FALSE, FALSE);
                else
                    mondead(mtmp);
index db30c29992bc46ab74dfa2831b2545522834a7f2..c7ba3353a87a69f3120cc91fd3805f3b92b8d9b1 100644 (file)
@@ -94,6 +94,7 @@ NEARDATA struct permonst mons[] = {
 /*
  * ants
  */
+    /* Never use M2_SHAPESHIFTER for mons[0] as long as CHAM_ORDINARY==0 */
     MON("giant ant", S_ANT,
        LVL(2, 18, 3, 0, 0), (G_GENO|G_SGROUP|3),
        A(ATTK(AT_BITE, AD_PHYS, 1, 4),
@@ -2357,7 +2358,7 @@ struct permonst _mons2[] = {
          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
        SIZ(WT_HUMAN, 400, 0, MS_IMITATE, MZ_HUMAN), MR_SLEEP, 0,
        M1_HUMANOID|M1_OMNIVORE,
-       M2_NOPOLY|M2_HUMAN|M2_HOSTILE|M2_STRONG|M2_COLLECT,
+       M2_NOPOLY|M2_HUMAN|M2_HOSTILE|M2_STRONG|M2_COLLECT|M2_SHAPESHIFTER,
        M3_INFRAVISIBLE, HI_DOMESTIC),
     MON("nurse", S_HUMAN,
        LVL(11, 6, 0, 0, 0), (G_GENO|3),
@@ -2791,7 +2792,7 @@ struct permonst _mons2[] = {
        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
        SIZ(1500, 400, 0, MS_CUSS, MZ_HUMAN), MR_STONE, 0,
-       M1_HUMANOID, M2_NOPOLY|M2_STALK|M2_STRONG|M2_COLLECT,
+       M1_HUMANOID, M2_NOPOLY|M2_STALK|M2_STRONG|M2_COLLECT|M2_SHAPESHIFTER,
        M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GRAY),
 /*
  * sea monsters
@@ -2883,7 +2884,8 @@ struct permonst _mons2[] = {
        A(ATTK(AT_BITE, AD_PHYS, 4, 2),
          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
        SIZ(100, 100, 0, MS_SILENT, MZ_TINY), 0, 0,
-       M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_NOPOLY|M2_HOSTILE, 0, CLR_BROWN),
+       M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_NOPOLY|M2_HOSTILE|M2_SHAPESHIFTER,
+       0, CLR_BROWN),
     MON("crocodile", S_LIZARD,
        LVL(6, 9, 5, 0, 0), (G_GENO|1),
        A(ATTK(AT_BITE, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 1,12),
index 613c5e945fedf4d80a2536ddaad9c334dc83a91b..107f432fdfc2df268ab567b62f4ec0ab38931498 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)muse.c     3.4     2002/12/23      */
+/*     SCCS Id: @(#)muse.c     3.4     2004/06/12      */
 /*     Copyright (C) 1990 by Ken Arromdee                         */
 /* NetHack may be freely redistributed.  See license for details.  */
 
@@ -1588,7 +1588,8 @@ struct monst *mtmp;
        if(dist2(x, y, mtmp->mux, mtmp->muy) > 36)
                return FALSE;
 
-       if (!stuck && !immobile && !mtmp->cham && monstr[monsndx(mdat)] < 6) {
+       if (!stuck && !immobile &&
+               (mtmp->cham == CHAM_ORDINARY) && monstr[monsndx(mdat)] < 6) {
          boolean ignore_boulders = (verysmall(mdat) ||
                                     throws_rocks(mdat) ||
                                     passes_walls(mdat));
@@ -1658,13 +1659,15 @@ struct monst *mtmp;
                        m.has_misc = MUSE_POT_SPEED;
                }
                nomore(MUSE_WAN_POLYMORPH);
-               if(obj->otyp == WAN_POLYMORPH && obj->spe > 0 && !mtmp->cham
+               if(obj->otyp == WAN_POLYMORPH && obj->spe > 0
+                               && (mtmp->cham == CHAM_ORDINARY)
                                && monstr[monsndx(mdat)] < 6) {
                        m.misc = obj;
                        m.has_misc = MUSE_WAN_POLYMORPH;
                }
                nomore(MUSE_POT_POLYMORPH);
-               if(obj->otyp == POT_POLYMORPH && !mtmp->cham
+               if(obj->otyp == POT_POLYMORPH
+                               && (mtmp->cham == CHAM_ORDINARY)
                                && monstr[monsndx(mdat)] < 6) {
                        m.misc = obj;
                        m.has_misc = MUSE_POT_POLYMORPH;
index 60218fe15a49f6af5d8cd0bc54f700e3f2a4e333..7a5d4920383f9fa112052502e10f7cec80029f79 100644 (file)
@@ -309,7 +309,7 @@ register struct monst *mtmp;
        }
        else if (mtmp->mpeaceful) Strcat(info, ", peaceful");
        if (mtmp->meating)        Strcat(info, ", eating");
-       if (mtmp->meating && !mtmp->cham &&
+       if (mtmp->meating && (mtmp->cham == CHAM_ORDINARY) &&
            mtmp->mappearance && mtmp->m_ap_type) {
                Sprintf(eos(info), ", mimicing %s",
                    (mtmp->m_ap_type == M_AP_FURNITURE) ?
index fa5f42967baf00ab5f06e2918f6ddaf0fb53b26b..948de3fdee90036c67a6f430531516582bc7365c 100644 (file)
@@ -225,13 +225,14 @@ dead: /* we come directly here if their experience level went to 0 or less */
 }
 
 void
-polyself(forcecontrol)
-boolean forcecontrol;     
+polyself(psflags)
+int psflags;     
 {
        char buf[BUFSZ];
        int old_light, new_light;
        int mntmp = NON_PM;
        int tries=0;
+       boolean forcecontrol = (psflags == 1);
        boolean draconian = (uarm &&
                                uarm->otyp >= GRAY_DRAGON_SCALE_MAIL &&
                                uarm->otyp <= YELLOW_DRAGON_SCALES);
index b7b1f2cc2e34e8401476c4caabec0836a74f1561..79b1ba73c96fe7e88599e7750612b35c6ddda933 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)potion.c   3.4     2003/11/26      */
+/*     SCCS Id: @(#)potion.c   3.4     2004/06/12      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -918,7 +918,7 @@ peffects(otmp)
                break;
        case POT_POLYMORPH:
                You_feel("a little %s.", Hallucination ? "normal" : "strange");
-               if (!Unchanging) polyself(FALSE);
+               if (!Unchanging) polyself(0);
                break;
        default:
                impossible("What a funny potion! (%u)", otmp->otyp);
@@ -1055,7 +1055,7 @@ boolean your_fault;
                break;
        case POT_POLYMORPH:
                You_feel("a little %s.", Hallucination ? "normal" : "strange");
-               if (!Unchanging && !Antimagic) polyself(FALSE);
+               if (!Unchanging && !Antimagic) polyself(0);
                break;
        case POT_ACID:
                if (!Acid_resistance) {
index abe053714cc9a142b55e563bd873a933fe0e70d6..689420f15b2a9801dd87e5484e2ad3161514327a 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)trap.c     3.4     2003/12/26      */
+/*     SCCS Id: @(#)trap.c     3.4     2004/06/12      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -1100,7 +1100,7 @@ glovecheck:               (void) rust_dmg(uarmg, "gauntlets", 1, TRUE, &youmonst);
                    deltrap(trap);      /* delete trap before polymorph */
                    newsym(u.ux,u.uy);  /* get rid of trap symbol */
                    You_feel("a change coming over you.");
-                   polyself(FALSE);
+                   polyself(0);
                }
                break;
            }
index 7ac5d06627b02ecc7348e1a635f840cc9664000a..7610ec10134e7e3d2e0d9977661ab08e78dd124f 100644 (file)
--- a/src/zap.c
+++ b/src/zap.c
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)zap.c      3.4     2003/11/26      */
+/*     SCCS Id: @(#)zap.c      3.4     2004/06/12      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -634,7 +634,7 @@ register struct obj *obj;
                    mtmp = makemon(&mons[montype], x, y,
                                   NO_MINVENT | MM_NOWAIT);
                    if (mtmp) {
-                       if (mtmp->cham == CHAM_DOPPELGANGER) {
+                       if (mtmp->cham == PM_DOPPELGANGER) {
                            /* change shape to match the corpse */
                            (void) newcham(mtmp, mptr, FALSE, FALSE);
                        } else if (mtmp->data->mlet == S_ZOMBIE) {
@@ -1983,7 +1983,7 @@ boolean ordinary;
                        makeknown(WAN_POLYMORPH);
                case SPE_POLYMORPH:
                    if (!Unchanging)
-                       polyself(FALSE);
+                       polyself(0);
                    break;
 
                case WAN_CANCELLATION: