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
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
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
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
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
* 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)
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)
#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 */
/* 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.
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
*/
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
*/
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.
*
*/
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
*/
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,
* (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.
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
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
#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.
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;
#endif
enum earlyarg {ARG_DEBUG, ARG_VERSION, ARG_SHOWPATHS
+#ifndef NODUMPENUMS
+ , ARG_DUMPENUMS
+#endif
#ifdef WIN32
,ARG_WINDOWS
#endif
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);
extern void runtime_info_init(void);
extern const char *do_runtime_info(int *);
+#ifndef NODUMPENUMS
+extern void dump_enums(void);
+#endif
/* ### mhitm.c ### */
#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.
#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.
*
#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"
--- /dev/null
+/* 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*/
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.
#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 */
--- /dev/null
+/* 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*/
#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."
/*
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 */
#define pmname(pm,g) ((((g) == MALE || (g) == FEMALE) && (pm)->pmnames[g]) \
? (pm)->pmnames[g] : (pm)->pmnames[NEUTRAL])
#endif
+
#endif /* PERMONST_H */
#include "prop.h"
#include "permonst.h"
#include "mondata.h"
-#include "pm.h"
/* KMH, intrinsics patch.
* Reorganized and rewritten for >32-bit properties.
nhdat
o
nhdat*
-
+date.nmk
objects_globals_init();
monst_globals_init();
sys_early_init();
+ runtime_info_init();
}
static void
{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
case ARG_SHOWPATHS: {
return 2;
}
+#ifndef NODUMPENUMS
+ case ARG_DUMPENUMS: {
+ dump_enums();
+ return 2;
+ }
+#endif
#ifdef WIN32
case ARG_WINDOWS: {
if (extended_opt) {
#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*/
--- /dev/null
+/* 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*/
dlb_cleanup();
l_nhcore_done();
}
+ free_nomakedefs();
#ifdef VMS
/*
#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 *);
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);
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;
#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);
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];
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];
#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;
}
#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)
{
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();
}
if (*rtcontext >= 0 && *rtcontext < (MAXOPT - 1)) {
retval = opttext[*rtcontext];
*rtcontext += 1;
- }
+ }
return retval;
}
#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 \
#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 */
const struct attack c_sa_yes[NATTK] = SEDUCTION_ATTACKS_YES;
const struct attack c_sa_no[NATTK] = SEDUCTION_ATTACKS_NO;
-#endif
/*monst.c*/
/* 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 */
memcpy(objects, obj_init, sizeof(objects));
}
-#endif /* !OBJECTS_PASS_2_ */
-
/*objects.c*/
* 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().
*/
#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 *);
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)
#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;
}
(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;
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
{
/* 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
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)
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;
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() */
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;
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
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) \
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
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.
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 \
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.
#
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 \
$(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
$(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
# 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.
# 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
# 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
../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
$(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)
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
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:
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 */,
# 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 \
# 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 \
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);
# .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 \
# 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 \
$(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
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
#
# 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
#
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
# 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 \
$(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.
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
$(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
$(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
$(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)
$(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)
# 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.
#
# 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
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
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
$(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
$(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 $(@:\=/)
$(O)consoletty.o
$(O)tile.o
$(O)guistub.o
+ $(O)date.o
$(O)console.res
<<
@if exist $(O)install.tag del $(O)install.tag
# 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)
$(GUIOBJ)
$(O)tile.o
$(O)ttystub.o
+ $(O)date.o
$(O)NetHackW.res
<<
$(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.
@$(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.
#==========================================
$(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:^ =^
)
<<
$(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:^ =^
)
<<
$(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO)
- @echo Linking $(@:\=/)
+ @echo Linking $(@:\=/)
@$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk
$(PPMWRITERS:^ =^
)
@$(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:^ =^
<<
$(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:^ =^
$(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
$(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
$(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
$(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)
<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
<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
<Defs Include = "$(IncDir)date.h"/>
<!-- -o -->
<Defs Include = "$(IncDir)onames.h"/>
- <!-- -p -->
- <Defs Include = "$(IncDir)pm.h"/>
<!-- -r -->
<Defs Include = "$(DatDir)rumors"/>
<!-- -s -->
<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
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++;
/*NOTREACHED*/
}
-#ifdef AMIGA
-#include "date.h"
-const char amiga_version_string[] = AMIGA_VERSION_STRING;
-#endif
-
/*dlb_main.c*/
*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;
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") {
/* 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
#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);
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) {
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++) {
}
#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, ...)
+
/* 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. */
# 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 */
*/
#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"
#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
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)));
#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
/* 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 */