Source:NetHack 3.4.3/src/objects.c

From NetHackWiki
Revision as of 18:50, 23 July 2007 by 24.148.129.192 (talk) (Object macros: only the first 10 values in "bits" are 1 or 0)
Jump to navigation Jump to search

Below is the full text to src/objects.c from NetHack 3.4.3. To link to a particular line, write [[objects.c#line123|objects.c#line123]], for example.

Top of file

1.    /*	SCCS Id: @(#)objects.c	3.4	2002/07/31	*/
2.    /* Copyright (c) Mike Threepoint, 1989.				  */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    

The NetHack General Public License applies to screenshots, source code and other content from NetHack.

This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.

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.   #include "color.h"
17.   #  define COLOR_FIELD(X) X,
18.   #endif	/* !OBJECTS_PASS_2_ */
19.   
20.   
21.   /* objects have symbols: ) [ = " ( % ! ? + / $ * ` 0 _ . */
22.   
23.   /*
24.    *	Note:  OBJ() and BITS() macros are used to avoid exceeding argument
25.    *	limits imposed by some compilers.  The ctnr field of BITS currently
26.    *	does not map into struct objclass, and is ignored in the expansion.
27.    *	The 0 in the expansion corresponds to oc_pre_discovered, which is
28.    *	set at run-time during role-specific character initialization.
29.    */
30.   

Object macros

31.   #ifndef OBJECTS_PASS_2_
32.   /* first pass -- object descriptive text */
33.   # define OBJ(name,desc) name,desc

Object name and description. The description field can be (char *)0, in which case there is no description, and only the object name is used.

34.   # define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \
35.   	{obj}
36.   

The OBJECT macro.

  1. obj is the OBJ macro from above.
  2. bits are special bitfields, see BITS macro below.
  3. prp is special property of the object it grants, eg. REFLECTING or LIFESAVED.
  4. sym is the object symbol, one of the _CLASS definitions, eg. GEM_CLASS.
  5. prob is the object relative random generation probability. For each object class (eg. scrolls or potions), the total of this must be 1000.
  6. dly is delay (in turns) it takes to use the object, eg. to wear or to take off.
  7. wt is object weight.
  8. cost is object base cost, in zorkmids.
  9. sdam means how much object deals damage to small monsters.
  10. ldam means how much object deals damage to large monsters.
  11. oc1 is to-hit bonus for weapons or base AC for armor
  12. oc2 is MC level for armor or spell level for spellbooks
  13. nut is nutrition gained when the object is eaten.
  14. color is the object color, as used in the TTY windowport.
37.   NEARDATA struct objdescr obj_descr[] = {
38.   #else
39.   /* second pass -- object definitions */
40.   
41.   # define BITS(nmkn,mrg,uskn,ctnr,mgc,chrg,uniq,nwsh,big,tuf,dir,sub,mtrl) \
42.   	nmkn,mrg,uskn,0,mgc,chrg,uniq,nwsh,big,tuf,dir,mtrl,sub /* SCO ODT 1.1 cpp fodder */

The BITS macro. Each of the first 10 values is either 1 or 0.

  1. nmkn tells whether to use the object description or the object real name by default. (See the OBJ macro, above)
  2. mrg tells whether the object can be merged with similar objects or not.
  3. uskn "uses known"
  4. ctnr tells if the object is pre-discovered, ie. known at the start of the game.
  5. mgc tells whether the object is inherently magical or not.
  6. chrg tells whether the object has charges.
  7. uniq tells if the object is unique.
  8. nwsh tells whether player can wish for the object or not.
  9. big tells whether weapon or tool is bimanual, or whether armor is bulky.
  10. tuf whether gems are hard or soft.
  11. dir takes either NODIR, IMMEDIATE or RAY, and defines how wands behave when zapped.
  12. sub armor subtype (as defined in objclass.h) or skills of weapons, spellbooks, tools or gems.
  13. mtrl takes one of the material definitions, eg. LEATHER or IRON, as defined in objclass.h
43.   # define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \
44.   	{0, 0, (char *)0, bits, prp, sym, dly, COLOR_FIELD(color) \
45.   	 prob, wt, cost, sdam, ldam, oc1, oc2, nut}
46.   # ifndef lint
47.   #  define HARDGEM(n) (n >= 8)
48.   # else
49.   #  define HARDGEM(n) (0)
50.   # endif
51.   
52.   NEARDATA struct objclass objects[] = {
53.   #endif
54.   /* dummy object[0] -- description [2nd arg] *must* be NULL */
55.   	OBJECT(OBJ("strange object",(char *)0), BITS(1,0,0,0,0,0,0,0,0,0,0,P_NONE,0),
56.   			0, ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
57.   

Weapons

Weapon macros

58.   /* weapons ... */
59.   #define WEAPON(name,app,kn,mg,bi,prob,wt,cost,sdam,ldam,hitbon,typ,sub,metal,color) \
60.   	OBJECT( \
61.   		OBJ(name,app), BITS(kn,mg,1,0,0,1,0,0,bi,0,typ,sub,metal), 0, \
62.   		WEAPON_CLASS, prob, 0, \
63.   		wt, cost, sdam, ldam, hitbon, 0, wt, color )
64.   #define PROJECTILE(name,app,kn,prob,wt,cost,sdam,ldam,hitbon,metal,sub,color) \
65.   	OBJECT( \
66.   		OBJ(name,app), \
67.   		BITS(kn,1,1,0,0,1,0,0,0,0,PIERCE,sub,metal), 0, \
68.   		WEAPON_CLASS, prob, 0, \
69.   		wt, cost, sdam, ldam, hitbon, 0, wt, color )
70.   #define BOW(name,app,kn,prob,wt,cost,hitbon,metal,sub,color) \
71.   	OBJECT( \
72.   		OBJ(name,app), BITS(kn,0,1,0,0,1,0,0,0,0,0,sub,metal), 0, \
73.   		WEAPON_CLASS, prob, 0, \
74.   		wt, cost, 2, 2, hitbon, 0, wt, color )
75.   
76.   /* Note: for weapons that don't do an even die of damage (ex. 2-7 or 3-18)
77.    * the extra damage is added on in weapon.c, not here! */
78.   
79.   #define P PIERCE
80.   #define S SLASH
81.   #define B WHACK
82.   

Projectiles

83.   /* missiles */
84.   PROJECTILE("arrow", (char *)0,
85.   		1, 55, 1, 2, 6, 6, 0, IRON, -P_BOW, HI_METAL),
86.   PROJECTILE("elven arrow", "runed arrow",
87.   		0, 20, 1, 2, 7, 6, 0, WOOD, -P_BOW, HI_WOOD),
88.   PROJECTILE("orcish arrow", "crude arrow",
89.   		0, 20, 1, 2, 5, 6, 0, IRON, -P_BOW, CLR_BLACK),
90.   PROJECTILE("silver arrow", (char *)0,
91.   		1, 12, 1, 5, 6, 6, 0, SILVER, -P_BOW, HI_SILVER),
92.   PROJECTILE("ya", "bamboo arrow",
93.   		0, 15, 1, 4, 7, 7, 1, METAL, -P_BOW, HI_METAL),
94.   PROJECTILE("crossbow bolt", (char *)0,
95.   		1, 55, 1, 2, 4, 6, 0, IRON, -P_CROSSBOW, HI_METAL),
96.   
97.   WEAPON("dart", (char *)0,
98.   	1, 1, 0, 60,  1,  2,  3,  2, 0, P,   -P_DART, IRON, HI_METAL),
99.   WEAPON("shuriken", "throwing star",
100.  	0, 1, 0, 35,  1,  5,  8,  6, 2, P,   -P_SHURIKEN, IRON, HI_METAL),
101.  WEAPON("boomerang", (char *)0,
102.  	1, 1, 0, 15,  5, 20,  9,  9, 0, 0,   -P_BOOMERANG, WOOD, HI_WOOD),
103.  

Spears

104.  /* spears */
105.  WEAPON("spear", (char *)0,
106.  	1, 1, 0, 50, 30,  3,  6,  8, 0, P,   P_SPEAR, IRON, HI_METAL),
107.  WEAPON("elven spear", "runed spear",
108.  	0, 1, 0, 10, 30,  3,  7,  8, 0, P,   P_SPEAR, WOOD, HI_WOOD),
109.  WEAPON("orcish spear", "crude spear",
110.  	0, 1, 0, 13, 30,  3,  5,  8, 0, P,   P_SPEAR, IRON, CLR_BLACK),
111.  WEAPON("dwarvish spear", "stout spear",
112.  	0, 1, 0, 12, 35,  3,  8,  8, 0, P,   P_SPEAR, IRON, HI_METAL),
113.  WEAPON("silver spear", (char *)0,
114.  	1, 1, 0,  2, 36, 40,  6,  8, 0, P,   P_SPEAR, SILVER, HI_SILVER),
115.  WEAPON("javelin", "throwing spear",
116.  	0, 1, 0, 10, 20,  3,  6,  6, 0, P,   P_JAVELIN, IRON, HI_METAL),
117.  
118.  WEAPON("trident", (char *)0,
119.  	1, 0, 0,  8, 25,  5,  6,  4, 0, P,   P_TRIDENT, IRON, HI_METAL),
120.  						/* +1 small, +2d4 large */
121.  

Blades

122.  /* blades */
123.  WEAPON("dagger", (char *)0,
124.  	1, 1, 0, 30, 10,  4,  4,  3, 2, P,   P_DAGGER, IRON, HI_METAL),
125.  WEAPON("elven dagger", "runed dagger",
126.  	0, 1, 0, 10, 10,  4,  5,  3, 2, P,   P_DAGGER, WOOD, HI_WOOD),
127.  WEAPON("orcish dagger", "crude dagger",
128.  	0, 1, 0, 12, 10,  4,  3,  3, 2, P,   P_DAGGER, IRON, CLR_BLACK),
129.  WEAPON("silver dagger", (char *)0,
130.  	1, 1, 0,  3, 12, 40,  4,  3, 2, P,   P_DAGGER, SILVER, HI_SILVER),
131.  WEAPON("athame", (char *)0,
132.  	1, 1, 0,  0, 10,  4,  4,  3, 2, S,   P_DAGGER, IRON, HI_METAL),
133.  WEAPON("scalpel", (char *)0,
134.  	1, 1, 0,  0,  5,  6,  3,  3, 2, S,   P_KNIFE, METAL, HI_METAL),
135.  WEAPON("knife", (char *)0,
136.  	1, 1, 0, 20,  5,  4,  3,  2, 0, P|S, P_KNIFE, IRON, HI_METAL),
137.  WEAPON("stiletto", (char *)0,
138.  	1, 1, 0,  5,  5,  4,  3,  2, 0, P|S, P_KNIFE, IRON, HI_METAL),
139.  WEAPON("worm tooth", (char *)0,
140.  	1, 0, 0,  0, 20,  2,  2,  2, 0, 0,   P_KNIFE, 0, CLR_WHITE),
141.  WEAPON("crysknife", (char *)0,
142.  	1, 0, 0,  0, 20,100, 10, 10, 3, P,   P_KNIFE, MINERAL, CLR_WHITE),
143.  
144.  WEAPON("axe", (char *)0,
145.  	1, 0, 0, 40, 60,  8,  6,  4, 0, S,   P_AXE, IRON, HI_METAL),
146.  WEAPON("battle-axe", "double-headed axe",
147.  	0, 0, 1, 10,120, 40,  8,  6, 0, S,   P_AXE, IRON, HI_METAL),
148.  						/* "double-bitted" ? */
149.  

Swords

150.  /* swords */
151.  WEAPON("short sword", (char *)0,
152.  	1, 0, 0,  8, 30, 10,  6,  8, 0, P,   P_SHORT_SWORD, IRON, HI_METAL),
153.  WEAPON("elven short sword", "runed short sword",
154.  	0, 0, 0,  2, 30, 10,  8,  8, 0, P,   P_SHORT_SWORD, WOOD, HI_WOOD),
155.  WEAPON("orcish short sword", "crude short sword",
156.  	0, 0, 0,  3, 30, 10,  5,  8, 0, P,   P_SHORT_SWORD, IRON, CLR_BLACK),
157.  WEAPON("dwarvish short sword", "broad short sword",
158.  	0, 0, 0,  2, 30, 10,  7,  8, 0, P,   P_SHORT_SWORD, IRON, HI_METAL),
159.  WEAPON("scimitar", "curved sword",
160.  	0, 0, 0, 15, 40, 15,  8,  8, 0, S,   P_SCIMITAR, IRON, HI_METAL),
161.  WEAPON("silver saber", (char *)0,
162.  	1, 0, 0,  6, 40, 75,  8,  8, 0, S,   P_SABER, SILVER, HI_SILVER),
163.  WEAPON("broadsword", (char *)0,
164.  	1, 0, 0,  8, 70, 10,  4,  6, 0, S,   P_BROAD_SWORD, IRON, HI_METAL),
165.  						/* +d4 small, +1 large */
166.  WEAPON("elven broadsword", "runed broadsword",
167.  	0, 0, 0,  4, 70, 10,  6,  6, 0, S,   P_BROAD_SWORD, WOOD, HI_WOOD),
168.  						/* +d4 small, +1 large */
169.  WEAPON("long sword", (char *)0,
170.  	1, 0, 0, 50, 40, 15,  8, 12, 0, S,   P_LONG_SWORD, IRON, HI_METAL),
171.  WEAPON("two-handed sword", (char *)0,
172.  	1, 0, 1, 22,150, 50, 12,  6, 0, S,   P_TWO_HANDED_SWORD, IRON, HI_METAL),
173.  						/* +2d6 large */
174.  WEAPON("katana", "samurai sword",
175.  	0, 0, 0,  4, 40, 80, 10, 12, 1, S,   P_LONG_SWORD, IRON, HI_METAL),
176.  /* special swords set up for artifacts */
177.  WEAPON("tsurugi", "long samurai sword",
178.  	0, 0, 1,  0, 60,500, 16,  8, 2, S,   P_TWO_HANDED_SWORD, METAL, HI_METAL),
179.  						/* +2d6 large */
180.  WEAPON("runesword", "runed broadsword",
181.  	0, 0, 0,  0, 40,300,  4,  6, 0, S,   P_BROAD_SWORD, IRON, CLR_BLACK),
182.  						/* +d4 small, +1 large */
183.  						/* +5d2 +d8 from level drain */
184.  

Polearms

185.  /* polearms */
186.  /* spear-type */
187.  WEAPON("partisan", "vulgar polearm",
188.  	0, 0, 1,  5, 80, 10,  6,  6, 0, P,   P_POLEARMS, IRON, HI_METAL),
189.  						/* +1 large */
190.  WEAPON("ranseur", "hilted polearm",
191.  	0, 0, 1,  5, 50,  6,  4,  4, 0, P,   P_POLEARMS, IRON, HI_METAL),
192.  						/* +d4 both */
193.  WEAPON("spetum", "forked polearm",
194.  	0, 0, 1,  5, 50,  5,  6,  6, 0, P,   P_POLEARMS, IRON, HI_METAL),
195.  						/* +1 small, +d6 large */
196.  WEAPON("glaive", "single-edged polearm",
197.  	0, 0, 1,  8, 75,  6,  6, 10, 0, S,   P_POLEARMS, IRON, HI_METAL),
198.  WEAPON("lance", (char *)0,
199.  	1, 0, 0,  4,180, 10,  6,  8, 0, P,   P_LANCE, IRON, HI_METAL),
200.  /* axe-type */
201.  WEAPON("halberd", "angled poleaxe",
202.  	0, 0, 1,  8,150, 10, 10,  6, 0, P|S, P_POLEARMS, IRON, HI_METAL),
203.  						/* +1d6 large */
204.  WEAPON("bardiche", "long poleaxe",
205.  	0, 0, 1,  4,120,  7,  4,  4, 0, S,   P_POLEARMS, IRON, HI_METAL),
206.  						/* +1d4 small, +2d4 large */
207.  WEAPON("voulge", "pole cleaver",
208.  	0, 0, 1,  4,125,  5,  4,  4, 0, S,   P_POLEARMS, IRON, HI_METAL),
209.  						/* +d4 both */
210.  WEAPON("dwarvish mattock", "broad pick",
211.  	0, 0, 1, 13,120, 50, 12,  8,-1, B,   P_PICK_AXE, IRON, HI_METAL),
212.  
213.  /* curved/hooked */
214.  WEAPON("fauchard", "pole sickle",
215.  	0, 0, 1,  6, 60,  5,  6,  8, 0, P|S, P_POLEARMS, IRON, HI_METAL),
216.  WEAPON("guisarme", "pruning hook",
217.  	0, 0, 1,  6, 80,  5,  4,  8, 0, S,   P_POLEARMS, IRON, HI_METAL),
218.  						/* +1d4 small */
219.  WEAPON("bill-guisarme", "hooked polearm",
220.  	0, 0, 1,  4,120,  7,  4, 10, 0, P|S, P_POLEARMS, IRON, HI_METAL),
221.  						/* +1d4 small */
222.  /* other */
223.  WEAPON("lucern hammer", "pronged polearm",
224.  	0, 0, 1,  5,150,  7,  4,  6, 0, B|P, P_POLEARMS, IRON, HI_METAL),
225.  						/* +1d4 small */
226.  WEAPON("bec de corbin", "beaked polearm",
227.  	0, 0, 1,  4,100,  8,  8,  6, 0, B|P, P_POLEARMS, IRON, HI_METAL),
228.  

Bludgeoning weapons

229.  /* bludgeons */
230.  WEAPON("mace", (char *)0,
231.  	1, 0, 0, 40, 30,  5,  6,  6, 0, B,   P_MACE, IRON, HI_METAL),
232.  						/* +1 small */
233.  WEAPON("morning star", (char *)0,
234.  	1, 0, 0, 12,120, 10,  4,  6, 0, B,   P_MORNING_STAR, IRON, HI_METAL),
235.  						/* +d4 small, +1 large */
236.  WEAPON("war hammer", (char *)0,
237.  	1, 0, 0, 15, 50,  5,  4,  4, 0, B,   P_HAMMER, IRON, HI_METAL),
238.  						/* +1 small */
239.  WEAPON("club", (char *)0,
240.  	1, 0, 0, 12, 30,  3,  6,  3, 0, B,   P_CLUB, WOOD, HI_WOOD),
241.  #ifdef KOPS
242.  WEAPON("rubber hose", (char *)0,
243.  	1, 0, 0,  0, 20,  3,  4,  3, 0, B,   P_WHIP, PLASTIC, CLR_BROWN),
244.  #endif
245.  WEAPON("quarterstaff", "staff",
246.  	0, 0, 1, 11, 40,  5,  6,  6, 0, B,   P_QUARTERSTAFF, WOOD, HI_WOOD),
247.  /* two-piece */
248.  WEAPON("aklys", "thonged club",
249.  	0, 0, 0,  8, 15,  4,  6,  3, 0, B,   P_CLUB, IRON, HI_METAL),
250.  WEAPON("flail", (char *)0,
251.  	1, 0, 0, 40, 15,  4,  6,  4, 0, B,   P_FLAIL, IRON, HI_METAL),
252.  						/* +1 small, +1d4 large */

Miscellaneous weaponry

253.  /* misc */
254.  WEAPON("bullwhip", (char *)0,
255.  	1, 0, 0,  2, 20,  4,  2,  1, 0, 0,   P_WHIP, LEATHER, CLR_BROWN),
256.  
257.  /* bows */
258.  BOW("bow", (char *)0,		1, 24, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
259.  BOW("elven bow", "runed bow",	0, 12, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
260.  BOW("orcish bow", "crude bow",	0, 12, 30, 60, 0, WOOD, P_BOW, CLR_BLACK),
261.  BOW("yumi", "long bow",		0,  0, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
262.  BOW("sling", (char *)0,		1, 40,  3, 20, 0, LEATHER, P_SLING, HI_LEATHER),
263.  BOW("crossbow", (char *)0,	1, 45, 50, 40, 0, WOOD, P_CROSSBOW, HI_WOOD),
264.  
265.  #undef P
266.  #undef S
267.  #undef B
268.  
269.  #undef WEAPON
270.  #undef PROJECTILE
271.  #undef BOW
272.  

Armor

Armor macros

273.  /* armor ... */
274.  /* IRON denotes ferrous metals, including steel.
275.   * Only IRON weapons and armor can rust.
276.   * Only COPPER (including brass) corrodes.
277.   * Some creatures are vulnerable to SILVER.
278.   */
279.  #define ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,sub,metal,c) \
280.  	OBJECT( \
281.  		OBJ(name,desc), BITS(kn,0,1,0,mgc,1,0,0,blk,0,0,sub,metal), power, \
282.  		ARMOR_CLASS, prob, delay, wt, cost, \
283.  		0, 0, 10 - ac, can, wt, c )
284.  #define HELM(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \
285.  	ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_HELM,metal,c)
286.  #define CLOAK(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \
287.  	ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_CLOAK,metal,c)
288.  #define SHIELD(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,metal,c) \
289.  	ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,ARM_SHIELD,metal,c)
290.  #define GLOVES(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \
291.  	ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_GLOVES,metal,c)
292.  #define BOOTS(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \
293.  	ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_BOOTS,metal,c)
294.  

Helmets

295.  /* helmets */
296.  HELM("elven leather helm", "leather hat",
297.  		0, 0,  0,	6, 1,  3,   8, 9, 0, LEATHER, HI_LEATHER),
298.  HELM("orcish helm", "iron skull cap",
299.  		0, 0,  0,	6, 1, 30,  10, 9, 0, IRON, CLR_BLACK),
300.  HELM("dwarvish iron helm", "hard hat",
301.  		0, 0,  0,	6, 1, 40,  20, 8, 0, IRON, HI_METAL),
302.  HELM("fedora", (char *)0,
303.  		1, 0,  0,	0, 0,  3,   1,10, 0, CLOTH, CLR_BROWN),
304.  HELM("cornuthaum", "conical hat",
305.  		0, 1,  CLAIRVOYANT,
306.  				3, 1,  4,  80,10, 2, CLOTH, CLR_BLUE),
307.  HELM("dunce cap", "conical hat",
308.  		0, 1,  0,	3, 1,  4,   1,10, 0, CLOTH, CLR_BLUE),
309.  HELM("dented pot", (char *)0,
310.  		1, 0,  0,	2, 0, 10,   8, 9, 0, IRON, CLR_BLACK),
311.  /* With shuffled appearances... */
312.  HELM("helmet", "plumed helmet",
313.  		0, 0,  0,      10, 1, 30,  10, 9, 0, IRON, HI_METAL),
314.  HELM("helm of brilliance", "etched helmet",
315.  		0, 1,  0,	6, 1, 50,  50, 9, 0, IRON, CLR_GREEN),
316.  HELM("helm of opposite alignment", "crested helmet",
317.  		0, 1,  0,	6, 1, 50,  50, 9, 0, IRON, HI_METAL),
318.  HELM("helm of telepathy", "visored helmet",
319.  		0, 1,  TELEPAT, 2, 1, 50,  50, 9, 0, IRON, HI_METAL),
320.  

Body armor

321.  /* suits of armor */
322.  /*
323.   * There is code in polyself.c that assumes (1) and (2).
324.   * There is code in obj.h, objnam.c, mon.c, read.c that assumes (2).
325.   *
326.   *	(1) The dragon scale mails and the dragon scales are together.
327.   *	(2) That the order of the dragon scale mail and dragon scales is the
328.   *	    the same defined in monst.c.
329.   */
330.  #define DRGN_ARMR(name,mgc,power,cost,ac,color) \
331.  	ARMOR(name,(char *)0,1,mgc,1,power,0,5,40,cost,ac,0,ARM_SUIT,DRAGON_HIDE,color)
332.  /* 3.4.1: dragon scale mail reclassified as "magic" since magic is
333.     needed to create them */
334.  DRGN_ARMR("gray dragon scale mail",   1, ANTIMAGIC,  1200, 1, CLR_GRAY),
335.  DRGN_ARMR("silver dragon scale mail", 1, REFLECTING, 1200, 1, DRAGON_SILVER),
336.  #if 0	/* DEFERRED */
337.  DRGN_ARMR("shimmering dragon scale mail", 1, DISPLACED, 1200, 1, CLR_CYAN),
338.  #endif
339.  DRGN_ARMR("red dragon scale mail",    1, FIRE_RES,    900, 1, CLR_RED),
340.  DRGN_ARMR("white dragon scale mail",  1, COLD_RES,    900, 1, CLR_WHITE),
341.  DRGN_ARMR("orange dragon scale mail", 1, SLEEP_RES,   900, 1, CLR_ORANGE),
342.  DRGN_ARMR("black dragon scale mail",  1, DISINT_RES, 1200, 1, CLR_BLACK),
343.  DRGN_ARMR("blue dragon scale mail",   1, SHOCK_RES,   900, 1, CLR_BLUE),
344.  DRGN_ARMR("green dragon scale mail",  1, POISON_RES,  900, 1, CLR_GREEN),
345.  DRGN_ARMR("yellow dragon scale mail", 1, ACID_RES,    900, 1, CLR_YELLOW),
346.  
347.  /* For now, only dragons leave these. */
348.  /* 3.4.1: dragon scales left classified as "non-magic"; they confer
349.     magical properties but are produced "naturally" */
350.  DRGN_ARMR("gray dragon scales",   0, ANTIMAGIC,  700, 7, CLR_GRAY),
351.  DRGN_ARMR("silver dragon scales", 0, REFLECTING, 700, 7, DRAGON_SILVER),
352.  #if 0	/* DEFERRED */
353.  DRGN_ARMR("shimmering dragon scales", 0, DISPLACED,  700, 7, CLR_CYAN),
354.  #endif
355.  DRGN_ARMR("red dragon scales",    0, FIRE_RES,   500, 7, CLR_RED),
356.  DRGN_ARMR("white dragon scales",  0, COLD_RES,   500, 7, CLR_WHITE),
357.  DRGN_ARMR("orange dragon scales", 0, SLEEP_RES,  500, 7, CLR_ORANGE),
358.  DRGN_ARMR("black dragon scales",  0, DISINT_RES, 700, 7, CLR_BLACK),
359.  DRGN_ARMR("blue dragon scales",   0, SHOCK_RES,  500, 7, CLR_BLUE),
360.  DRGN_ARMR("green dragon scales",  0, POISON_RES, 500, 7, CLR_GREEN),
361.  DRGN_ARMR("yellow dragon scales", 0, ACID_RES,   500, 7, CLR_YELLOW),
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.  

Cloaks

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,    8, 0, 10, 60,  9, 3, CLOTH, CLR_BLACK),
414.  CLOAK("orcish cloak", "coarse mantelet",
415.  		0, 0,	0,	    8, 0, 10, 40, 10, 2, CLOTH, CLR_BLACK),
416.  CLOAK("dwarvish cloak", "hooded cloak",
417.  		0, 0,	0,	    8, 0, 10, 50, 10, 2, CLOTH, HI_CLOTH),
418.  CLOAK("oilskin cloak", "slippery cloak",
419.  		0, 0,	0,	    8, 0, 10, 50,  9, 3, CLOTH, HI_CLOTH),
420.  CLOAK("robe", (char *)0,
421.  		1, 1,	0,	    3, 0, 15, 50,  8, 3, CLOTH, CLR_RED),
422.  CLOAK("alchemy smock", "apron",
423.  		0, 1,	POISON_RES, 9, 0, 10, 50,  9, 1, CLOTH, CLR_WHITE),
424.  CLOAK("leather cloak", (char *)0,
425.  		1, 0,	0,	    8, 0, 15, 40,  9, 1, LEATHER, CLR_BROWN),
426.  /* With shuffled appearances... */
427.  CLOAK("cloak of protection", "tattered cape",
428.  		0, 1,	PROTECTION, 9, 0, 10, 50,  7, 3, CLOTH, HI_CLOTH),
429.  CLOAK("cloak of invisibility", "opera cloak",
430.  		0, 1,	INVIS,	   10, 0, 10, 60,  9, 2, CLOTH, CLR_BRIGHT_MAGENTA),
431.  CLOAK("cloak of magic resistance", "ornamental cope",
432.  		0, 1,	ANTIMAGIC,  2, 0, 10, 60,  9, 3, CLOTH, CLR_WHITE),
433.  CLOAK("cloak of displacement", "piece of cloth",
434.  		0, 1,	DISPLACED, 10, 0, 10, 50,  9, 2, CLOTH, HI_CLOTH),
435.  

Shields

436.  /* shields */
437.  SHIELD("small shield", (char *)0,
438.  		1, 0, 0, 0,	     6, 0, 30,	3,  9, 0, WOOD, HI_WOOD),
439.  SHIELD("elven shield", "blue and green shield",
440.  		0, 0, 0, 0,	     2, 0, 40,	7,  8, 0, WOOD, CLR_GREEN),
441.  SHIELD("Uruk-hai shield", "white-handed shield",
442.  		0, 0, 0, 0,	     2, 0, 50,	7,  9, 0, IRON, HI_METAL),
443.  SHIELD("orcish shield", "red-eyed shield",
444.  		0, 0, 0, 0,	     2, 0, 50,	7,  9, 0, IRON, CLR_RED),
445.  SHIELD("large shield", (char *)0,
446.  		1, 0, 1, 0,	     7, 0,100, 10,  8, 0, IRON, HI_METAL),
447.  SHIELD("dwarvish roundshield", "large round shield",
448.  		0, 0, 0, 0,	     4, 0,100, 10,  8, 0, IRON, HI_METAL),
449.  SHIELD("shield of reflection", "polished silver shield",
450.  		0, 1, 0, REFLECTING, 3, 0, 50, 50,  8, 0, SILVER, HI_SILVER),
451.  

Gloves

452.  /* gloves */
453.  /* these have their color but not material shuffled, so the IRON must stay
454.   * CLR_BROWN (== HI_LEATHER)
455.   */
456.  GLOVES("leather gloves", "old gloves",
457.  		0, 0,  0,	  16, 1, 10,  8,  9, 0, LEATHER, HI_LEATHER),
458.  GLOVES("gauntlets of fumbling", "padded gloves",
459.  		0, 1,  FUMBLING,   8, 1, 10, 50,  9, 0, LEATHER, HI_LEATHER),
460.  GLOVES("gauntlets of power", "riding gloves",
461.  		0, 1,  0,	   8, 1, 30, 50,  9, 0, IRON, CLR_BROWN),
462.  GLOVES("gauntlets of dexterity", "fencing gloves",
463.  		0, 1,  0,	   8, 1, 10, 50,  9, 0, LEATHER, HI_LEATHER),
464.  

Boots

465.  /* boots */
466.  BOOTS("low boots", "walking shoes",
467.  		0, 0,  0,	  25, 2, 10,  8,  9, 0, LEATHER, HI_LEATHER),
468.  BOOTS("iron shoes", "hard shoes",
469.  		0, 0,  0,	   7, 2, 50, 16,  8, 0, IRON, HI_METAL),
470.  BOOTS("high boots", "jackboots",
471.  		0, 0,  0,	  15, 2, 20, 12,  8, 0, LEATHER, HI_LEATHER),
472.  /* With shuffled appearances... */
473.  BOOTS("speed boots", "combat boots",
474.  		0, 1,  FAST,	  12, 2, 20, 50,  9, 0, LEATHER, HI_LEATHER),
475.  BOOTS("water walking boots", "jungle boots",
476.  		0, 1,  WWALKING,  12, 2, 20, 50,  9, 0, LEATHER, HI_LEATHER),
477.  BOOTS("jumping boots", "hiking boots",
478.  		0, 1,  JUMPING,   12, 2, 20, 50,  9, 0, LEATHER, HI_LEATHER),
479.  BOOTS("elven boots", "mud boots",
480.  		0, 1,  STEALTH,   12, 2, 15,  8,  9, 0, LEATHER, HI_LEATHER),
481.  BOOTS("kicking boots", "buckled boots",
482.  		0, 1,  0,         12, 2, 15,  8,  9, 0, IRON, CLR_BROWN),
483.  BOOTS("fumble boots", "riding boots",
484.  		0, 1,  FUMBLING,  12, 2, 20, 30,  9, 0, LEATHER, HI_LEATHER),
485.  BOOTS("levitation boots", "snow boots",
486.  		0, 1,  LEVITATION,12, 2, 15, 30,  9, 0, LEATHER, HI_LEATHER),
487.  #undef HELM
488.  #undef CLOAK
489.  #undef SHIELD
490.  #undef GLOVES
491.  #undef BOOTS
492.  #undef ARMOR
493.  

Rings

494.  /* rings ... */
495.  #define RING(name,power,stone,cost,mgc,spec,mohs,metal,color) OBJECT( \
496.  		OBJ(name,stone), \
497.  		BITS(0,0,spec,0,mgc,spec,0,0,0,HARDGEM(mohs),0,P_NONE,metal), \
498.  		power, RING_CLASS, 0, 0, 3, cost, 0, 0, 0, 0, 15, color )
499.  RING("adornment", ADORNED, "wooden",        100, 1, 1, 2, WOOD, HI_WOOD),
500.  RING("gain strength", 0, "granite",         150, 1, 1, 7, MINERAL, HI_MINERAL),
501.  RING("gain constitution", 0, "opal",        150, 1, 1, 7, MINERAL,  HI_MINERAL),
502.  RING("increase accuracy", 0, "clay",        150, 1, 1, 4, MINERAL, CLR_RED),
503.  RING("increase damage", 0, "coral",         150, 1, 1, 4, MINERAL, CLR_ORANGE),
504.  RING("protection", PROTECTION, "black onyx",100, 1, 1, 7, MINERAL, CLR_BLACK),
505.  RING("regeneration", REGENERATION, "moonstone",
506.  					    200, 1, 0, 6, MINERAL, HI_MINERAL),
507.  RING("searching", SEARCHING, "tiger eye",   200, 1, 0, 6, GEMSTONE, CLR_BROWN),
508.  RING("stealth", STEALTH, "jade",            100, 1, 0, 6, GEMSTONE, CLR_GREEN),
509.  RING("sustain ability", FIXED_ABIL, "bronze",
510.  					    100, 1, 0, 4, COPPER, HI_COPPER),
511.  RING("levitation", LEVITATION, "agate",     200, 1, 0, 7, GEMSTONE, CLR_RED),
512.  RING("hunger", HUNGER, "topaz",             100, 1, 0, 8, GEMSTONE, CLR_CYAN),
513.  RING("aggravate monster", AGGRAVATE_MONSTER, "sapphire",
514.  					    150, 1, 0, 9, GEMSTONE, CLR_BLUE),
515.  RING("conflict", CONFLICT, "ruby",          300, 1, 0, 9, GEMSTONE, CLR_RED),
516.  RING("warning", WARNING, "diamond",         100, 1, 0,10, GEMSTONE, CLR_WHITE),
517.  RING("poison resistance", POISON_RES, "pearl",
518.  					    150, 1, 0, 4, IRON, CLR_WHITE),
519.  RING("fire resistance", FIRE_RES, "iron",   200, 1, 0, 5, IRON, HI_METAL),
520.  RING("cold resistance", COLD_RES, "brass",  150, 1, 0, 4, COPPER, HI_COPPER),
521.  RING("shock resistance", SHOCK_RES, "copper",
522.  					    150, 1, 0, 3, COPPER, HI_COPPER),
523.  RING("free action",     FREE_ACTION, "twisted",
524.  					    200, 1, 0, 6, IRON, HI_METAL),
525.  RING("slow digestion",  SLOW_DIGESTION, "steel",
526.  					    200, 1, 0, 8, IRON, HI_METAL),
527.  RING("teleportation", TELEPORT, "silver",   200, 1, 0, 3, SILVER, HI_SILVER),
528.  RING("teleport control", TELEPORT_CONTROL, "gold",
529.  					    300, 1, 0, 3, GOLD, HI_GOLD),
530.  RING("polymorph", POLYMORPH, "ivory",       300, 1, 0, 4, BONE, CLR_WHITE),
531.  RING("polymorph control", POLYMORPH_CONTROL, "emerald",
532.  					    300, 1, 0, 8, GEMSTONE, CLR_BRIGHT_GREEN),
533.  RING("invisibility", INVIS, "wire",         150, 1, 0, 5, IRON, HI_METAL),
534.  RING("see invisible", SEE_INVIS, "engagement",
535.  					    150, 1, 0, 5, IRON, HI_METAL),
536.  RING("protection from shape changers", PROT_FROM_SHAPE_CHANGERS, "shiny",
537.  					    100, 1, 0, 5, IRON, CLR_BRIGHT_CYAN),
538.  #undef RING
539.  

Amulets

540.  /* amulets ... - THE Amulet comes last because it is special */
541.  #define AMULET(name,desc,power,prob) OBJECT( \
542.  		OBJ(name,desc), BITS(0,0,0,0,1,0,0,0,0,0,0,P_NONE,IRON), power, \
543.  		AMULET_CLASS, prob, 0, 20, 150, 0, 0, 0, 0, 20, HI_METAL )
544.  
545.  AMULET("amulet of ESP",           "circular",   TELEPAT,    175),
546.  AMULET("amulet of life saving",   "spherical",  LIFESAVED,   75),
547.  AMULET("amulet of strangulation", "oval",       STRANGLED,  135),
548.  AMULET("amulet of restful sleep", "triangular", SLEEPING,   135),
549.  AMULET("amulet versus poison",    "pyramidal",  POISON_RES, 165),
550.  AMULET("amulet of change",        "square",     0,          130),
551.  						/* POLYMORPH */
552.  AMULET("amulet of unchanging",    "concave",    UNCHANGING,	 45),
553.  AMULET("amulet of reflection",    "hexagonal",  REFLECTING,  75),
554.  AMULET("amulet of magical breathing", "octagonal",      MAGICAL_BREATHING, 65),
555.  OBJECT(OBJ("cheap plastic imitation of the Amulet of Yendor",
556.  	"Amulet of Yendor"), BITS(0,0,1,0,0,0,0,0,0,0,0,0,PLASTIC), 0,
557.  	AMULET_CLASS, 0, 0, 20,    0, 0, 0, 0, 0,  1, HI_METAL),
558.  OBJECT(OBJ("Amulet of Yendor",	/* note: description == name */
559.  	"Amulet of Yendor"), BITS(0,0,1,0,1,0,1,1,0,0,0,0,MITHRIL), 0,
560.  	AMULET_CLASS, 0, 0, 20, 30000, 0, 0, 0, 0, 20, HI_METAL),
561.  #undef AMULET
562.  

