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
976  | objects_init()
977  | {
978  |     return;
979  | }
980  | 
981  | #endif	/* !OBJECTS_PASS_2_ */
982  | 
983  | /*objects.c*/