diff --git a/Cross-compiling b/Cross-compiling index b907b563d..0e3f0bb7f 100644 --- a/Cross-compiling +++ b/Cross-compiling @@ -124,13 +124,10 @@ steps to be carried out: 1. Compile and link util/makedefs. 2. Run makedefs repeatedly with different command line options to produce - several output files that are required for: - (a) additional build steps to follow, including some header - files: pm.h, onames.h, date.h. - (b) creation of files, containing information required by, - or about the game during its execution, that are stored in a - portable, platform-independent way, that need to be inserted - into the game package. + several required output files that contain information required by the + game, or contain information about the game during its execution, that + are stored in a portable, platform-independent way, that need to be + inserted into the game package (makedefs -d, -z, -r, -h, -s). 3. Compile and link several less critical utilities such as uudecode, tile-generation utilities, and so forth, all of which need to execute on the build platform during the build process to produce output files @@ -261,14 +258,18 @@ On the HOST, here are the mandatory things that have to be built. from sources: util/makedefs.c, src/mdlib.c, src/monst.c, src/objects.c b) Execute HOST native makedefs utility, util/makedefs, as follows: - util/makedefs -v - util/makedefs -o - util/makedefs -p - util/makedefs -z - util/makedefs -d - util/makedefs -r - util/makedefs -h - util/makedefs -s + Required for complete packaging of the game, but not the C source + game compile: + util/makedefs -d + util/makedefs -r + util/makedefs -h + util/makedefs -s + + For reference purposes, but no longer a required prerequisite for the + game compile process: + util/makedefs -v + util/makedefs -o + util/makedefs -p c) Using the HOST native compiler, build these additional utilities if your target platform requires components that they produce. It is important diff --git a/Porting b/Porting index 201a66de0..477f10682 100644 --- a/Porting +++ b/Porting @@ -182,20 +182,23 @@ NetHack requires the following steps to be carried out: Compile and link util/makedefs. Run makedefs repeatedly with different command line options to produce several output files that are required for: - (a) additional build steps to follow, including some header - files: pm.h, onames.h, date.h. - (b) creation of files, containing information required by, + (a) creation of files, containing information required by, or about the game during its execution, that are stored in a portable, platform-independent way, that need to be inserted into the final game package. - util/makedefs -v - util/makedefs -o - util/makedefs -p - util/makedefs -d - util/makedefs -r - util/makedefs -h - util/makedefs -s + Required for complete packaging of the game, but not the C source + game compile: + util/makedefs -d + util/makedefs -r + util/makedefs -h + util/makedefs -s + + For reference purposes, but no longer a required prerequisite for the + game compile process: + util/makedefs -v + util/makedefs -o + util/makedefs -p 4.2. Other utilities diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 8ab7e130a..b62d9f3ff 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -1269,3 +1269,17 @@ adjust window port interface to pass a pointer to a glyph_info struct which and the symset index; this affects two window port calls that get passed glyphs: print_glyph() and add_menu(). switch from k&r C to C99 +remove the game-compile dependencies on any pre-generated header files +date.h dependency and inclusion is removed and comparable functionality is + produced at runtime; REPRODUCIBLE_BUILD capability will need to be + reviewed and adjusted +pm.h dependency and inclusion is removed and comparable functionality is + produced by moving the monster definitions from monst.c into new header + file called monsters.h, then taking advantage of the C preprocessor to + generate appropriate enum values during compile +onames.h dependency and inclusion is removed and comparable functionality is + produced by moving the object definitions from objects.c into new header + file called objects.h, then taking advantage of the C preprocessor to + generate appropriate enum values during compile +artilist.h is used to generate appropriate artifact enum values by the C + preprocessor during compile diff --git a/doc/window.doc b/doc/window.doc index bac8008b5..ccc5a596b 100644 --- a/doc/window.doc +++ b/doc/window.doc @@ -1018,13 +1018,15 @@ in the future to make it possible to replace this on a per window-port basis. VII. Conventions init_nhwindows() is expected to display a gee-whiz banner window, including -the Copyright message. It is recommended that the COPYRIGHT_BANNER_A, -COPYRIGHT_BANNER_B, COPYRIGHT_BANNER_C, and COPYRIGHT_BANNER_D macros from -patchlevel.h and date.h be used for constructing the Copyright message. +the Copyright message. It is recommended that the COPYRIGHT_BANNER_A macro +from patchlevel.h, COPYRIGHT_BANNER_B from patchlevel.h, +nomakedefs.copyright_banner_c internal global variable, and +COPYRIGHT_BANNER_D macros from patchlevel.h be used for constructing the +Copyright message. COPYRIGHT_BANNER_A is a quoted string that has NetHack copyright declaration, COPYRIGHT_BANNER_B is a quoted string that states who the copyright belongs to, -COPYRIGHT_BANNER_C is a quoted string generated by makedefs that includes -version and build information, and +nomakedefs.copyright_banner_c is a quoted string produced at runtime that +includes version and build information, and COPYRIGHT_BANNER_D simply says "See License for details." Be sure to #include "patchlevel.h" and date.h to define these macros. Using the macros will prevent having to update the Copyright information in each diff --git a/include/.gitattributes b/include/.gitattributes index ace3fdeaa..9fe9921df 100644 --- a/include/.gitattributes +++ b/include/.gitattributes @@ -1,5 +1,5 @@ * NH_filestag=(file%s_for_all_versions) -..files NH_filegenerated=win32api.h,tile.h,dgn_comp.h,lev_comp.h,date.h,onames.h,pm.h +..files NH_filegenerated=win32api.h,tile.h,date.h win32api.h NH_filesgentag=(file%s_for_win32_that_are_moved_into_include_at_compile_time) @@ -9,8 +9,6 @@ dgn_comp.h NH_filesgentag=(file%s_generated_by_yacc_(or_copied_from_sys/share)_a lev_comp.h NH_filesgentag=>dgn_comp.h date.h NH_filesgentag=(file%s_generated_by_makedefs_at_compile_time) -onames.h NH_filesgentag=>date.h -pm.h NH_filesgentag=>date.h wintty.h NH_filestag=(file%s_for_tty_versions) diff --git a/include/artilist.h b/include/artilist.h index c95f41775..dd6bb2e0a 100644 --- a/include/artilist.h +++ b/include/artilist.h @@ -6,15 +6,23 @@ #if defined(MAKEDEFS_C) || defined (MDLIB_C) /* in makedefs.c, all we care about is the list of names */ -#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost, clr) nam +#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, \ + cost, clr, bn) nam static const char *artifact_names[] = { + +#elif defined(ARTI_ENUM) +#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, \ + cost, clr, bn) \ + ART_##bn #else /* in artifact.c, set up the actual artifact list structure */ -#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost, clr) \ - { \ - typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost, clr \ +#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, \ + cost, clr, bn) \ + { \ + typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, \ + cost, clr \ } /* clang-format off */ @@ -42,12 +50,12 @@ static NEARDATA struct artifact artilist[] = { /* dummy element #0, so that all interesting indices are non-zero */ A("", STRANGE_OBJECT, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, - NON_PM, NON_PM, 0L, NO_COLOR), + NON_PM, NON_PM, 0L, NO_COLOR, PLACEHOLDER), A("Excalibur", LONG_SWORD, (SPFX_NOGEN | SPFX_RESTR | SPFX_SEEK | SPFX_DEFN | SPFX_INTEL | SPFX_SEARCH), 0, 0, PHYS(5, 10), DRLI(0, 0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM, - 4000L, NO_COLOR), + 4000L, NO_COLOR, EXCALIBUR), /* * Stormbringer only has a 2 because it can drain a level, * providing 8 more. @@ -55,7 +63,7 @@ static NEARDATA struct artifact artilist[] = { A("Stormbringer", RUNESWORD, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN | SPFX_INTEL | SPFX_DRLI), 0, 0, DRLI(5, 2), DRLI(0, 0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 8000L, - NO_COLOR), + NO_COLOR, STORMBRINGER), /* * Mjollnir can be thrown when wielded if hero has 25 Strength * (usually via gauntlets of power but possible with rings of @@ -70,10 +78,10 @@ static NEARDATA struct artifact artilist[] = { */ A("Mjollnir", WAR_HAMMER, /* Mjo:llnir */ (SPFX_RESTR | SPFX_ATTK), 0, 0, ELEC(5, 24), NO_DFNS, NO_CARY, 0, - A_NEUTRAL, PM_VALKYRIE, NON_PM, 4000L, NO_COLOR), + A_NEUTRAL, PM_VALKYRIE, NON_PM, 4000L, NO_COLOR, MJOLLNIR), A("Cleaver", BATTLE_AXE, SPFX_RESTR, 0, 0, PHYS(3, 6), NO_DFNS, NO_CARY, - 0, A_NEUTRAL, PM_BARBARIAN, NON_PM, 1500L, NO_COLOR), + 0, A_NEUTRAL, PM_BARBARIAN, NON_PM, 1500L, NO_COLOR, CLEAVER), /* * Grimtooth glows in warning when elves are present, but its @@ -82,7 +90,7 @@ static NEARDATA struct artifact artilist[] = { */ A("Grimtooth", ORCISH_DAGGER, (SPFX_RESTR | SPFX_WARN | SPFX_DFLAG2), 0, M2_ELF, PHYS(2, 6), NO_DFNS, - NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, 300L, CLR_RED), + NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, 300L, CLR_RED, GRIMTOOTH), /* * Orcrist and Sting have same alignment as elves. * @@ -92,54 +100,55 @@ static NEARDATA struct artifact artilist[] = { */ A("Orcrist", ELVEN_BROADSWORD, (SPFX_WARN | SPFX_DFLAG2), 0, M2_ORC, PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 2000L, - CLR_BRIGHT_BLUE), /* bright blue is actually light blue */ + CLR_BRIGHT_BLUE, ORCRIST), /* bright blue is actually light blue */ A("Sting", ELVEN_DAGGER, (SPFX_WARN | SPFX_DFLAG2), 0, M2_ORC, PHYS(5, 0), - NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 800L, CLR_BRIGHT_BLUE), + NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 800L, CLR_BRIGHT_BLUE, + STING), /* * Magicbane is a bit different! Its magic fanfare * unbalances victims in addition to doing some damage. */ A("Magicbane", ATHAME, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0, STUN(3, 4), DFNS(AD_MAGM), NO_CARY, 0, A_NEUTRAL, PM_WIZARD, NON_PM, - 3500L, NO_COLOR), + 3500L, NO_COLOR, MAGICBANE), A("Frost Brand", LONG_SWORD, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0, COLD(5, 0), COLD(0, 0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L, - NO_COLOR), + NO_COLOR, FROST_BRAND), A("Fire Brand", LONG_SWORD, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0, FIRE(5, 0), FIRE(0, 0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L, - NO_COLOR), + NO_COLOR, FIRE_BRAND), A("Dragonbane", BROADSWORD, (SPFX_RESTR | SPFX_DCLAS | SPFX_REFLECT), 0, S_DRAGON, PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 500L, - NO_COLOR), + NO_COLOR, DRAGONBANE), A("Demonbane", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_DEMON, PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 2500L, - NO_COLOR), + NO_COLOR, DEMONBANE), A("Werebane", SILVER_SABER, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_WERE, PHYS(5, 0), DFNS(AD_WERE), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 1500L, - NO_COLOR), + NO_COLOR, WEREBANE), A("Grayswandir", SILVER_SABER, (SPFX_RESTR | SPFX_HALRES), 0, 0, PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 8000L, - NO_COLOR), + NO_COLOR, GRAYSWANDIR), A("Giantslayer", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_GIANT, PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 200L, - NO_COLOR), + NO_COLOR, GIANTSLAYER), A("Ogresmasher", WAR_HAMMER, (SPFX_RESTR | SPFX_DCLAS), 0, S_OGRE, PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L, - NO_COLOR), + NO_COLOR, OGRESMASHER), A("Trollsbane", MORNING_STAR, (SPFX_RESTR | SPFX_DCLAS), 0, S_TROLL, PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L, - NO_COLOR), + NO_COLOR, TROLLSBANE), /* * Two problems: 1) doesn't let trolls regenerate heads, * 2) doesn't give unusual message for 2-headed monsters (but @@ -147,7 +156,7 @@ static NEARDATA struct artifact artilist[] = { */ A("Vorpal Blade", LONG_SWORD, (SPFX_RESTR | SPFX_BEHEAD), 0, 0, PHYS(5, 1), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 4000L, - NO_COLOR), + NO_COLOR, VORPAL_BLADE), /* * Ah, never shall I forget the cry, * or the shriek that shrieked he, @@ -157,11 +166,11 @@ static NEARDATA struct artifact artilist[] = { * (From Sir W.S. Gilbert's "The Mikado") */ A("Snickersnee", KATANA, SPFX_RESTR, 0, 0, PHYS(0, 8), NO_DFNS, NO_CARY, - 0, A_LAWFUL, PM_SAMURAI, NON_PM, 1200L, NO_COLOR), + 0, A_LAWFUL, PM_SAMURAI, NON_PM, 1200L, NO_COLOR, SNICKERSNEE), A("Sunsword", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_UNDEAD, PHYS(5, 0), DFNS(AD_BLND), NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 1500L, - NO_COLOR), + NO_COLOR, SUNSWORD), /* * The artifacts for the quest dungeon, all self-willed. @@ -170,52 +179,53 @@ static NEARDATA struct artifact artilist[] = { A("The Orb of Detection", CRYSTAL_BALL, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), (SPFX_ESP | SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), INVIS, A_LAWFUL, PM_ARCHEOLOGIST, - NON_PM, 2500L, NO_COLOR), + NON_PM, 2500L, NO_COLOR, ORB_OF_DETECTION), A("The Heart of Ahriman", LUCKSTONE, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), SPFX_STLTH, 0, /* this stone does double damage if used as a projectile weapon */ PHYS(5, 0), NO_DFNS, NO_CARY, LEVITATION, A_NEUTRAL, PM_BARBARIAN, - NON_PM, 2500L, NO_COLOR), + NON_PM, 2500L, NO_COLOR, HEART_OF_AHRIMAN), A("The Sceptre of Might", MACE, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DALIGN), 0, 0, PHYS(5, 0), DFNS(AD_MAGM), NO_CARY, CONFLICT, A_LAWFUL, PM_CAVE_DWELLER, NON_PM, 2500L, - NO_COLOR), + NO_COLOR, SCEPTRE_OF_MIGHT), #if 0 /* OBSOLETE */ A("The Palantir of Westernesse", CRYSTAL_BALL, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_ESP|SPFX_REGEN|SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, - TAMING, A_CHAOTIC, NON_PM , PM_ELF, 8000L, NO_COLOR ), + TAMING, A_CHAOTIC, NON_PM , PM_ELF, 8000L, NO_COLOR, + PALANTIR_OF_WESTERNESSE ), #endif A("The Staff of Aesculapius", QUARTERSTAFF, (SPFX_NOGEN | SPFX_RESTR | SPFX_ATTK | SPFX_INTEL | SPFX_DRLI | SPFX_REGEN), 0, 0, DRLI(0, 0), DRLI(0, 0), NO_CARY, HEALING, A_NEUTRAL, PM_HEALER, - NON_PM, 5000L, NO_COLOR), + NON_PM, 5000L, NO_COLOR, STAFF_OF_AESCULAPIUS), A("The Magic Mirror of Merlin", MIRROR, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_SPEAK), SPFX_ESP, 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), 0, A_LAWFUL, PM_KNIGHT, NON_PM, 1500L, - NO_COLOR), + NO_COLOR, MAGIC_MIRROR_OF_MERLIN), A("The Eyes of the Overworld", LENSES, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_XRAY), 0, 0, NO_ATTK, DFNS(AD_MAGM), NO_CARY, ENLIGHTENING, A_NEUTRAL, PM_MONK, NON_PM, - 2500L, NO_COLOR), + 2500L, NO_COLOR, EYES_OF_THE_OVERWORLD), A("The Mitre of Holiness", HELM_OF_BRILLIANCE, (SPFX_NOGEN | SPFX_RESTR | SPFX_DFLAG2 | SPFX_INTEL | SPFX_PROTECT), 0, M2_UNDEAD, NO_ATTK, NO_DFNS, CARY(AD_FIRE), ENERGY_BOOST, A_LAWFUL, - PM_CLERIC, NON_PM, 2000L, NO_COLOR), + PM_CLERIC, NON_PM, 2000L, NO_COLOR, MITRE_OF_HOLINESS), A("The Longbow of Diana", BOW, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_REFLECT), SPFX_ESP, 0, PHYS(5, 0), NO_DFNS, NO_CARY, CREATE_AMMO, A_CHAOTIC, PM_RANGER, NON_PM, - 4000L, NO_COLOR), + 4000L, NO_COLOR, LONGBOW_OF_DIANA), /* MKoT has an additional carry property if the Key is not cursed (for rogues) or blessed (for non-rogues): #untrap of doors and chests @@ -223,40 +233,45 @@ A("The Palantir of Westernesse", CRYSTAL_BALL, A("The Master Key of Thievery", SKELETON_KEY, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_SPEAK), (SPFX_WARN | SPFX_TCTRL | SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, - UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM, 3500L, NO_COLOR), + UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM, 3500L, NO_COLOR, + MASTER_KEY_OF_THIEVERY), A("The Tsurugi of Muramasa", TSURUGI, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_BEHEAD | SPFX_LUCK | SPFX_PROTECT), 0, 0, PHYS(0, 8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM, - 4500L, NO_COLOR), + 4500L, NO_COLOR, TSURUGI_OF_MURAMASA), A("The Platinum Yendorian Express Card", CREDIT_CARD, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DEFN), (SPFX_ESP | SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), - CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM, 7000L, NO_COLOR), + CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM, 7000L, NO_COLOR, + YENDORIAN_EXPRESS_CARD), A("The Orb of Fate", CRYSTAL_BALL, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_LUCK), (SPFX_WARN | SPFX_HSPDAM | SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, - LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM, 3500L, NO_COLOR), + LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM, 3500L, NO_COLOR, + ORB_OF_FATE), A("The Eye of the Aethiopica", AMULET_OF_ESP, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), (SPFX_EREGEN | SPFX_HSPDAM), 0, NO_ATTK, DFNS(AD_MAGM), NO_CARY, CREATE_PORTAL, A_NEUTRAL, PM_WIZARD, - NON_PM, 4000L, NO_COLOR), + NON_PM, 4000L, NO_COLOR, EYE_OF_THE_AETHIOPICA), +#if !defined(ARTI_ENUM) /* * terminator; otyp must be zero */ A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 0L, - 0) /* 0 is CLR_BLACK rather than NO_COLOR but it doesn't matter here */ + 0, TERMINATOR) /* 0 is CLR_BLACK rather than NO_COLOR but it doesn't matter here */ }; /* artilist[] (or artifact_names[]) */ +#endif #undef A -#if !defined(MAKEDEFS_C) && !defined(MDLIB_C) +#if !defined(MAKEDEFS_C) && !defined(MDLIB_C) && !defined(ARTI_ENUM) #undef NO_ATTK #undef NO_DFNS #undef DFNS diff --git a/include/config.h b/include/config.h index 2abb503bc..375c677bf 100644 --- a/include/config.h +++ b/include/config.h @@ -270,6 +270,16 @@ #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. diff --git a/include/decl.h b/include/decl.h index 95666d860..82543e4ee 100644 --- a/include/decl.h +++ b/include/decl.h @@ -250,11 +250,6 @@ E NEARDATA struct you u; E NEARDATA time_t ubirthday; E NEARDATA struct u_realtime urealtime; -#include "onames.h" -#ifndef PM_H /* (pm.h has already been included via youprop.h) */ -#include "pm.h" -#endif - struct mvitals { uchar born; uchar died; @@ -434,6 +429,9 @@ E const char *ARGV0; #endif enum earlyarg {ARG_DEBUG, ARG_VERSION, ARG_SHOWPATHS +#ifndef NODUMPENUMS + , ARG_DUMPENUMS +#endif #ifdef WIN32 ,ARG_WINDOWS #endif diff --git a/include/extern.h b/include/extern.h index 17a116310..88a42725a 100644 --- a/include/extern.h +++ b/include/extern.h @@ -247,6 +247,11 @@ extern char yn_function(const char *, const char *, char); extern boolean paranoid_query(boolean, const char *); extern void makemap_prepost(boolean, boolean); +/* ### date.c ### */ + +extern void populate_nomakedefs(struct version_info *); +extern void free_nomakedefs(void); + /* ### dbridge.c ### */ extern boolean is_pool(int, int); @@ -1193,6 +1198,9 @@ extern int buzzmu(struct monst *, struct attack *); extern void runtime_info_init(void); extern const char *do_runtime_info(int *); +#ifndef NODUMPENUMS +extern void dump_enums(void); +#endif /* ### mhitm.c ### */ diff --git a/include/global.h b/include/global.h index b3436de94..79b2c83a4 100644 --- a/include/global.h +++ b/include/global.h @@ -111,40 +111,6 @@ typedef uchar nhsym; #include "coord.h" -#if defined(CROSSCOMPILE) -struct cross_target_s { - const char *build_date; - const char *copyright_banner_c; - const char *git_sha; - const char *git_branch; - const char *version_string; - const char *version_id; - unsigned long version_number; - unsigned long version_features; - unsigned long ignored_features; - unsigned long version_sanity1; - unsigned long version_sanity2; - unsigned long version_sanity3; - unsigned long build_time; -}; -extern struct cross_target_s cross_target; -#if defined(CROSSCOMPILE_TARGET) && !defined(MAKEDEFS_C) -#define BUILD_DATE cross_target.build_date /* "Wed Apr 1 00:00:01 2020" */ -#define COPYRIGHT_BANNER_C cross_target.copyright_banner_c -#define NETHACK_GIT_SHA cross_target.git_sha -#define NETHACK_GIT_BRANCH cross_target.git_branch -#define VERSION_ID cross_target.version_id -#define IGNORED_FEATURES cross_target.ignored_features -#define VERSION_FEATURES cross_target.version_features -#define VERSION_NUMBER cross_target.version_number -#define VERSION_SANITY1 cross_target.version_sanity1 -#define VERSION_SANITY2 cross_target.version_sanity2 -#define VERSION_SANITY3 cross_target.version_sanity3 -#define VERSION_STRING cross_target.version_string -#define BUILD_TIME cross_target.build_time /* (1574157640UL) */ -#endif /* CROSSCOMPILE_TARGET && !MAKEDEFS_C */ -#endif /* CROSSCOMPILE */ - /* * Automatic inclusions for the subsidiary files. * Please don't change the order. It does matter. @@ -356,6 +322,26 @@ struct savefile_info { #define SFI1_ZEROCOMP (1L << 2) #endif +/* This is used to store some build-info data that used + to be present in makedefs-generated header file date.h */ + +struct nomakedefs_s { + const char *build_date; + const char *copyright_banner_c; + const char *git_sha; + const char *git_branch; + const char *version_string; + const char *version_id; + unsigned long version_number; + unsigned long version_features; + unsigned long ignored_features; + unsigned long version_sanity1; + unsigned long version_sanity2; + unsigned long version_sanity3; + unsigned long build_time; +}; +extern struct nomakedefs_s nomakedefs; + /* * Configurable internal parameters. * diff --git a/include/hack.h b/include/hack.h index c4e86bbba..aed071165 100644 --- a/include/hack.h +++ b/include/hack.h @@ -185,6 +185,18 @@ typedef struct { #include "dungeon.h" #include "sym.h" #include "mkroom.h" + +enum artifacts_nums { +#define ARTI_ENUM +#include "artilist.h" +#undef ARTI_ENUM + AFTER_LAST_ARTIFACT +}; + +enum misc_arti_nums { + NROFARTIFACTS = (AFTER_LAST_ARTIFACT - 1) +}; + #include "objclass.h" #include "youprop.h" #include "wintype.h" diff --git a/include/monsters.h b/include/monsters.h new file mode 100644 index 000000000..b66c1bea5 --- /dev/null +++ b/include/monsters.h @@ -0,0 +1,3326 @@ +/* NetHack 3.7 monsters.h $NHDT-Date: 1616891049 2021/03/28 00:24:09 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.85 $ */ +/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ +/*-Copyright (c) Michael Allison, 2006. */ +/* NetHack may be freely redistributed. See license for details. */ + +#ifndef WT_ELF +#define WT_ELF 800 +#endif + +#ifndef WT_DRAGON +#define WT_DRAGON 4500 +#endif + +#if defined(MONS_ENUM) +#define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, \ + col, bn) PM_##bn + +#define MON3(namm, namf, namn, sym, lvl, gen, atk, siz, mr1, mr2, flg1, \ + flg2, flg3, d, col, bn) PM_##bn + +#elif defined(DUMP_ENUMS) +#define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, \ + col, bn) { PM_##bn, #bn} + +#define MON3(namm, namf, namn, sym, lvl, gen, atk, siz, mr1, mr2, flg1, \ + flg2, flg3, d, col, bn) { PM_##bn, #bn } + + +#elif !defined(MON) +#error Non-productive inclusion of monsters.h +#endif + +/* + * Entry Format: (from permonst.h) + * + * name, symbol (S_* defines), + * base monster level, move rate, armor class, magic resistance, + * alignment, creation/geno flags (G_* defines), + * 6 * attack structs ( type , damage-type, # dice, # sides ), + * weight (WT_* defines), nutritional value, extension length, + * sounds made (MS_* defines), physical size (MZ_* defines), + * resistances, resistances conferred (both MR_* defines), + * 3 * flag bitmaps (M1_*, M2_*, and M3_* defines respectively), + * difficulty, symbol color (C(x) macro). + * + * The difficulty was generated in separate array monstr[] with + * values calculated by makedefs, but has been moved into mons[] + * since it rarely changes. If a new monster is added or an old + * one undergoes significant change, 'makedefs -m' can be used to + * create a dummy monstr.c containing the calculated difficulty + * (of everything in mons[], not just any new or changed ones), + * then the value(s) can be plugged in here and monstr.c deleted. + * [Note that some monsters might warrant manually calculated + * difficulty, on a case by case basis, instead of blindly using + * the default value produced by makedefs. Or fix the algoritm + * used by makedefs to generate a more appropriate value....] + * + * TODO: difficulty is closely releated to level; its field ought + * to be moved sooner in the permonst struct so that it can become + * part of LVL() instead of remaining an orphan near the end. + * + * Rule #1: monsters of a given class are contiguous in the + * mons[] array. + * + * Rule #2: monsters of a given class are presented in ascending + * order of strength. + * + * Rule #3: monster frequency is included in the geno mask; + * the frequency can be from 0 to 7. 0's will also + * be skipped during generation. + * + * Rule #4: monster subclasses (e.g. giants) should be kept + * together, unless it violates Rule 2. NOGEN monsters + * won't violate Rule 2. + * + * Guidelines for color assignment: + * + * * Use the same color for all `growth stages' of a monster (ex. + * little dog/big dog, baby naga/full-grown naga. + * + * * Use colors given in names wherever possible. If the class has `real' + * members with strong color associations, use those. + * + * * Favor `cool' colors for cold-resistant monsters, `warm' ones for + * fire-resistant ones. + * + * * Try to reserve purple (magenta) for powerful `ruler' monsters (queen + * bee, kobold lord, &c.). + * + * * Subject to all these constraints, try to use color to make as many + * distinctions as the / command (that is, within a monster letter + * distinct names should map to distinct colors). + * + * The aim in assigning colors is to be consistent enough so a player can + * become `intuitive' about them, deducing some or all of these rules + * unconsciously. Use your common sense. + */ + + /* + * ants + */ + MON("giant ant", S_ANT, LVL(2, 18, 3, 0, 0), (G_GENO | G_SGROUP | 3), + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(10, 10, MS_SILENT, MZ_TINY), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE, 0, + 4, CLR_BROWN, GIANT_ANT), + MON("killer bee", S_ANT, LVL(1, 18, -1, 0, 0), (G_GENO | G_LGROUP | 2), + A(ATTK(AT_STNG, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, + M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_POIS, M2_HOSTILE | M2_FEMALE, 0, + 5, CLR_YELLOW, KILLER_BEE), + MON("soldier ant", S_ANT, LVL(3, 18, 3, 0, 0), (G_GENO | G_SGROUP | 2), + A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_DRST, 3, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(20, 5, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, + M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, + M2_HOSTILE, 0, 6, CLR_BLUE, SOLDIER_ANT), + MON("fire ant", S_ANT, LVL(3, 18, 3, 10, 0), (G_GENO | G_SGROUP | 1), + A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_FIRE, 2, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(30, 10, MS_SILENT, MZ_TINY), MR_FIRE, MR_FIRE, + M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE, 6, CLR_RED, FIRE_ANT), + MON("giant beetle", S_ANT, LVL(5, 6, 4, 0, 0), (G_GENO | 3), + A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(200, 50, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, + M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE, 0, + 6, CLR_BLACK, GIANT_BEETLE), + MON("queen bee", S_ANT, LVL(9, 24, -4, 0, 0), (G_GENO | G_NOGEN), + A(ATTK(AT_STNG, AD_DRST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, + M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_OVIPAROUS | M1_POIS, + M2_HOSTILE | M2_FEMALE | M2_PRINCE, 0, 12, HI_LORD, QUEEN_BEE), + /* + * blobs + */ + MON("acid blob", S_BLOB, LVL(1, 3, 8, 0, 0), (G_GENO | 2), + A(ATTK(AT_NONE, AD_ACID, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(30, 10, MS_SILENT, MZ_TINY), + MR_SLEEP | MR_POISON | MR_ACID | MR_STONE, MR_STONE, + M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_ACID, + M2_WANDER | M2_NEUTER, 0, 2, CLR_GREEN, ACID_BLOB), + MON("quivering blob", S_BLOB, LVL(5, 1, 8, 0, 0), (G_GENO | 2), + A(ATTK(AT_TUCH, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(200, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, MR_POISON, + M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, + M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 6, CLR_WHITE, QUIVERING_BLOB), + MON("gelatinous cube", S_BLOB, LVL(6, 6, 8, 0, 0), (G_GENO | 2), + A(ATTK(AT_TUCH, AD_PLYS, 2, 4), ATTK(AT_NONE, AD_PLYS, 1, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 150, MS_SILENT, MZ_LARGE), + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_ACID + | MR_STONE, + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP, + M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_OMNIVORE + | M1_ACID, + M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 8, CLR_CYAN, GELATINOUS_CUBE), + /* + * cockatrice + */ + MON("chickatrice", S_COCKATRICE, LVL(4, 4, 8, 30, 0), + (G_GENO | G_SGROUP | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 2), ATTK(AT_TUCH, AD_STON, 0, 0), + ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(10, 10, MS_HISS, MZ_TINY), MR_POISON | MR_STONE, + MR_POISON | MR_STONE, M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, + M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN, CHICKATRICE), + MON("cockatrice", S_COCKATRICE, LVL(5, 6, 6, 30, 0), (G_GENO | 5), + A(ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_TUCH, AD_STON, 0, 0), + ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_STONE, + MR_POISON | MR_STONE, + M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE, + M3_INFRAVISIBLE, 8, CLR_YELLOW, COCKATRICE), + MON("pyrolisk", S_COCKATRICE, LVL(6, 6, 6, 30, 0), (G_GENO | 1), + A(ATTK(AT_GAZE, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_FIRE, + MR_POISON | MR_FIRE, + M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE, + M3_INFRAVISIBLE, 8, CLR_RED, PYROLISK), + /* + * dogs & other canines + */ + MON("jackal", S_DOG, LVL(0, 12, 7, 0, 0), (G_GENO | G_SGROUP | 3), + A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 1, CLR_BROWN, JACKAL), + MON("fox", S_DOG, LVL(0, 15, 7, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 1, CLR_RED, FOX), + MON("coyote", S_DOG, LVL(1, 12, 7, 0, 0), (G_GENO | G_SGROUP | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 2, CLR_BROWN, COYOTE), + MON("werejackal", S_DOG, LVL(2, 12, 7, 10, -7), (G_NOGEN | G_NOCORPSE), + A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(300, 250, MS_BARK, MZ_SMALL), MR_POISON, 0, + M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE, + M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN, + WEREJACKAL), + MON("little dog", S_DOG, LVL(2, 18, 6, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(150, 150, MS_BARK, MZ_SMALL), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, + 3, HI_DOMESTIC, LITTLE_DOG), + MON("dingo", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 5, CLR_YELLOW, DINGO), + MON("dog", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, + 5, HI_DOMESTIC, DOG), + MON("large dog", S_DOG, LVL(6, 15, 4, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(800, 250, MS_BARK, MZ_MEDIUM), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, LARGE_DOG), + MON("wolf", S_DOG, LVL(5, 12, 4, 0, 0), (G_GENO | G_SGROUP | 2), + A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 250, MS_BARK, MZ_MEDIUM), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 6, CLR_BROWN, WOLF), + MON("werewolf", S_DOG, LVL(5, 12, 4, 20, -7), (G_NOGEN | G_NOCORPSE), + A(ATTK(AT_BITE, AD_WERE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 250, MS_BARK, MZ_MEDIUM), MR_POISON, 0, + M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE, + M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN, + WEREWOLF), + MON("winter wolf cub", S_DOG, LVL(5, 12, 4, 0, -5), + (G_NOHELL | G_GENO | G_SGROUP | 2), + A(ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_BREA, AD_COLD, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(250, 200, MS_BARK, MZ_SMALL), MR_COLD, MR_COLD, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 7, CLR_CYAN, + WINTER_WOLF_CUB), + MON("warg", S_DOG, LVL(7, 12, 4, 0, -5), (G_GENO | G_SGROUP | 2), + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(850, 350, MS_BARK, MZ_MEDIUM), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 8, CLR_BROWN, WARG), + MON("winter wolf", S_DOG, LVL(7, 12, 4, 20, 0), (G_NOHELL | G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_COLD, 2, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(700, 300, MS_BARK, MZ_LARGE), MR_COLD, MR_COLD, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, 0, + 9, CLR_CYAN, WINTER_WOLF), + MON("hell hound pup", S_DOG, LVL(7, 12, 4, 20, -5), + (G_HELL | G_GENO | G_SGROUP | 1), + A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(200, 200, MS_BARK, MZ_SMALL), MR_FIRE, MR_FIRE, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 9, CLR_RED, HELL_HOUND_PUP), + MON("hell hound", S_DOG, LVL(12, 14, 2, 20, 0), (G_HELL | G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BREA, AD_FIRE, 3, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 300, MS_BARK, MZ_MEDIUM), MR_FIRE, MR_FIRE, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, + M3_INFRAVISIBLE, 14, CLR_RED, HELL_HOUND), +#ifdef CHARON + MON("Cerberus", S_DOG, LVL(12, 10, 2, 20, -7), + (G_NOGEN | G_UNIQ | G_HELL), + A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 3, 6), + ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1000, 350, MS_BARK, MZ_LARGE), MR_FIRE, MR_FIRE, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, + M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_MALE, + M3_INFRAVISIBLE, 14, CLR_RED, CERBERUS), +#endif + /* + * eyes + */ + MON("gas spore", S_EYE, LVL(1, 3, 10, 0, 0), (G_NOCORPSE | G_GENO | 1), + A(ATTK(AT_BOOM, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0, + M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GRAY, GAS_SPORE), + MON("floating eye", S_EYE, LVL(2, 1, 9, 10, 0), (G_GENO | 5), + A(ATTK(AT_NONE, AD_PLYS, 0, 70), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0, + M1_FLY | M1_AMPHIBIOUS | M1_NOLIMBS | M1_NOHEAD | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 3, CLR_BLUE, FLOATING_EYE), + MON("freezing sphere", S_EYE, LVL(6, 13, 4, 0, 0), + (G_NOCORPSE | G_NOHELL | G_GENO | 2), + A(ATTK(AT_EXPL, AD_COLD, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, MR_COLD, + M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS + | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_WHITE, FREEZING_SPHERE), + MON("flaming sphere", S_EYE, LVL(6, 13, 4, 0, 0), + (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_FIRE, 4, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_FIRE, MR_FIRE, + M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS + | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_RED, FLAMING_SPHERE), + MON("shocking sphere", S_EYE, LVL(6, 13, 4, 0, 0), + (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_ELEC, 4, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_ELEC, MR_ELEC, + M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS + | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 10, HI_ZAP, SHOCKING_SPHERE), +#if 0 /* not yet implemented */ + MON("beholder", S_EYE, + LVL(6, 3, 4, 0, -10), (G_GENO | 2), + A(ATTK(AT_GAZE, AD_SLOW, 0, 0), ATTK(AT_GAZE, AD_SLEE, 2,25), + ATTK(AT_GAZE, AD_DISN, 0, 0), ATTK(AT_GAZE, AD_STON, 0, 0), + ATTK(AT_GAZE, AD_CNCL, 2, 4), ATTK(AT_BITE, AD_PHYS, 2, 4)), + SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, 0, + M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, + M2_NOPOLY | M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 13, CLR_BROWN, + BEHOLDER), +#endif + /* + * felines + */ + MON("kitten", S_FELINE, LVL(2, 18, 6, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(150, 150, MS_MEW, MZ_SMALL), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER | M2_DOMESTIC, + M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_DOMESTIC, KITTEN), + MON("housecat", S_FELINE, LVL(4, 16, 5, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(200, 200, MS_MEW, MZ_SMALL), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, + M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_DOMESTIC, HOUSECAT), + MON("jaguar", S_FELINE, LVL(4, 15, 6, 0, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BROWN, JAGUAR), + MON("lynx", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 300, MS_GROWL, MZ_SMALL), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_CYAN, LYNX), + MON("panther", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), + ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BLACK, PANTHER), + MON("large cat", S_FELINE, LVL(6, 15, 4, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 2, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(250, 250, MS_MEW, MZ_SMALL), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC, + M3_INFRAVISIBLE | M3_INFRAVISION, 7, HI_DOMESTIC, LARGE_CAT), + MON("tiger", S_FELINE, LVL(6, 12, 6, 0, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), + ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_YELLOW, TIGER), + MON("displacer beast", S_FELINE, LVL(12, 12, -10, 0, -3), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_CLAW, AD_PHYS, 4, 4), + ATTK(AT_BITE, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(750, 400, MS_GROWL, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 14, CLR_BLUE, + DISPLACER_BEAST), + /* + * gremlins and gargoyles + */ + MON("gremlin", S_GREMLIN, LVL(5, 12, 2, 25, -9), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), + ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_CURS, 0, 0), NO_ATTK, + NO_ATTK), + SIZ(100, 20, MS_LAUGH, MZ_SMALL), MR_POISON, MR_POISON, + M1_SWIM | M1_HUMANOID | M1_POIS, M2_STALK, M3_INFRAVISIBLE, + 8, CLR_GREEN, GREMLIN), + MON("gargoyle", S_GREMLIN, LVL(6, 10, -4, 0, -9), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), + ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1000, 200, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE, + M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS, M2_HOSTILE | M2_STRONG, + 0, 8, CLR_BROWN, GARGOYLE), + MON("winged gargoyle", S_GREMLIN, LVL(9, 15, -2, 0, -12), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), + ATTK(AT_BITE, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1200, 300, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE, + M1_FLY | M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS | M1_OVIPAROUS, + M2_LORD | M2_HOSTILE | M2_STRONG | M2_MAGIC, 0, 11, HI_LORD, + WINGED_GARGOYLE), + /* + * humanoids + */ + MON("hobbit", S_HUMANOID, LVL(1, 9, 10, 0, 6), (G_GENO | 2), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 200, MS_HUMANOID, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_GREEN, HOBBIT), + MON("dwarf", S_HUMANOID, LVL(2, 6, 10, 10, 4), (G_GENO | 3), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_DWARF | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED, DWARF), + MON("bugbear", S_HUMANOID, LVL(3, 9, 5, 0, -6), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1250, 250, MS_GROWL, MZ_LARGE), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN, BUGBEAR), + MON3("dwarf lord", "dwarf lady", "dwarf leader", + S_HUMANOID, LVL(4, 6, 10, 10, 5), (G_GENO | 2), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, + M2_DWARF | M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BLUE, DWARF_LEADER), + MON3("dwarf king", "dwarf queen", "dwarf ruler", + S_HUMANOID, LVL(6, 6, 10, 20, 6), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, + M2_DWARF | M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS + | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 8, HI_LORD, DWARF_RULER), + MON("mind flayer", S_HUMANOID, LVL(9, 12, 5, 90, -8), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_TENT, AD_DRIN, 2, 1), + ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), NO_ATTK, + NO_ATTK), + SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE, + M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_MAGENTA, MIND_FLAYER), + MON("master mind flayer", S_HUMANOID, LVL(13, 12, 0, 90, -8), + (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TENT, AD_DRIN, 2, 1), + ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), + ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1)), + SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE, + M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_MAGENTA, + MASTER_MIND_FLAYER), + /* + * imps & other minor demons/devils + */ + MON("manes", S_IMP, LVL(1, 3, 7, 0, -7), + (G_GENO | G_LGROUP | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), + ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, 0, M1_POIS, + M2_HOSTILE | M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED, + MANES), + MON("homunculus", S_IMP, LVL(2, 12, 6, 10, -7), (G_GENO | 2), + A(ATTK(AT_BITE, AD_SLEE, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(60, 100, MS_SILENT, MZ_TINY), MR_SLEEP | MR_POISON, + MR_SLEEP | MR_POISON, M1_FLY | M1_POIS, M2_STALK, + M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_GREEN, HOMUNCULUS), + MON("imp", S_IMP, LVL(3, 12, 2, 20, -7), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(20, 10, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER | M2_STALK, + M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED, IMP), + MON("lemure", S_IMP, LVL(3, 3, 7, 0, -7), + (G_HELL | G_GENO | G_LGROUP | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(150, 100, MS_SILENT, MZ_MEDIUM), MR_SLEEP | MR_POISON, MR_SLEEP, + M1_POIS | M1_REGEN, M2_HOSTILE | M2_WANDER | M2_STALK | M2_NEUTER, + M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN, LEMURE), + MON("quasit", S_IMP, LVL(3, 15, 2, 20, -7), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_DRDX, 1, 2), ATTK(AT_CLAW, AD_DRDX, 1, 2), + ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(200, 200, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_REGEN, + M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BLUE, QUASIT), + MON("tengu", S_IMP, LVL(6, 13, 5, 30, 7), (G_GENO | 3), + A(ATTK(AT_BITE, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(300, 200, MS_SQAWK, MZ_SMALL), MR_POISON, MR_POISON, + M1_TPORT | M1_TPORT_CNTRL, M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, + 7, CLR_CYAN, TENGU), + /* + * jellies + */ + MON("blue jelly", S_JELLY, LVL(4, 0, 8, 10, 0), (G_GENO | 2), + A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_COLD | MR_POISON, + MR_COLD | MR_POISON, + M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 5, CLR_BLUE, BLUE_JELLY), + MON("spotted jelly", S_JELLY, LVL(5, 0, 8, 10, 0), (G_GENO | 1), + A(ATTK(AT_NONE, AD_ACID, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0, + M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_ACID | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 6, CLR_GREEN, SPOTTED_JELLY), + MON("ochre jelly", S_JELLY, LVL(6, 3, 8, 20, 0), (G_GENO | 2), + A(ATTK(AT_ENGL, AD_ACID, 3, 6), ATTK(AT_NONE, AD_ACID, 3, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0, + M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_ACID | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 8, CLR_BROWN, OCHRE_JELLY), + /* + * kobolds + */ + MON("kobold", S_KOBOLD, LVL(0, 6, 10, 0, -2), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(400, 100, MS_ORC, MZ_SMALL), MR_POISON, 0, + M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_BROWN, KOBOLD), + MON("large kobold", S_KOBOLD, LVL(1, 6, 10, 0, -3), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0, + M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_RED, LARGE_KOBOLD), + MON3("kobold lord", "kobold lady", "kobold leader", + S_KOBOLD, LVL(2, 6, 10, 0, -4), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 200, MS_ORC, MZ_SMALL), MR_POISON, 0, + M1_HUMANOID | M1_POIS | M1_OMNIVORE, + M2_HOSTILE | M2_LORD | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_LORD, KOBOLD_LEADER), + MON("kobold shaman", S_KOBOLD, LVL(2, 6, 6, 10, -4), (G_GENO | 1), + A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0, + M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_MAGIC, + M3_INFRAVISIBLE | M3_INFRAVISION, 4, HI_ZAP, KOBOLD_SHAMAN), + /* + * leprechauns + */ + MON("leprechaun", S_LEPRECHAUN, LVL(5, 15, 8, 20, 0), (G_GENO | 4), + A(ATTK(AT_CLAW, AD_SGLD, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(60, 30, MS_LAUGH, MZ_TINY), 0, 0, M1_HUMANOID | M1_TPORT, + M2_HOSTILE | M2_GREEDY, M3_INFRAVISIBLE, 4, CLR_GREEN, LEPRECHAUN), + /* + * mimics + */ + MON("small mimic", S_MIMIC, LVL(7, 3, 7, 0, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(300, 200, MS_SILENT, MZ_MEDIUM), MR_ACID, 0, + M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL | M1_NOEYES + | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE | M1_CARNIVORE, + M2_HOSTILE, 0, 8, CLR_BROWN, SMALL_MIMIC), + MON("large mimic", S_MIMIC, LVL(8, 3, 7, 10, 0), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_STCK, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(600, 400, MS_SILENT, MZ_LARGE), MR_ACID, 0, + M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL + | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG, 0, 9, CLR_RED, LARGE_MIMIC), + MON("giant mimic", S_MIMIC, LVL(9, 3, 7, 20, 0), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_STCK, 3, 6), ATTK(AT_CLAW, AD_STCK, 3, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(800, 500, MS_SILENT, MZ_LARGE), MR_ACID, 0, + M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL + | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG, 0, 11, HI_LORD, GIANT_MIMIC), + /* + * nymphs + */ + MON("wood nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT, + M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_GREEN, + WOOD_NYMPH), + MON("water nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_TPORT | M1_SWIM, M2_HOSTILE | M2_FEMALE | M2_COLLECT, + M3_INFRAVISIBLE, 5, CLR_BLUE, WATER_NYMPH), + MON("mountain nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT, + M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_BROWN, + MOUNTAIN_NYMPH), + /* + * orcs + */ + MON("goblin", S_ORC, LVL(0, 6, 10, 0, -3), (G_GENO | 2), + A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(400, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_ORC | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_GRAY, + GOBLIN), + MON("hobgoblin", S_ORC, LVL(1, 9, 10, 0, -4), (G_GENO | 2), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_ORC | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, + 3, CLR_BROWN, HOBGOBLIN), + /* plain "orc" for zombie corpses only; not created at random + */ + MON("orc", S_ORC, LVL(1, 9, 10, 0, -3), (G_GENO | G_NOGEN | G_LGROUP), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(850, 150, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED, ORC), + MON("hill orc", S_ORC, LVL(2, 9, 10, 0, -4), (G_GENO | G_LGROUP | 2), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_YELLOW, HILL_ORC), + MON("Mordor orc", S_ORC, LVL(3, 5, 10, 0, -5), (G_GENO | G_LGROUP | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1200, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLUE, MORDOR_ORC), + MON("Uruk-hai", S_ORC, LVL(3, 7, 10, 0, -4), (G_GENO | G_LGROUP | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1300, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLACK, URUK_HAI), + MON("orc shaman", S_ORC, LVL(3, 9, 5, 10, -5), (G_GENO | 1), + A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1000, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_MAGIC, + M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP, ORC_SHAMAN), + MON("orc-captain", S_ORC, LVL(5, 5, 10, 0, -5), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1350, 350, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 7, HI_LORD, ORC_CAPTAIN), + /* + * piercers + */ + MON("rock piercer", S_PIERCER, LVL(3, 1, 3, 0, 0), (G_GENO | 4), + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(200, 200, MS_SILENT, MZ_SMALL), 0, 0, + M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE + | M1_NOTAKE, + M2_HOSTILE, 0, 4, CLR_GRAY, ROCK_PIERCER), + MON("iron piercer", S_PIERCER, LVL(5, 1, 0, 0, 0), (G_GENO | 2), + A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(400, 300, MS_SILENT, MZ_MEDIUM), 0, 0, + M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE + | M1_NOTAKE, + M2_HOSTILE, 0, 6, CLR_CYAN, IRON_PIERCER), + MON("glass piercer", S_PIERCER, LVL(7, 1, 0, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(400, 300, MS_SILENT, MZ_MEDIUM), MR_ACID, 0, + M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE + | M1_NOTAKE, + M2_HOSTILE, 0, 9, CLR_WHITE, GLASS_PIERCER), + /* + * quadrupeds + */ + MON("rothe", S_QUADRUPED, LVL(2, 9, 7, 0, 0), (G_GENO | G_SGROUP | 4), + A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3), + ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(400, 100, MS_MOO, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 4, CLR_BROWN, ROTHE), + MON("mumak", S_QUADRUPED, LVL(5, 9, 0, 0, -2), (G_GENO | 1), + A(ATTK(AT_BUTT, AD_PHYS, 4, 12), ATTK(AT_BITE, AD_PHYS, 2, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2500, 500, MS_TRUMPET, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 7, CLR_GRAY, + MUMAK), + MON("leocrotta", S_QUADRUPED, LVL(6, 18, 4, 10, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), + ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1200, 500, MS_IMITATE, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE | M2_STRONG, + M3_INFRAVISIBLE, 8, CLR_RED, LEOCROTTA), + MON("wumpus", S_QUADRUPED, LVL(8, 3, 2, 10, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(2500, 500, MS_BURBLE, MZ_LARGE), 0, 0, + M1_CLING | M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 9, CLR_CYAN, WUMPUS), + MON("titanothere", S_QUADRUPED, LVL(12, 12, 6, 0, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(2650, 650, MS_SILENT, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 13, CLR_GRAY, + TITANOTHERE), + MON("baluchitherium", S_QUADRUPED, LVL(14, 12, 5, 0, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 5, 4), ATTK(AT_CLAW, AD_PHYS, 5, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(3800, 800, MS_SILENT, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 15, CLR_GRAY, BALUCHITHERIUM), + MON("mastodon", S_QUADRUPED, LVL(20, 12, 5, 0, 0), (G_GENO | 1), + A(ATTK(AT_BUTT, AD_PHYS, 4, 8), ATTK(AT_BUTT, AD_PHYS, 4, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(3800, 800, MS_TRUMPET, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, + M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_BLACK, MASTODON), + /* + * rodents + */ + MON("sewer rat", S_RODENT, LVL(0, 12, 7, 0, 0), (G_GENO | G_SGROUP | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(20, 12, MS_SQEEK, MZ_TINY), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 1, CLR_BROWN, SEWER_RAT), + MON("giant rat", S_RODENT, LVL(1, 10, 7, 0, 0), (G_GENO | G_SGROUP | 2), + A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(30, 30, MS_SQEEK, MZ_TINY), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + 2, CLR_BROWN, GIANT_RAT), + MON("rabid rat", S_RODENT, LVL(2, 12, 6, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_DRCO, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(30, 5, MS_SQEEK, MZ_TINY), MR_POISON, 0, + M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE, 4, CLR_BROWN, RABID_RAT), + MON("wererat", S_RODENT, LVL(2, 12, 6, 10, -7), (G_NOGEN | G_NOCORPSE), + A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(40, 30, MS_SQEEK, MZ_TINY), MR_POISON, 0, + M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE, + M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN, + WERERAT), + MON("rock mole", S_RODENT, LVL(3, 3, 0, 20, 0), (G_GENO | 2), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(30, 30, MS_SILENT, MZ_SMALL), 0, 0, + M1_TUNNEL | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE, + M2_HOSTILE | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE, + 4, CLR_GRAY, ROCK_MOLE), + MON("woodchuck", S_RODENT, LVL(3, 3, 0, 20, 0), (G_NOGEN | G_GENO), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(30, 30, MS_SILENT, MZ_SMALL), 0, 0, + M1_TUNNEL /*LOGGING*/ | M1_ANIMAL | M1_NOHANDS | M1_SWIM + | M1_HERBIVORE, + /* In reality, they tunnel instead of cutting lumber. Oh, well. */ + M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN, WOODCHUCK), + /* + * spiders & scorpions (keep webmaker() in sync if new critters are added) + */ + MON("cave spider", S_SPIDER, LVL(1, 12, 3, 0, 0), (G_GENO | G_SGROUP | 2), + A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, + M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, + M2_HOSTILE, 0, 3, CLR_GRAY, CAVE_SPIDER), + MON("centipede", S_SPIDER, LVL(2, 4, 3, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, + M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, + M2_HOSTILE, 0, 4, CLR_YELLOW, CENTIPEDE), + MON("giant spider", S_SPIDER, LVL(5, 15, 4, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(200, 100, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, + M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG, 0, 7, CLR_MAGENTA, GIANT_SPIDER), + MON("scorpion", S_SPIDER, LVL(5, 15, 3, 0, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), + ATTK(AT_STNG, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(50, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, + M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS + | M1_CARNIVORE, + M2_HOSTILE, 0, 8, CLR_RED, SCORPION), + /* + * trappers, lurkers, &c + */ + MON("lurker above", S_TRAPPER, LVL(10, 3, 3, 0, 0), (G_GENO | 2), + A(ATTK(AT_ENGL, AD_DGST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0, + M1_HIDE | M1_FLY | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_CARNIVORE, + M2_HOSTILE | M2_STALK | M2_STRONG, 0, 12, CLR_GRAY, LURKER_ABOVE), + MON("trapper", S_TRAPPER, LVL(12, 3, 3, 0, 0), (G_GENO | 2), + A(ATTK(AT_ENGL, AD_DGST, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0, + M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_CARNIVORE, + M2_HOSTILE | M2_STALK | M2_STRONG, 0, 14, CLR_GREEN, TRAPPER), + /* + * unicorns and horses + */ + MON("pony", S_UNICORN, LVL(3, 16, 6, 0, 0), (G_GENO | 2), + A(ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1300, 250, MS_NEIGH, MZ_MEDIUM), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE, + M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 4, CLR_BROWN, + PONY), + MON("white unicorn", S_UNICORN, LVL(4, 24, 2, 70, 7), (G_GENO | 2), + A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, + M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS, + M3_INFRAVISIBLE, 6, CLR_WHITE, WHITE_UNICORN), + MON("gray unicorn", S_UNICORN, LVL(4, 24, 2, 70, 0), (G_GENO | 1), + A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, + M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS, + M3_INFRAVISIBLE, 6, CLR_GRAY, GRAY_UNICORN), + MON("black unicorn", S_UNICORN, LVL(4, 24, 2, 70, -7), (G_GENO | 1), + A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, + M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS, + M3_INFRAVISIBLE, 6, CLR_BLACK, BLACK_UNICORN), + MON("horse", S_UNICORN, LVL(5, 20, 5, 0, 0), (G_GENO | 2), + A(ATTK(AT_KICK, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 300, MS_NEIGH, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE, + M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 7, CLR_BROWN, + HORSE), + MON("warhorse", S_UNICORN, LVL(7, 24, 4, 0, 0), (G_GENO | 2), + A(ATTK(AT_KICK, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_PHYS, 1, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1800, 350, MS_NEIGH, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE, + M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 9, CLR_BROWN, + WARHORSE), + /* + * vortices + */ + MON("fog cloud", S_VORTEX, LVL(3, 1, 0, 0, 0), (G_GENO | G_NOCORPSE | 2), + A(ATTK(AT_ENGL, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_AMORPHOUS | M1_UNSOLID, + M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY, FOG_CLOUD), + MON("dust vortex", S_VORTEX, LVL(4, 20, 2, 30, 0), + (G_GENO | G_NOCORPSE | 2), A(ATTK(AT_ENGL, AD_BLND, 2, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS, + M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN, DUST_VORTEX), + MON("ice vortex", S_VORTEX, LVL(5, 20, 2, 30, 0), + (G_NOHELL | G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_ENGL, AD_COLD, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_HUGE), + MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS, + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 7, CLR_CYAN, ICE_VORTEX), + MON("energy vortex", S_VORTEX, LVL(6, 20, 2, 30, 0), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_ENGL, AD_ELEC, 1, 6), ATTK(AT_ENGL, AD_DREN, 2, 6), + ATTK(AT_NONE, AD_ELEC, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_HUGE), + MR_ELEC | MR_SLEEP | MR_DISINT | MR_POISON | MR_STONE, 0, + M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_UNSOLID, + M2_HOSTILE | M2_NEUTER, 0, 9, HI_ZAP, ENERGY_VORTEX), + MON("steam vortex", S_VORTEX, LVL(7, 22, 2, 30, 0), + (G_HELL | G_GENO | G_NOCORPSE | 2), + A(ATTK(AT_ENGL, AD_FIRE, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_HUGE), + MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_UNSOLID, + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_BLUE, STEAM_VORTEX), + MON("fire vortex", S_VORTEX, LVL(8, 22, 2, 30, 0), + (G_HELL | G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_ENGL, AD_FIRE, 1, 10), ATTK(AT_NONE, AD_FIRE, 0, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_HUGE), + MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_UNSOLID, + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW, + FIRE_VORTEX), + /* + * worms + */ + MON("baby long worm", S_WORM, LVL(5, 3, 5, 0, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE | M1_NOTAKE, + M2_HOSTILE, 0, 6, CLR_BROWN, BABY_LONG_WORM), + MON("baby purple worm", S_WORM, LVL(8, 3, 5, 0, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE, M2_HOSTILE, 0, + 9, CLR_MAGENTA, BABY_PURPLE_WORM), + MON("long worm", S_WORM, LVL(9, 3, 5, 10, 0), (G_GENO | 2), + A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_SILENT, MZ_GIGANTIC), 0, 0, + M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE + | M1_NOTAKE, + M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 10, CLR_BROWN, LONG_WORM), + MON("purple worm", S_WORM, LVL(15, 9, 6, 20, 0), (G_GENO | 2), + A(ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_ENGL, AD_DGST, 1, 10), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2700, 700, MS_SILENT, MZ_GIGANTIC), 0, 0, + M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 17, CLR_MAGENTA, PURPLE_WORM), + /* + * xan, &c + */ + MON("grid bug", S_XAN, LVL(0, 12, 9, 0, 0), + (G_GENO | G_SGROUP | G_NOCORPSE | 3), + A(ATTK(AT_BITE, AD_ELEC, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(15, 10, MS_BUZZ, MZ_TINY), MR_ELEC | MR_POISON, 0, M1_ANIMAL, + M2_HOSTILE, M3_INFRAVISIBLE, 1, CLR_MAGENTA, GRID_BUG), + MON("xan", S_XAN, LVL(7, 18, -4, 0, 0), (G_GENO | 3), + A(ATTK(AT_STNG, AD_LEGS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(300, 300, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, + M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS, M2_HOSTILE, + M3_INFRAVISIBLE, 9, CLR_RED, XAN), + /* + * lights + */ + MON("yellow light", S_LIGHT, LVL(3, 15, 0, 0, 0), + (G_NOCORPSE | G_GENO | 4), A(ATTK(AT_EXPL, AD_BLND, 10, 20), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_SMALL), + MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_SLEEP | MR_POISON + | MR_ACID | MR_STONE, + 0, M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS + | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 5, CLR_YELLOW, YELLOW_LIGHT), + MON("black light", S_LIGHT, LVL(5, 15, 0, 0, 0), + (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_HALU, 10, 12), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_SMALL), + MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_SLEEP | MR_POISON + | MR_ACID | MR_STONE, + 0, + M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS + | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_SEE_INVIS | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 7, CLR_BLACK, BLACK_LIGHT), + /* + * zruty + */ + MON("zruty", S_ZRUTY, LVL(9, 8, 3, 0, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), + ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1200, 600, MS_SILENT, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, + M3_INFRAVISIBLE, 11, CLR_BROWN, ZRUTY), + /* + * Angels and other lawful minions + */ + MON("couatl", S_ANGEL, LVL(8, 10, 5, 30, 7), + (G_NOHELL | G_SGROUP | G_NOCORPSE | 1), + A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_BITE, AD_PHYS, 1, 3), + ATTK(AT_HUGS, AD_WRAP, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(900, 400, MS_HISS, MZ_LARGE), MR_POISON, 0, + M1_FLY | M1_NOHANDS | M1_SLITHY | M1_POIS, + M2_MINION | M2_STALK | M2_STRONG | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_GREEN, COUATL), + MON("Aleax", S_ANGEL, LVL(10, 8, 0, 30, 7), (G_NOHELL | G_NOCORPSE | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), + ATTK(AT_KICK, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_IMITATE, MZ_HUMAN), + MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, + M1_HUMANOID | M1_SEE_INVIS, + M2_MINION | M2_STALK | M2_NASTY | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_YELLOW, ALEAX), + /* Angels start with the emin extension attached, and usually have + the isminion flag set; however, non-minion Angels can be tamed + and will switch to edog (guardian Angel is handled specially and + always sticks with emin) */ + MON("Angel", S_ANGEL, LVL(14, 10, -4, 55, 12), + (G_NOHELL | G_NOCORPSE | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN), + MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, + M1_FLY | M1_HUMANOID | M1_SEE_INVIS, + M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_WHITE, ANGEL), + /* the AD&D Monster Manual depicts ki-rin as very similar to unicorns + except that they fly (without wings) and can cast spells */ + MON("ki-rin", S_ANGEL, LVL(16, 18, -5, 90, 15), + (G_NOHELL | G_NOCORPSE | 1), + A(ATTK(AT_KICK, AD_PHYS, 2, 4), ATTK(AT_KICK, AD_PHYS, 2, 4), + ATTK(AT_BUTT, AD_PHYS, 3, 6), ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SPELL, MZ_LARGE), MR_POISON, 0, + M1_FLY | M1_NOHANDS | M1_SEE_INVIS, + M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD, + M3_INFRAVISIBLE | M3_INFRAVISION, 21, HI_GOLD, KI_RIN), + MON("Archon", S_ANGEL, LVL(19, 16, -6, 80, 15), + (G_NOHELL | G_NOCORPSE | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), + ATTK(AT_GAZE, AD_BLND, 2, 6), ATTK(AT_CLAW, AD_PHYS, 1, 8), + ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK), + SIZ(WT_HUMAN, 400, MS_CUSS, MZ_LARGE), + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, + M1_FLY | M1_HUMANOID | M1_SEE_INVIS | M1_REGEN, + M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD + | M2_COLLECT | M2_MAGIC, + M3_INFRAVISIBLE | M3_INFRAVISION, 26, HI_LORD, ARCHON), + /* + * Bats + */ + MON("bat", S_BAT, LVL(0, 22, 8, 0, 0), (G_GENO | G_SGROUP | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(20, 20, MS_SQEEK, MZ_TINY), 0, 0, + M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER, + M3_INFRAVISIBLE, 2, CLR_BROWN, BAT), + MON("giant bat", S_BAT, LVL(2, 22, 7, 0, 0), (G_GENO | 2), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(30, 30, MS_SQEEK, MZ_SMALL), 0, 0, + M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, + M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 3, CLR_RED, GIANT_BAT), + MON("raven", S_BAT, LVL(4, 20, 6, 0, 0), (G_GENO | 2), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_BLND, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(40, 20, MS_SQAWK, MZ_SMALL), 0, 0, + M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, + M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 6, CLR_BLACK, RAVEN), + MON("vampire bat", S_BAT, LVL(5, 20, 6, 0, 0), (G_GENO | 2), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRST, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(30, 20, MS_SQEEK, MZ_SMALL), MR_SLEEP | MR_POISON, 0, + M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_REGEN | M1_OMNIVORE, + M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BLACK, VAMPIRE_BAT), + /* + * Centaurs + */ + MON("plains centaur", S_CENTAUR, LVL(4, 18, 4, 0, 0), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2500, 500, MS_HUMANOID, MZ_LARGE), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT, + M3_INFRAVISIBLE, 6, CLR_BROWN, PLAINS_CENTAUR), + MON("forest centaur", S_CENTAUR, LVL(5, 18, 3, 10, -1), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2550, 600, MS_HUMANOID, MZ_LARGE), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT, + M3_INFRAVISIBLE, 8, CLR_GREEN, FOREST_CENTAUR), + MON("mountain centaur", S_CENTAUR, LVL(6, 20, 2, 10, -3), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_KICK, AD_PHYS, 1, 6), + ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2550, 500, MS_HUMANOID, MZ_LARGE), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT, + M3_INFRAVISIBLE, 9, CLR_CYAN, MOUNTAIN_CENTAUR), + /* + * Dragons + */ + /* The order of the dragons is VERY IMPORTANT. Quite a few + * pieces of code depend on gray being first and yellow being last. + * The code also depends on the *order* being the same as that for + * dragon scale mail and dragon scales in objects.c. [Also, + * 'tilemap' assumes that shimmering dragon follows silver dragon.] + * + * Adult dragons are all lawful or chaotic; baby dragons are all + * neutral. This affects monster generation on some special levels. + * Baby dragons cannot confer intrinsics, to avoid polyself/egg abuse. + * + * As reptiles, dragons are cold-blooded and thus aren't seen with + * infravision. Red and gold dragons (also Chromatic Dragon) are + * the exceptions because they breathe fire. + */ + MON("baby gray dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GRAY, + BABY_GRAY_DRAGON), + MON("baby gold dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, M3_INFRAVISIBLE, + 13, HI_GOLD, BABY_GOLD_DRAGON), + MON("baby silver dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, DRAGON_SILVER, + BABY_SILVER_DRAGON), +#if 0 /* DEFERRED */ + /* [see "shimmering dragon" below] */ + MON("baby shimmering dragon", S_DRAGON, + LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_CYAN, + BABY_SHIMMERING_DRAGON), +#endif + MON("baby red dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_FIRE, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, M3_INFRAVISIBLE, + 13, CLR_RED, BABY_RED_DRAGON), + MON("baby white dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_COLD, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_WHITE, + BABY_WHITE_DRAGON), + MON("baby orange dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_SLEEP, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_ORANGE, + BABY_ORANGE_DRAGON), + MON("baby black dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_DISINT, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLACK, + BABY_BLACK_DRAGON), + MON("baby blue dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ELEC, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLUE, + BABY_BLUE_DRAGON), + MON("baby green dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_POISON, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_POIS, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GREEN, + BABY_GREEN_DRAGON), + MON("baby yellow dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ACID | MR_STONE, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_ACID, + M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_YELLOW, + BABY_YELLOW_DRAGON), + MON("gray dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1), + A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + 0, 20, CLR_GRAY, GRAY_DRAGON), + MON("gold dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1), + A(ATTK(AT_BREA, AD_FIRE, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + NO_ATTK, NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_FIRE, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + M3_INFRAVISIBLE, 20, HI_GOLD, GOLD_DRAGON), + MON("silver dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1), + A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_COLD, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + 0, 20, DRAGON_SILVER, SILVER_DRAGON), +#if 0 /* DEFERRED */ + /* shimmering scales/scale-mail would confer displacement when worn by + the hero, so shimmering dragon ought to be displaced (hero who can + see one might misjudge its location) but monster displacement hasn't + been implemented so we don't include it */ + MON("shimmering dragon", S_DRAGON, + LVL(15, 9, -1, 20, 4), (G_GENO | 1), + A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + NO_ATTK, NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + 0, 20, CLR_CYAN, SHIMMERING_DRAGON), +#endif + MON("red dragon", S_DRAGON, LVL(15, 9, -1, 20, -4), (G_GENO | 1), + A(ATTK(AT_BREA, AD_FIRE, 6, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_FIRE, MR_FIRE, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + M3_INFRAVISIBLE, 20, CLR_RED, RED_DRAGON), + MON("white dragon", S_DRAGON, LVL(15, 9, -1, 20, -5), (G_GENO | 1), + A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_COLD, MR_COLD, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + 0, 20, CLR_WHITE, WHITE_DRAGON), + MON("orange dragon", S_DRAGON, LVL(15, 9, -1, 20, 5), (G_GENO | 1), + A(ATTK(AT_BREA, AD_SLEE, 4, 25), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_SLEEP, MR_SLEEP, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + 0, 20, CLR_ORANGE, ORANGE_DRAGON), + /* disintegration breath is actually all or nothing, not 1d255 */ + MON("black dragon", S_DRAGON, LVL(15, 9, -1, 20, -6), (G_GENO | 1), + A(ATTK(AT_BREA, AD_DISN, 1, 255), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_DISINT, MR_DISINT, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + 0, 20, CLR_BLACK, BLACK_DRAGON), + MON("blue dragon", S_DRAGON, LVL(15, 9, -1, 20, -7), (G_GENO | 1), + A(ATTK(AT_BREA, AD_ELEC, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_ELEC, MR_ELEC, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + 0, 20, CLR_BLUE, BLUE_DRAGON), + MON("green dragon", S_DRAGON, LVL(15, 9, -1, 20, 6), (G_GENO | 1), + A(ATTK(AT_BREA, AD_DRST, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_POISON, MR_POISON, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS + | M1_CARNIVORE | M1_POIS, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + 0, 20, CLR_GREEN, GREEN_DRAGON), + MON("yellow dragon", S_DRAGON, LVL(15, 9, -1, 20, 7), (G_GENO | 1), + A(ATTK(AT_BREA, AD_ACID, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_ACID | MR_STONE, + MR_STONE, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS + | M1_OVIPAROUS | M1_CARNIVORE | M1_ACID, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, + 0, 20, CLR_YELLOW, YELLOW_DRAGON), + /* + * Elementals + */ + MON("stalker", S_ELEMENTAL, LVL(8, 12, 3, 0, 0), (G_GENO | 3), + A(ATTK(AT_CLAW, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(900, 400, MS_SILENT, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_FLY | M1_SEE_INVIS, + M2_WANDER | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, + 9, CLR_WHITE, STALKER), + MON("air elemental", S_ELEMENTAL, LVL(8, 36, 2, 30, 0), (G_NOCORPSE | 1), + A(ATTK(AT_ENGL, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0, + M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS + | M1_UNSOLID | M1_FLY, + M2_STRONG | M2_NEUTER, 0, 10, CLR_CYAN, AIR_ELEMENTAL), + MON("fire elemental", S_ELEMENTAL, LVL(8, 12, 2, 30, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_FIRE, 3, 6), ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_FIRE | MR_POISON | MR_STONE, 0, + M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS + | M1_UNSOLID | M1_FLY | M1_NOTAKE, + M2_STRONG | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW, + FIRE_ELEMENTAL), + MON("earth elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(2500, 0, MS_SILENT, MZ_HUGE), + MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0, + M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS + | M1_WALLWALK | M1_THICK_HIDE, + M2_STRONG | M2_NEUTER, 0, 10, CLR_BROWN, EARTH_ELEMENTAL), + MON("water elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(2500, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0, + M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS + | M1_UNSOLID | M1_AMPHIBIOUS | M1_SWIM, + M2_STRONG | M2_NEUTER, 0, 10, CLR_BLUE, WATER_ELEMENTAL), + /* + * Fungi + */ + MON("lichen", S_FUNGUS, LVL(0, 1, 9, 0, 0), (G_GENO | 4), + A(ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(20, 200, MS_SILENT, MZ_SMALL), 0, 0, + M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS + | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 1, CLR_BRIGHT_GREEN, LICHEN), + MON("brown mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1), + A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_COLD | MR_POISON, + MR_COLD | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS + | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_BROWN, BROWN_MOLD), + MON("yellow mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 2), + A(ATTK(AT_NONE, AD_STUN, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, + M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS + | M1_POIS | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_YELLOW, YELLOW_MOLD), + MON("green mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1), + A(ATTK(AT_NONE, AD_ACID, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_ACID | MR_STONE, MR_STONE, + M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS + | M1_ACID | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GREEN, GREEN_MOLD), + MON("red mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1), + A(ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_FIRE | MR_POISON, + MR_FIRE | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS + | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 2, CLR_RED, RED_MOLD), + MON("shrieker", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 1), + A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(100, 100, MS_SHRIEK, MZ_SMALL), MR_POISON, MR_POISON, + M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS + | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 2, CLR_MAGENTA, SHRIEKER), + MON("violet fungus", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 2), + A(ATTK(AT_TUCH, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, + M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS + | M1_NOTAKE, + M2_HOSTILE | M2_NEUTER, 0, 5, CLR_MAGENTA, VIOLET_FUNGUS), + /* + * Gnomes + */ + MON("gnome", S_GNOME, LVL(1, 6, 10, 4, 0), (G_GENO | G_SGROUP | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(650, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_GNOME | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, + 3, CLR_BROWN, GNOME), + MON3("gnome lord", "gnome lady", "gnome leader", + S_GNOME, LVL(3, 8, 10, 4, 0), (G_GENO | 2), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_GNOME | M2_LORD | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_BLUE, GNOME_LEADER), + MON("gnomish wizard", S_GNOME, LVL(3, 10, 4, 10, 0), (G_GENO | 1), + A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_GNOME | M2_MAGIC, M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP, + GNOMISH_WIZARD), + MON3("gnome king", "gnome queen", "gnome ruler", + S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(750, 150, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, + M2_GNOME | M2_PRINCE | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 6, HI_LORD, GNOME_RULER), + /* + * giant Humanoids + */ + MON("giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_GENO | G_NOGEN | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, + M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT + | M2_JEWELS, + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_RED, GIANT), + MON("stone giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_GENO | G_SGROUP | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, + M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT + | M2_JEWELS, + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY, STONE_GIANT), + MON("hill giant", S_GIANT, LVL(8, 10, 6, 0, -2), (G_GENO | G_SGROUP | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(2200, 700, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, + M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT + | M2_JEWELS, + M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_CYAN, HILL_GIANT), + MON("fire giant", S_GIANT, LVL(9, 12, 4, 5, 2), (G_GENO | G_SGROUP | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_FIRE, MR_FIRE, + M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW + | M2_NASTY | M2_COLLECT | M2_JEWELS, + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_YELLOW, FIRE_GIANT), + MON("frost giant", S_GIANT, LVL(10, 12, 3, 10, -3), + (G_NOHELL | G_GENO | G_SGROUP | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_COLD, MR_COLD, + M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW + | M2_NASTY | M2_COLLECT | M2_JEWELS, + M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_WHITE, FROST_GIANT), + MON("ettin", S_GIANT, LVL(10, 12, 3, 0, 0), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1700, 500, MS_GRUNT, MZ_HUGE), 0, 0, + M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_BROWN, ETTIN), + MON("storm giant", S_GIANT, LVL(16, 12, 3, 10, -3), + (G_GENO | G_SGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_ELEC, MR_ELEC, + M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW + | M2_NASTY | M2_COLLECT | M2_JEWELS, + M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_BLUE, STORM_GIANT), + MON("titan", S_GIANT, LVL(16, 18, -3, 70, 9), (1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2300, 900, MS_SPELL, MZ_HUGE), 0, 0, + M1_FLY | M1_HUMANOID | M1_OMNIVORE, + M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_MAGIC, + M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_MAGENTA, TITAN), + MON("minotaur", S_GIANT, LVL(15, 15, 6, 0, 0), (G_GENO | G_NOGEN), + A(ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10), + ATTK(AT_BUTT, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 700, MS_MOO, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE | M3_INFRAVISION, + 17, CLR_BROWN, MINOTAUR), + /* + * Invisible + * S_invisible=='I' is a visual marker for all invisible monsters + * and must be not be used for any specific monster types. Long + * time 'invisible stalker' was changed to 'stalker', an Elemental. + */ + + /* + * Jabberwock + */ + /* the illustration from _Through_the_Looking_Glass_ + depicts hands as well as wings */ + MON("jabberwock", S_JABBERWOCK, LVL(15, 12, -2, 50, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_PHYS, 2, 10), + ATTK(AT_CLAW, AD_PHYS, 2, 10), ATTK(AT_CLAW, AD_PHYS, 2, 10), + NO_ATTK, NO_ATTK), + SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_FLY | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE, + 18, CLR_ORANGE, JABBERWOCK), +#if 0 /* DEFERRED */ + MON("vorpal jabberwock", S_JABBERWOCK, + LVL(20, 12, -2, 50, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 3, 10), ATTK(AT_BITE, AD_PHYS, 3, 10), + ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10), + NO_ATTK, NO_ATTK), + SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_FLY | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE, + 25, HI_LORD, VORPAL_JABBERWOCK), +#endif + /* + * Kops + */ + MON("Keystone Kop", S_KOP, LVL(1, 6, 10, 10, 9), + (G_GENO | G_LGROUP | G_NOGEN), + A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, + M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_MALE | M2_COLLECT, + M3_INFRAVISIBLE, 3, CLR_BLUE, KEYSTONE_KOP), + MON("Kop Sergeant", S_KOP, LVL(2, 8, 10, 10, 10), + (G_GENO | G_SGROUP | G_NOGEN), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, + M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT, + M3_INFRAVISIBLE, 4, CLR_BLUE, KOP_SERGEANT), + MON("Kop Lieutenant", S_KOP, LVL(3, 10, 10, 20, 11), (G_GENO | G_NOGEN), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, + M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT, + M3_INFRAVISIBLE, 5, CLR_CYAN, KOP_LIEUTENANT), + MON("Kop Kaptain", S_KOP, LVL(4, 12, 10, 20, 12), (G_GENO | G_NOGEN), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, + M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT, + M3_INFRAVISIBLE, 6, HI_LORD, KOP_KAPTAIN), + /* + * Liches + */ + MON("lich", S_LICH, LVL(11, 6, 0, 30, -9), (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_TUCH, AD_COLD, 1, 10), ATTK(AT_MAGC, AD_SPEL, 0, 0), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, + MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, + M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 14, CLR_BROWN, + LICH), + MON("demilich", S_LICH, LVL(14, 9, -2, 60, -12), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_TUCH, AD_COLD, 3, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, + MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, + M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 18, CLR_RED, + DEMILICH), + MON("master lich", S_LICH, LVL(17, 9, -4, 90, -15), + (G_HELL | G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_TUCH, AD_COLD, 3, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), + MR_FIRE | MR_COLD | MR_SLEEP | MR_POISON, MR_FIRE | MR_COLD, + M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, + M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION, + 21, HI_LORD, MASTER_LICH), + MON("arch-lich", S_LICH, LVL(25, 9, -6, 90, -15), + (G_HELL | G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_TUCH, AD_COLD, 5, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), + MR_FIRE | MR_COLD | MR_SLEEP | MR_ELEC | MR_POISON, MR_FIRE | MR_COLD, + M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, + M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION, + 29, HI_LORD, ARCH_LICH), + /* + * Mummies + */ + MON("kobold mummy", S_MUMMY, LVL(3, 8, 6, 20, -2), + (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 4, CLR_BROWN, KOBOLD_MUMMY), + MON("gnome mummy", S_MUMMY, LVL(4, 10, 6, 20, -3), + (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_HOSTILE | M2_GNOME, M3_INFRAVISION, 5, CLR_RED, + GNOME_MUMMY), + MON("orc mummy", S_MUMMY, LVL(5, 10, 5, 20, -4), + (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_HOSTILE | M2_ORC | M2_GREEDY | M2_JEWELS, + M3_INFRAVISION, 6, CLR_GRAY, ORC_MUMMY), + MON("dwarf mummy", S_MUMMY, LVL(5, 10, 5, 20, -4), + (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_HOSTILE | M2_DWARF | M2_GREEDY | M2_JEWELS, + M3_INFRAVISION, 6, CLR_RED, DWARF_MUMMY), + MON("elf mummy", S_MUMMY, LVL(6, 12, 4, 30, -5), + (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, + 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_HOSTILE | M2_ELF, M3_INFRAVISION, 7, CLR_GREEN, + ELF_MUMMY), + MON("human mummy", S_MUMMY, LVL(6, 12, 4, 30, -5), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN), + MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 7, CLR_GRAY, + HUMAN_MUMMY), + MON("ettin mummy", S_MUMMY, LVL(7, 12, 4, 30, -6), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_BLUE, + ETTIN_MUMMY), + MON("giant mummy", S_MUMMY, LVL(8, 14, 3, 30, -7), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_HOSTILE | M2_GIANT | M2_STRONG | M2_JEWELS, + M3_INFRAVISION, 10, CLR_CYAN, GIANT_MUMMY), + /* + * Nagas + */ + MON("red naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_FIRE | MR_POISON, + MR_FIRE | MR_POISON, + M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE, + M2_STRONG, M3_INFRAVISIBLE, 4, CLR_RED, RED_NAGA_HATCHLING), + MON("black naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON | MR_ACID | MR_STONE, + MR_POISON | MR_STONE, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_ACID + | M1_NOTAKE | M1_CARNIVORE, + M2_STRONG, 0, 4, CLR_BLACK, BLACK_NAGA_HATCHLING), + MON("golden naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON, + M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE, + M2_STRONG, 0, 4, HI_GOLD, GOLDEN_NAGA_HATCHLING), + MON("guardian naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON, + M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE, + M2_STRONG, 0, 4, CLR_GREEN, GUARDIAN_NAGA_HATCHLING), + MON("red naga", S_NAGA, LVL(6, 12, 4, 0, -4), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_FIRE | MR_POISON, + MR_FIRE | MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE + | M1_OVIPAROUS | M1_NOTAKE | M1_OMNIVORE, + M2_STRONG, M3_INFRAVISIBLE, 8, CLR_RED, RED_NAGA), + MON("black naga", S_NAGA, LVL(8, 14, 2, 10, 4), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_SPIT, AD_ACID, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON | MR_ACID | MR_STONE, + MR_POISON | MR_STONE, + M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_ACID + | M1_NOTAKE | M1_CARNIVORE, + M2_STRONG, 0, 10, CLR_BLACK, BLACK_NAGA), + MON("golden naga", S_NAGA, LVL(10, 14, 2, 70, 5), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON, + M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_NOTAKE + | M1_OMNIVORE, + M2_STRONG, 0, 13, HI_GOLD, GOLDEN_NAGA), + MON("guardian naga", S_NAGA, LVL(12, 16, 0, 50, 7), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PLYS, 1, 6), ATTK(AT_SPIT, AD_DRST, 1, 6), + ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON, + M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_POIS + | M1_NOTAKE | M1_OMNIVORE, + M2_STRONG, 0, 16, CLR_GREEN, GUARDIAN_NAGA), + /* + * Ogres + */ + MON("ogre", S_OGRE, LVL(5, 10, 5, 0, -3), (G_SGROUP | G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1600, 500, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, + M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BROWN, OGRE), + MON3("ogre lord", "ogre lady", "ogre leader", + S_OGRE, LVL(7, 12, 3, 30, -5), (G_GENO | 2), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1700, 700, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, + M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_RED, OGRE_LEADER), + MON3("ogre king", "ogre queen", "ogre tyrant", + S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO | 2), + A(ATTK(AT_WEAP, AD_PHYS, 3, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1700, 750, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, + M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD, OGRE_TYRANT), + /* + * Puddings + * + * must be in the same order as the pudding globs in objects.c + */ + MON("gray ooze", S_PUDDING, LVL(3, 1, 8, 0, 0), (G_GENO | G_NOCORPSE | 2), + A(ATTK(AT_BITE, AD_RUST, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 250, MS_SILENT, MZ_MEDIUM), + MR_FIRE | MR_COLD | MR_POISON | MR_ACID | MR_STONE, + MR_FIRE | MR_COLD | MR_POISON, + M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_OMNIVORE | M1_ACID, + M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY, GRAY_OOZE), + MON("brown pudding", S_PUDDING, LVL(5, 3, 8, 0, 0), + (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_BITE, AD_DCAY, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(500, 250, MS_SILENT, MZ_MEDIUM), + MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE, + MR_COLD | MR_ELEC | MR_POISON, + M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_OMNIVORE | M1_ACID, + M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN, BROWN_PUDDING), + MON("green slime", S_PUDDING, LVL(6, 6, 6, 0, 0), + (G_HELL | G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(400, 150, MS_SILENT, MZ_LARGE), + MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE, 0, + M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_OMNIVORE | M1_ACID | M1_POIS, + M2_HOSTILE | M2_NEUTER, 0, 8, CLR_GREEN, GREEN_SLIME), + MON("black pudding", S_PUDDING, LVL(10, 6, 6, 0, 0), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(900, 250, MS_SILENT, MZ_LARGE), + MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE, + MR_COLD | MR_ELEC | MR_POISON, + M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD + | M1_MINDLESS | M1_OMNIVORE | M1_ACID, + M2_HOSTILE | M2_NEUTER, 0, 12, CLR_BLACK, BLACK_PUDDING), + /* + * Quantum mechanics + */ + MON("quantum mechanic", S_QUANTMECH, LVL(7, 12, 3, 10, 0), (G_GENO | 3), + A(ATTK(AT_CLAW, AD_TLPT, 1, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 20, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE, + M3_INFRAVISIBLE, 9, CLR_CYAN, QUANTUM_MECHANIC), + MON("genetic engineer", S_QUANTMECH, LVL(12, 12, 3, 10, 0), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_POLY, 1, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 20, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE | M2_NASTY, + M3_INFRAVISIBLE, 14, CLR_GREEN, GENETIC_ENGINEER), + /* + * Rust monster or disenchanter + */ + MON("rust monster", S_RUSTMONST, LVL(5, 18, 2, 0, 0), (G_GENO | 2), + A(ATTK(AT_TUCH, AD_RUST, 0, 0), ATTK(AT_TUCH, AD_RUST, 0, 0), + ATTK(AT_NONE, AD_RUST, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1000, 250, MS_SILENT, MZ_MEDIUM), 0, 0, + M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE, M2_HOSTILE, + M3_INFRAVISIBLE, 8, CLR_BROWN, RUST_MONSTER), + MON("disenchanter", S_RUSTMONST, LVL(12, 12, -10, 0, -3), + (G_HELL | G_GENO | 2), + A(ATTK(AT_CLAW, AD_ENCH, 4, 4), ATTK(AT_NONE, AD_ENCH, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(750, 200, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_CARNIVORE, + M2_HOSTILE, M3_INFRAVISIBLE, 14, CLR_BLUE, DISENCHANTER), + /* + * Snakes + */ + MON("garter snake", S_SNAKE, LVL(1, 8, 8, 0, 0), (G_LGROUP | G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(50, 60, MS_HISS, MZ_TINY), 0, 0, + M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY + | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE, + 0, 0, 3, CLR_GREEN, GARTER_SNAKE), + MON("snake", S_SNAKE, LVL(4, 15, 3, 0, 0), (G_GENO | 2), + A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(100, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON, + M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS + | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE, + M2_HOSTILE, 0, 6, CLR_BROWN, SNAKE), + MON("water moccasin", S_SNAKE, LVL(4, 15, 3, 0, 0), + (G_GENO | G_NOGEN | G_LGROUP), + A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(150, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON, + M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS + | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, + M2_HOSTILE, 0, 7, CLR_RED, WATER_MOCCASIN), + MON("python", S_SNAKE, LVL(6, 3, 5, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_PHYS, 0, 0), + ATTK(AT_HUGS, AD_WRAP, 1, 4), ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, + NO_ATTK), + SIZ(250, 100, MS_HISS, MZ_LARGE), 0, 0, + M1_SWIM | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_CARNIVORE + | M1_OVIPAROUS | M1_NOTAKE, + M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_MAGENTA, PYTHON), + MON("pit viper", S_SNAKE, LVL(6, 15, 2, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_DRST, 1, 4), ATTK(AT_BITE, AD_DRST, 1, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(100, 60, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON, + M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS + | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, + M2_HOSTILE, M3_INFRAVISION, 9, CLR_BLUE, PIT_VIPER), + MON("cobra", S_SNAKE, LVL(6, 18, 2, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_SPIT, AD_BLND, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(250, 100, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON, + M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS + | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, + M2_HOSTILE, 0, 10, CLR_BLUE, COBRA), + /* + * Trolls + */ + MON("troll", S_TROLL, LVL(7, 12, 4, 0, -3), (G_GENO | 2), + A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 4, 2), + ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(800, 350, MS_GRUNT, MZ_LARGE), 0, 0, + M1_HUMANOID | M1_REGEN | M1_CARNIVORE, + M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION, + 9, CLR_BROWN, TROLL), + MON("ice troll", S_TROLL, LVL(9, 10, 2, 20, -3), (G_NOHELL | G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_COLD, 2, 6), + ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1000, 300, MS_GRUNT, MZ_LARGE), MR_COLD, MR_COLD, + M1_HUMANOID | M1_REGEN | M1_CARNIVORE, + M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION, + 12, CLR_WHITE, ICE_TROLL), + MON("rock troll", S_TROLL, LVL(9, 12, 0, 0, -3), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8), + ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1200, 300, MS_GRUNT, MZ_LARGE), 0, 0, + M1_HUMANOID | M1_REGEN | M1_CARNIVORE, + M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_CYAN, ROCK_TROLL), + MON("water troll", S_TROLL, LVL(11, 14, 4, 40, -3), (G_NOGEN | G_GENO), + A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), + ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1200, 350, MS_GRUNT, MZ_LARGE), 0, 0, + M1_HUMANOID | M1_REGEN | M1_CARNIVORE | M1_SWIM, + M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION, + 13, CLR_BLUE, WATER_TROLL), + MON("Olog-hai", S_TROLL, LVL(13, 12, -4, 0, -7), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8), + ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 400, MS_GRUNT, MZ_LARGE), 0, 0, + M1_HUMANOID | M1_REGEN | M1_CARNIVORE, + M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 16, HI_LORD, OLOG_HAI), + /* + * Umber hulk + */ + MON("umber hulk", S_UMBER, LVL(9, 6, 2, 25, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), + ATTK(AT_BITE, AD_PHYS, 2, 5), ATTK(AT_GAZE, AD_CONF, 0, 0), NO_ATTK, + NO_ATTK), + SIZ(1200, 500, MS_SILENT, MZ_LARGE), 0, 0, M1_TUNNEL | M1_CARNIVORE, + M2_STRONG, M3_INFRAVISIBLE, 12, CLR_BROWN, UMBER_HULK), + /* + * Vampires + */ + MON("vampire", S_VAMPIRE, LVL(10, 12, 1, 25, -8), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRLI, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, + M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY + | M2_SHAPESHIFTER, + M3_INFRAVISIBLE, 12, CLR_RED, VAMPIRE), + MON3("vampire lord", "vampire lady", "vampire leader", + S_VAMPIRE, LVL(12, 14, 0, 50, -9), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, + M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD + | M2_SHAPESHIFTER, + M3_INFRAVISIBLE, 14, CLR_BLUE, VAMPIRE_LEADER), +#if 0 /* DEFERRED */ + MON("vampire mage", S_VAMPIRE, + LVL(20, 14, -4, 50, -9), (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), + ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, + M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD + | M2_MALE | M2_MAGIC | M2_SHAPESHIFTER, + M3_INFRAVISIBLE, 26, HI_ZAP, VAMPIRE_MAGE), +#endif + MON("Vlad the Impaler", S_VAMPIRE, LVL(28, 26, -6, 80, -10), + (G_NOGEN | G_NOCORPSE | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_DRLI, 1, 12), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, + M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, + M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG + | M2_NASTY | M2_PRINCE | M2_MALE | M2_SHAPESHIFTER, + M3_WAITFORU | M3_WANTSCAND | M3_INFRAVISIBLE, 32, HI_LORD, + VLAD_THE_IMPALER), + /* + * Wraiths + */ + MON("barrow wight", S_WRAITH, LVL(3, 12, 5, 5, -3), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_WEAP, AD_DRLI, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0), + ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_COLD, 1, 4), + NO_ATTK, NO_ATTK), + SIZ(1200, 0, MS_SPELL, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_HUMANOID, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_COLLECT, 0, 8, CLR_GRAY, + BARROW_WIGHT), + MON("wraith", S_WRAITH, LVL(6, 12, 4, 15, -6), (G_GENO | 2), + A(ATTK(AT_TUCH, AD_DRLI, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(0, 0, MS_SILENT, MZ_HUMAN), + MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_BREATHLESS | M1_FLY | M1_HUMANOID | M1_UNSOLID, + M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, 8, CLR_BLACK, + WRAITH), + MON("Nazgul", S_WRAITH, LVL(13, 12, 0, 25, -17), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_WEAP, AD_DRLI, 1, 4), ATTK(AT_BREA, AD_SLEE, 2, 25), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 0, MS_SPELL, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, + 0, M1_BREATHLESS | M1_HUMANOID, + M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_STRONG | M2_HOSTILE | M2_MALE + | M2_COLLECT, + 0, 17, HI_LORD, NAZGUL), + /* + * Xorn + */ + MON("xorn", S_XORN, LVL(8, 9, -2, 20, 0), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), + ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, + NO_ATTK), + SIZ(1200, 700, MS_ROAR, MZ_MEDIUM), MR_FIRE | MR_COLD | MR_STONE, + MR_STONE, + M1_BREATHLESS | M1_WALLWALK | M1_THICK_HIDE | M1_METALLIVORE, + M2_HOSTILE | M2_STRONG, 0, 11, CLR_BROWN, XORN), + /* + * Apelike beasts + */ + /* tameable via banana; does not grow up into ape... + not flagged as domestic, so no guilt penalty for eating non-pet one */ + MON("monkey", S_YETI, LVL(2, 12, 6, 0, 0), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(100, 50, MS_GROWL, MZ_SMALL), 0, 0, + M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, 0, M3_INFRAVISIBLE, + 4, CLR_GRAY, MONKEY), + MON("ape", S_YETI, LVL(4, 12, 6, 0, 0), (G_GENO | G_SGROUP | 2), + A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), + ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1100, 500, MS_GROWL, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, M2_STRONG, M3_INFRAVISIBLE, + 6, CLR_BROWN, APE), + MON("owlbear", S_YETI, LVL(5, 12, 5, 0, 0), (G_GENO | 3), + A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), + ATTK(AT_HUGS, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1700, 700, MS_ROAR, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, + M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE, 7, CLR_BROWN, + OWLBEAR), + MON("yeti", S_YETI, LVL(5, 15, 6, 0, 0), (G_GENO | 2), + A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), + ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1600, 700, MS_GROWL, MZ_LARGE), MR_COLD, MR_COLD, + M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, + M3_INFRAVISIBLE, 7, CLR_WHITE, YETI), + MON("carnivorous ape", S_YETI, LVL(6, 12, 6, 0, 0), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + ATTK(AT_HUGS, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1250, 550, MS_GROWL, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, + M3_INFRAVISIBLE, 8, CLR_BLACK, CARNIVOROUS_APE), + MON("sasquatch", S_YETI, LVL(7, 15, 6, 0, 2), (G_GENO | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), + ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1550, 750, MS_GROWL, MZ_LARGE), 0, 0, + M1_ANIMAL | M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_STRONG, + M3_INFRAVISIBLE, 9, CLR_GRAY, SASQUATCH), + /* + * Zombies + */ + MON("kobold zombie", S_ZOMBIE, LVL(0, 6, 10, 0, -2), + (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 1, CLR_BROWN, + KOBOLD_ZOMBIE), + MON("gnome zombie", S_ZOMBIE, LVL(1, 6, 10, 0, -2), + (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 5), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GNOME, M3_INFRAVISION, + 2, CLR_BROWN, GNOME_ZOMBIE), + MON("orc zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3), + (G_GENO | G_SGROUP | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ORC, M3_INFRAVISION, 3, + CLR_GRAY, ORC_ZOMBIE), + MON("dwarf zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3), + (G_GENO | G_SGROUP | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_DWARF, M3_INFRAVISION, + 3, CLR_RED, DWARF_ZOMBIE), + MON("elf zombie", S_ZOMBIE, LVL(3, 6, 9, 0, -3), + (G_GENO | G_SGROUP | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, + 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ELF, M3_INFRAVISION, + 4, CLR_GREEN, ELF_ZOMBIE), + MON("human zombie", S_ZOMBIE, LVL(4, 6, 8, 0, -3), + (G_GENO | G_SGROUP | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN), + MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, + M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 5, HI_DOMESTIC, + HUMAN_ZOMBIE), + MON("ettin zombie", S_ZOMBIE, LVL(6, 8, 6, 0, -4), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 10), ATTK(AT_CLAW, AD_PHYS, 1, 10), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, + 7, CLR_BLUE, ETTIN_ZOMBIE), + MON("ghoul", S_ZOMBIE, LVL(3, 6, 10, 0, -2), (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PLYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS | M1_OMNIVORE, + M2_UNDEAD | M2_WANDER | M2_HOSTILE, M3_INFRAVISION, 5, CLR_BLACK, + GHOUL), + MON("giant zombie", S_ZOMBIE, LVL(8, 8, 6, 0, -4), + (G_GENO | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, + M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GIANT | M2_STRONG, + M3_INFRAVISION, 9, CLR_CYAN, GIANT_ZOMBIE), + MON("skeleton", S_ZOMBIE, LVL(12, 8, 4, 0, 0), (G_NOCORPSE | G_NOGEN), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(300, 5, MS_BONES, MZ_HUMAN), + MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, + M2_UNDEAD | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_COLLECT + | M2_NASTY, + M3_INFRAVISION, 14, CLR_WHITE, SKELETON), + /* + * golems + */ + MON("straw golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, + 4, CLR_YELLOW, STRAW_GOLEM), + MON("paper golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, + 4, HI_PAPER, PAPER_GOLEM), + MON("rope golem", S_GOLEM, LVL(4, 9, 8, 0, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + ATTK(AT_HUGS, AD_PHYS, 6, 1), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, + 6, CLR_BROWN, ROPE_GOLEM), + MON("gold golem", S_GOLEM, LVL(5, 9, 6, 0, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 2, 3), ATTK(AT_CLAW, AD_PHYS, 2, 3), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, + M2_HOSTILE | M2_NEUTER, 0, 6, HI_GOLD, GOLD_GOLEM), + MON("leather golem", S_GOLEM, LVL(6, 6, 6, 0, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, + 7, HI_LEATHER, LEATHER_GOLEM), + MON("wood golem", S_GOLEM, LVL(7, 3, 4, 0, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(900, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, + M2_HOSTILE | M2_NEUTER, 0, 8, HI_WOOD, WOOD_GOLEM), + MON("flesh golem", S_GOLEM, LVL(9, 8, 9, 30, 0), (1), + A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1400, 600, MS_SILENT, MZ_LARGE), + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_STRONG, 0, + 10, CLR_RED, FLESH_GOLEM), + MON("clay golem", S_GOLEM, LVL(11, 7, 7, 40, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 3, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1550, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, + M2_HOSTILE | M2_STRONG, 0, 12, CLR_BROWN, CLAY_GOLEM), + MON("stone golem", S_GOLEM, LVL(14, 6, 5, 50, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1900, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, + M2_HOSTILE | M2_STRONG, 0, 15, CLR_GRAY, STONE_GOLEM), + MON("glass golem", S_GOLEM, LVL(16, 6, 1, 50, 0), (G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, + M2_HOSTILE | M2_STRONG, 0, 18, CLR_CYAN, GLASS_GOLEM), + MON("iron golem", S_GOLEM, LVL(18, 6, 3, 60, 0), (G_NOCORPSE | 1), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_BREA, AD_DRST, 4, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2000, 0, MS_SILENT, MZ_LARGE), + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, + M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE | M1_POIS, + M2_HOSTILE | M2_STRONG | M2_COLLECT, 0, 22, HI_METAL, IRON_GOLEM), + /* + * humans, including elves and were-critters; + * the '@' class does not obey rule #2. + */ + MON("human", S_HUMAN, LVL(0, 12, 10, 0, 0), G_NOGEN, /* for corpses */ + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, + 2, HI_DOMESTIC, HUMAN), + MON("wererat", S_HUMAN, LVL(2, 12, 10, 10, -7), (1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE, + M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, + M3_INFRAVISIBLE, 3, CLR_BROWN, HUMAN_WERERAT), + MON("werejackal", S_HUMAN, LVL(2, 12, 10, 10, -7), (1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE, + M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, + M3_INFRAVISIBLE, 3, CLR_RED, HUMAN_WEREJACKAL), + MON("werewolf", S_HUMAN, LVL(5, 12, 10, 20, -7), (1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE, + M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, + M3_INFRAVISIBLE, 6, CLR_ORANGE, HUMAN_WEREWOLF), + MON("elf", S_HUMAN, LVL(0, 12, 10, 2, -3), G_NOGEN, /* for corpses */ + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, + M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, + M2_NOPOLY | M2_ELF | M2_STRONG | M2_COLLECT, + M3_INFRAVISION | M3_INFRAVISIBLE, 2, HI_DOMESTIC, ELF), + MON("Woodland-elf", S_HUMAN, LVL(4, 12, 10, 10, -5), + (G_GENO | G_SGROUP | 2), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, + M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_GREEN, WOODLAND_ELF), + MON("Green-elf", S_HUMAN, LVL(5, 12, 10, 10, -6), (G_GENO | G_SGROUP | 2), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, + M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BRIGHT_GREEN, GREEN_ELF), + MON("Grey-elf", S_HUMAN, LVL(6, 12, 10, 10, -7), (G_GENO | G_SGROUP | 2), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, + M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY, GREY_ELF), + MON3("elf-lord", "elf-queen", "elf-noble", + S_HUMAN, LVL(8, 12, 10, 20, -9), (G_GENO | G_SGROUP | 2), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, + M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, + M2_ELF | M2_STRONG | M2_LORD | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BRIGHT_BLUE, ELF_NOBLE), + MON3("Elvenking", "Elvenqueen", "elven monarch", + S_HUMAN, LVL(9, 12, 10, 25, -10), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, + M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, + M2_ELF | M2_STRONG | M2_PRINCE | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD, ELVEN_MONARCH), + MON("doppelganger", S_HUMAN, LVL(9, 12, 5, 20, 0), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 12), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_IMITATE, MZ_HUMAN), MR_SLEEP, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT + | M2_SHAPESHIFTER, + M3_INFRAVISIBLE, 11, HI_DOMESTIC, DOPPELGANGER), + MON("shopkeeper", S_HUMAN, LVL(12, 18, 0, 50, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SELL, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL + | M2_STRONG | M2_COLLECT | M2_MAGIC, + M3_INFRAVISIBLE, 15, HI_DOMESTIC, SHOPKEEPER), + MON("guard", S_HUMAN, LVL(12, 12, 10, 40, 10), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARD, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_MERC | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 14, CLR_BLUE, GUARD), + /* prisoner is used on some special levels */ + MON("prisoner", S_HUMAN, LVL(12, 12, 10, 0, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE | M3_CLOSE, 14, HI_DOMESTIC, PRISONER), + MON("Oracle", S_HUMAN, LVL(12, 0, 0, 50, 0), (G_NOGEN | G_UNIQ), + A(ATTK(AT_NONE, AD_MAGM, 0, 4), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_ORACLE, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_FEMALE, M3_INFRAVISIBLE, + 13, HI_ZAP, ORACLE), + /* aligned priests always have the epri extension attached; + individual instantiations should always have either ispriest + or isminion set */ + MON3("priest", "priestess", "aligned cleric", + S_HUMAN, LVL(12, 12, 10, 50, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 1, 4), + ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN), MR_ELEC, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_LORD | M2_PEACEFUL | M2_COLLECT, + M3_INFRAVISIBLE, 15, CLR_WHITE, ALIGNED_CLERIC), + /* high priests always have epri and always have ispriest set */ + MON3("high priest", "high priestess", "high cleric", + S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), + ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN), + MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0, + M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_MINION | M2_PRINCE | M2_NASTY | M2_COLLECT + | M2_MAGIC, + M3_INFRAVISIBLE, 30, CLR_WHITE, HIGH_CLERIC), + MON("soldier", S_HUMAN, LVL(6, 10, 10, 0, -2), (G_SGROUP | G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK + | M2_HOSTILE | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 8, CLR_GRAY, SOLDIER), + MON("sergeant", S_HUMAN, LVL(8, 10, 10, 5, -3), (G_SGROUP | G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK + | M2_HOSTILE | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 10, CLR_RED, SERGEANT), + MON("nurse", S_HUMAN, LVL(11, 6, 0, 0, 0), (G_GENO | 3), + A(ATTK(AT_CLAW, AD_HEAL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_NURSE, MZ_HUMAN), MR_POISON, MR_POISON, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_HOSTILE, + M3_INFRAVISIBLE, 13, HI_DOMESTIC, NURSE), + MON("lieutenant", S_HUMAN, LVL(10, 10, 10, 15, -4), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK + | M2_HOSTILE | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 12, CLR_GREEN, LIEUTENANT), + MON("captain", S_HUMAN, LVL(12, 10, 10, 15, -5), (G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK + | M2_HOSTILE | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 14, CLR_BLUE, CAPTAIN), + MON("watchman", S_HUMAN, LVL(6, 10, 10, 0, -2), + (G_SGROUP | G_NOGEN | G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK + | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 8, CLR_GRAY, WATCHMAN), + MON("watch captain", S_HUMAN, LVL(10, 10, 10, 15, -4), + (G_NOGEN | G_GENO | 1), + A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK + | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 12, CLR_GREEN, WATCH_CAPTAIN), + /* Unique humans not tied to quests. + */ + MON("Medusa", S_HUMAN, LVL(20, 12, 2, 50, -15), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 1, 8), + ATTK(AT_GAZE, AD_STON, 0, 0), ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HISS, MZ_LARGE), MR_POISON | MR_STONE, + MR_POISON | MR_STONE, M1_FLY | M1_SWIM | M1_AMPHIBIOUS | M1_HUMANOID + | M1_POIS | M1_OMNIVORE, + M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_FEMALE, + M3_WAITFORU | M3_INFRAVISIBLE, 25, CLR_BRIGHT_GREEN, MEDUSA), + MON("Wizard of Yendor", S_HUMAN, LVL(30, 12, -8, 100, A_NONE), + (G_NOGEN | G_UNIQ), + A(ATTK(AT_CLAW, AD_SAMU, 2, 12), ATTK(AT_MAGC, AD_SPEL, 0, 0), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN), MR_FIRE | MR_POISON, + MR_FIRE | MR_POISON, + M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS + | M1_TPORT | M1_TPORT_CNTRL | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_PRINCE + | M2_MALE | M2_MAGIC, + M3_COVETOUS | M3_WAITFORU | M3_INFRAVISIBLE, 34, HI_LORD, + WIZARD_OF_YENDOR), + MON("Croesus", S_HUMAN, LVL(20, 15, 0, 40, 15), (G_UNIQ | G_NOGEN), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARD, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY + | M2_PNAME | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS + | M2_COLLECT | M2_MAGIC, + M3_INFRAVISIBLE, 22, HI_LORD, CROESUS), +#ifdef CHARON + MON("Charon", S_HUMAN, LVL(76, 18, -5, 120, 0), + (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TUCH, AD_PLYS, 1, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_FERRY, MZ_HUMAN), + MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0, + M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_PNAME | M2_MALE | M2_GREEDY + | M2_COLLECT, + M3_INFRAVISIBLE, 38, CLR_WHITE, CHARON), +#endif + /* + * ghosts + */ + MON("ghost", S_GHOST, LVL(10, 3, -5, 50, -5), (G_NOCORPSE | G_NOGEN), + A(ATTK(AT_TUCH, AD_PHYS, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 0, MS_SILENT, MZ_HUMAN), + MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID, + M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, + 12, CLR_GRAY, GHOST), + MON("shade", S_GHOST, LVL(12, 10, 10, 0, 0), (G_NOCORPSE | G_NOGEN), + A(ATTK(AT_TUCH, AD_PLYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 0, MS_WAIL, MZ_HUMAN), + MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID + | M1_SEE_INVIS, + M2_NOPOLY | M2_UNDEAD | M2_WANDER | M2_STALK | M2_HOSTILE | M2_NASTY, + M3_INFRAVISION, 14, CLR_BLACK, SHADE), + /* + * (major) demons + */ + MON("water demon", S_DEMON, LVL(8, 12, -4, 30, -7), + (G_NOCORPSE | G_NOGEN), + A(ATTK(AT_WEAP, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), + ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), MR_FIRE | MR_POISON, 0, + M1_HUMANOID | M1_POIS | M1_SWIM, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BLUE, WATER_DEMON), + /* standard demons & devils + */ +#define SEDUCTION_ATTACKS_YES \ + A(ATTK(AT_BITE, AD_SSEX, 0, 0), ATTK(AT_CLAW, AD_PHYS, 1, 3), \ + ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK) +#define SEDUCTION_ATTACKS_NO \ + A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), \ + ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK) + /* incubus and succubus */ + MON3("incubus", "succubus", "amorous demon", + S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1), + SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN), + MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS, + M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY, AMOROUS_DEMON), + MON("horned devil", S_DEMON, LVL(6, 9, -5, 50, 11), + (G_HELL | G_NOCORPSE | 2), + A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + ATTK(AT_BITE, AD_PHYS, 2, 3), ATTK(AT_STNG, AD_PHYS, 1, 3), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0, + M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_BROWN, HORNED_DEVIL), + /* Used by AD&D for a type of demon, originally one of the Furies + and spelled this way */ + MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10), + (G_HELL | G_NOCORPSE | G_SGROUP | 2), + A(ATTK(AT_WEAP, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0, + M1_HUMANOID | M1_POIS, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY + | M2_FEMALE | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED, ERINYS), + MON("barbed devil", S_DEMON, LVL(8, 12, 0, 35, 8), + (G_HELL | G_NOCORPSE | G_SGROUP | 2), + A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), + ATTK(AT_STNG, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0, + M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED, BARBED_DEVIL), + MON("marilith", S_DEMON, LVL(7, 12, -6, 80, -12), + (G_HELL | G_NOCORPSE | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), + ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), + ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4)), + SIZ(WT_HUMAN, 400, MS_CUSS, MZ_LARGE), MR_FIRE | MR_POISON, 0, + M1_HUMANOID | M1_SLITHY | M1_SEE_INVIS | M1_POIS, + M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED, MARILITH), + MON("vrock", S_DEMON, LVL(8, 12, 0, 50, -9), + (G_HELL | G_NOCORPSE | G_SGROUP | 2), + A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_CLAW, AD_PHYS, 1, 8), + ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, + M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED, VROCK), + MON("hezrou", S_DEMON, LVL(9, 6, -2, 55, -10), + (G_HELL | G_NOCORPSE | G_SGROUP | 2), + A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), + ATTK(AT_BITE, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, + M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_RED, HEZROU), + MON("bone devil", S_DEMON, LVL(9, 15, -1, 40, -9), + (G_HELL | G_NOCORPSE | G_SGROUP | 2), + A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, + M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_GRAY, BONE_DEVIL), + MON("ice devil", S_DEMON, LVL(11, 6, -4, 55, -12), + (G_HELL | G_NOCORPSE | 2), + A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_COLD, 3, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), + MR_FIRE | MR_COLD | MR_POISON, 0, M1_SEE_INVIS | M1_POIS, + M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION, 14, CLR_WHITE, ICE_DEVIL), + MON("nalfeshnee", S_DEMON, LVL(11, 9, -1, 65, -11), + (G_HELL | G_NOCORPSE | 1), + A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), + ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SPELL, MZ_LARGE), MR_FIRE | MR_POISON, 0, + M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_RED, NALFESHNEE), + MON("pit fiend", S_DEMON, LVL(13, 6, -3, 65, -13), + (G_HELL | G_NOCORPSE | 2), + A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_WEAP, AD_PHYS, 4, 2), + ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GROWL, MZ_LARGE), MR_FIRE | MR_POISON, 0, + M1_SEE_INVIS | M1_POIS, + M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 16, CLR_RED, PIT_FIEND), + MON("sandestin", S_DEMON, LVL(13, 12, 4, 60, -5), + (G_HELL | G_NOCORPSE | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 400, MS_CUSS, MZ_HUMAN), MR_STONE, 0, M1_HUMANOID, + M2_NOPOLY | M2_STALK | M2_STRONG | M2_COLLECT | M2_SHAPESHIFTER, + M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_GRAY, SANDESTIN), + MON("balrog", S_DEMON, LVL(16, 5, -2, 75, -14), (G_HELL | G_NOCORPSE | 1), + A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, + M1_FLY | M1_SEE_INVIS | M1_POIS, + M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, + M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_RED, BALROG), + /* Named demon lords & princes plus Arch-Devils. + * (their order matters; see minion.c) + */ + MON("Juiblex", S_DEMON, LVL(50, 3, -7, 65, -15), + (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_ENGL, AD_DISE, 4, 10), ATTK(AT_SPIT, AD_ACID, 3, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 0, MS_GURGLE, MZ_LARGE), + MR_FIRE | MR_POISON | MR_ACID | MR_STONE, 0, + M1_AMPHIBIOUS | M1_AMORPHOUS | M1_NOHEAD | M1_FLY | M1_SEE_INVIS + | M1_ACID | M1_POIS, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY + | M2_LORD | M2_MALE, + M3_WAITFORU | M3_WANTSAMUL | M3_INFRAVISION, 26, CLR_BRIGHT_GREEN, + JUIBLEX), + MON("Yeenoghu", S_DEMON, LVL(56, 18, -5, 80, -15), + (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_CONF, 2, 8), + ATTK(AT_CLAW, AD_PLYS, 1, 6), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK, + NO_ATTK), + SIZ(900, 500, MS_ORC, MZ_LARGE), MR_FIRE | MR_POISON, 0, + M1_FLY | M1_SEE_INVIS | M1_POIS, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY + | M2_LORD | M2_MALE | M2_COLLECT, + M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 31, HI_LORD, + YEENOGHU), + MON("Orcus", S_DEMON, LVL(66, 9, -6, 85, -20), + (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 4), + ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_MAGC, AD_SPEL, 8, 6), + ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK), + SIZ(1500, 500, MS_ORC, MZ_HUGE), MR_FIRE | MR_POISON, 0, + M1_FLY | M1_SEE_INVIS | M1_POIS, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY + | M2_PRINCE | M2_MALE | M2_COLLECT, + M3_WAITFORU | M3_WANTSBOOK | M3_WANTSAMUL | M3_INFRAVISIBLE + | M3_INFRAVISION, + 36, HI_LORD, ORCUS), + MON("Geryon", S_DEMON, LVL(72, 3, -3, 75, 15), + (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), + ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 500, MS_BRIBE, MZ_HUGE), MR_FIRE | MR_POISON, 0, + M1_FLY | M1_SEE_INVIS | M1_POIS | M1_SLITHY, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY + | M2_PRINCE | M2_MALE, + M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 36, HI_LORD, + GERYON), + MON("Dispater", S_DEMON, LVL(78, 15, -2, 80, 15), + (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_MAGC, AD_SPEL, 6, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 500, MS_BRIBE, MZ_HUMAN), MR_FIRE | MR_POISON, 0, + M1_FLY | M1_SEE_INVIS | M1_POIS | M1_HUMANOID, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY + | M2_PRINCE | M2_MALE | M2_COLLECT, + M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 40, HI_LORD, + DISPATER), + MON("Baalzebub", S_DEMON, LVL(89, 9, -5, 85, 20), + (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_BITE, AD_DRST, 2, 6), ATTK(AT_GAZE, AD_STUN, 2, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 500, MS_BRIBE, MZ_LARGE), MR_FIRE | MR_POISON, 0, + M1_FLY | M1_SEE_INVIS | M1_POIS, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY + | M2_PRINCE | M2_MALE, + M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION, + 45, HI_LORD, BAALZEBUB), + MON("Asmodeus", S_DEMON, LVL(105, 12, -7, 90, 20), + (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_MAGC, AD_COLD, 6, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 500, MS_BRIBE, MZ_HUGE), MR_FIRE | MR_COLD | MR_POISON, 0, + M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_POIS, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG + | M2_NASTY | M2_PRINCE | M2_MALE, + M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION, + 53, HI_LORD, ASMODEUS), + MON("Demogorgon", S_DEMON, LVL(106, 15, -8, 95, -20), + (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_MAGC, AD_SPEL, 8, 6), ATTK(AT_STNG, AD_DRLI, 1, 4), + ATTK(AT_CLAW, AD_DISE, 1, 6), ATTK(AT_CLAW, AD_DISE, 1, 6), NO_ATTK, + NO_ATTK), + SIZ(1500, 500, MS_GROWL, MZ_HUGE), MR_FIRE | MR_POISON, 0, + M1_FLY | M1_SEE_INVIS | M1_NOHANDS | M1_POIS, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY + | M2_PRINCE | M2_MALE, + M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 57, HI_LORD, + DEMOGORGON), + /* Riders -- the Four Horsemen of the Apocalypse ("War" == player); + * depicted with '&' but do not have M2_DEMON set. + */ + MON("Death", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN), + A(ATTK(AT_TUCH, AD_DETH, 8, 8), ATTK(AT_TUCH, AD_DETH, 8, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN), + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, + M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD, + DEATH), + MON("Pestilence", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN), + A(ATTK(AT_TUCH, AD_PEST, 8, 8), ATTK(AT_TUCH, AD_PEST, 8, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN), + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, + M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD, + PESTILENCE), + MON("Famine", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN), + A(ATTK(AT_TUCH, AD_FAMN, 8, 8), ATTK(AT_TUCH, AD_FAMN, 8, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN), + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, + M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, + M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD, + FAMINE), + /* other demons + */ +#ifdef MAIL_STRUCTURES + MON("mail daemon", S_DEMON, LVL(56, 24, 10, 127, 0), + (G_NOGEN | G_NOCORPSE), + A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(600, 300, MS_SILENT, MZ_HUMAN), + MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, + M1_FLY | M1_SWIM | M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID + | M1_POIS, + M2_NOPOLY | M2_STALK | M2_PEACEFUL, M3_INFRAVISIBLE | M3_INFRAVISION, + 26, CLR_BRIGHT_BLUE, MAIL_DAEMON), +#endif + MON("djinni", S_DEMON, LVL(7, 12, 4, 30, 0), (G_NOGEN | G_NOCORPSE), + A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(1500, 400, MS_DJINNI, MZ_HUMAN), MR_POISON | MR_STONE, 0, + M1_HUMANOID | M1_FLY | M1_POIS, M2_NOPOLY | M2_STALK | M2_COLLECT, + M3_INFRAVISIBLE, 8, CLR_YELLOW, DJINNI), + /* + * sea monsters + */ + MON("jellyfish", S_EEL, LVL(3, 3, 6, 0, 0), (G_GENO | G_NOGEN), + A(ATTK(AT_STNG, AD_DRST, 3, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(80, 20, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, + M1_SWIM | M1_AMPHIBIOUS | M1_SLITHY | M1_NOLIMBS | M1_NOHEAD + | M1_NOTAKE | M1_POIS, + M2_HOSTILE, 0, 5, CLR_BLUE, JELLYFISH), + MON("piranha", S_EEL, LVL(5, 18, 4, 0, 0), (G_GENO | G_NOGEN | G_SGROUP), + A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(60, 30, MS_SILENT, MZ_SMALL), 0, 0, + M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS + | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, + M2_HOSTILE, 0, 6, CLR_RED, PIRANHA), + MON("shark", S_EEL, LVL(7, 12, 2, 0, 0), (G_GENO | G_NOGEN), + A(ATTK(AT_BITE, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(500, 350, MS_SILENT, MZ_LARGE), 0, 0, + M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS + | M1_CARNIVORE | M1_OVIPAROUS | M1_THICK_HIDE | M1_NOTAKE, + M2_HOSTILE, 0, 9, CLR_GRAY, SHARK), + MON("giant eel", S_EEL, LVL(5, 9, -1, 0, 0), (G_GENO | G_NOGEN), + A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(200, 250, MS_SILENT, MZ_HUGE), 0, 0, + M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS + | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, + M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_CYAN, GIANT_EEL), + MON("electric eel", S_EEL, LVL(7, 10, -3, 0, 0), (G_GENO | G_NOGEN), + A(ATTK(AT_BITE, AD_ELEC, 4, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(200, 250, MS_SILENT, MZ_HUGE), MR_ELEC, MR_ELEC, + M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS + | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, + M2_HOSTILE, M3_INFRAVISIBLE, 10, CLR_BRIGHT_BLUE, ELECTRIC_EEL), + MON("kraken", S_EEL, LVL(20, 3, 6, 0, -3), (G_GENO | G_NOGEN), + A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), + ATTK(AT_HUGS, AD_WRAP, 2, 6), ATTK(AT_BITE, AD_PHYS, 5, 4), NO_ATTK, + NO_ATTK), + SIZ(1800, 1000, MS_SILENT, MZ_HUGE), 0, 0, + M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, + M2_NOPOLY | M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_RED, + KRAKEN), + /* + * lizards, &c + */ + MON("newt", S_LIZARD, LVL(0, 6, 8, 0, 0), (G_GENO | 5), + A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(10, 20, MS_SILENT, MZ_TINY), 0, 0, + M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE, 0, 1, CLR_YELLOW, NEWT), + MON("gecko", S_LIZARD, LVL(1, 6, 8, 0, 0), (G_GENO | 5), + A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(10, 20, MS_SQEEK, MZ_TINY), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 2, CLR_GREEN, + GECKO), + MON("iguana", S_LIZARD, LVL(2, 6, 7, 0, 0), (G_GENO | 5), + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(30, 30, MS_SILENT, MZ_TINY), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 3, CLR_BROWN, + IGUANA), + MON("baby crocodile", S_LIZARD, LVL(3, 6, 7, 0, 0), G_GENO, + A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(200, 200, MS_SILENT, MZ_MEDIUM), 0, 0, + M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, + M2_HOSTILE, 0, 4, CLR_BROWN, BABY_CROCODILE), + MON("lizard", S_LIZARD, LVL(5, 6, 6, 10, 0), (G_GENO | 5), + A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(10, 40, MS_SILENT, MZ_TINY), MR_STONE, MR_STONE, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 6, CLR_GREEN, + LIZARD), + MON("chameleon", S_LIZARD, LVL(6, 5, 6, 10, 0), (G_GENO | 2), + A(ATTK(AT_BITE, AD_PHYS, 4, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(100, 100, MS_SILENT, MZ_TINY), 0, 0, + M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, + M2_NOPOLY | M2_HOSTILE | M2_SHAPESHIFTER, 0, 7, CLR_BROWN, + CHAMELEON), + MON("crocodile", S_LIZARD, LVL(6, 9, 5, 0, 0), (G_GENO | 1), + A(ATTK(AT_BITE, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 1, 12), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), 0, 0, + M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS + | M1_OVIPAROUS | M1_CARNIVORE, + M2_STRONG | M2_HOSTILE, 0, 7, CLR_BROWN, CROCODILE), + MON("salamander", S_LIZARD, LVL(8, 12, -1, 0, -9), (G_HELL | 1), + A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_TUCH, AD_FIRE, 1, 6), + ATTK(AT_HUGS, AD_PHYS, 2, 6), ATTK(AT_HUGS, AD_FIRE, 3, 6), NO_ATTK, + NO_ATTK), + SIZ(1500, 400, MS_MUMBLE, MZ_HUMAN), MR_SLEEP | MR_FIRE, MR_FIRE, + M1_HUMANOID | M1_SLITHY | M1_THICK_HIDE | M1_POIS, + M2_STALK | M2_HOSTILE | M2_COLLECT | M2_MAGIC, M3_INFRAVISIBLE, + 12, CLR_ORANGE, SALAMANDER), + + /* + * dummy monster needed for visual interface + * (marking it unique prevents figurines) + */ + MON("long worm tail", S_WORM_TAIL, LVL(0, 0, 0, 0, 0), + (G_NOGEN | G_NOCORPSE | G_UNIQ), + A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(0, 0, 0, 0), 0, 0, 0L, M2_NOPOLY, 0, 1, CLR_BROWN, + LONG_WORM_TAIL), + /* Note: + * Worm tail must be between the normal monsters and the special + * quest & pseudo-character ones because an optimization in the + * random monster selection code assumes everything beyond here + * has the G_NOGEN and M2_NOPOLY attributes. + */ + + /* + * character classes + */ + MON("archeologist", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_TUNNEL | M1_NEEDPICK | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, + 12, HI_DOMESTIC, ARCHEOLOGIST), + MON("barbarian", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, + 12, HI_DOMESTIC, BARBARIAN), + MON3("caveman", "cavewoman", "cave dweller", + S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 12, HI_DOMESTIC, CAVE_DWELLER), + MON("healer", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, + 12, HI_DOMESTIC, HEALER), + MON("knight", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, + 12, HI_DOMESTIC, KNIGHT), + MON("monk", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, + A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_HERBIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 11, HI_DOMESTIC, MONK), + MON3("priest", "priestess", "cleric", + S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 12, HI_DOMESTIC, CLERIC), + MON("ranger", S_HUMAN, LVL(10, 12, 10, 2, -3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, + 12, HI_DOMESTIC, RANGER), + MON("rogue", S_HUMAN, LVL(10, 12, 10, 1, -3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M3_INFRAVISIBLE, 12, HI_DOMESTIC, ROGUE), + MON("samurai", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, + 12, HI_DOMESTIC, SAMURAI), + MON("tourist", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, + 12, HI_DOMESTIC, TOURIST), + /* valk is lawful by default; player valk can be neutral, in which case + role_init() will change this monster and 'warrior' to be neutral too; + if a neutral valk leaves a bones file containing neutral warriors, + the latter will magically turn lawful if encountered by a lawful valk + or any non-valk (for bones on the dungeon side of the portal) */ + MON("valkyrie", S_HUMAN, LVL(10, 12, 10, 1, 1), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_COLD, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT, + M3_INFRAVISIBLE, 12, HI_DOMESTIC, VALKYRIE), + MON("wizard", S_HUMAN, LVL(10, 12, 10, 3, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MAGIC, + M3_INFRAVISIBLE, 12, HI_DOMESTIC, WIZARD), + /* + * quest leaders + */ + MON("Lord Carnarvon", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 4, 8), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, + M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD, LORD_CARNARVON), + MON("Pelias", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD, PELIAS), + MON("Shaman Karnov", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_CLRC, 2, 8), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD, SHAMAN_KARNOV), +#if 0 /* OBSOLETE */ + /* Two for elves - one of each sex. + */ + MON("Earendil", S_HUMAN, + LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP, + M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, + M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG + | M2_MALE | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD, + EARENDIL), + MON("Elwing", S_HUMAN, + LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP, + M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, + M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG + | M2_FEMALE | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD, + ELWING), +#endif + MON("Hippocrates", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 3, 8), + ATTK(AT_MAGC, AD_CLRC, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD, HIPPOCRATES), + MON("King Arthur", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD, KING_ARTHUR), + MON("Grand Master", S_HUMAN, LVL(25, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), + A(ATTK(AT_CLAW, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), + ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), + MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0, + M1_HUMANOID | M1_SEE_INVIS | M1_HERBIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_NASTY + | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_BLACK, GRAND_MASTER), + MON("Arch Priest", S_HUMAN, LVL(25, 15, 7, 90, 0), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), + ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), + MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0, + M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT + | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_WHITE, ARCH_PRIEST), + MON("Orion", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 4, 8), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2200, 700, MS_LEADER, MZ_HUGE), 0, 0, + M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS | M1_SWIM | M1_AMPHIBIOUS, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD, ORION), + /* Note: Master of Thieves is also the Tourist's nemesis. + */ + MON("Master of Thieves", S_HUMAN, LVL(20, 15, 0, 90, -20), + (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 2, 6), + ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_STONE, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_GREEDY + | M2_JEWELS | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 24, HI_LORD, MASTER_OF_THIEVES), + MON("Lord Sato", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD, LORD_SATO), + MON("Twoflower", S_HUMAN, LVL(20, 15, 10, 90, 0), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 22, HI_DOMESTIC, TWOFLOWER), + /* for a valkyrie hero, Norn's alignment will be changed to match hero's + starting alignment */ + MON("Norn", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1800, 550, MS_LEADER, MZ_HUGE), MR_COLD, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_FEMALE + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD, NORN), + MON("Neferet the Green", S_HUMAN, LVL(20, 15, 0, 90, 0), + (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 2, 8), + ATTK(AT_MAGC, AD_SPEL, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_FEMALE | M2_PNAME | M2_PEACEFUL | M2_STRONG + | M2_COLLECT | M2_MAGIC, + M3_CLOSE | M3_INFRAVISIBLE, 23, CLR_GREEN, NEFERET_THE_GREEN), + /* + * quest nemeses + */ + MON("Minion of Huhetotl", S_DEMON, LVL(16, 12, -2, 75, -14), + (G_NOCORPSE | G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), + ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_LARGE), + MR_FIRE | MR_POISON | MR_STONE, 0, M1_FLY | M1_SEE_INVIS | M1_POIS, + M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY + | M2_COLLECT, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, + 23, CLR_RED, MINION_OF_HUHETOTL), + MON("Thoth Amon", S_HUMAN, LVL(16, 12, 0, 10, -14), + (G_NOGEN | G_UNIQ | G_NOCORPSE), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), + ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_STRONG | M2_MALE | M2_STALK + | M2_HOSTILE | M2_NASTY | M2_COLLECT | M2_MAGIC, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, HI_LORD, + THOTH_AMON), + /* Multi-headed, possessing the breath attacks of all the other dragons + * (selected at random when attacking). Despite being a superset of + * gold dragon, does not emit light. + */ + MON("Chromatic Dragon", S_DRAGON, LVL(16, 12, 0, 30, -14), + (G_NOGEN | G_UNIQ), + A(ATTK(AT_BREA, AD_RBRE, 6, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), + ATTK(AT_CLAW, AD_SAMU, 2, 8), ATTK(AT_BITE, AD_PHYS, 4, 8), + ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_STNG, AD_PHYS, 1, 6)), + SIZ(WT_DRAGON, 1700, MS_NEMESIS, MZ_GIGANTIC), + MR_FIRE | MR_COLD | MR_SLEEP | MR_DISINT | MR_ELEC | MR_POISON + | MR_ACID | MR_STONE, + MR_FIRE | MR_COLD | MR_SLEEP | MR_DISINT | MR_ELEC | MR_POISON + | MR_STONE, + M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS | M1_POIS, + M2_NOPOLY | M2_HOSTILE | M2_FEMALE | M2_STALK | M2_STRONG | M2_NASTY + | M2_GREEDY | M2_JEWELS | M2_MAGIC, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 23, HI_LORD, + CHROMATIC_DRAGON), +#if 0 /* OBSOLETE */ + MON("Goblin King", S_ORC, + LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), + ATTK(AT_CLAW, AD_SAMU, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_ORC | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY + | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, + 18, HI_LORD, GOBLIN_KING), +#endif + MON("Cyclops", S_GIANT, LVL(18, 12, 0, 0, -15), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_WEAP, AD_PHYS, 4, 8), + ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1900, 700, MS_NEMESIS, MZ_HUGE), MR_STONE, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_STALK + | M2_HOSTILE | M2_NASTY | M2_MALE | M2_JEWELS | M2_COLLECT, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, + 23, CLR_GRAY, CYCLOPS), + MON("Ixoth", S_DRAGON, LVL(15, 12, -1, 20, -14), (G_NOGEN | G_UNIQ), + A(ATTK(AT_BREA, AD_FIRE, 8, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), + ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_PHYS, 2, 4), + ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK), + SIZ(WT_DRAGON, 1600, MS_NEMESIS, MZ_GIGANTIC), MR_FIRE | MR_STONE, + MR_FIRE, + M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS, + M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_NASTY + | M2_STALK | M2_GREEDY | M2_JEWELS | M2_MAGIC, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, CLR_RED, + IXOTH), + MON("Master Kaen", S_HUMAN, LVL(25, 12, -10, 10, -20), (G_NOGEN | G_UNIQ), + A(ATTK(AT_CLAW, AD_PHYS, 16, 2), ATTK(AT_CLAW, AD_PHYS, 16, 2), + ATTK(AT_MAGC, AD_CLRC, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, + MR_POISON, M1_HUMANOID | M1_HERBIVORE | M1_SEE_INVIS, + M2_NOPOLY | M2_HUMAN | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG + | M2_NASTY | M2_STALK | M2_COLLECT | M2_MAGIC, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 31, HI_LORD, + MASTER_KAEN), + MON("Nalzok", S_DEMON, LVL(16, 12, -2, 85, -127), + (G_NOGEN | G_UNIQ | G_NOCORPSE), + A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), + ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_LARGE), + MR_FIRE | MR_POISON | MR_STONE, 0, M1_FLY | M1_SEE_INVIS | M1_POIS, + M2_NOPOLY | M2_DEMON | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG + | M2_STALK | M2_NASTY | M2_COLLECT, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, + 23, CLR_RED, NALZOK), + MON("Scorpius", S_SPIDER, LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ), + A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 6), + ATTK(AT_STNG, AD_DISE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, MR_POISON, + M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, + M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK + | M2_NASTY | M2_COLLECT | M2_MAGIC, + M3_WANTSARTI | M3_WAITFORU, 17, HI_LORD, SCORPIUS), + MON("Master Assassin", S_HUMAN, LVL(15, 12, 0, 30, 18), + (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_DRST, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 8), + ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_HOSTILE | M2_STALK + | M2_NASTY | M2_COLLECT | M2_MAGIC, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, HI_LORD, + MASTER_ASSASSIN), + /* A renegade daimyo who led a 13 year civil war against the shogun + * of his time. + */ + MON("Ashikaga Takauji", S_HUMAN, LVL(15, 12, 0, 40, -13), + (G_NOGEN | G_UNIQ | G_NOCORPSE), + A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), + ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK + | M2_NASTY | M2_MALE | M2_COLLECT | M2_MAGIC, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 19, HI_LORD, + ASHIKAGA_TAKAUJI), + /* + * Note: the Master of Thieves was defined above. + */ + MON("Lord Surtur", S_GIANT, LVL(15, 12, 2, 50, 12), (G_NOGEN | G_UNIQ), + A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_WEAP, AD_PHYS, 2, 10), + ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(2250, 850, MS_NEMESIS, MZ_HUGE), MR_FIRE | MR_STONE, MR_FIRE, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_GIANT | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STALK + | M2_STRONG | M2_NASTY | M2_ROCKTHROW | M2_JEWELS | M2_COLLECT, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, + 19, HI_LORD, LORD_SURTUR), + MON("Dark One", S_HUMAN, LVL(15, 12, 0, 80, -10), + (G_NOGEN | G_UNIQ | G_NOCORPSE), + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), + ATTK(AT_CLAW, AD_SAMU, 1, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_HOSTILE | M2_STALK | M2_NASTY + | M2_COLLECT | M2_MAGIC, + M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, CLR_BLACK, + DARK_ONE), + /* + * quest "guardians" + */ + MON("student", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, STUDENT), + MON("chieftain", S_HUMAN, LVL(5, 12, 10, 10, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, CHIEFTAIN), + MON("neanderthal", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, NEANDERTHAL), +#if 0 /* OBSOLETE */ + MON("High-elf", S_HUMAN, + LVL(5, 12, 10, 10, -7), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_CLRC, 0, 0), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_ELF, 350, MS_GUARDIAN, MZ_HUMAN), MR_SLEEP, MR_SLEEP, + M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, + M2_NOPOLY | M2_ELF | M2_PEACEFUL | M2_COLLECT, + M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC, HIGH_ELF), +#endif + /* attendants used to lawful but have been changed to netural because + grow_up() promotes them to healer and the latter is always neutral */ + MON("attendant", S_HUMAN, LVL(5, 12, 10, 10, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, ATTENDANT), + MON("page", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, PAGE), + MON("abbot", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, + A(ATTK(AT_CLAW, AD_PHYS, 8, 2), ATTK(AT_KICK, AD_STUN, 3, 2), + ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_HERBIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 8, HI_DOMESTIC, ABBOT), + MON("acolyte", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 8, HI_DOMESTIC, ACOLYTE), + MON("hunter", S_HUMAN, LVL(5, 12, 10, 10, -7), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, + NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC, HUNTER), + MON("thug", S_HUMAN, LVL(5, 12, 10, 10, -3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL + | M2_STRONG | M2_GREEDY | M2_COLLECT, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, THUG), + MON("ninja", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, NINJA), + MON("roshi", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, + M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, ROSHI), + MON("guide", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL + | M2_STRONG | M2_COLLECT | M2_MAGIC, + M3_INFRAVISIBLE, 8, HI_DOMESTIC, GUIDE), + /* warriors used to be chaotic but have been changed to lawful because + grow_up() promotes them to valkyrie; for a valkyrie hero, they might + be changed to neutral at game start; see the valkyrie comment above */ + MON("warrior", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL + | M2_STRONG | M2_COLLECT | M2_FEMALE, + M3_INFRAVISIBLE, 7, HI_DOMESTIC, WARRIOR), + MON("apprentice", S_HUMAN, LVL(5, 12, 10, 30, 0), G_NOGEN, + A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, + NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, + M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL + | M2_STRONG | M2_COLLECT | M2_MAGIC, + M3_INFRAVISIBLE, 8, HI_DOMESTIC, APPRENTICE), + +#if defined(MONS_ENUM) || defined(DUMP_ENUMS) +#undef MON +#undef MON3 +#endif + +/*monsters.h*/ diff --git a/include/objclass.h b/include/objclass.h index c9bdab9cd..6ecb6eff3 100644 --- a/include/objclass.h +++ b/include/objclass.h @@ -134,9 +134,6 @@ struct objdescr { const char *oc_descr; /* description when name unknown */ }; -extern NEARDATA struct objclass objects[]; -extern NEARDATA struct objdescr obj_descr[]; - /* * All objects have a class. Make sure that all classes have a corresponding * symbol below. @@ -183,6 +180,23 @@ struct fruit { #define newfruit() (struct fruit *) alloc(sizeof(struct fruit)) #define dealloc_fruit(rind) free((genericptr_t)(rind)) +enum objects_nums { +#define OBJECTS_ENUM +#include "objects.h" +#undef OBJECTS_ENUM + NUM_OBJECTS +}; + +enum misc_object_nums { + LAST_GEM = (JADE), + NUM_GLASS_GEMS = ((LUCKSTONE - JADE) - 1), + MAXSPELL = ((SPE_BOOK_OF_THE_DEAD - SCR_BLANK_PAPER) + 1) +}; + +extern NEARDATA struct objclass objects[NUM_OBJECTS + 1]; +extern NEARDATA struct objdescr obj_descr[NUM_OBJECTS + 1]; + #define OBJ_NAME(obj) (obj_descr[(obj).oc_name_idx].oc_name) #define OBJ_DESCR(obj) (obj_descr[(obj).oc_descr_idx].oc_descr) + #endif /* OBJCLASS_H */ diff --git a/include/objects.h b/include/objects.h new file mode 100644 index 000000000..ba95a626a --- /dev/null +++ b/include/objects.h @@ -0,0 +1,1532 @@ +/* NetHack 3.7 objects.h $NHDT-Date: 1596498192 2020/08/03 23:43:12 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.66 $ */ +/* Copyright (c) Mike Threepoint, 1989. */ +/* NetHack may be freely redistributed. See license for details. */ + +/* + The data in this file is processed multiple times by its inclusion + in several places in the code. The results depend on the definition + of the following: + OBJECTS_ENUM to construct object onames enum entries (decl.h). + OBJECTS_DESCR_INIT to construct obj_descr[] array entries (objects.c). + OBJECTS_INIT to construct objects[] array entries (objects.c). +*/ + +#ifndef NoDes +#define NoDes (char *) 0 /* less visual distraction for 'no description' */ +#endif + +#ifndef lint +#define HARDGEM(n) (n >= 8) +#else +#define HARDGEM(n) (0) +#endif + +#if defined(OBJECTS_DESCR_INIT) +#define OBJ(name,desc) name, desc +#define OBJECT(obj,bits,prp,sym,prob,dly,wt, \ + cost,sdam,ldam,oc1,oc2,nut,color,sn) { obj } + +#elif defined(OBJECTS_INIT) +#define COLOR_FIELD(X) X, +#define BITS(nmkn,mrg,uskn,ctnr,mgc,chrg,uniq,nwsh,big,tuf,dir,sub,mtrl) \ + nmkn,mrg,uskn,0,mgc,chrg,uniq,nwsh,big,tuf,dir,mtrl,sub /*SCO cpp fodder*/ +#define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color,sn) \ + { 0, 0, (char *) 0, bits, prp, sym, dly, COLOR_FIELD(color) prob, wt, \ + cost, sdam, ldam, oc1, oc2, nut } + +#elif defined(OBJECTS_ENUM) +#define OBJ(name,desc) +#define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color,sn) \ + sn + +#elif defined(DUMP_ENUMS) +#define OBJ(name,desc) +#define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color,sn) \ + {sn, #sn} + +#else +#error Unproductive inclusion of objects.h +#endif /* OBJECTS_DESCR_INIT || OBJECTS_INIT || OBJECTS_ENUM */ + +/* dummy object[0] -- description [2nd arg] *must* be NULL */ +OBJECT(OBJ("strange object", NoDes), + BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, 0), + 0, ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, STRANGE_OBJECT), + +/* weapons ... */ +#define WEAPON(name,desc,kn,mg,bi,prob,wt, \ + cost,sdam,ldam,hitbon,typ,sub,metal,color,sn) \ + OBJECT(OBJ(name,desc), \ + BITS(kn, mg, 1, 0, 0, 1, 0, 0, bi, 0, typ, sub, metal), \ + 0, WEAPON_CLASS, prob, 0, wt, \ + cost, sdam, ldam, hitbon, 0, wt, color,sn) +#define PROJECTILE(name,desc,kn,prob,wt, \ + cost,sdam,ldam,hitbon,metal,sub,color,sn) \ + OBJECT(OBJ(name,desc), \ + BITS(kn, 1, 1, 0, 0, 1, 0, 0, 0, 0, PIERCE, sub, metal), \ + 0, WEAPON_CLASS, prob, 0, wt, \ + cost, sdam, ldam, hitbon, 0, wt, color, sn) +#define BOW(name,desc,kn,prob,wt,cost,hitbon,metal,sub,color,sn) \ + OBJECT(OBJ(name,desc), \ + BITS(kn, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, sub, metal), \ + 0, WEAPON_CLASS, prob, 0, wt, \ + cost, 2, 2, hitbon, 0, wt, color, sn) + +/* Note: for weapons that don't do an even die of damage (ex. 2-7 or 3-18) + the extra damage is added on in weapon.c, not here! */ + +#define P PIERCE +#define S SLASH +#define B WHACK + +/* missiles; materiel reflects the arrowhead, not the shaft */ +PROJECTILE("arrow", NoDes, + 1, 55, 1, 2, 6, 6, 0, IRON, -P_BOW, HI_METAL, + ARROW), +PROJECTILE("elven arrow", "runed arrow", + 0, 20, 1, 2, 7, 6, 0, WOOD, -P_BOW, HI_WOOD, + ELVEN_ARROW), +PROJECTILE("orcish arrow", "crude arrow", + 0, 20, 1, 2, 5, 6, 0, IRON, -P_BOW, CLR_BLACK, + ORCISH_ARROW), +PROJECTILE("silver arrow", NoDes, + 1, 12, 1, 5, 6, 6, 0, SILVER, -P_BOW, HI_SILVER, + SILVER_ARROW), +PROJECTILE("ya", "bamboo arrow", + 0, 15, 1, 4, 7, 7, 1, METAL, -P_BOW, HI_METAL, YA), +PROJECTILE("crossbow bolt", NoDes, + 1, 55, 1, 2, 4, 6, 0, IRON, -P_CROSSBOW, HI_METAL, + CROSSBOW_BOLT), + +/* missiles that don't use a launcher */ +WEAPON("dart", NoDes, + 1, 1, 0, 60, 1, 2, 3, 2, 0, P, -P_DART, IRON, HI_METAL, + DART), +WEAPON("shuriken", "throwing star", + 0, 1, 0, 35, 1, 5, 8, 6, 2, P, -P_SHURIKEN, IRON, HI_METAL, + SHURIKEN), +WEAPON("boomerang", NoDes, + 1, 1, 0, 15, 5, 20, 9, 9, 0, 0, -P_BOOMERANG, WOOD, HI_WOOD, + BOOMERANG), + +/* spears [note: javelin used to have a separate skill from spears, + because the latter are primarily stabbing weapons rather than + throwing ones; but for playability, they've been merged together + under spear skill and spears can now be thrown like javelins] */ +WEAPON("spear", NoDes, + 1, 1, 0, 50, 30, 3, 6, 8, 0, P, P_SPEAR, IRON, HI_METAL, + SPEAR), +WEAPON("elven spear", "runed spear", + 0, 1, 0, 10, 30, 3, 7, 8, 0, P, P_SPEAR, WOOD, HI_WOOD, + ELVEN_SPEAR), +WEAPON("orcish spear", "crude spear", + 0, 1, 0, 13, 30, 3, 5, 8, 0, P, P_SPEAR, IRON, CLR_BLACK, + ORCISH_SPEAR), +WEAPON("dwarvish spear", "stout spear", + 0, 1, 0, 12, 35, 3, 8, 8, 0, P, P_SPEAR, IRON, HI_METAL, + DWARVISH_SPEAR), +WEAPON("silver spear", NoDes, + 1, 1, 0, 2, 36, 40, 6, 8, 0, P, P_SPEAR, SILVER, HI_SILVER, + SILVER_SPEAR), +WEAPON("javelin", "throwing spear", + 0, 1, 0, 10, 20, 3, 6, 6, 0, P, P_SPEAR, IRON, HI_METAL, + JAVELIN), + +/* spearish; doesn't stack, not intended to be thrown */ +WEAPON("trident", NoDes, + 1, 0, 0, 8, 25, 5, 6, 4, 0, P, P_TRIDENT, IRON, HI_METAL, + TRIDENT), + /* +1 small, +2d4 large */ + +/* blades; all stack */ +WEAPON("dagger", NoDes, + 1, 1, 0, 30, 10, 4, 4, 3, 2, P, P_DAGGER, IRON, HI_METAL, + DAGGER), +WEAPON("elven dagger", "runed dagger", + 0, 1, 0, 10, 10, 4, 5, 3, 2, P, P_DAGGER, WOOD, HI_WOOD, + ELVEN_DAGGER), +WEAPON("orcish dagger", "crude dagger", + 0, 1, 0, 12, 10, 4, 3, 3, 2, P, P_DAGGER, IRON, CLR_BLACK, + ORCISH_DAGGER), +WEAPON("silver dagger", NoDes, + 1, 1, 0, 3, 12, 40, 4, 3, 2, P, P_DAGGER, SILVER, HI_SILVER, + SILVER_DAGGER), +WEAPON("athame", NoDes, + 1, 1, 0, 0, 10, 4, 4, 3, 2, S, P_DAGGER, IRON, HI_METAL, + ATHAME), +WEAPON("scalpel", NoDes, + 1, 1, 0, 0, 5, 6, 3, 3, 2, S, P_KNIFE, METAL, HI_METAL, + SCALPEL), +WEAPON("knife", NoDes, + 1, 1, 0, 20, 5, 4, 3, 2, 0, P|S, P_KNIFE, IRON, HI_METAL, + KNIFE), +WEAPON("stiletto", NoDes, + 1, 1, 0, 5, 5, 4, 3, 2, 0, P|S, P_KNIFE, IRON, HI_METAL, + STILETTO), +/* 3.6: worm teeth and crysknives now stack; + when a stack of teeth is enchanted at once, they fuse into one crysknife; + when a stack of crysknives drops, the whole stack reverts to teeth */ +/* 3.7: change crysknife from MINERAL to BONE and worm tooth from 0 to BONE */ +WEAPON("worm tooth", NoDes, + 1, 1, 0, 0, 20, 2, 2, 2, 0, 0, P_KNIFE, BONE, CLR_WHITE, + WORM_TOOTH), +WEAPON("crysknife", NoDes, + 1, 1, 0, 0, 20, 100, 10, 10, 3, P, P_KNIFE, BONE, CLR_WHITE, + CRYSKNIFE), + +/* axes */ +WEAPON("axe", NoDes, + 1, 0, 0, 40, 60, 8, 6, 4, 0, S, P_AXE, IRON, HI_METAL, + AXE), +WEAPON("battle-axe", "double-headed axe", /* "double-bitted"? */ + 0, 0, 1, 10, 120, 40, 8, 6, 0, S, P_AXE, IRON, HI_METAL, + BATTLE_AXE), + +/* swords */ +WEAPON("short sword", NoDes, + 1, 0, 0, 8, 30, 10, 6, 8, 0, P, P_SHORT_SWORD, IRON, HI_METAL, + SHORT_SWORD), +WEAPON("elven short sword", "runed short sword", + 0, 0, 0, 2, 30, 10, 8, 8, 0, P, P_SHORT_SWORD, WOOD, HI_WOOD, + ELVEN_SHORT_SWORD), +WEAPON("orcish short sword", "crude short sword", + 0, 0, 0, 3, 30, 10, 5, 8, 0, P, P_SHORT_SWORD, IRON, CLR_BLACK, + ORCISH_SHORT_SWORD), +WEAPON("dwarvish short sword", "broad short sword", + 0, 0, 0, 2, 30, 10, 7, 8, 0, P, P_SHORT_SWORD, IRON, HI_METAL, + DWARVISH_SHORT_SWORD), +WEAPON("scimitar", "curved sword", + 0, 0, 0, 15, 40, 15, 8, 8, 0, S, P_SCIMITAR, IRON, HI_METAL, + SCIMITAR), +WEAPON("silver saber", NoDes, + 1, 0, 0, 6, 40, 75, 8, 8, 0, S, P_SABER, SILVER, HI_SILVER, + SILVER_SABER), +WEAPON("broadsword", NoDes, + 1, 0, 0, 8, 70, 10, 4, 6, 0, S, P_BROAD_SWORD, IRON, HI_METAL, + BROADSWORD), + /* +d4 small, +1 large */ +WEAPON("elven broadsword", "runed broadsword", + 0, 0, 0, 4, 70, 10, 6, 6, 0, S, P_BROAD_SWORD, WOOD, HI_WOOD, + ELVEN_BROADSWORD), + /* +d4 small, +1 large */ +WEAPON("long sword", NoDes, + 1, 0, 0, 50, 40, 15, 8, 12, 0, S, P_LONG_SWORD, IRON, HI_METAL, + LONG_SWORD), +WEAPON("two-handed sword", NoDes, + 1, 0, 1, 22, 150, 50, 12, 6, 0, S, P_TWO_HANDED_SWORD, + IRON, HI_METAL, + TWO_HANDED_SWORD), + /* +2d6 large */ +WEAPON("katana", "samurai sword", + 0, 0, 0, 4, 40, 80, 10, 12, 1, S, P_LONG_SWORD, IRON, HI_METAL, + KATANA), +/* special swords set up for artifacts */ +WEAPON("tsurugi", "long samurai sword", + 0, 0, 1, 0, 60, 500, 16, 8, 2, S, P_TWO_HANDED_SWORD, + METAL, HI_METAL, + TSURUGI), + /* +2d6 large */ +WEAPON("runesword", "runed broadsword", + 0, 0, 0, 0, 40, 300, 4, 6, 0, S, P_BROAD_SWORD, IRON, CLR_BLACK, + RUNESWORD), + /* +d4 small, +1 large; Stormbringer: +5d2 +d8 from level drain */ + +/* polearms */ +/* spear-type */ +WEAPON("partisan", "vulgar polearm", + 0, 0, 1, 5, 80, 10, 6, 6, 0, P, P_POLEARMS, IRON, HI_METAL, + PARTISAN), + /* +1 large */ +WEAPON("ranseur", "hilted polearm", + 0, 0, 1, 5, 50, 6, 4, 4, 0, P, P_POLEARMS, IRON, HI_METAL, + RANSEUR), + /* +d4 both */ +WEAPON("spetum", "forked polearm", + 0, 0, 1, 5, 50, 5, 6, 6, 0, P, P_POLEARMS, IRON, HI_METAL, + SPETUM), + /* +1 small, +d6 large */ +WEAPON("glaive", "single-edged polearm", + 0, 0, 1, 8, 75, 6, 6, 10, 0, S, P_POLEARMS, IRON, HI_METAL, + GLAIVE), +WEAPON("lance", NoDes, + 1, 0, 0, 4, 180, 10, 6, 8, 0, P, P_LANCE, IRON, HI_METAL, + LANCE), + /* +2d10 when jousting with lance as primary weapon */ +/* axe-type */ +WEAPON("halberd", "angled poleaxe", + 0, 0, 1, 8, 150, 10, 10, 6, 0, P|S, P_POLEARMS, IRON, HI_METAL, + HALBERD), + /* +1d6 large */ +WEAPON("bardiche", "long poleaxe", + 0, 0, 1, 4, 120, 7, 4, 4, 0, S, P_POLEARMS, IRON, HI_METAL, + BARDICHE), + /* +1d4 small, +2d4 large */ +WEAPON("voulge", "pole cleaver", + 0, 0, 1, 4, 125, 5, 4, 4, 0, S, P_POLEARMS, IRON, HI_METAL, + VOULGE), + /* +d4 both */ +WEAPON("dwarvish mattock", "broad pick", + 0, 0, 1, 13, 120, 50, 12, 8, -1, B, P_PICK_AXE, IRON, HI_METAL, + DWARVISH_MATTOCK), +/* curved/hooked */ +WEAPON("fauchard", "pole sickle", + 0, 0, 1, 6, 60, 5, 6, 8, 0, P|S, P_POLEARMS, IRON, HI_METAL, + FAUCHARD), +WEAPON("guisarme", "pruning hook", + 0, 0, 1, 6, 80, 5, 4, 8, 0, S, P_POLEARMS, IRON, HI_METAL, + GUISARME), + /* +1d4 small */ +WEAPON("bill-guisarme", "hooked polearm", + 0, 0, 1, 4, 120, 7, 4, 10, 0, P|S, P_POLEARMS, IRON, HI_METAL, + BILL_GUISARME), + /* +1d4 small */ +/* other */ +WEAPON("lucern hammer", "pronged polearm", + 0, 0, 1, 5, 150, 7, 4, 6, 0, B|P, P_POLEARMS, IRON, HI_METAL, + LUCERN_HAMMER), + /* +1d4 small */ +WEAPON("bec de corbin", "beaked polearm", + 0, 0, 1, 4, 100, 8, 8, 6, 0, B|P, P_POLEARMS, IRON, HI_METAL, + BEC_DE_CORBIN), + +/* bludgeons */ +WEAPON("mace", NoDes, + 1, 0, 0, 40, 30, 5, 6, 6, 0, B, P_MACE, IRON, HI_METAL, + MACE), + /* +1 small */ +WEAPON("morning star", NoDes, + 1, 0, 0, 12, 120, 10, 4, 6, 0, B, P_MORNING_STAR, IRON, HI_METAL, + MORNING_STAR), + /* +d4 small, +1 large */ +WEAPON("war hammer", NoDes, + 1, 0, 0, 15, 50, 5, 4, 4, 0, B, P_HAMMER, IRON, HI_METAL, + WAR_HAMMER), + /* +1 small */ +WEAPON("club", NoDes, + 1, 0, 0, 12, 30, 3, 6, 3, 0, B, P_CLUB, WOOD, HI_WOOD, + CLUB), +WEAPON("rubber hose", NoDes, + 1, 0, 0, 0, 20, 3, 4, 3, 0, B, P_WHIP, PLASTIC, CLR_BROWN, + RUBBER_HOSE), +WEAPON("quarterstaff", "staff", + 0, 0, 1, 11, 40, 5, 6, 6, 0, B, P_QUARTERSTAFF, WOOD, HI_WOOD, + QUARTERSTAFF), +/* two-piece */ +WEAPON("aklys", "thonged club", + 0, 0, 0, 8, 15, 4, 6, 3, 0, B, P_CLUB, IRON, HI_METAL, + AKLYS), +WEAPON("flail", NoDes, + 1, 0, 0, 40, 15, 4, 6, 4, 0, B, P_FLAIL, IRON, HI_METAL, + FLAIL), + /* +1 small, +1d4 large */ + +/* misc */ +WEAPON("bullwhip", NoDes, + 1, 0, 0, 2, 20, 4, 2, 1, 0, 0, P_WHIP, LEATHER, CLR_BROWN, + BULLWHIP), + +/* bows */ +BOW("bow", NoDes, 1, 24, 30, 60, 0, WOOD, P_BOW, HI_WOOD, + BOW), +BOW("elven bow", "runed bow", 0, 12, 30, 60, 0, WOOD, P_BOW, HI_WOOD, + ELVEN_BOW), +BOW("orcish bow", "crude bow", 0, 12, 30, 60, 0, WOOD, P_BOW, CLR_BLACK, + ORCISH_BOW), +BOW("yumi", "long bow", 0, 0, 30, 60, 0, WOOD, P_BOW, HI_WOOD, + YUMI), +BOW("sling", NoDes, 1, 40, 3, 20, 0, LEATHER, P_SLING, HI_LEATHER, + SLING), +BOW("crossbow", NoDes, 1, 45, 50, 40, 0, WOOD, P_CROSSBOW, HI_WOOD, + CROSSBOW), + +#undef P +#undef S +#undef B + +#undef WEAPON +#undef PROJECTILE +#undef BOW + +/* armor ... */ + /* IRON denotes ferrous metals, including steel. + * Only IRON weapons and armor can rust. + * Only COPPER (including brass) corrodes. + * Some creatures are vulnerable to SILVER. + */ +#define ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt, \ + cost,ac,can,sub,metal,c,sn) \ + OBJECT(OBJ(name, desc), \ + BITS(kn, 0, 1, 0, mgc, 1, 0, 0, blk, 0, 0, sub, metal), \ + power, ARMOR_CLASS, prob, delay, wt, \ + cost, 0, 0, 10 - ac, can, wt, c, sn) +#define HELM(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c,sn) \ + ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt, \ + cost, ac, can, ARM_HELM, metal, c, sn) +#define CLOAK(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c,sn) \ + ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt, \ + cost, ac, can, ARM_CLOAK, metal, c,sn) +#define SHIELD(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,metal,c,sn) \ + ARMOR(name, desc, kn, mgc, blk, power, prob, delay, wt, \ + cost, ac, can, ARM_SHIELD, metal, c,sn) +#define GLOVES(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c,sn) \ + ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt, \ + cost, ac, can, ARM_GLOVES, metal, c,sn) +#define BOOTS(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c,sn) \ + ARMOR(name, desc, kn, mgc, 0, power, prob, delay, wt, \ + cost, ac, can, ARM_BOOTS, metal, c,sn) + +/* helmets */ +HELM("elven leather helm", "leather hat", + 0, 0, 0, 6, 1, 3, 8, 9, 0, LEATHER, HI_LEATHER, + ELVEN_LEATHER_HELM), +HELM("orcish helm", "iron skull cap", + 0, 0, 0, 6, 1, 30, 10, 9, 0, IRON, CLR_BLACK, + ORCISH_HELM), +HELM("dwarvish iron helm", "hard hat", + 0, 0, 0, 6, 1, 40, 20, 8, 0, IRON, HI_METAL, + DWARVISH_IRON_HELM), +HELM("fedora", NoDes, + 1, 0, 0, 0, 0, 3, 1, 10, 0, CLOTH, CLR_BROWN, + FEDORA), +HELM("cornuthaum", "conical hat", + 0, 1, CLAIRVOYANT, 3, 1, 4, 80, 10, 1, CLOTH, CLR_BLUE, + CORNUTHAUM), + /* name coined by devteam; confers clairvoyance for wizards, + blocks clairvoyance if worn by role other than wizard */ +HELM("dunce cap", "conical hat", + 0, 1, 0, 3, 1, 4, 1, 10, 0, CLOTH, CLR_BLUE, + DUNCE_CAP), +HELM("dented pot", NoDes, + 1, 0, 0, 2, 0, 10, 8, 9, 0, IRON, CLR_BLACK, + DENTED_POT), +/* with shuffled appearances... */ +HELM("helmet", "plumed helmet", + 0, 0, 0, 10, 1, 30, 10, 9, 0, IRON, HI_METAL, + HELMET), +HELM("helm of brilliance", "etched helmet", + 0, 1, 0, 6, 1, 50, 50, 9, 0, IRON, CLR_GREEN, + HELM_OF_BRILLIANCE), +HELM("helm of opposite alignment", "crested helmet", + 0, 1, 0, 6, 1, 50, 50, 9, 0, IRON, HI_METAL, + HELM_OF_OPPOSITE_ALIGNMENT), +HELM("helm of telepathy", "visored helmet", + 0, 1, TELEPAT, 2, 1, 50, 50, 9, 0, IRON, HI_METAL, + HELM_OF_TELEPATHY), + +/* suits of armor */ +/* + * There is code in polyself.c that assumes (1) and (2). + * There is code in obj.h, objnam.c, mon.c, read.c that assumes (2). + * (1) The dragon scale mails and the dragon scales are together. + * (2) That the order of the dragon scale mail and dragon scales + * is the same as order of dragons defined in monst.c. + */ +#define DRGN_ARMR(name,mgc,power,cost,ac,color,snam) \ + ARMOR(name, NoDes, 1, mgc, 1, power, 0, 5, 40, \ + cost, ac, 0, ARM_SUIT, DRAGON_HIDE, color,snam) +/* 3.4.1: dragon scale mail reclassified as "magic" since magic is + needed to create them */ +DRGN_ARMR("gray dragon scale mail", 1, ANTIMAGIC, 1200, 1, CLR_GRAY, + GRAY_DRAGON_SCALE_MAIL), + /* gold DSM is a light source; there's no property for that */ +DRGN_ARMR("gold dragon scale mail", 1, 0, 900, 1, HI_GOLD, + GOLD_DRAGON_SCALE_MAIL), +DRGN_ARMR("silver dragon scale mail", 1, REFLECTING, 1200, 1, DRAGON_SILVER, + SILVER_DRAGON_SCALE_MAIL), +#if 0 /* DEFERRED */ +DRGN_ARMR("shimmering dragon scale mail", 1, DISPLACED, 1200, 1, CLR_CYAN, + SHIMMERING_DRAGON_SCALE_MAIL), +#endif +DRGN_ARMR("red dragon scale mail", 1, FIRE_RES, 900, 1, CLR_RED, + RED_DRAGON_SCALE_MAIL), +DRGN_ARMR("white dragon scale mail", 1, COLD_RES, 900, 1, CLR_WHITE, + WHITE_DRAGON_SCALE_MAIL), +DRGN_ARMR("orange dragon scale mail", 1, SLEEP_RES, 900, 1, CLR_ORANGE, + ORANGE_DRAGON_SCALE_MAIL), +DRGN_ARMR("black dragon scale mail", 1, DISINT_RES, 1200, 1, CLR_BLACK, + BLACK_DRAGON_SCALE_MAIL), +DRGN_ARMR("blue dragon scale mail", 1, SHOCK_RES, 900, 1, CLR_BLUE, + BLUE_DRAGON_SCALE_MAIL), +DRGN_ARMR("green dragon scale mail", 1, POISON_RES, 900, 1, CLR_GREEN, + GREEN_DRAGON_SCALE_MAIL), +DRGN_ARMR("yellow dragon scale mail", 1, ACID_RES, 900, 1, CLR_YELLOW, + YELLOW_DRAGON_SCALE_MAIL), +/* For now, only dragons leave these. */ +/* 3.4.1: dragon scales left classified as "non-magic"; they confer magical + properties but are produced "naturally"; affects use as polypile fodder */ +DRGN_ARMR("gray dragon scales", 0, ANTIMAGIC, 700, 7, CLR_GRAY, + GRAY_DRAGON_SCALES), +DRGN_ARMR("gold dragon scales", 0, 0, 500, 7, HI_GOLD, + GOLD_DRAGON_SCALES), +DRGN_ARMR("silver dragon scales", 0, REFLECTING, 700, 7, DRAGON_SILVER, + SILVER_DRAGON_SCALES), +#if 0 /* DEFERRED */ +DRGN_ARMR("shimmering dragon scales", 0, DISPLACED, 700, 7, CLR_CYAN, + SHIMMERING_DRAGON_SCALES), +#endif +DRGN_ARMR("red dragon scales", 0, FIRE_RES, 500, 7, CLR_RED, + RED_DRAGON_SCALES), +DRGN_ARMR("white dragon scales", 0, COLD_RES, 500, 7, CLR_WHITE, + WHITE_DRAGON_SCALES), +DRGN_ARMR("orange dragon scales", 0, SLEEP_RES, 500, 7, CLR_ORANGE, + ORANGE_DRAGON_SCALES), +DRGN_ARMR("black dragon scales", 0, DISINT_RES, 700, 7, CLR_BLACK, + BLACK_DRAGON_SCALES), +DRGN_ARMR("blue dragon scales", 0, SHOCK_RES, 500, 7, CLR_BLUE, + BLUE_DRAGON_SCALES), +DRGN_ARMR("green dragon scales", 0, POISON_RES, 500, 7, CLR_GREEN, + GREEN_DRAGON_SCALES), +DRGN_ARMR("yellow dragon scales", 0, ACID_RES, 500, 7, CLR_YELLOW, + YELLOW_DRAGON_SCALES), +#undef DRGN_ARMR +/* other suits */ +ARMOR("plate mail", NoDes, + 1, 0, 1, 0, 44, 5, 450, 600, 3, 2, ARM_SUIT, IRON, HI_METAL, + PLATE_MAIL), +ARMOR("crystal plate mail", NoDes, + 1, 0, 1, 0, 10, 5, 450, 820, 3, 2, ARM_SUIT, GLASS, CLR_WHITE, + CRYSTAL_PLATE_MAIL), +ARMOR("bronze plate mail", NoDes, + 1, 0, 1, 0, 25, 5, 450, 400, 4, 1, ARM_SUIT, COPPER, HI_COPPER, + BRONZE_PLATE_MAIL), +ARMOR("splint mail", NoDes, + 1, 0, 1, 0, 62, 5, 400, 80, 4, 1, ARM_SUIT, IRON, HI_METAL, + SPLINT_MAIL), +ARMOR("banded mail", NoDes, + 1, 0, 1, 0, 72, 5, 350, 90, 4, 1, ARM_SUIT, IRON, HI_METAL, + BANDED_MAIL), +ARMOR("dwarvish mithril-coat", NoDes, + 1, 0, 0, 0, 10, 1, 150, 240, 4, 2, ARM_SUIT, MITHRIL, HI_SILVER, + DWARVISH_MITHRIL_COAT), +ARMOR("elven mithril-coat", NoDes, + 1, 0, 0, 0, 15, 1, 150, 240, 5, 2, ARM_SUIT, MITHRIL, HI_SILVER, + ELVEN_MITHRIL_COAT), +ARMOR("chain mail", NoDes, + 1, 0, 0, 0, 72, 5, 300, 75, 5, 1, ARM_SUIT, IRON, HI_METAL, + CHAIN_MAIL), +ARMOR("orcish chain mail", "crude chain mail", + 0, 0, 0, 0, 20, 5, 300, 75, 6, 1, ARM_SUIT, IRON, CLR_BLACK, + ORCISH_CHAIN_MAIL), +ARMOR("scale mail", NoDes, + 1, 0, 0, 0, 72, 5, 250, 45, 6, 1, ARM_SUIT, IRON, HI_METAL, + SCALE_MAIL), +ARMOR("studded leather armor", NoDes, + 1, 0, 0, 0, 72, 3, 200, 15, 7, 1, ARM_SUIT, LEATHER, HI_LEATHER, + STUDDED_LEATHER_ARMOR), +ARMOR("ring mail", NoDes, + 1, 0, 0, 0, 72, 5, 250, 100, 7, 1, ARM_SUIT, IRON, HI_METAL, + RING_MAIL), +ARMOR("orcish ring mail", "crude ring mail", + 0, 0, 0, 0, 20, 5, 250, 80, 8, 1, ARM_SUIT, IRON, CLR_BLACK, + ORCISH_RING_MAIL), +ARMOR("leather armor", NoDes, + 1, 0, 0, 0, 82, 3, 150, 5, 8, 1, ARM_SUIT, LEATHER, HI_LEATHER, + LEATHER_ARMOR), +ARMOR("leather jacket", NoDes, + 1, 0, 0, 0, 12, 0, 30, 10, 9, 0, ARM_SUIT, LEATHER, CLR_BLACK, + LEATHER_JACKET), + +/* shirts */ +ARMOR("Hawaiian shirt", NoDes, + 1, 0, 0, 0, 8, 0, 5, 3, 10, 0, ARM_SHIRT, CLOTH, CLR_MAGENTA, + HAWAIIAN_SHIRT), +ARMOR("T-shirt", NoDes, + 1, 0, 0, 0, 2, 0, 5, 2, 10, 0, ARM_SHIRT, CLOTH, CLR_WHITE, + T_SHIRT), + +/* cloaks */ +CLOAK("mummy wrapping", NoDes, + 1, 0, 0, 0, 0, 3, 2, 10, 1, CLOTH, CLR_GRAY, MUMMY_WRAPPING), + /* worn mummy wrapping blocks invisibility */ +CLOAK("elven cloak", "faded pall", + 0, 1, STEALTH, 8, 0, 10, 60, 9, 1, CLOTH, CLR_BLACK, ELVEN_CLOAK), +CLOAK("orcish cloak", "coarse mantelet", + 0, 0, 0, 8, 0, 10, 40, 10, 1, CLOTH, CLR_BLACK, ORCISH_CLOAK), +CLOAK("dwarvish cloak", "hooded cloak", + 0, 0, 0, 8, 0, 10, 50, 10, 1, CLOTH, HI_CLOTH, DWARVISH_CLOAK), +CLOAK("oilskin cloak", "slippery cloak", + 0, 0, 0, 8, 0, 10, 50, 9, 2, CLOTH, HI_CLOTH, OILSKIN_CLOAK), +CLOAK("robe", NoDes, + 1, 1, 0, 3, 0, 15, 50, 8, 2, CLOTH, CLR_RED, ROBE), + /* robe was adopted from slash'em, where it's worn as a suit + rather than as a cloak and there are several variations */ +CLOAK("alchemy smock", "apron", + 0, 1, POISON_RES, 9, 0, 10, 50, 9, 1, CLOTH, CLR_WHITE, ALCHEMY_SMOCK), +CLOAK("leather cloak", NoDes, + 1, 0, 0, 8, 0, 15, 40, 9, 1, LEATHER, CLR_BROWN, LEATHER_CLOAK), +/* with shuffled appearances... */ +CLOAK("cloak of protection", "tattered cape", + 0, 1, PROTECTION, 9, 0, 10, 50, 7, 3, CLOTH, HI_CLOTH, CLOAK_OF_PROTECTION), + /* cloak of protection is now the only item conferring MC 3 */ +CLOAK("cloak of invisibility", "opera cloak", + 0, 1, INVIS, 10, 0, 10, 60, 9, 1, CLOTH, CLR_BRIGHT_MAGENTA, + CLOAK_OF_INVISIBILITY), +CLOAK("cloak of magic resistance", "ornamental cope", + 0, 1, ANTIMAGIC, 2, 0, 10, 60, 9, 1, CLOTH, CLR_WHITE, + CLOAK_OF_MAGIC_RESISTANCE), + /* 'cope' is not a spelling mistake... leave it be */ +CLOAK("cloak of displacement", "piece of cloth", + 0, 1, DISPLACED, 10, 0, 10, 50, 9, 1, CLOTH, HI_CLOTH, + CLOAK_OF_DISPLACEMENT), + +/* shields */ +SHIELD("small shield", NoDes, + 1, 0, 0, 0, 6, 0, 30, 3, 9, 0, WOOD, HI_WOOD, + SMALL_SHIELD), +SHIELD("elven shield", "blue and green shield", + 0, 0, 0, 0, 2, 0, 40, 7, 8, 0, WOOD, CLR_GREEN, + ELVEN_SHIELD), +SHIELD("Uruk-hai shield", "white-handed shield", + 0, 0, 0, 0, 2, 0, 50, 7, 9, 0, IRON, HI_METAL, + URUK_HAI_SHIELD), +SHIELD("orcish shield", "red-eyed shield", + 0, 0, 0, 0, 2, 0, 50, 7, 9, 0, IRON, CLR_RED, + ORCISH_SHIELD), +SHIELD("large shield", NoDes, + 1, 0, 1, 0, 7, 0, 100, 10, 8, 0, IRON, HI_METAL, + LARGE_SHIELD), +SHIELD("dwarvish roundshield", "large round shield", + 0, 0, 0, 0, 4, 0, 100, 10, 8, 0, IRON, HI_METAL, + DWARVISH_ROUNDSHIELD), +SHIELD("shield of reflection", "polished silver shield", + 0, 1, 0, REFLECTING, 3, 0, 50, 50, 8, 0, SILVER, HI_SILVER, + SHIELD_OF_REFLECTION), + +/* gloves */ +/* These have their color but not material shuffled, so the IRON must + * stay CLR_BROWN (== HI_LEATHER) even though it's normally either + * HI_METAL or CLR_BLACK. All have shuffled descriptions. + */ +GLOVES("leather gloves", "old gloves", + 0, 0, 0, 16, 1, 10, 8, 9, 0, LEATHER, HI_LEATHER, + LEATHER_GLOVES), +GLOVES("gauntlets of fumbling", "padded gloves", + 0, 1, FUMBLING, 8, 1, 10, 50, 9, 0, LEATHER, HI_LEATHER, + GAUNTLETS_OF_FUMBLING), +GLOVES("gauntlets of power", "riding gloves", + 0, 1, 0, 8, 1, 30, 50, 9, 0, IRON, CLR_BROWN, + GAUNTLETS_OF_POWER), +GLOVES("gauntlets of dexterity", "fencing gloves", + 0, 1, 0, 8, 1, 10, 50, 9, 0, LEATHER, HI_LEATHER, + GAUNTLETS_OF_DEXTERITY), + +/* boots */ +BOOTS("low boots", "walking shoes", + 0, 0, 0, 25, 2, 10, 8, 9, 0, LEATHER, HI_LEATHER, LOW_BOOTS), +BOOTS("iron shoes", "hard shoes", + 0, 0, 0, 7, 2, 50, 16, 8, 0, IRON, HI_METAL, IRON_SHOES), +BOOTS("high boots", "jackboots", + 0, 0, 0, 15, 2, 20, 12, 8, 0, LEATHER, HI_LEATHER, HIGH_BOOTS), +/* with shuffled appearances... */ +BOOTS("speed boots", "combat boots", + 0, 1, FAST, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER, SPEED_BOOTS), +BOOTS("water walking boots", "jungle boots", + 0, 1, WWALKING, 12, 2, 15, 50, 9, 0, LEATHER, HI_LEATHER, + WATER_WALKING_BOOTS), +BOOTS("jumping boots", "hiking boots", + 0, 1, JUMPING, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER, + JUMPING_BOOTS), +BOOTS("elven boots", "mud boots", + 0, 1, STEALTH, 12, 2, 15, 8, 9, 0, LEATHER, HI_LEATHER, + ELVEN_BOOTS), +BOOTS("kicking boots", "buckled boots", + 0, 1, 0, 12, 2, 50, 8, 9, 0, IRON, CLR_BROWN, + KICKING_BOOTS), + /* CLR_BROWN for same reason as gauntlets of power */ +BOOTS("fumble boots", "riding boots", + 0, 1, FUMBLING, 12, 2, 20, 30, 9, 0, LEATHER, HI_LEATHER, + FUMBLE_BOOTS), +BOOTS("levitation boots", "snow boots", + 0, 1, LEVITATION, 12, 2, 15, 30, 9, 0, LEATHER, HI_LEATHER, + LEVITATION_BOOTS), +#undef HELM +#undef CLOAK +#undef SHIELD +#undef GLOVES +#undef BOOTS +#undef ARMOR + +/* rings ... */ +#define RING(name,stone,power,cost,mgc,spec,mohs,metal,color,sn) \ + OBJECT(OBJ(name, stone), \ + BITS(0, 0, spec, 0, mgc, spec, 0, 0, 0, \ + HARDGEM(mohs), 0, P_NONE, metal), \ + power, RING_CLASS, 0, 0, 3, cost, 0, 0, 0, 0, 15, color,sn) +RING("adornment", "wooden", + ADORNED, 100, 1, 1, 2, WOOD, HI_WOOD, RIN_ADORNMENT), +RING("gain strength", "granite", + 0, 150, 1, 1, 7, MINERAL, HI_MINERAL, + RIN_GAIN_STRENGTH), +RING("gain constitution", "opal", + 0, 150, 1, 1, 7, MINERAL, HI_MINERAL, + RIN_GAIN_CONSTITUTION), +RING("increase accuracy", "clay", + 0, 150, 1, 1, 4, MINERAL, CLR_RED, + RIN_INCREASE_ACCURACY), +RING("increase damage", "coral", + 0, 150, 1, 1, 4, MINERAL, CLR_ORANGE, + RIN_INCREASE_DAMAGE), +RING("protection", "black onyx", + PROTECTION, 100, 1, 1, 7, MINERAL, CLR_BLACK, + RIN_PROTECTION), + /* 'PROTECTION' intrinsic enhances MC from worn armor by +1, + regardless of ring's enchantment; wearing a second ring of + protection (or even one ring of protection combined with + cloak of protection) doesn't give a second MC boost */ +RING("regeneration", "moonstone", + REGENERATION, 200, 1, 0, 6, MINERAL, HI_MINERAL, + RIN_REGENERATION), +RING("searching", "tiger eye", + SEARCHING, 200, 1, 0, 6, GEMSTONE, CLR_BROWN, + RIN_SEARCHING ), +RING("stealth", "jade", + STEALTH, 100, 1, 0, 6, GEMSTONE, CLR_GREEN, + RIN_STEALTH), +RING("sustain ability", "bronze", + FIXED_ABIL, 100, 1, 0, 4, COPPER, HI_COPPER, + RIN_SUSTAIN_ABILITY), +RING("levitation", "agate", + LEVITATION, 200, 1, 0, 7, GEMSTONE, CLR_RED, + RIN_LEVITATION), +RING("hunger", "topaz", + HUNGER, 100, 1, 0, 8, GEMSTONE, CLR_CYAN, + RIN_HUNGER), +RING("aggravate monster", "sapphire", + AGGRAVATE_MONSTER, 150, 1, 0, 9, GEMSTONE, CLR_BLUE, + RIN_AGGRAVATE_MONSTER), +RING("conflict", "ruby", + CONFLICT, 300, 1, 0, 9, GEMSTONE, CLR_RED, + RIN_CONFLICT), +RING("warning", "diamond", + WARNING, 100, 1, 0, 10, GEMSTONE, CLR_WHITE, + RIN_WARNING), +RING("poison resistance", "pearl", + POISON_RES, 150, 1, 0, 4, BONE, CLR_WHITE, + RIN_POISON_RESISTANCE), +RING("fire resistance", "iron", + FIRE_RES, 200, 1, 0, 5, IRON, HI_METAL, + RIN_FIRE_RESISTANCE), +RING("cold resistance", "brass", + COLD_RES, 150, 1, 0, 4, COPPER, HI_COPPER, + RIN_COLD_RESISTANCE), +RING("shock resistance", "copper", + SHOCK_RES, 150, 1, 0, 3, COPPER, HI_COPPER, + RIN_SHOCK_RESISTANCE), +RING("free action", "twisted", + FREE_ACTION, 200, 1, 0, 6, IRON, HI_METAL, + RIN_FREE_ACTION), +RING("slow digestion", "steel", + SLOW_DIGESTION, 200, 1, 0, 8, IRON, HI_METAL, + RIN_SLOW_DIGESTION), +RING("teleportation", "silver", + TELEPORT, 200, 1, 0, 3, SILVER, HI_SILVER, + RIN_TELEPORTATION), +RING("teleport control", "gold", + TELEPORT_CONTROL, 300, 1, 0, 3, GOLD, HI_GOLD, + RIN_TELEPORT_CONTROL), +RING("polymorph", "ivory", + POLYMORPH, 300, 1, 0, 4, BONE, CLR_WHITE, + RIN_POLYMORPH), +RING("polymorph control", "emerald", + POLYMORPH_CONTROL, 300, 1, 0, 8, GEMSTONE, CLR_BRIGHT_GREEN, + RIN_POLYMORPH_CONTROL), +RING("invisibility", "wire", + INVIS, 150, 1, 0, 5, IRON, HI_METAL, + RIN_INVISIBILITY), +RING("see invisible", "engagement", + SEE_INVIS, 150, 1, 0, 5, IRON, HI_METAL, + RIN_SEE_INVISIBLE), +RING("protection from shape changers", "shiny", + PROT_FROM_SHAPE_CHANGERS, 100, 1, 0, 5, IRON, CLR_BRIGHT_CYAN, + RIN_PROTECTION_FROM_SHAPE_CHAN), +#undef RING + +/* amulets ... - THE Amulet comes last because it is special */ +#define AMULET(name,desc,power,prob,sn) \ + OBJECT(OBJ(name, desc), \ + BITS(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, P_NONE, IRON), \ + power, AMULET_CLASS, prob, 0, 20, 150, 0, 0, 0, 0, 20, HI_METAL, sn) +AMULET("amulet of ESP", "circular", TELEPAT, 120, + AMULET_OF_ESP), +AMULET("amulet of life saving", "spherical", LIFESAVED, 75, + AMULET_OF_LIFE_SAVING), +AMULET("amulet of strangulation", "oval", STRANGLED, 115, + AMULET_OF_STRANGULATION), +AMULET("amulet of restful sleep", "triangular", SLEEPY, 115, + AMULET_OF_RESTFUL_SLEEP), +AMULET("amulet versus poison", "pyramidal", POISON_RES, 115, + AMULET_VERSUS_POISON), +AMULET("amulet of change", "square", 0, 115, + AMULET_OF_CHANGE), +AMULET("amulet of unchanging", "concave", UNCHANGING, 60, + AMULET_OF_UNCHANGING), +AMULET("amulet of reflection", "hexagonal", REFLECTING, 75, + AMULET_OF_REFLECTION), +AMULET("amulet of magical breathing", "octagonal", MAGICAL_BREATHING, 75, + AMULET_OF_MAGICAL_BREATHING), + /* +2 AC and +2 MC; +2 takes naked hero past 'warded' to 'guarded' */ +AMULET("amulet of guarding", "perforated", PROTECTION, 75, + AMULET_OF_GUARDING), + /* cubical: some descriptions are already three dimensional and + parallelogrammatical (real word!) would be way over the top */ +AMULET("amulet of flying", "cubical", FLYING, 60, + AMULET_OF_FLYING), +/* fixed descriptions; description duplication is deliberate; + * fake one must come before real one because selection for + * description shuffling stops when a non-magic amulet is encountered + */ +OBJECT(OBJ("cheap plastic imitation of the Amulet of Yendor", + "Amulet of Yendor"), + BITS(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, PLASTIC), + 0, AMULET_CLASS, 0, 0, 20, 0, 0, 0, 0, 0, 1, HI_METAL, + FAKE_AMULET_OF_YENDOR), +OBJECT(OBJ("Amulet of Yendor", /* note: description == name */ + "Amulet of Yendor"), + BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, MITHRIL), + 0, AMULET_CLASS, 0, 0, 20, 30000, 0, 0, 0, 0, 20, HI_METAL, + AMULET_OF_YENDOR), +#undef AMULET + +/* tools ... */ +/* tools with weapon characteristics come last */ +#define TOOL(name,desc,kn,mrg,mgc,chg,prob,wt,cost,mat,color,sn) \ + OBJECT(OBJ(name, desc), \ + BITS(kn, mrg, chg, 0, mgc, chg, 0, 0, 0, 0, 0, P_NONE, mat), \ + 0, TOOL_CLASS, prob, 0, wt, cost, 0, 0, 0, 0, wt, color, sn) +#define CONTAINER(name,desc,kn,mgc,chg,prob,wt,cost,mat,color,sn) \ + OBJECT(OBJ(name, desc), \ + BITS(kn, 0, chg, 1, mgc, chg, 0, 0, 0, 0, 0, P_NONE, mat), \ + 0, TOOL_CLASS, prob, 0, wt, cost, 0, 0, 0, 0, wt, color, sn) +#define WEPTOOL(name,desc,kn,mgc,bi,prob,wt,cost,sdam,ldam,hitbon,sub,mat,clr,sn)\ + OBJECT(OBJ(name, desc), \ + BITS(kn, 0, 1, 0, mgc, 1, 0, 0, bi, 0, hitbon, sub, mat), \ + 0, TOOL_CLASS, prob, 0, wt, cost, sdam, ldam, hitbon, 0, wt, clr, sn) +/* containers */ +CONTAINER("large box", NoDes, 1, 0, 0, 40, 350, 8, WOOD, HI_WOOD, + LARGE_BOX), +CONTAINER("chest", NoDes, 1, 0, 0, 35, 600, 16, WOOD, HI_WOOD, + CHEST), +CONTAINER("ice box", NoDes, 1, 0, 0, 5, 900, 42, PLASTIC, CLR_WHITE, + ICE_BOX), +CONTAINER("sack", "bag", 0, 0, 0, 35, 15, 2, CLOTH, HI_CLOTH, + SACK), +CONTAINER("oilskin sack", "bag", 0, 0, 0, 5, 15, 100, CLOTH, HI_CLOTH, + OILSKIN_SACK), +CONTAINER("bag of holding", "bag", 0, 1, 0, 20, 15, 100, CLOTH, HI_CLOTH, + BAG_OF_HOLDING), +CONTAINER("bag of tricks", "bag", 0, 1, 1, 20, 15, 100, CLOTH, HI_CLOTH, + BAG_OF_TRICKS), +#undef CONTAINER + +/* lock opening tools */ +TOOL("skeleton key", "key", 0, 0, 0, 0, 80, 3, 10, IRON, HI_METAL, + SKELETON_KEY), +TOOL("lock pick", NoDes, 1, 0, 0, 0, 60, 4, 20, IRON, HI_METAL, + LOCK_PICK), +TOOL("credit card", NoDes, 1, 0, 0, 0, 15, 1, 10, PLASTIC, CLR_WHITE, + CREDIT_CARD), +/* light sources */ +TOOL("tallow candle", "candle", 0, 1, 0, 0, 20, 2, 10, WAX, CLR_WHITE, + TALLOW_CANDLE), +TOOL("wax candle", "candle", 0, 1, 0, 0, 5, 2, 20, WAX, CLR_WHITE, + WAX_CANDLE), +TOOL("brass lantern", NoDes, 1, 0, 0, 0, 30, 30, 12, COPPER, CLR_YELLOW, + BRASS_LANTERN), +TOOL("oil lamp", "lamp", 0, 0, 0, 0, 45, 20, 10, COPPER, CLR_YELLOW, + OIL_LAMP), +TOOL("magic lamp", "lamp", 0, 0, 1, 0, 15, 20, 50, COPPER, CLR_YELLOW, + MAGIC_LAMP), +/* other tools */ +TOOL("expensive camera", NoDes, 1, 0, 0, 1, 15, 12,200, PLASTIC, CLR_BLACK, + EXPENSIVE_CAMERA), +TOOL("mirror", "looking glass", 0, 0, 0, 0, 45, 13, 10, GLASS, HI_SILVER, + MIRROR), +TOOL("crystal ball", "glass orb", 0, 0, 1, 1, 15,150, 60, GLASS, HI_GLASS, + CRYSTAL_BALL), +TOOL("lenses", NoDes, 1, 0, 0, 0, 5, 3, 80, GLASS, HI_GLASS, + LENSES), +TOOL("blindfold", NoDes, 1, 0, 0, 0, 50, 2, 20, CLOTH, CLR_BLACK, + BLINDFOLD), +TOOL("towel", NoDes, 1, 0, 0, 0, 50, 2, 50, CLOTH, CLR_MAGENTA, + TOWEL), +TOOL("saddle", NoDes, 1, 0, 0, 0, 5,200,150, LEATHER, HI_LEATHER, + SADDLE), +TOOL("leash", NoDes, 1, 0, 0, 0, 65, 12, 20, LEATHER, HI_LEATHER, + LEASH), +TOOL("stethoscope", NoDes, 1, 0, 0, 0, 25, 4, 75, IRON, HI_METAL, + STETHOSCOPE), +TOOL("tinning kit", NoDes, 1, 0, 0, 1, 15,100, 30, IRON, HI_METAL, + TINNING_KIT), +TOOL("tin opener", NoDes, 1, 0, 0, 0, 35, 4, 30, IRON, HI_METAL, + TIN_OPENER), +TOOL("can of grease", NoDes, 1, 0, 0, 1, 15, 15, 20, IRON, HI_METAL, + CAN_OF_GREASE), +TOOL("figurine", NoDes, 1, 0, 1, 0, 25, 50, 80, MINERAL, HI_MINERAL, + FIGURINE), + /* monster type specified by obj->corpsenm */ +TOOL("magic marker", NoDes, 1, 0, 1, 1, 15, 2, 50, PLASTIC, CLR_RED, + MAGIC_MARKER), +/* traps */ +TOOL("land mine", NoDes, 1, 0, 0, 0, 0, 300,180, IRON, CLR_RED, + LAND_MINE), +TOOL("beartrap", NoDes, 1, 0, 0, 0, 0, 200, 60, IRON, HI_METAL, + BEARTRAP), +/* instruments; + "If tin whistles are made out of tin, what do they make foghorns out of?" */ +TOOL("tin whistle", "whistle", 0, 0, 0, 0,100, 3, 10, METAL, HI_METAL, + TIN_WHISTLE), +TOOL("magic whistle", "whistle", 0, 0, 1, 0, 30, 3, 10, METAL, HI_METAL, + MAGIC_WHISTLE), +TOOL("wooden flute", "flute", 0, 0, 0, 0, 4, 5, 12, WOOD, HI_WOOD, + WOODEN_FLUTE), +TOOL("magic flute", "flute", 0, 0, 1, 1, 2, 5, 36, WOOD, HI_WOOD, + MAGIC_FLUTE), +TOOL("tooled horn", "horn", 0, 0, 0, 0, 5, 18, 15, BONE, CLR_WHITE, + TOOLED_HORN), +TOOL("frost horn", "horn", 0, 0, 1, 1, 2, 18, 50, BONE, CLR_WHITE, + FROST_HORN), +TOOL("fire horn", "horn", 0, 0, 1, 1, 2, 18, 50, BONE, CLR_WHITE, + FIRE_HORN), +TOOL("horn of plenty", "horn", 0, 0, 1, 1, 2, 18, 50, BONE, CLR_WHITE, + HORN_OF_PLENTY), + /* horn, but not an instrument */ +TOOL("wooden harp", "harp", 0, 0, 0, 0, 4, 30, 50, WOOD, HI_WOOD, + WOODEN_HARP), +TOOL("magic harp", "harp", 0, 0, 1, 1, 2, 30, 50, WOOD, HI_WOOD, + MAGIC_HARP), +TOOL("bell", NoDes, 1, 0, 0, 0, 2, 30, 50, COPPER, HI_COPPER, + BELL), +TOOL("bugle", NoDes, 1, 0, 0, 0, 4, 10, 15, COPPER, HI_COPPER, + BUGLE), +TOOL("leather drum", "drum", 0, 0, 0, 0, 4, 25, 25, LEATHER, HI_LEATHER, + LEATHER_DRUM), +TOOL("drum of earthquake","drum", 0, 0, 1, 1, 2, 25, 25, LEATHER, HI_LEATHER, + DRUM_OF_EARTHQUAKE), +/* tools useful as weapons */ +WEPTOOL("pick-axe", NoDes, + 1, 0, 0, 20, 100, 50, 6, 3, WHACK, P_PICK_AXE, IRON, HI_METAL, + PICK_AXE), +WEPTOOL("grappling hook", NoDes, + 1, 0, 0, 5, 30, 50, 2, 6, WHACK, P_FLAIL, IRON, HI_METAL, + GRAPPLING_HOOK), +WEPTOOL("unicorn horn", NoDes, + 1, 1, 1, 0, 20, 100, 12, 12, PIERCE, P_UNICORN_HORN, + BONE, CLR_WHITE, + UNICORN_HORN), + /* 3.4.1: unicorn horn left classified as "magic" */ +/* two unique tools; + * not artifacts, despite the comment which used to be here + */ +OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"), + BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, P_NONE, GOLD), + 0, TOOL_CLASS, 0, 0, 10, 5000, 0, 0, 0, 0, 200, HI_GOLD, + CANDELABRUM_OF_INVOCATION), +OBJECT(OBJ("Bell of Opening", "silver bell"), + BITS(0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, P_NONE, SILVER), + 0, TOOL_CLASS, 0, 0, 10, 5000, 0, 0, 0, 0, 50, HI_SILVER, + BELL_OF_OPENING), +#undef TOOL +#undef WEPTOOL + +/* Comestibles ... */ +#define FOOD(name, prob, delay, wt, unk, tin, nutrition, color, sn) \ + OBJECT(OBJ(name, NoDes), \ + BITS(1, 1, unk, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, tin), 0, \ + FOOD_CLASS, prob, delay, wt, nutrition / 20 + 5, 0, 0, 0, 0, \ + nutrition, color, sn) +/* All types of food (except tins & corpses) must have a delay of at least 1. + * Delay on corpses is computed and is weight dependant. + * Domestic pets prefer tripe rations above all others. + * Fortune cookies can be read, using them up without ingesting them. + * Carrots improve your vision. + * +0 tins contain monster meat. + * +1 tins (of spinach) make you stronger (like Popeye). + * Meatballs/sticks/rings are only created from objects via stone to flesh. + */ +/* meat */ +FOOD("tripe ration", 140, 2, 10, 0, FLESH, 200, CLR_BROWN, + TRIPE_RATION), +FOOD("corpse", 0, 1, 0, 0, FLESH, 0, CLR_BROWN, + CORPSE), +FOOD("egg", 85, 1, 1, 1, FLESH, 80, CLR_WHITE, + EGG), +FOOD("meatball", 0, 1, 1, 0, FLESH, 5, CLR_BROWN, + MEATBALL), +FOOD("meat stick", 0, 1, 1, 0, FLESH, 5, CLR_BROWN, + MEAT_STICK), +FOOD("huge chunk of meat", 0, 20,400, 0, FLESH,2000, CLR_BROWN, + HUGE_CHUNK_OF_MEAT), +/* special case because it's not mergable */ +OBJECT(OBJ("meat ring", NoDes), + BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FLESH), + 0, FOOD_CLASS, 0, 1, 5, 1, 0, 0, 0, 0, 5, CLR_BROWN, MEAT_RING), +/* pudding 'corpses' will turn into these and combine; + must be in same order as the pudding monsters */ +FOOD("glob of gray ooze", 0, 2, 20, 0, FLESH, 20, CLR_GRAY, + GLOB_OF_GRAY_OOZE), +FOOD("glob of brown pudding", 0, 2, 20, 0, FLESH, 20, CLR_BROWN, + GLOB_OF_BROWN_PUDDING), +FOOD("glob of green slime", 0, 2, 20, 0, FLESH, 20, CLR_GREEN, + GLOB_OF_GREEN_SLIME), +FOOD("glob of black pudding", 0, 2, 20, 0, FLESH, 20, CLR_BLACK, + GLOB_OF_BLACK_PUDDING), + +/* fruits & veggies */ +FOOD("kelp frond", 0, 1, 1, 0, VEGGY, 30, CLR_GREEN, KELP_FROND), +FOOD("eucalyptus leaf", 3, 1, 1, 0, VEGGY, 30, CLR_GREEN, + EUCALYPTUS_LEAF), +FOOD("apple", 15, 1, 2, 0, VEGGY, 50, CLR_RED, APPLE), +FOOD("orange", 10, 1, 2, 0, VEGGY, 80, CLR_ORANGE, ORANGE), +FOOD("pear", 10, 1, 2, 0, VEGGY, 50, CLR_BRIGHT_GREEN, + PEAR), +FOOD("melon", 10, 1, 5, 0, VEGGY, 100, CLR_BRIGHT_GREEN, + MELON), +FOOD("banana", 10, 1, 2, 0, VEGGY, 80, CLR_YELLOW, BANANA), +FOOD("carrot", 15, 1, 2, 0, VEGGY, 50, CLR_ORANGE, CARROT), +FOOD("sprig of wolfsbane", 7, 1, 1, 0, VEGGY, 40, CLR_GREEN, + SPRIG_OF_WOLFSBANE), +FOOD("clove of garlic", 7, 1, 1, 0, VEGGY, 40, CLR_WHITE, CLOVE_OF_GARLIC), +/* name of slime mold is changed based on player's OPTION=fruit:something + and bones data might have differently named ones from prior games */ +FOOD("slime mold", 75, 1, 5, 0, VEGGY, 250, HI_ORGANIC, SLIME_MOLD), + +/* people food */ +FOOD("lump of royal jelly", 0, 1, 2, 0, VEGGY, 200, CLR_YELLOW, + LUMP_OF_ROYAL_JELLY), +FOOD("cream pie", 25, 1, 10, 0, VEGGY, 100, CLR_WHITE, CREAM_PIE), +FOOD("candy bar", 13, 1, 2, 0, VEGGY, 100, CLR_BROWN, CANDY_BAR), +FOOD("fortune cookie", 55, 1, 1, 0, VEGGY, 40, CLR_YELLOW, + FORTUNE_COOKIE), +FOOD("pancake", 25, 2, 2, 0, VEGGY, 200, CLR_YELLOW, PANCAKE), +FOOD("lembas wafer", 20, 2, 5, 0, VEGGY, 800, CLR_WHITE, + LEMBAS_WAFER), +FOOD("cram ration", 20, 3, 15, 0, VEGGY, 600, HI_ORGANIC, + CRAM_RATION), +FOOD("food ration", 380, 5, 20, 0, VEGGY, 800, HI_ORGANIC, + FOOD_RATION), +FOOD("K-ration", 0, 1, 10, 0, VEGGY, 400, HI_ORGANIC, K_RATION), +FOOD("C-ration", 0, 1, 10, 0, VEGGY, 300, HI_ORGANIC, C_RATION), +/* tins have type specified by obj->spe (+1 for spinach, other implies + flesh; negative specifies preparation method {homemade,boiled,&c}) + and by obj->corpsenm (type of monster flesh) */ +FOOD("tin", 75, 0, 10, 1, METAL, 0, HI_METAL, TIN), +#undef FOOD + +/* potions ... */ +#define POTION(name,desc,mgc,power,prob,cost,color,sn) \ + OBJECT(OBJ(name, desc), \ + BITS(0, 1, 0, 0, mgc, 0, 0, 0, 0, 0, 0, P_NONE, GLASS), \ + power, POTION_CLASS, prob, 0, 20, cost, 0, 0, 0, 0, 10, color, sn) +POTION("gain ability", "ruby", 1, 0, 42, 300, CLR_RED, + POT_GAIN_ABILITY), +POTION("restore ability", "pink", 1, 0, 40, 100, CLR_BRIGHT_MAGENTA, + POT_RESTORE_ABILITY), +POTION("confusion", "orange", 1, CONFUSION, 42, 100, CLR_ORANGE, + POT_CONFUSION), +POTION("blindness", "yellow", 1, BLINDED, 40, 150, CLR_YELLOW, + POT_BLINDNESS), +POTION("paralysis", "emerald", 1, 0, 42, 300, CLR_BRIGHT_GREEN, + POT_PARALYSIS), +POTION("speed", "dark green", 1, FAST, 42, 200, CLR_GREEN, + POT_SPEED), +POTION("levitation", "cyan", 1, LEVITATION, 42, 200, CLR_CYAN, + POT_LEVITATION), +POTION("hallucination", "sky blue", 1, HALLUC, 40, 100, CLR_CYAN, + POT_HALLUCINATION), +POTION("invisibility", "brilliant blue", 1, INVIS, 40, 150, CLR_BRIGHT_BLUE, + POT_INVISIBILITY), +POTION("see invisible", "magenta", 1, SEE_INVIS, 42, 50, CLR_MAGENTA, + POT_SEE_INVISIBLE), +POTION("healing", "purple-red", 1, 0, 57, 100, CLR_MAGENTA, + POT_HEALING), +POTION("extra healing", "puce", 1, 0, 47, 100, CLR_RED, + POT_EXTRA_HEALING), +POTION("gain level", "milky", 1, 0, 20, 300, CLR_WHITE, + POT_GAIN_LEVEL), +POTION("enlightenment", "swirly", 1, 0, 20, 200, CLR_BROWN, + POT_ENLIGHTENMENT), +POTION("monster detection", "bubbly", 1, 0, 40, 150, CLR_WHITE, + POT_MONSTER_DETECTION), +POTION("object detection", "smoky", 1, 0, 42, 150, CLR_GRAY, + POT_OBJECT_DETECTION), +POTION("gain energy", "cloudy", 1, 0, 42, 150, CLR_WHITE, + POT_GAIN_ENERGY), +POTION("sleeping", "effervescent", 1, 0, 42, 100, CLR_GRAY, + POT_SLEEPING), +POTION("full healing", "black", 1, 0, 10, 200, CLR_BLACK, + POT_FULL_HEALING), +POTION("polymorph", "golden", 1, 0, 10, 200, CLR_YELLOW, + POT_POLYMORPH), +POTION("booze", "brown", 0, 0, 42, 50, CLR_BROWN, + POT_BOOZE), +POTION("sickness", "fizzy", 0, 0, 42, 50, CLR_CYAN, + POT_SICKNESS), +POTION("fruit juice", "dark", 0, 0, 42, 50, CLR_BLACK, + POT_FRUIT_JUICE), +POTION("acid", "white", 0, 0, 10, 250, CLR_WHITE, + POT_ACID), +POTION("oil", "murky", 0, 0, 30, 250, CLR_BROWN, + POT_OIL), +/* fixed description + */ +POTION("water", "clear", 0, 0, 92, 100, CLR_CYAN, + POT_WATER), +#undef POTION + +/* scrolls ... */ +#define SCROLL(name,text,mgc,prob,cost,sn) \ + OBJECT(OBJ(name, text), \ + BITS(0, 1, 0, 0, mgc, 0, 0, 0, 0, 0, 0, P_NONE, PAPER), \ + 0, SCROLL_CLASS, prob, 0, 5, cost, 0, 0, 0, 0, 6, \ + HI_PAPER, sn) +SCROLL("enchant armor", "ZELGO MER", 1, 63, 80, + SCR_ENCHANT_ARMOR), +SCROLL("destroy armor", "JUYED AWK YACC", 1, 45, 100, + SCR_DESTROY_ARMOR), +SCROLL("confuse monster", "NR 9", 1, 53, 100, + SCR_CONFUSE_MONSTER), +SCROLL("scare monster", "XIXAXA XOXAXA XUXAXA", 1, 35, 100, + SCR_SCARE_MONSTER), +SCROLL("remove curse", "PRATYAVAYAH", 1, 65, 80, + SCR_REMOVE_CURSE), +SCROLL("enchant weapon", "DAIYEN FOOELS", 1, 80, 60, + SCR_ENCHANT_WEAPON), +SCROLL("create monster", "LEP GEX VEN ZEA", 1, 45, 200, + SCR_CREATE_MONSTER), +SCROLL("taming", "PRIRUTSENIE", 1, 15, 200, + SCR_TAMING), +SCROLL("genocide", "ELBIB YLOH", 1, 15, 300, + SCR_GENOCIDE), +SCROLL("light", "VERR YED HORRE", 1, 90, 50, + SCR_LIGHT), +SCROLL("teleportation", "VENZAR BORGAVVE", 1, 55, 100, + SCR_TELEPORTATION), +SCROLL("gold detection", "THARR", 1, 33, 100, + SCR_GOLD_DETECTION), +SCROLL("food detection", "YUM YUM", 1, 25, 100, + SCR_FOOD_DETECTION), +SCROLL("identify", "KERNOD WEL", 1, 180, 20, + SCR_IDENTIFY), +SCROLL("magic mapping", "ELAM EBOW", 1, 45, 100, + SCR_MAGIC_MAPPING), +SCROLL("amnesia", "DUAM XNAHT", 1, 35, 200, + SCR_AMNESIA), +SCROLL("fire", "ANDOVA BEGARIN", 1, 30, 100, + SCR_FIRE), +SCROLL("earth", "KIRJE", 1, 18, 200, + SCR_EARTH), +SCROLL("punishment", "VE FORBRYDERNE", 1, 15, 300, + SCR_PUNISHMENT), +SCROLL("charging", "HACKEM MUCHE", 1, 15, 300, + SCR_CHARGING), +SCROLL("stinking cloud", "VELOX NEB", 1, 15, 300, + SCR_STINKING_CLOUD), + /* Extra descriptions, shuffled into use at start of new game. + * Code in win/share/tilemap.c depends on SCR_STINKING_CLOUD preceding + * these and on how many of them there are. If a real scroll gets added + * after stinking cloud or the number of extra descriptions changes, + * tilemap.c must be modified to match. + */ +SCROLL(NoDes, "FOOBIE BLETCH", 1, 0, 100, SC01), +SCROLL(NoDes, "TEMOV", 1, 0, 100, SC02), +SCROLL(NoDes, "GARVEN DEH", 1, 0, 100, SC03), +SCROLL(NoDes, "READ ME", 1, 0, 100, SC04), +SCROLL(NoDes, "ETAOIN SHRDLU", 1, 0, 100, SC05), +SCROLL(NoDes, "LOREM IPSUM", 1, 0, 100, SC06), +SCROLL(NoDes, "FNORD", 1, 0, 100, SC07), /* Illuminati */ +SCROLL(NoDes, "KO BATE", 1, 0, 100, SC08), /* Kurd Lasswitz */ +SCROLL(NoDes, "ABRA KA DABRA", 1, 0, 100, SC09), /* traditional incantation */ +SCROLL(NoDes, "ASHPD SODALG", 1, 0, 100, SC10), /* Portal */ +SCROLL(NoDes, "ZLORFIK", 1, 0, 100, SC11), /* Zak McKracken */ +SCROLL(NoDes, "GNIK SISI VLE", 1, 0, 100, SC12), /* Zak McKracken */ +SCROLL(NoDes, "HAPAX LEGOMENON", 1, 0, 100, SC13), +SCROLL(NoDes, "EIRIS SAZUN IDISI", 1, 0, 100, SC14), /* Merseburg Incantations */ +SCROLL(NoDes, "PHOL ENDE WODAN", 1, 0, 100, SC15), /* Merseburg Incantations */ +SCROLL(NoDes, "GHOTI", 1, 0, 100, SC16), /* pronounced as 'fish', + George Bernard Shaw */ +SCROLL(NoDes, "MAPIRO MAHAMA DIROMAT", 1, 0, 100, SC17), /* Wizardry */ +SCROLL(NoDes, "VAS CORP BET MANI", 1, 0, 100, SC18), /* Ultima */ +SCROLL(NoDes, "XOR OTA", 1, 0, 100, SC19), /* Aarne Haapakoski */ +SCROLL(NoDes, "STRC PRST SKRZ KRK", 1, 0, 100, SC20), /* Czech and Slovak + tongue-twister */ + /* These must come last because they have special fixed descriptions. + */ +#ifdef MAIL_STRUCTURES +SCROLL("mail", "stamped", 0, 0, 0, SCR_MAIL), +#endif +SCROLL("blank paper", "unlabeled", 0, 28, 60, SCR_BLANK_PAPER), +#undef SCROLL + +/* spellbooks ... */ + /* Expanding beyond 52 spells would require changes in spellcasting + * or imposition of a limit on number of spells hero can know because + * they are currently assigned successive letters, a-zA-Z, when learned. + * [The existing spell sorting capability could conceivably be extended + * to enable moving spells from beyond Z to within it, bumping others + * out in the process, allowing more than 52 spells be known but keeping + * only 52 be castable at any given time.] + */ +#define SPELL(name,desc,sub,prob,delay,level,mgc,dir,color,sn) \ + OBJECT(OBJ(name, desc), \ + BITS(0, 0, 0, 0, mgc, 0, 0, 0, 0, 0, dir, sub, PAPER), \ + 0, SPBOOK_CLASS, prob, delay, 50, level * 100, \ + 0, 0, 0, level, 20, color, sn) +/* Spellbook description normally refers to book covers (primarily color). + Parchment and vellum would never be used for such, but rather than + eliminate those, finagle their definitions to refer to the pages + rather than the cover. They are made from animal skin (typically of + a goat or sheep) and books using them for pages generally need heavy + covers with straps or clamps to tightly close the book in order to + keep the pages flat. (However, a wooden cover might itself be covered + by a sheet of parchment, making this become less of an exception. Also, + changing the internal composition from paper to leather makes eating a + parchment or vellum spellbook break vegetarian conduct, as it should.) */ +#define PAPER LEATHER /* override enum for use in SPELL() expansion */ +SPELL("dig", "parchment", + P_MATTER_SPELL, 20, 6, 5, 1, RAY, HI_LEATHER, SPE_DIG), +SPELL("magic missile", "vellum", + P_ATTACK_SPELL, 45, 2, 2, 1, RAY, HI_LEATHER, SPE_MAGIC_MISSILE), +#undef PAPER /* revert to normal material */ +SPELL("fireball", "ragged", + P_ATTACK_SPELL, 20, 4, 4, 1, RAY, HI_PAPER, SPE_FIREBALL), +SPELL("cone of cold", "dog eared", + P_ATTACK_SPELL, 10, 7, 4, 1, RAY, HI_PAPER, SPE_CONE_OF_COLD), +SPELL("sleep", "mottled", + P_ENCHANTMENT_SPELL, 49, 1, 1, 1, RAY, HI_PAPER, SPE_SLEEP), +SPELL("finger of death", "stained", + P_ATTACK_SPELL, 5, 10, 7, 1, RAY, HI_PAPER, SPE_FINGER_OF_DEATH), +SPELL("light", "cloth", + P_DIVINATION_SPELL, 45, 1, 1, 1, NODIR, HI_CLOTH, SPE_LIGHT), +SPELL("detect monsters", "leathery", + P_DIVINATION_SPELL, 43, 1, 1, 1, NODIR, HI_LEATHER, + SPE_DETECT_MONSTERS), +SPELL("healing", "white", + P_HEALING_SPELL, 40, 2, 1, 1, IMMEDIATE, CLR_WHITE, + SPE_HEALING), +SPELL("knock", "pink", + P_MATTER_SPELL, 35, 1, 1, 1, IMMEDIATE, CLR_BRIGHT_MAGENTA, + SPE_KNOCK), +SPELL("force bolt", "red", + P_ATTACK_SPELL, 35, 2, 1, 1, IMMEDIATE, CLR_RED, + SPE_FORCE_BOLT), +SPELL("confuse monster", "orange", + P_ENCHANTMENT_SPELL, 30, 2, 2, 1, IMMEDIATE, CLR_ORANGE, + SPE_CONFUSE_MONSTER), +SPELL("cure blindness", "yellow", + P_HEALING_SPELL, 25, 2, 2, 1, IMMEDIATE, CLR_YELLOW, + SPE_CURE_BLINDNESS), +SPELL("drain life", "velvet", + P_ATTACK_SPELL, 10, 2, 2, 1, IMMEDIATE, CLR_MAGENTA, + SPE_DRAIN_LIFE), +SPELL("slow monster", "light green", + P_ENCHANTMENT_SPELL, 30, 2, 2, 1, IMMEDIATE, CLR_BRIGHT_GREEN, + SPE_SLOW_MONSTER), +SPELL("wizard lock", "dark green", + P_MATTER_SPELL, 30, 3, 2, 1, IMMEDIATE, CLR_GREEN, + SPE_WIZARD_LOCK), +SPELL("create monster", "turquoise", + P_CLERIC_SPELL, 35, 3, 2, 1, NODIR, CLR_BRIGHT_CYAN, + SPE_CREATE_MONSTER), +SPELL("detect food", "cyan", + P_DIVINATION_SPELL, 30, 3, 2, 1, NODIR, CLR_CYAN, + SPE_DETECT_FOOD), +SPELL("cause fear", "light blue", + P_ENCHANTMENT_SPELL, 25, 3, 3, 1, NODIR, CLR_BRIGHT_BLUE, + SPE_CAUSE_FEAR), +SPELL("clairvoyance", "dark blue", + P_DIVINATION_SPELL, 15, 3, 3, 1, NODIR, CLR_BLUE, + SPE_CLAIRVOYANCE), +SPELL("cure sickness", "indigo", + P_HEALING_SPELL, 32, 3, 3, 1, NODIR, CLR_BLUE, + SPE_CURE_SICKNESS), +SPELL("charm monster", "magenta", + P_ENCHANTMENT_SPELL, 20, 3, 3, 1, IMMEDIATE, CLR_MAGENTA, + SPE_CHARM_MONSTER), +SPELL("haste self", "purple", + P_ESCAPE_SPELL, 33, 4, 3, 1, NODIR, CLR_MAGENTA, + SPE_HASTE_SELF), +SPELL("detect unseen", "violet", + P_DIVINATION_SPELL, 20, 4, 3, 1, NODIR, CLR_MAGENTA, + SPE_DETECT_UNSEEN), +SPELL("levitation", "tan", + P_ESCAPE_SPELL, 20, 4, 4, 1, NODIR, CLR_BROWN, + SPE_LEVITATION), +SPELL("extra healing", "plaid", + P_HEALING_SPELL, 27, 5, 3, 1, IMMEDIATE, CLR_GREEN, + SPE_EXTRA_HEALING), +SPELL("restore ability", "light brown", + P_HEALING_SPELL, 25, 5, 4, 1, NODIR, CLR_BROWN, + SPE_RESTORE_ABILITY), +SPELL("invisibility", "dark brown", + P_ESCAPE_SPELL, 25, 5, 4, 1, NODIR, CLR_BROWN, + SPE_INVISIBILITY), +SPELL("detect treasure", "gray", + P_DIVINATION_SPELL, 20, 5, 4, 1, NODIR, CLR_GRAY, + SPE_DETECT_TREASURE), +SPELL("remove curse", "wrinkled", + P_CLERIC_SPELL, 25, 5, 3, 1, NODIR, HI_PAPER, + SPE_REMOVE_CURSE), +SPELL("magic mapping", "dusty", + P_DIVINATION_SPELL, 18, 7, 5, 1, NODIR, HI_PAPER, + SPE_MAGIC_MAPPING), +SPELL("identify", "bronze", + P_DIVINATION_SPELL, 20, 6, 3, 1, NODIR, HI_COPPER, + SPE_IDENTIFY), +SPELL("turn undead", "copper", + P_CLERIC_SPELL, 16, 8, 6, 1, IMMEDIATE, HI_COPPER, + SPE_TURN_UNDEAD), +SPELL("polymorph", "silver", + P_MATTER_SPELL, 10, 8, 6, 1, IMMEDIATE, HI_SILVER, + SPE_POLYMORPH), +SPELL("teleport away", "gold", + P_ESCAPE_SPELL, 15, 6, 6, 1, IMMEDIATE, HI_GOLD, + SPE_TELEPORT_AWAY), +SPELL("create familiar", "glittering", + P_CLERIC_SPELL, 10, 7, 6, 1, NODIR, CLR_WHITE, + SPE_CREATE_FAMILIAR), +SPELL("cancellation", "shining", + P_MATTER_SPELL, 15, 8, 7, 1, IMMEDIATE, CLR_WHITE, + SPE_CANCELLATION), +SPELL("protection", "dull", + P_CLERIC_SPELL, 18, 3, 1, 1, NODIR, HI_PAPER, + SPE_PROTECTION), +SPELL("jumping", "thin", + P_ESCAPE_SPELL, 20, 3, 1, 1, IMMEDIATE, HI_PAPER, + SPE_JUMPING), +SPELL("stone to flesh", "thick", + P_HEALING_SPELL, 15, 1, 3, 1, IMMEDIATE, HI_PAPER, + SPE_STONE_TO_FLESH), +#if 0 /* DEFERRED */ +/* from slash'em, create a tame critter which explodes when attacking, + damaging adjacent creatures--friend or foe--and dying in the process */ +SPELL("flame sphere", "canvas", + P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR_BROWN, + SPE_FLAME_SPHERE), +SPELL("freeze sphere", "hardcover", + P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR_BROWN, + SPE_FREEZE_SPHERE), +#endif +/* books with fixed descriptions + */ +SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER, SPE_BLANK_PAPER), +/* tribute book for 3.6 */ +OBJECT(OBJ("novel", "paperback"), + BITS(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, PAPER), + 0, SPBOOK_CLASS, 1, 0, 0, 20, 0, 0, 0, 1, 20, CLR_BRIGHT_BLUE, + SPE_NOVEL), +/* a special, one of a kind, spellbook */ +OBJECT(OBJ("Book of the Dead", "papyrus"), + BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, P_NONE, PAPER), + 0, SPBOOK_CLASS, 0, 0, 20, 10000, 0, 0, 0, 7, 20, HI_PAPER, + SPE_BOOK_OF_THE_DEAD), +#undef SPELL + +/* wands ... */ +#define WAND(name,typ,prob,cost,mgc,dir,metal,color,sn) \ + OBJECT(OBJ(name, typ), \ + BITS(0, 0, 1, 0, mgc, 1, 0, 0, 0, 0, dir, P_NONE, metal), \ + 0, WAND_CLASS, prob, 0, 7, cost, 0, 0, 0, 0, 30, color, sn) +WAND("light", "glass", 95, 100, 1, NODIR, GLASS, HI_GLASS, + WAN_LIGHT), +WAND("secret door detection", + "balsa", 50, 150, 1, NODIR, WOOD, HI_WOOD, + WAN_SECRET_DOOR_DETECTION), +WAND("enlightenment", "crystal", 15, 150, 1, NODIR, GLASS, HI_GLASS, + WAN_ENLIGHTENMENT), +WAND("create monster", "maple", 45, 200, 1, NODIR, WOOD, HI_WOOD, + WAN_CREATE_MONSTER), +WAND("wishing", "pine", 5, 500, 1, NODIR, WOOD, HI_WOOD, + WAN_WISHING), +WAND("nothing", "oak", 25, 100, 0, IMMEDIATE, WOOD, HI_WOOD, + WAN_NOTHING), +WAND("striking", "ebony", 75, 150, 1, IMMEDIATE, WOOD, HI_WOOD, + WAN_STRIKING), +WAND("make invisible", "marble", 45, 150, 1, IMMEDIATE, MINERAL, HI_MINERAL, + WAN_MAKE_INVISIBLE), +WAND("slow monster", "tin", 50, 150, 1, IMMEDIATE, METAL, HI_METAL, + WAN_SLOW_MONSTER), +WAND("speed monster", "brass", 50, 150, 1, IMMEDIATE, COPPER, HI_COPPER, + WAN_SPEED_MONSTER), +WAND("undead turning", "copper", 50, 150, 1, IMMEDIATE, COPPER, HI_COPPER, + WAN_UNDEAD_TURNING), +WAND("polymorph", "silver", 45, 200, 1, IMMEDIATE, SILVER, HI_SILVER, + WAN_POLYMORPH), +WAND("cancellation", "platinum", 45, 200, 1, IMMEDIATE, PLATINUM, CLR_WHITE, + WAN_CANCELLATION), +WAND("teleportation", "iridium", 45, 200, 1, IMMEDIATE, METAL, + CLR_BRIGHT_CYAN, WAN_TELEPORTATION), +WAND("opening", "zinc", 25, 150, 1, IMMEDIATE, METAL, HI_METAL, + WAN_OPENING), +WAND("locking", "aluminum", 25, 150, 1, IMMEDIATE, METAL, HI_METAL, + WAN_LOCKING), +WAND("probing", "uranium", 30, 150, 1, IMMEDIATE, METAL, HI_METAL, + WAN_PROBING), +WAND("digging", "iron", 55, 150, 1, RAY, IRON, HI_METAL, + WAN_DIGGING), +WAND("magic missile", "steel", 50, 150, 1, RAY, IRON, HI_METAL, + WAN_MAGIC_MISSILE), +WAND("fire", "hexagonal", 40, 175, 1, RAY, IRON, HI_METAL, + WAN_FIRE), +WAND("cold", "short", 40, 175, 1, RAY, IRON, HI_METAL, + WAN_COLD), +WAND("sleep", "runed", 50, 175, 1, RAY, IRON, HI_METAL, + WAN_SLEEP), +WAND("death", "long", 5, 500, 1, RAY, IRON, HI_METAL, + WAN_DEATH), +WAND("lightning", "curved", 40, 175, 1, RAY, IRON, HI_METAL, + WAN_LIGHTNING), +/* extra descriptions, shuffled into use at start of new game */ +WAND(NoDes, "forked", 0, 150, 1, 0, WOOD, HI_WOOD, WAN1), +WAND(NoDes, "spiked", 0, 150, 1, 0, IRON, HI_METAL, WAN2), +WAND(NoDes, "jeweled", 0, 150, 1, 0, IRON, HI_MINERAL, WAN3), +#undef WAND + +/* coins ... - so far, gold is all there is */ +#define COIN(name,prob,metal,worth,sn) \ + OBJECT(OBJ(name, NoDes), \ + BITS(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, metal), \ + 0, COIN_CLASS, prob, 0, 1, worth, 0, 0, 0, 0, 0, HI_GOLD, sn) +COIN("gold piece", 1000, GOLD, 1, GOLD_PIECE), +#undef COIN + +/* gems ... - includes stones and rocks but not boulders */ +#define GEM(name,desc,prob,wt,gval,nutr,mohs,glass,color,sn) \ + OBJECT(OBJ(name, desc), \ + BITS(0, 1, 0, 0, 0, 0, 0, 0, 0, \ + HARDGEM(mohs), 0, -P_SLING, glass), \ + 0, GEM_CLASS, prob, 0, 1, gval, 3, 3, 0, 0, nutr, color, sn) +#define ROCK(name,desc,kn,prob,wt,gval,sdam,ldam,mgc,nutr,mohs,glass,color,sn) \ + OBJECT(OBJ(name, desc), \ + BITS(kn, 1, 0, 0, mgc, 0, 0, 0, 0, \ + HARDGEM(mohs), 0, -P_SLING, glass), \ + 0, GEM_CLASS, prob, 0, wt, gval, sdam, ldam, 0, 0, nutr, color, sn) +GEM("dilithium crystal", "white", 2, 1, 4500, 15, 5, GEMSTONE, CLR_WHITE, + DILITHIUM_CRYSTAL), +GEM("diamond", "white", 3, 1, 4000, 15, 10, GEMSTONE, CLR_WHITE, + DIAMOND), +GEM("ruby", "red", 4, 1, 3500, 15, 9, GEMSTONE, CLR_RED, + RUBY), +GEM("jacinth", "orange", 3, 1, 3250, 15, 9, GEMSTONE, CLR_ORANGE, + JACINTH), +GEM("sapphire", "blue", 4, 1, 3000, 15, 9, GEMSTONE, CLR_BLUE, + SAPPHIRE), +GEM("black opal", "black", 3, 1, 2500, 15, 8, GEMSTONE, CLR_BLACK, + BLACK_OPAL), +GEM("emerald", "green", 5, 1, 2500, 15, 8, GEMSTONE, CLR_GREEN, + EMERALD), +GEM("turquoise", "green", 6, 1, 2000, 15, 6, GEMSTONE, CLR_GREEN, + TURQUOISE), +GEM("citrine", "yellow", 4, 1, 1500, 15, 6, GEMSTONE, CLR_YELLOW, + CITRINE), +GEM("aquamarine", "green", 6, 1, 1500, 15, 8, GEMSTONE, CLR_GREEN, + AQUAMARINE), +GEM("amber", "yellowish brown", 8, 1, 1000, 15, 2, GEMSTONE, CLR_BROWN, + AMBER), +GEM("topaz", "yellowish brown", 10, 1, 900, 15, 8, GEMSTONE, CLR_BROWN, + TOPAZ), +GEM("jet", "black", 6, 1, 850, 15, 7, GEMSTONE, CLR_BLACK, + JET), +GEM("opal", "white", 12, 1, 800, 15, 6, GEMSTONE, CLR_WHITE, + OPAL), +GEM("chrysoberyl", "yellow", 8, 1, 700, 15, 5, GEMSTONE, CLR_YELLOW, + CHRYSOBERYL), +GEM("garnet", "red", 12, 1, 700, 15, 7, GEMSTONE, CLR_RED, + GARNET), +GEM("amethyst", "violet", 14, 1, 600, 15, 7, GEMSTONE, CLR_MAGENTA, + AMETHYST), +GEM("jasper", "red", 15, 1, 500, 15, 7, GEMSTONE, CLR_RED, + JASPER), +GEM("fluorite", "violet", 15, 1, 400, 15, 4, GEMSTONE, CLR_MAGENTA, + FLUORITE), +GEM("obsidian", "black", 9, 1, 200, 15, 6, GEMSTONE, CLR_BLACK, + OBSIDIAN), +GEM("agate", "orange", 12, 1, 200, 15, 6, GEMSTONE, CLR_ORANGE, + AGATE), +GEM("jade", "green", 10, 1, 300, 15, 6, GEMSTONE, CLR_GREEN, + JADE), +GEM("worthless piece of white glass", "white", + 77, 1, 0, 6, 5, GLASS, CLR_WHITE, WORTHLESS_WHITE_GLASS), +GEM("worthless piece of blue glass", "blue", + 77, 1, 0, 6, 5, GLASS, CLR_BLUE, WORTHLESS_BLUE_GLASS), +GEM("worthless piece of red glass", "red", + 77, 1, 0, 6, 5, GLASS, CLR_RED, WORTHLESS_RED_GLASS), +GEM("worthless piece of yellowish brown glass", "yellowish brown", + 77, 1, 0, 6, 5, GLASS, CLR_BROWN, WORTHLESS_YELLOWISH_BROWN_GLASS), +GEM("worthless piece of orange glass", "orange", + 76, 1, 0, 6, 5, GLASS, CLR_ORANGE, WORTHLESS_ORANGE_GLASS), +GEM("worthless piece of yellow glass", "yellow", + 77, 1, 0, 6, 5, GLASS, CLR_YELLOW, WORTHLESS_YELLOW_GLASS), +GEM("worthless piece of black glass", "black", + 76, 1, 0, 6, 5, GLASS, CLR_BLACK, WORTHLESS_BLACK_GLASS), +GEM("worthless piece of green glass", "green", + 77, 1, 0, 6, 5, GLASS, CLR_GREEN, WORTHLESS_GREEN_GLASS), +GEM("worthless piece of violet glass", "violet", + 77, 1, 0, 6, 5, GLASS, CLR_MAGENTA, WORTHLESS_VIOLET_GLASS), + +/* Placement note: there is a wishable subrange for + * "gray stones" in the o_ranges[] array in objnam.c + * that is currently everything between luckstones and flint + * (inclusive). + */ +ROCK("luckstone", "gray", 0, 10, 10, 60, 3, 3, 1, 10, 7, MINERAL, CLR_GRAY, + LUCKSTONE), +ROCK("loadstone", "gray", 0, 10, 500, 1, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY, + LOADSTONE), +ROCK("touchstone", "gray", 0, 8, 10, 45, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY, + TOUCHSTONE), +ROCK("flint", "gray", 0, 10, 10, 1, 6, 6, 0, 10, 7, MINERAL, CLR_GRAY, + FLINT), +ROCK("rock", NoDes, 1, 100, 10, 0, 3, 3, 0, 10, 7, MINERAL, CLR_GRAY, + ROCK), +#undef GEM +#undef ROCK + +/* miscellaneous ... */ +/* Note: boulders and rocks are not normally created at random; the + * probabilities only come into effect when you try to polymorph them. + * Boulders weigh more than MAX_CARR_CAP; statues use corpsenm to take + * on a specific type and may act as containers (both affect weight). + */ +OBJECT(OBJ("boulder", NoDes), + BITS(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, P_NONE, MINERAL), 0, + ROCK_CLASS, 100, 0, 6000, 0, 20, 20, 0, 0, 2000, HI_MINERAL, BOULDER), +OBJECT(OBJ("statue", NoDes), + BITS(1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, P_NONE, MINERAL), 0, + ROCK_CLASS, 900, 0, 2500, 0, 20, 20, 0, 0, 2500, CLR_WHITE, STATUE), + +OBJECT(OBJ("heavy iron ball", NoDes), + BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, WHACK, P_NONE, IRON), 0, + BALL_CLASS, 1000, 0, 480, 10, 25, 25, 0, 0, 200, HI_METAL, + HEAVY_IRON_BALL), + /* +d4 when "very heavy" */ +OBJECT(OBJ("iron chain", NoDes), + BITS(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, WHACK, P_NONE, IRON), 0, + CHAIN_CLASS, 1000, 0, 120, 0, 4, 4, 0, 0, 200, HI_METAL, IRON_CHAIN), + /* +1 both l & s */ + +/* Venom is normally a transitory missile (spit by various creatures) + * but can be wished for in wizard mode so could occur in bones data. + */ +OBJECT(OBJ("splash of blinding venom", "splash of venom"), + BITS(0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, P_NONE, LIQUID), 0, + VENOM_CLASS, 500, 0, 1, 0, 0, 0, 0, 0, 0, HI_ORGANIC, BLINDING_VENOM), +OBJECT(OBJ("splash of acid venom", "splash of venom"), + BITS(0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, P_NONE, LIQUID), 0, + VENOM_CLASS, 500, 0, 1, 0, 6, 6, 0, 0, 0, HI_ORGANIC, ACID_VENOM), + /* +d6 small or large */ + +#if defined(OBJECTS_DESCR_INIT) || defined(OBJECTS_INIT) +/* fencepost, the deadly Array Terminator -- name [1st arg] *must* be NULL */ +OBJECT(OBJ(NoDes, NoDes), + BITS(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, 0), 0, + ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) +#undef BITS +#undef COLOR_FIELD +#endif + +#undef OBJ +#undef OBJECT +#undef HARDGEM +#undef NoDes + +/*objects.c*/ diff --git a/include/patchlevel.h b/include/patchlevel.h index 8dd7a21fb..f0df3bf40 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -39,7 +39,8 @@ #define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2021" #define COPYRIGHT_BANNER_B \ " By Stichting Mathematisch Centrum and M. Stephenson." -/* COPYRIGHT_BANNER_C is generated by makedefs into date.h */ +/* nomakedefs.copyright_banner_c is generated at runtime */ +#define COPYRIGHT_BANNER_C nomakedefs.copyright_banner_c #define COPYRIGHT_BANNER_D " See license for details." /* diff --git a/include/permonst.h b/include/permonst.h index 0a017c68a..22a95d295 100644 --- a/include/permonst.h +++ b/include/permonst.h @@ -66,6 +66,13 @@ struct permonst { extern NEARDATA struct permonst mons[]; /* the master list of monster types */ +enum monnums { +#define MONS_ENUM +#include "monsters.h" +#undef MONS_ENUM + NUMMONS +}; + #define VERY_SLOW 3 #define SLOW_SPEED 9 #define NORMAL_SPEED 12 /* movement rates */ @@ -82,4 +89,5 @@ extern NEARDATA struct permonst mons[]; /* the master list of monster types */ #define pmname(pm,g) ((((g) == MALE || (g) == FEMALE) && (pm)->pmnames[g]) \ ? (pm)->pmnames[g] : (pm)->pmnames[NEUTRAL]) #endif + #endif /* PERMONST_H */ diff --git a/include/youprop.h b/include/youprop.h index ff26d3e03..1cb1e337f 100644 --- a/include/youprop.h +++ b/include/youprop.h @@ -8,7 +8,6 @@ #include "prop.h" #include "permonst.h" #include "mondata.h" -#include "pm.h" /* KMH, intrinsics patch. * Reorganized and rewritten for >32-bit properties. diff --git a/src/.gitignore b/src/.gitignore index bc2906c83..bd8ac3b70 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -12,4 +12,4 @@ graphicschk nhdat o nhdat* - +date.nmk diff --git a/src/allmain.c b/src/allmain.c index 1363915ec..47eefbb34 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -28,6 +28,7 @@ early_init(void) objects_globals_init(); monst_globals_init(); sys_early_init(); + runtime_info_init(); } static void @@ -803,6 +804,9 @@ static const struct early_opt earlyopts[] = { {ARG_DEBUG, "debug", 5, TRUE}, {ARG_VERSION, "version", 4, TRUE}, {ARG_SHOWPATHS, "showpaths", 9, FALSE}, +#ifndef NODUMPENUMS + {ARG_DUMPENUMS, "dumpenums", 9, FALSE}, +#endif #ifdef WIN32 {ARG_WINDOWS, "windows", 4, TRUE}, #endif @@ -881,6 +885,12 @@ argcheck(int argc, char *argv[], enum earlyarg e_arg) case ARG_SHOWPATHS: { return 2; } +#ifndef NODUMPENUMS + case ARG_DUMPENUMS: { + dump_enums(); + return 2; + } +#endif #ifdef WIN32 case ARG_WINDOWS: { if (extended_opt) { @@ -953,4 +963,59 @@ debug_fields(const char *opts) #endif return; } + +#ifndef NODUMPENUMS +void +dump_enums(void) +{ + int i, j; + enum enum_dumps { + monsters_enum, + objects_enum, + objects_misc_enum, + NUM_ENUM_DUMPS + }; + static const char *titles[NUM_ENUM_DUMPS] = + { "monnums", "objects_nums" , "misc_object_nums" }; + struct enum_dump { + int val; + const char *nm; + }; + +#define DUMP_ENUMS + struct enum_dump monsdump[] = { +#include "monsters.h" + { NUMMONS, "NUMMONS" }, + }; + struct enum_dump objdump[] = { +#include "objects.h" + { NUM_OBJECTS, "NUM_OBJECTS" }, + }; +#undef DUMP_ENUMS + + struct enum_dump omdump[] = { + { LAST_GEM, "LAST_GEM" }, + { NUM_GLASS_GEMS, "NUM_GLASS_GEMS" }, + { MAXSPELL, "MAXSPELL" }, + }; + struct enum_dump *ed[NUM_ENUM_DUMPS] = { monsdump, objdump, omdump }; + static const char *pfx[NUM_ENUM_DUMPS] = { "PM_", "", "" }; + int szd[NUM_ENUM_DUMPS] = { SIZE(monsdump), SIZE(objdump), SIZE(omdump) }; + + for (i = 0; i < NUM_ENUM_DUMPS; ++ i) { + raw_printf("enum %s = {", titles[i]); + for (j = 0; j < szd[i]; ++j) { + raw_printf(" %s%s = %i%s", + (j == szd[i] - 1) ? "" : pfx[i], + ed[i]->nm, + ed[i]->val, + (j == szd[i] - 1) ? "" : ","); + ed[i]++; + } + raw_print("};"); + raw_print(""); + } + raw_print(""); +} +#endif /* NODUMPENUMS */ /*allmain.c*/ diff --git a/src/date.c b/src/date.c new file mode 100644 index 000000000..649391f3d --- /dev/null +++ b/src/date.c @@ -0,0 +1,144 @@ +/* NetHack 3.7 date.c $NHDT-Date: 1608933420 2020/12/25 21:57:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.17 $ */ +/* Copyright (c) Michael Allison, 2021. */ +/* NetHack may be freely redistributed. See license for details. */ + +#include "config.h" + +/* these are in extern.h but we don't include hack.h */ +void populate_nomakedefs(struct version_info *); +void free_nomakedefs(void); + +#define Snprintf(str, size, ...) \ + nh_snprintf(__func__, __LINE__, str, size, __VA_ARGS__) +extern void nh_snprintf(const char *func, int line, char *str, size_t size, + const char *fmt, ...); +extern char *mdlib_version_string(char *, const char *); +extern char *version_id_string(char *, int, const char *); +extern char *bannerc_string(char *, int, const char *); +extern int case_insensitive_comp(const char *, const char *); + +struct nomakedefs_s nomakedefs = { + /* https://groups.google.com/forum/#!original/ + comp.sources.games/91SfKYg_xzI/dGnR3JnspFkJ */ + "Tue, 28-Jul-87 13:18:57 EDT", + "Version 1.0, built Jul 28 13:18:57 1987.", + (const char *) 0, /* git_sha */ + (const char *) 0, /* git_branch */ + "1.0.0-0", + "NetHack Version 1.0.0-0 - last build Tue Jul 28 13:18:57 1987.", + 0x01010000UL, + 0x00000000UL, + 0x00000000UL, + 0x00000000UL, + 0x00000000UL, + 0x00000000UL, + 554476737UL, +}; + +#if defined(__DATE__) && defined(__TIME__) + +#define extract_field(t,s,n,z) \ + do { \ + for (i = 0; i < n; ++i) \ + t[i] = s[i + z]; \ + t[i] = '\0'; \ + } while (0) + +void +populate_nomakedefs(struct version_info *version) +{ + int i; + char tmpbuf1[BUFSZ], tmpbuf2[BUFSZ], *strp; + const char *mth[] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + struct tm t = {0}; + time_t timeresult; + /* + * In a cross-compiled environment, you can't execute + * the target binaries during the build, so we can't + * use makedefs to write the values of the build + * date and time to a file for retrieval. Not for + * information meaningful to the target execution + * environment. + * + * How can we capture the build date/time of the target + * binaries in such a situation? We need to rely on the + * cross-compiler itself to do it for us during the + * cross-compile. + * + * To that end, we are going to make use of the + * following pre-defined preprocessor macros for this: + * gcc, msvc, clang __DATE__ "Feb 12 1996" + * gcc, msvc, clang __TIME__ "23:59:01" + * + */ + /* if (sizeof __DATE__ + sizeof __TIME__ + sizeof "123" < + sizeof tmpbuf1) */ + Snprintf(tmpbuf1, sizeof tmpbuf1, "%s %s", __DATE__, __TIME__); + /* "Feb 12 1996 23:59:01" + 01234567890123456789 */ + if ((int) strlen(tmpbuf1) == 20) { + extract_field(tmpbuf2, tmpbuf1, 4, 7); /* year */ + t.tm_year = atoi(tmpbuf2) - 1900; + extract_field(tmpbuf2, tmpbuf1, 3, 0); /* mon */ + for (i = 0; i < SIZE(mth); ++i) + if (!case_insensitive_comp(tmpbuf2, mth[i])) { + t.tm_mon = i; + break; + } + extract_field(tmpbuf2, tmpbuf1, 2, 4); /* mday */ + strp = tmpbuf2; + if (*strp == ' ') + strp++; + t.tm_mday = atoi(strp); + extract_field(tmpbuf2, tmpbuf1, 2, 12); /* hour */ + t.tm_hour = atoi(tmpbuf2); + extract_field(tmpbuf2, tmpbuf1, 2, 15); /* min */ + t.tm_min = atoi(tmpbuf2); + extract_field(tmpbuf2, tmpbuf1, 2, 18); /* sec */ + t.tm_sec = atoi(tmpbuf2); + timeresult = mktime(&t); + nomakedefs.build_time = (unsigned long) timeresult; + nomakedefs.build_date = strdup(tmpbuf1); + } + + nomakedefs.version_number = version->incarnation; + nomakedefs.version_features = version->feature_set; +#ifdef MD_IGNORED_FEATURES + nomakedefs.ignored_features = MD_IGNORED_FEATURES; +#endif + nomakedefs.version_sanity1 = version->entity_count; + nomakedefs.version_sanity2 = version->struct_sizes1; + nomakedefs.version_sanity3 = version->struct_sizes2; + nomakedefs.version_string = strdup(mdlib_version_string(tmpbuf2, ".")); + nomakedefs.version_id = strdup(version_id_string(tmpbuf2, sizeof tmpbuf2, + nomakedefs.build_date)); + nomakedefs.copyright_banner_c = strdup(bannerc_string( + tmpbuf2, sizeof tmpbuf2, + nomakedefs.build_date)); +#ifdef NETHACK_GIT_SHA + nomakedefs.git_sha = strdup(NETHACK_GIT_SHA); +#endif +#ifdef NETHACK_GIT_BRANCH + nomakedefs.git_branch = strdup(NETHACK_GIT_BRANCH); +#endif +} + +void +free_nomakedefs(void) +{ + if (nomakedefs.build_date) + free((genericptr_t) nomakedefs.build_date); + if (nomakedefs.version_string) + free((genericptr_t) nomakedefs.version_string); + if (nomakedefs.version_id) + free((genericptr_t) nomakedefs.version_id); + if (nomakedefs.copyright_banner_c) + free((genericptr_t) nomakedefs.copyright_banner_c); +} + +#endif /* __DATE__ && __TIME__ */ + + +/*date.c*/ diff --git a/src/end.c b/src/end.c index f2ee39bee..ac9cfd6d5 100644 --- a/src/end.c +++ b/src/end.c @@ -1763,6 +1763,7 @@ nh_terminate(int status) dlb_cleanup(); l_nhcore_done(); } + free_nomakedefs(); #ifdef VMS /* diff --git a/src/mdlib.c b/src/mdlib.c index b20b53e71..742bc779d 100644 --- a/src/mdlib.c +++ b/src/mdlib.c @@ -48,17 +48,17 @@ #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 /* REPRODUCIBLE_BUILD will change this to TRUE */ static boolean date_via_env = FALSE; -static char *version_string(char *, const char *); -static char *version_id_string(char *, const char *); -static char *bannerc_string(char *, const char *); +char *mdlib_version_string(char *, const char *); +char *version_id_string(char *, int, const char *); +char *bannerc_string(char *, int, const char *); +int case_insensitive_comp(const char *, const char *); static void make_version(void); static char *eos(char *); @@ -71,20 +71,17 @@ static char *mdlib_strsubst(char *, const char *, const char *); static int mkstemp(char *); #endif #endif -#endif /* MAKEDEFS_C || FOR_RUNTIME */ -#if defined(MAKEDEFS_C) || defined(FOR_RUNTIME) || defined(WIN32) \ - || (defined(CROSSCOMPILE_TARGET) && defined(__DATE__) && defined(__TIME__)) -static int case_insensitive_comp(const char *, const char *); -#endif +#endif /* MAKEDEFS_C || FOR_RUNTIME */ #if !defined(MAKEDEFS_C) && defined(WIN32) extern int GUILaunched; #endif -/* these two are in extern.h but we don't include hack.h */ +/* these are in extern.h but we don't include hack.h */ void runtime_info_init(void); const char *do_runtime_info(int *); +void populate_nomakedefs(struct version_info *); void build_options(void); static int count_and_validate_winopts(void); @@ -92,10 +89,6 @@ static void opt_out_words(char *, int *); static void build_savebones_compat_string(void); static int idxopttext, done_runtime_opt_init_once = 0; #define MAXOPT 40 -#if !defined(MAKEDEFS_C) && defined(CROSSCOMPILE_TARGET) \ - && defined(__DATE__) && defined(__TIME__) -static char rttimebuf[MAXOPT]; -#endif static char *opttext[120] = { 0 }; char optbuf[BUFSZ]; static struct version_info version; @@ -257,8 +250,8 @@ make_version(void) #if defined(MAKEDEFS_C) || defined(FOR_RUNTIME) -static char * -version_string(char *outbuf, const char *delim) +char * +mdlib_version_string(char *outbuf, const char *delim) { Sprintf(outbuf, "%d%s%d%s%d", VERSION_MAJOR, delim, VERSION_MINOR, delim, PATCHLEVEL); @@ -268,8 +261,40 @@ version_string(char *outbuf, const char *delim) return outbuf; } -static char * -version_id_string(char *outbuf, const char *build_date) +#define Snprintf(str, size, ...) \ + nh_snprintf(__func__, __LINE__, str, size, __VA_ARGS__) +extern void nh_snprintf(const char *func, int line, char *str, size_t size, + const char *fmt, ...); + +#ifdef MAKEDEFS_C +DISABLE_WARNING_FORMAT_NONLITERAL + +void +nh_snprintf(const char *func UNUSED, int line UNUSED, char *str, size_t size, + const char *fmt, ...) +{ + va_list ap; + int n; + + va_start(ap, fmt); +#ifdef NO_VSNPRINTF + n = vsprintf(str, fmt, ap); +#else + n = vsnprintf(str, size, fmt, ap); +#endif + va_end(ap); + + if (n < 0 || (size_t)n >= size) { /* is there a problem? */ + str[size-1] = 0; /* make sure it is nul terminated */ + } + +} + +RESTORE_WARNING_FORMAT_NONLITERAL +#endif /* MAKEDEFS_C */ + +char * +version_id_string(char *outbuf, int bufsz, const char *build_date) { char subbuf[64], versbuf[64]; char statusbuf[64]; @@ -293,16 +318,16 @@ version_id_string(char *outbuf, const char *build_date) Strcpy(&subbuf[1], PORT_SUB_ID); #endif - Sprintf(outbuf, "%s NetHack%s Version %s%s - last %s %s.", PORT_ID, - subbuf, version_string(versbuf, "."), statusbuf, + Snprintf(outbuf, bufsz, "%s NetHack%s Version %s%s - last %s %s.", PORT_ID, + subbuf, mdlib_version_string(versbuf, "."), statusbuf, date_via_env ? "revision" : "build", build_date); return outbuf; } /* still within #if MAKDEFS_C || FOR_RUNTIME */ -static char * -bannerc_string(char *outbuf, const char *build_date) +char * +bannerc_string(char *outbuf, int bufsz, const char *build_date) { char subbuf[64], versbuf[64]; @@ -319,14 +344,9 @@ bannerc_string(char *outbuf, const char *build_date) #endif #endif - Sprintf(outbuf, " Version %s %s%s, %s %s.", - version_string(versbuf, "."), PORT_ID, subbuf, - date_via_env ? "revised" : "built", &build_date[4]); -#if 0 - Sprintf(outbuf, "%s NetHack%s %s Copyright 1985-%s (built %s)", - PORT_ID, subbuf, version_string(versbuf,"."), RELEASE_YEAR, - &build_date[4]); -#endif + Snprintf(outbuf, bufsz, " Version %s %s%s, %s %s.", + mdlib_version_string(versbuf, "."), PORT_ID, subbuf, + date_via_env ? "revised" : "built", build_date); return outbuf; } @@ -348,27 +368,6 @@ mkstemp(char *template) #endif /* HAS_NO_MKSTEMP */ #endif /* MAKEDEFS_C || FOR_RUNTIME */ -#if defined(MAKEDEFS_C) || defined(FOR_RUNTIME) || defined(WIN32) \ - || (defined(CROSSCOMPILE_TARGET) && defined(__DATE__) && defined(__TIME__)) -static int -case_insensitive_comp(const char *s1, const char *s2) -{ - uchar u1, u2; - - for (;; s1++, s2++) { - u1 = (uchar) *s1; - if (isupper(u1)) - u1 = tolower(u1); - u2 = (uchar) *s2; - if (isupper(u2)) - u2 = tolower(u2); - if (u1 == '\0' || u1 != u2) - break; - } - return u1 - u2; -} -#endif - static char * eos(char *str) { @@ -791,103 +790,33 @@ build_options(void) return; } -#if defined(__DATE__) && defined(__TIME__) -#define extract_field(t,s,n,z) \ - do { \ - for (i = 0; i < n; ++i) \ - t[i] = s[i + z]; \ - t[i] = '\0'; \ - } while (0) -#endif +int +case_insensitive_comp(const char *s1, const char *s2) +{ + uchar u1, u2; + + for (;; s1++, s2++) { + u1 = (uchar) *s1; + if (isupper(u1)) + u1 = tolower(u1); + u2 = (uchar) *s2; + if (isupper(u2)) + u2 = tolower(u2); + if (u1 == '\0' || u1 != u2) + break; + } + return u1 - u2; +} void runtime_info_init(void) { -#if !defined(MAKEDEFS_C) && defined(CROSSCOMPILE_TARGET) \ - && defined(__DATE__) && defined(__TIME__) - int i; - char tmpbuf[BUFSZ], *strp; - const char *mth[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - struct tm t = {0}; - time_t timeresult; -#endif - if (!done_runtime_opt_init_once) { done_runtime_opt_init_once = 1; build_savebones_compat_string(); /* construct the current version number */ make_version(); -#if !defined(MAKEDEFS_C) && defined(CROSSCOMPILE_TARGET) -#if defined(__DATE__) && defined(__TIME__) - /* - * In a cross-compiled environment, you can't execute - * the target binaries during the build, so we can't - * use makedefs to write the values of the build - * date and time to a file for retrieval. Not for - * information meaningful to the target execution - * environment. - * - * How can we capture the build date/time of the target - * binaries in such a situation? We need to rely on the - * cross-compiler itself to do it for us during the - * cross-compile. - * - * To that end, we are going to make use of the - * following pre-defined preprocessor macros for this: - * gcc, msvc, clang __DATE__ "Feb 12 1996" - * gcc, msvc, clang __TIME__ "23:59:01" - * - */ - if (sizeof __DATE__ + sizeof __TIME__ + sizeof "123" < - sizeof rttimebuf) - Sprintf(rttimebuf, "%s %s", __DATE__, __TIME__); - /* "Feb 12 1996 23:59:01" - 01234567890123456789 */ - if ((int) strlen(rttimebuf) == 20) { - extract_field(tmpbuf, rttimebuf, 4, 7); /* year */ - t.tm_year = atoi(tmpbuf) - 1900; - extract_field(tmpbuf, rttimebuf, 3, 0); /* mon */ - for (i = 0; i < SIZE(mth); ++i) - if (!case_insensitive_comp(tmpbuf, mth[i])) { - t.tm_mon = i; - break; - } - extract_field(tmpbuf, rttimebuf, 2, 4); /* mday */ - strp = tmpbuf; - if (*strp == ' ') - strp++; - t.tm_mday = atoi(strp); - extract_field(tmpbuf, rttimebuf, 2, 12); /* hour */ - t.tm_hour = atoi(tmpbuf); - extract_field(tmpbuf, rttimebuf, 2, 15); /* min */ - t.tm_min = atoi(tmpbuf); - extract_field(tmpbuf, rttimebuf, 2, 18); /* sec */ - t.tm_sec = atoi(tmpbuf); - timeresult = mktime(&t); - BUILD_TIME = (unsigned long) timeresult; - BUILD_DATE = rttimebuf; - } -#endif /* __DATE__ && __TIME__ */ - VERSION_NUMBER = version.incarnation; - VERSION_FEATURES = version.feature_set; -#ifdef MD_IGNORED_FEATURES - IGNORED_FEATURES = MD_IGNORED_FEATURES; -#endif - VERSION_SANITY1 = version.entity_count; - VERSION_SANITY2 = version.struct_sizes1; - VERSION_SANITY3 = version.struct_sizes2; - VERSION_STRING = strdup(version_string(tmpbuf, ".")); - VERSION_ID = strdup(version_id_string(tmpbuf, BUILD_DATE)); - COPYRIGHT_BANNER_C = strdup(bannerc_string(tmpbuf, BUILD_DATE)); -#ifdef NETHACK_HOST_GIT_SHA - NETHACK_GIT_SHA = strdup(NETHACK_HOST_GIT_SHA); -#endif -#ifdef NETHACK_HOST_GIT_BRANCH - NETHACK_GIT_BRANCH = strdup(NETHACK_HOST_GIT_BRANCH); -#endif -#endif /* !MAKEDEFS_C && CROSSCOMPILE_TARGET */ + populate_nomakedefs(&version); /* date.c */ idxopttext = 0; build_options(); } @@ -904,7 +833,7 @@ do_runtime_info(int *rtcontext) if (*rtcontext >= 0 && *rtcontext < (MAXOPT - 1)) { retval = opttext[*rtcontext]; *rtcontext += 1; - } + } return retval; } diff --git a/src/monst.c b/src/monst.c index e0a70ad72..6bdb9ad5c 100644 --- a/src/monst.c +++ b/src/monst.c @@ -7,16 +7,6 @@ #include "permonst.h" #include "sym.h" -#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 @@ -29,57 +19,43 @@ #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 NO_ATTK \ + { \ + 0, 0, 0, 0 \ } -#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 WT_ELF 800 +#define WT_DRAGON 4500 + +#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 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) \ } -/* 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). + +#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() */ #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 \ @@ -89,3230 +65,15 @@ a1, a2, a3, a4, a5, a6 \ } -/* - * Rule #1: monsters of a given class are contiguous in the - * mons[] array. - * - * Rule #2: monsters of a given class are presented in ascending - * order of strength. - * - * Rule #3: monster frequency is included in the geno mask; - * the frequency can be from 0 to 7. 0's will also - * be skipped during generation. - * - * Rule #4: monster subclasses (e.g. giants) should be kept - * together, unless it violates Rule 2. NOGEN monsters - * won't violate Rule 2. - * - * Guidelines for color assignment: - * - * * Use the same color for all `growth stages' of a monster (ex. - * little dog/big dog, baby naga/full-grown naga. - * - * * Use colors given in names wherever possible. If the class has `real' - * members with strong color associations, use those. - * - * * Favor `cool' colors for cold-resistant monsters, `warm' ones for - * fire-resistant ones. - * - * * Try to reserve purple (magenta) for powerful `ruler' monsters (queen - * bee, kobold lord, &c.). - * - * * Subject to all these constraints, try to use color to make as many - * distinctions as the / command (that is, within a monster letter - * distinct names should map to distinct colors). - * - * The aim in assigning colors is to be consistent enough so a player can - * become `intuitive' about them, deducing some or all of these rules - * unconsciously. Use your common sense. - */ - -#ifndef SPLITMON_2 -NEARDATA struct permonst mons_init[] = { - /* - * ants - */ - MON("giant ant", S_ANT, LVL(2, 18, 3, 0, 0), (G_GENO | G_SGROUP | 3), - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(10, 10, MS_SILENT, MZ_TINY), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE, 0, - 4, CLR_BROWN), - MON("killer bee", S_ANT, LVL(1, 18, -1, 0, 0), (G_GENO | G_LGROUP | 2), - A(ATTK(AT_STNG, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, - M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_POIS, M2_HOSTILE | M2_FEMALE, 0, - 5, CLR_YELLOW), - MON("soldier ant", S_ANT, LVL(3, 18, 3, 0, 0), (G_GENO | G_SGROUP | 2), - A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_DRST, 3, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(20, 5, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, - M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, - M2_HOSTILE, 0, 6, CLR_BLUE), - MON("fire ant", S_ANT, LVL(3, 18, 3, 10, 0), (G_GENO | G_SGROUP | 1), - A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_FIRE, 2, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(30, 10, MS_SILENT, MZ_TINY), MR_FIRE, MR_FIRE, - M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, M2_HOSTILE, - M3_INFRAVISIBLE, 6, CLR_RED), - MON("giant beetle", S_ANT, LVL(5, 6, 4, 0, 0), (G_GENO | 3), - A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(200, 50, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, - M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE, 0, - 6, CLR_BLACK), - MON("queen bee", S_ANT, LVL(9, 24, -4, 0, 0), (G_GENO | G_NOGEN), - A(ATTK(AT_STNG, AD_DRST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1, 5, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, - M1_ANIMAL | M1_FLY | M1_NOHANDS | M1_OVIPAROUS | M1_POIS, - M2_HOSTILE | M2_FEMALE | M2_PRINCE, 0, 12, HI_LORD), - /* - * blobs - */ - MON("acid blob", S_BLOB, LVL(1, 3, 8, 0, 0), (G_GENO | 2), - A(ATTK(AT_NONE, AD_ACID, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(30, 10, MS_SILENT, MZ_TINY), - MR_SLEEP | MR_POISON | MR_ACID | MR_STONE, MR_STONE, - M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_ACID, - M2_WANDER | M2_NEUTER, 0, 2, CLR_GREEN), - MON("quivering blob", S_BLOB, LVL(5, 1, 8, 0, 0), (G_GENO | 2), - A(ATTK(AT_TUCH, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(200, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, MR_POISON, - M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, - M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 6, CLR_WHITE), - MON("gelatinous cube", S_BLOB, LVL(6, 6, 8, 0, 0), (G_GENO | 2), - A(ATTK(AT_TUCH, AD_PLYS, 2, 4), ATTK(AT_NONE, AD_PLYS, 1, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 150, MS_SILENT, MZ_LARGE), - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_ACID - | MR_STONE, - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP, - M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_OMNIVORE - | M1_ACID, - M2_WANDER | M2_HOSTILE | M2_NEUTER, 0, 8, CLR_CYAN), - /* - * cockatrice - */ - MON("chickatrice", S_COCKATRICE, LVL(4, 4, 8, 30, 0), - (G_GENO | G_SGROUP | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 2), ATTK(AT_TUCH, AD_STON, 0, 0), - ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(10, 10, MS_HISS, MZ_TINY), MR_POISON | MR_STONE, - MR_POISON | MR_STONE, M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, - M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN), - MON("cockatrice", S_COCKATRICE, LVL(5, 6, 6, 30, 0), (G_GENO | 5), - A(ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_TUCH, AD_STON, 0, 0), - ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_STONE, - MR_POISON | MR_STONE, - M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE, - M3_INFRAVISIBLE, 8, CLR_YELLOW), - MON("pyrolisk", S_COCKATRICE, LVL(6, 6, 6, 30, 0), (G_GENO | 1), - A(ATTK(AT_GAZE, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(30, 30, MS_HISS, MZ_SMALL), MR_POISON | MR_FIRE, - MR_POISON | MR_FIRE, - M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE | M1_OVIPAROUS, M2_HOSTILE, - M3_INFRAVISIBLE, 8, CLR_RED), - /* - * dogs & other canines - */ - MON("jackal", S_DOG, LVL(0, 12, 7, 0, 0), (G_GENO | G_SGROUP | 3), - A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 1, CLR_BROWN), - MON("fox", S_DOG, LVL(0, 15, 7, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 1, CLR_RED), - MON("coyote", S_DOG, LVL(1, 12, 7, 0, 0), (G_GENO | G_SGROUP | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(300, 250, MS_BARK, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 2, CLR_BROWN), - MON("werejackal", S_DOG, LVL(2, 12, 7, 10, -7), (G_NOGEN | G_NOCORPSE), - A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(300, 250, MS_BARK, MZ_SMALL), MR_POISON, 0, - M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE, - M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN), - MON("little dog", S_DOG, LVL(2, 18, 6, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(150, 150, MS_BARK, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, - 3, HI_DOMESTIC), - MON("dingo", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 5, CLR_YELLOW), - MON("dog", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(400, 200, MS_BARK, MZ_MEDIUM), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, - 5, HI_DOMESTIC), - MON("large dog", S_DOG, LVL(6, 15, 4, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(800, 250, MS_BARK, MZ_MEDIUM), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("wolf", S_DOG, LVL(5, 12, 4, 0, 0), (G_GENO | G_SGROUP | 2), - A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 250, MS_BARK, MZ_MEDIUM), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 6, CLR_BROWN), - MON("werewolf", S_DOG, LVL(5, 12, 4, 20, -7), (G_NOGEN | G_NOCORPSE), - A(ATTK(AT_BITE, AD_WERE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 250, MS_BARK, MZ_MEDIUM), MR_POISON, 0, - M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE, - M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BROWN), - MON("winter wolf cub", S_DOG, LVL(5, 12, 4, 0, -5), - (G_NOHELL | G_GENO | G_SGROUP | 2), - A(ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_BREA, AD_COLD, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(250, 200, MS_BARK, MZ_SMALL), MR_COLD, MR_COLD, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 7, CLR_CYAN), - MON("warg", S_DOG, LVL(7, 12, 4, 0, -5), (G_GENO | G_SGROUP | 2), - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(850, 350, MS_BARK, MZ_MEDIUM), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 8, CLR_BROWN), - MON("winter wolf", S_DOG, LVL(7, 12, 4, 20, 0), (G_NOHELL | G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_COLD, 2, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(700, 300, MS_BARK, MZ_LARGE), MR_COLD, MR_COLD, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, 0, - 9, CLR_CYAN), - MON("hell hound pup", S_DOG, LVL(7, 12, 4, 20, -5), - (G_HELL | G_GENO | G_SGROUP | 1), - A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(200, 200, MS_BARK, MZ_SMALL), MR_FIRE, MR_FIRE, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 9, CLR_RED), - MON("hell hound", S_DOG, LVL(12, 14, 2, 20, 0), (G_HELL | G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BREA, AD_FIRE, 3, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 300, MS_BARK, MZ_MEDIUM), MR_FIRE, MR_FIRE, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, 14, CLR_RED), -#ifdef CHARON - MON("Cerberus", S_DOG, LVL(12, 10, 2, 20, -7), - (G_NOGEN | G_UNIQ | G_HELL), - A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 3, 6), - ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1000, 350, MS_BARK, MZ_LARGE), MR_FIRE, MR_FIRE, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_MALE, - M3_INFRAVISIBLE, 14, CLR_RED), -#endif - /* - * eyes - */ - MON("gas spore", S_EYE, LVL(1, 3, 10, 0, 0), (G_NOCORPSE | G_GENO | 1), - A(ATTK(AT_BOOM, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0, - M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, - M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GRAY), - MON("floating eye", S_EYE, LVL(2, 1, 9, 10, 0), (G_GENO | 5), - A(ATTK(AT_NONE, AD_PLYS, 0, 70), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(10, 10, MS_SILENT, MZ_SMALL), 0, 0, - M1_FLY | M1_AMPHIBIOUS | M1_NOLIMBS | M1_NOHEAD | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 3, CLR_BLUE), - MON("freezing sphere", S_EYE, LVL(6, 13, 4, 0, 0), - (G_NOCORPSE | G_NOHELL | G_GENO | 2), - A(ATTK(AT_EXPL, AD_COLD, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, MR_COLD, - M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS - | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_WHITE), - MON("flaming sphere", S_EYE, LVL(6, 13, 4, 0, 0), - (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_FIRE, 4, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_FIRE, MR_FIRE, - M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS - | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_RED), - MON("shocking sphere", S_EYE, LVL(6, 13, 4, 0, 0), - (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_ELEC, 4, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_ELEC, MR_ELEC, - M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS - | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 10, HI_ZAP), -#if 0 /* not yet implemented */ - MON("beholder", S_EYE, - LVL(6, 3, 4, 0, -10), (G_GENO | 2), - A(ATTK(AT_GAZE, AD_SLOW, 0, 0), ATTK(AT_GAZE, AD_SLEE, 2,25), - ATTK(AT_GAZE, AD_DISN, 0, 0), ATTK(AT_GAZE, AD_STON, 0, 0), - ATTK(AT_GAZE, AD_CNCL, 2, 4), ATTK(AT_BITE, AD_PHYS, 2, 4)), - SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, 0, - M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, - M2_NOPOLY | M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 13, CLR_BROWN), -#endif - /* - * felines - */ - MON("kitten", S_FELINE, LVL(2, 18, 6, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(150, 150, MS_MEW, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER | M2_DOMESTIC, - M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_DOMESTIC), - MON("housecat", S_FELINE, LVL(4, 16, 5, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(200, 200, MS_MEW, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_DOMESTIC, - M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_DOMESTIC), - MON("jaguar", S_FELINE, LVL(4, 15, 6, 0, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, - M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BROWN), - MON("lynx", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 300, MS_GROWL, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, - M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_CYAN), - MON("panther", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), - ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, - M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BLACK), - MON("large cat", S_FELINE, LVL(6, 15, 4, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 2, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(250, 250, MS_MEW, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_STRONG | M2_DOMESTIC, - M3_INFRAVISIBLE | M3_INFRAVISION, 7, HI_DOMESTIC), - MON("tiger", S_FELINE, LVL(6, 12, 6, 0, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), - ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 300, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, - M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_YELLOW), - MON("displacer beast", S_FELINE, LVL(12, 12, -10, 0, -3), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_CLAW, AD_PHYS, 4, 4), - ATTK(AT_BITE, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(750, 400, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 14, CLR_BLUE), - /* - * gremlins and gargoyles - */ - MON("gremlin", S_GREMLIN, LVL(5, 12, 2, 25, -9), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), - ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_CURS, 0, 0), NO_ATTK, - NO_ATTK), - SIZ(100, 20, MS_LAUGH, MZ_SMALL), MR_POISON, MR_POISON, - M1_SWIM | M1_HUMANOID | M1_POIS, M2_STALK, M3_INFRAVISIBLE, - 8, CLR_GREEN), - MON("gargoyle", S_GREMLIN, LVL(6, 10, -4, 0, -9), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), - ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1000, 200, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE, - M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS, M2_HOSTILE | M2_STRONG, - 0, 8, CLR_BROWN), - MON("winged gargoyle", S_GREMLIN, LVL(9, 15, -2, 0, -12), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), - ATTK(AT_BITE, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1200, 300, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE, - M1_FLY | M1_HUMANOID | M1_THICK_HIDE | M1_BREATHLESS | M1_OVIPAROUS, - M2_LORD | M2_HOSTILE | M2_STRONG | M2_MAGIC, 0, 11, HI_LORD), - /* - * humanoids - */ - MON("hobbit", S_HUMANOID, LVL(1, 9, 10, 0, 6), (G_GENO | 2), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 200, MS_HUMANOID, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_GREEN), - MON("dwarf", S_HUMANOID, LVL(2, 6, 10, 10, 4), (G_GENO | 3), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_DWARF | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED), - MON("bugbear", S_HUMANOID, LVL(3, 9, 5, 0, -6), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1250, 250, MS_GROWL, MZ_LARGE), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN), - MON3("dwarf lord", "dwarf lady", "dwarf leader", - S_HUMANOID, LVL(4, 6, 10, 10, 5), (G_GENO | 2), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, - M2_DWARF | M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BLUE), - MON3("dwarf king", "dwarf queen", "dwarf ruler", - S_HUMANOID, LVL(6, 6, 10, 20, 6), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, - M2_DWARF | M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS - | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 8, HI_LORD), - MON("mind flayer", S_HUMANOID, LVL(9, 12, 5, 90, -8), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_TENT, AD_DRIN, 2, 1), - ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), NO_ATTK, - NO_ATTK), - SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE, - M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_MAGENTA), - MON("master mind flayer", S_HUMANOID, LVL(13, 12, 0, 90, -8), - (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TENT, AD_DRIN, 2, 1), - ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), - ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1)), - SIZ(1450, 400, MS_HISS, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_FLY | M1_SEE_INVIS | M1_OMNIVORE, - M2_HOSTILE | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_MAGENTA), - /* - * imps & other minor demons/devils - */ - MON("manes", S_IMP, LVL(1, 3, 7, 0, -7), - (G_GENO | G_LGROUP | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), - ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_SLEEP | MR_POISON, 0, M1_POIS, - M2_HOSTILE | M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED), - MON("homunculus", S_IMP, LVL(2, 12, 6, 10, -7), (G_GENO | 2), - A(ATTK(AT_BITE, AD_SLEE, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(60, 100, MS_SILENT, MZ_TINY), MR_SLEEP | MR_POISON, - MR_SLEEP | MR_POISON, M1_FLY | M1_POIS, M2_STALK, - M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_GREEN), - MON("imp", S_IMP, LVL(3, 12, 2, 20, -7), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(20, 10, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER | M2_STALK, - M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_RED), - MON("lemure", S_IMP, LVL(3, 3, 7, 0, -7), - (G_HELL | G_GENO | G_LGROUP | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(150, 100, MS_SILENT, MZ_MEDIUM), MR_SLEEP | MR_POISON, MR_SLEEP, - M1_POIS | M1_REGEN, M2_HOSTILE | M2_WANDER | M2_STALK | M2_NEUTER, - M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN), - MON("quasit", S_IMP, LVL(3, 15, 2, 20, -7), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_DRDX, 1, 2), ATTK(AT_CLAW, AD_DRDX, 1, 2), - ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(200, 200, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_REGEN, - M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BLUE), - MON("tengu", S_IMP, LVL(6, 13, 5, 30, 7), (G_GENO | 3), - A(ATTK(AT_BITE, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(300, 200, MS_SQAWK, MZ_SMALL), MR_POISON, MR_POISON, - M1_TPORT | M1_TPORT_CNTRL, M2_STALK, M3_INFRAVISIBLE | M3_INFRAVISION, - 7, CLR_CYAN), - /* - * jellies - */ - MON("blue jelly", S_JELLY, LVL(4, 0, 8, 10, 0), (G_GENO | 2), - A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_COLD | MR_POISON, - MR_COLD | MR_POISON, - M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 5, CLR_BLUE), - MON("spotted jelly", S_JELLY, LVL(5, 0, 8, 10, 0), (G_GENO | 1), - A(ATTK(AT_NONE, AD_ACID, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0, - M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_ACID | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 6, CLR_GREEN), - MON("ochre jelly", S_JELLY, LVL(6, 3, 8, 20, 0), (G_GENO | 2), - A(ATTK(AT_ENGL, AD_ACID, 3, 6), ATTK(AT_NONE, AD_ACID, 3, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(50, 20, MS_SILENT, MZ_MEDIUM), MR_ACID | MR_STONE, 0, - M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_ACID | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 8, CLR_BROWN), - /* - * kobolds - */ - MON("kobold", S_KOBOLD, LVL(0, 6, 10, 0, -2), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(400, 100, MS_ORC, MZ_SMALL), MR_POISON, 0, - M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_BROWN), - MON("large kobold", S_KOBOLD, LVL(1, 6, 10, 0, -3), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0, - M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_RED), - MON3("kobold lord", "kobold lady", "kobold leader", - S_KOBOLD, LVL(2, 6, 10, 0, -4), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 200, MS_ORC, MZ_SMALL), MR_POISON, 0, - M1_HUMANOID | M1_POIS | M1_OMNIVORE, - M2_HOSTILE | M2_LORD | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_LORD), - MON("kobold shaman", S_KOBOLD, LVL(2, 6, 6, 10, -4), (G_GENO | 1), - A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0, - M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_MAGIC, - M3_INFRAVISIBLE | M3_INFRAVISION, 4, HI_ZAP), - /* - * leprechauns - */ - MON("leprechaun", S_LEPRECHAUN, LVL(5, 15, 8, 20, 0), (G_GENO | 4), - A(ATTK(AT_CLAW, AD_SGLD, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(60, 30, MS_LAUGH, MZ_TINY), 0, 0, M1_HUMANOID | M1_TPORT, - M2_HOSTILE | M2_GREEDY, M3_INFRAVISIBLE, 4, CLR_GREEN), - /* - * mimics - */ - MON("small mimic", S_MIMIC, LVL(7, 3, 7, 0, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(300, 200, MS_SILENT, MZ_MEDIUM), MR_ACID, 0, - M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL | M1_NOEYES - | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE | M1_CARNIVORE, - M2_HOSTILE, 0, 8, CLR_BROWN), - MON("large mimic", S_MIMIC, LVL(8, 3, 7, 10, 0), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_STCK, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(600, 400, MS_SILENT, MZ_LARGE), MR_ACID, 0, - M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL - | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG, 0, 9, CLR_RED), - MON("giant mimic", S_MIMIC, LVL(9, 3, 7, 20, 0), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_STCK, 3, 6), ATTK(AT_CLAW, AD_STCK, 3, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(800, 500, MS_SILENT, MZ_LARGE), MR_ACID, 0, - M1_CLING | M1_BREATHLESS | M1_AMORPHOUS | M1_HIDE | M1_ANIMAL - | M1_NOEYES | M1_NOHEAD | M1_NOLIMBS | M1_THICK_HIDE - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG, 0, 11, HI_LORD), - /* - * nymphs - */ - MON("wood nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT, - M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_GREEN), - MON("water nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_TPORT | M1_SWIM, M2_HOSTILE | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE, 5, CLR_BLUE), - MON("mountain nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 300, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_TPORT, - M2_HOSTILE | M2_FEMALE | M2_COLLECT, M3_INFRAVISIBLE, 5, CLR_BROWN), - /* - * orcs - */ - MON("goblin", S_ORC, LVL(0, 6, 10, 0, -3), (G_GENO | 2), - A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(400, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_ORC | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 1, CLR_GRAY), - MON("hobgoblin", S_ORC, LVL(1, 9, 10, 0, -4), (G_GENO | 2), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_ORC | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, - 3, CLR_BROWN), - /* plain "orc" for zombie corpses only; not created at random - */ - MON("orc", S_ORC, LVL(1, 9, 10, 0, -3), (G_GENO | G_NOGEN | G_LGROUP), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(850, 150, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_RED), - MON("hill orc", S_ORC, LVL(2, 9, 10, 0, -4), (G_GENO | G_LGROUP | 2), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1000, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_YELLOW), - MON("Mordor orc", S_ORC, LVL(3, 5, 10, 0, -5), (G_GENO | G_LGROUP | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1200, 200, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLUE), - MON("Uruk-hai", S_ORC, LVL(3, 7, 10, 0, -4), (G_GENO | G_LGROUP | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1300, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BLACK), - MON("orc shaman", S_ORC, LVL(3, 9, 5, 10, -5), (G_GENO | 1), - A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1000, 300, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_MAGIC, - M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP), - MON("orc-captain", S_ORC, LVL(5, 5, 10, 0, -5), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1350, 350, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_ORC | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 7, HI_LORD), - /* - * piercers - */ - MON("rock piercer", S_PIERCER, LVL(3, 1, 3, 0, 0), (G_GENO | 4), - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(200, 200, MS_SILENT, MZ_SMALL), 0, 0, - M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE - | M1_NOTAKE, - M2_HOSTILE, 0, 4, CLR_GRAY), - MON("iron piercer", S_PIERCER, LVL(5, 1, 0, 0, 0), (G_GENO | 2), - A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(400, 300, MS_SILENT, MZ_MEDIUM), 0, 0, - M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE - | M1_NOTAKE, - M2_HOSTILE, 0, 6, CLR_CYAN), - MON("glass piercer", S_PIERCER, LVL(7, 1, 0, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(400, 300, MS_SILENT, MZ_MEDIUM), MR_ACID, 0, - M1_CLING | M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_CARNIVORE - | M1_NOTAKE, - M2_HOSTILE, 0, 9, CLR_WHITE), - /* - * quadrupeds - */ - MON("rothe", S_QUADRUPED, LVL(2, 9, 7, 0, 0), (G_GENO | G_SGROUP | 4), - A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3), - ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(400, 100, MS_MOO, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 4, CLR_BROWN), - MON("mumak", S_QUADRUPED, LVL(5, 9, 0, 0, -2), (G_GENO | 1), - A(ATTK(AT_BUTT, AD_PHYS, 4, 12), ATTK(AT_BITE, AD_PHYS, 2, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2500, 500, MS_TRUMPET, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 7, CLR_GRAY), - MON("leocrotta", S_QUADRUPED, LVL(6, 18, 4, 10, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), - ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1200, 500, MS_IMITATE, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, 8, CLR_RED), - MON("wumpus", S_QUADRUPED, LVL(8, 3, 2, 10, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(2500, 500, MS_BURBLE, MZ_LARGE), 0, 0, - M1_CLING | M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 9, CLR_CYAN), - MON("titanothere", S_QUADRUPED, LVL(12, 12, 6, 0, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(2650, 650, MS_SILENT, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 13, CLR_GRAY), - MON("baluchitherium", S_QUADRUPED, LVL(14, 12, 5, 0, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 5, 4), ATTK(AT_CLAW, AD_PHYS, 5, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(3800, 800, MS_SILENT, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 15, CLR_GRAY), - MON("mastodon", S_QUADRUPED, LVL(20, 12, 5, 0, 0), (G_GENO | 1), - A(ATTK(AT_BUTT, AD_PHYS, 4, 8), ATTK(AT_BUTT, AD_PHYS, 4, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(3800, 800, MS_TRUMPET, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_BLACK), - /* - * rodents - */ - MON("sewer rat", S_RODENT, LVL(0, 12, 7, 0, 0), (G_GENO | G_SGROUP | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(20, 12, MS_SQEEK, MZ_TINY), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 1, CLR_BROWN), - MON("giant rat", S_RODENT, LVL(1, 10, 7, 0, 0), (G_GENO | G_SGROUP | 2), - A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(30, 30, MS_SQEEK, MZ_TINY), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - 2, CLR_BROWN), - MON("rabid rat", S_RODENT, LVL(2, 12, 6, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_DRCO, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(30, 5, MS_SQEEK, MZ_TINY), MR_POISON, 0, - M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_CARNIVORE, M2_HOSTILE, - M3_INFRAVISIBLE, 4, CLR_BROWN), - MON("wererat", S_RODENT, LVL(2, 12, 6, 10, -7), (G_NOGEN | G_NOCORPSE), - A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(40, 30, MS_SQEEK, MZ_TINY), MR_POISON, 0, - M1_NOHANDS | M1_POIS | M1_REGEN | M1_CARNIVORE, - M2_NOPOLY | M2_WERE | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN), - MON("rock mole", S_RODENT, LVL(3, 3, 0, 20, 0), (G_GENO | 2), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(30, 30, MS_SILENT, MZ_SMALL), 0, 0, - M1_TUNNEL | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE, - M2_HOSTILE | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE, - 4, CLR_GRAY), - MON("woodchuck", S_RODENT, LVL(3, 3, 0, 20, 0), (G_NOGEN | G_GENO), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(30, 30, MS_SILENT, MZ_SMALL), 0, 0, - M1_TUNNEL /*LOGGING*/ | M1_ANIMAL | M1_NOHANDS | M1_SWIM - | M1_HERBIVORE, - /* In reality, they tunnel instead of cutting lumber. Oh, well. */ - M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 4, CLR_BROWN), - /* - * spiders & scorpions (keep webmaker() in sync if new critters are added) - */ - MON("cave spider", S_SPIDER, LVL(1, 12, 3, 0, 0), (G_GENO | G_SGROUP | 2), - A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, - M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, - M2_HOSTILE, 0, 3, CLR_GRAY), - MON("centipede", S_SPIDER, LVL(2, 4, 3, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(50, 50, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, - M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_CARNIVORE, - M2_HOSTILE, 0, 4, CLR_YELLOW), - MON("giant spider", S_SPIDER, LVL(5, 15, 4, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(200, 100, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, - M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG, 0, 7, CLR_MAGENTA), - MON("scorpion", S_SPIDER, LVL(5, 15, 3, 0, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), - ATTK(AT_STNG, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(50, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, - M1_CONCEAL | M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS - | M1_CARNIVORE, - M2_HOSTILE, 0, 8, CLR_RED), - /* - * trappers, lurkers, &c - */ - MON("lurker above", S_TRAPPER, LVL(10, 3, 3, 0, 0), (G_GENO | 2), - A(ATTK(AT_ENGL, AD_DGST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0, - M1_HIDE | M1_FLY | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_CARNIVORE, - M2_HOSTILE | M2_STALK | M2_STRONG, 0, 12, CLR_GRAY), - MON("trapper", S_TRAPPER, LVL(12, 3, 3, 0, 0), (G_GENO | 2), - A(ATTK(AT_ENGL, AD_DGST, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(800, 350, MS_SILENT, MZ_HUGE), 0, 0, - M1_HIDE | M1_ANIMAL | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_CARNIVORE, - M2_HOSTILE | M2_STALK | M2_STRONG, 0, 14, CLR_GREEN), - /* - * unicorns and horses - */ - MON("pony", S_UNICORN, LVL(3, 16, 6, 0, 0), (G_GENO | 2), - A(ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1300, 250, MS_NEIGH, MZ_MEDIUM), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE, - M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 4, CLR_BROWN), - MON("white unicorn", S_UNICORN, LVL(4, 24, 2, 70, 7), (G_GENO | 2), - A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, - M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS, - M3_INFRAVISIBLE, 6, CLR_WHITE), - MON("gray unicorn", S_UNICORN, LVL(4, 24, 2, 70, 0), (G_GENO | 1), - A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, - M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS, - M3_INFRAVISIBLE, 6, CLR_GRAY), - MON("black unicorn", S_UNICORN, LVL(4, 24, 2, 70, -7), (G_GENO | 1), - A(ATTK(AT_BUTT, AD_PHYS, 1, 12), ATTK(AT_KICK, AD_PHYS, 1, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1300, 300, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, - M1_NOHANDS | M1_HERBIVORE, M2_WANDER | M2_STRONG | M2_JEWELS, - M3_INFRAVISIBLE, 6, CLR_BLACK), - MON("horse", S_UNICORN, LVL(5, 20, 5, 0, 0), (G_GENO | 2), - A(ATTK(AT_KICK, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 300, MS_NEIGH, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE, - M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 7, CLR_BROWN), - MON("warhorse", S_UNICORN, LVL(7, 24, 4, 0, 0), (G_GENO | 2), - A(ATTK(AT_KICK, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_PHYS, 1, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1800, 350, MS_NEIGH, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_HERBIVORE, - M2_WANDER | M2_STRONG | M2_DOMESTIC, M3_INFRAVISIBLE, 9, CLR_BROWN), - /* - * vortices - */ - MON("fog cloud", S_VORTEX, LVL(3, 1, 0, 0, 0), (G_GENO | G_NOCORPSE | 2), - A(ATTK(AT_ENGL, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_AMORPHOUS | M1_UNSOLID, - M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY), - MON("dust vortex", S_VORTEX, LVL(4, 20, 2, 30, 0), - (G_GENO | G_NOCORPSE | 2), A(ATTK(AT_ENGL, AD_BLND, 2, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS, - M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN), - MON("ice vortex", S_VORTEX, LVL(5, 20, 2, 30, 0), - (G_NOHELL | G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_ENGL, AD_COLD, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_HUGE), - MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 7, CLR_CYAN), - MON("energy vortex", S_VORTEX, LVL(6, 20, 2, 30, 0), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_ENGL, AD_ELEC, 1, 6), ATTK(AT_ENGL, AD_DREN, 2, 6), - ATTK(AT_NONE, AD_ELEC, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_HUGE), - MR_ELEC | MR_SLEEP | MR_DISINT | MR_POISON | MR_STONE, 0, - M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_UNSOLID, - M2_HOSTILE | M2_NEUTER, 0, 9, HI_ZAP), - MON("steam vortex", S_VORTEX, LVL(7, 22, 2, 30, 0), - (G_HELL | G_GENO | G_NOCORPSE | 2), - A(ATTK(AT_ENGL, AD_FIRE, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_HUGE), - MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_UNSOLID, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 9, CLR_BLUE), - MON("fire vortex", S_VORTEX, LVL(8, 22, 2, 30, 0), - (G_HELL | G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_ENGL, AD_FIRE, 1, 10), ATTK(AT_NONE, AD_FIRE, 0, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_HUGE), - MR_FIRE | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_UNSOLID, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW), - /* - * worms - */ - MON("baby long worm", S_WORM, LVL(5, 3, 5, 0, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE | M1_NOTAKE, - M2_HOSTILE, 0, 6, CLR_BROWN), - MON("baby purple worm", S_WORM, LVL(8, 3, 5, 0, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(600, 250, MS_SILENT, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_CARNIVORE, M2_HOSTILE, 0, - 9, CLR_MAGENTA), - MON("long worm", S_WORM, LVL(9, 3, 5, 10, 0), (G_GENO | 2), - A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_SILENT, MZ_GIGANTIC), 0, 0, - M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE - | M1_NOTAKE, - M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 10, CLR_BROWN), - MON("purple worm", S_WORM, LVL(15, 9, 6, 20, 0), (G_GENO | 2), - A(ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_ENGL, AD_DGST, 1, 10), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2700, 700, MS_SILENT, MZ_GIGANTIC), 0, 0, - M1_ANIMAL | M1_SLITHY | M1_NOLIMBS | M1_OVIPAROUS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY, 0, 17, CLR_MAGENTA), - /* - * xan, &c - */ - MON("grid bug", S_XAN, LVL(0, 12, 9, 0, 0), - (G_GENO | G_SGROUP | G_NOCORPSE | 3), - A(ATTK(AT_BITE, AD_ELEC, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(15, 10, MS_BUZZ, MZ_TINY), MR_ELEC | MR_POISON, 0, M1_ANIMAL, - M2_HOSTILE, M3_INFRAVISIBLE, 1, CLR_MAGENTA), - MON("xan", S_XAN, LVL(7, 18, -4, 0, 0), (G_GENO | 3), - A(ATTK(AT_STNG, AD_LEGS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(300, 300, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, - M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS, M2_HOSTILE, - M3_INFRAVISIBLE, 9, CLR_RED), - /* - * lights - */ - MON("yellow light", S_LIGHT, LVL(3, 15, 0, 0, 0), - (G_NOCORPSE | G_GENO | 4), A(ATTK(AT_EXPL, AD_BLND, 10, 20), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_SMALL), - MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_SLEEP | MR_POISON - | MR_ACID | MR_STONE, - 0, M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS - | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 5, CLR_YELLOW), - MON("black light", S_LIGHT, LVL(5, 15, 0, 0, 0), - (G_NOCORPSE | G_GENO | 2), A(ATTK(AT_EXPL, AD_HALU, 10, 12), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_SMALL), - MR_FIRE | MR_COLD | MR_ELEC | MR_DISINT | MR_SLEEP | MR_POISON - | MR_ACID | MR_STONE, - 0, - M1_FLY | M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS - | M1_NOHEAD | M1_MINDLESS | M1_UNSOLID | M1_SEE_INVIS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 7, CLR_BLACK), - /* - * zruty - */ - MON("zruty", S_ZRUTY, LVL(9, 8, 3, 0, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), - ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1200, 600, MS_SILENT, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, 11, CLR_BROWN), - /* - * Angels and other lawful minions - */ - MON("couatl", S_ANGEL, LVL(8, 10, 5, 30, 7), - (G_NOHELL | G_SGROUP | G_NOCORPSE | 1), - A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_BITE, AD_PHYS, 1, 3), - ATTK(AT_HUGS, AD_WRAP, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(900, 400, MS_HISS, MZ_LARGE), MR_POISON, 0, - M1_FLY | M1_NOHANDS | M1_SLITHY | M1_POIS, - M2_MINION | M2_STALK | M2_STRONG | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_GREEN), - MON("Aleax", S_ANGEL, LVL(10, 8, 0, 30, 7), (G_NOHELL | G_NOCORPSE | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), - ATTK(AT_KICK, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_IMITATE, MZ_HUMAN), - MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, - M1_HUMANOID | M1_SEE_INVIS, - M2_MINION | M2_STALK | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_YELLOW), - /* Angels start with the emin extension attached, and usually have - the isminion flag set; however, non-minion Angels can be tamed - and will switch to edog (guardian Angel is handled specially and - always sticks with emin) */ - MON("Angel", S_ANGEL, LVL(14, 10, -4, 55, 12), - (G_NOHELL | G_NOCORPSE | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN), - MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, - M1_FLY | M1_HUMANOID | M1_SEE_INVIS, - M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_WHITE), - /* the AD&D Monster Manual depicts ki-rin as very similar to unicorns - except that they fly (without wings) and can cast spells */ - MON("ki-rin", S_ANGEL, LVL(16, 18, -5, 90, 15), - (G_NOHELL | G_NOCORPSE | 1), - A(ATTK(AT_KICK, AD_PHYS, 2, 4), ATTK(AT_KICK, AD_PHYS, 2, 4), - ATTK(AT_BUTT, AD_PHYS, 3, 6), ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SPELL, MZ_LARGE), MR_POISON, 0, - M1_FLY | M1_NOHANDS | M1_SEE_INVIS, - M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD, - M3_INFRAVISIBLE | M3_INFRAVISION, 21, HI_GOLD), - MON("Archon", S_ANGEL, LVL(19, 16, -6, 80, 15), - (G_NOHELL | G_NOCORPSE | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), - ATTK(AT_GAZE, AD_BLND, 2, 6), ATTK(AT_CLAW, AD_PHYS, 1, 8), - ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK), - SIZ(WT_HUMAN, 400, MS_CUSS, MZ_LARGE), - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, - M1_FLY | M1_HUMANOID | M1_SEE_INVIS | M1_REGEN, - M2_NOPOLY | M2_MINION | M2_STALK | M2_STRONG | M2_NASTY | M2_LORD - | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE | M3_INFRAVISION, 26, HI_LORD), - /* - * Bats - */ - MON("bat", S_BAT, LVL(0, 22, 8, 0, 0), (G_GENO | G_SGROUP | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(20, 20, MS_SQEEK, MZ_TINY), 0, 0, - M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_WANDER, - M3_INFRAVISIBLE, 2, CLR_BROWN), - MON("giant bat", S_BAT, LVL(2, 22, 7, 0, 0), (G_GENO | 2), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(30, 30, MS_SQEEK, MZ_SMALL), 0, 0, - M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 3, CLR_RED), - MON("raven", S_BAT, LVL(4, 20, 6, 0, 0), (G_GENO | 2), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_BLND, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(40, 20, MS_SQAWK, MZ_SMALL), 0, 0, - M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_WANDER | M2_HOSTILE, M3_INFRAVISIBLE, 6, CLR_BLACK), - MON("vampire bat", S_BAT, LVL(5, 20, 6, 0, 0), (G_GENO | 2), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRST, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(30, 20, MS_SQEEK, MZ_SMALL), MR_SLEEP | MR_POISON, 0, - M1_FLY | M1_ANIMAL | M1_NOHANDS | M1_POIS | M1_REGEN | M1_OMNIVORE, - M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_BLACK), - /* - * Centaurs - */ - MON("plains centaur", S_CENTAUR, LVL(4, 18, 4, 0, 0), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2500, 500, MS_HUMANOID, MZ_LARGE), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT, - M3_INFRAVISIBLE, 6, CLR_BROWN), - MON("forest centaur", S_CENTAUR, LVL(5, 18, 3, 10, -1), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2550, 600, MS_HUMANOID, MZ_LARGE), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT, - M3_INFRAVISIBLE, 8, CLR_GREEN), - MON("mountain centaur", S_CENTAUR, LVL(6, 20, 2, 10, -3), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_KICK, AD_PHYS, 1, 6), - ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2550, 500, MS_HUMANOID, MZ_LARGE), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_GREEDY | M2_COLLECT, - M3_INFRAVISIBLE, 9, CLR_CYAN), - /* - * Dragons - */ - /* The order of the dragons is VERY IMPORTANT. Quite a few - * pieces of code depend on gray being first and yellow being last. - * The code also depends on the *order* being the same as that for - * dragon scale mail and dragon scales in objects.c. [Also, - * 'tilemap' assumes that shimmering dragon follows silver dragon.] - * - * Adult dragons are all lawful or chaotic; baby dragons are all - * neutral. This affects monster generation on some special levels. - * Baby dragons cannot confer intrinsics, to avoid polyself/egg abuse. - * - * As reptiles, dragons are cold-blooded and thus aren't seen with - * infravision. Red and gold dragons (also Chromatic Dragon) are - * the exceptions because they breathe fire. - */ - MON("baby gray dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GRAY), - MON("baby gold dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, M3_INFRAVISIBLE, - 13, HI_GOLD), - MON("baby silver dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, DRAGON_SILVER), -#if 0 /* DEFERRED */ - /* [see "shimmering dragon" below] */ - MON("baby shimmering dragon", S_DRAGON, - LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_CYAN), -#endif - MON("baby red dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_FIRE, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, M3_INFRAVISIBLE, - 13, CLR_RED), - MON("baby white dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_COLD, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_WHITE), - MON("baby orange dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_SLEEP, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_ORANGE), - MON("baby black dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_DISINT, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLACK), - MON("baby blue dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ELEC, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_BLUE), - MON("baby green dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_POISON, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_POIS, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_GREEN), - MON("baby yellow dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_ROAR, MZ_HUGE), MR_ACID | MR_STONE, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_ACID, - M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, 13, CLR_YELLOW), - MON("gray dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1), - A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, 20, CLR_GRAY), - MON("gold dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1), - A(ATTK(AT_BREA, AD_FIRE, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - NO_ATTK, NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_FIRE, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - M3_INFRAVISIBLE, 20, HI_GOLD), - MON("silver dragon", S_DRAGON, LVL(15, 9, -1, 20, 4), (G_GENO | 1), - A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_COLD, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, 20, DRAGON_SILVER), -#if 0 /* DEFERRED */ - /* shimmering scales/scale-mail would confer displacement when worn by - the hero, so shimmering dragon ought to be displaced (hero who can - see one might misjudge its location) but monster displacement hasn't - been implemented so we don't include it */ - MON("shimmering dragon", S_DRAGON, - LVL(15, 9, -1, 20, 4), (G_GENO | 1), - A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - NO_ATTK, NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, 20, CLR_CYAN), -#endif - MON("red dragon", S_DRAGON, LVL(15, 9, -1, 20, -4), (G_GENO | 1), - A(ATTK(AT_BREA, AD_FIRE, 6, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_FIRE, MR_FIRE, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - M3_INFRAVISIBLE, 20, CLR_RED), - MON("white dragon", S_DRAGON, LVL(15, 9, -1, 20, -5), (G_GENO | 1), - A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_COLD, MR_COLD, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, 20, CLR_WHITE), - MON("orange dragon", S_DRAGON, LVL(15, 9, -1, 20, 5), (G_GENO | 1), - A(ATTK(AT_BREA, AD_SLEE, 4, 25), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_SLEEP, MR_SLEEP, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, 20, CLR_ORANGE), - /* disintegration breath is actually all or nothing, not 1d255 */ - MON("black dragon", S_DRAGON, LVL(15, 9, -1, 20, -6), (G_GENO | 1), - A(ATTK(AT_BREA, AD_DISN, 1, 255), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_DISINT, MR_DISINT, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, 20, CLR_BLACK), - MON("blue dragon", S_DRAGON, LVL(15, 9, -1, 20, -7), (G_GENO | 1), - A(ATTK(AT_BREA, AD_ELEC, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_ELEC, MR_ELEC, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, 20, CLR_BLUE), - MON("green dragon", S_DRAGON, LVL(15, 9, -1, 20, 6), (G_GENO | 1), - A(ATTK(AT_BREA, AD_DRST, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_POISON, MR_POISON, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS - | M1_CARNIVORE | M1_POIS, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, 20, CLR_GREEN), - MON("yellow dragon", S_DRAGON, LVL(15, 9, -1, 20, 7), (G_GENO | 1), - A(ATTK(AT_BREA, AD_ACID, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), MR_ACID | MR_STONE, - MR_STONE, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS - | M1_OVIPAROUS | M1_CARNIVORE | M1_ACID, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, - 0, 20, CLR_YELLOW), - /* - * Elementals - */ - MON("stalker", S_ELEMENTAL, LVL(8, 12, 3, 0, 0), (G_GENO | 3), - A(ATTK(AT_CLAW, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(900, 400, MS_SILENT, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_FLY | M1_SEE_INVIS, - M2_WANDER | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, - 9, CLR_WHITE), - MON("air elemental", S_ELEMENTAL, LVL(8, 36, 2, 30, 0), (G_NOCORPSE | 1), - A(ATTK(AT_ENGL, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0, - M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS - | M1_UNSOLID | M1_FLY, - M2_STRONG | M2_NEUTER, 0, 10, CLR_CYAN), - MON("fire elemental", S_ELEMENTAL, LVL(8, 12, 2, 30, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_FIRE, 3, 6), ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_FIRE | MR_POISON | MR_STONE, 0, - M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS - | M1_UNSOLID | M1_FLY | M1_NOTAKE, - M2_STRONG | M2_NEUTER, M3_INFRAVISIBLE, 10, CLR_YELLOW), - MON("earth elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(2500, 0, MS_SILENT, MZ_HUGE), - MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0, - M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS - | M1_WALLWALK | M1_THICK_HIDE, - M2_STRONG | M2_NEUTER, 0, 10, CLR_BROWN), - MON("water elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(2500, 0, MS_SILENT, MZ_HUGE), MR_POISON | MR_STONE, 0, - M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS | M1_BREATHLESS - | M1_UNSOLID | M1_AMPHIBIOUS | M1_SWIM, - M2_STRONG | M2_NEUTER, 0, 10, CLR_BLUE), - /* - * Fungi - */ - MON("lichen", S_FUNGUS, LVL(0, 1, 9, 0, 0), (G_GENO | 4), - A(ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(20, 200, MS_SILENT, MZ_SMALL), 0, 0, - M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS - | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 1, CLR_BRIGHT_GREEN), - MON("brown mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1), - A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_COLD | MR_POISON, - MR_COLD | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS - | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 2, CLR_BROWN), - MON("yellow mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 2), - A(ATTK(AT_NONE, AD_STUN, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, - M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS - | M1_POIS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 2, CLR_YELLOW), - MON("green mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1), - A(ATTK(AT_NONE, AD_ACID, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_ACID | MR_STONE, MR_STONE, - M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS - | M1_ACID | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 2, CLR_GREEN), - MON("red mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1), - A(ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(50, 30, MS_SILENT, MZ_SMALL), MR_FIRE | MR_POISON, - MR_FIRE | MR_POISON, M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS - | M1_NOHEAD | M1_MINDLESS | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, 2, CLR_RED), - MON("shrieker", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 1), - A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(100, 100, MS_SHRIEK, MZ_SMALL), MR_POISON, MR_POISON, - M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS - | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 2, CLR_MAGENTA), - MON("violet fungus", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_GENO | 2), - A(ATTK(AT_TUCH, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(100, 100, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, - M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS - | M1_NOTAKE, - M2_HOSTILE | M2_NEUTER, 0, 5, CLR_MAGENTA), - /* - * Gnomes - */ - MON("gnome", S_GNOME, LVL(1, 6, 10, 4, 0), (G_GENO | G_SGROUP | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(650, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_GNOME | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, - 3, CLR_BROWN), - MON3("gnome lord", "gnome lady", "gnome leader", - S_GNOME, LVL(3, 8, 10, 4, 0), (G_GENO | 2), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_GNOME | M2_LORD | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_BLUE), - MON("gnomish wizard", S_GNOME, LVL(3, 10, 4, 10, 0), (G_GENO | 1), - A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_GNOME | M2_MAGIC, M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP), - MON3("gnome king", "gnome queen", "gnome ruler", - S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(750, 150, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_GNOME | M2_PRINCE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 6, HI_LORD), -#ifdef SPLITMON_1 -}; -#endif -#endif /* !SPLITMON_2 */ - -/* horrible kludge alert: - * This is a compiler-specific kludge to allow the compilation of monst.o in - * two pieces, by defining first SPLITMON_1 and then SPLITMON_2. The - * resulting assembler files (monst1.s and monst2.s) are then run through - * sed to change local symbols, concatenated together, and assembled to - * produce monst.o. THIS ONLY WORKS WITH THE ATARI GCC, and should only - * be done if you don't have enough memory to compile monst.o the "normal" - * way. --ERS - */ - -#ifndef SPLITMON_1 -#ifdef SPLITMON_2 -struct permonst _mons2[] = { -#endif - /* - * giant Humanoids - */ - MON("giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_GENO | G_NOGEN | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, - M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT - | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_RED), - MON("stone giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_GENO | G_SGROUP | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(2250, 750, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, - M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT - | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), - MON("hill giant", S_GIANT, LVL(8, 10, 6, 0, -2), (G_GENO | G_SGROUP | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(2200, 700, MS_BOAST, MZ_HUGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, - M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT - | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_CYAN), - MON("fire giant", S_GIANT, LVL(9, 12, 4, 5, 2), (G_GENO | G_SGROUP | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_FIRE, MR_FIRE, - M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW - | M2_NASTY | M2_COLLECT | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_YELLOW), - MON("frost giant", S_GIANT, LVL(10, 12, 3, 10, -3), - (G_NOHELL | G_GENO | G_SGROUP | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_COLD, MR_COLD, - M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW - | M2_NASTY | M2_COLLECT | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_WHITE), - MON("ettin", S_GIANT, LVL(10, 12, 3, 0, 0), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1700, 500, MS_GRUNT, MZ_HUGE), 0, 0, - M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_BROWN), - MON("storm giant", S_GIANT, LVL(16, 12, 3, 10, -3), - (G_GENO | G_SGROUP | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2250, 750, MS_BOAST, MZ_HUGE), MR_ELEC, MR_ELEC, - M1_HUMANOID | M1_CARNIVORE, M2_GIANT | M2_STRONG | M2_ROCKTHROW - | M2_NASTY | M2_COLLECT | M2_JEWELS, - M3_INFRAVISIBLE | M3_INFRAVISION, 19, CLR_BLUE), - MON("titan", S_GIANT, LVL(16, 18, -3, 70, 9), (1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2300, 900, MS_SPELL, MZ_HUGE), 0, 0, - M1_FLY | M1_HUMANOID | M1_OMNIVORE, - M2_STRONG | M2_ROCKTHROW | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_MAGENTA), - MON("minotaur", S_GIANT, LVL(15, 15, 6, 0, 0), (G_GENO | G_NOGEN), - A(ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10), - ATTK(AT_BUTT, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 700, MS_MOO, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE | M3_INFRAVISION, - 17, CLR_BROWN), - /* - * Invisible - * S_invisible=='I' is a visual marker for all invisible monsters - * and must be not be used for any specific monster types. Long - * time 'invisible stalker' was changed to 'stalker', an Elemental. - */ - - /* - * Jabberwock - */ - /* the illustration from _Through_the_Looking_Glass_ - depicts hands as well as wings */ - MON("jabberwock", S_JABBERWOCK, LVL(15, 12, -2, 50, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_PHYS, 2, 10), - ATTK(AT_CLAW, AD_PHYS, 2, 10), ATTK(AT_CLAW, AD_PHYS, 2, 10), - NO_ATTK, NO_ATTK), - SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_FLY | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE, - 18, CLR_ORANGE), -#if 0 /* DEFERRED */ - MON("vorpal jabberwock", S_JABBERWOCK, - LVL(20, 12, -2, 50, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 3, 10), ATTK(AT_BITE, AD_PHYS, 3, 10), - ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10), - NO_ATTK, NO_ATTK), - SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_FLY | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE, - 25, HI_LORD), -#endif - /* - * Kops - */ - MON("Keystone Kop", S_KOP, LVL(1, 6, 10, 10, 9), - (G_GENO | G_LGROUP | G_NOGEN), - A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, - M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, 3, CLR_BLUE), - MON("Kop Sergeant", S_KOP, LVL(2, 8, 10, 10, 10), - (G_GENO | G_SGROUP | G_NOGEN), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, - M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, 4, CLR_BLUE), - MON("Kop Lieutenant", S_KOP, LVL(3, 10, 10, 20, 11), (G_GENO | G_NOGEN), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, - M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, 5, CLR_CYAN), - MON("Kop Kaptain", S_KOP, LVL(4, 12, 10, 20, 12), (G_GENO | G_NOGEN), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 200, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, - M2_HUMAN | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, 6, HI_LORD), - /* - * Liches - */ - MON("lich", S_LICH, LVL(11, 6, 0, 30, -9), (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_TUCH, AD_COLD, 1, 10), ATTK(AT_MAGC, AD_SPEL, 0, 0), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, - MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 14, CLR_BROWN), - MON("demilich", S_LICH, LVL(14, 9, -2, 60, -12), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_TUCH, AD_COLD, 3, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, - MR_COLD, M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_INFRAVISION, 18, CLR_RED), - MON("master lich", S_LICH, LVL(17, 9, -4, 90, -15), - (G_HELL | G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_TUCH, AD_COLD, 3, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), - MR_FIRE | MR_COLD | MR_SLEEP | MR_POISON, MR_FIRE | MR_COLD, - M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION, - 21, HI_LORD), - MON("arch-lich", S_LICH, LVL(25, 9, -6, 90, -15), - (G_HELL | G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_TUCH, AD_COLD, 5, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1200, 100, MS_MUMBLE, MZ_HUMAN), - MR_FIRE | MR_COLD | MR_SLEEP | MR_ELEC | MR_POISON, MR_FIRE | MR_COLD, - M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_UNDEAD | M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION, - 29, HI_LORD), - /* - * Mummies - */ - MON("kobold mummy", S_MUMMY, LVL(3, 8, 6, 20, -2), - (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 4, CLR_BROWN), - MON("gnome mummy", S_MUMMY, LVL(4, 10, 6, 20, -3), - (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE | M2_GNOME, M3_INFRAVISION, 5, CLR_RED), - MON("orc mummy", S_MUMMY, LVL(5, 10, 5, 20, -4), - (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE | M2_ORC | M2_GREEDY | M2_JEWELS, - M3_INFRAVISION, 6, CLR_GRAY), - MON("dwarf mummy", S_MUMMY, LVL(5, 10, 5, 20, -4), - (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE | M2_DWARF | M2_GREEDY | M2_JEWELS, - M3_INFRAVISION, 6, CLR_RED), - MON("elf mummy", S_MUMMY, LVL(6, 12, 4, 30, -5), - (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, - 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE | M2_ELF, M3_INFRAVISION, 7, CLR_GREEN), - MON("human mummy", S_MUMMY, LVL(6, 12, 4, 30, -5), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN), - MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE, M3_INFRAVISION, 7, CLR_GRAY), - MON("ettin mummy", S_MUMMY, LVL(7, 12, 4, 30, -6), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_BLUE), - MON("giant mummy", S_MUMMY, LVL(8, 14, 3, 30, -7), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_HOSTILE | M2_GIANT | M2_STRONG | M2_JEWELS, - M3_INFRAVISION, 10, CLR_CYAN), - /* - * Nagas - */ - MON("red naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_FIRE | MR_POISON, - MR_FIRE | MR_POISON, - M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, M3_INFRAVISIBLE, 4, CLR_RED), - MON("black naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON | MR_ACID | MR_STONE, - MR_POISON | MR_STONE, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_ACID - | M1_NOTAKE | M1_CARNIVORE, - M2_STRONG, 0, 4, CLR_BLACK), - MON("golden naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON, - M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, 0, 4, HI_GOLD), - MON("guardian naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 100, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON, - M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, 0, 4, CLR_GREEN), - MON("red naga", S_NAGA, LVL(6, 12, 4, 0, -4), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_FIRE | MR_POISON, - MR_FIRE | MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE - | M1_OVIPAROUS | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, M3_INFRAVISIBLE, 8, CLR_RED), - MON("black naga", S_NAGA, LVL(8, 14, 2, 10, 4), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_SPIT, AD_ACID, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON | MR_ACID | MR_STONE, - MR_POISON | MR_STONE, - M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_ACID - | M1_NOTAKE | M1_CARNIVORE, - M2_STRONG, 0, 10, CLR_BLACK), - MON("golden naga", S_NAGA, LVL(10, 14, 2, 70, 5), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON, - M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_NOTAKE - | M1_OMNIVORE, - M2_STRONG, 0, 13, HI_GOLD), - MON("guardian naga", S_NAGA, LVL(12, 16, 0, 50, 7), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PLYS, 1, 6), ATTK(AT_SPIT, AD_DRST, 1, 6), - ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON, - M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_POIS - | M1_NOTAKE | M1_OMNIVORE, - M2_STRONG, 0, 16, CLR_GREEN), - /* - * Ogres - */ - MON("ogre", S_OGRE, LVL(5, 10, 5, 0, -3), (G_SGROUP | G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1600, 500, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, - M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BROWN), - MON3("ogre lord", "ogre lady", "ogre leader", - S_OGRE, LVL(7, 12, 3, 30, -5), (G_GENO | 2), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1700, 700, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, - M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_RED), - MON3("ogre king", "ogre queen", "ogre tyrant", - S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO | 2), - A(ATTK(AT_WEAP, AD_PHYS, 3, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1700, 750, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, - M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD), - /* - * Puddings - * - * must be in the same order as the pudding globs in objects.c - */ - MON("gray ooze", S_PUDDING, LVL(3, 1, 8, 0, 0), (G_GENO | G_NOCORPSE | 2), - A(ATTK(AT_BITE, AD_RUST, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 250, MS_SILENT, MZ_MEDIUM), - MR_FIRE | MR_COLD | MR_POISON | MR_ACID | MR_STONE, - MR_FIRE | MR_COLD | MR_POISON, - M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_OMNIVORE | M1_ACID, - M2_HOSTILE | M2_NEUTER, 0, 4, CLR_GRAY), - MON("brown pudding", S_PUDDING, LVL(5, 3, 8, 0, 0), - (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_BITE, AD_DCAY, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(500, 250, MS_SILENT, MZ_MEDIUM), - MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE, - MR_COLD | MR_ELEC | MR_POISON, - M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_OMNIVORE | M1_ACID, - M2_HOSTILE | M2_NEUTER, 0, 6, CLR_BROWN), - MON("green slime", S_PUDDING, LVL(6, 6, 6, 0, 0), - (G_HELL | G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(400, 150, MS_SILENT, MZ_LARGE), - MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE, 0, - M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_OMNIVORE | M1_ACID | M1_POIS, - M2_HOSTILE | M2_NEUTER, 0, 8, CLR_GREEN), - MON("black pudding", S_PUDDING, LVL(10, 6, 6, 0, 0), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(900, 250, MS_SILENT, MZ_LARGE), - MR_COLD | MR_ELEC | MR_POISON | MR_ACID | MR_STONE, - MR_COLD | MR_ELEC | MR_POISON, - M1_BREATHLESS | M1_AMORPHOUS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD - | M1_MINDLESS | M1_OMNIVORE | M1_ACID, - M2_HOSTILE | M2_NEUTER, 0, 12, CLR_BLACK), - /* - * Quantum mechanics - */ - MON("quantum mechanic", S_QUANTMECH, LVL(7, 12, 3, 10, 0), (G_GENO | 3), - A(ATTK(AT_CLAW, AD_TLPT, 1, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 20, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE, - M3_INFRAVISIBLE, 9, CLR_CYAN), - MON("genetic engineer", S_QUANTMECH, LVL(12, 12, 3, 10, 0), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_POLY, 1, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 20, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE, 14, CLR_GREEN), - /* - * Rust monster or disenchanter - */ - MON("rust monster", S_RUSTMONST, LVL(5, 18, 2, 0, 0), (G_GENO | 2), - A(ATTK(AT_TUCH, AD_RUST, 0, 0), ATTK(AT_TUCH, AD_RUST, 0, 0), - ATTK(AT_NONE, AD_RUST, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1000, 250, MS_SILENT, MZ_MEDIUM), 0, 0, - M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_METALLIVORE, M2_HOSTILE, - M3_INFRAVISIBLE, 8, CLR_BROWN), - MON("disenchanter", S_RUSTMONST, LVL(12, 12, -10, 0, -3), - (G_HELL | G_GENO | 2), - A(ATTK(AT_CLAW, AD_ENCH, 4, 4), ATTK(AT_NONE, AD_ENCH, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(750, 200, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL | M1_CARNIVORE, - M2_HOSTILE, M3_INFRAVISIBLE, 14, CLR_BLUE), - /* - * Snakes - */ - MON("garter snake", S_SNAKE, LVL(1, 8, 8, 0, 0), (G_LGROUP | G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(50, 60, MS_HISS, MZ_TINY), 0, 0, - M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY - | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE, - 0, 0, 3, CLR_GREEN), - MON("snake", S_SNAKE, LVL(4, 15, 3, 0, 0), (G_GENO | 2), - A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(100, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON, - M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS - | M1_OVIPAROUS | M1_CARNIVORE | M1_NOTAKE, - M2_HOSTILE, 0, 6, CLR_BROWN), - MON("water moccasin", S_SNAKE, LVL(4, 15, 3, 0, 0), - (G_GENO | G_NOGEN | G_LGROUP), - A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(150, 80, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON, - M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS - | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, 0, 7, CLR_RED), - MON("python", S_SNAKE, LVL(6, 3, 5, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_PHYS, 0, 0), - ATTK(AT_HUGS, AD_WRAP, 1, 4), ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, - NO_ATTK), - SIZ(250, 100, MS_HISS, MZ_LARGE), 0, 0, - M1_SWIM | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_CARNIVORE - | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE | M2_STRONG, M3_INFRAVISION, 8, CLR_MAGENTA), - MON("pit viper", S_SNAKE, LVL(6, 15, 2, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_DRST, 1, 4), ATTK(AT_BITE, AD_DRST, 1, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(100, 60, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON, - M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS - | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, M3_INFRAVISION, 9, CLR_BLUE), - MON("cobra", S_SNAKE, LVL(6, 18, 2, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_SPIT, AD_BLND, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(250, 100, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON, - M1_SWIM | M1_CONCEAL | M1_NOLIMBS | M1_ANIMAL | M1_SLITHY | M1_POIS - | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, 0, 10, CLR_BLUE), - /* - * Trolls - */ - MON("troll", S_TROLL, LVL(7, 12, 4, 0, -3), (G_GENO | 2), - A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 4, 2), - ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(800, 350, MS_GRUNT, MZ_LARGE), 0, 0, - M1_HUMANOID | M1_REGEN | M1_CARNIVORE, - M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION, - 9, CLR_BROWN), - MON("ice troll", S_TROLL, LVL(9, 10, 2, 20, -3), (G_NOHELL | G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_COLD, 2, 6), - ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1000, 300, MS_GRUNT, MZ_LARGE), MR_COLD, MR_COLD, - M1_HUMANOID | M1_REGEN | M1_CARNIVORE, - M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION, - 12, CLR_WHITE), - MON("rock troll", S_TROLL, LVL(9, 12, 0, 0, -3), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8), - ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1200, 300, MS_GRUNT, MZ_LARGE), 0, 0, - M1_HUMANOID | M1_REGEN | M1_CARNIVORE, - M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_CYAN), - MON("water troll", S_TROLL, LVL(11, 14, 4, 40, -3), (G_NOGEN | G_GENO), - A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), - ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1200, 350, MS_GRUNT, MZ_LARGE), 0, 0, - M1_HUMANOID | M1_REGEN | M1_CARNIVORE | M1_SWIM, - M2_STRONG | M2_STALK | M2_HOSTILE, M3_INFRAVISIBLE | M3_INFRAVISION, - 13, CLR_BLUE), - MON("Olog-hai", S_TROLL, LVL(13, 12, -4, 0, -7), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8), - ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 400, MS_GRUNT, MZ_LARGE), 0, 0, - M1_HUMANOID | M1_REGEN | M1_CARNIVORE, - M2_STRONG | M2_STALK | M2_HOSTILE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 16, HI_LORD), - /* - * Umber hulk - */ - MON("umber hulk", S_UMBER, LVL(9, 6, 2, 25, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), - ATTK(AT_BITE, AD_PHYS, 2, 5), ATTK(AT_GAZE, AD_CONF, 0, 0), NO_ATTK, - NO_ATTK), - SIZ(1200, 500, MS_SILENT, MZ_LARGE), 0, 0, M1_TUNNEL | M1_CARNIVORE, - M2_STRONG, M3_INFRAVISIBLE, 12, CLR_BROWN), - /* - * Vampires - */ - MON("vampire", S_VAMPIRE, LVL(10, 12, 1, 25, -8), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRLI, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, - M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY - | M2_SHAPESHIFTER, - M3_INFRAVISIBLE, 12, CLR_RED), - MON3("vampire lord", "vampire lady", "vampire leader", - S_VAMPIRE, LVL(12, 14, 0, 50, -9), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, - M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD - | M2_SHAPESHIFTER, - M3_INFRAVISIBLE, 14, CLR_BLUE), -#if 0 /* DEFERRED */ - MON("vampire mage", S_VAMPIRE, - LVL(20, 14, -4, 50, -9), (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), - ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, - M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD - | M2_MALE | M2_MAGIC | M2_SHAPESHIFTER, - M3_INFRAVISIBLE, 26, HI_ZAP), -#endif - MON("Vlad the Impaler", S_VAMPIRE, LVL(28, 26, -6, 80, -10), - (G_NOGEN | G_NOCORPSE | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_DRLI, 1, 12), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, - M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, - M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG - | M2_NASTY | M2_PRINCE | M2_MALE | M2_SHAPESHIFTER, - M3_WAITFORU | M3_WANTSCAND | M3_INFRAVISIBLE, 32, HI_LORD), - /* - * Wraiths - */ - MON("barrow wight", S_WRAITH, LVL(3, 12, 5, 5, -3), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_WEAP, AD_DRLI, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0), - ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_COLD, 1, 4), - NO_ATTK, NO_ATTK), - SIZ(1200, 0, MS_SPELL, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_HUMANOID, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_COLLECT, 0, 8, CLR_GRAY), - MON("wraith", S_WRAITH, LVL(6, 12, 4, 15, -6), (G_GENO | 2), - A(ATTK(AT_TUCH, AD_DRLI, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(0, 0, MS_SILENT, MZ_HUMAN), - MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_BREATHLESS | M1_FLY | M1_HUMANOID | M1_UNSOLID, - M2_UNDEAD | M2_STALK | M2_HOSTILE, 0, 8, CLR_BLACK), - MON("Nazgul", S_WRAITH, LVL(13, 12, 0, 25, -17), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_WEAP, AD_DRLI, 1, 4), ATTK(AT_BREA, AD_SLEE, 2, 25), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 0, MS_SPELL, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, - 0, M1_BREATHLESS | M1_HUMANOID, - M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_STRONG | M2_HOSTILE | M2_MALE - | M2_COLLECT, - 0, 17, HI_LORD), - /* - * Xorn - */ - MON("xorn", S_XORN, LVL(8, 9, -2, 20, 0), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), - ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, - NO_ATTK), - SIZ(1200, 700, MS_ROAR, MZ_MEDIUM), MR_FIRE | MR_COLD | MR_STONE, - MR_STONE, - M1_BREATHLESS | M1_WALLWALK | M1_THICK_HIDE | M1_METALLIVORE, - M2_HOSTILE | M2_STRONG, 0, 11, CLR_BROWN), - /* - * Apelike beasts - */ - /* tameable via banana; does not grow up into ape... - not flagged as domestic, so no guilt penalty for eating non-pet one */ - MON("monkey", S_YETI, LVL(2, 12, 6, 0, 0), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(100, 50, MS_GROWL, MZ_SMALL), 0, 0, - M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, 0, M3_INFRAVISIBLE, - 4, CLR_GRAY), - MON("ape", S_YETI, LVL(4, 12, 6, 0, 0), (G_GENO | G_SGROUP | 2), - A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), - ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1100, 500, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, M2_STRONG, M3_INFRAVISIBLE, - 6, CLR_BROWN), - MON("owlbear", S_YETI, LVL(5, 12, 5, 0, 0), (G_GENO | 3), - A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), - ATTK(AT_HUGS, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1700, 700, MS_ROAR, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, - M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE, 7, CLR_BROWN), - MON("yeti", S_YETI, LVL(5, 15, 6, 0, 0), (G_GENO | 2), - A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), - ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1600, 700, MS_GROWL, MZ_LARGE), MR_COLD, MR_COLD, - M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, 7, CLR_WHITE), - MON("carnivorous ape", S_YETI, LVL(6, 12, 6, 0, 0), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - ATTK(AT_HUGS, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1250, 550, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE, M2_HOSTILE | M2_STRONG, - M3_INFRAVISIBLE, 8, CLR_BLACK), - MON("sasquatch", S_YETI, LVL(7, 15, 6, 0, 2), (G_GENO | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), - ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1550, 750, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL | M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M2_STRONG, - M3_INFRAVISIBLE, 9, CLR_GRAY), - /* - * Zombies - */ - MON("kobold zombie", S_ZOMBIE, LVL(0, 6, 10, 0, -2), - (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 1, CLR_BROWN), - MON("gnome zombie", S_ZOMBIE, LVL(1, 6, 10, 0, -2), - (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 5), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(650, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GNOME, M3_INFRAVISION, - 2, CLR_BROWN), - MON("orc zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3), - (G_GENO | G_SGROUP | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(850, 75, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ORC, M3_INFRAVISION, 3, - CLR_GRAY), - MON("dwarf zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3), - (G_GENO | G_SGROUP | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(900, 150, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_DWARF, M3_INFRAVISION, - 3, CLR_RED), - MON("elf zombie", S_ZOMBIE, LVL(3, 6, 9, 0, -3), - (G_GENO | G_SGROUP | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_ELF, 175, MS_SILENT, MZ_HUMAN), MR_COLD | MR_SLEEP | MR_POISON, - 0, M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_ELF, M3_INFRAVISION, - 4, CLR_GREEN), - MON("human zombie", S_ZOMBIE, LVL(4, 6, 8, 0, -3), - (G_GENO | G_SGROUP | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 200, MS_SILENT, MZ_HUMAN), - MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, - M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, 5, HI_DOMESTIC), - MON("ettin zombie", S_ZOMBIE, LVL(6, 8, 6, 0, -4), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 10), ATTK(AT_CLAW, AD_PHYS, 1, 10), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1700, 250, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG, M3_INFRAVISION, - 7, CLR_BLUE), - MON("ghoul", S_ZOMBIE, LVL(3, 6, 10, 0, -2), (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PLYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(400, 50, MS_SILENT, MZ_SMALL), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_POIS | M1_OMNIVORE, - M2_UNDEAD | M2_WANDER | M2_HOSTILE, M3_INFRAVISION, 5, CLR_BLACK), - MON("giant zombie", S_ZOMBIE, LVL(8, 8, 6, 0, -4), - (G_GENO | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2050, 375, MS_SILENT, MZ_HUGE), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, - M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_GIANT | M2_STRONG, - M3_INFRAVISION, 9, CLR_CYAN), - MON("skeleton", S_ZOMBIE, LVL(12, 8, 4, 0, 0), (G_NOCORPSE | G_NOGEN), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(300, 5, MS_BONES, MZ_HUMAN), - MR_COLD | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_UNDEAD | M2_WANDER | M2_HOSTILE | M2_STRONG | M2_COLLECT - | M2_NASTY, - M3_INFRAVISION, 14, CLR_WHITE), - /* - * golems - */ - MON("straw golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, - 4, CLR_YELLOW), - MON("paper golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(400, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, - 4, HI_PAPER), - MON("rope golem", S_GOLEM, LVL(4, 9, 8, 0, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - ATTK(AT_HUGS, AD_PHYS, 6, 1), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, - 6, CLR_BROWN), - MON("gold golem", S_GOLEM, LVL(5, 9, 6, 0, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 2, 3), ATTK(AT_CLAW, AD_PHYS, 2, 3), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(450, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_NEUTER, 0, 6, HI_GOLD), - MON("leather golem", S_GOLEM, LVL(6, 6, 6, 0, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_NEUTER, 0, - 7, HI_LEATHER), - MON("wood golem", S_GOLEM, LVL(7, 3, 4, 0, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(900, 0, MS_SILENT, MZ_LARGE), MR_COLD | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_NEUTER, 0, 8, HI_WOOD), - MON("flesh golem", S_GOLEM, LVL(9, 8, 9, 30, 0), (1), - A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1400, 600, MS_SILENT, MZ_LARGE), - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID, M2_HOSTILE | M2_STRONG, 0, - 10, CLR_RED), - MON("clay golem", S_GOLEM, LVL(11, 7, 7, 40, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 3, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1550, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_STRONG, 0, 12, CLR_BROWN), - MON("stone golem", S_GOLEM, LVL(14, 6, 5, 50, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1900, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_STRONG, 0, 15, CLR_GRAY), - MON("glass golem", S_GOLEM, LVL(16, 6, 1, 50, 0), (G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1800, 0, MS_SILENT, MZ_LARGE), MR_SLEEP | MR_POISON | MR_ACID, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE, - M2_HOSTILE | M2_STRONG, 0, 18, CLR_CYAN), - MON("iron golem", S_GOLEM, LVL(18, 6, 3, 60, 0), (G_NOCORPSE | 1), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_BREA, AD_DRST, 4, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2000, 0, MS_SILENT, MZ_LARGE), - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON, 0, - M1_BREATHLESS | M1_MINDLESS | M1_HUMANOID | M1_THICK_HIDE | M1_POIS, - M2_HOSTILE | M2_STRONG | M2_COLLECT, 0, 22, HI_METAL), - /* - * humans, including elves and were-critters; - * the '@' class does not obey rule #2. - */ - MON("human", S_HUMAN, LVL(0, 12, 10, 0, 0), G_NOGEN, /* for corpses */ - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - 2, HI_DOMESTIC), - MON("wererat", S_HUMAN, LVL(2, 12, 10, 10, -7), (1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE, - M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, - M3_INFRAVISIBLE, 3, CLR_BROWN), - MON("werejackal", S_HUMAN, LVL(2, 12, 10, 10, -7), (1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE, - M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, - M3_INFRAVISIBLE, 3, CLR_RED), - MON("werewolf", S_HUMAN, LVL(5, 12, 10, 20, -7), (1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_POIS | M1_REGEN | M1_OMNIVORE, - M2_NOPOLY | M2_WERE | M2_HOSTILE | M2_HUMAN | M2_COLLECT, - M3_INFRAVISIBLE, 6, CLR_ORANGE), - MON("elf", S_HUMAN, LVL(0, 12, 10, 2, -3), G_NOGEN, /* for corpses */ - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, - M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, - M2_NOPOLY | M2_ELF | M2_STRONG | M2_COLLECT, - M3_INFRAVISION | M3_INFRAVISIBLE, 2, HI_DOMESTIC), - MON("Woodland-elf", S_HUMAN, LVL(4, 12, 10, 10, -5), - (G_GENO | G_SGROUP | 2), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, - M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_GREEN), - MON("Green-elf", S_HUMAN, LVL(5, 12, 10, 10, -6), (G_GENO | G_SGROUP | 2), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, - M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BRIGHT_GREEN), - MON("Grey-elf", S_HUMAN, LVL(6, 12, 10, 10, -7), (G_GENO | G_SGROUP | 2), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, - M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), - MON3("elf-lord", "elf-queen", "elf-noble", - S_HUMAN, LVL(8, 12, 10, 20, -9), (G_GENO | G_SGROUP | 2), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, - M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, - M2_ELF | M2_STRONG | M2_LORD | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BRIGHT_BLUE), - MON3("Elvenking", "Elvenqueen", "elven monarch", - S_HUMAN, LVL(9, 12, 10, 25, -10), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, - M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, - M2_ELF | M2_STRONG | M2_PRINCE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD), - MON("doppelganger", S_HUMAN, LVL(9, 12, 5, 20, 0), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 12), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_IMITATE, MZ_HUMAN), MR_SLEEP, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT - | M2_SHAPESHIFTER, - M3_INFRAVISIBLE, 11, HI_DOMESTIC), - MON("shopkeeper", S_HUMAN, LVL(12, 18, 0, 50, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SELL, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL - | M2_STRONG | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, 15, HI_DOMESTIC), - MON("guard", S_HUMAN, LVL(12, 12, 10, 40, 10), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARD, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_MERC | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 14, CLR_BLUE), - /* prisoner is used on some special levels */ - MON("prisoner", S_HUMAN, LVL(12, 12, 10, 0, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE | M3_CLOSE, 14, HI_DOMESTIC), - MON("Oracle", S_HUMAN, LVL(12, 0, 0, 50, 0), (G_NOGEN | G_UNIQ), - A(ATTK(AT_NONE, AD_MAGM, 0, 4), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_ORACLE, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_FEMALE, M3_INFRAVISIBLE, - 13, HI_ZAP), - /* aligned priests always have the epri extension attached; - individual instantiations should always have either ispriest - or isminion set */ - MON3("priest", "priestess", "aligned cleric", - S_HUMAN, LVL(12, 12, 10, 50, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 1, 4), - ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN), MR_ELEC, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_LORD | M2_PEACEFUL | M2_COLLECT, - M3_INFRAVISIBLE, 15, CLR_WHITE), - /* high priests always have epri and always have ispriest set */ - MON3("high priest", "high priestess", "high cleric", - S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), - ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN), - MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0, - M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_MINION | M2_PRINCE | M2_NASTY | M2_COLLECT - | M2_MAGIC, - M3_INFRAVISIBLE, 30, CLR_WHITE), - MON("soldier", S_HUMAN, LVL(6, 10, 10, 0, -2), (G_SGROUP | G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK - | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 8, CLR_GRAY), - MON("sergeant", S_HUMAN, LVL(8, 10, 10, 5, -3), (G_SGROUP | G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK - | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 10, CLR_RED), - MON("nurse", S_HUMAN, LVL(11, 6, 0, 0, 0), (G_GENO | 3), - A(ATTK(AT_CLAW, AD_HEAL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_NURSE, MZ_HUMAN), MR_POISON, MR_POISON, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_HOSTILE, - M3_INFRAVISIBLE, 13, HI_DOMESTIC), - MON("lieutenant", S_HUMAN, LVL(10, 10, 10, 15, -4), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK - | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 12, CLR_GREEN), - MON("captain", S_HUMAN, LVL(12, 10, 10, 15, -5), (G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK - | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 14, CLR_BLUE), - MON("watchman", S_HUMAN, LVL(6, 10, 10, 0, -2), - (G_SGROUP | G_NOGEN | G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK - | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 8, CLR_GRAY), - MON("watch captain", S_HUMAN, LVL(10, 10, 10, 15, -4), - (G_NOGEN | G_GENO | 1), - A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SOLDIER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_MERC | M2_STALK - | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 12, CLR_GREEN), - /* Unique humans not tied to quests. - */ - MON("Medusa", S_HUMAN, LVL(20, 12, 2, 50, -15), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 1, 8), - ATTK(AT_GAZE, AD_STON, 0, 0), ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HISS, MZ_LARGE), MR_POISON | MR_STONE, - MR_POISON | MR_STONE, M1_FLY | M1_SWIM | M1_AMPHIBIOUS | M1_HUMANOID - | M1_POIS | M1_OMNIVORE, - M2_NOPOLY | M2_HOSTILE | M2_STRONG | M2_PNAME | M2_FEMALE, - M3_WAITFORU | M3_INFRAVISIBLE, 25, CLR_BRIGHT_GREEN), - MON("Wizard of Yendor", S_HUMAN, LVL(30, 12, -8, 100, A_NONE), - (G_NOGEN | G_UNIQ), - A(ATTK(AT_CLAW, AD_SAMU, 2, 12), ATTK(AT_MAGC, AD_SPEL, 0, 0), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN), MR_FIRE | MR_POISON, - MR_FIRE | MR_POISON, - M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS - | M1_TPORT | M1_TPORT_CNTRL | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_PRINCE - | M2_MALE | M2_MAGIC, - M3_COVETOUS | M3_WAITFORU | M3_INFRAVISIBLE, 34, HI_LORD), - MON("Croesus", S_HUMAN, LVL(20, 15, 0, 40, 15), (G_UNIQ | G_NOGEN), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARD, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY - | M2_PNAME | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS - | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, 22, HI_LORD), -#ifdef CHARON - MON("Charon", S_HUMAN, LVL(76, 18, -5, 120, 0), - (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TUCH, AD_PLYS, 1, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_FERRY, MZ_HUMAN), - MR_FIRE | MR_COLD | MR_POISON | MR_STONE, 0, - M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_PNAME | M2_MALE | M2_GREEDY - | M2_COLLECT, - M3_INFRAVISIBLE, 38, CLR_WHITE), -#endif - /* - * ghosts - */ - MON("ghost", S_GHOST, LVL(10, 3, -5, 50, -5), (G_NOCORPSE | G_NOGEN), - A(ATTK(AT_TUCH, AD_PHYS, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 0, MS_SILENT, MZ_HUMAN), - MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID, - M2_NOPOLY | M2_UNDEAD | M2_STALK | M2_HOSTILE, M3_INFRAVISION, - 12, CLR_GRAY), - MON("shade", S_GHOST, LVL(12, 10, 10, 0, 0), (G_NOCORPSE | G_NOGEN), - A(ATTK(AT_TUCH, AD_PLYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 0, MS_WAIL, MZ_HUMAN), - MR_COLD | MR_DISINT | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_BREATHLESS | M1_WALLWALK | M1_HUMANOID | M1_UNSOLID - | M1_SEE_INVIS, - M2_NOPOLY | M2_UNDEAD | M2_WANDER | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISION, 14, CLR_BLACK), - /* - * (major) demons - */ - MON("water demon", S_DEMON, LVL(8, 12, -4, 30, -7), - (G_NOCORPSE | G_NOGEN), - A(ATTK(AT_WEAP, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), - ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_DJINNI, MZ_HUMAN), MR_FIRE | MR_POISON, 0, - M1_HUMANOID | M1_POIS | M1_SWIM, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BLUE), - /* standard demons & devils - */ -#define SEDUCTION_ATTACKS_YES \ - A(ATTK(AT_BITE, AD_SSEX, 0, 0), ATTK(AT_CLAW, AD_PHYS, 1, 3), \ - ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK) -#define SEDUCTION_ATTACKS_NO \ - A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), \ - ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK) - /* incubus and succubus */ - MON3("incubus", "succubus", "amorous demon", - S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1), - SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN), - MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS, - M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), - MON("horned devil", S_DEMON, LVL(6, 9, -5, 50, 11), - (G_HELL | G_NOCORPSE | 2), - A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - ATTK(AT_BITE, AD_PHYS, 2, 3), ATTK(AT_STNG, AD_PHYS, 1, 3), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0, - M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_BROWN), - /* Used by AD&D for a type of demon, originally one of the Furies - and spelled this way */ - MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10), - (G_HELL | G_NOCORPSE | G_SGROUP | 2), - A(ATTK(AT_WEAP, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0, - M1_HUMANOID | M1_POIS, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY - | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED), - MON("barbed devil", S_DEMON, LVL(8, 12, 0, 35, 8), - (G_HELL | G_NOCORPSE | G_SGROUP | 2), - A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), - ATTK(AT_STNG, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0, - M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, 10, CLR_RED), - MON("marilith", S_DEMON, LVL(7, 12, -6, 80, -12), - (G_HELL | G_NOCORPSE | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), - ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), - ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4)), - SIZ(WT_HUMAN, 400, MS_CUSS, MZ_LARGE), MR_FIRE | MR_POISON, 0, - M1_HUMANOID | M1_SLITHY | M1_SEE_INVIS | M1_POIS, - M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED), - MON("vrock", S_DEMON, LVL(8, 12, 0, 50, -9), - (G_HELL | G_NOCORPSE | G_SGROUP | 2), - A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_CLAW, AD_PHYS, 1, 8), - ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, - M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_RED), - MON("hezrou", S_DEMON, LVL(9, 6, -2, 55, -10), - (G_HELL | G_NOCORPSE | G_SGROUP | 2), - A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), - ATTK(AT_BITE, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, - M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, 12, CLR_RED), - MON("bone devil", S_DEMON, LVL(9, 15, -1, 40, -9), - (G_HELL | G_NOCORPSE | G_SGROUP | 2), - A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, - M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 13, CLR_GRAY), - MON("ice devil", S_DEMON, LVL(11, 6, -4, 55, -12), - (G_HELL | G_NOCORPSE | 2), - A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_COLD, 3, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), - MR_FIRE | MR_COLD | MR_POISON, 0, M1_SEE_INVIS | M1_POIS, - M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, 14, CLR_WHITE), - MON("nalfeshnee", S_DEMON, LVL(11, 9, -1, 65, -11), - (G_HELL | G_NOCORPSE | 1), - A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), - ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SPELL, MZ_LARGE), MR_FIRE | MR_POISON, 0, - M1_HUMANOID | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_RED), - MON("pit fiend", S_DEMON, LVL(13, 6, -3, 65, -13), - (G_HELL | G_NOCORPSE | 2), - A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_WEAP, AD_PHYS, 4, 2), - ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GROWL, MZ_LARGE), MR_FIRE | MR_POISON, 0, - M1_SEE_INVIS | M1_POIS, - M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 16, CLR_RED), - MON("sandestin", S_DEMON, LVL(13, 12, 4, 60, -5), - (G_HELL | G_NOCORPSE | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 400, MS_CUSS, MZ_HUMAN), MR_STONE, 0, M1_HUMANOID, - M2_NOPOLY | M2_STALK | M2_STRONG | M2_COLLECT | M2_SHAPESHIFTER, - M3_INFRAVISIBLE | M3_INFRAVISION, 15, CLR_GRAY), - MON("balrog", S_DEMON, LVL(16, 5, -2, 75, -14), (G_HELL | G_NOCORPSE | 1), - A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), MR_FIRE | MR_POISON, 0, - M1_FLY | M1_SEE_INVIS | M1_POIS, - M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, - M3_INFRAVISIBLE | M3_INFRAVISION, 20, CLR_RED), - /* Named demon lords & princes plus Arch-Devils. - * (their order matters; see minion.c) - */ - MON("Juiblex", S_DEMON, LVL(50, 3, -7, 65, -15), - (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_ENGL, AD_DISE, 4, 10), ATTK(AT_SPIT, AD_ACID, 3, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 0, MS_GURGLE, MZ_LARGE), - MR_FIRE | MR_POISON | MR_ACID | MR_STONE, 0, - M1_AMPHIBIOUS | M1_AMORPHOUS | M1_NOHEAD | M1_FLY | M1_SEE_INVIS - | M1_ACID | M1_POIS, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY - | M2_LORD | M2_MALE, - M3_WAITFORU | M3_WANTSAMUL | M3_INFRAVISION, 26, CLR_BRIGHT_GREEN), - MON("Yeenoghu", S_DEMON, LVL(56, 18, -5, 80, -15), - (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_CONF, 2, 8), - ATTK(AT_CLAW, AD_PLYS, 1, 6), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK, - NO_ATTK), - SIZ(900, 500, MS_ORC, MZ_LARGE), MR_FIRE | MR_POISON, 0, - M1_FLY | M1_SEE_INVIS | M1_POIS, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY - | M2_LORD | M2_MALE | M2_COLLECT, - M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 31, HI_LORD), - MON("Orcus", S_DEMON, LVL(66, 9, -6, 85, -20), - (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 4), - ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_MAGC, AD_SPEL, 8, 6), - ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK), - SIZ(1500, 500, MS_ORC, MZ_HUGE), MR_FIRE | MR_POISON, 0, - M1_FLY | M1_SEE_INVIS | M1_POIS, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY - | M2_PRINCE | M2_MALE | M2_COLLECT, - M3_WAITFORU | M3_WANTSBOOK | M3_WANTSAMUL | M3_INFRAVISIBLE - | M3_INFRAVISION, - 36, HI_LORD), - MON("Geryon", S_DEMON, LVL(72, 3, -3, 75, 15), - (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), - ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 500, MS_BRIBE, MZ_HUGE), MR_FIRE | MR_POISON, 0, - M1_FLY | M1_SEE_INVIS | M1_POIS | M1_SLITHY, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY - | M2_PRINCE | M2_MALE, - M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 36, HI_LORD), - MON("Dispater", S_DEMON, LVL(78, 15, -2, 80, 15), - (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_MAGC, AD_SPEL, 6, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 500, MS_BRIBE, MZ_HUMAN), MR_FIRE | MR_POISON, 0, - M1_FLY | M1_SEE_INVIS | M1_POIS | M1_HUMANOID, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY - | M2_PRINCE | M2_MALE | M2_COLLECT, - M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 40, HI_LORD), - MON("Baalzebub", S_DEMON, LVL(89, 9, -5, 85, 20), - (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_BITE, AD_DRST, 2, 6), ATTK(AT_GAZE, AD_STUN, 2, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 500, MS_BRIBE, MZ_LARGE), MR_FIRE | MR_POISON, 0, - M1_FLY | M1_SEE_INVIS | M1_POIS, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY - | M2_PRINCE | M2_MALE, - M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION, - 45, HI_LORD), - MON("Asmodeus", S_DEMON, LVL(105, 12, -7, 90, 20), - (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_MAGC, AD_COLD, 6, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1500, 500, MS_BRIBE, MZ_HUGE), MR_FIRE | MR_COLD | MR_POISON, 0, - M1_FLY | M1_SEE_INVIS | M1_HUMANOID | M1_POIS, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG - | M2_NASTY | M2_PRINCE | M2_MALE, - M3_WANTSAMUL | M3_WAITFORU | M3_INFRAVISIBLE | M3_INFRAVISION, - 53, HI_LORD), - MON("Demogorgon", S_DEMON, LVL(106, 15, -8, 95, -20), - (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_MAGC, AD_SPEL, 8, 6), ATTK(AT_STNG, AD_DRLI, 1, 4), - ATTK(AT_CLAW, AD_DISE, 1, 6), ATTK(AT_CLAW, AD_DISE, 1, 6), NO_ATTK, - NO_ATTK), - SIZ(1500, 500, MS_GROWL, MZ_HUGE), MR_FIRE | MR_POISON, 0, - M1_FLY | M1_SEE_INVIS | M1_NOHANDS | M1_POIS, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY - | M2_PRINCE | M2_MALE, - M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, 57, HI_LORD), - /* Riders -- the Four Horsemen of the Apocalypse ("War" == player); - * depicted with '&' but do not have M2_DEMON set. - */ - MON("Death", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN), - A(ATTK(AT_TUCH, AD_DETH, 8, 8), ATTK(AT_TUCH, AD_DETH, 8, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN), - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, - M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD), - MON("Pestilence", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN), - A(ATTK(AT_TUCH, AD_PEST, 8, 8), ATTK(AT_TUCH, AD_PEST, 8, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN), - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, - M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD), - MON("Famine", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN), - A(ATTK(AT_TUCH, AD_FAMN, 8, 8), ATTK(AT_TUCH, AD_FAMN, 8, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 1, MS_RIDER, MZ_HUMAN), - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, - M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, - M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, 34, HI_LORD), - /* other demons - */ -#ifdef MAIL_STRUCTURES - MON("mail daemon", S_DEMON, LVL(56, 24, 10, 127, 0), - (G_NOGEN | G_NOCORPSE), - A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(600, 300, MS_SILENT, MZ_HUMAN), - MR_FIRE | MR_COLD | MR_ELEC | MR_SLEEP | MR_POISON | MR_STONE, 0, - M1_FLY | M1_SWIM | M1_BREATHLESS | M1_SEE_INVIS | M1_HUMANOID - | M1_POIS, - M2_NOPOLY | M2_STALK | M2_PEACEFUL, M3_INFRAVISIBLE | M3_INFRAVISION, - 26, CLR_BRIGHT_BLUE), -#endif - MON("djinni", S_DEMON, LVL(7, 12, 4, 30, 0), (G_NOGEN | G_NOCORPSE), - A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(1500, 400, MS_DJINNI, MZ_HUMAN), MR_POISON | MR_STONE, 0, - M1_HUMANOID | M1_FLY | M1_POIS, M2_NOPOLY | M2_STALK | M2_COLLECT, - M3_INFRAVISIBLE, 8, CLR_YELLOW), - /* - * sea monsters - */ - MON("jellyfish", S_EEL, LVL(3, 3, 6, 0, 0), (G_GENO | G_NOGEN), - A(ATTK(AT_STNG, AD_DRST, 3, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(80, 20, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, - M1_SWIM | M1_AMPHIBIOUS | M1_SLITHY | M1_NOLIMBS | M1_NOHEAD - | M1_NOTAKE | M1_POIS, - M2_HOSTILE, 0, 5, CLR_BLUE), - MON("piranha", S_EEL, LVL(5, 18, 4, 0, 0), (G_GENO | G_NOGEN | G_SGROUP), - A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(60, 30, MS_SILENT, MZ_SMALL), 0, 0, - M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS - | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, 0, 6, CLR_RED), - MON("shark", S_EEL, LVL(7, 12, 2, 0, 0), (G_GENO | G_NOGEN), - A(ATTK(AT_BITE, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(500, 350, MS_SILENT, MZ_LARGE), 0, 0, - M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS - | M1_CARNIVORE | M1_OVIPAROUS | M1_THICK_HIDE | M1_NOTAKE, - M2_HOSTILE, 0, 9, CLR_GRAY), - MON("giant eel", S_EEL, LVL(5, 9, -1, 0, 0), (G_GENO | G_NOGEN), - A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(200, 250, MS_SILENT, MZ_HUGE), 0, 0, - M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS - | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, M3_INFRAVISIBLE, 7, CLR_CYAN), - MON("electric eel", S_EEL, LVL(7, 10, -3, 0, 0), (G_GENO | G_NOGEN), - A(ATTK(AT_BITE, AD_ELEC, 4, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(200, 250, MS_SILENT, MZ_HUGE), MR_ELEC, MR_ELEC, - M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_SLITHY | M1_NOLIMBS - | M1_CARNIVORE | M1_OVIPAROUS | M1_NOTAKE, - M2_HOSTILE, M3_INFRAVISIBLE, 10, CLR_BRIGHT_BLUE), - MON("kraken", S_EEL, LVL(20, 3, 6, 0, -3), (G_GENO | G_NOGEN), - A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), - ATTK(AT_HUGS, AD_WRAP, 2, 6), ATTK(AT_BITE, AD_PHYS, 5, 4), NO_ATTK, - NO_ATTK), - SIZ(1800, 1000, MS_SILENT, MZ_HUGE), 0, 0, - M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_NOPOLY | M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_RED), - /* - * lizards, &c - */ - MON("newt", S_LIZARD, LVL(0, 6, 8, 0, 0), (G_GENO | 5), - A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(10, 20, MS_SILENT, MZ_TINY), 0, 0, - M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE, 0, 1, CLR_YELLOW), - MON("gecko", S_LIZARD, LVL(1, 6, 8, 0, 0), (G_GENO | 5), - A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(10, 20, MS_SQEEK, MZ_TINY), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 2, CLR_GREEN), - MON("iguana", S_LIZARD, LVL(2, 6, 7, 0, 0), (G_GENO | 5), - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(30, 30, MS_SILENT, MZ_TINY), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 3, CLR_BROWN), - MON("baby crocodile", S_LIZARD, LVL(3, 6, 7, 0, 0), G_GENO, - A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(200, 200, MS_SILENT, MZ_MEDIUM), 0, 0, - M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_HOSTILE, 0, 4, CLR_BROWN), - MON("lizard", S_LIZARD, LVL(5, 6, 6, 10, 0), (G_GENO | 5), - A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(10, 40, MS_SILENT, MZ_TINY), MR_STONE, MR_STONE, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, M2_HOSTILE, 0, 6, CLR_GREEN), - MON("chameleon", S_LIZARD, LVL(6, 5, 6, 10, 0), (G_GENO | 2), - A(ATTK(AT_BITE, AD_PHYS, 4, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(100, 100, MS_SILENT, MZ_TINY), 0, 0, - M1_ANIMAL | M1_NOHANDS | M1_CARNIVORE, - M2_NOPOLY | M2_HOSTILE | M2_SHAPESHIFTER, 0, 7, CLR_BROWN), - MON("crocodile", S_LIZARD, LVL(6, 9, 5, 0, 0), (G_GENO | 1), - A(ATTK(AT_BITE, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 1, 12), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_SILENT, MZ_LARGE), 0, 0, - M1_SWIM | M1_AMPHIBIOUS | M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS - | M1_OVIPAROUS | M1_CARNIVORE, - M2_STRONG | M2_HOSTILE, 0, 7, CLR_BROWN), - MON("salamander", S_LIZARD, LVL(8, 12, -1, 0, -9), (G_HELL | 1), - A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_TUCH, AD_FIRE, 1, 6), - ATTK(AT_HUGS, AD_PHYS, 2, 6), ATTK(AT_HUGS, AD_FIRE, 3, 6), NO_ATTK, - NO_ATTK), - SIZ(1500, 400, MS_MUMBLE, MZ_HUMAN), MR_SLEEP | MR_FIRE, MR_FIRE, - M1_HUMANOID | M1_SLITHY | M1_THICK_HIDE | M1_POIS, - M2_STALK | M2_HOSTILE | M2_COLLECT | M2_MAGIC, M3_INFRAVISIBLE, - 12, CLR_ORANGE), - - /* - * dummy monster needed for visual interface - * (marking it unique prevents figurines) - */ - MON("long worm tail", S_WORM_TAIL, LVL(0, 0, 0, 0, 0), - (G_NOGEN | G_NOCORPSE | G_UNIQ), - A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, 0, 0), 0, 0, 0L, M2_NOPOLY, 0, 1, CLR_BROWN), - /* Note: - * Worm tail must be between the normal monsters and the special - * quest & pseudo-character ones because an optimization in the - * random monster selection code assumes everything beyond here - * has the G_NOGEN and M2_NOPOLY attributes. - */ - - /* - * character classes - */ - MON("archeologist", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_TUNNEL | M1_NEEDPICK | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - 12, HI_DOMESTIC), - MON("barbarian", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - 12, HI_DOMESTIC), - MON3("caveman", "cavewoman", "cave dweller", - S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 12, HI_DOMESTIC), - MON("healer", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - 12, HI_DOMESTIC), - MON("knight", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - 12, HI_DOMESTIC), - MON("monk", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, - A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_HERBIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 11, HI_DOMESTIC), - MON3("priest", "priestess", "cleric", - S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 12, HI_DOMESTIC), - MON("ranger", S_HUMAN, LVL(10, 12, 10, 2, -3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - 12, HI_DOMESTIC), - MON("rogue", S_HUMAN, LVL(10, 12, 10, 1, -3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, - M3_INFRAVISIBLE, 12, HI_DOMESTIC), - MON("samurai", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - 12, HI_DOMESTIC), - MON("tourist", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, - 12, HI_DOMESTIC), - /* valk is lawful by default; player valk can be neutral, in which case - role_init() will change this monster and 'warrior' to be neutral too; - if a neutral valk leaves a bones file containing neutral warriors, - the latter will magically turn lawful if encountered by a lawful valk - or any non-valk (for bones on the dungeon side of the portal) */ - MON("valkyrie", S_HUMAN, LVL(10, 12, 10, 1, 1), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), MR_COLD, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT, - M3_INFRAVISIBLE, 12, HI_DOMESTIC), - MON("wizard", S_HUMAN, LVL(10, 12, 10, 3, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, 12, HI_DOMESTIC), - /* - * quest leaders - */ - MON("Lord Carnarvon", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 4, 8), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, - M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD), - MON("Pelias", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD), - MON("Shaman Karnov", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_CLRC, 2, 8), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD), -#if 0 /* OBSOLETE */ - /* Two for elves - one of each sex. - */ - MON("Earendil", S_HUMAN, - LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP, - M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, - M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG - | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD), - MON("Elwing", S_HUMAN, - LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP, - M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, - M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG - | M2_FEMALE | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD), -#endif - MON("Hippocrates", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 3, 8), - ATTK(AT_MAGC, AD_CLRC, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 22, HI_LORD), - MON("King Arthur", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD), - MON("Grand Master", S_HUMAN, LVL(25, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), - A(ATTK(AT_CLAW, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), - ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), - MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0, - M1_HUMANOID | M1_SEE_INVIS | M1_HERBIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_NASTY - | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_BLACK), - MON("Arch Priest", S_HUMAN, LVL(25, 15, 7, 90, 0), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), - ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), - MR_FIRE | MR_ELEC | MR_SLEEP | MR_POISON, 0, - M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_COLLECT - | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 30, CLR_WHITE), - MON("Orion", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 4, 8), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2200, 700, MS_LEADER, MZ_HUGE), 0, 0, - M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS | M1_SWIM | M1_AMPHIBIOUS, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, 22, HI_LORD), - /* Note: Master of Thieves is also the Tourist's nemesis. - */ - MON("Master of Thieves", S_HUMAN, LVL(20, 15, 0, 90, -20), - (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 2, 6), - ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), MR_STONE, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_MALE | M2_GREEDY - | M2_JEWELS | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 24, HI_LORD), - MON("Lord Sato", S_HUMAN, LVL(20, 15, 0, 90, 20), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD), - MON("Twoflower", S_HUMAN, LVL(20, 15, 10, 90, 0), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG | M2_MALE - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 22, HI_DOMESTIC), - /* for a valkyrie hero, Norn's alignment will be changed to match hero's - starting alignment */ - MON("Norn", S_HUMAN, LVL(20, 15, 0, 90, 0), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1800, 550, MS_LEADER, MZ_HUGE), MR_COLD, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_FEMALE - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 23, HI_LORD), - MON("Neferet the Green", S_HUMAN, LVL(20, 15, 0, 90, 0), - (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_MAGC, AD_SPEL, 2, 8), - ATTK(AT_MAGC, AD_SPEL, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_LEADER, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_FEMALE | M2_PNAME | M2_PEACEFUL | M2_STRONG - | M2_COLLECT | M2_MAGIC, - M3_CLOSE | M3_INFRAVISIBLE, 23, CLR_GREEN), - /* - * quest nemeses - */ - MON("Minion of Huhetotl", S_DEMON, LVL(16, 12, -2, 75, -14), - (G_NOCORPSE | G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), - ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_LARGE), - MR_FIRE | MR_POISON | MR_STONE, 0, M1_FLY | M1_SEE_INVIS | M1_POIS, - M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY - | M2_COLLECT, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - 23, CLR_RED), - MON("Thoth Amon", S_HUMAN, LVL(16, 12, 0, 10, -14), - (G_NOGEN | G_UNIQ | G_NOCORPSE), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), - ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_STRONG | M2_MALE | M2_STALK - | M2_HOSTILE | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, HI_LORD), - /* Multi-headed, possessing the breath attacks of all the other dragons - * (selected at random when attacking). Despite being a superset of - * gold dragon, does not emit light. - */ - MON("Chromatic Dragon", S_DRAGON, LVL(16, 12, 0, 30, -14), - (G_NOGEN | G_UNIQ), - A(ATTK(AT_BREA, AD_RBRE, 6, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), - ATTK(AT_CLAW, AD_SAMU, 2, 8), ATTK(AT_BITE, AD_PHYS, 4, 8), - ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_STNG, AD_PHYS, 1, 6)), - SIZ(WT_DRAGON, 1700, MS_NEMESIS, MZ_GIGANTIC), - MR_FIRE | MR_COLD | MR_SLEEP | MR_DISINT | MR_ELEC | MR_POISON - | MR_ACID | MR_STONE, - MR_FIRE | MR_COLD | MR_SLEEP | MR_DISINT | MR_ELEC | MR_POISON - | MR_STONE, - M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS | M1_POIS, - M2_NOPOLY | M2_HOSTILE | M2_FEMALE | M2_STALK | M2_STRONG | M2_NASTY - | M2_GREEDY | M2_JEWELS | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 23, HI_LORD), -#if 0 /* OBSOLETE */ - MON("Goblin King", S_ORC, - LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), - ATTK(AT_CLAW, AD_SAMU, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_ORC | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY - | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - 18, HI_LORD), -#endif - MON("Cyclops", S_GIANT, LVL(18, 12, 0, 0, -15), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_WEAP, AD_PHYS, 4, 8), - ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(1900, 700, MS_NEMESIS, MZ_HUGE), MR_STONE, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_GIANT | M2_STRONG | M2_ROCKTHROW | M2_STALK - | M2_HOSTILE | M2_NASTY | M2_MALE | M2_JEWELS | M2_COLLECT, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - 23, CLR_GRAY), - MON("Ixoth", S_DRAGON, LVL(15, 12, -1, 20, -14), (G_NOGEN | G_UNIQ), - A(ATTK(AT_BREA, AD_FIRE, 8, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), - ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_PHYS, 2, 4), - ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK), - SIZ(WT_DRAGON, 1600, MS_NEMESIS, MZ_GIGANTIC), MR_FIRE | MR_STONE, - MR_FIRE, - M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE | M1_SEE_INVIS, - M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_NASTY - | M2_STALK | M2_GREEDY | M2_JEWELS | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 22, CLR_RED), - MON("Master Kaen", S_HUMAN, LVL(25, 12, -10, 10, -20), (G_NOGEN | G_UNIQ), - A(ATTK(AT_CLAW, AD_PHYS, 16, 2), ATTK(AT_CLAW, AD_PHYS, 16, 2), - ATTK(AT_MAGC, AD_CLRC, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, - MR_POISON, M1_HUMANOID | M1_HERBIVORE | M1_SEE_INVIS, - M2_NOPOLY | M2_HUMAN | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG - | M2_NASTY | M2_STALK | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 31, HI_LORD), - MON("Nalzok", S_DEMON, LVL(16, 12, -2, 85, -127), - (G_NOGEN | G_UNIQ | G_NOCORPSE), - A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), - ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_LARGE), - MR_FIRE | MR_POISON | MR_STONE, 0, M1_FLY | M1_SEE_INVIS | M1_POIS, - M2_NOPOLY | M2_DEMON | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG - | M2_STALK | M2_NASTY | M2_COLLECT, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - 23, CLR_RED), - MON("Scorpius", S_SPIDER, LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ), - A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 6), - ATTK(AT_STNG, AD_DISE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), MR_POISON | MR_STONE, MR_POISON, - M1_ANIMAL | M1_NOHANDS | M1_OVIPAROUS | M1_POIS | M1_CARNIVORE, - M2_NOPOLY | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK - | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU, 17, HI_LORD), - MON("Master Assassin", S_HUMAN, LVL(15, 12, 0, 30, 18), - (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_DRST, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 8), - ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_HOSTILE | M2_STALK - | M2_NASTY | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, HI_LORD), - /* A renegade daimyo who led a 13 year civil war against the shogun - * of his time. - */ - MON("Ashikaga Takauji", S_HUMAN, LVL(15, 12, 0, 40, -13), - (G_NOGEN | G_UNIQ | G_NOCORPSE), - A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), - ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_STALK - | M2_NASTY | M2_MALE | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 19, HI_LORD), - /* - * Note: the Master of Thieves was defined above. - */ - MON("Lord Surtur", S_GIANT, LVL(15, 12, 2, 50, 12), (G_NOGEN | G_UNIQ), - A(ATTK(AT_WEAP, AD_PHYS, 2, 10), ATTK(AT_WEAP, AD_PHYS, 2, 10), - ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(2250, 850, MS_NEMESIS, MZ_HUGE), MR_FIRE | MR_STONE, MR_FIRE, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_GIANT | M2_MALE | M2_PNAME | M2_HOSTILE | M2_STALK - | M2_STRONG | M2_NASTY | M2_ROCKTHROW | M2_JEWELS | M2_COLLECT, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, - 19, HI_LORD), - MON("Dark One", S_HUMAN, LVL(15, 12, 0, 80, -10), - (G_NOGEN | G_UNIQ | G_NOCORPSE), - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), - ATTK(AT_CLAW, AD_SAMU, 1, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_HOSTILE | M2_STALK | M2_NASTY - | M2_COLLECT | M2_MAGIC, - M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, 20, CLR_BLACK), - /* - * quest "guardians" - */ - MON("student", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("chieftain", S_HUMAN, LVL(5, 12, 10, 10, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("neanderthal", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), -#if 0 /* OBSOLETE */ - MON("High-elf", S_HUMAN, - LVL(5, 12, 10, 10, -7), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_CLRC, 0, 0), - NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_ELF, 350, MS_GUARDIAN, MZ_HUMAN), MR_SLEEP, MR_SLEEP, - M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, - M2_NOPOLY | M2_ELF | M2_PEACEFUL | M2_COLLECT, - M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC), -#endif - /* attendants used to lawful but have been changed to netural because - grow_up() promotes them to healer and the latter is always neutral */ - MON("attendant", S_HUMAN, LVL(5, 12, 10, 10, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("page", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("abbot", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, - A(ATTK(AT_CLAW, AD_PHYS, 8, 2), ATTK(AT_KICK, AD_STUN, 3, 2), - ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_HERBIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 8, HI_DOMESTIC), - MON("acolyte", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 8, HI_DOMESTIC), - MON("hunter", S_HUMAN, LVL(5, 12, 10, 10, -7), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISION | M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("thug", S_HUMAN, LVL(5, 12, 10, 10, -3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL - | M2_STRONG | M2_GREEDY | M2_COLLECT, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("ninja", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_HOSTILE | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("roshi", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_PEACEFUL | M2_STRONG | M2_COLLECT, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("guide", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL - | M2_STRONG | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, 8, HI_DOMESTIC), - /* warriors used to be chaotic but have been changed to lawful because - grow_up() promotes them to valkyrie; for a valkyrie hero, they might - be changed to neutral at game start; see the valkyrie comment above */ - MON("warrior", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL - | M2_STRONG | M2_COLLECT | M2_FEMALE, - M3_INFRAVISIBLE, 7, HI_DOMESTIC), - MON("apprentice", S_HUMAN, LVL(5, 12, 10, 30, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, - NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(WT_HUMAN, 400, MS_GUARDIAN, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_PEACEFUL - | M2_STRONG | M2_COLLECT | M2_MAGIC, - M3_INFRAVISIBLE, 8, HI_DOMESTIC), +struct permonst mons_init[NUMMONS + 1] = { +#include "monsters.h" /* * array terminator */ MON("", 0, LVL(0, 0, 0, 0, 0), (0), A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), - SIZ(0, 0, 0, 0), 0, 0, 0L, 0L, 0, 0, 0) + SIZ(0, 0, 0, 0), 0, 0, 0L, 0L, 0, 0, 0, 0) }; -#endif /* !SPLITMON_1 */ - -#ifndef SPLITMON_1 void monst_globals_init(void); /* in hack.h but we're using config.h */ @@ -3327,6 +88,5 @@ monst_globals_init(void) const struct attack c_sa_yes[NATTK] = SEDUCTION_ATTACKS_YES; const struct attack c_sa_no[NATTK] = SEDUCTION_ATTACKS_NO; -#endif /*monst.c*/ diff --git a/src/objects.c b/src/objects.c index f64293206..8bccf6260 100644 --- a/src/objects.c +++ b/src/objects.c @@ -2,1181 +2,27 @@ /* 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_ */ +#include "objclass.h" -/* objects have symbols: ) [ = " ( % ! ? + / $ * ` 0 _ . */ +NEARDATA struct objdescr obj_descr_init[NUM_OBJECTS + 1] = { +#define OBJECTS_DESCR_INIT +#include "objects.h" +#undef OBJECTS_DESCR_INIT +}; -/* - * 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_ - -/* perform recursive compilation for second structure */ -#undef OBJ -#undef OBJECT -#define OBJECTS_PASS_2_ -#include "objects.c" - -/* clang-format on */ -/* *INDENT-ON* */ +NEARDATA struct objclass obj_init[NUM_OBJECTS + 1] = { +#define OBJECTS_INIT +#include "objects.h" +#undef OBJECTS_INIT +}; void objects_globals_init(void); /* in hack.h but we're using config.h */ @@ -1190,6 +36,4 @@ objects_globals_init(void) memcpy(objects, obj_init, sizeof(objects)); } -#endif /* !OBJECTS_PASS_2_ */ - /*objects.c*/ diff --git a/src/shknam.c b/src/shknam.c index fb12771e2..2b151f09f 100644 --- a/src/shknam.c +++ b/src/shknam.c @@ -197,7 +197,7 @@ static const char *const shkhealthfoods[] = { * The iprobs array in each entry defines the probabilities for various kinds * of objects to be present in the given shop type. You can associate with * each percentage either a generic object type (represented by one of the - * *_CLASS macros) or a specific object (represented by an onames.h define). + * *_CLASS enum value) or a specific object enum value. * In the latter case, prepend it with a unary minus so the code can know * (by testing the sign) whether to use mkobj() or mksobj(). */ diff --git a/src/version.c b/src/version.c index 0b197d4af..ba972aeb2 100644 --- a/src/version.c +++ b/src/version.c @@ -5,50 +5,9 @@ #include "hack.h" #include "dlb.h" -#include "date.h" -#if defined(CROSSCOMPILE) -struct cross_target_s cross_target = { - /* https://groups.google.com/forum/#!original/ - comp.sources.games/91SfKYg_xzI/dGnR3JnspFkJ */ - "Tue, 28-Jul-87 13:18:57 EDT", - "Version 1.0, built Jul 28 13:18:57 1987.", - "0000000000000000000000000000000000000000", - "master", - "1.0.0-0", - "NetHack Version 1.0.0-0 - last build Tue Jul 28 13:18:57 1987.", - 0x01010000UL, - 0x00000000UL, - 0x00000000UL, - 0x00000000UL, - 0x00000000UL, - 0x00000000UL, - 554476737UL, -}; -#endif /* CROSSCOMPILE */ - -#if defined(NETHACK_GIT_SHA) -const char *NetHack_git_sha -#if !defined(CROSSCOMPILE) || !defined(CROSSCOMPILE_TARGET) - = NETHACK_GIT_SHA -#else -#ifdef NETHACK_HOST_GIT_SHA - = NETHACK_HOST_GIT_SHA -#endif -#endif -; -#endif - -#if defined(NETHACK_GIT_BRANCH) -const char *NetHack_git_branch -#if !defined(CROSSCOMPILE) || !defined(CROSSCOMPILE_TARGET) - = NETHACK_GIT_BRANCH -#else -#ifdef NETHACK_HOST_GIT_BRANCH - = NETHACK_HOST_GIT_BRANCH -#endif -#endif -; +#ifndef OPTIONS_AT_RUNTIME +#define OPTIONS_AT_RUNTIME #endif static void insert_rtoption(char *); @@ -57,17 +16,16 @@ static void insert_rtoption(char *); char * version_string(char *buf) { - return strcpy(buf, VERSION_STRING); + return strcpy(buf, nomakedefs.version_string); } /* fill and return the given buffer with the long nethack version string */ char * getversionstring(char *buf) { - Strcpy(buf, VERSION_ID); + Strcpy(buf, nomakedefs.version_id); -#if defined(RUNTIME_PORT_ID) \ - || defined(NETHACK_GIT_SHA) || defined(NETHACK_GIT_BRANCH) +#if defined(RUNTIME_PORT_ID) { int c = 0; #if defined(RUNTIME_PORT_ID) @@ -82,28 +40,28 @@ getversionstring(char *buf) #if defined(RUNTIME_PORT_ID) tmp = get_port_id(tmpbuf); if (tmp) - Sprintf(eos(buf), "%s%s", c++ ? "," : "", tmp); + Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1, + "%s%s", c++ ? "," : "", tmp); #endif -#if defined(NETHACK_GIT_SHA) - if (NetHack_git_sha) - Sprintf(eos(buf), "%s%s", c++ ? "," : "", NetHack_git_sha); -#endif -#if defined(NETHACK_GIT_BRANCH) + if (nomakedefs.git_sha) + Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1, + "%s%s", c++ ? "," : "", nomakedefs.git_sha); #if (NH_DEVEL_STATUS != NH_STATUS_RELEASED) - if (NetHack_git_branch) - Sprintf(eos(buf), "%sbranch:%s", - c++ ? "," : "", NetHack_git_branch); -#endif + if (nomakedefs.git_branch) + Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1, + "%sbranch:%s", + c++ ? "," : "", nomakedefs.git_branch); #endif if (c) - Strcat(buf, ")"); + Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1, + "%s", ")"); else /* if nothing has been added, strip " (" back off */ *p = '\0'; if (dotoff) - Strcat(buf, "."); + Snprintf(eos(buf), (sizeof buf - strlen(buf)) - 1, + "%s", "."); } -#endif /* RUNTIME_PORT_ID || NETHACK_GIT_SHA || NETHACK_GIT_BRANCH */ - +#endif /* RUNTIME_PORT_ID */ return buf; } @@ -148,7 +106,7 @@ doextversion(void) (const char *) 0 }; #endif /*0*/ -#if defined(OPTIONS_AT_RUNTIME) || defined(CROSSCOMPILE_TARGET) +#if defined(OPTIONS_AT_RUNTIME) use_dlb = FALSE; #else done_rt = TRUE; @@ -267,7 +225,7 @@ early_version_info(boolean pastebuf) raw_printf("%s", buf); if (pastebuf) { -#if defined(RUNTIME_PASTEBUF_SUPPORT) && !defined(LIBNH) +#if defined(RUNTIME_PASTEBUF_SUPPORT) && !defined(LIBNH) /* * Call a platform/port-specific routine to insert the * version information into a paste buffer. Useful for @@ -327,7 +285,7 @@ comp_times(long filetime) { /* BUILD_TIME is constant but might have L suffix rather than UL; 'filetime' is historically signed but ought to have been unsigned */ - return (boolean) ((unsigned long) filetime < (unsigned long) BUILD_TIME); + return (boolean) ((unsigned long) filetime < (unsigned long) nomakedefs.build_time); } #endif @@ -338,9 +296,9 @@ check_version(struct version_info *version_data, const char *filename, if ( #ifdef VERSION_COMPATIBILITY version_data->incarnation < VERSION_COMPATIBILITY - || version_data->incarnation > VERSION_NUMBER + || version_data->incarnation > nomakedefs.version_number #else - version_data->incarnation != VERSION_NUMBER + version_data->incarnation != nomakedefs.version_number #endif ) { if (complain) @@ -348,17 +306,17 @@ check_version(struct version_info *version_data, const char *filename, return FALSE; } else if ( #ifndef IGNORED_FEATURES - version_data->feature_set != VERSION_FEATURES + version_data->feature_set != nomakedefs.version_features #else - (version_data->feature_set & ~IGNORED_FEATURES) - != (VERSION_FEATURES & ~IGNORED_FEATURES) + (version_data->feature_set & ~nomakedefs.ignored_features) + != (VERSION_FEATURES & ~nomakedefs.ignored_features) #endif || ((utdflags & UTD_SKIP_SANITY1) == 0 - && version_data->entity_count != VERSION_SANITY1) + && version_data->entity_count != nomakedefs.version_sanity1) || ((utdflags & UTD_CHECKSIZES) && - (version_data->struct_sizes1 != VERSION_SANITY2)) + (version_data->struct_sizes1 != nomakedefs.version_sanity2)) || ((utdflags & UTD_CHECKSIZES) && - (version_data->struct_sizes2 != VERSION_SANITY3))) { + (version_data->struct_sizes2 != nomakedefs.version_sanity3))) { if (complain) pline("Configuration incompatibility for file \"%s\".", filename); return FALSE; @@ -421,23 +379,16 @@ store_formatindicator(NHFILE *nhfp) void store_version(NHFILE *nhfp) { -#if !defined(CROSSCOMPILE) || !defined(CROSSCOMPILE_TARGET) - static const struct version_info version_data = { - VERSION_NUMBER, VERSION_FEATURES, - VERSION_SANITY1, VERSION_SANITY2, VERSION_SANITY3 -#else struct version_info version_data = { 0UL,0UL,0UL,0UL,0Ul -#endif }; -#if defined(CROSSCOMPILE) && defined(CROSSCOMPILE_TARGET) - version_data.incarnation = VERSION_NUMBER; /* actual version number */ - version_data.feature_set = VERSION_FEATURES; /* bitmask of config settings */ - version_data.entity_count = VERSION_SANITY1; /* # of monsters and objects */ - version_data.struct_sizes1 = VERSION_SANITY2; /* size of key structs */ - version_data.struct_sizes2 = VERSION_SANITY3; /* size of more key structs */ -#endif + version_data.incarnation = nomakedefs.version_number; /* actual version number */ + version_data.feature_set = nomakedefs.version_features; /* bitmask of config settings */ + version_data.entity_count = nomakedefs.version_sanity1; /* # of monsters and objects */ + version_data.struct_sizes1 = nomakedefs.version_sanity2; /* size of key structs */ + version_data.struct_sizes2 = nomakedefs.version_sanity3; /* size of more key structs */ + if (nhfp->structlevel) { bufoff(nhfp->fd); /* bwrite() before bufon() uses plain write() */ @@ -504,10 +455,10 @@ copyright_banner_line(int indx) if (indx == 2) return COPYRIGHT_BANNER_B; #endif -#ifdef COPYRIGHT_BANNER_C + if (indx == 3) - return COPYRIGHT_BANNER_C; -#endif + return nomakedefs.copyright_banner_c; + #ifdef COPYRIGHT_BANNER_D if (indx == 4) return COPYRIGHT_BANNER_D; diff --git a/sys/msdos/Makefile.GCC b/sys/msdos/Makefile.GCC index 52cf9e080..13e650548 100644 --- a/sys/msdos/Makefile.GCC +++ b/sys/msdos/Makefile.GCC @@ -383,7 +383,7 @@ RM_H = $(INCL)/align.h $(INCL)/rm.h SKILLS_H = $(INCL)/skills.h SP_LEV_H = $(INCL)/align.h $(INCL)/sp_lev.h YOUPROP_H = $(PERMONST_H) $(MONDATA_H) $(INCL)/prop.h \ - $(INCL)/pm.h $(INCL)/youprop.h + $(INCL)/youprop.h YOU_H = $(MONST_H) $(YOUPROP_H) $(INCL)/align.h \ $(INCL)/attrib.h $(INCL)/you.h DISPLAY_H = $(MONDATA_H) $(INCL)/vision.h $(INCL)/display.h @@ -392,7 +392,7 @@ PCCONF_H = $(INCL)/micro.h $(INCL)/system.h $(INCL)/pcconf.h \ CONFIG_H = $(GLOBAL_H) $(INCL)/fnamesiz.h $(INCL)/tradstdc.h \ $(INCL)/config1.h $(INCL)/config.h DECL_H = $(YOU_H) $(INCL)/spell.h $(INCL)/color.h \ - $(INCL)/obj.h $(INCL)/onames.h $(INCL)/pm.h \ + $(INCL)/obj.h $(INCL)/objects.h \ $(INCL)/decl.h GLOBAL_H = $(PCCONF_H) $(INCL)/coord.h $(INCL)/global.h HACK_H = $(CONFIG_H) $(INCL)/context.h $(DUNGEON_H) \ @@ -547,8 +547,8 @@ default: $(GAMEFILE) util: $(O)utility.tag -$(O)utility.tag: $(INCL)/date.h $(INCL)/trap.h $(INCL)/onames.h \ - $(INCL)/pm.h $(TILEUTIL) +$(O)utility.tag: $(INCL)/date.h $(INCL)/trap.h $(INCL)/objects.h \ + $(TILEUTIL) $(subst /,\,echo utilities made > $@) tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe diff --git a/sys/unix/Install.unx b/sys/unix/Install.unx index b7a591881..357f3257e 100644 --- a/sys/unix/Install.unx +++ b/sys/unix/Install.unx @@ -50,8 +50,8 @@ the file NewInstall.unx. 6. Edit the top sections of the src and util Makefiles. (If you are doing a full recompile, or if you got your files from someplace besides the official distribution, type 'touch makedefs.c' to make sure certain files - (onames.h, pm.h) get remade instead of relying on the potentially - troublesome timestamps.) Then type 'make' in src and go get a cup of + get remade instead of relying on the potentially troublesome timestamps.) + Then type 'make' in src and go get a cup of coffee or take a nap, depending on the speed of your system. You should now have created the game executable. diff --git a/sys/unix/Makefile.src b/sys/unix/Makefile.src index 6e1c60b44..1aa7ab18d 100644 --- a/sys/unix/Makefile.src +++ b/sys/unix/Makefile.src @@ -464,7 +464,7 @@ CONFIG_H = ../src/config.h-t HACK_H = ../src/hack.h-t # all .c that are part of the main NetHack program and are not operating- or -# windowing-system specific +# windowing-system specific. Do not include date.c in this list. HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \ botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \ do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \ @@ -514,7 +514,7 @@ VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) $(CHAINSRC) $(GENCSRC) CSOURCES = $(HACKCSRC) $(SYSCSRC) $(WINCSRC) $(CHAINSRC) $(GENCSRC) -# all .h files except date.h, onames.h, and pm.h which would +# all .h files except date.h, which would # cause dependency loops if run through "make depend" # and dgn_file.h, special level & dungeon files. # @@ -522,19 +522,22 @@ HACKINCL = align.h artifact.h artilist.h attrib.h botl.h \ color.h config.h config1.h context.h coord.h decl.h \ display.h dlb.h dungeon.h engrave.h extern.h flag.h fnamesiz.h \ func_tab.h global.h warnings.h hack.h lint.h mextra.h mfndpos.h \ - micro.h mkroom.h \ - monattk.h mondata.h monflag.h monst.h obj.h objclass.h \ - optlist.h patchlevel.h pcconf.h permonst.h prop.h rect.h \ - region.h sym.h defsym.h rm.h sp_lev.h spell.h sys.h system.h \ - tcap.h timeout.h tradstdc.h trap.h unixconf.h vision.h vmsconf.h \ - wintty.h wincurs.h winX.h winprocs.h wintype.h you.h youprop.h + micro.h mkroom.h monattk.h mondata.h monflag.h monst.h monsters.h \ + obj.h objects.h objclass.h optlist.h patchlevel.h pcconf.h \ + permonst.h prop.h rect.h region.h sym.h defsym.h rm.h sp_lev.h \ + spell.h sys.h system.h tcap.h timeout.h tradstdc.h trap.h unixconf.h \ + vision.h vmsconf.h wintty.h wincurs.h winX.h winprocs.h wintype.h \ + you.h youprop.h -HSOURCES = $(HACKINCL) date.h onames.h pm.h dgn_file.h +HSOURCES = $(HACKINCL) dgn_file.h # the following .o's _must_ be made before any others (for makedefs) FIRSTOBJ = monst.o objects.o HOSTOBJ = $(FIRSTOBJ) alloc.o drawing.o +# +# $(TARGETPFX)date.o is not included in this list +# HOBJ = $(TARGETPFX)allmain.o $(TARGETPFX)alloc.o \ $(TARGETPFX)apply.o $(TARGETPFX)artifact.o $(TARGETPFX)attrib.o \ $(TARGETPFX)ball.o $(TARGETPFX)bones.o $(TARGETPFX)botl.o \ @@ -576,6 +579,9 @@ HOBJ = $(TARGETPFX)allmain.o $(TARGETPFX)alloc.o \ $(TARGETPFX)write.o $(TARGETPFX)zap.o \ $(REGEXOBJ) $(RANDOBJ) $(SYSOBJ) $(WINOBJ) $(HINTOBJ) \ $(TARGETPFX)version.o +# +DATE_O = $(TARGETPFX)date.o + # the .o files from the HACKCSRC, SYSSRC, and WINSRC lists # first target is also the default target for 'make' without any arguments @@ -588,40 +594,40 @@ pregame: $(GAME): pregame $(SYSTEM) @echo "$(GAME) is up to date." -Sysunix: $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile +Sysunix: $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \ - $(HOBJ) $(WINLIB) $(TARGET_LIBS) $(LUALIB) + $(HOBJ) $(DATE_O) $(WINLIB) $(TARGET_LIBS) $(LUALIB) @touch Sysunix -Sys3B2: $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile +Sys3B2: $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \ - $(HOBJ) $(WINLIB) $(LUALIB) -lmalloc + $(HOBJ) $(DATE_O) $(WINLIB) $(LUALIB) -lmalloc @touch Sys3B2 -Sysatt: $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile +Sysatt: $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile @echo "Loading $(GAME)." $(AT)$(LD) $(TARGET_LFLAGS) /lib/crt0s.o /lib/shlib.ifile -o $(GAMEBIN) \ - $(HOSTOBJ) $(HOBJ) $(LUALIB) + $(HOSTOBJ) $(HOBJ) $(DATE_O) $(LUALIB) @touch Sysatt -Systos: $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile +Systos: $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \ - $(HOBJ) $(WINLIB) $(LUALIB) + $(HOBJ) $(DATE_O) $(WINLIB) $(LUALIB) @touch Systos -SysV-AT: DUMB.Setup $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile +SysV-AT: DUMB.Setup $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \ - $(HOBJ) $(WINLIB) $(LUALIB) + $(HOBJ) $(DATE_O) $(WINLIB) $(LUALIB) @touch SysV-AT -SysBe: $(HOSTOBJ) $(HOBJ) $(BUILDMORE) Makefile +SysBe: $(HOSTOBJ) $(HOBJ) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAME) \ - $(HOBJ) $(WINLIB) $(TARGET_LIBS) $(LUALIB) + $(HOBJ) $(DATE_O) $(WINLIB) $(TARGET_LIBS) $(LUALIB) @xres -o $(GAME) ../win/BeOS/nethack.rsrc @mimeset -f $(GAME) @touch SysBe @@ -696,11 +702,12 @@ qt_yndlg.moc : ../win/Qt/qt_yndlg.h # build monst.o and objects.o before executing '$(MAKE) makedefs' $(MAKEDEFS): $(FIRSTOBJ) \ ../util/makedefs.c ../src/mdlib.c $(CONFIG_H) \ - ../include/permonst.h \ - ../include/objclass.h ../include/sym.h ../include/defsym.h \ - ../include/artilist.h ../include/dungeon.h ../include/obj.h \ - ../include/monst.h ../include/you.h ../include/flag.h \ - ../include/dlb.h ../include/patchlevel.h + ../include/permonst.h ../include/monsters.h \ + ../include/objclass.h ../include/objects.h ../include/sym.h \ + ../include/defsym.h ../include/artilist.h \ + ../include/dungeon.h ../include/obj.h ../include/monst.h \ + ../include/you.h ../include/flag.h ../include/dlb.h \ + ../include/patchlevel.h @( cd ../util ; $(MAKE) makedefs ) # Source files created by 'makedefs' at build time. @@ -711,18 +718,24 @@ $(MAKEDEFS): $(FIRSTOBJ) \ # process of building it for foo.h.) ../include/onames.h: $(MAKEDEFS) @( cd ../util ; $(MAKE) ../include/onames.h ) -../include/pm.h: $(MAKEDEFS) ../include/onames.h +../include/pm.h: $(MAKEDEFS) @( cd ../util ; $(MAKE) ../include/pm.h ) # Created at build time for configurations which support tiles, # but not by makedefs so not connected to the others. tile.c: ../win/share/tilemap.c $(HACK_H) @( cd ../util ; $(MAKE) ../src/tile.c ) + ../win/gnome/gn_rip.h: ../win/X11/rip.xpm cp ../win/X11/rip.xpm ../win/gnome/gn_rip.h $(TARGETPFX)sfstruct.o: sfstruct.c $(HACK_H) +# date.c should be recompiled any time any of the source or include code +# is modified. +$(TARGETPFX)date.o: date.c $(HACK_H) $(HACKCSRC) $(HOBJ) + $(TARGET_CC) $(TARGET_CFLAGS) $(GITHASH) $(GITBRANCH) -c -o $@ date.c + # date.h should be remade any time any of the source or include code # is modified. Unfortunately, this would make the contents of this # file far more complex. Since "hack.h" depends on most of the include @@ -731,9 +744,7 @@ $(TARGETPFX)sfstruct.o: sfstruct.c $(HACK_H) # Do NOT include ../dat/gitinfo.txt as either a prerequisite or target. # 'makedefs -v' processes it when present and ignores it if not. # -# hack.h depends on makedefs' output, so we know makedefs will be -# up to date before being executed -../include/date.h: $(VERSOURCES) $(HACK_H) +../include/date.h: ../util/makedefs $(VERSOURCES) $(HACK_H) -$(SHELL) ../sys/unix/gitinfo.sh $(GITINFO) #before 'makedefs -v' ../util/makedefs -v @@ -800,14 +811,14 @@ $(HACK_H): ../include/hack.h $(CONFIG_H) ../include/lint.h ../include/align.h \ ../include/dungeon.h ../include/mkroom.h \ ../include/objclass.h ../include/youprop.h ../include/prop.h \ ../include/permonst.h ../include/monattk.h \ - ../include/monflag.h ../include/mondata.h ../include/pm.h \ + ../include/monflag.h ../include/mondata.h \ ../include/wintype.h ../include/context.h \ ../include/sym.h ../include/defsym.h ../include/rm.h \ ../include/botl.h ../include/rect.h ../include/region.h \ ../include/decl.h ../include/quest.h ../include/spell.h \ ../include/color.h ../include/obj.h ../include/engrave.h \ ../include/you.h ../include/attrib.h ../include/monst.h \ - ../include/mextra.h ../include/skills.h ../include/onames.h \ + ../include/mextra.h ../include/skills.h ../include/monsters.h \ ../include/timeout.h ../include/trap.h ../include/flag.h \ ../include/vision.h ../include/display.h ../include/winprocs.h \ ../include/sys.h @@ -1097,8 +1108,9 @@ $(TARGETPFX)mondata.o: mondata.c $(HACK_H) $(TARGETPFX)monmove.o: monmove.c $(HACK_H) ../include/mfndpos.h \ ../include/artifact.h $(TARGETPFX)monst.o: monst.c $(CONFIG_H) ../include/permonst.h \ - ../include/align.h ../include/monattk.h ../include/monflag.h \ - ../include/sym.h ../include/defsym.h ../include/color.h + ../include/monsters.h ../include/align.h ../include/monattk.h \ + ../include/monflag.h ../include/sym.h ../include/defsym.h \ + ../include/color.h $(TARGETPFX)mplayer.o: mplayer.c $(HACK_H) $(TARGETPFX)mthrowu.o: mthrowu.c $(HACK_H) $(TARGETPFX)muse.o: muse.c $(HACK_H) diff --git a/sys/unix/Makefile.utl b/sys/unix/Makefile.utl index b2f7979e8..40692f082 100644 --- a/sys/unix/Makefile.utl +++ b/sys/unix/Makefile.utl @@ -179,7 +179,7 @@ CALLOC = ../src/alloc.c panic.c OALLOC = $(OBJDIR)/alloc.o panic.o # object files for makedefs -MAKEOBJS = makedefs.o $(OMONOBJ) +MAKEOBJS = makedefs.o $(OMONOBJ) $(OBJDIR)/date.o # object files for recovery utility RECOVOBJS = recover.o @@ -209,17 +209,19 @@ makedefs: $(MAKEOBJS) mdgrep.h makedefs.o: makedefs.c ../src/mdlib.c $(CONFIG_H) ../include/permonst.h \ ../include/objclass.h ../include/sym.h ../include/defsym.h \ ../include/artilist.h ../include/dungeon.h ../include/obj.h \ - ../include/monst.h ../include/you.h ../include/flag.h \ - ../include/dlb.h ../include/patchlevel.h + ../include/monst.h ../include/monsters.h ../include/objects.h \ + ../include/you.h ../include/flag.h ../include/dlb.h \ + ../include/patchlevel.h $(CC) $(CFLAGS) -c makedefs.c -o $@ # Don't require perl to build; that is why mdgrep.h is spelled wrong below. mdgreph: mdgrep.pl perl mdgrep.pl -../include/onames.h: makedefs +# These are for reference purposes only. They aren't required in the build. +../include/onames.h: makedefs ../include/objects.h ./makedefs -o -../include/pm.h: makedefs +../include/pm.h: makedefs ../include/monsters.h ./makedefs -p lintdefs: diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 69bd88684..14c524eeb 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -239,7 +239,6 @@ 3186A37421A4B0FA0052BF02 /* attrib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = attrib.h; path = ../../include/attrib.h; sourceTree = ""; }; 3186A37521A4B0FA0052BF02 /* patchlevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = patchlevel.h; path = ../../include/patchlevel.h; sourceTree = ""; }; 3186A37621A4B0FA0052BF02 /* wincurs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wincurs.h; path = ../../include/wincurs.h; sourceTree = ""; }; - 3186A37721A4B0FA0052BF02 /* pm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pm.h; path = ../../include/pm.h; sourceTree = ""; }; 3186A37921A4B0FA0052BF02 /* monattk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monattk.h; path = ../../include/monattk.h; sourceTree = ""; }; 3186A37A21A4B0FA0052BF02 /* integer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = integer.h; path = ../../include/integer.h; sourceTree = ""; }; 3186A37B21A4B0FA0052BF02 /* region.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region.h; path = ../../include/region.h; sourceTree = ""; }; @@ -254,7 +253,6 @@ 3186A38721A4B0FB0052BF02 /* color.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = color.h; path = ../../include/color.h; sourceTree = ""; }; 3186A38821A4B0FB0052BF02 /* artifact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = artifact.h; path = ../../include/artifact.h; sourceTree = ""; }; 3186A38A21A4B0FB0052BF02 /* system.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = system.h; path = ../../include/system.h; sourceTree = ""; }; - 3186A38B21A4B0FC0052BF02 /* onames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = onames.h; path = ../../include/onames.h; sourceTree = ""; }; 3186A38E21A4B0FC0052BF02 /* dlb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dlb.h; path = ../../include/dlb.h; sourceTree = ""; }; 3186A38F21A4B0FC0052BF02 /* monflag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monflag.h; path = ../../include/monflag.h; sourceTree = ""; }; 3186A39121A4B0FC0052BF02 /* micro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = micro.h; path = ../../include/micro.h; sourceTree = ""; }; @@ -687,11 +685,9 @@ 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 */, diff --git a/sys/unix/hints/linux.2020 b/sys/unix/hints/linux.2020 index 49b250f2d..76701643c 100755 --- a/sys/unix/hints/linux.2020 +++ b/sys/unix/hints/linux.2020 @@ -139,6 +139,16 @@ WINOBJ = $(sort $(WINOBJ0)) # prevent duplicates in VARDATND if both X11 and Qt are being supported VARDATND += $(sort $(VARDATND0)) +GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1) +GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1) + +ifdef GIT_HASH +GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" +endif +ifdef GIT_BRANCH +GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" +endif + ifdef WANT_LIBNH CFLAGS += -DSHIM_GRAPHICS -DNOTTYGRAPHICS -DNOSHELL -DLIBNH LIBNHSYSSRC = ../sys/libnh/libnhmain.c \ diff --git a/sys/unix/hints/macOS.2020 b/sys/unix/hints/macOS.2020 index fd3a253ad..c34fe4f3b 100755 --- a/sys/unix/hints/macOS.2020 +++ b/sys/unix/hints/macOS.2020 @@ -139,6 +139,16 @@ WINOBJ = $(sort $(WINOBJ0)) # prevent duplicates in VARDATND if both X11 and Qt are being supported VARDATND += $(sort $(VARDATND0)) +GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1) +GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1) + +ifdef GIT_HASH +GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" +endif +ifdef GIT_BRANCH +GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" +endif + ifdef WANT_LIBNH CFLAGS += -DSHIM_GRAPHICS -DNOTTYGRAPHICS -DNOSHELL -DLIBNH LIBNHSYSSRC = ../sys/libnh/libnhmain.c \ diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 98b572f44..24251c18a 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -112,6 +112,10 @@ main(int argc, char *argv[]) if (argcheck(argc, argv, ARG_VERSION) == 2) exit(EXIT_SUCCESS); +#ifndef NODUMPENUMS + if (argcheck(argc, argv, ARG_DUMPENUMS) == 2) + exit(EXIT_SUCCESS); +#endif if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { #ifdef CHDIR chdirx((char *) 0, 0); diff --git a/sys/vms/Makefile.src b/sys/vms/Makefile.src index 97eb0823d..0b9de8d15 100644 --- a/sys/vms/Makefile.src +++ b/sys/vms/Makefile.src @@ -172,7 +172,7 @@ HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \ # .c files for this version (for date.h) VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) $(RANDSRC) $(GENCSRC) -# all .h files except date.h, onames.h, pm.h, which would +# all .h files except date.h which would # cause dependency loops if run through "make depend" # HACKINCL = align.h artifact.h artilist.h attrib.h color.h \ @@ -386,7 +386,7 @@ spotless : clean # config.h timestamp $(CONFIG_H) : $(INC)config.h $(INC)config1.h $(INC)tradstdc.h $(INC)global.h \ $(INC)coord.h $(INC)vmsconf.h $(INC)system.h $(INC)unixconf.h \ - $(INC)micro.h $(INC)pcconf.h $(INC)windconf.h + $(INC)micro.h $(INC)pcconf.h $(INC)windconf.h $(INC)objects.h $(TOUCH) $(CONFIG_H) # hack.h timestamp $(HACK_H) : $(INC)hack.h $(CONFIG_H) $(INC)align.h \ @@ -398,7 +398,7 @@ $(HACK_H) : $(INC)hack.h $(CONFIG_H) $(INC)align.h \ $(INC)spell.h $(INC)color.h $(INC)obj.h \ $(INC)you.h $(INC)attrib.h $(INC)monst.h \ $(INC)mextra.h $(INC)skills.h \ - $(INC)onames.h $(INC)timeout.h $(INC)trap.h \ + $(INC)monsters.h $(INC)timeout.h $(INC)trap.h \ $(INC)flag.h $(INC)rm.h $(INC)vision.h \ $(INC)display.h $(INC)engrave.h $(INC)rect.h $(INC)region.h \ $(INC)winprocs.h $(INC)wintty.h $(INC)sys.h diff --git a/sys/windows/Install.windows b/sys/windows/Install.windows index 2294157b9..fa0e42fa7 100644 --- a/sys/windows/Install.windows +++ b/sys/windows/Install.windows @@ -239,9 +239,9 @@ Setting Up If you are recompiling after patching your sources, or if you got your files from somewhere other than the official distribution, - "touch makedefs.c" to ensure that certain files (onames.h and pm.h) - are remade, lest potentially troublesome timestamps fool your make - (or nmake) utility. + "touch makedefs.c" to ensure that certain files are remade, + lest potentially troublesome timestamps fool your make (or nmake) + utility. Compiling diff --git a/sys/windows/Makefile.gcc b/sys/windows/Makefile.gcc index 504d17882..f0ac84738 100644 --- a/sys/windows/Makefile.gcc +++ b/sys/windows/Makefile.gcc @@ -36,12 +36,13 @@ # # There are currently 4 decisions that you can choose to make. # None of the 4 decisions are absolutely required because defaults are in place: -# 1. Where do you want your build to end up? -# 2. Do you want debug information in the executable? -# 3. Do you want to explicitly override auto-detection of a 32-bit or 64-bit target? -# 4. Do you want to include any optional interfaces in the port? -# 4a) curses -# 4b) Qt +# 1. Do you have git commands in your path and NetHack in a git repository? +# 2. Where do you want your build results to end up? +# 3. Do you want debug information in the executable? +# 4. Do you want to explicitly override auto-detection of a 32-bit or 64-bit target? +# 5. Do you want to include any optional interfaces in the port? +# 5a) curses +# 5b) Qt # # Mandatory LUA source Location # @@ -277,11 +278,53 @@ O = $(OBJ)/ U = $(UTIL)/ +HACKINCL = $(INCL)/align.h $(INCL)/artifact.h $(INCL)/artilist.h \ + $(INCL)/attrib.h $(INCL)/botl.h $(INCL)/color.h $(INCL)/config.h \ + $(INCL)/config1.h $(INCL)/context.h $(INCL)/coord.h $(INCL)/decl.h \ + $(INCL)/display.h $(INCL)/dlb.h $(INCL)/dungeon.h $(INCL)/engrave.h \ + $(INCL)/extern.h $(INCL)/flag.h $(INCL)/fnamesiz.h $(INCL)/func_tab.h \ + $(INCL)/global.h $(INCL)/warnings.h $(INCL)/hack.h $(INCL)/lint.h \ + $(INCL)/mextra.h $(INCL)/mfndpos.h $(INCL)/micro.h $(INCL)/mkroom.h \ + $(INCL)/monattk.h $(INCL)/mondata.h $(INCL)/monflag.h $(INCL)/monst.h \ + $(INCL)/monsters.h $(INCL)/obj.h $(INCL)/objects.h $(INCL)/objclass.h \ + $(INCL)/optlist.h $(INCL)/patchlevel.h $(INCL)/pcconf.h \ + $(INCL)/permonst.h $(INCL)/prop.h $(INCL)/rect.h $(INCL)/region.h \ + $(INCL)/sym.h $(INCL)/defsym.h $(INCL)/rm.h $(INCL)/sp_lev.h \ + $(INCL)/spell.h $(INCL)/sys.h $(INCL)/system.h $(INCL)/tcap.h \ + $(INCL)/timeout.h $(INCL)/tradstdc.h $(INCL)/trap.h \ + $(INCL)/unixconf.h $(INCL)/vision.h $(INCL)/vmsconf.h \ + $(INCL)/wintty.h $(INCL)/wincurs.h $(INCL)/winX.h \ + $(INCL)/winprocs.h $(INCL)/wintype.h $(INCL)/you.h \ + $(INCL)/youprop.h + +# all .c that are part of the main NetHack program and are not operating- or +# windowing-system specific +HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \ + botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \ + do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \ + dungeon.c eat.c end.c engrave.c exper.c explode.c extralev.c \ + files.c fountain.c hack.c hacklib.c \ + insight.c invent.c isaac64.c light.c \ + lock.c mail.c makemon.c mcastu.c mdlib.c mhitm.c \ + mhitu.c minion.c mklev.c mkmap.c mkmaze.c mkobj.c mkroom.c mon.c \ + mondata.c monmove.c monst.c mplayer.c mthrowu.c muse.c music.c \ + nhlua.c nhlsel.c nhlobj.c o_init.c objects.c objnam.c \ + options.c pager.c pickup.c pline.c polyself.c potion.c pray.c \ + priest.c quest.c questpgr.c read.c rect.c region.c restore.c \ + rip.c rnd.c role.c rumors.c save.c sfstruct.c \ + shk.c shknam.c sit.c sounds.c \ + sp_lev.c spell.c steal.c steed.c symbols.c sys.c teleport.c \ + timeout.c topten.c track.c trap.c u_init.c \ + uhitm.c vault.c version.c vision.c weapon.c were.c wield.c \ + windows.c wizard.c worm.c worn.c write.c zap.c + + # # Utility Objects. # -MAKEDEFSOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o +MAKEDEFSOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o \ + $(O)date.o RECOVOBJS = $(O)recover.o @@ -491,21 +534,31 @@ endif # Header file macros #========================================== +ifdef GIT_HASH +GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" +endif + +ifdef GIT_BRANCH +GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" +endif + CONFIG_H = $(INCL)/config.h $(INCL)/patchlevel.h \ $(INCL)/config1.h $(INCL)/tradstdc.h \ $(INCL)/global.h $(INCL)/fnamesiz.h $(INCL)/coord.h \ $(INCL)/vmsconf.h $(INCL)/system.h $(INCL)/unixconf.h \ - $(INCL)/micro.h $(INCL)/pcconf.h $(INCL)/windconf.h + $(INCL)/micro.h $(INCL)/pcconf.h $(INCL)/windconf.h \ + $(INCL)/objects.h HACK_H = $(INCL)/hack.h $(CONFIG_H) $(INCL)/align.h $(INCL)/context.h \ $(INCL)/dungeon.h $(INCL)/sym.h $(INCL)/defsym.h \ $(INCL)/mkroom.h $(INCL)/objclass.h $(INCL)/youprop.h \ $(INCL)/prop.h $(INCL)/permonst.h $(INCL)/monattk.h \ - $(INCL)/monflag.h $(INCL)/mondata.h $(INCL)/pm.h \ + $(INCL)/monflag.h $(INCL)/mondata.h $(INCL)/monsters.h \ $(INCL)/wintype.h $(INCL)/decl.h $(INCL)/quest.h \ $(INCL)/spell.h $(INCL)/color.h $(INCL)/obj.h \ + $(INCL)/objects.h \ $(INCL)/you.h $(INCL)/attrib.h $(INCL)/monst.h $(INCL)/lint.h \ - $(INCL)/mextra.h $(INCL)/skills.h $(INCL)/onames.h \ + $(INCL)/mextra.h $(INCL)/skills.h \ $(INCL)/timeout.h $(INCL)/trap.h $(INCL)/flag.h \ $(INCL)/rm.h $(INCL)/vision.h $(INCL)/display.h \ $(INCL)/engrave.h $(INCL)/rect.h $(INCL)/region.h \ @@ -805,8 +858,7 @@ recover: $(U)recover.exe $(O)sp_lev.tag: $(O)utility.tag $(subst /,\,echo sp_levs done > $(O)sp_lev.tag) -$(O)utility.tag: $(INCL)/date.h $(INCL)/onames.h $(INCL)/pm.h \ - $(TILEUTIL16) +$(O)utility.tag: $(TILEUTIL16) $(subst /,\,@echo utilities made >$@) @echo utilities made. @@ -840,11 +892,12 @@ gamedir.tag: test -d $(GAMEDIR) && echo directory created > $@ $(GAMEDIR)/NetHack.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)consoletty.o $(O)guistub.o \ - $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)conres.o $(KEYDLLS) \ + $(ALLOBJ) $(TTYOBJ) $(O)date.o $(GUIOBJ) $(O)conres.o $(KEYDLLS) \ $(LUATARGETS) @echo Linking $@... $(link) $(lflags) -o$@ $(ALLOBJ) $(TTYOBJ) $(O)consoletty.o $(O)tile.o \ - $(O)guistub.o $(O)conres.o $(PDCLIB) $(LUALIB) $(conlibs) -static -lstdc++ + $(O)guistub.o $(O)date.o $(O)conres.o $(PDCLIB) $(LUALIB) \ + $(conlibs) -static -lstdc++ $(subst /,\,@if exist $(O)install.tag del $(O)install.tag) # NetHackW @@ -860,7 +913,8 @@ $(GAMEDIR)/NetHackW.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)ttystub.o \ $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)winres.o $(KEYDLLS) \ $(LUATARGETS) @echo Linking $@... - $(link) $(lflags) -mwindows -o$@ $(ALLOBJ) $(GUIOBJ) $(O)tile.o $(O)ttystub.o \ + $(link) $(lflags) -mwindows -o$@ $(ALLOBJ) $(GUIOBJ) $(O)tile.o \ + $(O)ttystub.o $(O)date.o \ $(O)winres.o $(PDCLIB) $(guilibs) $(LUALIB) -static -lstdc++ $(subst /,\,@if exist $(O)install.tag del $(O)install.tag) endif @@ -922,9 +976,25 @@ $(O)makedefs.o: $(CONFIG_H) $(INCL)/monattk.h $(INCL)/monflag.h \ $(U)makedefs.c $(SRC)\mdlib.c $(cc) $(CFLAGSU) -o$@ $(U)makedefs.c +ifeq "$(GIT_AVAILABLE)" "1" +GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1) +GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1) + +ifdef GIT_HASH +GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" +endif +ifdef GIT_BRANCH +GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" +endif +endif + +$(O)date.o: $(HACKINCL) $(HACKSRC) $(HACKOBJ) $(ALLOBJ) + $(cc) $(CFLAGS) $(GITHASH) $(GITBRANCH) -o$@ $(SRC)/date.c + # -# date.h should be remade every time any of the source or include -# files is modified. +# if you are making date.h for reference purposes (it isn't required +# for the build anymore), it should be remade every time any of the +# source or include files is modified. # $(INCL)/date.h $(OPTIONS_FILE): $(U)makedefs.exe @@ -1453,7 +1523,7 @@ $(O)termcap.o: ../win/tty/termcap.c $(HACK_H) $(INCL)/tcap.h $(O)topl.o: ../win/tty/topl.c $(HACK_H) $(INCL)/tcap.h $(cc) $(CFLAGS) -o$@ ../win/tty/topl.c $(O)wintty.o: ../win/tty/wintty.c $(HACK_H) $(INCL)/dlb.h \ - $(INCL)/date.h $(INCL)/tcap.h + $(INCL)/tcap.h $(cc) $(CFLAGS) -o$@ ../win/tty/wintty.c #$(O)Window.o: ../win/X11/Window.c $(INCL)/xwindowp.h $(INCL)/xwindow.h \ # $(CONFIG_H) @@ -1702,7 +1772,7 @@ $(O)trap.o: trap.c $(HACK_H) $(O)u_init.o: u_init.c $(HACK_H) $(O)uhitm.o: uhitm.c $(HACK_H) $(O)vault.o: vault.c $(HACK_H) -$(O)version.o: version.c $(HACK_H) $(INCL)/date.h +$(O)version.o: version.c $(HACK_H) $(O)vision.o: vision.c $(HACK_H) $(O)weapon.o: weapon.c $(HACK_H) $(O)were.o: were.c $(HACK_H) diff --git a/sys/windows/Makefile.msc b/sys/windows/Makefile.msc index fa163272e..86f8d79f3 100644 --- a/sys/windows/Makefile.msc +++ b/sys/windows/Makefile.msc @@ -1,5 +1,5 @@ # NetHack 3.7 Makefile.msc -# Copyright (c) NetHack PC Development Team 1993-2020 +# Copyright (c) NetHack PC Development Team 1993-2021 # #============================================================================== # Build Tools Environment @@ -65,12 +65,14 @@ # 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) @@ -82,16 +84,24 @@ # #------------------------------------------------------------------------------ #============================================================================== + # #------------------------------------------------------------------------------ -# 1. Where do you want the game to be built (which folder)? +# 1. Do you have git commands available and NetHack in a git repository. +# If not, such as if you obtained the NetHack sources in a zip file download, +# set GIT_AVAILABLE = 0 +# +GIT_AVAILABLE = 1 +# +#------------------------------------------------------------------------------ +# 2. Where do you want the game to be built (which folder)? # GAMEDIR = ..\binary # Default game build directory # #------------------------------------------------------------------------------ # OPTIONAL - Curses window port support # -# 2. Uncomment these and set them appropriately if you want to +# 3. Uncomment these and set them appropriately if you want to # include curses port support alongside TTY support in your # NetHack.exe binary. # @@ -100,24 +110,24 @@ GAMEDIR = ..\binary # Default game build directory # of your PDCurses C files. # #ADD_CURSES=Y -#PDCURSES_TOP=..\lib\pdcursesmod +#PDCURSES_TOP=..\lib\pdcurses # #------------------------------------------------------------------------------ # OPTIONAL - zlib support (to allow compressed savefile exchange across platforms # -# 3. Location of zlib sources +# 4. Location of zlib sources # # #ADD_ZLIB=Y #ZLIBTOP=..\lib\zlib # #------------------------------------------------------------------------------ -# 4. Do you want debug information available to the executable? +# 5. Do you want debug information available to the executable? # DEBUGINFO = Y # #------------------------------------------------------------------------------ -# 5. This Makefile will attempt to auto-detect your selected target architecture +# 6. This Makefile will attempt to auto-detect your selected target architecture # based on Visual Studio command prompt configuration settins etc. # However, if you want to manually override generation of a # 32-bit or 64-bit build target, you can uncomment the apppropriate @@ -260,13 +270,55 @@ CROSSCOMPILE_TARGET= CROSSCOMPILE= !ENDIF +HACKINCL = $(INCL)\align.h $(INCL)\artifact.h $(INCL)\artilist.h \ + $(INCL)\attrib.h $(INCL)\botl.h $(INCL)\color.h $(INCL)\config.h \ + $(INCL)\config1.h $(INCL)\context.h $(INCL)\coord.h $(INCL)\decl.h \ + $(INCL)\display.h $(INCL)\dlb.h $(INCL)\dungeon.h $(INCL)\engrave.h \ + $(INCL)\extern.h $(INCL)\flag.h $(INCL)\fnamesiz.h $(INCL)\func_tab.h \ + $(INCL)\global.h $(INCL)\warnings.h $(INCL)\hack.h $(INCL)\lint.h \ + $(INCL)\mextra.h $(INCL)\mfndpos.h $(INCL)\micro.h $(INCL)\mkroom.h \ + $(INCL)\monattk.h $(INCL)\mondata.h $(INCL)\monflag.h $(INCL)\monst.h \ + $(INCL)\monsters.h $(INCL)\obj.h $(INCL)\objects.h $(INCL)\objclass.h \ + $(INCL)\optlist.h $(INCL)\patchlevel.h $(INCL)\pcconf.h \ + $(INCL)\permonst.h $(INCL)\prop.h $(INCL)\rect.h $(INCL)\region.h \ + $(INCL)\sym.h $(INCL)\defsym.h $(INCL)\rm.h $(INCL)\sp_lev.h \ + $(INCL)\spell.h $(INCL)\sys.h $(INCL)\system.h $(INCL)\tcap.h \ + $(INCL)\timeout.h $(INCL)\tradstdc.h $(INCL)\trap.h \ + $(INCL)\unixconf.h $(INCL)\vision.h $(INCL)\vmsconf.h \ + $(INCL)\wintty.h $(INCL)\wincurs.h $(INCL)\winX.h \ + $(INCL)\winprocs.h $(INCL)\wintype.h $(INCL)\you.h \ + $(INCL)\youprop.h + +# all .c that are part of the main NetHack program and are not operating- or +# windowing-system specific +HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \ + botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \ + do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \ + dungeon.c eat.c end.c engrave.c exper.c explode.c extralev.c \ + files.c fountain.c hack.c hacklib.c \ + insight.c invent.c isaac64.c light.c \ + lock.c mail.c makemon.c mcastu.c mdlib.c mhitm.c \ + mhitu.c minion.c mklev.c mkmap.c mkmaze.c mkobj.c mkroom.c mon.c \ + mondata.c monmove.c monst.c mplayer.c mthrowu.c muse.c music.c \ + nhlua.c nhlsel.c nhlobj.c o_init.c objects.c objnam.c \ + options.c pager.c pickup.c pline.c polyself.c potion.c pray.c \ + priest.c quest.c questpgr.c read.c rect.c region.c restore.c \ + rip.c rnd.c role.c rumors.c save.c sfstruct.c \ + shk.c shknam.c sit.c sounds.c \ + sp_lev.c spell.c steal.c steed.c symbols.c sys.c teleport.c \ + timeout.c topten.c track.c trap.c u_init.c \ + uhitm.c vault.c version.c vision.c weapon.c were.c wield.c \ + windows.c wizard.c worm.c worn.c write.c zap.c + + # # Utility Objects. # MAKESRC = $(U)makedefs.c -MAKEDEFSOBJS = $(O)makedefs.o $(O)monst$(HOST).o $(O)objects$(HOST).o +MAKEDEFSOBJS = $(O)makedefs.o $(O)monst$(HOST).o $(O)objects$(HOST).o \ + $(O)date.o RECOVOBJS = $(O)recover.o @@ -333,6 +385,14 @@ TTYOBJ = $(O)topl.o $(O)getline.o $(O)wintty.o MDLIB = $(O)mdlib.o +!IFDEF GIT_HASH +GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" +!ENDIF + +!IFDEF GIT_BRANCH +GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" +!ENDIF + !IFNDEF ADD_CURSES CURSESOBJ= !ELSE @@ -490,14 +550,14 @@ HACK_H = $(INCL)\hack.h $(CONFIG_H) $(INCL)\lint.h $(INCL)\align.h \ $(INCL)\dungeon.h $(INCL)\mkroom.h \ $(INCL)\objclass.h $(INCL)\youprop.h $(INCL)\prop.h \ $(INCL)\permonst.h $(INCL)\monattk.h \ - $(INCL)\monflag.h $(INCL)\mondata.h $(INCL)\pm.h \ + $(INCL)\monflag.h $(INCL)\mondata.h \ $(INCL)\wintype.h $(INCL)\context.h \ $(INCL)\sym.h $(INCL)\defsym.h $(INCL)\rm.h \ $(INCL)\botl.h $(INCL)\rect.h \ $(INCL)\region.h $(INCL)\decl.h $(INCL)\quest.h \ $(INCL)\spell.h $(INCL)\color.h $(INCL)\obj.h \ $(INCL)\you.h $(INCL)\attrib.h $(INCL)\monst.h \ - $(INCL)\mextra.h $(INCL)\skills.h $(INCL)\onames.h \ + $(INCL)\mextra.h $(INCL)\skills.h \ $(INCL)\timeout.h $(INCL)\trap.h $(INCL)\flag.h \ $(INCL)\vision.h $(INCL)\display.h $(INCL)\engrave.h \ $(INCL)\winprocs.h $(INCL)\sys.h $(INCL)\wintty.h @@ -918,7 +978,7 @@ GAMEOBJ=$(GAMEOBJ:^ =^ $(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(O)tile.o $(O)consoletty.o $(O)guistub.o \ - $(ALLOBJ) $(TTYOBJ) $(O)console.res $(KEYDLLS) \ + $(ALLOBJ) $(TTYOBJ) $(O)date.o $(O)console.res $(KEYDLLS) \ $(LUATARGETS) $(PDCLIB) @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo Linking $(@:\=/) @@ -930,6 +990,7 @@ $(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(O)tile.o $(O)consoletty.o $(O)guistub $(O)consoletty.o $(O)tile.o $(O)guistub.o + $(O)date.o $(O)console.res << @if exist $(O)install.tag del $(O)install.tag @@ -943,7 +1004,7 @@ $(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(O)tile.o $(O)consoletty.o $(O)guistub # objs: $(GAMEOBJ) $(GUIOBJ) $(O)tile.o $(O)ttystub.o $(GAMEDIR)\NetHackW.exe : $(O)gamedir.tag $(O)tile.o $(O)ttystub.o \ - $(ALLOBJ) $(GUIOBJ) $(O)NetHackW.res \ + $(ALLOBJ) $(GUIOBJ) $(O)date.o $(O)NetHackW.res \ $(O)gamedir.tag $(KEYDLLS) \ $(LUATARGETS) @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @@ -955,6 +1016,7 @@ $(GAMEDIR)\NetHackW.exe : $(O)gamedir.tag $(O)tile.o $(O)ttystub.o \ $(GUIOBJ) $(O)tile.o $(O)ttystub.o + $(O)date.o $(O)NetHackW.res << @@ -1050,8 +1112,7 @@ recover: $(U)recover.exe $(O)sp_lev.tag: echo sp_levs done > $(O)sp_lev.tag -$(O)utility.tag: $(INCL)\nhlua.h $(INCL)\date.h $(INCL)\onames.h $(INCL)\pm.h \ - $(U)tile2bmp.exe +$(O)utility.tag: $(INCL)\nhlua.h $(U)tile2bmp.exe $(U)makedefs.exe @echo utilities made >$@ @echo utilities made. @@ -1104,6 +1165,34 @@ $(O)makedefs.o: $(U)makedefs.c $(SRC)\mdlib.c $(CONFIG_H) $(INCL)\permonst.h \ @$(cc) -DENUM_PM $(cflagsBuild) $(CROSSCOMPILE) -Fo$@ $(U)makedefs.c # @$(cc) -DENUM_PM $(cflagsBuild) $(CROSSCOMPILE) /EP -Fo$@ $(U)makedefs.c >makedefs.c.preprocessed +# +# This is awful, but it allows the GITHASH and GITBRANCH macros to be +# defined and utilized, using only build-in Windows and nmake commands, +# as well as the necessary git commands. +# +# We build a temporary Makefile on-the-fly for compiling date.c and +# invoke nmake again. +# +$(O)date.o: $(HACKINCL) $(HACKSRC) $(HACKOBJ) $(ALLOBJ) +!IF "$(GIT_AVAILABLE)" == "1" + @git rev-parse --verify HEAD 2>&1 >$(O)date1.tmp + @git rev-parse --abbrev-ref HEAD 2>&1 >$(O)date2.tmp + @echo.>date.nmk + @echo OBJ = $(OBJ)>>date.nmk + @echo O = ^$(OBJ)^^^\>>date.nmk + @echo cc = $(cc)>>date.nmk + @echo cflagsBuild = $(cflagsBuild) ^\>>date.nmk + @for /F "usebackq" %%A IN ("$(O)date1.tmp") DO @echo. -DNETHACK_GIT_SHA=\"%%A\" ^\>>date.nmk + @for /F "usebackq" %%A IN ("$(O)date2.tmp") DO @echo. -DNETHACK_GIT_BRANCH=\"%%A\">>date.nmk + @echo.>>date.nmk + @echo default: ^$(O)date.o>>date.nmk + @echo.>>date.nmk + @echo ^$(O)date.o: >>date.nmk + @echo. ^$(cc) ^$(cflagsBuild) -Fo^$@ date.c>>date.nmk + @echo.>>date.nmk + @$(MAKE) /NOLOGO /A -f date.nmk +!ENDIF + # # date.h should be remade every time any of the source or include # files is modified. @@ -1349,7 +1438,7 @@ $(O)tilete32.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) #========================================== $(U)gif2txt.exe: $(GIFREADERS_HOST) $(TEXT_IO) - @echo Linking $(@:\=/) + @echo Linking $(@:\=/) @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk $(GIFREADERS_HOST:^ =^ ) @@ -1358,7 +1447,7 @@ $(U)gif2txt.exe: $(GIFREADERS_HOST) $(TEXT_IO) << $(U)gif2tx32.exe: $(GIFREADERS32_HOST) $(TEXT_IO32) - @echo Linking $(@:\=/) + @echo Linking $(@:\=/) @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk $(GIFREADERS32_HOST:^ =^ ) @@ -1367,7 +1456,7 @@ $(U)gif2tx32.exe: $(GIFREADERS32_HOST) $(TEXT_IO32) << $(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) - @echo Linking $(@:\=/) + @echo Linking $(@:\=/) @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk $(PPMWRITERS:^ =^ ) @@ -1380,7 +1469,7 @@ $(SRC)\tiles.bmp: $(U)tile2bmp.exe $(TILEFILES) @$(U)tile2bmp $@ $(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO) - @echo Linking $(@:\=/) + @echo Linking $(@:\=/) @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk $(O)tile2bmp.o $(TEXT_IO:^ =^ @@ -1388,7 +1477,7 @@ $(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO) << $(U)til2bm32.exe: $(O)til2bm32.o $(TEXT_IO32) - @echo Linking $(@:\=/) + @echo Linking $(@:\=/) @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk $(O)til2bm32.o $(TEXT_IO32:^ =^ @@ -1420,10 +1509,10 @@ $(O)tile2x11.o: $(X11)\tile2x11.c $(HACK_H) $(TILE_H) $(INCL)\tile2x11.h $(SRC)\x11tiles: $(U)tile2x11.exe $(WSHR)\monsters.txt $(WSHR)\objects.txt \ $(WSHR)\other.txt \ - $(WSHR)\monsters.txt + $(WSHR)\monsters.txt $(U)tile2x11 $(WSHR)\monsters.txt $(WSHR)\objects.txt \ $(WSHR)\other.txt \ - -grayscale $(WSHR)\monsters.txt + -grayscale $(WSHR)\monsters.txt #=============================================================================== # PDCurses @@ -1587,11 +1676,13 @@ $(O)monst.o: monst.c $(CONFIG_H) $(INCL)\permonst.h $(INCL)\align.h \ $(O)objects_host.o: objects.c $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \ $(INCL)\prop.h $(INCL)\skills.h $(INCL)\color.h - @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ objects.c + @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) /EP $(@B).c > $(O)$(@B).c.preproc + @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $(@B).c $(O)objects.o: objects.c $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \ $(INCL)\prop.h $(INCL)\skills.h $(INCL)\color.h - @$(cc) $(cflagsBuild) -Fo$@ objects.c + @$(cc) $(cflagsBuild) /EP $(@B).c > $(O)$(@B).c.preproc + @$(cc) $(cflagsBuild) -Fo$@ $(@B).c $(O)alloc_host.o: alloc.c $(CONFIG_H) @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ alloc.c @@ -1948,6 +2039,8 @@ $(O)wc_chainout.o: ..\win\chain\wc_chainout.c $(HACK_H) $(O)wc_trace.o: ..\win\chain\wc_trace.c $(HACK_H) $(INCL)\func_tab.h # @$(cc) $(cflagsBuild) -Fo$@ ..\win\chain\wc_trace.c $(O)allmain.o: allmain.c $(HACK_H) + @$(cc) $(cflagsBuild) /EP $(@B).c > $(O)$(@B).c.preproc + @$(cc) $(cflagsBuild) -Fo$@ $(@B).c $(O)alloc.o: alloc.c $(CONFIG_H) $(O)apply.o: apply.c $(HACK_H) $(O)artifact.o: artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h @@ -2064,7 +2157,7 @@ $(O)trap.o: trap.c $(HACK_H) $(O)u_init.o: u_init.c $(HACK_H) $(O)uhitm.o: uhitm.c $(HACK_H) $(O)vault.o: vault.c $(HACK_H) -$(O)version.o: version.c $(HACK_H) $(INCL)\dlb.h $(INCL)\date.h +$(O)version.o: version.c $(HACK_H) $(INCL)\dlb.h @$(cc) $(cflagsBuild) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ version.c $(O)vision.o: vision.c $(HACK_H) $(O)weapon.o: weapon.c $(HACK_H) diff --git a/sys/windows/vs/NetHack/NetHack.vcxproj b/sys/windows/vs/NetHack/NetHack.vcxproj index 1f9557959..58e48f77e 100644 --- a/sys/windows/vs/NetHack/NetHack.vcxproj +++ b/sys/windows/vs/NetHack/NetHack.vcxproj @@ -219,10 +219,8 @@ - - diff --git a/sys/windows/vs/NetHackW/NetHackW.vcxproj b/sys/windows/vs/NetHackW/NetHackW.vcxproj index 2a41b696d..4730c89ca 100644 --- a/sys/windows/vs/NetHackW/NetHackW.vcxproj +++ b/sys/windows/vs/NetHackW/NetHackW.vcxproj @@ -244,12 +244,10 @@ - - diff --git a/sys/windows/vs/files.props b/sys/windows/vs/files.props index 4f21e681d..2c8e74f4d 100644 --- a/sys/windows/vs/files.props +++ b/sys/windows/vs/files.props @@ -6,8 +6,6 @@ - - diff --git a/sys/windows/vs/tilemap/tilemap.vcxproj b/sys/windows/vs/tilemap/tilemap.vcxproj index a8178b86d..7bacd3433 100644 --- a/sys/windows/vs/tilemap/tilemap.vcxproj +++ b/sys/windows/vs/tilemap/tilemap.vcxproj @@ -55,9 +55,7 @@ - - diff --git a/sys/windows/windmain.c b/sys/windows/windmain.c index 625940219..c279e0616 100644 --- a/sys/windows/windmain.c +++ b/sys/windows/windmain.c @@ -648,6 +648,11 @@ process_options(int argc, char * argv[]) reveal_paths(); nethack_exit(EXIT_SUCCESS); } +#ifndef NODUMPENUMS + if (argcheck(argc, argv, ARG_DUMPENUMS) == 2) { + nethack_exit(EXIT_SUCCESS); + } +#endif if (argcheck(argc, argv, ARG_DEBUG) == 1) { argc--; argv++; diff --git a/util/dlb_main.c b/util/dlb_main.c index e1a5d237d..db0b1f41a 100644 --- a/util/dlb_main.c +++ b/util/dlb_main.c @@ -539,9 +539,4 @@ xexit(int retcd) /*NOTREACHED*/ } -#ifdef AMIGA -#include "date.h" -const char amiga_version_string[] = AMIGA_VERSION_STRING; -#endif - /*dlb_main.c*/ diff --git a/util/makedefs.c b/util/makedefs.c index d3e164c62..7256759d2 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -108,7 +108,10 @@ static const char *Dont_Edit_Code = "/* This source file is generated by 'makedefs'. Do not edit. */\n", *Dont_Edit_Data = - "#\tThis data file is generated by 'makedefs'. Do not edit. \n"; + "#\tThis data file is generated by 'makedefs'. Do not edit. \n", + *Reference_file = + "/* This file is generated by 'makedefs' for reference purposes only. */\n" + "/* It is no longer used in the NetHack build. */\n"; static struct version_info version; @@ -451,7 +454,7 @@ do_ext_makedefs(int argc, char **argv) delim[0] = '\0'; if (argv[0]) strcpy(delim, argv[0]); - Fprintf(stdout, "%s", version_string(buf, delim)); + Fprintf(stdout, "%s", mdlib_version_string(buf, delim)); exit(EXIT_SUCCESS); } IS_OPTION("debug") { @@ -1105,7 +1108,7 @@ do_date(void) /* NB: We've moved on from SCCS, but this way this line * won't get clobbered when downstream projects import * this file into something more modern. */ - Fprintf(ofp, "%s", Dont_Edit_Code); + Fprintf(ofp, "%s", Reference_file); (void) time(&clocktim); #ifdef REPRODUCIBLE_BUILD @@ -1226,11 +1229,11 @@ do_date(void) #endif /* !__EMSCRIPTEN__ */ Fprintf(ofp, "\n"); - Fprintf(ofp, "#define VERSION_STRING \"%s\"\n", version_string(buf, ".")); + Fprintf(ofp, "#define VERSION_STRING \"%s\"\n", mdlib_version_string(buf, ".")); Fprintf(ofp, "#define VERSION_ID \\\n \"%s\"\n", - version_id_string(buf, cbuf)); + version_id_string(buf, sizeof buf, cbuf)); Fprintf(ofp, "#define COPYRIGHT_BANNER_C \\\n \"%s\"\n", - bannerc_string(buf, cbuf)); + bannerc_string(buf, sizeof buf, cbuf)); if (get_gitinfo(githash, gitbranch)) { Fprintf(ofp, "#define NETHACK_GIT_SHA \"%s\"\n", githash); Fprintf(ofp, "#define NETHACK_GIT_BRANCH \"%s\"\n", gitbranch); @@ -1947,7 +1950,7 @@ do_permonst(void) perror(filename); exit(EXIT_FAILURE); } - Fprintf(ofp, "%s", Dont_Edit_Code); + Fprintf(ofp, "%s", Reference_file); Fprintf(ofp, "#ifndef PM_H\n#define PM_H\n"); if (use_enum) { @@ -2030,7 +2033,7 @@ do_objs(void) perror(filename); exit(EXIT_FAILURE); } - Fprintf(ofp, "%s", Dont_Edit_Code); + Fprintf(ofp, "%s", Reference_file); Fprintf(ofp, "#ifndef ONAMES_H\n#define ONAMES_H\n\n"); for (i = 0; !i || objects[i].oc_class != ILLOBJ_CLASS; i++) { diff --git a/util/recover.c b/util/recover.c index 490bcc73e..5e6b79f5a 100644 --- a/util/recover.c +++ b/util/recover.c @@ -444,11 +444,6 @@ exepath(char *str) } #endif /* EXEPATH */ -#ifdef AMIGA -#include "date.h" -const char amiga_version_string[] = AMIGA_VERSION_STRING; -#endif - #ifdef WIN_CE void nhce_message(FILE *f, const char *str, ...) diff --git a/win/curses/cursmain.c b/win/curses/cursmain.c index 835762546..32c99eadc 100644 --- a/win/curses/cursmain.c +++ b/win/curses/cursmain.c @@ -1,3 +1,4 @@ + /* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ /* NetHack 3.7 cursmain.c */ /* Copyright (c) Karl Garrison, 2010. */ @@ -189,14 +190,22 @@ curses_init_nhwindows(int *argcp UNUSED, # ifdef VERSION_STRING sprintf(window_title, "%s %s", DEF_GAME_NAME, VERSION_STRING); # else - sprintf(window_title, "%s", DEF_GAME_NAME); + if (nomakedefs.version_string) + sprintf(window_title, "%s %s", DEF_GAME_NAME, + nomakedefs.version_string); + else + sprintf(window_title, "%s", DEF_GAME_NAME); # endif /* VERSION_STRING */ # else # ifdef VERSION_STRING sprintf(window_title, "%s %s", "NetHack", VERSION_STRING); # else - sprintf(window_title, "%s", "NetHack"); + if (nomakedefs.version_string) + sprintf(window_title, "%s %s", "NetHack", + nomakedefs.version_string); + else + sprintf(window_title, "%s", "NetHack"); # endif /* VERSION_STRING */ # endif/* DEF_GAME_NAME */ diff --git a/win/share/tilemap.c b/win/share/tilemap.c index bfbc8fa9d..831f80d00 100644 --- a/win/share/tilemap.c +++ b/win/share/tilemap.c @@ -9,10 +9,10 @@ */ #include "config.h" -#include "pm.h" -#include "onames.h" +/* #include "onames.h" */ #include "permonst.h" #include "objclass.h" +/* #include "pm.h" */ #include "sym.h" #include "rm.h" #include "display.h" diff --git a/win/win32/mhmain.c b/win/win32/mhmain.c index 5511e396d..51d00cb15 100644 --- a/win/win32/mhmain.c +++ b/win/win32/mhmain.c @@ -4,11 +4,7 @@ #include "winMS.h" #include -#if !defined(CROSSCOMPILE) -#include "date.h" -#else #include "config.h" -#endif #if !defined(PATCHLEVEL_H) #include "patchlevel.h" #endif @@ -1071,7 +1067,7 @@ About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Sprintf(buf, "%s\n%s\n%s\n%s", COPYRIGHT_BANNER_A, COPYRIGHT_BANNER_B, - COPYRIGHT_BANNER_C, COPYRIGHT_BANNER_D); + nomakedefs.copyright_banner_c, COPYRIGHT_BANNER_D); SetDlgItemText(hDlg, IDC_ABOUT_COPYRIGHT, NH_A2W(buf, wbuf, sizeof(wbuf))); diff --git a/win/win32/mhsplash.c b/win/win32/mhsplash.c index 3f0c448cf..e3c8796cc 100644 --- a/win/win32/mhsplash.c +++ b/win/win32/mhsplash.c @@ -8,11 +8,7 @@ #include "mhsplash.h" #include "mhmsg.h" #include "mhfont.h" -#if !defined(CROSSCOMPILE) -#include "date.h" -#else #include "config.h" -#endif #if !defined(VERSION_MAJOR) #include "patchlevel.h" #endif @@ -149,7 +145,7 @@ mswin_display_splash_window(BOOL show_ver) /* Fill the text control */ strbuf_reserve(&strbuf, BUFSIZ); Sprintf(strbuf.str, "%s\n%s\n%s\n%s\n\n", COPYRIGHT_BANNER_A, - COPYRIGHT_BANNER_B, COPYRIGHT_BANNER_C, COPYRIGHT_BANNER_D); + COPYRIGHT_BANNER_B, nomakedefs.copyright_banner_c, COPYRIGHT_BANNER_D); if (show_ver) { /* Show complete version information */