Tools

563.  /* tools ... */
564.  /* tools with weapon characteristics come last */
565.  #define TOOL(name,desc,kn,mrg,mgc,chg,prob,wt,cost,mat,color) \
566.  	OBJECT( OBJ(name,desc), \
567.  		BITS(kn,mrg,chg,0,mgc,chg,0,0,0,0,0,P_NONE,mat), \
568.  		0, TOOL_CLASS, prob, 0, \
569.  		wt, cost, 0, 0, 0, 0, wt, color )
570.  #define CONTAINER(name,desc,kn,mgc,chg,prob,wt,cost,mat,color) \
571.  	OBJECT( OBJ(name,desc), \
572.  		BITS(kn,0,chg,1,mgc,chg,0,0,0,0,0,P_NONE,mat), \
573.  		0, TOOL_CLASS, prob, 0, \
574.  		wt, cost, 0, 0, 0, 0, wt, color )
575.  #define WEPTOOL(name,desc,kn,mgc,bi,prob,wt,cost,sdam,ldam,hitbon,sub,mat,clr) \
576.  	OBJECT( OBJ(name,desc), \
577.  		BITS(kn,0,1,0,mgc,1,0,0,bi,0,hitbon,sub,mat), \
578.  		0, TOOL_CLASS, prob, 0, \
579.  		wt, cost, sdam, ldam, hitbon, 0, wt, clr )
580.  /* containers */
581.  CONTAINER("large box", (char *)0,       1, 0, 0,  40,350,   8, WOOD, HI_WOOD),
582.  CONTAINER("chest", (char *)0,           1, 0, 0,  35,600,  16, WOOD, HI_WOOD),
583.  CONTAINER("ice box", (char *)0,         1, 0, 0,   5,900,  42, PLASTIC, CLR_WHITE),
584.  CONTAINER("sack", "bag",                0, 0, 0,  35, 15,   2, CLOTH, HI_CLOTH),
585.  CONTAINER("oilskin sack", "bag",        0, 0, 0,   5, 15, 100, CLOTH, HI_CLOTH),
586.  CONTAINER("bag of holding", "bag",      0, 1, 0,  20, 15, 100, CLOTH, HI_CLOTH),
587.  CONTAINER("bag of tricks", "bag",       0, 1, 1,  20, 15, 100, CLOTH, HI_CLOTH),
588.  #undef CONTAINER
589.  
590.  /* lock opening tools */
591.  TOOL("skeleton key", "key",     0, 0, 0, 0,  80,  3,  10, IRON, HI_METAL),
592.  #ifdef TOURIST
593.  TOOL("lock pick", (char *)0,    1, 0, 0, 0,  60,  4,  20, IRON, HI_METAL),
594.  TOOL("credit card", (char *)0,  1, 0, 0, 0,  15,  1,  10, PLASTIC, CLR_WHITE),
595.  #else
596.  TOOL("lock pick", (char *)0,    1, 0, 0, 0,  75,  4,  20, IRON, HI_METAL),
597.  #endif
598.  /* light sources */
599.  TOOL("tallow candle", "candle", 0, 1, 0, 0,  20,  2,  10, WAX, CLR_WHITE),
600.  TOOL("wax candle", "candle",    0, 1, 0, 0,   5,  2,  20, WAX, CLR_WHITE),
601.  TOOL("brass lantern", (char *)0,1, 0, 0, 0,  30, 30,  12, COPPER, CLR_YELLOW),
602.  TOOL("oil lamp", "lamp",        0, 0, 0, 0,  45, 20,  10, COPPER, CLR_YELLOW),
603.  TOOL("magic lamp", "lamp",      0, 0, 1, 0,  15, 20,  50, COPPER, CLR_YELLOW),
604.  /* other tools */
605.  #ifdef TOURIST
606.  TOOL("expensive camera", (char *)0,
607.  				1, 0, 0, 1,  15, 12, 200, PLASTIC, CLR_BLACK),
608.  TOOL("mirror", "looking glass", 0, 0, 0, 0,  45, 13,  10, GLASS, HI_SILVER),
609.  #else
610.  TOOL("mirror", "looking glass", 0, 0, 0, 0,  60, 13,  10, GLASS, HI_SILVER),
611.  #endif
612.  TOOL("crystal ball", "glass orb",
613.  				0, 0, 1, 1,  15,150,  60, GLASS, HI_GLASS),
614.  TOOL("lenses", (char *)0,	1, 0, 0, 0,   5,  3,  80, GLASS, HI_GLASS),
615.  TOOL("blindfold", (char *)0,    1, 0, 0, 0,  50,  2,  20, CLOTH, CLR_BLACK),
616.  TOOL("towel", (char *)0,        1, 0, 0, 0,  50,  2,  50, CLOTH, CLR_MAGENTA),
617.  #ifdef STEED
618.  TOOL("saddle", (char *)0,       1, 0, 0, 0,   5,200, 150, LEATHER, HI_LEATHER),
619.  TOOL("leash", (char *)0,        1, 0, 0, 0,  65, 12,  20, LEATHER, HI_LEATHER),
620.  #else
621.  TOOL("leash", (char *)0,        1, 0, 0, 0,  70, 12,  20, LEATHER, HI_LEATHER),
622.  #endif
623.  TOOL("stethoscope", (char *)0,  1, 0, 0, 0,  25,  4,  75, IRON, HI_METAL),
624.  TOOL("tinning kit", (char *)0,  1, 0, 0, 1,  15,100,  30, IRON, HI_METAL),
625.  TOOL("tin opener", (char *)0,   1, 0, 0, 0,  35,  4,  30, IRON, HI_METAL),
626.  TOOL("can of grease", (char *)0,1, 0, 0, 1,  15, 15,  20, IRON, HI_METAL),
627.  TOOL("figurine", (char *)0,     1, 0, 1, 0,  25, 50,  80, MINERAL, HI_MINERAL),
628.  TOOL("magic marker", (char *)0, 1, 0, 1, 1,  15,  2,  50, PLASTIC, CLR_RED),
629.  /* traps */
630.  TOOL("land mine",(char *)0,     1, 0, 0, 0,   0,300, 180, IRON, CLR_RED),
631.  TOOL("beartrap", (char *)0,     1, 0, 0, 0,   0,200,  60, IRON, HI_METAL),
632.  /* instruments */
633.  TOOL("tin whistle", "whistle",  0, 0, 0, 0, 100,  3,  10, METAL, HI_METAL),
634.  TOOL("magic whistle", "whistle",0, 0, 1, 0,  30,  3,  10, METAL, HI_METAL),
635.  /* "If tin whistles are made out of tin, what do they make foghorns out of?" */
636.  TOOL("wooden flute", "flute",   0, 0, 0, 0,   4,  5,  12, WOOD, HI_WOOD),
637.  TOOL("magic flute", "flute",    0, 0, 1, 1,   2,  5,  36, WOOD, HI_WOOD),
638.  TOOL("tooled horn", "horn",     0, 0, 0, 0,   5, 18,  15, BONE, CLR_WHITE),
639.  TOOL("frost horn", "horn",      0, 0, 1, 1,   2, 18,  50, BONE, CLR_WHITE),
640.  TOOL("fire horn", "horn",       0, 0, 1, 1,   2, 18,  50, BONE, CLR_WHITE),
641.  TOOL("horn of plenty", "horn",  0, 0, 1, 1,   2, 18,  50, BONE, CLR_WHITE),
642.  TOOL("wooden harp", "harp",     0, 0, 0, 0,   4, 30,  50, WOOD, HI_WOOD),
643.  TOOL("magic harp", "harp",      0, 0, 1, 1,   2, 30,  50, WOOD, HI_WOOD),
644.  TOOL("bell", (char *)0,         1, 0, 0, 0,   2, 30,  50, COPPER, HI_COPPER),
645.  TOOL("bugle", (char *)0,        1, 0, 0, 0,   4, 10,  15, COPPER, HI_COPPER),
646.  TOOL("leather drum", "drum",    0, 0, 0, 0,   4, 25,  25, LEATHER, HI_LEATHER),
647.  TOOL("drum of earthquake", "drum",
648.  				0, 0, 1, 1,   2, 25,  25, LEATHER, HI_LEATHER),
649.  /* tools useful as weapons */
650.  WEPTOOL("pick-axe", (char *)0,
651.  	1, 0, 0, 20, 100,  50,	6,  3, WHACK,  P_PICK_AXE, IRON, HI_METAL),
652.  WEPTOOL("grappling hook", "iron hook",
653.  	0, 0, 0,  5,  30,  50,  2,  6, WHACK,  P_FLAIL, IRON, HI_METAL),
654.  /* 3.4.1: unicorn horn left classified as "magic" */
655.  WEPTOOL("unicorn horn", (char *)0,
656.  	1, 1, 1,  0,  20, 100, 12, 12, PIERCE, P_UNICORN_HORN, BONE, CLR_WHITE),
657.  
658.  /* two special unique artifact "tools" */
659.  OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"),
660.  		BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,GOLD), 0,
661.  		TOOL_CLASS, 0, 0,10, 5000, 0, 0, 0, 0, 200, HI_GOLD),
662.  OBJECT(OBJ("Bell of Opening", "silver bell"),
663.  		BITS(0,0,1,0,1,1,1,1,0,0,0,P_NONE,SILVER), 0,
664.  		TOOL_CLASS, 0, 0,10, 5000, 0, 0, 0, 0, 50, HI_SILVER),
665.  #undef TOOL
666.  #undef WEPTOOL
667.  

