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