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