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