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