diff --git a/dat/symbols b/dat/symbols index 108d761d1..9c9308c26 100644 --- a/dat/symbols +++ b/dat/symbols @@ -302,6 +302,7 @@ finish # Recommended symset for blind players # courtesy Michael Feir start: NHAccess + Description: Recommended for blind players S_stone: \032 S_vwall: \124 S_hwall: \045 diff --git a/dat/tribute b/dat/tribute index 3e65c7b32..340d2a47b 100644 --- a/dat/tribute +++ b/dat/tribute @@ -1342,15 +1342,12 @@ If you take enough precautions, you never need to take precautions. %e title %e section #----------------------------------------------------- -# Currently this section is not used. It is added -# to illustrate how these could be added and adapted -# should they be useful for something +# Used for interaction with Death. # %section Death %title Death Quotes (2) %passage 1 -WHERE THE FIRST PRIMAL CELL WAS, THERE WAS I ALSO. WHERE MAN IS, THERE AM I. -WHEN THE LAST LIFE CRAWLS UNDER FREEZING STARS, THERE WILL I BE. +WHERE THE FIRST PRIMAL CELL WAS, THERE WAS I ALSO. WHERE MAN IS, THERE AM I. WHEN THE LAST LIFE CRAWLS UNDER FREEZING STARS, THERE WILL I BE. %e passage %passage 2 I AM DEATH, NOT TAXES. *I* TURN UP ONLY ONCE. diff --git a/src/drawing.c b/src/drawing.c index a78e3d5e5..1a5be65be 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -375,7 +375,7 @@ init_showsyms() for (i = 0; i < MAXOTHER; i++) { if (i == SYM_BOULDER) - showsyms[i + SYM_OFF_X] = iflags.bouldersym; + showsyms[i + SYM_OFF_X] = iflags.bouldersym ? iflags.bouldersym : def_oc_syms[ROCK_CLASS].sym; else if (i == SYM_INVISIBLE) showsyms[i + SYM_OFF_X] = DEF_INVISIBLE; } @@ -401,7 +401,7 @@ init_l_symbols() for (i = 0; i < MAXOTHER; i++) { if (i == SYM_BOULDER) - l_syms[i + SYM_OFF_X] = iflags.bouldersym; + l_syms[i + SYM_OFF_X] = iflags.bouldersym ? iflags.bouldersym : def_oc_syms[ROCK_CLASS].sym; else if (i == SYM_INVISIBLE) l_syms[i + SYM_OFF_X] = DEF_INVISIBLE; } @@ -433,7 +433,7 @@ init_r_symbols() for (i = 0; i < MAXOTHER; i++) { if (i == SYM_BOULDER) - r_syms[i + SYM_OFF_X] = iflags.bouldersym; + r_syms[i + SYM_OFF_X] = iflags.bouldersym ? iflags.bouldersym : def_oc_syms[ROCK_CLASS].sym; else if (i == SYM_INVISIBLE) r_syms[i + SYM_OFF_X] = DEF_INVISIBLE; } diff --git a/src/mapglyph.c b/src/mapglyph.c index 23c582762..8015fa0de 100644 --- a/src/mapglyph.c +++ b/src/mapglyph.c @@ -135,7 +135,7 @@ unsigned *ospecial; cmap_color(offset); } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */ idx = objects[offset].oc_class + SYM_OFF_O; - if (offset == BOULDER && iflags.bouldersym) + if (offset == BOULDER) idx = SYM_BOULDER + SYM_OFF_X; if (has_rogue_color && iflags.use_color) { switch (objects[offset].oc_class) { diff --git a/src/mon.c b/src/mon.c index 8ca8d16a1..8daf72ddc 100644 --- a/src/mon.c +++ b/src/mon.c @@ -2434,7 +2434,8 @@ wake_nearby() continue; if (distu(mtmp->mx, mtmp->my) < u.ulevel * 20) { mtmp->msleeping = 0; - mtmp->mstrategy &= ~STRAT_WAITMASK; + if (!unique_corpstat(mtmp->data)) + mtmp->mstrategy &= ~STRAT_WAITMASK; if (mtmp->mtame && !mtmp->isminion) EDOG(mtmp)->whistletime = moves; } @@ -2453,7 +2454,8 @@ register int x, y, distance; continue; if (distance == 0 || dist2(mtmp->mx, mtmp->my, x, y) < distance) { mtmp->msleeping = 0; - mtmp->mstrategy &= ~STRAT_WAITMASK; + if (!unique_corpstat(mtmp->data)) + mtmp->mstrategy &= ~STRAT_WAITMASK; } } } diff --git a/src/music.c b/src/music.c index 249b454e2..fd0b16a17 100644 --- a/src/music.c +++ b/src/music.c @@ -73,7 +73,7 @@ int distance; mtmp->mcanmove = 1; mtmp->mfrozen = 0; /* may scare some monsters -- waiting monsters excluded */ - if ((mtmp->mstrategy & STRAT_WAITMASK) != 0) + if (!unique_corpstat(mtmp->data) && (mtmp->mstrategy & STRAT_WAITMASK) != 0) mtmp->mstrategy &= ~STRAT_WAITMASK; else if (distm < distance / 3 && !resist(mtmp, TOOL_CLASS, 0, NOTELL)) @@ -195,7 +195,7 @@ struct monst *bugler; /* monster that played instrument */ mtmp->mcanmove = 1; mtmp->mfrozen = 0; /* may scare some monsters -- waiting monsters excluded */ - if ((mtmp->mstrategy & STRAT_WAITMASK) != 0) + if (!unique_corpstat(mtmp->data) && (mtmp->mstrategy & STRAT_WAITMASK) != 0) mtmp->mstrategy &= ~STRAT_WAITMASK; else if (distm < distance / 3 && !resist(mtmp, TOOL_CLASS, 0, NOTELL)) diff --git a/src/objects.c b/src/objects.c index 32258c398..0d65954c7 100644 --- a/src/objects.c +++ b/src/objects.c @@ -1,12 +1,37 @@ -/* NetHack 3.6 objects.c $NHDT-Date: 1431192766 2015/05/09 17:32:46 $ $NHDT-Branch: master $:$NHDT-Revision: 1.41 $ */ +/* NetHack 3.6 objects.c $NHDT-Date: 1434679652 2015/06/19 02:07:32 $ $NHDT-Branch: master $:$NHDT-Revision: 1.42 $ */ /* 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 */ +struct monst { struct monst *dummy; }; /* lint: struct obj's union */ #include "config.h" #include "obj.h" #include "objclass.h" @@ -22,37 +47,28 @@ struct monst { /* objects have symbols: ) [ = " ( % ! ? + / $ * ` 0 _ . */ /* - * Note: OBJ() and BITS() macros are used to avoid exceeding argument - * limits imposed by some compilers. The ctnr field of BITS currently - * does not map into struct objclass, and is ignored in the expansion. - * The 0 in the expansion corresponds to oc_pre_discovered, which is - * set at run-time during role-specific character initialization. + * 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 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[] = { +NEARDATA struct objdescr obj_descr[] = #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 ODT 1.1 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 \ - } +#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 @@ -60,223 +76,228 @@ NEARDATA struct objdescr #endif NEARDATA struct objclass objects[] = - { #endif - /* dummy object[0] -- description [2nd arg] *must* be NULL */ - OBJECT(OBJ("strange object", (char *) 0), - 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), +{ +/* 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, app, kn, mg, bi, prob, wt, cost, sdam, ldam, hitbon, \ - typ, sub, metal, color) \ - OBJECT(OBJ(name, app), \ - 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, app, kn, prob, wt, cost, sdam, ldam, hitbon, metal, \ - sub, color) \ - OBJECT(OBJ(name, app), \ - 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, app, kn, prob, wt, cost, hitbon, metal, sub, color) \ - OBJECT(OBJ(name, app), \ - 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) +#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! */ + the extra damage is added on in weapon.c, not here! */ #define P PIERCE #define S SLASH #define B WHACK - /* missiles */ - PROJECTILE("arrow", (char *) 0, 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", (char *) 0, 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", (char *) 0, 1, 55, 1, 2, 4, 6, 0, IRON, - -P_CROSSBOW, HI_METAL), +/* 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), - WEAPON("dart", (char *) 0, 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", (char *) 0, 1, 1, 0, 15, 5, 20, 9, 9, 0, 0, - -P_BOOMERANG, WOOD, HI_WOOD), +/* 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", (char *) 0, 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", (char *) 0, 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), +/* 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), - WEAPON("trident", (char *) 0, 1, 0, 0, 8, 25, 5, 6, 4, 0, P, - P_TRIDENT, 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 */ - WEAPON("dagger", (char *) 0, 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", (char *) 0, 1, 1, 0, 3, 12, 40, 4, 3, 2, P, - P_DAGGER, SILVER, HI_SILVER), - WEAPON("athame", (char *) 0, 1, 1, 0, 0, 10, 4, 4, 3, 2, S, P_DAGGER, - IRON, HI_METAL), - WEAPON("scalpel", (char *) 0, 1, 1, 0, 0, 5, 6, 3, 3, 2, S, P_KNIFE, - METAL, HI_METAL), - WEAPON("knife", (char *) 0, 1, 1, 0, 20, 5, 4, 3, 2, 0, - P | S, P_KNIFE, IRON, HI_METAL), - WEAPON("stiletto", (char *) 0, 1, 1, 0, 5, 5, 4, 3, 2, 0, - P | S, P_KNIFE, IRON, HI_METAL), - WEAPON("worm tooth", (char *) 0, 1, 1, 0, 0, 20, 2, 2, 2, 0, 0, - P_KNIFE, 0, CLR_WHITE), - WEAPON("crysknife", (char *) 0, 1, 1, 0, 0, 20, 100, 10, 10, 3, P, - P_KNIFE, MINERAL, CLR_WHITE), +/* 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.5/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 */ +WEAPON("worm tooth", None, + 1, 1, 0, 0, 20, 2, 2, 2, 0, 0, P_KNIFE, 0, CLR_WHITE), +WEAPON("crysknife", None, + 1, 1, 0, 0, 20, 100, 10, 10, 3, P, P_KNIFE, MINERAL, CLR_WHITE), - WEAPON("axe", (char *) 0, 1, 0, 0, 40, 60, 8, 6, 4, 0, S, P_AXE, IRON, - HI_METAL), - WEAPON("battle-axe", "double-headed axe", 0, 0, 1, 10, 120, 40, 8, 6, - 0, S, P_AXE, IRON, HI_METAL), - /* "double-bitted" ? */ +/* 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", (char *) 0, 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", (char *) 0, 1, 0, 0, 6, 40, 75, 8, 8, 0, S, - P_SABER, SILVER, HI_SILVER), - WEAPON("broadsword", (char *) 0, 1, 0, 0, 8, 70, 10, 4, 6, 0, S, - P_BROAD_SWORD, 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), +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", (char *) 0, 1, 0, 0, 50, 40, 15, 8, 12, 0, S, - P_LONG_SWORD, IRON, HI_METAL), - WEAPON("two-handed sword", (char *) 0, 1, 0, 1, 22, 150, 50, 12, 6, 0, - S, P_TWO_HANDED_SWORD, IRON, HI_METAL), +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), +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 */ - /* +5d2 +d8 from level drain */ +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), +/* 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), +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), +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", (char *) 0, 1, 0, 0, 4, 180, 10, 6, 8, 0, P, P_LANCE, - IRON, HI_METAL), - /* axe-type */ - WEAPON("halberd", "angled poleaxe", 0, 0, 1, 8, 150, 10, 10, 6, 0, - P | S, P_POLEARMS, IRON, HI_METAL), +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), +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), +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), +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), - /* 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", (char *) 0, 1, 0, 0, 40, 30, 5, 6, 6, 0, B, P_MACE, - 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", (char *) 0, 1, 0, 0, 12, 120, 10, 4, 6, 0, B, - P_MORNING_STAR, IRON, HI_METAL), +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", (char *) 0, 1, 0, 0, 15, 50, 5, 4, 4, 0, B, - P_HAMMER, IRON, HI_METAL), +WEAPON("war hammer", None, + 1, 0, 0, 15, 50, 5, 4, 4, 0, B, P_HAMMER, IRON, HI_METAL), /* +1 small */ - WEAPON("club", (char *) 0, 1, 0, 0, 12, 30, 3, 6, 3, 0, B, P_CLUB, - WOOD, HI_WOOD), - WEAPON("rubber hose", (char *) 0, 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", (char *) 0, 1, 0, 0, 40, 15, 4, 6, 4, 0, B, P_FLAIL, - IRON, HI_METAL), +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", (char *) 0, 1, 0, 0, 2, 20, 4, 2, 1, 0, 0, P_WHIP, - LEATHER, CLR_BROWN), - /* bows */ - BOW("bow", (char *) 0, 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", (char *) 0, 1, 40, 3, 20, 0, LEATHER, P_SLING, - HI_LEATHER), - BOW("crossbow", (char *) 0, 1, 45, 50, 40, 0, WOOD, P_CROSSBOW, - HI_WOOD), +/* 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 @@ -287,229 +308,224 @@ NEARDATA struct objclass objects[] = #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) + /* 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", (char *) 0, 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), - HELM("dunce cap", "conical hat", 0, 1, 0, 3, 1, 4, 1, 10, 0, CLOTH, - CLR_BLUE), - HELM("dented pot", (char *) 0, 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), +/* 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 - * the same defined in monst.c. + * (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 the same as order of dragons defined in monst.c. */ -#define DRGN_ARMR(name, mgc, power, cost, ac, color) \ - ARMOR(name, (char *) 0, 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), - DRGN_ARMR("silver dragon scale mail", 1, REFLECTING, 1200, 1, - DRAGON_SILVER), +#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), +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" */ - DRGN_ARMR("gray dragon scales", 0, ANTIMAGIC, 700, 7, CLR_GRAY), - DRGN_ARMR("silver dragon scales", 0, REFLECTING, 700, 7, - DRAGON_SILVER), +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" */ +DRGN_ARMR("gray dragon scales", 0, ANTIMAGIC, 700, 7, CLR_GRAY), +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), +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), +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), - ARMOR("plate mail", (char *) 0, 1, 0, 1, 0, 44, 5, 450, 600, 3, - 2, ARM_SUIT, IRON, HI_METAL), - ARMOR("crystal plate mail", (char *) 0, 1, 0, 1, 0, 10, 5, 450, 820, - 3, 2, ARM_SUIT, GLASS, CLR_WHITE), - ARMOR("bronze plate mail", (char *) 0, 1, 0, 1, 0, 25, 5, 450, 400, 4, - 1, ARM_SUIT, COPPER, HI_COPPER), - ARMOR("splint mail", (char *) 0, 1, 0, 1, 0, 62, 5, 400, 80, 4, - 1, ARM_SUIT, IRON, HI_METAL), - ARMOR("banded mail", (char *) 0, 1, 0, 1, 0, 72, 5, 350, 90, 4, - 1, ARM_SUIT, IRON, HI_METAL), - ARMOR("dwarvish mithril-coat", (char *) 0, 1, 0, 0, 0, 10, 1, 150, - 240, 4, 2, ARM_SUIT, MITHRIL, HI_SILVER), - ARMOR("elven mithril-coat", (char *) 0, 1, 0, 0, 0, 15, 1, 150, 240, - 5, 2, ARM_SUIT, MITHRIL, HI_SILVER), - ARMOR("chain mail", (char *) 0, 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", (char *) 0, 1, 0, 0, 0, 72, 5, 250, 45, 6, - 1, ARM_SUIT, IRON, HI_METAL), - ARMOR("studded leather armor", (char *) 0, 1, 0, 0, 0, 72, 3, 200, - 15, 7, 1, ARM_SUIT, LEATHER, HI_LEATHER), - ARMOR("ring mail", (char *) 0, 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", (char *) 0, 1, 0, 0, 0, 82, 3, 150, 5, - 8, 1, ARM_SUIT, LEATHER, HI_LEATHER), - ARMOR("leather jacket", (char *) 0, 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), - /* shirts */ - ARMOR("Hawaiian shirt", (char *) 0, 1, 0, 0, 0, 8, 0, 5, 3, 10, 0, - ARM_SHIRT, CLOTH, CLR_MAGENTA), - ARMOR("T-shirt", (char *) 0, 1, 0, 0, 0, 2, 0, 5, 2, 10, 0, ARM_SHIRT, - CLOTH, CLR_WHITE), - - /* cloaks */ +/* 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("mummy wrapping", (char *) 0, 1, 0, 0, 0, 0, 3, 2, 10, 1, CLOTH, - CLR_GRAY), - 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", (char *) 0, 1, 1, 0, 3, 0, 15, 50, 8, 2, CLOTH, - CLR_RED), - CLOAK("alchemy smock", "apron", 0, 1, POISON_RES, 9, 0, 10, 50, 9, - 1, CLOTH, CLR_WHITE), - CLOAK("leather cloak", (char *) 0, 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("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), - CLOAK("cloak of displacement", "piece of cloth", 0, 1, DISPLACED, - 10, 0, 10, 50, 9, 1, CLOTH, HI_CLOTH), +CLOAK("cloak of displacement", "piece of cloth", + 0, 1, DISPLACED, 10, 0, 10, 50, 9, 1, CLOTH, HI_CLOTH), - /* shields */ - SHIELD("small shield", (char *) 0, 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", (char *) 0, 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), +/* 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) - */ - 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), +/* 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, - 20, 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, 15, 8, - 9, 0, IRON, CLR_BROWN), - 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), +/* 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, 20, 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, 15, 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 @@ -518,596 +534,589 @@ DRGN_ARMR("shimmering dragon scales", 0, DISPLACED, 700, 7, CLR_CYAN), #undef ARMOR /* rings ... */ -#define RING(name, power, stone, 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), \ +#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", ADORNED, "wooden", 100, 1, 1, 2, WOOD, HI_WOOD), - RING("gain strength", 0, "granite", 150, 1, 1, 7, MINERAL, - HI_MINERAL), - RING("gain constitution", 0, "opal", 150, 1, 1, 7, MINERAL, - HI_MINERAL), - RING("increase accuracy", 0, "clay", 150, 1, 1, 4, MINERAL, CLR_RED), - RING("increase damage", 0, "coral", 150, 1, 1, 4, MINERAL, - CLR_ORANGE), - RING("protection", PROTECTION, "black onyx", 100, 1, 1, 7, MINERAL, - CLR_BLACK), - RING("regeneration", REGENERATION, "moonstone", 200, 1, 0, 6, MINERAL, - HI_MINERAL), - RING("searching", SEARCHING, "tiger eye", 200, 1, 0, 6, GEMSTONE, - CLR_BROWN), - RING("stealth", STEALTH, "jade", 100, 1, 0, 6, GEMSTONE, CLR_GREEN), - RING("sustain ability", FIXED_ABIL, "bronze", 100, 1, 0, 4, COPPER, - HI_COPPER), - RING("levitation", LEVITATION, "agate", 200, 1, 0, 7, GEMSTONE, - CLR_RED), - RING("hunger", HUNGER, "topaz", 100, 1, 0, 8, GEMSTONE, CLR_CYAN), - RING("aggravate monster", AGGRAVATE_MONSTER, "sapphire", 150, 1, 0, 9, - GEMSTONE, CLR_BLUE), - RING("conflict", CONFLICT, "ruby", 300, 1, 0, 9, GEMSTONE, CLR_RED), - RING("warning", WARNING, "diamond", 100, 1, 0, 10, GEMSTONE, - CLR_WHITE), - RING("poison resistance", POISON_RES, "pearl", 150, 1, 0, 4, BONE, - CLR_WHITE), - RING("fire resistance", FIRE_RES, "iron", 200, 1, 0, 5, IRON, - HI_METAL), - RING("cold resistance", COLD_RES, "brass", 150, 1, 0, 4, COPPER, - HI_COPPER), - RING("shock resistance", SHOCK_RES, "copper", 150, 1, 0, 3, COPPER, - HI_COPPER), - RING("free action", FREE_ACTION, "twisted", 200, 1, 0, 6, IRON, - HI_METAL), - RING("slow digestion", SLOW_DIGESTION, "steel", 200, 1, 0, 8, IRON, - HI_METAL), - RING("teleportation", TELEPORT, "silver", 200, 1, 0, 3, SILVER, - HI_SILVER), - RING("teleport control", TELEPORT_CONTROL, "gold", 300, 1, 0, 3, GOLD, - HI_GOLD), - RING("polymorph", POLYMORPH, "ivory", 300, 1, 0, 4, BONE, CLR_WHITE), - RING("polymorph control", POLYMORPH_CONTROL, "emerald", 300, 1, 0, 8, - GEMSTONE, CLR_BRIGHT_GREEN), - RING("invisibility", INVIS, "wire", 150, 1, 0, 5, IRON, HI_METAL), - RING("see invisible", SEE_INVIS, "engagement", 150, 1, 0, 5, IRON, - HI_METAL), - RING("protection from shape changers", PROT_FROM_SHAPE_CHANGERS, - "shiny", 100, 1, 0, 5, IRON, CLR_BRIGHT_CYAN), +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) \ +#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, 175), - AMULET("amulet of life saving", "spherical", LIFESAVED, 75), - AMULET("amulet of strangulation", "oval", STRANGLED, 135), - AMULET("amulet of restful sleep", "triangular", SLEEPY, 135), - AMULET("amulet versus poison", "pyramidal", POISON_RES, 165), - AMULET("amulet of change", "square", 0, 130), - /* POLYMORPH */ - AMULET("amulet of unchanging", "concave", UNCHANGING, 45), - AMULET("amulet of reflection", "hexagonal", REFLECTING, 75), - AMULET("amulet of magical breathing", "octagonal", MAGICAL_BREATHING, - 65), - 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), + 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, 175), +AMULET("amulet of life saving", "spherical", LIFESAVED, 75), +AMULET("amulet of strangulation", "oval", STRANGLED, 135), +AMULET("amulet of restful sleep", "triangular", SLEEPY, 135), +AMULET("amulet versus poison", "pyramidal", POISON_RES, 165), +AMULET("amulet of change", "square", 0, 130), +AMULET("amulet of unchanging", "concave", UNCHANGING, 45), +AMULET("amulet of reflection", "hexagonal", REFLECTING, 75), +AMULET("amulet of magical breathing", "octagonal", MAGICAL_BREATHING, 65), +/* 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", (char *) 0, 1, 0, 0, 40, 350, 8, WOOD, - HI_WOOD), - CONTAINER("chest", (char *) 0, 1, 0, 0, 35, 600, 16, WOOD, HI_WOOD), - CONTAINER("ice box", (char *) 0, 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), +#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", (char *) 0, 1, 0, 0, 0, 60, 4, 20, IRON, HI_METAL), - TOOL("credit card", (char *) 0, 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", (char *) 0, 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", (char *) 0, 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", (char *) 0, 1, 0, 0, 0, 5, 3, 80, GLASS, HI_GLASS), - TOOL("blindfold", (char *) 0, 1, 0, 0, 0, 50, 2, 20, CLOTH, - CLR_BLACK), - TOOL("towel", (char *) 0, 1, 0, 0, 0, 50, 2, 50, CLOTH, CLR_MAGENTA), - TOOL("saddle", (char *) 0, 1, 0, 0, 0, 5, 200, 150, LEATHER, - HI_LEATHER), - TOOL("leash", (char *) 0, 1, 0, 0, 0, 65, 12, 20, LEATHER, - HI_LEATHER), - TOOL("stethoscope", (char *) 0, 1, 0, 0, 0, 25, 4, 75, IRON, - HI_METAL), - TOOL("tinning kit", (char *) 0, 1, 0, 0, 1, 15, 100, 30, IRON, - HI_METAL), - TOOL("tin opener", (char *) 0, 1, 0, 0, 0, 35, 4, 30, IRON, HI_METAL), - TOOL("can of grease", (char *) 0, 1, 0, 0, 1, 15, 15, 20, IRON, - HI_METAL), - TOOL("figurine", (char *) 0, 1, 0, 1, 0, 25, 50, 80, MINERAL, - HI_MINERAL), - TOOL("magic marker", (char *) 0, 1, 0, 1, 1, 15, 2, 50, PLASTIC, - CLR_RED), - /* traps */ - TOOL("land mine", (char *) 0, 1, 0, 0, 0, 0, 300, 180, IRON, CLR_RED), - TOOL("beartrap", (char *) 0, 1, 0, 0, 0, 0, 200, 60, IRON, HI_METAL), - /* instruments */ - 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), - /* "If tin whistles are made out of tin, what do they make foghorns - out of?" */ - 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), - 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", (char *) 0, 1, 0, 0, 0, 2, 30, 50, COPPER, HI_COPPER), - TOOL("bugle", (char *) 0, 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", (char *) 0, 1, 0, 0, 20, 100, 50, 6, 3, WHACK, - P_PICK_AXE, IRON, HI_METAL), - WEPTOOL("grappling hook", "iron hook", 0, 0, 0, 5, 30, 50, 2, 6, - WHACK, P_FLAIL, IRON, HI_METAL), +/* 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", "iron hook", + 0, 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" */ - WEPTOOL("unicorn horn", (char *) 0, 1, 1, 1, 0, 20, 100, - 12, 12, PIERCE, P_UNICORN_HORN, BONE, CLR_WHITE), - - /* two special unique artifact "tools" */ - 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), +/* 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, (char *) 0), \ + 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 */ - /* dog eats foods 0-4 but prefers tripe rations above all others */ - /* fortune cookies can be read */ - /* carrots improve your vision */ - /* +0 tins contain monster meat */ - /* +1 tins (of spinach) make you stronger (like Popeye) */ - /* food CORPSE is a cadaver of some type */ - /* meatballs/sticks/rings are only created from objects via stone to - flesh */ +/* 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), - /* 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), +/* 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), - /* special case because it's not mergable */ - OBJECT(OBJ("meat ring", (char *) 0), - 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), - 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), - FOOD("tin", 75, 0, 10, 1, METAL, 0, HI_METAL), +/* 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), - POTION("water", "clear", 0, 0, 92, 100, CLR_CYAN), +#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) \ +#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), - SCROLL((char *) 0, "FOOBIE BLETCH", 1, 0, 100), - SCROLL((char *) 0, "TEMOV", 1, 0, 100), - SCROLL((char *) 0, "GARVEN DEH", 1, 0, 100), - SCROLL((char *) 0, "READ ME", 1, 0, 100), -/* these must come last because they have special descriptions */ + 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 */ +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), +/* these must come last because they have special descriptions + */ #ifdef MAIL - SCROLL("mail", "stamped", 0, 0, 0), +SCROLL("mail", "stamped", 0, 0, 0), #endif - SCROLL("blank paper", "unlabeled", 0, 28, 60), +SCROLL("blank paper", "unlabeled", 0, 28, 60), #undef SCROLL /* spellbooks ... */ -#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) - SPELL("dig", "parchment", P_MATTER_SPELL, 20, 6, 5, 1, RAY, HI_PAPER), - SPELL("magic missile", "vellum", P_ATTACK_SPELL, 45, 2, 2, 1, RAY, - HI_PAPER), - 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, 50, 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), +/* 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 */ +#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) +SPELL("dig", "parchment", + P_MATTER_SPELL, 20, 6, 5, 1, RAY, HI_PAPER), +SPELL("magic missile", "vellum", + P_ATTACK_SPELL, 45, 2, 2, 1, RAY, HI_PAPER), +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, 50, 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 */ -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), +/* 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 - /* blank spellbook must come last because it retains its description - */ - 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, 1, 0, 0, 0, P_NONE, HI_PAPER), 0, - SPBOOK_CLASS, 0, 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), +/* 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, 1, 0, 0, 0, P_NONE, HI_PAPER), + 0, SPBOOK_CLASS, 0, 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) \ +#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), - WAND((char *) 0, "forked", 0, 150, 1, 0, WOOD, HI_WOOD), - WAND((char *) 0, "spiked", 0, 150, 1, 0, IRON, HI_METAL), - WAND((char *) 0, "jeweled", 0, 150, 1, 0, IRON, HI_MINERAL), + 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, (char *) 0), \ - BITS(0, 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), +#define COIN(name,prob,metal,worth) \ + OBJECT(OBJ(name, None), \ + BITS(0, 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), \ +#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), \ +#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), +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", (char *) 0, 1, 100, 10, 0, 3, 3, 0, 10, 7, MINERAL, - CLR_GRAY), +/* 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", (char *) 0), - 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", (char *) 0), - 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), +/* 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", (char *) 0), - 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), +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", (char *) 0), - 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), +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 */ - OBJECT(OBJ("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("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), +/* 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("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("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((char *) 0, (char *) 0), - 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[] */ +/* 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_ @@ -1117,6 +1126,9 @@ SPELL("freeze sphere", "hardcover", P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR #define OBJECTS_PASS_2_ #include "objects.c" +/* clang-format on */ +/* *INDENT-ON* */ + void NDECL(objects_init); /* dummy routine used to force linkage */ diff --git a/src/sounds.c b/src/sounds.c index f95f4eb74..0de6dae56 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 sounds.c $NHDT-Date: 1434421352 2015/06/16 02:22:32 $ $NHDT-Branch: master $:$NHDT-Revision: 1.64 $ */ +/* NetHack 3.6 sounds.c $NHDT-Date: 1434750452 2015/06/19 21:47:32 $ $NHDT-Branch: master $:$NHDT-Revision: 1.68 $ */ /* Copyright (c) 1989 Janet Walz, Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ @@ -917,9 +917,11 @@ register struct monst *mtmp; tribtitle = noveltitle(&novelidx); } if (tribtitle) { - Sprintf(verbuf, - "Ah, so you have a copy of '%s'. I may have been misquoted there.", - tribtitle); + Sprintf(verbuf, "Ah, so you have a copy of /%s/.", tribtitle); + /* no Death featured in these two, so exclude them */ + if (!(strcmpi(tribtitle, "Snuff") == 0 || + strcmpi(tribtitle, "The Wee Free Men") == 0)) + Strcat(verbuf, " I may have been misquoted there."); verbl_msg = verbuf; context.tribute.Deathnotice = 1; } @@ -940,10 +942,12 @@ register struct monst *mtmp; else if (mtmp->mcan && verbl_msg_mcan) verbalize1(verbl_msg_mcan); else if (verbl_msg) { - if (ptr == &mons[PM_DEATH]) { /* Death talks in CAPITAL LETTERS */ + if (ptr == &mons[PM_DEATH]) { + /* Death talks in CAPITAL LETTERS + and without quotation marks */ char tmpbuf[BUFSZ]; Sprintf(tmpbuf, "%s", verbl_msg); - verbalize1(ucase(tmpbuf)); + pline(ucase(tmpbuf)); } else { verbalize1(verbl_msg); } diff --git a/src/version.c b/src/version.c index 2098427c3..2b58cde87 100644 --- a/src/version.c +++ b/src/version.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 version.c $NHDT-Date: 1434505545 2015/06/17 01:45:45 $ $NHDT-Branch: master $:$NHDT-Revision: 1.35 $ */ +/* NetHack 3.6 version.c $NHDT-Date: 1434669434 2015/06/18 23:17:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.36 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -15,7 +15,7 @@ #include "patchlevel.h" #endif -#define BETA_INFO "Beta2" +#define BETA_INFO "Beta3" STATIC_DCL void FDECL(insert_rtoptions, (winid,char *,const char *));