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