1 /* SCCS Id: @(#)objects.c 3.4 2002/07/31 */
2 /* Copyright (c) Mike Threepoint, 1989. */
3 /* NetHack may be freely redistributed. See license for details. */
5 #ifndef OBJECTS_PASS_2_
7 struct monst { struct monst *dummy; }; /* lint: struct obj's union */
14 #else /* !OBJECTS_PASS_2_ */
17 # define COLOR_FIELD(X) X,
18 #endif /* !OBJECTS_PASS_2_ */
21 /* objects have symbols: ) [ = " ( % ! ? + / $ * ` 0 _ . */
24 * Note: OBJ() and BITS() macros are used to avoid exceeding argument
25 * limits imposed by some compilers. The ctnr field of BITS currently
26 * does not map into struct objclass, and is ignored in the expansion.
27 * The 0 in the expansion corresponds to oc_pre_discovered, which is
28 * set at run-time during role-specific character initialization.
31 #ifndef OBJECTS_PASS_2_
32 /* first pass -- object descriptive text */
33 # define OBJ(name,desc) name,desc
34 # define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \
37 NEARDATA struct objdescr obj_descr[] = {
39 /* second pass -- object definitions */
41 # define BITS(nmkn,mrg,uskn,ctnr,mgc,chrg,uniq,nwsh,big,tuf,dir,sub,mtrl) \
42 nmkn,mrg,uskn,0,mgc,chrg,uniq,nwsh,big,tuf,dir,mtrl,sub /* SCO ODT 1.1 cpp fodder */
43 # define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \
44 {0, 0, (char *)0, bits, prp, sym, dly, COLOR_FIELD(color) \
45 prob, wt, cost, sdam, ldam, oc1, oc2, nut}
47 # define HARDGEM(n) (n >= 8)
49 # define HARDGEM(n) (0)
52 NEARDATA struct objclass objects[] = {
54 /* dummy object[0] -- description [2nd arg] *must* be NULL */
55 OBJECT(OBJ("strange object",(char *)0), BITS(1,0,0,0,0,0,0,0,0,0,0,P_NONE,0),
56 0, ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
59 #define WEAPON(name,app,kn,mg,bi,prob,wt,cost,sdam,ldam,hitbon,typ,sub,metal,color) \
61 OBJ(name,app), BITS(kn,mg,1,0,0,1,0,0,bi,0,typ,sub,metal), 0, \
62 WEAPON_CLASS, prob, 0, \
63 wt, cost, sdam, ldam, hitbon, 0, wt, color )
64 #define PROJECTILE(name,app,kn,prob,wt,cost,sdam,ldam,hitbon,metal,sub,color) \
67 BITS(kn,1,1,0,0,1,0,0,0,0,PIERCE,sub,metal), 0, \
68 WEAPON_CLASS, prob, 0, \
69 wt, cost, sdam, ldam, hitbon, 0, wt, color )
70 #define BOW(name,app,kn,prob,wt,cost,hitbon,metal,sub,color) \
72 OBJ(name,app), BITS(kn,0,1,0,0,1,0,0,0,0,0,sub,metal), 0, \
73 WEAPON_CLASS, prob, 0, \
74 wt, cost, 2, 2, hitbon, 0, wt, color )
76 /* Note: for weapons that don't do an even die of damage (ex. 2-7 or 3-18)
77 * the extra damage is added on in weapon.c, not here! */
84 PROJECTILE("arrow", (char *)0,
85 1, 55, 1, 2, 6, 6, 0, IRON, -P_BOW, HI_METAL),
86 PROJECTILE("elven arrow", "runed arrow",
87 0, 20, 1, 2, 7, 6, 0, WOOD, -P_BOW, HI_WOOD),
88 PROJECTILE("orcish arrow", "crude arrow",
89 0, 20, 1, 2, 5, 6, 0, IRON, -P_BOW, CLR_BLACK),
90 PROJECTILE("silver arrow", (char *)0,
91 1, 12, 1, 5, 6, 6, 0, SILVER, -P_BOW, HI_SILVER),
92 PROJECTILE("ya", "bamboo arrow",
93 0, 15, 1, 4, 7, 7, 1, METAL, -P_BOW, HI_METAL),
94 PROJECTILE("crossbow bolt", (char *)0,
95 1, 55, 1, 2, 4, 6, 0, IRON, -P_CROSSBOW, HI_METAL),
97 WEAPON("dart", (char *)0,
98 1, 1, 0, 60, 1, 2, 3, 2, 0, P, -P_DART, IRON, HI_METAL),
99 WEAPON("shuriken", "throwing star",
100 0, 1, 0, 35, 1, 5, 8, 6, 2, P, -P_SHURIKEN, IRON, HI_METAL),
101 WEAPON("boomerang", (char *)0,
102 1, 1, 0, 15, 5, 20, 9, 9, 0, 0, -P_BOOMERANG, WOOD, HI_WOOD),
105 WEAPON("spear", (char *)0,
106 1, 1, 0, 50, 30, 3, 6, 8, 0, P, P_SPEAR, IRON, HI_METAL),
107 WEAPON("elven spear", "runed spear",
108 0, 1, 0, 10, 30, 3, 7, 8, 0, P, P_SPEAR, WOOD, HI_WOOD),
109 WEAPON("orcish spear", "crude spear",
110 0, 1, 0, 13, 30, 3, 5, 8, 0, P, P_SPEAR, IRON, CLR_BLACK),
111 WEAPON("dwarvish spear", "stout spear",
112 0, 1, 0, 12, 35, 3, 8, 8, 0, P, P_SPEAR, IRON, HI_METAL),
113 WEAPON("silver spear", (char *)0,
114 1, 1, 0, 2, 36, 40, 6, 8, 0, P, P_SPEAR, SILVER, HI_SILVER),
115 WEAPON("javelin", "throwing spear",
116 0, 1, 0, 10, 20, 3, 6, 6, 0, P, P_JAVELIN, IRON, HI_METAL),
118 WEAPON("trident", (char *)0,
119 1, 0, 0, 8, 25, 5, 6, 4, 0, P, P_TRIDENT, IRON, HI_METAL),
120 /* +1 small, +2d4 large */
123 WEAPON("dagger", (char *)0,
124 1, 1, 0, 30, 10, 4, 4, 3, 2, P, P_DAGGER, IRON, HI_METAL),
125 WEAPON("elven dagger", "runed dagger",
126 0, 1, 0, 10, 10, 4, 5, 3, 2, P, P_DAGGER, WOOD, HI_WOOD),
127 WEAPON("orcish dagger", "crude dagger",
128 0, 1, 0, 12, 10, 4, 3, 3, 2, P, P_DAGGER, IRON, CLR_BLACK),
129 WEAPON("silver dagger", (char *)0,
130 1, 1, 0, 3, 12, 40, 4, 3, 2, P, P_DAGGER, SILVER, HI_SILVER),
131 WEAPON("athame", (char *)0,
132 1, 1, 0, 0, 10, 4, 4, 3, 2, S, P_DAGGER, IRON, HI_METAL),
133 WEAPON("scalpel", (char *)0,
134 1, 1, 0, 0, 5, 6, 3, 3, 2, S, P_KNIFE, METAL, HI_METAL),
135 WEAPON("knife", (char *)0,
136 1, 1, 0, 20, 5, 4, 3, 2, 0, P|S, P_KNIFE, IRON, HI_METAL),
137 WEAPON("stiletto", (char *)0,
138 1, 1, 0, 5, 5, 4, 3, 2, 0, P|S, P_KNIFE, IRON, HI_METAL),
139 WEAPON("worm tooth", (char *)0,
140 1, 0, 0, 0, 20, 2, 2, 2, 0, 0, P_KNIFE, 0, CLR_WHITE),
141 WEAPON("crysknife", (char *)0,
142 1, 0, 0, 0, 20,100, 10, 10, 3, P, P_KNIFE, MINERAL, CLR_WHITE),
144 WEAPON("axe", (char *)0,
145 1, 0, 0, 40, 60, 8, 6, 4, 0, S, P_AXE, IRON, HI_METAL),
146 WEAPON("battle-axe", "double-headed axe",
147 0, 0, 1, 10,120, 40, 8, 6, 0, S, P_AXE, IRON, HI_METAL),
148 /* "double-bitted" ? */
151 WEAPON("short sword", (char *)0,
152 1, 0, 0, 8, 30, 10, 6, 8, 0, P, P_SHORT_SWORD, IRON, HI_METAL),
153 WEAPON("elven short sword", "runed short sword",
154 0, 0, 0, 2, 30, 10, 8, 8, 0, P, P_SHORT_SWORD, WOOD, HI_WOOD),
155 WEAPON("orcish short sword", "crude short sword",
156 0, 0, 0, 3, 30, 10, 5, 8, 0, P, P_SHORT_SWORD, IRON, CLR_BLACK),
157 WEAPON("dwarvish short sword", "broad short sword",
158 0, 0, 0, 2, 30, 10, 7, 8, 0, P, P_SHORT_SWORD, IRON, HI_METAL),
159 WEAPON("scimitar", "curved sword",
160 0, 0, 0, 15, 40, 15, 8, 8, 0, S, P_SCIMITAR, IRON, HI_METAL),
161 WEAPON("silver saber", (char *)0,
162 1, 0, 0, 6, 40, 75, 8, 8, 0, S, P_SABER, SILVER, HI_SILVER),
163 WEAPON("broadsword", (char *)0,
164 1, 0, 0, 8, 70, 10, 4, 6, 0, S, P_BROAD_SWORD, IRON, HI_METAL),
165 /* +d4 small, +1 large */
166 WEAPON("elven broadsword", "runed broadsword",
167 0, 0, 0, 4, 70, 10, 6, 6, 0, S, P_BROAD_SWORD, WOOD, HI_WOOD),
168 /* +d4 small, +1 large */
169 WEAPON("long sword", (char *)0,
170 1, 0, 0, 50, 40, 15, 8, 12, 0, S, P_LONG_SWORD, IRON, HI_METAL),
171 WEAPON("two-handed sword", (char *)0,
172 1, 0, 1, 22,150, 50, 12, 6, 0, S, P_TWO_HANDED_SWORD, IRON, HI_METAL),
174 WEAPON("katana", "samurai sword",
175 0, 0, 0, 4, 40, 80, 10, 12, 1, S, P_LONG_SWORD, IRON, HI_METAL),
176 /* special swords set up for artifacts */
177 WEAPON("tsurugi", "long samurai sword",
178 0, 0, 1, 0, 60,500, 16, 8, 2, S, P_TWO_HANDED_SWORD, METAL, HI_METAL),
180 WEAPON("runesword", "runed broadsword",
181 0, 0, 0, 0, 40,300, 4, 6, 0, S, P_BROAD_SWORD, IRON, CLR_BLACK),
182 /* +d4 small, +1 large */
183 /* +5d2 +d8 from level drain */
187 WEAPON("partisan", "vulgar polearm",
188 0, 0, 1, 5, 80, 10, 6, 6, 0, P, P_POLEARMS, IRON, HI_METAL),
190 WEAPON("ranseur", "hilted polearm",
191 0, 0, 1, 5, 50, 6, 4, 4, 0, P, P_POLEARMS, IRON, HI_METAL),
193 WEAPON("spetum", "forked polearm",
194 0, 0, 1, 5, 50, 5, 6, 6, 0, P, P_POLEARMS, IRON, HI_METAL),
195 /* +1 small, +d6 large */
196 WEAPON("glaive", "single-edged polearm",
197 0, 0, 1, 8, 75, 6, 6, 10, 0, S, P_POLEARMS, IRON, HI_METAL),
198 WEAPON("lance", (char *)0,
199 1, 0, 0, 4,180, 10, 6, 8, 0, P, P_LANCE, IRON, HI_METAL),
201 WEAPON("halberd", "angled poleaxe",
202 0, 0, 1, 8,150, 10, 10, 6, 0, P|S, P_POLEARMS, IRON, HI_METAL),
204 WEAPON("bardiche", "long poleaxe",
205 0, 0, 1, 4,120, 7, 4, 4, 0, S, P_POLEARMS, IRON, HI_METAL),
206 /* +1d4 small, +2d4 large */
207 WEAPON("voulge", "pole cleaver",
208 0, 0, 1, 4,125, 5, 4, 4, 0, S, P_POLEARMS, IRON, HI_METAL),
210 WEAPON("dwarvish mattock", "broad pick",
211 0, 0, 1, 13,120, 50, 12, 8,-1, B, P_PICK_AXE, IRON, HI_METAL),
214 WEAPON("fauchard", "pole sickle",
215 0, 0, 1, 6, 60, 5, 6, 8, 0, P|S, P_POLEARMS, IRON, HI_METAL),
216 WEAPON("guisarme", "pruning hook",
217 0, 0, 1, 6, 80, 5, 4, 8, 0, S, P_POLEARMS, IRON, HI_METAL),
219 WEAPON("bill-guisarme", "hooked polearm",
220 0, 0, 1, 4,120, 7, 4, 10, 0, P|S, P_POLEARMS, IRON, HI_METAL),
223 WEAPON("lucern hammer", "pronged polearm",
224 0, 0, 1, 5,150, 7, 4, 6, 0, B|P, P_POLEARMS, IRON, HI_METAL),
226 WEAPON("bec de corbin", "beaked polearm",
227 0, 0, 1, 4,100, 8, 8, 6, 0, B|P, P_POLEARMS, IRON, HI_METAL),
230 WEAPON("mace", (char *)0,
231 1, 0, 0, 40, 30, 5, 6, 6, 0, B, P_MACE, IRON, HI_METAL),
233 WEAPON("morning star", (char *)0,
234 1, 0, 0, 12,120, 10, 4, 6, 0, B, P_MORNING_STAR, IRON, HI_METAL),
235 /* +d4 small, +1 large */
236 WEAPON("war hammer", (char *)0,
237 1, 0, 0, 15, 50, 5, 4, 4, 0, B, P_HAMMER, IRON, HI_METAL),
239 WEAPON("club", (char *)0,
240 1, 0, 0, 12, 30, 3, 6, 3, 0, B, P_CLUB, WOOD, HI_WOOD),
242 WEAPON("rubber hose", (char *)0,
243 1, 0, 0, 0, 20, 3, 4, 3, 0, B, P_WHIP, PLASTIC, CLR_BROWN),
245 WEAPON("quarterstaff", "staff",
246 0, 0, 1, 11, 40, 5, 6, 6, 0, B, P_QUARTERSTAFF, WOOD, HI_WOOD),
248 WEAPON("aklys", "thonged club",
249 0, 0, 0, 8, 15, 4, 6, 3, 0, B, P_CLUB, IRON, HI_METAL),
250 WEAPON("flail", (char *)0,
251 1, 0, 0, 40, 15, 4, 6, 4, 0, B, P_FLAIL, IRON, HI_METAL),
252 /* +1 small, +1d4 large */
254 WEAPON("bullwhip", (char *)0,
255 1, 0, 0, 2, 20, 4, 2, 1, 0, 0, P_WHIP, LEATHER, CLR_BROWN),
258 BOW("bow", (char *)0, 1, 24, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
259 BOW("elven bow", "runed bow", 0, 12, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
260 BOW("orcish bow", "crude bow", 0, 12, 30, 60, 0, WOOD, P_BOW, CLR_BLACK),
261 BOW("yumi", "long bow", 0, 0, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
262 BOW("sling", (char *)0, 1, 40, 3, 20, 0, LEATHER, P_SLING, HI_LEATHER),
263 BOW("crossbow", (char *)0, 1, 45, 50, 40, 0, WOOD, P_CROSSBOW, HI_WOOD),
274 /* IRON denotes ferrous metals, including steel.
275 * Only IRON weapons and armor can rust.
276 * Only COPPER (including brass) corrodes.
277 * Some creatures are vulnerable to SILVER.
279 #define ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,sub,metal,c) \
281 OBJ(name,desc), BITS(kn,0,1,0,mgc,1,0,0,blk,0,0,sub,metal), power, \
282 ARMOR_CLASS, prob, delay, wt, cost, \
283 0, 0, 10 - ac, can, wt, c )
284 #define HELM(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \
285 ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_HELM,metal,c)
286 #define CLOAK(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \
287 ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_CLOAK,metal,c)
288 #define SHIELD(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,metal,c) \
289 ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,ARM_SHIELD,metal,c)
290 #define GLOVES(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \
291 ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_GLOVES,metal,c)
292 #define BOOTS(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \
293 ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_BOOTS,metal,c)
296 HELM("elven leather helm", "leather hat",
297 0, 0, 0, 6, 1, 3, 8, 9, 0, LEATHER, HI_LEATHER),
298 HELM("orcish helm", "iron skull cap",
299 0, 0, 0, 6, 1, 30, 10, 9, 0, IRON, CLR_BLACK),
300 HELM("dwarvish iron helm", "hard hat",
301 0, 0, 0, 6, 1, 40, 20, 8, 0, IRON, HI_METAL),
302 HELM("fedora", (char *)0,
303 1, 0, 0, 0, 0, 3, 1,10, 0, CLOTH, CLR_BROWN),
304 HELM("cornuthaum", "conical hat",
306 3, 1, 4, 80,10, 2, CLOTH, CLR_BLUE),
307 HELM("dunce cap", "conical hat",
308 0, 1, 0, 3, 1, 4, 1,10, 0, CLOTH, CLR_BLUE),
309 HELM("dented pot", (char *)0,
310 1, 0, 0, 2, 0, 10, 8, 9, 0, IRON, CLR_BLACK),
311 /* With shuffled appearances... */
312 HELM("helmet", "plumed helmet",
313 0, 0, 0, 10, 1, 30, 10, 9, 0, IRON, HI_METAL),
314 HELM("helm of brilliance", "etched helmet",
315 0, 1, 0, 6, 1, 50, 50, 9, 0, IRON, CLR_GREEN),
316 HELM("helm of opposite alignment", "crested helmet",
317 0, 1, 0, 6, 1, 50, 50, 9, 0, IRON, HI_METAL),
318 HELM("helm of telepathy", "visored helmet",
319 0, 1, TELEPAT, 2, 1, 50, 50, 9, 0, IRON, HI_METAL),
323 * There is code in polyself.c that assumes (1) and (2).
324 * There is code in obj.h, objnam.c, mon.c, read.c that assumes (2).
326 * (1) The dragon scale mails and the dragon scales are together.
327 * (2) That the order of the dragon scale mail and dragon scales is the
328 * the same defined in monst.c.
330 #define DRGN_ARMR(name,mgc,power,cost,ac,color) \
331 ARMOR(name,(char *)0,1,mgc,1,power,0,5,40,cost,ac,0,ARM_SUIT,DRAGON_HIDE,color)
332 /* 3.4.1: dragon scale mail reclassified as "magic" since magic is
333 needed to create them */
334 DRGN_ARMR("gray dragon scale mail", 1, ANTIMAGIC, 1200, 1, CLR_GRAY),
335 DRGN_ARMR("silver dragon scale mail", 1, REFLECTING, 1200, 1, DRAGON_SILVER),
337 DRGN_ARMR("shimmering dragon scale mail", 1, DISPLACED, 1200, 1, CLR_CYAN),
339 DRGN_ARMR("red dragon scale mail", 1, FIRE_RES, 900, 1, CLR_RED),
340 DRGN_ARMR("white dragon scale mail", 1, COLD_RES, 900, 1, CLR_WHITE),
341 DRGN_ARMR("orange dragon scale mail", 1, SLEEP_RES, 900, 1, CLR_ORANGE),
342 DRGN_ARMR("black dragon scale mail", 1, DISINT_RES, 1200, 1, CLR_BLACK),
343 DRGN_ARMR("blue dragon scale mail", 1, SHOCK_RES, 900, 1, CLR_BLUE),
344 DRGN_ARMR("green dragon scale mail", 1, POISON_RES, 900, 1, CLR_GREEN),
345 DRGN_ARMR("yellow dragon scale mail", 1, ACID_RES, 900, 1, CLR_YELLOW),
347 /* For now, only dragons leave these. */
348 /* 3.4.1: dragon scales left classified as "non-magic"; they confer
349 magical properties but are produced "naturally" */
350 DRGN_ARMR("gray dragon scales", 0, ANTIMAGIC, 700, 7, CLR_GRAY),
351 DRGN_ARMR("silver dragon scales", 0, REFLECTING, 700, 7, DRAGON_SILVER),
353 DRGN_ARMR("shimmering dragon scales", 0, DISPLACED, 700, 7, CLR_CYAN),
355 DRGN_ARMR("red dragon scales", 0, FIRE_RES, 500, 7, CLR_RED),
356 DRGN_ARMR("white dragon scales", 0, COLD_RES, 500, 7, CLR_WHITE),
357 DRGN_ARMR("orange dragon scales", 0, SLEEP_RES, 500, 7, CLR_ORANGE),
358 DRGN_ARMR("black dragon scales", 0, DISINT_RES, 700, 7, CLR_BLACK),
359 DRGN_ARMR("blue dragon scales", 0, SHOCK_RES, 500, 7, CLR_BLUE),
360 DRGN_ARMR("green dragon scales", 0, POISON_RES, 500, 7, CLR_GREEN),
361 DRGN_ARMR("yellow dragon scales", 0, ACID_RES, 500, 7, CLR_YELLOW),
364 ARMOR("plate mail", (char *)0,
365 1, 0, 1, 0, 44, 5, 450, 600, 3, 2, ARM_SUIT, IRON, HI_METAL),
366 ARMOR("crystal plate mail", (char *)0,
367 1, 0, 1, 0, 10, 5, 450, 820, 3, 2, ARM_SUIT, GLASS, CLR_WHITE),
369 ARMOR("bronze plate mail", (char *)0,
370 1, 0, 1, 0, 25, 5, 450, 400, 4, 0, ARM_SUIT, COPPER, HI_COPPER),
372 ARMOR("bronze plate mail", (char *)0,
373 1, 0, 1, 0, 35, 5, 450, 400, 4, 0, ARM_SUIT, COPPER, HI_COPPER),
375 ARMOR("splint mail", (char *)0,
376 1, 0, 1, 0, 62, 5, 400, 80, 4, 1, ARM_SUIT, IRON, HI_METAL),
377 ARMOR("banded mail", (char *)0,
378 1, 0, 1, 0, 72, 5, 350, 90, 4, 0, ARM_SUIT, IRON, HI_METAL),
379 ARMOR("dwarvish mithril-coat", (char *)0,
380 1, 0, 0, 0, 10, 1, 150, 240, 4, 3, ARM_SUIT, MITHRIL, HI_METAL),
381 ARMOR("elven mithril-coat", (char *)0,
382 1, 0, 0, 0, 15, 1, 150, 240, 5, 3, ARM_SUIT, MITHRIL, HI_METAL),
383 ARMOR("chain mail", (char *)0,
384 1, 0, 0, 0, 72, 5, 300, 75, 5, 1, ARM_SUIT, IRON, HI_METAL),
385 ARMOR("orcish chain mail", "crude chain mail",
386 0, 0, 0, 0, 20, 5, 300, 75, 6, 1, ARM_SUIT, IRON, CLR_BLACK),
387 ARMOR("scale mail", (char *)0,
388 1, 0, 0, 0, 72, 5, 250, 45, 6, 0, ARM_SUIT, IRON, HI_METAL),
389 ARMOR("studded leather armor", (char *)0,
390 1, 0, 0, 0, 72, 3, 200, 15, 7, 1, ARM_SUIT, LEATHER, HI_LEATHER),
391 ARMOR("ring mail", (char *)0,
392 1, 0, 0, 0, 72, 5, 250, 100, 7, 0, ARM_SUIT, IRON, HI_METAL),
393 ARMOR("orcish ring mail", "crude ring mail",
394 0, 0, 0, 0, 20, 5, 250, 80, 8, 1, ARM_SUIT, IRON, CLR_BLACK),
395 ARMOR("leather armor", (char *)0,
396 1, 0, 0, 0, 82, 3, 150, 5, 8, 0, ARM_SUIT, LEATHER, HI_LEATHER),
397 ARMOR("leather jacket", (char *)0,
398 1, 0, 0, 0, 12, 0, 30, 10, 9, 0, ARM_SUIT, LEATHER, CLR_BLACK),
402 ARMOR("Hawaiian shirt", (char *)0,
403 1, 0, 0, 0, 8, 0, 5, 3, 10, 0, ARM_SHIRT, CLOTH, CLR_MAGENTA),
404 ARMOR("T-shirt", (char *)0,
405 1, 0, 0, 0, 2, 0, 5, 2, 10, 0, ARM_SHIRT, CLOTH, CLR_WHITE),
409 /* 'cope' is not a spelling mistake... leave it be */
410 CLOAK("mummy wrapping", (char *)0,
411 1, 0, 0, 0, 0, 3, 2, 10, 1, CLOTH, CLR_GRAY),
412 CLOAK("elven cloak", "faded pall",
413 0, 1, STEALTH, 8, 0, 10, 60, 9, 3, CLOTH, CLR_BLACK),
414 CLOAK("orcish cloak", "coarse mantelet",
415 0, 0, 0, 8, 0, 10, 40, 10, 2, CLOTH, CLR_BLACK),
416 CLOAK("dwarvish cloak", "hooded cloak",
417 0, 0, 0, 8, 0, 10, 50, 10, 2, CLOTH, HI_CLOTH),
418 CLOAK("oilskin cloak", "slippery cloak",
419 0, 0, 0, 8, 0, 10, 50, 9, 3, CLOTH, HI_CLOTH),
420 CLOAK("robe", (char *)0,
421 1, 1, 0, 3, 0, 15, 50, 8, 3, CLOTH, CLR_RED),
422 CLOAK("alchemy smock", "apron",
423 0, 1, POISON_RES, 9, 0, 10, 50, 9, 1, CLOTH, CLR_WHITE),
424 CLOAK("leather cloak", (char *)0,
425 1, 0, 0, 8, 0, 15, 40, 9, 1, LEATHER, CLR_BROWN),
426 /* With shuffled appearances... */
427 CLOAK("cloak of protection", "tattered cape",
428 0, 1, PROTECTION, 9, 0, 10, 50, 7, 3, CLOTH, HI_CLOTH),
429 CLOAK("cloak of invisibility", "opera cloak",
430 0, 1, INVIS, 10, 0, 10, 60, 9, 2, CLOTH, CLR_BRIGHT_MAGENTA),
431 CLOAK("cloak of magic resistance", "ornamental cope",
432 0, 1, ANTIMAGIC, 2, 0, 10, 60, 9, 3, CLOTH, CLR_WHITE),
433 CLOAK("cloak of displacement", "piece of cloth",
434 0, 1, DISPLACED, 10, 0, 10, 50, 9, 2, CLOTH, HI_CLOTH),
437 SHIELD("small shield", (char *)0,
438 1, 0, 0, 0, 6, 0, 30, 3, 9, 0, WOOD, HI_WOOD),
439 SHIELD("elven shield", "blue and green shield",
440 0, 0, 0, 0, 2, 0, 40, 7, 8, 0, WOOD, CLR_GREEN),
441 SHIELD("Uruk-hai shield", "white-handed shield",
442 0, 0, 0, 0, 2, 0, 50, 7, 9, 0, IRON, HI_METAL),
443 SHIELD("orcish shield", "red-eyed shield",
444 0, 0, 0, 0, 2, 0, 50, 7, 9, 0, IRON, CLR_RED),
445 SHIELD("large shield", (char *)0,
446 1, 0, 1, 0, 7, 0,100, 10, 8, 0, IRON, HI_METAL),
447 SHIELD("dwarvish roundshield", "large round shield",
448 0, 0, 0, 0, 4, 0,100, 10, 8, 0, IRON, HI_METAL),
449 SHIELD("shield of reflection", "polished silver shield",
450 0, 1, 0, REFLECTING, 3, 0, 50, 50, 8, 0, SILVER, HI_SILVER),
453 /* these have their color but not material shuffled, so the IRON must stay
454 * CLR_BROWN (== HI_LEATHER)
456 GLOVES("leather gloves", "old gloves",
457 0, 0, 0, 16, 1, 10, 8, 9, 0, LEATHER, HI_LEATHER),
458 GLOVES("gauntlets of fumbling", "padded gloves",
459 0, 1, FUMBLING, 8, 1, 10, 50, 9, 0, LEATHER, HI_LEATHER),
460 GLOVES("gauntlets of power", "riding gloves",
461 0, 1, 0, 8, 1, 30, 50, 9, 0, IRON, CLR_BROWN),
462 GLOVES("gauntlets of dexterity", "fencing gloves",
463 0, 1, 0, 8, 1, 10, 50, 9, 0, LEATHER, HI_LEATHER),
466 BOOTS("low boots", "walking shoes",
467 0, 0, 0, 25, 2, 10, 8, 9, 0, LEATHER, HI_LEATHER),
468 BOOTS("iron shoes", "hard shoes",
469 0, 0, 0, 7, 2, 50, 16, 8, 0, IRON, HI_METAL),
470 BOOTS("high boots", "jackboots",
471 0, 0, 0, 15, 2, 20, 12, 8, 0, LEATHER, HI_LEATHER),
472 /* With shuffled appearances... */
473 BOOTS("speed boots", "combat boots",
474 0, 1, FAST, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER),
475 BOOTS("water walking boots", "jungle boots",
476 0, 1, WWALKING, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER),
477 BOOTS("jumping boots", "hiking boots",
478 0, 1, JUMPING, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER),
479 BOOTS("elven boots", "mud boots",
480 0, 1, STEALTH, 12, 2, 15, 8, 9, 0, LEATHER, HI_LEATHER),
481 BOOTS("kicking boots", "buckled boots",
482 0, 1, 0, 12, 2, 15, 8, 9, 0, IRON, CLR_BROWN),
483 BOOTS("fumble boots", "riding boots",
484 0, 1, FUMBLING, 12, 2, 20, 30, 9, 0, LEATHER, HI_LEATHER),
485 BOOTS("levitation boots", "snow boots",
486 0, 1, LEVITATION,12, 2, 15, 30, 9, 0, LEATHER, HI_LEATHER),
495 #define RING(name,power,stone,cost,mgc,spec,mohs,metal,color) OBJECT( \
497 BITS(0,0,spec,0,mgc,spec,0,0,0,HARDGEM(mohs),0,P_NONE,metal), \
498 power, RING_CLASS, 0, 0, 3, cost, 0, 0, 0, 0, 15, color )
499 RING("adornment", ADORNED, "wooden", 100, 1, 1, 2, WOOD, HI_WOOD),
500 RING("gain strength", 0, "granite", 150, 1, 1, 7, MINERAL, HI_MINERAL),
501 RING("gain constitution", 0, "opal", 150, 1, 1, 7, MINERAL, HI_MINERAL),
502 RING("increase accuracy", 0, "clay", 150, 1, 1, 4, MINERAL, CLR_RED),
503 RING("increase damage", 0, "coral", 150, 1, 1, 4, MINERAL, CLR_ORANGE),
504 RING("protection", PROTECTION, "black onyx",100, 1, 1, 7, MINERAL, CLR_BLACK),
505 RING("regeneration", REGENERATION, "moonstone",
506 200, 1, 0, 6, MINERAL, HI_MINERAL),
507 RING("searching", SEARCHING, "tiger eye", 200, 1, 0, 6, GEMSTONE, CLR_BROWN),
508 RING("stealth", STEALTH, "jade", 100, 1, 0, 6, GEMSTONE, CLR_GREEN),
509 RING("sustain ability", FIXED_ABIL, "bronze",
510 100, 1, 0, 4, COPPER, HI_COPPER),
511 RING("levitation", LEVITATION, "agate", 200, 1, 0, 7, GEMSTONE, CLR_RED),
512 RING("hunger", HUNGER, "topaz", 100, 1, 0, 8, GEMSTONE, CLR_CYAN),
513 RING("aggravate monster", AGGRAVATE_MONSTER, "sapphire",
514 150, 1, 0, 9, GEMSTONE, CLR_BLUE),
515 RING("conflict", CONFLICT, "ruby", 300, 1, 0, 9, GEMSTONE, CLR_RED),
516 RING("warning", WARNING, "diamond", 100, 1, 0,10, GEMSTONE, CLR_WHITE),
517 RING("poison resistance", POISON_RES, "pearl",
518 150, 1, 0, 4, IRON, CLR_WHITE),
519 RING("fire resistance", FIRE_RES, "iron", 200, 1, 0, 5, IRON, HI_METAL),
520 RING("cold resistance", COLD_RES, "brass", 150, 1, 0, 4, COPPER, HI_COPPER),
521 RING("shock resistance", SHOCK_RES, "copper",
522 150, 1, 0, 3, COPPER, HI_COPPER),
523 RING("free action", FREE_ACTION, "twisted",
524 200, 1, 0, 6, IRON, HI_METAL),
525 RING("slow digestion", SLOW_DIGESTION, "steel",
526 200, 1, 0, 8, IRON, HI_METAL),
527 RING("teleportation", TELEPORT, "silver", 200, 1, 0, 3, SILVER, HI_SILVER),
528 RING("teleport control", TELEPORT_CONTROL, "gold",
529 300, 1, 0, 3, GOLD, HI_GOLD),
530 RING("polymorph", POLYMORPH, "ivory", 300, 1, 0, 4, BONE, CLR_WHITE),
531 RING("polymorph control", POLYMORPH_CONTROL, "emerald",
532 300, 1, 0, 8, GEMSTONE, CLR_BRIGHT_GREEN),
533 RING("invisibility", INVIS, "wire", 150, 1, 0, 5, IRON, HI_METAL),
534 RING("see invisible", SEE_INVIS, "engagement",
535 150, 1, 0, 5, IRON, HI_METAL),
536 RING("protection from shape changers", PROT_FROM_SHAPE_CHANGERS, "shiny",
537 100, 1, 0, 5, IRON, CLR_BRIGHT_CYAN),
540 /* amulets ... - THE Amulet comes last because it is special */
541 #define AMULET(name,desc,power,prob) OBJECT( \
542 OBJ(name,desc), BITS(0,0,0,0,1,0,0,0,0,0,0,P_NONE,IRON), power, \
543 AMULET_CLASS, prob, 0, 20, 150, 0, 0, 0, 0, 20, HI_METAL )
545 AMULET("amulet of ESP", "circular", TELEPAT, 175),
546 AMULET("amulet of life saving", "spherical", LIFESAVED, 75),
547 AMULET("amulet of strangulation", "oval", STRANGLED, 135),
548 AMULET("amulet of restful sleep", "triangular", SLEEPING, 135),
549 AMULET("amulet versus poison", "pyramidal", POISON_RES, 165),
550 AMULET("amulet of change", "square", 0, 130),
552 AMULET("amulet of unchanging", "concave", UNCHANGING, 45),
553 AMULET("amulet of reflection", "hexagonal", REFLECTING, 75),
554 AMULET("amulet of magical breathing", "octagonal", MAGICAL_BREATHING, 65),
555 OBJECT(OBJ("cheap plastic imitation of the Amulet of Yendor",
556 "Amulet of Yendor"), BITS(0,0,1,0,0,0,0,0,0,0,0,0,PLASTIC), 0,
557 AMULET_CLASS, 0, 0, 20, 0, 0, 0, 0, 0, 1, HI_METAL),
558 OBJECT(OBJ("Amulet of Yendor", /* note: description == name */
559 "Amulet of Yendor"), BITS(0,0,1,0,1,0,1,1,0,0,0,0,MITHRIL), 0,
560 AMULET_CLASS, 0, 0, 20, 30000, 0, 0, 0, 0, 20, HI_METAL),
564 /* tools with weapon characteristics come last */
565 #define TOOL(name,desc,kn,mrg,mgc,chg,prob,wt,cost,mat,color) \
566 OBJECT( OBJ(name,desc), \
567 BITS(kn,mrg,chg,0,mgc,chg,0,0,0,0,0,P_NONE,mat), \
568 0, TOOL_CLASS, prob, 0, \
569 wt, cost, 0, 0, 0, 0, wt, color )
570 #define CONTAINER(name,desc,kn,mgc,chg,prob,wt,cost,mat,color) \
571 OBJECT( OBJ(name,desc), \
572 BITS(kn,0,chg,1,mgc,chg,0,0,0,0,0,P_NONE,mat), \
573 0, TOOL_CLASS, prob, 0, \
574 wt, cost, 0, 0, 0, 0, wt, color )
575 #define WEPTOOL(name,desc,kn,mgc,bi,prob,wt,cost,sdam,ldam,hitbon,sub,mat,clr) \
576 OBJECT( OBJ(name,desc), \
577 BITS(kn,0,1,0,mgc,1,0,0,bi,0,hitbon,sub,mat), \
578 0, TOOL_CLASS, prob, 0, \
579 wt, cost, sdam, ldam, hitbon, 0, wt, clr )
581 CONTAINER("large box", (char *)0, 1, 0, 0, 40,350, 8, WOOD, HI_WOOD),
582 CONTAINER("chest", (char *)0, 1, 0, 0, 35,600, 16, WOOD, HI_WOOD),
583 CONTAINER("ice box", (char *)0, 1, 0, 0, 5,900, 42, PLASTIC, CLR_WHITE),
584 CONTAINER("sack", "bag", 0, 0, 0, 35, 15, 2, CLOTH, HI_CLOTH),
585 CONTAINER("oilskin sack", "bag", 0, 0, 0, 5, 15, 100, CLOTH, HI_CLOTH),
586 CONTAINER("bag of holding", "bag", 0, 1, 0, 20, 15, 100, CLOTH, HI_CLOTH),
587 CONTAINER("bag of tricks", "bag", 0, 1, 1, 20, 15, 100, CLOTH, HI_CLOTH),
590 /* lock opening tools */
591 TOOL("skeleton key", "key", 0, 0, 0, 0, 80, 3, 10, IRON, HI_METAL),
593 TOOL("lock pick", (char *)0, 1, 0, 0, 0, 60, 4, 20, IRON, HI_METAL),
594 TOOL("credit card", (char *)0, 1, 0, 0, 0, 15, 1, 10, PLASTIC, CLR_WHITE),
596 TOOL("lock pick", (char *)0, 1, 0, 0, 0, 75, 4, 20, IRON, HI_METAL),
599 TOOL("tallow candle", "candle", 0, 1, 0, 0, 20, 2, 10, WAX, CLR_WHITE),
600 TOOL("wax candle", "candle", 0, 1, 0, 0, 5, 2, 20, WAX, CLR_WHITE),
601 TOOL("brass lantern", (char *)0,1, 0, 0, 0, 30, 30, 12, COPPER, CLR_YELLOW),
602 TOOL("oil lamp", "lamp", 0, 0, 0, 0, 45, 20, 10, COPPER, CLR_YELLOW),
603 TOOL("magic lamp", "lamp", 0, 0, 1, 0, 15, 20, 50, COPPER, CLR_YELLOW),
606 TOOL("expensive camera", (char *)0,
607 1, 0, 0, 1, 15, 12, 200, PLASTIC, CLR_BLACK),
608 TOOL("mirror", "looking glass", 0, 0, 0, 0, 45, 13, 10, GLASS, HI_SILVER),
610 TOOL("mirror", "looking glass", 0, 0, 0, 0, 60, 13, 10, GLASS, HI_SILVER),
612 TOOL("crystal ball", "glass orb",
613 0, 0, 1, 1, 15,150, 60, GLASS, HI_GLASS),
614 TOOL("lenses", (char *)0, 1, 0, 0, 0, 5, 3, 80, GLASS, HI_GLASS),
615 TOOL("blindfold", (char *)0, 1, 0, 0, 0, 50, 2, 20, CLOTH, CLR_BLACK),
616 TOOL("towel", (char *)0, 1, 0, 0, 0, 50, 2, 50, CLOTH, CLR_MAGENTA),
618 TOOL("saddle", (char *)0, 1, 0, 0, 0, 5,200, 150, LEATHER, HI_LEATHER),
619 TOOL("leash", (char *)0, 1, 0, 0, 0, 65, 12, 20, LEATHER, HI_LEATHER),
621 TOOL("leash", (char *)0, 1, 0, 0, 0, 70, 12, 20, LEATHER, HI_LEATHER),
623 TOOL("stethoscope", (char *)0, 1, 0, 0, 0, 25, 4, 75, IRON, HI_METAL),
624 TOOL("tinning kit", (char *)0, 1, 0, 0, 1, 15,100, 30, IRON, HI_METAL),
625 TOOL("tin opener", (char *)0, 1, 0, 0, 0, 35, 4, 30, IRON, HI_METAL),
626 TOOL("can of grease", (char *)0,1, 0, 0, 1, 15, 15, 20, IRON, HI_METAL),
627 TOOL("figurine", (char *)0, 1, 0, 1, 0, 25, 50, 80, MINERAL, HI_MINERAL),
628 TOOL("magic marker", (char *)0, 1, 0, 1, 1, 15, 2, 50, PLASTIC, CLR_RED),
630 TOOL("land mine",(char *)0, 1, 0, 0, 0, 0,300, 180, IRON, CLR_RED),
631 TOOL("beartrap", (char *)0, 1, 0, 0, 0, 0,200, 60, IRON, HI_METAL),
633 TOOL("tin whistle", "whistle", 0, 0, 0, 0, 100, 3, 10, METAL, HI_METAL),
634 TOOL("magic whistle", "whistle",0, 0, 1, 0, 30, 3, 10, METAL, HI_METAL),
635 /* "If tin whistles are made out of tin, what do they make foghorns out of?" */
636 TOOL("wooden flute", "flute", 0, 0, 0, 0, 4, 5, 12, WOOD, HI_WOOD),
637 TOOL("magic flute", "flute", 0, 0, 1, 1, 2, 5, 36, WOOD, HI_WOOD),
638 TOOL("tooled horn", "horn", 0, 0, 0, 0, 5, 18, 15, BONE, CLR_WHITE),
639 TOOL("frost horn", "horn", 0, 0, 1, 1, 2, 18, 50, BONE, CLR_WHITE),
640 TOOL("fire horn", "horn", 0, 0, 1, 1, 2, 18, 50, BONE, CLR_WHITE),
641 TOOL("horn of plenty", "horn", 0, 0, 1, 1, 2, 18, 50, BONE, CLR_WHITE),
642 TOOL("wooden harp", "harp", 0, 0, 0, 0, 4, 30, 50, WOOD, HI_WOOD),
643 TOOL("magic harp", "harp", 0, 0, 1, 1, 2, 30, 50, WOOD, HI_WOOD),
644 TOOL("bell", (char *)0, 1, 0, 0, 0, 2, 30, 50, COPPER, HI_COPPER),
645 TOOL("bugle", (char *)0, 1, 0, 0, 0, 4, 10, 15, COPPER, HI_COPPER),
646 TOOL("leather drum", "drum", 0, 0, 0, 0, 4, 25, 25, LEATHER, HI_LEATHER),
647 TOOL("drum of earthquake", "drum",
648 0, 0, 1, 1, 2, 25, 25, LEATHER, HI_LEATHER),
649 /* tools useful as weapons */
650 WEPTOOL("pick-axe", (char *)0,
651 1, 0, 0, 20, 100, 50, 6, 3, WHACK, P_PICK_AXE, IRON, HI_METAL),
652 WEPTOOL("grappling hook", "iron hook",
653 0, 0, 0, 5, 30, 50, 2, 6, WHACK, P_FLAIL, IRON, HI_METAL),
654 /* 3.4.1: unicorn horn left classified as "magic" */
655 WEPTOOL("unicorn horn", (char *)0,
656 1, 1, 1, 0, 20, 100, 12, 12, PIERCE, P_UNICORN_HORN, BONE, CLR_WHITE),
658 /* two special unique artifact "tools" */
659 OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"),
660 BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,GOLD), 0,
661 TOOL_CLASS, 0, 0,10, 5000, 0, 0, 0, 0, 200, HI_GOLD),
662 OBJECT(OBJ("Bell of Opening", "silver bell"),
663 BITS(0,0,1,0,1,1,1,1,0,0,0,P_NONE,SILVER), 0,
664 TOOL_CLASS, 0, 0,10, 5000, 0, 0, 0, 0, 50, HI_SILVER),
668 /* Comestibles ... */
669 #define FOOD(name,prob,delay,wt,unk,tin,nutrition,color) OBJECT( \
670 OBJ(name,(char *)0), BITS(1,1,unk,0,0,0,0,0,0,0,0,P_NONE,tin), 0, \
671 FOOD_CLASS, prob, delay, \
672 wt, nutrition/20 + 5, 0, 0, 0, 0, nutrition, color )
673 /* all types of food (except tins & corpses) must have a delay of at least 1. */
674 /* delay on corpses is computed and is weight dependant */
675 /* dog eats foods 0-4 but prefers tripe rations above all others */
676 /* fortune cookies can be read */
677 /* carrots improve your vision */
678 /* +0 tins contain monster meat */
679 /* +1 tins (of spinach) make you stronger (like Popeye) */
680 /* food CORPSE is a cadaver of some type */
681 /* meatballs/sticks/rings are only created from objects via stone to flesh */
684 FOOD("tripe ration", 140, 2, 10, 0, FLESH, 200, CLR_BROWN),
685 FOOD("corpse", 0, 1, 0, 0, FLESH, 0, CLR_BROWN),
686 FOOD("egg", 85, 1, 1, 1, FLESH, 80, CLR_WHITE),
687 FOOD("meatball", 0, 1, 1, 0, FLESH, 5, CLR_BROWN),
688 FOOD("meat stick", 0, 1, 1, 0, FLESH, 5, CLR_BROWN),
689 FOOD("huge chunk of meat", 0,20,400, 0, FLESH,2000, CLR_BROWN),
690 /* special case because it's not mergable */
691 OBJECT(OBJ("meat ring", (char *)0),
692 BITS(1,0,0,0,0,0,0,0,0,0,0,0,FLESH),
693 0, FOOD_CLASS, 0, 1, 5, 1, 0, 0, 0, 0, 5, CLR_BROWN),
695 /* fruits & veggies */
696 FOOD("kelp frond", 0, 1, 1, 0, VEGGY, 30, CLR_GREEN),
697 FOOD("eucalyptus leaf", 3, 1, 1, 0, VEGGY, 30, CLR_GREEN),
698 FOOD("apple", 15, 1, 2, 0, VEGGY, 50, CLR_RED),
699 FOOD("orange", 10, 1, 2, 0, VEGGY, 80, CLR_ORANGE),
700 FOOD("pear", 10, 1, 2, 0, VEGGY, 50, CLR_BRIGHT_GREEN),
701 FOOD("melon", 10, 1, 5, 0, VEGGY, 100, CLR_BRIGHT_GREEN),
702 FOOD("banana", 10, 1, 2, 0, VEGGY, 80, CLR_YELLOW),
703 FOOD("carrot", 15, 1, 2, 0, VEGGY, 50, CLR_ORANGE),
704 FOOD("sprig of wolfsbane", 7, 1, 1, 0, VEGGY, 40, CLR_GREEN),
705 FOOD("clove of garlic", 7, 1, 1, 0, VEGGY, 40, CLR_WHITE),
706 FOOD("slime mold", 75, 1, 5, 0, VEGGY, 250, HI_ORGANIC),
709 FOOD("lump of royal jelly", 0, 1, 2, 0, VEGGY, 200, CLR_YELLOW),
710 FOOD("cream pie", 25, 1, 10, 0, VEGGY, 100, CLR_WHITE),
711 FOOD("candy bar", 13, 1, 2, 0, VEGGY, 100, CLR_BROWN),
712 FOOD("fortune cookie", 55, 1, 1, 0, VEGGY, 40, CLR_YELLOW),
713 FOOD("pancake", 25, 2, 2, 0, VEGGY, 200, CLR_YELLOW),
714 FOOD("lembas wafer", 20, 2, 5, 0, VEGGY, 800, CLR_WHITE),
715 FOOD("cram ration", 20, 3, 15, 0, VEGGY, 600, HI_ORGANIC),
716 FOOD("food ration", 380, 5, 20, 0, VEGGY, 800, HI_ORGANIC),
717 FOOD("K-ration", 0, 1, 10, 0, VEGGY, 400, HI_ORGANIC),
718 FOOD("C-ration", 0, 1, 10, 0, VEGGY, 300, HI_ORGANIC),
719 FOOD("tin", 75, 0, 10, 1, METAL, 0, HI_METAL),
723 #define POTION(name,desc,mgc,power,prob,cost,color) OBJECT( \
724 OBJ(name,desc), BITS(0,1,0,0,mgc,0,0,0,0,0,0,P_NONE,GLASS), power, \
725 POTION_CLASS, prob, 0, 20, cost, 0, 0, 0, 0, 10, color )
726 POTION("gain ability", "ruby", 1, 0, 42, 300, CLR_RED),
727 POTION("restore ability", "pink", 1, 0, 40, 100, CLR_BRIGHT_MAGENTA),
728 POTION("confusion", "orange", 1, CONFUSION, 42, 100, CLR_ORANGE),
729 POTION("blindness", "yellow", 1, BLINDED, 40, 150, CLR_YELLOW),
730 POTION("paralysis", "emerald", 1, 0, 42, 300, CLR_BRIGHT_GREEN),
731 POTION("speed", "dark green", 1, FAST, 42, 200, CLR_GREEN),
732 POTION("levitation", "cyan", 1, LEVITATION, 42, 200, CLR_CYAN),
733 POTION("hallucination", "sky blue", 1, HALLUC, 40, 100, CLR_CYAN),
734 POTION("invisibility", "brilliant blue",1, INVIS, 40, 150, CLR_BRIGHT_BLUE),
735 POTION("see invisible", "magenta", 1, SEE_INVIS, 42, 50, CLR_MAGENTA),
736 POTION("healing", "purple-red", 1, 0, 57, 100, CLR_MAGENTA),
737 POTION("extra healing", "puce", 1, 0, 47, 100, CLR_RED),
738 POTION("gain level", "milky", 1, 0, 20, 300, CLR_WHITE),
739 POTION("enlightenment", "swirly", 1, 0, 20, 200, CLR_BROWN),
740 POTION("monster detection", "bubbly", 1, 0, 40, 150, CLR_WHITE),
741 POTION("object detection", "smoky", 1, 0, 42, 150, CLR_GRAY),
742 POTION("gain energy", "cloudy", 1, 0, 42, 150, CLR_WHITE),
743 POTION("sleeping", "effervescent", 1, 0, 42, 100, CLR_GRAY),
744 POTION("full healing", "black", 1, 0, 10, 200, CLR_BLACK),
745 POTION("polymorph", "golden", 1, 0, 10, 200, CLR_YELLOW),
746 POTION("booze", "brown", 0, 0, 42, 50, CLR_BROWN),
747 POTION("sickness", "fizzy", 0, 0, 42, 50, CLR_CYAN),
748 POTION("fruit juice", "dark", 0, 0, 42, 50, CLR_BLACK),
749 POTION("acid", "white", 0, 0, 10, 250, CLR_WHITE),
750 POTION("oil", "murky", 0, 0, 30, 250, CLR_BROWN),
751 POTION("water", "clear", 0, 0, 92, 100, CLR_CYAN),
755 #define SCROLL(name,text,mgc,prob,cost) OBJECT( \
756 OBJ(name,text), BITS(0,1,0,0,mgc,0,0,0,0,0,0,P_NONE,PAPER), 0, \
757 SCROLL_CLASS, prob, 0, 5, cost, 0, 0, 0, 0, 6, HI_PAPER )
758 SCROLL("enchant armor", "ZELGO MER", 1, 63, 80),
759 SCROLL("destroy armor", "JUYED AWK YACC", 1, 45, 100),
760 SCROLL("confuse monster", "NR 9", 1, 53, 100),
761 SCROLL("scare monster", "XIXAXA XOXAXA XUXAXA", 1, 35, 100),
762 SCROLL("remove curse", "PRATYAVAYAH", 1, 65, 80),
763 SCROLL("enchant weapon", "DAIYEN FOOELS", 1, 80, 60),
764 SCROLL("create monster", "LEP GEX VEN ZEA", 1, 45, 200),
765 SCROLL("taming", "PRIRUTSENIE", 1, 15, 200),
766 SCROLL("genocide", "ELBIB YLOH", 1, 15, 300),
767 SCROLL("light", "VERR YED HORRE", 1, 90, 50),
768 SCROLL("teleportation", "VENZAR BORGAVVE", 1, 55, 100),
769 SCROLL("gold detection", "THARR", 1, 33, 100),
770 SCROLL("food detection", "YUM YUM", 1, 25, 100),
771 SCROLL("identify", "KERNOD WEL", 1, 180, 20),
772 SCROLL("magic mapping", "ELAM EBOW", 1, 45, 100),
773 SCROLL("amnesia", "DUAM XNAHT", 1, 35, 200),
774 SCROLL("fire", "ANDOVA BEGARIN", 1, 30, 100),
775 SCROLL("earth", "KIRJE", 1, 18, 200),
776 SCROLL("punishment", "VE FORBRYDERNE", 1, 15, 300),
777 SCROLL("charging", "HACKEM MUCHE", 1, 15, 300),
778 SCROLL("stinking cloud", "VELOX NEB", 1, 15, 300),
779 SCROLL((char *)0, "FOOBIE BLETCH", 1, 0, 100),
780 SCROLL((char *)0, "TEMOV", 1, 0, 100),
781 SCROLL((char *)0, "GARVEN DEH", 1, 0, 100),
782 SCROLL((char *)0, "READ ME", 1, 0, 100),
783 /* these must come last because they have special descriptions */
785 SCROLL("mail", "stamped", 0, 0, 0),
787 SCROLL("blank paper", "unlabeled", 0, 28, 60),
791 #define SPELL(name,desc,sub,prob,delay,level,mgc,dir,color) OBJECT( \
792 OBJ(name,desc), BITS(0,0,0,0,mgc,0,0,0,0,0,dir,sub,PAPER), 0, \
793 SPBOOK_CLASS, prob, delay, \
794 50, level*100, 0, 0, 0, level, 20, color )
795 SPELL("dig", "parchment", P_MATTER_SPELL, 20, 6, 5, 1, RAY, HI_PAPER),
796 SPELL("magic missile", "vellum", P_ATTACK_SPELL, 45, 2, 2, 1, RAY, HI_PAPER),
797 SPELL("fireball", "ragged", P_ATTACK_SPELL, 20, 4, 4, 1, RAY, HI_PAPER),
798 SPELL("cone of cold", "dog eared", P_ATTACK_SPELL, 10, 7, 4, 1, RAY, HI_PAPER),
799 SPELL("sleep", "mottled", P_ENCHANTMENT_SPELL, 50, 1, 1, 1, RAY, HI_PAPER),
800 SPELL("finger of death", "stained", P_ATTACK_SPELL, 5, 10, 7, 1, RAY, HI_PAPER),
801 SPELL("light", "cloth", P_DIVINATION_SPELL, 45, 1, 1, 1, NODIR, HI_CLOTH),
802 SPELL("detect monsters", "leather", P_DIVINATION_SPELL, 43, 1, 1, 1, NODIR, HI_LEATHER),
803 SPELL("healing", "white", P_HEALING_SPELL, 40, 2, 1, 1, IMMEDIATE, CLR_WHITE),
804 SPELL("knock", "pink", P_MATTER_SPELL, 35, 1, 1, 1, IMMEDIATE, CLR_BRIGHT_MAGENTA),
805 SPELL("force bolt", "red", P_ATTACK_SPELL, 35, 2, 1, 1, IMMEDIATE, CLR_RED),
806 SPELL("confuse monster", "orange", P_ENCHANTMENT_SPELL, 30, 2, 2, 1, IMMEDIATE, CLR_ORANGE),
807 SPELL("cure blindness", "yellow", P_HEALING_SPELL, 25, 2, 2, 1, IMMEDIATE, CLR_YELLOW),
808 SPELL("drain life", "velvet", P_ATTACK_SPELL, 10, 2, 2, 1, IMMEDIATE, CLR_MAGENTA),
809 SPELL("slow monster", "light green", P_ENCHANTMENT_SPELL, 30, 2, 2, 1, IMMEDIATE, CLR_BRIGHT_GREEN),
810 SPELL("wizard lock", "dark green", P_MATTER_SPELL, 30, 3, 2, 1, IMMEDIATE, CLR_GREEN),
811 SPELL("create monster", "turquoise", P_CLERIC_SPELL, 35, 3, 2, 1, NODIR, CLR_BRIGHT_CYAN),
812 SPELL("detect food", "cyan", P_DIVINATION_SPELL, 30, 3, 2, 1, NODIR, CLR_CYAN),
813 SPELL("cause fear", "light blue", P_ENCHANTMENT_SPELL, 25, 3, 3, 1, NODIR, CLR_BRIGHT_BLUE),
814 SPELL("clairvoyance", "dark blue", P_DIVINATION_SPELL, 15, 3, 3, 1, NODIR, CLR_BLUE),
815 SPELL("cure sickness", "indigo", P_HEALING_SPELL, 32, 3, 3, 1, NODIR, CLR_BLUE),
816 SPELL("charm monster", "magenta", P_ENCHANTMENT_SPELL, 20, 3, 3, 1, IMMEDIATE, CLR_MAGENTA),
817 SPELL("haste self", "purple", P_ESCAPE_SPELL, 33, 4, 3, 1, NODIR, CLR_MAGENTA),
818 SPELL("detect unseen", "violet", P_DIVINATION_SPELL, 20, 4, 3, 1, NODIR, CLR_MAGENTA),
819 SPELL("levitation", "tan", P_ESCAPE_SPELL, 20, 4, 4, 1, NODIR, CLR_BROWN),
820 SPELL("extra healing", "plaid", P_HEALING_SPELL, 27, 5, 3, 1, IMMEDIATE, CLR_GREEN),
821 SPELL("restore ability", "light brown", P_HEALING_SPELL, 25, 5, 4, 1, NODIR, CLR_BROWN),
822 SPELL("invisibility", "dark brown", P_ESCAPE_SPELL, 25, 5, 4, 1, NODIR, CLR_BROWN),
823 SPELL("detect treasure", "gray", P_DIVINATION_SPELL, 20, 5, 4, 1, NODIR, CLR_GRAY),
824 SPELL("remove curse", "wrinkled", P_CLERIC_SPELL, 25, 5, 3, 1, NODIR, HI_PAPER),
825 SPELL("magic mapping", "dusty", P_DIVINATION_SPELL, 18, 7, 5, 1, NODIR, HI_PAPER),
826 SPELL("identify", "bronze", P_DIVINATION_SPELL, 20, 6, 3, 1, NODIR, HI_COPPER),
827 SPELL("turn undead", "copper", P_CLERIC_SPELL, 16, 8, 6, 1, IMMEDIATE, HI_COPPER),
828 SPELL("polymorph", "silver", P_MATTER_SPELL, 10, 8, 6, 1, IMMEDIATE, HI_SILVER),
829 SPELL("teleport away", "gold", P_ESCAPE_SPELL, 15, 6, 6, 1, IMMEDIATE, HI_GOLD),
830 SPELL("create familiar", "glittering", P_CLERIC_SPELL, 10, 7, 6, 1, NODIR, CLR_WHITE),
831 SPELL("cancellation", "shining", P_MATTER_SPELL, 15, 8, 7, 1, IMMEDIATE, CLR_WHITE),
832 SPELL("protection", "dull", P_CLERIC_SPELL, 18, 3, 1, 1, NODIR, HI_PAPER),
833 SPELL("jumping", "thin", P_ESCAPE_SPELL, 20, 3, 1, 1, IMMEDIATE, HI_PAPER),
834 SPELL("stone to flesh", "thick", P_HEALING_SPELL, 15, 1, 3, 1, IMMEDIATE, HI_PAPER),
836 SPELL("flame sphere", "canvas", P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR_BROWN),
837 SPELL("freeze sphere", "hardcover", P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR_BROWN),
839 /* blank spellbook must come last because it retains its description */
840 SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER),
841 /* a special, one of a kind, spellbook */
842 OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0,
843 SPBOOK_CLASS, 0, 0,20, 10000, 0, 0, 0, 7, 20, HI_PAPER),
847 #define WAND(name,typ,prob,cost,mgc,dir,metal,color) OBJECT( \
848 OBJ(name,typ), BITS(0,0,1,0,mgc,1,0,0,0,0,dir,P_NONE,metal), 0, \
849 WAND_CLASS, prob, 0, 7, cost, 0, 0, 0, 0, 30, color )
850 WAND("light", "glass", 95, 100, 1, NODIR, GLASS, HI_GLASS),
851 WAND("secret door detection", "balsa",
852 50, 150, 1, NODIR, WOOD, HI_WOOD),
853 WAND("enlightenment", "crystal", 15, 150, 1, NODIR, GLASS, HI_GLASS),
854 WAND("create monster", "maple", 45, 200, 1, NODIR, WOOD, HI_WOOD),
855 WAND("wishing", "pine", 5, 500, 1, NODIR, WOOD, HI_WOOD),
856 WAND("nothing", "oak", 25, 100, 0, IMMEDIATE, WOOD, HI_WOOD),
857 WAND("striking", "ebony", 75, 150, 1, IMMEDIATE, WOOD, HI_WOOD),
858 WAND("make invisible", "marble", 45, 150, 1, IMMEDIATE, MINERAL, HI_MINERAL),
859 WAND("slow monster", "tin", 50, 150, 1, IMMEDIATE, METAL, HI_METAL),
860 WAND("speed monster", "brass", 50, 150, 1, IMMEDIATE, COPPER, HI_COPPER),
861 WAND("undead turning", "copper", 50, 150, 1, IMMEDIATE, COPPER, HI_COPPER),
862 WAND("polymorph", "silver", 45, 200, 1, IMMEDIATE, SILVER, HI_SILVER),
863 WAND("cancellation", "platinum", 45, 200, 1, IMMEDIATE, PLATINUM, CLR_WHITE),
864 WAND("teleportation", "iridium", 45, 200, 1, IMMEDIATE, METAL, CLR_BRIGHT_CYAN),
865 WAND("opening", "zinc", 25, 150, 1, IMMEDIATE, METAL, HI_METAL),
866 WAND("locking", "aluminum", 25, 150, 1, IMMEDIATE, METAL, HI_METAL),
867 WAND("probing", "uranium", 30, 150, 1, IMMEDIATE, METAL, HI_METAL),
868 WAND("digging", "iron", 55, 150, 1, RAY, IRON, HI_METAL),
869 WAND("magic missile", "steel", 50, 150, 1, RAY, IRON, HI_METAL),
870 WAND("fire", "hexagonal",40, 175, 1, RAY, IRON, HI_METAL),
871 WAND("cold", "short", 40, 175, 1, RAY, IRON, HI_METAL),
872 WAND("sleep", "runed", 50, 175, 1, RAY, IRON, HI_METAL),
873 WAND("death", "long", 5, 500, 1, RAY, IRON, HI_METAL),
874 WAND("lightning", "curved", 40, 175, 1, RAY, IRON, HI_METAL),
875 WAND((char *)0, "forked", 0, 150, 1, 0, WOOD, HI_WOOD),
876 WAND((char *)0, "spiked", 0, 150, 1, 0, IRON, HI_METAL),
877 WAND((char *)0, "jeweled", 0, 150, 1, 0, IRON, HI_MINERAL),
880 /* coins ... - so far, gold is all there is */
881 #define COIN(name,prob,metal,worth) OBJECT( \
882 OBJ(name,(char *)0), BITS(0,1,0,0,0,0,0,0,0,0,0,P_NONE,metal), 0, \
883 COIN_CLASS, prob, 0, 1, worth, 0, 0, 0, 0, 0, HI_GOLD )
884 COIN("gold piece", 1000, GOLD,1),
887 /* gems ... - includes stones and rocks but not boulders */
888 #define GEM(name,desc,prob,wt,gval,nutr,mohs,glass,color) OBJECT( \
890 BITS(0,1,0,0,0,0,0,0,0,HARDGEM(mohs),0,-P_SLING,glass), 0, \
891 GEM_CLASS, prob, 0, 1, gval, 3, 3, 0, 0, nutr, color )
892 #define ROCK(name,desc,kn,prob,wt,gval,sdam,ldam,mgc,nutr,mohs,glass,color) OBJECT( \
894 BITS(kn,1,0,0,mgc,0,0,0,0,HARDGEM(mohs),0,-P_SLING,glass), 0, \
895 GEM_CLASS, prob, 0, wt, gval, sdam, ldam, 0, 0, nutr, color )
896 GEM("dilithium crystal", "white", 2, 1, 4500, 15, 5, GEMSTONE, CLR_WHITE),
897 GEM("diamond", "white", 3, 1, 4000, 15, 10, GEMSTONE, CLR_WHITE),
898 GEM("ruby", "red", 4, 1, 3500, 15, 9, GEMSTONE, CLR_RED),
899 GEM("jacinth", "orange", 3, 1, 3250, 15, 9, GEMSTONE, CLR_ORANGE),
900 GEM("sapphire", "blue", 4, 1, 3000, 15, 9, GEMSTONE, CLR_BLUE),
901 GEM("black opal", "black", 3, 1, 2500, 15, 8, GEMSTONE, CLR_BLACK),
902 GEM("emerald", "green", 5, 1, 2500, 15, 8, GEMSTONE, CLR_GREEN),
903 GEM("turquoise", "green", 6, 1, 2000, 15, 6, GEMSTONE, CLR_GREEN),
904 GEM("citrine", "yellow", 4, 1, 1500, 15, 6, GEMSTONE, CLR_YELLOW),
905 GEM("aquamarine", "green", 6, 1, 1500, 15, 8, GEMSTONE, CLR_GREEN),
906 GEM("amber", "yellowish brown", 8, 1, 1000, 15, 2, GEMSTONE, CLR_BROWN),
907 GEM("topaz", "yellowish brown", 10, 1, 900, 15, 8, GEMSTONE, CLR_BROWN),
908 GEM("jet", "black", 6, 1, 850, 15, 7, GEMSTONE, CLR_BLACK),
909 GEM("opal", "white", 12, 1, 800, 15, 6, GEMSTONE, CLR_WHITE),
910 GEM("chrysoberyl", "yellow", 8, 1, 700, 15, 5, GEMSTONE, CLR_YELLOW),
911 GEM("garnet", "red", 12, 1, 700, 15, 7, GEMSTONE, CLR_RED),
912 GEM("amethyst", "violet", 14, 1, 600, 15, 7, GEMSTONE, CLR_MAGENTA),
913 GEM("jasper", "red", 15, 1, 500, 15, 7, GEMSTONE, CLR_RED),
914 GEM("fluorite", "violet", 15, 1, 400, 15, 4, GEMSTONE, CLR_MAGENTA),
915 GEM("obsidian", "black", 9, 1, 200, 15, 6, GEMSTONE, CLR_BLACK),
916 GEM("agate", "orange", 12, 1, 200, 15, 6, GEMSTONE, CLR_ORANGE),
917 GEM("jade", "green", 10, 1, 300, 15, 6, GEMSTONE, CLR_GREEN),
918 GEM("worthless piece of white glass", "white", 77, 1, 0, 6, 5, GLASS, CLR_WHITE),
919 GEM("worthless piece of blue glass", "blue", 77, 1, 0, 6, 5, GLASS, CLR_BLUE),
920 GEM("worthless piece of red glass", "red", 77, 1, 0, 6, 5, GLASS, CLR_RED),
921 GEM("worthless piece of yellowish brown glass", "yellowish brown",
922 77, 1, 0, 6, 5, GLASS, CLR_BROWN),
923 GEM("worthless piece of orange glass", "orange", 76, 1, 0, 6, 5, GLASS, CLR_ORANGE),
924 GEM("worthless piece of yellow glass", "yellow", 77, 1, 0, 6, 5, GLASS, CLR_YELLOW),
925 GEM("worthless piece of black glass", "black", 76, 1, 0, 6, 5, GLASS, CLR_BLACK),
926 GEM("worthless piece of green glass", "green", 77, 1, 0, 6, 5, GLASS, CLR_GREEN),
927 GEM("worthless piece of violet glass", "violet", 77, 1, 0, 6, 5, GLASS, CLR_MAGENTA),
929 /* Placement note: there is a wishable subrange for
930 * "gray stones" in the o_ranges[] array in objnam.c
931 * that is currently everything between luckstones and flint (inclusive).
933 ROCK("luckstone", "gray", 0, 10, 10, 60, 3, 3, 1, 10, 7, MINERAL, CLR_GRAY),
934 ROCK("loadstone", "gray", 0, 10, 500, 1, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY),
935 ROCK("touchstone", "gray", 0, 8, 10, 45, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY),
936 ROCK("flint", "gray", 0, 10, 10, 1, 6, 6, 0, 10, 7, MINERAL, CLR_GRAY),
937 ROCK("rock", (char *)0, 1,100, 10, 0, 3, 3, 0, 10, 7, MINERAL, CLR_GRAY),
941 /* miscellaneous ... */
942 /* Note: boulders and rocks are not normally created at random; the
943 * probabilities only come into effect when you try to polymorph them.
944 * Boulders weigh more than MAX_CARR_CAP; statues use corpsenm to take
945 * on a specific type and may act as containers (both affect weight).
947 OBJECT(OBJ("boulder",(char *)0), BITS(1,0,0,0,0,0,0,0,1,0,0,P_NONE,MINERAL), 0,
948 ROCK_CLASS, 100, 0, 6000, 0, 20, 20, 0, 0, 2000, HI_MINERAL),
949 OBJECT(OBJ("statue", (char *)0), BITS(1,0,0,1,0,0,0,0,0,0,0,P_NONE,MINERAL), 0,
950 ROCK_CLASS, 900, 0, 2500, 0, 20, 20, 0, 0, 2500, CLR_WHITE),
952 OBJECT(OBJ("heavy iron ball", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,WHACK,P_NONE,IRON), 0,
953 BALL_CLASS, 1000, 0, 480, 10, 25, 25, 0, 0, 200, HI_METAL),
954 /* +d4 when "very heavy" */
955 OBJECT(OBJ("iron chain", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,WHACK,P_NONE,IRON), 0,
956 CHAIN_CLASS, 1000, 0, 120, 0, 4, 4, 0, 0, 200, HI_METAL),
959 OBJECT(OBJ("blinding venom", "splash of venom"),
960 BITS(0,1,0,0,0,0,0,1,0,0,0,P_NONE,LIQUID), 0,
961 VENOM_CLASS, 500, 0, 1, 0, 0, 0, 0, 0, 0, HI_ORGANIC),
962 OBJECT(OBJ("acid venom", "splash of venom"),
963 BITS(0,1,0,0,0,0,0,1,0,0,0,P_NONE,LIQUID), 0,
964 VENOM_CLASS, 500, 0, 1, 0, 6, 6, 0, 0, 0, HI_ORGANIC),
965 /* +d6 small or large */
967 /* fencepost, the deadly Array Terminator -- name [1st arg] *must* be NULL */
968 OBJECT(OBJ((char *)0,(char *)0), BITS(0,0,0,0,0,0,0,0,0,0,0,P_NONE,0), 0,
969 ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
972 #ifndef OBJECTS_PASS_2_
974 /* perform recursive compilation for second structure */
977 # define OBJECTS_PASS_2_
980 void NDECL(objects_init);
982 /* dummy routine used to force linkage */
989 #endif /* !OBJECTS_PASS_2_ */