Comestibles

668.  /* Comestibles ... */
669.  #define FOOD(name,prob,delay,wt,unk,tin,nutrition,color) OBJECT( \
670.  		OBJ(name,(char *)0), BITS(1,1,unk,0,0,0,0,0,0,0,0,P_NONE,tin), 0, \
671.  		FOOD_CLASS, prob, delay, \
672.  		wt, nutrition/20 + 5, 0, 0, 0, 0, nutrition, color )
673.  /* all types of food (except tins & corpses) must have a delay of at least 1. */
674.  /* delay on corpses is computed and is weight dependant */
675.  /* dog eats foods 0-4 but prefers tripe rations above all others */
676.  /* fortune cookies can be read */
677.  /* carrots improve your vision */
678.  /* +0 tins contain monster meat */
679.  /* +1 tins (of spinach) make you stronger (like Popeye) */
680.  /* food CORPSE is a cadaver of some type */
681.  /* meatballs/sticks/rings are only created from objects via stone to flesh */
682.  
683.  /* meat */
684.  FOOD("tripe ration",       140, 2, 10, 0, FLESH, 200, CLR_BROWN),
685.  FOOD("corpse",               0, 1,  0, 0, FLESH,   0, CLR_BROWN),
686.  FOOD("egg",                 85, 1,  1, 1, FLESH,  80, CLR_WHITE),
687.  FOOD("meatball",             0, 1,  1, 0, FLESH,   5, CLR_BROWN),
688.  FOOD("meat stick",           0, 1,  1, 0, FLESH,   5, CLR_BROWN),
689.  FOOD("huge chunk of meat",   0,20,400, 0, FLESH,2000, CLR_BROWN),
690.  /* special case because it's not mergable */
691.  OBJECT(OBJ("meat ring", (char *)0),
692.      BITS(1,0,0,0,0,0,0,0,0,0,0,0,FLESH),
693.      0, FOOD_CLASS, 0, 1, 5, 1, 0, 0, 0, 0, 5, CLR_BROWN),
694.  
695.  /* fruits & veggies */
696.  FOOD("kelp frond",           0, 1,  1, 0, VEGGY,  30, CLR_GREEN),
697.  FOOD("eucalyptus leaf",      3, 1,  1, 0, VEGGY,  30, CLR_GREEN),
698.  FOOD("apple",               15, 1,  2, 0, VEGGY,  50, CLR_RED),
699.  FOOD("orange",              10, 1,  2, 0, VEGGY,  80, CLR_ORANGE),
700.  FOOD("pear",                10, 1,  2, 0, VEGGY,  50, CLR_BRIGHT_GREEN),
701.  FOOD("melon",               10, 1,  5, 0, VEGGY, 100, CLR_BRIGHT_GREEN),
702.  FOOD("banana",              10, 1,  2, 0, VEGGY,  80, CLR_YELLOW),
703.  FOOD("carrot",              15, 1,  2, 0, VEGGY,  50, CLR_ORANGE),
704.  FOOD("sprig of wolfsbane",   7, 1,  1, 0, VEGGY,  40, CLR_GREEN),
705.  FOOD("clove of garlic",      7, 1,  1, 0, VEGGY,  40, CLR_WHITE),
706.  FOOD("slime mold",          75, 1,  5, 0, VEGGY, 250, HI_ORGANIC),
707.  
708.  /* people food */
709.  FOOD("lump of royal jelly",  0, 1,  2, 0, VEGGY, 200, CLR_YELLOW),
710.  FOOD("cream pie",           25, 1, 10, 0, VEGGY, 100, CLR_WHITE),
711.  FOOD("candy bar",           13, 1,  2, 0, VEGGY, 100, CLR_BROWN),
712.  FOOD("fortune cookie",      55, 1,  1, 0, VEGGY,  40, CLR_YELLOW),
713.  FOOD("pancake",             25, 2,  2, 0, VEGGY, 200, CLR_YELLOW),
714.  FOOD("lembas wafer",        20, 2,  5, 0, VEGGY, 800, CLR_WHITE),
715.  FOOD("cram ration",         20, 3, 15, 0, VEGGY, 600, HI_ORGANIC),
716.  FOOD("food ration",        380, 5, 20, 0, VEGGY, 800, HI_ORGANIC),
717.  FOOD("K-ration",             0, 1, 10, 0, VEGGY, 400, HI_ORGANIC),
718.  FOOD("C-ration",             0, 1, 10, 0, VEGGY, 300, HI_ORGANIC),
719.  FOOD("tin",                 75, 0, 10, 1, METAL,   0, HI_METAL),
720.  #undef FOOD
721.  

