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