]> granicus.if.org Git - nethack/commitdiff
compile NetHack-3.7 without makedefs-generated .h files
authornhmall <nhmall@nethack.org>
Tue, 17 Aug 2021 18:43:29 +0000 (14:43 -0400)
committernhmall <nhmall@nethack.org>
Sat, 21 Aug 2021 11:59:18 +0000 (07:59 -0400)
This evolves and hopefully eases the game-build requirements by
removing game-compile dependencies on any header files generated
by the makedefs utility, including:

date.h dependency and its inclusion is removed and comparable functionality
is produced at runtime via new file src/date.c.

pm.h dependency and its inclusion is removed and comparable functionality is
produced by moving the monster definitions from monst.c into new header
file called monsters.h and altering them slightly. The former pm.h header
file #define PM_ values are now replaced with appropriate emitted enum
entries during the compiler preprocessing.

onames.h dependency and its inclusion is removed and comparable functionality
is produced by moving the object definitions from objects.c into new header
file called objects.h and altering them slightly. The former onames.h header
file #define values are now replaced with appropriate emitted enum entries
during the compiler preprocessing.

artilist.h has been slightly altered, and the former onames.h artifact-related
header file #define ART_ values are now replaced with appropriate emitted enum
entries during the compiler preprocessing.

makedefs can still produce date.h (makedefs -v), pm.h (makedefs -p), and
onames.h (makedefs -o) for reference purposes. They won't be used during
the compiler.

The other uses for makedefs remain. They are used to prepare external
file content that the game utilizes, not prerequisite code for the
compile:
    makedefs -d    (database)
    makedefs -r    (rumors)
    makedefs -h    (oracles)
    makedefs -s    (epitaphs, engravings, bogusmons)

date.c

Pull the code for date/time stamping from mdlib.c into date.c.
Set date.o to be dependent on source files, header files, and .o files
so that date.o is rebuilt from date.c when any of those changes, thus
ensuring an accurate date/time stamp. It also includes git sha
functionality formerly done by makedefs writing #define directives
into include/date.h. For unix it passes the git info on
the compile line for date.c (via sys/unix/hints/linux.2020, macOS.2020)

nethack --dumpenums (optional, but on by default)

Allow developer to obtain some internal enum values from NetHack
without having to resort to an external utility such as
makedefs.

Uncomment #define NODUMPENUMS in config.h to disable this.

The updates to sys/windows/Makefile.gcc have not been tested yet.

50 files changed:
Cross-compiling
Porting
doc/fixes37.0
doc/window.doc
include/.gitattributes
include/artilist.h
include/config.h
include/decl.h
include/extern.h
include/global.h
include/hack.h
include/monsters.h [new file with mode: 0644]
include/objclass.h
include/objects.h [new file with mode: 0644]
include/patchlevel.h
include/permonst.h
include/youprop.h
src/.gitignore
src/allmain.c
src/date.c [new file with mode: 0644]
src/end.c
src/mdlib.c
src/monst.c
src/objects.c
src/shknam.c
src/version.c
sys/msdos/Makefile.GCC
sys/unix/Install.unx
sys/unix/Makefile.src
sys/unix/Makefile.utl
sys/unix/NetHack.xcodeproj/project.pbxproj
sys/unix/hints/linux.2020
sys/unix/hints/macOS.2020
sys/unix/unixmain.c
sys/vms/Makefile.src
sys/windows/Install.windows
sys/windows/Makefile.gcc
sys/windows/Makefile.msc
sys/windows/vs/NetHack/NetHack.vcxproj
sys/windows/vs/NetHackW/NetHackW.vcxproj
sys/windows/vs/files.props
sys/windows/vs/tilemap/tilemap.vcxproj
sys/windows/windmain.c
util/dlb_main.c
util/makedefs.c
util/recover.c
win/curses/cursmain.c
win/share/tilemap.c
win/win32/mhmain.c
win/win32/mhsplash.c

index b907b563db010dc197cef452685ead8181858e3c..0e3f0bb7fcd7e1e92b1834fc70c31d3664cbcec1 100644 (file)
@@ -124,13 +124,10 @@ steps to be carried out:
 
     1. Compile and link util/makedefs.
     2. Run makedefs repeatedly with different command line options to produce
-       several output files that are required for:
-        (a) additional build steps to follow, including some header
-            files: pm.h, onames.h, date.h.
-        (b) creation of files, containing information required by,
-            or about the game during its execution, that are stored in a
-            portable, platform-independent way, that need to be inserted
-            into the game package.
+       several required output files that contain information required by the
+       game, or contain information about the game during its execution, that
+       are stored in a portable, platform-independent way, that need to be
+       inserted into the game package (makedefs -d, -z, -r, -h, -s).
     3. Compile and link several less critical utilities such as uudecode,
        tile-generation utilities, and so forth, all of which need to execute
        on the build platform during the build process to produce output files
@@ -261,14 +258,18 @@ On the HOST, here are the mandatory things that have to be built.
        from sources: util/makedefs.c, src/mdlib.c, src/monst.c, src/objects.c
 
     b) Execute HOST native makedefs utility, util/makedefs, as follows:
-          util/makedefs -v
-          util/makedefs -o
-          util/makedefs -p
-          util/makedefs -z
-          util/makedefs -d
-          util/makedefs -r
-          util/makedefs -h
-          util/makedefs -s
+          Required for complete packaging of the game, but not the C source
+          game compile:
+              util/makedefs -d
+              util/makedefs -r
+              util/makedefs -h
+              util/makedefs -s
+
+          For reference purposes, but no longer a required prerequisite for the
+          game compile process:
+              util/makedefs -v
+              util/makedefs -o
+              util/makedefs -p
 
     c) Using the HOST native compiler, build these additional utilities if your
        target platform requires components that they produce. It is important
diff --git a/Porting b/Porting
index 201a66de026bcd45ff3680e6a6d2a034daf36b3a..477f10682b17f4a3db94c3b4592ba3c1f3c87f53 100644 (file)
--- a/Porting
+++ b/Porting
@@ -182,20 +182,23 @@ NetHack requires the following steps to be carried out:
 
 Compile and link util/makedefs. Run makedefs repeatedly with different command
 line options to produce several output files that are required for:
-          (a) additional build steps to follow, including some header
-              files: pm.h, onames.h, date.h.
-          (b) creation of files, containing information required by,
+          (a) creation of files, containing information required by,
               or about the game during its execution, that are stored in a
               portable, platform-independent way, that need to be inserted
               into the final game package.
 
-          util/makedefs -v
-          util/makedefs -o
-          util/makedefs -p
-          util/makedefs -d
-          util/makedefs -r
-          util/makedefs -h
-          util/makedefs -s
+          Required for complete packaging of the game, but not the C source
+          game compile:
+              util/makedefs -d
+              util/makedefs -r
+              util/makedefs -h
+              util/makedefs -s
+
+          For reference purposes, but no longer a required prerequisite for the
+          game compile process:
+              util/makedefs -v
+              util/makedefs -o
+              util/makedefs -p
 
      4.2. Other utilities
 
index 8ab7e130a9b266f4ca36a7013ff5cabd3ee1fd9e..b62d9f3ff1c737a53e880ab7762efb60d9248bfd 100644 (file)
@@ -1269,3 +1269,17 @@ adjust window port interface to pass a pointer to a glyph_info struct which
        and the symset index; this affects two window port calls that get
        passed glyphs: print_glyph() and add_menu().
 switch from k&r C to C99
+remove the game-compile dependencies on any pre-generated header files
+date.h dependency and inclusion is removed and comparable functionality is
+       produced at runtime; REPRODUCIBLE_BUILD capability will need to be
+       reviewed and adjusted
+pm.h dependency and inclusion is removed and comparable functionality is
+       produced by moving the monster definitions from monst.c into new header
+       file called monsters.h, then taking advantage of the C preprocessor to
+       generate appropriate enum values during compile
+onames.h dependency and inclusion is removed and comparable functionality is
+       produced by moving the object definitions from objects.c into new header
+       file called objects.h, then taking advantage of the C preprocessor to
+       generate appropriate enum values during compile
+artilist.h is used to generate appropriate artifact enum values by the C
+       preprocessor during compile
index bac8008b5ba152cc54c053407f49de650dc25695..ccc5a596bb1ec4246532bbdeeef46e0bb9e6c6d7 100644 (file)
@@ -1018,13 +1018,15 @@ in the future to make it possible to replace this on a per window-port basis.
 VII.  Conventions
 
 init_nhwindows() is expected to display a gee-whiz banner window, including
-the Copyright message.  It is recommended that the COPYRIGHT_BANNER_A,
-COPYRIGHT_BANNER_B, COPYRIGHT_BANNER_C, and COPYRIGHT_BANNER_D macros from
-patchlevel.h and date.h be used for constructing the Copyright message.
+the Copyright message.  It is recommended that the COPYRIGHT_BANNER_A macro
+from patchlevel.h, COPYRIGHT_BANNER_B from patchlevel.h, 
+nomakedefs.copyright_banner_c internal global variable, and
+COPYRIGHT_BANNER_D macros from patchlevel.h be used for constructing the
+Copyright message.
 COPYRIGHT_BANNER_A is a quoted string that has NetHack copyright declaration,
 COPYRIGHT_BANNER_B is a quoted string that states who the copyright belongs to,
-COPYRIGHT_BANNER_C is a quoted string generated by makedefs that includes
-version and build information, and
+nomakedefs.copyright_banner_c is a quoted string produced at runtime that
+includes version and build information, and
 COPYRIGHT_BANNER_D simply says "See License for details."
 Be sure to #include "patchlevel.h" and date.h to define these macros.  Using
 the macros will prevent having to update the Copyright information in each
index ace3fdeaa76cd10e9390cafffc19439d8013bc9c..9fe9921df6c5c004981af5558b1469c410b8fdb0 100644 (file)
@@ -1,5 +1,5 @@
 * NH_filestag=(file%s_for_all_versions)
-..files NH_filegenerated=win32api.h,tile.h,dgn_comp.h,lev_comp.h,date.h,onames.h,pm.h
+..files NH_filegenerated=win32api.h,tile.h,date.h
 
 win32api.h NH_filesgentag=(file%s_for_win32_that_are_moved_into_include_at_compile_time)
 
@@ -9,8 +9,6 @@ dgn_comp.h NH_filesgentag=(file%s_generated_by_yacc_(or_copied_from_sys/share)_a
 lev_comp.h NH_filesgentag=>dgn_comp.h
 
 date.h NH_filesgentag=(file%s_generated_by_makedefs_at_compile_time)
-onames.h NH_filesgentag=>date.h
-pm.h NH_filesgentag=>date.h
 
 wintty.h NH_filestag=(file%s_for_tty_versions)
 
index c95f417759086dd4b644ba3ebc77bb96b9e6241a..dd6bb2e0a1738689f535905008c49f4533321940 100644 (file)
@@ -6,15 +6,23 @@
 #if defined(MAKEDEFS_C) || defined (MDLIB_C)
 /* in makedefs.c, all we care about is the list of names */
 
-#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost, clr) nam
+#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, \
+          cost, clr, bn) nam
 
 static const char *artifact_names[] = {
+
+#elif defined(ARTI_ENUM)
+#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, \
+          cost, clr, bn) \
+    ART_##bn
 #else
 /* in artifact.c, set up the actual artifact list structure */
 
-#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost, clr) \
-    {                                                                       \
-        typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost, clr    \
+#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, \
+          cost, clr, bn)                                         \
+    {                                                            \
+        typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac,   \
+        cost, clr                                                \
     }
 
 /* clang-format off */
@@ -42,12 +50,12 @@ static NEARDATA struct artifact artilist[] = {
 
     /*  dummy element #0, so that all interesting indices are non-zero */
     A("", STRANGE_OBJECT, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE,
-      NON_PM, NON_PM, 0L, NO_COLOR),
+      NON_PM, NON_PM, 0L, NO_COLOR, PLACEHOLDER),
 
     A("Excalibur", LONG_SWORD, (SPFX_NOGEN | SPFX_RESTR | SPFX_SEEK
                                 | SPFX_DEFN | SPFX_INTEL | SPFX_SEARCH),
       0, 0, PHYS(5, 10), DRLI(0, 0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM,
-      4000L, NO_COLOR),
+      4000L, NO_COLOR, EXCALIBUR),
     /*
      *      Stormbringer only has a 2 because it can drain a level,
      *      providing 8 more.
@@ -55,7 +63,7 @@ static NEARDATA struct artifact artilist[] = {
     A("Stormbringer", RUNESWORD,
       (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN | SPFX_INTEL | SPFX_DRLI), 0, 0,
       DRLI(5, 2), DRLI(0, 0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 8000L,
-      NO_COLOR),
+      NO_COLOR, STORMBRINGER),
     /*
      *      Mjollnir can be thrown when wielded if hero has 25 Strength
      *      (usually via gauntlets of power but possible with rings of
@@ -70,10 +78,10 @@ static NEARDATA struct artifact artilist[] = {
      */
     A("Mjollnir", WAR_HAMMER, /* Mjo:llnir */
       (SPFX_RESTR | SPFX_ATTK), 0, 0, ELEC(5, 24), NO_DFNS, NO_CARY, 0,
-      A_NEUTRAL, PM_VALKYRIE, NON_PM, 4000L, NO_COLOR),
+      A_NEUTRAL, PM_VALKYRIE, NON_PM, 4000L, NO_COLOR, MJOLLNIR),
 
     A("Cleaver", BATTLE_AXE, SPFX_RESTR, 0, 0, PHYS(3, 6), NO_DFNS, NO_CARY,
-      0, A_NEUTRAL, PM_BARBARIAN, NON_PM, 1500L, NO_COLOR),
+      0, A_NEUTRAL, PM_BARBARIAN, NON_PM, 1500L, NO_COLOR, CLEAVER),
 
     /*
      *      Grimtooth glows in warning when elves are present, but its
@@ -82,7 +90,7 @@ static NEARDATA struct artifact artilist[] = {
      */
     A("Grimtooth", ORCISH_DAGGER, (SPFX_RESTR | SPFX_WARN | SPFX_DFLAG2),
       0, M2_ELF, PHYS(2, 6), NO_DFNS,
-      NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, 300L, CLR_RED),
+      NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, 300L, CLR_RED, GRIMTOOTH),
     /*
      *      Orcrist and Sting have same alignment as elves.
      *
@@ -92,54 +100,55 @@ static NEARDATA struct artifact artilist[] = {
      */
     A("Orcrist", ELVEN_BROADSWORD, (SPFX_WARN | SPFX_DFLAG2), 0, M2_ORC,
       PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 2000L,
-      CLR_BRIGHT_BLUE), /* bright blue is actually light blue */
+      CLR_BRIGHT_BLUE, ORCRIST), /* bright blue is actually light blue */
 
     A("Sting", ELVEN_DAGGER, (SPFX_WARN | SPFX_DFLAG2), 0, M2_ORC, PHYS(5, 0),
-      NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 800L, CLR_BRIGHT_BLUE),
+      NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 800L, CLR_BRIGHT_BLUE,
+      STING),
     /*
      *      Magicbane is a bit different!  Its magic fanfare
      *      unbalances victims in addition to doing some damage.
      */
     A("Magicbane", ATHAME, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0,
       STUN(3, 4), DFNS(AD_MAGM), NO_CARY, 0, A_NEUTRAL, PM_WIZARD, NON_PM,
-      3500L, NO_COLOR),
+      3500L, NO_COLOR, MAGICBANE),
 
     A("Frost Brand", LONG_SWORD, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0,
       COLD(5, 0), COLD(0, 0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L,
-      NO_COLOR),
+      NO_COLOR, FROST_BRAND),
 
     A("Fire Brand", LONG_SWORD, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0,
       FIRE(5, 0), FIRE(0, 0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L,
-      NO_COLOR),
+      NO_COLOR, FIRE_BRAND),
 
     A("Dragonbane", BROADSWORD,
       (SPFX_RESTR | SPFX_DCLAS | SPFX_REFLECT), 0, S_DRAGON,
       PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 500L,
-      NO_COLOR),
+      NO_COLOR, DRAGONBANE),
 
     A("Demonbane", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_DEMON,
       PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 2500L,
-      NO_COLOR),
+      NO_COLOR, DEMONBANE),
 
     A("Werebane", SILVER_SABER, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_WERE,
       PHYS(5, 0), DFNS(AD_WERE), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 1500L,
-      NO_COLOR),
+      NO_COLOR, WEREBANE),
 
     A("Grayswandir", SILVER_SABER, (SPFX_RESTR | SPFX_HALRES), 0, 0,
       PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 8000L,
-      NO_COLOR),
+      NO_COLOR, GRAYSWANDIR),
 
     A("Giantslayer", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_GIANT,
       PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 200L,
-      NO_COLOR),
+      NO_COLOR, GIANTSLAYER),
 
     A("Ogresmasher", WAR_HAMMER, (SPFX_RESTR | SPFX_DCLAS), 0, S_OGRE,
       PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L,
-      NO_COLOR),
+      NO_COLOR, OGRESMASHER),
 
     A("Trollsbane", MORNING_STAR, (SPFX_RESTR | SPFX_DCLAS), 0, S_TROLL,
       PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L,
-      NO_COLOR),
+      NO_COLOR, TROLLSBANE),
     /*
      *      Two problems:  1) doesn't let trolls regenerate heads,
      *      2) doesn't give unusual message for 2-headed monsters (but
@@ -147,7 +156,7 @@ static NEARDATA struct artifact artilist[] = {
      */
     A("Vorpal Blade", LONG_SWORD, (SPFX_RESTR | SPFX_BEHEAD), 0, 0,
       PHYS(5, 1), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 4000L,
-      NO_COLOR),
+      NO_COLOR, VORPAL_BLADE),
     /*
      *      Ah, never shall I forget the cry,
      *              or the shriek that shrieked he,
@@ -157,11 +166,11 @@ static NEARDATA struct artifact artilist[] = {
      *                        (From Sir W.S. Gilbert's "The Mikado")
      */
     A("Snickersnee", KATANA, SPFX_RESTR, 0, 0, PHYS(0, 8), NO_DFNS, NO_CARY,
-      0, A_LAWFUL, PM_SAMURAI, NON_PM, 1200L, NO_COLOR),
+      0, A_LAWFUL, PM_SAMURAI, NON_PM, 1200L, NO_COLOR, SNICKERSNEE),
 
     A("Sunsword", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_UNDEAD,
       PHYS(5, 0), DFNS(AD_BLND), NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 1500L,
-      NO_COLOR),
+      NO_COLOR, SUNSWORD),
 
     /*
      *      The artifacts for the quest dungeon, all self-willed.
@@ -170,52 +179,53 @@ static NEARDATA struct artifact artilist[] = {
     A("The Orb of Detection", CRYSTAL_BALL,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), (SPFX_ESP | SPFX_HSPDAM), 0,
       NO_ATTK, NO_DFNS, CARY(AD_MAGM), INVIS, A_LAWFUL, PM_ARCHEOLOGIST,
-      NON_PM, 2500L, NO_COLOR),
+      NON_PM, 2500L, NO_COLOR, ORB_OF_DETECTION),
 
     A("The Heart of Ahriman", LUCKSTONE,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), SPFX_STLTH, 0,
       /* this stone does double damage if used as a projectile weapon */
       PHYS(5, 0), NO_DFNS, NO_CARY, LEVITATION, A_NEUTRAL, PM_BARBARIAN,
-      NON_PM, 2500L, NO_COLOR),
+      NON_PM, 2500L, NO_COLOR, HEART_OF_AHRIMAN),
 
     A("The Sceptre of Might", MACE,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DALIGN), 0, 0, PHYS(5, 0),
       DFNS(AD_MAGM), NO_CARY, CONFLICT, A_LAWFUL, PM_CAVE_DWELLER, NON_PM, 2500L,
-      NO_COLOR),
+      NO_COLOR, SCEPTRE_OF_MIGHT),
 
 #if 0 /* OBSOLETE */
 A("The Palantir of Westernesse",        CRYSTAL_BALL,
         (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL),
                 (SPFX_ESP|SPFX_REGEN|SPFX_HSPDAM), 0,
         NO_ATTK,        NO_DFNS,        NO_CARY,
-        TAMING,         A_CHAOTIC, NON_PM , PM_ELF, 8000L, NO_COLOR ),
+        TAMING,         A_CHAOTIC, NON_PM , PM_ELF, 8000L, NO_COLOR,
+        PALANTIR_OF_WESTERNESSE ),
 #endif
 
     A("The Staff of Aesculapius", QUARTERSTAFF,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_ATTK | SPFX_INTEL | SPFX_DRLI
        | SPFX_REGEN),
       0, 0, DRLI(0, 0), DRLI(0, 0), NO_CARY, HEALING, A_NEUTRAL, PM_HEALER,
-      NON_PM, 5000L, NO_COLOR),
+      NON_PM, 5000L, NO_COLOR, STAFF_OF_AESCULAPIUS),
 
     A("The Magic Mirror of Merlin", MIRROR,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_SPEAK), SPFX_ESP, 0,
       NO_ATTK, NO_DFNS, CARY(AD_MAGM), 0, A_LAWFUL, PM_KNIGHT, NON_PM, 1500L,
-      NO_COLOR),
+      NO_COLOR, MAGIC_MIRROR_OF_MERLIN),
 
     A("The Eyes of the Overworld", LENSES,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_XRAY), 0, 0, NO_ATTK,
       DFNS(AD_MAGM), NO_CARY, ENLIGHTENING, A_NEUTRAL, PM_MONK, NON_PM,
-      2500L, NO_COLOR),
+      2500L, NO_COLOR, EYES_OF_THE_OVERWORLD),
 
     A("The Mitre of Holiness", HELM_OF_BRILLIANCE,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_DFLAG2 | SPFX_INTEL | SPFX_PROTECT), 0,
       M2_UNDEAD, NO_ATTK, NO_DFNS, CARY(AD_FIRE), ENERGY_BOOST, A_LAWFUL,
-      PM_CLERIC, NON_PM, 2000L, NO_COLOR),
+      PM_CLERIC, NON_PM, 2000L, NO_COLOR, MITRE_OF_HOLINESS),
 
     A("The Longbow of Diana", BOW,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_REFLECT), SPFX_ESP, 0,
       PHYS(5, 0), NO_DFNS, NO_CARY, CREATE_AMMO, A_CHAOTIC, PM_RANGER, NON_PM,
-      4000L, NO_COLOR),
+      4000L, NO_COLOR, LONGBOW_OF_DIANA),
 
     /* MKoT has an additional carry property if the Key is not cursed (for
        rogues) or blessed (for non-rogues):  #untrap of doors and chests
@@ -223,40 +233,45 @@ A("The Palantir of Westernesse",        CRYSTAL_BALL,
     A("The Master Key of Thievery", SKELETON_KEY,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_SPEAK),
       (SPFX_WARN | SPFX_TCTRL | SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY,
-      UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM, 3500L, NO_COLOR),
+      UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM, 3500L, NO_COLOR,
+      MASTER_KEY_OF_THIEVERY),
 
     A("The Tsurugi of Muramasa", TSURUGI,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_BEHEAD | SPFX_LUCK
        | SPFX_PROTECT),
       0, 0, PHYS(0, 8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM,
-      4500L, NO_COLOR),
+      4500L, NO_COLOR, TSURUGI_OF_MURAMASA),
 
     A("The Platinum Yendorian Express Card", CREDIT_CARD,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DEFN),
       (SPFX_ESP | SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM),
-      CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM, 7000L, NO_COLOR),
+      CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM, 7000L, NO_COLOR,
+      YENDORIAN_EXPRESS_CARD),
 
     A("The Orb of Fate", CRYSTAL_BALL,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_LUCK),
       (SPFX_WARN | SPFX_HSPDAM | SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY,
-      LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM, 3500L, NO_COLOR),
+      LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM, 3500L, NO_COLOR,
+      ORB_OF_FATE),
 
     A("The Eye of the Aethiopica", AMULET_OF_ESP,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), (SPFX_EREGEN | SPFX_HSPDAM), 0,
       NO_ATTK, DFNS(AD_MAGM), NO_CARY, CREATE_PORTAL, A_NEUTRAL, PM_WIZARD,
-      NON_PM, 4000L, NO_COLOR),
+      NON_PM, 4000L, NO_COLOR, EYE_OF_THE_AETHIOPICA),
 
+#if !defined(ARTI_ENUM)
     /*
      *  terminator; otyp must be zero
      */
     A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 0L,
-      0) /* 0 is CLR_BLACK rather than NO_COLOR but it doesn't matter here */
+      0, TERMINATOR) /* 0 is CLR_BLACK rather than NO_COLOR but it doesn't matter here */
 
 }; /* artilist[] (or artifact_names[]) */
+#endif
 
 #undef A
 
-#if !defined(MAKEDEFS_C) && !defined(MDLIB_C)
+#if !defined(MAKEDEFS_C) && !defined(MDLIB_C) && !defined(ARTI_ENUM)
 #undef NO_ATTK
 #undef NO_DFNS
 #undef DFNS
index 2abb503bc3b4c0921cccc3d1236bf30994efd594..375c677bfa55c7c0db969609a56913a006fe001f 100644 (file)
 #endif
 #endif
 
+/*
+ *      NODUMPENUMS
+ *      If there are memory constraints and you don't want to store information
+ *      about the internal enum values for monsters and objects, this can be
+ *      uncommented to define NODUMPENUMS. Doing so will disable the
+ *          nethack --dumpenums
+ *      command line option.
+ */
+/* #define NODUMPENUMS */
+
 /*
  *      If COMPRESS is defined, it should contain the full path name of your
  *      'compress' program.
index 95666d860e859853073dd736efe727847acdde1d..82543e4ee25e6e93d4c74a8ebafb2569048ba516 100644 (file)
@@ -250,11 +250,6 @@ E NEARDATA struct you u;
 E NEARDATA time_t ubirthday;
 E NEARDATA struct u_realtime urealtime;
 
-#include "onames.h"
-#ifndef PM_H /* (pm.h has already been included via youprop.h) */
-#include "pm.h"
-#endif
-
 struct mvitals {
     uchar born;
     uchar died;
@@ -434,6 +429,9 @@ E const char *ARGV0;
 #endif
 
 enum earlyarg {ARG_DEBUG, ARG_VERSION, ARG_SHOWPATHS
+#ifndef NODUMPENUMS
+    , ARG_DUMPENUMS
+#endif
 #ifdef WIN32
     ,ARG_WINDOWS
 #endif
index 17a116310c5221c758387601796cf8122670896a..88a42725af88c0bcd5ed9865e5b15974a82d47e2 100644 (file)
@@ -247,6 +247,11 @@ extern char yn_function(const char *, const char *, char);
 extern boolean paranoid_query(boolean, const char *);
 extern void makemap_prepost(boolean, boolean);
 
+/* ### date.c ### */
+
+extern void populate_nomakedefs(struct version_info *);
+extern void free_nomakedefs(void);
+
 /* ### dbridge.c ### */
 
 extern boolean is_pool(int, int);
@@ -1193,6 +1198,9 @@ extern int buzzmu(struct monst *, struct attack *);
 
 extern void runtime_info_init(void);
 extern const char *do_runtime_info(int *);
+#ifndef NODUMPENUMS
+extern void dump_enums(void);
+#endif
 
 /* ### mhitm.c ### */
 
index b3436de94a1066de08547bb1f28b43bd5d5db843..79b2c83a4dfa081b95e76fe58c721200b6fb1d35 100644 (file)
@@ -111,40 +111,6 @@ typedef uchar nhsym;
 
 #include "coord.h"
 
-#if defined(CROSSCOMPILE)
-struct cross_target_s {
-    const char *build_date;
-    const char *copyright_banner_c;
-    const char *git_sha;
-    const char *git_branch;
-    const char *version_string;
-    const char *version_id;
-    unsigned long version_number;
-    unsigned long version_features;
-    unsigned long ignored_features;
-    unsigned long version_sanity1;
-    unsigned long version_sanity2;
-    unsigned long version_sanity3;
-    unsigned long build_time;
-};
-extern struct cross_target_s cross_target;
-#if defined(CROSSCOMPILE_TARGET) && !defined(MAKEDEFS_C)
-#define BUILD_DATE cross_target.build_date        /* "Wed Apr 1 00:00:01 2020" */
-#define COPYRIGHT_BANNER_C cross_target.copyright_banner_c
-#define NETHACK_GIT_SHA cross_target.git_sha
-#define NETHACK_GIT_BRANCH cross_target.git_branch
-#define VERSION_ID cross_target.version_id
-#define IGNORED_FEATURES cross_target.ignored_features
-#define VERSION_FEATURES cross_target.version_features
-#define VERSION_NUMBER cross_target.version_number
-#define VERSION_SANITY1 cross_target.version_sanity1
-#define VERSION_SANITY2 cross_target.version_sanity2
-#define VERSION_SANITY3 cross_target.version_sanity3
-#define VERSION_STRING cross_target.version_string
-#define BUILD_TIME cross_target.build_time        /* (1574157640UL) */
-#endif /* CROSSCOMPILE_TARGET && !MAKEDEFS_C */
-#endif /* CROSSCOMPILE */
-
 /*
  * Automatic inclusions for the subsidiary files.
  * Please don't change the order.  It does matter.
@@ -356,6 +322,26 @@ struct savefile_info {
 #define SFI1_ZEROCOMP (1L << 2)
 #endif
 
+/* This is used to store some build-info data that used
+   to be present in makedefs-generated header file date.h */
+
+struct nomakedefs_s {
+    const char *build_date;
+    const char *copyright_banner_c;
+    const char *git_sha;
+    const char *git_branch;
+    const char *version_string;
+    const char *version_id;
+    unsigned long version_number;
+    unsigned long version_features;
+    unsigned long ignored_features;
+    unsigned long version_sanity1;
+    unsigned long version_sanity2;
+    unsigned long version_sanity3;
+    unsigned long build_time;
+};
+extern struct nomakedefs_s nomakedefs;
+
 /*
  * Configurable internal parameters.
  *
index c4e86bbbab359615471fcf4c9b53744b1b9aeb88..aed0711652f32728dbfb0147fda1599ace5e2425 100644 (file)
@@ -185,6 +185,18 @@ typedef struct {
 #include "dungeon.h"
 #include "sym.h"
 #include "mkroom.h"
+
+enum artifacts_nums {
+#define ARTI_ENUM
+#include "artilist.h"
+#undef ARTI_ENUM
+    AFTER_LAST_ARTIFACT
+};
+
+enum misc_arti_nums {
+    NROFARTIFACTS = (AFTER_LAST_ARTIFACT - 1)
+};
+
 #include "objclass.h"
 #include "youprop.h"
 #include "wintype.h"
diff --git a/include/monsters.h b/include/monsters.h
new file mode 100644 (file)
index 0000000..b66c1be
--- /dev/null
@@ -0,0 +1,3326 @@
+/* NetHack 3.7 monsters.h      $NHDT-Date: 1616891049 2021/03/28 00:24:09 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.85 $ */
+/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/*-Copyright (c) Michael Allison, 2006. */
+/* NetHack may be freely redistributed.  See license for details. */
+
+#ifndef WT_ELF
+#define WT_ELF 800
+#endif
+
+#ifndef WT_DRAGON
+#define WT_DRAGON 4500
+#endif
+
+#if defined(MONS_ENUM)
+#define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, \
+            col, bn) PM_##bn
+
+#define MON3(namm, namf, namn, sym, lvl, gen, atk, siz, mr1, mr2, flg1, \
+             flg2, flg3, d, col, bn) PM_##bn
+
+#elif defined(DUMP_ENUMS)
+#define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, \
+            col, bn) { PM_##bn, #bn}
+
+#define MON3(namm, namf, namn, sym, lvl, gen, atk, siz, mr1, mr2, flg1, \
+             flg2, flg3, d, col, bn) { PM_##bn, #bn }
+
+
+#elif !defined(MON)
+#error Non-productive inclusion of monsters.h
+#endif
+
+/*
+ *      Entry Format:   (from permonst.h)
+ *
+ *      name, symbol (S_* defines),
+ *      base monster level, move rate, armor class, magic resistance,
+ *      alignment, creation/geno flags (G_* defines),
+ *      6 * attack structs ( type , damage-type, # dice, # sides ),
+ *      weight (WT_* defines), nutritional value, extension length,
+ *      sounds made (MS_* defines), physical size (MZ_* defines),
+ *      resistances, resistances conferred (both MR_* defines),
+ *      3 * flag bitmaps (M1_*, M2_*, and M3_* defines respectively),
+ *      difficulty, symbol color (C(x) macro).
+ *
+ *      The difficulty was generated in separate array monstr[] with
+ *      values calculated by makedefs, but has been moved into mons[]
+ *      since it rarely changes.  If a new monster is added or an old
+ *      one undergoes significant change, 'makedefs -m' can be used to
+ *      create a dummy monstr.c containing the calculated difficulty
+ *      (of everything in mons[], not just any new or changed ones),
+ *      then the value(s) can be plugged in here and monstr.c deleted.
+ *      [Note that some monsters might warrant manually calculated
+ *      difficulty, on a case by case basis, instead of blindly using
+ *      the default value produced by makedefs.  Or fix the algoritm
+ *      used by makedefs to generate a more appropriate value....]
+ *
+ *      TODO:  difficulty is closely releated to level; its field ought
+ *      to be moved sooner in the permonst struct so that it can become
+ *      part of LVL() instead of remaining an orphan near the end.
+ *
+ *      Rule #1:        monsters of a given class are contiguous in the
+ *                      mons[] array.
+ *
+ *      Rule #2:        monsters of a given class are presented in ascending
+ *                      order of strength.
+ *
+ *      Rule #3:        monster frequency is included in the geno mask;
+ *                      the frequency can be from 0 to 7.  0's will also
+ *                      be skipped during generation.
+ *
+ *      Rule #4:        monster subclasses (e.g. giants) should be kept
+ *                      together, unless it violates Rule 2.  NOGEN monsters
+ *                      won't violate Rule 2.
+ *
+ * Guidelines for color assignment:
+ *
+ *      * Use the same color for all `growth stages' of a monster (ex.
+ *        little dog/big dog, baby naga/full-grown naga.
+ *
+ *      * Use colors given in names wherever possible. If the class has `real'
+ *        members with strong color associations, use those.
+ *
+ *      * Favor `cool' colors for cold-resistant monsters, `warm' ones for
+ *        fire-resistant ones.
+ *
+ *      * Try to reserve purple (magenta) for powerful `ruler' monsters (queen
+ *        bee, kobold lord, &c.).
+ *
+ *      * Subject to all these constraints, try to use color to make as many
+ *        distinctions as the / command (that is, within a monster letter
+ *        distinct names should map to distinct colors).
+ *
+ * The aim in assigning colors is to be consistent enough so a player can
+ * become `intuitive' about them, deducing some or all of these rules
+ * unconsciously. Use your common sense.
+ */
+
+    /*
+     * ants
+     */
+    MON("giant ant", S_ANT, LVL(2, 18, 3, 0, 0), (G_GENO | G_SGROUP | 3),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(10, 10, MS_SILENT, MZ_TINY), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE, 0,
+        4, CLR_BROWN, GIANT_ANT),
+    MON("killer bee", S_ANT, LVL(1, 18, -1, 0, 0), (G_GENO | G_LGROUP | 2),
+        A(ATTK(AT_STNG, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON,
+        M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_POIS, M2_HOSTILE | M2_FEMALE, 0,
+        5, CLR_YELLOW, KILLER_BEE),
+    MON("soldier ant", S_ANT, LVL(3, 18, 3, 0, 0), (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_DRST, 3, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(20, 5, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON,
+        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE,
+        M2_HOSTILE, 0, 6, CLR_BLUE, SOLDIER_ANT),
+    MON("fire ant", S_ANT, LVL(3, 18, 3, 10, 0), (G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_FIRE, 2, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(30, 10, MS_SILENT, MZ_TINY), MR_FIRE, MR_FIRE,
+        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE,
+        M3_INFRAVISIBLE, 6, CLR_RED, FIRE_ANT),
+    MON("giant beetle", S_ANT, LVL(5, 6, 4, 0, 0), (G_GENO | 3),
+        A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(200, 50, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON,
+        M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE, 0,
+        6, CLR_BLACK, GIANT_BEETLE),
+    MON("queen bee", S_ANT, LVL(9, 24, -4, 0, 0), (G_GENO | G_NOGEN),
+        A(ATTK(AT_STNG, AD_DRST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON,
+        M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_OVIPAROUS | M1_POIS,
+        M2_HOSTILE | M2_FEMALE | M2_PRINCE, 0, 12, HI_LORD, QUEEN_BEE),
+    /*
+     * blobs
+     */
+    MON("acid blob", S_BLOB, LVL(1, 3, 8, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_NONE, AD_ACID, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(30, 10, MS_SILENT, MZ_TINY),
+        MR_SLEEP | MR_POISON | MR_ACID | MR_STONE, MR_STONE,
+        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_ACID,
+        M2_WANDER | M2_NEUTER, 0, 2, CLR_GREEN, ACID_BLOB),
+    MON("quivering blob", S_BLOB, LVL(5, 1, 8, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_TUCH, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(200, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, MR_POISON,
+        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS,
+        M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 6, CLR_WHITE, QUIVERING_BLOB),
+    MON("gelatinous cube", S_BLOB, LVL(6, 6, 8, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_TUCH, AD_PLYS, 2, 4), ATTK(AT_NONE, AD_PLYS, 1, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 150, MS_SILENT, MZ_LARGE),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_ACID
+            | MR_STONE,
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP,
+        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_OMNIVORE
+            | M1_ACID,
+        M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 8, CLR_CYAN, GELATINOUS_CUBE),
+    /*
+     * cockatrice
+     */
+    MON("chickatrice", S_COCKATRICE, LVL(4, 4, 8, 30, 0),
+        (G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 2), ATTK(AT_TUCH, AD_STON, 0, 0),
+          ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(10, 10, MS_HISS, MZ_TINY), MR_POISON | MR_STONE,
+        MR_POISON | MR_STONE, M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE,
+        M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN, CHICKATRICE),
+    MON("cockatrice", S_COCKATRICE, LVL(5, 6, 6, 30, 0), (G_GENO | 5),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_TUCH, AD_STON, 0, 0),
+          ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_STONE,
+        MR_POISON | MR_STONE,
+        M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE,
+        M3_INFRAVISIBLE, 8, CLR_YELLOW, COCKATRICE),
+    MON("pyrolisk", S_COCKATRICE, LVL(6, 6, 6, 30, 0), (G_GENO | 1),
+        A(ATTK(AT_GAZE, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_FIRE,
+        MR_POISON | MR_FIRE,
+        M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE,
+        M3_INFRAVISIBLE, 8, CLR_RED, PYROLISK),
+    /*
+     * dogs & other canines
+     */
+    MON("jackal", S_DOG, LVL(0, 12, 7, 0, 0), (G_GENO | G_SGROUP | 3),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        1, CLR_BROWN, JACKAL),
+    MON("fox", S_DOG, LVL(0, 15, 7, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        1, CLR_RED, FOX),
+    MON("coyote", S_DOG, LVL(1, 12, 7, 0, 0), (G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        2, CLR_BROWN, COYOTE),
+    MON("werejackal", S_DOG, LVL(2, 12, 7, 10, -7), (G_NOGEN | G_NOCORPSE),
+        A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(300, 250, MS_BARK, MZ_SMALL), MR_POISON, 0,
+        M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE,
+        M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN,
+        WEREJACKAL),
+    MON("little dog", S_DOG, LVL(2, 18, 6, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(150, 150, MS_BARK, MZ_SMALL), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE,
+        3, HI_DOMESTIC, LITTLE_DOG),
+    MON("dingo", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        5, CLR_YELLOW, DINGO),
+    MON("dog", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE,
+        5, HI_DOMESTIC, DOG),
+    MON("large dog", S_DOG, LVL(6, 15, 4, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(800, 250, MS_BARK, MZ_MEDIUM), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, LARGE_DOG),
+    MON("wolf", S_DOG, LVL(5, 12, 4, 0, 0), (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 250, MS_BARK, MZ_MEDIUM), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        6, CLR_BROWN, WOLF),
+    MON("werewolf", S_DOG, LVL(5, 12, 4, 20, -7), (G_NOGEN | G_NOCORPSE),
+        A(ATTK(AT_BITE, AD_WERE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 250, MS_BARK, MZ_MEDIUM), MR_POISON, 0,
+        M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE,
+        M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN,
+        WEREWOLF),
+    MON("winter wolf cub", S_DOG, LVL(5, 12, 4, 0, -5),
+        (G_NOHELL | G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_BREA, AD_COLD, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(250, 200, MS_BARK, MZ_SMALL), MR_COLD, MR_COLD,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 7, CLR_CYAN,
+        WINTER_WOLF_CUB),
+    MON("warg", S_DOG, LVL(7, 12, 4, 0, -5), (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(850, 350, MS_BARK, MZ_MEDIUM), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        8, CLR_BROWN, WARG),
+    MON("winter wolf", S_DOG, LVL(7, 12, 4, 20, 0), (G_NOHELL | G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_COLD, 2, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(700, 300, MS_BARK, MZ_LARGE), MR_COLD, MR_COLD,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, 0,
+        9, CLR_CYAN, WINTER_WOLF),
+    MON("hell hound pup", S_DOG, LVL(7, 12, 4, 20, -5),
+        (G_HELL | G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(200, 200, MS_BARK, MZ_SMALL), MR_FIRE, MR_FIRE,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        9, CLR_RED, HELL_HOUND_PUP),
+    MON("hell hound", S_DOG, LVL(12, 14, 2, 20, 0), (G_HELL | G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BREA, AD_FIRE, 3, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 300, MS_BARK, MZ_MEDIUM), MR_FIRE, MR_FIRE,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG,
+        M3_INFRAVISIBLE, 14, CLR_RED, HELL_HOUND),
+#ifdef CHARON
+    MON("Cerberus", S_DOG, LVL(12, 10, 2, 20, -7),
+        (G_NOGEN | G_UNIQ | G_HELL),
+        A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 3, 6),
+          ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1000, 350, MS_BARK, MZ_LARGE), MR_FIRE, MR_FIRE,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
+        M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_MALE,
+        M3_INFRAVISIBLE, 14, CLR_RED, CERBERUS),
+#endif
+    /*
+     * eyes
+     */
+    MON("gas spore", S_EYE, LVL(1, 3, 10, 0, 0), (G_NOCORPSE | G_GENO | 1),
+        A(ATTK(AT_BOOM, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0,
+        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS,
+        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GRAY, GAS_SPORE),
+    MON("floating eye", S_EYE, LVL(2, 1, 9, 10, 0), (G_GENO | 5),
+        A(ATTK(AT_NONE, AD_PLYS, 0, 70), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0,
+        M1_FLY | M1_AMPHIBIOUS | M1_NOLIMBS | M1_NOHEAD | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 3, CLR_BLUE, FLOATING_EYE),
+    MON("freezing sphere", S_EYE, LVL(6, 13, 4, 0, 0),
+        (G_NOCORPSE | G_NOHELL | G_GENO | 2),
+        A(ATTK(AT_EXPL, AD_COLD, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, MR_COLD,
+        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
+            | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_WHITE, FREEZING_SPHERE),
+    MON("flaming sphere", S_EYE, LVL(6, 13, 4, 0, 0),
+        (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_FIRE, 4, 6), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_FIRE, MR_FIRE,
+        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
+            | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_RED, FLAMING_SPHERE),
+    MON("shocking sphere", S_EYE, LVL(6, 13, 4, 0, 0),
+        (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_ELEC, 4, 6), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_ELEC, MR_ELEC,
+        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
+            | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 10, HI_ZAP, SHOCKING_SPHERE),
+#if 0 /* not yet implemented */
+    MON("beholder", S_EYE,
+        LVL(6, 3, 4, 0, -10), (G_GENO | 2),
+        A(ATTK(AT_GAZE, AD_SLOW, 0, 0), ATTK(AT_GAZE, AD_SLEE, 2,25),
+          ATTK(AT_GAZE, AD_DISN, 0, 0), ATTK(AT_GAZE, AD_STON, 0, 0),
+          ATTK(AT_GAZE, AD_CNCL, 2, 4), ATTK(AT_BITE, AD_PHYS, 2, 4)),
+        SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, 0,
+        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS,
+        M2_NOPOLY | M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 13, CLR_BROWN,
+        BEHOLDER),
+#endif
+    /*
+     * felines
+     */
+    MON("kitten", S_FELINE, LVL(2, 18, 6, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(150, 150, MS_MEW, MZ_SMALL), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER | M2_DOMESTIC,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_DOMESTIC, KITTEN),
+    MON("housecat", S_FELINE, LVL(4, 16, 5, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(200, 200, MS_MEW, MZ_SMALL), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_DOMESTIC, HOUSECAT),
+    MON("jaguar", S_FELINE, LVL(4, 15, 6, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BROWN, JAGUAR),
+    MON("lynx", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 300, MS_GROWL, MZ_SMALL), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_CYAN, LYNX),
+    MON("panther", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
+          ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BLACK, PANTHER),
+    MON("large cat", S_FELINE, LVL(6, 15, 4, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(250, 250, MS_MEW, MZ_SMALL), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 7, HI_DOMESTIC, LARGE_CAT),
+    MON("tiger", S_FELINE, LVL(6, 12, 6, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4),
+          ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_YELLOW, TIGER),
+    MON("displacer beast", S_FELINE, LVL(12, 12, -10, 0, -3), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_CLAW, AD_PHYS, 4, 4),
+          ATTK(AT_BITE, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(750, 400, MS_GROWL, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 14, CLR_BLUE,
+        DISPLACER_BEAST),
+    /*
+     * gremlins and gargoyles
+     */
+    MON("gremlin", S_GREMLIN, LVL(5, 12, 2, 25, -9), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
+          ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_CURS, 0, 0), NO_ATTK,
+          NO_ATTK),
+        SIZ(100, 20, MS_LAUGH, MZ_SMALL), MR_POISON, MR_POISON,
+        M1_SWIM | M1_HUMANOID | M1_POIS, M2_STALK, M3_INFRAVISIBLE,
+        8, CLR_GREEN, GREMLIN),
+    MON("gargoyle", S_GREMLIN, LVL(6, 10, -4, 0, -9), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6),
+          ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1000, 200, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE,
+        M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS, M2_HOSTILE | M2_STRONG,
+        0, 8, CLR_BROWN, GARGOYLE),
+    MON("winged gargoyle", S_GREMLIN, LVL(9, 15, -2, 0, -12), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6),
+          ATTK(AT_BITE, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1200, 300, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE,
+        M1_FLY | M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS | M1_OVIPAROUS,
+        M2_LORD | M2_HOSTILE | M2_STRONG | M2_MAGIC, 0, 11, HI_LORD,
+        WINGED_GARGOYLE),
+    /*
+     * humanoids
+     */
+    MON("hobbit", S_HUMANOID, LVL(1, 9, 10, 0, 6), (G_GENO | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 200, MS_HUMANOID, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_GREEN, HOBBIT),
+    MON("dwarf", S_HUMANOID, LVL(2, 6, 10, 10, 4), (G_GENO | 3),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_DWARF | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED, DWARF),
+    MON("bugbear", S_HUMANOID, LVL(3, 9, 5, 0, -6), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1250, 250, MS_GROWL, MZ_LARGE), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN, BUGBEAR),
+    MON3("dwarf lord", "dwarf lady", "dwarf leader",
+        S_HUMANOID, LVL(4, 6, 10, 10, 5), (G_GENO | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
+        M2_DWARF | M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BLUE, DWARF_LEADER),
+    MON3("dwarf king", "dwarf queen", "dwarf ruler",
+        S_HUMANOID, LVL(6, 6, 10, 20, 6), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
+        M2_DWARF | M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS
+            | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 8, HI_LORD, DWARF_RULER),
+    MON("mind flayer", S_HUMANOID, LVL(9, 12, 5, 90, -8), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_TENT, AD_DRIN, 2, 1),
+          ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), NO_ATTK,
+          NO_ATTK),
+        SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE,
+        M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_MAGENTA, MIND_FLAYER),
+    MON("master mind flayer", S_HUMANOID, LVL(13, 12, 0, 90, -8),
+        (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TENT, AD_DRIN, 2, 1),
+          ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1),
+          ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1)),
+        SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE,
+        M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_MAGENTA,
+        MASTER_MIND_FLAYER),
+    /*
+     * imps & other minor demons/devils
+     */
+    MON("manes", S_IMP, LVL(1, 3, 7, 0, -7),
+        (G_GENO | G_LGROUP | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
+          ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, 0, M1_POIS,
+        M2_HOSTILE | M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED,
+        MANES),
+    MON("homunculus", S_IMP, LVL(2, 12, 6, 10, -7), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_SLEE, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(60, 100, MS_SILENT, MZ_TINY), MR_SLEEP | MR_POISON,
+        MR_SLEEP | MR_POISON, M1_FLY | M1_POIS, M2_STALK,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_GREEN, HOMUNCULUS),
+    MON("imp", S_IMP, LVL(3, 12, 2, 20, -7), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(20, 10, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER | M2_STALK,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED, IMP),
+    MON("lemure", S_IMP, LVL(3, 3, 7, 0, -7),
+        (G_HELL | G_GENO | G_LGROUP | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(150, 100, MS_SILENT, MZ_MEDIUM), MR_SLEEP | MR_POISON, MR_SLEEP,
+        M1_POIS | M1_REGEN, M2_HOSTILE | M2_WANDER | M2_STALK | M2_NEUTER,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN, LEMURE),
+    MON("quasit", S_IMP, LVL(3, 15, 2, 20, -7), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_DRDX, 1, 2), ATTK(AT_CLAW, AD_DRDX, 1, 2),
+          ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(200, 200, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_REGEN,
+        M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BLUE, QUASIT),
+    MON("tengu", S_IMP, LVL(6, 13, 5, 30, 7), (G_GENO | 3),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(300, 200, MS_SQAWK, MZ_SMALL), MR_POISON, MR_POISON,
+        M1_TPORT | M1_TPORT_CNTRL, M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION,
+        7, CLR_CYAN, TENGU),
+    /*
+     * jellies
+     */
+    MON("blue jelly", S_JELLY, LVL(4, 0, 8, 10, 0), (G_GENO | 2),
+        A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_COLD | MR_POISON,
+        MR_COLD | MR_POISON,
+        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 5, CLR_BLUE, BLUE_JELLY),
+    MON("spotted jelly", S_JELLY, LVL(5, 0, 8, 10, 0), (G_GENO | 1),
+        A(ATTK(AT_NONE, AD_ACID, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0,
+        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_ACID | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 6, CLR_GREEN, SPOTTED_JELLY),
+    MON("ochre jelly", S_JELLY, LVL(6, 3, 8, 20, 0), (G_GENO | 2),
+        A(ATTK(AT_ENGL, AD_ACID, 3, 6), ATTK(AT_NONE, AD_ACID, 3, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0,
+        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_ACID | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 8, CLR_BROWN, OCHRE_JELLY),
+    /*
+     * kobolds
+     */
+    MON("kobold", S_KOBOLD, LVL(0, 6, 10, 0, -2), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(400, 100, MS_ORC, MZ_SMALL), MR_POISON, 0,
+        M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_BROWN, KOBOLD),
+    MON("large kobold", S_KOBOLD, LVL(1, 6, 10, 0, -3), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0,
+        M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_RED, LARGE_KOBOLD),
+    MON3("kobold lord", "kobold lady", "kobold leader",
+        S_KOBOLD, LVL(2, 6, 10, 0, -4), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 200, MS_ORC, MZ_SMALL), MR_POISON, 0,
+        M1_HUMANOID | M1_POIS | M1_OMNIVORE,
+        M2_HOSTILE | M2_LORD | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_LORD, KOBOLD_LEADER),
+    MON("kobold shaman", S_KOBOLD, LVL(2, 6, 6, 10, -4), (G_GENO | 1),
+        A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0,
+        M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_MAGIC,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 4, HI_ZAP, KOBOLD_SHAMAN),
+    /*
+     * leprechauns
+     */
+    MON("leprechaun", S_LEPRECHAUN, LVL(5, 15, 8, 20, 0), (G_GENO | 4),
+        A(ATTK(AT_CLAW, AD_SGLD, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(60, 30, MS_LAUGH, MZ_TINY), 0, 0, M1_HUMANOID | M1_TPORT,
+        M2_HOSTILE | M2_GREEDY, M3_INFRAVISIBLE, 4, CLR_GREEN, LEPRECHAUN),
+    /*
+     * mimics
+     */
+    MON("small mimic", S_MIMIC, LVL(7, 3, 7, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(300, 200, MS_SILENT, MZ_MEDIUM), MR_ACID, 0,
+        M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL | M1_NOEYES
+            | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE | M1_CARNIVORE,
+        M2_HOSTILE, 0, 8, CLR_BROWN, SMALL_MIMIC),
+    MON("large mimic", S_MIMIC, LVL(8, 3, 7, 10, 0), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_STCK, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(600, 400, MS_SILENT, MZ_LARGE), MR_ACID, 0,
+        M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL
+            | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG, 0, 9, CLR_RED, LARGE_MIMIC),
+    MON("giant mimic", S_MIMIC, LVL(9, 3, 7, 20, 0), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_STCK, 3, 6), ATTK(AT_CLAW, AD_STCK, 3, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(800, 500, MS_SILENT, MZ_LARGE), MR_ACID, 0,
+        M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL
+            | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG, 0, 11, HI_LORD, GIANT_MIMIC),
+    /*
+     * nymphs
+     */
+    MON("wood nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT,
+        M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_GREEN,
+        WOOD_NYMPH),
+    MON("water nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_TPORT | M1_SWIM, M2_HOSTILE | M2_FEMALE | M2_COLLECT,
+        M3_INFRAVISIBLE, 5, CLR_BLUE, WATER_NYMPH),
+    MON("mountain nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT,
+        M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_BROWN,
+        MOUNTAIN_NYMPH),
+    /*
+     * orcs
+     */
+    MON("goblin", S_ORC, LVL(0, 6, 10, 0, -3), (G_GENO | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(400, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_ORC | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_GRAY,
+        GOBLIN),
+    MON("hobgoblin", S_ORC, LVL(1, 9, 10, 0, -4), (G_GENO | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_ORC | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION,
+        3, CLR_BROWN, HOBGOBLIN),
+    /* plain "orc" for zombie corpses only; not created at random
+     */
+    MON("orc", S_ORC, LVL(1, 9, 10, 0, -3), (G_GENO | G_NOGEN | G_LGROUP),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(850, 150, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED, ORC),
+    MON("hill orc", S_ORC, LVL(2, 9, 10, 0, -4), (G_GENO | G_LGROUP | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_YELLOW, HILL_ORC),
+    MON("Mordor orc", S_ORC, LVL(3, 5, 10, 0, -5), (G_GENO | G_LGROUP | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1200, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLUE, MORDOR_ORC),
+    MON("Uruk-hai", S_ORC, LVL(3, 7, 10, 0, -4), (G_GENO | G_LGROUP | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1300, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLACK, URUK_HAI),
+    MON("orc shaman", S_ORC, LVL(3, 9, 5, 10, -5), (G_GENO | 1),
+        A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1000, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP, ORC_SHAMAN),
+    MON("orc-captain", S_ORC, LVL(5, 5, 10, 0, -5), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1350, 350, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 7, HI_LORD, ORC_CAPTAIN),
+    /*
+     * piercers
+     */
+    MON("rock piercer", S_PIERCER, LVL(3, 1, 3, 0, 0), (G_GENO | 4),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(200, 200, MS_SILENT, MZ_SMALL), 0, 0,
+        M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE
+            | M1_NOTAKE,
+        M2_HOSTILE, 0, 4, CLR_GRAY, ROCK_PIERCER),
+    MON("iron piercer", S_PIERCER, LVL(5, 1, 0, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(400, 300, MS_SILENT, MZ_MEDIUM), 0, 0,
+        M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE
+            | M1_NOTAKE,
+        M2_HOSTILE, 0, 6, CLR_CYAN, IRON_PIERCER),
+    MON("glass piercer", S_PIERCER, LVL(7, 1, 0, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(400, 300, MS_SILENT, MZ_MEDIUM), MR_ACID, 0,
+        M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE
+            | M1_NOTAKE,
+        M2_HOSTILE, 0, 9, CLR_WHITE, GLASS_PIERCER),
+    /*
+     * quadrupeds
+     */
+    MON("rothe", S_QUADRUPED, LVL(2, 9, 7, 0, 0), (G_GENO | G_SGROUP | 4),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3),
+          ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(400, 100, MS_MOO, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        4, CLR_BROWN, ROTHE),
+    MON("mumak", S_QUADRUPED, LVL(5, 9, 0, 0, -2), (G_GENO | 1),
+        A(ATTK(AT_BUTT, AD_PHYS, 4, 12), ATTK(AT_BITE, AD_PHYS, 2, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2500, 500, MS_TRUMPET, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
+        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 7, CLR_GRAY,
+        MUMAK),
+    MON("leocrotta", S_QUADRUPED, LVL(6, 18, 4, 10, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6),
+          ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1200, 500, MS_IMITATE, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE | M2_STRONG,
+        M3_INFRAVISIBLE, 8, CLR_RED, LEOCROTTA),
+    MON("wumpus", S_QUADRUPED, LVL(8, 3, 2, 10, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(2500, 500, MS_BURBLE, MZ_LARGE), 0, 0,
+        M1_CLING | M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE,
+        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 9, CLR_CYAN, WUMPUS),
+    MON("titanothere", S_QUADRUPED, LVL(12, 12, 6, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(2650, 650, MS_SILENT, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
+        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 13, CLR_GRAY,
+        TITANOTHERE),
+    MON("baluchitherium", S_QUADRUPED, LVL(14, 12, 5, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 5, 4), ATTK(AT_CLAW, AD_PHYS, 5, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(3800, 800, MS_SILENT, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
+        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 15, CLR_GRAY, BALUCHITHERIUM),
+    MON("mastodon", S_QUADRUPED, LVL(20, 12, 5, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BUTT, AD_PHYS, 4, 8), ATTK(AT_BUTT, AD_PHYS, 4, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(3800, 800, MS_TRUMPET, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
+        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_BLACK, MASTODON),
+    /*
+     * rodents
+     */
+    MON("sewer rat", S_RODENT, LVL(0, 12, 7, 0, 0), (G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(20, 12, MS_SQEEK, MZ_TINY), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        1, CLR_BROWN, SEWER_RAT),
+    MON("giant rat", S_RODENT, LVL(1, 10, 7, 0, 0), (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(30, 30, MS_SQEEK, MZ_TINY), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
+        2, CLR_BROWN, GIANT_RAT),
+    MON("rabid rat", S_RODENT, LVL(2, 12, 6, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_DRCO, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(30, 5, MS_SQEEK, MZ_TINY), MR_POISON, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE,
+        M3_INFRAVISIBLE, 4, CLR_BROWN, RABID_RAT),
+    MON("wererat", S_RODENT, LVL(2, 12, 6, 10, -7), (G_NOGEN | G_NOCORPSE),
+        A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(40, 30, MS_SQEEK, MZ_TINY), MR_POISON, 0,
+        M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE,
+        M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN,
+        WERERAT),
+    MON("rock mole", S_RODENT, LVL(3, 3, 0, 20, 0), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(30, 30, MS_SILENT, MZ_SMALL), 0, 0,
+        M1_TUNNEL | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE,
+        M2_HOSTILE | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE,
+        4, CLR_GRAY, ROCK_MOLE),
+    MON("woodchuck", S_RODENT, LVL(3, 3, 0, 20, 0), (G_NOGEN | G_GENO),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(30, 30, MS_SILENT, MZ_SMALL), 0, 0,
+        M1_TUNNEL /*LOGGING*/ | M1_ANIMAL | M1_NOHANDS | M1_SWIM
+            | M1_HERBIVORE,
+        /* In reality, they tunnel instead of cutting lumber.  Oh, well. */
+        M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN, WOODCHUCK),
+    /*
+     * spiders & scorpions (keep webmaker() in sync if new critters are added)
+     */
+    MON("cave spider", S_SPIDER, LVL(1, 12, 3, 0, 0), (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON,
+        M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE,
+        M2_HOSTILE, 0, 3, CLR_GRAY, CAVE_SPIDER),
+    MON("centipede", S_SPIDER, LVL(2, 4, 3, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON,
+        M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE,
+        M2_HOSTILE, 0, 4, CLR_YELLOW, CENTIPEDE),
+    MON("giant spider", S_SPIDER, LVL(5, 15, 4, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(200, 100, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON,
+        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG, 0, 7, CLR_MAGENTA, GIANT_SPIDER),
+    MON("scorpion", S_SPIDER, LVL(5, 15, 3, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2),
+          ATTK(AT_STNG, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(50, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON,
+        M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS
+            | M1_CARNIVORE,
+        M2_HOSTILE, 0, 8, CLR_RED, SCORPION),
+    /*
+     * trappers, lurkers, &c
+     */
+    MON("lurker above", S_TRAPPER, LVL(10, 3, 3, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_ENGL, AD_DGST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0,
+        M1_HIDE | M1_FLY | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STALK | M2_STRONG, 0, 12, CLR_GRAY, LURKER_ABOVE),
+    MON("trapper", S_TRAPPER, LVL(12, 3, 3, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_ENGL, AD_DGST, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0,
+        M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STALK | M2_STRONG, 0, 14, CLR_GREEN, TRAPPER),
+    /*
+     * unicorns and horses
+     */
+    MON("pony", S_UNICORN, LVL(3, 16, 6, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1300, 250, MS_NEIGH, MZ_MEDIUM), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE,
+        M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 4, CLR_BROWN,
+        PONY),
+    MON("white unicorn", S_UNICORN, LVL(4, 24, 2, 70, 7), (G_GENO | 2),
+        A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON,
+        M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS,
+        M3_INFRAVISIBLE, 6, CLR_WHITE, WHITE_UNICORN),
+    MON("gray unicorn", S_UNICORN, LVL(4, 24, 2, 70, 0), (G_GENO | 1),
+        A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON,
+        M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS,
+        M3_INFRAVISIBLE, 6, CLR_GRAY, GRAY_UNICORN),
+    MON("black unicorn", S_UNICORN, LVL(4, 24, 2, 70, -7), (G_GENO | 1),
+        A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON,
+        M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS,
+        M3_INFRAVISIBLE, 6, CLR_BLACK, BLACK_UNICORN),
+    MON("horse", S_UNICORN, LVL(5, 20, 5, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_KICK, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1500, 300, MS_NEIGH, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE,
+        M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 7, CLR_BROWN,
+        HORSE),
+    MON("warhorse", S_UNICORN, LVL(7, 24, 4, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_KICK, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_PHYS, 1, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1800, 350, MS_NEIGH, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE,
+        M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 9, CLR_BROWN,
+        WARHORSE),
+    /*
+     * vortices
+     */
+    MON("fog cloud", S_VORTEX, LVL(3, 1, 0, 0, 0), (G_GENO | G_NOCORPSE | 2),
+        A(ATTK(AT_ENGL, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_AMORPHOUS | M1_UNSOLID,
+        M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY, FOG_CLOUD),
+    MON("dust vortex", S_VORTEX, LVL(4, 20, 2, 30, 0),
+        (G_GENO | G_NOCORPSE | 2), A(ATTK(AT_ENGL, AD_BLND, 2, 8), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS,
+        M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN, DUST_VORTEX),
+    MON("ice vortex", S_VORTEX, LVL(5, 20, 2, 30, 0),
+        (G_NOHELL | G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_ENGL, AD_COLD, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_HUGE),
+        MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS,
+        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 7, CLR_CYAN, ICE_VORTEX),
+    MON("energy vortex", S_VORTEX, LVL(6, 20, 2, 30, 0),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_ENGL, AD_ELEC, 1, 6), ATTK(AT_ENGL, AD_DREN, 2, 6),
+          ATTK(AT_NONE, AD_ELEC, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_HUGE),
+        MR_ELEC | MR_SLEEP | MR_DISINT | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_UNSOLID,
+        M2_HOSTILE | M2_NEUTER, 0, 9, HI_ZAP, ENERGY_VORTEX),
+    MON("steam vortex", S_VORTEX, LVL(7, 22, 2, 30, 0),
+        (G_HELL | G_GENO | G_NOCORPSE | 2),
+        A(ATTK(AT_ENGL, AD_FIRE, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_HUGE),
+        MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_UNSOLID,
+        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_BLUE, STEAM_VORTEX),
+    MON("fire vortex", S_VORTEX, LVL(8, 22, 2, 30, 0),
+        (G_HELL | G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_ENGL, AD_FIRE, 1, 10), ATTK(AT_NONE, AD_FIRE, 0, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_HUGE),
+        MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_UNSOLID,
+        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW,
+        FIRE_VORTEX),
+    /*
+     * worms
+     */
+    MON("baby long worm", S_WORM, LVL(5, 3, 5, 0, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE | M1_NOTAKE,
+        M2_HOSTILE, 0, 6, CLR_BROWN, BABY_LONG_WORM),
+    MON("baby purple worm", S_WORM, LVL(8, 3, 5, 0, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE, M2_HOSTILE, 0,
+        9, CLR_MAGENTA, BABY_PURPLE_WORM),
+    MON("long worm", S_WORM, LVL(9, 3, 5, 10, 0), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_SILENT, MZ_GIGANTIC), 0, 0,
+        M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE
+            | M1_NOTAKE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 10, CLR_BROWN, LONG_WORM),
+    MON("purple worm", S_WORM, LVL(15, 9, 6, 20, 0), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_ENGL, AD_DGST, 1, 10),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2700, 700, MS_SILENT, MZ_GIGANTIC), 0, 0,
+        M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 17, CLR_MAGENTA, PURPLE_WORM),
+    /*
+     * xan, &c
+     */
+    MON("grid bug", S_XAN, LVL(0, 12, 9, 0, 0),
+        (G_GENO | G_SGROUP | G_NOCORPSE | 3),
+        A(ATTK(AT_BITE, AD_ELEC, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(15, 10, MS_BUZZ, MZ_TINY), MR_ELEC | MR_POISON, 0, M1_ANIMAL,
+        M2_HOSTILE, M3_INFRAVISIBLE, 1, CLR_MAGENTA, GRID_BUG),
+    MON("xan", S_XAN, LVL(7, 18, -4, 0, 0), (G_GENO | 3),
+        A(ATTK(AT_STNG, AD_LEGS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(300, 300, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON,
+        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS, M2_HOSTILE,
+        M3_INFRAVISIBLE, 9, CLR_RED, XAN),
+    /*
+     * lights
+     */
+    MON("yellow light", S_LIGHT, LVL(3, 15, 0, 0, 0),
+        (G_NOCORPSE | G_GENO | 4), A(ATTK(AT_EXPL, AD_BLND, 10, 20), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_SMALL),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_SLEEP | MR_POISON
+            | MR_ACID | MR_STONE,
+        0, M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS
+               | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 5, CLR_YELLOW, YELLOW_LIGHT),
+    MON("black light", S_LIGHT, LVL(5, 15, 0, 0, 0),
+        (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_HALU, 10, 12), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_SMALL),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_SLEEP | MR_POISON
+            | MR_ACID | MR_STONE,
+        0,
+        M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS
+            | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_SEE_INVIS | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 7, CLR_BLACK, BLACK_LIGHT),
+    /*
+     * zruty
+     */
+    MON("zruty", S_ZRUTY, LVL(9, 8, 3, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4),
+          ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1200, 600, MS_SILENT, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG,
+        M3_INFRAVISIBLE, 11, CLR_BROWN, ZRUTY),
+    /*
+     * Angels and other lawful minions
+     */
+    MON("couatl", S_ANGEL, LVL(8, 10, 5, 30, 7),
+        (G_NOHELL | G_SGROUP | G_NOCORPSE | 1),
+        A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_BITE, AD_PHYS, 1, 3),
+          ATTK(AT_HUGS, AD_WRAP, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(900, 400, MS_HISS, MZ_LARGE), MR_POISON, 0,
+        M1_FLY | M1_NOHANDS | M1_SLITHY | M1_POIS,
+        M2_MINION | M2_STALK | M2_STRONG | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_GREEN, COUATL),
+    MON("Aleax", S_ANGEL, LVL(10, 8, 0, 30, 7), (G_NOHELL | G_NOCORPSE | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
+          ATTK(AT_KICK, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_IMITATE, MZ_HUMAN),
+        MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0,
+        M1_HUMANOID | M1_SEE_INVIS,
+        M2_MINION | M2_STALK | M2_NASTY | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_YELLOW, ALEAX),
+    /* Angels start with the emin extension attached, and usually have
+       the isminion flag set; however, non-minion Angels can be tamed
+       and will switch to edog (guardian Angel is handled specially and
+       always sticks with emin) */
+    MON("Angel", S_ANGEL, LVL(14, 10, -4, 55, 12),
+        (G_NOHELL | G_NOCORPSE | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN),
+        MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0,
+        M1_FLY | M1_HUMANOID | M1_SEE_INVIS,
+        M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_WHITE, ANGEL),
+    /* the AD&D Monster Manual depicts ki-rin as very similar to unicorns
+       except that they fly (without wings) and can cast spells */
+    MON("ki-rin", S_ANGEL, LVL(16, 18, -5, 90, 15),
+        (G_NOHELL | G_NOCORPSE | 1),
+        A(ATTK(AT_KICK, AD_PHYS, 2, 4), ATTK(AT_KICK, AD_PHYS, 2, 4),
+          ATTK(AT_BUTT, AD_PHYS, 3, 6), ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SPELL, MZ_LARGE), MR_POISON, 0,
+        M1_FLY | M1_NOHANDS | M1_SEE_INVIS,
+        M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 21, HI_GOLD, KI_RIN),
+    MON("Archon", S_ANGEL, LVL(19, 16, -6, 80, 15),
+        (G_NOHELL | G_NOCORPSE | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          ATTK(AT_GAZE, AD_BLND, 2, 6), ATTK(AT_CLAW, AD_PHYS, 1, 8),
+          ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_CUSS, MZ_LARGE),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0,
+        M1_FLY | M1_HUMANOID | M1_SEE_INVIS | M1_REGEN,
+        M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD
+            | M2_COLLECT | M2_MAGIC,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 26, HI_LORD, ARCHON),
+    /*
+     * Bats
+     */
+    MON("bat", S_BAT, LVL(0, 22, 8, 0, 0), (G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(20, 20, MS_SQEEK, MZ_TINY), 0, 0,
+        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER,
+        M3_INFRAVISIBLE, 2, CLR_BROWN, BAT),
+    MON("giant bat", S_BAT, LVL(2, 22, 7, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(30, 30, MS_SQEEK, MZ_SMALL), 0, 0,
+        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
+        M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 3, CLR_RED, GIANT_BAT),
+    MON("raven", S_BAT, LVL(4, 20, 6, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_BLND, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(40, 20, MS_SQAWK, MZ_SMALL), 0, 0,
+        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
+        M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 6, CLR_BLACK, RAVEN),
+    MON("vampire bat", S_BAT, LVL(5, 20, 6, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRST, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(30, 20, MS_SQEEK, MZ_SMALL), MR_SLEEP | MR_POISON, 0,
+        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_REGEN | M1_OMNIVORE,
+        M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BLACK, VAMPIRE_BAT),
+    /*
+     * Centaurs
+     */
+    MON("plains centaur", S_CENTAUR, LVL(4, 18, 4, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2500, 500, MS_HUMANOID, MZ_LARGE), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT,
+        M3_INFRAVISIBLE, 6, CLR_BROWN, PLAINS_CENTAUR),
+    MON("forest centaur", S_CENTAUR, LVL(5, 18, 3, 10, -1), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2550, 600, MS_HUMANOID, MZ_LARGE), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT,
+        M3_INFRAVISIBLE, 8, CLR_GREEN, FOREST_CENTAUR),
+    MON("mountain centaur", S_CENTAUR, LVL(6, 20, 2, 10, -3), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_KICK, AD_PHYS, 1, 6),
+          ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2550, 500, MS_HUMANOID, MZ_LARGE), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT,
+        M3_INFRAVISIBLE, 9, CLR_CYAN, MOUNTAIN_CENTAUR),
+    /*
+     * Dragons
+     */
+    /* The order of the dragons is VERY IMPORTANT.  Quite a few
+     * pieces of code depend on gray being first and yellow being last.
+     * The code also depends on the *order* being the same as that for
+     * dragon scale mail and dragon scales in objects.c.  [Also,
+     * 'tilemap' assumes that shimmering dragon follows silver dragon.]
+     *
+     * Adult dragons are all lawful or chaotic; baby dragons are all
+     * neutral.  This affects monster generation on some special levels.
+     * Baby dragons cannot confer intrinsics, to avoid polyself/egg abuse.
+     *
+     * As reptiles, dragons are cold-blooded and thus aren't seen with
+     * infravision.  Red and gold dragons (also Chromatic Dragon) are
+     * the exceptions because they breathe fire.
+     */
+    MON("baby gray dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GRAY,
+        BABY_GRAY_DRAGON),
+    MON("baby gold dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, M3_INFRAVISIBLE,
+        13, HI_GOLD, BABY_GOLD_DRAGON),
+    MON("baby silver dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, DRAGON_SILVER,
+        BABY_SILVER_DRAGON),
+#if 0 /* DEFERRED */
+    /* [see "shimmering dragon" below] */
+    MON("baby shimmering dragon", S_DRAGON,
+        LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_CYAN,
+        BABY_SHIMMERING_DRAGON),
+#endif
+    MON("baby red dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_FIRE, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, M3_INFRAVISIBLE,
+        13, CLR_RED, BABY_RED_DRAGON),
+    MON("baby white dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_COLD, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_WHITE,
+        BABY_WHITE_DRAGON),
+    MON("baby orange dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_SLEEP, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_ORANGE,
+        BABY_ORANGE_DRAGON),
+    MON("baby black dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_DISINT, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLACK,
+        BABY_BLACK_DRAGON),
+    MON("baby blue dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ELEC, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLUE,
+        BABY_BLUE_DRAGON),
+    MON("baby green dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_POISON, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_POIS,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GREEN,
+        BABY_GREEN_DRAGON),
+    MON("baby yellow dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ACID | MR_STONE, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_ACID,
+        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_YELLOW,
+        BABY_YELLOW_DRAGON),
+    MON("gray dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        0, 20, CLR_GRAY, GRAY_DRAGON),
+    MON("gold dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_FIRE, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          NO_ATTK, NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_FIRE, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        M3_INFRAVISIBLE, 20, HI_GOLD, GOLD_DRAGON),
+    MON("silver dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_COLD, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        0, 20, DRAGON_SILVER, SILVER_DRAGON),
+#if 0 /* DEFERRED */
+    /* shimmering scales/scale-mail would confer displacement when worn by
+       the hero, so shimmering dragon ought to be displaced (hero who can
+       see one might misjudge its location) but monster displacement hasn't
+       been implemented so we don't include it */
+    MON("shimmering dragon", S_DRAGON,
+        LVL(15, 9, -1, 20, 4), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          NO_ATTK, NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+          | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        0, 20, CLR_CYAN, SHIMMERING_DRAGON),
+#endif
+    MON("red dragon", S_DRAGON, LVL(15, 9, -1, 20, -4), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_FIRE, 6, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_FIRE, MR_FIRE,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        M3_INFRAVISIBLE, 20, CLR_RED, RED_DRAGON),
+    MON("white dragon", S_DRAGON, LVL(15, 9, -1, 20, -5), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_COLD, MR_COLD,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        0, 20, CLR_WHITE, WHITE_DRAGON),
+    MON("orange dragon", S_DRAGON, LVL(15, 9, -1, 20, 5), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_SLEE, 4, 25), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_SLEEP, MR_SLEEP,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        0, 20, CLR_ORANGE, ORANGE_DRAGON),
+    /* disintegration breath is actually all or nothing, not 1d255 */
+    MON("black dragon", S_DRAGON, LVL(15, 9, -1, 20, -6), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_DISN, 1, 255), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_DISINT, MR_DISINT,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        0, 20, CLR_BLACK, BLACK_DRAGON),
+    MON("blue dragon", S_DRAGON, LVL(15, 9, -1, 20, -7), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_ELEC, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_ELEC, MR_ELEC,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+            | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        0, 20, CLR_BLUE, BLUE_DRAGON),
+    MON("green dragon", S_DRAGON, LVL(15, 9, -1, 20, 6), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_DRST, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_POISON, MR_POISON,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
+            | M1_CARNIVORE | M1_POIS,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        0, 20, CLR_GREEN, GREEN_DRAGON),
+    MON("yellow dragon", S_DRAGON, LVL(15, 9, -1, 20, 7), (G_GENO | 1),
+        A(ATTK(AT_BREA, AD_ACID, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_ACID | MR_STONE,
+        MR_STONE, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS
+                      | M1_OVIPAROUS | M1_CARNIVORE | M1_ACID,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        0, 20, CLR_YELLOW, YELLOW_DRAGON),
+    /*
+     * Elementals
+     */
+    MON("stalker", S_ELEMENTAL, LVL(8, 12, 3, 0, 0), (G_GENO | 3),
+        A(ATTK(AT_CLAW, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(900, 400, MS_SILENT, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_FLY | M1_SEE_INVIS,
+        M2_WANDER | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION,
+        9, CLR_WHITE, STALKER),
+    MON("air elemental", S_ELEMENTAL, LVL(8, 36, 2, 30, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_ENGL, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0,
+        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS
+            | M1_UNSOLID | M1_FLY,
+        M2_STRONG | M2_NEUTER, 0, 10, CLR_CYAN, AIR_ELEMENTAL),
+    MON("fire elemental", S_ELEMENTAL, LVL(8, 12, 2, 30, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_FIRE, 3, 6), ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_FIRE | MR_POISON | MR_STONE, 0,
+        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS
+            | M1_UNSOLID | M1_FLY | M1_NOTAKE,
+        M2_STRONG | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW,
+        FIRE_ELEMENTAL),
+    MON("earth elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(2500, 0, MS_SILENT, MZ_HUGE),
+        MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0,
+        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS
+            | M1_WALLWALK | M1_THICK_HIDE,
+        M2_STRONG | M2_NEUTER, 0, 10, CLR_BROWN, EARTH_ELEMENTAL),
+    MON("water elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(2500, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0,
+        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS
+            | M1_UNSOLID | M1_AMPHIBIOUS | M1_SWIM,
+        M2_STRONG | M2_NEUTER, 0, 10, CLR_BLUE, WATER_ELEMENTAL),
+    /*
+     * Fungi
+     */
+    MON("lichen", S_FUNGUS, LVL(0, 1, 9, 0, 0), (G_GENO | 4),
+        A(ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(20, 200, MS_SILENT, MZ_SMALL), 0, 0,
+        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
+            | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 1, CLR_BRIGHT_GREEN, LICHEN),
+    MON("brown mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_COLD | MR_POISON,
+        MR_COLD | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS
+                                 | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_BROWN, BROWN_MOLD),
+    MON("yellow mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_NONE, AD_STUN, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON,
+        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
+            | M1_POIS | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_YELLOW, YELLOW_MOLD),
+    MON("green mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_NONE, AD_ACID, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_ACID | MR_STONE, MR_STONE,
+        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
+            | M1_ACID | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GREEN, GREEN_MOLD),
+    MON("red mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_FIRE | MR_POISON,
+        MR_FIRE | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS
+                                 | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 2, CLR_RED, RED_MOLD),
+    MON("shrieker", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 1),
+        A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(100, 100, MS_SHRIEK, MZ_SMALL), MR_POISON, MR_POISON,
+        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
+            | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_MAGENTA, SHRIEKER),
+    MON("violet fungus", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_TUCH, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON,
+        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
+            | M1_NOTAKE,
+        M2_HOSTILE | M2_NEUTER, 0, 5, CLR_MAGENTA, VIOLET_FUNGUS),
+    /*
+     * Gnomes
+     */
+    MON("gnome", S_GNOME, LVL(1, 6, 10, 4, 0), (G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(650, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_GNOME | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION,
+        3, CLR_BROWN, GNOME),
+    MON3("gnome lord", "gnome lady", "gnome leader",
+        S_GNOME, LVL(3, 8, 10, 4, 0), (G_GENO | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_GNOME | M2_LORD | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_BLUE, GNOME_LEADER),
+    MON("gnomish wizard", S_GNOME, LVL(3, 10, 4, 10, 0), (G_GENO | 1),
+        A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_GNOME | M2_MAGIC, M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP,
+        GNOMISH_WIZARD),
+    MON3("gnome king", "gnome queen", "gnome ruler",
+        S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(750, 150, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
+        M2_GNOME | M2_PRINCE | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 6, HI_LORD, GNOME_RULER),
+    /*
+     * giant Humanoids
+     */
+    MON("giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_GENO | G_NOGEN | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
+        M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT
+            | M2_JEWELS,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_RED, GIANT),
+    MON("stone giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
+        M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT
+            | M2_JEWELS,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY, STONE_GIANT),
+    MON("hill giant", S_GIANT, LVL(8, 10, 6, 0, -2), (G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(2200, 700, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
+        M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT
+            | M2_JEWELS,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_CYAN, HILL_GIANT),
+    MON("fire giant", S_GIANT, LVL(9, 12, 4, 5, 2), (G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_FIRE, MR_FIRE,
+        M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW
+                                        | M2_NASTY | M2_COLLECT | M2_JEWELS,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_YELLOW, FIRE_GIANT),
+    MON("frost giant", S_GIANT, LVL(10, 12, 3, 10, -3),
+        (G_NOHELL | G_GENO | G_SGROUP | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_COLD, MR_COLD,
+        M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW
+                                        | M2_NASTY | M2_COLLECT | M2_JEWELS,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_WHITE, FROST_GIANT),
+    MON("ettin", S_GIANT, LVL(10, 12, 3, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1700, 500, MS_GRUNT, MZ_HUGE), 0, 0,
+        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_BROWN, ETTIN),
+    MON("storm giant", S_GIANT, LVL(16, 12, 3, 10, -3),
+        (G_GENO | G_SGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK,
+                                   NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_ELEC, MR_ELEC,
+        M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW
+                                        | M2_NASTY | M2_COLLECT | M2_JEWELS,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_BLUE, STORM_GIANT),
+    MON("titan", S_GIANT, LVL(16, 18, -3, 70, 9), (1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2300, 900, MS_SPELL, MZ_HUGE), 0, 0,
+        M1_FLY | M1_HUMANOID | M1_OMNIVORE,
+        M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_MAGIC,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_MAGENTA, TITAN),
+    MON("minotaur", S_GIANT, LVL(15, 15, 6, 0, 0), (G_GENO | G_NOGEN),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10),
+          ATTK(AT_BUTT, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1500, 700, MS_MOO, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE | M3_INFRAVISION,
+        17, CLR_BROWN, MINOTAUR),
+    /*
+     * Invisible
+     * S_invisible=='I' is a visual marker for all invisible monsters
+     * and must be not be used for any specific monster types.  Long
+     * time 'invisible stalker' was changed to 'stalker', an Elemental.
+     */
+
+    /*
+     * Jabberwock
+     */
+    /* the illustration from _Through_the_Looking_Glass_
+       depicts hands as well as wings */
+    MON("jabberwock", S_JABBERWOCK, LVL(15, 12, -2, 50, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_PHYS, 2, 10),
+          ATTK(AT_CLAW, AD_PHYS, 2, 10), ATTK(AT_CLAW, AD_PHYS, 2, 10),
+          NO_ATTK, NO_ATTK),
+        SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_FLY | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE,
+        18, CLR_ORANGE, JABBERWOCK),
+#if 0 /* DEFERRED */
+    MON("vorpal jabberwock", S_JABBERWOCK,
+        LVL(20, 12, -2, 50, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 3, 10), ATTK(AT_BITE, AD_PHYS, 3, 10),
+          ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10),
+          NO_ATTK, NO_ATTK),
+        SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_FLY | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE,
+        25, HI_LORD, VORPAL_JABBERWOCK),
+#endif
+    /*
+     * Kops
+     */
+    MON("Keystone Kop", S_KOP, LVL(1, 6, 10, 10, 9),
+        (G_GENO | G_LGROUP | G_NOGEN),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID,
+        M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_MALE | M2_COLLECT,
+        M3_INFRAVISIBLE, 3, CLR_BLUE, KEYSTONE_KOP),
+    MON("Kop Sergeant", S_KOP, LVL(2, 8, 10, 10, 10),
+        (G_GENO | G_SGROUP | G_NOGEN),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID,
+        M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT,
+        M3_INFRAVISIBLE, 4, CLR_BLUE, KOP_SERGEANT),
+    MON("Kop Lieutenant", S_KOP, LVL(3, 10, 10, 20, 11), (G_GENO | G_NOGEN),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID,
+        M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT,
+        M3_INFRAVISIBLE, 5, CLR_CYAN, KOP_LIEUTENANT),
+    MON("Kop Kaptain", S_KOP, LVL(4, 12, 10, 20, 12), (G_GENO | G_NOGEN),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID,
+        M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT,
+        M3_INFRAVISIBLE, 6, HI_LORD, KOP_KAPTAIN),
+    /*
+     * Liches
+     */
+    MON("lich", S_LICH, LVL(11, 6, 0, 30, -9), (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_TUCH, AD_COLD, 1, 10), ATTK(AT_MAGC, AD_SPEL, 0, 0),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
+        MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
+        M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 14, CLR_BROWN,
+        LICH),
+    MON("demilich", S_LICH, LVL(14, 9, -2, 60, -12),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_TUCH, AD_COLD, 3, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
+        MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
+        M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 18, CLR_RED,
+        DEMILICH),
+    MON("master lich", S_LICH, LVL(17, 9, -4, 90, -15),
+        (G_HELL | G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_TUCH, AD_COLD, 3, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN),
+        MR_FIRE | MR_COLD | MR_SLEEP | MR_POISON, MR_FIRE | MR_COLD,
+        M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
+        M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION,
+        21, HI_LORD, MASTER_LICH),
+    MON("arch-lich", S_LICH, LVL(25, 9, -6, 90, -15),
+        (G_HELL | G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_TUCH, AD_COLD, 5, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN),
+        MR_FIRE | MR_COLD | MR_SLEEP | MR_ELEC | MR_POISON, MR_FIRE | MR_COLD,
+        M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
+        M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION,
+        29, HI_LORD, ARCH_LICH),
+    /*
+     * Mummies
+     */
+    MON("kobold mummy", S_MUMMY, LVL(3, 8, 6, 20, -2),
+        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 4, CLR_BROWN, KOBOLD_MUMMY),
+    MON("gnome mummy", S_MUMMY, LVL(4, 10, 6, 20, -3),
+        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_HOSTILE | M2_GNOME, M3_INFRAVISION, 5, CLR_RED,
+        GNOME_MUMMY),
+    MON("orc mummy", S_MUMMY, LVL(5, 10, 5, 20, -4),
+        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_HOSTILE | M2_ORC | M2_GREEDY | M2_JEWELS,
+        M3_INFRAVISION, 6, CLR_GRAY, ORC_MUMMY),
+    MON("dwarf mummy", S_MUMMY, LVL(5, 10, 5, 20, -4),
+        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_HOSTILE | M2_DWARF | M2_GREEDY | M2_JEWELS,
+        M3_INFRAVISION, 6, CLR_RED, DWARF_MUMMY),
+    MON("elf mummy", S_MUMMY, LVL(6, 12, 4, 30, -5),
+        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
+        0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_HOSTILE | M2_ELF, M3_INFRAVISION, 7, CLR_GREEN,
+        ELF_MUMMY),
+    MON("human mummy", S_MUMMY, LVL(6, 12, 4, 30, -5),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN),
+        MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 7, CLR_GRAY,
+        HUMAN_MUMMY),
+    MON("ettin mummy", S_MUMMY, LVL(7, 12, 4, 30, -6),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_BLUE,
+        ETTIN_MUMMY),
+    MON("giant mummy", S_MUMMY, LVL(8, 14, 3, 30, -7),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_HOSTILE | M2_GIANT | M2_STRONG | M2_JEWELS,
+        M3_INFRAVISION, 10, CLR_CYAN, GIANT_MUMMY),
+    /*
+     * Nagas
+     */
+    MON("red naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_FIRE | MR_POISON,
+        MR_FIRE | MR_POISON,
+        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE,
+        M2_STRONG, M3_INFRAVISIBLE, 4, CLR_RED, RED_NAGA_HATCHLING),
+    MON("black naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON | MR_ACID | MR_STONE,
+        MR_POISON | MR_STONE, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_ACID
+                                  | M1_NOTAKE | M1_CARNIVORE,
+        M2_STRONG, 0, 4, CLR_BLACK, BLACK_NAGA_HATCHLING),
+    MON("golden naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON,
+        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE,
+        M2_STRONG, 0, 4, HI_GOLD, GOLDEN_NAGA_HATCHLING),
+    MON("guardian naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON,
+        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE,
+        M2_STRONG, 0, 4, CLR_GREEN, GUARDIAN_NAGA_HATCHLING),
+    MON("red naga", S_NAGA, LVL(6, 12, 4, 0, -4), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_FIRE | MR_POISON,
+        MR_FIRE | MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE
+                                 | M1_OVIPAROUS | M1_NOTAKE | M1_OMNIVORE,
+        M2_STRONG, M3_INFRAVISIBLE, 8, CLR_RED, RED_NAGA),
+    MON("black naga", S_NAGA, LVL(8, 14, 2, 10, 4), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_SPIT, AD_ACID, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON | MR_ACID | MR_STONE,
+        MR_POISON | MR_STONE,
+        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_ACID
+            | M1_NOTAKE | M1_CARNIVORE,
+        M2_STRONG, 0, 10, CLR_BLACK, BLACK_NAGA),
+    MON("golden naga", S_NAGA, LVL(10, 14, 2, 70, 5), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON,
+        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_NOTAKE
+            | M1_OMNIVORE,
+        M2_STRONG, 0, 13, HI_GOLD, GOLDEN_NAGA),
+    MON("guardian naga", S_NAGA, LVL(12, 16, 0, 50, 7), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PLYS, 1, 6), ATTK(AT_SPIT, AD_DRST, 1, 6),
+          ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON,
+        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_POIS
+            | M1_NOTAKE | M1_OMNIVORE,
+        M2_STRONG, 0, 16, CLR_GREEN, GUARDIAN_NAGA),
+    /*
+     * Ogres
+     */
+    MON("ogre", S_OGRE, LVL(5, 10, 5, 0, -3), (G_SGROUP | G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1600, 500, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
+        M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BROWN, OGRE),
+    MON3("ogre lord", "ogre lady", "ogre leader",
+        S_OGRE, LVL(7, 12, 3, 30, -5), (G_GENO | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1700, 700, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
+        M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_RED, OGRE_LEADER),
+    MON3("ogre king", "ogre queen", "ogre tyrant",
+        S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 3, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1700, 750, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
+        M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD, OGRE_TYRANT),
+    /*
+     * Puddings
+     *
+     * must be in the same order as the pudding globs in objects.c
+     */
+    MON("gray ooze", S_PUDDING, LVL(3, 1, 8, 0, 0), (G_GENO | G_NOCORPSE | 2),
+        A(ATTK(AT_BITE, AD_RUST, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 250, MS_SILENT, MZ_MEDIUM),
+        MR_FIRE | MR_COLD | MR_POISON | MR_ACID | MR_STONE,
+        MR_FIRE | MR_COLD | MR_POISON,
+        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_OMNIVORE | M1_ACID,
+        M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY, GRAY_OOZE),
+    MON("brown pudding", S_PUDDING, LVL(5, 3, 8, 0, 0),
+        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_BITE, AD_DCAY, 0, 0), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(500, 250, MS_SILENT, MZ_MEDIUM),
+        MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE,
+        MR_COLD | MR_ELEC | MR_POISON,
+        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_OMNIVORE | M1_ACID,
+        M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN, BROWN_PUDDING),
+    MON("green slime", S_PUDDING, LVL(6, 6, 6, 0, 0),
+        (G_HELL | G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(400, 150, MS_SILENT, MZ_LARGE),
+        MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE, 0,
+        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_OMNIVORE | M1_ACID | M1_POIS,
+        M2_HOSTILE | M2_NEUTER, 0, 8, CLR_GREEN, GREEN_SLIME),
+    MON("black pudding", S_PUDDING, LVL(10, 6, 6, 0, 0),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(900, 250, MS_SILENT, MZ_LARGE),
+        MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE,
+        MR_COLD | MR_ELEC | MR_POISON,
+        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
+            | M1_MINDLESS | M1_OMNIVORE | M1_ACID,
+        M2_HOSTILE | M2_NEUTER, 0, 12, CLR_BLACK, BLACK_PUDDING),
+    /*
+     * Quantum mechanics
+     */
+    MON("quantum mechanic", S_QUANTMECH, LVL(7, 12, 3, 10, 0), (G_GENO | 3),
+        A(ATTK(AT_CLAW, AD_TLPT, 1, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 20, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE,
+        M3_INFRAVISIBLE, 9, CLR_CYAN, QUANTUM_MECHANIC),
+    MON("genetic engineer", S_QUANTMECH, LVL(12, 12, 3, 10, 0), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_POLY, 1, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 20, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISIBLE, 14, CLR_GREEN, GENETIC_ENGINEER),
+    /*
+     * Rust monster or disenchanter
+     */
+    MON("rust monster", S_RUSTMONST, LVL(5, 18, 2, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_TUCH, AD_RUST, 0, 0), ATTK(AT_TUCH, AD_RUST, 0, 0),
+          ATTK(AT_NONE, AD_RUST, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1000, 250, MS_SILENT, MZ_MEDIUM), 0, 0,
+        M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE, M2_HOSTILE,
+        M3_INFRAVISIBLE, 8, CLR_BROWN, RUST_MONSTER),
+    MON("disenchanter", S_RUSTMONST, LVL(12, 12, -10, 0, -3),
+        (G_HELL | G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_ENCH, 4, 4), ATTK(AT_NONE, AD_ENCH, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(750, 200, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_CARNIVORE,
+        M2_HOSTILE, M3_INFRAVISIBLE, 14, CLR_BLUE, DISENCHANTER),
+    /*
+     * Snakes
+     */
+    MON("garter snake", S_SNAKE, LVL(1, 8, 8, 0, 0), (G_LGROUP | G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(50, 60, MS_HISS, MZ_TINY), 0, 0,
+        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY
+            | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE,
+        0, 0, 3, CLR_GREEN, GARTER_SNAKE),
+    MON("snake", S_SNAKE, LVL(4, 15, 3, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(100, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON,
+        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS
+            | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE,
+        M2_HOSTILE, 0, 6, CLR_BROWN, SNAKE),
+    MON("water moccasin", S_SNAKE, LVL(4, 15, 3, 0, 0),
+        (G_GENO | G_NOGEN | G_LGROUP),
+        A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(150, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON,
+        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS
+            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
+        M2_HOSTILE, 0, 7, CLR_RED, WATER_MOCCASIN),
+    MON("python", S_SNAKE, LVL(6, 3, 5, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_PHYS, 0, 0),
+          ATTK(AT_HUGS, AD_WRAP, 1, 4), ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(250, 100, MS_HISS, MZ_LARGE), 0, 0,
+        M1_SWIM | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_CARNIVORE
+            | M1_OVIPAROUS | M1_NOTAKE,
+        M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_MAGENTA, PYTHON),
+    MON("pit viper", S_SNAKE, LVL(6, 15, 2, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_DRST, 1, 4), ATTK(AT_BITE, AD_DRST, 1, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(100, 60, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON,
+        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS
+            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
+        M2_HOSTILE, M3_INFRAVISION, 9, CLR_BLUE, PIT_VIPER),
+    MON("cobra", S_SNAKE, LVL(6, 18, 2, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_SPIT, AD_BLND, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(250, 100, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON,
+        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS
+            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
+        M2_HOSTILE, 0, 10, CLR_BLUE, COBRA),
+    /*
+     * Trolls
+     */
+    MON("troll", S_TROLL, LVL(7, 12, 4, 0, -3), (G_GENO | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 4, 2),
+          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(800, 350, MS_GRUNT, MZ_LARGE), 0, 0,
+        M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
+        M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION,
+        9, CLR_BROWN, TROLL),
+    MON("ice troll", S_TROLL, LVL(9, 10, 2, 20, -3), (G_NOHELL | G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_COLD, 2, 6),
+          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1000, 300, MS_GRUNT, MZ_LARGE), MR_COLD, MR_COLD,
+        M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
+        M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION,
+        12, CLR_WHITE, ICE_TROLL),
+    MON("rock troll", S_TROLL, LVL(9, 12, 0, 0, -3), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8),
+          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1200, 300, MS_GRUNT, MZ_LARGE), 0, 0,
+        M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
+        M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_CYAN, ROCK_TROLL),
+    MON("water troll", S_TROLL, LVL(11, 14, 4, 40, -3), (G_NOGEN | G_GENO),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8),
+          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1200, 350, MS_GRUNT, MZ_LARGE), 0, 0,
+        M1_HUMANOID | M1_REGEN | M1_CARNIVORE | M1_SWIM,
+        M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION,
+        13, CLR_BLUE, WATER_TROLL),
+    MON("Olog-hai", S_TROLL, LVL(13, 12, -4, 0, -7), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8),
+          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1500, 400, MS_GRUNT, MZ_LARGE), 0, 0,
+        M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
+        M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 16, HI_LORD, OLOG_HAI),
+    /*
+     * Umber hulk
+     */
+    MON("umber hulk", S_UMBER, LVL(9, 6, 2, 25, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4),
+          ATTK(AT_BITE, AD_PHYS, 2, 5), ATTK(AT_GAZE, AD_CONF, 0, 0), NO_ATTK,
+          NO_ATTK),
+        SIZ(1200, 500, MS_SILENT, MZ_LARGE), 0, 0, M1_TUNNEL | M1_CARNIVORE,
+        M2_STRONG, M3_INFRAVISIBLE, 12, CLR_BROWN, UMBER_HULK),
+    /*
+     * Vampires
+     */
+    MON("vampire", S_VAMPIRE, LVL(10, 12, 1, 25, -8),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRLI, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
+        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY
+            | M2_SHAPESHIFTER,
+        M3_INFRAVISIBLE, 12, CLR_RED, VAMPIRE),
+    MON3("vampire lord", "vampire lady", "vampire leader",
+        S_VAMPIRE, LVL(12, 14, 0, 50, -9),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
+        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD
+            | M2_SHAPESHIFTER,
+        M3_INFRAVISIBLE, 14, CLR_BLUE, VAMPIRE_LEADER),
+#if 0 /* DEFERRED */
+    MON("vampire mage", S_VAMPIRE,
+        LVL(20, 14, -4, 50, -9), (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 1, 8),
+          ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
+        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD
+          | M2_MALE | M2_MAGIC | M2_SHAPESHIFTER,
+        M3_INFRAVISIBLE, 26, HI_ZAP, VAMPIRE_MAGE),
+#endif
+    MON("Vlad the Impaler", S_VAMPIRE, LVL(28, 26, -6, 80, -10),
+        (G_NOGEN | G_NOCORPSE | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_DRLI, 1, 12),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
+        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
+        M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG
+            | M2_NASTY | M2_PRINCE | M2_MALE | M2_SHAPESHIFTER,
+        M3_WAITFORU | M3_WANTSCAND | M3_INFRAVISIBLE, 32, HI_LORD,
+        VLAD_THE_IMPALER),
+    /*
+     * Wraiths
+     */
+    MON("barrow wight", S_WRAITH, LVL(3, 12, 5, 5, -3),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_WEAP, AD_DRLI, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0),
+          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_COLD, 1, 4),
+          NO_ATTK, NO_ATTK),
+        SIZ(1200, 0, MS_SPELL, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_HUMANOID,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_COLLECT, 0, 8, CLR_GRAY,
+        BARROW_WIGHT),
+    MON("wraith", S_WRAITH, LVL(6, 12, 4, 15, -6), (G_GENO | 2),
+        A(ATTK(AT_TUCH, AD_DRLI, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(0, 0, MS_SILENT, MZ_HUMAN),
+        MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_BREATHLESS | M1_FLY | M1_HUMANOID | M1_UNSOLID,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, 8, CLR_BLACK,
+        WRAITH),
+    MON("Nazgul", S_WRAITH, LVL(13, 12, 0, 25, -17),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_WEAP, AD_DRLI, 1, 4), ATTK(AT_BREA, AD_SLEE, 2, 25),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 0, MS_SPELL, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
+        0, M1_BREATHLESS | M1_HUMANOID,
+        M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_STRONG | M2_HOSTILE | M2_MALE
+            | M2_COLLECT,
+        0, 17, HI_LORD, NAZGUL),
+    /*
+     * Xorn
+     */
+    MON("xorn", S_XORN, LVL(8, 9, -2, 20, 0), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
+          ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK,
+          NO_ATTK),
+        SIZ(1200, 700, MS_ROAR, MZ_MEDIUM), MR_FIRE | MR_COLD | MR_STONE,
+        MR_STONE,
+        M1_BREATHLESS | M1_WALLWALK | M1_THICK_HIDE | M1_METALLIVORE,
+        M2_HOSTILE | M2_STRONG, 0, 11, CLR_BROWN, XORN),
+    /*
+     * Apelike beasts
+     */
+    /* tameable via banana; does not grow up into ape...
+       not flagged as domestic, so no guilt penalty for eating non-pet one */
+    MON("monkey", S_YETI, LVL(2, 12, 6, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(100, 50, MS_GROWL, MZ_SMALL), 0, 0,
+        M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, 0, M3_INFRAVISIBLE,
+        4, CLR_GRAY, MONKEY),
+    MON("ape", S_YETI, LVL(4, 12, 6, 0, 0), (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
+          ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1100, 500, MS_GROWL, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, M2_STRONG, M3_INFRAVISIBLE,
+        6, CLR_BROWN, APE),
+    MON("owlbear", S_YETI, LVL(5, 12, 5, 0, 0), (G_GENO | 3),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
+          ATTK(AT_HUGS, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1700, 700, MS_ROAR, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
+        M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE, 7, CLR_BROWN,
+        OWLBEAR),
+    MON("yeti", S_YETI, LVL(5, 15, 6, 0, 0), (G_GENO | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
+          ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1600, 700, MS_GROWL, MZ_LARGE), MR_COLD, MR_COLD,
+        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG,
+        M3_INFRAVISIBLE, 7, CLR_WHITE, YETI),
+    MON("carnivorous ape", S_YETI, LVL(6, 12, 6, 0, 0), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          ATTK(AT_HUGS, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1250, 550, MS_GROWL, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG,
+        M3_INFRAVISIBLE, 8, CLR_BLACK, CARNIVOROUS_APE),
+    MON("sasquatch", S_YETI, LVL(7, 15, 6, 0, 2), (G_GENO | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
+          ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1550, 750, MS_GROWL, MZ_LARGE), 0, 0,
+        M1_ANIMAL | M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_STRONG,
+        M3_INFRAVISIBLE, 9, CLR_GRAY, SASQUATCH),
+    /*
+     * Zombies
+     */
+    MON("kobold zombie", S_ZOMBIE, LVL(0, 6, 10, 0, -2),
+        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 1, CLR_BROWN,
+        KOBOLD_ZOMBIE),
+    MON("gnome zombie", S_ZOMBIE, LVL(1, 6, 10, 0, -2),
+        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 5), NO_ATTK,
+                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GNOME, M3_INFRAVISION,
+        2, CLR_BROWN, GNOME_ZOMBIE),
+    MON("orc zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3),
+        (G_GENO | G_SGROUP | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ORC, M3_INFRAVISION, 3,
+        CLR_GRAY, ORC_ZOMBIE),
+    MON("dwarf zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3),
+        (G_GENO | G_SGROUP | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_DWARF, M3_INFRAVISION,
+        3, CLR_RED, DWARF_ZOMBIE),
+    MON("elf zombie", S_ZOMBIE, LVL(3, 6, 9, 0, -3),
+        (G_GENO | G_SGROUP | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
+        0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ELF, M3_INFRAVISION,
+        4, CLR_GREEN, ELF_ZOMBIE),
+    MON("human zombie", S_ZOMBIE, LVL(4, 6, 8, 0, -3),
+        (G_GENO | G_SGROUP | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN),
+        MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 5, HI_DOMESTIC,
+        HUMAN_ZOMBIE),
+    MON("ettin zombie", S_ZOMBIE, LVL(6, 8, 6, 0, -4),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 10), ATTK(AT_CLAW, AD_PHYS, 1, 10),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION,
+        7, CLR_BLUE, ETTIN_ZOMBIE),
+    MON("ghoul", S_ZOMBIE, LVL(3, 6, 10, 0, -2), (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PLYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS | M1_OMNIVORE,
+        M2_UNDEAD | M2_WANDER | M2_HOSTILE, M3_INFRAVISION, 5, CLR_BLACK,
+        GHOUL),
+    MON("giant zombie", S_ZOMBIE, LVL(8, 8, 6, 0, -4),
+        (G_GENO | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
+        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GIANT | M2_STRONG,
+        M3_INFRAVISION, 9, CLR_CYAN, GIANT_ZOMBIE),
+    MON("skeleton", S_ZOMBIE, LVL(12, 8, 4, 0, 0), (G_NOCORPSE | G_NOGEN),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(300, 5, MS_BONES, MZ_HUMAN),
+        MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
+        M2_UNDEAD | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_COLLECT
+            | M2_NASTY,
+        M3_INFRAVISION, 14, CLR_WHITE, SKELETON),
+    /*
+     * golems
+     */
+    MON("straw golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0,
+        4, CLR_YELLOW, STRAW_GOLEM),
+    MON("paper golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0,
+        4, HI_PAPER, PAPER_GOLEM),
+    MON("rope golem", S_GOLEM, LVL(4, 9, 8, 0, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          ATTK(AT_HUGS, AD_PHYS, 6, 1), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0,
+        6, CLR_BROWN, ROPE_GOLEM),
+    MON("gold golem", S_GOLEM, LVL(5, 9, 6, 0, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 3), ATTK(AT_CLAW, AD_PHYS, 2, 3), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
+        M2_HOSTILE | M2_NEUTER, 0, 6, HI_GOLD, GOLD_GOLEM),
+    MON("leather golem", S_GOLEM, LVL(6, 6, 6, 0, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0,
+        7, HI_LEATHER, LEATHER_GOLEM),
+    MON("wood golem", S_GOLEM, LVL(7, 3, 4, 0, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(900, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
+        M2_HOSTILE | M2_NEUTER, 0, 8, HI_WOOD, WOOD_GOLEM),
+    MON("flesh golem", S_GOLEM, LVL(9, 8, 9, 30, 0), (1),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1400, 600, MS_SILENT, MZ_LARGE),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON,
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_STRONG, 0,
+        10, CLR_RED, FLESH_GOLEM),
+    MON("clay golem", S_GOLEM, LVL(11, 7, 7, 40, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1550, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
+        M2_HOSTILE | M2_STRONG, 0, 12, CLR_BROWN, CLAY_GOLEM),
+    MON("stone golem", S_GOLEM, LVL(14, 6, 5, 50, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1900, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
+        M2_HOSTILE | M2_STRONG, 0, 15, CLR_GRAY, STONE_GOLEM),
+    MON("glass golem", S_GOLEM, LVL(16, 6, 1, 50, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
+        M2_HOSTILE | M2_STRONG, 0, 18, CLR_CYAN, GLASS_GOLEM),
+    MON("iron golem", S_GOLEM, LVL(18, 6, 3, 60, 0), (G_NOCORPSE | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_BREA, AD_DRST, 4, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2000, 0, MS_SILENT, MZ_LARGE),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0,
+        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE | M1_POIS,
+        M2_HOSTILE | M2_STRONG | M2_COLLECT, 0, 22, HI_METAL, IRON_GOLEM),
+    /*
+     * humans, including elves and were-critters;
+     *  the '@' class does not obey rule #2.
+     */
+    MON("human", S_HUMAN, LVL(0, 12, 10, 0, 0), G_NOGEN, /* for corpses */
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
+        2, HI_DOMESTIC, HUMAN),
+    MON("wererat", S_HUMAN, LVL(2, 12, 10, 10, -7), (1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE,
+        M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT,
+        M3_INFRAVISIBLE, 3, CLR_BROWN, HUMAN_WERERAT),
+    MON("werejackal", S_HUMAN, LVL(2, 12, 10, 10, -7), (1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE,
+        M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT,
+        M3_INFRAVISIBLE, 3, CLR_RED, HUMAN_WEREJACKAL),
+    MON("werewolf", S_HUMAN, LVL(5, 12, 10, 20, -7), (1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE,
+        M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT,
+        M3_INFRAVISIBLE, 6, CLR_ORANGE, HUMAN_WEREWOLF),
+    MON("elf", S_HUMAN, LVL(0, 12, 10, 2, -3), G_NOGEN, /* for corpses */
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
+        M2_NOPOLY | M2_ELF | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISION | M3_INFRAVISIBLE, 2, HI_DOMESTIC, ELF),
+    MON("Woodland-elf", S_HUMAN, LVL(4, 12, 10, 10, -5),
+        (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_GREEN, WOODLAND_ELF),
+    MON("Green-elf", S_HUMAN, LVL(5, 12, 10, 10, -6), (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BRIGHT_GREEN, GREEN_ELF),
+    MON("Grey-elf", S_HUMAN, LVL(6, 12, 10, 10, -7), (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY, GREY_ELF),
+    MON3("elf-lord", "elf-queen", "elf-noble",
+        S_HUMAN, LVL(8, 12, 10, 20, -9), (G_GENO | G_SGROUP | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
+        M2_ELF | M2_STRONG | M2_LORD | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BRIGHT_BLUE, ELF_NOBLE),
+    MON3("Elvenking", "Elvenqueen", "elven monarch",
+        S_HUMAN, LVL(9, 12, 10, 25, -10), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
+        M2_ELF | M2_STRONG | M2_PRINCE | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD, ELVEN_MONARCH),
+    MON("doppelganger", S_HUMAN, LVL(9, 12, 5, 20, 0), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 12),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_IMITATE, MZ_HUMAN), MR_SLEEP, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT
+            | M2_SHAPESHIFTER,
+        M3_INFRAVISIBLE, 11, HI_DOMESTIC, DOPPELGANGER),
+    MON("shopkeeper", S_HUMAN, LVL(12, 18, 0, 50, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SELL, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
+            | M2_STRONG | M2_COLLECT | M2_MAGIC,
+        M3_INFRAVISIBLE, 15, HI_DOMESTIC, SHOPKEEPER),
+    MON("guard", S_HUMAN, LVL(12, 12, 10, 40, 10), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARD, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_MERC | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 14, CLR_BLUE, GUARD),
+    /* prisoner is used on some special levels */
+    MON("prisoner", S_HUMAN, LVL(12, 12, 10, 0, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_CLOSE, 14, HI_DOMESTIC, PRISONER),
+    MON("Oracle", S_HUMAN, LVL(12, 0, 0, 50, 0), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_NONE, AD_MAGM, 0, 4),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_ORACLE, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_FEMALE, M3_INFRAVISIBLE,
+        13, HI_ZAP, ORACLE),
+    /* aligned priests always have the epri extension attached;
+       individual instantiations should always have either ispriest
+       or isminion set */
+    MON3("priest", "priestess", "aligned cleric",
+        S_HUMAN, LVL(12, 12, 10, 50, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 1, 4),
+          ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN), MR_ELEC, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_LORD | M2_PEACEFUL | M2_COLLECT,
+        M3_INFRAVISIBLE, 15, CLR_WHITE, ALIGNED_CLERIC),
+    /* high priests always have epri and always have ispriest set */
+    MON3("high priest", "high priestess", "high cleric",
+        S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8),
+          ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN),
+        MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0,
+        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_MINION | M2_PRINCE | M2_NASTY | M2_COLLECT
+            | M2_MAGIC,
+        M3_INFRAVISIBLE, 30, CLR_WHITE, HIGH_CLERIC),
+    MON("soldier", S_HUMAN, LVL(6, 10, 10, 0, -2), (G_SGROUP | G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
+                                       | M2_HOSTILE | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 8, CLR_GRAY, SOLDIER),
+    MON("sergeant", S_HUMAN, LVL(8, 10, 10, 5, -3), (G_SGROUP | G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
+                                       | M2_HOSTILE | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 10, CLR_RED, SERGEANT),
+    MON("nurse", S_HUMAN, LVL(11, 6, 0, 0, 0), (G_GENO | 3),
+        A(ATTK(AT_CLAW, AD_HEAL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_NURSE, MZ_HUMAN), MR_POISON, MR_POISON,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_HOSTILE,
+        M3_INFRAVISIBLE, 13, HI_DOMESTIC, NURSE),
+    MON("lieutenant", S_HUMAN, LVL(10, 10, 10, 15, -4), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
+                                       | M2_HOSTILE | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 12, CLR_GREEN, LIEUTENANT),
+    MON("captain", S_HUMAN, LVL(12, 10, 10, 15, -5), (G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
+                                       | M2_HOSTILE | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 14, CLR_BLUE, CAPTAIN),
+    MON("watchman", S_HUMAN, LVL(6, 10, 10, 0, -2),
+        (G_SGROUP | G_NOGEN | G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
+                                       | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 8, CLR_GRAY, WATCHMAN),
+    MON("watch captain", S_HUMAN, LVL(10, 10, 10, 15, -4),
+        (G_NOGEN | G_GENO | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
+                                       | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 12, CLR_GREEN, WATCH_CAPTAIN),
+    /* Unique humans not tied to quests.
+     */
+    MON("Medusa", S_HUMAN, LVL(20, 12, 2, 50, -15), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 1, 8),
+          ATTK(AT_GAZE, AD_STON, 0, 0), ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HISS, MZ_LARGE), MR_POISON | MR_STONE,
+        MR_POISON | MR_STONE, M1_FLY | M1_SWIM | M1_AMPHIBIOUS | M1_HUMANOID
+                                  | M1_POIS | M1_OMNIVORE,
+        M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_FEMALE,
+        M3_WAITFORU | M3_INFRAVISIBLE, 25, CLR_BRIGHT_GREEN, MEDUSA),
+    MON("Wizard of Yendor", S_HUMAN, LVL(30, 12, -8, 100, A_NONE),
+        (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_CLAW, AD_SAMU, 2, 12), ATTK(AT_MAGC, AD_SPEL, 0, 0),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN), MR_FIRE | MR_POISON,
+        MR_FIRE | MR_POISON,
+        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS
+            | M1_TPORT | M1_TPORT_CNTRL | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_PRINCE
+            | M2_MALE | M2_MAGIC,
+        M3_COVETOUS | M3_WAITFORU | M3_INFRAVISIBLE, 34, HI_LORD,
+        WIZARD_OF_YENDOR),
+    MON("Croesus", S_HUMAN, LVL(20, 15, 0, 40, 15), (G_UNIQ | G_NOGEN),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARD, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY
+            | M2_PNAME | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS
+            | M2_COLLECT | M2_MAGIC,
+        M3_INFRAVISIBLE, 22, HI_LORD, CROESUS),
+#ifdef CHARON
+    MON("Charon", S_HUMAN, LVL(76, 18, -5, 120, 0),
+        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TUCH, AD_PLYS, 1, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_FERRY, MZ_HUMAN),
+        MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0,
+        M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_PNAME | M2_MALE | M2_GREEDY
+            | M2_COLLECT,
+        M3_INFRAVISIBLE, 38, CLR_WHITE, CHARON),
+#endif
+    /*
+     * ghosts
+     */
+    MON("ghost", S_GHOST, LVL(10, 3, -5, 50, -5), (G_NOCORPSE | G_NOGEN),
+        A(ATTK(AT_TUCH, AD_PHYS, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 0, MS_SILENT, MZ_HUMAN),
+        MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID,
+        M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION,
+        12, CLR_GRAY, GHOST),
+    MON("shade", S_GHOST, LVL(12, 10, 10, 0, 0), (G_NOCORPSE | G_NOGEN),
+        A(ATTK(AT_TUCH, AD_PLYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 0, MS_WAIL, MZ_HUMAN),
+        MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID
+            | M1_SEE_INVIS,
+        M2_NOPOLY | M2_UNDEAD | M2_WANDER | M2_STALK | M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISION, 14, CLR_BLACK, SHADE),
+    /*
+     * (major) demons
+     */
+    MON("water demon", S_DEMON, LVL(8, 12, -4, 30, -7),
+        (G_NOCORPSE | G_NOGEN),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
+          ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
+        M1_HUMANOID | M1_POIS | M1_SWIM,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BLUE, WATER_DEMON),
+    /* standard demons & devils
+     */
+#define SEDUCTION_ATTACKS_YES                                     \
+    A(ATTK(AT_BITE, AD_SSEX, 0, 0), ATTK(AT_CLAW, AD_PHYS, 1, 3), \
+      ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK)
+#define SEDUCTION_ATTACKS_NO                                      \
+    A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), \
+      ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK)
+    /* incubus and succubus */
+    MON3("incubus", "succubus", "amorous demon",
+        S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1),
+        SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN),
+        MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
+        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY, AMOROUS_DEMON),
+    MON("horned devil", S_DEMON, LVL(6, 9, -5, 50, 11),
+        (G_HELL | G_NOCORPSE | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          ATTK(AT_BITE, AD_PHYS, 2, 3), ATTK(AT_STNG, AD_PHYS, 1, 3), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
+        M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_BROWN, HORNED_DEVIL),
+    /* Used by AD&D for a type of demon, originally one of the Furies
+       and spelled this way */
+    MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10),
+        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
+        A(ATTK(AT_WEAP, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
+        M1_HUMANOID | M1_POIS,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY
+            | M2_FEMALE | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED, ERINYS),
+    MON("barbed devil", S_DEMON, LVL(8, 12, 0, 35, 8),
+        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4),
+          ATTK(AT_STNG, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
+        M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED, BARBED_DEVIL),
+    MON("marilith", S_DEMON, LVL(7, 12, -6, 80, -12),
+        (G_HELL | G_NOCORPSE | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
+          ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4),
+          ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4)),
+        SIZ(WT_HUMAN, 400, MS_CUSS, MZ_LARGE), MR_FIRE | MR_POISON, 0,
+        M1_HUMANOID | M1_SLITHY | M1_SEE_INVIS | M1_POIS,
+        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED, MARILITH),
+    MON("vrock", S_DEMON, LVL(8, 12, 0, 50, -9),
+        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_CLAW, AD_PHYS, 1, 8),
+          ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0,
+        M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED, VROCK),
+    MON("hezrou", S_DEMON, LVL(9, 6, -2, 55, -10),
+        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
+          ATTK(AT_BITE, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0,
+        M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_RED, HEZROU),
+    MON("bone devil", S_DEMON, LVL(9, 15, -1, 40, -9),
+        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0,
+        M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_GRAY, BONE_DEVIL),
+    MON("ice devil", S_DEMON, LVL(11, 6, -4, 55, -12),
+        (G_HELL | G_NOCORPSE | 2),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_COLD, 3, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE),
+        MR_FIRE | MR_COLD | MR_POISON, 0, M1_SEE_INVIS | M1_POIS,
+        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 14, CLR_WHITE, ICE_DEVIL),
+    MON("nalfeshnee", S_DEMON, LVL(11, 9, -1, 65, -11),
+        (G_HELL | G_NOCORPSE | 1),
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
+          ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SPELL, MZ_LARGE), MR_FIRE | MR_POISON, 0,
+        M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_RED, NALFESHNEE),
+    MON("pit fiend", S_DEMON, LVL(13, 6, -3, 65, -13),
+        (G_HELL | G_NOCORPSE | 2),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_WEAP, AD_PHYS, 4, 2),
+          ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GROWL, MZ_LARGE), MR_FIRE | MR_POISON, 0,
+        M1_SEE_INVIS | M1_POIS,
+        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 16, CLR_RED, PIT_FIEND),
+    MON("sandestin", S_DEMON, LVL(13, 12, 4, 60, -5),
+        (G_HELL | G_NOCORPSE | 1),
+        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, MS_CUSS, MZ_HUMAN), MR_STONE, 0, M1_HUMANOID,
+        M2_NOPOLY | M2_STALK | M2_STRONG | M2_COLLECT | M2_SHAPESHIFTER,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_GRAY, SANDESTIN),
+    MON("balrog", S_DEMON, LVL(16, 5, -2, 75, -14), (G_HELL | G_NOCORPSE | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0,
+        M1_FLY | M1_SEE_INVIS | M1_POIS,
+        M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT,
+        M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_RED, BALROG),
+    /* Named demon lords & princes plus Arch-Devils.
+     * (their order matters; see minion.c)
+     */
+    MON("Juiblex", S_DEMON, LVL(50, 3, -7, 65, -15),
+        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_ENGL, AD_DISE, 4, 10), ATTK(AT_SPIT, AD_ACID, 3, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1500, 0, MS_GURGLE, MZ_LARGE),
+        MR_FIRE | MR_POISON | MR_ACID | MR_STONE, 0,
+        M1_AMPHIBIOUS | M1_AMORPHOUS | M1_NOHEAD | M1_FLY | M1_SEE_INVIS
+            | M1_ACID | M1_POIS,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
+            | M2_LORD | M2_MALE,
+        M3_WAITFORU | M3_WANTSAMUL | M3_INFRAVISION, 26, CLR_BRIGHT_GREEN,
+        JUIBLEX),
+    MON("Yeenoghu", S_DEMON, LVL(56, 18, -5, 80, -15),
+        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_CONF, 2, 8),
+          ATTK(AT_CLAW, AD_PLYS, 1, 6), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK,
+          NO_ATTK),
+        SIZ(900, 500, MS_ORC, MZ_LARGE), MR_FIRE | MR_POISON, 0,
+        M1_FLY | M1_SEE_INVIS | M1_POIS,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
+            | M2_LORD | M2_MALE | M2_COLLECT,
+        M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 31, HI_LORD,
+        YEENOGHU),
+    MON("Orcus", S_DEMON, LVL(66, 9, -6, 85, -20),
+        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 4),
+          ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_MAGC, AD_SPEL, 8, 6),
+          ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK),
+        SIZ(1500, 500, MS_ORC, MZ_HUGE), MR_FIRE | MR_POISON, 0,
+        M1_FLY | M1_SEE_INVIS | M1_POIS,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
+            | M2_PRINCE | M2_MALE | M2_COLLECT,
+        M3_WAITFORU | M3_WANTSBOOK | M3_WANTSAMUL | M3_INFRAVISIBLE
+            | M3_INFRAVISION,
+        36, HI_LORD, ORCUS),
+    MON("Geryon", S_DEMON, LVL(72, 3, -3, 75, 15),
+        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6),
+          ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1500, 500, MS_BRIBE, MZ_HUGE), MR_FIRE | MR_POISON, 0,
+        M1_FLY | M1_SEE_INVIS | M1_POIS | M1_SLITHY,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
+            | M2_PRINCE | M2_MALE,
+        M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 36, HI_LORD,
+        GERYON),
+    MON("Dispater", S_DEMON, LVL(78, 15, -2, 80, 15),
+        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_MAGC, AD_SPEL, 6, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1500, 500, MS_BRIBE, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
+        M1_FLY | M1_SEE_INVIS | M1_POIS | M1_HUMANOID,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
+            | M2_PRINCE | M2_MALE | M2_COLLECT,
+        M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 40, HI_LORD,
+        DISPATER),
+    MON("Baalzebub", S_DEMON, LVL(89, 9, -5, 85, 20),
+        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_BITE, AD_DRST, 2, 6), ATTK(AT_GAZE, AD_STUN, 2, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1500, 500, MS_BRIBE, MZ_LARGE), MR_FIRE | MR_POISON, 0,
+        M1_FLY | M1_SEE_INVIS | M1_POIS,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
+            | M2_PRINCE | M2_MALE,
+        M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION,
+        45, HI_LORD, BAALZEBUB),
+    MON("Asmodeus", S_DEMON, LVL(105, 12, -7, 90, 20),
+        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_MAGC, AD_COLD, 6, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1500, 500, MS_BRIBE, MZ_HUGE), MR_FIRE | MR_COLD | MR_POISON, 0,
+        M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_POIS,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG
+            | M2_NASTY | M2_PRINCE | M2_MALE,
+        M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION,
+        53, HI_LORD, ASMODEUS),
+    MON("Demogorgon", S_DEMON, LVL(106, 15, -8, 95, -20),
+        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_MAGC, AD_SPEL, 8, 6), ATTK(AT_STNG, AD_DRLI, 1, 4),
+          ATTK(AT_CLAW, AD_DISE, 1, 6), ATTK(AT_CLAW, AD_DISE, 1, 6), NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 500, MS_GROWL, MZ_HUGE), MR_FIRE | MR_POISON, 0,
+        M1_FLY | M1_SEE_INVIS | M1_NOHANDS | M1_POIS,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
+            | M2_PRINCE | M2_MALE,
+        M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 57, HI_LORD,
+        DEMOGORGON),
+    /* Riders -- the Four Horsemen of the Apocalypse ("War" == player);
+     * depicted with '&' but do not have M2_DEMON set.
+     */
+    MON("Death", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN),
+        A(ATTK(AT_TUCH, AD_DETH, 8, 8), ATTK(AT_TUCH, AD_DETH, 8, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL,
+        M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD,
+        DEATH),
+    MON("Pestilence", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN),
+        A(ATTK(AT_TUCH, AD_PEST, 8, 8), ATTK(AT_TUCH, AD_PEST, 8, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL,
+        M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD,
+        PESTILENCE),
+    MON("Famine", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN),
+        A(ATTK(AT_TUCH, AD_FAMN, 8, 8), ATTK(AT_TUCH, AD_FAMN, 8, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL,
+        M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
+        M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD,
+        FAMINE),
+    /* other demons
+     */
+#ifdef MAIL_STRUCTURES
+    MON("mail daemon", S_DEMON, LVL(56, 24, 10, 127, 0),
+        (G_NOGEN | G_NOCORPSE),
+        A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(600, 300, MS_SILENT, MZ_HUMAN),
+        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
+        M1_FLY | M1_SWIM | M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID
+            | M1_POIS,
+        M2_NOPOLY | M2_STALK | M2_PEACEFUL, M3_INFRAVISIBLE | M3_INFRAVISION,
+        26, CLR_BRIGHT_BLUE, MAIL_DAEMON),
+#endif
+    MON("djinni", S_DEMON, LVL(7, 12, 4, 30, 0), (G_NOGEN | G_NOCORPSE),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 400, MS_DJINNI, MZ_HUMAN), MR_POISON | MR_STONE, 0,
+        M1_HUMANOID | M1_FLY | M1_POIS, M2_NOPOLY | M2_STALK | M2_COLLECT,
+        M3_INFRAVISIBLE, 8, CLR_YELLOW, DJINNI),
+    /*
+     * sea monsters
+     */
+    MON("jellyfish", S_EEL, LVL(3, 3, 6, 0, 0), (G_GENO | G_NOGEN),
+        A(ATTK(AT_STNG, AD_DRST, 3, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(80, 20, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON,
+        M1_SWIM | M1_AMPHIBIOUS | M1_SLITHY | M1_NOLIMBS | M1_NOHEAD
+            | M1_NOTAKE | M1_POIS,
+        M2_HOSTILE, 0, 5, CLR_BLUE, JELLYFISH),
+    MON("piranha", S_EEL, LVL(5, 18, 4, 0, 0), (G_GENO | G_NOGEN | G_SGROUP),
+        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(60, 30, MS_SILENT, MZ_SMALL), 0, 0,
+        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS
+            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
+        M2_HOSTILE, 0, 6, CLR_RED, PIRANHA),
+    MON("shark", S_EEL, LVL(7, 12, 2, 0, 0), (G_GENO | G_NOGEN),
+        A(ATTK(AT_BITE, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(500, 350, MS_SILENT, MZ_LARGE), 0, 0,
+        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS
+            | M1_CARNIVORE | M1_OVIPAROUS | M1_THICK_HIDE | M1_NOTAKE,
+        M2_HOSTILE, 0, 9, CLR_GRAY, SHARK),
+    MON("giant eel", S_EEL, LVL(5, 9, -1, 0, 0), (G_GENO | G_NOGEN),
+        A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(200, 250, MS_SILENT, MZ_HUGE), 0, 0,
+        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS
+            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
+        M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_CYAN, GIANT_EEL),
+    MON("electric eel", S_EEL, LVL(7, 10, -3, 0, 0), (G_GENO | G_NOGEN),
+        A(ATTK(AT_BITE, AD_ELEC, 4, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(200, 250, MS_SILENT, MZ_HUGE), MR_ELEC, MR_ELEC,
+        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS
+            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
+        M2_HOSTILE, M3_INFRAVISIBLE, 10, CLR_BRIGHT_BLUE, ELECTRIC_EEL),
+    MON("kraken", S_EEL, LVL(20, 3, 6, 0, -3), (G_GENO | G_NOGEN),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4),
+          ATTK(AT_HUGS, AD_WRAP, 2, 6), ATTK(AT_BITE, AD_PHYS, 5, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(1800, 1000, MS_SILENT, MZ_HUGE), 0, 0,
+        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
+        M2_NOPOLY | M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_RED,
+        KRAKEN),
+    /*
+     * lizards, &c
+     */
+    MON("newt", S_LIZARD, LVL(0, 6, 8, 0, 0), (G_GENO | 5),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(10, 20, MS_SILENT, MZ_TINY), 0, 0,
+        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE, 0, 1, CLR_YELLOW, NEWT),
+    MON("gecko", S_LIZARD, LVL(1, 6, 8, 0, 0), (G_GENO | 5),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(10, 20, MS_SQEEK, MZ_TINY), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 2, CLR_GREEN,
+        GECKO),
+    MON("iguana", S_LIZARD, LVL(2, 6, 7, 0, 0), (G_GENO | 5),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(30, 30, MS_SILENT, MZ_TINY), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 3, CLR_BROWN,
+        IGUANA),
+    MON("baby crocodile", S_LIZARD, LVL(3, 6, 7, 0, 0), G_GENO,
+        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(200, 200, MS_SILENT, MZ_MEDIUM), 0, 0,
+        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
+        M2_HOSTILE, 0, 4, CLR_BROWN, BABY_CROCODILE),
+    MON("lizard", S_LIZARD, LVL(5, 6, 6, 10, 0), (G_GENO | 5),
+        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(10, 40, MS_SILENT, MZ_TINY), MR_STONE, MR_STONE,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 6, CLR_GREEN,
+        LIZARD),
+    MON("chameleon", S_LIZARD, LVL(6, 5, 6, 10, 0), (G_GENO | 2),
+        A(ATTK(AT_BITE, AD_PHYS, 4, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(100, 100, MS_SILENT, MZ_TINY), 0, 0,
+        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
+        M2_NOPOLY | M2_HOSTILE | M2_SHAPESHIFTER, 0, 7, CLR_BROWN,
+        CHAMELEON),
+    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),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), 0, 0,
+        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS
+            | M1_OVIPAROUS | M1_CARNIVORE,
+        M2_STRONG | M2_HOSTILE, 0, 7, CLR_BROWN, CROCODILE),
+    MON("salamander", S_LIZARD, LVL(8, 12, -1, 0, -9), (G_HELL | 1),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_TUCH, AD_FIRE, 1, 6),
+          ATTK(AT_HUGS, AD_PHYS, 2, 6), ATTK(AT_HUGS, AD_FIRE, 3, 6), NO_ATTK,
+          NO_ATTK),
+        SIZ(1500, 400, MS_MUMBLE, MZ_HUMAN), MR_SLEEP | MR_FIRE, MR_FIRE,
+        M1_HUMANOID | M1_SLITHY | M1_THICK_HIDE | M1_POIS,
+        M2_STALK | M2_HOSTILE | M2_COLLECT | M2_MAGIC, M3_INFRAVISIBLE,
+        12, CLR_ORANGE, SALAMANDER),
+
+    /*
+     * dummy monster needed for visual interface
+     * (marking it unique prevents figurines)
+     */
+    MON("long worm tail", S_WORM_TAIL, LVL(0, 0, 0, 0, 0),
+        (G_NOGEN | G_NOCORPSE | G_UNIQ),
+        A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(0, 0, 0, 0), 0, 0, 0L, M2_NOPOLY, 0, 1, CLR_BROWN,
+        LONG_WORM_TAIL),
+    /* Note:
+     * Worm tail must be between the normal monsters and the special
+     * quest & pseudo-character ones because an optimization in the
+     * random monster selection code assumes everything beyond here
+     * has the G_NOGEN and M2_NOPOLY attributes.
+     */
+
+    /*
+     * character classes
+     */
+    MON("archeologist", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_TUNNEL | M1_NEEDPICK | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
+        12, HI_DOMESTIC, ARCHEOLOGIST),
+    MON("barbarian", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
+        12, HI_DOMESTIC, BARBARIAN),
+    MON3("caveman", "cavewoman", "cave dweller",
+        S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 12, HI_DOMESTIC, CAVE_DWELLER),
+    MON("healer", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
+        12, HI_DOMESTIC, HEALER),
+    MON("knight", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
+        12, HI_DOMESTIC, KNIGHT),
+    MON("monk", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN,
+        A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_HERBIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 11, HI_DOMESTIC, MONK),
+    MON3("priest", "priestess", "cleric",
+        S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 12, HI_DOMESTIC, CLERIC),
+    MON("ranger", S_HUMAN, LVL(10, 12, 10, 2, -3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
+        12, HI_DOMESTIC, RANGER),
+    MON("rogue", S_HUMAN, LVL(10, 12, 10, 1, -3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M3_INFRAVISIBLE, 12, HI_DOMESTIC, ROGUE),
+    MON("samurai", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
+        12, HI_DOMESTIC, SAMURAI),
+    MON("tourist", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
+        12, HI_DOMESTIC, TOURIST),
+    /* valk is lawful by default; player valk can be neutral, in which case
+       role_init() will change this monster and 'warrior' to be neutral too;
+       if a neutral valk leaves a bones file containing neutral warriors,
+       the latter will magically turn lawful if encountered by a lawful valk
+       or any non-valk (for bones on the dungeon side of the portal) */
+    MON("valkyrie", S_HUMAN, LVL(10, 12, 10, 1, 1), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_COLD, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
+        M3_INFRAVISIBLE, 12, HI_DOMESTIC, VALKYRIE),
+    MON("wizard", S_HUMAN, LVL(10, 12, 10, 3, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MAGIC,
+        M3_INFRAVISIBLE, 12, HI_DOMESTIC, WIZARD),
+    /*
+     * quest leaders
+     */
+    MON("Lord Carnarvon", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 4, 8),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
+        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD, LORD_CARNARVON),
+    MON("Pelias", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD, PELIAS),
+    MON("Shaman Karnov", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_CLRC, 2, 8),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD, SHAMAN_KARNOV),
+#if 0 /* OBSOLETE */
+    /* Two for elves - one of each sex.
+     */
+    MON("Earendil", S_HUMAN,
+        LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
+        M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG
+          | M2_MALE | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD,
+        EARENDIL),
+    MON("Elwing", S_HUMAN,
+        LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
+        M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG
+          | M2_FEMALE | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD,
+        ELWING),
+#endif
+    MON("Hippocrates", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 3, 8),
+          ATTK(AT_MAGC, AD_CLRC, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD, HIPPOCRATES),
+    MON("King Arthur", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD, KING_ARTHUR),
+    MON("Grand Master", S_HUMAN, LVL(25, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_CLAW, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8),
+          ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN),
+        MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0,
+        M1_HUMANOID | M1_SEE_INVIS | M1_HERBIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_NASTY
+            | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_BLACK, GRAND_MASTER),
+    MON("Arch Priest", S_HUMAN, LVL(25, 15, 7, 90, 0), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8),
+          ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN),
+        MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0,
+        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT
+            | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_WHITE, ARCH_PRIEST),
+    MON("Orion", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 4, 8),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2200, 700, MS_LEADER, MZ_HUGE), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS | M1_SWIM | M1_AMPHIBIOUS,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD, ORION),
+    /* Note: Master of Thieves is also the Tourist's nemesis.
+     */
+    MON("Master of Thieves", S_HUMAN, LVL(20, 15, 0, 90, -20),
+        (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 2, 6),
+          ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_STONE, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_GREEDY
+            | M2_JEWELS | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 24, HI_LORD, MASTER_OF_THIEVES),
+    MON("Lord Sato", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD, LORD_SATO),
+    MON("Twoflower", S_HUMAN, LVL(20, 15, 10, 90, 0), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_DOMESTIC, TWOFLOWER),
+    /* for a valkyrie hero, Norn's alignment will be changed to match hero's
+       starting alignment */
+    MON("Norn", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1800, 550, MS_LEADER, MZ_HUGE), MR_COLD, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_FEMALE
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD, NORN),
+    MON("Neferet the Green", S_HUMAN, LVL(20, 15, 0, 90, 0),
+        (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 2, 8),
+          ATTK(AT_MAGC, AD_SPEL, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_FEMALE | M2_PNAME | M2_PEACEFUL | M2_STRONG
+            | M2_COLLECT | M2_MAGIC,
+        M3_CLOSE | M3_INFRAVISIBLE, 23, CLR_GREEN, NEFERET_THE_GREEN),
+    /*
+     * quest nemeses
+     */
+    MON("Minion of Huhetotl", S_DEMON, LVL(16, 12, -2, 75, -14),
+        (G_NOCORPSE | G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6),
+          ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_LARGE),
+        MR_FIRE | MR_POISON | MR_STONE, 0, M1_FLY | M1_SEE_INVIS | M1_POIS,
+        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY
+            | M2_COLLECT,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
+        23, CLR_RED, MINION_OF_HUHETOTL),
+    MON("Thoth Amon", S_HUMAN, LVL(16, 12, 0, 10, -14),
+        (G_NOGEN | G_UNIQ | G_NOCORPSE),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0),
+          ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_STRONG | M2_MALE | M2_STALK
+            | M2_HOSTILE | M2_NASTY | M2_COLLECT | M2_MAGIC,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, HI_LORD,
+        THOTH_AMON),
+    /* Multi-headed, possessing the breath attacks of all the other dragons
+     * (selected at random when attacking).  Despite being a superset of
+     * gold dragon, does not emit light.
+     */
+    MON("Chromatic Dragon", S_DRAGON, LVL(16, 12, 0, 30, -14),
+        (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_BREA, AD_RBRE, 6, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0),
+          ATTK(AT_CLAW, AD_SAMU, 2, 8), ATTK(AT_BITE, AD_PHYS, 4, 8),
+          ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_STNG, AD_PHYS, 1, 6)),
+        SIZ(WT_DRAGON, 1700, MS_NEMESIS, MZ_GIGANTIC),
+        MR_FIRE | MR_COLD | MR_SLEEP | MR_DISINT | MR_ELEC | MR_POISON
+            | MR_ACID | MR_STONE,
+        MR_FIRE | MR_COLD | MR_SLEEP | MR_DISINT | MR_ELEC | MR_POISON
+            | MR_STONE,
+        M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS | M1_POIS,
+        M2_NOPOLY | M2_HOSTILE | M2_FEMALE | M2_STALK | M2_STRONG | M2_NASTY
+            | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 23, HI_LORD,
+        CHROMATIC_DRAGON),
+#if 0 /* OBSOLETE */
+    MON("Goblin King", S_ORC,
+        LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
+          ATTK(AT_CLAW, AD_SAMU, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_ORC | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY
+          | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
+        18, HI_LORD, GOBLIN_KING),
+#endif
+    MON("Cyclops", S_GIANT, LVL(18, 12, 0, 0, -15), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_WEAP, AD_PHYS, 4, 8),
+          ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(1900, 700, MS_NEMESIS, MZ_HUGE), MR_STONE, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_STALK
+            | M2_HOSTILE | M2_NASTY | M2_MALE | M2_JEWELS | M2_COLLECT,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
+        23, CLR_GRAY, CYCLOPS),
+    MON("Ixoth", S_DRAGON, LVL(15, 12, -1, 20, -14), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_BREA, AD_FIRE, 8, 6), ATTK(AT_BITE, AD_PHYS, 4, 8),
+          ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_PHYS, 2, 4),
+          ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK),
+        SIZ(WT_DRAGON, 1600, MS_NEMESIS, MZ_GIGANTIC), MR_FIRE | MR_STONE,
+        MR_FIRE,
+        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS,
+        M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_NASTY
+            | M2_STALK | M2_GREEDY | M2_JEWELS | M2_MAGIC,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, CLR_RED,
+        IXOTH),
+    MON("Master Kaen", S_HUMAN, LVL(25, 12, -10, 10, -20), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_CLAW, AD_PHYS, 16, 2), ATTK(AT_CLAW, AD_PHYS, 16, 2),
+          ATTK(AT_MAGC, AD_CLRC, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE,
+        MR_POISON, M1_HUMANOID | M1_HERBIVORE | M1_SEE_INVIS,
+        M2_NOPOLY | M2_HUMAN | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG
+            | M2_NASTY | M2_STALK | M2_COLLECT | M2_MAGIC,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 31, HI_LORD,
+        MASTER_KAEN),
+    MON("Nalzok", S_DEMON, LVL(16, 12, -2, 85, -127),
+        (G_NOGEN | G_UNIQ | G_NOCORPSE),
+        A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6),
+          ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_LARGE),
+        MR_FIRE | MR_POISON | MR_STONE, 0, M1_FLY | M1_SEE_INVIS | M1_POIS,
+        M2_NOPOLY | M2_DEMON | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG
+            | M2_STALK | M2_NASTY | M2_COLLECT,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
+        23, CLR_RED, NALZOK),
+    MON("Scorpius", S_SPIDER, LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 6),
+          ATTK(AT_STNG, AD_DISE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, MR_POISON,
+        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE,
+        M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK
+            | M2_NASTY | M2_COLLECT | M2_MAGIC,
+        M3_WANTSARTI | M3_WAITFORU, 17, HI_LORD, SCORPIUS),
+    MON("Master Assassin", S_HUMAN, LVL(15, 12, 0, 30, 18),
+        (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_DRST, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 8),
+          ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_HOSTILE | M2_STALK
+            | M2_NASTY | M2_COLLECT | M2_MAGIC,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, HI_LORD,
+        MASTER_ASSASSIN),
+    /* A renegade daimyo who led a 13 year civil war against the shogun
+     * of his time.
+     */
+    MON("Ashikaga Takauji", S_HUMAN, LVL(15, 12, 0, 40, -13),
+        (G_NOGEN | G_UNIQ | G_NOCORPSE),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
+          ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK
+            | M2_NASTY | M2_MALE | M2_COLLECT | M2_MAGIC,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 19, HI_LORD,
+        ASHIKAGA_TAKAUJI),
+    /*
+     * Note: the Master of Thieves was defined above.
+     */
+    MON("Lord Surtur", S_GIANT, LVL(15, 12, 2, 50, 12), (G_NOGEN | G_UNIQ),
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_WEAP, AD_PHYS, 2, 10),
+          ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(2250, 850, MS_NEMESIS, MZ_HUGE), MR_FIRE | MR_STONE, MR_FIRE,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_GIANT | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STALK
+            | M2_STRONG | M2_NASTY | M2_ROCKTHROW | M2_JEWELS | M2_COLLECT,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
+        19, HI_LORD, LORD_SURTUR),
+    MON("Dark One", S_HUMAN, LVL(15, 12, 0, 80, -10),
+        (G_NOGEN | G_UNIQ | G_NOCORPSE),
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
+          ATTK(AT_CLAW, AD_SAMU, 1, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_HOSTILE | M2_STALK | M2_NASTY
+            | M2_COLLECT | M2_MAGIC,
+        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, CLR_BLACK,
+        DARK_ONE),
+    /*
+     * quest "guardians"
+     */
+    MON("student", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, STUDENT),
+    MON("chieftain", S_HUMAN, LVL(5, 12, 10, 10, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, CHIEFTAIN),
+    MON("neanderthal", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, NEANDERTHAL),
+#if 0 /* OBSOLETE */
+    MON("High-elf", S_HUMAN,
+        LVL(5, 12, 10, 10, -7), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_CLRC, 0, 0),
+          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_ELF, 350, MS_GUARDIAN, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
+        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
+        M2_NOPOLY | M2_ELF | M2_PEACEFUL | M2_COLLECT,
+        M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC, HIGH_ELF),
+#endif
+    /* attendants used to lawful but have been changed to netural because
+       grow_up() promotes them to healer and the latter is always neutral */
+    MON("attendant", S_HUMAN, LVL(5, 12, 10, 10, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, ATTENDANT),
+    MON("page", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, PAGE),
+    MON("abbot", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN,
+        A(ATTK(AT_CLAW, AD_PHYS, 8, 2), ATTK(AT_KICK, AD_STUN, 3, 2),
+          ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_HERBIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 8, HI_DOMESTIC, ABBOT),
+    MON("acolyte", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 8, HI_DOMESTIC, ACOLYTE),
+    MON("hunter", S_HUMAN, LVL(5, 12, 10, 10, -7), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
+          NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC, HUNTER),
+    MON("thug", S_HUMAN, LVL(5, 12, 10, 10, -3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
+                                       | M2_STRONG | M2_GREEDY | M2_COLLECT,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, THUG),
+    MON("ninja", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, NINJA),
+    MON("roshi", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE,
+        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, ROSHI),
+    MON("guide", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
+                                       | M2_STRONG | M2_COLLECT | M2_MAGIC,
+        M3_INFRAVISIBLE, 8, HI_DOMESTIC, GUIDE),
+    /* warriors used to be chaotic but have been changed to lawful because
+       grow_up() promotes them to valkyrie; for a valkyrie hero, they might
+       be changed to neutral at game start; see the valkyrie comment above */
+    MON("warrior", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
+                                       | M2_STRONG | M2_COLLECT | M2_FEMALE,
+        M3_INFRAVISIBLE, 7, HI_DOMESTIC, WARRIOR),
+    MON("apprentice", S_HUMAN, LVL(5, 12, 10, 30, 0), G_NOGEN,
+        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
+          NO_ATTK, NO_ATTK, NO_ATTK),
+        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
+        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
+                                       | M2_STRONG | M2_COLLECT | M2_MAGIC,
+        M3_INFRAVISIBLE, 8, HI_DOMESTIC, APPRENTICE),
+
+#if defined(MONS_ENUM) || defined(DUMP_ENUMS)
+#undef MON
+#undef MON3
+#endif
+
+/*monsters.h*/
index c9bdab9cd5d919f8861105d446df4bc9846070d4..6ecb6eff384f8bb0cf0bf0ad6d9875f19081e91a 100644 (file)
@@ -134,9 +134,6 @@ struct objdescr {
     const char *oc_descr; /* description when name unknown */
 };
 
-extern NEARDATA struct objclass objects[];
-extern NEARDATA struct objdescr obj_descr[];
-
 /*
  * All objects have a class. Make sure that all classes have a corresponding
  * symbol below.
@@ -183,6 +180,23 @@ struct fruit {
 #define newfruit() (struct fruit *) alloc(sizeof(struct fruit))
 #define dealloc_fruit(rind) free((genericptr_t)(rind))
 
+enum objects_nums {
+#define OBJECTS_ENUM
+#include "objects.h"
+#undef OBJECTS_ENUM
+    NUM_OBJECTS
+};
+
+enum misc_object_nums {
+    LAST_GEM = (JADE),
+    NUM_GLASS_GEMS = ((LUCKSTONE - JADE) - 1),
+    MAXSPELL = ((SPE_BOOK_OF_THE_DEAD - SCR_BLANK_PAPER) + 1)
+};
+
+extern NEARDATA struct objclass objects[NUM_OBJECTS + 1];
+extern NEARDATA struct objdescr obj_descr[NUM_OBJECTS + 1];
+
 #define OBJ_NAME(obj) (obj_descr[(obj).oc_name_idx].oc_name)
 #define OBJ_DESCR(obj) (obj_descr[(obj).oc_descr_idx].oc_descr)
+
 #endif /* OBJCLASS_H */
diff --git a/include/objects.h b/include/objects.h
new file mode 100644 (file)
index 0000000..ba95a62
--- /dev/null
@@ -0,0 +1,1532 @@
+/* NetHack 3.7 objects.h       $NHDT-Date: 1596498192 2020/08/03 23:43:12 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.66 $ */
+/* Copyright (c) Mike Threepoint, 1989.                           */
+/* NetHack may be freely redistributed.  See license for details. */
+
+/*
+   The data in this file is processed multiple times by its inclusion
+   in several places in the code. The results depend on the definition
+   of the following:
+     OBJECTS_ENUM        to construct object onames enum entries (decl.h).
+     OBJECTS_DESCR_INIT to construct obj_descr[] array entries (objects.c).
+     OBJECTS_INIT       to construct objects[] array entries (objects.c).
+*/
+
+#ifndef NoDes
+#define NoDes (char *) 0 /* less visual distraction for 'no description' */
+#endif
+
+#ifndef lint
+#define HARDGEM(n) (n >= 8)
+#else
+#define HARDGEM(n) (0)
+#endif
+
+#if defined(OBJECTS_DESCR_INIT)
+#define OBJ(name,desc)  name, desc
+#define OBJECT(obj,bits,prp,sym,prob,dly,wt, \
+               cost,sdam,ldam,oc1,oc2,nut,color,sn)  { obj }
+
+#elif defined(OBJECTS_INIT)
+#define COLOR_FIELD(X) X,
+#define BITS(nmkn,mrg,uskn,ctnr,mgc,chrg,uniq,nwsh,big,tuf,dir,sub,mtrl) \
+  nmkn,mrg,uskn,0,mgc,chrg,uniq,nwsh,big,tuf,dir,mtrl,sub /*SCO cpp fodder*/
+#define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color,sn) \
+  { 0, 0, (char *) 0, bits, prp, sym, dly, COLOR_FIELD(color) prob, wt, \
+    cost, sdam, ldam, oc1, oc2, nut }
+
+#elif defined(OBJECTS_ENUM)
+#define OBJ(name,desc)
+#define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color,sn) \
+    sn
+
+#elif defined(DUMP_ENUMS)
+#define OBJ(name,desc)
+#define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color,sn) \
+    {sn, #sn}
+
+#else
+#error Unproductive inclusion of objects.h
+#endif  /* OBJECTS_DESCR_INIT || OBJECTS_INIT || OBJECTS_ENUM */
+
+/* dummy object[0] -- description [2nd arg] *must* be NULL */
+OBJECT(OBJ("strange object", NoDes),
+       BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, 0),
+       0, ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, STRANGE_OBJECT),
+
+/* weapons ... */
+#define WEAPON(name,desc,kn,mg,bi,prob,wt,                          \
+               cost,sdam,ldam,hitbon,typ,sub,metal,color,sn)        \
+    OBJECT(OBJ(name,desc),                                          \
+           BITS(kn, mg, 1, 0, 0, 1, 0, 0, bi, 0, typ, sub, metal),  \
+           0, WEAPON_CLASS, prob, 0, wt,                            \
+           cost, sdam, ldam, hitbon, 0, wt, color,sn)
+#define PROJECTILE(name,desc,kn,prob,wt,                            \
+                   cost,sdam,ldam,hitbon,metal,sub,color,sn)        \
+    OBJECT(OBJ(name,desc),                                          \
+           BITS(kn, 1, 1, 0, 0, 1, 0, 0, 0, 0, PIERCE, sub, metal), \
+           0, WEAPON_CLASS, prob, 0, wt,                            \
+           cost, sdam, ldam, hitbon, 0, wt, color, sn)
+#define BOW(name,desc,kn,prob,wt,cost,hitbon,metal,sub,color,sn)    \
+    OBJECT(OBJ(name,desc),                                          \
+           BITS(kn, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, sub, metal),      \
+           0, WEAPON_CLASS, prob, 0, wt,                            \
+           cost, 2, 2, hitbon, 0, wt, color, sn)
+
+/* Note: for weapons that don't do an even die of damage (ex. 2-7 or 3-18)
+   the extra damage is added on in weapon.c, not here! */
+
+#define P PIERCE
+#define S SLASH
+#define B WHACK
+
+/* missiles; materiel reflects the arrowhead, not the shaft */
+PROJECTILE("arrow", NoDes,
+           1, 55, 1, 2, 6, 6, 0,        IRON, -P_BOW, HI_METAL,
+                                                        ARROW),
+PROJECTILE("elven arrow", "runed arrow",
+           0, 20, 1, 2, 7, 6, 0,        WOOD, -P_BOW, HI_WOOD,
+                                                        ELVEN_ARROW),
+PROJECTILE("orcish arrow", "crude arrow",
+           0, 20, 1, 2, 5, 6, 0,        IRON, -P_BOW, CLR_BLACK,
+                                                        ORCISH_ARROW),
+PROJECTILE("silver arrow", NoDes,
+           1, 12, 1, 5, 6, 6, 0,        SILVER, -P_BOW, HI_SILVER,
+                                                        SILVER_ARROW),
+PROJECTILE("ya", "bamboo arrow",
+           0, 15, 1, 4, 7, 7, 1,        METAL, -P_BOW, HI_METAL, YA),
+PROJECTILE("crossbow bolt", NoDes,
+           1, 55, 1, 2, 4, 6, 0,        IRON, -P_CROSSBOW, HI_METAL,
+                                                        CROSSBOW_BOLT),
+
+/* missiles that don't use a launcher */
+WEAPON("dart", NoDes,
+       1, 1, 0, 60,   1,   2,  3,  2, 0, P,   -P_DART, IRON, HI_METAL,
+                                                        DART),
+WEAPON("shuriken", "throwing star",
+       0, 1, 0, 35,   1,   5,  8,  6, 2, P,   -P_SHURIKEN, IRON, HI_METAL,
+                                                        SHURIKEN),
+WEAPON("boomerang", NoDes,
+       1, 1, 0, 15,   5,  20,  9,  9, 0, 0,   -P_BOOMERANG, WOOD, HI_WOOD,
+                                                        BOOMERANG),
+
+/* spears [note: javelin used to have a separate skill from spears,
+   because the latter are primarily stabbing weapons rather than
+   throwing ones; but for playability, they've been merged together
+   under spear skill and spears can now be thrown like javelins] */
+WEAPON("spear", NoDes,
+       1, 1, 0, 50,  30,   3,  6,  8, 0, P,   P_SPEAR, IRON, HI_METAL,
+                                                        SPEAR),
+WEAPON("elven spear", "runed spear",
+       0, 1, 0, 10,  30,   3,  7,  8, 0, P,   P_SPEAR, WOOD, HI_WOOD,
+                                                        ELVEN_SPEAR),
+WEAPON("orcish spear", "crude spear",
+       0, 1, 0, 13,  30,   3,  5,  8, 0, P,   P_SPEAR, IRON, CLR_BLACK,
+                                                        ORCISH_SPEAR),
+WEAPON("dwarvish spear", "stout spear",
+       0, 1, 0, 12,  35,   3,  8,  8, 0, P,   P_SPEAR, IRON, HI_METAL,
+                                                        DWARVISH_SPEAR),
+WEAPON("silver spear", NoDes,
+       1, 1, 0,  2,  36,  40,  6,  8, 0, P,   P_SPEAR, SILVER, HI_SILVER,
+                                                        SILVER_SPEAR),
+WEAPON("javelin", "throwing spear",
+       0, 1, 0, 10,  20,   3,  6,  6, 0, P,   P_SPEAR, IRON, HI_METAL,
+                                                        JAVELIN),
+
+/* spearish; doesn't stack, not intended to be thrown */
+WEAPON("trident", NoDes,
+       1, 0, 0,  8,  25,   5,  6,  4, 0, P,   P_TRIDENT, IRON, HI_METAL,
+                                                        TRIDENT),
+        /* +1 small, +2d4 large */
+
+/* blades; all stack */
+WEAPON("dagger", NoDes,
+       1, 1, 0, 30,  10,   4,  4,  3, 2, P,   P_DAGGER, IRON, HI_METAL,
+                                                        DAGGER),
+WEAPON("elven dagger", "runed dagger",
+       0, 1, 0, 10,  10,   4,  5,  3, 2, P,   P_DAGGER, WOOD, HI_WOOD,
+                                                        ELVEN_DAGGER),
+WEAPON("orcish dagger", "crude dagger",
+       0, 1, 0, 12,  10,   4,  3,  3, 2, P,   P_DAGGER, IRON, CLR_BLACK,
+                                                        ORCISH_DAGGER),
+WEAPON("silver dagger", NoDes,
+       1, 1, 0,  3,  12,  40,  4,  3, 2, P,   P_DAGGER, SILVER, HI_SILVER,
+                                                        SILVER_DAGGER),
+WEAPON("athame", NoDes,
+       1, 1, 0,  0,  10,   4,  4,  3, 2, S,   P_DAGGER, IRON, HI_METAL,
+                                                        ATHAME),
+WEAPON("scalpel", NoDes,
+       1, 1, 0,  0,   5,   6,  3,  3, 2, S,   P_KNIFE, METAL, HI_METAL,
+                                                        SCALPEL),
+WEAPON("knife", NoDes,
+       1, 1, 0, 20,   5,   4,  3,  2, 0, P|S, P_KNIFE, IRON, HI_METAL,
+                                                        KNIFE),
+WEAPON("stiletto", NoDes,
+       1, 1, 0,  5,   5,   4,  3,  2, 0, P|S, P_KNIFE, IRON, HI_METAL,
+                                                        STILETTO),
+/* 3.6: worm teeth and crysknives now stack;
+   when a stack of teeth is enchanted at once, they fuse into one crysknife;
+   when a stack of crysknives drops, the whole stack reverts to teeth */
+/* 3.7: change crysknife from MINERAL to BONE and worm tooth from 0 to BONE */
+WEAPON("worm tooth", NoDes,
+       1, 1, 0,  0,  20,   2,  2,  2, 0, 0,   P_KNIFE, BONE, CLR_WHITE,
+                                                        WORM_TOOTH),
+WEAPON("crysknife", NoDes,
+       1, 1, 0,  0,  20, 100, 10, 10, 3, P,   P_KNIFE, BONE, CLR_WHITE,
+                                                        CRYSKNIFE),
+
+/* axes */
+WEAPON("axe", NoDes,
+       1, 0, 0, 40,  60,   8,  6,  4, 0, S,   P_AXE, IRON, HI_METAL,
+                                                        AXE),
+WEAPON("battle-axe", "double-headed axe",       /* "double-bitted"? */
+       0, 0, 1, 10, 120,  40,  8,  6, 0, S,   P_AXE, IRON, HI_METAL,
+                                                        BATTLE_AXE),
+
+/* swords */
+WEAPON("short sword", NoDes,
+       1, 0, 0,  8,  30,  10,  6,  8, 0, P,   P_SHORT_SWORD, IRON, HI_METAL,
+                                                        SHORT_SWORD),
+WEAPON("elven short sword", "runed short sword",
+       0, 0, 0,  2,  30,  10,  8,  8, 0, P,   P_SHORT_SWORD, WOOD, HI_WOOD,
+                                                        ELVEN_SHORT_SWORD),
+WEAPON("orcish short sword", "crude short sword",
+       0, 0, 0,  3,  30,  10,  5,  8, 0, P,   P_SHORT_SWORD, IRON, CLR_BLACK,
+                                                        ORCISH_SHORT_SWORD),
+WEAPON("dwarvish short sword", "broad short sword",
+       0, 0, 0,  2,  30,  10,  7,  8, 0, P,   P_SHORT_SWORD, IRON, HI_METAL,
+                                                        DWARVISH_SHORT_SWORD),
+WEAPON("scimitar", "curved sword",
+       0, 0, 0, 15,  40,  15,  8,  8, 0, S,   P_SCIMITAR, IRON, HI_METAL,
+                                                        SCIMITAR),
+WEAPON("silver saber", NoDes,
+       1, 0, 0,  6,  40,  75,  8,  8, 0, S,   P_SABER, SILVER, HI_SILVER,
+                                                        SILVER_SABER),
+WEAPON("broadsword", NoDes,
+       1, 0, 0,  8,  70,  10,  4,  6, 0, S,   P_BROAD_SWORD, IRON, HI_METAL,
+                                                        BROADSWORD),
+        /* +d4 small, +1 large */
+WEAPON("elven broadsword", "runed broadsword",
+       0, 0, 0,  4,  70,  10,  6,  6, 0, S,   P_BROAD_SWORD, WOOD, HI_WOOD,
+                                                        ELVEN_BROADSWORD),
+        /* +d4 small, +1 large */
+WEAPON("long sword", NoDes,
+       1, 0, 0, 50,  40,  15,  8, 12, 0, S,   P_LONG_SWORD, IRON, HI_METAL,
+                                                        LONG_SWORD),
+WEAPON("two-handed sword", NoDes,
+       1, 0, 1, 22, 150,  50, 12,  6, 0, S,   P_TWO_HANDED_SWORD,
+                                                            IRON, HI_METAL,
+                                                        TWO_HANDED_SWORD),
+        /* +2d6 large */
+WEAPON("katana", "samurai sword",
+       0, 0, 0,  4,  40,  80, 10, 12, 1, S,   P_LONG_SWORD, IRON, HI_METAL,
+                                                        KATANA),
+/* special swords set up for artifacts */
+WEAPON("tsurugi", "long samurai sword",
+       0, 0, 1,  0,  60, 500, 16,  8, 2, S,   P_TWO_HANDED_SWORD,
+                                                            METAL, HI_METAL,
+                                                        TSURUGI),
+        /* +2d6 large */
+WEAPON("runesword", "runed broadsword",
+       0, 0, 0,  0,  40, 300,  4,  6, 0, S,   P_BROAD_SWORD, IRON, CLR_BLACK,
+                                                        RUNESWORD),
+        /* +d4 small, +1 large; Stormbringer: +5d2 +d8 from level drain */
+
+/* polearms */
+/* spear-type */
+WEAPON("partisan", "vulgar polearm",
+       0, 0, 1,  5,  80,  10,  6,  6, 0, P,   P_POLEARMS, IRON, HI_METAL,
+                                                        PARTISAN),
+        /* +1 large */
+WEAPON("ranseur", "hilted polearm",
+       0, 0, 1,  5,  50,   6,  4,  4, 0, P,   P_POLEARMS, IRON, HI_METAL,
+                                                        RANSEUR),
+        /* +d4 both */
+WEAPON("spetum", "forked polearm",
+       0, 0, 1,  5,  50,   5,  6,  6, 0, P,   P_POLEARMS, IRON, HI_METAL,
+                                                        SPETUM),
+        /* +1 small, +d6 large */
+WEAPON("glaive", "single-edged polearm",
+       0, 0, 1,  8,  75,   6,  6, 10, 0, S,   P_POLEARMS, IRON, HI_METAL,
+                                                        GLAIVE),
+WEAPON("lance", NoDes,
+       1, 0, 0,  4, 180,  10,  6,  8, 0, P,   P_LANCE, IRON, HI_METAL,
+                                                        LANCE),
+        /* +2d10 when jousting with lance as primary weapon */
+/* axe-type */
+WEAPON("halberd", "angled poleaxe",
+       0, 0, 1,  8, 150,  10, 10,  6, 0, P|S, P_POLEARMS, IRON, HI_METAL,
+                                                        HALBERD),
+        /* +1d6 large */
+WEAPON("bardiche", "long poleaxe",
+       0, 0, 1,  4, 120,   7,  4,  4, 0, S,   P_POLEARMS, IRON, HI_METAL,
+                                                        BARDICHE),
+        /* +1d4 small, +2d4 large */
+WEAPON("voulge", "pole cleaver",
+       0, 0, 1,  4, 125,   5,  4,  4, 0, S,   P_POLEARMS, IRON, HI_METAL,
+                                                        VOULGE),
+        /* +d4 both */
+WEAPON("dwarvish mattock", "broad pick",
+       0, 0, 1, 13, 120,  50, 12,  8, -1, B,  P_PICK_AXE, IRON, HI_METAL,
+                                                        DWARVISH_MATTOCK),
+/* curved/hooked */
+WEAPON("fauchard", "pole sickle",
+       0, 0, 1,  6,  60,   5,  6,  8, 0, P|S, P_POLEARMS, IRON, HI_METAL,
+                                                        FAUCHARD),
+WEAPON("guisarme", "pruning hook",
+       0, 0, 1,  6,  80,   5,  4,  8, 0, S,   P_POLEARMS, IRON, HI_METAL,
+                                                        GUISARME),
+        /* +1d4 small */
+WEAPON("bill-guisarme", "hooked polearm",
+       0, 0, 1,  4, 120,   7,  4, 10, 0, P|S, P_POLEARMS, IRON, HI_METAL,
+                                                        BILL_GUISARME),
+        /* +1d4 small */
+/* other */
+WEAPON("lucern hammer", "pronged polearm",
+       0, 0, 1,  5, 150,   7,  4,  6, 0, B|P, P_POLEARMS, IRON, HI_METAL,
+                                                        LUCERN_HAMMER),
+        /* +1d4 small */
+WEAPON("bec de corbin", "beaked polearm",
+       0, 0, 1,  4, 100,   8,  8,  6, 0, B|P, P_POLEARMS, IRON, HI_METAL,
+                                                        BEC_DE_CORBIN),
+
+/* bludgeons */
+WEAPON("mace", NoDes,
+       1, 0, 0, 40,  30,   5,  6,  6, 0, B,   P_MACE, IRON, HI_METAL,
+                                                        MACE),
+        /* +1 small */
+WEAPON("morning star", NoDes,
+       1, 0, 0, 12, 120,  10,  4,  6, 0, B,   P_MORNING_STAR, IRON, HI_METAL,
+                                                        MORNING_STAR),
+        /* +d4 small, +1 large */
+WEAPON("war hammer", NoDes,
+       1, 0, 0, 15,  50,   5,  4,  4, 0, B,   P_HAMMER, IRON, HI_METAL,
+                                                        WAR_HAMMER),
+        /* +1 small */
+WEAPON("club", NoDes,
+       1, 0, 0, 12,  30,   3,  6,  3, 0, B,   P_CLUB, WOOD, HI_WOOD,
+                                                        CLUB),
+WEAPON("rubber hose", NoDes,
+       1, 0, 0,  0,  20,   3,  4,  3, 0, B,   P_WHIP, PLASTIC, CLR_BROWN,
+                                                        RUBBER_HOSE),
+WEAPON("quarterstaff", "staff",
+       0, 0, 1, 11,  40,   5,  6,  6, 0, B,   P_QUARTERSTAFF, WOOD, HI_WOOD,
+                                                        QUARTERSTAFF),
+/* two-piece */
+WEAPON("aklys", "thonged club",
+       0, 0, 0,  8,  15,   4,  6,  3, 0, B,   P_CLUB, IRON, HI_METAL,
+                                                        AKLYS),
+WEAPON("flail", NoDes,
+       1, 0, 0, 40,  15,   4,  6,  4, 0, B,   P_FLAIL, IRON, HI_METAL,
+                                                        FLAIL),
+        /* +1 small, +1d4 large */
+
+/* misc */
+WEAPON("bullwhip", NoDes,
+       1, 0, 0,  2,  20,   4,  2,  1, 0, 0,   P_WHIP, LEATHER, CLR_BROWN,
+                                                        BULLWHIP),
+
+/* bows */
+BOW("bow", NoDes,               1, 24, 30, 60, 0, WOOD, P_BOW, HI_WOOD,
+                                                        BOW),
+BOW("elven bow", "runed bow",  0, 12, 30, 60, 0, WOOD, P_BOW, HI_WOOD,
+                                                        ELVEN_BOW),
+BOW("orcish bow", "crude bow", 0, 12, 30, 60, 0, WOOD, P_BOW, CLR_BLACK,
+                                                        ORCISH_BOW),
+BOW("yumi", "long bow",        0,  0, 30, 60, 0, WOOD, P_BOW, HI_WOOD,
+                                                        YUMI),
+BOW("sling", NoDes,             1, 40,  3, 20, 0, LEATHER, P_SLING, HI_LEATHER,
+                                                        SLING),
+BOW("crossbow", NoDes,          1, 45, 50, 40, 0, WOOD, P_CROSSBOW, HI_WOOD,
+                                                        CROSSBOW),
+
+#undef P
+#undef S
+#undef B
+
+#undef WEAPON
+#undef PROJECTILE
+#undef BOW
+
+/* armor ... */
+        /* IRON denotes ferrous metals, including steel.
+         * Only IRON weapons and armor can rust.
+         * Only COPPER (including brass) corrodes.
+         * Some creatures are vulnerable to SILVER.
+         */
+#define ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt,  \
+              cost,ac,can,sub,metal,c,sn)                   \
+    OBJECT(OBJ(name, desc),                                         \
+           BITS(kn, 0, 1, 0, mgc, 1, 0, 0, blk, 0, 0, sub, metal),  \
+           power, ARMOR_CLASS, prob, delay, wt,                     \
+           cost, 0, 0, 10 - ac, can, wt, c, sn)
+#define HELM(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c,sn)  \
+    ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt,  \
+          cost, ac, can, ARM_HELM, metal, c, sn)
+#define CLOAK(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c,sn)  \
+    ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt,  \
+          cost, ac, can, ARM_CLOAK, metal, c,sn)
+#define SHIELD(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,metal,c,sn) \
+    ARMOR(name, desc, kn, mgc, blk, power, prob, delay, wt, \
+          cost, ac, can, ARM_SHIELD, metal, c,sn)
+#define GLOVES(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c,sn)  \
+    ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt,  \
+          cost, ac, can, ARM_GLOVES, metal, c,sn)
+#define BOOTS(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c,sn)  \
+    ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt,  \
+          cost, ac, can, ARM_BOOTS, metal, c,sn)
+
+/* helmets */
+HELM("elven leather helm", "leather hat",
+     0, 0,           0,  6, 1,  3,  8,  9, 0, LEATHER, HI_LEATHER,
+                                                        ELVEN_LEATHER_HELM),
+HELM("orcish helm", "iron skull cap",
+     0, 0,           0,  6, 1, 30, 10,  9, 0, IRON, CLR_BLACK,
+                                                        ORCISH_HELM),
+HELM("dwarvish iron helm", "hard hat",
+     0, 0,           0,  6, 1, 40, 20,  8, 0, IRON, HI_METAL,
+                                                        DWARVISH_IRON_HELM),
+HELM("fedora", NoDes,
+     1, 0,           0,  0, 0,  3,  1, 10, 0, CLOTH, CLR_BROWN,
+                                                        FEDORA),
+HELM("cornuthaum", "conical hat",
+     0, 1, CLAIRVOYANT,  3, 1,  4, 80, 10, 1, CLOTH, CLR_BLUE,
+                                                        CORNUTHAUM),
+        /* name coined by devteam; confers clairvoyance for wizards,
+           blocks clairvoyance if worn by role other than wizard */
+HELM("dunce cap", "conical hat",
+     0, 1,           0,  3, 1,  4,  1, 10, 0, CLOTH, CLR_BLUE,
+                                                        DUNCE_CAP),
+HELM("dented pot", NoDes,
+     1, 0,           0,  2, 0, 10,  8,  9, 0, IRON, CLR_BLACK,
+                                                        DENTED_POT),
+/* with shuffled appearances... */
+HELM("helmet", "plumed helmet",
+     0, 0,           0, 10, 1, 30, 10,  9, 0, IRON, HI_METAL,
+                                                        HELMET),
+HELM("helm of brilliance", "etched helmet",
+     0, 1,           0,  6, 1, 50, 50,  9, 0, IRON, CLR_GREEN,
+                                                        HELM_OF_BRILLIANCE),
+HELM("helm of opposite alignment", "crested helmet",
+     0, 1,           0,  6, 1, 50, 50,  9, 0, IRON, HI_METAL,
+                                                 HELM_OF_OPPOSITE_ALIGNMENT),
+HELM("helm of telepathy", "visored helmet",
+     0, 1,     TELEPAT,  2, 1, 50, 50,  9, 0, IRON, HI_METAL,
+                                                 HELM_OF_TELEPATHY),
+
+/* suits of armor */
+/*
+ * There is code in polyself.c that assumes (1) and (2).
+ * There is code in obj.h, objnam.c, mon.c, read.c that assumes (2).
+ *      (1) The dragon scale mails and the dragon scales are together.
+ *      (2) That the order of the dragon scale mail and dragon scales
+ *          is the same as order of dragons defined in monst.c.
+ */
+#define DRGN_ARMR(name,mgc,power,cost,ac,color,snam)  \
+    ARMOR(name, NoDes, 1, mgc, 1, power, 0, 5, 40,  \
+          cost, ac, 0, ARM_SUIT, DRAGON_HIDE, color,snam)
+/* 3.4.1: dragon scale mail reclassified as "magic" since magic is
+   needed to create them */
+DRGN_ARMR("gray dragon scale mail",    1, ANTIMAGIC,  1200, 1, CLR_GRAY,
+                                                    GRAY_DRAGON_SCALE_MAIL),
+    /* gold DSM is a light source; there's no property for that */
+DRGN_ARMR("gold dragon scale mail",    1, 0,           900, 1, HI_GOLD,
+                                                    GOLD_DRAGON_SCALE_MAIL),
+DRGN_ARMR("silver dragon scale mail",  1, REFLECTING, 1200, 1, DRAGON_SILVER,
+                                                    SILVER_DRAGON_SCALE_MAIL),
+#if 0 /* DEFERRED */
+DRGN_ARMR("shimmering dragon scale mail", 1, DISPLACED, 1200, 1, CLR_CYAN,
+                                                SHIMMERING_DRAGON_SCALE_MAIL),
+#endif
+DRGN_ARMR("red dragon scale mail",     1, FIRE_RES,    900, 1, CLR_RED,
+                                                    RED_DRAGON_SCALE_MAIL),
+DRGN_ARMR("white dragon scale mail",   1, COLD_RES,    900, 1, CLR_WHITE,
+                                                    WHITE_DRAGON_SCALE_MAIL),
+DRGN_ARMR("orange dragon scale mail",  1, SLEEP_RES,   900, 1, CLR_ORANGE,
+                                                    ORANGE_DRAGON_SCALE_MAIL),
+DRGN_ARMR("black dragon scale mail",   1, DISINT_RES, 1200, 1, CLR_BLACK,
+                                                    BLACK_DRAGON_SCALE_MAIL),
+DRGN_ARMR("blue dragon scale mail",    1, SHOCK_RES,   900, 1, CLR_BLUE,
+                                                    BLUE_DRAGON_SCALE_MAIL),
+DRGN_ARMR("green dragon scale mail",   1, POISON_RES,  900, 1, CLR_GREEN,
+                                                    GREEN_DRAGON_SCALE_MAIL),
+DRGN_ARMR("yellow dragon scale mail",  1, ACID_RES,    900, 1, CLR_YELLOW,
+                                                    YELLOW_DRAGON_SCALE_MAIL),
+/* For now, only dragons leave these. */
+/* 3.4.1: dragon scales left classified as "non-magic"; they confer magical
+   properties but are produced "naturally"; affects use as polypile fodder */
+DRGN_ARMR("gray dragon scales",        0, ANTIMAGIC,   700, 7, CLR_GRAY,
+                                                        GRAY_DRAGON_SCALES),
+DRGN_ARMR("gold dragon scales",        0, 0,           500, 7, HI_GOLD,
+                                                        GOLD_DRAGON_SCALES),
+DRGN_ARMR("silver dragon scales",      0, REFLECTING,  700, 7, DRAGON_SILVER,
+                                                        SILVER_DRAGON_SCALES),
+#if 0 /* DEFERRED */
+DRGN_ARMR("shimmering dragon scales",  0, DISPLACED,   700, 7, CLR_CYAN,
+                                                    SHIMMERING_DRAGON_SCALES),
+#endif
+DRGN_ARMR("red dragon scales",         0, FIRE_RES,    500, 7, CLR_RED,
+                                                        RED_DRAGON_SCALES),
+DRGN_ARMR("white dragon scales",       0, COLD_RES,    500, 7, CLR_WHITE,
+                                                        WHITE_DRAGON_SCALES),
+DRGN_ARMR("orange dragon scales",      0, SLEEP_RES,   500, 7, CLR_ORANGE,
+                                                        ORANGE_DRAGON_SCALES),
+DRGN_ARMR("black dragon scales",       0, DISINT_RES,  700, 7, CLR_BLACK,
+                                                        BLACK_DRAGON_SCALES),
+DRGN_ARMR("blue dragon scales",        0, SHOCK_RES,   500, 7, CLR_BLUE,
+                                                        BLUE_DRAGON_SCALES),
+DRGN_ARMR("green dragon scales",       0, POISON_RES,  500, 7, CLR_GREEN,
+                                                        GREEN_DRAGON_SCALES),
+DRGN_ARMR("yellow dragon scales",      0, ACID_RES,    500, 7, CLR_YELLOW,
+                                                        YELLOW_DRAGON_SCALES),
+#undef DRGN_ARMR
+/* other suits */
+ARMOR("plate mail", NoDes,
+      1, 0, 1,  0, 44, 5, 450, 600,  3, 2,  ARM_SUIT, IRON, HI_METAL,
+                                                        PLATE_MAIL),
+ARMOR("crystal plate mail", NoDes,
+      1, 0, 1,  0, 10, 5, 450, 820,  3, 2,  ARM_SUIT, GLASS, CLR_WHITE,
+                                                        CRYSTAL_PLATE_MAIL),
+ARMOR("bronze plate mail", NoDes,
+      1, 0, 1,  0, 25, 5, 450, 400,  4, 1,  ARM_SUIT, COPPER, HI_COPPER,
+                                                        BRONZE_PLATE_MAIL),
+ARMOR("splint mail", NoDes,
+      1, 0, 1,  0, 62, 5, 400,  80,  4, 1,  ARM_SUIT, IRON, HI_METAL,
+                                                        SPLINT_MAIL),
+ARMOR("banded mail", NoDes,
+      1, 0, 1,  0, 72, 5, 350,  90,  4, 1,  ARM_SUIT, IRON, HI_METAL,
+                                                        BANDED_MAIL),
+ARMOR("dwarvish mithril-coat", NoDes,
+      1, 0, 0,  0, 10, 1, 150, 240,  4, 2,  ARM_SUIT, MITHRIL, HI_SILVER,
+                                                        DWARVISH_MITHRIL_COAT),
+ARMOR("elven mithril-coat", NoDes,
+      1, 0, 0,  0, 15, 1, 150, 240,  5, 2,  ARM_SUIT, MITHRIL, HI_SILVER,
+                                                        ELVEN_MITHRIL_COAT),
+ARMOR("chain mail", NoDes,
+      1, 0, 0,  0, 72, 5, 300,  75,  5, 1,  ARM_SUIT, IRON, HI_METAL,
+                                                        CHAIN_MAIL),
+ARMOR("orcish chain mail", "crude chain mail",
+      0, 0, 0,  0, 20, 5, 300,  75,  6, 1,  ARM_SUIT, IRON, CLR_BLACK,
+                                                        ORCISH_CHAIN_MAIL),
+ARMOR("scale mail", NoDes,
+      1, 0, 0,  0, 72, 5, 250,  45,  6, 1,  ARM_SUIT, IRON, HI_METAL,
+                                                        SCALE_MAIL),
+ARMOR("studded leather armor", NoDes,
+      1, 0, 0,  0, 72, 3, 200,  15,  7, 1,  ARM_SUIT, LEATHER, HI_LEATHER,
+                                                        STUDDED_LEATHER_ARMOR),
+ARMOR("ring mail", NoDes,
+      1, 0, 0,  0, 72, 5, 250, 100,  7, 1,  ARM_SUIT, IRON, HI_METAL,
+                                                        RING_MAIL),
+ARMOR("orcish ring mail", "crude ring mail",
+      0, 0, 0,  0, 20, 5, 250,  80,  8, 1,  ARM_SUIT, IRON, CLR_BLACK,
+                                                        ORCISH_RING_MAIL),
+ARMOR("leather armor", NoDes,
+      1, 0, 0,  0, 82, 3, 150,   5,  8, 1,  ARM_SUIT, LEATHER, HI_LEATHER,
+                                                        LEATHER_ARMOR),
+ARMOR("leather jacket", NoDes,
+      1, 0, 0,  0, 12, 0,  30,  10,  9, 0,  ARM_SUIT, LEATHER, CLR_BLACK,
+                                                        LEATHER_JACKET),
+
+/* shirts */
+ARMOR("Hawaiian shirt", NoDes,
+      1, 0, 0,  0,  8, 0,   5,   3, 10, 0,  ARM_SHIRT, CLOTH, CLR_MAGENTA,
+                                                        HAWAIIAN_SHIRT),
+ARMOR("T-shirt", NoDes,
+      1, 0, 0,  0,  2, 0,   5,   2, 10, 0,  ARM_SHIRT, CLOTH, CLR_WHITE,
+                                                        T_SHIRT),
+
+/* cloaks */
+CLOAK("mummy wrapping", NoDes,
+      1, 0,          0,  0, 0,  3,  2, 10, 1,  CLOTH, CLR_GRAY, MUMMY_WRAPPING),
+        /* worn mummy wrapping blocks invisibility */
+CLOAK("elven cloak", "faded pall",
+      0, 1,    STEALTH,  8, 0, 10, 60,  9, 1,  CLOTH, CLR_BLACK, ELVEN_CLOAK),
+CLOAK("orcish cloak", "coarse mantelet",
+      0, 0,          0,  8, 0, 10, 40, 10, 1,  CLOTH, CLR_BLACK, ORCISH_CLOAK),
+CLOAK("dwarvish cloak", "hooded cloak",
+      0, 0,          0,  8, 0, 10, 50, 10, 1,  CLOTH, HI_CLOTH, DWARVISH_CLOAK),
+CLOAK("oilskin cloak", "slippery cloak",
+      0, 0,          0,  8, 0, 10, 50,  9, 2,  CLOTH, HI_CLOTH, OILSKIN_CLOAK),
+CLOAK("robe", NoDes,
+      1, 1,          0,  3, 0, 15, 50,  8, 2,  CLOTH, CLR_RED, ROBE),
+        /* robe was adopted from slash'em, where it's worn as a suit
+           rather than as a cloak and there are several variations */
+CLOAK("alchemy smock", "apron",
+      0, 1, POISON_RES,  9, 0, 10, 50,  9, 1,  CLOTH, CLR_WHITE, ALCHEMY_SMOCK),
+CLOAK("leather cloak", NoDes,
+      1, 0,          0,  8, 0, 15, 40,  9, 1,  LEATHER, CLR_BROWN, LEATHER_CLOAK),
+/* with shuffled appearances... */
+CLOAK("cloak of protection", "tattered cape",
+      0, 1, PROTECTION,  9, 0, 10, 50,  7, 3,  CLOTH, HI_CLOTH, CLOAK_OF_PROTECTION),
+        /* cloak of protection is now the only item conferring MC 3 */
+CLOAK("cloak of invisibility", "opera cloak",
+      0, 1,      INVIS, 10, 0, 10, 60,  9, 1,  CLOTH, CLR_BRIGHT_MAGENTA,
+                                                        CLOAK_OF_INVISIBILITY),
+CLOAK("cloak of magic resistance", "ornamental cope",
+      0, 1,  ANTIMAGIC,  2, 0, 10, 60,  9, 1,  CLOTH, CLR_WHITE,
+                                                        CLOAK_OF_MAGIC_RESISTANCE),
+        /*  'cope' is not a spelling mistake... leave it be */
+CLOAK("cloak of displacement", "piece of cloth",
+      0, 1,  DISPLACED, 10, 0, 10, 50,  9, 1,  CLOTH, HI_CLOTH,
+                                                        CLOAK_OF_DISPLACEMENT),
+
+/* shields */
+SHIELD("small shield", NoDes,
+       1, 0, 0,          0, 6, 0,  30,  3, 9, 0,  WOOD, HI_WOOD,
+                                                        SMALL_SHIELD),
+SHIELD("elven shield", "blue and green shield",
+       0, 0, 0,          0, 2, 0,  40,  7, 8, 0,  WOOD, CLR_GREEN,
+                                                        ELVEN_SHIELD),
+SHIELD("Uruk-hai shield", "white-handed shield",
+       0, 0, 0,          0, 2, 0,  50,  7, 9, 0,  IRON, HI_METAL,
+                                                        URUK_HAI_SHIELD),
+SHIELD("orcish shield", "red-eyed shield",
+       0, 0, 0,          0, 2, 0,  50,  7, 9, 0,  IRON, CLR_RED,
+                                                        ORCISH_SHIELD),
+SHIELD("large shield", NoDes,
+       1, 0, 1,          0, 7, 0, 100, 10, 8, 0,  IRON, HI_METAL,
+                                                        LARGE_SHIELD),
+SHIELD("dwarvish roundshield", "large round shield",
+       0, 0, 0,          0, 4, 0, 100, 10, 8, 0,  IRON, HI_METAL,
+                                                        DWARVISH_ROUNDSHIELD),
+SHIELD("shield of reflection", "polished silver shield",
+       0, 1, 0, REFLECTING, 3, 0,  50, 50, 8, 0,  SILVER, HI_SILVER,
+                                                        SHIELD_OF_REFLECTION),
+
+/* gloves */
+/* These have their color but not material shuffled, so the IRON must
+ * stay CLR_BROWN (== HI_LEATHER) even though it's normally either
+ * HI_METAL or CLR_BLACK.  All have shuffled descriptions.
+ */
+GLOVES("leather gloves", "old gloves",
+       0, 0,        0, 16, 1, 10,  8, 9, 0,  LEATHER, HI_LEATHER,
+                                                        LEATHER_GLOVES),
+GLOVES("gauntlets of fumbling", "padded gloves",
+       0, 1, FUMBLING,  8, 1, 10, 50, 9, 0,  LEATHER, HI_LEATHER,
+                                                    GAUNTLETS_OF_FUMBLING),
+GLOVES("gauntlets of power", "riding gloves",
+       0, 1,        0,  8, 1, 30, 50, 9, 0,  IRON, CLR_BROWN,
+                                                    GAUNTLETS_OF_POWER),
+GLOVES("gauntlets of dexterity", "fencing gloves",
+       0, 1,        0,  8, 1, 10, 50, 9, 0,  LEATHER, HI_LEATHER,
+                                                    GAUNTLETS_OF_DEXTERITY),
+
+/* boots */
+BOOTS("low boots", "walking shoes",
+      0, 0,          0, 25, 2, 10,  8, 9, 0, LEATHER, HI_LEATHER, LOW_BOOTS),
+BOOTS("iron shoes", "hard shoes",
+      0, 0,          0,  7, 2, 50, 16, 8, 0, IRON, HI_METAL, IRON_SHOES),
+BOOTS("high boots", "jackboots",
+      0, 0,          0, 15, 2, 20, 12, 8, 0, LEATHER, HI_LEATHER, HIGH_BOOTS),
+/* with shuffled appearances... */
+BOOTS("speed boots", "combat boots",
+      0, 1,       FAST, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER, SPEED_BOOTS),
+BOOTS("water walking boots", "jungle boots",
+      0, 1,   WWALKING, 12, 2, 15, 50, 9, 0, LEATHER, HI_LEATHER,
+                                                        WATER_WALKING_BOOTS),
+BOOTS("jumping boots", "hiking boots",
+      0, 1,    JUMPING, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER,
+                                                        JUMPING_BOOTS),
+BOOTS("elven boots", "mud boots",
+      0, 1,    STEALTH, 12, 2, 15,  8, 9, 0, LEATHER, HI_LEATHER,
+                                                        ELVEN_BOOTS),
+BOOTS("kicking boots", "buckled boots",
+      0, 1,          0, 12, 2, 50,  8, 9, 0, IRON, CLR_BROWN,
+                                                        KICKING_BOOTS),
+        /* CLR_BROWN for same reason as gauntlets of power */
+BOOTS("fumble boots", "riding boots",
+      0, 1,   FUMBLING, 12, 2, 20, 30, 9, 0, LEATHER, HI_LEATHER,
+                                                        FUMBLE_BOOTS),
+BOOTS("levitation boots", "snow boots",
+      0, 1, LEVITATION, 12, 2, 15, 30, 9, 0, LEATHER, HI_LEATHER,
+                                                        LEVITATION_BOOTS),
+#undef HELM
+#undef CLOAK
+#undef SHIELD
+#undef GLOVES
+#undef BOOTS
+#undef ARMOR
+
+/* rings ... */
+#define RING(name,stone,power,cost,mgc,spec,mohs,metal,color,sn) \
+    OBJECT(OBJ(name, stone),                                          \
+           BITS(0, 0, spec, 0, mgc, spec, 0, 0, 0,                    \
+                HARDGEM(mohs), 0, P_NONE, metal),                     \
+           power, RING_CLASS, 0, 0, 3, cost, 0, 0, 0, 0, 15, color,sn)
+RING("adornment", "wooden",
+     ADORNED,                  100, 1, 1, 2, WOOD, HI_WOOD, RIN_ADORNMENT),
+RING("gain strength", "granite",
+     0,                        150, 1, 1, 7, MINERAL, HI_MINERAL,
+                                                            RIN_GAIN_STRENGTH),
+RING("gain constitution", "opal",
+     0,                        150, 1, 1, 7, MINERAL, HI_MINERAL,
+                                                        RIN_GAIN_CONSTITUTION),
+RING("increase accuracy", "clay",
+     0,                        150, 1, 1, 4, MINERAL, CLR_RED,
+                                                        RIN_INCREASE_ACCURACY),
+RING("increase damage", "coral",
+     0,                        150, 1, 1, 4, MINERAL, CLR_ORANGE,
+                                                        RIN_INCREASE_DAMAGE),
+RING("protection", "black onyx",
+     PROTECTION,               100, 1, 1, 7, MINERAL, CLR_BLACK,
+                                                        RIN_PROTECTION),
+        /* 'PROTECTION' intrinsic enhances MC from worn armor by +1,
+           regardless of ring's enchantment; wearing a second ring of
+           protection (or even one ring of protection combined with
+           cloak of protection) doesn't give a second MC boost */
+RING("regeneration", "moonstone",
+     REGENERATION,             200, 1, 0,  6, MINERAL, HI_MINERAL,
+                                                        RIN_REGENERATION),
+RING("searching", "tiger eye",
+     SEARCHING,                200, 1, 0,  6, GEMSTONE, CLR_BROWN,
+                                                        RIN_SEARCHING  ),
+RING("stealth", "jade",
+     STEALTH,                  100, 1, 0,  6, GEMSTONE, CLR_GREEN,
+                                                        RIN_STEALTH),
+RING("sustain ability", "bronze",
+     FIXED_ABIL,               100, 1, 0,  4, COPPER, HI_COPPER,
+                                                        RIN_SUSTAIN_ABILITY),
+RING("levitation", "agate",
+     LEVITATION,               200, 1, 0,  7, GEMSTONE, CLR_RED,
+                                                        RIN_LEVITATION),
+RING("hunger", "topaz",
+     HUNGER,                   100, 1, 0,  8, GEMSTONE, CLR_CYAN,
+                                                        RIN_HUNGER),
+RING("aggravate monster", "sapphire",
+     AGGRAVATE_MONSTER,        150, 1, 0,  9, GEMSTONE, CLR_BLUE,
+                                                        RIN_AGGRAVATE_MONSTER),
+RING("conflict", "ruby",
+     CONFLICT,                 300, 1, 0,  9, GEMSTONE, CLR_RED,
+                                                        RIN_CONFLICT),
+RING("warning", "diamond",
+     WARNING,                  100, 1, 0, 10, GEMSTONE, CLR_WHITE,
+                                                        RIN_WARNING),
+RING("poison resistance", "pearl",
+     POISON_RES,               150, 1, 0,  4, BONE, CLR_WHITE,
+                                                        RIN_POISON_RESISTANCE),
+RING("fire resistance", "iron",
+     FIRE_RES,                 200, 1, 0,  5, IRON, HI_METAL,
+                                                        RIN_FIRE_RESISTANCE),
+RING("cold resistance", "brass",
+     COLD_RES,                 150, 1, 0,  4, COPPER, HI_COPPER,
+                                                        RIN_COLD_RESISTANCE),
+RING("shock resistance", "copper",
+     SHOCK_RES,                150, 1, 0,  3, COPPER, HI_COPPER,
+                                                        RIN_SHOCK_RESISTANCE),
+RING("free action", "twisted",
+     FREE_ACTION,              200, 1, 0,  6, IRON, HI_METAL,
+                                                        RIN_FREE_ACTION),
+RING("slow digestion", "steel",
+     SLOW_DIGESTION,           200, 1, 0,  8, IRON, HI_METAL,
+                                                        RIN_SLOW_DIGESTION),
+RING("teleportation", "silver",
+     TELEPORT,                 200, 1, 0,  3, SILVER, HI_SILVER,
+                                                        RIN_TELEPORTATION),
+RING("teleport control", "gold",
+     TELEPORT_CONTROL,         300, 1, 0,  3, GOLD, HI_GOLD,
+                                                        RIN_TELEPORT_CONTROL),
+RING("polymorph", "ivory",
+     POLYMORPH,                300, 1, 0,  4, BONE, CLR_WHITE,
+                                                        RIN_POLYMORPH),
+RING("polymorph control", "emerald",
+     POLYMORPH_CONTROL,        300, 1, 0,  8, GEMSTONE, CLR_BRIGHT_GREEN,
+                                                        RIN_POLYMORPH_CONTROL),
+RING("invisibility", "wire",
+     INVIS,                    150, 1, 0,  5, IRON, HI_METAL,
+                                                        RIN_INVISIBILITY),
+RING("see invisible", "engagement",
+     SEE_INVIS,                150, 1, 0,  5, IRON, HI_METAL,
+                                                        RIN_SEE_INVISIBLE),
+RING("protection from shape changers", "shiny",
+     PROT_FROM_SHAPE_CHANGERS, 100, 1, 0,  5, IRON, CLR_BRIGHT_CYAN,
+                                               RIN_PROTECTION_FROM_SHAPE_CHAN),
+#undef RING
+
+/* amulets ... - THE Amulet comes last because it is special */
+#define AMULET(name,desc,power,prob,sn) \
+    OBJECT(OBJ(name, desc),                                            \
+           BITS(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, P_NONE, IRON),        \
+           power, AMULET_CLASS, prob, 0, 20, 150, 0, 0, 0, 0, 20, HI_METAL, sn)
+AMULET("amulet of ESP",                "circular", TELEPAT, 120,
+                                                        AMULET_OF_ESP),
+AMULET("amulet of life saving",       "spherical", LIFESAVED, 75,
+                                                        AMULET_OF_LIFE_SAVING),
+AMULET("amulet of strangulation",          "oval", STRANGLED, 115,
+                                                        AMULET_OF_STRANGULATION),
+AMULET("amulet of restful sleep",    "triangular", SLEEPY, 115,
+                                                        AMULET_OF_RESTFUL_SLEEP),
+AMULET("amulet versus poison",        "pyramidal", POISON_RES, 115,
+                                                        AMULET_VERSUS_POISON),
+AMULET("amulet of change",               "square", 0, 115,
+                                                        AMULET_OF_CHANGE),
+AMULET("amulet of unchanging",          "concave", UNCHANGING, 60,
+                                                        AMULET_OF_UNCHANGING),
+AMULET("amulet of reflection",        "hexagonal", REFLECTING, 75,
+                                                        AMULET_OF_REFLECTION),
+AMULET("amulet of magical breathing", "octagonal", MAGICAL_BREATHING, 75,
+                                                  AMULET_OF_MAGICAL_BREATHING),
+        /* +2 AC and +2 MC; +2 takes naked hero past 'warded' to 'guarded' */
+AMULET("amulet of guarding",         "perforated", PROTECTION, 75,
+                                                        AMULET_OF_GUARDING),
+        /* cubical: some descriptions are already three dimensional and
+           parallelogrammatical (real word!) would be way over the top */
+AMULET("amulet of flying",              "cubical", FLYING, 60,
+                                                        AMULET_OF_FLYING),
+/* fixed descriptions; description duplication is deliberate;
+ * fake one must come before real one because selection for
+ * description shuffling stops when a non-magic amulet is encountered
+ */
+OBJECT(OBJ("cheap plastic imitation of the Amulet of Yendor",
+           "Amulet of Yendor"),
+       BITS(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, PLASTIC),
+       0, AMULET_CLASS, 0, 0, 20, 0, 0, 0, 0, 0, 1, HI_METAL,
+                                                FAKE_AMULET_OF_YENDOR),
+OBJECT(OBJ("Amulet of Yendor", /* note: description == name */
+           "Amulet of Yendor"),
+       BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, MITHRIL),
+       0, AMULET_CLASS, 0, 0, 20, 30000, 0, 0, 0, 0, 20, HI_METAL,
+                                                AMULET_OF_YENDOR),
+#undef AMULET
+
+/* tools ... */
+/* tools with weapon characteristics come last */
+#define TOOL(name,desc,kn,mrg,mgc,chg,prob,wt,cost,mat,color,sn) \
+    OBJECT(OBJ(name, desc),                                             \
+           BITS(kn, mrg, chg, 0, mgc, chg, 0, 0, 0, 0, 0, P_NONE, mat), \
+           0, TOOL_CLASS, prob, 0, wt, cost, 0, 0, 0, 0, wt, color, sn)
+#define CONTAINER(name,desc,kn,mgc,chg,prob,wt,cost,mat,color,sn) \
+    OBJECT(OBJ(name, desc),                                             \
+           BITS(kn, 0, chg, 1, mgc, chg, 0, 0, 0, 0, 0, P_NONE, mat),   \
+           0, TOOL_CLASS, prob, 0, wt, cost, 0, 0, 0, 0, wt, color, sn)
+#define WEPTOOL(name,desc,kn,mgc,bi,prob,wt,cost,sdam,ldam,hitbon,sub,mat,clr,sn)\
+    OBJECT(OBJ(name, desc),                                             \
+           BITS(kn, 0, 1, 0, mgc, 1, 0, 0, bi, 0, hitbon, sub, mat),    \
+           0, TOOL_CLASS, prob, 0, wt, cost, sdam, ldam, hitbon, 0, wt, clr, sn)
+/* containers */
+CONTAINER("large box",       NoDes, 1, 0, 0, 40, 350,   8, WOOD, HI_WOOD,
+                                                                LARGE_BOX),
+CONTAINER("chest",           NoDes, 1, 0, 0, 35, 600,  16, WOOD, HI_WOOD,
+                                                                CHEST),
+CONTAINER("ice box",         NoDes, 1, 0, 0,  5, 900,  42, PLASTIC, CLR_WHITE,
+                                                                ICE_BOX),
+CONTAINER("sack",           "bag", 0, 0, 0, 35,  15,   2, CLOTH, HI_CLOTH,
+                                                                SACK),
+CONTAINER("oilskin sack",   "bag", 0, 0, 0,  5,  15, 100, CLOTH, HI_CLOTH,
+                                                                OILSKIN_SACK),
+CONTAINER("bag of holding", "bag", 0, 1, 0, 20,  15, 100, CLOTH, HI_CLOTH,
+                                                               BAG_OF_HOLDING),
+CONTAINER("bag of tricks",  "bag", 0, 1, 1, 20,  15, 100, CLOTH, HI_CLOTH,
+                                                                BAG_OF_TRICKS),
+#undef CONTAINER
+
+/* lock opening tools */
+TOOL("skeleton key",       "key", 0, 0, 0, 0, 80,  3, 10, IRON, HI_METAL,
+                                                                SKELETON_KEY),
+TOOL("lock pick",           NoDes, 1, 0, 0, 0, 60,  4, 20, IRON, HI_METAL,
+                                                                LOCK_PICK),
+TOOL("credit card",         NoDes, 1, 0, 0, 0, 15,  1, 10, PLASTIC, CLR_WHITE,
+                                                                CREDIT_CARD),
+/* light sources */
+TOOL("tallow candle",   "candle", 0, 1, 0, 0, 20,  2, 10, WAX, CLR_WHITE,
+                                                                TALLOW_CANDLE),
+TOOL("wax candle",      "candle", 0, 1, 0, 0,  5,  2, 20, WAX, CLR_WHITE,
+                                                                WAX_CANDLE),
+TOOL("brass lantern",       NoDes, 1, 0, 0, 0, 30, 30, 12, COPPER, CLR_YELLOW,
+                                                                BRASS_LANTERN),
+TOOL("oil lamp",          "lamp", 0, 0, 0, 0, 45, 20, 10, COPPER, CLR_YELLOW,
+                                                                OIL_LAMP),
+TOOL("magic lamp",        "lamp", 0, 0, 1, 0, 15, 20, 50, COPPER, CLR_YELLOW,
+                                                                MAGIC_LAMP),
+/* other tools */
+TOOL("expensive camera",    NoDes, 1, 0, 0, 1, 15, 12,200, PLASTIC, CLR_BLACK,
+                                                              EXPENSIVE_CAMERA),
+TOOL("mirror",   "looking glass", 0, 0, 0, 0, 45, 13, 10, GLASS, HI_SILVER,
+                                                                MIRROR),
+TOOL("crystal ball", "glass orb", 0, 0, 1, 1, 15,150, 60, GLASS, HI_GLASS,
+                                                                CRYSTAL_BALL),
+TOOL("lenses",              NoDes, 1, 0, 0, 0,  5,  3, 80, GLASS, HI_GLASS,
+                                                                LENSES),
+TOOL("blindfold",           NoDes, 1, 0, 0, 0, 50,  2, 20, CLOTH, CLR_BLACK,
+                                                                BLINDFOLD),
+TOOL("towel",               NoDes, 1, 0, 0, 0, 50,  2, 50, CLOTH, CLR_MAGENTA,
+                                                                TOWEL),
+TOOL("saddle",              NoDes, 1, 0, 0, 0,  5,200,150, LEATHER, HI_LEATHER,
+                                                                SADDLE),
+TOOL("leash",               NoDes, 1, 0, 0, 0, 65, 12, 20, LEATHER, HI_LEATHER,
+                                                                LEASH),
+TOOL("stethoscope",         NoDes, 1, 0, 0, 0, 25,  4, 75, IRON, HI_METAL,
+                                                                STETHOSCOPE),
+TOOL("tinning kit",         NoDes, 1, 0, 0, 1, 15,100, 30, IRON, HI_METAL,
+                                                                TINNING_KIT),
+TOOL("tin opener",          NoDes, 1, 0, 0, 0, 35,  4, 30, IRON, HI_METAL,
+                                                                TIN_OPENER),
+TOOL("can of grease",       NoDes, 1, 0, 0, 1, 15, 15, 20, IRON, HI_METAL,
+                                                                CAN_OF_GREASE),
+TOOL("figurine",            NoDes, 1, 0, 1, 0, 25, 50, 80, MINERAL, HI_MINERAL,
+                                                                FIGURINE),
+        /* monster type specified by obj->corpsenm */
+TOOL("magic marker",        NoDes, 1, 0, 1, 1, 15,  2, 50, PLASTIC, CLR_RED,
+                                                                MAGIC_MARKER),
+/* traps */
+TOOL("land mine",           NoDes, 1, 0, 0, 0, 0, 300,180, IRON, CLR_RED,
+                                                                LAND_MINE),
+TOOL("beartrap",            NoDes, 1, 0, 0, 0, 0, 200, 60, IRON, HI_METAL,
+                                                                BEARTRAP),
+/* instruments;
+   "If tin whistles are made out of tin, what do they make foghorns out of?" */
+TOOL("tin whistle",    "whistle", 0, 0, 0, 0,100, 3, 10, METAL, HI_METAL,
+                                                                TIN_WHISTLE),
+TOOL("magic whistle",  "whistle", 0, 0, 1, 0, 30, 3, 10, METAL, HI_METAL,
+                                                                MAGIC_WHISTLE),
+TOOL("wooden flute",     "flute", 0, 0, 0, 0,  4, 5, 12, WOOD, HI_WOOD,
+                                                                WOODEN_FLUTE),
+TOOL("magic flute",      "flute", 0, 0, 1, 1,  2, 5, 36, WOOD, HI_WOOD,
+                                                                MAGIC_FLUTE),
+TOOL("tooled horn",       "horn", 0, 0, 0, 0,  5, 18, 15, BONE, CLR_WHITE,
+                                                                TOOLED_HORN),
+TOOL("frost horn",        "horn", 0, 0, 1, 1,  2, 18, 50, BONE, CLR_WHITE,
+                                                                FROST_HORN),
+TOOL("fire horn",         "horn", 0, 0, 1, 1,  2, 18, 50, BONE, CLR_WHITE,
+                                                                FIRE_HORN),
+TOOL("horn of plenty",    "horn", 0, 0, 1, 1,  2, 18, 50, BONE, CLR_WHITE,
+                                                            HORN_OF_PLENTY),
+        /* horn, but not an instrument */
+TOOL("wooden harp",       "harp", 0, 0, 0, 0,  4, 30, 50, WOOD, HI_WOOD,
+                                                                WOODEN_HARP),
+TOOL("magic harp",        "harp", 0, 0, 1, 1,  2, 30, 50, WOOD, HI_WOOD,
+                                                                MAGIC_HARP),
+TOOL("bell",                NoDes, 1, 0, 0, 0,  2, 30, 50, COPPER, HI_COPPER,
+                                                                BELL),
+TOOL("bugle",               NoDes, 1, 0, 0, 0,  4, 10, 15, COPPER, HI_COPPER,
+                                                                BUGLE),
+TOOL("leather drum",      "drum", 0, 0, 0, 0,  4, 25, 25, LEATHER, HI_LEATHER,
+                                                                LEATHER_DRUM),
+TOOL("drum of earthquake","drum", 0, 0, 1, 1,  2, 25, 25, LEATHER, HI_LEATHER,
+                                                           DRUM_OF_EARTHQUAKE),
+/* tools useful as weapons */
+WEPTOOL("pick-axe", NoDes,
+        1, 0, 0, 20, 100,  50,  6,  3, WHACK,  P_PICK_AXE, IRON, HI_METAL,
+                                                                PICK_AXE),
+WEPTOOL("grappling hook", NoDes,
+        1, 0, 0,  5,  30,  50,  2,  6, WHACK,  P_FLAIL,    IRON, HI_METAL,
+                                                             GRAPPLING_HOOK),
+WEPTOOL("unicorn horn", NoDes,
+        1, 1, 1,  0,  20, 100, 12, 12, PIERCE, P_UNICORN_HORN,
+                                                           BONE, CLR_WHITE,
+                                                                UNICORN_HORN),
+        /* 3.4.1: unicorn horn left classified as "magic" */
+/* two unique tools;
+ * not artifacts, despite the comment which used to be here
+ */
+OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"),
+       BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, P_NONE, GOLD),
+       0, TOOL_CLASS, 0, 0, 10, 5000, 0, 0, 0, 0, 200, HI_GOLD,
+                                                    CANDELABRUM_OF_INVOCATION),
+OBJECT(OBJ("Bell of Opening", "silver bell"),
+       BITS(0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, P_NONE, SILVER),
+       0, TOOL_CLASS, 0, 0, 10, 5000, 0, 0, 0, 0, 50, HI_SILVER,
+                                                    BELL_OF_OPENING),
+#undef TOOL
+#undef WEPTOOL
+
+/* Comestibles ... */
+#define FOOD(name, prob, delay, wt, unk, tin, nutrition, color, sn)     \
+    OBJECT(OBJ(name, NoDes),                                       \
+           BITS(1, 1, unk, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, tin), 0,     \
+           FOOD_CLASS, prob, delay, wt, nutrition / 20 + 5, 0, 0, 0, 0, \
+           nutrition, color, sn)
+/* All types of food (except tins & corpses) must have a delay of at least 1.
+ * Delay on corpses is computed and is weight dependant.
+ * Domestic pets prefer tripe rations above all others.
+ * Fortune cookies can be read, using them up without ingesting them.
+ * Carrots improve your vision.
+ * +0 tins contain monster meat.
+ * +1 tins (of spinach) make you stronger (like Popeye).
+ * Meatballs/sticks/rings are only created from objects via stone to flesh.
+ */
+/* meat */
+FOOD("tripe ration",        140,  2, 10, 0, FLESH, 200, CLR_BROWN,
+                                                        TRIPE_RATION),
+FOOD("corpse",                0,  1,  0, 0, FLESH,   0, CLR_BROWN,
+                                                        CORPSE),
+FOOD("egg",                  85,  1,  1, 1, FLESH,  80, CLR_WHITE,
+                                                        EGG),
+FOOD("meatball",              0,  1,  1, 0, FLESH,   5, CLR_BROWN,
+                                                        MEATBALL),
+FOOD("meat stick",            0,  1,  1, 0, FLESH,   5, CLR_BROWN,
+                                                        MEAT_STICK),
+FOOD("huge chunk of meat",    0, 20,400, 0, FLESH,2000, CLR_BROWN,
+                                                        HUGE_CHUNK_OF_MEAT),
+/* special case because it's not mergable */
+OBJECT(OBJ("meat ring", NoDes),
+       BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FLESH),
+       0, FOOD_CLASS, 0, 1, 5, 1, 0, 0, 0, 0, 5, CLR_BROWN, MEAT_RING),
+/* pudding 'corpses' will turn into these and combine;
+   must be in same order as the pudding monsters */
+FOOD("glob of gray ooze",     0,  2, 20, 0, FLESH,  20, CLR_GRAY,
+                                                        GLOB_OF_GRAY_OOZE),
+FOOD("glob of brown pudding", 0,  2, 20, 0, FLESH,  20, CLR_BROWN,
+                                                        GLOB_OF_BROWN_PUDDING),
+FOOD("glob of green slime",   0,  2, 20, 0, FLESH,  20, CLR_GREEN,
+                                                        GLOB_OF_GREEN_SLIME),
+FOOD("glob of black pudding", 0,  2, 20, 0, FLESH,  20, CLR_BLACK,
+                                                        GLOB_OF_BLACK_PUDDING),
+
+/* fruits & veggies */
+FOOD("kelp frond",            0,  1,  1, 0, VEGGY,  30, CLR_GREEN, KELP_FROND),
+FOOD("eucalyptus leaf",       3,  1,  1, 0, VEGGY,  30, CLR_GREEN,
+                                                             EUCALYPTUS_LEAF),
+FOOD("apple",                15,  1,  2, 0, VEGGY,  50, CLR_RED, APPLE),
+FOOD("orange",               10,  1,  2, 0, VEGGY,  80, CLR_ORANGE, ORANGE),
+FOOD("pear",                 10,  1,  2, 0, VEGGY,  50, CLR_BRIGHT_GREEN,
+                                                                    PEAR),
+FOOD("melon",                10,  1,  5, 0, VEGGY, 100, CLR_BRIGHT_GREEN,
+                                                                    MELON),
+FOOD("banana",               10,  1,  2, 0, VEGGY,  80, CLR_YELLOW, BANANA),
+FOOD("carrot",               15,  1,  2, 0, VEGGY,  50, CLR_ORANGE, CARROT),
+FOOD("sprig of wolfsbane",    7,  1,  1, 0, VEGGY,  40, CLR_GREEN,
+                                                          SPRIG_OF_WOLFSBANE),
+FOOD("clove of garlic",       7,  1,  1, 0, VEGGY,  40, CLR_WHITE, CLOVE_OF_GARLIC),
+/* name of slime mold is changed based on player's OPTION=fruit:something
+   and bones data might have differently named ones from prior games */
+FOOD("slime mold",           75,  1,  5, 0, VEGGY, 250, HI_ORGANIC, SLIME_MOLD),
+
+/* people food */
+FOOD("lump of royal jelly",   0,  1,  2, 0, VEGGY, 200, CLR_YELLOW,
+                                                        LUMP_OF_ROYAL_JELLY),
+FOOD("cream pie",            25,  1, 10, 0, VEGGY, 100, CLR_WHITE, CREAM_PIE),
+FOOD("candy bar",            13,  1,  2, 0, VEGGY, 100, CLR_BROWN, CANDY_BAR),
+FOOD("fortune cookie",       55,  1,  1, 0, VEGGY,  40, CLR_YELLOW,
+                                                              FORTUNE_COOKIE),
+FOOD("pancake",              25,  2,  2, 0, VEGGY, 200, CLR_YELLOW, PANCAKE),
+FOOD("lembas wafer",         20,  2,  5, 0, VEGGY, 800, CLR_WHITE,
+                                                                LEMBAS_WAFER),
+FOOD("cram ration",          20,  3, 15, 0, VEGGY, 600, HI_ORGANIC,
+                                                                CRAM_RATION),
+FOOD("food ration",         380,  5, 20, 0, VEGGY, 800, HI_ORGANIC,
+                                                                FOOD_RATION),
+FOOD("K-ration",              0,  1, 10, 0, VEGGY, 400, HI_ORGANIC, K_RATION),
+FOOD("C-ration",              0,  1, 10, 0, VEGGY, 300, HI_ORGANIC, C_RATION),
+/* tins have type specified by obj->spe (+1 for spinach, other implies
+   flesh; negative specifies preparation method {homemade,boiled,&c})
+   and by obj->corpsenm (type of monster flesh) */
+FOOD("tin",                  75,  0, 10, 1, METAL,   0, HI_METAL, TIN),
+#undef FOOD
+
+/* potions ... */
+#define POTION(name,desc,mgc,power,prob,cost,color,sn) \
+    OBJECT(OBJ(name, desc),                                             \
+           BITS(0, 1, 0, 0, mgc, 0, 0, 0, 0, 0, 0, P_NONE, GLASS),      \
+           power, POTION_CLASS, prob, 0, 20, cost, 0, 0, 0, 0, 10, color, sn)
+POTION("gain ability",           "ruby",  1, 0, 42, 300, CLR_RED,
+                                                        POT_GAIN_ABILITY),
+POTION("restore ability",        "pink",  1, 0, 40, 100, CLR_BRIGHT_MAGENTA,
+                                                        POT_RESTORE_ABILITY),
+POTION("confusion",            "orange",  1, CONFUSION, 42, 100, CLR_ORANGE,
+                                                        POT_CONFUSION),
+POTION("blindness",            "yellow",  1, BLINDED, 40, 150, CLR_YELLOW,
+                                                        POT_BLINDNESS),
+POTION("paralysis",           "emerald",  1, 0, 42, 300, CLR_BRIGHT_GREEN,
+                                                        POT_PARALYSIS),
+POTION("speed",            "dark green",  1, FAST, 42, 200, CLR_GREEN,
+                                                        POT_SPEED),
+POTION("levitation",             "cyan",  1, LEVITATION, 42, 200, CLR_CYAN,
+                                                        POT_LEVITATION),
+POTION("hallucination",      "sky blue",  1, HALLUC, 40, 100, CLR_CYAN,
+                                                        POT_HALLUCINATION),
+POTION("invisibility", "brilliant blue",  1, INVIS, 40, 150, CLR_BRIGHT_BLUE,
+                                                        POT_INVISIBILITY),
+POTION("see invisible",       "magenta",  1, SEE_INVIS, 42, 50, CLR_MAGENTA,
+                                                        POT_SEE_INVISIBLE),
+POTION("healing",          "purple-red",  1, 0, 57, 100, CLR_MAGENTA,
+                                                        POT_HEALING),
+POTION("extra healing",          "puce",  1, 0, 47, 100, CLR_RED,
+                                                        POT_EXTRA_HEALING),
+POTION("gain level",            "milky",  1, 0, 20, 300, CLR_WHITE,
+                                                        POT_GAIN_LEVEL),
+POTION("enlightenment",        "swirly",  1, 0, 20, 200, CLR_BROWN,
+                                                        POT_ENLIGHTENMENT),
+POTION("monster detection",    "bubbly",  1, 0, 40, 150, CLR_WHITE,
+                                                        POT_MONSTER_DETECTION),
+POTION("object detection",      "smoky",  1, 0, 42, 150, CLR_GRAY,
+                                                        POT_OBJECT_DETECTION),
+POTION("gain energy",          "cloudy",  1, 0, 42, 150, CLR_WHITE,
+                                                        POT_GAIN_ENERGY),
+POTION("sleeping",       "effervescent",  1, 0, 42, 100, CLR_GRAY,
+                                                        POT_SLEEPING),
+POTION("full healing",          "black",  1, 0, 10, 200, CLR_BLACK,
+                                                        POT_FULL_HEALING),
+POTION("polymorph",            "golden",  1, 0, 10, 200, CLR_YELLOW,
+                                                        POT_POLYMORPH),
+POTION("booze",                 "brown",  0, 0, 42,  50, CLR_BROWN,
+                                                        POT_BOOZE),
+POTION("sickness",              "fizzy",  0, 0, 42,  50, CLR_CYAN,
+                                                        POT_SICKNESS),
+POTION("fruit juice",            "dark",  0, 0, 42,  50, CLR_BLACK,
+                                                        POT_FRUIT_JUICE),
+POTION("acid",                  "white",  0, 0, 10, 250, CLR_WHITE,
+                                                        POT_ACID),
+POTION("oil",                   "murky",  0, 0, 30, 250, CLR_BROWN,
+                                                        POT_OIL),
+/* fixed description
+ */
+POTION("water",                 "clear",  0, 0, 92, 100, CLR_CYAN,
+                                                        POT_WATER),
+#undef POTION
+
+/* scrolls ... */
+#define SCROLL(name,text,mgc,prob,cost,sn) \
+    OBJECT(OBJ(name, text),                                           \
+           BITS(0, 1, 0, 0, mgc, 0, 0, 0, 0, 0, 0, P_NONE, PAPER),    \
+           0, SCROLL_CLASS, prob, 0, 5, cost, 0, 0, 0, 0, 6, \
+           HI_PAPER, sn)
+SCROLL("enchant armor",              "ZELGO MER",  1,  63,  80,
+                                                        SCR_ENCHANT_ARMOR),
+SCROLL("destroy armor",         "JUYED AWK YACC",  1,  45, 100,
+                                                        SCR_DESTROY_ARMOR),
+SCROLL("confuse monster",                 "NR 9",  1,  53, 100,
+                                                        SCR_CONFUSE_MONSTER),
+SCROLL("scare monster",   "XIXAXA XOXAXA XUXAXA",  1,  35, 100,
+                                                        SCR_SCARE_MONSTER),
+SCROLL("remove curse",             "PRATYAVAYAH",  1,  65,  80,
+                                                       SCR_REMOVE_CURSE),
+SCROLL("enchant weapon",         "DAIYEN FOOELS",  1,  80,  60,
+                                                       SCR_ENCHANT_WEAPON),
+SCROLL("create monster",       "LEP GEX VEN ZEA",  1,  45, 200,
+                                                       SCR_CREATE_MONSTER),
+SCROLL("taming",                   "PRIRUTSENIE",  1,  15, 200,
+                                                       SCR_TAMING),
+SCROLL("genocide",                  "ELBIB YLOH",  1,  15, 300,
+                                                       SCR_GENOCIDE),
+SCROLL("light",                 "VERR YED HORRE",  1,  90,  50,
+                                                       SCR_LIGHT),
+SCROLL("teleportation",        "VENZAR BORGAVVE",  1,  55, 100,
+                                                       SCR_TELEPORTATION),
+SCROLL("gold detection",                 "THARR",  1,  33, 100,
+                                                       SCR_GOLD_DETECTION),
+SCROLL("food detection",               "YUM YUM",  1,  25, 100,
+                                                       SCR_FOOD_DETECTION),
+SCROLL("identify",                  "KERNOD WEL",  1, 180,  20,
+                                                       SCR_IDENTIFY),
+SCROLL("magic mapping",              "ELAM EBOW",  1,  45, 100,
+                                                       SCR_MAGIC_MAPPING),
+SCROLL("amnesia",                   "DUAM XNAHT",  1,  35, 200,
+                                                       SCR_AMNESIA),
+SCROLL("fire",                  "ANDOVA BEGARIN",  1,  30, 100,
+                                                       SCR_FIRE),
+SCROLL("earth",                          "KIRJE",  1,  18, 200,
+                                                       SCR_EARTH),
+SCROLL("punishment",            "VE FORBRYDERNE",  1,  15, 300,
+                                                       SCR_PUNISHMENT),
+SCROLL("charging",                "HACKEM MUCHE",  1,  15, 300,
+                                                       SCR_CHARGING),
+SCROLL("stinking cloud",             "VELOX NEB",  1,  15, 300,
+                                                       SCR_STINKING_CLOUD),
+    /* Extra descriptions, shuffled into use at start of new game.
+     * Code in win/share/tilemap.c depends on SCR_STINKING_CLOUD preceding
+     * these and on how many of them there are.  If a real scroll gets added
+     * after stinking cloud or the number of extra descriptions changes,
+     * tilemap.c must be modified to match.
+     */
+SCROLL(NoDes,      "FOOBIE BLETCH",  1,   0, 100, SC01),
+SCROLL(NoDes,              "TEMOV",  1,   0, 100, SC02),
+SCROLL(NoDes,         "GARVEN DEH",  1,   0, 100, SC03),
+SCROLL(NoDes,            "READ ME",  1,   0, 100, SC04),
+SCROLL(NoDes,      "ETAOIN SHRDLU",  1,   0, 100, SC05),
+SCROLL(NoDes,        "LOREM IPSUM",  1,   0, 100, SC06),
+SCROLL(NoDes,              "FNORD",  1,   0, 100, SC07), /* Illuminati */
+SCROLL(NoDes,            "KO BATE",  1,   0, 100, SC08), /* Kurd Lasswitz */
+SCROLL(NoDes,      "ABRA KA DABRA",  1,   0, 100, SC09), /* traditional incantation */
+SCROLL(NoDes,       "ASHPD SODALG",  1,   0, 100, SC10), /* Portal */
+SCROLL(NoDes,            "ZLORFIK",  1,   0, 100, SC11), /* Zak McKracken */
+SCROLL(NoDes,      "GNIK SISI VLE",  1,   0, 100, SC12), /* Zak McKracken */
+SCROLL(NoDes,    "HAPAX LEGOMENON",  1,   0, 100, SC13),
+SCROLL(NoDes,  "EIRIS SAZUN IDISI",  1,   0, 100, SC14), /* Merseburg Incantations */
+SCROLL(NoDes,    "PHOL ENDE WODAN",  1,   0, 100, SC15), /* Merseburg Incantations */
+SCROLL(NoDes,              "GHOTI",  1,   0, 100, SC16), /* pronounced as 'fish',
+                                                          George Bernard Shaw */
+SCROLL(NoDes, "MAPIRO MAHAMA DIROMAT", 1, 0, 100, SC17), /* Wizardry */
+SCROLL(NoDes,  "VAS CORP BET MANI",  1,   0, 100, SC18), /* Ultima */
+SCROLL(NoDes,            "XOR OTA",  1,   0, 100, SC19), /* Aarne Haapakoski */
+SCROLL(NoDes, "STRC PRST SKRZ KRK",  1,   0, 100, SC20), /* Czech and Slovak
+                                                             tongue-twister */
+    /* These must come last because they have special fixed descriptions.
+     */
+#ifdef MAIL_STRUCTURES
+SCROLL("mail",          "stamped",  0,   0,   0, SCR_MAIL),
+#endif
+SCROLL("blank paper", "unlabeled",  0,  28,  60, SCR_BLANK_PAPER),
+#undef SCROLL
+
+/* spellbooks ... */
+    /* Expanding beyond 52 spells would require changes in spellcasting
+     * or imposition of a limit on number of spells hero can know because
+     * they are currently assigned successive letters, a-zA-Z, when learned.
+     * [The existing spell sorting capability could conceivably be extended
+     * to enable moving spells from beyond Z to within it, bumping others
+     * out in the process, allowing more than 52 spells be known but keeping
+     * only 52 be castable at any given time.]
+     */
+#define SPELL(name,desc,sub,prob,delay,level,mgc,dir,color,sn)  \
+    OBJECT(OBJ(name, desc),                                             \
+           BITS(0, 0, 0, 0, mgc, 0, 0, 0, 0, 0, dir, sub, PAPER),       \
+           0, SPBOOK_CLASS, prob, delay, 50, level * 100,               \
+           0, 0, 0, level, 20, color, sn)
+/* Spellbook description normally refers to book covers (primarily color).
+   Parchment and vellum would never be used for such, but rather than
+   eliminate those, finagle their definitions to refer to the pages
+   rather than the cover.  They are made from animal skin (typically of
+   a goat or sheep) and books using them for pages generally need heavy
+   covers with straps or clamps to tightly close the book in order to
+   keep the pages flat.  (However, a wooden cover might itself be covered
+   by a sheet of parchment, making this become less of an exception.  Also,
+   changing the internal composition from paper to leather makes eating a
+   parchment or vellum spellbook break vegetarian conduct, as it should.) */
+#define PAPER LEATHER /* override enum for use in SPELL() expansion */
+SPELL("dig",             "parchment",
+      P_MATTER_SPELL,      20,  6, 5, 1, RAY, HI_LEATHER, SPE_DIG),
+SPELL("magic missile",   "vellum",
+      P_ATTACK_SPELL,      45,  2, 2, 1, RAY, HI_LEATHER, SPE_MAGIC_MISSILE),
+#undef PAPER /* revert to normal material */
+SPELL("fireball",        "ragged",
+      P_ATTACK_SPELL,      20,  4, 4, 1, RAY, HI_PAPER, SPE_FIREBALL),
+SPELL("cone of cold",    "dog eared",
+      P_ATTACK_SPELL,      10,  7, 4, 1, RAY, HI_PAPER, SPE_CONE_OF_COLD),
+SPELL("sleep",           "mottled",
+      P_ENCHANTMENT_SPELL, 49,  1, 1, 1, RAY, HI_PAPER, SPE_SLEEP),
+SPELL("finger of death", "stained",
+      P_ATTACK_SPELL,       5, 10, 7, 1, RAY, HI_PAPER, SPE_FINGER_OF_DEATH),
+SPELL("light",           "cloth",
+      P_DIVINATION_SPELL,  45,  1, 1, 1, NODIR, HI_CLOTH, SPE_LIGHT),
+SPELL("detect monsters", "leathery",
+      P_DIVINATION_SPELL,  43,  1, 1, 1, NODIR, HI_LEATHER,
+                                                        SPE_DETECT_MONSTERS),
+SPELL("healing",         "white",
+      P_HEALING_SPELL,     40,  2, 1, 1, IMMEDIATE, CLR_WHITE,
+                                                        SPE_HEALING),
+SPELL("knock",           "pink",
+      P_MATTER_SPELL,      35,  1, 1, 1, IMMEDIATE, CLR_BRIGHT_MAGENTA,
+                                                        SPE_KNOCK),
+SPELL("force bolt",      "red",
+      P_ATTACK_SPELL,      35,  2, 1, 1, IMMEDIATE, CLR_RED,
+                                                        SPE_FORCE_BOLT),
+SPELL("confuse monster", "orange",
+      P_ENCHANTMENT_SPELL, 30,  2, 2, 1, IMMEDIATE, CLR_ORANGE,
+                                                        SPE_CONFUSE_MONSTER),
+SPELL("cure blindness",  "yellow",
+      P_HEALING_SPELL,     25,  2, 2, 1, IMMEDIATE, CLR_YELLOW,
+                                                        SPE_CURE_BLINDNESS),
+SPELL("drain life",      "velvet",
+      P_ATTACK_SPELL,      10,  2, 2, 1, IMMEDIATE, CLR_MAGENTA,
+                                                        SPE_DRAIN_LIFE),
+SPELL("slow monster",    "light green",
+      P_ENCHANTMENT_SPELL, 30,  2, 2, 1, IMMEDIATE, CLR_BRIGHT_GREEN,
+                                                        SPE_SLOW_MONSTER),
+SPELL("wizard lock",     "dark green",
+      P_MATTER_SPELL,      30,  3, 2, 1, IMMEDIATE, CLR_GREEN,
+                                                        SPE_WIZARD_LOCK),
+SPELL("create monster",  "turquoise",
+      P_CLERIC_SPELL,      35,  3, 2, 1, NODIR, CLR_BRIGHT_CYAN,
+                                                        SPE_CREATE_MONSTER),
+SPELL("detect food",     "cyan",
+      P_DIVINATION_SPELL,  30,  3, 2, 1, NODIR, CLR_CYAN,
+                                                        SPE_DETECT_FOOD),
+SPELL("cause fear",      "light blue",
+      P_ENCHANTMENT_SPELL, 25,  3, 3, 1, NODIR, CLR_BRIGHT_BLUE,
+                                                        SPE_CAUSE_FEAR),
+SPELL("clairvoyance",    "dark blue",
+      P_DIVINATION_SPELL,  15,  3, 3, 1, NODIR, CLR_BLUE,
+                                                        SPE_CLAIRVOYANCE),
+SPELL("cure sickness",   "indigo",
+      P_HEALING_SPELL,     32,  3, 3, 1, NODIR, CLR_BLUE,
+                                                        SPE_CURE_SICKNESS),
+SPELL("charm monster",   "magenta",
+      P_ENCHANTMENT_SPELL, 20,  3, 3, 1, IMMEDIATE, CLR_MAGENTA,
+                                                        SPE_CHARM_MONSTER),
+SPELL("haste self",      "purple",
+      P_ESCAPE_SPELL,      33,  4, 3, 1, NODIR, CLR_MAGENTA,
+                                                        SPE_HASTE_SELF),
+SPELL("detect unseen",   "violet",
+      P_DIVINATION_SPELL,  20,  4, 3, 1, NODIR, CLR_MAGENTA,
+                                                        SPE_DETECT_UNSEEN),
+SPELL("levitation",      "tan",
+      P_ESCAPE_SPELL,      20,  4, 4, 1, NODIR, CLR_BROWN,
+                                                        SPE_LEVITATION),
+SPELL("extra healing",   "plaid",
+      P_HEALING_SPELL,     27,  5, 3, 1, IMMEDIATE, CLR_GREEN,
+                                                        SPE_EXTRA_HEALING),
+SPELL("restore ability", "light brown",
+      P_HEALING_SPELL,     25,  5, 4, 1, NODIR, CLR_BROWN,
+                                                        SPE_RESTORE_ABILITY),
+SPELL("invisibility",    "dark brown",
+      P_ESCAPE_SPELL,      25,  5, 4, 1, NODIR, CLR_BROWN,
+                                                        SPE_INVISIBILITY),
+SPELL("detect treasure", "gray",
+      P_DIVINATION_SPELL,  20,  5, 4, 1, NODIR, CLR_GRAY,
+                                                        SPE_DETECT_TREASURE),
+SPELL("remove curse",    "wrinkled",
+      P_CLERIC_SPELL,      25,  5, 3, 1, NODIR, HI_PAPER,
+                                                        SPE_REMOVE_CURSE),
+SPELL("magic mapping",   "dusty",
+      P_DIVINATION_SPELL,  18,  7, 5, 1, NODIR, HI_PAPER,
+                                                        SPE_MAGIC_MAPPING),
+SPELL("identify",        "bronze",
+      P_DIVINATION_SPELL,  20,  6, 3, 1, NODIR, HI_COPPER,
+                                                        SPE_IDENTIFY),
+SPELL("turn undead",     "copper",
+      P_CLERIC_SPELL,      16,  8, 6, 1, IMMEDIATE, HI_COPPER,
+                                                        SPE_TURN_UNDEAD),
+SPELL("polymorph",       "silver",
+      P_MATTER_SPELL,      10,  8, 6, 1, IMMEDIATE, HI_SILVER,
+                                                        SPE_POLYMORPH),
+SPELL("teleport away",   "gold",
+      P_ESCAPE_SPELL,      15,  6, 6, 1, IMMEDIATE, HI_GOLD,
+                                                        SPE_TELEPORT_AWAY),
+SPELL("create familiar", "glittering",
+      P_CLERIC_SPELL,      10,  7, 6, 1, NODIR, CLR_WHITE,
+                                                        SPE_CREATE_FAMILIAR),
+SPELL("cancellation",    "shining",
+      P_MATTER_SPELL,      15,  8, 7, 1, IMMEDIATE, CLR_WHITE,
+                                                        SPE_CANCELLATION),
+SPELL("protection",      "dull",
+      P_CLERIC_SPELL,      18,  3, 1, 1, NODIR, HI_PAPER,
+                                                        SPE_PROTECTION),
+SPELL("jumping",         "thin",
+      P_ESCAPE_SPELL,      20,  3, 1, 1, IMMEDIATE, HI_PAPER,
+                                                        SPE_JUMPING),
+SPELL("stone to flesh",  "thick",
+      P_HEALING_SPELL,     15,  1, 3, 1, IMMEDIATE, HI_PAPER,
+                                                        SPE_STONE_TO_FLESH),
+#if 0 /* DEFERRED */
+/* from slash'em, create a tame critter which explodes when attacking,
+   damaging adjacent creatures--friend or foe--and dying in the process */
+SPELL("flame sphere",    "canvas",
+      P_MATTER_SPELL,      20,  2, 1, 1, NODIR, CLR_BROWN,
+                                                        SPE_FLAME_SPHERE),
+SPELL("freeze sphere",   "hardcover",
+      P_MATTER_SPELL,      20,  2, 1, 1, NODIR, CLR_BROWN,
+                                                        SPE_FREEZE_SPHERE),
+#endif
+/* books with fixed descriptions
+ */
+SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER, SPE_BLANK_PAPER),
+/* tribute book for 3.6 */
+OBJECT(OBJ("novel", "paperback"),
+       BITS(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, PAPER),
+       0, SPBOOK_CLASS, 1, 0, 0, 20, 0, 0, 0, 1, 20, CLR_BRIGHT_BLUE,
+                                                        SPE_NOVEL),
+/* a special, one of a kind, spellbook */
+OBJECT(OBJ("Book of the Dead", "papyrus"),
+       BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, P_NONE, PAPER),
+       0, SPBOOK_CLASS, 0, 0, 20, 10000, 0, 0, 0, 7, 20, HI_PAPER,
+                                                        SPE_BOOK_OF_THE_DEAD),
+#undef SPELL
+
+/* wands ... */
+#define WAND(name,typ,prob,cost,mgc,dir,metal,color,sn) \
+    OBJECT(OBJ(name, typ),                                              \
+           BITS(0, 0, 1, 0, mgc, 1, 0, 0, 0, 0, dir, P_NONE, metal),    \
+           0, WAND_CLASS, prob, 0, 7, cost, 0, 0, 0, 0, 30, color, sn)
+WAND("light",           "glass", 95, 100, 1, NODIR, GLASS, HI_GLASS,
+                                                            WAN_LIGHT),
+WAND("secret door detection",
+                        "balsa", 50, 150, 1, NODIR, WOOD, HI_WOOD,
+                                                    WAN_SECRET_DOOR_DETECTION),
+WAND("enlightenment", "crystal", 15, 150, 1, NODIR, GLASS, HI_GLASS,
+                                                    WAN_ENLIGHTENMENT),
+WAND("create monster",  "maple", 45, 200, 1, NODIR, WOOD, HI_WOOD,
+                                                    WAN_CREATE_MONSTER),
+WAND("wishing",          "pine",  5, 500, 1, NODIR, WOOD, HI_WOOD,
+                                                    WAN_WISHING),
+WAND("nothing",           "oak", 25, 100, 0, IMMEDIATE, WOOD, HI_WOOD,
+                                                    WAN_NOTHING),
+WAND("striking",        "ebony", 75, 150, 1, IMMEDIATE, WOOD, HI_WOOD,
+                                                    WAN_STRIKING),
+WAND("make invisible", "marble", 45, 150, 1, IMMEDIATE, MINERAL, HI_MINERAL,
+                                                    WAN_MAKE_INVISIBLE),
+WAND("slow monster",      "tin", 50, 150, 1, IMMEDIATE, METAL, HI_METAL,
+                                                    WAN_SLOW_MONSTER),
+WAND("speed monster",   "brass", 50, 150, 1, IMMEDIATE, COPPER, HI_COPPER,
+                                                    WAN_SPEED_MONSTER),
+WAND("undead turning", "copper", 50, 150, 1, IMMEDIATE, COPPER, HI_COPPER,
+                                                    WAN_UNDEAD_TURNING),
+WAND("polymorph",      "silver", 45, 200, 1, IMMEDIATE, SILVER, HI_SILVER,
+                                                    WAN_POLYMORPH),
+WAND("cancellation", "platinum", 45, 200, 1, IMMEDIATE, PLATINUM, CLR_WHITE,
+                                                    WAN_CANCELLATION),
+WAND("teleportation", "iridium", 45, 200, 1, IMMEDIATE, METAL,
+                                     CLR_BRIGHT_CYAN, WAN_TELEPORTATION),
+WAND("opening",          "zinc", 25, 150, 1, IMMEDIATE, METAL, HI_METAL,
+                                                    WAN_OPENING),
+WAND("locking",      "aluminum", 25, 150, 1, IMMEDIATE, METAL, HI_METAL,
+                                                    WAN_LOCKING),
+WAND("probing",       "uranium", 30, 150, 1, IMMEDIATE, METAL, HI_METAL,
+                                                    WAN_PROBING),
+WAND("digging",          "iron", 55, 150, 1, RAY, IRON, HI_METAL,
+                                                    WAN_DIGGING),
+WAND("magic missile",   "steel", 50, 150, 1, RAY, IRON, HI_METAL,
+                                                    WAN_MAGIC_MISSILE),
+WAND("fire",        "hexagonal", 40, 175, 1, RAY, IRON, HI_METAL,
+                                                    WAN_FIRE),
+WAND("cold",            "short", 40, 175, 1, RAY, IRON, HI_METAL,
+                                                    WAN_COLD),
+WAND("sleep",           "runed", 50, 175, 1, RAY, IRON, HI_METAL,
+                                                    WAN_SLEEP),
+WAND("death",            "long",  5, 500, 1, RAY, IRON, HI_METAL,
+                                                    WAN_DEATH),
+WAND("lightning",      "curved", 40, 175, 1, RAY, IRON, HI_METAL,
+                                                    WAN_LIGHTNING),
+/* extra descriptions, shuffled into use at start of new game */
+WAND(NoDes,             "forked",  0, 150, 1, 0, WOOD, HI_WOOD, WAN1),
+WAND(NoDes,             "spiked",  0, 150, 1, 0, IRON, HI_METAL, WAN2),
+WAND(NoDes,            "jeweled",  0, 150, 1, 0, IRON, HI_MINERAL, WAN3),
+#undef WAND
+
+/* coins ... - so far, gold is all there is */
+#define COIN(name,prob,metal,worth,sn) \
+    OBJECT(OBJ(name, NoDes),                                         \
+           BITS(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, metal),    \
+           0, COIN_CLASS, prob, 0, 1, worth, 0, 0, 0, 0, 0, HI_GOLD, sn)
+COIN("gold piece", 1000, GOLD, 1, GOLD_PIECE),
+#undef COIN
+
+/* gems ... - includes stones and rocks but not boulders */
+#define GEM(name,desc,prob,wt,gval,nutr,mohs,glass,color,sn) \
+    OBJECT(OBJ(name, desc),                                             \
+           BITS(0, 1, 0, 0, 0, 0, 0, 0, 0,                              \
+                HARDGEM(mohs), 0, -P_SLING, glass),                     \
+           0, GEM_CLASS, prob, 0, 1, gval, 3, 3, 0, 0, nutr, color, sn)
+#define ROCK(name,desc,kn,prob,wt,gval,sdam,ldam,mgc,nutr,mohs,glass,color,sn) \
+    OBJECT(OBJ(name, desc),                                             \
+           BITS(kn, 1, 0, 0, mgc, 0, 0, 0, 0,                           \
+                HARDGEM(mohs), 0, -P_SLING, glass),                     \
+           0, GEM_CLASS, prob, 0, wt, gval, sdam, ldam, 0, 0, nutr, color, sn)
+GEM("dilithium crystal", "white",  2, 1, 4500, 15,  5, GEMSTONE, CLR_WHITE,
+                                                        DILITHIUM_CRYSTAL),
+GEM("diamond",           "white",  3, 1, 4000, 15, 10, GEMSTONE, CLR_WHITE,
+                                                        DIAMOND),
+GEM("ruby",                "red",  4, 1, 3500, 15,  9, GEMSTONE, CLR_RED,
+                                                        RUBY),
+GEM("jacinth",          "orange",  3, 1, 3250, 15,  9, GEMSTONE, CLR_ORANGE,
+                                                        JACINTH),
+GEM("sapphire",           "blue",  4, 1, 3000, 15,  9, GEMSTONE, CLR_BLUE,
+                                                        SAPPHIRE),
+GEM("black opal",        "black",  3, 1, 2500, 15,  8, GEMSTONE, CLR_BLACK,
+                                                        BLACK_OPAL),
+GEM("emerald",           "green",  5, 1, 2500, 15,  8, GEMSTONE, CLR_GREEN,
+                                                        EMERALD),
+GEM("turquoise",         "green",  6, 1, 2000, 15,  6, GEMSTONE, CLR_GREEN,
+                                                        TURQUOISE),
+GEM("citrine",          "yellow",  4, 1, 1500, 15,  6, GEMSTONE, CLR_YELLOW,
+                                                        CITRINE),
+GEM("aquamarine",        "green",  6, 1, 1500, 15,  8, GEMSTONE, CLR_GREEN,
+                                                        AQUAMARINE),
+GEM("amber",   "yellowish brown",  8, 1, 1000, 15,  2, GEMSTONE, CLR_BROWN,
+                                                        AMBER),
+GEM("topaz",   "yellowish brown", 10, 1,  900, 15,  8, GEMSTONE, CLR_BROWN,
+                                                        TOPAZ),
+GEM("jet",               "black",  6, 1,  850, 15,  7, GEMSTONE, CLR_BLACK,
+                                                        JET),
+GEM("opal",              "white", 12, 1,  800, 15,  6, GEMSTONE, CLR_WHITE,
+                                                        OPAL),
+GEM("chrysoberyl",      "yellow",  8, 1,  700, 15,  5, GEMSTONE, CLR_YELLOW,
+                                                        CHRYSOBERYL),
+GEM("garnet",              "red", 12, 1,  700, 15,  7, GEMSTONE, CLR_RED,
+                                                        GARNET),
+GEM("amethyst",         "violet", 14, 1,  600, 15,  7, GEMSTONE, CLR_MAGENTA,
+                                                        AMETHYST),
+GEM("jasper",              "red", 15, 1,  500, 15,  7, GEMSTONE, CLR_RED,
+                                                        JASPER),
+GEM("fluorite",         "violet", 15, 1,  400, 15,  4, GEMSTONE, CLR_MAGENTA,
+                                                        FLUORITE),
+GEM("obsidian",          "black",  9, 1,  200, 15,  6, GEMSTONE, CLR_BLACK,
+                                                        OBSIDIAN),
+GEM("agate",            "orange", 12, 1,  200, 15,  6, GEMSTONE, CLR_ORANGE,
+                                                        AGATE),
+GEM("jade",              "green", 10, 1,  300, 15,  6, GEMSTONE, CLR_GREEN,
+                                                        JADE),
+GEM("worthless piece of white glass", "white",
+    77, 1, 0, 6, 5, GLASS, CLR_WHITE, WORTHLESS_WHITE_GLASS),
+GEM("worthless piece of blue glass", "blue",
+    77, 1, 0, 6, 5, GLASS, CLR_BLUE, WORTHLESS_BLUE_GLASS),
+GEM("worthless piece of red glass", "red",
+    77, 1, 0, 6, 5, GLASS, CLR_RED, WORTHLESS_RED_GLASS),
+GEM("worthless piece of yellowish brown glass", "yellowish brown",
+    77, 1, 0, 6, 5, GLASS, CLR_BROWN, WORTHLESS_YELLOWISH_BROWN_GLASS),
+GEM("worthless piece of orange glass", "orange",
+    76, 1, 0, 6, 5, GLASS, CLR_ORANGE, WORTHLESS_ORANGE_GLASS),
+GEM("worthless piece of yellow glass", "yellow",
+    77, 1, 0, 6, 5, GLASS, CLR_YELLOW, WORTHLESS_YELLOW_GLASS),
+GEM("worthless piece of black glass", "black",
+    76, 1, 0, 6, 5, GLASS, CLR_BLACK, WORTHLESS_BLACK_GLASS),
+GEM("worthless piece of green glass", "green",
+    77, 1, 0, 6, 5, GLASS, CLR_GREEN, WORTHLESS_GREEN_GLASS),
+GEM("worthless piece of violet glass", "violet",
+    77, 1, 0, 6, 5, GLASS, CLR_MAGENTA, WORTHLESS_VIOLET_GLASS),
+
+/* Placement note: there is a wishable subrange for
+ * "gray stones" in the o_ranges[] array in objnam.c
+ * that is currently everything between luckstones and flint
+ * (inclusive).
+ */
+ROCK("luckstone", "gray",  0,  10,  10, 60, 3, 3, 1, 10, 7, MINERAL, CLR_GRAY,
+                                                                    LUCKSTONE),
+ROCK("loadstone", "gray",  0,  10, 500,  1, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY,
+                                                                    LOADSTONE),
+ROCK("touchstone", "gray", 0,   8,  10, 45, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY,
+                                                                    TOUCHSTONE),
+ROCK("flint", "gray",      0,  10,  10,  1, 6, 6, 0, 10, 7, MINERAL, CLR_GRAY,
+                                                                    FLINT),
+ROCK("rock", NoDes,         1, 100,  10,  0, 3, 3, 0, 10, 7, MINERAL, CLR_GRAY,
+                                                                    ROCK),
+#undef GEM
+#undef ROCK
+
+/* miscellaneous ... */
+/* Note: boulders and rocks are not normally created at random; the
+ * probabilities only come into effect when you try to polymorph them.
+ * Boulders weigh more than MAX_CARR_CAP; statues use corpsenm to take
+ * on a specific type and may act as containers (both affect weight).
+ */
+OBJECT(OBJ("boulder", NoDes),
+       BITS(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, P_NONE, MINERAL), 0,
+       ROCK_CLASS, 100, 0, 6000, 0, 20, 20, 0, 0, 2000, HI_MINERAL, BOULDER),
+OBJECT(OBJ("statue", NoDes),
+       BITS(1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, P_NONE, MINERAL), 0,
+       ROCK_CLASS, 900, 0, 2500, 0, 20, 20, 0, 0, 2500, CLR_WHITE, STATUE),
+
+OBJECT(OBJ("heavy iron ball", NoDes),
+       BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, WHACK, P_NONE, IRON), 0,
+       BALL_CLASS, 1000, 0, 480, 10, 25, 25, 0, 0, 200, HI_METAL,
+                                                            HEAVY_IRON_BALL),
+        /* +d4 when "very heavy" */
+OBJECT(OBJ("iron chain", NoDes),
+       BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, WHACK, P_NONE, IRON), 0,
+       CHAIN_CLASS, 1000, 0, 120, 0, 4, 4, 0, 0, 200, HI_METAL, IRON_CHAIN),
+        /* +1 both l & s */
+
+/* Venom is normally a transitory missile (spit by various creatures)
+ * but can be wished for in wizard mode so could occur in bones data.
+ */
+OBJECT(OBJ("splash of blinding venom", "splash of venom"),
+       BITS(0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, P_NONE, LIQUID), 0,
+       VENOM_CLASS, 500, 0, 1, 0, 0, 0, 0, 0, 0, HI_ORGANIC, BLINDING_VENOM),
+OBJECT(OBJ("splash of acid venom", "splash of venom"),
+       BITS(0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, P_NONE, LIQUID), 0,
+       VENOM_CLASS, 500, 0, 1, 0, 6, 6, 0, 0, 0, HI_ORGANIC, ACID_VENOM),
+        /* +d6 small or large */
+
+#if defined(OBJECTS_DESCR_INIT) || defined(OBJECTS_INIT)
+/* fencepost, the deadly Array Terminator -- name [1st arg] *must* be NULL */
+OBJECT(OBJ(NoDes, NoDes),
+       BITS(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, 0), 0,
+       ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+#undef BITS
+#undef COLOR_FIELD
+#endif
+
+#undef OBJ
+#undef OBJECT
+#undef HARDGEM
+#undef NoDes
+
+/*objects.c*/
index 8dd7a21fbf9a4aef2493c3c4d1762084d12a0526..f0df3bf40d6d28151162e95d094b657cac12d4f6 100644 (file)
@@ -39,7 +39,8 @@
 #define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2021"
 #define COPYRIGHT_BANNER_B \
     "         By Stichting Mathematisch Centrum and M. Stephenson."
-/* COPYRIGHT_BANNER_C is generated by makedefs into date.h */
+/* nomakedefs.copyright_banner_c is generated at runtime */
+#define COPYRIGHT_BANNER_C nomakedefs.copyright_banner_c
 #define COPYRIGHT_BANNER_D "         See license for details."
 
 /*
index 0a017c68a18b2c644fd7c8c1746c0b1a56fdfe71..22a95d2956cd3f8adfe28a39f3072a59f29bb019 100644 (file)
@@ -66,6 +66,13 @@ struct permonst {
 
 extern NEARDATA struct permonst mons[]; /* the master list of monster types */
 
+enum monnums {
+#define MONS_ENUM
+#include "monsters.h"
+#undef MONS_ENUM
+        NUMMONS
+};
+
 #define VERY_SLOW 3
 #define SLOW_SPEED 9
 #define NORMAL_SPEED 12 /* movement rates */
@@ -82,4 +89,5 @@ extern NEARDATA struct permonst mons[]; /* the master list of monster types */
 #define pmname(pm,g) ((((g) == MALE || (g) == FEMALE) && (pm)->pmnames[g]) \
                         ? (pm)->pmnames[g] : (pm)->pmnames[NEUTRAL])
 #endif
+
 #endif /* PERMONST_H */
index ff26d3e03d42965b205c5947f84ce6e84d7de507..1cb1e337f8e12f7ddb078c582c837b97da111fed 100644 (file)
@@ -8,7 +8,6 @@
 #include "prop.h"
 #include "permonst.h"
 #include "mondata.h"
-#include "pm.h"
 
 /* KMH, intrinsics patch.
  * Reorganized and rewritten for >32-bit properties.
index bc2906c83f11fad6acb9c0bc0bf76f939db9ece5..bd8ac3b703d3a3c77d2eac23b8ca1fb4eb4c1b4e 100644 (file)
@@ -12,4 +12,4 @@ graphicschk
 nhdat
 o
 nhdat*
-
+date.nmk
index 1363915ec2b923c59bde7583501cfe99aea16d5e..47eefbb34abdbac2096e9c319406b61d5fbdb20e 100644 (file)
@@ -28,6 +28,7 @@ early_init(void)
     objects_globals_init();
     monst_globals_init();
     sys_early_init();
+    runtime_info_init();
 }
 
 static void
@@ -803,6 +804,9 @@ static const struct early_opt earlyopts[] = {
     {ARG_DEBUG, "debug", 5, TRUE},
     {ARG_VERSION, "version", 4, TRUE},
     {ARG_SHOWPATHS, "showpaths", 9, FALSE},
+#ifndef NODUMPENUMS
+    {ARG_DUMPENUMS, "dumpenums", 9, FALSE},
+#endif
 #ifdef WIN32
     {ARG_WINDOWS, "windows", 4, TRUE},
 #endif
@@ -881,6 +885,12 @@ argcheck(int argc, char *argv[], enum earlyarg e_arg)
         case ARG_SHOWPATHS: {
             return 2;
         }
+#ifndef NODUMPENUMS
+        case ARG_DUMPENUMS: {
+            dump_enums();
+            return 2;
+        }
+#endif
 #ifdef WIN32
         case ARG_WINDOWS: {
             if (extended_opt) {
@@ -953,4 +963,59 @@ debug_fields(const char *opts)
 #endif
     return;
 }
+
+#ifndef NODUMPENUMS
+void
+dump_enums(void)
+{
+    int i, j;
+    enum enum_dumps {
+        monsters_enum,
+        objects_enum,
+        objects_misc_enum,
+        NUM_ENUM_DUMPS
+    };
+    static const char *titles[NUM_ENUM_DUMPS] =
+        { "monnums", "objects_nums" , "misc_object_nums" };
+    struct enum_dump {
+        int val;
+        const char *nm;
+    };
+
+#define DUMP_ENUMS
+    struct enum_dump monsdump[] = {
+#include "monsters.h"
+        { NUMMONS, "NUMMONS" },
+    };
+    struct enum_dump objdump[] = {
+#include "objects.h"
+        { NUM_OBJECTS, "NUM_OBJECTS" },
+    };
+#undef DUMP_ENUMS
+
+    struct enum_dump omdump[] = {
+            { LAST_GEM, "LAST_GEM" },
+            { NUM_GLASS_GEMS, "NUM_GLASS_GEMS" },
+            { MAXSPELL, "MAXSPELL" },
+    };
+    struct enum_dump *ed[NUM_ENUM_DUMPS] = { monsdump, objdump, omdump };
+    static const char *pfx[NUM_ENUM_DUMPS] = { "PM_", "", "" };
+    int szd[NUM_ENUM_DUMPS] = { SIZE(monsdump), SIZE(objdump), SIZE(omdump) };
+
+    for (i = 0; i < NUM_ENUM_DUMPS; ++ i) {
+        raw_printf("enum %s = {", titles[i]);
+        for (j = 0; j < szd[i]; ++j) {
+            raw_printf("    %s%s = %i%s",
+                       (j == szd[i] - 1) ? "" : pfx[i],
+                       ed[i]->nm,
+                       ed[i]->val,
+                       (j == szd[i] - 1) ? "" : ",");
+            ed[i]++;
+       }
+        raw_print("};");
+        raw_print("");
+    }
+    raw_print("");
+}
+#endif /* NODUMPENUMS */
 /*allmain.c*/
diff --git a/src/date.c b/src/date.c
new file mode 100644 (file)
index 0000000..649391f
--- /dev/null
@@ -0,0 +1,144 @@
+/* NetHack 3.7  date.c  $NHDT-Date: 1608933420 2020/12/25 21:57:00 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.17 $ */
+/* Copyright (c) Michael Allison, 2021.                           */
+/* NetHack may be freely redistributed.  See license for details. */
+
+#include "config.h"
+
+/* these are in extern.h but we don't include hack.h */
+void populate_nomakedefs(struct version_info *);
+void free_nomakedefs(void);
+
+#define Snprintf(str, size, ...) \
+    nh_snprintf(__func__, __LINE__, str, size, __VA_ARGS__)
+extern void nh_snprintf(const char *func, int line, char *str, size_t size,
+                        const char *fmt, ...);
+extern char *mdlib_version_string(char *, const char *);
+extern char *version_id_string(char *, int, const char *);
+extern char *bannerc_string(char *, int, const char *);
+extern int case_insensitive_comp(const char *, const char *);
+
+struct nomakedefs_s nomakedefs = {
+    /* https://groups.google.com/forum/#!original/
+       comp.sources.games/91SfKYg_xzI/dGnR3JnspFkJ */
+    "Tue, 28-Jul-87 13:18:57 EDT",
+    "Version 1.0, built Jul 28 13:18:57 1987.",
+    (const char *) 0,  /* git_sha */
+    (const char *) 0,  /* git_branch */
+    "1.0.0-0",
+    "NetHack Version 1.0.0-0 - last build Tue Jul 28 13:18:57 1987.",
+    0x01010000UL,
+    0x00000000UL,
+    0x00000000UL,
+    0x00000000UL,
+    0x00000000UL,
+    0x00000000UL,
+    554476737UL,
+};
+
+#if defined(__DATE__) && defined(__TIME__)
+
+#define extract_field(t,s,n,z)    \
+    do {                          \
+        for (i = 0; i < n; ++i)   \
+            t[i] = s[i + z];      \
+        t[i] = '\0';              \
+    } while (0)
+
+void
+populate_nomakedefs(struct version_info *version)
+{
+    int i;
+    char tmpbuf1[BUFSZ], tmpbuf2[BUFSZ], *strp;
+    const char *mth[] = {
+        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+    struct tm t = {0};
+    time_t timeresult;
+        /*
+         * In a cross-compiled environment, you can't execute
+         * the target binaries during the build, so we can't
+         * use makedefs to write the values of the build
+         * date and time to a file for retrieval. Not for
+         * information meaningful to the target execution
+         * environment.
+         *
+         * How can we capture the build date/time of the target
+         * binaries in such a situation?  We need to rely on the
+         * cross-compiler itself to do it for us during the
+         * cross-compile.
+         *
+         * To that end, we are going to make use of the
+         * following pre-defined preprocessor macros for this:
+         *    gcc, msvc, clang   __DATE__  "Feb 12 1996"
+         *    gcc, msvc, clang   __TIME__  "23:59:01"
+         *
+         */
+        /* if (sizeof __DATE__ + sizeof __TIME__  + sizeof "123" <
+            sizeof tmpbuf1) */
+        Snprintf(tmpbuf1, sizeof tmpbuf1, "%s %s", __DATE__, __TIME__);
+        /* "Feb 12 1996 23:59:01"
+            01234567890123456789  */
+        if ((int) strlen(tmpbuf1) == 20) {
+            extract_field(tmpbuf2, tmpbuf1, 4, 7);   /* year */
+            t.tm_year = atoi(tmpbuf2) - 1900;
+            extract_field(tmpbuf2, tmpbuf1, 3, 0);   /* mon */
+            for (i = 0; i < SIZE(mth); ++i)
+                if (!case_insensitive_comp(tmpbuf2, mth[i])) {
+                    t.tm_mon = i;
+                    break;
+                }
+            extract_field(tmpbuf2, tmpbuf1, 2, 4);   /* mday */
+            strp = tmpbuf2;
+            if (*strp == ' ')
+                strp++;
+            t.tm_mday = atoi(strp);
+            extract_field(tmpbuf2, tmpbuf1, 2, 12);  /* hour */
+            t.tm_hour = atoi(tmpbuf2);
+            extract_field(tmpbuf2, tmpbuf1, 2, 15);  /* min  */
+            t.tm_min = atoi(tmpbuf2);
+            extract_field(tmpbuf2, tmpbuf1, 2, 18);  /* sec  */
+            t.tm_sec = atoi(tmpbuf2);
+            timeresult = mktime(&t);
+            nomakedefs.build_time = (unsigned long) timeresult;
+            nomakedefs.build_date = strdup(tmpbuf1);
+        }
+
+        nomakedefs.version_number = version->incarnation;
+        nomakedefs.version_features = version->feature_set;
+#ifdef MD_IGNORED_FEATURES
+        nomakedefs.ignored_features = MD_IGNORED_FEATURES;
+#endif
+        nomakedefs.version_sanity1 = version->entity_count;
+        nomakedefs.version_sanity2 = version->struct_sizes1;
+        nomakedefs.version_sanity3 = version->struct_sizes2;
+        nomakedefs.version_string = strdup(mdlib_version_string(tmpbuf2, "."));
+        nomakedefs.version_id = strdup(version_id_string(tmpbuf2, sizeof tmpbuf2,
+                                            nomakedefs.build_date));
+        nomakedefs.copyright_banner_c = strdup(bannerc_string(
+                                                tmpbuf2, sizeof tmpbuf2,
+                                                nomakedefs.build_date));
+#ifdef NETHACK_GIT_SHA
+        nomakedefs.git_sha = strdup(NETHACK_GIT_SHA);
+#endif
+#ifdef NETHACK_GIT_BRANCH
+        nomakedefs.git_branch = strdup(NETHACK_GIT_BRANCH);
+#endif
+}
+
+void
+free_nomakedefs(void)
+{
+    if (nomakedefs.build_date)
+        free((genericptr_t) nomakedefs.build_date);
+    if (nomakedefs.version_string)
+        free((genericptr_t) nomakedefs.version_string);
+    if (nomakedefs.version_id)
+        free((genericptr_t) nomakedefs.version_id);
+    if (nomakedefs.copyright_banner_c)
+        free((genericptr_t) nomakedefs.copyright_banner_c);
+}
+
+#endif /* __DATE__ && __TIME__ */
+
+
+/*date.c*/
index f2ee39bee428c7181b60007534d25c3dceef24a0..ac9cfd6d51ecea816eb74023367660dc60ad03f6 100644 (file)
--- a/src/end.c
+++ b/src/end.c
@@ -1763,6 +1763,7 @@ nh_terminate(int status)
         dlb_cleanup();
         l_nhcore_done();
     }
+    free_nomakedefs();
 
 #ifdef VMS
     /*
index b20b53e71d37e6c46d8078c15f77512355452d26..742bc779db0e4e9ee453495cf46f0670a543afec 100644 (file)
 #endif  /* !MAKEDEFS_C */
 
 /* shorten up some lines */
-#if defined(CROSSCOMPILE_TARGET) || defined(OPTIONS_AT_RUNTIME)
 #define FOR_RUNTIME
-#endif
 
 #if defined(MAKEDEFS_C) || defined(FOR_RUNTIME)
+#include <stdarg.h>
 /* REPRODUCIBLE_BUILD will change this to TRUE */
 static boolean date_via_env = FALSE;
 
-static char *version_string(char *, const char *);
-static char *version_id_string(char *, const char *);
-static char *bannerc_string(char *, const char *);
+char *mdlib_version_string(char *, const char *);
+char *version_id_string(char *, int, const char *);
+char *bannerc_string(char *, int, const char *);
+int case_insensitive_comp(const char *, const char *);
 
 static void make_version(void);
 static char *eos(char *);
@@ -71,20 +71,17 @@ static char *mdlib_strsubst(char *, const char *, const char *);
 static int mkstemp(char *);
 #endif
 #endif
-#endif /* MAKEDEFS_C || FOR_RUNTIME */
 
-#if defined(MAKEDEFS_C) || defined(FOR_RUNTIME) || defined(WIN32) \
-    || (defined(CROSSCOMPILE_TARGET) && defined(__DATE__) && defined(__TIME__))
-static int case_insensitive_comp(const char *, const char *);
-#endif
+#endif /* MAKEDEFS_C || FOR_RUNTIME */
 
 #if !defined(MAKEDEFS_C) && defined(WIN32)
 extern int GUILaunched;
 #endif
 
-/* these two are in extern.h but we don't include hack.h */
+/* these are in extern.h but we don't include hack.h */
 void runtime_info_init(void);
 const char *do_runtime_info(int *);
+void populate_nomakedefs(struct version_info *);
 
 void build_options(void);
 static int count_and_validate_winopts(void);
@@ -92,10 +89,6 @@ static void opt_out_words(char *, int *);
 static void build_savebones_compat_string(void);
 static int idxopttext, done_runtime_opt_init_once = 0;
 #define MAXOPT 40
-#if !defined(MAKEDEFS_C) && defined(CROSSCOMPILE_TARGET) \
-    && defined(__DATE__) && defined(__TIME__)
-static char rttimebuf[MAXOPT];
-#endif
 static char *opttext[120] = { 0 };
 char optbuf[BUFSZ];
 static struct version_info version;
@@ -257,8 +250,8 @@ make_version(void)
 
 #if defined(MAKEDEFS_C) || defined(FOR_RUNTIME)
 
-static char *
-version_string(char *outbuf, const char *delim)
+char *
+mdlib_version_string(char *outbuf, const char *delim)
 {
     Sprintf(outbuf, "%d%s%d%s%d", VERSION_MAJOR, delim, VERSION_MINOR, delim,
             PATCHLEVEL);
@@ -268,8 +261,40 @@ version_string(char *outbuf, const char *delim)
     return outbuf;
 }
 
-static char *
-version_id_string(char *outbuf, const char *build_date)
+#define Snprintf(str, size, ...) \
+    nh_snprintf(__func__, __LINE__, str, size, __VA_ARGS__)
+extern void nh_snprintf(const char *func, int line, char *str, size_t size,
+                        const char *fmt, ...);
+
+#ifdef MAKEDEFS_C
+DISABLE_WARNING_FORMAT_NONLITERAL
+
+void
+nh_snprintf(const char *func UNUSED, int line UNUSED, char *str, size_t size,
+            const char *fmt, ...)
+{
+    va_list ap;
+    int n;
+
+    va_start(ap, fmt);
+#ifdef NO_VSNPRINTF
+    n = vsprintf(str, fmt, ap);
+#else
+    n = vsnprintf(str, size, fmt, ap);
+#endif
+    va_end(ap);
+
+    if (n < 0 || (size_t)n >= size) { /* is there a problem? */
+        str[size-1] = 0; /* make sure it is nul terminated */
+    }
+
+}
+
+RESTORE_WARNING_FORMAT_NONLITERAL
+#endif  /* MAKEDEFS_C */
+
+char *
+version_id_string(char *outbuf, int bufsz, const char *build_date)
 {
     char subbuf[64], versbuf[64];
     char statusbuf[64];
@@ -293,16 +318,16 @@ version_id_string(char *outbuf, const char *build_date)
     Strcpy(&subbuf[1], PORT_SUB_ID);
 #endif
 
-    Sprintf(outbuf, "%s NetHack%s Version %s%s - last %s %s.", PORT_ID,
-            subbuf, version_string(versbuf, "."), statusbuf,
+    Snprintf(outbuf, bufsz, "%s NetHack%s Version %s%s - last %s %s.", PORT_ID,
+            subbuf, mdlib_version_string(versbuf, "."), statusbuf,
             date_via_env ? "revision" : "build", build_date);
     return outbuf;
 }
 
 /* still within #if MAKDEFS_C || FOR_RUNTIME */
 
-static char *
-bannerc_string(char *outbuf, const char *build_date)
+char *
+bannerc_string(char *outbuf, int bufsz, const char *build_date)
 {
     char subbuf[64], versbuf[64];
 
@@ -319,14 +344,9 @@ bannerc_string(char *outbuf, const char *build_date)
 #endif
 #endif
 
-    Sprintf(outbuf, "         Version %s %s%s, %s %s.",
-            version_string(versbuf, "."), PORT_ID, subbuf,
-            date_via_env ? "revised" : "built", &build_date[4]);
-#if 0
-    Sprintf(outbuf, "%s NetHack%s %s Copyright 1985-%s (built %s)",
-            PORT_ID, subbuf, version_string(versbuf,"."), RELEASE_YEAR,
-            &build_date[4]);
-#endif
+    Snprintf(outbuf, bufsz, "         Version %s %s%s, %s %s.",
+            mdlib_version_string(versbuf, "."), PORT_ID, subbuf,
+            date_via_env ? "revised" : "built", build_date);
     return outbuf;
 }
 
@@ -348,27 +368,6 @@ mkstemp(char *template)
 #endif /* HAS_NO_MKSTEMP */
 #endif /* MAKEDEFS_C || FOR_RUNTIME */
 
-#if defined(MAKEDEFS_C) || defined(FOR_RUNTIME) || defined(WIN32) \
-    || (defined(CROSSCOMPILE_TARGET) && defined(__DATE__) && defined(__TIME__))
-static int
-case_insensitive_comp(const char *s1, const char *s2)
-{
-    uchar u1, u2;
-
-    for (;; s1++, s2++) {
-        u1 = (uchar) *s1;
-        if (isupper(u1))
-            u1 = tolower(u1);
-        u2 = (uchar) *s2;
-        if (isupper(u2))
-            u2 = tolower(u2);
-        if (u1 == '\0' || u1 != u2)
-            break;
-    }
-    return u1 - u2;
-}
-#endif
-
 static char *
 eos(char *str)
 {
@@ -791,103 +790,33 @@ build_options(void)
     return;
 }
 
-#if defined(__DATE__) && defined(__TIME__)
-#define extract_field(t,s,n,z)    \
-    do {                          \
-        for (i = 0; i < n; ++i)   \
-            t[i] = s[i + z];      \
-        t[i] = '\0';              \
-    } while (0)
-#endif
+int
+case_insensitive_comp(const char *s1, const char *s2)
+{
+    uchar u1, u2;
+
+    for (;; s1++, s2++) {
+        u1 = (uchar) *s1;
+        if (isupper(u1))
+            u1 = tolower(u1);
+        u2 = (uchar) *s2;
+        if (isupper(u2))
+            u2 = tolower(u2);
+        if (u1 == '\0' || u1 != u2)
+            break;
+    }
+    return u1 - u2;
+}
 
 void
 runtime_info_init(void)
 {
-#if !defined(MAKEDEFS_C) && defined(CROSSCOMPILE_TARGET) \
-    && defined(__DATE__) && defined(__TIME__)
-    int i;
-    char tmpbuf[BUFSZ], *strp;
-    const char *mth[] = {
-        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
-    struct tm t = {0};
-    time_t timeresult;
-#endif
-
     if (!done_runtime_opt_init_once) {
         done_runtime_opt_init_once = 1;
         build_savebones_compat_string();
         /* construct the current version number */
         make_version();
-#if !defined(MAKEDEFS_C) && defined(CROSSCOMPILE_TARGET)
-#if defined(__DATE__) && defined(__TIME__)
-        /*
-         * In a cross-compiled environment, you can't execute
-         * the target binaries during the build, so we can't
-         * use makedefs to write the values of the build
-         * date and time to a file for retrieval. Not for
-         * information meaningful to the target execution
-         * environment.
-         *
-         * How can we capture the build date/time of the target
-         * binaries in such a situation?  We need to rely on the
-         * cross-compiler itself to do it for us during the
-         * cross-compile.
-         *
-         * To that end, we are going to make use of the
-         * following pre-defined preprocessor macros for this:
-         *    gcc, msvc, clang   __DATE__  "Feb 12 1996"
-         *    gcc, msvc, clang   __TIME__  "23:59:01"
-         *
-         */
-        if (sizeof __DATE__ + sizeof __TIME__  + sizeof "123" <
-            sizeof rttimebuf)
-            Sprintf(rttimebuf, "%s %s", __DATE__, __TIME__);
-        /* "Feb 12 1996 23:59:01"
-            01234567890123456789  */
-        if ((int) strlen(rttimebuf) == 20) {
-            extract_field(tmpbuf, rttimebuf, 4, 7);   /* year */
-            t.tm_year = atoi(tmpbuf) - 1900;
-            extract_field(tmpbuf, rttimebuf, 3, 0);   /* mon */
-            for (i = 0; i < SIZE(mth); ++i)
-                if (!case_insensitive_comp(tmpbuf, mth[i])) {
-                    t.tm_mon = i;
-                    break;
-                }
-            extract_field(tmpbuf, rttimebuf, 2, 4);   /* mday */
-            strp = tmpbuf;
-            if (*strp == ' ')
-                strp++;
-            t.tm_mday = atoi(strp);
-            extract_field(tmpbuf, rttimebuf, 2, 12);  /* hour */
-            t.tm_hour = atoi(tmpbuf);
-            extract_field(tmpbuf, rttimebuf, 2, 15);  /* min  */
-            t.tm_min = atoi(tmpbuf);
-            extract_field(tmpbuf, rttimebuf, 2, 18);  /* sec  */
-            t.tm_sec = atoi(tmpbuf);
-            timeresult = mktime(&t);
-            BUILD_TIME = (unsigned long) timeresult;
-            BUILD_DATE = rttimebuf;
-       }
-#endif /* __DATE__ && __TIME__ */
-        VERSION_NUMBER = version.incarnation;
-        VERSION_FEATURES = version.feature_set;
-#ifdef MD_IGNORED_FEATURES
-        IGNORED_FEATURES = MD_IGNORED_FEATURES;
-#endif
-        VERSION_SANITY1 = version.entity_count;
-        VERSION_SANITY2 = version.struct_sizes1;
-        VERSION_SANITY3 = version.struct_sizes2;
-        VERSION_STRING = strdup(version_string(tmpbuf, "."));
-        VERSION_ID = strdup(version_id_string(tmpbuf, BUILD_DATE));
-        COPYRIGHT_BANNER_C = strdup(bannerc_string(tmpbuf, BUILD_DATE));
-#ifdef NETHACK_HOST_GIT_SHA
-        NETHACK_GIT_SHA = strdup(NETHACK_HOST_GIT_SHA);
-#endif
-#ifdef NETHACK_HOST_GIT_BRANCH
-        NETHACK_GIT_BRANCH = strdup(NETHACK_HOST_GIT_BRANCH);
-#endif
-#endif /* !MAKEDEFS_C  && CROSSCOMPILE_TARGET */
+        populate_nomakedefs(&version);          /* date.c */
         idxopttext = 0;
         build_options();
     }
@@ -904,7 +833,7 @@ do_runtime_info(int *rtcontext)
         if (*rtcontext >= 0 && *rtcontext < (MAXOPT - 1)) {
             retval = opttext[*rtcontext];
             *rtcontext += 1;
-       }
+        }
     return retval;
 }
 
index e0a70ad724d5347ffbc12c75a399b1fd5e4ee46d..6bdb9ad5c360ab28042a542834b228125e9d6382 100644 (file)
@@ -7,6 +7,18 @@
 #include "permonst.h"
 #include "sym.h"
 
+#ifdef C
+#undef C
+#endif
+#ifdef TEXTCOLOR
+#include "color.h"
+#define C(color) color
+#define HI_DOMESTIC CLR_WHITE /* use for player + friendlies */
+#define HI_LORD CLR_MAGENTA
+#else
+#define C(color)
+#endif
+
 #define NO_ATTK    \
     {              \
         0, 0, 0, 0 \
@@ -15,8 +27,6 @@
 #define WT_ELF 800
 #define WT_DRAGON 4500
 
-/* caveat: in other source files, C('X') is used to convert 'X' into '^X' but
-   here is it used to make color values be conditionally present or absent */
 #ifdef C
 #undef C
 #endif
 #define C(color)
 #endif
 
-/*
- *      Entry Format:   (from permonst.h)
- *
- *      name, symbol (S_* defines),
- *      base monster level, move rate, armor class, magic resistance,
- *      alignment, creation/geno flags (G_* defines),
- *      6 * attack structs ( type , damage-type, # dice, # sides ),
- *      weight (WT_* defines), nutritional value, extension length,
- *      sounds made (MS_* defines), physical size (MZ_* defines),
- *      resistances, resistances conferred (both MR_* defines),
- *      3 * flag bitmaps (M1_*, M2_*, and M3_* defines respectively),
- *      difficulty, symbol color (C(x) macro).
- *
- *      The difficulty was generated in separate array monstr[] with
- *      values calculated by makedefs, but has been moved into mons[]
- *      since it rarely changes.  If a new monster is added or an old
- *      one undergoes significant change, 'makedefs -m' can be used to
- *      create a dummy monstr.c containing the calculated difficulty
- *      (of everything in mons[], not just any new or changed ones),
- *      then the value(s) can be plugged in here and monstr.c deleted.
- *      [Note that some monsters might warrant manually calculated
- *      difficulty, on a case by case basis, instead of blindly using
- *      the default value produced by makedefs.  Or fix the algoritm
- *      used by makedefs to generate a more appropriate value....]
- *
- *      TODO:  difficulty is closely releated to level; its field ought
- *      to be moved sooner in the permonst struct so that it can become
- *      part of LVL() instead of remaining an orphan near the end.
- */
-#define MON(nam, \
-            sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, col) \
-    {                                                                   \
-        { (const char *) 0, (const char *) 0, nam },                    \
-        sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col)  \
+#define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, col, bn) \
+    {                                                                      \
+        {(const char *) 0, (const char *) 0, nam}, \
+        sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col)   \
     }
-#define MON3(namm, namf, namn, \
-            sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, col) \
-    {                                                                   \
-        { namm, namf, namn },                                           \
-        sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col)  \
+
+#define MON3(namm, namf, namn, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, col, bn) \
+    {                                                                      \
+        {namm, namf, namn}, \
+        sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col)   \
     }
-/* LVL() and SIZ() collect several fields to cut down on number of args for
- * MON()/MON3().  Some pre-processors limit function-like macros to 15
- * parameters (possibly only pre-ANSI ones these days).
+/* LVL() and SIZ() collect several fields to cut down on number of args
+ * for MON()
  */
 #define LVL(lvl, mov, ac, mr, aln) lvl, mov, ac, mr, aln
 #define SIZ(wt, nut, snd, siz) wt, nut, snd, siz
-/* ATTK() and A() are to avoid braces and commas within args to MON().
- *      For AT_BREA attacks, '# sides' is ignored; 6 is used for most
- *      damage types, 25 for sleep, not applicable for death or poison.
- */
+/* ATTK() and A() are to avoid braces and commas within args to MON() */
 #define ATTK(at, ad, n, d) \
     {                      \
         at, ad, n, d       \
         a1, a2, a3, a4, a5, a6    \
     }
 
-/*
- *      Rule #1:        monsters of a given class are contiguous in the
- *                      mons[] array.
- *
- *      Rule #2:        monsters of a given class are presented in ascending
- *                      order of strength.
- *
- *      Rule #3:        monster frequency is included in the geno mask;
- *                      the frequency can be from 0 to 7.  0's will also
- *                      be skipped during generation.
- *
- *      Rule #4:        monster subclasses (e.g. giants) should be kept
- *                      together, unless it violates Rule 2.  NOGEN monsters
- *                      won't violate Rule 2.
- *
- * Guidelines for color assignment:
- *
- *      * Use the same color for all `growth stages' of a monster (ex.
- *        little dog/big dog, baby naga/full-grown naga.
- *
- *      * Use colors given in names wherever possible. If the class has `real'
- *        members with strong color associations, use those.
- *
- *      * Favor `cool' colors for cold-resistant monsters, `warm' ones for
- *        fire-resistant ones.
- *
- *      * Try to reserve purple (magenta) for powerful `ruler' monsters (queen
- *        bee, kobold lord, &c.).
- *
- *      * Subject to all these constraints, try to use color to make as many
- *        distinctions as the / command (that is, within a monster letter
- *        distinct names should map to distinct colors).
- *
- * The aim in assigning colors is to be consistent enough so a player can
- * become `intuitive' about them, deducing some or all of these rules
- * unconsciously. Use your common sense.
- */
-
-#ifndef SPLITMON_2
-NEARDATA struct permonst mons_init[] = {
-    /*
-     * ants
-     */
-    MON("giant ant", S_ANT, LVL(2, 18, 3, 0, 0), (G_GENO | G_SGROUP | 3),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(10, 10, MS_SILENT, MZ_TINY), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE, 0,
-        4, CLR_BROWN),
-    MON("killer bee", S_ANT, LVL(1, 18, -1, 0, 0), (G_GENO | G_LGROUP | 2),
-        A(ATTK(AT_STNG, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON,
-        M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_POIS, M2_HOSTILE | M2_FEMALE, 0,
-        5, CLR_YELLOW),
-    MON("soldier ant", S_ANT, LVL(3, 18, 3, 0, 0), (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_DRST, 3, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(20, 5, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON,
-        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE,
-        M2_HOSTILE, 0, 6, CLR_BLUE),
-    MON("fire ant", S_ANT, LVL(3, 18, 3, 10, 0), (G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_FIRE, 2, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(30, 10, MS_SILENT, MZ_TINY), MR_FIRE, MR_FIRE,
-        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE,
-        M3_INFRAVISIBLE, 6, CLR_RED),
-    MON("giant beetle", S_ANT, LVL(5, 6, 4, 0, 0), (G_GENO | 3),
-        A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(200, 50, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON,
-        M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE, 0,
-        6, CLR_BLACK),
-    MON("queen bee", S_ANT, LVL(9, 24, -4, 0, 0), (G_GENO | G_NOGEN),
-        A(ATTK(AT_STNG, AD_DRST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON,
-        M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_OVIPAROUS | M1_POIS,
-        M2_HOSTILE | M2_FEMALE | M2_PRINCE, 0, 12, HI_LORD),
-    /*
-     * blobs
-     */
-    MON("acid blob", S_BLOB, LVL(1, 3, 8, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_NONE, AD_ACID, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(30, 10, MS_SILENT, MZ_TINY),
-        MR_SLEEP | MR_POISON | MR_ACID | MR_STONE, MR_STONE,
-        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_ACID,
-        M2_WANDER | M2_NEUTER, 0, 2, CLR_GREEN),
-    MON("quivering blob", S_BLOB, LVL(5, 1, 8, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_TUCH, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(200, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, MR_POISON,
-        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS,
-        M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 6, CLR_WHITE),
-    MON("gelatinous cube", S_BLOB, LVL(6, 6, 8, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_TUCH, AD_PLYS, 2, 4), ATTK(AT_NONE, AD_PLYS, 1, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 150, MS_SILENT, MZ_LARGE),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_ACID
-            | MR_STONE,
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP,
-        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_OMNIVORE
-            | M1_ACID,
-        M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 8, CLR_CYAN),
-    /*
-     * cockatrice
-     */
-    MON("chickatrice", S_COCKATRICE, LVL(4, 4, 8, 30, 0),
-        (G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 2), ATTK(AT_TUCH, AD_STON, 0, 0),
-          ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(10, 10, MS_HISS, MZ_TINY), MR_POISON | MR_STONE,
-        MR_POISON | MR_STONE, M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE,
-        M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN),
-    MON("cockatrice", S_COCKATRICE, LVL(5, 6, 6, 30, 0), (G_GENO | 5),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_TUCH, AD_STON, 0, 0),
-          ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_STONE,
-        MR_POISON | MR_STONE,
-        M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE,
-        M3_INFRAVISIBLE, 8, CLR_YELLOW),
-    MON("pyrolisk", S_COCKATRICE, LVL(6, 6, 6, 30, 0), (G_GENO | 1),
-        A(ATTK(AT_GAZE, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_FIRE,
-        MR_POISON | MR_FIRE,
-        M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE,
-        M3_INFRAVISIBLE, 8, CLR_RED),
-    /*
-     * dogs & other canines
-     */
-    MON("jackal", S_DOG, LVL(0, 12, 7, 0, 0), (G_GENO | G_SGROUP | 3),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        1, CLR_BROWN),
-    MON("fox", S_DOG, LVL(0, 15, 7, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        1, CLR_RED),
-    MON("coyote", S_DOG, LVL(1, 12, 7, 0, 0), (G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        2, CLR_BROWN),
-    MON("werejackal", S_DOG, LVL(2, 12, 7, 10, -7), (G_NOGEN | G_NOCORPSE),
-        A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(300, 250, MS_BARK, MZ_SMALL), MR_POISON, 0,
-        M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE,
-        M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN),
-    MON("little dog", S_DOG, LVL(2, 18, 6, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(150, 150, MS_BARK, MZ_SMALL), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE,
-        3, HI_DOMESTIC),
-    MON("dingo", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        5, CLR_YELLOW),
-    MON("dog", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE,
-        5, HI_DOMESTIC),
-    MON("large dog", S_DOG, LVL(6, 15, 4, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(800, 250, MS_BARK, MZ_MEDIUM), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("wolf", S_DOG, LVL(5, 12, 4, 0, 0), (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 250, MS_BARK, MZ_MEDIUM), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        6, CLR_BROWN),
-    MON("werewolf", S_DOG, LVL(5, 12, 4, 20, -7), (G_NOGEN | G_NOCORPSE),
-        A(ATTK(AT_BITE, AD_WERE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 250, MS_BARK, MZ_MEDIUM), MR_POISON, 0,
-        M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE,
-        M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN),
-    MON("winter wolf cub", S_DOG, LVL(5, 12, 4, 0, -5),
-        (G_NOHELL | G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_BREA, AD_COLD, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(250, 200, MS_BARK, MZ_SMALL), MR_COLD, MR_COLD,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 7, CLR_CYAN),
-    MON("warg", S_DOG, LVL(7, 12, 4, 0, -5), (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(850, 350, MS_BARK, MZ_MEDIUM), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        8, CLR_BROWN),
-    MON("winter wolf", S_DOG, LVL(7, 12, 4, 20, 0), (G_NOHELL | G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_COLD, 2, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(700, 300, MS_BARK, MZ_LARGE), MR_COLD, MR_COLD,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, 0,
-        9, CLR_CYAN),
-    MON("hell hound pup", S_DOG, LVL(7, 12, 4, 20, -5),
-        (G_HELL | G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(200, 200, MS_BARK, MZ_SMALL), MR_FIRE, MR_FIRE,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        9, CLR_RED),
-    MON("hell hound", S_DOG, LVL(12, 14, 2, 20, 0), (G_HELL | G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BREA, AD_FIRE, 3, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 300, MS_BARK, MZ_MEDIUM), MR_FIRE, MR_FIRE,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG,
-        M3_INFRAVISIBLE, 14, CLR_RED),
-#ifdef CHARON
-    MON("Cerberus", S_DOG, LVL(12, 10, 2, 20, -7),
-        (G_NOGEN | G_UNIQ | G_HELL),
-        A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 3, 6),
-          ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1000, 350, MS_BARK, MZ_LARGE), MR_FIRE, MR_FIRE,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
-        M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_MALE,
-        M3_INFRAVISIBLE, 14, CLR_RED),
-#endif
-    /*
-     * eyes
-     */
-    MON("gas spore", S_EYE, LVL(1, 3, 10, 0, 0), (G_NOCORPSE | G_GENO | 1),
-        A(ATTK(AT_BOOM, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0,
-        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS,
-        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GRAY),
-    MON("floating eye", S_EYE, LVL(2, 1, 9, 10, 0), (G_GENO | 5),
-        A(ATTK(AT_NONE, AD_PLYS, 0, 70), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0,
-        M1_FLY | M1_AMPHIBIOUS | M1_NOLIMBS | M1_NOHEAD | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 3, CLR_BLUE),
-    MON("freezing sphere", S_EYE, LVL(6, 13, 4, 0, 0),
-        (G_NOCORPSE | G_NOHELL | G_GENO | 2),
-        A(ATTK(AT_EXPL, AD_COLD, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, MR_COLD,
-        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
-            | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_WHITE),
-    MON("flaming sphere", S_EYE, LVL(6, 13, 4, 0, 0),
-        (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_FIRE, 4, 6), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_FIRE, MR_FIRE,
-        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
-            | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_RED),
-    MON("shocking sphere", S_EYE, LVL(6, 13, 4, 0, 0),
-        (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_ELEC, 4, 6), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_ELEC, MR_ELEC,
-        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
-            | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 10, HI_ZAP),
-#if 0 /* not yet implemented */
-    MON("beholder", S_EYE,
-        LVL(6, 3, 4, 0, -10), (G_GENO | 2),
-        A(ATTK(AT_GAZE, AD_SLOW, 0, 0), ATTK(AT_GAZE, AD_SLEE, 2,25),
-          ATTK(AT_GAZE, AD_DISN, 0, 0), ATTK(AT_GAZE, AD_STON, 0, 0),
-          ATTK(AT_GAZE, AD_CNCL, 2, 4), ATTK(AT_BITE, AD_PHYS, 2, 4)),
-        SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, 0,
-        M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS,
-        M2_NOPOLY | M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 13, CLR_BROWN),
-#endif
-    /*
-     * felines
-     */
-    MON("kitten", S_FELINE, LVL(2, 18, 6, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(150, 150, MS_MEW, MZ_SMALL), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER | M2_DOMESTIC,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_DOMESTIC),
-    MON("housecat", S_FELINE, LVL(4, 16, 5, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(200, 200, MS_MEW, MZ_SMALL), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_DOMESTIC),
-    MON("jaguar", S_FELINE, LVL(4, 15, 6, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BROWN),
-    MON("lynx", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 300, MS_GROWL, MZ_SMALL), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_CYAN),
-    MON("panther", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
-          ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BLACK),
-    MON("large cat", S_FELINE, LVL(6, 15, 4, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(250, 250, MS_MEW, MZ_SMALL), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 7, HI_DOMESTIC),
-    MON("tiger", S_FELINE, LVL(6, 12, 6, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4),
-          ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_YELLOW),
-    MON("displacer beast", S_FELINE, LVL(12, 12, -10, 0, -3), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_CLAW, AD_PHYS, 4, 4),
-          ATTK(AT_BITE, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(750, 400, MS_GROWL, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 14, CLR_BLUE),
-    /*
-     * gremlins and gargoyles
-     */
-    MON("gremlin", S_GREMLIN, LVL(5, 12, 2, 25, -9), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
-          ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_CURS, 0, 0), NO_ATTK,
-          NO_ATTK),
-        SIZ(100, 20, MS_LAUGH, MZ_SMALL), MR_POISON, MR_POISON,
-        M1_SWIM | M1_HUMANOID | M1_POIS, M2_STALK, M3_INFRAVISIBLE,
-        8, CLR_GREEN),
-    MON("gargoyle", S_GREMLIN, LVL(6, 10, -4, 0, -9), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6),
-          ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1000, 200, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE,
-        M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS, M2_HOSTILE | M2_STRONG,
-        0, 8, CLR_BROWN),
-    MON("winged gargoyle", S_GREMLIN, LVL(9, 15, -2, 0, -12), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6),
-          ATTK(AT_BITE, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1200, 300, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE,
-        M1_FLY | M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS | M1_OVIPAROUS,
-        M2_LORD | M2_HOSTILE | M2_STRONG | M2_MAGIC, 0, 11, HI_LORD),
-    /*
-     * humanoids
-     */
-    MON("hobbit", S_HUMANOID, LVL(1, 9, 10, 0, 6), (G_GENO | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 200, MS_HUMANOID, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_GREEN),
-    MON("dwarf", S_HUMANOID, LVL(2, 6, 10, 10, 4), (G_GENO | 3),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_DWARF | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED),
-    MON("bugbear", S_HUMANOID, LVL(3, 9, 5, 0, -6), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1250, 250, MS_GROWL, MZ_LARGE), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN),
-    MON3("dwarf lord", "dwarf lady", "dwarf leader",
-        S_HUMANOID, LVL(4, 6, 10, 10, 5), (G_GENO | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
-        M2_DWARF | M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BLUE),
-    MON3("dwarf king", "dwarf queen", "dwarf ruler",
-        S_HUMANOID, LVL(6, 6, 10, 20, 6), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
-        M2_DWARF | M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS
-            | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 8, HI_LORD),
-    MON("mind flayer", S_HUMANOID, LVL(9, 12, 5, 90, -8), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_TENT, AD_DRIN, 2, 1),
-          ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), NO_ATTK,
-          NO_ATTK),
-        SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE,
-        M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_MAGENTA),
-    MON("master mind flayer", S_HUMANOID, LVL(13, 12, 0, 90, -8),
-        (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TENT, AD_DRIN, 2, 1),
-          ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1),
-          ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1)),
-        SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE,
-        M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_MAGENTA),
-    /*
-     * imps & other minor demons/devils
-     */
-    MON("manes", S_IMP, LVL(1, 3, 7, 0, -7),
-        (G_GENO | G_LGROUP | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
-          ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, 0, M1_POIS,
-        M2_HOSTILE | M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED),
-    MON("homunculus", S_IMP, LVL(2, 12, 6, 10, -7), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_SLEE, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(60, 100, MS_SILENT, MZ_TINY), MR_SLEEP | MR_POISON,
-        MR_SLEEP | MR_POISON, M1_FLY | M1_POIS, M2_STALK,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_GREEN),
-    MON("imp", S_IMP, LVL(3, 12, 2, 20, -7), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(20, 10, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER | M2_STALK,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED),
-    MON("lemure", S_IMP, LVL(3, 3, 7, 0, -7),
-        (G_HELL | G_GENO | G_LGROUP | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(150, 100, MS_SILENT, MZ_MEDIUM), MR_SLEEP | MR_POISON, MR_SLEEP,
-        M1_POIS | M1_REGEN, M2_HOSTILE | M2_WANDER | M2_STALK | M2_NEUTER,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN),
-    MON("quasit", S_IMP, LVL(3, 15, 2, 20, -7), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_DRDX, 1, 2), ATTK(AT_CLAW, AD_DRDX, 1, 2),
-          ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(200, 200, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_REGEN,
-        M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BLUE),
-    MON("tengu", S_IMP, LVL(6, 13, 5, 30, 7), (G_GENO | 3),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(300, 200, MS_SQAWK, MZ_SMALL), MR_POISON, MR_POISON,
-        M1_TPORT | M1_TPORT_CNTRL, M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION,
-        7, CLR_CYAN),
-    /*
-     * jellies
-     */
-    MON("blue jelly", S_JELLY, LVL(4, 0, 8, 10, 0), (G_GENO | 2),
-        A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_COLD | MR_POISON,
-        MR_COLD | MR_POISON,
-        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 5, CLR_BLUE),
-    MON("spotted jelly", S_JELLY, LVL(5, 0, 8, 10, 0), (G_GENO | 1),
-        A(ATTK(AT_NONE, AD_ACID, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0,
-        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_ACID | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 6, CLR_GREEN),
-    MON("ochre jelly", S_JELLY, LVL(6, 3, 8, 20, 0), (G_GENO | 2),
-        A(ATTK(AT_ENGL, AD_ACID, 3, 6), ATTK(AT_NONE, AD_ACID, 3, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0,
-        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_ACID | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 8, CLR_BROWN),
-    /*
-     * kobolds
-     */
-    MON("kobold", S_KOBOLD, LVL(0, 6, 10, 0, -2), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(400, 100, MS_ORC, MZ_SMALL), MR_POISON, 0,
-        M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_BROWN),
-    MON("large kobold", S_KOBOLD, LVL(1, 6, 10, 0, -3), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0,
-        M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_RED),
-    MON3("kobold lord", "kobold lady", "kobold leader",
-        S_KOBOLD, LVL(2, 6, 10, 0, -4), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 200, MS_ORC, MZ_SMALL), MR_POISON, 0,
-        M1_HUMANOID | M1_POIS | M1_OMNIVORE,
-        M2_HOSTILE | M2_LORD | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_LORD),
-    MON("kobold shaman", S_KOBOLD, LVL(2, 6, 6, 10, -4), (G_GENO | 1),
-        A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0,
-        M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_MAGIC,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 4, HI_ZAP),
-    /*
-     * leprechauns
-     */
-    MON("leprechaun", S_LEPRECHAUN, LVL(5, 15, 8, 20, 0), (G_GENO | 4),
-        A(ATTK(AT_CLAW, AD_SGLD, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(60, 30, MS_LAUGH, MZ_TINY), 0, 0, M1_HUMANOID | M1_TPORT,
-        M2_HOSTILE | M2_GREEDY, M3_INFRAVISIBLE, 4, CLR_GREEN),
-    /*
-     * mimics
-     */
-    MON("small mimic", S_MIMIC, LVL(7, 3, 7, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(300, 200, MS_SILENT, MZ_MEDIUM), MR_ACID, 0,
-        M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL | M1_NOEYES
-            | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE | M1_CARNIVORE,
-        M2_HOSTILE, 0, 8, CLR_BROWN),
-    MON("large mimic", S_MIMIC, LVL(8, 3, 7, 10, 0), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_STCK, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(600, 400, MS_SILENT, MZ_LARGE), MR_ACID, 0,
-        M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL
-            | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG, 0, 9, CLR_RED),
-    MON("giant mimic", S_MIMIC, LVL(9, 3, 7, 20, 0), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_STCK, 3, 6), ATTK(AT_CLAW, AD_STCK, 3, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(800, 500, MS_SILENT, MZ_LARGE), MR_ACID, 0,
-        M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL
-            | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG, 0, 11, HI_LORD),
-    /*
-     * nymphs
-     */
-    MON("wood nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT,
-        M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_GREEN),
-    MON("water nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_TPORT | M1_SWIM, M2_HOSTILE | M2_FEMALE | M2_COLLECT,
-        M3_INFRAVISIBLE, 5, CLR_BLUE),
-    MON("mountain nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT,
-        M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_BROWN),
-    /*
-     * orcs
-     */
-    MON("goblin", S_ORC, LVL(0, 6, 10, 0, -3), (G_GENO | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(400, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_ORC | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_GRAY),
-    MON("hobgoblin", S_ORC, LVL(1, 9, 10, 0, -4), (G_GENO | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_ORC | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION,
-        3, CLR_BROWN),
-    /* plain "orc" for zombie corpses only; not created at random
-     */
-    MON("orc", S_ORC, LVL(1, 9, 10, 0, -3), (G_GENO | G_NOGEN | G_LGROUP),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(850, 150, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED),
-    MON("hill orc", S_ORC, LVL(2, 9, 10, 0, -4), (G_GENO | G_LGROUP | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_YELLOW),
-    MON("Mordor orc", S_ORC, LVL(3, 5, 10, 0, -5), (G_GENO | G_LGROUP | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1200, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLUE),
-    MON("Uruk-hai", S_ORC, LVL(3, 7, 10, 0, -4), (G_GENO | G_LGROUP | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1300, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLACK),
-    MON("orc shaman", S_ORC, LVL(3, 9, 5, 10, -5), (G_GENO | 1),
-        A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1000, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP),
-    MON("orc-captain", S_ORC, LVL(5, 5, 10, 0, -5), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1350, 350, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 7, HI_LORD),
-    /*
-     * piercers
-     */
-    MON("rock piercer", S_PIERCER, LVL(3, 1, 3, 0, 0), (G_GENO | 4),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(200, 200, MS_SILENT, MZ_SMALL), 0, 0,
-        M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE
-            | M1_NOTAKE,
-        M2_HOSTILE, 0, 4, CLR_GRAY),
-    MON("iron piercer", S_PIERCER, LVL(5, 1, 0, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(400, 300, MS_SILENT, MZ_MEDIUM), 0, 0,
-        M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE
-            | M1_NOTAKE,
-        M2_HOSTILE, 0, 6, CLR_CYAN),
-    MON("glass piercer", S_PIERCER, LVL(7, 1, 0, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(400, 300, MS_SILENT, MZ_MEDIUM), MR_ACID, 0,
-        M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE
-            | M1_NOTAKE,
-        M2_HOSTILE, 0, 9, CLR_WHITE),
-    /*
-     * quadrupeds
-     */
-    MON("rothe", S_QUADRUPED, LVL(2, 9, 7, 0, 0), (G_GENO | G_SGROUP | 4),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3),
-          ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(400, 100, MS_MOO, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        4, CLR_BROWN),
-    MON("mumak", S_QUADRUPED, LVL(5, 9, 0, 0, -2), (G_GENO | 1),
-        A(ATTK(AT_BUTT, AD_PHYS, 4, 12), ATTK(AT_BITE, AD_PHYS, 2, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2500, 500, MS_TRUMPET, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
-        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 7, CLR_GRAY),
-    MON("leocrotta", S_QUADRUPED, LVL(6, 18, 4, 10, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6),
-          ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1200, 500, MS_IMITATE, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE | M2_STRONG,
-        M3_INFRAVISIBLE, 8, CLR_RED),
-    MON("wumpus", S_QUADRUPED, LVL(8, 3, 2, 10, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(2500, 500, MS_BURBLE, MZ_LARGE), 0, 0,
-        M1_CLING | M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE,
-        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 9, CLR_CYAN),
-    MON("titanothere", S_QUADRUPED, LVL(12, 12, 6, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(2650, 650, MS_SILENT, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
-        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 13, CLR_GRAY),
-    MON("baluchitherium", S_QUADRUPED, LVL(14, 12, 5, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 5, 4), ATTK(AT_CLAW, AD_PHYS, 5, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(3800, 800, MS_SILENT, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
-        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 15, CLR_GRAY),
-    MON("mastodon", S_QUADRUPED, LVL(20, 12, 5, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BUTT, AD_PHYS, 4, 8), ATTK(AT_BUTT, AD_PHYS, 4, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(3800, 800, MS_TRUMPET, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
-        M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_BLACK),
-    /*
-     * rodents
-     */
-    MON("sewer rat", S_RODENT, LVL(0, 12, 7, 0, 0), (G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(20, 12, MS_SQEEK, MZ_TINY), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        1, CLR_BROWN),
-    MON("giant rat", S_RODENT, LVL(1, 10, 7, 0, 0), (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(30, 30, MS_SQEEK, MZ_TINY), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
-        2, CLR_BROWN),
-    MON("rabid rat", S_RODENT, LVL(2, 12, 6, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_DRCO, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(30, 5, MS_SQEEK, MZ_TINY), MR_POISON, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE,
-        M3_INFRAVISIBLE, 4, CLR_BROWN),
-    MON("wererat", S_RODENT, LVL(2, 12, 6, 10, -7), (G_NOGEN | G_NOCORPSE),
-        A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(40, 30, MS_SQEEK, MZ_TINY), MR_POISON, 0,
-        M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE,
-        M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN),
-    MON("rock mole", S_RODENT, LVL(3, 3, 0, 20, 0), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(30, 30, MS_SILENT, MZ_SMALL), 0, 0,
-        M1_TUNNEL | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE,
-        M2_HOSTILE | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE,
-        4, CLR_GRAY),
-    MON("woodchuck", S_RODENT, LVL(3, 3, 0, 20, 0), (G_NOGEN | G_GENO),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(30, 30, MS_SILENT, MZ_SMALL), 0, 0,
-        M1_TUNNEL /*LOGGING*/ | M1_ANIMAL | M1_NOHANDS | M1_SWIM
-            | M1_HERBIVORE,
-        /* In reality, they tunnel instead of cutting lumber.  Oh, well. */
-        M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN),
-    /*
-     * spiders & scorpions (keep webmaker() in sync if new critters are added)
-     */
-    MON("cave spider", S_SPIDER, LVL(1, 12, 3, 0, 0), (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON,
-        M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE,
-        M2_HOSTILE, 0, 3, CLR_GRAY),
-    MON("centipede", S_SPIDER, LVL(2, 4, 3, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON,
-        M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE,
-        M2_HOSTILE, 0, 4, CLR_YELLOW),
-    MON("giant spider", S_SPIDER, LVL(5, 15, 4, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(200, 100, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON,
-        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG, 0, 7, CLR_MAGENTA),
-    MON("scorpion", S_SPIDER, LVL(5, 15, 3, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2),
-          ATTK(AT_STNG, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(50, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON,
-        M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS
-            | M1_CARNIVORE,
-        M2_HOSTILE, 0, 8, CLR_RED),
-    /*
-     * trappers, lurkers, &c
-     */
-    MON("lurker above", S_TRAPPER, LVL(10, 3, 3, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_ENGL, AD_DGST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0,
-        M1_HIDE | M1_FLY | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STALK | M2_STRONG, 0, 12, CLR_GRAY),
-    MON("trapper", S_TRAPPER, LVL(12, 3, 3, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_ENGL, AD_DGST, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0,
-        M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STALK | M2_STRONG, 0, 14, CLR_GREEN),
-    /*
-     * unicorns and horses
-     */
-    MON("pony", S_UNICORN, LVL(3, 16, 6, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1300, 250, MS_NEIGH, MZ_MEDIUM), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE,
-        M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 4, CLR_BROWN),
-    MON("white unicorn", S_UNICORN, LVL(4, 24, 2, 70, 7), (G_GENO | 2),
-        A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON,
-        M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS,
-        M3_INFRAVISIBLE, 6, CLR_WHITE),
-    MON("gray unicorn", S_UNICORN, LVL(4, 24, 2, 70, 0), (G_GENO | 1),
-        A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON,
-        M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS,
-        M3_INFRAVISIBLE, 6, CLR_GRAY),
-    MON("black unicorn", S_UNICORN, LVL(4, 24, 2, 70, -7), (G_GENO | 1),
-        A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON,
-        M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS,
-        M3_INFRAVISIBLE, 6, CLR_BLACK),
-    MON("horse", S_UNICORN, LVL(5, 20, 5, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_KICK, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1500, 300, MS_NEIGH, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE,
-        M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 7, CLR_BROWN),
-    MON("warhorse", S_UNICORN, LVL(7, 24, 4, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_KICK, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_PHYS, 1, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1800, 350, MS_NEIGH, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE,
-        M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 9, CLR_BROWN),
-    /*
-     * vortices
-     */
-    MON("fog cloud", S_VORTEX, LVL(3, 1, 0, 0, 0), (G_GENO | G_NOCORPSE | 2),
-        A(ATTK(AT_ENGL, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_AMORPHOUS | M1_UNSOLID,
-        M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY),
-    MON("dust vortex", S_VORTEX, LVL(4, 20, 2, 30, 0),
-        (G_GENO | G_NOCORPSE | 2), A(ATTK(AT_ENGL, AD_BLND, 2, 8), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS,
-        M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN),
-    MON("ice vortex", S_VORTEX, LVL(5, 20, 2, 30, 0),
-        (G_NOHELL | G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_ENGL, AD_COLD, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_HUGE),
-        MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS,
-        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 7, CLR_CYAN),
-    MON("energy vortex", S_VORTEX, LVL(6, 20, 2, 30, 0),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_ENGL, AD_ELEC, 1, 6), ATTK(AT_ENGL, AD_DREN, 2, 6),
-          ATTK(AT_NONE, AD_ELEC, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_HUGE),
-        MR_ELEC | MR_SLEEP | MR_DISINT | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_UNSOLID,
-        M2_HOSTILE | M2_NEUTER, 0, 9, HI_ZAP),
-    MON("steam vortex", S_VORTEX, LVL(7, 22, 2, 30, 0),
-        (G_HELL | G_GENO | G_NOCORPSE | 2),
-        A(ATTK(AT_ENGL, AD_FIRE, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_HUGE),
-        MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_UNSOLID,
-        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_BLUE),
-    MON("fire vortex", S_VORTEX, LVL(8, 22, 2, 30, 0),
-        (G_HELL | G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_ENGL, AD_FIRE, 1, 10), ATTK(AT_NONE, AD_FIRE, 0, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_HUGE),
-        MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_UNSOLID,
-        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW),
-    /*
-     * worms
-     */
-    MON("baby long worm", S_WORM, LVL(5, 3, 5, 0, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE | M1_NOTAKE,
-        M2_HOSTILE, 0, 6, CLR_BROWN),
-    MON("baby purple worm", S_WORM, LVL(8, 3, 5, 0, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE, M2_HOSTILE, 0,
-        9, CLR_MAGENTA),
-    MON("long worm", S_WORM, LVL(9, 3, 5, 10, 0), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_SILENT, MZ_GIGANTIC), 0, 0,
-        M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE
-            | M1_NOTAKE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 10, CLR_BROWN),
-    MON("purple worm", S_WORM, LVL(15, 9, 6, 20, 0), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_ENGL, AD_DGST, 1, 10),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2700, 700, MS_SILENT, MZ_GIGANTIC), 0, 0,
-        M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 17, CLR_MAGENTA),
-    /*
-     * xan, &c
-     */
-    MON("grid bug", S_XAN, LVL(0, 12, 9, 0, 0),
-        (G_GENO | G_SGROUP | G_NOCORPSE | 3),
-        A(ATTK(AT_BITE, AD_ELEC, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(15, 10, MS_BUZZ, MZ_TINY), MR_ELEC | MR_POISON, 0, M1_ANIMAL,
-        M2_HOSTILE, M3_INFRAVISIBLE, 1, CLR_MAGENTA),
-    MON("xan", S_XAN, LVL(7, 18, -4, 0, 0), (G_GENO | 3),
-        A(ATTK(AT_STNG, AD_LEGS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(300, 300, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON,
-        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS, M2_HOSTILE,
-        M3_INFRAVISIBLE, 9, CLR_RED),
-    /*
-     * lights
-     */
-    MON("yellow light", S_LIGHT, LVL(3, 15, 0, 0, 0),
-        (G_NOCORPSE | G_GENO | 4), A(ATTK(AT_EXPL, AD_BLND, 10, 20), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_SMALL),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_SLEEP | MR_POISON
-            | MR_ACID | MR_STONE,
-        0, M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS
-               | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 5, CLR_YELLOW),
-    MON("black light", S_LIGHT, LVL(5, 15, 0, 0, 0),
-        (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_HALU, 10, 12), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_SMALL),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_SLEEP | MR_POISON
-            | MR_ACID | MR_STONE,
-        0,
-        M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS
-            | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_SEE_INVIS | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 7, CLR_BLACK),
-    /*
-     * zruty
-     */
-    MON("zruty", S_ZRUTY, LVL(9, 8, 3, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4),
-          ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1200, 600, MS_SILENT, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG,
-        M3_INFRAVISIBLE, 11, CLR_BROWN),
-    /*
-     * Angels and other lawful minions
-     */
-    MON("couatl", S_ANGEL, LVL(8, 10, 5, 30, 7),
-        (G_NOHELL | G_SGROUP | G_NOCORPSE | 1),
-        A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_BITE, AD_PHYS, 1, 3),
-          ATTK(AT_HUGS, AD_WRAP, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(900, 400, MS_HISS, MZ_LARGE), MR_POISON, 0,
-        M1_FLY | M1_NOHANDS | M1_SLITHY | M1_POIS,
-        M2_MINION | M2_STALK | M2_STRONG | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_GREEN),
-    MON("Aleax", S_ANGEL, LVL(10, 8, 0, 30, 7), (G_NOHELL | G_NOCORPSE | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
-          ATTK(AT_KICK, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_IMITATE, MZ_HUMAN),
-        MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0,
-        M1_HUMANOID | M1_SEE_INVIS,
-        M2_MINION | M2_STALK | M2_NASTY | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_YELLOW),
-    /* Angels start with the emin extension attached, and usually have
-       the isminion flag set; however, non-minion Angels can be tamed
-       and will switch to edog (guardian Angel is handled specially and
-       always sticks with emin) */
-    MON("Angel", S_ANGEL, LVL(14, 10, -4, 55, 12),
-        (G_NOHELL | G_NOCORPSE | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN),
-        MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0,
-        M1_FLY | M1_HUMANOID | M1_SEE_INVIS,
-        M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_WHITE),
-    /* the AD&D Monster Manual depicts ki-rin as very similar to unicorns
-       except that they fly (without wings) and can cast spells */
-    MON("ki-rin", S_ANGEL, LVL(16, 18, -5, 90, 15),
-        (G_NOHELL | G_NOCORPSE | 1),
-        A(ATTK(AT_KICK, AD_PHYS, 2, 4), ATTK(AT_KICK, AD_PHYS, 2, 4),
-          ATTK(AT_BUTT, AD_PHYS, 3, 6), ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SPELL, MZ_LARGE), MR_POISON, 0,
-        M1_FLY | M1_NOHANDS | M1_SEE_INVIS,
-        M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 21, HI_GOLD),
-    MON("Archon", S_ANGEL, LVL(19, 16, -6, 80, 15),
-        (G_NOHELL | G_NOCORPSE | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          ATTK(AT_GAZE, AD_BLND, 2, 6), ATTK(AT_CLAW, AD_PHYS, 1, 8),
-          ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_CUSS, MZ_LARGE),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0,
-        M1_FLY | M1_HUMANOID | M1_SEE_INVIS | M1_REGEN,
-        M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD
-            | M2_COLLECT | M2_MAGIC,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 26, HI_LORD),
-    /*
-     * Bats
-     */
-    MON("bat", S_BAT, LVL(0, 22, 8, 0, 0), (G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(20, 20, MS_SQEEK, MZ_TINY), 0, 0,
-        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER,
-        M3_INFRAVISIBLE, 2, CLR_BROWN),
-    MON("giant bat", S_BAT, LVL(2, 22, 7, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(30, 30, MS_SQEEK, MZ_SMALL), 0, 0,
-        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
-        M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 3, CLR_RED),
-    MON("raven", S_BAT, LVL(4, 20, 6, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_BLND, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(40, 20, MS_SQAWK, MZ_SMALL), 0, 0,
-        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
-        M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 6, CLR_BLACK),
-    MON("vampire bat", S_BAT, LVL(5, 20, 6, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRST, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(30, 20, MS_SQEEK, MZ_SMALL), MR_SLEEP | MR_POISON, 0,
-        M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_REGEN | M1_OMNIVORE,
-        M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BLACK),
-    /*
-     * Centaurs
-     */
-    MON("plains centaur", S_CENTAUR, LVL(4, 18, 4, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2500, 500, MS_HUMANOID, MZ_LARGE), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT,
-        M3_INFRAVISIBLE, 6, CLR_BROWN),
-    MON("forest centaur", S_CENTAUR, LVL(5, 18, 3, 10, -1), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2550, 600, MS_HUMANOID, MZ_LARGE), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT,
-        M3_INFRAVISIBLE, 8, CLR_GREEN),
-    MON("mountain centaur", S_CENTAUR, LVL(6, 20, 2, 10, -3), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_KICK, AD_PHYS, 1, 6),
-          ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2550, 500, MS_HUMANOID, MZ_LARGE), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT,
-        M3_INFRAVISIBLE, 9, CLR_CYAN),
-    /*
-     * Dragons
-     */
-    /* The order of the dragons is VERY IMPORTANT.  Quite a few
-     * pieces of code depend on gray being first and yellow being last.
-     * The code also depends on the *order* being the same as that for
-     * dragon scale mail and dragon scales in objects.c.  [Also,
-     * 'tilemap' assumes that shimmering dragon follows silver dragon.]
-     *
-     * Adult dragons are all lawful or chaotic; baby dragons are all
-     * neutral.  This affects monster generation on some special levels.
-     * Baby dragons cannot confer intrinsics, to avoid polyself/egg abuse.
-     *
-     * As reptiles, dragons are cold-blooded and thus aren't seen with
-     * infravision.  Red and gold dragons (also Chromatic Dragon) are
-     * the exceptions because they breathe fire.
-     */
-    MON("baby gray dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GRAY),
-    MON("baby gold dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, M3_INFRAVISIBLE,
-        13, HI_GOLD),
-    MON("baby silver dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, DRAGON_SILVER),
-#if 0 /* DEFERRED */
-    /* [see "shimmering dragon" below] */
-    MON("baby shimmering dragon", S_DRAGON,
-        LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_CYAN),
-#endif
-    MON("baby red dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_FIRE, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, M3_INFRAVISIBLE,
-        13, CLR_RED),
-    MON("baby white dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_COLD, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_WHITE),
-    MON("baby orange dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_SLEEP, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_ORANGE),
-    MON("baby black dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_DISINT, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLACK),
-    MON("baby blue dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ELEC, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLUE),
-    MON("baby green dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_POISON, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_POIS,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GREEN),
-    MON("baby yellow dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ACID | MR_STONE, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_ACID,
-        M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_YELLOW),
-    MON("gray dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        0, 20, CLR_GRAY),
-    MON("gold dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_FIRE, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          NO_ATTK, NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_FIRE, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        M3_INFRAVISIBLE, 20, HI_GOLD),
-    MON("silver dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_COLD, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        0, 20, DRAGON_SILVER),
-#if 0 /* DEFERRED */
-    /* shimmering scales/scale-mail would confer displacement when worn by
-       the hero, so shimmering dragon ought to be displaced (hero who can
-       see one might misjudge its location) but monster displacement hasn't
-       been implemented so we don't include it */
-    MON("shimmering dragon", S_DRAGON,
-        LVL(15, 9, -1, 20, 4), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          NO_ATTK, NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-          | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        0, 20, CLR_CYAN),
-#endif
-    MON("red dragon", S_DRAGON, LVL(15, 9, -1, 20, -4), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_FIRE, 6, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_FIRE, MR_FIRE,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        M3_INFRAVISIBLE, 20, CLR_RED),
-    MON("white dragon", S_DRAGON, LVL(15, 9, -1, 20, -5), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_COLD, MR_COLD,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        0, 20, CLR_WHITE),
-    MON("orange dragon", S_DRAGON, LVL(15, 9, -1, 20, 5), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_SLEE, 4, 25), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_SLEEP, MR_SLEEP,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        0, 20, CLR_ORANGE),
-    /* disintegration breath is actually all or nothing, not 1d255 */
-    MON("black dragon", S_DRAGON, LVL(15, 9, -1, 20, -6), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_DISN, 1, 255), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_DISINT, MR_DISINT,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        0, 20, CLR_BLACK),
-    MON("blue dragon", S_DRAGON, LVL(15, 9, -1, 20, -7), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_ELEC, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_ELEC, MR_ELEC,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-            | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        0, 20, CLR_BLUE),
-    MON("green dragon", S_DRAGON, LVL(15, 9, -1, 20, 6), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_DRST, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_POISON, MR_POISON,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
-            | M1_CARNIVORE | M1_POIS,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        0, 20, CLR_GREEN),
-    MON("yellow dragon", S_DRAGON, LVL(15, 9, -1, 20, 7), (G_GENO | 1),
-        A(ATTK(AT_BREA, AD_ACID, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_ACID | MR_STONE,
-        MR_STONE, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS
-                      | M1_OVIPAROUS | M1_CARNIVORE | M1_ACID,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        0, 20, CLR_YELLOW),
-    /*
-     * Elementals
-     */
-    MON("stalker", S_ELEMENTAL, LVL(8, 12, 3, 0, 0), (G_GENO | 3),
-        A(ATTK(AT_CLAW, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(900, 400, MS_SILENT, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_FLY | M1_SEE_INVIS,
-        M2_WANDER | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION,
-        9, CLR_WHITE),
-    MON("air elemental", S_ELEMENTAL, LVL(8, 36, 2, 30, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_ENGL, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0,
-        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS
-            | M1_UNSOLID | M1_FLY,
-        M2_STRONG | M2_NEUTER, 0, 10, CLR_CYAN),
-    MON("fire elemental", S_ELEMENTAL, LVL(8, 12, 2, 30, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_FIRE, 3, 6), ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_FIRE | MR_POISON | MR_STONE, 0,
-        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS
-            | M1_UNSOLID | M1_FLY | M1_NOTAKE,
-        M2_STRONG | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW),
-    MON("earth elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(2500, 0, MS_SILENT, MZ_HUGE),
-        MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0,
-        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS
-            | M1_WALLWALK | M1_THICK_HIDE,
-        M2_STRONG | M2_NEUTER, 0, 10, CLR_BROWN),
-    MON("water elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(2500, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0,
-        M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS
-            | M1_UNSOLID | M1_AMPHIBIOUS | M1_SWIM,
-        M2_STRONG | M2_NEUTER, 0, 10, CLR_BLUE),
-    /*
-     * Fungi
-     */
-    MON("lichen", S_FUNGUS, LVL(0, 1, 9, 0, 0), (G_GENO | 4),
-        A(ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(20, 200, MS_SILENT, MZ_SMALL), 0, 0,
-        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
-            | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 1, CLR_BRIGHT_GREEN),
-    MON("brown mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_COLD | MR_POISON,
-        MR_COLD | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS
-                                 | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_BROWN),
-    MON("yellow mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_NONE, AD_STUN, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON,
-        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
-            | M1_POIS | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_YELLOW),
-    MON("green mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_NONE, AD_ACID, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_ACID | MR_STONE, MR_STONE,
-        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
-            | M1_ACID | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GREEN),
-    MON("red mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_FIRE | MR_POISON,
-        MR_FIRE | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS
-                                 | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 2, CLR_RED),
-    MON("shrieker", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 1),
-        A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(100, 100, MS_SHRIEK, MZ_SMALL), MR_POISON, MR_POISON,
-        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
-            | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 2, CLR_MAGENTA),
-    MON("violet fungus", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_TUCH, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON,
-        M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
-            | M1_NOTAKE,
-        M2_HOSTILE | M2_NEUTER, 0, 5, CLR_MAGENTA),
-    /*
-     * Gnomes
-     */
-    MON("gnome", S_GNOME, LVL(1, 6, 10, 4, 0), (G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(650, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_GNOME | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION,
-        3, CLR_BROWN),
-    MON3("gnome lord", "gnome lady", "gnome leader",
-        S_GNOME, LVL(3, 8, 10, 4, 0), (G_GENO | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_GNOME | M2_LORD | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_BLUE),
-    MON("gnomish wizard", S_GNOME, LVL(3, 10, 4, 10, 0), (G_GENO | 1),
-        A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_GNOME | M2_MAGIC, M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP),
-    MON3("gnome king", "gnome queen", "gnome ruler",
-        S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(750, 150, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_GNOME | M2_PRINCE | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 6, HI_LORD),
-#ifdef SPLITMON_1
-};
-#endif
-#endif /* !SPLITMON_2 */
-
-/* horrible kludge alert:
- * This is a compiler-specific kludge to allow the compilation of monst.o in
- * two pieces, by defining first SPLITMON_1 and then SPLITMON_2. The
- * resulting assembler files (monst1.s and monst2.s) are then run through
- * sed to change local symbols, concatenated together, and assembled to
- * produce monst.o. THIS ONLY WORKS WITH THE ATARI GCC, and should only
- * be done if you don't have enough memory to compile monst.o the "normal"
- * way.  --ERS
- */
-
-#ifndef SPLITMON_1
-#ifdef SPLITMON_2
-struct permonst _mons2[] = {
-#endif
-    /*
-     * giant Humanoids
-     */
-    MON("giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_GENO | G_NOGEN | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
-        M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT
-            | M2_JEWELS,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_RED),
-    MON("stone giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
-        M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT
-            | M2_JEWELS,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY),
-    MON("hill giant", S_GIANT, LVL(8, 10, 6, 0, -2), (G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(2200, 700, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
-        M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT
-            | M2_JEWELS,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_CYAN),
-    MON("fire giant", S_GIANT, LVL(9, 12, 4, 5, 2), (G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_FIRE, MR_FIRE,
-        M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW
-                                        | M2_NASTY | M2_COLLECT | M2_JEWELS,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_YELLOW),
-    MON("frost giant", S_GIANT, LVL(10, 12, 3, 10, -3),
-        (G_NOHELL | G_GENO | G_SGROUP | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_COLD, MR_COLD,
-        M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW
-                                        | M2_NASTY | M2_COLLECT | M2_JEWELS,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_WHITE),
-    MON("ettin", S_GIANT, LVL(10, 12, 3, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1700, 500, MS_GRUNT, MZ_HUGE), 0, 0,
-        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_BROWN),
-    MON("storm giant", S_GIANT, LVL(16, 12, 3, 10, -3),
-        (G_GENO | G_SGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK,
-                                   NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_ELEC, MR_ELEC,
-        M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW
-                                        | M2_NASTY | M2_COLLECT | M2_JEWELS,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_BLUE),
-    MON("titan", S_GIANT, LVL(16, 18, -3, 70, 9), (1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2300, 900, MS_SPELL, MZ_HUGE), 0, 0,
-        M1_FLY | M1_HUMANOID | M1_OMNIVORE,
-        M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_MAGIC,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_MAGENTA),
-    MON("minotaur", S_GIANT, LVL(15, 15, 6, 0, 0), (G_GENO | G_NOGEN),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10),
-          ATTK(AT_BUTT, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1500, 700, MS_MOO, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE | M3_INFRAVISION,
-        17, CLR_BROWN),
-    /*
-     * Invisible
-     * S_invisible=='I' is a visual marker for all invisible monsters
-     * and must be not be used for any specific monster types.  Long
-     * time 'invisible stalker' was changed to 'stalker', an Elemental.
-     */
-
-    /*
-     * Jabberwock
-     */
-    /* the illustration from _Through_the_Looking_Glass_
-       depicts hands as well as wings */
-    MON("jabberwock", S_JABBERWOCK, LVL(15, 12, -2, 50, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_PHYS, 2, 10),
-          ATTK(AT_CLAW, AD_PHYS, 2, 10), ATTK(AT_CLAW, AD_PHYS, 2, 10),
-          NO_ATTK, NO_ATTK),
-        SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_FLY | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE,
-        18, CLR_ORANGE),
-#if 0 /* DEFERRED */
-    MON("vorpal jabberwock", S_JABBERWOCK,
-        LVL(20, 12, -2, 50, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 3, 10), ATTK(AT_BITE, AD_PHYS, 3, 10),
-          ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10),
-          NO_ATTK, NO_ATTK),
-        SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_FLY | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE,
-        25, HI_LORD),
-#endif
-    /*
-     * Kops
-     */
-    MON("Keystone Kop", S_KOP, LVL(1, 6, 10, 10, 9),
-        (G_GENO | G_LGROUP | G_NOGEN),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID,
-        M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_MALE | M2_COLLECT,
-        M3_INFRAVISIBLE, 3, CLR_BLUE),
-    MON("Kop Sergeant", S_KOP, LVL(2, 8, 10, 10, 10),
-        (G_GENO | G_SGROUP | G_NOGEN),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID,
-        M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT,
-        M3_INFRAVISIBLE, 4, CLR_BLUE),
-    MON("Kop Lieutenant", S_KOP, LVL(3, 10, 10, 20, 11), (G_GENO | G_NOGEN),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID,
-        M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT,
-        M3_INFRAVISIBLE, 5, CLR_CYAN),
-    MON("Kop Kaptain", S_KOP, LVL(4, 12, 10, 20, 12), (G_GENO | G_NOGEN),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID,
-        M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT,
-        M3_INFRAVISIBLE, 6, HI_LORD),
-    /*
-     * Liches
-     */
-    MON("lich", S_LICH, LVL(11, 6, 0, 30, -9), (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_TUCH, AD_COLD, 1, 10), ATTK(AT_MAGC, AD_SPEL, 0, 0),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
-        MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
-        M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 14, CLR_BROWN),
-    MON("demilich", S_LICH, LVL(14, 9, -2, 60, -12),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_TUCH, AD_COLD, 3, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
-        MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
-        M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 18, CLR_RED),
-    MON("master lich", S_LICH, LVL(17, 9, -4, 90, -15),
-        (G_HELL | G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_TUCH, AD_COLD, 3, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN),
-        MR_FIRE | MR_COLD | MR_SLEEP | MR_POISON, MR_FIRE | MR_COLD,
-        M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
-        M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION,
-        21, HI_LORD),
-    MON("arch-lich", S_LICH, LVL(25, 9, -6, 90, -15),
-        (G_HELL | G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_TUCH, AD_COLD, 5, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN),
-        MR_FIRE | MR_COLD | MR_SLEEP | MR_ELEC | MR_POISON, MR_FIRE | MR_COLD,
-        M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
-        M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION,
-        29, HI_LORD),
-    /*
-     * Mummies
-     */
-    MON("kobold mummy", S_MUMMY, LVL(3, 8, 6, 20, -2),
-        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 4, CLR_BROWN),
-    MON("gnome mummy", S_MUMMY, LVL(4, 10, 6, 20, -3),
-        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_HOSTILE | M2_GNOME, M3_INFRAVISION, 5, CLR_RED),
-    MON("orc mummy", S_MUMMY, LVL(5, 10, 5, 20, -4),
-        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_HOSTILE | M2_ORC | M2_GREEDY | M2_JEWELS,
-        M3_INFRAVISION, 6, CLR_GRAY),
-    MON("dwarf mummy", S_MUMMY, LVL(5, 10, 5, 20, -4),
-        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_HOSTILE | M2_DWARF | M2_GREEDY | M2_JEWELS,
-        M3_INFRAVISION, 6, CLR_RED),
-    MON("elf mummy", S_MUMMY, LVL(6, 12, 4, 30, -5),
-        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
-        0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_HOSTILE | M2_ELF, M3_INFRAVISION, 7, CLR_GREEN),
-    MON("human mummy", S_MUMMY, LVL(6, 12, 4, 30, -5),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN),
-        MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 7, CLR_GRAY),
-    MON("ettin mummy", S_MUMMY, LVL(7, 12, 4, 30, -6),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_BLUE),
-    MON("giant mummy", S_MUMMY, LVL(8, 14, 3, 30, -7),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_HOSTILE | M2_GIANT | M2_STRONG | M2_JEWELS,
-        M3_INFRAVISION, 10, CLR_CYAN),
-    /*
-     * Nagas
-     */
-    MON("red naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_FIRE | MR_POISON,
-        MR_FIRE | MR_POISON,
-        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE,
-        M2_STRONG, M3_INFRAVISIBLE, 4, CLR_RED),
-    MON("black naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON | MR_ACID | MR_STONE,
-        MR_POISON | MR_STONE, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_ACID
-                                  | M1_NOTAKE | M1_CARNIVORE,
-        M2_STRONG, 0, 4, CLR_BLACK),
-    MON("golden naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON,
-        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE,
-        M2_STRONG, 0, 4, HI_GOLD),
-    MON("guardian naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON,
-        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE,
-        M2_STRONG, 0, 4, CLR_GREEN),
-    MON("red naga", S_NAGA, LVL(6, 12, 4, 0, -4), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_FIRE | MR_POISON,
-        MR_FIRE | MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE
-                                 | M1_OVIPAROUS | M1_NOTAKE | M1_OMNIVORE,
-        M2_STRONG, M3_INFRAVISIBLE, 8, CLR_RED),
-    MON("black naga", S_NAGA, LVL(8, 14, 2, 10, 4), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_SPIT, AD_ACID, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON | MR_ACID | MR_STONE,
-        MR_POISON | MR_STONE,
-        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_ACID
-            | M1_NOTAKE | M1_CARNIVORE,
-        M2_STRONG, 0, 10, CLR_BLACK),
-    MON("golden naga", S_NAGA, LVL(10, 14, 2, 70, 5), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON,
-        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_NOTAKE
-            | M1_OMNIVORE,
-        M2_STRONG, 0, 13, HI_GOLD),
-    MON("guardian naga", S_NAGA, LVL(12, 16, 0, 50, 7), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PLYS, 1, 6), ATTK(AT_SPIT, AD_DRST, 1, 6),
-          ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON,
-        M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_POIS
-            | M1_NOTAKE | M1_OMNIVORE,
-        M2_STRONG, 0, 16, CLR_GREEN),
-    /*
-     * Ogres
-     */
-    MON("ogre", S_OGRE, LVL(5, 10, 5, 0, -3), (G_SGROUP | G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1600, 500, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
-        M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BROWN),
-    MON3("ogre lord", "ogre lady", "ogre leader",
-        S_OGRE, LVL(7, 12, 3, 30, -5), (G_GENO | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1700, 700, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
-        M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_RED),
-    MON3("ogre king", "ogre queen", "ogre tyrant",
-        S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 3, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1700, 750, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
-        M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD),
-    /*
-     * Puddings
-     *
-     * must be in the same order as the pudding globs in objects.c
-     */
-    MON("gray ooze", S_PUDDING, LVL(3, 1, 8, 0, 0), (G_GENO | G_NOCORPSE | 2),
-        A(ATTK(AT_BITE, AD_RUST, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 250, MS_SILENT, MZ_MEDIUM),
-        MR_FIRE | MR_COLD | MR_POISON | MR_ACID | MR_STONE,
-        MR_FIRE | MR_COLD | MR_POISON,
-        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_OMNIVORE | M1_ACID,
-        M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY),
-    MON("brown pudding", S_PUDDING, LVL(5, 3, 8, 0, 0),
-        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_BITE, AD_DCAY, 0, 0), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(500, 250, MS_SILENT, MZ_MEDIUM),
-        MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE,
-        MR_COLD | MR_ELEC | MR_POISON,
-        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_OMNIVORE | M1_ACID,
-        M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN),
-    MON("green slime", S_PUDDING, LVL(6, 6, 6, 0, 0),
-        (G_HELL | G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(400, 150, MS_SILENT, MZ_LARGE),
-        MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE, 0,
-        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_OMNIVORE | M1_ACID | M1_POIS,
-        M2_HOSTILE | M2_NEUTER, 0, 8, CLR_GREEN),
-    MON("black pudding", S_PUDDING, LVL(10, 6, 6, 0, 0),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(900, 250, MS_SILENT, MZ_LARGE),
-        MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE,
-        MR_COLD | MR_ELEC | MR_POISON,
-        M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD
-            | M1_MINDLESS | M1_OMNIVORE | M1_ACID,
-        M2_HOSTILE | M2_NEUTER, 0, 12, CLR_BLACK),
-    /*
-     * Quantum mechanics
-     */
-    MON("quantum mechanic", S_QUANTMECH, LVL(7, 12, 3, 10, 0), (G_GENO | 3),
-        A(ATTK(AT_CLAW, AD_TLPT, 1, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 20, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE,
-        M3_INFRAVISIBLE, 9, CLR_CYAN),
-    MON("genetic engineer", S_QUANTMECH, LVL(12, 12, 3, 10, 0), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_POLY, 1, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 20, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISIBLE, 14, CLR_GREEN),
-    /*
-     * Rust monster or disenchanter
-     */
-    MON("rust monster", S_RUSTMONST, LVL(5, 18, 2, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_TUCH, AD_RUST, 0, 0), ATTK(AT_TUCH, AD_RUST, 0, 0),
-          ATTK(AT_NONE, AD_RUST, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1000, 250, MS_SILENT, MZ_MEDIUM), 0, 0,
-        M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE, M2_HOSTILE,
-        M3_INFRAVISIBLE, 8, CLR_BROWN),
-    MON("disenchanter", S_RUSTMONST, LVL(12, 12, -10, 0, -3),
-        (G_HELL | G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_ENCH, 4, 4), ATTK(AT_NONE, AD_ENCH, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(750, 200, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_CARNIVORE,
-        M2_HOSTILE, M3_INFRAVISIBLE, 14, CLR_BLUE),
-    /*
-     * Snakes
-     */
-    MON("garter snake", S_SNAKE, LVL(1, 8, 8, 0, 0), (G_LGROUP | G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(50, 60, MS_HISS, MZ_TINY), 0, 0,
-        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY
-            | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE,
-        0, 0, 3, CLR_GREEN),
-    MON("snake", S_SNAKE, LVL(4, 15, 3, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(100, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON,
-        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS
-            | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE,
-        M2_HOSTILE, 0, 6, CLR_BROWN),
-    MON("water moccasin", S_SNAKE, LVL(4, 15, 3, 0, 0),
-        (G_GENO | G_NOGEN | G_LGROUP),
-        A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(150, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON,
-        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS
-            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
-        M2_HOSTILE, 0, 7, CLR_RED),
-    MON("python", S_SNAKE, LVL(6, 3, 5, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_PHYS, 0, 0),
-          ATTK(AT_HUGS, AD_WRAP, 1, 4), ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(250, 100, MS_HISS, MZ_LARGE), 0, 0,
-        M1_SWIM | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_CARNIVORE
-            | M1_OVIPAROUS | M1_NOTAKE,
-        M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_MAGENTA),
-    MON("pit viper", S_SNAKE, LVL(6, 15, 2, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_DRST, 1, 4), ATTK(AT_BITE, AD_DRST, 1, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(100, 60, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON,
-        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS
-            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
-        M2_HOSTILE, M3_INFRAVISION, 9, CLR_BLUE),
-    MON("cobra", S_SNAKE, LVL(6, 18, 2, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_SPIT, AD_BLND, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(250, 100, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON,
-        M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS
-            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
-        M2_HOSTILE, 0, 10, CLR_BLUE),
-    /*
-     * Trolls
-     */
-    MON("troll", S_TROLL, LVL(7, 12, 4, 0, -3), (G_GENO | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 4, 2),
-          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(800, 350, MS_GRUNT, MZ_LARGE), 0, 0,
-        M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
-        M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION,
-        9, CLR_BROWN),
-    MON("ice troll", S_TROLL, LVL(9, 10, 2, 20, -3), (G_NOHELL | G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_COLD, 2, 6),
-          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1000, 300, MS_GRUNT, MZ_LARGE), MR_COLD, MR_COLD,
-        M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
-        M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION,
-        12, CLR_WHITE),
-    MON("rock troll", S_TROLL, LVL(9, 12, 0, 0, -3), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8),
-          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1200, 300, MS_GRUNT, MZ_LARGE), 0, 0,
-        M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
-        M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_CYAN),
-    MON("water troll", S_TROLL, LVL(11, 14, 4, 40, -3), (G_NOGEN | G_GENO),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8),
-          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1200, 350, MS_GRUNT, MZ_LARGE), 0, 0,
-        M1_HUMANOID | M1_REGEN | M1_CARNIVORE | M1_SWIM,
-        M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION,
-        13, CLR_BLUE),
-    MON("Olog-hai", S_TROLL, LVL(13, 12, -4, 0, -7), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8),
-          ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1500, 400, MS_GRUNT, MZ_LARGE), 0, 0,
-        M1_HUMANOID | M1_REGEN | M1_CARNIVORE,
-        M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 16, HI_LORD),
-    /*
-     * Umber hulk
-     */
-    MON("umber hulk", S_UMBER, LVL(9, 6, 2, 25, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4),
-          ATTK(AT_BITE, AD_PHYS, 2, 5), ATTK(AT_GAZE, AD_CONF, 0, 0), NO_ATTK,
-          NO_ATTK),
-        SIZ(1200, 500, MS_SILENT, MZ_LARGE), 0, 0, M1_TUNNEL | M1_CARNIVORE,
-        M2_STRONG, M3_INFRAVISIBLE, 12, CLR_BROWN),
-    /*
-     * Vampires
-     */
-    MON("vampire", S_VAMPIRE, LVL(10, 12, 1, 25, -8),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRLI, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
-        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY
-            | M2_SHAPESHIFTER,
-        M3_INFRAVISIBLE, 12, CLR_RED),
-    MON3("vampire lord", "vampire lady", "vampire leader",
-        S_VAMPIRE, LVL(12, 14, 0, 50, -9),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
-        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD
-            | M2_SHAPESHIFTER,
-        M3_INFRAVISIBLE, 14, CLR_BLUE),
-#if 0 /* DEFERRED */
-    MON("vampire mage", S_VAMPIRE,
-        LVL(20, 14, -4, 50, -9), (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 1, 8),
-          ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
-        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD
-          | M2_MALE | M2_MAGIC | M2_SHAPESHIFTER,
-        M3_INFRAVISIBLE, 26, HI_ZAP),
-#endif
-    MON("Vlad the Impaler", S_VAMPIRE, LVL(28, 26, -6, 80, -10),
-        (G_NOGEN | G_NOCORPSE | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_DRLI, 1, 12),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
-        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
-        M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG
-            | M2_NASTY | M2_PRINCE | M2_MALE | M2_SHAPESHIFTER,
-        M3_WAITFORU | M3_WANTSCAND | M3_INFRAVISIBLE, 32, HI_LORD),
-    /*
-     * Wraiths
-     */
-    MON("barrow wight", S_WRAITH, LVL(3, 12, 5, 5, -3),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_WEAP, AD_DRLI, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0),
-          ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_COLD, 1, 4),
-          NO_ATTK, NO_ATTK),
-        SIZ(1200, 0, MS_SPELL, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_HUMANOID,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_COLLECT, 0, 8, CLR_GRAY),
-    MON("wraith", S_WRAITH, LVL(6, 12, 4, 15, -6), (G_GENO | 2),
-        A(ATTK(AT_TUCH, AD_DRLI, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(0, 0, MS_SILENT, MZ_HUMAN),
-        MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_BREATHLESS | M1_FLY | M1_HUMANOID | M1_UNSOLID,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, 8, CLR_BLACK),
-    MON("Nazgul", S_WRAITH, LVL(13, 12, 0, 25, -17),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_WEAP, AD_DRLI, 1, 4), ATTK(AT_BREA, AD_SLEE, 2, 25),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 0, MS_SPELL, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
-        0, M1_BREATHLESS | M1_HUMANOID,
-        M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_STRONG | M2_HOSTILE | M2_MALE
-            | M2_COLLECT,
-        0, 17, HI_LORD),
-    /*
-     * Xorn
-     */
-    MON("xorn", S_XORN, LVL(8, 9, -2, 20, 0), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
-          ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK,
-          NO_ATTK),
-        SIZ(1200, 700, MS_ROAR, MZ_MEDIUM), MR_FIRE | MR_COLD | MR_STONE,
-        MR_STONE,
-        M1_BREATHLESS | M1_WALLWALK | M1_THICK_HIDE | M1_METALLIVORE,
-        M2_HOSTILE | M2_STRONG, 0, 11, CLR_BROWN),
-    /*
-     * Apelike beasts
-     */
-    /* tameable via banana; does not grow up into ape...
-       not flagged as domestic, so no guilt penalty for eating non-pet one */
-    MON("monkey", S_YETI, LVL(2, 12, 6, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(100, 50, MS_GROWL, MZ_SMALL), 0, 0,
-        M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, 0, M3_INFRAVISIBLE,
-        4, CLR_GRAY),
-    MON("ape", S_YETI, LVL(4, 12, 6, 0, 0), (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
-          ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1100, 500, MS_GROWL, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, M2_STRONG, M3_INFRAVISIBLE,
-        6, CLR_BROWN),
-    MON("owlbear", S_YETI, LVL(5, 12, 5, 0, 0), (G_GENO | 3),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
-          ATTK(AT_HUGS, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1700, 700, MS_ROAR, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
-        M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE, 7, CLR_BROWN),
-    MON("yeti", S_YETI, LVL(5, 15, 6, 0, 0), (G_GENO | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
-          ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1600, 700, MS_GROWL, MZ_LARGE), MR_COLD, MR_COLD,
-        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG,
-        M3_INFRAVISIBLE, 7, CLR_WHITE),
-    MON("carnivorous ape", S_YETI, LVL(6, 12, 6, 0, 0), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          ATTK(AT_HUGS, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1250, 550, MS_GROWL, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG,
-        M3_INFRAVISIBLE, 8, CLR_BLACK),
-    MON("sasquatch", S_YETI, LVL(7, 15, 6, 0, 2), (G_GENO | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
-          ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1550, 750, MS_GROWL, MZ_LARGE), 0, 0,
-        M1_ANIMAL | M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_STRONG,
-        M3_INFRAVISIBLE, 9, CLR_GRAY),
-    /*
-     * Zombies
-     */
-    MON("kobold zombie", S_ZOMBIE, LVL(0, 6, 10, 0, -2),
-        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 1, CLR_BROWN),
-    MON("gnome zombie", S_ZOMBIE, LVL(1, 6, 10, 0, -2),
-        (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 5), NO_ATTK,
-                                     NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GNOME, M3_INFRAVISION,
-        2, CLR_BROWN),
-    MON("orc zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3),
-        (G_GENO | G_SGROUP | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ORC, M3_INFRAVISION, 3,
-        CLR_GRAY),
-    MON("dwarf zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3),
-        (G_GENO | G_SGROUP | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_DWARF, M3_INFRAVISION,
-        3, CLR_RED),
-    MON("elf zombie", S_ZOMBIE, LVL(3, 6, 9, 0, -3),
-        (G_GENO | G_SGROUP | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON,
-        0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ELF, M3_INFRAVISION,
-        4, CLR_GREEN),
-    MON("human zombie", S_ZOMBIE, LVL(4, 6, 8, 0, -3),
-        (G_GENO | G_SGROUP | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN),
-        MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 5, HI_DOMESTIC),
-    MON("ettin zombie", S_ZOMBIE, LVL(6, 8, 6, 0, -4),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 10), ATTK(AT_CLAW, AD_PHYS, 1, 10),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION,
-        7, CLR_BLUE),
-    MON("ghoul", S_ZOMBIE, LVL(3, 6, 10, 0, -2), (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PLYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS | M1_OMNIVORE,
-        M2_UNDEAD | M2_WANDER | M2_HOSTILE, M3_INFRAVISION, 5, CLR_BLACK),
-    MON("giant zombie", S_ZOMBIE, LVL(8, 8, 6, 0, -4),
-        (G_GENO | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID,
-        M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GIANT | M2_STRONG,
-        M3_INFRAVISION, 9, CLR_CYAN),
-    MON("skeleton", S_ZOMBIE, LVL(12, 8, 4, 0, 0), (G_NOCORPSE | G_NOGEN),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(300, 5, MS_BONES, MZ_HUMAN),
-        MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
-        M2_UNDEAD | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_COLLECT
-            | M2_NASTY,
-        M3_INFRAVISION, 14, CLR_WHITE),
-    /*
-     * golems
-     */
-    MON("straw golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0,
-        4, CLR_YELLOW),
-    MON("paper golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0,
-        4, HI_PAPER),
-    MON("rope golem", S_GOLEM, LVL(4, 9, 8, 0, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          ATTK(AT_HUGS, AD_PHYS, 6, 1), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0,
-        6, CLR_BROWN),
-    MON("gold golem", S_GOLEM, LVL(5, 9, 6, 0, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 3), ATTK(AT_CLAW, AD_PHYS, 2, 3), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
-        M2_HOSTILE | M2_NEUTER, 0, 6, HI_GOLD),
-    MON("leather golem", S_GOLEM, LVL(6, 6, 6, 0, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0,
-        7, HI_LEATHER),
-    MON("wood golem", S_GOLEM, LVL(7, 3, 4, 0, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(900, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
-        M2_HOSTILE | M2_NEUTER, 0, 8, HI_WOOD),
-    MON("flesh golem", S_GOLEM, LVL(9, 8, 9, 30, 0), (1),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1400, 600, MS_SILENT, MZ_LARGE),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON,
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_STRONG, 0,
-        10, CLR_RED),
-    MON("clay golem", S_GOLEM, LVL(11, 7, 7, 40, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1550, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
-        M2_HOSTILE | M2_STRONG, 0, 12, CLR_BROWN),
-    MON("stone golem", S_GOLEM, LVL(14, 6, 5, 50, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1900, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
-        M2_HOSTILE | M2_STRONG, 0, 15, CLR_GRAY),
-    MON("glass golem", S_GOLEM, LVL(16, 6, 1, 50, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE,
-        M2_HOSTILE | M2_STRONG, 0, 18, CLR_CYAN),
-    MON("iron golem", S_GOLEM, LVL(18, 6, 3, 60, 0), (G_NOCORPSE | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_BREA, AD_DRST, 4, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2000, 0, MS_SILENT, MZ_LARGE),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0,
-        M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE | M1_POIS,
-        M2_HOSTILE | M2_STRONG | M2_COLLECT, 0, 22, HI_METAL),
-    /*
-     * humans, including elves and were-critters;
-     *  the '@' class does not obey rule #2.
-     */
-    MON("human", S_HUMAN, LVL(0, 12, 10, 0, 0), G_NOGEN, /* for corpses */
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
-        2, HI_DOMESTIC),
-    MON("wererat", S_HUMAN, LVL(2, 12, 10, 10, -7), (1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE,
-        M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT,
-        M3_INFRAVISIBLE, 3, CLR_BROWN),
-    MON("werejackal", S_HUMAN, LVL(2, 12, 10, 10, -7), (1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE,
-        M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT,
-        M3_INFRAVISIBLE, 3, CLR_RED),
-    MON("werewolf", S_HUMAN, LVL(5, 12, 10, 20, -7), (1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE,
-        M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT,
-        M3_INFRAVISIBLE, 6, CLR_ORANGE),
-    MON("elf", S_HUMAN, LVL(0, 12, 10, 2, -3), G_NOGEN, /* for corpses */
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
-        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
-        M2_NOPOLY | M2_ELF | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISION | M3_INFRAVISIBLE, 2, HI_DOMESTIC),
-    MON("Woodland-elf", S_HUMAN, LVL(4, 12, 10, 10, -5),
-        (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
-        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_GREEN),
-    MON("Green-elf", S_HUMAN, LVL(5, 12, 10, 10, -6), (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
-        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BRIGHT_GREEN),
-    MON("Grey-elf", S_HUMAN, LVL(6, 12, 10, 10, -7), (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
-        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY),
-    MON3("elf-lord", "elf-queen", "elf-noble",
-        S_HUMAN, LVL(8, 12, 10, 20, -9), (G_GENO | G_SGROUP | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
-        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
-        M2_ELF | M2_STRONG | M2_LORD | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BRIGHT_BLUE),
-    MON3("Elvenking", "Elvenqueen", "elven monarch",
-        S_HUMAN, LVL(9, 12, 10, 25, -10), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
-        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
-        M2_ELF | M2_STRONG | M2_PRINCE | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD),
-    MON("doppelganger", S_HUMAN, LVL(9, 12, 5, 20, 0), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 12),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_IMITATE, MZ_HUMAN), MR_SLEEP, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT
-            | M2_SHAPESHIFTER,
-        M3_INFRAVISIBLE, 11, HI_DOMESTIC),
-    MON("shopkeeper", S_HUMAN, LVL(12, 18, 0, 50, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SELL, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
-            | M2_STRONG | M2_COLLECT | M2_MAGIC,
-        M3_INFRAVISIBLE, 15, HI_DOMESTIC),
-    MON("guard", S_HUMAN, LVL(12, 12, 10, 40, 10), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARD, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_MERC | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 14, CLR_BLUE),
-    /* prisoner is used on some special levels */
-    MON("prisoner", S_HUMAN, LVL(12, 12, 10, 0, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_CLOSE, 14, HI_DOMESTIC),
-    MON("Oracle", S_HUMAN, LVL(12, 0, 0, 50, 0), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_NONE, AD_MAGM, 0, 4),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_ORACLE, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_FEMALE, M3_INFRAVISIBLE,
-        13, HI_ZAP),
-    /* aligned priests always have the epri extension attached;
-       individual instantiations should always have either ispriest
-       or isminion set */
-    MON3("priest", "priestess", "aligned cleric",
-        S_HUMAN, LVL(12, 12, 10, 50, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 1, 4),
-          ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN), MR_ELEC, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_LORD | M2_PEACEFUL | M2_COLLECT,
-        M3_INFRAVISIBLE, 15, CLR_WHITE),
-    /* high priests always have epri and always have ispriest set */
-    MON3("high priest", "high priestess", "high cleric",
-        S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8),
-          ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN),
-        MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0,
-        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_MINION | M2_PRINCE | M2_NASTY | M2_COLLECT
-            | M2_MAGIC,
-        M3_INFRAVISIBLE, 30, CLR_WHITE),
-    MON("soldier", S_HUMAN, LVL(6, 10, 10, 0, -2), (G_SGROUP | G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
-                                       | M2_HOSTILE | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 8, CLR_GRAY),
-    MON("sergeant", S_HUMAN, LVL(8, 10, 10, 5, -3), (G_SGROUP | G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
-                                       | M2_HOSTILE | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 10, CLR_RED),
-    MON("nurse", S_HUMAN, LVL(11, 6, 0, 0, 0), (G_GENO | 3),
-        A(ATTK(AT_CLAW, AD_HEAL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_NURSE, MZ_HUMAN), MR_POISON, MR_POISON,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_HOSTILE,
-        M3_INFRAVISIBLE, 13, HI_DOMESTIC),
-    MON("lieutenant", S_HUMAN, LVL(10, 10, 10, 15, -4), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
-                                       | M2_HOSTILE | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 12, CLR_GREEN),
-    MON("captain", S_HUMAN, LVL(12, 10, 10, 15, -5), (G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
-                                       | M2_HOSTILE | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 14, CLR_BLUE),
-    MON("watchman", S_HUMAN, LVL(6, 10, 10, 0, -2),
-        (G_SGROUP | G_NOGEN | G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
-                                       | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 8, CLR_GRAY),
-    MON("watch captain", S_HUMAN, LVL(10, 10, 10, 15, -4),
-        (G_NOGEN | G_GENO | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK
-                                       | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 12, CLR_GREEN),
-    /* Unique humans not tied to quests.
-     */
-    MON("Medusa", S_HUMAN, LVL(20, 12, 2, 50, -15), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 1, 8),
-          ATTK(AT_GAZE, AD_STON, 0, 0), ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HISS, MZ_LARGE), MR_POISON | MR_STONE,
-        MR_POISON | MR_STONE, M1_FLY | M1_SWIM | M1_AMPHIBIOUS | M1_HUMANOID
-                                  | M1_POIS | M1_OMNIVORE,
-        M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_FEMALE,
-        M3_WAITFORU | M3_INFRAVISIBLE, 25, CLR_BRIGHT_GREEN),
-    MON("Wizard of Yendor", S_HUMAN, LVL(30, 12, -8, 100, A_NONE),
-        (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_CLAW, AD_SAMU, 2, 12), ATTK(AT_MAGC, AD_SPEL, 0, 0),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN), MR_FIRE | MR_POISON,
-        MR_FIRE | MR_POISON,
-        M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS
-            | M1_TPORT | M1_TPORT_CNTRL | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_PRINCE
-            | M2_MALE | M2_MAGIC,
-        M3_COVETOUS | M3_WAITFORU | M3_INFRAVISIBLE, 34, HI_LORD),
-    MON("Croesus", S_HUMAN, LVL(20, 15, 0, 40, 15), (G_UNIQ | G_NOGEN),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARD, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY
-            | M2_PNAME | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS
-            | M2_COLLECT | M2_MAGIC,
-        M3_INFRAVISIBLE, 22, HI_LORD),
-#ifdef CHARON
-    MON("Charon", S_HUMAN, LVL(76, 18, -5, 120, 0),
-        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TUCH, AD_PLYS, 1, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_FERRY, MZ_HUMAN),
-        MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0,
-        M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_PNAME | M2_MALE | M2_GREEDY
-            | M2_COLLECT,
-        M3_INFRAVISIBLE, 38, CLR_WHITE),
-#endif
-    /*
-     * ghosts
-     */
-    MON("ghost", S_GHOST, LVL(10, 3, -5, 50, -5), (G_NOCORPSE | G_NOGEN),
-        A(ATTK(AT_TUCH, AD_PHYS, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 0, MS_SILENT, MZ_HUMAN),
-        MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID,
-        M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION,
-        12, CLR_GRAY),
-    MON("shade", S_GHOST, LVL(12, 10, 10, 0, 0), (G_NOCORPSE | G_NOGEN),
-        A(ATTK(AT_TUCH, AD_PLYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 0, MS_WAIL, MZ_HUMAN),
-        MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID
-            | M1_SEE_INVIS,
-        M2_NOPOLY | M2_UNDEAD | M2_WANDER | M2_STALK | M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISION, 14, CLR_BLACK),
-    /*
-     * (major) demons
-     */
-    MON("water demon", S_DEMON, LVL(8, 12, -4, 30, -7),
-        (G_NOCORPSE | G_NOGEN),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
-          ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
-        M1_HUMANOID | M1_POIS | M1_SWIM,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BLUE),
-    /* standard demons & devils
-     */
-#define SEDUCTION_ATTACKS_YES                                     \
-    A(ATTK(AT_BITE, AD_SSEX, 0, 0), ATTK(AT_CLAW, AD_PHYS, 1, 3), \
-      ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK)
-#define SEDUCTION_ATTACKS_NO                                      \
-    A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), \
-      ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK)
-    /* incubus and succubus */
-    MON3("incubus", "succubus", "amorous demon",
-        S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1),
-        SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN),
-        MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
-        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY),
-    MON("horned devil", S_DEMON, LVL(6, 9, -5, 50, 11),
-        (G_HELL | G_NOCORPSE | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          ATTK(AT_BITE, AD_PHYS, 2, 3), ATTK(AT_STNG, AD_PHYS, 1, 3), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
-        M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_BROWN),
-    /* Used by AD&D for a type of demon, originally one of the Furies
-       and spelled this way */
-    MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10),
-        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
-        A(ATTK(AT_WEAP, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
-        M1_HUMANOID | M1_POIS,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY
-            | M2_FEMALE | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED),
-    MON("barbed devil", S_DEMON, LVL(8, 12, 0, 35, 8),
-        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4),
-          ATTK(AT_STNG, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
-        M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED),
-    MON("marilith", S_DEMON, LVL(7, 12, -6, 80, -12),
-        (G_HELL | G_NOCORPSE | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
-          ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4),
-          ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4)),
-        SIZ(WT_HUMAN, 400, MS_CUSS, MZ_LARGE), MR_FIRE | MR_POISON, 0,
-        M1_HUMANOID | M1_SLITHY | M1_SEE_INVIS | M1_POIS,
-        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED),
-    MON("vrock", S_DEMON, LVL(8, 12, 0, 50, -9),
-        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_CLAW, AD_PHYS, 1, 8),
-          ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0,
-        M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED),
-    MON("hezrou", S_DEMON, LVL(9, 6, -2, 55, -10),
-        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
-          ATTK(AT_BITE, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0,
-        M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_RED),
-    MON("bone devil", S_DEMON, LVL(9, 15, -1, 40, -9),
-        (G_HELL | G_NOCORPSE | G_SGROUP | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0,
-        M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_GRAY),
-    MON("ice devil", S_DEMON, LVL(11, 6, -4, 55, -12),
-        (G_HELL | G_NOCORPSE | 2),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_COLD, 3, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE),
-        MR_FIRE | MR_COLD | MR_POISON, 0, M1_SEE_INVIS | M1_POIS,
-        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 14, CLR_WHITE),
-    MON("nalfeshnee", S_DEMON, LVL(11, 9, -1, 65, -11),
-        (G_HELL | G_NOCORPSE | 1),
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
-          ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SPELL, MZ_LARGE), MR_FIRE | MR_POISON, 0,
-        M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_RED),
-    MON("pit fiend", S_DEMON, LVL(13, 6, -3, 65, -13),
-        (G_HELL | G_NOCORPSE | 2),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_WEAP, AD_PHYS, 4, 2),
-          ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GROWL, MZ_LARGE), MR_FIRE | MR_POISON, 0,
-        M1_SEE_INVIS | M1_POIS,
-        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 16, CLR_RED),
-    MON("sandestin", S_DEMON, LVL(13, 12, 4, 60, -5),
-        (G_HELL | G_NOCORPSE | 1),
-        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, MS_CUSS, MZ_HUMAN), MR_STONE, 0, M1_HUMANOID,
-        M2_NOPOLY | M2_STALK | M2_STRONG | M2_COLLECT | M2_SHAPESHIFTER,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_GRAY),
-    MON("balrog", S_DEMON, LVL(16, 5, -2, 75, -14), (G_HELL | G_NOCORPSE | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0,
-        M1_FLY | M1_SEE_INVIS | M1_POIS,
-        M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_RED),
-    /* Named demon lords & princes plus Arch-Devils.
-     * (their order matters; see minion.c)
-     */
-    MON("Juiblex", S_DEMON, LVL(50, 3, -7, 65, -15),
-        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_ENGL, AD_DISE, 4, 10), ATTK(AT_SPIT, AD_ACID, 3, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1500, 0, MS_GURGLE, MZ_LARGE),
-        MR_FIRE | MR_POISON | MR_ACID | MR_STONE, 0,
-        M1_AMPHIBIOUS | M1_AMORPHOUS | M1_NOHEAD | M1_FLY | M1_SEE_INVIS
-            | M1_ACID | M1_POIS,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
-            | M2_LORD | M2_MALE,
-        M3_WAITFORU | M3_WANTSAMUL | M3_INFRAVISION, 26, CLR_BRIGHT_GREEN),
-    MON("Yeenoghu", S_DEMON, LVL(56, 18, -5, 80, -15),
-        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_CONF, 2, 8),
-          ATTK(AT_CLAW, AD_PLYS, 1, 6), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK,
-          NO_ATTK),
-        SIZ(900, 500, MS_ORC, MZ_LARGE), MR_FIRE | MR_POISON, 0,
-        M1_FLY | M1_SEE_INVIS | M1_POIS,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
-            | M2_LORD | M2_MALE | M2_COLLECT,
-        M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 31, HI_LORD),
-    MON("Orcus", S_DEMON, LVL(66, 9, -6, 85, -20),
-        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 4),
-          ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_MAGC, AD_SPEL, 8, 6),
-          ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK),
-        SIZ(1500, 500, MS_ORC, MZ_HUGE), MR_FIRE | MR_POISON, 0,
-        M1_FLY | M1_SEE_INVIS | M1_POIS,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
-            | M2_PRINCE | M2_MALE | M2_COLLECT,
-        M3_WAITFORU | M3_WANTSBOOK | M3_WANTSAMUL | M3_INFRAVISIBLE
-            | M3_INFRAVISION,
-        36, HI_LORD),
-    MON("Geryon", S_DEMON, LVL(72, 3, -3, 75, 15),
-        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6),
-          ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1500, 500, MS_BRIBE, MZ_HUGE), MR_FIRE | MR_POISON, 0,
-        M1_FLY | M1_SEE_INVIS | M1_POIS | M1_SLITHY,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
-            | M2_PRINCE | M2_MALE,
-        M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 36, HI_LORD),
-    MON("Dispater", S_DEMON, LVL(78, 15, -2, 80, 15),
-        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_MAGC, AD_SPEL, 6, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1500, 500, MS_BRIBE, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
-        M1_FLY | M1_SEE_INVIS | M1_POIS | M1_HUMANOID,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
-            | M2_PRINCE | M2_MALE | M2_COLLECT,
-        M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 40, HI_LORD),
-    MON("Baalzebub", S_DEMON, LVL(89, 9, -5, 85, 20),
-        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_BITE, AD_DRST, 2, 6), ATTK(AT_GAZE, AD_STUN, 2, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1500, 500, MS_BRIBE, MZ_LARGE), MR_FIRE | MR_POISON, 0,
-        M1_FLY | M1_SEE_INVIS | M1_POIS,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
-            | M2_PRINCE | M2_MALE,
-        M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION,
-        45, HI_LORD),
-    MON("Asmodeus", S_DEMON, LVL(105, 12, -7, 90, 20),
-        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_MAGC, AD_COLD, 6, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1500, 500, MS_BRIBE, MZ_HUGE), MR_FIRE | MR_COLD | MR_POISON, 0,
-        M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_POIS,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG
-            | M2_NASTY | M2_PRINCE | M2_MALE,
-        M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION,
-        53, HI_LORD),
-    MON("Demogorgon", S_DEMON, LVL(106, 15, -8, 95, -20),
-        (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_MAGC, AD_SPEL, 8, 6), ATTK(AT_STNG, AD_DRLI, 1, 4),
-          ATTK(AT_CLAW, AD_DISE, 1, 6), ATTK(AT_CLAW, AD_DISE, 1, 6), NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 500, MS_GROWL, MZ_HUGE), MR_FIRE | MR_POISON, 0,
-        M1_FLY | M1_SEE_INVIS | M1_NOHANDS | M1_POIS,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
-            | M2_PRINCE | M2_MALE,
-        M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 57, HI_LORD),
-    /* Riders -- the Four Horsemen of the Apocalypse ("War" == player);
-     * depicted with '&' but do not have M2_DEMON set.
-     */
-    MON("Death", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN),
-        A(ATTK(AT_TUCH, AD_DETH, 8, 8), ATTK(AT_TUCH, AD_DETH, 8, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL,
-        M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD),
-    MON("Pestilence", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN),
-        A(ATTK(AT_TUCH, AD_PEST, 8, 8), ATTK(AT_TUCH, AD_PEST, 8, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL,
-        M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD),
-    MON("Famine", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN),
-        A(ATTK(AT_TUCH, AD_FAMN, 8, 8), ATTK(AT_TUCH, AD_FAMN, 8, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL,
-        M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
-        M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD),
-    /* other demons
-     */
-#ifdef MAIL_STRUCTURES
-    MON("mail daemon", S_DEMON, LVL(56, 24, 10, 127, 0),
-        (G_NOGEN | G_NOCORPSE),
-        A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(600, 300, MS_SILENT, MZ_HUMAN),
-        MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0,
-        M1_FLY | M1_SWIM | M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID
-            | M1_POIS,
-        M2_NOPOLY | M2_STALK | M2_PEACEFUL, M3_INFRAVISIBLE | M3_INFRAVISION,
-        26, CLR_BRIGHT_BLUE),
-#endif
-    MON("djinni", S_DEMON, LVL(7, 12, 4, 30, 0), (G_NOGEN | G_NOCORPSE),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 400, MS_DJINNI, MZ_HUMAN), MR_POISON | MR_STONE, 0,
-        M1_HUMANOID | M1_FLY | M1_POIS, M2_NOPOLY | M2_STALK | M2_COLLECT,
-        M3_INFRAVISIBLE, 8, CLR_YELLOW),
-    /*
-     * sea monsters
-     */
-    MON("jellyfish", S_EEL, LVL(3, 3, 6, 0, 0), (G_GENO | G_NOGEN),
-        A(ATTK(AT_STNG, AD_DRST, 3, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(80, 20, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON,
-        M1_SWIM | M1_AMPHIBIOUS | M1_SLITHY | M1_NOLIMBS | M1_NOHEAD
-            | M1_NOTAKE | M1_POIS,
-        M2_HOSTILE, 0, 5, CLR_BLUE),
-    MON("piranha", S_EEL, LVL(5, 18, 4, 0, 0), (G_GENO | G_NOGEN | G_SGROUP),
-        A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(60, 30, MS_SILENT, MZ_SMALL), 0, 0,
-        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS
-            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
-        M2_HOSTILE, 0, 6, CLR_RED),
-    MON("shark", S_EEL, LVL(7, 12, 2, 0, 0), (G_GENO | G_NOGEN),
-        A(ATTK(AT_BITE, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(500, 350, MS_SILENT, MZ_LARGE), 0, 0,
-        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS
-            | M1_CARNIVORE | M1_OVIPAROUS | M1_THICK_HIDE | M1_NOTAKE,
-        M2_HOSTILE, 0, 9, CLR_GRAY),
-    MON("giant eel", S_EEL, LVL(5, 9, -1, 0, 0), (G_GENO | G_NOGEN),
-        A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(200, 250, MS_SILENT, MZ_HUGE), 0, 0,
-        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS
-            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
-        M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_CYAN),
-    MON("electric eel", S_EEL, LVL(7, 10, -3, 0, 0), (G_GENO | G_NOGEN),
-        A(ATTK(AT_BITE, AD_ELEC, 4, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(200, 250, MS_SILENT, MZ_HUGE), MR_ELEC, MR_ELEC,
-        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS
-            | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE,
-        M2_HOSTILE, M3_INFRAVISIBLE, 10, CLR_BRIGHT_BLUE),
-    MON("kraken", S_EEL, LVL(20, 3, 6, 0, -3), (G_GENO | G_NOGEN),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4),
-          ATTK(AT_HUGS, AD_WRAP, 2, 6), ATTK(AT_BITE, AD_PHYS, 5, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(1800, 1000, MS_SILENT, MZ_HUGE), 0, 0,
-        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
-        M2_NOPOLY | M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_RED),
-    /*
-     * lizards, &c
-     */
-    MON("newt", S_LIZARD, LVL(0, 6, 8, 0, 0), (G_GENO | 5),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(10, 20, MS_SILENT, MZ_TINY), 0, 0,
-        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE, 0, 1, CLR_YELLOW),
-    MON("gecko", S_LIZARD, LVL(1, 6, 8, 0, 0), (G_GENO | 5),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(10, 20, MS_SQEEK, MZ_TINY), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 2, CLR_GREEN),
-    MON("iguana", S_LIZARD, LVL(2, 6, 7, 0, 0), (G_GENO | 5),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(30, 30, MS_SILENT, MZ_TINY), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 3, CLR_BROWN),
-    MON("baby crocodile", S_LIZARD, LVL(3, 6, 7, 0, 0), G_GENO,
-        A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(200, 200, MS_SILENT, MZ_MEDIUM), 0, 0,
-        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
-        M2_HOSTILE, 0, 4, CLR_BROWN),
-    MON("lizard", S_LIZARD, LVL(5, 6, 6, 10, 0), (G_GENO | 5),
-        A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(10, 40, MS_SILENT, MZ_TINY), MR_STONE, MR_STONE,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 6, CLR_GREEN),
-    MON("chameleon", S_LIZARD, LVL(6, 5, 6, 10, 0), (G_GENO | 2),
-        A(ATTK(AT_BITE, AD_PHYS, 4, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(100, 100, MS_SILENT, MZ_TINY), 0, 0,
-        M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE,
-        M2_NOPOLY | M2_HOSTILE | M2_SHAPESHIFTER, 0, 7, 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),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), 0, 0,
-        M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS
-            | M1_OVIPAROUS | M1_CARNIVORE,
-        M2_STRONG | M2_HOSTILE, 0, 7, CLR_BROWN),
-    MON("salamander", S_LIZARD, LVL(8, 12, -1, 0, -9), (G_HELL | 1),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_TUCH, AD_FIRE, 1, 6),
-          ATTK(AT_HUGS, AD_PHYS, 2, 6), ATTK(AT_HUGS, AD_FIRE, 3, 6), NO_ATTK,
-          NO_ATTK),
-        SIZ(1500, 400, MS_MUMBLE, MZ_HUMAN), MR_SLEEP | MR_FIRE, MR_FIRE,
-        M1_HUMANOID | M1_SLITHY | M1_THICK_HIDE | M1_POIS,
-        M2_STALK | M2_HOSTILE | M2_COLLECT | M2_MAGIC, M3_INFRAVISIBLE,
-        12, CLR_ORANGE),
-
-    /*
-     * dummy monster needed for visual interface
-     * (marking it unique prevents figurines)
-     */
-    MON("long worm tail", S_WORM_TAIL, LVL(0, 0, 0, 0, 0),
-        (G_NOGEN | G_NOCORPSE | G_UNIQ),
-        A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(0, 0, 0, 0), 0, 0, 0L, M2_NOPOLY, 0, 1, CLR_BROWN),
-    /* Note:
-     * Worm tail must be between the normal monsters and the special
-     * quest & pseudo-character ones because an optimization in the
-     * random monster selection code assumes everything beyond here
-     * has the G_NOGEN and M2_NOPOLY attributes.
-     */
-
-    /*
-     * character classes
-     */
-    MON("archeologist", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_TUNNEL | M1_NEEDPICK | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
-        12, HI_DOMESTIC),
-    MON("barbarian", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
-        12, HI_DOMESTIC),
-    MON3("caveman", "cavewoman", "cave dweller",
-        S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 12, HI_DOMESTIC),
-    MON("healer", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
-        12, HI_DOMESTIC),
-    MON("knight", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
-        12, HI_DOMESTIC),
-    MON("monk", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN,
-        A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_HERBIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 11, HI_DOMESTIC),
-    MON3("priest", "priestess", "cleric",
-        S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 12, HI_DOMESTIC),
-    MON("ranger", S_HUMAN, LVL(10, 12, 10, 2, -3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
-        12, HI_DOMESTIC),
-    MON("rogue", S_HUMAN, LVL(10, 12, 10, 1, -3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
-        M3_INFRAVISIBLE, 12, HI_DOMESTIC),
-    MON("samurai", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
-        12, HI_DOMESTIC),
-    MON("tourist", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
-        12, HI_DOMESTIC),
-    /* valk is lawful by default; player valk can be neutral, in which case
-       role_init() will change this monster and 'warrior' to be neutral too;
-       if a neutral valk leaves a bones file containing neutral warriors,
-       the latter will magically turn lawful if encountered by a lawful valk
-       or any non-valk (for bones on the dungeon side of the portal) */
-    MON("valkyrie", S_HUMAN, LVL(10, 12, 10, 1, 1), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_COLD, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
-        M3_INFRAVISIBLE, 12, HI_DOMESTIC),
-    MON("wizard", S_HUMAN, LVL(10, 12, 10, 3, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MAGIC,
-        M3_INFRAVISIBLE, 12, HI_DOMESTIC),
-    /*
-     * quest leaders
-     */
-    MON("Lord Carnarvon", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 4, 8),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
-        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD),
-    MON("Pelias", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD),
-    MON("Shaman Karnov", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_CLRC, 2, 8),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD),
-#if 0 /* OBSOLETE */
-    /* Two for elves - one of each sex.
-     */
-    MON("Earendil", S_HUMAN,
-        LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
-        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
-        M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG
-          | M2_MALE | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD),
-    MON("Elwing", S_HUMAN,
-        LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
-        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
-        M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG
-          | M2_FEMALE | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD),
-#endif
-    MON("Hippocrates", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 3, 8),
-          ATTK(AT_MAGC, AD_CLRC, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD),
-    MON("King Arthur", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD),
-    MON("Grand Master", S_HUMAN, LVL(25, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_CLAW, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8),
-          ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN),
-        MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0,
-        M1_HUMANOID | M1_SEE_INVIS | M1_HERBIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_NASTY
-            | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_BLACK),
-    MON("Arch Priest", S_HUMAN, LVL(25, 15, 7, 90, 0), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8),
-          ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN),
-        MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0,
-        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT
-            | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_WHITE),
-    MON("Orion", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 4, 8),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2200, 700, MS_LEADER, MZ_HUGE), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS | M1_SWIM | M1_AMPHIBIOUS,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD),
-    /* Note: Master of Thieves is also the Tourist's nemesis.
-     */
-    MON("Master of Thieves", S_HUMAN, LVL(20, 15, 0, 90, -20),
-        (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 2, 6),
-          ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_STONE, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_GREEDY
-            | M2_JEWELS | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 24, HI_LORD),
-    MON("Lord Sato", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD),
-    MON("Twoflower", S_HUMAN, LVL(20, 15, 10, 90, 0), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 22, HI_DOMESTIC),
-    /* for a valkyrie hero, Norn's alignment will be changed to match hero's
-       starting alignment */
-    MON("Norn", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1800, 550, MS_LEADER, MZ_HUGE), MR_COLD, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_FEMALE
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD),
-    MON("Neferet the Green", S_HUMAN, LVL(20, 15, 0, 90, 0),
-        (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 2, 8),
-          ATTK(AT_MAGC, AD_SPEL, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_FEMALE | M2_PNAME | M2_PEACEFUL | M2_STRONG
-            | M2_COLLECT | M2_MAGIC,
-        M3_CLOSE | M3_INFRAVISIBLE, 23, CLR_GREEN),
-    /*
-     * quest nemeses
-     */
-    MON("Minion of Huhetotl", S_DEMON, LVL(16, 12, -2, 75, -14),
-        (G_NOCORPSE | G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6),
-          ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_LARGE),
-        MR_FIRE | MR_POISON | MR_STONE, 0, M1_FLY | M1_SEE_INVIS | M1_POIS,
-        M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY
-            | M2_COLLECT,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
-        23, CLR_RED),
-    MON("Thoth Amon", S_HUMAN, LVL(16, 12, 0, 10, -14),
-        (G_NOGEN | G_UNIQ | G_NOCORPSE),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0),
-          ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_STRONG | M2_MALE | M2_STALK
-            | M2_HOSTILE | M2_NASTY | M2_COLLECT | M2_MAGIC,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, HI_LORD),
-    /* Multi-headed, possessing the breath attacks of all the other dragons
-     * (selected at random when attacking).  Despite being a superset of
-     * gold dragon, does not emit light.
-     */
-    MON("Chromatic Dragon", S_DRAGON, LVL(16, 12, 0, 30, -14),
-        (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_BREA, AD_RBRE, 6, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0),
-          ATTK(AT_CLAW, AD_SAMU, 2, 8), ATTK(AT_BITE, AD_PHYS, 4, 8),
-          ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_STNG, AD_PHYS, 1, 6)),
-        SIZ(WT_DRAGON, 1700, MS_NEMESIS, MZ_GIGANTIC),
-        MR_FIRE | MR_COLD | MR_SLEEP | MR_DISINT | MR_ELEC | MR_POISON
-            | MR_ACID | MR_STONE,
-        MR_FIRE | MR_COLD | MR_SLEEP | MR_DISINT | MR_ELEC | MR_POISON
-            | MR_STONE,
-        M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS | M1_POIS,
-        M2_NOPOLY | M2_HOSTILE | M2_FEMALE | M2_STALK | M2_STRONG | M2_NASTY
-            | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 23, HI_LORD),
-#if 0 /* OBSOLETE */
-    MON("Goblin King", S_ORC,
-        LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
-          ATTK(AT_CLAW, AD_SAMU, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_ORC | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY
-          | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
-        18, HI_LORD),
-#endif
-    MON("Cyclops", S_GIANT, LVL(18, 12, 0, 0, -15), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_WEAP, AD_PHYS, 4, 8),
-          ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(1900, 700, MS_NEMESIS, MZ_HUGE), MR_STONE, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_STALK
-            | M2_HOSTILE | M2_NASTY | M2_MALE | M2_JEWELS | M2_COLLECT,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
-        23, CLR_GRAY),
-    MON("Ixoth", S_DRAGON, LVL(15, 12, -1, 20, -14), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_BREA, AD_FIRE, 8, 6), ATTK(AT_BITE, AD_PHYS, 4, 8),
-          ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_PHYS, 2, 4),
-          ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK),
-        SIZ(WT_DRAGON, 1600, MS_NEMESIS, MZ_GIGANTIC), MR_FIRE | MR_STONE,
-        MR_FIRE,
-        M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS,
-        M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_NASTY
-            | M2_STALK | M2_GREEDY | M2_JEWELS | M2_MAGIC,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, CLR_RED),
-    MON("Master Kaen", S_HUMAN, LVL(25, 12, -10, 10, -20), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_CLAW, AD_PHYS, 16, 2), ATTK(AT_CLAW, AD_PHYS, 16, 2),
-          ATTK(AT_MAGC, AD_CLRC, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE,
-        MR_POISON, M1_HUMANOID | M1_HERBIVORE | M1_SEE_INVIS,
-        M2_NOPOLY | M2_HUMAN | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG
-            | M2_NASTY | M2_STALK | M2_COLLECT | M2_MAGIC,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 31, HI_LORD),
-    MON("Nalzok", S_DEMON, LVL(16, 12, -2, 85, -127),
-        (G_NOGEN | G_UNIQ | G_NOCORPSE),
-        A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6),
-          ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_LARGE),
-        MR_FIRE | MR_POISON | MR_STONE, 0, M1_FLY | M1_SEE_INVIS | M1_POIS,
-        M2_NOPOLY | M2_DEMON | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG
-            | M2_STALK | M2_NASTY | M2_COLLECT,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
-        23, CLR_RED),
-    MON("Scorpius", S_SPIDER, LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 6),
-          ATTK(AT_STNG, AD_DISE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, MR_POISON,
-        M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE,
-        M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK
-            | M2_NASTY | M2_COLLECT | M2_MAGIC,
-        M3_WANTSARTI | M3_WAITFORU, 17, HI_LORD),
-    MON("Master Assassin", S_HUMAN, LVL(15, 12, 0, 30, 18),
-        (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_DRST, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 8),
-          ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_HOSTILE | M2_STALK
-            | M2_NASTY | M2_COLLECT | M2_MAGIC,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, HI_LORD),
-    /* A renegade daimyo who led a 13 year civil war against the shogun
-     * of his time.
-     */
-    MON("Ashikaga Takauji", S_HUMAN, LVL(15, 12, 0, 40, -13),
-        (G_NOGEN | G_UNIQ | G_NOCORPSE),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
-          ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK
-            | M2_NASTY | M2_MALE | M2_COLLECT | M2_MAGIC,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 19, HI_LORD),
-    /*
-     * Note: the Master of Thieves was defined above.
-     */
-    MON("Lord Surtur", S_GIANT, LVL(15, 12, 2, 50, 12), (G_NOGEN | G_UNIQ),
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_WEAP, AD_PHYS, 2, 10),
-          ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(2250, 850, MS_NEMESIS, MZ_HUGE), MR_FIRE | MR_STONE, MR_FIRE,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_GIANT | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STALK
-            | M2_STRONG | M2_NASTY | M2_ROCKTHROW | M2_JEWELS | M2_COLLECT,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
-        19, HI_LORD),
-    MON("Dark One", S_HUMAN, LVL(15, 12, 0, 80, -10),
-        (G_NOGEN | G_UNIQ | G_NOCORPSE),
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
-          ATTK(AT_CLAW, AD_SAMU, 1, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_HOSTILE | M2_STALK | M2_NASTY
-            | M2_COLLECT | M2_MAGIC,
-        M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, CLR_BLACK),
-    /*
-     * quest "guardians"
-     */
-    MON("student", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("chieftain", S_HUMAN, LVL(5, 12, 10, 10, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("neanderthal", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-#if 0 /* OBSOLETE */
-    MON("High-elf", S_HUMAN,
-        LVL(5, 12, 10, 10, -7), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_CLRC, 0, 0),
-          NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_ELF, 350, MS_GUARDIAN, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
-        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
-        M2_NOPOLY | M2_ELF | M2_PEACEFUL | M2_COLLECT,
-        M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-#endif
-    /* attendants used to lawful but have been changed to netural because
-       grow_up() promotes them to healer and the latter is always neutral */
-    MON("attendant", S_HUMAN, LVL(5, 12, 10, 10, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("page", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("abbot", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN,
-        A(ATTK(AT_CLAW, AD_PHYS, 8, 2), ATTK(AT_KICK, AD_STUN, 3, 2),
-          ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_HERBIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 8, HI_DOMESTIC),
-    MON("acolyte", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 8, HI_DOMESTIC),
-    MON("hunter", S_HUMAN, LVL(5, 12, 10, 10, -7), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("thug", S_HUMAN, LVL(5, 12, 10, 10, -3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
-                                       | M2_STRONG | M2_GREEDY | M2_COLLECT,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("ninja", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("roshi", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("guide", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
-                                       | M2_STRONG | M2_COLLECT | M2_MAGIC,
-        M3_INFRAVISIBLE, 8, HI_DOMESTIC),
-    /* warriors used to be chaotic but have been changed to lawful because
-       grow_up() promotes them to valkyrie; for a valkyrie hero, they might
-       be changed to neutral at game start; see the valkyrie comment above */
-    MON("warrior", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
-                                       | M2_STRONG | M2_COLLECT | M2_FEMALE,
-        M3_INFRAVISIBLE, 7, HI_DOMESTIC),
-    MON("apprentice", S_HUMAN, LVL(5, 12, 10, 30, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK,
-          NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL
-                                       | M2_STRONG | M2_COLLECT | M2_MAGIC,
-        M3_INFRAVISIBLE, 8, HI_DOMESTIC),
+struct permonst mons_init[NUMMONS + 1] = {
+#include "monsters.h"
     /*
      * array terminator
      */
     MON("", 0, LVL(0, 0, 0, 0, 0), (0),
         A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
-        SIZ(0, 0, 0, 0), 0, 0, 0L, 0L, 0, 0, 0)
+        SIZ(0, 0, 0, 0), 0, 0, 0L, 0L, 0, 0, 0, 0)
 };
-#endif /* !SPLITMON_1 */
-
-#ifndef SPLITMON_1
 
 void monst_globals_init(void); /* in hack.h but we're using config.h */
 
@@ -3327,6 +88,5 @@ monst_globals_init(void)
 
 const struct attack c_sa_yes[NATTK] = SEDUCTION_ATTACKS_YES;
 const struct attack c_sa_no[NATTK] = SEDUCTION_ATTACKS_NO;
-#endif
 
 /*monst.c*/
index f642932066d07a8b29ef2622eccc42d4e5bbaccd..8bccf62603d63460e7fcae5cfce67c15b998d27e 100644 (file)
 /* Copyright (c) Mike Threepoint, 1989.                           */
 /* NetHack may be freely redistributed.  See license for details. */
 
-/*
- * The data in this file is processed twice, to construct two arrays.
- * On the first pass, only object name and object description matter.
- * On the second pass, all object-class fields except those two matter.
- * 2nd pass is a recursive inclusion of this file, not a 2nd compilation.
- * The name/description array is also used by makedefs and lev_comp.
- *
- * #ifndef OBJECTS_PASS_2_
- * # define OBJECT(name,desc,foo,bar,glorkum) name,desc
- * struct objdescr obj_descr[] =
- * #else
- * # define OBJECT(name,desc,foo,bar,glorkum) foo,bar,glorkum
- * struct objclass objects[] =
- * #endif
- * {
- *   { OBJECT("strange object",NULL, 1,2,3) },
- *   { OBJECT("arrow","pointy stick", 4,5,6) },
- *   ...
- *   { OBJECT(NULL,NULL, 0,0,0) }
- * };
- * #define OBJECTS_PASS_2_
- * #include "objects.c"
- */
-
-/* *INDENT-OFF* */
-/* clang-format off */
-
-#ifndef OBJECTS_PASS_2_
-/* first pass */
 struct monst { struct monst *dummy; };  /* lint: struct obj's union */
+
 #include "config.h"
 #include "obj.h"
-#include "objclass.h"
+
 #include "prop.h"
 #include "skills.h"
-
-#else /* !OBJECTS_PASS_2_ */
-/* second pass */
 #include "color.h"
-#define COLOR_FIELD(X) X,
-#endif /* !OBJECTS_PASS_2_ */
-
-/* objects have symbols: ) [ = " ( % ! ? + / $ * ` 0 _ . */
-
-/*
- *      Note:  OBJ() and BITS() macros are used to avoid exceeding argument
- *      limits imposed by some compilers.  The ctnr field of BITS currently
- *      does not map into struct objclass, and is ignored in the expansion.
- *      The 0 in the expansion corresponds to oc_pre_discovered, which is
- *      set at run-time during role-specific character initialization.
- */
-
-#ifndef OBJECTS_PASS_2_
-/* first pass -- object descriptive text */
-#define OBJ(name,desc)  name, desc
-#define OBJECT(obj,bits,prp,sym,prob,dly,wt, \
-               cost,sdam,ldam,oc1,oc2,nut,color)  { obj }
-#define None (char *) 0 /* less visual distraction for 'no description' */
-
-NEARDATA struct objdescr obj_descr_init[] =
-#else
-/* second pass -- object definitions */
-#define BITS(nmkn,mrg,uskn,ctnr,mgc,chrg,uniq,nwsh,big,tuf,dir,sub,mtrl) \
-  nmkn,mrg,uskn,0,mgc,chrg,uniq,nwsh,big,tuf,dir,mtrl,sub /*SCO cpp fodder*/
-#define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \
-  { 0, 0, (char *) 0, bits, prp, sym, dly, COLOR_FIELD(color) prob, wt, \
-    cost, sdam, ldam, oc1, oc2, nut }
-#ifndef lint
-#define HARDGEM(n) (n >= 8)
-#else
-#define HARDGEM(n) (0)
-#endif
-
-NEARDATA struct objclass obj_init[] =
-#endif
-{
-/* dummy object[0] -- description [2nd arg] *must* be NULL */
-OBJECT(OBJ("strange object", None),
-       BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, 0),
-       0, ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
-
-/* weapons ... */
-#define WEAPON(name,desc,kn,mg,bi,prob,wt,                \
-               cost,sdam,ldam,hitbon,typ,sub,metal,color) \
-    OBJECT(OBJ(name,desc),                                          \
-           BITS(kn, mg, 1, 0, 0, 1, 0, 0, bi, 0, typ, sub, metal),  \
-           0, WEAPON_CLASS, prob, 0, wt,                            \
-           cost, sdam, ldam, hitbon, 0, wt, color)
-#define PROJECTILE(name,desc,kn,prob,wt,                  \
-                   cost,sdam,ldam,hitbon,metal,sub,color) \
-    OBJECT(OBJ(name,desc),                                          \
-           BITS(kn, 1, 1, 0, 0, 1, 0, 0, 0, 0, PIERCE, sub, metal), \
-           0, WEAPON_CLASS, prob, 0, wt,                            \
-           cost, sdam, ldam, hitbon, 0, wt, color)
-#define BOW(name,desc,kn,prob,wt,cost,hitbon,metal,sub,color) \
-    OBJECT(OBJ(name,desc),                                          \
-           BITS(kn, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, sub, metal),      \
-           0, WEAPON_CLASS, prob, 0, wt,                            \
-           cost, 2, 2, hitbon, 0, wt, color)
-
-/* Note: for weapons that don't do an even die of damage (ex. 2-7 or 3-18)
-   the extra damage is added on in weapon.c, not here! */
-
-#define P PIERCE
-#define S SLASH
-#define B WHACK
-
-/* missiles; materiel reflects the arrowhead, not the shaft */
-PROJECTILE("arrow", None,
-           1, 55, 1, 2, 6, 6, 0,        IRON, -P_BOW, HI_METAL),
-PROJECTILE("elven arrow", "runed arrow",
-           0, 20, 1, 2, 7, 6, 0,        WOOD, -P_BOW, HI_WOOD),
-PROJECTILE("orcish arrow", "crude arrow",
-           0, 20, 1, 2, 5, 6, 0,        IRON, -P_BOW, CLR_BLACK),
-PROJECTILE("silver arrow", None,
-           1, 12, 1, 5, 6, 6, 0,        SILVER, -P_BOW, HI_SILVER),
-PROJECTILE("ya", "bamboo arrow",
-           0, 15, 1, 4, 7, 7, 1,        METAL, -P_BOW, HI_METAL),
-PROJECTILE("crossbow bolt", None,
-           1, 55, 1, 2, 4, 6, 0,        IRON, -P_CROSSBOW, HI_METAL),
-
-/* missiles that don't use a launcher */
-WEAPON("dart", None,
-       1, 1, 0, 60,   1,   2,  3,  2, 0, P,   -P_DART, IRON, HI_METAL),
-WEAPON("shuriken", "throwing star",
-       0, 1, 0, 35,   1,   5,  8,  6, 2, P,   -P_SHURIKEN, IRON, HI_METAL),
-WEAPON("boomerang", None,
-       1, 1, 0, 15,   5,  20,  9,  9, 0, 0,   -P_BOOMERANG, WOOD, HI_WOOD),
-
-/* spears [note: javelin used to have a separate skill from spears,
-   because the latter are primarily stabbing weapons rather than
-   throwing ones; but for playability, they've been merged together
-   under spear skill and spears can now be thrown like javelins] */
-WEAPON("spear", None,
-       1, 1, 0, 50,  30,   3,  6,  8, 0, P,   P_SPEAR, IRON, HI_METAL),
-WEAPON("elven spear", "runed spear",
-       0, 1, 0, 10,  30,   3,  7,  8, 0, P,   P_SPEAR, WOOD, HI_WOOD),
-WEAPON("orcish spear", "crude spear",
-       0, 1, 0, 13,  30,   3,  5,  8, 0, P,   P_SPEAR, IRON, CLR_BLACK),
-WEAPON("dwarvish spear", "stout spear",
-       0, 1, 0, 12,  35,   3,  8,  8, 0, P,   P_SPEAR, IRON, HI_METAL),
-WEAPON("silver spear", None,
-       1, 1, 0,  2,  36,  40,  6,  8, 0, P,   P_SPEAR, SILVER, HI_SILVER),
-WEAPON("javelin", "throwing spear",
-       0, 1, 0, 10,  20,   3,  6,  6, 0, P,   P_SPEAR, IRON, HI_METAL),
-
-/* spearish; doesn't stack, not intended to be thrown */
-WEAPON("trident", None,
-       1, 0, 0,  8,  25,   5,  6,  4, 0, P,   P_TRIDENT, IRON, HI_METAL),
-        /* +1 small, +2d4 large */
-
-/* blades; all stack */
-WEAPON("dagger", None,
-       1, 1, 0, 30,  10,   4,  4,  3, 2, P,   P_DAGGER, IRON, HI_METAL),
-WEAPON("elven dagger", "runed dagger",
-       0, 1, 0, 10,  10,   4,  5,  3, 2, P,   P_DAGGER, WOOD, HI_WOOD),
-WEAPON("orcish dagger", "crude dagger",
-       0, 1, 0, 12,  10,   4,  3,  3, 2, P,   P_DAGGER, IRON, CLR_BLACK),
-WEAPON("silver dagger", None,
-       1, 1, 0,  3,  12,  40,  4,  3, 2, P,   P_DAGGER, SILVER, HI_SILVER),
-WEAPON("athame", None,
-       1, 1, 0,  0,  10,   4,  4,  3, 2, S,   P_DAGGER, IRON, HI_METAL),
-WEAPON("scalpel", None,
-       1, 1, 0,  0,   5,   6,  3,  3, 2, S,   P_KNIFE, METAL, HI_METAL),
-WEAPON("knife", None,
-       1, 1, 0, 20,   5,   4,  3,  2, 0, P|S, P_KNIFE, IRON, HI_METAL),
-WEAPON("stiletto", None,
-       1, 1, 0,  5,   5,   4,  3,  2, 0, P|S, P_KNIFE, IRON, HI_METAL),
-/* 3.6: worm teeth and crysknives now stack;
-   when a stack of teeth is enchanted at once, they fuse into one crysknife;
-   when a stack of crysknives drops, the whole stack reverts to teeth */
-/* 3.7: change crysknife from MINERAL to BONE and worm tooth from 0 to BONE */
-WEAPON("worm tooth", None,
-       1, 1, 0,  0,  20,   2,  2,  2, 0, 0,   P_KNIFE, BONE, CLR_WHITE),
-WEAPON("crysknife", None,
-       1, 1, 0,  0,  20, 100, 10, 10, 3, P,   P_KNIFE, BONE, CLR_WHITE),
-
-/* axes */
-WEAPON("axe", None,
-       1, 0, 0, 40,  60,   8,  6,  4, 0, S,   P_AXE, IRON, HI_METAL),
-WEAPON("battle-axe", "double-headed axe",       /* "double-bitted"? */
-       0, 0, 1, 10, 120,  40,  8,  6, 0, S,   P_AXE, IRON, HI_METAL),
-
-/* swords */
-WEAPON("short sword", None,
-       1, 0, 0,  8,  30,  10,  6,  8, 0, P,   P_SHORT_SWORD, IRON, HI_METAL),
-WEAPON("elven short sword", "runed short sword",
-       0, 0, 0,  2,  30,  10,  8,  8, 0, P,   P_SHORT_SWORD, WOOD, HI_WOOD),
-WEAPON("orcish short sword", "crude short sword",
-       0, 0, 0,  3,  30,  10,  5,  8, 0, P,   P_SHORT_SWORD, IRON, CLR_BLACK),
-WEAPON("dwarvish short sword", "broad short sword",
-       0, 0, 0,  2,  30,  10,  7,  8, 0, P,   P_SHORT_SWORD, IRON, HI_METAL),
-WEAPON("scimitar", "curved sword",
-       0, 0, 0, 15,  40,  15,  8,  8, 0, S,   P_SCIMITAR, IRON, HI_METAL),
-WEAPON("silver saber", None,
-       1, 0, 0,  6,  40,  75,  8,  8, 0, S,   P_SABER, SILVER, HI_SILVER),
-WEAPON("broadsword", None,
-       1, 0, 0,  8,  70,  10,  4,  6, 0, S,   P_BROAD_SWORD, IRON, HI_METAL),
-        /* +d4 small, +1 large */
-WEAPON("elven broadsword", "runed broadsword",
-       0, 0, 0,  4,  70,  10,  6,  6, 0, S,   P_BROAD_SWORD, WOOD, HI_WOOD),
-        /* +d4 small, +1 large */
-WEAPON("long sword", None,
-       1, 0, 0, 50,  40,  15,  8, 12, 0, S,   P_LONG_SWORD, IRON, HI_METAL),
-WEAPON("two-handed sword", None,
-       1, 0, 1, 22, 150,  50, 12,  6, 0, S,   P_TWO_HANDED_SWORD,
-                                                            IRON, HI_METAL),
-        /* +2d6 large */
-WEAPON("katana", "samurai sword",
-       0, 0, 0,  4,  40,  80, 10, 12, 1, S,   P_LONG_SWORD, IRON, HI_METAL),
-/* special swords set up for artifacts */
-WEAPON("tsurugi", "long samurai sword",
-       0, 0, 1,  0,  60, 500, 16,  8, 2, S,   P_TWO_HANDED_SWORD,
-                                                            METAL, HI_METAL),
-        /* +2d6 large */
-WEAPON("runesword", "runed broadsword",
-       0, 0, 0,  0,  40, 300,  4,  6, 0, S,   P_BROAD_SWORD, IRON, CLR_BLACK),
-        /* +d4 small, +1 large; Stormbringer: +5d2 +d8 from level drain */
-
-/* polearms */
-/* spear-type */
-WEAPON("partisan", "vulgar polearm",
-       0, 0, 1,  5,  80,  10,  6,  6, 0, P,   P_POLEARMS, IRON, HI_METAL),
-        /* +1 large */
-WEAPON("ranseur", "hilted polearm",
-       0, 0, 1,  5,  50,   6,  4,  4, 0, P,   P_POLEARMS, IRON, HI_METAL),
-        /* +d4 both */
-WEAPON("spetum", "forked polearm",
-       0, 0, 1,  5,  50,   5,  6,  6, 0, P,   P_POLEARMS, IRON, HI_METAL),
-        /* +1 small, +d6 large */
-WEAPON("glaive", "single-edged polearm",
-       0, 0, 1,  8,  75,   6,  6, 10, 0, S,   P_POLEARMS, IRON, HI_METAL),
-WEAPON("lance", None,
-       1, 0, 0,  4, 180,  10,  6,  8, 0, P,   P_LANCE, IRON, HI_METAL),
-        /* +2d10 when jousting with lance as primary weapon */
-/* axe-type */
-WEAPON("halberd", "angled poleaxe",
-       0, 0, 1,  8, 150,  10, 10,  6, 0, P|S, P_POLEARMS, IRON, HI_METAL),
-        /* +1d6 large */
-WEAPON("bardiche", "long poleaxe",
-       0, 0, 1,  4, 120,   7,  4,  4, 0, S,   P_POLEARMS, IRON, HI_METAL),
-        /* +1d4 small, +2d4 large */
-WEAPON("voulge", "pole cleaver",
-       0, 0, 1,  4, 125,   5,  4,  4, 0, S,   P_POLEARMS, IRON, HI_METAL),
-        /* +d4 both */
-WEAPON("dwarvish mattock", "broad pick",
-       0, 0, 1, 13, 120,  50, 12,  8, -1, B,  P_PICK_AXE, IRON, HI_METAL),
-/* curved/hooked */
-WEAPON("fauchard", "pole sickle",
-       0, 0, 1,  6,  60,   5,  6,  8, 0, P|S, P_POLEARMS, IRON, HI_METAL),
-WEAPON("guisarme", "pruning hook",
-       0, 0, 1,  6,  80,   5,  4,  8, 0, S,   P_POLEARMS, IRON, HI_METAL),
-        /* +1d4 small */
-WEAPON("bill-guisarme", "hooked polearm",
-       0, 0, 1,  4, 120,   7,  4, 10, 0, P|S, P_POLEARMS, IRON, HI_METAL),
-        /* +1d4 small */
-/* other */
-WEAPON("lucern hammer", "pronged polearm",
-       0, 0, 1,  5, 150,   7,  4,  6, 0, B|P, P_POLEARMS, IRON, HI_METAL),
-        /* +1d4 small */
-WEAPON("bec de corbin", "beaked polearm",
-       0, 0, 1,  4, 100,   8,  8,  6, 0, B|P, P_POLEARMS, IRON, HI_METAL),
-
-/* bludgeons */
-WEAPON("mace", None,
-       1, 0, 0, 40,  30,   5,  6,  6, 0, B,   P_MACE, IRON, HI_METAL),
-        /* +1 small */
-WEAPON("morning star", None,
-       1, 0, 0, 12, 120,  10,  4,  6, 0, B,   P_MORNING_STAR, IRON, HI_METAL),
-        /* +d4 small, +1 large */
-WEAPON("war hammer", None,
-       1, 0, 0, 15,  50,   5,  4,  4, 0, B,   P_HAMMER, IRON, HI_METAL),
-        /* +1 small */
-WEAPON("club", None,
-       1, 0, 0, 12,  30,   3,  6,  3, 0, B,   P_CLUB, WOOD, HI_WOOD),
-WEAPON("rubber hose", None,
-       1, 0, 0,  0,  20,   3,  4,  3, 0, B,   P_WHIP, PLASTIC, CLR_BROWN),
-WEAPON("quarterstaff", "staff",
-       0, 0, 1, 11,  40,   5,  6,  6, 0, B,   P_QUARTERSTAFF, WOOD, HI_WOOD),
-/* two-piece */
-WEAPON("aklys", "thonged club",
-       0, 0, 0,  8,  15,   4,  6,  3, 0, B,   P_CLUB, IRON, HI_METAL),
-WEAPON("flail", None,
-       1, 0, 0, 40,  15,   4,  6,  4, 0, B,   P_FLAIL, IRON, HI_METAL),
-        /* +1 small, +1d4 large */
-
-/* misc */
-WEAPON("bullwhip", None,
-       1, 0, 0,  2,  20,   4,  2,  1, 0, 0,   P_WHIP, LEATHER, CLR_BROWN),
-
-/* bows */
-BOW("bow", None,               1, 24, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
-BOW("elven bow", "runed bow",  0, 12, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
-BOW("orcish bow", "crude bow", 0, 12, 30, 60, 0, WOOD, P_BOW, CLR_BLACK),
-BOW("yumi", "long bow",        0,  0, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
-BOW("sling", None,             1, 40,  3, 20, 0, LEATHER, P_SLING, HI_LEATHER),
-BOW("crossbow", None,          1, 45, 50, 40, 0, WOOD, P_CROSSBOW, HI_WOOD),
-
-#undef P
-#undef S
-#undef B
-
-#undef WEAPON
-#undef PROJECTILE
-#undef BOW
-
-/* armor ... */
-        /* IRON denotes ferrous metals, including steel.
-         * Only IRON weapons and armor can rust.
-         * Only COPPER (including brass) corrodes.
-         * Some creatures are vulnerable to SILVER.
-         */
-#define ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt,  \
-              cost,ac,can,sub,metal,c)                   \
-    OBJECT(OBJ(name, desc),                                         \
-           BITS(kn, 0, 1, 0, mgc, 1, 0, 0, blk, 0, 0, sub, metal),  \
-           power, ARMOR_CLASS, prob, delay, wt,                     \
-           cost, 0, 0, 10 - ac, can, wt, c)
-#define HELM(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c)  \
-    ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt,  \
-          cost, ac, can, ARM_HELM, metal, c)
-#define CLOAK(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c)  \
-    ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt,  \
-          cost, ac, can, ARM_CLOAK, metal, c)
-#define SHIELD(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,metal,c) \
-    ARMOR(name, desc, kn, mgc, blk, power, prob, delay, wt, \
-          cost, ac, can, ARM_SHIELD, metal, c)
-#define GLOVES(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c)  \
-    ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt,  \
-          cost, ac, can, ARM_GLOVES, metal, c)
-#define BOOTS(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c)  \
-    ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt,  \
-          cost, ac, can, ARM_BOOTS, metal, c)
-
-/* helmets */
-HELM("elven leather helm", "leather hat",
-     0, 0,           0,  6, 1,  3,  8,  9, 0, LEATHER, HI_LEATHER),
-HELM("orcish helm", "iron skull cap",
-     0, 0,           0,  6, 1, 30, 10,  9, 0, IRON, CLR_BLACK),
-HELM("dwarvish iron helm", "hard hat",
-     0, 0,           0,  6, 1, 40, 20,  8, 0, IRON, HI_METAL),
-HELM("fedora", None,
-     1, 0,           0,  0, 0,  3,  1, 10, 0, CLOTH, CLR_BROWN),
-HELM("cornuthaum", "conical hat",
-     0, 1, CLAIRVOYANT,  3, 1,  4, 80, 10, 1, CLOTH, CLR_BLUE),
-        /* name coined by devteam; confers clairvoyance for wizards,
-           blocks clairvoyance if worn by role other than wizard */
-HELM("dunce cap", "conical hat",
-     0, 1,           0,  3, 1,  4,  1, 10, 0, CLOTH, CLR_BLUE),
-HELM("dented pot", None,
-     1, 0,           0,  2, 0, 10,  8,  9, 0, IRON, CLR_BLACK),
-/* with shuffled appearances... */
-HELM("helmet", "plumed helmet",
-     0, 0,           0, 10, 1, 30, 10,  9, 0, IRON, HI_METAL),
-HELM("helm of brilliance", "etched helmet",
-     0, 1,           0,  6, 1, 50, 50,  9, 0, IRON, CLR_GREEN),
-HELM("helm of opposite alignment", "crested helmet",
-     0, 1,           0,  6, 1, 50, 50,  9, 0, IRON, HI_METAL),
-HELM("helm of telepathy", "visored helmet",
-     0, 1,     TELEPAT,  2, 1, 50, 50,  9, 0, IRON, HI_METAL),
-
-/* suits of armor */
-/*
- * There is code in polyself.c that assumes (1) and (2).
- * There is code in obj.h, objnam.c, mon.c, read.c that assumes (2).
- *      (1) The dragon scale mails and the dragon scales are together.
- *      (2) That the order of the dragon scale mail and dragon scales
- *          is the same as order of dragons defined in monst.c.
- */
-#define DRGN_ARMR(name,mgc,power,cost,ac,color)  \
-    ARMOR(name, None, 1, mgc, 1, power, 0, 5, 40,  \
-          cost, ac, 0, ARM_SUIT, DRAGON_HIDE, color)
-/* 3.4.1: dragon scale mail reclassified as "magic" since magic is
-   needed to create them */
-DRGN_ARMR("gray dragon scale mail",    1, ANTIMAGIC,  1200, 1, CLR_GRAY),
-    /* gold DSM is a light source; there's no property for that */
-DRGN_ARMR("gold dragon scale mail",    1, 0,           900, 1, HI_GOLD),
-DRGN_ARMR("silver dragon scale mail",  1, REFLECTING, 1200, 1, DRAGON_SILVER),
-#if 0 /* DEFERRED */
-DRGN_ARMR("shimmering dragon scale mail", 1, DISPLACED, 1200, 1, CLR_CYAN),
-#endif
-DRGN_ARMR("red dragon scale mail",     1, FIRE_RES,    900, 1, CLR_RED),
-DRGN_ARMR("white dragon scale mail",   1, COLD_RES,    900, 1, CLR_WHITE),
-DRGN_ARMR("orange dragon scale mail",  1, SLEEP_RES,   900, 1, CLR_ORANGE),
-DRGN_ARMR("black dragon scale mail",   1, DISINT_RES, 1200, 1, CLR_BLACK),
-DRGN_ARMR("blue dragon scale mail",    1, SHOCK_RES,   900, 1, CLR_BLUE),
-DRGN_ARMR("green dragon scale mail",   1, POISON_RES,  900, 1, CLR_GREEN),
-DRGN_ARMR("yellow dragon scale mail",  1, ACID_RES,    900, 1, CLR_YELLOW),
-/* For now, only dragons leave these. */
-/* 3.4.1: dragon scales left classified as "non-magic"; they confer magical
-   properties but are produced "naturally"; affects use as polypile fodder */
-DRGN_ARMR("gray dragon scales",        0, ANTIMAGIC,   700, 7, CLR_GRAY),
-DRGN_ARMR("gold dragon scales",        0, 0,           500, 7, HI_GOLD),
-DRGN_ARMR("silver dragon scales",      0, REFLECTING,  700, 7, DRAGON_SILVER),
-#if 0 /* DEFERRED */
-DRGN_ARMR("shimmering dragon scales",  0, DISPLACED,   700, 7, CLR_CYAN),
-#endif
-DRGN_ARMR("red dragon scales",         0, FIRE_RES,    500, 7, CLR_RED),
-DRGN_ARMR("white dragon scales",       0, COLD_RES,    500, 7, CLR_WHITE),
-DRGN_ARMR("orange dragon scales",      0, SLEEP_RES,   500, 7, CLR_ORANGE),
-DRGN_ARMR("black dragon scales",       0, DISINT_RES,  700, 7, CLR_BLACK),
-DRGN_ARMR("blue dragon scales",        0, SHOCK_RES,   500, 7, CLR_BLUE),
-DRGN_ARMR("green dragon scales",       0, POISON_RES,  500, 7, CLR_GREEN),
-DRGN_ARMR("yellow dragon scales",      0, ACID_RES,    500, 7, CLR_YELLOW),
-#undef DRGN_ARMR
-/* other suits */
-ARMOR("plate mail", None,
-      1, 0, 1,  0, 44, 5, 450, 600,  3, 2,  ARM_SUIT, IRON, HI_METAL),
-ARMOR("crystal plate mail", None,
-      1, 0, 1,  0, 10, 5, 450, 820,  3, 2,  ARM_SUIT, GLASS, CLR_WHITE),
-ARMOR("bronze plate mail", None,
-      1, 0, 1,  0, 25, 5, 450, 400,  4, 1,  ARM_SUIT, COPPER, HI_COPPER),
-ARMOR("splint mail", None,
-      1, 0, 1,  0, 62, 5, 400,  80,  4, 1,  ARM_SUIT, IRON, HI_METAL),
-ARMOR("banded mail", None,
-      1, 0, 1,  0, 72, 5, 350,  90,  4, 1,  ARM_SUIT, IRON, HI_METAL),
-ARMOR("dwarvish mithril-coat", None,
-      1, 0, 0,  0, 10, 1, 150, 240,  4, 2,  ARM_SUIT, MITHRIL, HI_SILVER),
-ARMOR("elven mithril-coat", None,
-      1, 0, 0,  0, 15, 1, 150, 240,  5, 2,  ARM_SUIT, MITHRIL, HI_SILVER),
-ARMOR("chain mail", None,
-      1, 0, 0,  0, 72, 5, 300,  75,  5, 1,  ARM_SUIT, IRON, HI_METAL),
-ARMOR("orcish chain mail", "crude chain mail",
-      0, 0, 0,  0, 20, 5, 300,  75,  6, 1,  ARM_SUIT, IRON, CLR_BLACK),
-ARMOR("scale mail", None,
-      1, 0, 0,  0, 72, 5, 250,  45,  6, 1,  ARM_SUIT, IRON, HI_METAL),
-ARMOR("studded leather armor", None,
-      1, 0, 0,  0, 72, 3, 200,  15,  7, 1,  ARM_SUIT, LEATHER, HI_LEATHER),
-ARMOR("ring mail", None,
-      1, 0, 0,  0, 72, 5, 250, 100,  7, 1,  ARM_SUIT, IRON, HI_METAL),
-ARMOR("orcish ring mail", "crude ring mail",
-      0, 0, 0,  0, 20, 5, 250,  80,  8, 1,  ARM_SUIT, IRON, CLR_BLACK),
-ARMOR("leather armor", None,
-      1, 0, 0,  0, 82, 3, 150,   5,  8, 1,  ARM_SUIT, LEATHER, HI_LEATHER),
-ARMOR("leather jacket", None,
-      1, 0, 0,  0, 12, 0,  30,  10,  9, 0,  ARM_SUIT, LEATHER, CLR_BLACK),
-
-/* shirts */
-ARMOR("Hawaiian shirt", None,
-      1, 0, 0,  0,  8, 0,   5,   3, 10, 0,  ARM_SHIRT, CLOTH, CLR_MAGENTA),
-ARMOR("T-shirt", None,
-      1, 0, 0,  0,  2, 0,   5,   2, 10, 0,  ARM_SHIRT, CLOTH, CLR_WHITE),
-
-/* cloaks */
-CLOAK("mummy wrapping", None,
-      1, 0,          0,  0, 0,  3,  2, 10, 1,  CLOTH, CLR_GRAY),
-        /* worn mummy wrapping blocks invisibility */
-CLOAK("elven cloak", "faded pall",
-      0, 1,    STEALTH,  8, 0, 10, 60,  9, 1,  CLOTH, CLR_BLACK),
-CLOAK("orcish cloak", "coarse mantelet",
-      0, 0,          0,  8, 0, 10, 40, 10, 1,  CLOTH, CLR_BLACK),
-CLOAK("dwarvish cloak", "hooded cloak",
-      0, 0,          0,  8, 0, 10, 50, 10, 1,  CLOTH, HI_CLOTH),
-CLOAK("oilskin cloak", "slippery cloak",
-      0, 0,          0,  8, 0, 10, 50,  9, 2,  CLOTH, HI_CLOTH),
-CLOAK("robe", None,
-      1, 1,          0,  3, 0, 15, 50,  8, 2,  CLOTH, CLR_RED),
-        /* robe was adopted from slash'em, where it's worn as a suit
-           rather than as a cloak and there are several variations */
-CLOAK("alchemy smock", "apron",
-      0, 1, POISON_RES,  9, 0, 10, 50,  9, 1,  CLOTH, CLR_WHITE),
-CLOAK("leather cloak", None,
-      1, 0,          0,  8, 0, 15, 40,  9, 1,  LEATHER, CLR_BROWN),
-/* with shuffled appearances... */
-CLOAK("cloak of protection", "tattered cape",
-      0, 1, PROTECTION,  9, 0, 10, 50,  7, 3,  CLOTH, HI_CLOTH),
-        /* cloak of protection is now the only item conferring MC 3 */
-CLOAK("cloak of invisibility", "opera cloak",
-      0, 1,      INVIS, 10, 0, 10, 60,  9, 1,  CLOTH, CLR_BRIGHT_MAGENTA),
-CLOAK("cloak of magic resistance", "ornamental cope",
-      0, 1,  ANTIMAGIC,  2, 0, 10, 60,  9, 1,  CLOTH, CLR_WHITE),
-        /*  'cope' is not a spelling mistake... leave it be */
-CLOAK("cloak of displacement", "piece of cloth",
-      0, 1,  DISPLACED, 10, 0, 10, 50,  9, 1,  CLOTH, HI_CLOTH),
-
-/* shields */
-SHIELD("small shield", None,
-       1, 0, 0,          0, 6, 0,  30,  3, 9, 0,  WOOD, HI_WOOD),
-SHIELD("elven shield", "blue and green shield",
-       0, 0, 0,          0, 2, 0,  40,  7, 8, 0,  WOOD, CLR_GREEN),
-SHIELD("Uruk-hai shield", "white-handed shield",
-       0, 0, 0,          0, 2, 0,  50,  7, 9, 0,  IRON, HI_METAL),
-SHIELD("orcish shield", "red-eyed shield",
-       0, 0, 0,          0, 2, 0,  50,  7, 9, 0,  IRON, CLR_RED),
-SHIELD("large shield", None,
-       1, 0, 1,          0, 7, 0, 100, 10, 8, 0,  IRON, HI_METAL),
-SHIELD("dwarvish roundshield", "large round shield",
-       0, 0, 0,          0, 4, 0, 100, 10, 8, 0,  IRON, HI_METAL),
-SHIELD("shield of reflection", "polished silver shield",
-       0, 1, 0, REFLECTING, 3, 0,  50, 50, 8, 0,  SILVER, HI_SILVER),
-
-/* gloves */
-/* These have their color but not material shuffled, so the IRON must
- * stay CLR_BROWN (== HI_LEATHER) even though it's normally either
- * HI_METAL or CLR_BLACK.  All have shuffled descriptions.
- */
-GLOVES("leather gloves", "old gloves",
-       0, 0,        0, 16, 1, 10,  8, 9, 0,  LEATHER, HI_LEATHER),
-GLOVES("gauntlets of fumbling", "padded gloves",
-       0, 1, FUMBLING,  8, 1, 10, 50, 9, 0,  LEATHER, HI_LEATHER),
-GLOVES("gauntlets of power", "riding gloves",
-       0, 1,        0,  8, 1, 30, 50, 9, 0,  IRON, CLR_BROWN),
-GLOVES("gauntlets of dexterity", "fencing gloves",
-       0, 1,        0,  8, 1, 10, 50, 9, 0,  LEATHER, HI_LEATHER),
-
-/* boots */
-BOOTS("low boots", "walking shoes",
-      0, 0,          0, 25, 2, 10,  8, 9, 0, LEATHER, HI_LEATHER),
-BOOTS("iron shoes", "hard shoes",
-      0, 0,          0,  7, 2, 50, 16, 8, 0, IRON, HI_METAL),
-BOOTS("high boots", "jackboots",
-      0, 0,          0, 15, 2, 20, 12, 8, 0, LEATHER, HI_LEATHER),
-/* with shuffled appearances... */
-BOOTS("speed boots", "combat boots",
-      0, 1,       FAST, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER),
-BOOTS("water walking boots", "jungle boots",
-      0, 1,   WWALKING, 12, 2, 15, 50, 9, 0, LEATHER, HI_LEATHER),
-BOOTS("jumping boots", "hiking boots",
-      0, 1,    JUMPING, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER),
-BOOTS("elven boots", "mud boots",
-      0, 1,    STEALTH, 12, 2, 15,  8, 9, 0, LEATHER, HI_LEATHER),
-BOOTS("kicking boots", "buckled boots",
-      0, 1,          0, 12, 2, 50,  8, 9, 0, IRON, CLR_BROWN),
-        /* CLR_BROWN for same reason as gauntlets of power */
-BOOTS("fumble boots", "riding boots",
-      0, 1,   FUMBLING, 12, 2, 20, 30, 9, 0, LEATHER, HI_LEATHER),
-BOOTS("levitation boots", "snow boots",
-      0, 1, LEVITATION, 12, 2, 15, 30, 9, 0, LEATHER, HI_LEATHER),
-#undef HELM
-#undef CLOAK
-#undef SHIELD
-#undef GLOVES
-#undef BOOTS
-#undef ARMOR
-
-/* rings ... */
-#define RING(name,stone,power,cost,mgc,spec,mohs,metal,color) \
-    OBJECT(OBJ(name, stone),                                          \
-           BITS(0, 0, spec, 0, mgc, spec, 0, 0, 0,                    \
-                HARDGEM(mohs), 0, P_NONE, metal),                     \
-           power, RING_CLASS, 0, 0, 3, cost, 0, 0, 0, 0, 15, color)
-RING("adornment", "wooden",
-     ADORNED,                  100, 1, 1, 2, WOOD, HI_WOOD),
-RING("gain strength", "granite",
-     0,                        150, 1, 1, 7, MINERAL, HI_MINERAL),
-RING("gain constitution", "opal",
-     0,                        150, 1, 1, 7, MINERAL, HI_MINERAL),
-RING("increase accuracy", "clay",
-     0,                        150, 1, 1, 4, MINERAL, CLR_RED),
-RING("increase damage", "coral",
-     0,                        150, 1, 1, 4, MINERAL, CLR_ORANGE),
-RING("protection", "black onyx",
-     PROTECTION,               100, 1, 1, 7, MINERAL, CLR_BLACK),
-        /* 'PROTECTION' intrinsic enhances MC from worn armor by +1,
-           regardless of ring's enchantment; wearing a second ring of
-           protection (or even one ring of protection combined with
-           cloak of protection) doesn't give a second MC boost */
-RING("regeneration", "moonstone",
-     REGENERATION,             200, 1, 0,  6, MINERAL, HI_MINERAL),
-RING("searching", "tiger eye",
-     SEARCHING,                200, 1, 0,  6, GEMSTONE, CLR_BROWN),
-RING("stealth", "jade",
-     STEALTH,                  100, 1, 0,  6, GEMSTONE, CLR_GREEN),
-RING("sustain ability", "bronze",
-     FIXED_ABIL,               100, 1, 0,  4, COPPER, HI_COPPER),
-RING("levitation", "agate",
-     LEVITATION,               200, 1, 0,  7, GEMSTONE, CLR_RED),
-RING("hunger", "topaz",
-     HUNGER,                   100, 1, 0,  8, GEMSTONE, CLR_CYAN),
-RING("aggravate monster", "sapphire",
-     AGGRAVATE_MONSTER,        150, 1, 0,  9, GEMSTONE, CLR_BLUE),
-RING("conflict", "ruby",
-     CONFLICT,                 300, 1, 0,  9, GEMSTONE, CLR_RED),
-RING("warning", "diamond",
-     WARNING,                  100, 1, 0, 10, GEMSTONE, CLR_WHITE),
-RING("poison resistance", "pearl",
-     POISON_RES,               150, 1, 0,  4, BONE, CLR_WHITE),
-RING("fire resistance", "iron",
-     FIRE_RES,                 200, 1, 0,  5, IRON, HI_METAL),
-RING("cold resistance", "brass",
-     COLD_RES,                 150, 1, 0,  4, COPPER, HI_COPPER),
-RING("shock resistance", "copper",
-     SHOCK_RES,                150, 1, 0,  3, COPPER, HI_COPPER),
-RING("free action", "twisted",
-     FREE_ACTION,              200, 1, 0,  6, IRON, HI_METAL),
-RING("slow digestion", "steel",
-     SLOW_DIGESTION,           200, 1, 0,  8, IRON, HI_METAL),
-RING("teleportation", "silver",
-     TELEPORT,                 200, 1, 0,  3, SILVER, HI_SILVER),
-RING("teleport control", "gold",
-     TELEPORT_CONTROL,         300, 1, 0,  3, GOLD, HI_GOLD),
-RING("polymorph", "ivory",
-     POLYMORPH,                300, 1, 0,  4, BONE, CLR_WHITE),
-RING("polymorph control", "emerald",
-     POLYMORPH_CONTROL,        300, 1, 0,  8, GEMSTONE, CLR_BRIGHT_GREEN),
-RING("invisibility", "wire",
-     INVIS,                    150, 1, 0,  5, IRON, HI_METAL),
-RING("see invisible", "engagement",
-     SEE_INVIS,                150, 1, 0,  5, IRON, HI_METAL),
-RING("protection from shape changers", "shiny",
-     PROT_FROM_SHAPE_CHANGERS, 100, 1, 0,  5, IRON, CLR_BRIGHT_CYAN),
-#undef RING
-
-/* amulets ... - THE Amulet comes last because it is special */
-#define AMULET(name,desc,power,prob) \
-    OBJECT(OBJ(name, desc),                                            \
-           BITS(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, P_NONE, IRON),        \
-           power, AMULET_CLASS, prob, 0, 20, 150, 0, 0, 0, 0, 20, HI_METAL)
-AMULET("amulet of ESP",                "circular", TELEPAT, 120),
-AMULET("amulet of life saving",       "spherical", LIFESAVED, 75),
-AMULET("amulet of strangulation",          "oval", STRANGLED, 115),
-AMULET("amulet of restful sleep",    "triangular", SLEEPY, 115),
-AMULET("amulet versus poison",        "pyramidal", POISON_RES, 115),
-AMULET("amulet of change",               "square", 0, 115),
-AMULET("amulet of unchanging",          "concave", UNCHANGING, 60),
-AMULET("amulet of reflection",        "hexagonal", REFLECTING, 75),
-AMULET("amulet of magical breathing", "octagonal", MAGICAL_BREATHING, 75),
-        /* +2 AC and +2 MC; +2 takes naked hero past 'warded' to 'guarded' */
-AMULET("amulet of guarding",         "perforated", PROTECTION, 75),
-        /* cubical: some descriptions are already three dimensional and
-           parallelogrammatical (real word!) would be way over the top */
-AMULET("amulet of flying",              "cubical", FLYING, 60),
-/* fixed descriptions; description duplication is deliberate;
- * fake one must come before real one because selection for
- * description shuffling stops when a non-magic amulet is encountered
- */
-OBJECT(OBJ("cheap plastic imitation of the Amulet of Yendor",
-           "Amulet of Yendor"),
-       BITS(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, PLASTIC),
-       0, AMULET_CLASS, 0, 0, 20, 0, 0, 0, 0, 0, 1, HI_METAL),
-OBJECT(OBJ("Amulet of Yendor", /* note: description == name */
-           "Amulet of Yendor"),
-       BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, MITHRIL),
-       0, AMULET_CLASS, 0, 0, 20, 30000, 0, 0, 0, 0, 20, HI_METAL),
-#undef AMULET
-
-/* tools ... */
-/* tools with weapon characteristics come last */
-#define TOOL(name,desc,kn,mrg,mgc,chg,prob,wt,cost,mat,color) \
-    OBJECT(OBJ(name, desc),                                             \
-           BITS(kn, mrg, chg, 0, mgc, chg, 0, 0, 0, 0, 0, P_NONE, mat), \
-           0, TOOL_CLASS, prob, 0, wt, cost, 0, 0, 0, 0, wt, color)
-#define CONTAINER(name,desc,kn,mgc,chg,prob,wt,cost,mat,color) \
-    OBJECT(OBJ(name, desc),                                             \
-           BITS(kn, 0, chg, 1, mgc, chg, 0, 0, 0, 0, 0, P_NONE, mat),   \
-           0, TOOL_CLASS, prob, 0, wt, cost, 0, 0, 0, 0, wt, color)
-#define WEPTOOL(name,desc,kn,mgc,bi,prob,wt,cost,sdam,ldam,hitbon,sub,mat,clr)\
-    OBJECT(OBJ(name, desc),                                             \
-           BITS(kn, 0, 1, 0, mgc, 1, 0, 0, bi, 0, hitbon, sub, mat),    \
-           0, TOOL_CLASS, prob, 0, wt, cost, sdam, ldam, hitbon, 0, wt, clr)
-/* containers */
-CONTAINER("large box",       None, 1, 0, 0, 40, 350,   8, WOOD, HI_WOOD),
-CONTAINER("chest",           None, 1, 0, 0, 35, 600,  16, WOOD, HI_WOOD),
-CONTAINER("ice box",         None, 1, 0, 0,  5, 900,  42, PLASTIC, CLR_WHITE),
-CONTAINER("sack",           "bag", 0, 0, 0, 35,  15,   2, CLOTH, HI_CLOTH),
-CONTAINER("oilskin sack",   "bag", 0, 0, 0,  5,  15, 100, CLOTH, HI_CLOTH),
-CONTAINER("bag of holding", "bag", 0, 1, 0, 20,  15, 100, CLOTH, HI_CLOTH),
-CONTAINER("bag of tricks",  "bag", 0, 1, 1, 20,  15, 100, CLOTH, HI_CLOTH),
-#undef CONTAINER
-
-/* lock opening tools */
-TOOL("skeleton key",       "key", 0, 0, 0, 0, 80,  3, 10, IRON, HI_METAL),
-TOOL("lock pick",           None, 1, 0, 0, 0, 60,  4, 20, IRON, HI_METAL),
-TOOL("credit card",         None, 1, 0, 0, 0, 15,  1, 10, PLASTIC, CLR_WHITE),
-/* light sources */
-TOOL("tallow candle",   "candle", 0, 1, 0, 0, 20,  2, 10, WAX, CLR_WHITE),
-TOOL("wax candle",      "candle", 0, 1, 0, 0,  5,  2, 20, WAX, CLR_WHITE),
-TOOL("brass lantern",       None, 1, 0, 0, 0, 30, 30, 12, COPPER, CLR_YELLOW),
-TOOL("oil lamp",          "lamp", 0, 0, 0, 0, 45, 20, 10, COPPER, CLR_YELLOW),
-TOOL("magic lamp",        "lamp", 0, 0, 1, 0, 15, 20, 50, COPPER, CLR_YELLOW),
-/* other tools */
-TOOL("expensive camera",    None, 1, 0, 0, 1, 15, 12,200, PLASTIC, CLR_BLACK),
-TOOL("mirror",   "looking glass", 0, 0, 0, 0, 45, 13, 10, GLASS, HI_SILVER),
-TOOL("crystal ball", "glass orb", 0, 0, 1, 1, 15,150, 60, GLASS, HI_GLASS),
-TOOL("lenses",              None, 1, 0, 0, 0,  5,  3, 80, GLASS, HI_GLASS),
-TOOL("blindfold",           None, 1, 0, 0, 0, 50,  2, 20, CLOTH, CLR_BLACK),
-TOOL("towel",               None, 1, 0, 0, 0, 50,  2, 50, CLOTH, CLR_MAGENTA),
-TOOL("saddle",              None, 1, 0, 0, 0,  5,200,150, LEATHER, HI_LEATHER),
-TOOL("leash",               None, 1, 0, 0, 0, 65, 12, 20, LEATHER, HI_LEATHER),
-TOOL("stethoscope",         None, 1, 0, 0, 0, 25,  4, 75, IRON, HI_METAL),
-TOOL("tinning kit",         None, 1, 0, 0, 1, 15,100, 30, IRON, HI_METAL),
-TOOL("tin opener",          None, 1, 0, 0, 0, 35,  4, 30, IRON, HI_METAL),
-TOOL("can of grease",       None, 1, 0, 0, 1, 15, 15, 20, IRON, HI_METAL),
-TOOL("figurine",            None, 1, 0, 1, 0, 25, 50, 80, MINERAL, HI_MINERAL),
-        /* monster type specified by obj->corpsenm */
-TOOL("magic marker",        None, 1, 0, 1, 1, 15,  2, 50, PLASTIC, CLR_RED),
-/* traps */
-TOOL("land mine",           None, 1, 0, 0, 0, 0, 300,180, IRON, CLR_RED),
-TOOL("beartrap",            None, 1, 0, 0, 0, 0, 200, 60, IRON, HI_METAL),
-/* instruments;
-   "If tin whistles are made out of tin, what do they make foghorns out of?" */
-TOOL("tin whistle",    "whistle", 0, 0, 0, 0,100, 3, 10, METAL, HI_METAL),
-TOOL("magic whistle",  "whistle", 0, 0, 1, 0, 30, 3, 10, METAL, HI_METAL),
-TOOL("wooden flute",     "flute", 0, 0, 0, 0,  4, 5, 12, WOOD, HI_WOOD),
-TOOL("magic flute",      "flute", 0, 0, 1, 1,  2, 5, 36, WOOD, HI_WOOD),
-TOOL("tooled horn",       "horn", 0, 0, 0, 0,  5, 18, 15, BONE, CLR_WHITE),
-TOOL("frost horn",        "horn", 0, 0, 1, 1,  2, 18, 50, BONE, CLR_WHITE),
-TOOL("fire horn",         "horn", 0, 0, 1, 1,  2, 18, 50, BONE, CLR_WHITE),
-TOOL("horn of plenty",    "horn", 0, 0, 1, 1,  2, 18, 50, BONE, CLR_WHITE),
-        /* horn, but not an instrument */
-TOOL("wooden harp",       "harp", 0, 0, 0, 0,  4, 30, 50, WOOD, HI_WOOD),
-TOOL("magic harp",        "harp", 0, 0, 1, 1,  2, 30, 50, WOOD, HI_WOOD),
-TOOL("bell",                None, 1, 0, 0, 0,  2, 30, 50, COPPER, HI_COPPER),
-TOOL("bugle",               None, 1, 0, 0, 0,  4, 10, 15, COPPER, HI_COPPER),
-TOOL("leather drum",      "drum", 0, 0, 0, 0,  4, 25, 25, LEATHER, HI_LEATHER),
-TOOL("drum of earthquake","drum", 0, 0, 1, 1,  2, 25, 25, LEATHER, HI_LEATHER),
-/* tools useful as weapons */
-WEPTOOL("pick-axe", None,
-        1, 0, 0, 20, 100,  50,  6,  3, WHACK,  P_PICK_AXE, IRON, HI_METAL),
-WEPTOOL("grappling hook", None,
-        1, 0, 0,  5,  30,  50,  2,  6, WHACK,  P_FLAIL,    IRON, HI_METAL),
-WEPTOOL("unicorn horn", None,
-        1, 1, 1,  0,  20, 100, 12, 12, PIERCE, P_UNICORN_HORN,
-                                                           BONE, CLR_WHITE),
-        /* 3.4.1: unicorn horn left classified as "magic" */
-/* two unique tools;
- * not artifacts, despite the comment which used to be here
- */
-OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"),
-       BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, P_NONE, GOLD),
-       0, TOOL_CLASS, 0, 0, 10, 5000, 0, 0, 0, 0, 200, HI_GOLD),
-OBJECT(OBJ("Bell of Opening", "silver bell"),
-       BITS(0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, P_NONE, SILVER),
-       0, TOOL_CLASS, 0, 0, 10, 5000, 0, 0, 0, 0, 50, HI_SILVER),
-#undef TOOL
-#undef WEPTOOL
-
-/* Comestibles ... */
-#define FOOD(name, prob, delay, wt, unk, tin, nutrition, color)         \
-    OBJECT(OBJ(name, None),                                       \
-           BITS(1, 1, unk, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, tin), 0,     \
-           FOOD_CLASS, prob, delay, wt, nutrition / 20 + 5, 0, 0, 0, 0, \
-           nutrition, color)
-/* All types of food (except tins & corpses) must have a delay of at least 1.
- * Delay on corpses is computed and is weight dependant.
- * Domestic pets prefer tripe rations above all others.
- * Fortune cookies can be read, using them up without ingesting them.
- * Carrots improve your vision.
- * +0 tins contain monster meat.
- * +1 tins (of spinach) make you stronger (like Popeye).
- * Meatballs/sticks/rings are only created from objects via stone to flesh.
- */
-/* meat */
-FOOD("tripe ration",        140,  2, 10, 0, FLESH, 200, CLR_BROWN),
-FOOD("corpse",                0,  1,  0, 0, FLESH,   0, CLR_BROWN),
-FOOD("egg",                  85,  1,  1, 1, FLESH,  80, CLR_WHITE),
-FOOD("meatball",              0,  1,  1, 0, FLESH,   5, CLR_BROWN),
-FOOD("meat stick",            0,  1,  1, 0, FLESH,   5, CLR_BROWN),
-FOOD("huge chunk of meat",    0, 20,400, 0, FLESH,2000, CLR_BROWN),
-/* special case because it's not mergable */
-OBJECT(OBJ("meat ring", None),
-       BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FLESH),
-       0, FOOD_CLASS, 0, 1, 5, 1, 0, 0, 0, 0, 5, CLR_BROWN),
-/* pudding 'corpses' will turn into these and combine;
-   must be in same order as the pudding monsters */
-FOOD("glob of gray ooze",     0,  2, 20, 0, FLESH,  20, CLR_GRAY),
-FOOD("glob of brown pudding", 0,  2, 20, 0, FLESH,  20, CLR_BROWN),
-FOOD("glob of green slime",   0,  2, 20, 0, FLESH,  20, CLR_GREEN),
-FOOD("glob of black pudding", 0,  2, 20, 0, FLESH,  20, CLR_BLACK),
-
-/* fruits & veggies */
-FOOD("kelp frond",            0,  1,  1, 0, VEGGY,  30, CLR_GREEN),
-FOOD("eucalyptus leaf",       3,  1,  1, 0, VEGGY,  30, CLR_GREEN),
-FOOD("apple",                15,  1,  2, 0, VEGGY,  50, CLR_RED),
-FOOD("orange",               10,  1,  2, 0, VEGGY,  80, CLR_ORANGE),
-FOOD("pear",                 10,  1,  2, 0, VEGGY,  50, CLR_BRIGHT_GREEN),
-FOOD("melon",                10,  1,  5, 0, VEGGY, 100, CLR_BRIGHT_GREEN),
-FOOD("banana",               10,  1,  2, 0, VEGGY,  80, CLR_YELLOW),
-FOOD("carrot",               15,  1,  2, 0, VEGGY,  50, CLR_ORANGE),
-FOOD("sprig of wolfsbane",    7,  1,  1, 0, VEGGY,  40, CLR_GREEN),
-FOOD("clove of garlic",       7,  1,  1, 0, VEGGY,  40, CLR_WHITE),
-/* name of slime mold is changed based on player's OPTION=fruit:something
-   and bones data might have differently named ones from prior games */
-FOOD("slime mold",           75,  1,  5, 0, VEGGY, 250, HI_ORGANIC),
-
-/* people food */
-FOOD("lump of royal jelly",   0,  1,  2, 0, VEGGY, 200, CLR_YELLOW),
-FOOD("cream pie",            25,  1, 10, 0, VEGGY, 100, CLR_WHITE),
-FOOD("candy bar",            13,  1,  2, 0, VEGGY, 100, CLR_BROWN),
-FOOD("fortune cookie",       55,  1,  1, 0, VEGGY,  40, CLR_YELLOW),
-FOOD("pancake",              25,  2,  2, 0, VEGGY, 200, CLR_YELLOW),
-FOOD("lembas wafer",         20,  2,  5, 0, VEGGY, 800, CLR_WHITE),
-FOOD("cram ration",          20,  3, 15, 0, VEGGY, 600, HI_ORGANIC),
-FOOD("food ration",         380,  5, 20, 0, VEGGY, 800, HI_ORGANIC),
-FOOD("K-ration",              0,  1, 10, 0, VEGGY, 400, HI_ORGANIC),
-FOOD("C-ration",              0,  1, 10, 0, VEGGY, 300, HI_ORGANIC),
-/* tins have type specified by obj->spe (+1 for spinach, other implies
-   flesh; negative specifies preparation method {homemade,boiled,&c})
-   and by obj->corpsenm (type of monster flesh) */
-FOOD("tin",                  75,  0, 10, 1, METAL,   0, HI_METAL),
-#undef FOOD
-
-/* potions ... */
-#define POTION(name,desc,mgc,power,prob,cost,color) \
-    OBJECT(OBJ(name, desc),                                             \
-           BITS(0, 1, 0, 0, mgc, 0, 0, 0, 0, 0, 0, P_NONE, GLASS),      \
-           power, POTION_CLASS, prob, 0, 20, cost, 0, 0, 0, 0, 10, color)
-POTION("gain ability",           "ruby",  1, 0, 42, 300, CLR_RED),
-POTION("restore ability",        "pink",  1, 0, 40, 100, CLR_BRIGHT_MAGENTA),
-POTION("confusion",            "orange",  1, CONFUSION, 42, 100, CLR_ORANGE),
-POTION("blindness",            "yellow",  1, BLINDED, 40, 150, CLR_YELLOW),
-POTION("paralysis",           "emerald",  1, 0, 42, 300, CLR_BRIGHT_GREEN),
-POTION("speed",            "dark green",  1, FAST, 42, 200, CLR_GREEN),
-POTION("levitation",             "cyan",  1, LEVITATION, 42, 200, CLR_CYAN),
-POTION("hallucination",      "sky blue",  1, HALLUC, 40, 100, CLR_CYAN),
-POTION("invisibility", "brilliant blue",  1, INVIS, 40, 150, CLR_BRIGHT_BLUE),
-POTION("see invisible",       "magenta",  1, SEE_INVIS, 42, 50, CLR_MAGENTA),
-POTION("healing",          "purple-red",  1, 0, 57, 100, CLR_MAGENTA),
-POTION("extra healing",          "puce",  1, 0, 47, 100, CLR_RED),
-POTION("gain level",            "milky",  1, 0, 20, 300, CLR_WHITE),
-POTION("enlightenment",        "swirly",  1, 0, 20, 200, CLR_BROWN),
-POTION("monster detection",    "bubbly",  1, 0, 40, 150, CLR_WHITE),
-POTION("object detection",      "smoky",  1, 0, 42, 150, CLR_GRAY),
-POTION("gain energy",          "cloudy",  1, 0, 42, 150, CLR_WHITE),
-POTION("sleeping",       "effervescent",  1, 0, 42, 100, CLR_GRAY),
-POTION("full healing",          "black",  1, 0, 10, 200, CLR_BLACK),
-POTION("polymorph",            "golden",  1, 0, 10, 200, CLR_YELLOW),
-POTION("booze",                 "brown",  0, 0, 42,  50, CLR_BROWN),
-POTION("sickness",              "fizzy",  0, 0, 42,  50, CLR_CYAN),
-POTION("fruit juice",            "dark",  0, 0, 42,  50, CLR_BLACK),
-POTION("acid",                  "white",  0, 0, 10, 250, CLR_WHITE),
-POTION("oil",                   "murky",  0, 0, 30, 250, CLR_BROWN),
-/* fixed description
- */
-POTION("water",                 "clear",  0, 0, 92, 100, CLR_CYAN),
-#undef POTION
-
-/* scrolls ... */
-#define SCROLL(name,text,mgc,prob,cost) \
-    OBJECT(OBJ(name, text),                                           \
-           BITS(0, 1, 0, 0, mgc, 0, 0, 0, 0, 0, 0, P_NONE, PAPER),    \
-           0, SCROLL_CLASS, prob, 0, 5, cost, 0, 0, 0, 0, 6, HI_PAPER)
-SCROLL("enchant armor",              "ZELGO MER",  1,  63,  80),
-SCROLL("destroy armor",         "JUYED AWK YACC",  1,  45, 100),
-SCROLL("confuse monster",                 "NR 9",  1,  53, 100),
-SCROLL("scare monster",   "XIXAXA XOXAXA XUXAXA",  1,  35, 100),
-SCROLL("remove curse",             "PRATYAVAYAH",  1,  65,  80),
-SCROLL("enchant weapon",         "DAIYEN FOOELS",  1,  80,  60),
-SCROLL("create monster",       "LEP GEX VEN ZEA",  1,  45, 200),
-SCROLL("taming",                   "PRIRUTSENIE",  1,  15, 200),
-SCROLL("genocide",                  "ELBIB YLOH",  1,  15, 300),
-SCROLL("light",                 "VERR YED HORRE",  1,  90,  50),
-SCROLL("teleportation",        "VENZAR BORGAVVE",  1,  55, 100),
-SCROLL("gold detection",                 "THARR",  1,  33, 100),
-SCROLL("food detection",               "YUM YUM",  1,  25, 100),
-SCROLL("identify",                  "KERNOD WEL",  1, 180,  20),
-SCROLL("magic mapping",              "ELAM EBOW",  1,  45, 100),
-SCROLL("amnesia",                   "DUAM XNAHT",  1,  35, 200),
-SCROLL("fire",                  "ANDOVA BEGARIN",  1,  30, 100),
-SCROLL("earth",                          "KIRJE",  1,  18, 200),
-SCROLL("punishment",            "VE FORBRYDERNE",  1,  15, 300),
-SCROLL("charging",                "HACKEM MUCHE",  1,  15, 300),
-SCROLL("stinking cloud",             "VELOX NEB",  1,  15, 300),
-    /* Extra descriptions, shuffled into use at start of new game.
-     * Code in win/share/tilemap.c depends on SCR_STINKING_CLOUD preceding
-     * these and on how many of them there are.  If a real scroll gets added
-     * after stinking cloud or the number of extra descriptions changes,
-     * tilemap.c must be modified to match.
-     */
-SCROLL(None,      "FOOBIE BLETCH",  1,   0, 100),
-SCROLL(None,              "TEMOV",  1,   0, 100),
-SCROLL(None,         "GARVEN DEH",  1,   0, 100),
-SCROLL(None,            "READ ME",  1,   0, 100),
-SCROLL(None,      "ETAOIN SHRDLU",  1,   0, 100),
-SCROLL(None,        "LOREM IPSUM",  1,   0, 100),
-SCROLL(None,              "FNORD",  1,   0, 100), /* Illuminati */
-SCROLL(None,            "KO BATE",  1,   0, 100), /* Kurd Lasswitz */
-SCROLL(None,      "ABRA KA DABRA",  1,   0, 100), /* traditional incantation */
-SCROLL(None,       "ASHPD SODALG",  1,   0, 100), /* Portal */
-SCROLL(None,            "ZLORFIK",  1,   0, 100), /* Zak McKracken */
-SCROLL(None,      "GNIK SISI VLE",  1,   0, 100), /* Zak McKracken */
-SCROLL(None,    "HAPAX LEGOMENON",  1,   0, 100),
-SCROLL(None,  "EIRIS SAZUN IDISI",  1,   0, 100), /* Merseburg Incantations */
-SCROLL(None,    "PHOL ENDE WODAN",  1,   0, 100), /* Merseburg Incantations */
-SCROLL(None,              "GHOTI",  1,   0, 100), /* pronounced as 'fish',
-                                                        George Bernard Shaw */
-SCROLL(None, "MAPIRO MAHAMA DIROMAT", 1, 0, 100), /* Wizardry */
-SCROLL(None,  "VAS CORP BET MANI",  1,   0, 100), /* Ultima */
-SCROLL(None,            "XOR OTA",  1,   0, 100), /* Aarne Haapakoski */
-SCROLL(None, "STRC PRST SKRZ KRK",  1,   0, 100), /* Czech and Slovak
-                                                        tongue-twister */
-    /* These must come last because they have special fixed descriptions.
-     */
-#ifdef MAIL_STRUCTURES
-SCROLL("mail",          "stamped",  0,   0,   0),
-#endif
-SCROLL("blank paper", "unlabeled",  0,  28,  60),
-#undef SCROLL
-
-/* spellbooks ... */
-    /* Expanding beyond 52 spells would require changes in spellcasting
-     * or imposition of a limit on number of spells hero can know because
-     * they are currently assigned successive letters, a-zA-Z, when learned.
-     * [The existing spell sorting capability could conceivably be extended
-     * to enable moving spells from beyond Z to within it, bumping others
-     * out in the process, allowing more than 52 spells be known but keeping
-     * only 52 be castable at any given time.]
-     */
-#define SPELL(name,desc,sub,prob,delay,level,mgc,dir,color)  \
-    OBJECT(OBJ(name, desc),                                             \
-           BITS(0, 0, 0, 0, mgc, 0, 0, 0, 0, 0, dir, sub, PAPER),       \
-           0, SPBOOK_CLASS, prob, delay, 50, level * 100,               \
-           0, 0, 0, level, 20, color)
-/* Spellbook description normally refers to book covers (primarily color).
-   Parchment and vellum would never be used for such, but rather than
-   eliminate those, finagle their definitions to refer to the pages
-   rather than the cover.  They are made from animal skin (typically of
-   a goat or sheep) and books using them for pages generally need heavy
-   covers with straps or clamps to tightly close the book in order to
-   keep the pages flat.  (However, a wooden cover might itself be covered
-   by a sheet of parchment, making this become less of an exception.  Also,
-   changing the internal composition from paper to leather makes eating a
-   parchment or vellum spellbook break vegetarian conduct, as it should.) */
-#define PAPER LEATHER /* override enum for use in SPELL() expansion */
-SPELL("dig",             "parchment",
-      P_MATTER_SPELL,      20,  6, 5, 1, RAY, HI_LEATHER),
-SPELL("magic missile",   "vellum",
-      P_ATTACK_SPELL,      45,  2, 2, 1, RAY, HI_LEATHER),
-#undef PAPER /* revert to normal material */
-SPELL("fireball",        "ragged",
-      P_ATTACK_SPELL,      20,  4, 4, 1, RAY, HI_PAPER),
-SPELL("cone of cold",    "dog eared",
-      P_ATTACK_SPELL,      10,  7, 4, 1, RAY, HI_PAPER),
-SPELL("sleep",           "mottled",
-      P_ENCHANTMENT_SPELL, 49,  1, 1, 1, RAY, HI_PAPER),
-SPELL("finger of death", "stained",
-      P_ATTACK_SPELL,       5, 10, 7, 1, RAY, HI_PAPER),
-SPELL("light",           "cloth",
-      P_DIVINATION_SPELL,  45,  1, 1, 1, NODIR, HI_CLOTH),
-SPELL("detect monsters", "leathery",
-      P_DIVINATION_SPELL,  43,  1, 1, 1, NODIR, HI_LEATHER),
-SPELL("healing",         "white",
-      P_HEALING_SPELL,     40,  2, 1, 1, IMMEDIATE, CLR_WHITE),
-SPELL("knock",           "pink",
-      P_MATTER_SPELL,      35,  1, 1, 1, IMMEDIATE, CLR_BRIGHT_MAGENTA),
-SPELL("force bolt",      "red",
-      P_ATTACK_SPELL,      35,  2, 1, 1, IMMEDIATE, CLR_RED),
-SPELL("confuse monster", "orange",
-      P_ENCHANTMENT_SPELL, 30,  2, 2, 1, IMMEDIATE, CLR_ORANGE),
-SPELL("cure blindness",  "yellow",
-      P_HEALING_SPELL,     25,  2, 2, 1, IMMEDIATE, CLR_YELLOW),
-SPELL("drain life",      "velvet",
-      P_ATTACK_SPELL,      10,  2, 2, 1, IMMEDIATE, CLR_MAGENTA),
-SPELL("slow monster",    "light green",
-      P_ENCHANTMENT_SPELL, 30,  2, 2, 1, IMMEDIATE, CLR_BRIGHT_GREEN),
-SPELL("wizard lock",     "dark green",
-      P_MATTER_SPELL,      30,  3, 2, 1, IMMEDIATE, CLR_GREEN),
-SPELL("create monster",  "turquoise",
-      P_CLERIC_SPELL,      35,  3, 2, 1, NODIR, CLR_BRIGHT_CYAN),
-SPELL("detect food",     "cyan",
-      P_DIVINATION_SPELL,  30,  3, 2, 1, NODIR, CLR_CYAN),
-SPELL("cause fear",      "light blue",
-      P_ENCHANTMENT_SPELL, 25,  3, 3, 1, NODIR, CLR_BRIGHT_BLUE),
-SPELL("clairvoyance",    "dark blue",
-      P_DIVINATION_SPELL,  15,  3, 3, 1, NODIR, CLR_BLUE),
-SPELL("cure sickness",   "indigo",
-      P_HEALING_SPELL,     32,  3, 3, 1, NODIR, CLR_BLUE),
-SPELL("charm monster",   "magenta",
-      P_ENCHANTMENT_SPELL, 20,  3, 3, 1, IMMEDIATE, CLR_MAGENTA),
-SPELL("haste self",      "purple",
-      P_ESCAPE_SPELL,      33,  4, 3, 1, NODIR, CLR_MAGENTA),
-SPELL("detect unseen",   "violet",
-      P_DIVINATION_SPELL,  20,  4, 3, 1, NODIR, CLR_MAGENTA),
-SPELL("levitation",      "tan",
-      P_ESCAPE_SPELL,      20,  4, 4, 1, NODIR, CLR_BROWN),
-SPELL("extra healing",   "plaid",
-      P_HEALING_SPELL,     27,  5, 3, 1, IMMEDIATE, CLR_GREEN),
-SPELL("restore ability", "light brown",
-      P_HEALING_SPELL,     25,  5, 4, 1, NODIR, CLR_BROWN),
-SPELL("invisibility",    "dark brown",
-      P_ESCAPE_SPELL,      25,  5, 4, 1, NODIR, CLR_BROWN),
-SPELL("detect treasure", "gray",
-      P_DIVINATION_SPELL,  20,  5, 4, 1, NODIR, CLR_GRAY),
-SPELL("remove curse",    "wrinkled",
-      P_CLERIC_SPELL,      25,  5, 3, 1, NODIR, HI_PAPER),
-SPELL("magic mapping",   "dusty",
-      P_DIVINATION_SPELL,  18,  7, 5, 1, NODIR, HI_PAPER),
-SPELL("identify",        "bronze",
-      P_DIVINATION_SPELL,  20,  6, 3, 1, NODIR, HI_COPPER),
-SPELL("turn undead",     "copper",
-      P_CLERIC_SPELL,      16,  8, 6, 1, IMMEDIATE, HI_COPPER),
-SPELL("polymorph",       "silver",
-      P_MATTER_SPELL,      10,  8, 6, 1, IMMEDIATE, HI_SILVER),
-SPELL("teleport away",   "gold",
-      P_ESCAPE_SPELL,      15,  6, 6, 1, IMMEDIATE, HI_GOLD),
-SPELL("create familiar", "glittering",
-      P_CLERIC_SPELL,      10,  7, 6, 1, NODIR, CLR_WHITE),
-SPELL("cancellation",    "shining",
-      P_MATTER_SPELL,      15,  8, 7, 1, IMMEDIATE, CLR_WHITE),
-SPELL("protection",      "dull",
-      P_CLERIC_SPELL,      18,  3, 1, 1, NODIR, HI_PAPER),
-SPELL("jumping",         "thin",
-      P_ESCAPE_SPELL,      20,  3, 1, 1, IMMEDIATE, HI_PAPER),
-SPELL("stone to flesh",  "thick",
-      P_HEALING_SPELL,     15,  1, 3, 1, IMMEDIATE, HI_PAPER),
-#if 0 /* DEFERRED */
-/* from slash'em, create a tame critter which explodes when attacking,
-   damaging adjacent creatures--friend or foe--and dying in the process */
-SPELL("flame sphere",    "canvas",
-      P_MATTER_SPELL,      20,  2, 1, 1, NODIR, CLR_BROWN),
-SPELL("freeze sphere",   "hardcover",
-      P_MATTER_SPELL,      20,  2, 1, 1, NODIR, CLR_BROWN),
-#endif
-/* books with fixed descriptions
- */
-SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER),
-/* tribute book for 3.6 */
-OBJECT(OBJ("novel", "paperback"),
-       BITS(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, PAPER),
-       0, SPBOOK_CLASS, 1, 0, 0, 20, 0, 0, 0, 1, 20, CLR_BRIGHT_BLUE),
-/* a special, one of a kind, spellbook */
-OBJECT(OBJ("Book of the Dead", "papyrus"),
-       BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, P_NONE, PAPER),
-       0, SPBOOK_CLASS, 0, 0, 20, 10000, 0, 0, 0, 7, 20, HI_PAPER),
-#undef SPELL
-
-/* wands ... */
-#define WAND(name,typ,prob,cost,mgc,dir,metal,color) \
-    OBJECT(OBJ(name, typ),                                              \
-           BITS(0, 0, 1, 0, mgc, 1, 0, 0, 0, 0, dir, P_NONE, metal),    \
-           0, WAND_CLASS, prob, 0, 7, cost, 0, 0, 0, 0, 30, color)
-WAND("light",           "glass", 95, 100, 1, NODIR, GLASS, HI_GLASS),
-WAND("secret door detection",
-                        "balsa", 50, 150, 1, NODIR, WOOD, HI_WOOD),
-WAND("enlightenment", "crystal", 15, 150, 1, NODIR, GLASS, HI_GLASS),
-WAND("create monster",  "maple", 45, 200, 1, NODIR, WOOD, HI_WOOD),
-WAND("wishing",          "pine",  5, 500, 1, NODIR, WOOD, HI_WOOD),
-WAND("nothing",           "oak", 25, 100, 0, IMMEDIATE, WOOD, HI_WOOD),
-WAND("striking",        "ebony", 75, 150, 1, IMMEDIATE, WOOD, HI_WOOD),
-WAND("make invisible", "marble", 45, 150, 1, IMMEDIATE, MINERAL, HI_MINERAL),
-WAND("slow monster",      "tin", 50, 150, 1, IMMEDIATE, METAL, HI_METAL),
-WAND("speed monster",   "brass", 50, 150, 1, IMMEDIATE, COPPER, HI_COPPER),
-WAND("undead turning", "copper", 50, 150, 1, IMMEDIATE, COPPER, HI_COPPER),
-WAND("polymorph",      "silver", 45, 200, 1, IMMEDIATE, SILVER, HI_SILVER),
-WAND("cancellation", "platinum", 45, 200, 1, IMMEDIATE, PLATINUM, CLR_WHITE),
-WAND("teleportation", "iridium", 45, 200, 1, IMMEDIATE, METAL,
-                                                             CLR_BRIGHT_CYAN),
-WAND("opening",          "zinc", 25, 150, 1, IMMEDIATE, METAL, HI_METAL),
-WAND("locking",      "aluminum", 25, 150, 1, IMMEDIATE, METAL, HI_METAL),
-WAND("probing",       "uranium", 30, 150, 1, IMMEDIATE, METAL, HI_METAL),
-WAND("digging",          "iron", 55, 150, 1, RAY, IRON, HI_METAL),
-WAND("magic missile",   "steel", 50, 150, 1, RAY, IRON, HI_METAL),
-WAND("fire",        "hexagonal", 40, 175, 1, RAY, IRON, HI_METAL),
-WAND("cold",            "short", 40, 175, 1, RAY, IRON, HI_METAL),
-WAND("sleep",           "runed", 50, 175, 1, RAY, IRON, HI_METAL),
-WAND("death",            "long",  5, 500, 1, RAY, IRON, HI_METAL),
-WAND("lightning",      "curved", 40, 175, 1, RAY, IRON, HI_METAL),
-/* extra descriptions, shuffled into use at start of new game */
-WAND(None,             "forked",  0, 150, 1, 0, WOOD, HI_WOOD),
-WAND(None,             "spiked",  0, 150, 1, 0, IRON, HI_METAL),
-WAND(None,            "jeweled",  0, 150, 1, 0, IRON, HI_MINERAL),
-#undef WAND
-
-/* coins ... - so far, gold is all there is */
-#define COIN(name,prob,metal,worth) \
-    OBJECT(OBJ(name, None),                                         \
-           BITS(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, metal),    \
-           0, COIN_CLASS, prob, 0, 1, worth, 0, 0, 0, 0, 0, HI_GOLD)
-COIN("gold piece", 1000, GOLD, 1),
-#undef COIN
-
-/* gems ... - includes stones and rocks but not boulders */
-#define GEM(name,desc,prob,wt,gval,nutr,mohs,glass,color) \
-    OBJECT(OBJ(name, desc),                                             \
-           BITS(0, 1, 0, 0, 0, 0, 0, 0, 0,                              \
-                HARDGEM(mohs), 0, -P_SLING, glass),                     \
-           0, GEM_CLASS, prob, 0, 1, gval, 3, 3, 0, 0, nutr, color)
-#define ROCK(name,desc,kn,prob,wt,gval,sdam,ldam,mgc,nutr,mohs,glass,color) \
-    OBJECT(OBJ(name, desc),                                             \
-           BITS(kn, 1, 0, 0, mgc, 0, 0, 0, 0,                           \
-                HARDGEM(mohs), 0, -P_SLING, glass),                     \
-           0, GEM_CLASS, prob, 0, wt, gval, sdam, ldam, 0, 0, nutr, color)
-GEM("dilithium crystal", "white",  2, 1, 4500, 15,  5, GEMSTONE, CLR_WHITE),
-GEM("diamond",           "white",  3, 1, 4000, 15, 10, GEMSTONE, CLR_WHITE),
-GEM("ruby",                "red",  4, 1, 3500, 15,  9, GEMSTONE, CLR_RED),
-GEM("jacinth",          "orange",  3, 1, 3250, 15,  9, GEMSTONE, CLR_ORANGE),
-GEM("sapphire",           "blue",  4, 1, 3000, 15,  9, GEMSTONE, CLR_BLUE),
-GEM("black opal",        "black",  3, 1, 2500, 15,  8, GEMSTONE, CLR_BLACK),
-GEM("emerald",           "green",  5, 1, 2500, 15,  8, GEMSTONE, CLR_GREEN),
-GEM("turquoise",         "green",  6, 1, 2000, 15,  6, GEMSTONE, CLR_GREEN),
-GEM("citrine",          "yellow",  4, 1, 1500, 15,  6, GEMSTONE, CLR_YELLOW),
-GEM("aquamarine",        "green",  6, 1, 1500, 15,  8, GEMSTONE, CLR_GREEN),
-GEM("amber",   "yellowish brown",  8, 1, 1000, 15,  2, GEMSTONE, CLR_BROWN),
-GEM("topaz",   "yellowish brown", 10, 1,  900, 15,  8, GEMSTONE, CLR_BROWN),
-GEM("jet",               "black",  6, 1,  850, 15,  7, GEMSTONE, CLR_BLACK),
-GEM("opal",              "white", 12, 1,  800, 15,  6, GEMSTONE, CLR_WHITE),
-GEM("chrysoberyl",      "yellow",  8, 1,  700, 15,  5, GEMSTONE, CLR_YELLOW),
-GEM("garnet",              "red", 12, 1,  700, 15,  7, GEMSTONE, CLR_RED),
-GEM("amethyst",         "violet", 14, 1,  600, 15,  7, GEMSTONE, CLR_MAGENTA),
-GEM("jasper",              "red", 15, 1,  500, 15,  7, GEMSTONE, CLR_RED),
-GEM("fluorite",         "violet", 15, 1,  400, 15,  4, GEMSTONE, CLR_MAGENTA),
-GEM("obsidian",          "black",  9, 1,  200, 15,  6, GEMSTONE, CLR_BLACK),
-GEM("agate",            "orange", 12, 1,  200, 15,  6, GEMSTONE, CLR_ORANGE),
-GEM("jade",              "green", 10, 1,  300, 15,  6, GEMSTONE, CLR_GREEN),
-GEM("worthless piece of white glass", "white",
-    77, 1, 0, 6, 5, GLASS, CLR_WHITE),
-GEM("worthless piece of blue glass", "blue",
-    77, 1, 0, 6, 5, GLASS, CLR_BLUE),
-GEM("worthless piece of red glass", "red",
-    77, 1, 0, 6, 5, GLASS, CLR_RED),
-GEM("worthless piece of yellowish brown glass", "yellowish brown",
-    77, 1, 0, 6, 5, GLASS, CLR_BROWN),
-GEM("worthless piece of orange glass", "orange",
-    76, 1, 0, 6, 5, GLASS, CLR_ORANGE),
-GEM("worthless piece of yellow glass", "yellow",
-    77, 1, 0, 6, 5, GLASS, CLR_YELLOW),
-GEM("worthless piece of black glass", "black",
-    76, 1, 0, 6, 5, GLASS, CLR_BLACK),
-GEM("worthless piece of green glass", "green",
-    77, 1, 0, 6, 5, GLASS, CLR_GREEN),
-GEM("worthless piece of violet glass", "violet",
-    77, 1, 0, 6, 5, GLASS, CLR_MAGENTA),
-
-/* Placement note: there is a wishable subrange for
- * "gray stones" in the o_ranges[] array in objnam.c
- * that is currently everything between luckstones and flint
- * (inclusive).
- */
-ROCK("luckstone", "gray",  0,  10,  10, 60, 3, 3, 1, 10, 7, MINERAL, CLR_GRAY),
-ROCK("loadstone", "gray",  0,  10, 500,  1, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY),
-ROCK("touchstone", "gray", 0,   8,  10, 45, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY),
-ROCK("flint", "gray",      0,  10,  10,  1, 6, 6, 0, 10, 7, MINERAL, CLR_GRAY),
-ROCK("rock", None,         1, 100,  10,  0, 3, 3, 0, 10, 7, MINERAL, CLR_GRAY),
-#undef GEM
-#undef ROCK
-
-/* miscellaneous ... */
-/* Note: boulders and rocks are not normally created at random; the
- * probabilities only come into effect when you try to polymorph them.
- * Boulders weigh more than MAX_CARR_CAP; statues use corpsenm to take
- * on a specific type and may act as containers (both affect weight).
- */
-OBJECT(OBJ("boulder", None),
-       BITS(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, P_NONE, MINERAL), 0,
-       ROCK_CLASS, 100, 0, 6000, 0, 20, 20, 0, 0, 2000, HI_MINERAL),
-OBJECT(OBJ("statue", None),
-       BITS(1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, P_NONE, MINERAL), 0,
-       ROCK_CLASS, 900, 0, 2500, 0, 20, 20, 0, 0, 2500, CLR_WHITE),
-
-OBJECT(OBJ("heavy iron ball", None),
-       BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, WHACK, P_NONE, IRON), 0,
-       BALL_CLASS, 1000, 0, 480, 10, 25, 25, 0, 0, 200, HI_METAL),
-        /* +d4 when "very heavy" */
-OBJECT(OBJ("iron chain", None),
-       BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, WHACK, P_NONE, IRON), 0,
-       CHAIN_CLASS, 1000, 0, 120, 0, 4, 4, 0, 0, 200, HI_METAL),
-        /* +1 both l & s */
-
-/* Venom is normally a transitory missile (spit by various creatures)
- * but can be wished for in wizard mode so could occur in bones data.
- */
-OBJECT(OBJ("splash of blinding venom", "splash of venom"),
-       BITS(0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, P_NONE, LIQUID), 0,
-       VENOM_CLASS, 500, 0, 1, 0, 0, 0, 0, 0, 0, HI_ORGANIC),
-OBJECT(OBJ("splash of acid venom", "splash of venom"),
-       BITS(0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, P_NONE, LIQUID), 0,
-       VENOM_CLASS, 500, 0, 1, 0, 6, 6, 0, 0, 0, HI_ORGANIC),
-        /* +d6 small or large */
-
-/* fencepost, the deadly Array Terminator -- name [1st arg] *must* be NULL */
-OBJECT(OBJ(None, None),
-       BITS(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, 0), 0,
-       ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-}; /* objects[] */
-
-#ifndef OBJECTS_PASS_2_
+#include "objclass.h"
 
-/* perform recursive compilation for second structure */
-#undef OBJ
-#undef OBJECT
-#define OBJECTS_PASS_2_
-#include "objects.c"
+NEARDATA struct objdescr obj_descr_init[NUM_OBJECTS + 1] = {
+#define OBJECTS_DESCR_INIT
+#include "objects.h"
+#undef OBJECTS_DESCR_INIT
+};
 
-/* clang-format on */
-/* *INDENT-ON* */
+NEARDATA struct objclass obj_init[NUM_OBJECTS + 1] = {
+#define OBJECTS_INIT
+#include "objects.h"
+#undef OBJECTS_INIT
+};
 
 void objects_globals_init(void); /* in hack.h but we're using config.h */
 
@@ -1190,6 +36,4 @@ objects_globals_init(void)
     memcpy(objects, obj_init, sizeof(objects));
 }
 
-#endif /* !OBJECTS_PASS_2_ */
-
 /*objects.c*/
index fb12771e29f837390b6729a95f531fe1639b95e1..2b151f09f6fc729ea639144d09bd8c7a2a7eea38 100644 (file)
@@ -197,7 +197,7 @@ static const char *const shkhealthfoods[] = {
  * The iprobs array in each entry defines the probabilities for various kinds
  * of objects to be present in the given shop type.  You can associate with
  * each percentage either a generic object type (represented by one of the
- * *_CLASS macros) or a specific object (represented by an onames.h define).
+ * *_CLASS enum value) or a specific object enum value.
  * In the latter case, prepend it with a unary minus so the code can know
  * (by testing the sign) whether to use mkobj() or mksobj().
  */
index 0b197d4af0c3e4c6e410dcf5dddb6ed28fdd5d52..ba972aeb223ad4c07472ee0dbc5ee53725b82c09 100644 (file)
@@ -5,50 +5,9 @@
 
 #include "hack.h"
 #include "dlb.h"
-#include "date.h"
-
-#if defined(CROSSCOMPILE)
-struct cross_target_s cross_target = {
-    /* https://groups.google.com/forum/#!original/
-       comp.sources.games/91SfKYg_xzI/dGnR3JnspFkJ */
-    "Tue, 28-Jul-87 13:18:57 EDT",
-    "Version 1.0, built Jul 28 13:18:57 1987.",
-    "0000000000000000000000000000000000000000",
-    "master",
-    "1.0.0-0",
-    "NetHack Version 1.0.0-0 - last build Tue Jul 28 13:18:57 1987.",
-    0x01010000UL,
-    0x00000000UL,
-    0x00000000UL,
-    0x00000000UL,
-    0x00000000UL,
-    0x00000000UL,
-    554476737UL,
-};
-#endif /* CROSSCOMPILE */
-
-#if defined(NETHACK_GIT_SHA)
-const char *NetHack_git_sha
-#if !defined(CROSSCOMPILE) || !defined(CROSSCOMPILE_TARGET)
-                = NETHACK_GIT_SHA
-#else
-#ifdef NETHACK_HOST_GIT_SHA
-                = NETHACK_HOST_GIT_SHA
-#endif
-#endif
-;
-#endif
 
-#if defined(NETHACK_GIT_BRANCH)
-const char *NetHack_git_branch
-#if !defined(CROSSCOMPILE) || !defined(CROSSCOMPILE_TARGET)
-                = NETHACK_GIT_BRANCH
-#else
-#ifdef NETHACK_HOST_GIT_BRANCH
-                = NETHACK_HOST_GIT_BRANCH
-#endif
-#endif
-;
+#ifndef OPTIONS_AT_RUNTIME
+#define OPTIONS_AT_RUNTIME
 #endif
 
 static void insert_rtoption(char *);
@@ -57,17 +16,16 @@ static void insert_rtoption(char *);
 char *
 version_string(char *buf)
 {
-    return strcpy(buf, VERSION_STRING);
+    return strcpy(buf, nomakedefs.version_string);
 }
 
 /* fill and return the given buffer with the long nethack version string */
 char *
 getversionstring(char *buf)
 {
-    Strcpy(buf, VERSION_ID);
+    Strcpy(buf, nomakedefs.version_id);
 
-#if defined(RUNTIME_PORT_ID) \
-    || defined(NETHACK_GIT_SHA) || defined(NETHACK_GIT_BRANCH)
+#if defined(RUNTIME_PORT_ID)
     {
         int c = 0;
 #if defined(RUNTIME_PORT_ID)
@@ -82,28 +40,28 @@ getversionstring(char *buf)
 #if defined(RUNTIME_PORT_ID)
         tmp = get_port_id(tmpbuf);
         if (tmp)
-            Sprintf(eos(buf), "%s%s", c++ ? "," : "", tmp);
+            Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1, 
+                     "%s%s", c++ ? "," : "", tmp);
 #endif
-#if defined(NETHACK_GIT_SHA)
-        if (NetHack_git_sha)
-            Sprintf(eos(buf), "%s%s", c++ ? "," : "", NetHack_git_sha);
-#endif
-#if defined(NETHACK_GIT_BRANCH)
+        if (nomakedefs.git_sha)
+            Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1,
+                     "%s%s", c++ ? "," : "", nomakedefs.git_sha);
 #if (NH_DEVEL_STATUS != NH_STATUS_RELEASED)
-        if (NetHack_git_branch)
-            Sprintf(eos(buf), "%sbranch:%s",
-                    c++ ? "," : "", NetHack_git_branch);
-#endif
+        if (nomakedefs.git_branch)
+            Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1,
+                     "%sbranch:%s",
+                     c++ ? "," : "", nomakedefs.git_branch);
 #endif
         if (c)
-            Strcat(buf, ")");
+            Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1,
+                     "%s", ")");
         else /* if nothing has been added, strip " (" back off */
             *p = '\0';
         if (dotoff)
-            Strcat(buf, ".");
+            Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1,
+                     "%s", ".");
     }
-#endif /* RUNTIME_PORT_ID || NETHACK_GIT_SHA || NETHACK_GIT_BRANCH */
-
+#endif /* RUNTIME_PORT_ID */
     return buf;
 }
 
@@ -148,7 +106,7 @@ doextversion(void)
         (const char *) 0
   };
 #endif /*0*/
-#if defined(OPTIONS_AT_RUNTIME) || defined(CROSSCOMPILE_TARGET)
+#if defined(OPTIONS_AT_RUNTIME)
     use_dlb = FALSE;
 #else
     done_rt = TRUE;
@@ -267,7 +225,7 @@ early_version_info(boolean pastebuf)
     raw_printf("%s", buf);
 
     if (pastebuf) {
-#if defined(RUNTIME_PASTEBUF_SUPPORT) && !defined(LIBNH)
+#if defined(RUNTIME_PASTEBUF_SUPPORT) && !defined(LIBNH) 
         /*
          * Call a platform/port-specific routine to insert the
          * version information into a paste buffer. Useful for
@@ -327,7 +285,7 @@ comp_times(long filetime)
 {
     /* BUILD_TIME is constant but might have L suffix rather than UL;
        'filetime' is historically signed but ought to have been unsigned */
-    return (boolean) ((unsigned long) filetime < (unsigned long) BUILD_TIME);
+    return (boolean) ((unsigned long) filetime < (unsigned long) nomakedefs.build_time);
 }
 #endif
 
@@ -338,9 +296,9 @@ check_version(struct version_info *version_data, const char *filename,
     if (
 #ifdef VERSION_COMPATIBILITY
         version_data->incarnation < VERSION_COMPATIBILITY
-        || version_data->incarnation > VERSION_NUMBER
+        || version_data->incarnation > nomakedefs.version_number
 #else
-        version_data->incarnation != VERSION_NUMBER
+        version_data->incarnation != nomakedefs.version_number
 #endif
         ) {
         if (complain)
@@ -348,17 +306,17 @@ check_version(struct version_info *version_data, const char *filename,
         return FALSE;
     } else if (
 #ifndef IGNORED_FEATURES
-        version_data->feature_set != VERSION_FEATURES
+        version_data->feature_set != nomakedefs.version_features
 #else
-        (version_data->feature_set & ~IGNORED_FEATURES)
-            != (VERSION_FEATURES & ~IGNORED_FEATURES)
+        (version_data->feature_set & ~nomakedefs.ignored_features)
+            != (VERSION_FEATURES & ~nomakedefs.ignored_features)
 #endif
         || ((utdflags & UTD_SKIP_SANITY1) == 0
-             && version_data->entity_count != VERSION_SANITY1)
+             && version_data->entity_count != nomakedefs.version_sanity1)
         || ((utdflags & UTD_CHECKSIZES) &&
-            (version_data->struct_sizes1 != VERSION_SANITY2))
+            (version_data->struct_sizes1 != nomakedefs.version_sanity2))
         || ((utdflags & UTD_CHECKSIZES) &&
-            (version_data->struct_sizes2 != VERSION_SANITY3))) {
+            (version_data->struct_sizes2 != nomakedefs.version_sanity3))) {
         if (complain)
             pline("Configuration incompatibility for file \"%s\".", filename);
         return FALSE;
@@ -421,23 +379,16 @@ store_formatindicator(NHFILE *nhfp)
 void
 store_version(NHFILE *nhfp)
 {
-#if !defined(CROSSCOMPILE) || !defined(CROSSCOMPILE_TARGET)
-    static const struct version_info version_data = {
-        VERSION_NUMBER, VERSION_FEATURES,
-        VERSION_SANITY1, VERSION_SANITY2, VERSION_SANITY3
-#else
     struct version_info version_data = {
         0UL,0UL,0UL,0UL,0Ul
-#endif
     };
 
-#if defined(CROSSCOMPILE) && defined(CROSSCOMPILE_TARGET)
-    version_data.incarnation = VERSION_NUMBER;    /* actual version number */
-    version_data.feature_set = VERSION_FEATURES;  /* bitmask of config settings */
-    version_data.entity_count  = VERSION_SANITY1; /* # of monsters and objects */
-    version_data.struct_sizes1 = VERSION_SANITY2; /* size of key structs */
-    version_data.struct_sizes2 = VERSION_SANITY3; /* size of more key structs */
-#endif
+    version_data.incarnation = nomakedefs.version_number;    /* actual version number */
+    version_data.feature_set = nomakedefs.version_features;  /* bitmask of config settings */
+    version_data.entity_count  = nomakedefs.version_sanity1; /* # of monsters and objects */
+    version_data.struct_sizes1 = nomakedefs.version_sanity2; /* size of key structs */
+    version_data.struct_sizes2 = nomakedefs.version_sanity3; /* size of more key structs */
+
     if (nhfp->structlevel) {
         bufoff(nhfp->fd);
         /* bwrite() before bufon() uses plain write() */
@@ -504,10 +455,10 @@ copyright_banner_line(int indx)
     if (indx == 2)
         return COPYRIGHT_BANNER_B;
 #endif
-#ifdef COPYRIGHT_BANNER_C
+
     if (indx == 3)
-        return COPYRIGHT_BANNER_C;
-#endif
+        return nomakedefs.copyright_banner_c;
+
 #ifdef COPYRIGHT_BANNER_D
     if (indx == 4)
         return COPYRIGHT_BANNER_D;
index 52cf9e08029bcf99e16da7e348ed5485b7247ed4..13e6505480952b2bc1e8add34fb2d5d00788b79f 100644 (file)
@@ -383,7 +383,7 @@ RM_H           = $(INCL)/align.h    $(INCL)/rm.h
 SKILLS_H   = $(INCL)/skills.h
 SP_LEV_H   = $(INCL)/align.h   $(INCL)/sp_lev.h
 YOUPROP_H  = $(PERMONST_H)     $(MONDATA_H)        $(INCL)/prop.h     \
-           $(INCL)/pm.h       $(INCL)/youprop.h
+           $(INCL)/youprop.h
 YOU_H     = $(MONST_H)         $(YOUPROP_H)        $(INCL)/align.h    \
             $(INCL)/attrib.h   $(INCL)/you.h
 DISPLAY_H  = $(MONDATA_H)      $(INCL)/vision.h    $(INCL)/display.h
@@ -392,7 +392,7 @@ PCCONF_H   = $(INCL)/micro.h        $(INCL)/system.h    $(INCL)/pcconf.h   \
 CONFIG_H   = $(GLOBAL_H)       $(INCL)/fnamesiz.h  $(INCL)/tradstdc.h \
             $(INCL)/config1.h $(INCL)/config.h
 DECL_H    = $(YOU_H)           $(INCL)/spell.h     $(INCL)/color.h    \
-            $(INCL)/obj.h      $(INCL)/onames.h    $(INCL)/pm.h       \
+            $(INCL)/obj.h      $(INCL)/objects.h                      \
              $(INCL)/decl.h
 GLOBAL_H   = $(PCCONF_H)       $(INCL)/coord.h    $(INCL)/global.h
 HACK_H    = $(CONFIG_H)        $(INCL)/context.h  $(DUNGEON_H)        \
@@ -547,8 +547,8 @@ default: $(GAMEFILE)
 
 util: $(O)utility.tag
 
-$(O)utility.tag: $(INCL)/date.h $(INCL)/trap.h    $(INCL)/onames.h \
-       $(INCL)/pm.h      $(TILEUTIL)
+$(O)utility.tag: $(INCL)/date.h $(INCL)/trap.h    $(INCL)/objects.h \
+       $(TILEUTIL)
        $(subst /,\,echo utilities made > $@)
 
 tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe
index b7a591881bb7067d6466ed14beab8bf5da5421eb..357f3257e8ca393baab05516a04413e11e5e3b18 100644 (file)
@@ -50,8 +50,8 @@ the file NewInstall.unx.
 6.  Edit the top sections of the src and util Makefiles.  (If you are doing
     a full recompile, or if you got your files from someplace besides the
     official distribution, type 'touch makedefs.c' to make sure certain files
-    (onames.h, pm.h) get remade instead of relying on the potentially
-    troublesome timestamps.)  Then type 'make' in src and go get a cup of
+    get remade instead of relying on the potentially troublesome timestamps.)
+    Then type 'make' in src and go get a cup of
     coffee or take a nap, depending on the speed of your system.  You should
     now have created the game executable.
 
index 6e1c60b44fe8c2d0230b8ee682a0047c083160de..1aa7ab18d74f1faba55f88f012935cc5f8c2632d 100644 (file)
@@ -464,7 +464,7 @@ CONFIG_H = ../src/config.h-t
 HACK_H = ../src/hack.h-t
 
 # all .c that are part of the main NetHack program and are not operating- or
-# windowing-system specific
+# windowing-system specific. Do not include date.c in this list.
 HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \
           botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \
           do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \
@@ -514,7 +514,7 @@ VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) $(CHAINSRC) $(GENCSRC)
 CSOURCES = $(HACKCSRC) $(SYSCSRC) $(WINCSRC) $(CHAINSRC) $(GENCSRC)
 
 
-# all .h files except date.h, onames.h, and pm.h which would
+# all .h files except date.h, which would
 # cause dependency loops if run through "make depend"
 # and dgn_file.h, special level & dungeon files.
 #
@@ -522,19 +522,22 @@ HACKINCL = align.h artifact.h artilist.h attrib.h botl.h \
        color.h config.h config1.h context.h coord.h decl.h \
        display.h dlb.h dungeon.h engrave.h extern.h flag.h fnamesiz.h \
        func_tab.h global.h warnings.h hack.h lint.h mextra.h mfndpos.h \
-       micro.h mkroom.h \
-       monattk.h mondata.h monflag.h monst.h obj.h objclass.h \
-       optlist.h patchlevel.h pcconf.h permonst.h prop.h rect.h \
-       region.h sym.h defsym.h rm.h sp_lev.h spell.h sys.h system.h \
-       tcap.h timeout.h tradstdc.h trap.h unixconf.h vision.h vmsconf.h \
-       wintty.h wincurs.h winX.h winprocs.h wintype.h you.h youprop.h
+       micro.h mkroom.h monattk.h mondata.h monflag.h monst.h monsters.h \
+       obj.h objects.h objclass.h optlist.h patchlevel.h pcconf.h \
+       permonst.h prop.h rect.h region.h sym.h defsym.h rm.h sp_lev.h \
+       spell.h sys.h system.h tcap.h timeout.h tradstdc.h trap.h unixconf.h \
+       vision.h vmsconf.h wintty.h wincurs.h winX.h winprocs.h wintype.h \
+       you.h youprop.h
 
-HSOURCES = $(HACKINCL) date.h onames.h pm.h dgn_file.h
+HSOURCES = $(HACKINCL) dgn_file.h
 
 # the following .o's _must_ be made before any others (for makedefs)
 FIRSTOBJ = monst.o objects.o
 HOSTOBJ = $(FIRSTOBJ) alloc.o drawing.o
 
+#
+# $(TARGETPFX)date.o is not included in this list
+#
 HOBJ = $(TARGETPFX)allmain.o $(TARGETPFX)alloc.o \
        $(TARGETPFX)apply.o $(TARGETPFX)artifact.o $(TARGETPFX)attrib.o \
        $(TARGETPFX)ball.o $(TARGETPFX)bones.o $(TARGETPFX)botl.o \
@@ -576,6 +579,9 @@ HOBJ = $(TARGETPFX)allmain.o $(TARGETPFX)alloc.o \
        $(TARGETPFX)write.o $(TARGETPFX)zap.o \
        $(REGEXOBJ) $(RANDOBJ) $(SYSOBJ) $(WINOBJ) $(HINTOBJ) \
        $(TARGETPFX)version.o
+#
+DATE_O = $(TARGETPFX)date.o
+
 # the .o files from the HACKCSRC, SYSSRC, and WINSRC lists
 
 # first target is also the default target for 'make' without any arguments
@@ -588,40 +594,40 @@ pregame:
 $(GAME):       pregame $(SYSTEM)
        @echo "$(GAME) is up to date."
 
-Sysunix:       $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile
+Sysunix:       $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile
        @echo "Linking $(GAME)."
        $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \
-               $(HOBJ) $(WINLIB) $(TARGET_LIBS) $(LUALIB)
+               $(HOBJ) $(DATE_O) $(WINLIB) $(TARGET_LIBS) $(LUALIB)
        @touch Sysunix
 
-Sys3B2:        $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile
+Sys3B2:        $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile
        @echo "Linking $(GAME)."
        $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \
-               $(HOBJ) $(WINLIB) $(LUALIB) -lmalloc
+               $(HOBJ) $(DATE_O) $(WINLIB) $(LUALIB) -lmalloc
        @touch Sys3B2
 
-Sysatt:        $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile
+Sysatt:        $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile
        @echo "Loading $(GAME)."
        $(AT)$(LD) $(TARGET_LFLAGS) /lib/crt0s.o /lib/shlib.ifile -o $(GAMEBIN) \
-               $(HOSTOBJ) $(HOBJ) $(LUALIB)
+               $(HOSTOBJ) $(HOBJ) $(DATE_O) $(LUALIB)
        @touch Sysatt
 
-Systos:        $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile
+Systos:        $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile
        @echo "Linking $(GAME)."
        $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \
-               $(HOBJ) $(WINLIB) $(LUALIB)
+               $(HOBJ) $(DATE_O) $(WINLIB) $(LUALIB)
        @touch Systos
 
-SysV-AT:       DUMB.Setup $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile
+SysV-AT:       DUMB.Setup $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile
        @echo "Linking $(GAME)."
        $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \
-               $(HOBJ) $(WINLIB) $(LUALIB)
+               $(HOBJ) $(DATE_O) $(WINLIB) $(LUALIB)
        @touch SysV-AT
 
-SysBe: $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile
+SysBe: $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile
        @echo "Linking $(GAME)."
        $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAME) \
-               $(HOBJ) $(WINLIB) $(TARGET_LIBS) $(LUALIB)
+               $(HOBJ) $(DATE_O) $(WINLIB) $(TARGET_LIBS) $(LUALIB)
        @xres -o $(GAME) ../win/BeOS/nethack.rsrc
        @mimeset -f $(GAME)
        @touch SysBe
@@ -696,11 +702,12 @@ qt_yndlg.moc : ../win/Qt/qt_yndlg.h
 #      build monst.o and objects.o before executing '$(MAKE) makedefs'
 $(MAKEDEFS): $(FIRSTOBJ) \
                ../util/makedefs.c ../src/mdlib.c $(CONFIG_H) \
-               ../include/permonst.h \
-               ../include/objclass.h ../include/sym.h ../include/defsym.h \
-               ../include/artilist.h ../include/dungeon.h ../include/obj.h \
-               ../include/monst.h ../include/you.h ../include/flag.h \
-               ../include/dlb.h ../include/patchlevel.h
+               ../include/permonst.h ../include/monsters.h \
+               ../include/objclass.h ../include/objects.h ../include/sym.h \
+               ../include/defsym.h ../include/artilist.h \
+               ../include/dungeon.h ../include/obj.h ../include/monst.h \
+               ../include/you.h ../include/flag.h ../include/dlb.h \
+               ../include/patchlevel.h
        @( cd ../util ; $(MAKE) makedefs )
 
 #      Source files created by 'makedefs' at build time.
@@ -711,18 +718,24 @@ $(MAKEDEFS): $(FIRSTOBJ) \
 #      process of building it for foo.h.)
 ../include/onames.h: $(MAKEDEFS)
        @( cd ../util ; $(MAKE) ../include/onames.h )
-../include/pm.h: $(MAKEDEFS) ../include/onames.h
+../include/pm.h: $(MAKEDEFS)
        @( cd ../util ; $(MAKE) ../include/pm.h )
 #      Created at build time for configurations which support tiles,
 #      but not by makedefs so not connected to the others.
 tile.c: ../win/share/tilemap.c $(HACK_H)
        @( cd ../util ; $(MAKE) ../src/tile.c )
 
+
 ../win/gnome/gn_rip.h: ../win/X11/rip.xpm
        cp ../win/X11/rip.xpm ../win/gnome/gn_rip.h
 
 $(TARGETPFX)sfstruct.o: sfstruct.c $(HACK_H)
 
+#      date.c should be recompiled any time any of the source or include code
+#      is modified.
+$(TARGETPFX)date.o: date.c $(HACK_H) $(HACKCSRC) $(HOBJ)
+       $(TARGET_CC) $(TARGET_CFLAGS) $(GITHASH) $(GITBRANCH) -c -o $@ date.c
+
 #      date.h should be remade any time any of the source or include code
 #      is modified.  Unfortunately, this would make the contents of this
 #      file far more complex.  Since "hack.h" depends on most of the include
@@ -731,9 +744,7 @@ $(TARGETPFX)sfstruct.o: sfstruct.c $(HACK_H)
 #      Do NOT include ../dat/gitinfo.txt as either a prerequisite or target.
 #      'makedefs -v' processes it when present and ignores it if not.
 #
-#      hack.h depends on makedefs' output, so we know makedefs will be
-#      up to date before being executed
-../include/date.h:     $(VERSOURCES) $(HACK_H)
+../include/date.h: ../util/makedefs $(VERSOURCES) $(HACK_H)
        -$(SHELL) ../sys/unix/gitinfo.sh $(GITINFO) #before 'makedefs -v'
        ../util/makedefs -v
 
@@ -800,14 +811,14 @@ $(HACK_H): ../include/hack.h $(CONFIG_H) ../include/lint.h ../include/align.h \
                ../include/dungeon.h ../include/mkroom.h \
                ../include/objclass.h ../include/youprop.h ../include/prop.h \
                ../include/permonst.h ../include/monattk.h \
-               ../include/monflag.h ../include/mondata.h ../include/pm.h \
+               ../include/monflag.h ../include/mondata.h  \
                ../include/wintype.h ../include/context.h \
                ../include/sym.h ../include/defsym.h ../include/rm.h \
                ../include/botl.h ../include/rect.h ../include/region.h \
                ../include/decl.h ../include/quest.h ../include/spell.h \
                ../include/color.h ../include/obj.h ../include/engrave.h \
                ../include/you.h ../include/attrib.h ../include/monst.h \
-               ../include/mextra.h ../include/skills.h ../include/onames.h \
+               ../include/mextra.h ../include/skills.h ../include/monsters.h \
                ../include/timeout.h ../include/trap.h ../include/flag.h \
                ../include/vision.h ../include/display.h ../include/winprocs.h \
                ../include/sys.h
@@ -1097,8 +1108,9 @@ $(TARGETPFX)mondata.o: mondata.c $(HACK_H)
 $(TARGETPFX)monmove.o: monmove.c $(HACK_H) ../include/mfndpos.h \
                ../include/artifact.h
 $(TARGETPFX)monst.o: monst.c $(CONFIG_H) ../include/permonst.h \
-               ../include/align.h ../include/monattk.h ../include/monflag.h \
-               ../include/sym.h ../include/defsym.h ../include/color.h
+               ../include/monsters.h ../include/align.h ../include/monattk.h \
+               ../include/monflag.h ../include/sym.h ../include/defsym.h \
+               ../include/color.h
 $(TARGETPFX)mplayer.o: mplayer.c $(HACK_H)
 $(TARGETPFX)mthrowu.o: mthrowu.c $(HACK_H)
 $(TARGETPFX)muse.o: muse.c $(HACK_H)
index b2f7979e8eeb0833428b1e05dfba2d27dbf0399c..40692f08241a9c8ae979a67123ad8d810215ad3e 100644 (file)
@@ -179,7 +179,7 @@ CALLOC = ../src/alloc.c panic.c
 OALLOC = $(OBJDIR)/alloc.o panic.o
 
 # object files for makedefs
-MAKEOBJS = makedefs.o $(OMONOBJ)
+MAKEOBJS = makedefs.o $(OMONOBJ) $(OBJDIR)/date.o
 
 # object files for recovery utility
 RECOVOBJS = recover.o
@@ -209,17 +209,19 @@ makedefs: $(MAKEOBJS) mdgrep.h
 makedefs.o: makedefs.c ../src/mdlib.c $(CONFIG_H) ../include/permonst.h \
                ../include/objclass.h ../include/sym.h ../include/defsym.h \
                ../include/artilist.h ../include/dungeon.h ../include/obj.h \
-               ../include/monst.h ../include/you.h ../include/flag.h \
-               ../include/dlb.h ../include/patchlevel.h
+               ../include/monst.h ../include/monsters.h ../include/objects.h \
+               ../include/you.h ../include/flag.h ../include/dlb.h \
+               ../include/patchlevel.h
        $(CC) $(CFLAGS) -c makedefs.c -o $@
 
 # Don't require perl to build; that is why mdgrep.h is spelled wrong below.
 mdgreph: mdgrep.pl
        perl mdgrep.pl
 
-../include/onames.h: makedefs
+# These are for reference purposes only. They aren't required in the build.
+../include/onames.h: makedefs ../include/objects.h
        ./makedefs -o
-../include/pm.h: makedefs
+../include/pm.h: makedefs ../include/monsters.h
        ./makedefs -p
 
 lintdefs:
index 69bd88684bf4942ff3844f0837837f56f32900d7..14c524eebfa3795c59d81b29fdd25ced807a08f1 100644 (file)
                3186A37421A4B0FA0052BF02 /* attrib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = attrib.h; path = ../../include/attrib.h; sourceTree = "<group>"; };
                3186A37521A4B0FA0052BF02 /* patchlevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = patchlevel.h; path = ../../include/patchlevel.h; sourceTree = "<group>"; };
                3186A37621A4B0FA0052BF02 /* wincurs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wincurs.h; path = ../../include/wincurs.h; sourceTree = "<group>"; };
-               3186A37721A4B0FA0052BF02 /* pm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pm.h; path = ../../include/pm.h; sourceTree = "<group>"; };
                3186A37921A4B0FA0052BF02 /* monattk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monattk.h; path = ../../include/monattk.h; sourceTree = "<group>"; };
                3186A37A21A4B0FA0052BF02 /* integer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = integer.h; path = ../../include/integer.h; sourceTree = "<group>"; };
                3186A37B21A4B0FA0052BF02 /* region.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region.h; path = ../../include/region.h; sourceTree = "<group>"; };
                3186A38721A4B0FB0052BF02 /* color.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = color.h; path = ../../include/color.h; sourceTree = "<group>"; };
                3186A38821A4B0FB0052BF02 /* artifact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = artifact.h; path = ../../include/artifact.h; sourceTree = "<group>"; };
                3186A38A21A4B0FB0052BF02 /* system.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = system.h; path = ../../include/system.h; sourceTree = "<group>"; };
-               3186A38B21A4B0FC0052BF02 /* onames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = onames.h; path = ../../include/onames.h; sourceTree = "<group>"; };
                3186A38E21A4B0FC0052BF02 /* dlb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dlb.h; path = ../../include/dlb.h; sourceTree = "<group>"; };
                3186A38F21A4B0FC0052BF02 /* monflag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monflag.h; path = ../../include/monflag.h; sourceTree = "<group>"; };
                3186A39121A4B0FC0052BF02 /* micro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = micro.h; path = ../../include/micro.h; sourceTree = "<group>"; };
                                3186A39B21A4B0FD0052BF02 /* windconf.h */,
                                3186A39521A4B0FC0052BF02 /* obj.h */,
                                3186A3A821A4B0FD0052BF02 /* objclass.h */,
-                               3186A38B21A4B0FC0052BF02 /* onames.h */,
                                3186A37521A4B0FA0052BF02 /* patchlevel.h */,
                                3186A38121A4B0FB0052BF02 /* pcconf.h */,
                                3186A38321A4B0FB0052BF02 /* permonst.h */,
-                               3186A37721A4B0FA0052BF02 /* pm.h */,
                                3186A37F21A4B0FA0052BF02 /* prop.h */,
                                3186A39E21A4B0FD0052BF02 /* quest.h */,
                                3186A37C21A4B0FA0052BF02 /* rect.h */,
index 49b250f2d667958b7fed12c7dc8b9806e96275a5..76701643ca3a4bb4e8bea4508374f5e37c9d5ce0 100755 (executable)
@@ -139,6 +139,16 @@ WINOBJ = $(sort $(WINOBJ0))
 # prevent duplicates in VARDATND if both X11 and Qt are being supported
 VARDATND += $(sort $(VARDATND0))
 
+GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1)
+GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1)
+
+ifdef GIT_HASH
+GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\"
+endif
+ifdef GIT_BRANCH
+GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\"
+endif
+
 ifdef WANT_LIBNH
 CFLAGS += -DSHIM_GRAPHICS -DNOTTYGRAPHICS -DNOSHELL -DLIBNH
 LIBNHSYSSRC = ../sys/libnh/libnhmain.c \
index fd3a253adc1abaf43ca5cef831cfab12c6477a5a..c34fe4f3b5331db30f86212013a6112099f805b1 100755 (executable)
@@ -139,6 +139,16 @@ WINOBJ = $(sort $(WINOBJ0))
 # prevent duplicates in VARDATND if both X11 and Qt are being supported
 VARDATND += $(sort $(VARDATND0))
 
+GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1)
+GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1)
+
+ifdef GIT_HASH
+GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\"
+endif
+ifdef GIT_BRANCH
+GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\"
+endif 
+
 ifdef WANT_LIBNH
 CFLAGS += -DSHIM_GRAPHICS -DNOTTYGRAPHICS -DNOSHELL -DLIBNH
 LIBNHSYSSRC = ../sys/libnh/libnhmain.c \
index 98b572f447b3f1b95ecee56158d914b72a7d4a29..24251c18a9bcae46265425d12f1e8cda69a433f0 100644 (file)
@@ -112,6 +112,10 @@ main(int argc, char *argv[])
         if (argcheck(argc, argv, ARG_VERSION) == 2)
             exit(EXIT_SUCCESS);
 
+#ifndef NODUMPENUMS
+        if (argcheck(argc, argv, ARG_DUMPENUMS) == 2)
+            exit(EXIT_SUCCESS);
+#endif
         if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) {
 #ifdef CHDIR
             chdirx((char *) 0, 0);
index 97eb0823dcea215913346c7de45187054ca33ffa..0b9de8d15282ce64a45b544fa9a384135cb768ff 100644 (file)
@@ -172,7 +172,7 @@ HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \
 # .c files for this version (for date.h)
 VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) $(RANDSRC) $(GENCSRC)
 
-# all .h files except date.h, onames.h, pm.h, which would
+# all .h files except date.h which would
 # cause dependency loops if run through "make depend"
 #
 HACKINCL = align.h artifact.h artilist.h attrib.h color.h \
@@ -386,7 +386,7 @@ spotless :  clean
 # config.h timestamp
 $(CONFIG_H) : $(INC)config.h $(INC)config1.h $(INC)tradstdc.h $(INC)global.h \
                $(INC)coord.h $(INC)vmsconf.h $(INC)system.h $(INC)unixconf.h \
-               $(INC)micro.h $(INC)pcconf.h $(INC)windconf.h
+               $(INC)micro.h $(INC)pcconf.h $(INC)windconf.h $(INC)objects.h
        $(TOUCH) $(CONFIG_H)
 # hack.h timestamp
 $(HACK_H) : $(INC)hack.h $(CONFIG_H) $(INC)align.h \
@@ -398,7 +398,7 @@ $(HACK_H) : $(INC)hack.h $(CONFIG_H) $(INC)align.h \
                $(INC)spell.h $(INC)color.h $(INC)obj.h \
                $(INC)you.h $(INC)attrib.h $(INC)monst.h \
                $(INC)mextra.h $(INC)skills.h \
-               $(INC)onames.h $(INC)timeout.h $(INC)trap.h \
+               $(INC)monsters.h $(INC)timeout.h $(INC)trap.h \
                $(INC)flag.h $(INC)rm.h $(INC)vision.h \
                $(INC)display.h $(INC)engrave.h $(INC)rect.h $(INC)region.h \
                $(INC)winprocs.h $(INC)wintty.h $(INC)sys.h
index 2294157b966856130d51ecfcee4036dbe7abe436..fa0e42fa77c559791365d6210230a7c5f9090cdf 100644 (file)
@@ -239,9 +239,9 @@ Setting Up
 
     If you are recompiling after patching your sources, or if you got
     your files from somewhere other than the official distribution,
-    "touch makedefs.c" to ensure that certain files (onames.h and pm.h)
-    are remade, lest potentially troublesome timestamps fool your make
-    (or nmake) utility.
+    "touch makedefs.c" to ensure that certain files are remade,
+    lest potentially troublesome timestamps fool your make (or nmake)
+    utility.
 
 Compiling
 
index 504d1788204e521384faa49913d363c5f3163f1d..f0ac847384e40d49b97110d60973e839385d6e7e 100644 (file)
 #
 #       There are currently 4 decisions that you can choose to make.
 #       None of the 4 decisions are absolutely required because defaults are in place:
-#      1. Where do you want your build to end up?
-#      2. Do you want debug information in the executable?
-#      3. Do you want to explicitly override auto-detection of a 32-bit or 64-bit target?
-#       4. Do you want to include any optional interfaces in the port?
-#          4a) curses
-#          4b) Qt
+#      1. Do you have git commands in your path and NetHack in a git repository?
+#      2. Where do you want your build results to end up?
+#      3. Do you want debug information in the executable?
+#      4. Do you want to explicitly override auto-detection of a 32-bit or 64-bit target?
+#       5. Do you want to include any optional interfaces in the port?
+#          5a) curses
+#          5b) Qt
 #
 # Mandatory LUA source Location
 #
@@ -277,11 +278,53 @@ O  = $(OBJ)/
 
 U  = $(UTIL)/
 
+HACKINCL = $(INCL)/align.h $(INCL)/artifact.h $(INCL)/artilist.h \
+       $(INCL)/attrib.h $(INCL)/botl.h $(INCL)/color.h $(INCL)/config.h \
+       $(INCL)/config1.h $(INCL)/context.h $(INCL)/coord.h $(INCL)/decl.h \
+       $(INCL)/display.h $(INCL)/dlb.h $(INCL)/dungeon.h $(INCL)/engrave.h \
+       $(INCL)/extern.h $(INCL)/flag.h $(INCL)/fnamesiz.h $(INCL)/func_tab.h \
+       $(INCL)/global.h $(INCL)/warnings.h $(INCL)/hack.h $(INCL)/lint.h \
+       $(INCL)/mextra.h $(INCL)/mfndpos.h $(INCL)/micro.h $(INCL)/mkroom.h \
+       $(INCL)/monattk.h $(INCL)/mondata.h $(INCL)/monflag.h $(INCL)/monst.h \
+       $(INCL)/monsters.h $(INCL)/obj.h $(INCL)/objects.h $(INCL)/objclass.h \
+       $(INCL)/optlist.h $(INCL)/patchlevel.h $(INCL)/pcconf.h \
+       $(INCL)/permonst.h $(INCL)/prop.h $(INCL)/rect.h $(INCL)/region.h \
+       $(INCL)/sym.h $(INCL)/defsym.h $(INCL)/rm.h $(INCL)/sp_lev.h \
+       $(INCL)/spell.h $(INCL)/sys.h $(INCL)/system.h $(INCL)/tcap.h \
+       $(INCL)/timeout.h $(INCL)/tradstdc.h $(INCL)/trap.h \
+       $(INCL)/unixconf.h $(INCL)/vision.h $(INCL)/vmsconf.h \
+       $(INCL)/wintty.h $(INCL)/wincurs.h $(INCL)/winX.h \
+       $(INCL)/winprocs.h $(INCL)/wintype.h $(INCL)/you.h \
+       $(INCL)/youprop.h
+
+# all .c that are part of the main NetHack program and are not operating- or
+# windowing-system specific
+HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \
+          botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \
+          do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \
+          dungeon.c eat.c end.c engrave.c exper.c explode.c extralev.c \
+          files.c fountain.c hack.c hacklib.c \
+          insight.c invent.c isaac64.c light.c \
+          lock.c mail.c makemon.c mcastu.c mdlib.c mhitm.c \
+          mhitu.c minion.c mklev.c mkmap.c mkmaze.c mkobj.c mkroom.c mon.c \
+          mondata.c monmove.c monst.c mplayer.c mthrowu.c muse.c music.c \
+          nhlua.c nhlsel.c nhlobj.c o_init.c objects.c objnam.c \
+          options.c pager.c pickup.c pline.c polyself.c potion.c pray.c \
+          priest.c quest.c questpgr.c read.c rect.c region.c restore.c \
+          rip.c rnd.c role.c rumors.c save.c sfstruct.c \
+          shk.c shknam.c sit.c sounds.c \
+          sp_lev.c spell.c steal.c steed.c symbols.c sys.c teleport.c \
+          timeout.c topten.c track.c trap.c u_init.c \
+          uhitm.c vault.c version.c vision.c weapon.c were.c wield.c \
+          windows.c wizard.c worm.c worn.c write.c zap.c
+
+
 #
 # Utility Objects.
 #
 
-MAKEDEFSOBJS       = $(O)makedefs.o $(O)monst.o $(O)objects.o
+MAKEDEFSOBJS       = $(O)makedefs.o $(O)monst.o $(O)objects.o \
+                       $(O)date.o
 
 RECOVOBJS      = $(O)recover.o
 
@@ -491,21 +534,31 @@ endif
 # Header file macros
 #==========================================
 
+ifdef GIT_HASH
+GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\"
+endif
+
+ifdef GIT_BRANCH
+GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\"
+endif
+
 CONFIG_H = $(INCL)/config.h $(INCL)/patchlevel.h \
                $(INCL)/config1.h $(INCL)/tradstdc.h \
                $(INCL)/global.h $(INCL)/fnamesiz.h $(INCL)/coord.h \
                $(INCL)/vmsconf.h $(INCL)/system.h $(INCL)/unixconf.h \
-               $(INCL)/micro.h $(INCL)/pcconf.h $(INCL)/windconf.h
+               $(INCL)/micro.h $(INCL)/pcconf.h $(INCL)/windconf.h \
+               $(INCL)/objects.h
 
 HACK_H = $(INCL)/hack.h $(CONFIG_H) $(INCL)/align.h $(INCL)/context.h \
               $(INCL)/dungeon.h $(INCL)/sym.h $(INCL)/defsym.h \
               $(INCL)/mkroom.h $(INCL)/objclass.h $(INCL)/youprop.h \
               $(INCL)/prop.h $(INCL)/permonst.h $(INCL)/monattk.h \
-              $(INCL)/monflag.h $(INCL)/mondata.h $(INCL)/pm.h \
+              $(INCL)/monflag.h $(INCL)/mondata.h $(INCL)/monsters.h \
               $(INCL)/wintype.h $(INCL)/decl.h $(INCL)/quest.h \
               $(INCL)/spell.h $(INCL)/color.h $(INCL)/obj.h \
+              $(INCL)/objects.h \
               $(INCL)/you.h $(INCL)/attrib.h $(INCL)/monst.h $(INCL)/lint.h \
-              $(INCL)/mextra.h $(INCL)/skills.h $(INCL)/onames.h \
+              $(INCL)/mextra.h $(INCL)/skills.h \
               $(INCL)/timeout.h $(INCL)/trap.h $(INCL)/flag.h \
               $(INCL)/rm.h $(INCL)/vision.h $(INCL)/display.h \
               $(INCL)/engrave.h $(INCL)/rect.h $(INCL)/region.h \
@@ -805,8 +858,7 @@ recover: $(U)recover.exe
 $(O)sp_lev.tag: $(O)utility.tag
        $(subst /,\,echo sp_levs done > $(O)sp_lev.tag)
 
-$(O)utility.tag: $(INCL)/date.h $(INCL)/onames.h $(INCL)/pm.h \
-        $(TILEUTIL16)
+$(O)utility.tag: $(TILEUTIL16)
        $(subst /,\,@echo utilities made >$@)
        @echo utilities made.
 
@@ -840,11 +892,12 @@ gamedir.tag:
        test -d $(GAMEDIR) && echo directory created > $@
 
 $(GAMEDIR)/NetHack.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)consoletty.o $(O)guistub.o \
-                       $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)conres.o $(KEYDLLS) \
+                       $(ALLOBJ) $(TTYOBJ) $(O)date.o $(GUIOBJ) $(O)conres.o $(KEYDLLS) \
                        $(LUATARGETS)
        @echo Linking $@...
        $(link) $(lflags) -o$@ $(ALLOBJ) $(TTYOBJ) $(O)consoletty.o $(O)tile.o \
-               $(O)guistub.o $(O)conres.o $(PDCLIB) $(LUALIB) $(conlibs) -static -lstdc++
+               $(O)guistub.o $(O)date.o $(O)conres.o $(PDCLIB) $(LUALIB) \
+               $(conlibs) -static -lstdc++
        $(subst /,\,@if exist $(O)install.tag del $(O)install.tag)
 
 # NetHackW
@@ -860,7 +913,8 @@ $(GAMEDIR)/NetHackW.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)ttystub.o \
                        $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)winres.o $(KEYDLLS) \
                        $(LUATARGETS)
        @echo Linking $@...
-       $(link) $(lflags) -mwindows -o$@ $(ALLOBJ) $(GUIOBJ) $(O)tile.o $(O)ttystub.o \
+       $(link) $(lflags) -mwindows -o$@ $(ALLOBJ) $(GUIOBJ) $(O)tile.o \
+               $(O)ttystub.o $(O)date.o \
                $(O)winres.o $(PDCLIB) $(guilibs) $(LUALIB) -static -lstdc++
        $(subst /,\,@if exist $(O)install.tag del $(O)install.tag)
 endif
@@ -922,9 +976,25 @@ $(O)makedefs.o: $(CONFIG_H) $(INCL)/monattk.h $(INCL)/monflag.h \
         $(U)makedefs.c $(SRC)\mdlib.c
        $(cc) $(CFLAGSU) -o$@ $(U)makedefs.c
 
+ifeq "$(GIT_AVAILABLE)" "1"
+GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1)
+GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1)
+
+ifdef GIT_HASH
+GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\"
+endif
+ifdef GIT_BRANCH
+GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\"
+endif
+endif
+
+$(O)date.o: $(HACKINCL) $(HACKSRC) $(HACKOBJ) $(ALLOBJ)
+       $(cc) $(CFLAGS) $(GITHASH) $(GITBRANCH) -o$@ $(SRC)/date.c
+
 #
-#  date.h should be remade every time any of the source or include
-#  files is modified.
+#  if you are making date.h for reference purposes (it isn't required
+#  for the build anymore), it should be remade every time any of the
+#  source or include files is modified.
 #
 
 $(INCL)/date.h $(OPTIONS_FILE): $(U)makedefs.exe
@@ -1453,7 +1523,7 @@ $(O)termcap.o: ../win/tty/termcap.c $(HACK_H) $(INCL)/tcap.h
 $(O)topl.o: ../win/tty/topl.c $(HACK_H) $(INCL)/tcap.h
        $(cc) $(CFLAGS) -o$@ ../win/tty/topl.c
 $(O)wintty.o: ../win/tty/wintty.c $(HACK_H) $(INCL)/dlb.h \
-               $(INCL)/date.h $(INCL)/tcap.h
+               $(INCL)/tcap.h
        $(cc) $(CFLAGS) -o$@ ../win/tty/wintty.c
 #$(O)Window.o: ../win/X11/Window.c $(INCL)/xwindowp.h $(INCL)/xwindow.h \
 #              $(CONFIG_H)
@@ -1702,7 +1772,7 @@ $(O)trap.o: trap.c $(HACK_H)
 $(O)u_init.o: u_init.c $(HACK_H)
 $(O)uhitm.o: uhitm.c $(HACK_H)
 $(O)vault.o: vault.c $(HACK_H)
-$(O)version.o: version.c $(HACK_H) $(INCL)/date.h
+$(O)version.o: version.c $(HACK_H)
 $(O)vision.o: vision.c $(HACK_H)
 $(O)weapon.o: weapon.c $(HACK_H)
 $(O)were.o: were.c $(HACK_H)
index fa163272e78ed70873354e2aeb922bf10614aad4..86f8d79f3f39e12948c7e0a471e6fff86612f819 100644 (file)
@@ -1,5 +1,5 @@
 # NetHack 3.7 Makefile.msc
-#       Copyright (c) NetHack PC Development Team 1993-2020
+#       Copyright (c) NetHack PC Development Team 1993-2021
 #
 #==============================================================================
 # Build Tools Environment
 #       none of the 5 decisions are absolutely required because defaults
 #       are in place:
 #
-#      1. Where do you want your build results to end up?
-#       2. Do you want to include the optional curses port?
-#       3. Do you want to include compressed savefile support to
+#       1. Do you have git commands in your path and NetHack in a
+#          git repository?
+#      2. Where do you want your build results to end up?
+#       3. Do you want to include the optional curses port?
+#       4. Do you want to include compressed savefile support to
 #          transfer compressed savefiles between platforms?
-#      4. Do you want debug information in the executable?
-#      5. Do you want to explicitly override auto-detection of
+#      5. Do you want debug information in the executable?
+#      6. Do you want to explicitly override auto-detection of
 #          a 32-bit or 64-bit target?
 #
 # Mandatory Lua source Location (not optional)
 #
 #------------------------------------------------------------------------------
 #==============================================================================
+
 #
 #------------------------------------------------------------------------------
-# 1. Where do you want the game to be built (which folder)?
+# 1. Do you have git commands available and NetHack in a git repository.
+#    If not, such as if you obtained the NetHack sources in a zip file download,
+#    set GIT_AVAILABLE = 0
+#
+GIT_AVAILABLE = 1
+#
+#------------------------------------------------------------------------------
+# 2. Where do you want the game to be built (which folder)?
 #
 GAMEDIR = ..\binary               # Default game build directory
 #
 #------------------------------------------------------------------------------
 # OPTIONAL - Curses window port support
 #
-# 2. Uncomment these and set them appropriately if you want to
+# 3. Uncomment these and set them appropriately if you want to
 #    include curses port support alongside TTY support in your
 #    NetHack.exe binary.
 #
@@ -100,24 +110,24 @@ GAMEDIR = ..\binary               # Default game build directory
 #    of your PDCurses C files.
 #
 #ADD_CURSES=Y
-#PDCURSES_TOP=..\lib\pdcursesmod
+#PDCURSES_TOP=..\lib\pdcurses
 #
 #------------------------------------------------------------------------------
 # OPTIONAL - zlib support (to allow compressed savefile exchange across platforms
 #
-# 3. Location of zlib sources
+# 4. Location of zlib sources
 #
 #
 #ADD_ZLIB=Y
 #ZLIBTOP=..\lib\zlib
 #
 #------------------------------------------------------------------------------
-# 4. Do you want debug information available to the executable?
+# 5. Do you want debug information available to the executable?
 #
 DEBUGINFO = Y
 #
 #------------------------------------------------------------------------------
-# 5. This Makefile will attempt to auto-detect your selected target architecture
+# 6. This Makefile will attempt to auto-detect your selected target architecture
 #    based on Visual Studio command prompt configuration settins etc.
 #    However, if you want to manually override generation of a
 #    32-bit or 64-bit build target, you can uncomment the apppropriate
@@ -260,13 +270,55 @@ CROSSCOMPILE_TARGET=
 CROSSCOMPILE=
 !ENDIF
 
+HACKINCL = $(INCL)\align.h $(INCL)\artifact.h $(INCL)\artilist.h \
+       $(INCL)\attrib.h $(INCL)\botl.h $(INCL)\color.h $(INCL)\config.h \
+       $(INCL)\config1.h $(INCL)\context.h $(INCL)\coord.h $(INCL)\decl.h \
+       $(INCL)\display.h $(INCL)\dlb.h $(INCL)\dungeon.h $(INCL)\engrave.h \
+       $(INCL)\extern.h $(INCL)\flag.h $(INCL)\fnamesiz.h $(INCL)\func_tab.h \
+       $(INCL)\global.h $(INCL)\warnings.h $(INCL)\hack.h $(INCL)\lint.h \
+       $(INCL)\mextra.h $(INCL)\mfndpos.h $(INCL)\micro.h $(INCL)\mkroom.h \
+       $(INCL)\monattk.h $(INCL)\mondata.h $(INCL)\monflag.h $(INCL)\monst.h \
+       $(INCL)\monsters.h $(INCL)\obj.h $(INCL)\objects.h $(INCL)\objclass.h \
+       $(INCL)\optlist.h $(INCL)\patchlevel.h $(INCL)\pcconf.h \
+       $(INCL)\permonst.h $(INCL)\prop.h $(INCL)\rect.h $(INCL)\region.h \
+       $(INCL)\sym.h $(INCL)\defsym.h $(INCL)\rm.h $(INCL)\sp_lev.h \
+       $(INCL)\spell.h $(INCL)\sys.h $(INCL)\system.h $(INCL)\tcap.h \
+       $(INCL)\timeout.h $(INCL)\tradstdc.h $(INCL)\trap.h \
+       $(INCL)\unixconf.h $(INCL)\vision.h $(INCL)\vmsconf.h \
+       $(INCL)\wintty.h $(INCL)\wincurs.h $(INCL)\winX.h \
+       $(INCL)\winprocs.h $(INCL)\wintype.h $(INCL)\you.h \
+       $(INCL)\youprop.h
+
+# all .c that are part of the main NetHack program and are not operating- or
+# windowing-system specific
+HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \
+          botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \
+          do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \
+          dungeon.c eat.c end.c engrave.c exper.c explode.c extralev.c \
+          files.c fountain.c hack.c hacklib.c \
+          insight.c invent.c isaac64.c light.c \
+          lock.c mail.c makemon.c mcastu.c mdlib.c mhitm.c \
+          mhitu.c minion.c mklev.c mkmap.c mkmaze.c mkobj.c mkroom.c mon.c \
+          mondata.c monmove.c monst.c mplayer.c mthrowu.c muse.c music.c \
+          nhlua.c nhlsel.c nhlobj.c o_init.c objects.c objnam.c \
+          options.c pager.c pickup.c pline.c polyself.c potion.c pray.c \
+          priest.c quest.c questpgr.c read.c rect.c region.c restore.c \
+          rip.c rnd.c role.c rumors.c save.c sfstruct.c \
+          shk.c shknam.c sit.c sounds.c \
+          sp_lev.c spell.c steal.c steed.c symbols.c sys.c teleport.c \
+          timeout.c topten.c track.c trap.c u_init.c \
+          uhitm.c vault.c version.c vision.c weapon.c were.c wield.c \
+          windows.c wizard.c worm.c worn.c write.c zap.c
+
+
 #
 # Utility Objects.
 #
 
 MAKESRC       = $(U)makedefs.c
 
-MAKEDEFSOBJS  = $(O)makedefs.o $(O)monst$(HOST).o $(O)objects$(HOST).o
+MAKEDEFSOBJS  = $(O)makedefs.o $(O)monst$(HOST).o $(O)objects$(HOST).o \
+               $(O)date.o
 
 RECOVOBJS      = $(O)recover.o
 
@@ -333,6 +385,14 @@ TTYOBJ = $(O)topl.o     $(O)getline.o  $(O)wintty.o
 
 MDLIB = $(O)mdlib.o
 
+!IFDEF GIT_HASH
+GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\"
+!ENDIF
+
+!IFDEF GIT_BRANCH
+GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\"
+!ENDIF
+
 !IFNDEF ADD_CURSES
 CURSESOBJ=
 !ELSE
@@ -490,14 +550,14 @@ HACK_H = $(INCL)\hack.h $(CONFIG_H) $(INCL)\lint.h $(INCL)\align.h \
                $(INCL)\dungeon.h $(INCL)\mkroom.h \
                $(INCL)\objclass.h $(INCL)\youprop.h $(INCL)\prop.h \
                $(INCL)\permonst.h $(INCL)\monattk.h \
-               $(INCL)\monflag.h $(INCL)\mondata.h $(INCL)\pm.h \
+               $(INCL)\monflag.h $(INCL)\mondata.h \
                $(INCL)\wintype.h $(INCL)\context.h \
                $(INCL)\sym.h $(INCL)\defsym.h $(INCL)\rm.h \
                $(INCL)\botl.h $(INCL)\rect.h \
                $(INCL)\region.h $(INCL)\decl.h $(INCL)\quest.h \
                $(INCL)\spell.h $(INCL)\color.h $(INCL)\obj.h \
                $(INCL)\you.h $(INCL)\attrib.h $(INCL)\monst.h \
-               $(INCL)\mextra.h $(INCL)\skills.h $(INCL)\onames.h \
+               $(INCL)\mextra.h $(INCL)\skills.h \
                $(INCL)\timeout.h $(INCL)\trap.h $(INCL)\flag.h \
                $(INCL)\vision.h $(INCL)\display.h $(INCL)\engrave.h \
                $(INCL)\winprocs.h $(INCL)\sys.h $(INCL)\wintty.h
@@ -918,7 +978,7 @@ GAMEOBJ=$(GAMEOBJ:^ =^
 
 
 $(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(O)tile.o $(O)consoletty.o $(O)guistub.o \
-                       $(ALLOBJ) $(TTYOBJ) $(O)console.res $(KEYDLLS) \
+                       $(ALLOBJ) $(TTYOBJ) $(O)date.o $(O)console.res $(KEYDLLS) \
                        $(LUATARGETS) $(PDCLIB)
        @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR)
        @echo Linking $(@:\=/)
@@ -930,6 +990,7 @@ $(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(O)tile.o $(O)consoletty.o $(O)guistub
                $(O)consoletty.o
                $(O)tile.o
                $(O)guistub.o
+               $(O)date.o
                $(O)console.res
 <<
        @if exist $(O)install.tag del $(O)install.tag
@@ -943,7 +1004,7 @@ $(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(O)tile.o $(O)consoletty.o $(O)guistub
 #    objs: $(GAMEOBJ) $(GUIOBJ) $(O)tile.o $(O)ttystub.o
 
 $(GAMEDIR)\NetHackW.exe : $(O)gamedir.tag $(O)tile.o $(O)ttystub.o \
-                       $(ALLOBJ) $(GUIOBJ) $(O)NetHackW.res \
+                       $(ALLOBJ) $(GUIOBJ) $(O)date.o $(O)NetHackW.res \
                        $(O)gamedir.tag $(KEYDLLS) \
                        $(LUATARGETS)
        @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR)
@@ -955,6 +1016,7 @@ $(GAMEDIR)\NetHackW.exe : $(O)gamedir.tag $(O)tile.o $(O)ttystub.o \
                $(GUIOBJ)
                $(O)tile.o
                $(O)ttystub.o
+               $(O)date.o
                $(O)NetHackW.res
 <<
 
@@ -1050,8 +1112,7 @@ recover: $(U)recover.exe
 $(O)sp_lev.tag:
        echo sp_levs done > $(O)sp_lev.tag
 
-$(O)utility.tag: $(INCL)\nhlua.h $(INCL)\date.h $(INCL)\onames.h $(INCL)\pm.h \
-               $(U)tile2bmp.exe
+$(O)utility.tag: $(INCL)\nhlua.h $(U)tile2bmp.exe $(U)makedefs.exe
             @echo utilities made >$@
             @echo utilities made.
 
@@ -1104,6 +1165,34 @@ $(O)makedefs.o: $(U)makedefs.c $(SRC)\mdlib.c $(CONFIG_H) $(INCL)\permonst.h \
        @$(cc) -DENUM_PM $(cflagsBuild) $(CROSSCOMPILE) -Fo$@ $(U)makedefs.c
 #      @$(cc) -DENUM_PM $(cflagsBuild) $(CROSSCOMPILE) /EP -Fo$@ $(U)makedefs.c >makedefs.c.preprocessed
 
+#
+# This is awful, but it allows the GITHASH and GITBRANCH macros to be
+# defined and utilized, using only build-in Windows and nmake commands,
+# as well as the necessary git commands.
+#
+# We build a temporary Makefile on-the-fly for compiling date.c and
+# invoke nmake again.
+#
+$(O)date.o: $(HACKINCL) $(HACKSRC) $(HACKOBJ) $(ALLOBJ)
+!IF "$(GIT_AVAILABLE)" == "1"
+       @git rev-parse --verify HEAD 2>&1 >$(O)date1.tmp
+       @git rev-parse --abbrev-ref HEAD 2>&1 >$(O)date2.tmp
+       @echo.>date.nmk
+       @echo OBJ = $(OBJ)>>date.nmk
+       @echo O = ^$(OBJ)^^^\>>date.nmk
+       @echo cc = $(cc)>>date.nmk
+       @echo cflagsBuild = $(cflagsBuild) ^\>>date.nmk
+       @for /F "usebackq" %%A IN ("$(O)date1.tmp") DO @echo.   -DNETHACK_GIT_SHA=\"%%A\" ^\>>date.nmk
+       @for /F "usebackq" %%A IN ("$(O)date2.tmp") DO @echo.   -DNETHACK_GIT_BRANCH=\"%%A\">>date.nmk
+       @echo.>>date.nmk
+       @echo default: ^$(O)date.o>>date.nmk
+       @echo.>>date.nmk
+       @echo ^$(O)date.o: >>date.nmk
+       @echo.  ^$(cc) ^$(cflagsBuild) -Fo^$@ date.c>>date.nmk
+       @echo.>>date.nmk
+       @$(MAKE) /NOLOGO /A -f date.nmk
+!ENDIF
+
 #
 #  date.h should be remade every time any of the source or include
 #  files is modified.
@@ -1349,7 +1438,7 @@ $(O)tilete32.o: $(WSHR)\tiletext.c  $(CONFIG_H) $(TILE_H)
 #==========================================
 
 $(U)gif2txt.exe: $(GIFREADERS_HOST) $(TEXT_IO)
-       @echo Linking $(@:\=/)
+       @echo Linking $(@:\=/)
        @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk
                $(GIFREADERS_HOST:^     =^
                )
@@ -1358,7 +1447,7 @@ $(U)gif2txt.exe: $(GIFREADERS_HOST) $(TEXT_IO)
 <<
 
 $(U)gif2tx32.exe: $(GIFREADERS32_HOST) $(TEXT_IO32)
-       @echo Linking $(@:\=/)
+       @echo Linking $(@:\=/)
        @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk
                $(GIFREADERS32_HOST:^   =^
                )
@@ -1367,7 +1456,7 @@ $(U)gif2tx32.exe: $(GIFREADERS32_HOST) $(TEXT_IO32)
 <<
 
 $(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO)
-       @echo Linking $(@:\=/)
+       @echo Linking $(@:\=/)
        @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk
                $(PPMWRITERS:^  =^
                )
@@ -1380,7 +1469,7 @@ $(SRC)\tiles.bmp: $(U)tile2bmp.exe $(TILEFILES)
        @$(U)tile2bmp $@
 
 $(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO)
-       @echo Linking $(@:\=/)
+       @echo Linking $(@:\=/)
        @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk
                $(O)tile2bmp.o
                $(TEXT_IO:^  =^
@@ -1388,7 +1477,7 @@ $(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO)
 <<
 
 $(U)til2bm32.exe: $(O)til2bm32.o $(TEXT_IO32)
-       @echo Linking $(@:\=/)
+       @echo Linking $(@:\=/)
        @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk
                $(O)til2bm32.o
                $(TEXT_IO32:^  =^
@@ -1420,10 +1509,10 @@ $(O)tile2x11.o: $(X11)\tile2x11.c $(HACK_H) $(TILE_H) $(INCL)\tile2x11.h
 
 $(SRC)\x11tiles: $(U)tile2x11.exe $(WSHR)\monsters.txt $(WSHR)\objects.txt \
                                $(WSHR)\other.txt \
-                                $(WSHR)\monsters.txt
+                               $(WSHR)\monsters.txt
        $(U)tile2x11 $(WSHR)\monsters.txt $(WSHR)\objects.txt \
                                $(WSHR)\other.txt \
-                                -grayscale $(WSHR)\monsters.txt
+                               -grayscale $(WSHR)\monsters.txt
 
 #===============================================================================
 # PDCurses
@@ -1587,11 +1676,13 @@ $(O)monst.o: monst.c $(CONFIG_H) $(INCL)\permonst.h $(INCL)\align.h \
 
 $(O)objects_host.o: objects.c $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \
                $(INCL)\prop.h $(INCL)\skills.h $(INCL)\color.h
-       @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ objects.c
+       @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) /EP  $(@B).c > $(O)$(@B).c.preproc
+       @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@  $(@B).c
 
 $(O)objects.o: objects.c $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \
                $(INCL)\prop.h $(INCL)\skills.h $(INCL)\color.h
-       @$(cc) $(cflagsBuild) -Fo$@ objects.c
+       @$(cc) $(cflagsBuild) /EP  $(@B).c > $(O)$(@B).c.preproc
+       @$(cc) $(cflagsBuild) -Fo$@  $(@B).c
 
 $(O)alloc_host.o: alloc.c $(CONFIG_H)
        @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ alloc.c
@@ -1948,6 +2039,8 @@ $(O)wc_chainout.o: ..\win\chain\wc_chainout.c $(HACK_H)
 $(O)wc_trace.o: ..\win\chain\wc_trace.c $(HACK_H) $(INCL)\func_tab.h
 #      @$(cc) $(cflagsBuild) -Fo$@  ..\win\chain\wc_trace.c
 $(O)allmain.o: allmain.c $(HACK_H)
+       @$(cc) $(cflagsBuild) /EP  $(@B).c > $(O)$(@B).c.preproc
+       @$(cc) $(cflagsBuild) -Fo$@  $(@B).c
 $(O)alloc.o: alloc.c $(CONFIG_H)
 $(O)apply.o: apply.c $(HACK_H)
 $(O)artifact.o: artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h
@@ -2064,7 +2157,7 @@ $(O)trap.o: trap.c $(HACK_H)
 $(O)u_init.o: u_init.c $(HACK_H)
 $(O)uhitm.o: uhitm.c $(HACK_H)
 $(O)vault.o: vault.c $(HACK_H)
-$(O)version.o: version.c $(HACK_H) $(INCL)\dlb.h $(INCL)\date.h
+$(O)version.o: version.c $(HACK_H) $(INCL)\dlb.h
        @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ version.c
 $(O)vision.o: vision.c $(HACK_H)
 $(O)weapon.o: weapon.c $(HACK_H)
index 1f9557959e91ee01230bf7253dc4743321b22a71..58e48f77e93fe6348b5ae1fe32f2c11a962261bc 100644 (file)
     <ClInclude Include="$(IncDir)windconf.h" />\r
     <ClInclude Include="$(IncDir)obj.h" />\r
     <ClInclude Include="$(IncDir)objclass.h" />\r
-    <ClInclude Include="$(IncDir)onames.h" />\r
     <ClInclude Include="$(IncDir)patchlevel.h" />\r
     <ClInclude Include="$(IncDir)permonst.h" />\r
-    <ClInclude Include="$(IncDir)pm.h" />\r
     <ClInclude Include="$(IncDir)prop.h" />\r
     <ClInclude Include="$(IncDir)quest.h" />\r
     <ClInclude Include="$(IncDir)rect.h" />\r
index 2a41b696d5761ac6335c16c36896703add8d4164..4730c89ca3344e180dbdc98e5f0914d8d889835e 100644 (file)
     <ClInclude Include="$(IncDir)windconf.h" />\r
     <ClInclude Include="$(IncDir)obj.h" />\r
     <ClInclude Include="$(IncDir)objclass.h" />\r
-    <ClInclude Include="$(IncDir)onames.h" />\r
     <ClInclude Include="$(IncDir)optlist.h" />\r
     <ClInclude Include="$(IncDir)patchlevel.h" />\r
     <ClInclude Include="$(IncDir)pcconf.h" />\r
     <ClInclude Include="$(IncDir)permonst.h" />\r
-    <ClInclude Include="$(IncDir)pm.h" />\r
     <ClInclude Include="$(IncDir)prop.h" />\r
     <ClInclude Include="$(IncDir)quest.h" />\r
     <ClInclude Include="$(IncDir)rect.h" />\r
index 4f21e681d07fe3ea553cf6d321e69786d34db39a..2c8e74f4da29978d123ca27549865cde635733ad 100644 (file)
@@ -6,8 +6,6 @@
     <Defs Include = "$(IncDir)date.h"/>
        <!-- -o -->
     <Defs Include = "$(IncDir)onames.h"/>
-       <!-- -p -->
-    <Defs Include = "$(IncDir)pm.h"/>
        <!-- -r -->
     <Defs Include = "$(DatDir)rumors"/>
        <!-- -s -->
index a8178b86de0f7d7a4be726fc3005b7273e5f9a59..7bacd3433757b039b46428453d31ef5d65451eba 100644 (file)
@@ -55,9 +55,7 @@
     <ClInclude Include="$(IncDir)windconf.h" />\r
     <ClInclude Include="$(IncDir)obj.h" />\r
     <ClInclude Include="$(IncDir)objclass.h" />\r
-    <ClInclude Include="$(IncDir)onames.h" />\r
     <ClInclude Include="$(IncDir)permonst.h" />\r
-    <ClInclude Include="$(IncDir)pm.h" />\r
     <ClInclude Include="$(IncDir)prop.h" />\r
     <ClInclude Include="$(IncDir)quest.h" />\r
     <ClInclude Include="$(IncDir)rect.h" />\r
index 6259402197778a741a1f37c45c6acb6e52dbf8cc..c279e0616470089eb63470456186b8843a9b4967 100644 (file)
@@ -648,6 +648,11 @@ process_options(int argc, char * argv[])
             reveal_paths();
             nethack_exit(EXIT_SUCCESS);
         }
+#ifndef NODUMPENUMS
+        if (argcheck(argc, argv, ARG_DUMPENUMS) == 2) {
+            nethack_exit(EXIT_SUCCESS);
+       }
+#endif
         if (argcheck(argc, argv, ARG_DEBUG) == 1) {
             argc--;
             argv++;
index e1a5d237dcb9e7904c82fa2cbdb514b08dd53672..db0b1f41aa35b4fab826467daf92ab9c6092cda1 100644 (file)
@@ -539,9 +539,4 @@ xexit(int retcd)
     /*NOTREACHED*/
 }
 
-#ifdef AMIGA
-#include "date.h"
-const char amiga_version_string[] = AMIGA_VERSION_STRING;
-#endif
-
 /*dlb_main.c*/
index d3e164c620df7178851835b5cc15d9a253b2c877..7256759d2521a930aaa58f229ef313c067d4c0d3 100644 (file)
@@ -108,7 +108,10 @@ static const char
     *Dont_Edit_Code =
         "/* This source file is generated by 'makedefs'.  Do not edit. */\n",
     *Dont_Edit_Data =
-        "#\tThis data file is generated by 'makedefs'.  Do not edit. \n";
+        "#\tThis data file is generated by 'makedefs'.  Do not edit. \n",
+    *Reference_file =
+        "/* This file is generated by 'makedefs' for reference purposes only. */\n"
+        "/* It is no longer used in the NetHack build. */\n";
 
 static struct version_info version;
 
@@ -451,7 +454,7 @@ do_ext_makedefs(int argc, char **argv)
             delim[0] = '\0';
             if (argv[0])
                 strcpy(delim, argv[0]);
-            Fprintf(stdout, "%s", version_string(buf, delim));
+            Fprintf(stdout, "%s", mdlib_version_string(buf, delim));
             exit(EXIT_SUCCESS);
         }
         IS_OPTION("debug") {
@@ -1105,7 +1108,7 @@ do_date(void)
     /* NB: We've moved on from SCCS, but this way this line
      * won't get clobbered when downstream projects import
      * this file into something more modern. */
-    Fprintf(ofp, "%s", Dont_Edit_Code);
+    Fprintf(ofp, "%s", Reference_file);
 
     (void) time(&clocktim);
 #ifdef REPRODUCIBLE_BUILD
@@ -1226,11 +1229,11 @@ do_date(void)
 #endif /* !__EMSCRIPTEN__ */
 
     Fprintf(ofp, "\n");
-    Fprintf(ofp, "#define VERSION_STRING \"%s\"\n", version_string(buf, "."));
+    Fprintf(ofp, "#define VERSION_STRING \"%s\"\n", mdlib_version_string(buf, "."));
     Fprintf(ofp, "#define VERSION_ID \\\n \"%s\"\n",
-            version_id_string(buf, cbuf));
+            version_id_string(buf, sizeof buf, cbuf));
     Fprintf(ofp, "#define COPYRIGHT_BANNER_C \\\n \"%s\"\n",
-            bannerc_string(buf, cbuf));
+            bannerc_string(buf, sizeof buf, cbuf));
     if (get_gitinfo(githash, gitbranch)) {
         Fprintf(ofp, "#define NETHACK_GIT_SHA \"%s\"\n", githash);
         Fprintf(ofp, "#define NETHACK_GIT_BRANCH \"%s\"\n", gitbranch);
@@ -1947,7 +1950,7 @@ do_permonst(void)
         perror(filename);
         exit(EXIT_FAILURE);
     }
-    Fprintf(ofp, "%s", Dont_Edit_Code);
+    Fprintf(ofp, "%s", Reference_file);
     Fprintf(ofp, "#ifndef PM_H\n#define PM_H\n");
 
     if (use_enum) {
@@ -2030,7 +2033,7 @@ do_objs(void)
         perror(filename);
         exit(EXIT_FAILURE);
     }
-    Fprintf(ofp, "%s", Dont_Edit_Code);
+    Fprintf(ofp, "%s", Reference_file);
     Fprintf(ofp, "#ifndef ONAMES_H\n#define ONAMES_H\n\n");
 
     for (i = 0; !i || objects[i].oc_class != ILLOBJ_CLASS; i++) {
index 490bcc73e3cae7ce778392c1a9c3628a85992b2b..5e6b79f5ad3f6106baf9f149f6db830f65af7a89 100644 (file)
@@ -444,11 +444,6 @@ exepath(char *str)
 }
 #endif /* EXEPATH */
 
-#ifdef AMIGA
-#include "date.h"
-const char amiga_version_string[] = AMIGA_VERSION_STRING;
-#endif
-
 #ifdef WIN_CE
 void
 nhce_message(FILE *f, const char *str, ...)
index 835762546f2139f5b388a44a4722c1b6678a1d7f..32c99eadc41965b403506d5df5e1c659c3911d78 100644 (file)
@@ -1,3 +1,4 @@
+
 /* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/
 /* NetHack 3.7 cursmain.c */
 /* Copyright (c) Karl Garrison, 2010. */
@@ -189,14 +190,22 @@ curses_init_nhwindows(int *argcp UNUSED,
 #  ifdef VERSION_STRING
     sprintf(window_title, "%s %s", DEF_GAME_NAME, VERSION_STRING);
 #  else
-    sprintf(window_title, "%s", DEF_GAME_NAME);
+    if (nomakedefs.version_string)
+        sprintf(window_title, "%s %s", DEF_GAME_NAME,
+                    nomakedefs.version_string);
+    else
+        sprintf(window_title, "%s", DEF_GAME_NAME);
 #  endif
        /* VERSION_STRING */
 # else
 #  ifdef VERSION_STRING
     sprintf(window_title, "%s %s", "NetHack", VERSION_STRING);
 #  else
-    sprintf(window_title, "%s", "NetHack");
+    if (nomakedefs.version_string)
+        sprintf(window_title, "%s %s", "NetHack",
+                    nomakedefs.version_string);
+    else
+        sprintf(window_title, "%s", "NetHack");
 #  endif
        /* VERSION_STRING */
 # endif/* DEF_GAME_NAME */
index bfbc8fa9d440adad47b05765cc891d55c52c4b42..831f80d00bb6c80e9dd8838df9530bf285433710 100644 (file)
@@ -9,10 +9,10 @@
  */
 
 #include "config.h"
-#include "pm.h"
-#include "onames.h"
+/* #include "onames.h" */
 #include "permonst.h"
 #include "objclass.h"
+/* #include "pm.h" */
 #include "sym.h"
 #include "rm.h"
 #include "display.h"
index 5511e396d6b38375b66745675b094cae69ef6f61..51d00cb15c6ed486247ee2a385bfc8fb5e219ab1 100644 (file)
@@ -4,11 +4,7 @@
 
 #include "winMS.h"
 #include <commdlg.h>
-#if !defined(CROSSCOMPILE)
-#include "date.h"
-#else
 #include "config.h"
-#endif
 #if !defined(PATCHLEVEL_H)
 #include "patchlevel.h"
 #endif
@@ -1071,7 +1067,7 @@ About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 
         Sprintf(buf, "%s\n%s\n%s\n%s",
                 COPYRIGHT_BANNER_A, COPYRIGHT_BANNER_B,
-                COPYRIGHT_BANNER_C, COPYRIGHT_BANNER_D);
+                nomakedefs.copyright_banner_c, COPYRIGHT_BANNER_D);
         SetDlgItemText(hDlg, IDC_ABOUT_COPYRIGHT,
                        NH_A2W(buf, wbuf, sizeof(wbuf)));
 
index 3f0c448cfb7cb42030ce9b65c45ffa55c0ff4b5e..e3c8796cc94d4b1ac8adeb11981d0b9778c19374 100644 (file)
@@ -8,11 +8,7 @@
 #include "mhsplash.h"
 #include "mhmsg.h"
 #include "mhfont.h"
-#if !defined(CROSSCOMPILE)
-#include "date.h"
-#else
 #include "config.h"
-#endif
 #if !defined(VERSION_MAJOR)
 #include "patchlevel.h"
 #endif
@@ -149,7 +145,7 @@ mswin_display_splash_window(BOOL show_ver)
     /* Fill the text control */
     strbuf_reserve(&strbuf, BUFSIZ);
     Sprintf(strbuf.str, "%s\n%s\n%s\n%s\n\n", COPYRIGHT_BANNER_A,
-            COPYRIGHT_BANNER_B, COPYRIGHT_BANNER_C, COPYRIGHT_BANNER_D);
+            COPYRIGHT_BANNER_B, nomakedefs.copyright_banner_c, COPYRIGHT_BANNER_D);
 
     if (show_ver) {
         /* Show complete version information */