Potions

722.  /* potions ... */
723.  #define POTION(name,desc,mgc,power,prob,cost,color) OBJECT( \
724.  		OBJ(name,desc), BITS(0,1,0,0,mgc,0,0,0,0,0,0,P_NONE,GLASS), power, \
725.  		POTION_CLASS, prob, 0, 20, cost, 0, 0, 0, 0, 10, color )
726.  POTION("gain ability", "ruby",          1, 0,          42, 300, CLR_RED),
727.  POTION("restore ability", "pink",       1, 0,          40, 100, CLR_BRIGHT_MAGENTA),
728.  POTION("confusion", "orange",           1, CONFUSION,  42, 100, CLR_ORANGE),
729.  POTION("blindness", "yellow",           1, BLINDED,    40, 150, CLR_YELLOW),
730.  POTION("paralysis", "emerald",          1, 0,          42, 300, CLR_BRIGHT_GREEN),
731.  POTION("speed", "dark green",           1, FAST,       42, 200, CLR_GREEN),
732.  POTION("levitation", "cyan",            1, LEVITATION, 42, 200, CLR_CYAN),
733.  POTION("hallucination", "sky blue",     1, HALLUC,     40, 100, CLR_CYAN),
734.  POTION("invisibility", "brilliant blue",1, INVIS,      40, 150, CLR_BRIGHT_BLUE),
735.  POTION("see invisible", "magenta",      1, SEE_INVIS,  42,  50, CLR_MAGENTA),
736.  POTION("healing", "purple-red",         1, 0,          57, 100, CLR_MAGENTA),
737.  POTION("extra healing", "puce",         1, 0,          47, 100, CLR_RED),
738.  POTION("gain level", "milky",           1, 0,          20, 300, CLR_WHITE),
739.  POTION("enlightenment", "swirly",       1, 0,          20, 200, CLR_BROWN),
740.  POTION("monster detection", "bubbly",   1, 0,          40, 150, CLR_WHITE),
741.  POTION("object detection", "smoky",     1, 0,          42, 150, CLR_GRAY),
742.  POTION("gain energy", "cloudy",         1, 0,          42, 150, CLR_WHITE),
743.  POTION("sleeping",  "effervescent",     1, 0,          42, 100, CLR_GRAY),
744.  POTION("full healing",  "black",        1, 0,          10, 200, CLR_BLACK),
745.  POTION("polymorph", "golden",           1, 0,          10, 200, CLR_YELLOW),
746.  POTION("booze", "brown",                0, 0,          42,  50, CLR_BROWN),
747.  POTION("sickness", "fizzy",             0, 0,          42,  50, CLR_CYAN),
748.  POTION("fruit juice", "dark",           0, 0,          42,  50, CLR_BLACK),
749.  POTION("acid", "white",                 0, 0,          10, 250, CLR_WHITE),
750.  POTION("oil", "murky",                  0, 0,          30, 250, CLR_BROWN),
751.  POTION("water", "clear",                0, 0,          92, 100, CLR_CYAN),
752.  #undef POTION
753.  

