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 
7 struct trobj {
8 	short trotyp;
9 	schar trspe;
10 	char trclass;
11 	Bitfield(trquan,6);
12 	Bitfield(trbless,2);
13 };
14 
15 STATIC_DCL void FDECL(ini_inv, (struct trobj *));
16 STATIC_DCL void FDECL(knows_object,(int));
17 STATIC_DCL void FDECL(knows_class,(CHAR_P));
18 STATIC_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 
28 static struct trobj Archeologist[] = {
29 #define A_BOOK          4
30 	/* if adventure has a name...  idea from tan@uvm-gen */
31 	{ BULLWHIP, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
32 	{ LEATHER_JACKET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
33 	{ FEDORA, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
34 	{ FOOD_RATION, 0, FOOD_CLASS, 3, 0 },
35 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
36 	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 2, UNDEF_BLESS },
37 	{ PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
38 	{ TINNING_KIT, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
39 	{ TOUCHSTONE, 0, GEM_CLASS, 1, 0 },
40 	{ SACK, 0, TOOL_CLASS, 1, 0 },
41 	{ 0, 0, 0, 0, 0 }
42 };
43 static struct trobj Barbarian[] = {
44 #define B_MAJOR	0	/* two-handed sword or battle-axe  */
45 #define B_MINOR	1	/* matched with axe or short sword */
46 	{ TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
47 	{ AXE, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
48 	{ RING_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
49 	{ FOOD_RATION, 0, FOOD_CLASS, 2, 0 },
50 	{ 0, 0, 0, 0, 0 }
51 };
52 static struct trobj Cave_man[] = {
53 #define C_AMMO	2
54 	{ CLUB, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
55 	{ SLING, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
56 	{ FLINT, 0, GEM_CLASS, 15, UNDEF_BLESS },	/* quan is variable */
57 	{ ROCK, 0, GEM_CLASS, 3, 0 },			/* yields 18..33 */
58 	{ LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
59 	{ 0, 0, 0, 0, 0 }
60 };
61 static struct trobj Flame_Mage[] = {
62 #define F_BOOK          9
63 	{ QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 },        /* for dealing with ghosts */
64 	{ STUDDED_LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
65 	{ FOOD_RATION, 0, FOOD_CLASS, 2, 0 },
66 	{ UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 1, UNDEF_BLESS },
67 	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS },
68 	{ WAN_FIRE, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
69 	{ UNDEF_TYP, UNDEF_SPE, RING_CLASS, 1, UNDEF_BLESS },
70 	{ SPE_FLAME_SPHERE, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
71 	{ SPE_FIREBALL, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
72 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
73   	{ 0, 0, 0, 0, 0 }
74 };
75 static struct trobj Healer[] = {
76 	{ SCALPEL, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
77 	{ LEATHER_GLOVES, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
78 	{ STETHOSCOPE, 0, TOOL_CLASS, 1, 0 },
79 	{ MEDICAL_KIT, 0, TOOL_CLASS, 1, 0 },
80 	{ POT_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
81 	{ POT_EXTRA_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
82 	{ WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
83 	/* [Tom] they might as well have a wand of healing, too */
84 	{ WAN_HEALING, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
85 	/* always blessed, so it's guaranteed readable */
86 	{ SPE_HEALING, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
87 	{ SPE_STONE_TO_FLESH, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
88 	{ APPLE, 0, FOOD_CLASS, 10, 0 },
89 	{ 0, 0, 0, 0, 0 }
90 };
91 static struct trobj Ice_Mage[] = {
92 #define I_BOOK          9
93 	{ QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 },        /* for dealing with ghosts */
94 	{ STUDDED_LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
95 	{ FOOD_RATION, 0, FOOD_CLASS, 2, 0 },
96 	{ UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 1, UNDEF_BLESS },
97 	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS },
98 	{ WAN_COLD, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
99 	{ UNDEF_TYP, UNDEF_SPE, RING_CLASS, 1, UNDEF_BLESS },
100 	{ SPE_FREEZE_SPHERE, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
101 	{ SPE_CONE_OF_COLD, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
102 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
103 	{ 0, 0, 0, 0, 0 }
104 };
105 static struct trobj Knight[] = {
106 	{ LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
107 	{ LANCE, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
108 	{ PLATE_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
109 	{ HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
110 	{ LARGE_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
111 	{ LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
112 	{ APPLE, 0, FOOD_CLASS, 10, 0 },
113 	{ CARROT, 0, FOOD_CLASS, 10, 0 },
114 	{ 0, 0, 0, 0, 0 }
115 };
116 static struct trobj Monk[] = {
117 #define M_BOOK		2
118 	{ LEATHER_GLOVES, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
119 	{ ROBE, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
120 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
121 	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS },
122 	{ POT_HEALING, 0, POTION_CLASS, 3, UNDEF_BLESS },
123 	{ FOOD_RATION, 0, FOOD_CLASS, 3, 0 },
124 	{ APPLE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
125 	{ ORANGE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
126 	/* Yes, we know fortune cookies aren't really from China.  They were
127 	 * invented by George Jung in Los Angeles, California, USA in 1916.
128 	 */
129 	{ FORTUNE_COOKIE, 0, FOOD_CLASS, 3, UNDEF_BLESS },
130 	{ 0, 0, 0, 0, 0 }
131 };
132 static struct trobj Necromancer[] = {
133 #define N_BOOK          8
134 /* pretty much like Wizard, except with pick-axe instead of magic resist. */
135 	{ QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 },        /* for dealing with ghosts */
136 	{ UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, UNDEF_BLESS },
137 	{ UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, UNDEF_BLESS },
138 	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, UNDEF_BLESS },
139 	{ SPE_SUMMON_UNDEAD, 0, SPBOOK_CLASS, 1, 1 },
140 	{ SPE_COMMAND_UNDEAD, 0, SPBOOK_CLASS, 1, 1 },
141 	{ SPE_DRAIN_LIFE, 0, SPBOOK_CLASS, 1, 1 },
142 		/* WAC -- gave him drain life rather than turn undead */
143 	{ WAN_DRAINING, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
144 		/* KMH -- ...and the matching wand for the inexperienced */
145 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
146 	{ PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
147 	{ 0, 0, 0, 0, 0 }
148 };
149 static struct trobj Priest[] = {
150 #define P_BOOK          7
151 	{ MACE, 0, WEAPON_CLASS, 1, 1 },
152 	{ ROBE, 0, ARMOR_CLASS, 1, 1 },
153 	{ SMALL_SHIELD, 2, ARMOR_CLASS, 1, 1 },
154 	{ POT_WATER, 0, POTION_CLASS, 4, 1 },	/* holy water */
155 	{ CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 1 },
156 	{ SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 1 },
157 	{ SPE_HEALING, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
158 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
159 	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, 1 },
160 	{ 0, 0, 0, 0, 0 }
161 };
162 static struct trobj Ranger[] = {
163 #define RAN_BOW			1
164 #define RAN_TWO_ARROWS	2
165 #define RAN_ZERO_ARROWS	3
166 	{ DAGGER, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
167 	{ BOW, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
168 	{ ARROW, 2, WEAPON_CLASS, 50, UNDEF_BLESS },
169 	{ ARROW, 0, WEAPON_CLASS, 30, UNDEF_BLESS },
170 	{ CLOAK_OF_DISPLACEMENT, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
171 	{ CRAM_RATION, 0, FOOD_CLASS, 4, 0 },
172 	{ 0, 0, 0, 0, 0 }
173 };
174 static struct trobj Rogue[] = {
175 #define R_DAGGERS	1
176 #define R_DARTS         2
177 	{ SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
178 	{ DAGGER, 0, WEAPON_CLASS, 10, 0 },	/* quan is variable */
179 	{ DART, 0, WEAPON_CLASS, 25, UNDEF_BLESS },
180 	{ LEATHER_ARMOR, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
181 	{ POT_SICKNESS, 0, POTION_CLASS, 1, 0 },
182 	{ SCR_GOLD_DETECTION, 0, SCROLL_CLASS, 4, 1 },
183 	{ SCR_TELEPORTATION, 0, SCROLL_CLASS, 4, 1 },
184 	{ LOCK_PICK, 9, TOOL_CLASS, 1, 0 },
185 	{ OILSKIN_SACK, 0, TOOL_CLASS, 1, 0 },
186 	{ 0, 0, 0, 0, 0 }
187 };
188 static struct trobj Samurai[] = {
189 #define S_ARROWS	3
190 	{ KATANA, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
191 	{ SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, /* wakizashi */
192 	{ YUMI, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
193 	{ YA, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, /* variable quan */
194 	{ SPLINT_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
195 	{ 0, 0, 0, 0, 0 }
196 };
197 #ifdef TOURIST
198 static struct trobj Tourist[] = {
199 #define T_DARTS		0
200 	{ DART, 2, WEAPON_CLASS, 25, UNDEF_BLESS },	/* quan is variable */
201 	{ UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 12, 0 },
202 	{ POT_EXTRA_HEALING, 0, POTION_CLASS, 2, UNDEF_BLESS },
203 	{ SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 6, UNDEF_BLESS },
204 	{ HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
205 	{ EXPENSIVE_CAMERA, UNDEF_SPE, TOOL_CLASS, 1, 0 },
206 	{ CREDIT_CARD, 0, TOOL_CLASS, 1, 0 },
207 	{ 0, 0, 0, 0, 0 }
208 };
209 #endif
210 static struct trobj UndeadSlayer[] = {
211 #define U_MINOR 1       /* silver spear or whip [Castlevania] 25/25% */
212                         /* crossbow 50% [Buffy] */
213 #define U_RANGE 2       /* silver daggers or crossbow bolts */
214 #define U_MISC  3       /* +1 boots [Buffy can kick] or helmet */
215 #define U_ARMOR 4       /* Tshirt/leather +1 or chain mail */
216 	{ WOODEN_STAKE, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
217 	{ SILVER_SPEAR, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
218 	{ SILVER_DAGGER, 0, WEAPON_CLASS, 5, UNDEF_BLESS },
219 	{ HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
220 	{ CHAIN_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
221 	{ CLOVE_OF_GARLIC, 0, FOOD_CLASS, 5, 1 },
222 	{ SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 5, 1 },
223 	{ HOLY_WAFER, 0, FOOD_CLASS, 4, 0 },
224 	{ POT_WATER, 0, POTION_CLASS, 4, 1 },        /* holy water */
225 	{ 0, 0, 0, 0, 0 }
226 };
227 static struct trobj Valkyrie[] = {
228 /*        { LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, */
229 	{ SPEAR, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, /* Traditional Weapon - WAC*/
230 	{ DAGGER, 0, WEAPON_CLASS, 5, UNDEF_BLESS },
231 	{ SMALL_SHIELD, 3, ARMOR_CLASS, 1, UNDEF_BLESS },
232 	{ FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
233 	{ 0, 0, 0, 0, 0 }
234 };
235 static struct trobj Wizard[] = {
236 #define W_MULTSTART	2
237 #define W_MULTEND	6
238 #define W_BOOK1         6
239 #define W_BOOK2         7
240 #define W_BOOK3         8
241 #define W_BOOK4         9
242 	{ QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 },
243 	{ CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
244 	{ UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
245 	{ UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, UNDEF_BLESS },
246 	{ UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, UNDEF_BLESS },
247 	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, UNDEF_BLESS },
248 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
249 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
250 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
251 	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
252 	{ 0, 0, 0, 0, 0 }
253 };
254 #ifdef YEOMAN
255 static struct trobj Yeoman[] = {
256 	{ SHORT_SWORD, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
257 	{ PARTISAN, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
258 	{ LEATHER_ARMOR, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
259 	{ HIGH_BOOTS, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
260 	{ LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
261 	{ APPLE, 0, FOOD_CLASS, 10, 0 },
262 	{ CARROT, 0, FOOD_CLASS, 10, 0 },
263 	{ POT_WATER, 0, POTION_CLASS, 3, 0 },
264 	{ FISHING_POLE, 0, TOOL_CLASS, 1, 0 },
265 	{ 0, 0, 0, 0, 0 }
266 };
267 #endif
268 
269 /*
270  *	Optional extra inventory items.
271  */
272 
273 static struct trobj Tinopener[] = {
274 	{ TIN_OPENER, 0, TOOL_CLASS, 1, 0 },
275 	{ 0, 0, 0, 0, 0 }
276 };
277 static struct trobj Magicmarker[] = {
278 	{ MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 0 },
279 	{ 0, 0, 0, 0, 0 }
280 };
281 static struct trobj Lamp[] = {
282 	{ OIL_LAMP, 1, TOOL_CLASS, 1, 0 },
283 	{ 0, 0, 0, 0, 0 }
284 };
285 static struct trobj Torch[] = {
286 	{ TORCH, 0, TOOL_CLASS, 2, 0 },
287 	{ 0, 0, 0, 0, 0 }
288 };
289 static struct trobj Blindfold[] = {
290 	{ BLINDFOLD, 0, TOOL_CLASS, 1, 0 },
291 	{ 0, 0, 0, 0, 0 }
292 };
293 static struct trobj Instrument[] = {
294 	{ WOODEN_FLUTE, 0, TOOL_CLASS, 1, 0 },
295 	{ 0, 0, 0, 0, 0 }
296 };
297 static struct trobj Xtra_food[] = {
298 	{ UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 2, 0 },
299 	{ 0, 0, 0, 0, 0 }
300 };
301 #ifdef TOURIST
302 static struct trobj Leash[] = {
303 	{ LEASH, 0, TOOL_CLASS, 1, 0 },
304 	{ 0, 0, 0, 0, 0 }
305 };
306 static struct trobj Towel[] = {
307 	{ TOWEL, 0, TOOL_CLASS, 1, 0 },
308 	{ 0, 0, 0, 0, 0 }
309 };
310 #endif	/* TOURIST */
311 static struct trobj Wishing[] = {
312 	{ WAN_WISHING, 3, WAND_CLASS, 1, 0 },
313 	{ 0, 0, 0, 0, 0 }
314 };
315 #ifdef GOLDOBJ
316 static struct trobj Money[] = {
317 	{ GOLD_PIECE, 0 , COIN_CLASS, 1, 0 },
318 	{ 0, 0, 0, 0, 0 }
319 };
320 #endif
321 
322 /* race-based substitutions for initial inventory;
323    the weaker cloak for elven rangers is intentional--they shoot better */
324 static struct inv_sub { short race_pm, item_otyp, subs_otyp; } inv_subs[] = {
325     { PM_ELF,	DAGGER,			ELVEN_DAGGER	      },
326     { PM_ELF,	SPEAR,			ELVEN_SPEAR	      },
327     { PM_ELF,	SHORT_SWORD,		ELVEN_SHORT_SWORD     },
328     { PM_ELF,	BOW,			ELVEN_BOW	      },
329     { PM_ELF,	ARROW,			ELVEN_ARROW	      },
330     { PM_ELF,	HELMET,			ELVEN_LEATHER_HELM    },
331  /* { PM_ELF,	SMALL_SHIELD,		ELVEN_SHIELD	      }, */
332     { PM_ELF,	CLOAK_OF_DISPLACEMENT,	ELVEN_CLOAK	      },
333     { PM_ELF,	CRAM_RATION,		LEMBAS_WAFER	      },
334     { PM_ORC,	DAGGER,			ORCISH_DAGGER	      },
335     { PM_ORC,	SPEAR,			ORCISH_SPEAR	      },
336     { PM_ORC,	SHORT_SWORD,		ORCISH_SHORT_SWORD    },
337     { PM_ORC,	BOW,			ORCISH_BOW	      },
338     { PM_ORC,	ARROW,			ORCISH_ARROW	      },
339     { PM_ORC,	HELMET,			ORCISH_HELM	      },
340     { PM_ORC,	SMALL_SHIELD,		ORCISH_SHIELD	      },
341     { PM_ORC,	RING_MAIL,		ORCISH_RING_MAIL      },
342     { PM_ORC,	CHAIN_MAIL,		ORCISH_CHAIN_MAIL     },
343     { PM_DWARF, SPEAR,			DWARVISH_SPEAR	      },
344     { PM_DWARF, SHORT_SWORD,		DWARVISH_SHORT_SWORD  },
345     { PM_DWARF, HELMET,			DWARVISH_IRON_HELM    },
346  /* { PM_DWARF, SMALL_SHIELD,		DWARVISH_ROUNDSHIELD  }, */
347  /* { PM_DWARF, PICK_AXE,		DWARVISH_MATTOCK      }, */
348     { PM_GNOME, BOW,			CROSSBOW	      },
349     { PM_GNOME, ARROW,			CROSSBOW_BOLT	      },
350     { PM_HUMAN_WEREWOLF,FOOD_RATION,		TRIPE_RATION	      },
351     { PM_HUMAN_WEREWOLF,SILVER_SPEAR,		SPEAR		      },
352     { PM_HUMAN_WEREWOLF,SILVER_DAGGER,		DAGGER		      },
353 #ifdef FIREARMS
354     { PM_HUMAN_WEREWOLF,SILVER_BULLET,		BULLET		      },
355 #endif
356     { PM_DROW,		DAGGER,			DARK_ELVEN_DAGGER     },
357     { PM_DROW,		SHORT_SWORD,		DARK_ELVEN_SHORT_SWORD},
358     { PM_DROW,		BOW,			DARK_ELVEN_BOW	      },
359     { PM_DROW,		ARROW,			DARK_ELVEN_ARROW      },
360     { PM_VAMPIRE,	POT_FRUIT_JUICE,	POT_BLOOD	      },
361     { PM_VAMPIRE,	FOOD_RATION,		POT_VAMPIRE_BLOOD     },
362     { NON_PM,	STRANGE_OBJECT,		STRANGE_OBJECT	      }
363 };
364 
365 /* align-based substitutions for initial inventory */
366 struct inv_asub { aligntyp align; short item_otyp, subs_otyp; };
367 static struct inv_asub inv_asubs[] = {
368     { A_CHAOTIC,	HOLY_WAFER,		LEMBAS_WAFER	      },
369     { A_NONE,		STRANGE_OBJECT,		STRANGE_OBJECT	      }
370 };
371 
372 /* KMH -- Expectations for skills.
373  *	1.	Starting equipment will start as basic, and should have a maximum
374  *		of at least skilled.  If you enter the dungeon with it, you should
375  *		know how to use it.  See weapon.c, skill_init().
376  *	2.	First and second artifact gifts should have a maximum of at least
377  *		skilled.  See artifact.c, init_artifacts().
378  *	3.	Quest artifacts should have a maximum of expert.  See artifact.c,
379  *		init_artifacts().
380  *	4.	Races that construct weapons (elf, dwarf, orc) should have
381  *		a maximum of expert in those weapons.
382  *	5.	Spellcasters should get a maximum of at least basic in all spell
383  *		categories.
384  */
385 
386 static const struct def_skill Skill_A[] = {
387     { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_BASIC },
388     { P_PICK_AXE, P_EXPERT },		{ P_SHORT_SWORD, P_BASIC },
389     { P_SCIMITAR, P_SKILLED },		{ P_SABER, P_EXPERT },
390     { P_CLUB, P_SKILLED },              { P_PADDLE, P_BASIC },
391     { P_QUARTERSTAFF, P_SKILLED },
392 #ifdef FIREARMS
393     { P_FIREARM, P_SKILLED },
394 #endif
395     { P_SLING, P_SKILLED },		{ P_DART, P_BASIC },
396     { P_BOOMERANG, P_EXPERT },		{ P_WHIP, P_EXPERT },
397     { P_UNICORN_HORN, P_SKILLED },
398     { P_ATTACK_SPELL, P_BASIC },	{ P_HEALING_SPELL, P_BASIC },
399     { P_DIVINATION_SPELL, P_EXPERT },   { P_ENCHANTMENT_SPELL, P_BASIC },
400     { P_PROTECTION_SPELL, P_BASIC },    { P_BODY_SPELL, P_BASIC },
401     { P_MATTER_SPELL, P_SKILLED },
402     /*WAC- 'A' knows of all spells from studying,  but only really good
403     at divination class*/
404     { P_TWO_WEAPON_COMBAT, P_BASIC },
405     { P_BARE_HANDED_COMBAT, P_EXPERT },
406     { P_NONE, 0 }
407 };
408 
409 static const struct def_skill Skill_B[] = {
410     { P_DAGGER, P_BASIC },		{ P_AXE, P_EXPERT },
411     { P_PICK_AXE, P_SKILLED },	{ P_SHORT_SWORD, P_EXPERT },
412     { P_BROAD_SWORD, P_SKILLED },	{ P_LONG_SWORD, P_SKILLED },
413     { P_TWO_HANDED_SWORD, P_EXPERT },	{ P_SCIMITAR, P_SKILLED },
414     { P_SABER, P_BASIC },		{ P_CLUB, P_SKILLED },
415     { P_PADDLE, P_SKILLED },
416     { P_MACE, P_SKILLED },		{ P_MORNING_STAR, P_SKILLED },
417     { P_FLAIL, P_BASIC },		{ P_HAMMER, P_EXPERT },
418     { P_QUARTERSTAFF, P_BASIC },	{ P_SPEAR, P_SKILLED },
419     { P_TRIDENT, P_SKILLED },		{ P_BOW, P_BASIC },
420     { P_ATTACK_SPELL, P_SKILLED },	{ P_BODY_SPELL, P_SKILLED },
421 /*WAC - 'B' is good at attack spells and body manipulation spells
422         -both combat oriented */
423 #ifdef STEED
424     { P_RIDING, P_BASIC },
425 #endif
426     { P_TWO_WEAPON_COMBAT, P_BASIC },
427     { P_BARE_HANDED_COMBAT, P_MASTER },
428     { P_NONE, 0 }
429 };
430 
431 static const struct def_skill Skill_C[] = {
432     { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_SKILLED },
433     { P_AXE, P_SKILLED },		{ P_PICK_AXE, P_BASIC },
434     { P_CLUB, P_EXPERT },               { P_PADDLE, P_EXPERT },
435     { P_MACE, P_EXPERT },
436     { P_MORNING_STAR, P_BASIC },	{ P_FLAIL, P_SKILLED },
437     { P_HAMMER, P_SKILLED },		{ P_QUARTERSTAFF, P_EXPERT },
438     { P_POLEARMS, P_SKILLED },		{ P_SPEAR, P_EXPERT },
439     { P_JAVELIN, P_SKILLED },		{ P_TRIDENT, P_SKILLED },
440     { P_BOW, P_EXPERT },                { P_SLING, P_SKILLED },
441     { P_BOOMERANG, P_EXPERT },		{ P_UNICORN_HORN, P_BASIC },
442     { P_MATTER_SPELL, P_SKILLED },      { P_ENCHANTMENT_SPELL, P_BASIC },
443 
444 /*WAC - 'C' is at one with the elements - matter spells, as well as
445         basic enchantments - removed attack spell basic skill as
446         it is now "dark" spells*/
447     { P_BARE_HANDED_COMBAT, P_MASTER },
448     { P_NONE, 0 }
449 };
450 
451 static const struct def_skill Skill_F[] = {
452 /*Style: small-med edged weapons, blunt weapons*/
453     { P_DAGGER, P_EXPERT },             { P_KNIFE,  P_SKILLED },
454     { P_AXE, P_BASIC },                 /*{ P_PICK_AXE, P_BASIC },*/
455     { P_SHORT_SWORD, P_EXPERT },        /*{ P_BROAD_SWORD, P_BASIC },*/
456     { P_LONG_SWORD, P_SKILLED },        /*{ P_TWO_HANDED_SWORD, P_BASIC },*/
457     { P_SCIMITAR, P_SKILLED },          { P_SABER, P_SKILLED },
458     { P_PADDLE, P_BASIC },
459     { P_MACE, P_BASIC },                /*{ P_MORNING_STAR, P_BASIC },
460     { P_FLAIL, P_BASIC },*/               { P_HAMMER, P_BASIC },
461     { P_QUARTERSTAFF, P_SKILLED },       /* { P_POLEARMS, P_BASIC },*/
462 /* Relies on spells for ranged attack
463     { P_SPEAR, P_BASIC },               { P_JAVELIN, P_BASIC },
464     { P_TRIDENT, P_BASIC },             { P_LANCE, P_BASIC },
465     { P_BOW, P_BASIC },                 { P_SLING, P_BASIC },
466     { P_CROSSBOW, P_BASIC },            { P_DART, P_EXPERT },
467     { P_SHURIKEN, P_BASIC },            { P_BOOMERANG, P_BASIC },
468 */
469     { P_WHIP, P_BASIC },                { P_UNICORN_HORN, P_SKILLED },
470 
471     { P_ATTACK_SPELL, P_SKILLED },      { P_HEALING_SPELL, P_BASIC },
472     { P_DIVINATION_SPELL, P_EXPERT },   { P_ENCHANTMENT_SPELL, P_BASIC },
473     { P_PROTECTION_SPELL, P_BASIC },    { P_BODY_SPELL, P_SKILLED },
474     { P_MATTER_SPELL, P_EXPERT },
475 /*  Added expert matter spell (elements), skilled in attack, basic in rest
476         He is a mage,  so knows the types.*/
477 #ifdef STEED
478     { P_RIDING, P_SKILLED },
479 #endif
480     { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_SKILLED },
481     { P_NONE, 0 }
482 };
483 
484 static const struct def_skill Skill_H[] = {
485     { P_DAGGER, P_SKILLED },		{ P_KNIFE, P_EXPERT },
486     { P_SHORT_SWORD, P_SKILLED },	{ P_SCIMITAR, P_BASIC },
487     { P_SABER, P_BASIC },		{ P_CLUB, P_SKILLED },
488     { P_PADDLE, P_SKILLED },
489     { P_MACE, P_BASIC },		{ P_QUARTERSTAFF, P_EXPERT },
490     { P_POLEARMS, P_BASIC },		{ P_SPEAR, P_BASIC },
491     { P_JAVELIN, P_BASIC },		{ P_TRIDENT, P_BASIC },
492     { P_SLING, P_SKILLED },		{ P_DART, P_EXPERT },
493     { P_SHURIKEN, P_SKILLED },		{ P_UNICORN_HORN, P_EXPERT },
494 
495     { P_ATTACK_SPELL, P_BASIC },        { P_HEALING_SPELL, P_EXPERT },
496     { P_DIVINATION_SPELL, P_BASIC },    { P_ENCHANTMENT_SPELL, P_BASIC },
497     { P_PROTECTION_SPELL, P_BASIC },    { P_BODY_SPELL, P_BASIC },
498     { P_MATTER_SPELL, P_BASIC },
499 #ifdef STEED
500     { P_RIDING, P_BASIC },
501 #endif
502     { P_BARE_HANDED_COMBAT, P_BASIC },
503     { P_NONE, 0 }
504 };
505 
506 static const struct def_skill Skill_I[] = {
507 /*Resorts mostly to stabbing weapons*/
508     { P_DAGGER, P_EXPERT },             { P_KNIFE,  P_SKILLED },
509 /*  { P_AXE, P_BASIC },                 { P_PICK_AXE, P_BASIC },
510     { P_SHORT_SWORD, P_EXPERT },        { P_BROAD_SWORD, P_BASIC },*/
511     { P_LONG_SWORD, P_SKILLED },      /*{ P_TWO_HANDED_SWORD, P_BASIC },
512     { P_SCIMITAR, P_SKILLED },          { P_SABER, P_SKILLED },
513     { P_MACE, P_BASIC },                { P_MORNING_STAR, P_BASIC },
514     { P_FLAIL, P_BASIC },               { P_HAMMER, P_BASIC },*/
515     { P_QUARTERSTAFF, P_SKILLED },      { P_POLEARMS, P_BASIC },
516     { P_SPEAR, P_BASIC },               { P_JAVELIN, P_BASIC },
517     { P_TRIDENT, P_BASIC },             { P_LANCE, P_BASIC },
518 /*  { P_BOW, P_BASIC },                 { P_SLING, P_BASIC },
519     { P_CROSSBOW, P_BASIC },            { P_DART, P_EXPERT },
520     { P_SHURIKEN, P_BASIC },            { P_BOOMERANG, P_BASIC },*/
521     { P_WHIP, P_BASIC },                { P_UNICORN_HORN, P_SKILLED },
522 
523     { P_ATTACK_SPELL, P_BASIC },        { P_HEALING_SPELL, P_SKILLED },
524     { P_DIVINATION_SPELL, P_BASIC },    { P_ENCHANTMENT_SPELL, P_EXPERT },
525     { P_PROTECTION_SPELL, P_SKILLED },  { P_BODY_SPELL, P_BASIC },
526     { P_MATTER_SPELL, P_EXPERT },
527     /*WAC - same as Flame Mage*/
528 #ifdef STEED
529     { P_RIDING, P_SKILLED },
530 #endif
531     { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_SKILLED },
532     { P_NONE, 0 }
533 };
534 
535 static const struct def_skill Skill_K[] = {
536     { P_DAGGER, P_BASIC },		{ P_KNIFE, P_BASIC },
537     { P_AXE, P_SKILLED },		{ P_PICK_AXE, P_BASIC },
538     { P_SHORT_SWORD, P_SKILLED },	{ P_BROAD_SWORD, P_SKILLED },
539     { P_LONG_SWORD, P_EXPERT },	{ P_TWO_HANDED_SWORD, P_SKILLED },
540     { P_SCIMITAR, P_BASIC },		{ P_SABER, P_SKILLED },
541     { P_CLUB, P_BASIC },                { P_PADDLE, P_BASIC },
542     { P_MACE, P_SKILLED },
543     { P_MORNING_STAR, P_SKILLED },	{ P_FLAIL, P_BASIC },
544     { P_HAMMER, P_BASIC },		{ P_POLEARMS, P_SKILLED },
545     { P_SPEAR, P_SKILLED },		{ P_JAVELIN, P_SKILLED },
546     { P_TRIDENT, P_BASIC },		{ P_LANCE, P_EXPERT },
547     { P_BOW, P_BASIC },			{ P_CROSSBOW, P_SKILLED },
548     { P_HEALING_SPELL, P_SKILLED },
549     { P_PROTECTION_SPELL, P_SKILLED },      { P_BODY_SPELL, P_BASIC },
550 /*WAC - removed the attack spells - no good having knights summoning
551         undead!  Replaced with skilled body spells*/
552 
553 #ifdef STEED
554     { P_RIDING, P_EXPERT },
555 #endif
556     { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_EXPERT },
557     { P_NONE, 0 }
558 };
559 
560 static const struct def_skill Skill_Mon[] = {
561     { P_PADDLE, P_SKILLED },
562     { P_QUARTERSTAFF, P_SKILLED },	{ P_SPEAR, P_BASIC },
563     { P_JAVELIN, P_BASIC },		{ P_BOW, P_BASIC },
564     { P_SHURIKEN, P_BASIC },            { P_MARTIAL_ARTS, P_GRAND_MASTER },
565 
566     { P_ATTACK_SPELL, P_BASIC },    { P_HEALING_SPELL, P_EXPERT },
567     { P_DIVINATION_SPELL, P_BASIC },	{ P_ENCHANTMENT_SPELL, P_SKILLED },
568     { P_PROTECTION_SPELL, P_EXPERT },	{ P_BODY_SPELL, P_BASIC },
569     { P_MATTER_SPELL, P_BASIC },
570 /*WAC - monks are good healers - expert healing - and expert protect*/
571     { P_NONE, 0 }
572 };
573 
574 static const struct def_skill Skill_N[] = {
575     { P_DAGGER, P_EXPERT },             { P_KNIFE,  P_SKILLED },
576     { P_AXE, P_SKILLED },               { P_PICK_AXE, P_SKILLED },
577     { P_CLUB, P_SKILLED },              { P_MACE, P_BASIC },
578     { P_QUARTERSTAFF, P_EXPERT },       { P_POLEARMS, P_SKILLED },
579     { P_SPEAR, P_BASIC },               { P_JAVELIN, P_BASIC },
580     { P_TRIDENT, P_BASIC },             { P_SLING, P_SKILLED },
581     { P_DART, P_EXPERT },               { P_SHURIKEN, P_BASIC },
582 
583     { P_ATTACK_SPELL, P_EXPERT },
584     { P_MATTER_SPELL, P_EXPERT },
585 /*WAC-  expert of dark arts - attack spells,  skilled in matter
586         -for fireball and cone of cold*/
587     { P_BARE_HANDED_COMBAT, P_BASIC },
588     { P_NONE, 0 }
589 };
590 
591 static struct def_skill Skill_P[] = {
592 	/* KMH -- Long sword for Sunsword */
593 	{ P_LONG_SWORD, P_SKILLED },
594     { P_CLUB, P_EXPERT },               { P_PADDLE, P_EXPERT },
595     { P_MACE, P_EXPERT },
596     { P_MORNING_STAR, P_EXPERT },	{ P_FLAIL, P_EXPERT },
597     { P_HAMMER, P_EXPERT },		{ P_QUARTERSTAFF, P_EXPERT },
598     { P_POLEARMS, P_SKILLED },		{ P_SPEAR, P_SKILLED },
599     { P_JAVELIN, P_SKILLED },		{ P_TRIDENT, P_SKILLED },
600     { P_LANCE, P_BASIC },		{ P_BOW, P_BASIC },
601     { P_SLING, P_BASIC },		{ P_CROSSBOW, P_BASIC },
602     { P_DART, P_BASIC },		{ P_SHURIKEN, P_BASIC },
603     { P_BOOMERANG, P_BASIC },		{ P_UNICORN_HORN, P_SKILLED },
604 
605     /* [ALI] Depending on the spellbook which priests enter the dungeon with,
606      * one of the maximum skill levels listed here will be raised by one.
607      */
608     { P_ATTACK_SPELL, P_BASIC },        { P_HEALING_SPELL, P_EXPERT },
609     { P_DIVINATION_SPELL, P_EXPERT },   { P_ENCHANTMENT_SPELL, P_BASIC },
610     { P_PROTECTION_SPELL, P_SKILLED },  { P_BODY_SPELL, P_BASIC },
611     { P_MATTER_SPELL, P_BASIC },
612 
613     { P_BARE_HANDED_COMBAT, P_BASIC },  /* the monk is added in slash */
614     { P_NONE, 0 }
615 };
616 
617 static const struct def_skill Skill_R[] = {
618     { P_DAGGER, P_EXPERT },		{ P_KNIFE,  P_EXPERT },
619     { P_SHORT_SWORD, P_EXPERT },	{ P_BROAD_SWORD, P_SKILLED },
620     { P_LONG_SWORD, P_SKILLED },	{ P_TWO_HANDED_SWORD, P_BASIC },
621     { P_SCIMITAR, P_SKILLED },		{ P_SABER, P_SKILLED },
622     { P_CLUB, P_SKILLED },              { P_PADDLE, P_SKILLED },
623     { P_MACE, P_SKILLED },              { P_MORNING_STAR, P_BASIC },
624     { P_FLAIL, P_BASIC },               { P_HAMMER, P_BASIC },
625     { P_POLEARMS, P_BASIC },            { P_SPEAR, P_BASIC },
626 #ifdef FIREARMS
627     { P_FIREARM, P_EXPERT },
628 #endif
629     { P_CROSSBOW, P_EXPERT },
630     { P_DART, P_EXPERT },		{ P_SHURIKEN, P_SKILLED },
631     { P_DIVINATION_SPELL, P_SKILLED },        { P_BODY_SPELL, P_SKILLED },
632     { P_MATTER_SPELL, P_SKILLED },
633 /*WAC Left as is*/
634 #ifdef STEED
635     { P_RIDING, P_BASIC },
636 #endif
637     { P_TWO_WEAPON_COMBAT, P_EXPERT },  { P_BARE_HANDED_COMBAT, P_EXPERT },
638     { P_NONE, 0 }
639 };
640 
641 static const struct def_skill Skill_Ran[] = {
642     { P_DAGGER, P_EXPERT },		 { P_KNIFE,  P_SKILLED },
643     { P_AXE, P_SKILLED },	 { P_PICK_AXE, P_BASIC },
644     { P_SHORT_SWORD, P_BASIC },	 { P_MORNING_STAR, P_BASIC },
645     { P_FLAIL, P_SKILLED },	 { P_HAMMER, P_BASIC },
646     { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED },
647     { P_SPEAR, P_SKILLED },	 { P_JAVELIN, P_EXPERT },
648     { P_TRIDENT, P_BASIC },	 { P_BOW, P_EXPERT },
649     { P_SLING, P_EXPERT },	 { P_CROSSBOW, P_EXPERT },
650     { P_DART, P_EXPERT },	 { P_SHURIKEN, P_SKILLED },
651     { P_BOOMERANG, P_EXPERT },	 { P_WHIP, P_BASIC },
652     { P_HEALING_SPELL, P_BASIC },
653     { P_DIVINATION_SPELL, P_EXPERT },
654     { P_BODY_SPELL, P_BASIC },
655 #ifdef STEED
656     { P_RIDING, P_BASIC },
657 #endif
658     { P_BARE_HANDED_COMBAT, P_BASIC },
659     { P_NONE, 0 }
660 };
661 
662 static const struct def_skill Skill_S[] = {
663     { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_SKILLED },
664     { P_SHORT_SWORD, P_EXPERT },	{ P_BROAD_SWORD, P_SKILLED },
665     { P_LONG_SWORD, P_EXPERT },		{ P_TWO_HANDED_SWORD, P_EXPERT },
666     { P_SCIMITAR, P_BASIC },		{ P_SABER, P_BASIC },
667     { P_PADDLE, P_BASIC },
668     { P_FLAIL, P_SKILLED },		{ P_QUARTERSTAFF, P_BASIC },
669     { P_POLEARMS, P_SKILLED },		{ P_SPEAR, P_BASIC },
670     { P_JAVELIN, P_BASIC },		{ P_LANCE, P_SKILLED },
671     { P_BOW, P_EXPERT },		{ P_SHURIKEN, P_EXPERT },
672     { P_PROTECTION_SPELL, P_SKILLED },      { P_BODY_SPELL, P_BASIC },
673 
674 /* WAC - removed the attack spells, replace with body.  clairvoyance, meditate*/
675 #ifdef STEED
676     { P_RIDING, P_SKILLED },
677 #endif
678     { P_TWO_WEAPON_COMBAT, P_EXPERT },
679     { P_MARTIAL_ARTS, P_MASTER },
680     { P_NONE, 0 }
681 };
682 
683 #ifdef TOURIST
684 static const struct def_skill Skill_T[] = {
685     { P_DAGGER, P_EXPERT },		{ P_KNIFE,  P_SKILLED },
686     { P_AXE, P_BASIC },			{ P_PICK_AXE, P_BASIC },
687     { P_SHORT_SWORD, P_EXPERT },	{ P_BROAD_SWORD, P_BASIC },
688     { P_LONG_SWORD, P_BASIC },		{ P_TWO_HANDED_SWORD, P_BASIC },
689     { P_SCIMITAR, P_SKILLED },		{ P_SABER, P_SKILLED },
690     { P_PADDLE, P_BASIC },
691     { P_MACE, P_BASIC },		{ P_MORNING_STAR, P_BASIC },
692     { P_FLAIL, P_BASIC },		{ P_HAMMER, P_BASIC },
693     { P_QUARTERSTAFF, P_BASIC },	{ P_POLEARMS, P_BASIC },
694     { P_SPEAR, P_BASIC },		{ P_JAVELIN, P_BASIC },
695     { P_TRIDENT, P_BASIC },		{ P_LANCE, P_BASIC },
696     { P_BOW, P_BASIC },			{ P_SLING, P_BASIC },
697 #ifdef FIREARMS
698     { P_FIREARM, P_BASIC },
699 #endif
700     { P_CROSSBOW, P_BASIC },		{ P_DART, P_EXPERT },
701     { P_SHURIKEN, P_BASIC },		{ P_BOOMERANG, P_BASIC },
702     { P_WHIP, P_BASIC },		{ P_UNICORN_HORN, P_SKILLED },
703     { P_DIVINATION_SPELL, P_BASIC },	{ P_ENCHANTMENT_SPELL, P_BASIC },
704     { P_BODY_SPELL, P_SKILLED },
705 /*WAC left alone*/
706 #ifdef STEED
707     { P_RIDING, P_BASIC },
708 #endif
709     { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_SKILLED },
710     { P_NONE, 0 }
711 };
712 #endif /* TOURIST */
713 
714 static const struct def_skill Skill_U[] = {
715 /*WAC
716  * -made dagger skill expert too,  since it's a starting weapon
717  * -made spear skill Expert rather than Skilled
718  *      Slayer artifact is a spear,  after all
719  * -made crossbow skill Expert - Dracula movies
720  * -changed bare handed basic to martial arts master-Buffy the Vampire Slayer
721  * -Added whip Expert - Castlevania
722  * -made club, flail, mace, morning star, hammer, quarterstaff Skilled
723         from Expert to balance
724  * -removed Trident skill - from Skilled to Restricted
725  * -removed Lance skill - from Basic to Restricted
726  */
727     { P_DAGGER, P_EXPERT },             { P_LONG_SWORD, P_SKILLED },
728     { P_CLUB, P_SKILLED },              { P_PADDLE, P_SKILLED },
729     { P_MACE, P_SKILLED },              { P_MORNING_STAR, P_SKILLED },
730     { P_FLAIL, P_SKILLED },             { P_HAMMER, P_SKILLED },
731     { P_QUARTERSTAFF, P_SKILLED },      { P_POLEARMS, P_SKILLED },
732     { P_SPEAR, P_EXPERT },              { P_JAVELIN, P_SKILLED },
733     { P_BOW, P_BASIC },			        { P_SLING, P_BASIC },
734 #ifdef FIREARMS
735     { P_FIREARM, P_EXPERT },
736 #endif
737     { P_CROSSBOW, P_EXPERT },           { P_DART, P_BASIC },
738     { P_SHURIKEN, P_BASIC },		{ P_BOOMERANG, P_BASIC },
739     { P_WHIP, P_EXPERT },               { P_UNICORN_HORN, P_SKILLED },
740 
741     { P_PROTECTION_SPELL, P_SKILLED },    { P_BODY_SPELL, P_SKILLED },
742     { P_MATTER_SPELL, P_BASIC },
743 /*WAC - added PROTECTION spells,  body spells as skilled, basic
744         matter spells - for the fire vs undead*/
745     { P_BARE_HANDED_COMBAT, P_GRAND_MASTER },    { P_NONE, 0 }
746 };
747 
748 static const struct def_skill Skill_V[] = {
749     { P_DAGGER, P_EXPERT },		{ P_AXE, P_EXPERT },
750     { P_PICK_AXE, P_SKILLED },		{ P_SHORT_SWORD, P_SKILLED },
751     { P_BROAD_SWORD, P_SKILLED },	{ P_LONG_SWORD, P_EXPERT },
752     { P_TWO_HANDED_SWORD, P_EXPERT },	{ P_SCIMITAR, P_BASIC },
753     { P_SABER, P_BASIC },		{ P_HAMMER, P_EXPERT },
754     { P_QUARTERSTAFF, P_BASIC },	{ P_POLEARMS, P_SKILLED },
755     { P_SPEAR, P_SKILLED },		{ P_JAVELIN, P_BASIC },
756     { P_TRIDENT, P_BASIC },		{ P_LANCE, P_SKILLED },
757     { P_SLING, P_BASIC },
758     { P_BODY_SPELL, P_BASIC },          { P_MATTER_SPELL, P_EXPERT },
759 /*  replace attack spell with matter spell - cone of cold, lightning
760  *  Boosted to Expert
761  */
762 #ifdef STEED
763     { P_RIDING, P_SKILLED },
764 #endif
765     { P_TWO_WEAPON_COMBAT, P_SKILLED },
766     { P_BARE_HANDED_COMBAT, P_EXPERT },
767     { P_NONE, 0 }
768 };
769 
770 static const struct def_skill Skill_W[] = {
771     { P_DAGGER, P_EXPERT },		{ P_KNIFE,  P_SKILLED },
772     { P_AXE, P_SKILLED },		{ P_SHORT_SWORD, P_BASIC },
773     { P_CLUB, P_SKILLED },              { P_PADDLE, P_BASIC },
774     { P_MACE, P_BASIC },
775     { P_QUARTERSTAFF, P_EXPERT },	{ P_POLEARMS, P_SKILLED },
776     { P_SPEAR, P_BASIC },		{ P_JAVELIN, P_BASIC },
777     { P_TRIDENT, P_BASIC },		{ P_SLING, P_SKILLED },
778     { P_DART, P_EXPERT },		{ P_SHURIKEN, P_BASIC },
779 
780     { P_ATTACK_SPELL, P_EXPERT },	{ P_HEALING_SPELL, P_SKILLED },
781     { P_DIVINATION_SPELL, P_SKILLED },  { P_ENCHANTMENT_SPELL, P_SKILLED },
782     { P_PROTECTION_SPELL, P_SKILLED },  { P_BODY_SPELL, P_SKILLED },
783     { P_MATTER_SPELL, P_SKILLED },
784 /*      added matter spell skilled,  as fireball and cone of cold are
785         matter spells, but now specialty of F/I Mages*/
786 #ifdef STEED
787     { P_RIDING, P_BASIC },
788 #endif
789     { P_BARE_HANDED_COMBAT, P_BASIC },
790     { P_NONE, 0 }
791 };
792 
793 #ifdef YEOMAN
794 static const struct def_skill Skill_Y[] = {
795     { P_DAGGER, P_SKILLED },            { P_KNIFE, P_BASIC },
796     { P_AXE, P_SKILLED },               { P_SHORT_SWORD, P_EXPERT },
797     { P_BROAD_SWORD, P_BASIC },         { P_LONG_SWORD, P_SKILLED },
798     { P_SABER, P_SKILLED },             { P_PADDLE, P_SKILLED },
799     { P_HAMMER, P_BASIC },              { P_QUARTERSTAFF, P_SKILLED },
800     { P_POLEARMS, P_EXPERT },           { P_SPEAR, P_BASIC },
801     { P_JAVELIN, P_SKILLED },           { P_TRIDENT, P_SKILLED },
802     { P_LANCE, P_SKILLED },             { P_BOW, P_EXPERT },
803     { P_SLING, P_BASIC },
804 #ifdef FIREARMS
805     { P_FIREARM, P_SKILLED },
806 #endif
807     { P_CROSSBOW, P_SKILLED },          { P_DART, P_BASIC },
808     { P_WHIP, P_BASIC },                { P_UNICORN_HORN, P_BASIC },
809 
810     { P_ENCHANTMENT_SPELL, P_SKILLED }, { P_PROTECTION_SPELL, P_SKILLED },
811     { P_BODY_SPELL, P_BASIC },
812 #ifdef STEED
813     { P_RIDING, P_EXPERT },
814 #endif
815     { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_SKILLED },
816     { P_NONE, 0 }
817 };
818 #endif
819 
820 
821 STATIC_OVL void
knows_object(obj)822 knows_object(obj)
823 register int obj;
824 {
825 	discover_object(obj,TRUE,FALSE);
826 	objects[obj].oc_pre_discovered = 1;	/* not a "discovery" */
827 }
828 
829 /* Know ordinary (non-magical) objects of a certain class,
830  * like all gems except the loadstone and luckstone.
831  */
832 STATIC_OVL void
knows_class(sym)833 knows_class(sym)
834 register char sym;
835 {
836 	register int ct;
837 	for (ct = 1; ct < NUM_OBJECTS; ct++)
838 		if (objects[ct].oc_class == sym && !objects[ct].oc_magic)
839 			knows_object(ct);
840 }
841 
842 /* [ALI] Raise one spell skill by one level. Priorities:
843  * - The skill for the chosen spellbook if not already expert.
844  * - A skill currently at skilled level.
845  * - A skill currently at basic level.
846  * Where more than one skill is possible at a priority level, choose one
847  * at random.
848  *
849  * The idea is that where a role may be given spellbooks in which the
850  * role is normally at basic level, then the Skill array can be tweaked
851  * to reduce one skill from expert to skilled. After choosing the
852  * spellbook we can then dynamically raise one skill which will either be
853  * the one for the spellbook if that is currently basic (and so avoid the
854  * warning message from skill_init) or raise the tweaked skill to expert.
855  *
856  * Currently only used by priests.
857  */
858 
859 static void
spellbook_skill_raise(class_skill,spellbook)860 spellbook_skill_raise(class_skill, spellbook)
861 register struct def_skill *class_skill;
862 int spellbook;
863 {
864     register int i, j;
865     j = spell_skilltype(spellbook);
866     for(i = 0; class_skill[i].skill != P_NONE; i++)
867 	if (class_skill[i].skill == j)
868 	    break;
869     if (class_skill[i].skill == P_NONE)
870 	pline("Warning: No entry for %s in Skill array.",
871 	  obj_typename(spellbook));
872     else if (class_skill[i].skmax < P_EXPERT)
873 	class_skill[i].skmax++;
874     else
875     {
876 	j = 0;
877 	for(i = 0; class_skill[i].skill != P_NONE; i++) {
878 	    if (class_skill[i].skill >= P_FIRST_SPELL &&
879 	      class_skill[i].skill <= P_LAST_SPELL &&
880 	      class_skill[i].skmax == P_SKILLED)
881 		j++;
882 	}
883 	if (j) {
884 	    j = rn2(j);
885 	    for(i = 0; class_skill[i].skill != P_NONE; i++) {
886 		if (class_skill[i].skill >= P_FIRST_SPELL &&
887 		  class_skill[i].skill <= P_LAST_SPELL &&
888 		  class_skill[i].skmax == P_SKILLED)
889 		    if (!j--) {
890 			class_skill[i].skmax++;
891 			break;
892 		    }
893 	    }
894 	}
895 	else {
896 	    for(i = 0; class_skill[i].skill != P_NONE; i++) {
897 		if (class_skill[i].skill >= P_FIRST_SPELL &&
898 		  class_skill[i].skill <= P_LAST_SPELL &&
899 		  class_skill[i].skmax >= P_BASIC &&
900 		  class_skill[i].skmax < P_EXPERT)
901 		    j++;
902 	    }
903 	    if (j) {
904 		j = rn2(j);
905 		for(i = 0; class_skill[i].skill != P_NONE; i++) {
906 		    if (class_skill[i].skill >= P_FIRST_SPELL &&
907 		      class_skill[i].skill <= P_LAST_SPELL &&
908 		      class_skill[i].skmax >= P_BASIC &&
909 		      class_skill[i].skmax < P_EXPERT)
910 			if (!j--) {
911 			    class_skill[i].skmax++;
912 			    break;
913 			}
914 		}
915 	    }
916 	}
917     }
918 }
919 
920 void
u_init()921 u_init()
922 {
923 	register int i, temp;
924 	int no_extra_food = FALSE;
925 
926 	flags.female = flags.initgend;
927 	flags.beginner = 1;
928 
929 	/* WAC -- Clear Tech List since adjabil will init the 1st level techs*/
930 	for (i = 0; i <= MAXTECH; i++) tech_list[i].t_id = NO_TECH;
931 
932 	/* Initialize spells */
933 	for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
934 
935 	/* Initialize the "u" structure.
936 	 * Note that some values may have been incorrectly set by a failed restore.
937 	 */
938 	(void) memset((genericptr_t)&u, 0, sizeof(u));
939 	setustuck((struct monst *)0);
940 #if 0	/* documentation of more zero values as desirable */
941 	u.usick_cause[0] = 0;
942 	u.uluck  = u.moreluck = 0;
943 # ifdef TOURIST
944 	uarmu = 0;
945 # endif
946 	uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0;
947 	uwep = uball = uchain = uleft = uright = 0;
948 	/* WAC Added uswapwep, uquiver*/
949 	uswapwep = uquiver = 0;
950 	/* KMH -- added two-weapon combat */
951 	u.twoweap = 0;
952 	u.ublessed = 0;				/* not worthy yet */
953 	u.ugangr   = 0;				/* gods not angry */
954 	u.ugifts   = 0;				/* no divine gifts bestowed */
955 	/* WAC not needed - use techs */
956 /*	u.unextuse = 0;
957 	u.ulastuse = 0;*/
958 # ifdef ELBERETH
959 	u.uevent.uhand_of_elbereth = 0;
960 # endif
961 	u.uevent.uheard_tune = 0;
962 	u.uevent.uopened_dbridge = 0;
963 	u.uevent.udemigod = 0;		/* not a demi-god yet... */
964 	u.udg_cnt = 0;
965 	u.mh = u.mhmax = Upolyd = 0;
966 	u.uz.dnum = u.uz0.dnum = 0;
967 	u.utotype = 0;
968 #endif	/* 0 */
969 
970 	u.uz.dlevel = 1;
971 	u.uz0.dlevel = 0;
972 	u.utolev = u.uz;
973 
974 	u.umoved = FALSE;
975 	u.umortality = 0;
976 	u.ugrave_arise = NON_PM;
977 
978 	u.umonnum = u.umonster = (flags.female &&
979 			urole.femalenum != NON_PM) ? urole.femalenum :
980 			urole.malenum;
981 
982 	init_uasmon();
983 
984 	u.ulevel = 0;	/* set up some of the initial attributes */
985 	u.uhp = u.uhpmax = newhp();
986 	u.uenmax = urole.enadv.infix + urace.enadv.infix;
987 	if (urole.enadv.inrnd > 0)
988 	    u.uenmax += rnd(urole.enadv.inrnd);
989 	if (urace.enadv.inrnd > 0)
990 	    u.uenmax += rnd(urace.enadv.inrnd);
991 	u.uen = u.uenmax;
992 	u.uspellprot = 0;
993 	adjabil(0,1);
994 	u.ulevel = u.ulevelmax = 1;
995 
996 	init_uhunger();
997 	u.ublesscnt = 300;			/* no prayers just yet */
998 	u.ualignbase[A_CURRENT] = u.ualignbase[A_ORIGINAL] = u.ualign.type =
999 			aligns[flags.initalign].value;
1000 	u.ulycn = NON_PM;
1001 #if defined(BSD) && !defined(POSIX_TYPES)
1002 	(void) time((long *)&u.ubirthday);
1003 #else
1004 	(void) time(&u.ubirthday);
1005 #endif
1006 	/*
1007 	 *  For now, everyone but elves, cavemen and lycanthropes starts
1008 	 *  out with a night vision range of 1 and their xray range disabled.
1009 	 */
1010 	u.nv_range   =  1;
1011 	u.xray_range = -1;
1012 
1013 	/* Role-specific initializations */
1014 	switch (Role_switch) {
1015 	case PM_ARCHEOLOGIST:
1016 		switch (rnd(5)) {
1017 		    case 1: Archeologist[A_BOOK].trotyp = SPE_DETECT_FOOD; break;
1018 		    case 2: Archeologist[A_BOOK].trotyp = SPE_DETECT_MONSTERS; break;
1019 		    case 3: Archeologist[A_BOOK].trotyp = SPE_LIGHT; break;
1020 		    case 4: Archeologist[A_BOOK].trotyp = SPE_KNOCK; break;
1021 		    case 5: Archeologist[A_BOOK].trotyp = SPE_WIZARD_LOCK; break;
1022 		    default: break;
1023 		}
1024 		ini_inv(Archeologist);
1025 		if(!rn2(4)) ini_inv(Blindfold);
1026 #ifdef TOURIST
1027 		else if(!rn2(4)) ini_inv(Towel);
1028 		if(!rn2(4)) ini_inv(Leash);
1029 #endif
1030 		if(!rn2(4)) ini_inv(Tinopener);
1031 		else if(!rn2(4))
1032 		  (rn2(100) > 50 ? ini_inv(Lamp) : ini_inv(Torch));
1033 		if(!rn2(8)) ini_inv(Magicmarker);
1034 		knows_object(TOUCHSTONE);
1035 		knows_object(SACK);
1036 		skill_init(Skill_A);
1037 		break;
1038 	case PM_BARBARIAN:
1039 		if (rn2(100) >= 50) {   /* see Elf comment */
1040 		    Barbarian[B_MAJOR].trotyp = BATTLE_AXE;
1041 		    Barbarian[B_MINOR].trotyp = SHORT_SWORD;
1042 		}
1043 		ini_inv(Barbarian);
1044 		if(!rn2(6)) ini_inv(Torch);
1045 		knows_class(WEAPON_CLASS);
1046 		knows_class(ARMOR_CLASS);
1047 		skill_init(Skill_B);
1048 		break;
1049 	case PM_CAVEMAN:
1050 		u.nv_range = 2;
1051 		Cave_man[C_AMMO].trquan = rn1(11, 10);	/* 10..20 */
1052 		ini_inv(Cave_man);
1053 		skill_init(Skill_C);
1054 		break;
1055 	case PM_FLAME_MAGE:
1056 		switch (rnd(2)) {
1057 			case 1: Flame_Mage[F_BOOK].trotyp = SPE_DETECT_MONSTERS; break;
1058 			case 2: Flame_Mage[F_BOOK].trotyp = SPE_LIGHT; break;
1059 			default: break;
1060 		}
1061 		ini_inv(Flame_Mage);
1062 		if(!rn2(5)) ini_inv(Lamp);
1063 		else if(!rn2(5)) ini_inv(Blindfold);
1064 		else if(!rn2(5)) ini_inv(Magicmarker);
1065 		skill_init(Skill_F);
1066 		break;
1067 	case PM_HEALER:
1068 #ifndef GOLDOBJ
1069 		u.ugold = u.ugold0 = rn1(1000, 1001);
1070 #else
1071 		u.umoney0 = rn1(1000, 1001);
1072 #endif
1073 		ini_inv(Healer);
1074 		knows_class(POTION_CLASS); /* WAC - remove? */
1075 		knows_object(POT_SICKNESS);
1076 		knows_object(POT_BLINDNESS);
1077 		knows_object(POT_HALLUCINATION);
1078 		knows_object(POT_RESTORE_ABILITY);
1079 		knows_object(POT_FULL_HEALING);
1080 		knows_object(HEALTHSTONE);	/* KMH */
1081 		if(!rn2(5)) ini_inv(Lamp);
1082 		if(!rn2(5)) ini_inv(Magicmarker);
1083 		if(!rn2(5)) ini_inv(Blindfold);
1084 		skill_init(Skill_H);
1085 		break;
1086 	case PM_ICE_MAGE:
1087 		switch (rnd(2)) {
1088 			case 1: Ice_Mage[I_BOOK].trotyp = SPE_CONFUSE_MONSTER; break;
1089 			case 2: Ice_Mage[I_BOOK].trotyp = SPE_SLOW_MONSTER; break;
1090 			default: break;
1091 		}
1092 		ini_inv(Ice_Mage);
1093 		if(!rn2(5)) ini_inv(Lamp);
1094 		else if(!rn2(5)) ini_inv(Blindfold);
1095 		else if(!rn2(5)) ini_inv(Magicmarker);
1096 		skill_init(Skill_I);
1097 		break;
1098 	case PM_KNIGHT:
1099 		ini_inv(Knight);
1100 		knows_class(WEAPON_CLASS);
1101 		knows_class(ARMOR_CLASS);
1102 		/* give knights chess-like mobility
1103 		 * -- idea from wooledge@skybridge.scl.cwru.edu */
1104 		HJumping |= FROMOUTSIDE;
1105 		skill_init(Skill_K);
1106 		break;
1107 	case PM_MONK:
1108 		switch (rn2(90) / 30) {
1109 		case 0: Monk[M_BOOK].trotyp = SPE_HEALING; break;
1110 		case 1: Monk[M_BOOK].trotyp = SPE_PROTECTION; break;
1111 		case 2: Monk[M_BOOK].trotyp = SPE_SLEEP; break;
1112 		}
1113 		ini_inv(Monk);
1114 		if(!rn2(5)) ini_inv(Magicmarker);
1115 		else if(!rn2(10)) ini_inv(Lamp);
1116 		knows_class(ARMOR_CLASS);
1117 		skill_init(Skill_Mon);
1118 		break;
1119 	case PM_NECROMANCER:
1120 		switch (rnd(5)) {
1121                     case 1: Necromancer[N_BOOK].trotyp = SPE_FORCE_BOLT; break;
1122                     case 2: Necromancer[N_BOOK].trotyp = SPE_KNOCK; break;
1123                     case 3: Necromancer[N_BOOK].trotyp = SPE_MAGIC_MISSILE; break;
1124                     case 4: Necromancer[N_BOOK].trotyp = SPE_CREATE_MONSTER; break;
1125                     case 5: Necromancer[N_BOOK].trotyp = SPE_WIZARD_LOCK; break;
1126 		    default: break;
1127 		}
1128 		ini_inv(Necromancer);
1129 		knows_class(SPBOOK_CLASS);
1130 		if(!rn2(5)) ini_inv(Magicmarker);
1131 		if(!rn2(5)) ini_inv(Blindfold);
1132 		skill_init(Skill_N);
1133 		break;
1134 	case PM_PRIEST:
1135 		switch (rnd(9)) {
1136 		    case 1: Priest[P_BOOK].trotyp = SPE_FORCE_BOLT; break;
1137 		    case 2: Priest[P_BOOK].trotyp = SPE_SLEEP; break;
1138 		    case 3: Priest[P_BOOK].trotyp = SPE_RESIST_POISON; break;
1139 		    case 4: Priest[P_BOOK].trotyp = SPE_RESIST_SLEEP; break;
1140 		    case 5: Priest[P_BOOK].trotyp = SPE_DETECT_FOOD; break;
1141 		    case 6: Priest[P_BOOK].trotyp = SPE_DETECT_MONSTERS; break;
1142 		    case 7: Priest[P_BOOK].trotyp = SPE_LIGHT; break;
1143 		    case 8: Priest[P_BOOK].trotyp = SPE_KNOCK; break;
1144 		    case 9: Priest[P_BOOK].trotyp = SPE_WIZARD_LOCK; break;
1145 		    default: break;
1146 		}
1147 		ini_inv(Priest);
1148 		if(!rn2(10)) ini_inv(Magicmarker);
1149 		else if(!rn2(10))
1150 		  (rn2(100) > 50 ? ini_inv(Lamp) : ini_inv(Torch));
1151 		knows_object(POT_WATER);
1152 		spellbook_skill_raise(Skill_P, Priest[P_BOOK].trotyp);
1153 		skill_init(Skill_P);
1154 		/* KMH, conduct --
1155 		 * Some may claim that this isn't agnostic, since they
1156 		 * are literally "priests" and they have holy water.
1157 		 * But we don't count it as such.  Purists can always
1158 		 * avoid playing priests and/or confirm another player's
1159 		 * role in their YAAP.
1160 		 */
1161 		break;
1162 	case PM_RANGER:
1163 		Ranger[RAN_TWO_ARROWS].trquan = rn1(10, 50);
1164 		Ranger[RAN_ZERO_ARROWS].trquan = rn1(10, 30);
1165 		ini_inv(Ranger);
1166 		skill_init(Skill_Ran);
1167 		break;
1168 	case PM_ROGUE:
1169 		Rogue[R_DAGGERS].trquan = rn1(10, 6);
1170 		Rogue[R_DARTS].trquan = rn1(10, 25);
1171 #ifdef FIREARMS
1172 		if (rn2(100) < 30) {
1173 			Rogue[R_DAGGERS].trotyp = PISTOL;
1174 			Rogue[R_DAGGERS].trquan = 1;
1175 			Rogue[R_DARTS].trotyp = BULLET;
1176 		}
1177 #endif
1178 #ifndef GOLDOBJ
1179 		u.ugold = u.ugold0 = rn1(500 ,1500);
1180 #else
1181 		u.umoney0 = rn1(500 ,1500);
1182 #endif
1183 		ini_inv(Rogue);
1184 		if(!rn2(5)) ini_inv(Blindfold);
1185 		knows_object(OILSKIN_SACK);
1186 		skill_init(Skill_R);
1187 		break;
1188 	case PM_SAMURAI:
1189 		Samurai[S_ARROWS].trquan = rn1(20, 26);
1190 		ini_inv(Samurai);
1191 		if(!rn2(5)) ini_inv(Blindfold);
1192 		knows_class(WEAPON_CLASS);
1193 		knows_class(ARMOR_CLASS);
1194 		skill_init(Skill_S);
1195 		break;
1196 #ifdef TOURIST
1197 	case PM_TOURIST:
1198 		Tourist[T_DARTS].trquan = rn1(20, 21);
1199 #ifndef GOLDOBJ
1200 		u.ugold = u.ugold0 = rn1(500,1000);
1201 #else
1202 		u.umoney0 = rn1(500,1000);
1203 #endif
1204 		ini_inv(Tourist);
1205 		if(!rn2(25)) ini_inv(Tinopener);
1206 		else if(!rn2(25)) ini_inv(Leash);
1207 		else if(!rn2(25)) ini_inv(Towel);
1208 		else if(!rn2(25)) ini_inv(Magicmarker);
1209 		skill_init(Skill_T);
1210 		break;
1211 #endif /* TOURIST */
1212 	case PM_UNDEAD_SLAYER:
1213 		switch (rn2(100) / 25) {
1214 		    case 0:	/* Pistol and silver bullets */
1215 #ifdef FIREARMS
1216 			UndeadSlayer[U_MINOR].trotyp = PISTOL;
1217 			UndeadSlayer[U_RANGE].trotyp = SILVER_BULLET;
1218 			UndeadSlayer[U_RANGE].trquan = rn1(10, 30);
1219 			break;
1220 #endif
1221 		    case 1:	/* Crossbow and bolts */
1222 			UndeadSlayer[U_MINOR].trotyp = CROSSBOW;
1223 			UndeadSlayer[U_RANGE].trotyp = CROSSBOW_BOLT;
1224 			UndeadSlayer[U_RANGE].trquan = rn1(10, 30);
1225 			UndeadSlayer[U_MISC].trotyp = LOW_BOOTS;
1226 			UndeadSlayer[U_MISC].trspe = 1;
1227 			UndeadSlayer[U_ARMOR].trotyp = LEATHER_JACKET;
1228 			UndeadSlayer[U_ARMOR].trspe = 1;
1229 			/* helmet & armour are no longer candidates for
1230 			 * substitution for orcish versions so no extra
1231 			 * food should be given in compensation.
1232 			 */
1233 			if (Race_if(PM_ORC))
1234 			    no_extra_food = TRUE;
1235 		        break;
1236 		    case 2:	/* Whip and daggers */
1237 		        UndeadSlayer[U_MINOR].trotyp = BULLWHIP;
1238 		        UndeadSlayer[U_MINOR].trspe = 2;
1239 		        break;
1240 		    case 3:	/* Silver spear and daggers */
1241 			break;
1242 		}
1243 		ini_inv(UndeadSlayer);
1244 		knows_class(WEAPON_CLASS);
1245 		knows_class(ARMOR_CLASS);
1246 		if(!rn2(6)) ini_inv(Lamp);
1247 		skill_init(Skill_U);
1248 		break;
1249 	case PM_VALKYRIE:
1250 		ini_inv(Valkyrie);
1251 		if(!rn2(6))
1252 		  (rn2(100) > 50 ? ini_inv(Lamp) : ini_inv(Torch));
1253 		knows_class(WEAPON_CLASS);
1254 		knows_class(ARMOR_CLASS);
1255 		skill_init(Skill_V);
1256 		break;
1257 	case PM_WIZARD:
1258 		switch (rnd(2)) {
1259 		    case 1: Wizard[W_BOOK1].trotyp = SPE_FORCE_BOLT; break;
1260 		    case 2: Wizard[W_BOOK1].trotyp = SPE_SLEEP; break;
1261 		    default: break;
1262 		}
1263 		switch (rnd(2)) {
1264 		    case 1: Wizard[W_BOOK2].trotyp = SPE_RESIST_POISON; break;
1265 		    case 2: Wizard[W_BOOK2].trotyp = SPE_RESIST_SLEEP; break;
1266 		    default: break;
1267 		}
1268 		switch (rnd(5)) {
1269 		    case 1: Wizard[W_BOOK3].trotyp = SPE_DETECT_FOOD; break;
1270 		    case 2: Wizard[W_BOOK3].trotyp = SPE_DETECT_MONSTERS; break;
1271 		    case 3: Wizard[W_BOOK3].trotyp = SPE_LIGHT; break;
1272 		    case 4: Wizard[W_BOOK3].trotyp = SPE_KNOCK; break;
1273 		    case 5: Wizard[W_BOOK3].trotyp = SPE_WIZARD_LOCK; break;
1274 		    default: break;
1275 		}
1276 		switch (rnd(9)) {
1277 		    case 1: Wizard[W_BOOK4].trotyp = SPE_MAGIC_MISSILE; break;
1278 		    case 2: Wizard[W_BOOK4].trotyp = SPE_CONFUSE_MONSTER; break;
1279 		    case 3: Wizard[W_BOOK4].trotyp = SPE_SLOW_MONSTER; break;
1280 		    case 4: Wizard[W_BOOK4].trotyp = SPE_CURE_BLINDNESS; break;
1281 		    case 5: Wizard[W_BOOK4].trotyp = SPE_ENDURE_HEAT; break;
1282 		    case 6: Wizard[W_BOOK4].trotyp = SPE_ENDURE_COLD; break;
1283 		    case 7: Wizard[W_BOOK4].trotyp = SPE_INSULATE; break;
1284 		    case 8: Wizard[W_BOOK4].trotyp = SPE_CREATE_MONSTER; break;
1285 		    case 9: Wizard[W_BOOK4].trotyp = SPE_HEALING; break;
1286 		    default: break;
1287 		}
1288 		ini_inv(Wizard);
1289 		knows_class(SPBOOK_CLASS);
1290 		if(!rn2(5)) ini_inv(Magicmarker);
1291 		if(!rn2(5)) ini_inv(Blindfold);
1292 		skill_init(Skill_W);
1293 		break;
1294 
1295 #ifdef YEOMAN
1296 	case PM_YEOMAN:
1297 		ini_inv(Yeoman);
1298 		knows_class(WEAPON_CLASS);
1299 		knows_class(ARMOR_CLASS);
1300 		skill_init(Skill_Y);
1301 		break;
1302 #endif
1303 
1304 	default:	/* impossible */
1305 		break;
1306 	}
1307 
1308 	/*** Race-specific initializations ***/
1309 	switch (Race_switch) {
1310 	case PM_HUMAN:
1311 	    /* Nothing special */
1312 	    break;
1313 
1314 	case PM_ELF:
1315 	    /*
1316 	     * Elves are people of music and song, or they are warriors.
1317 	     * Non-warriors get an instrument.  We use a kludge to
1318 	     * get only non-magic instruments.
1319 	     */
1320 	    if (Role_if(PM_PRIEST) || Role_if(PM_WIZARD)) {
1321 		static int trotyp[] = {
1322 		    WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP,
1323 		    BELL, BUGLE, LEATHER_DRUM
1324 		};
1325 		Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))];
1326 		ini_inv(Instrument);
1327 	    }
1328 
1329 	    /* Elves can recognize all elvish objects */
1330 	    knows_object(ELVEN_SHORT_SWORD);
1331 	    knows_object(ELVEN_ARROW);
1332 	    knows_object(ELVEN_BOW);
1333 	    knows_object(ELVEN_SPEAR);
1334 	    knows_object(ELVEN_DAGGER);
1335 	    knows_object(ELVEN_BROADSWORD);
1336 	    knows_object(ELVEN_MITHRIL_COAT);
1337 	    knows_object(ELVEN_LEATHER_HELM);
1338 	    knows_object(ELVEN_SHIELD);
1339 	    knows_object(ELVEN_BOOTS);
1340 	    knows_object(ELVEN_CLOAK);
1341 	    break;
1342 	case PM_DROW:
1343 	    /* Drows can recognize all droven objects */
1344 	    knows_object(DARK_ELVEN_SHORT_SWORD);
1345 	    knows_object(DARK_ELVEN_ARROW);
1346 	    knows_object(DARK_ELVEN_BOW);
1347 	    knows_object(DARK_ELVEN_DAGGER);
1348 	    knows_object(DARK_ELVEN_MITHRIL_COAT);
1349 	    break;
1350 
1351 	case PM_DWARF:
1352 	    /* Dwarves can recognize all dwarvish objects */
1353 	    knows_object(DWARVISH_SPEAR);
1354 	    knows_object(DWARVISH_SHORT_SWORD);
1355 	    knows_object(DWARVISH_MATTOCK);
1356 	    knows_object(DWARVISH_IRON_HELM);
1357 	    knows_object(DWARVISH_MITHRIL_COAT);
1358 	    knows_object(DWARVISH_CLOAK);
1359 	    knows_object(DWARVISH_ROUNDSHIELD);
1360 	    break;
1361 
1362 	case PM_GNOME:
1363 	    break;
1364 	case PM_HUMAN_WEREWOLF:
1365 	    u.ulycn = PM_WEREWOLF;
1366 /*	    u.nv_range = 2;
1367 	    u.uen = u.uenmax += 6;
1368 	    ini_inv(Lycanthrope);*/
1369 	    break;
1370 
1371 	case PM_ORC:
1372 	    /* compensate for generally inferior equipment */
1373 	    if (!no_extra_food && !Role_if(PM_WIZARD) &&
1374 		    !Role_if(PM_FLAME_MAGE) && !Role_if(PM_ICE_MAGE) &&
1375 		    !Role_if(PM_NECROMANCER))
1376 		ini_inv(Xtra_food);
1377 	    /* Orcs can recognize all orcish objects */
1378 	    knows_object(ORCISH_SHORT_SWORD);
1379 	    knows_object(ORCISH_ARROW);
1380 	    knows_object(ORCISH_BOW);
1381 	    knows_object(ORCISH_SPEAR);
1382 	    knows_object(ORCISH_DAGGER);
1383 	    knows_object(ORCISH_CHAIN_MAIL);
1384 	    knows_object(ORCISH_RING_MAIL);
1385 	    knows_object(ORCISH_HELM);
1386 	    knows_object(ORCISH_SHIELD);
1387 	    knows_object(URUK_HAI_SHIELD);
1388 	    knows_object(ORCISH_CLOAK);
1389 	    break;
1390 	case PM_VAMPIRE:
1391 	    /* Vampires start off with gods not as pleased, luck penalty */
1392 	    adjalign(-5);
1393 	    change_luck(-1);
1394 	    break;
1395 	default:	/* impossible */
1396 		break;
1397 	}
1398 
1399 	if (discover)
1400 		ini_inv(Wishing);
1401 
1402 #ifdef WIZARD
1403 	if (wizard)
1404 		read_wizkit();
1405 #endif
1406 
1407 #ifndef GOLDOBJ
1408 	u.ugold0 += hidden_gold();	/* in case sack has gold in it */
1409 #else
1410 	if (u.umoney0) ini_inv(Money);
1411 	u.umoney0 += hidden_gold();	/* in case sack has gold in it */
1412 #endif
1413 
1414 	temp = rn1(10,70);
1415 	init_attr(temp);		/* init attribute values */
1416 	find_ac();			/* get initial ac value */
1417 	max_rank_sz();			/* set max str size for class ranks */
1418 /*
1419  *	Do we really need this?
1420  */
1421 	for(i = 0; i < A_MAX; i++)
1422 	    if(!rn2(20)) {
1423 		register int xd = rn2(7) - 2;	/* biased variation */
1424 		(void) adjattrib(i, xd, TRUE);
1425 		if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i);
1426 	    }
1427 	/* make sure you can carry all you have - especially for Tourists */
1428 	while (inv_weight() > 0) {
1429 		if (adjattrib(A_STR, 1, TRUE)) continue;
1430 		if (adjattrib(A_CON, 1, TRUE)) continue;
1431 		/* only get here when didn't boost strength or constitution */
1432 		break;
1433 	}
1434 
1435 	return;
1436 }
1437 
1438 
1439 /* skills aren't initialized, so we use the role-specific skill lists */
1440 STATIC_OVL boolean
restricted_spell_discipline(otyp)1441 restricted_spell_discipline(otyp)
1442 int otyp;
1443 {
1444     const struct def_skill *skills;
1445     int this_skill = spell_skilltype(otyp);
1446 
1447     switch (Role_switch) {
1448      case PM_ARCHEOLOGIST:	skills = Skill_A; break;
1449      case PM_BARBARIAN:		skills = Skill_B; break;
1450      case PM_CAVEMAN:		skills = Skill_C; break;
1451      case PM_HEALER:		skills = Skill_H; break;
1452      case PM_KNIGHT:		skills = Skill_K; break;
1453      case PM_MONK:		skills = Skill_Mon; break;
1454      case PM_PRIEST:		skills = Skill_P; break;
1455      case PM_RANGER:		skills = Skill_Ran; break;
1456      case PM_ROGUE:		skills = Skill_R; break;
1457      case PM_SAMURAI:		skills = Skill_S; break;
1458 #ifdef TOURIST
1459      case PM_TOURIST:		skills = Skill_T; break;
1460 #endif
1461      case PM_VALKYRIE:		skills = Skill_V; break;
1462      case PM_WIZARD:		skills = Skill_W; break;
1463      default:			skills = 0; break;	/* lint suppression */
1464     }
1465 
1466     while (skills->skill != P_NONE) {
1467 	if (skills->skill == this_skill) return FALSE;
1468 	++skills;
1469     }
1470     return TRUE;
1471 }
1472 
1473 STATIC_OVL void
ini_inv(trop)1474 ini_inv(trop)
1475 register struct trobj *trop;
1476 {
1477 	struct obj *obj;
1478 	int otyp, i;
1479 
1480 	while (trop->trclass) {
1481 		if (trop->trotyp != UNDEF_TYP) {
1482 			otyp = (int)trop->trotyp;
1483 			if (urace.malenum != PM_HUMAN) {
1484 			    /* substitute specific items for generic ones */
1485 			    for (i = 0; inv_subs[i].race_pm != NON_PM; ++i)
1486 				if (inv_subs[i].race_pm == urace.malenum &&
1487 					otyp == inv_subs[i].item_otyp) {
1488 				    otyp = inv_subs[i].subs_otyp;
1489 				    break;
1490 				}
1491 			}
1492 			for (i = 0; inv_asubs[i].align != A_NONE; ++i)
1493 			    if (inv_asubs[i].align == u.ualign.type &&
1494 				    otyp == inv_asubs[i].item_otyp) {
1495 				otyp = inv_asubs[i].subs_otyp;
1496 				break;
1497 			    }
1498 			obj = mksobj(otyp, TRUE, FALSE);
1499 		} else {	/* UNDEF_TYP */
1500 			static NEARDATA short nocreate = STRANGE_OBJECT;
1501 			static NEARDATA short nocreate2 = STRANGE_OBJECT;
1502 			static NEARDATA short nocreate3 = STRANGE_OBJECT;
1503 			static NEARDATA short nocreate4 = STRANGE_OBJECT;
1504 		/*
1505 		 * For random objects, do not create certain overly powerful
1506 		 * items: wand of wishing, ring of levitation, or the
1507 		 * polymorph/polymorph control combination.  Specific objects,
1508 		 * i.e. the discovery wishing, are still OK.
1509 		 * Also, don't get a couple of really useless items.  (Note:
1510 		 * punishment isn't "useless".  Some players who start out with
1511 		 * one will immediately read it and use the iron ball as a
1512 		 * weapon.)
1513 		 */
1514 			obj = mkobj(trop->trclass, FALSE);
1515 			otyp = obj->otyp;
1516 			while (otyp == WAN_WISHING
1517 				|| otyp == nocreate
1518 				|| otyp == nocreate2
1519 				|| otyp == nocreate3
1520 				|| otyp == nocreate4
1521 #ifdef ELBERETH
1522 				|| otyp == RIN_LEVITATION
1523 #endif
1524 				|| ((Role_if(PM_FLAME_MAGE) || Role_if(PM_ICE_MAGE))
1525 						&&
1526 				    (otyp == RIN_FIRE_RESISTANCE ||
1527 				     otyp == RIN_COLD_RESISTANCE ||
1528 				     otyp == SPE_ENDURE_HEAT ||
1529 				     otyp == SPE_ENDURE_COLD))
1530 
1531 				/* KMH -- Hobbits shouldn't get ring of invis. */
1532 				|| (Role_if(PM_HOBBIT) && otyp == RIN_INVISIBILITY)
1533 
1534 				/* KMH, balance patch -- now an amulet */
1535 				|| (Role_if(PM_NECROMANCER) &&
1536 						otyp == AMULET_OF_DRAIN_RESISTANCE)
1537 				/* 'useless' or over powerful items */
1538 				|| otyp == POT_HALLUCINATION
1539 				|| otyp == POT_ACID
1540 				|| otyp == SCR_AMNESIA
1541 				|| otyp == SCR_FIRE
1542 				|| otyp == SCR_BLANK_PAPER
1543 				|| otyp == SPE_BLANK_PAPER
1544 				|| otyp == RIN_AGGRAVATE_MONSTER
1545 				|| otyp == RIN_HUNGER
1546 				|| otyp == RIN_SLEEPING
1547 				|| otyp == WAN_NOTHING
1548 				/* Monks don't use weapons */
1549 				|| (otyp == SCR_ENCHANT_WEAPON &&
1550 				    Role_if(PM_MONK))
1551 				/* wizard patch -- they already have one */
1552 				|| (otyp == SPE_FORCE_BOLT &&
1553 				    Role_if(PM_WIZARD))
1554 				/* powerful spells are either useless to
1555 				   low level players or unbalancing; also
1556 				   spells in restricted skill categories */
1557 				|| (obj->oclass == SPBOOK_CLASS &&
1558 				    (objects[otyp].oc_level > 3 ||
1559 				    restricted_spell_discipline(otyp)))
1560 							) {
1561 				dealloc_obj(obj);
1562 				obj = mkobj(trop->trclass, FALSE);
1563 				otyp = obj->otyp;
1564 			}
1565 
1566 			/* Don't start with +0 or negative rings */
1567 			if (objects[otyp].oc_charged && obj->spe <= 0)
1568 				obj->spe = rne(3);
1569 
1570 			/* Heavily relies on the fact that 1) we create wands
1571 			 * before rings, 2) that we create rings before
1572 			 * spellbooks, and that 3) not more than 1 object of a
1573 			 * particular symbol is to be prohibited.  (For more
1574 			 * objects, we need more nocreate variables...)
1575 			 */
1576 			switch (otyp) {
1577 			    case WAN_POLYMORPH:
1578 			    case RIN_POLYMORPH:
1579 			    case POT_POLYMORPH:
1580 				nocreate = RIN_POLYMORPH_CONTROL;
1581 				break;
1582 			    case RIN_POLYMORPH_CONTROL:
1583 				nocreate = RIN_POLYMORPH;
1584 				nocreate2 = SPE_POLYMORPH;
1585 				nocreate3 = POT_POLYMORPH;
1586 			}
1587 			/* Don't have 2 of the same ring or spellbook */
1588 			if (obj->oclass == RING_CLASS ||
1589 			    obj->oclass == SPBOOK_CLASS)
1590 				nocreate4 = otyp;
1591 		}
1592 
1593 #ifdef GOLDOBJ
1594 		if (trop->trclass == COIN_CLASS) {
1595 			/* no "blessed" or "identified" money */
1596 			obj->quan = u.umoney0;
1597 		} else {
1598 #endif
1599 			obj->dknown = obj->bknown = obj->rknown = 1;
1600 			if (objects[otyp].oc_uses_known) obj->known = 1;
1601 			obj->cursed = 0;
1602 			if (obj->opoisoned && u.ualign.type != A_CHAOTIC)
1603 			    obj->opoisoned = 0;
1604 			if (obj->oclass == WEAPON_CLASS ||
1605 				obj->oclass == TOOL_CLASS) {
1606 			    obj->quan = (long) trop->trquan;
1607 			    trop->trquan = 1;
1608 			} else if (obj->oclass == GEM_CLASS &&
1609 				is_graystone(obj) && obj->otyp != FLINT) {
1610 			    obj->quan = 1L;
1611 			}
1612 			if (trop->trspe != UNDEF_SPE)
1613 			    obj->spe = trop->trspe;
1614 			if (trop->trbless != UNDEF_BLESS)
1615 			    obj->blessed = trop->trbless;
1616 #ifdef GOLDOBJ
1617 		}
1618 #endif
1619 		/* defined after setting otyp+quan + blessedness */
1620 		obj->owt = weight(obj);
1621 
1622 		obj = addinv(obj);
1623 
1624 		/* Make the type known if necessary */
1625 		if (OBJ_DESCR(objects[otyp]) && obj->known)
1626 			discover_object(otyp, TRUE, FALSE);
1627 		if (otyp == OIL_LAMP)
1628 			discover_object(POT_OIL, TRUE, FALSE);
1629 
1630 		if(obj->oclass == ARMOR_CLASS){
1631 			if (is_shield(obj) && !uarms) {
1632 				setworn(obj, W_ARMS);
1633 				if (uswapwep)
1634 				  setuswapwep((struct obj *) 0, TRUE);
1635 			} else if (is_helmet(obj) && !uarmh)
1636 				setworn(obj, W_ARMH);
1637 			else if (is_gloves(obj) && !uarmg)
1638 				setworn(obj, W_ARMG);
1639 #ifdef TOURIST
1640 			else if (is_shirt(obj) && !uarmu)
1641 				setworn(obj, W_ARMU);
1642 #endif
1643 			else if (is_cloak(obj) && !uarmc)
1644 				setworn(obj, W_ARMC);
1645 			else if (is_boots(obj) && !uarmf)
1646 				setworn(obj, W_ARMF);
1647 			else if (is_suit(obj) && !uarm)
1648 				setworn(obj, W_ARM);
1649 		}
1650 
1651 		if (obj->oclass == WEAPON_CLASS || is_weptool(obj) ||
1652 			otyp == TIN_OPENER || otyp == FLINT || otyp == ROCK) {
1653 		    if (is_ammo(obj) || is_missile(obj)) {
1654 			if (!uquiver) setuqwep(obj);
1655 		    } else if (!uwep) setuwep(obj, FALSE);
1656 		    else if (!uswapwep) setuswapwep(obj, FALSE);
1657 		}
1658 		if (obj->oclass == SPBOOK_CLASS &&
1659 				obj->otyp != SPE_BLANK_PAPER)
1660 		    initialspell(obj);
1661 
1662 #if !defined(PYRAMID_BUG) && !defined(MAC)
1663 		if(--trop->trquan) continue;	/* make a similar object */
1664 #else
1665 		if(trop->trquan) {		/* check if zero first */
1666 			--trop->trquan;
1667 			if(trop->trquan)
1668 				continue;	/* make a similar object */
1669 		}
1670 #endif
1671 
1672 		trop++;
1673 	}
1674 }
1675 
1676 /*u_init.c*/
1677