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