Scrolls

754.  /* scrolls ... */
755.  #define SCROLL(name,text,mgc,prob,cost) OBJECT( \
756.  		OBJ(name,text), BITS(0,1,0,0,mgc,0,0,0,0,0,0,P_NONE,PAPER), 0, \
757.  		SCROLL_CLASS, prob, 0, 5, cost, 0, 0, 0, 0, 6, HI_PAPER )
758.  	SCROLL("enchant armor",         "ZELGO MER",            1,  63,  80),
759.  	SCROLL("destroy armor",         "JUYED AWK YACC",       1,  45, 100),
760.  	SCROLL("confuse monster",       "NR 9",                 1,  53, 100),
761.  	SCROLL("scare monster",         "XIXAXA XOXAXA XUXAXA", 1,  35, 100),
762.  	SCROLL("remove curse",          "PRATYAVAYAH",          1,  65,  80),
763.  	SCROLL("enchant weapon",        "DAIYEN FOOELS",        1,  80,  60),
764.  	SCROLL("create monster",        "LEP GEX VEN ZEA",      1,  45, 200),
765.  	SCROLL("taming",                "PRIRUTSENIE",          1,  15, 200),
766.  	SCROLL("genocide",              "ELBIB YLOH",           1,  15, 300),
767.  	SCROLL("light",                 "VERR YED HORRE",       1,  90,  50),
768.  	SCROLL("teleportation",         "VENZAR BORGAVVE",      1,  55, 100),
769.  	SCROLL("gold detection",        "THARR",                1,  33, 100),
770.  	SCROLL("food detection",        "YUM YUM",              1,  25, 100),
771.  	SCROLL("identify",              "KERNOD WEL",           1, 180,  20),
772.  	SCROLL("magic mapping",         "ELAM EBOW",            1,  45, 100),
773.  	SCROLL("amnesia",               "DUAM XNAHT",           1,  35, 200),
774.  	SCROLL("fire",                  "ANDOVA BEGARIN",       1,  30, 100),
775.  	SCROLL("earth",                 "KIRJE",                1,  18, 200),
776.  	SCROLL("punishment",            "VE FORBRYDERNE",       1,  15, 300),
777.  	SCROLL("charging",              "HACKEM MUCHE",         1,  15, 300),
778.  	SCROLL("stinking cloud",	"VELOX NEB",            1,  15, 300),
779.  	SCROLL((char *)0,		"FOOBIE BLETCH",        1,   0, 100),
780.  	SCROLL((char *)0,		"TEMOV",                1,   0, 100),
781.  	SCROLL((char *)0,		"GARVEN DEH",           1,   0, 100),
782.  	SCROLL((char *)0,		"READ ME",              1,   0, 100),
783.  	/* these must come last because they have special descriptions */
784.  #ifdef MAIL
785.  	SCROLL("mail",                  "stamped",          0,   0,   0),
786.  #endif
787.  	SCROLL("blank paper",           "unlabeled",        0,  28,  60),
788.  #undef SCROLL
789.  

