1 | /* SCCS Id: @(#)u_init.c 3.3 2000/06/11 */
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 void FDECL(ini_inv, (struct trobj *));
16 | static void FDECL(knows_object,(int));
17 | static void FDECL(knows_class,(CHAR_P));
18 | static 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 | /* 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 | { SACK, 0, TOOL_CLASS, 1, 0 },
37 | { 0, 0, 0, 0, 0 }
38 | };
39 | static struct trobj Barbarian[] = {
40 | #define B_MAJOR 0 /* two-handed sword or battle-axe */
41 | #define B_MINOR 1 /* matched with axe or short sword */
42 | { TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
43 | { AXE, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
44 | { RING_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
45 | { FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
46 | { 0, 0, 0, 0, 0 }
47 | };
48 | static struct trobj Cave_man[] = {
49 | #define C_AMMO 2
50 | { CLUB, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
51 | { SLING, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
52 | { FLINT, 0, GEM_CLASS, 15, UNDEF_BLESS }, /* quan is variable */
53 | { ROCK, 0, GEM_CLASS, 3, 0 }, /* yields 18..33 */
54 | { LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
55 | { 0, 0, 0, 0, 0 }
56 | };
57 | static struct trobj Healer[] = {
58 | { SCALPEL, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
59 | { LEATHER_GLOVES, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
60 | { STETHOSCOPE, 0, TOOL_CLASS, 1, 0 },
61 | { POT_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
62 | { POT_EXTRA_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
63 | { WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
64 | /* always blessed, so it's guaranteed readable */
65 | { SPE_HEALING, 0, SPBOOK_CLASS, 1, 1 },
66 | { SPE_EXTRA_HEALING, 0, SPBOOK_CLASS, 1, 1 },
67 | { SPE_STONE_TO_FLESH, 0, SPBOOK_CLASS, 1, 1 },
68 | { APPLE, 0, FOOD_CLASS, 5, 0 },
69 | { 0, 0, 0, 0, 0 }
70 | };
71 | static struct trobj Knight[] = {
72 | { LONG_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
73 | { SPEAR, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
74 | { RING_MAIL, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
75 | { HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
76 | { SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
77 | { LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
78 | { APPLE, 0, FOOD_CLASS, 10, 0 },
79 | { CARROT, 0, FOOD_CLASS, 10, 0 },
80 | { 0, 0, 0, 0, 0 }
81 | };
82 | static struct trobj Monk[] = {
83 | #define M_BOOK 2
84 | { LEATHER_GLOVES, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
85 | { ROBE, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
86 | { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
87 | { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS },
88 | { POT_HEALING, 0, POTION_CLASS, 3, UNDEF_BLESS },
89 | { FOOD_RATION, 0, FOOD_CLASS, 3, 0 },
90 | { APPLE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
91 | { ORANGE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
92 | /* Yes, we know fortune cookies aren't really from China. They were
93 | * invented by George Jung in Los Angeles, California, USA in 1916.
94 | */
95 | { FORTUNE_COOKIE, 0, FOOD_CLASS, 3, UNDEF_BLESS },
96 | { 0, 0, 0, 0, 0 }
97 | };
98 | static struct trobj Priest[] = {
99 | { MACE, 1, WEAPON_CLASS, 1, 1 },
100 | { ROBE, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
101 | { SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
102 | { POT_WATER, 0, POTION_CLASS, 4, 1 }, /* holy water */
103 | { CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 0 },
104 | { SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 0 },
105 | { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 2, UNDEF_BLESS },
106 | { 0, 0, 0, 0, 0 }
107 | };
108 | static struct trobj Ranger[] = {
109 | #define RAN_BOW 1
110 | #define RAN_TWO_ARROWS 2
111 | #define RAN_ZERO_ARROWS 3
112 | { DAGGER, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
113 | { BOW, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
114 | { ARROW, 2, WEAPON_CLASS, 50, UNDEF_BLESS },
115 | { ARROW, 0, WEAPON_CLASS, 30, UNDEF_BLESS },
116 | { CLOAK_OF_DISPLACEMENT, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
117 | { CRAM_RATION, 0, FOOD_CLASS, 4, 0 },
118 | { 0, 0, 0, 0, 0 }
119 | };
120 | static struct trobj Rogue[] = {
121 | #define R_DAGGERS 1
122 | { SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
123 | { DAGGER, 0, WEAPON_CLASS, 10, 0 }, /* quan is variable */
124 | { LEATHER_ARMOR, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
125 | { POT_SICKNESS, 0, POTION_CLASS, 1, 0 },
126 | { LOCK_PICK, 9, TOOL_CLASS, 1, 0 },
127 | { SACK, 0, TOOL_CLASS, 1, 0 },
128 | { 0, 0, 0, 0, 0 }
129 | };
130 | static struct trobj Samurai[] = {
131 | #define S_ARROWS 3
132 | { KATANA, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
133 | { SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, /* wakizashi */
134 | { YUMI, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
135 | { YA, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, /* variable quan */
136 | { SPLINT_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
137 | { 0, 0, 0, 0, 0 }
138 | };
139 | #ifdef TOURIST
140 | static struct trobj Tourist[] = {
141 | #define T_DARTS 0
142 | { DART, 2, WEAPON_CLASS, 25, UNDEF_BLESS }, /* quan is variable */
143 | { UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 10, 0 },
144 | { POT_EXTRA_HEALING, 0, POTION_CLASS, 2, UNDEF_BLESS },
145 | { SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 4, UNDEF_BLESS },
146 | { HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
147 | { EXPENSIVE_CAMERA, UNDEF_SPE, TOOL_CLASS, 1, 0 },
148 | { CREDIT_CARD, 0, TOOL_CLASS, 1, 0 },
149 | { 0, 0, 0, 0, 0 }
150 | };
151 | #endif
152 | static struct trobj Valkyrie[] = {
153 | { LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
154 | { DAGGER, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
155 | { SMALL_SHIELD, 3, ARMOR_CLASS, 1, UNDEF_BLESS },
156 | { FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
157 | { 0, 0, 0, 0, 0 }
158 | };
159 | static struct trobj Wizard[] = {
160 | #define W_MULTSTART 2
161 | #define W_MULTEND 6
162 | { QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 },
163 | { CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
164 | { UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
165 | { UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, UNDEF_BLESS },
166 | { UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, UNDEF_BLESS },
167 | { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, UNDEF_BLESS },
168 | { SPE_FORCE_BOLT, 0, SPBOOK_CLASS, 1, 1 },
169 | { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, UNDEF_BLESS },
170 | { 0, 0, 0, 0, 0 }
171 | };
172 |
173 | /*
174 | * Optional extra inventory items.
175 | */
176 |
177 | static struct trobj Tinopener[] = {
178 | { TIN_OPENER, 0, TOOL_CLASS, 1, 0 },
179 | { 0, 0, 0, 0, 0 }
180 | };
181 | static struct trobj Magicmarker[] = {
182 | { MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 0 },
183 | { 0, 0, 0, 0, 0 }
184 | };
185 | static struct trobj Lamp[] = {
186 | { OIL_LAMP, 1, TOOL_CLASS, 1, 0 },
187 | { 0, 0, 0, 0, 0 }
188 | };
189 | static struct trobj Blindfold[] = {
190 | { BLINDFOLD, 0, TOOL_CLASS, 1, 0 },
191 | { 0, 0, 0, 0, 0 }
192 | };
193 | static struct trobj Instrument[] = {
194 | { WOODEN_FLUTE, 0, TOOL_CLASS, 1, 0 },
195 | { 0, 0, 0, 0, 0 }
196 | };
197 | static struct trobj Xtra_food[] = {
198 | { UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 2, 0 },
199 | { 0, 0, 0, 0, 0 }
200 | };
201 | #ifdef TOURIST
202 | static struct trobj Leash[] = {
203 | { LEASH, 0, TOOL_CLASS, 1, 0 },
204 | { 0, 0, 0, 0, 0 }
205 | };
206 | static struct trobj Towel[] = {
207 | { TOWEL, 0, TOOL_CLASS, 1, 0 },
208 | { 0, 0, 0, 0, 0 }
209 | };
210 | #endif /* TOURIST */
211 | static struct trobj Wishing[] = {
212 | { WAN_WISHING, 3, WAND_CLASS, 1, 0 },
213 | { 0, 0, 0, 0, 0 }
214 | };
215 |
216 | /* race-based substitutions for initial inventory;
217 | the weaker cloak for elven rangers is intentional--they shoot better */
218 | static struct inv_sub { short race_pm, item_otyp, subs_otyp; } inv_subs[] = {
219 | { PM_ELF, DAGGER, ELVEN_DAGGER },
220 | { PM_ELF, SPEAR, ELVEN_SPEAR },
221 | { PM_ELF, SHORT_SWORD, ELVEN_SHORT_SWORD },
222 | { PM_ELF, BOW, ELVEN_BOW },
223 | { PM_ELF, ARROW, ELVEN_ARROW },
224 | { PM_ELF, HELMET, ELVEN_LEATHER_HELM },
225 | /* { PM_ELF, SMALL_SHIELD, ELVEN_SHIELD }, */
226 | { PM_ELF, CLOAK_OF_DISPLACEMENT, ELVEN_CLOAK },
227 | { PM_ELF, CRAM_RATION, LEMBAS_WAFER },
228 | { PM_ORC, DAGGER, ORCISH_DAGGER },
229 | { PM_ORC, SPEAR, ORCISH_SPEAR },
230 | { PM_ORC, SHORT_SWORD, ORCISH_SHORT_SWORD },
231 | { PM_ORC, BOW, ORCISH_BOW },
232 | { PM_ORC, ARROW, ORCISH_ARROW },
233 | { PM_ORC, HELMET, ORCISH_HELM },
234 | { PM_ORC, SMALL_SHIELD, ORCISH_SHIELD },
235 | { PM_ORC, RING_MAIL, ORCISH_RING_MAIL },
236 | { PM_ORC, CHAIN_MAIL, ORCISH_CHAIN_MAIL },
237 | { PM_DWARF, SPEAR, DWARVISH_SPEAR },
238 | { PM_DWARF, SHORT_SWORD, DWARVISH_SHORT_SWORD },
239 | { PM_DWARF, HELMET, DWARVISH_IRON_HELM },
240 | /* { PM_DWARF, SMALL_SHIELD, DWARVISH_ROUNDSHIELD }, */
241 | /* { PM_DWARF, PICK_AXE, DWARVISH_MATTOCK }, */
242 | { PM_GNOME, BOW, CROSSBOW },
243 | { PM_GNOME, ARROW, CROSSBOW_BOLT },
244 | { NON_PM, STRANGE_OBJECT, STRANGE_OBJECT }
245 | };
246 |
247 | static struct def_skill Skill_A[] = {
248 | { P_DAGGER, P_BASIC }, { P_KNIFE, P_BASIC },
249 | { P_PICK_AXE, P_EXPERT }, { P_SHORT_SWORD, P_BASIC },
250 | { P_SCIMITAR, P_SKILLED }, { P_SABER, P_EXPERT },
251 | { P_CLUB, P_SKILLED }, { P_QUARTERSTAFF, P_SKILLED },
252 | { P_SLING, P_SKILLED }, { P_DART, P_BASIC },
253 | { P_BOOMERANG, P_EXPERT }, { P_WHIP, P_EXPERT },
254 | { P_UNICORN_HORN, P_SKILLED },
255 | { P_ATTACK_SPELL, P_BASIC }, { P_HEALING_SPELL, P_BASIC },
256 | { P_DIVINATION_SPELL, P_EXPERT}, { P_MATTER_SPELL, P_BASIC},
257 | #ifdef STEED
258 | { P_RIDING, P_BASIC },
259 | #endif
260 | { P_TWO_WEAPON_COMBAT, P_BASIC },
261 | { P_BARE_HANDED_COMBAT, P_EXPERT },
262 | { P_NONE, 0 }
263 | };
264 |
265 | static struct def_skill Skill_B[] = {
266 | { P_DAGGER, P_BASIC }, { P_AXE, P_EXPERT },
267 | { P_PICK_AXE, P_EXPERT }, { P_SHORT_SWORD, P_BASIC },
268 | { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_SKILLED },
269 | { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_SKILLED },
270 | { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED },
271 | { P_MACE, P_SKILLED }, { P_MORNING_STAR, P_SKILLED },
272 | { P_FLAIL, P_BASIC }, { P_HAMMER, P_EXPERT },
273 | { P_QUARTERSTAFF, P_BASIC }, { P_SPEAR, P_SKILLED },
274 | { P_TRIDENT, P_SKILLED }, { P_BOW, P_BASIC },
275 | { P_ATTACK_SPELL, P_SKILLED },
276 | #ifdef STEED
277 | { P_RIDING, P_BASIC },
278 | #endif
279 | { P_TWO_WEAPON_COMBAT, P_BASIC },
280 | { P_BARE_HANDED_COMBAT, P_GRAND_MASTER },
281 | { P_NONE, 0 }
282 | };
283 |
284 | static struct def_skill Skill_C[] = {
285 | { P_DAGGER, P_BASIC }, { P_KNIFE, P_SKILLED },
286 | { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC },
287 | { P_CLUB, P_EXPERT }, { P_MACE, P_EXPERT },
288 | { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_SKILLED },
289 | { P_HAMMER, P_SKILLED }, { P_QUARTERSTAFF, P_EXPERT },
290 | { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_EXPERT },
291 | { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED },
292 | { P_BOW, P_SKILLED }, { P_SLING, P_EXPERT },
293 | { P_ATTACK_SPELL, P_BASIC }, { P_MATTER_SPELL, P_SKILLED },
294 | { P_BOOMERANG, P_EXPERT }, { P_UNICORN_HORN, P_BASIC },
295 | { P_BARE_HANDED_COMBAT, P_GRAND_MASTER },
296 | { P_NONE, 0 }
297 | };
298 |
299 | static struct def_skill Skill_H[] = {
300 | { P_DAGGER, P_SKILLED }, { P_KNIFE, P_EXPERT },
301 | { P_SHORT_SWORD, P_SKILLED }, { P_SCIMITAR, P_BASIC },
302 | { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED },
303 | { P_MACE, P_BASIC }, { P_QUARTERSTAFF, P_EXPERT },
304 | { P_POLEARMS, P_BASIC }, { P_SPEAR, P_BASIC },
305 | { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC },
306 | { P_SLING, P_SKILLED }, { P_DART, P_EXPERT },
307 | { P_SHURIKEN, P_SKILLED }, { P_UNICORN_HORN, P_EXPERT },
308 | { P_HEALING_SPELL, P_EXPERT },
309 | { P_BARE_HANDED_COMBAT, P_BASIC },
310 | { P_NONE, 0 }
311 | };
312 |
313 | static struct def_skill Skill_K[] = {
314 | { P_DAGGER, P_BASIC }, { P_KNIFE, P_BASIC },
315 | { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC },
316 | { P_SHORT_SWORD, P_SKILLED }, { P_BROAD_SWORD, P_SKILLED },
317 | { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_SKILLED },
318 | { P_SCIMITAR, P_BASIC }, { P_SABER, P_SKILLED },
319 | { P_CLUB, P_BASIC }, { P_MACE, P_SKILLED },
320 | { P_MORNING_STAR, P_SKILLED }, { P_FLAIL, P_BASIC },
321 | { P_HAMMER, P_BASIC }, { P_POLEARMS, P_SKILLED },
322 | { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_SKILLED },
323 | { P_TRIDENT, P_BASIC }, { P_LANCE, P_EXPERT },
324 | { P_BOW, P_BASIC }, { P_CROSSBOW, P_SKILLED },
325 | { P_ATTACK_SPELL, P_SKILLED }, { P_HEALING_SPELL, P_SKILLED },
326 | { P_CLERIC_SPELL, P_SKILLED },
327 | #ifdef STEED
328 | { P_RIDING, P_EXPERT },
329 | #endif
330 | { P_TWO_WEAPON_COMBAT, P_SKILLED },
331 | { P_BARE_HANDED_COMBAT, P_EXPERT },
332 | { P_NONE, 0 }
333 | };
334 |
335 | static struct def_skill Skill_Mon[] = {
336 | { P_QUARTERSTAFF, P_BASIC }, { P_SPEAR, P_BASIC },
337 | { P_JAVELIN, P_BASIC }, { P_CROSSBOW, P_BASIC },
338 | { P_SHURIKEN, P_BASIC },
339 | { P_ATTACK_SPELL, P_BASIC }, { P_HEALING_SPELL, P_EXPERT },
340 | { P_DIVINATION_SPELL, P_BASIC },{ P_ENCHANTMENT_SPELL, P_BASIC },
341 | { P_CLERIC_SPELL, P_SKILLED }, { P_ESCAPE_SPELL, P_BASIC },
342 | { P_MATTER_SPELL, P_BASIC },
343 | { P_MARTIAL_ARTS, P_GRAND_MASTER },
344 | { P_NONE, 0 }
345 | };
346 |
347 | static struct def_skill Skill_P[] = {
348 | { P_CLUB, P_EXPERT }, { P_MACE, P_EXPERT },
349 | { P_MORNING_STAR, P_EXPERT }, { P_FLAIL, P_EXPERT },
350 | { P_HAMMER, P_EXPERT }, { P_QUARTERSTAFF, P_EXPERT },
351 | { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_SKILLED },
352 | { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED },
353 | { P_LANCE, P_BASIC }, { P_BOW, P_BASIC },
354 | { P_SLING, P_BASIC }, { P_CROSSBOW, P_BASIC },
355 | { P_DART, P_BASIC }, { P_SHURIKEN, P_BASIC },
356 | { P_BOOMERANG, P_BASIC }, { P_UNICORN_HORN, P_SKILLED },
357 | { P_HEALING_SPELL, P_EXPERT }, { P_DIVINATION_SPELL, P_EXPERT },
358 | { P_CLERIC_SPELL, P_EXPERT },
359 | { P_BARE_HANDED_COMBAT, P_BASIC },
360 | { P_NONE, 0 }
361 | };
362 |
363 | static struct def_skill Skill_R[] = {
364 | { P_DAGGER, P_EXPERT }, { P_KNIFE, P_EXPERT },
365 | { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_SKILLED },
366 | { P_LONG_SWORD, P_SKILLED }, { P_TWO_HANDED_SWORD, P_BASIC },
367 | { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED },
368 | { P_CLUB, P_SKILLED }, { P_MACE, P_SKILLED },
369 | { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_BASIC },
370 | { P_HAMMER, P_BASIC }, { P_POLEARMS, P_BASIC },
371 | { P_SPEAR, P_BASIC }, { P_CROSSBOW, P_EXPERT },
372 | { P_DART, P_EXPERT }, { P_SHURIKEN, P_SKILLED },
373 | { P_DIVINATION_SPELL, P_SKILLED }, { P_ESCAPE_SPELL, P_SKILLED },
374 | { P_MATTER_SPELL, P_SKILLED },
375 | #ifdef STEED
376 | { P_RIDING, P_BASIC },
377 | #endif
378 | { P_TWO_WEAPON_COMBAT, P_EXPERT },
379 | { P_BARE_HANDED_COMBAT, P_EXPERT },
380 | { P_NONE, 0 }
381 | };
382 |
383 | static struct def_skill Skill_Ran[] = {
384 | { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED },
385 | { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC },
386 | { P_SHORT_SWORD, P_BASIC }, { P_MORNING_STAR, P_BASIC },
387 | { P_FLAIL, P_SKILLED }, { P_HAMMER, P_BASIC },
388 | { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED },
389 | { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_EXPERT },
390 | { P_TRIDENT, P_BASIC }, { P_BOW, P_EXPERT },
391 | { P_SLING, P_EXPERT }, { P_CROSSBOW, P_EXPERT },
392 | { P_DART, P_EXPERT }, { P_SHURIKEN, P_SKILLED },
393 | { P_BOOMERANG, P_EXPERT }, { P_WHIP, P_BASIC },
394 | { P_HEALING_SPELL, P_BASIC },
395 | { P_DIVINATION_SPELL, P_EXPERT },
396 | { P_ESCAPE_SPELL, P_BASIC },
397 | #ifdef STEED
398 | { P_RIDING, P_BASIC },
399 | #endif
400 | { P_BARE_HANDED_COMBAT, P_BASIC },
401 | { P_NONE, 0 }
402 | };
403 |
404 | static struct def_skill Skill_S[] = {
405 | { P_DAGGER, P_BASIC }, { P_KNIFE, P_SKILLED },
406 | { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_SKILLED },
407 | { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_EXPERT },
408 | { P_SCIMITAR, P_BASIC }, { P_SABER, P_BASIC },
409 | { P_FLAIL, P_SKILLED }, { P_QUARTERSTAFF, P_BASIC },
410 | { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_BASIC },
411 | { P_JAVELIN, P_BASIC }, { P_LANCE, P_SKILLED },
412 | { P_BOW, P_EXPERT }, { P_SHURIKEN, P_EXPERT },
413 | { P_ATTACK_SPELL, P_SKILLED }, { P_CLERIC_SPELL, P_SKILLED },
414 | #ifdef STEED
415 | { P_RIDING, P_SKILLED },
416 | #endif
417 | { P_TWO_WEAPON_COMBAT, P_EXPERT },
418 | { P_MARTIAL_ARTS, P_GRAND_MASTER },
419 | { P_NONE, 0 }
420 | };
421 |
422 | #ifdef TOURIST
423 | static struct def_skill Skill_T[] = {
424 | { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED },
425 | { P_AXE, P_BASIC }, { P_PICK_AXE, P_BASIC },
426 | { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_BASIC },
427 | { P_LONG_SWORD, P_BASIC }, { P_TWO_HANDED_SWORD, P_BASIC },
428 | { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED },
429 | { P_MACE, P_BASIC }, { P_MORNING_STAR, P_BASIC },
430 | { P_FLAIL, P_BASIC }, { P_HAMMER, P_BASIC },
431 | { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_BASIC },
432 | { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC },
433 | { P_TRIDENT, P_BASIC }, { P_LANCE, P_BASIC },
434 | { P_BOW, P_BASIC }, { P_SLING, P_BASIC },
435 | { P_CROSSBOW, P_BASIC }, { P_DART, P_EXPERT },
436 | { P_SHURIKEN, P_BASIC }, { P_BOOMERANG, P_BASIC },
437 | { P_WHIP, P_BASIC }, { P_UNICORN_HORN, P_SKILLED },
438 | { P_DIVINATION_SPELL, P_BASIC }, { P_ENCHANTMENT_SPELL, P_BASIC },
439 | { P_ESCAPE_SPELL, P_SKILLED },
440 | #ifdef STEED
441 | { P_RIDING, P_BASIC },
442 | #endif
443 | { P_TWO_WEAPON_COMBAT, P_SKILLED },
444 | { P_BARE_HANDED_COMBAT, P_SKILLED },
445 | { P_NONE, 0 }
446 | };
447 | #endif /* TOURIST */
448 |
449 | static struct def_skill Skill_V[] = {
450 | { P_DAGGER, P_EXPERT }, { P_AXE, P_EXPERT },
451 | { P_PICK_AXE, P_SKILLED }, { P_SHORT_SWORD, P_SKILLED },
452 | { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_EXPERT },
453 | { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_BASIC },
454 | { P_SABER, P_BASIC }, { P_HAMMER, P_EXPERT },
455 | { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED },
456 | { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_BASIC },
457 | { P_TRIDENT, P_BASIC }, { P_LANCE, P_SKILLED },
458 | { P_SLING, P_BASIC },
459 | { P_ATTACK_SPELL, P_BASIC }, { P_ESCAPE_SPELL, P_BASIC },
460 | #ifdef STEED
461 | { P_RIDING, P_SKILLED },
462 | #endif
463 | { P_TWO_WEAPON_COMBAT, P_SKILLED },
464 | { P_BARE_HANDED_COMBAT, P_EXPERT },
465 | { P_NONE, 0 }
466 | };
467 |
468 | static struct def_skill Skill_W[] = {
469 | { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED },
470 | { P_AXE, P_SKILLED }, { P_SHORT_SWORD, P_BASIC },
471 | { P_CLUB, P_SKILLED }, { P_MACE, P_BASIC },
472 | { P_QUARTERSTAFF, P_EXPERT }, { P_POLEARMS, P_SKILLED },
473 | { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC },
474 | { P_TRIDENT, P_BASIC }, { P_SLING, P_SKILLED },
475 | { P_DART, P_EXPERT }, { P_SHURIKEN, P_BASIC },
476 | { P_ATTACK_SPELL, P_EXPERT }, { P_HEALING_SPELL, P_SKILLED },
477 | { P_DIVINATION_SPELL, P_EXPERT }, { P_ENCHANTMENT_SPELL, P_SKILLED },
478 | { P_CLERIC_SPELL, P_SKILLED }, { P_ESCAPE_SPELL, P_EXPERT },
479 | { P_MATTER_SPELL, P_EXPERT },
480 | #ifdef STEED
481 | { P_RIDING, P_BASIC },
482 | #endif
483 | { P_BARE_HANDED_COMBAT, P_BASIC },
484 | { P_NONE, 0 }
485 | };
486 |
487 |
488 | static void
489 | knows_object(obj)
490 | register int obj;
491 | {
492 | discover_object(obj,TRUE,FALSE);
493 | objects[obj].oc_pre_discovered = 1; /* not a "discovery" */
494 | }
495 |
496 | /* Know ordinary (non-magical) objects of a certain class,
497 | * like all gems except the loadstone and luckstone.
498 | */
499 | static void
500 | knows_class(sym)
501 | register char sym;
502 | {
503 | register int ct;
504 | for (ct = 1; ct < NUM_OBJECTS; ct++)
505 | if (objects[ct].oc_class == sym && !objects[ct].oc_magic)
506 | knows_object(ct);
507 | }
508 |
509 | void
510 | u_init()
511 | {
512 | register int i;
513 |
514 | flags.female = flags.initgend;
515 | flags.beginner = 1;
516 |
517 | /* zero u, including pointer values --
518 | * necessary when aborting from a failed restore */
519 | (void) memset((genericptr_t)&u, 0, sizeof(u));
520 | u.ustuck = (struct monst *)0;
521 |
522 | #if 0 /* documentation of more zero values as desirable */
523 | u.usick_cause[0] = 0;
524 | u.uluck = u.moreluck = 0;
525 | # ifdef TOURIST
526 | uarmu = 0;
527 | # endif
528 | uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0;
529 | uwep = uball = uchain = uleft = uright = 0;
530 | uswapwep = uquiver = 0;
531 | u.twoweap = 0;
532 | u.ublessed = 0; /* not worthy yet */
533 | u.ugangr = 0; /* gods not angry */
534 | u.ugifts = 0; /* no divine gifts bestowed */
535 | # ifdef ELBERETH
536 | u.uevent.uhand_of_elbereth = 0;
537 | # endif
538 | u.uevent.uheard_tune = 0;
539 | u.uevent.uopened_dbridge = 0;
540 | u.uevent.udemigod = 0; /* not a demi-god yet... */
541 | u.udg_cnt = 0;
542 | u.mh = u.mhmax = u.mtimedone = 0;
543 | u.uz.dnum = u.uz0.dnum = 0;
544 | u.utotype = 0;
545 | #endif /* 0 */
546 |
547 | u.uz.dlevel = 1;
548 | u.uz0.dlevel = 0;
549 | u.utolev = u.uz;
550 |
551 | u.umoved = FALSE;
552 | u.umortality = 0;
553 | u.ugrave_arise = NON_PM;
554 |
555 | u.umonnum = u.umonster = (flags.female &&
556 | urole.femalenum != NON_PM) ? urole.femalenum :
557 | urole.malenum;
558 | set_uasmon();
559 |
560 | u.ulevel = 0; /* set up some of the initial attributes */
561 | u.uhp = u.uhpmax = newhp();
562 | u.uenmax = urole.enadv.infix + urace.enadv.infix;
563 | if (urole.enadv.inrnd > 0)
564 | u.uenmax += rnd(urole.enadv.inrnd);
565 | if (urace.enadv.inrnd > 0)
566 | u.uenmax += rnd(urace.enadv.inrnd);
567 | u.uen = u.uenmax;
568 | u.uspellprot = 0;
569 | adjabil(0,1);
570 | u.ulevel = u.ulevelmax = 1;
571 |
572 | init_uhunger();
573 | for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
574 | u.ublesscnt = 300; /* no prayers just yet */
575 | u.ualignbase[A_CURRENT] = u.ualignbase[A_ORIGINAL] = u.ualign.type =
576 | aligns[flags.initalign].value;
577 | u.ulycn = NON_PM;
578 |
579 | #ifdef BSD
580 | (void) time((long *)&u.ubirthday);
581 | #else
582 | (void) time(&u.ubirthday);
583 | #endif
584 |
585 | /*
586 | * For now, everyone starts out with a night vision range of 1 and
587 | * their xray range disabled.
588 | */
589 | u.nv_range = 1;
590 | u.xray_range = -1;
591 |
592 |
593 | /*** Role-specific initializations ***/
594 | switch (Role_switch) {
595 | /* rn2(100) > 50 necessary for some choices because some
596 | * random number generators are bad enough to seriously
597 | * skew the results if we use rn2(2)... --KAA
598 | */
599 | case PM_ARCHEOLOGIST:
600 | ini_inv(Archeologist);
601 | if(!rn2(10)) ini_inv(Tinopener);
602 | else if(!rn2(4)) ini_inv(Lamp);
603 | else if(!rn2(10)) ini_inv(Magicmarker);
604 | knows_class(GEM_CLASS);
605 | knows_object(SACK);
606 | skill_init(Skill_A);
607 | break;
608 | case PM_BARBARIAN:
609 | if (rn2(100) >= 50) { /* see above comment */
610 | Barbarian[B_MAJOR].trotyp = BATTLE_AXE;
611 | Barbarian[B_MINOR].trotyp = SHORT_SWORD;
612 | }
613 | ini_inv(Barbarian);
614 | if(!rn2(6)) ini_inv(Lamp);
615 | knows_class(WEAPON_CLASS);
616 | knows_class(ARMOR_CLASS);
617 | skill_init(Skill_B);
618 | break;
619 | case PM_CAVEMAN:
620 | Cave_man[C_AMMO].trquan = rn1(11, 10); /* 10..20 */
621 | ini_inv(Cave_man);
622 | skill_init(Skill_C);
623 | break;
624 | case PM_HEALER:
625 | u.ugold = u.ugold0 = rn1(1000, 1001);
626 | ini_inv(Healer);
627 | if(!rn2(25)) ini_inv(Lamp);
628 | knows_object(POT_FULL_HEALING);
629 | skill_init(Skill_H);
630 | break;
631 | case PM_KNIGHT:
632 | ini_inv(Knight);
633 | knows_class(WEAPON_CLASS);
634 | knows_class(ARMOR_CLASS);
635 | /* give knights chess-like mobility
636 | * -- idea from wooledge@skybridge.scl.cwru.edu */
637 | HJumping |= FROMOUTSIDE;
638 | skill_init(Skill_K);
639 | break;
640 | case PM_MONK:
641 | switch (rn2(90) / 30) {
642 | case 0: Monk[M_BOOK].trotyp = SPE_HEALING; break;
643 | case 1: Monk[M_BOOK].trotyp = SPE_PROTECTION; break;
644 | case 2: Monk[M_BOOK].trotyp = SPE_SLEEP; break;
645 | }
646 | ini_inv(Monk);
647 | if(!rn2(5)) ini_inv(Magicmarker);
648 | else if(!rn2(10)) ini_inv(Lamp);
649 | knows_class(ARMOR_CLASS);
650 | skill_init(Skill_Mon);
651 | break;
652 | case PM_PRIEST:
653 | ini_inv(Priest);
654 | if(!rn2(10)) ini_inv(Magicmarker);
655 | else if(!rn2(10)) ini_inv(Lamp);
656 | knows_object(POT_WATER);
657 | skill_init(Skill_P);
658 | /* KMH, conduct --
659 | * Some may claim that this isn't agnostic, since they
660 | * are literally "priests" and they have holy water.
661 | * But we don't count it as such. Purists can always
662 | * avoid playing priests and/or confirm another player's
663 | * role in their YAAP.
664 | */
665 | break;
666 | case PM_RANGER:
667 | #if 0 /* superseded by inv_subs[] */
668 | switch (rn2(100) / 20) {
669 | case 0: /* Special racial bow */
670 | case 1:
671 | case 2:
672 | switch (Race_switch) {
673 | case PM_ELF:
674 | Ranger[RAN_BOW].trotyp = ELVEN_BOW;
675 | Ranger[RAN_TWO_ARROWS].trotyp =
676 | Ranger[RAN_ZERO_ARROWS].trotyp = ELVEN_ARROW;
677 | break;
678 | case PM_GNOME:
679 | Ranger[RAN_BOW].trotyp = CROSSBOW;
680 | Ranger[RAN_TWO_ARROWS].trotyp =
681 | Ranger[RAN_ZERO_ARROWS].trotyp = CROSSBOW_BOLT;
682 | break;
683 | case PM_ORC:
684 | Ranger[RAN_BOW].trotyp = ORCISH_BOW;
685 | Ranger[RAN_TWO_ARROWS].trotyp =
686 | Ranger[RAN_ZERO_ARROWS].trotyp = ORCISH_ARROW;
687 | break;
688 | default: break; /* Use default bow + arrow */
689 | }
690 | break;
691 | case 3: /* Missiles */
692 | Ranger[RAN_BOW].trotyp = BOOMERANG;
693 | Ranger[RAN_TWO_ARROWS].trotyp =
694 | Ranger[RAN_ZERO_ARROWS].trotyp = DART;
695 | break;
696 | default: break; /* Use default bow + arrow */
697 | }
698 | #endif /*0*/
699 | Ranger[RAN_TWO_ARROWS].trquan = rn1(10, 50);
700 | Ranger[RAN_ZERO_ARROWS].trquan = rn1(10, 30);
701 | ini_inv(Ranger);
702 | skill_init(Skill_Ran);
703 | break;
704 | case PM_ROGUE:
705 | Rogue[R_DAGGERS].trquan = rn1(10, 6);
706 | u.ugold = u.ugold0 = 0;
707 | ini_inv(Rogue);
708 | if(!rn2(5)) ini_inv(Blindfold);
709 | knows_object(SACK);
710 | skill_init(Skill_R);
711 | break;
712 | case PM_SAMURAI:
713 | Samurai[S_ARROWS].trquan = rn1(20, 26);
714 | ini_inv(Samurai);
715 | if(!rn2(5)) ini_inv(Blindfold);
716 | knows_class(WEAPON_CLASS);
717 | knows_class(ARMOR_CLASS);
718 | skill_init(Skill_S);
719 | break;
720 | #ifdef TOURIST
721 | case PM_TOURIST:
722 | Tourist[T_DARTS].trquan = rn1(20, 21);
723 | u.ugold = u.ugold0 = rnd(1000);
724 | ini_inv(Tourist);
725 | if(!rn2(25)) ini_inv(Tinopener);
726 | else if(!rn2(25)) ini_inv(Leash);
727 | else if(!rn2(25)) ini_inv(Towel);
728 | else if(!rn2(25)) ini_inv(Magicmarker);
729 | skill_init(Skill_T);
730 | break;
731 | #endif
732 | case PM_VALKYRIE:
733 | flags.female = TRUE;
734 | ini_inv(Valkyrie);
735 | if(!rn2(6)) ini_inv(Lamp);
736 | knows_class(WEAPON_CLASS);
737 | knows_class(ARMOR_CLASS);
738 | skill_init(Skill_V);
739 | break;
740 | case PM_WIZARD:
741 | ini_inv(Wizard);
742 | if(!rn2(5)) ini_inv(Magicmarker);
743 | if(!rn2(5)) ini_inv(Blindfold);
744 | skill_init(Skill_W);
745 | break;
746 |
747 | default: /* impossible */
748 | break;
749 | }
750 |
751 |
752 | /*** Race-specific initializations ***/
753 | switch (Race_switch) {
754 | case PM_HUMAN:
755 | /* Nothing special */
756 | break;
757 |
758 | case PM_ELF:
759 | /*
760 | * Elves are people of music and song, or they are warriors.
761 | * Non-warriors get an instrument. We use a kludge to
762 | * get only non-magic instruments.
763 | */
764 | if (Role_if(PM_PRIEST) || Role_if(PM_WIZARD)) {
765 | static int trotyp[] = {
766 | WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP,
767 | BELL, BUGLE, LEATHER_DRUM
768 | };
769 | Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))];
770 | ini_inv(Instrument);
771 | }
772 |
773 | /* Elves can recognize all elvish objects */
774 | knows_object(ELVEN_SHORT_SWORD);
775 | knows_object(ELVEN_ARROW);
776 | knows_object(ELVEN_BOW);
777 | knows_object(ELVEN_SPEAR);
778 | knows_object(ELVEN_DAGGER);
779 | knows_object(ELVEN_BROADSWORD);
780 | knows_object(ELVEN_MITHRIL_COAT);
781 | knows_object(ELVEN_LEATHER_HELM);
782 | knows_object(ELVEN_SHIELD);
783 | knows_object(ELVEN_BOOTS);
784 | knows_object(ELVEN_CLOAK);
785 | break;
786 |
787 | case PM_DWARF:
788 | /* Dwarves can recognize all dwarvish objects */
789 | knows_object(DWARVISH_SPEAR);
790 | knows_object(DWARVISH_SHORT_SWORD);
791 | knows_object(DWARVISH_MATTOCK);
792 | knows_object(DWARVISH_IRON_HELM);
793 | knows_object(DWARVISH_MITHRIL_COAT);
794 | knows_object(DWARVISH_CLOAK);
795 | knows_object(DWARVISH_ROUNDSHIELD);
796 | break;
797 |
798 | case PM_GNOME:
799 | break;
800 |
801 | case PM_ORC:
802 | /* compensate for generally inferior equipment */
803 | if (!Role_if(PM_WIZARD))
804 | ini_inv(Xtra_food);
805 | /* Orcs can recognize all orcish objects */
806 | knows_object(ORCISH_SHORT_SWORD);
807 | knows_object(ORCISH_ARROW);
808 | knows_object(ORCISH_BOW);
809 | knows_object(ORCISH_SPEAR);
810 | knows_object(ORCISH_DAGGER);
811 | knows_object(ORCISH_CHAIN_MAIL);
812 | knows_object(ORCISH_RING_MAIL);
813 | knows_object(ORCISH_HELM);
814 | knows_object(ORCISH_SHIELD);
815 | knows_object(URUK_HAI_SHIELD);
816 | knows_object(ORCISH_CLOAK);
817 | break;
818 |
819 | default: /* impossible */
820 | break;
821 | }
822 |
823 | if (discover)
824 | ini_inv(Wishing);
825 |
826 | u.ugold0 += hidden_gold(); /* in case sack has gold in it */
827 |
828 | find_ac(); /* get initial ac value */
829 | init_attr(75); /* init attribute values */
830 | max_rank_sz(); /* set max str size for class ranks */
831 | /*
832 | * Do we really need this?
833 | */
834 | for(i = 0; i < A_MAX; i++)
835 | if(!rn2(20)) {
836 | register int xd = rn2(7) - 2; /* biased variation */
837 | (void) adjattrib(i, xd, TRUE);
838 | if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i);
839 | }
840 |
841 | /* make sure you can carry all you have - especially for Tourists */
842 | while (inv_weight() > 0) {
843 | if (adjattrib(A_STR, 1, TRUE)) continue;
844 | if (adjattrib(A_CON, 1, TRUE)) continue;
845 | /* only get here when didn't boost strength or constitution */
846 | break;
847 | }
848 |
849 | return;
850 | }
851 |
852 | /* skills aren't initialized, so we use the role-specific skill lists */
853 | static boolean
854 | restricted_spell_discipline(otyp)
855 | int otyp;
856 | {
857 | struct def_skill *skills;
858 | int this_skill = spell_skilltype(otyp);
859 |
860 | switch (Role_switch) {
861 | case PM_ARCHEOLOGIST: skills = Skill_A; break;
862 | case PM_BARBARIAN: skills = Skill_B; break;
863 | case PM_CAVEMAN: skills = Skill_C; break;
864 | case PM_HEALER: skills = Skill_H; break;
865 | case PM_KNIGHT: skills = Skill_K; break;
866 | case PM_MONK: skills = Skill_Mon; break;
867 | case PM_PRIEST: skills = Skill_P; break;
868 | case PM_RANGER: skills = Skill_Ran; break;
869 | case PM_ROGUE: skills = Skill_R; break;
870 | case PM_SAMURAI: skills = Skill_S; break;
871 | #ifdef TOURIST
872 | case PM_TOURIST: skills = Skill_T; break;
873 | #endif
874 | case PM_VALKYRIE: skills = Skill_V; break;
875 | case PM_WIZARD: skills = Skill_W; break;
876 | default: skills = 0; break; /* lint suppression */
877 | }
878 |
879 | while (skills->skill != P_NONE) {
880 | if (skills->skill == this_skill) return FALSE;
881 | ++skills;
882 | }
883 | return TRUE;
884 | }
885 |
886 | static void
887 | ini_inv(trop)
888 | register struct trobj *trop;
889 | {
890 | struct obj *obj;
891 | int otyp, i;
892 |
893 | while (trop->trclass) {
894 | if (trop->trotyp != UNDEF_TYP) {
895 | otyp = (int)trop->trotyp;
896 | if (urace.malenum != PM_HUMAN) {
897 | /* substitute specific items for generic ones */
898 | for (i = 0; inv_subs[i].race_pm != NON_PM; ++i)
899 | if (inv_subs[i].race_pm == urace.malenum &&
900 | otyp == inv_subs[i].item_otyp) {
901 | otyp = inv_subs[i].subs_otyp;
902 | break;
903 | }
904 | }
905 | obj = mksobj(otyp, TRUE, FALSE);
906 | } else { /* UNDEF_TYP */
907 | static NEARDATA short nocreate = STRANGE_OBJECT;
908 | static NEARDATA short nocreate2 = STRANGE_OBJECT;
909 | static NEARDATA short nocreate3 = STRANGE_OBJECT;
910 | static NEARDATA short nocreate4 = STRANGE_OBJECT;
911 | /*
912 | * For random objects, do not create certain overly powerful
913 | * items: wand of wishing, ring of levitation, or the
914 | * polymorph/polymorph control combination. Specific objects,
915 | * i.e. the discovery wishing, are still OK.
916 | * Also, don't get a couple of really useless items. (Note:
917 | * punishment isn't "useless". Some players who start out with
918 | * one will immediately read it and use the iron ball as a
919 | * weapon.)
920 | */
921 | obj = mkobj(trop->trclass, FALSE);
922 | otyp = obj->otyp;
923 | while (otyp == WAN_WISHING
924 | || otyp == nocreate
925 | || otyp == nocreate2
926 | || otyp == nocreate3
927 | || otyp == nocreate4
928 | #ifdef ELBERETH
929 | || otyp == RIN_LEVITATION
930 | #endif
931 | /* 'useless' items */
932 | || otyp == POT_HALLUCINATION
933 | || otyp == POT_ACID
934 | || otyp == SCR_AMNESIA
935 | || otyp == SCR_FIRE
936 | || otyp == SCR_STINKING_CLOUD
937 | || otyp == SCR_BLANK_PAPER
938 | || otyp == SPE_BLANK_PAPER
939 | || otyp == RIN_AGGRAVATE_MONSTER
940 | || otyp == RIN_HUNGER
941 | || otyp == WAN_NOTHING
942 | /* Monks don't use weapons */
943 | || (otyp == SCR_ENCHANT_WEAPON &&
944 | Role_if(PM_MONK))
945 | /* wizard patch -- they already have one */
946 | || (otyp == SPE_FORCE_BOLT &&
947 | Role_if(PM_WIZARD))
948 | /* powerful spells are either useless to
949 | low level players or unbalancing; also
950 | spells in restricted skill categories */
951 | || (obj->oclass == SPBOOK_CLASS &&
952 | (objects[otyp].oc_level > 3 ||
953 | restricted_spell_discipline(otyp)))
954 | ) {
955 | dealloc_obj(obj);
956 | obj = mkobj(trop->trclass, FALSE);
957 | otyp = obj->otyp;
958 | }
959 |
960 | /* Don't start with +0 or negative rings */
961 | if (objects[otyp].oc_charged && obj->spe <= 0)
962 | obj->spe = rne(3);
963 |
964 | /* Heavily relies on the fact that 1) we create wands
965 | * before rings, 2) that we create rings before
966 | * spellbooks, and that 3) not more than 1 object of a
967 | * particular symbol is to be prohibited. (For more
968 | * objects, we need more nocreate variables...)
969 | */
970 | switch (otyp) {
971 | case WAN_POLYMORPH:
972 | case RIN_POLYMORPH:
973 | case POT_POLYMORPH:
974 | nocreate = RIN_POLYMORPH_CONTROL;
975 | break;
976 | case RIN_POLYMORPH_CONTROL:
977 | nocreate = RIN_POLYMORPH;
978 | nocreate2 = SPE_POLYMORPH;
979 | nocreate3 = POT_POLYMORPH;
980 | }
981 | /* Don't have 2 of the same ring or spellbook */
982 | if (obj->oclass == RING_CLASS ||
983 | obj->oclass == SPBOOK_CLASS)
984 | nocreate4 = otyp;
985 | }
986 |
987 | obj->dknown = obj->bknown = obj->rknown = 1;
988 | if (objects[otyp].oc_uses_known) obj->known = 1;
989 | obj->cursed = 0;
990 | if (obj->opoisoned && u.ualign.type != A_CHAOTIC)
991 | obj->opoisoned = 0;
992 | if(obj->oclass == WEAPON_CLASS || obj->oclass == TOOL_CLASS) {
993 | obj->quan = (long) trop->trquan;
994 | trop->trquan = 1;
995 | }
996 | if(trop->trspe != UNDEF_SPE)
997 | obj->spe = trop->trspe;
998 | if(trop->trbless != UNDEF_BLESS)
999 | obj->blessed = trop->trbless;
1000 |
1001 | /* defined after setting otyp+quan + blessedness */
1002 | obj->owt = weight(obj);
1003 | obj = addinv(obj);
1004 |
1005 | /* Make the type known if necessary */
1006 | if (OBJ_DESCR(objects[otyp]) && obj->known)
1007 | discover_object(otyp, TRUE, FALSE);
1008 | if (otyp == OIL_LAMP)
1009 | discover_object(POT_OIL, TRUE, FALSE);
1010 |
1011 | if(obj->oclass == ARMOR_CLASS){
1012 | if (is_shield(obj) && !uarms)
1013 | setworn(obj, W_ARMS);
1014 | else if (is_helmet(obj) && !uarmh)
1015 | setworn(obj, W_ARMH);
1016 | else if (is_gloves(obj) && !uarmg)
1017 | setworn(obj, W_ARMG);
1018 | #ifdef TOURIST
1019 | else if (is_shirt(obj) && !uarmu)
1020 | setworn(obj, W_ARMU);
1021 | #endif
1022 | else if (is_cloak(obj) && !uarmc)
1023 | setworn(obj, W_ARMC);
1024 | else if (is_boots(obj) && !uarmf)
1025 | setworn(obj, W_ARMF);
1026 | else if (is_suit(obj) && !uarm)
1027 | setworn(obj, W_ARM);
1028 | }
1029 |
1030 | if (obj->oclass == WEAPON_CLASS || is_weptool(obj) ||
1031 | otyp == TIN_OPENER || otyp == FLINT || otyp == ROCK) {
1032 | if (is_ammo(obj) || is_missile(obj)) {
1033 | if (!uquiver) setuqwep(obj);
1034 | } else if (!uwep) setuwep(obj);
1035 | else if (!uswapwep) setuswapwep(obj);
1036 | }
1037 | if (obj->oclass == SPBOOK_CLASS &&
1038 | obj->otyp != SPE_BLANK_PAPER)
1039 | initialspell(obj);
1040 |
1041 | #if !defined(PYRAMID_BUG) && !defined(MAC)
1042 | if(--trop->trquan) continue; /* make a similar object */
1043 | #else
1044 | if(trop->trquan) { /* check if zero first */
1045 | --trop->trquan;
1046 | if(trop->trquan)
1047 | continue; /* make a similar object */
1048 | }
1049 | #endif
1050 | trop++;
1051 | }
1052 | }
1053 |
1054 | /*u_init.c*/