1/*	SCCS Id: @(#)u_init.c	3.4	2002/10/22	*/
2/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3/* NetHack may be freely redistributed.  See license for details. */
4
5#include "hack.h"
6
7struct trobj {
8	short trotyp;
9	schar trspe;
10	char trclass;
11	Bitfield(trquan,6);
12	Bitfield(trbless,2);
13};
14
15STATIC_DCL void FDECL(ini_inv, (struct trobj *));
16STATIC_DCL void FDECL(knows_object,(int));
17STATIC_DCL void FDECL(knows_class,(CHAR_P));
18STATIC_DCL boolean FDECL(restricted_spell_discipline, (int));
19
20#define UNDEF_TYP	0
21#define UNDEF_SPE	'\177'
22#define UNDEF_BLESS	2
23
24/*
25 *	Initial inventory for the various roles.
26 */
27
28static struct trobj Archeologist[] = {
29	/* if adventure has a name...  idea from tan@uvm-gen */
30	{ BULLWHIP, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
31	{ LEATHER_JACKET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
32	{ FEDORA, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
33	{ FOOD_RATION, 0, FOOD_CLASS, 3, 0 },
34	{ PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
35	{ TINNING_KIT, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
36	{ TOUCHSTONE, 0, GEM_CLASS, 1, 0 },
37	{ SACK, 0, TOOL_CLASS, 1, 0 },
38	{ 0, 0, 0, 0, 0 }
39};
40static struct trobj Barbarian[] = {
41#define B_MAJOR	0	/* two-handed sword or battle-axe  */
42#define B_MINOR	1	/* matched with axe or short sword */
43	{ TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
44	{ AXE, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
45	{ RING_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
46	{ FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
47	{ 0, 0, 0, 0, 0 }
48};
49static struct trobj Cave_man[] = {
50#define C_AMMO	2
51	{ CLUB, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
52	{ SLING, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
53	{ FLINT, 0, GEM_CLASS, 15, UNDEF_BLESS },	/* quan is variable */
54	{ ROCK, 0, GEM_CLASS, 3, 0 },			/* yields 18..33 */
55	{ LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
56	{ 0, 0, 0, 0, 0 }
57};
58static struct trobj Healer[] = {
59	{ SCALPEL, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
60	{ LEATHER_GLOVES, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
61	{ STETHOSCOPE, 0, TOOL_CLASS, 1, 0 },
62	{ POT_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
63	{ POT_EXTRA_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
64	{ WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
65	/* always blessed, so it's guaranteed readable */
66	{ SPE_HEALING, 0, SPBOOK_CLASS, 1, 1 },
67	{ SPE_EXTRA_HEALING, 0, SPBOOK_CLASS, 1, 1 },
68	{ SPE_STONE_TO_FLESH, 0, SPBOOK_CLASS, 1, 1 },
69	{ APPLE, 0, FOOD_CLASS, 5, 0 },
70	{ 0, 0, 0, 0, 0 }
71};
72static struct trobj Knight[] = {
73	{ LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
74	{ LANCE, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
75	{ RING_MAIL, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
76	{ HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
77	{ SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
78	{ LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
79	{ APPLE, 0, FOOD_CLASS, 10, 0 },
80	{ CARROT, 0, FOOD_CLASS, 10, 0 },
81	{ 0, 0, 0, 0, 0 }
82};
83static struct trobj Monk[] = {
84#define M_BOOK		2
85	{ LEATHER_GLOVES, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
86	{ ROBE, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
87	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
88	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS },
89	{ POT_HEALING, 0, POTION_CLASS, 3, UNDEF_BLESS },
90	{ FOOD_RATION, 0, FOOD_CLASS, 3, 0 },
91	{ APPLE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
92	{ ORANGE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
93	/* Yes, we know fortune cookies aren't really from China.  They were
94	 * invented by George Jung in Los Angeles, California, USA in 1916.
95	 */
96	{ FORTUNE_COOKIE, 0, FOOD_CLASS, 3, UNDEF_BLESS },
97	{ 0, 0, 0, 0, 0 }
98};
99static struct trobj Priest[] = {
100	{ MACE, 1, WEAPON_CLASS, 1, 1 },
101	{ ROBE, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
102	{ SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
103	{ POT_WATER, 0, POTION_CLASS, 4, 1 },	/* holy water */
104	{ CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 0 },
105	{ SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 0 },
106	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 2, UNDEF_BLESS },
107	{ 0, 0, 0, 0, 0 }
108};
109static struct trobj Ranger[] = {
110#define RAN_BOW			1
111#define RAN_TWO_ARROWS	2
112#define RAN_ZERO_ARROWS	3
113	{ DAGGER, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
114	{ BOW, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
115	{ ARROW, 2, WEAPON_CLASS, 50, UNDEF_BLESS },
116	{ ARROW, 0, WEAPON_CLASS, 30, UNDEF_BLESS },
117	{ CLOAK_OF_DISPLACEMENT, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
118	{ CRAM_RATION, 0, FOOD_CLASS, 4, 0 },
119	{ 0, 0, 0, 0, 0 }
120};
121static struct trobj Rogue[] = {
122#define R_DAGGERS	1
123	{ SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
124	{ DAGGER, 0, WEAPON_CLASS, 10, 0 },	/* quan is variable */
125	{ LEATHER_ARMOR, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
126	{ POT_SICKNESS, 0, POTION_CLASS, 1, 0 },
127	{ LOCK_PICK, 9, TOOL_CLASS, 1, 0 },
128	{ SACK, 0, TOOL_CLASS, 1, 0 },
129	{ 0, 0, 0, 0, 0 }
130};
131static struct trobj Samurai[] = {
132#define S_ARROWS	3
133	{ KATANA, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
134	{ SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, /* wakizashi */
135	{ YUMI, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
136	{ YA, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, /* variable quan */
137	{ SPLINT_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
138	{ 0, 0, 0, 0, 0 }
139};
140#ifdef TOURIST
141static struct trobj Tourist[] = {
142#define T_DARTS		0
143	{ DART, 2, WEAPON_CLASS, 25, UNDEF_BLESS },	/* quan is variable */
144	{ UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 10, 0 },
145	{ POT_EXTRA_HEALING, 0, POTION_CLASS, 2, UNDEF_BLESS },
146	{ SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 4, UNDEF_BLESS },
147	{ HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
148	{ EXPENSIVE_CAMERA, UNDEF_SPE, TOOL_CLASS, 1, 0 },
149	{ CREDIT_CARD, 0, TOOL_CLASS, 1, 0 },
150	{ 0, 0, 0, 0, 0 }
151};
152#endif
153static struct trobj Valkyrie[] = {
154	{ LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
155	{ DAGGER, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
156	{ SMALL_SHIELD, 3, ARMOR_CLASS, 1, UNDEF_BLESS },
157	{ FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
158	{ 0, 0, 0, 0, 0 }
159};
160static struct trobj Wizard[] = {
161#define W_MULTSTART	2
162#define W_MULTEND	6
163	{ QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 },
164	{ CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
165	{ UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
166	{ UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, UNDEF_BLESS },
167	{ UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, UNDEF_BLESS },
168	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, UNDEF_BLESS },
169	{ SPE_FORCE_BOLT, 0, SPBOOK_CLASS, 1, 1 },
170	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, UNDEF_BLESS },
171	{ 0, 0, 0, 0, 0 }
172};
173
174/*
175 *	Optional extra inventory items.
176 */
177
178static struct trobj Tinopener[] = {
179	{ TIN_OPENER, 0, TOOL_CLASS, 1, 0 },
180	{ 0, 0, 0, 0, 0 }
181};
182static struct trobj Magicmarker[] = {
183	{ MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 0 },
184	{ 0, 0, 0, 0, 0 }
185};
186static struct trobj Lamp[] = {
187	{ OIL_LAMP, 1, TOOL_CLASS, 1, 0 },
188	{ 0, 0, 0, 0, 0 }
189};
190static struct trobj Blindfold[] = {
191	{ BLINDFOLD, 0, TOOL_CLASS, 1, 0 },
192	{ 0, 0, 0, 0, 0 }
193};
194static struct trobj Instrument[] = {
195	{ WOODEN_FLUTE, 0, TOOL_CLASS, 1, 0 },
196	{ 0, 0, 0, 0, 0 }
197};
198static struct trobj Xtra_food[] = {
199	{ UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 2, 0 },
200	{ 0, 0, 0, 0, 0 }
201};
202#ifdef TOURIST
203static struct trobj Leash[] = {
204	{ LEASH, 0, TOOL_CLASS, 1, 0 },
205	{ 0, 0, 0, 0, 0 }
206};
207static struct trobj Towel[] = {
208	{ TOWEL, 0, TOOL_CLASS, 1, 0 },
209	{ 0, 0, 0, 0, 0 }
210};
211#endif	/* TOURIST */
212static struct trobj Wishing[] = {
213	{ WAN_WISHING, 3, WAND_CLASS, 1, 0 },
214	{ 0, 0, 0, 0, 0 }
215};
216#ifdef GOLDOBJ
217static struct trobj Money[] = {
218	{ GOLD_PIECE, 0 , COIN_CLASS, 1, 0 },
219	{ 0, 0, 0, 0, 0 }
220};
221#endif
222
223/* race-based substitutions for initial inventory;
224   the weaker cloak for elven rangers is intentional--they shoot better */
225static struct inv_sub { short race_pm, item_otyp, subs_otyp; } inv_subs[] = {
226    { PM_ELF,	DAGGER,			ELVEN_DAGGER	      },
227    { PM_ELF,	SPEAR,			ELVEN_SPEAR	      },
228    { PM_ELF,	SHORT_SWORD,		ELVEN_SHORT_SWORD     },
229    { PM_ELF,	BOW,			ELVEN_BOW	      },
230    { PM_ELF,	ARROW,			ELVEN_ARROW	      },
231    { PM_ELF,	HELMET,			ELVEN_LEATHER_HELM    },
232 /* { PM_ELF,	SMALL_SHIELD,		ELVEN_SHIELD	      }, */
233    { PM_ELF,	CLOAK_OF_DISPLACEMENT,	ELVEN_CLOAK	      },
234    { PM_ELF,	CRAM_RATION,		LEMBAS_WAFER	      },
235    { PM_ORC,	DAGGER,			ORCISH_DAGGER	      },
236    { PM_ORC,	SPEAR,			ORCISH_SPEAR	      },
237    { PM_ORC,	SHORT_SWORD,		ORCISH_SHORT_SWORD    },
238    { PM_ORC,	BOW,			ORCISH_BOW	      },
239    { PM_ORC,	ARROW,			ORCISH_ARROW	      },
240    { PM_ORC,	HELMET,			ORCISH_HELM	      },
241    { PM_ORC,	SMALL_SHIELD,		ORCISH_SHIELD	      },
242    { PM_ORC,	RING_MAIL,		ORCISH_RING_MAIL      },
243    { PM_ORC,	CHAIN_MAIL,		ORCISH_CHAIN_MAIL     },
244    { PM_DWARF, SPEAR,			DWARVISH_SPEAR	      },
245    { PM_DWARF, SHORT_SWORD,		DWARVISH_SHORT_SWORD  },
246    { PM_DWARF, HELMET,			DWARVISH_IRON_HELM    },
247 /* { PM_DWARF, SMALL_SHIELD,		DWARVISH_ROUNDSHIELD  }, */
248 /* { PM_DWARF, PICK_AXE,		DWARVISH_MATTOCK      }, */
249    { PM_GNOME, BOW,			CROSSBOW	      },
250    { PM_GNOME, ARROW,			CROSSBOW_BOLT	      },
251    { NON_PM,	STRANGE_OBJECT,		STRANGE_OBJECT	      }
252};
253
254static const struct def_skill Skill_A[] = {
255    { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_BASIC },
256    { P_PICK_AXE, P_EXPERT },		{ P_SHORT_SWORD, P_BASIC },
257    { P_SCIMITAR, P_SKILLED },		{ P_SABER, P_EXPERT },
258    { P_CLUB, P_SKILLED },		{ P_QUARTERSTAFF, P_SKILLED },
259    { P_SLING, P_SKILLED },		{ P_DART, P_BASIC },
260    { P_BOOMERANG, P_EXPERT },		{ P_WHIP, P_EXPERT },
261    { P_UNICORN_HORN, P_SKILLED },
262    { P_ATTACK_SPELL, P_BASIC },	{ P_HEALING_SPELL, P_BASIC },
263    { P_DIVINATION_SPELL, P_EXPERT},	{ P_MATTER_SPELL, P_BASIC},
264#ifdef STEED
265    { P_RIDING, P_BASIC },
266#endif
267    { P_TWO_WEAPON_COMBAT, P_BASIC },
268    { P_BARE_HANDED_COMBAT, P_EXPERT },
269    { P_NONE, 0 }
270};
271
272static const struct def_skill Skill_B[] = {
273    { P_DAGGER, P_BASIC },		{ P_AXE, P_EXPERT },
274    { P_PICK_AXE, P_SKILLED },	{ P_SHORT_SWORD, P_EXPERT },
275    { P_BROAD_SWORD, P_SKILLED },	{ P_LONG_SWORD, P_SKILLED },
276    { P_TWO_HANDED_SWORD, P_EXPERT },	{ P_SCIMITAR, P_SKILLED },
277    { P_SABER, P_BASIC },		{ P_CLUB, P_SKILLED },
278    { P_MACE, P_SKILLED },		{ P_MORNING_STAR, P_SKILLED },
279    { P_FLAIL, P_BASIC },		{ P_HAMMER, P_EXPERT },
280    { P_QUARTERSTAFF, P_BASIC },	{ P_SPEAR, P_SKILLED },
281    { P_TRIDENT, P_SKILLED },		{ P_BOW, P_BASIC },
282    { P_ATTACK_SPELL, P_SKILLED },
283#ifdef STEED
284    { P_RIDING, P_BASIC },
285#endif
286    { P_TWO_WEAPON_COMBAT, P_BASIC },
287    { P_BARE_HANDED_COMBAT, P_MASTER },
288    { P_NONE, 0 }
289};
290
291static const struct def_skill Skill_C[] = {
292    { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_SKILLED },
293    { P_AXE, P_SKILLED },		{ P_PICK_AXE, P_BASIC },
294    { P_CLUB, P_EXPERT },		{ P_MACE, P_EXPERT },
295    { P_MORNING_STAR, P_BASIC },	{ P_FLAIL, P_SKILLED },
296    { P_HAMMER, P_SKILLED },		{ P_QUARTERSTAFF, P_EXPERT },
297    { P_POLEARMS, P_SKILLED },		{ P_SPEAR, P_EXPERT },
298    { P_JAVELIN, P_SKILLED },		{ P_TRIDENT, P_SKILLED },
299    { P_BOW, P_SKILLED },		{ P_SLING, P_EXPERT },
300    { P_ATTACK_SPELL, P_BASIC },	{ P_MATTER_SPELL, P_SKILLED },
301    { P_BOOMERANG, P_EXPERT },		{ P_UNICORN_HORN, P_BASIC },
302    { P_BARE_HANDED_COMBAT, P_MASTER },
303    { P_NONE, 0 }
304};
305
306static const struct def_skill Skill_H[] = {
307    { P_DAGGER, P_SKILLED },		{ P_KNIFE, P_EXPERT },
308    { P_SHORT_SWORD, P_SKILLED },	{ P_SCIMITAR, P_BASIC },
309    { P_SABER, P_BASIC },		{ P_CLUB, P_SKILLED },
310    { P_MACE, P_BASIC },		{ P_QUARTERSTAFF, P_EXPERT },
311    { P_POLEARMS, P_BASIC },		{ P_SPEAR, P_BASIC },
312    { P_JAVELIN, P_BASIC },		{ P_TRIDENT, P_BASIC },
313    { P_SLING, P_SKILLED },		{ P_DART, P_EXPERT },
314    { P_SHURIKEN, P_SKILLED },		{ P_UNICORN_HORN, P_EXPERT },
315    { P_HEALING_SPELL, P_EXPERT },
316    { P_BARE_HANDED_COMBAT, P_BASIC },
317    { P_NONE, 0 }
318};
319
320static const struct def_skill Skill_K[] = {
321    { P_DAGGER, P_BASIC },		{ P_KNIFE, P_BASIC },
322    { P_AXE, P_SKILLED },		{ P_PICK_AXE, P_BASIC },
323    { P_SHORT_SWORD, P_SKILLED },	{ P_BROAD_SWORD, P_SKILLED },
324    { P_LONG_SWORD, P_EXPERT },	{ P_TWO_HANDED_SWORD, P_SKILLED },
325    { P_SCIMITAR, P_BASIC },		{ P_SABER, P_SKILLED },
326    { P_CLUB, P_BASIC },		{ P_MACE, P_SKILLED },
327    { P_MORNING_STAR, P_SKILLED },	{ P_FLAIL, P_BASIC },
328    { P_HAMMER, P_BASIC },		{ P_POLEARMS, P_SKILLED },
329    { P_SPEAR, P_SKILLED },		{ P_JAVELIN, P_SKILLED },
330    { P_TRIDENT, P_BASIC },		{ P_LANCE, P_EXPERT },
331    { P_BOW, P_BASIC },			{ P_CROSSBOW, P_SKILLED },
332    { P_ATTACK_SPELL, P_SKILLED },	{ P_HEALING_SPELL, P_SKILLED },
333    { P_CLERIC_SPELL, P_SKILLED },
334#ifdef STEED
335    { P_RIDING, P_EXPERT },
336#endif
337    { P_TWO_WEAPON_COMBAT, P_SKILLED },
338    { P_BARE_HANDED_COMBAT, P_EXPERT },
339    { P_NONE, 0 }
340};
341
342static const struct def_skill Skill_Mon[] = {
343    { P_QUARTERSTAFF, P_BASIC },    { P_SPEAR, P_BASIC },
344    { P_JAVELIN, P_BASIC },		    { P_CROSSBOW, P_BASIC },
345    { P_SHURIKEN, P_BASIC },
346    { P_ATTACK_SPELL, P_BASIC },    { P_HEALING_SPELL, P_EXPERT },
347    { P_DIVINATION_SPELL, P_BASIC },{ P_ENCHANTMENT_SPELL, P_BASIC },
348    { P_CLERIC_SPELL, P_SKILLED },  { P_ESCAPE_SPELL, P_BASIC },
349    { P_MATTER_SPELL, P_BASIC },
350    { P_MARTIAL_ARTS, P_GRAND_MASTER },
351    { P_NONE, 0 }
352};
353
354static const struct def_skill Skill_P[] = {
355    { P_CLUB, P_EXPERT },		{ P_MACE, P_EXPERT },
356    { P_MORNING_STAR, P_EXPERT },	{ P_FLAIL, P_EXPERT },
357    { P_HAMMER, P_EXPERT },		{ P_QUARTERSTAFF, P_EXPERT },
358    { P_POLEARMS, P_SKILLED },		{ P_SPEAR, P_SKILLED },
359    { P_JAVELIN, P_SKILLED },		{ P_TRIDENT, P_SKILLED },
360    { P_LANCE, P_BASIC },		{ P_BOW, P_BASIC },
361    { P_SLING, P_BASIC },		{ P_CROSSBOW, P_BASIC },
362    { P_DART, P_BASIC },		{ P_SHURIKEN, P_BASIC },
363    { P_BOOMERANG, P_BASIC },		{ P_UNICORN_HORN, P_SKILLED },
364    { P_HEALING_SPELL, P_EXPERT },	{ P_DIVINATION_SPELL, P_EXPERT },
365    { P_CLERIC_SPELL, P_EXPERT },
366    { P_BARE_HANDED_COMBAT, P_BASIC },
367    { P_NONE, 0 }
368};
369
370static const struct def_skill Skill_R[] = {
371    { P_DAGGER, P_EXPERT },		{ P_KNIFE,  P_EXPERT },
372    { P_SHORT_SWORD, P_EXPERT },	{ P_BROAD_SWORD, P_SKILLED },
373    { P_LONG_SWORD, P_SKILLED },	{ P_TWO_HANDED_SWORD, P_BASIC },
374    { P_SCIMITAR, P_SKILLED },		{ P_SABER, P_SKILLED },
375    { P_CLUB, P_SKILLED },		{ P_MACE, P_SKILLED },
376    { P_MORNING_STAR, P_BASIC },	{ P_FLAIL, P_BASIC },
377    { P_HAMMER, P_BASIC },		{ P_POLEARMS, P_BASIC },
378    { P_SPEAR, P_BASIC },		{ P_CROSSBOW, P_EXPERT },
379    { P_DART, P_EXPERT },		{ P_SHURIKEN, P_SKILLED },
380    { P_DIVINATION_SPELL, P_SKILLED },	{ P_ESCAPE_SPELL, P_SKILLED },
381    { P_MATTER_SPELL, P_SKILLED },
382#ifdef STEED
383    { P_RIDING, P_BASIC },
384#endif
385    { P_TWO_WEAPON_COMBAT, P_EXPERT },
386    { P_BARE_HANDED_COMBAT, P_EXPERT },
387    { P_NONE, 0 }
388};
389
390static const struct def_skill Skill_Ran[] = {
391    { P_DAGGER, P_EXPERT },		 { P_KNIFE,  P_SKILLED },
392    { P_AXE, P_SKILLED },	 { P_PICK_AXE, P_BASIC },
393    { P_SHORT_SWORD, P_BASIC },	 { P_MORNING_STAR, P_BASIC },
394    { P_FLAIL, P_SKILLED },	 { P_HAMMER, P_BASIC },
395    { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED },
396    { P_SPEAR, P_SKILLED },	 { P_JAVELIN, P_EXPERT },
397    { P_TRIDENT, P_BASIC },	 { P_BOW, P_EXPERT },
398    { P_SLING, P_EXPERT },	 { P_CROSSBOW, P_EXPERT },
399    { P_DART, P_EXPERT },	 { P_SHURIKEN, P_SKILLED },
400    { P_BOOMERANG, P_EXPERT },	 { P_WHIP, P_BASIC },
401    { P_HEALING_SPELL, P_BASIC },
402    { P_DIVINATION_SPELL, P_EXPERT },
403    { P_ESCAPE_SPELL, P_BASIC },
404#ifdef STEED
405    { P_RIDING, P_BASIC },
406#endif
407    { P_BARE_HANDED_COMBAT, P_BASIC },
408    { P_NONE, 0 }
409};
410
411static const struct def_skill Skill_S[] = {
412    { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_SKILLED },
413    { P_SHORT_SWORD, P_EXPERT },	{ P_BROAD_SWORD, P_SKILLED },
414    { P_LONG_SWORD, P_EXPERT },		{ P_TWO_HANDED_SWORD, P_EXPERT },
415    { P_SCIMITAR, P_BASIC },		{ P_SABER, P_BASIC },
416    { P_FLAIL, P_SKILLED },		{ P_QUARTERSTAFF, P_BASIC },
417    { P_POLEARMS, P_SKILLED },		{ P_SPEAR, P_BASIC },
418    { P_JAVELIN, P_BASIC },		{ P_LANCE, P_SKILLED },
419    { P_BOW, P_EXPERT },		{ P_SHURIKEN, P_EXPERT },
420    { P_ATTACK_SPELL, P_SKILLED },	{ P_CLERIC_SPELL, P_SKILLED },
421#ifdef STEED
422    { P_RIDING, P_SKILLED },
423#endif
424    { P_TWO_WEAPON_COMBAT, P_EXPERT },
425    { P_MARTIAL_ARTS, P_MASTER },
426    { P_NONE, 0 }
427};
428
429#ifdef TOURIST
430static const struct def_skill Skill_T[] = {
431    { P_DAGGER, P_EXPERT },		{ P_KNIFE,  P_SKILLED },
432    { P_AXE, P_BASIC },			{ P_PICK_AXE, P_BASIC },
433    { P_SHORT_SWORD, P_EXPERT },	{ P_BROAD_SWORD, P_BASIC },
434    { P_LONG_SWORD, P_BASIC },		{ P_TWO_HANDED_SWORD, P_BASIC },
435    { P_SCIMITAR, P_SKILLED },		{ P_SABER, P_SKILLED },
436    { P_MACE, P_BASIC },		{ P_MORNING_STAR, P_BASIC },
437    { P_FLAIL, P_BASIC },		{ P_HAMMER, P_BASIC },
438    { P_QUARTERSTAFF, P_BASIC },	{ P_POLEARMS, P_BASIC },
439    { P_SPEAR, P_BASIC },		{ P_JAVELIN, P_BASIC },
440    { P_TRIDENT, P_BASIC },		{ P_LANCE, P_BASIC },
441    { P_BOW, P_BASIC },			{ P_SLING, P_BASIC },
442    { P_CROSSBOW, P_BASIC },		{ P_DART, P_EXPERT },
443    { P_SHURIKEN, P_BASIC },		{ P_BOOMERANG, P_BASIC },
444    { P_WHIP, P_BASIC },		{ P_UNICORN_HORN, P_SKILLED },
445    { P_DIVINATION_SPELL, P_BASIC },	{ P_ENCHANTMENT_SPELL, P_BASIC },
446    { P_ESCAPE_SPELL, P_SKILLED },
447#ifdef STEED
448    { P_RIDING, P_BASIC },
449#endif
450    { P_TWO_WEAPON_COMBAT, P_SKILLED },
451    { P_BARE_HANDED_COMBAT, P_SKILLED },
452    { P_NONE, 0 }
453};
454#endif /* TOURIST */
455
456static const struct def_skill Skill_V[] = {
457    { P_DAGGER, P_EXPERT },		{ P_AXE, P_EXPERT },
458    { P_PICK_AXE, P_SKILLED },		{ P_SHORT_SWORD, P_SKILLED },
459    { P_BROAD_SWORD, P_SKILLED },	{ P_LONG_SWORD, P_EXPERT },
460    { P_TWO_HANDED_SWORD, P_EXPERT },	{ P_SCIMITAR, P_BASIC },
461    { P_SABER, P_BASIC },		{ P_HAMMER, P_EXPERT },
462    { P_QUARTERSTAFF, P_BASIC },	{ P_POLEARMS, P_SKILLED },
463    { P_SPEAR, P_SKILLED },		{ P_JAVELIN, P_BASIC },
464    { P_TRIDENT, P_BASIC },		{ P_LANCE, P_SKILLED },
465    { P_SLING, P_BASIC },
466    { P_ATTACK_SPELL, P_BASIC },	{ P_ESCAPE_SPELL, P_BASIC },
467#ifdef STEED
468    { P_RIDING, P_SKILLED },
469#endif
470    { P_TWO_WEAPON_COMBAT, P_SKILLED },
471    { P_BARE_HANDED_COMBAT, P_EXPERT },
472    { P_NONE, 0 }
473};
474
475static const struct def_skill Skill_W[] = {
476    { P_DAGGER, P_EXPERT },		{ P_KNIFE,  P_SKILLED },
477    { P_AXE, P_SKILLED },		{ P_SHORT_SWORD, P_BASIC },
478    { P_CLUB, P_SKILLED },		{ P_MACE, P_BASIC },
479    { P_QUARTERSTAFF, P_EXPERT },	{ P_POLEARMS, P_SKILLED },
480    { P_SPEAR, P_BASIC },		{ P_JAVELIN, P_BASIC },
481    { P_TRIDENT, P_BASIC },		{ P_SLING, P_SKILLED },
482    { P_DART, P_EXPERT },		{ P_SHURIKEN, P_BASIC },
483    { P_ATTACK_SPELL, P_EXPERT },	{ P_HEALING_SPELL, P_SKILLED },
484    { P_DIVINATION_SPELL, P_EXPERT },	{ P_ENCHANTMENT_SPELL, P_SKILLED },
485    { P_CLERIC_SPELL, P_SKILLED },	{ P_ESCAPE_SPELL, P_EXPERT },
486    { P_MATTER_SPELL, P_EXPERT },
487#ifdef STEED
488    { P_RIDING, P_BASIC },
489#endif
490    { P_BARE_HANDED_COMBAT, P_BASIC },
491    { P_NONE, 0 }
492};
493
494
495STATIC_OVL void
496knows_object(obj)
497register int obj;
498{
499	discover_object(obj,TRUE,FALSE);
500	objects[obj].oc_pre_discovered = 1;	/* not a "discovery" */
501}
502
503/* Know ordinary (non-magical) objects of a certain class,
504 * like all gems except the loadstone and luckstone.
505 */
506STATIC_OVL void
507knows_class(sym)
508register char sym;
509{
510	register int ct;
511	for (ct = 1; ct < NUM_OBJECTS; ct++)
512		if (objects[ct].oc_class == sym && !objects[ct].oc_magic)
513			knows_object(ct);
514}
515
516void
517u_init()
518{
519	register int i;
520
521	flags.female = flags.initgend;
522	flags.beginner = 1;
523
524	/* zero u, including pointer values --
525	 * necessary when aborting from a failed restore */
526	(void) memset((genericptr_t)&u, 0, sizeof(u));
527	u.ustuck = (struct monst *)0;
528
529#if 0	/* documentation of more zero values as desirable */
530	u.usick_cause[0] = 0;
531	u.uluck  = u.moreluck = 0;
532# ifdef TOURIST
533	uarmu = 0;
534# endif
535	uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0;
536	uwep = uball = uchain = uleft = uright = 0;
537	uswapwep = uquiver = 0;
538	u.twoweap = 0;
539	u.ublessed = 0;				/* not worthy yet */
540	u.ugangr   = 0;				/* gods not angry */
541	u.ugifts   = 0;				/* no divine gifts bestowed */
542# ifdef ELBERETH
543	u.uevent.uhand_of_elbereth = 0;
544# endif
545	u.uevent.uheard_tune = 0;
546	u.uevent.uopened_dbridge = 0;
547	u.uevent.udemigod = 0;		/* not a demi-god yet... */
548	u.udg_cnt = 0;
549	u.mh = u.mhmax = u.mtimedone = 0;
550	u.uz.dnum = u.uz0.dnum = 0;
551	u.utotype = 0;
552#endif	/* 0 */
553
554	u.uz.dlevel = 1;
555	u.uz0.dlevel = 0;
556	u.utolev = u.uz;
557
558	u.umoved = FALSE;
559	u.umortality = 0;
560	u.ugrave_arise = NON_PM;
561
562	u.umonnum = u.umonster = (flags.female &&
563			urole.femalenum != NON_PM) ? urole.femalenum :
564			urole.malenum;
565	set_uasmon();
566
567	u.ulevel = 0;	/* set up some of the initial attributes */
568	u.uhp = u.uhpmax = newhp();
569	u.uenmax = urole.enadv.infix + urace.enadv.infix;
570	if (urole.enadv.inrnd > 0)
571	    u.uenmax += rnd(urole.enadv.inrnd);
572	if (urace.enadv.inrnd > 0)
573	    u.uenmax += rnd(urace.enadv.inrnd);
574	u.uen = u.uenmax;
575	u.uspellprot = 0;
576	adjabil(0,1);
577	u.ulevel = u.ulevelmax = 1;
578
579	init_uhunger();
580	for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
581	u.ublesscnt = 300;			/* no prayers just yet */
582	u.ualignbase[A_CURRENT] = u.ualignbase[A_ORIGINAL] = u.ualign.type =
583			aligns[flags.initalign].value;
584	u.ulycn = NON_PM;
585
586#if defined(BSD) && !defined(POSIX_TYPES)
587	(void) time((long *)&u.ubirthday);
588#else
589	(void) time(&u.ubirthday);
590#endif
591
592	/*
593	 *  For now, everyone starts out with a night vision range of 1 and
594	 *  their xray range disabled.
595	 */
596	u.nv_range   =  1;
597	u.xray_range = -1;
598
599
600	/*** Role-specific initializations ***/
601	switch (Role_switch) {
602	/* rn2(100) > 50 necessary for some choices because some
603	 * random number generators are bad enough to seriously
604	 * skew the results if we use rn2(2)...  --KAA
605	 */
606	case PM_ARCHEOLOGIST:
607		ini_inv(Archeologist);
608		if(!rn2(10)) ini_inv(Tinopener);
609		else if(!rn2(4)) ini_inv(Lamp);
610		else if(!rn2(10)) ini_inv(Magicmarker);
611		knows_object(SACK);
612		knows_object(TOUCHSTONE);
613		skill_init(Skill_A);
614		break;
615	case PM_BARBARIAN:
616		if (rn2(100) >= 50) {	/* see above comment */
617		    Barbarian[B_MAJOR].trotyp = BATTLE_AXE;
618		    Barbarian[B_MINOR].trotyp = SHORT_SWORD;
619		}
620		ini_inv(Barbarian);
621		if(!rn2(6)) ini_inv(Lamp);
622		knows_class(WEAPON_CLASS);
623		knows_class(ARMOR_CLASS);
624		skill_init(Skill_B);
625		break;
626	case PM_CAVEMAN:
627		Cave_man[C_AMMO].trquan = rn1(11, 10);	/* 10..20 */
628		ini_inv(Cave_man);
629		skill_init(Skill_C);
630		break;
631	case PM_HEALER:
632#ifndef GOLDOBJ
633		u.ugold = u.ugold0 = rn1(1000, 1001);
634#else
635		u.umoney0 = rn1(1000, 1001);
636#endif
637		ini_inv(Healer);
638		if(!rn2(25)) ini_inv(Lamp);
639		knows_object(POT_FULL_HEALING);
640		skill_init(Skill_H);
641		break;
642	case PM_KNIGHT:
643		ini_inv(Knight);
644		knows_class(WEAPON_CLASS);
645		knows_class(ARMOR_CLASS);
646		/* give knights chess-like mobility
647		 * -- idea from wooledge@skybridge.scl.cwru.edu */
648		HJumping |= FROMOUTSIDE;
649		skill_init(Skill_K);
650		break;
651	case PM_MONK:
652		switch (rn2(90) / 30) {
653		case 0: Monk[M_BOOK].trotyp = SPE_HEALING; break;
654		case 1: Monk[M_BOOK].trotyp = SPE_PROTECTION; break;
655		case 2: Monk[M_BOOK].trotyp = SPE_SLEEP; break;
656		}
657		ini_inv(Monk);
658		if(!rn2(5)) ini_inv(Magicmarker);
659		else if(!rn2(10)) ini_inv(Lamp);
660		knows_class(ARMOR_CLASS);
661		skill_init(Skill_Mon);
662		break;
663	case PM_PRIEST:
664		ini_inv(Priest);
665		if(!rn2(10)) ini_inv(Magicmarker);
666		else if(!rn2(10)) ini_inv(Lamp);
667		knows_object(POT_WATER);
668		skill_init(Skill_P);
669		/* KMH, conduct --
670		 * Some may claim that this isn't agnostic, since they
671		 * are literally "priests" and they have holy water.
672		 * But we don't count it as such.  Purists can always
673		 * avoid playing priests and/or confirm another player's
674		 * role in their YAAP.
675		 */
676		break;
677	case PM_RANGER:
678		Ranger[RAN_TWO_ARROWS].trquan = rn1(10, 50);
679		Ranger[RAN_ZERO_ARROWS].trquan = rn1(10, 30);
680		ini_inv(Ranger);
681		skill_init(Skill_Ran);
682		break;
683	case PM_ROGUE:
684		Rogue[R_DAGGERS].trquan = rn1(10, 6);
685#ifndef GOLDOBJ
686		u.ugold = u.ugold0 = 0;
687#else
688		u.umoney0 = 0;
689#endif
690		ini_inv(Rogue);
691		if(!rn2(5)) ini_inv(Blindfold);
692		knows_object(SACK);
693		skill_init(Skill_R);
694		break;
695	case PM_SAMURAI:
696		Samurai[S_ARROWS].trquan = rn1(20, 26);
697		ini_inv(Samurai);
698		if(!rn2(5)) ini_inv(Blindfold);
699		knows_class(WEAPON_CLASS);
700		knows_class(ARMOR_CLASS);
701		skill_init(Skill_S);
702		break;
703#ifdef TOURIST
704	case PM_TOURIST:
705		Tourist[T_DARTS].trquan = rn1(20, 21);
706#ifndef GOLDOBJ
707		u.ugold = u.ugold0 = rnd(1000);
708#else
709		u.umoney0 = rnd(1000);
710#endif
711		ini_inv(Tourist);
712		if(!rn2(25)) ini_inv(Tinopener);
713		else if(!rn2(25)) ini_inv(Leash);
714		else if(!rn2(25)) ini_inv(Towel);
715		else if(!rn2(25)) ini_inv(Magicmarker);
716		skill_init(Skill_T);
717		break;
718#endif
719	case PM_VALKYRIE:
720		ini_inv(Valkyrie);
721		if(!rn2(6)) ini_inv(Lamp);
722		knows_class(WEAPON_CLASS);
723		knows_class(ARMOR_CLASS);
724		skill_init(Skill_V);
725		break;
726	case PM_WIZARD:
727		ini_inv(Wizard);
728		if(!rn2(5)) ini_inv(Magicmarker);
729		if(!rn2(5)) ini_inv(Blindfold);
730		skill_init(Skill_W);
731		break;
732
733	default:	/* impossible */
734		break;
735	}
736
737
738	/*** Race-specific initializations ***/
739	switch (Race_switch) {
740	case PM_HUMAN:
741	    /* Nothing special */
742	    break;
743
744	case PM_ELF:
745	    /*
746	     * Elves are people of music and song, or they are warriors.
747	     * Non-warriors get an instrument.  We use a kludge to
748	     * get only non-magic instruments.
749	     */
750	    if (Role_if(PM_PRIEST) || Role_if(PM_WIZARD)) {
751		static int trotyp[] = {
752		    WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP,
753		    BELL, BUGLE, LEATHER_DRUM
754		};
755		Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))];
756		ini_inv(Instrument);
757	    }
758
759	    /* Elves can recognize all elvish objects */
760	    knows_object(ELVEN_SHORT_SWORD);
761	    knows_object(ELVEN_ARROW);
762	    knows_object(ELVEN_BOW);
763	    knows_object(ELVEN_SPEAR);
764	    knows_object(ELVEN_DAGGER);
765	    knows_object(ELVEN_BROADSWORD);
766	    knows_object(ELVEN_MITHRIL_COAT);
767	    knows_object(ELVEN_LEATHER_HELM);
768	    knows_object(ELVEN_SHIELD);
769	    knows_object(ELVEN_BOOTS);
770	    knows_object(ELVEN_CLOAK);
771	    break;
772
773	case PM_DWARF:
774	    /* Dwarves can recognize all dwarvish objects */
775	    knows_object(DWARVISH_SPEAR);
776	    knows_object(DWARVISH_SHORT_SWORD);
777	    knows_object(DWARVISH_MATTOCK);
778	    knows_object(DWARVISH_IRON_HELM);
779	    knows_object(DWARVISH_MITHRIL_COAT);
780	    knows_object(DWARVISH_CLOAK);
781	    knows_object(DWARVISH_ROUNDSHIELD);
782	    break;
783
784	case PM_GNOME:
785	    break;
786
787	case PM_ORC:
788	    /* compensate for generally inferior equipment */
789	    if (!Role_if(PM_WIZARD))
790		ini_inv(Xtra_food);
791	    /* Orcs can recognize all orcish objects */
792	    knows_object(ORCISH_SHORT_SWORD);
793	    knows_object(ORCISH_ARROW);
794	    knows_object(ORCISH_BOW);
795	    knows_object(ORCISH_SPEAR);
796	    knows_object(ORCISH_DAGGER);
797	    knows_object(ORCISH_CHAIN_MAIL);
798	    knows_object(ORCISH_RING_MAIL);
799	    knows_object(ORCISH_HELM);
800	    knows_object(ORCISH_SHIELD);
801	    knows_object(URUK_HAI_SHIELD);
802	    knows_object(ORCISH_CLOAK);
803	    break;
804
805	default:	/* impossible */
806		break;
807	}
808
809	if (discover)
810		ini_inv(Wishing);
811
812#ifdef WIZARD
813	if (wizard)
814		read_wizkit();
815#endif
816
817#ifndef GOLDOBJ
818	u.ugold0 += hidden_gold();	/* in case sack has gold in it */
819#else
820	if (u.umoney0) ini_inv(Money);
821	u.umoney0 += hidden_gold();	/* in case sack has gold in it */
822#endif
823
824	find_ac();			/* get initial ac value */
825	init_attr(75);			/* init attribute values */
826	max_rank_sz();			/* set max str size for class ranks */
827/*
828 *	Do we really need this?
829 */
830	for(i = 0; i < A_MAX; i++)
831	    if(!rn2(20)) {
832		register int xd = rn2(7) - 2;	/* biased variation */
833		(void) adjattrib(i, xd, TRUE);
834		if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i);
835	    }
836
837	/* make sure you can carry all you have - especially for Tourists */
838	while (inv_weight() > 0) {
839		if (adjattrib(A_STR, 1, TRUE)) continue;
840		if (adjattrib(A_CON, 1, TRUE)) continue;
841		/* only get here when didn't boost strength or constitution */
842		break;
843	}
844
845	return;
846}
847
848/* skills aren't initialized, so we use the role-specific skill lists */
849STATIC_OVL boolean
850restricted_spell_discipline(otyp)
851int otyp;
852{
853    const struct def_skill *skills;
854    int this_skill = spell_skilltype(otyp);
855
856    switch (Role_switch) {
857     case PM_ARCHEOLOGIST:	skills = Skill_A; break;
858     case PM_BARBARIAN:		skills = Skill_B; break;
859     case PM_CAVEMAN:		skills = Skill_C; break;
860     case PM_HEALER:		skills = Skill_H; break;
861     case PM_KNIGHT:		skills = Skill_K; break;
862     case PM_MONK:		skills = Skill_Mon; break;
863     case PM_PRIEST:		skills = Skill_P; break;
864     case PM_RANGER:		skills = Skill_Ran; break;
865     case PM_ROGUE:		skills = Skill_R; break;
866     case PM_SAMURAI:		skills = Skill_S; break;
867#ifdef TOURIST
868     case PM_TOURIST:		skills = Skill_T; break;
869#endif
870     case PM_VALKYRIE:		skills = Skill_V; break;
871     case PM_WIZARD:		skills = Skill_W; break;
872     default:			skills = 0; break;	/* lint suppression */
873    }
874
875    while (skills->skill != P_NONE) {
876	if (skills->skill == this_skill) return FALSE;
877	++skills;
878    }
879    return TRUE;
880}
881
882STATIC_OVL void
883ini_inv(trop)
884register struct trobj *trop;
885{
886	struct obj *obj;
887	int otyp, i;
888
889	while (trop->trclass) {
890		if (trop->trotyp != UNDEF_TYP) {
891			otyp = (int)trop->trotyp;
892			if (urace.malenum != PM_HUMAN) {
893			    /* substitute specific items for generic ones */
894			    for (i = 0; inv_subs[i].race_pm != NON_PM; ++i)
895				if (inv_subs[i].race_pm == urace.malenum &&
896					otyp == inv_subs[i].item_otyp) {
897				    otyp = inv_subs[i].subs_otyp;
898				    break;
899				}
900			}
901			obj = mksobj(otyp, TRUE, FALSE);
902		} else {	/* UNDEF_TYP */
903			static NEARDATA short nocreate = STRANGE_OBJECT;
904			static NEARDATA short nocreate2 = STRANGE_OBJECT;
905			static NEARDATA short nocreate3 = STRANGE_OBJECT;
906			static NEARDATA short nocreate4 = STRANGE_OBJECT;
907		/*
908		 * For random objects, do not create certain overly powerful
909		 * items: wand of wishing, ring of levitation, or the
910		 * polymorph/polymorph control combination.  Specific objects,
911		 * i.e. the discovery wishing, are still OK.
912		 * Also, don't get a couple of really useless items.  (Note:
913		 * punishment isn't "useless".  Some players who start out with
914		 * one will immediately read it and use the iron ball as a
915		 * weapon.)
916		 */
917			obj = mkobj(trop->trclass, FALSE);
918			otyp = obj->otyp;
919			while (otyp == WAN_WISHING
920				|| otyp == nocreate
921				|| otyp == nocreate2
922				|| otyp == nocreate3
923				|| otyp == nocreate4
924#ifdef ELBERETH
925				|| otyp == RIN_LEVITATION
926#endif
927				/* 'useless' items */
928				|| otyp == POT_HALLUCINATION
929				|| otyp == POT_ACID
930				|| otyp == SCR_AMNESIA
931				|| otyp == SCR_FIRE
932				|| otyp == SCR_BLANK_PAPER
933				|| otyp == SPE_BLANK_PAPER
934				|| otyp == RIN_AGGRAVATE_MONSTER
935				|| otyp == RIN_HUNGER
936				|| otyp == WAN_NOTHING
937				/* Monks don't use weapons */
938				|| (otyp == SCR_ENCHANT_WEAPON &&
939				    Role_if(PM_MONK))
940				/* wizard patch -- they already have one */
941				|| (otyp == SPE_FORCE_BOLT &&
942				    Role_if(PM_WIZARD))
943				/* powerful spells are either useless to
944				   low level players or unbalancing; also
945				   spells in restricted skill categories */
946				|| (obj->oclass == SPBOOK_CLASS &&
947				    (objects[otyp].oc_level > 3 ||
948				    restricted_spell_discipline(otyp)))
949							) {
950				dealloc_obj(obj);
951				obj = mkobj(trop->trclass, FALSE);
952				otyp = obj->otyp;
953			}
954
955			/* Don't start with +0 or negative rings */
956			if (objects[otyp].oc_charged && obj->spe <= 0)
957				obj->spe = rne(3);
958
959			/* Heavily relies on the fact that 1) we create wands
960			 * before rings, 2) that we create rings before
961			 * spellbooks, and that 3) not more than 1 object of a
962			 * particular symbol is to be prohibited.  (For more
963			 * objects, we need more nocreate variables...)
964			 */
965			switch (otyp) {
966			    case WAN_POLYMORPH:
967			    case RIN_POLYMORPH:
968			    case POT_POLYMORPH:
969				nocreate = RIN_POLYMORPH_CONTROL;
970				break;
971			    case RIN_POLYMORPH_CONTROL:
972				nocreate = RIN_POLYMORPH;
973				nocreate2 = SPE_POLYMORPH;
974				nocreate3 = POT_POLYMORPH;
975			}
976			/* Don't have 2 of the same ring or spellbook */
977			if (obj->oclass == RING_CLASS ||
978			    obj->oclass == SPBOOK_CLASS)
979				nocreate4 = otyp;
980		}
981
982#ifdef GOLDOBJ
983		if (trop->trclass == COIN_CLASS) {
984			/* no "blessed" or "identified" money */
985			obj->quan = u.umoney0;
986		} else {
987#endif
988			obj->dknown = obj->bknown = obj->rknown = 1;
989			if (objects[otyp].oc_uses_known) obj->known = 1;
990			obj->cursed = 0;
991			if (obj->opoisoned && u.ualign.type != A_CHAOTIC)
992			    obj->opoisoned = 0;
993			if (obj->oclass == WEAPON_CLASS ||
994				obj->oclass == TOOL_CLASS) {
995			    obj->quan = (long) trop->trquan;
996			    trop->trquan = 1;
997			} else if (obj->oclass == GEM_CLASS &&
998				is_graystone(obj) && obj->otyp != FLINT) {
999			    obj->quan = 1L;
1000			}
1001			if (trop->trspe != UNDEF_SPE)
1002			    obj->spe = trop->trspe;
1003			if (trop->trbless != UNDEF_BLESS)
1004			    obj->blessed = trop->trbless;
1005#ifdef GOLDOBJ
1006		}
1007#endif
1008		/* defined after setting otyp+quan + blessedness */
1009		obj->owt = weight(obj);
1010		obj = addinv(obj);
1011
1012		/* Make the type known if necessary */
1013		if (OBJ_DESCR(objects[otyp]) && obj->known)
1014			discover_object(otyp, TRUE, FALSE);
1015		if (otyp == OIL_LAMP)
1016			discover_object(POT_OIL, TRUE, FALSE);
1017
1018		if(obj->oclass == ARMOR_CLASS){
1019			if (is_shield(obj) && !uarms) {
1020				setworn(obj, W_ARMS);
1021				if (uswapwep) setuswapwep((struct obj *) 0);
1022			} else if (is_helmet(obj) && !uarmh)
1023				setworn(obj, W_ARMH);
1024			else if (is_gloves(obj) && !uarmg)
1025				setworn(obj, W_ARMG);
1026#ifdef TOURIST
1027			else if (is_shirt(obj) && !uarmu)
1028				setworn(obj, W_ARMU);
1029#endif
1030			else if (is_cloak(obj) && !uarmc)
1031				setworn(obj, W_ARMC);
1032			else if (is_boots(obj) && !uarmf)
1033				setworn(obj, W_ARMF);
1034			else if (is_suit(obj) && !uarm)
1035				setworn(obj, W_ARM);
1036		}
1037
1038		if (obj->oclass == WEAPON_CLASS || is_weptool(obj) ||
1039			otyp == TIN_OPENER || otyp == FLINT || otyp == ROCK) {
1040		    if (is_ammo(obj) || is_missile(obj)) {
1041			if (!uquiver) setuqwep(obj);
1042		    } else if (!uwep) setuwep(obj);
1043		    else if (!uswapwep) setuswapwep(obj);
1044		}
1045		if (obj->oclass == SPBOOK_CLASS &&
1046				obj->otyp != SPE_BLANK_PAPER)
1047		    initialspell(obj);
1048
1049#if !defined(PYRAMID_BUG) && !defined(MAC)
1050		if(--trop->trquan) continue;	/* make a similar object */
1051#else
1052		if(trop->trquan) {		/* check if zero first */
1053			--trop->trquan;
1054			if(trop->trquan)
1055				continue;	/* make a similar object */
1056		}
1057#endif
1058		trop++;
1059	}
1060}
1061
1062/*u_init.c*/
1063