Spellbooks

790.  /* spellbooks ... */
791.  #define SPELL(name,desc,sub,prob,delay,level,mgc,dir,color) OBJECT( \
792.  		OBJ(name,desc), BITS(0,0,0,0,mgc,0,0,0,0,0,dir,sub,PAPER), 0, \
793.  		SPBOOK_CLASS, prob, delay, \
794.  		50, level*100, 0, 0, 0, level, 20, color )
795.  SPELL("dig",             "parchment",   P_MATTER_SPELL, 20,  6, 5, 1, RAY,       HI_PAPER),
796.  SPELL("magic missile",   "vellum",      P_ATTACK_SPELL, 45,  2, 2, 1, RAY,       HI_PAPER),
797.  SPELL("fireball",        "ragged",      P_ATTACK_SPELL, 20,  4, 4, 1, RAY,       HI_PAPER),
798.  SPELL("cone of cold",    "dog eared",   P_ATTACK_SPELL, 10,  7, 4, 1, RAY,       HI_PAPER),
799.  SPELL("sleep",           "mottled",     P_ENCHANTMENT_SPELL, 50,  1, 1, 1, RAY,       HI_PAPER),
800.  SPELL("finger of death", "stained",     P_ATTACK_SPELL,  5, 10, 7, 1, RAY,       HI_PAPER),
801.  SPELL("light",           "cloth",       P_DIVINATION_SPELL, 45,  1, 1, 1, NODIR,     HI_CLOTH),
802.  SPELL("detect monsters", "leather",     P_DIVINATION_SPELL, 43,  1, 1, 1, NODIR,     HI_LEATHER),
803.  SPELL("healing",         "white",       P_HEALING_SPELL, 40,  2, 1, 1, IMMEDIATE, CLR_WHITE),
804.  SPELL("knock",           "pink",        P_MATTER_SPELL, 35,  1, 1, 1, IMMEDIATE, CLR_BRIGHT_MAGENTA),
805.  SPELL("force bolt",      "red",         P_ATTACK_SPELL, 35,  2, 1, 1, IMMEDIATE, CLR_RED),
806.  SPELL("confuse monster", "orange",      P_ENCHANTMENT_SPELL, 30,  2, 2, 1, IMMEDIATE, CLR_ORANGE),
807.  SPELL("cure blindness",  "yellow",      P_HEALING_SPELL, 25,  2, 2, 1, IMMEDIATE, CLR_YELLOW),
808.  SPELL("drain life",      "velvet",      P_ATTACK_SPELL, 10,  2, 2, 1, IMMEDIATE, CLR_MAGENTA),
809.  SPELL("slow monster",    "light green", P_ENCHANTMENT_SPELL, 30,  2, 2, 1, IMMEDIATE, CLR_BRIGHT_GREEN),
810.  SPELL("wizard lock",     "dark green",  P_MATTER_SPELL, 30,  3, 2, 1, IMMEDIATE, CLR_GREEN),
811.  SPELL("create monster",  "turquoise",   P_CLERIC_SPELL, 35,  3, 2, 1, NODIR,     CLR_BRIGHT_CYAN),
812.  SPELL("detect food",     "cyan",        P_DIVINATION_SPELL, 30,  3, 2, 1, NODIR,     CLR_CYAN),
813.  SPELL("cause fear",      "light blue",  P_ENCHANTMENT_SPELL, 25,  3, 3, 1, NODIR,     CLR_BRIGHT_BLUE),
814.  SPELL("clairvoyance",    "dark blue",   P_DIVINATION_SPELL, 15,  3, 3, 1, NODIR,     CLR_BLUE),
815.  SPELL("cure sickness",   "indigo",      P_HEALING_SPELL, 32,  3, 3, 1, NODIR,     CLR_BLUE),
816.  SPELL("charm monster",   "magenta",     P_ENCHANTMENT_SPELL, 20,  3, 3, 1, IMMEDIATE, CLR_MAGENTA),
817.  SPELL("haste self",      "purple",      P_ESCAPE_SPELL, 33,  4, 3, 1, NODIR,     CLR_MAGENTA),
818.  SPELL("detect unseen",   "violet",      P_DIVINATION_SPELL, 20,  4, 3, 1, NODIR,     CLR_MAGENTA),
819.  SPELL("levitation",      "tan",         P_ESCAPE_SPELL, 20,  4, 4, 1, NODIR,     CLR_BROWN),
820.  SPELL("extra healing",   "plaid",       P_HEALING_SPELL, 27,  5, 3, 1, IMMEDIATE, CLR_GREEN),
821.  SPELL("restore ability", "light brown", P_HEALING_SPELL, 25,  5, 4, 1, NODIR,     CLR_BROWN),
822.  SPELL("invisibility",    "dark brown",  P_ESCAPE_SPELL, 25,  5, 4, 1, NODIR,     CLR_BROWN),
823.  SPELL("detect treasure", "gray",        P_DIVINATION_SPELL, 20,  5, 4, 1, NODIR,     CLR_GRAY),
824.  SPELL("remove curse",    "wrinkled",    P_CLERIC_SPELL, 25,  5, 3, 1, NODIR,     HI_PAPER),
825.  SPELL("magic mapping",   "dusty",       P_DIVINATION_SPELL, 18,  7, 5, 1, NODIR,     HI_PAPER),
826.  SPELL("identify",        "bronze",      P_DIVINATION_SPELL, 20,  6, 3, 1, NODIR,     HI_COPPER),
827.  SPELL("turn undead",     "copper",      P_CLERIC_SPELL, 16,  8, 6, 1, IMMEDIATE, HI_COPPER),
828.  SPELL("polymorph",       "silver",      P_MATTER_SPELL, 10,  8, 6, 1, IMMEDIATE, HI_SILVER),
829.  SPELL("teleport away",   "gold",        P_ESCAPE_SPELL, 15,  6, 6, 1, IMMEDIATE, HI_GOLD),
830.  SPELL("create familiar", "glittering",  P_CLERIC_SPELL, 10,  7, 6, 1, NODIR,     CLR_WHITE),
831.  SPELL("cancellation",    "shining",     P_MATTER_SPELL, 15,  8, 7, 1, IMMEDIATE, CLR_WHITE),
832.  SPELL("protection",	     "dull",        P_CLERIC_SPELL, 18,  3, 1, 1, NODIR,     HI_PAPER),
833.  SPELL("jumping",	     "thin",        P_ESCAPE_SPELL, 20,  3, 1, 1, IMMEDIATE, HI_PAPER),
834.  SPELL("stone to flesh",	 "thick",       P_HEALING_SPELL, 15,  1, 3, 1, IMMEDIATE, HI_PAPER),
835.  #if 0	/* DEFERRED */
836.  SPELL("flame sphere",    "canvas",      P_MATTER_SPELL, 20,  2, 1, 1, NODIR, CLR_BROWN),
837.  SPELL("freeze sphere",   "hardcover",   P_MATTER_SPELL, 20,  2, 1, 1, NODIR, CLR_BROWN),
838.  #endif
839.  /* blank spellbook must come last because it retains its description */
840.  SPELL("blank paper",     "plain",       P_NONE, 18,  0, 0, 0, 0,         HI_PAPER),
841.  /* a special, one of a kind, spellbook */
842.  OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0,
843.  	SPBOOK_CLASS, 0, 0,20, 10000, 0, 0, 0, 7, 20, HI_PAPER),
844.  #undef SPELL
845.  

