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