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. */
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));
21 #define UNDEF_SPE '\177'
25 * Initial inventory for the various roles.
28 static struct trobj Archeologist[] = {
29 /* if adventure has a name... idea from tan@uvm-gen */
30 { BULLWHIP, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
31 { LEATHER_JACKET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
32 { FEDORA, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
33 { FOOD_RATION, 0, FOOD_CLASS, 3, 0 },
34 { PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
35 { TINNING_KIT, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
36 { TOUCHSTONE, 0, GEM_CLASS, 1, 0 },
37 { SACK, 0, TOOL_CLASS, 1, 0 },
40 static struct trobj Barbarian[] = {
41 #define B_MAJOR 0 /* two-handed sword or battle-axe */
42 #define B_MINOR 1 /* matched with axe or short sword */
43 { TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
44 { AXE, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
45 { RING_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
46 { FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
49 static struct trobj Cave_man[] = {
51 { CLUB, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
52 { SLING, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
53 { FLINT, 0, GEM_CLASS, 15, UNDEF_BLESS }, /* quan is variable */
54 { ROCK, 0, GEM_CLASS, 3, 0 }, /* yields 18..33 */
55 { LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
58 static struct trobj Healer[] = {
59 { SCALPEL, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
60 { LEATHER_GLOVES, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
61 { STETHOSCOPE, 0, TOOL_CLASS, 1, 0 },
62 { POT_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
63 { POT_EXTRA_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
64 { WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
65 /* always blessed, so it's guaranteed readable */
66 { SPE_HEALING, 0, SPBOOK_CLASS, 1, 1 },
67 { SPE_EXTRA_HEALING, 0, SPBOOK_CLASS, 1, 1 },
68 { SPE_STONE_TO_FLESH, 0, SPBOOK_CLASS, 1, 1 },
69 { APPLE, 0, FOOD_CLASS, 5, 0 },
72 static struct trobj Knight[] = {
73 { LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
74 { LANCE, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
75 { RING_MAIL, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
76 { HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
77 { SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
78 { LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
79 { APPLE, 0, FOOD_CLASS, 10, 0 },
80 { CARROT, 0, FOOD_CLASS, 10, 0 },
83 static struct trobj Monk[] = {
85 { LEATHER_GLOVES, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
86 { ROBE, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
87 { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
88 { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS },
89 { POT_HEALING, 0, POTION_CLASS, 3, UNDEF_BLESS },
90 { FOOD_RATION, 0, FOOD_CLASS, 3, 0 },
91 { APPLE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
92 { ORANGE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
93 /* Yes, we know fortune cookies aren't really from China. They were
94 * invented by George Jung in Los Angeles, California, USA in 1916.
96 { FORTUNE_COOKIE, 0, FOOD_CLASS, 3, UNDEF_BLESS },
99 static struct trobj Priest[] = {
100 { MACE, 1, WEAPON_CLASS, 1, 1 },
101 { ROBE, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
102 { SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
103 { POT_WATER, 0, POTION_CLASS, 4, 1 }, /* holy water */
104 { CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 0 },
105 { SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 0 },
106 { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 2, UNDEF_BLESS },
109 static struct trobj Ranger[] = {
111 #define RAN_TWO_ARROWS 2
112 #define RAN_ZERO_ARROWS 3
113 { DAGGER, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
114 { BOW, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
115 { ARROW, 2, WEAPON_CLASS, 50, UNDEF_BLESS },
116 { ARROW, 0, WEAPON_CLASS, 30, UNDEF_BLESS },
117 { CLOAK_OF_DISPLACEMENT, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
118 { CRAM_RATION, 0, FOOD_CLASS, 4, 0 },
121 static struct trobj Rogue[] = {
123 { SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
124 { DAGGER, 0, WEAPON_CLASS, 10, 0 }, /* quan is variable */
125 { LEATHER_ARMOR, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
126 { POT_SICKNESS, 0, POTION_CLASS, 1, 0 },
127 { LOCK_PICK, 9, TOOL_CLASS, 1, 0 },
128 { SACK, 0, TOOL_CLASS, 1, 0 },
131 static struct trobj Samurai[] = {
133 { KATANA, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
134 { SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, /* wakizashi */
135 { YUMI, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
136 { YA, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, /* variable quan */
137 { SPLINT_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
141 static struct trobj Tourist[] = {
143 { DART, 2, WEAPON_CLASS, 25, UNDEF_BLESS }, /* quan is variable */
144 { UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 10, 0 },
145 { POT_EXTRA_HEALING, 0, POTION_CLASS, 2, UNDEF_BLESS },
146 { SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 4, UNDEF_BLESS },
147 { HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
148 { EXPENSIVE_CAMERA, UNDEF_SPE, TOOL_CLASS, 1, 0 },
149 { CREDIT_CARD, 0, TOOL_CLASS, 1, 0 },
153 static struct trobj Valkyrie[] = {
154 { LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
155 { DAGGER, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
156 { SMALL_SHIELD, 3, ARMOR_CLASS, 1, UNDEF_BLESS },
157 { FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
160 static struct trobj Wizard[] = {
161 #define W_MULTSTART 2
163 { QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 },
164 { CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
165 { UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
166 { UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, UNDEF_BLESS },
167 { UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, UNDEF_BLESS },
168 { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, UNDEF_BLESS },
169 { SPE_FORCE_BOLT, 0, SPBOOK_CLASS, 1, 1 },
170 { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, UNDEF_BLESS },
175 * Optional extra inventory items.
178 static struct trobj Tinopener[] = {
179 { TIN_OPENER, 0, TOOL_CLASS, 1, 0 },
182 static struct trobj Magicmarker[] = {
183 { MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 0 },
186 static struct trobj Lamp[] = {
187 { OIL_LAMP, 1, TOOL_CLASS, 1, 0 },
190 static struct trobj Blindfold[] = {
191 { BLINDFOLD, 0, TOOL_CLASS, 1, 0 },
194 static struct trobj Instrument[] = {
195 { WOODEN_FLUTE, 0, TOOL_CLASS, 1, 0 },
198 static struct trobj Xtra_food[] = {
199 { UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 2, 0 },
203 static struct trobj Leash[] = {
204 { LEASH, 0, TOOL_CLASS, 1, 0 },
207 static struct trobj Towel[] = {
208 { TOWEL, 0, TOOL_CLASS, 1, 0 },
212 static struct trobj Wishing[] = {
213 { WAN_WISHING, 3, WAND_CLASS, 1, 0 },
217 static struct trobj Money[] = {
218 { GOLD_PIECE, 0 , COIN_CLASS, 1, 0 },
223 /* race-based substitutions for initial inventory;
224 the weaker cloak for elven rangers is intentional--they shoot better */
225 static struct inv_sub { short race_pm, item_otyp, subs_otyp; } inv_subs[] = {
226 { PM_ELF, DAGGER, ELVEN_DAGGER },
227 { PM_ELF, SPEAR, ELVEN_SPEAR },
228 { PM_ELF, SHORT_SWORD, ELVEN_SHORT_SWORD },
229 { PM_ELF, BOW, ELVEN_BOW },
230 { PM_ELF, ARROW, ELVEN_ARROW },
231 { PM_ELF, HELMET, ELVEN_LEATHER_HELM },
232 /* { PM_ELF, SMALL_SHIELD, ELVEN_SHIELD }, */
233 { PM_ELF, CLOAK_OF_DISPLACEMENT, ELVEN_CLOAK },
234 { PM_ELF, CRAM_RATION, LEMBAS_WAFER },
235 { PM_ORC, DAGGER, ORCISH_DAGGER },
236 { PM_ORC, SPEAR, ORCISH_SPEAR },
237 { PM_ORC, SHORT_SWORD, ORCISH_SHORT_SWORD },
238 { PM_ORC, BOW, ORCISH_BOW },
239 { PM_ORC, ARROW, ORCISH_ARROW },
240 { PM_ORC, HELMET, ORCISH_HELM },
241 { PM_ORC, SMALL_SHIELD, ORCISH_SHIELD },
242 { PM_ORC, RING_MAIL, ORCISH_RING_MAIL },
243 { PM_ORC, CHAIN_MAIL, ORCISH_CHAIN_MAIL },
244 { PM_DWARF, SPEAR, DWARVISH_SPEAR },
245 { PM_DWARF, SHORT_SWORD, DWARVISH_SHORT_SWORD },
246 { PM_DWARF, HELMET, DWARVISH_IRON_HELM },
247 /* { PM_DWARF, SMALL_SHIELD, DWARVISH_ROUNDSHIELD }, */
248 /* { PM_DWARF, PICK_AXE, DWARVISH_MATTOCK }, */
249 { PM_GNOME, BOW, CROSSBOW },
250 { PM_GNOME, ARROW, CROSSBOW_BOLT },
251 { NON_PM, STRANGE_OBJECT, STRANGE_OBJECT }
254 static const struct def_skill Skill_A[] = {
255 { P_DAGGER, P_BASIC }, { P_KNIFE, P_BASIC },
256 { P_PICK_AXE, P_EXPERT }, { P_SHORT_SWORD, P_BASIC },
257 { P_SCIMITAR, P_SKILLED }, { P_SABER, P_EXPERT },
258 { P_CLUB, P_SKILLED }, { P_QUARTERSTAFF, P_SKILLED },
259 { P_SLING, P_SKILLED }, { P_DART, P_BASIC },
260 { P_BOOMERANG, P_EXPERT }, { P_WHIP, P_EXPERT },
261 { P_UNICORN_HORN, P_SKILLED },
262 { P_ATTACK_SPELL, P_BASIC }, { P_HEALING_SPELL, P_BASIC },
263 { P_DIVINATION_SPELL, P_EXPERT}, { P_MATTER_SPELL, P_BASIC},
265 { P_RIDING, P_BASIC },
267 { P_TWO_WEAPON_COMBAT, P_BASIC },
268 { P_BARE_HANDED_COMBAT, P_EXPERT },
272 static const struct def_skill Skill_B[] = {
273 { P_DAGGER, P_BASIC }, { P_AXE, P_EXPERT },
274 { P_PICK_AXE, P_SKILLED }, { P_SHORT_SWORD, P_EXPERT },
275 { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_SKILLED },
276 { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_SKILLED },
277 { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED },
278 { P_MACE, P_SKILLED }, { P_MORNING_STAR, P_SKILLED },
279 { P_FLAIL, P_BASIC }, { P_HAMMER, P_EXPERT },
280 { P_QUARTERSTAFF, P_BASIC }, { P_SPEAR, P_SKILLED },
281 { P_TRIDENT, P_SKILLED }, { P_BOW, P_BASIC },
282 { P_ATTACK_SPELL, P_SKILLED },
284 { P_RIDING, P_BASIC },
286 { P_TWO_WEAPON_COMBAT, P_BASIC },
287 { P_BARE_HANDED_COMBAT, P_MASTER },
291 static const struct def_skill Skill_C[] = {
292 { P_DAGGER, P_BASIC }, { P_KNIFE, P_SKILLED },
293 { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC },
294 { P_CLUB, P_EXPERT }, { P_MACE, P_EXPERT },
295 { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_SKILLED },
296 { P_HAMMER, P_SKILLED }, { P_QUARTERSTAFF, P_EXPERT },
297 { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_EXPERT },
298 { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED },
299 { P_BOW, P_SKILLED }, { P_SLING, P_EXPERT },
300 { P_ATTACK_SPELL, P_BASIC }, { P_MATTER_SPELL, P_SKILLED },
301 { P_BOOMERANG, P_EXPERT }, { P_UNICORN_HORN, P_BASIC },
302 { P_BARE_HANDED_COMBAT, P_MASTER },
306 static const struct def_skill Skill_H[] = {
307 { P_DAGGER, P_SKILLED }, { P_KNIFE, P_EXPERT },
308 { P_SHORT_SWORD, P_SKILLED }, { P_SCIMITAR, P_BASIC },
309 { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED },
310 { P_MACE, P_BASIC }, { P_QUARTERSTAFF, P_EXPERT },
311 { P_POLEARMS, P_BASIC }, { P_SPEAR, P_BASIC },
312 { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC },
313 { P_SLING, P_SKILLED }, { P_DART, P_EXPERT },
314 { P_SHURIKEN, P_SKILLED }, { P_UNICORN_HORN, P_EXPERT },
315 { P_HEALING_SPELL, P_EXPERT },
316 { P_BARE_HANDED_COMBAT, P_BASIC },
320 static const struct def_skill Skill_K[] = {
321 { P_DAGGER, P_BASIC }, { P_KNIFE, P_BASIC },
322 { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC },
323 { P_SHORT_SWORD, P_SKILLED }, { P_BROAD_SWORD, P_SKILLED },
324 { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_SKILLED },
325 { P_SCIMITAR, P_BASIC }, { P_SABER, P_SKILLED },
326 { P_CLUB, P_BASIC }, { P_MACE, P_SKILLED },
327 { P_MORNING_STAR, P_SKILLED }, { P_FLAIL, P_BASIC },
328 { P_HAMMER, P_BASIC }, { P_POLEARMS, P_SKILLED },
329 { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_SKILLED },
330 { P_TRIDENT, P_BASIC }, { P_LANCE, P_EXPERT },
331 { P_BOW, P_BASIC }, { P_CROSSBOW, P_SKILLED },
332 { P_ATTACK_SPELL, P_SKILLED }, { P_HEALING_SPELL, P_SKILLED },
333 { P_CLERIC_SPELL, P_SKILLED },
335 { P_RIDING, P_EXPERT },
337 { P_TWO_WEAPON_COMBAT, P_SKILLED },
338 { P_BARE_HANDED_COMBAT, P_EXPERT },
342 static const struct def_skill Skill_Mon[] = {
343 { P_QUARTERSTAFF, P_BASIC }, { P_SPEAR, P_BASIC },
344 { P_JAVELIN, P_BASIC }, { P_CROSSBOW, P_BASIC },
345 { P_SHURIKEN, P_BASIC },
346 { P_ATTACK_SPELL, P_BASIC }, { P_HEALING_SPELL, P_EXPERT },
347 { P_DIVINATION_SPELL, P_BASIC },{ P_ENCHANTMENT_SPELL, P_BASIC },
348 { P_CLERIC_SPELL, P_SKILLED }, { P_ESCAPE_SPELL, P_BASIC },
349 { P_MATTER_SPELL, P_BASIC },
350 { P_MARTIAL_ARTS, P_GRAND_MASTER },
354 static const struct def_skill Skill_P[] = {
355 { P_CLUB, P_EXPERT }, { P_MACE, P_EXPERT },
356 { P_MORNING_STAR, P_EXPERT }, { P_FLAIL, P_EXPERT },
357 { P_HAMMER, P_EXPERT }, { P_QUARTERSTAFF, P_EXPERT },
358 { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_SKILLED },
359 { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED },
360 { P_LANCE, P_BASIC }, { P_BOW, P_BASIC },
361 { P_SLING, P_BASIC }, { P_CROSSBOW, P_BASIC },
362 { P_DART, P_BASIC }, { P_SHURIKEN, P_BASIC },
363 { P_BOOMERANG, P_BASIC }, { P_UNICORN_HORN, P_SKILLED },
364 { P_HEALING_SPELL, P_EXPERT }, { P_DIVINATION_SPELL, P_EXPERT },
365 { P_CLERIC_SPELL, P_EXPERT },
366 { P_BARE_HANDED_COMBAT, P_BASIC },
370 static const struct def_skill Skill_R[] = {
371 { P_DAGGER, P_EXPERT }, { P_KNIFE, P_EXPERT },
372 { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_SKILLED },
373 { P_LONG_SWORD, P_SKILLED }, { P_TWO_HANDED_SWORD, P_BASIC },
374 { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED },
375 { P_CLUB, P_SKILLED }, { P_MACE, P_SKILLED },
376 { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_BASIC },
377 { P_HAMMER, P_BASIC }, { P_POLEARMS, P_BASIC },
378 { P_SPEAR, P_BASIC }, { P_CROSSBOW, P_EXPERT },
379 { P_DART, P_EXPERT }, { P_SHURIKEN, P_SKILLED },
380 { P_DIVINATION_SPELL, P_SKILLED }, { P_ESCAPE_SPELL, P_SKILLED },
381 { P_MATTER_SPELL, P_SKILLED },
383 { P_RIDING, P_BASIC },
385 { P_TWO_WEAPON_COMBAT, P_EXPERT },
386 { P_BARE_HANDED_COMBAT, P_EXPERT },
390 static const struct def_skill Skill_Ran[] = {
391 { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED },
392 { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC },
393 { P_SHORT_SWORD, P_BASIC }, { P_MORNING_STAR, P_BASIC },
394 { P_FLAIL, P_SKILLED }, { P_HAMMER, P_BASIC },
395 { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED },
396 { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_EXPERT },
397 { P_TRIDENT, P_BASIC }, { P_BOW, P_EXPERT },
398 { P_SLING, P_EXPERT }, { P_CROSSBOW, P_EXPERT },
399 { P_DART, P_EXPERT }, { P_SHURIKEN, P_SKILLED },
400 { P_BOOMERANG, P_EXPERT }, { P_WHIP, P_BASIC },
401 { P_HEALING_SPELL, P_BASIC },
402 { P_DIVINATION_SPELL, P_EXPERT },
403 { P_ESCAPE_SPELL, P_BASIC },
405 { P_RIDING, P_BASIC },
407 { P_BARE_HANDED_COMBAT, P_BASIC },
411 static const struct def_skill Skill_S[] = {
412 { P_DAGGER, P_BASIC }, { P_KNIFE, P_SKILLED },
413 { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_SKILLED },
414 { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_EXPERT },
415 { P_SCIMITAR, P_BASIC }, { P_SABER, P_BASIC },
416 { P_FLAIL, P_SKILLED }, { P_QUARTERSTAFF, P_BASIC },
417 { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_BASIC },
418 { P_JAVELIN, P_BASIC }, { P_LANCE, P_SKILLED },
419 { P_BOW, P_EXPERT }, { P_SHURIKEN, P_EXPERT },
420 { P_ATTACK_SPELL, P_SKILLED }, { P_CLERIC_SPELL, P_SKILLED },
422 { P_RIDING, P_SKILLED },
424 { P_TWO_WEAPON_COMBAT, P_EXPERT },
425 { P_MARTIAL_ARTS, P_MASTER },
430 static const struct def_skill Skill_T[] = {
431 { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED },
432 { P_AXE, P_BASIC }, { P_PICK_AXE, P_BASIC },
433 { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_BASIC },
434 { P_LONG_SWORD, P_BASIC }, { P_TWO_HANDED_SWORD, P_BASIC },
435 { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED },
436 { P_MACE, P_BASIC }, { P_MORNING_STAR, P_BASIC },
437 { P_FLAIL, P_BASIC }, { P_HAMMER, P_BASIC },
438 { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_BASIC },
439 { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC },
440 { P_TRIDENT, P_BASIC }, { P_LANCE, P_BASIC },
441 { P_BOW, P_BASIC }, { P_SLING, P_BASIC },
442 { P_CROSSBOW, P_BASIC }, { P_DART, P_EXPERT },
443 { P_SHURIKEN, P_BASIC }, { P_BOOMERANG, P_BASIC },
444 { P_WHIP, P_BASIC }, { P_UNICORN_HORN, P_SKILLED },
445 { P_DIVINATION_SPELL, P_BASIC }, { P_ENCHANTMENT_SPELL, P_BASIC },
446 { P_ESCAPE_SPELL, P_SKILLED },
448 { P_RIDING, P_BASIC },
450 { P_TWO_WEAPON_COMBAT, P_SKILLED },
451 { P_BARE_HANDED_COMBAT, P_SKILLED },
456 static const struct def_skill Skill_V[] = {
457 { P_DAGGER, P_EXPERT }, { P_AXE, P_EXPERT },
458 { P_PICK_AXE, P_SKILLED }, { P_SHORT_SWORD, P_SKILLED },
459 { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_EXPERT },
460 { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_BASIC },
461 { P_SABER, P_BASIC }, { P_HAMMER, P_EXPERT },
462 { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED },
463 { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_BASIC },
464 { P_TRIDENT, P_BASIC }, { P_LANCE, P_SKILLED },
465 { P_SLING, P_BASIC },
466 { P_ATTACK_SPELL, P_BASIC }, { P_ESCAPE_SPELL, P_BASIC },
468 { P_RIDING, P_SKILLED },
470 { P_TWO_WEAPON_COMBAT, P_SKILLED },
471 { P_BARE_HANDED_COMBAT, P_EXPERT },
475 static const struct def_skill Skill_W[] = {
476 { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED },
477 { P_AXE, P_SKILLED }, { P_SHORT_SWORD, P_BASIC },
478 { P_CLUB, P_SKILLED }, { P_MACE, P_BASIC },
479 { P_QUARTERSTAFF, P_EXPERT }, { P_POLEARMS, P_SKILLED },
480 { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC },
481 { P_TRIDENT, P_BASIC }, { P_SLING, P_SKILLED },
482 { P_DART, P_EXPERT }, { P_SHURIKEN, P_BASIC },
483 { P_ATTACK_SPELL, P_EXPERT }, { P_HEALING_SPELL, P_SKILLED },
484 { P_DIVINATION_SPELL, P_EXPERT }, { P_ENCHANTMENT_SPELL, P_SKILLED },
485 { P_CLERIC_SPELL, P_SKILLED }, { P_ESCAPE_SPELL, P_EXPERT },
486 { P_MATTER_SPELL, P_EXPERT },
488 { P_RIDING, P_BASIC },
490 { P_BARE_HANDED_COMBAT, P_BASIC },
499 discover_object(obj,TRUE,FALSE);
500 objects[obj].oc_pre_discovered = 1; /* not a "discovery" */
503 /* Know ordinary (non-magical) objects of a certain class,
504 * like all gems except the loadstone and luckstone.
511 for (ct = 1; ct < NUM_OBJECTS; ct++)
512 if (objects[ct].oc_class == sym && !objects[ct].oc_magic)
521 flags.female = flags.initgend;
524 /* zero u, including pointer values --
525 * necessary when aborting from a failed restore */
526 (void) memset((genericptr_t)&u, 0, sizeof(u));
527 u.ustuck = (struct monst *)0;
529 #if 0 /* documentation of more zero values as desirable */
530 u.usick_cause[0] = 0;
531 u.uluck = u.moreluck = 0;
535 uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0;
536 uwep = uball = uchain = uleft = uright = 0;
537 uswapwep = uquiver = 0;
539 u.ublessed = 0; /* not worthy yet */
540 u.ugangr = 0; /* gods not angry */
541 u.ugifts = 0; /* no divine gifts bestowed */
543 u.uevent.uhand_of_elbereth = 0;
545 u.uevent.uheard_tune = 0;
546 u.uevent.uopened_dbridge = 0;
547 u.uevent.udemigod = 0; /* not a demi-god yet... */
549 u.mh = u.mhmax = u.mtimedone = 0;
550 u.uz.dnum = u.uz0.dnum = 0;
560 u.ugrave_arise = NON_PM;
562 u.umonnum = u.umonster = (flags.female &&
563 urole.femalenum != NON_PM) ? urole.femalenum :
567 u.ulevel = 0; /* set up some of the initial attributes */
568 u.uhp = u.uhpmax = newhp();
569 u.uenmax = urole.enadv.infix + urace.enadv.infix;
570 if (urole.enadv.inrnd > 0)
571 u.uenmax += rnd(urole.enadv.inrnd);
572 if (urace.enadv.inrnd > 0)
573 u.uenmax += rnd(urace.enadv.inrnd);
577 u.ulevel = u.ulevelmax = 1;
580 for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
581 u.ublesscnt = 300; /* no prayers just yet */
582 u.ualignbase[A_CURRENT] = u.ualignbase[A_ORIGINAL] = u.ualign.type =
583 aligns[flags.initalign].value;
586 #if defined(BSD) && !defined(POSIX_TYPES)
587 (void) time((long *)&u.ubirthday);
589 (void) time(&u.ubirthday);
593 * For now, everyone starts out with a night vision range of 1 and
594 * their xray range disabled.
600 /*** Role-specific initializations ***/
601 switch (Role_switch) {
602 /* rn2(100) > 50 necessary for some choices because some
603 * random number generators are bad enough to seriously
604 * skew the results if we use rn2(2)... --KAA
606 case PM_ARCHEOLOGIST:
607 ini_inv(Archeologist);
608 if(!rn2(10)) ini_inv(Tinopener);
609 else if(!rn2(4)) ini_inv(Lamp);
610 else if(!rn2(10)) ini_inv(Magicmarker);
612 knows_object(TOUCHSTONE);
616 if (rn2(100) >= 50) { /* see above comment */
617 Barbarian[B_MAJOR].trotyp = BATTLE_AXE;
618 Barbarian[B_MINOR].trotyp = SHORT_SWORD;
621 if(!rn2(6)) ini_inv(Lamp);
622 knows_class(WEAPON_CLASS);
623 knows_class(ARMOR_CLASS);
627 Cave_man[C_AMMO].trquan = rn1(11, 10); /* 10..20 */
633 u.ugold = u.ugold0 = rn1(1000, 1001);
635 u.umoney0 = rn1(1000, 1001);
638 if(!rn2(25)) ini_inv(Lamp);
639 knows_object(POT_FULL_HEALING);
644 knows_class(WEAPON_CLASS);
645 knows_class(ARMOR_CLASS);
646 /* give knights chess-like mobility
647 * -- idea from wooledge@skybridge.scl.cwru.edu */
648 HJumping |= FROMOUTSIDE;
652 switch (rn2(90) / 30) {
653 case 0: Monk[M_BOOK].trotyp = SPE_HEALING; break;
654 case 1: Monk[M_BOOK].trotyp = SPE_PROTECTION; break;
655 case 2: Monk[M_BOOK].trotyp = SPE_SLEEP; break;
658 if(!rn2(5)) ini_inv(Magicmarker);
659 else if(!rn2(10)) ini_inv(Lamp);
660 knows_class(ARMOR_CLASS);
661 skill_init(Skill_Mon);
665 if(!rn2(10)) ini_inv(Magicmarker);
666 else if(!rn2(10)) ini_inv(Lamp);
667 knows_object(POT_WATER);
670 * Some may claim that this isn't agnostic, since they
671 * are literally "priests" and they have holy water.
672 * But we don't count it as such. Purists can always
673 * avoid playing priests and/or confirm another player's
674 * role in their YAAP.
678 Ranger[RAN_TWO_ARROWS].trquan = rn1(10, 50);
679 Ranger[RAN_ZERO_ARROWS].trquan = rn1(10, 30);
681 skill_init(Skill_Ran);
684 Rogue[R_DAGGERS].trquan = rn1(10, 6);
686 u.ugold = u.ugold0 = 0;
691 if(!rn2(5)) ini_inv(Blindfold);
696 Samurai[S_ARROWS].trquan = rn1(20, 26);
698 if(!rn2(5)) ini_inv(Blindfold);
699 knows_class(WEAPON_CLASS);
700 knows_class(ARMOR_CLASS);
705 Tourist[T_DARTS].trquan = rn1(20, 21);
707 u.ugold = u.ugold0 = rnd(1000);
709 u.umoney0 = rnd(1000);
712 if(!rn2(25)) ini_inv(Tinopener);
713 else if(!rn2(25)) ini_inv(Leash);
714 else if(!rn2(25)) ini_inv(Towel);
715 else if(!rn2(25)) ini_inv(Magicmarker);
721 if(!rn2(6)) ini_inv(Lamp);
722 knows_class(WEAPON_CLASS);
723 knows_class(ARMOR_CLASS);
728 if(!rn2(5)) ini_inv(Magicmarker);
729 if(!rn2(5)) ini_inv(Blindfold);
733 default: /* impossible */
738 /*** Race-specific initializations ***/
739 switch (Race_switch) {
741 /* Nothing special */
746 * Elves are people of music and song, or they are warriors.
747 * Non-warriors get an instrument. We use a kludge to
748 * get only non-magic instruments.
750 if (Role_if(PM_PRIEST) || Role_if(PM_WIZARD)) {
751 static int trotyp[] = {
752 WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP,
753 BELL, BUGLE, LEATHER_DRUM
755 Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))];
759 /* Elves can recognize all elvish objects */
760 knows_object(ELVEN_SHORT_SWORD);
761 knows_object(ELVEN_ARROW);
762 knows_object(ELVEN_BOW);
763 knows_object(ELVEN_SPEAR);
764 knows_object(ELVEN_DAGGER);
765 knows_object(ELVEN_BROADSWORD);
766 knows_object(ELVEN_MITHRIL_COAT);
767 knows_object(ELVEN_LEATHER_HELM);
768 knows_object(ELVEN_SHIELD);
769 knows_object(ELVEN_BOOTS);
770 knows_object(ELVEN_CLOAK);
774 /* Dwarves can recognize all dwarvish objects */
775 knows_object(DWARVISH_SPEAR);
776 knows_object(DWARVISH_SHORT_SWORD);
777 knows_object(DWARVISH_MATTOCK);
778 knows_object(DWARVISH_IRON_HELM);
779 knows_object(DWARVISH_MITHRIL_COAT);
780 knows_object(DWARVISH_CLOAK);
781 knows_object(DWARVISH_ROUNDSHIELD);
788 /* compensate for generally inferior equipment */
789 if (!Role_if(PM_WIZARD))
791 /* Orcs can recognize all orcish objects */
792 knows_object(ORCISH_SHORT_SWORD);
793 knows_object(ORCISH_ARROW);
794 knows_object(ORCISH_BOW);
795 knows_object(ORCISH_SPEAR);
796 knows_object(ORCISH_DAGGER);
797 knows_object(ORCISH_CHAIN_MAIL);
798 knows_object(ORCISH_RING_MAIL);
799 knows_object(ORCISH_HELM);
800 knows_object(ORCISH_SHIELD);
801 knows_object(URUK_HAI_SHIELD);
802 knows_object(ORCISH_CLOAK);
805 default: /* impossible */
818 u.ugold0 += hidden_gold(); /* in case sack has gold in it */
820 if (u.umoney0) ini_inv(Money);
821 u.umoney0 += hidden_gold(); /* in case sack has gold in it */
824 find_ac(); /* get initial ac value */
825 init_attr(75); /* init attribute values */
826 max_rank_sz(); /* set max str size for class ranks */
828 * Do we really need this?
830 for(i = 0; i < A_MAX; i++)
832 register int xd = rn2(7) - 2; /* biased variation */
833 (void) adjattrib(i, xd, TRUE);
834 if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i);
837 /* make sure you can carry all you have - especially for Tourists */
838 while (inv_weight() > 0) {
839 if (adjattrib(A_STR, 1, TRUE)) continue;
840 if (adjattrib(A_CON, 1, TRUE)) continue;
841 /* only get here when didn't boost strength or constitution */
848 /* skills aren't initialized, so we use the role-specific skill lists */
850 restricted_spell_discipline(otyp)
853 const struct def_skill *skills;
854 int this_skill = spell_skilltype(otyp);
856 switch (Role_switch) {
857 case PM_ARCHEOLOGIST: skills = Skill_A; break;
858 case PM_BARBARIAN: skills = Skill_B; break;
859 case PM_CAVEMAN: skills = Skill_C; break;
860 case PM_HEALER: skills = Skill_H; break;
861 case PM_KNIGHT: skills = Skill_K; break;
862 case PM_MONK: skills = Skill_Mon; break;
863 case PM_PRIEST: skills = Skill_P; break;
864 case PM_RANGER: skills = Skill_Ran; break;
865 case PM_ROGUE: skills = Skill_R; break;
866 case PM_SAMURAI: skills = Skill_S; break;
868 case PM_TOURIST: skills = Skill_T; break;
870 case PM_VALKYRIE: skills = Skill_V; break;
871 case PM_WIZARD: skills = Skill_W; break;
872 default: skills = 0; break; /* lint suppression */
875 while (skills->skill != P_NONE) {
876 if (skills->skill == this_skill) return FALSE;
884 register struct trobj *trop;
889 while (trop->trclass) {
890 if (trop->trotyp != UNDEF_TYP) {
891 otyp = (int)trop->trotyp;
892 if (urace.malenum != PM_HUMAN) {
893 /* substitute specific items for generic ones */
894 for (i = 0; inv_subs[i].race_pm != NON_PM; ++i)
895 if (inv_subs[i].race_pm == urace.malenum &&
896 otyp == inv_subs[i].item_otyp) {
897 otyp = inv_subs[i].subs_otyp;
901 obj = mksobj(otyp, TRUE, FALSE);
902 } else { /* UNDEF_TYP */
903 static NEARDATA short nocreate = STRANGE_OBJECT;
904 static NEARDATA short nocreate2 = STRANGE_OBJECT;
905 static NEARDATA short nocreate3 = STRANGE_OBJECT;
906 static NEARDATA short nocreate4 = STRANGE_OBJECT;
908 * For random objects, do not create certain overly powerful
909 * items: wand of wishing, ring of levitation, or the
910 * polymorph/polymorph control combination. Specific objects,
911 * i.e. the discovery wishing, are still OK.
912 * Also, don't get a couple of really useless items. (Note:
913 * punishment isn't "useless". Some players who start out with
914 * one will immediately read it and use the iron ball as a
917 obj = mkobj(trop->trclass, FALSE);
919 while (otyp == WAN_WISHING
925 || otyp == RIN_LEVITATION
927 /* 'useless' items */
928 || otyp == POT_HALLUCINATION
930 || otyp == SCR_AMNESIA
932 || otyp == SCR_BLANK_PAPER
933 || otyp == SPE_BLANK_PAPER
934 || otyp == RIN_AGGRAVATE_MONSTER
935 || otyp == RIN_HUNGER
936 || otyp == WAN_NOTHING
937 /* Monks don't use weapons */
938 || (otyp == SCR_ENCHANT_WEAPON &&
940 /* wizard patch -- they already have one */
941 || (otyp == SPE_FORCE_BOLT &&
943 /* powerful spells are either useless to
944 low level players or unbalancing; also
945 spells in restricted skill categories */
946 || (obj->oclass == SPBOOK_CLASS &&
947 (objects[otyp].oc_level > 3 ||
948 restricted_spell_discipline(otyp)))
951 obj = mkobj(trop->trclass, FALSE);
955 /* Don't start with +0 or negative rings */
956 if (objects[otyp].oc_charged && obj->spe <= 0)
959 /* Heavily relies on the fact that 1) we create wands
960 * before rings, 2) that we create rings before
961 * spellbooks, and that 3) not more than 1 object of a
962 * particular symbol is to be prohibited. (For more
963 * objects, we need more nocreate variables...)
969 nocreate = RIN_POLYMORPH_CONTROL;
971 case RIN_POLYMORPH_CONTROL:
972 nocreate = RIN_POLYMORPH;
973 nocreate2 = SPE_POLYMORPH;
974 nocreate3 = POT_POLYMORPH;
976 /* Don't have 2 of the same ring or spellbook */
977 if (obj->oclass == RING_CLASS ||
978 obj->oclass == SPBOOK_CLASS)
983 if (trop->trclass == COIN_CLASS) {
984 /* no "blessed" or "identified" money */
985 obj->quan = u.umoney0;
988 obj->dknown = obj->bknown = obj->rknown = 1;
989 if (objects[otyp].oc_uses_known) obj->known = 1;
991 if (obj->opoisoned && u.ualign.type != A_CHAOTIC)
993 if (obj->oclass == WEAPON_CLASS ||
994 obj->oclass == TOOL_CLASS) {
995 obj->quan = (long) trop->trquan;
997 } else if (obj->oclass == GEM_CLASS &&
998 is_graystone(obj) && obj->otyp != FLINT) {
1001 if (trop->trspe != UNDEF_SPE)
1002 obj->spe = trop->trspe;
1003 if (trop->trbless != UNDEF_BLESS)
1004 obj->blessed = trop->trbless;
1008 /* defined after setting otyp+quan + blessedness */
1009 obj->owt = weight(obj);
1012 /* Make the type known if necessary */
1013 if (OBJ_DESCR(objects[otyp]) && obj->known)
1014 discover_object(otyp, TRUE, FALSE);
1015 if (otyp == OIL_LAMP)
1016 discover_object(POT_OIL, TRUE, FALSE);
1018 if(obj->oclass == ARMOR_CLASS){
1019 if (is_shield(obj) && !uarms) {
1020 setworn(obj, W_ARMS);
1021 if (uswapwep) setuswapwep((struct obj *) 0);
1022 } else if (is_helmet(obj) && !uarmh)
1023 setworn(obj, W_ARMH);
1024 else if (is_gloves(obj) && !uarmg)
1025 setworn(obj, W_ARMG);
1027 else if (is_shirt(obj) && !uarmu)
1028 setworn(obj, W_ARMU);
1030 else if (is_cloak(obj) && !uarmc)
1031 setworn(obj, W_ARMC);
1032 else if (is_boots(obj) && !uarmf)
1033 setworn(obj, W_ARMF);
1034 else if (is_suit(obj) && !uarm)
1035 setworn(obj, W_ARM);
1038 if (obj->oclass == WEAPON_CLASS || is_weptool(obj) ||
1039 otyp == TIN_OPENER || otyp == FLINT || otyp == ROCK) {
1040 if (is_ammo(obj) || is_missile(obj)) {
1041 if (!uquiver) setuqwep(obj);
1042 } else if (!uwep) setuwep(obj);
1043 else if (!uswapwep) setuswapwep(obj);
1045 if (obj->oclass == SPBOOK_CLASS &&
1046 obj->otyp != SPE_BLANK_PAPER)
1049 #if !defined(PYRAMID_BUG) && !defined(MAC)
1050 if(--trop->trquan) continue; /* make a similar object */
1052 if(trop->trquan) { /* check if zero first */
1055 continue; /* make a similar object */