Wands

846.  /* wands ... */
847.  #define WAND(name,typ,prob,cost,mgc,dir,metal,color) OBJECT( \
848.  		OBJ(name,typ), BITS(0,0,1,0,mgc,1,0,0,0,0,dir,P_NONE,metal), 0, \
849.  		WAND_CLASS, prob, 0, 7, cost, 0, 0, 0, 0, 30, color )
850.  WAND("light",          "glass",    95, 100, 1, NODIR,     GLASS,    HI_GLASS),
851.  WAND("secret door detection", "balsa",
852.  				   50, 150, 1, NODIR,	  WOOD,     HI_WOOD),
853.  WAND("enlightenment",  "crystal",  15, 150, 1, NODIR,     GLASS,    HI_GLASS),
854.  WAND("create monster", "maple",    45, 200, 1, NODIR,     WOOD,     HI_WOOD),
855.  WAND("wishing",        "pine",      5, 500, 1, NODIR,     WOOD,     HI_WOOD),
856.  WAND("nothing",        "oak",      25, 100, 0, IMMEDIATE, WOOD,     HI_WOOD),
857.  WAND("striking",       "ebony",    75, 150, 1, IMMEDIATE, WOOD,     HI_WOOD),
858.  WAND("make invisible", "marble",   45, 150, 1, IMMEDIATE, MINERAL,  HI_MINERAL),
859.  WAND("slow monster",   "tin",      50, 150, 1, IMMEDIATE, METAL,    HI_METAL),
860.  WAND("speed monster",  "brass",    50, 150, 1, IMMEDIATE, COPPER,   HI_COPPER),
861.  WAND("undead turning", "copper",   50, 150, 1, IMMEDIATE, COPPER,   HI_COPPER),
862.  WAND("polymorph",      "silver",   45, 200, 1, IMMEDIATE, SILVER,   HI_SILVER),
863.  WAND("cancellation",   "platinum", 45, 200, 1, IMMEDIATE, PLATINUM, CLR_WHITE),
864.  WAND("teleportation",  "iridium",  45, 200, 1, IMMEDIATE, METAL,    CLR_BRIGHT_CYAN),
865.  WAND("opening",        "zinc",     25, 150, 1, IMMEDIATE, METAL,    HI_METAL),
866.  WAND("locking",        "aluminum", 25, 150, 1, IMMEDIATE, METAL,    HI_METAL),
867.  WAND("probing",        "uranium",  30, 150, 1, IMMEDIATE, METAL,    HI_METAL),
868.  WAND("digging",        "iron",     55, 150, 1, RAY,       IRON,     HI_METAL),
869.  WAND("magic missile",  "steel",    50, 150, 1, RAY,       IRON,     HI_METAL),
870.  WAND("fire",           "hexagonal",40, 175, 1, RAY,       IRON,     HI_METAL),
871.  WAND("cold",           "short",    40, 175, 1, RAY,       IRON,     HI_METAL),
872.  WAND("sleep",          "runed",    50, 175, 1, RAY,       IRON,     HI_METAL),
873.  WAND("death",          "long",      5, 500, 1, RAY,       IRON,     HI_METAL),
874.  WAND("lightning",      "curved",   40, 175, 1, RAY,       IRON,     HI_METAL),
875.  WAND((char *)0,        "forked",    0, 150, 1, 0,         WOOD,     HI_WOOD),
876.  WAND((char *)0,        "spiked",    0, 150, 1, 0,         IRON,     HI_METAL),
877.  WAND((char *)0,        "jeweled",   0, 150, 1, 0,         IRON,     HI_MINERAL),
878.  #undef WAND
879.  

