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