Coins

880.  /* coins ... - so far, gold is all there is */
881.  #define COIN(name,prob,metal,worth) OBJECT( \
882.  		OBJ(name,(char *)0), BITS(0,1,0,0,0,0,0,0,0,0,0,P_NONE,metal), 0, \
883.  		COIN_CLASS, prob, 0, 1, worth, 0, 0, 0, 0, 0, HI_GOLD )
884.  	COIN("gold piece",      1000, GOLD,1),
885.  #undef COIN
886.  

Gems

887.  /* gems ... - includes stones and rocks but not boulders */
888.  #define GEM(name,desc,prob,wt,gval,nutr,mohs,glass,color) OBJECT( \
889.  	    OBJ(name,desc), \
890.  	    BITS(0,1,0,0,0,0,0,0,0,HARDGEM(mohs),0,-P_SLING,glass), 0, \
891.  	    GEM_CLASS, prob, 0, 1, gval, 3, 3, 0, 0, nutr, color )
892.  #define ROCK(name,desc,kn,prob,wt,gval,sdam,ldam,mgc,nutr,mohs,glass,color) OBJECT( \
893.  	    OBJ(name,desc), \
894.  	    BITS(kn,1,0,0,mgc,0,0,0,0,HARDGEM(mohs),0,-P_SLING,glass), 0, \
895.  	    GEM_CLASS, prob, 0, wt, gval, sdam, ldam, 0, 0, nutr, color )
896.  GEM("dilithium crystal", "white",      2,  1, 4500, 15,  5, GEMSTONE, CLR_WHITE),
897.  GEM("diamond", "white",                3,  1, 4000, 15, 10, GEMSTONE, CLR_WHITE),
898.  GEM("ruby", "red",                     4,  1, 3500, 15,  9, GEMSTONE, CLR_RED),
899.  GEM("jacinth", "orange",               3,  1, 3250, 15,  9, GEMSTONE, CLR_ORANGE),
900.  GEM("sapphire", "blue",                4,  1, 3000, 15,  9, GEMSTONE, CLR_BLUE),
901.  GEM("black opal", "black",             3,  1, 2500, 15,  8, GEMSTONE, CLR_BLACK),
902.  GEM("emerald", "green",                5,  1, 2500, 15,  8, GEMSTONE, CLR_GREEN),
903.  GEM("turquoise", "green",              6,  1, 2000, 15,  6, GEMSTONE, CLR_GREEN),
904.  GEM("citrine", "yellow",               4,  1, 1500, 15,  6, GEMSTONE, CLR_YELLOW),
905.  GEM("aquamarine", "green",             6,  1, 1500, 15,  8, GEMSTONE, CLR_GREEN),
906.  GEM("amber", "yellowish brown",        8,  1, 1000, 15,  2, GEMSTONE, CLR_BROWN),
907.  GEM("topaz", "yellowish brown",       10,  1,  900, 15,  8, GEMSTONE, CLR_BROWN),
908.  GEM("jet", "black",                    6,  1,  850, 15,  7, GEMSTONE, CLR_BLACK),
909.  GEM("opal", "white",                  12,  1,  800, 15,  6, GEMSTONE, CLR_WHITE),
910.  GEM("chrysoberyl", "yellow",           8,  1,  700, 15,  5, GEMSTONE, CLR_YELLOW),
911.  GEM("garnet", "red",                  12,  1,  700, 15,  7, GEMSTONE, CLR_RED),
912.  GEM("amethyst", "violet",             14,  1,  600, 15,  7, GEMSTONE, CLR_MAGENTA),
913.  GEM("jasper", "red",                  15,  1,  500, 15,  7, GEMSTONE, CLR_RED),
914.  GEM("fluorite", "violet",             15,  1,  400, 15,  4, GEMSTONE, CLR_MAGENTA),
915.  GEM("obsidian", "black",               9,  1,  200, 15,  6, GEMSTONE, CLR_BLACK),
916.  GEM("agate", "orange",                12,  1,  200, 15,  6, GEMSTONE, CLR_ORANGE),
917.  GEM("jade", "green",                  10,  1,  300, 15,  6, GEMSTONE, CLR_GREEN),
918.  GEM("worthless piece of white glass", "white",   77, 1, 0, 6, 5, GLASS, CLR_WHITE),
919.  GEM("worthless piece of blue glass", "blue",     77, 1, 0, 6, 5, GLASS, CLR_BLUE),
920.  GEM("worthless piece of red glass", "red",       77, 1, 0, 6, 5, GLASS, CLR_RED),
921.  GEM("worthless piece of yellowish brown glass", "yellowish brown",
922.  						 77, 1, 0, 6, 5, GLASS, CLR_BROWN),
923.  GEM("worthless piece of orange glass", "orange", 76, 1, 0, 6, 5, GLASS, CLR_ORANGE),
924.  GEM("worthless piece of yellow glass", "yellow", 77, 1, 0, 6, 5, GLASS, CLR_YELLOW),
925.  GEM("worthless piece of black glass",  "black",  76, 1, 0, 6, 5, GLASS, CLR_BLACK),
926.  GEM("worthless piece of green glass", "green",   77, 1, 0, 6, 5, GLASS, CLR_GREEN),
927.  GEM("worthless piece of violet glass", "violet", 77, 1, 0, 6, 5, GLASS, CLR_MAGENTA),
928.  
929.  /* Placement note: there is a wishable subrange for
930.   * "gray stones" in the o_ranges[] array in objnam.c
931.   * that is currently everything between luckstones and flint (inclusive).
932.   */
933.  ROCK("luckstone", "gray",	0, 10,  10, 60, 3, 3, 1, 10, 7, MINERAL, CLR_GRAY),
934.  ROCK("loadstone", "gray",	0, 10, 500,  1, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY),
935.  ROCK("touchstone", "gray",	0,  8,  10, 45, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY),
936.  ROCK("flint", "gray",		0, 10,  10,  1, 6, 6, 0, 10, 7, MINERAL, CLR_GRAY),
937.  ROCK("rock", (char *)0,		1,100,  10,  0, 3, 3, 0, 10, 7, MINERAL, CLR_GRAY),
938.  #undef GEM
939.  #undef ROCK
940.  

Miscellaneous

941.  /* miscellaneous ... */
942.  /* Note: boulders and rocks are not normally created at random; the
943.   * probabilities only come into effect when you try to polymorph them.
944.   * Boulders weigh more than MAX_CARR_CAP; statues use corpsenm to take
945.   * on a specific type and may act as containers (both affect weight).
946.   */
947.  OBJECT(OBJ("boulder",(char *)0), BITS(1,0,0,0,0,0,0,0,1,0,0,P_NONE,MINERAL), 0,
948.  		ROCK_CLASS,   100, 0, 6000,  0, 20, 20, 0, 0, 2000, HI_MINERAL),
949.  OBJECT(OBJ("statue", (char *)0), BITS(1,0,0,1,0,0,0,0,0,0,0,P_NONE,MINERAL), 0,
950.  		ROCK_CLASS,   900, 0, 2500,  0, 20, 20, 0, 0, 2500, CLR_WHITE),
951.  
952.  OBJECT(OBJ("heavy iron ball", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,WHACK,P_NONE,IRON), 0,
953.  		BALL_CLASS,  1000, 0,  480, 10, 25, 25, 0, 0,  200, HI_METAL),
954.  						/* +d4 when "very heavy" */
955.  OBJECT(OBJ("iron chain", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,WHACK,P_NONE,IRON), 0,
956.  		CHAIN_CLASS, 1000, 0,  120,  0,  4,  4, 0, 0,  200, HI_METAL),
957.  						/* +1 both l & s */
958.  
959.  OBJECT(OBJ("blinding venom", "splash of venom"),
960.  		BITS(0,1,0,0,0,0,0,1,0,0,0,P_NONE,LIQUID), 0,
961.  		VENOM_CLASS,  500, 0,	 1,  0,  0,  0, 0, 0,	 0, HI_ORGANIC),
962.  OBJECT(OBJ("acid venom", "splash of venom"),
963.  		BITS(0,1,0,0,0,0,0,1,0,0,0,P_NONE,LIQUID), 0,
964.  		VENOM_CLASS,  500, 0,	 1,  0,  6,  6, 0, 0,	 0, HI_ORGANIC),
965.  		/* +d6 small or large */
966.  
967.  /* fencepost, the deadly Array Terminator -- name [1st arg] *must* be NULL */
968.  	OBJECT(OBJ((char *)0,(char *)0), BITS(0,0,0,0,0,0,0,0,0,0,0,P_NONE,0), 0,
969.  		ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
970.  }; /* objects[] */
971.  
972.  #ifndef OBJECTS_PASS_2_
973.  
974.  /* perform recursive compilation for second structure */
975.  #  undef OBJ
976.  #  undef OBJECT
977.  #  define OBJECTS_PASS_2_
978.  #include "objects.c"
979.  
980.  void NDECL(objects_init);
981.  

objects_init

982.  /* dummy routine used to force linkage */
983.  void
984.  objects_init()
985.  {
986.      return;
987.  }
988.  
989.  #endif	/* !OBJECTS_PASS_2_ */
990.  
991.  /*objects.c*/