Source:NetHack 3.2.0/u init.c
(Redirected from NetHack 3.2.0/u init.c)
Jump to navigation
Jump to search
Below is the full text to u_init.c from the source code of NetHack 3.2.0. To link to a particular line, write [[NetHack 3.2.0/u_init.c#line123]], for example.
Warning! This is the source code from an old release. For the latest release, see Source code
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.
1. /* SCCS Id: @(#)u_init.c 3.2 95/12/16 */ 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. #include "hack.h" 6. 7. struct trobj { 8. short trotyp; 9. schar trspe; 10. char trclass; 11. Bitfield(trquan,6); 12. Bitfield(trbless,2); 13. }; 14. 15. static void FDECL(ini_inv, (struct trobj *)); 16. static void FDECL(knows_object,(int)); 17. static void FDECL(knows_class,(CHAR_P)); 18. static int FDECL(role_index,(CHAR_P)); 19. 20. #define UNDEF_TYP 0 21. #define UNDEF_SPE '\177' 22. #define UNDEF_BLESS 2 23. 24. static boolean random_role = FALSE; 25. 26. /* all roles must all have distinct first letter */ 27. const char *roles[] = { /* also used in options.c and winxxx.c */ 28. /* roles[2] and [6] are changed for females */ 29. /* in all cases, the corresponding male and female */ 30. /* roles must start with the same letter */ 31. "Archeologist", "Barbarian", "Caveman", "Elf", "Healer", "Knight", 32. "Priest", "Rogue", "Samurai", 33. #ifdef TOURIST 34. "Tourist", 35. #endif 36. "Valkyrie", "Wizard", 0 37. }; 38. 39. /* 40. * Initial inventory for the various roles. 41. */ 42. 43. static struct trobj Archeologist[] = { 44. /* if adventure has a name... idea from tan@uvm-gen */ 45. { BULLWHIP, 2, WEAPON_CLASS, 1, UNDEF_BLESS }, 46. { LEATHER_JACKET, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 47. { FEDORA, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 48. { FOOD_RATION, 0, FOOD_CLASS, 3, 0 }, 49. { PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS }, 50. { TINNING_KIT, 0, TOOL_CLASS, 1, UNDEF_BLESS }, 51. { SACK, 0, TOOL_CLASS, 1, 0 }, 52. { 0, 0, 0, 0, 0 } 53. }; 54. static struct trobj Barbarian[] = { 55. #define B_MAJOR 0 /* two-handed sword or battle-axe */ 56. #define B_MINOR 1 /* matched with axe or short sword */ 57. { TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 58. { AXE, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 59. { RING_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 60. { FOOD_RATION, 0, FOOD_CLASS, 1, 0 }, 61. { 0, 0, 0, 0, 0 } 62. }; 63. static struct trobj Cave_man[] = { 64. #define C_ARROWS 2 65. { CLUB, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, 66. { BOW, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, 67. { ARROW, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, /* quan is variable */ 68. { LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 69. { 0, 0, 0, 0, 0 } 70. }; 71. static struct trobj Elf[] = { 72. #define E_ARROWS 2 73. #define E_ARMOR 3 74. { ELVEN_SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 75. { ELVEN_BOW, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 76. { ELVEN_ARROW, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, 77. { UNDEF_TYP, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 78. { LEMBAS_WAFER, 0, FOOD_CLASS, 2, 0 }, 79. { 0, 0, 0, 0, 0 } 80. }; 81. static struct trobj Healer[] = { 82. { SCALPEL, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 83. { LEATHER_GLOVES, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, 84. { STETHOSCOPE, 0, TOOL_CLASS, 1, 0 }, 85. { POT_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS }, 86. { POT_EXTRA_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS }, 87. { WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS }, 88. /* always blessed, so it's guaranteed readable */ 89. { SPE_HEALING, 0, SPBOOK_CLASS, 1, 1 }, 90. { SPE_EXTRA_HEALING, 0, SPBOOK_CLASS, 1, 1 }, 91. { APPLE, 0, FOOD_CLASS, 5, 0 }, 92. { 0, 0, 0, 0, 0 } 93. }; 94. static struct trobj Knight[] = { 95. { LONG_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 96. { SPEAR, 2, WEAPON_CLASS, 1, UNDEF_BLESS }, 97. { RING_MAIL, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, 98. { HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 99. { SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 100. { LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 101. { 0, 0, 0, 0, 0 } 102. }; 103. static struct trobj Priest[] = { 104. { MACE, 1, WEAPON_CLASS, 1, 1 }, 105. { CHAIN_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 106. { SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 107. { POT_WATER, 0, POTION_CLASS, 4, 1 }, /* holy water */ 108. { CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 0 }, 109. { SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 0 }, 110. { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 2, UNDEF_BLESS }, 111. { 0, 0, 0, 0, 0 } 112. }; 113. static struct trobj Rogue[] = { 114. #define R_DAGGERS 1 115. { SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 116. { DAGGER, 0, WEAPON_CLASS, 10, 0 }, /* quan is variable */ 117. { LEATHER_ARMOR, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, 118. { POT_SICKNESS, 0, POTION_CLASS, 1, 0 }, 119. { LOCK_PICK, 9, TOOL_CLASS, 1, 0 }, 120. { SACK, 0, TOOL_CLASS, 1, 0 }, 121. { 0, 0, 0, 0, 0 } 122. }; 123. static struct trobj Samurai[] = { 124. #define S_ARROWS 3 125. { KATANA, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 126. { SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, /* wakizashi */ 127. { YUMI, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 128. { YA, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, /* variable quan */ 129. { SPLINT_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 130. { FORTUNE_COOKIE, 0, FOOD_CLASS, 3, 0 }, 131. { 0, 0, 0, 0, 0 } 132. }; 133. #ifdef TOURIST 134. static struct trobj Tourist[] = { 135. #define T_DARTS 0 136. { DART, 2, WEAPON_CLASS, 25, UNDEF_BLESS }, /* quan is variable */ 137. { UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 10, 0 }, 138. { POT_EXTRA_HEALING, 0, POTION_CLASS, 2, UNDEF_BLESS }, 139. { SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 4, UNDEF_BLESS }, 140. { HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 141. { EXPENSIVE_CAMERA, 0, TOOL_CLASS, 1, 0 }, 142. { CREDIT_CARD, 0, TOOL_CLASS, 1, 0 }, 143. { 0, 0, 0, 0, 0 } 144. }; 145. #endif 146. static struct trobj Valkyrie[] = { 147. { LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, 148. { DAGGER, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, 149. { SMALL_SHIELD, 3, ARMOR_CLASS, 1, UNDEF_BLESS }, 150. { FOOD_RATION, 0, FOOD_CLASS, 1, 0 }, 151. { 0, 0, 0, 0, 0 } 152. }; 153. static struct trobj Wizard[] = { 154. #define W_MULTSTART 2 155. #define W_MULTEND 6 156. { ATHAME, 1, WEAPON_CLASS, 1, 1 }, /* for dealing with ghosts */ 157. { CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, 158. { UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS }, 159. { UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, UNDEF_BLESS }, 160. { UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, UNDEF_BLESS }, 161. { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, UNDEF_BLESS }, 162. { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, UNDEF_BLESS }, 163. { 0, 0, 0, 0, 0 } 164. }; 165. 166. /* 167. * Optional extra inventory items. 168. */ 169. 170. static struct trobj Tinopener[] = { 171. { TIN_OPENER, 0, TOOL_CLASS, 1, 0 }, 172. { 0, 0, 0, 0, 0 } 173. }; 174. static struct trobj Magicmarker[] = { 175. { MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 0 }, 176. { 0, 0, 0, 0, 0 } 177. }; 178. static struct trobj Lamp[] = { 179. { OIL_LAMP, 1, TOOL_CLASS, 1, 0 }, 180. { 0, 0, 0, 0, 0 } 181. }; 182. static struct trobj Blindfold[] = { 183. { BLINDFOLD, 0, TOOL_CLASS, 1, 0 }, 184. { 0, 0, 0, 0, 0 } 185. }; 186. static struct trobj Instrument[] = { 187. { WOODEN_FLUTE, 0, TOOL_CLASS, 1, 0 }, 188. { 0, 0, 0, 0, 0 } 189. }; 190. #ifdef TOURIST 191. static struct trobj Leash[] = { 192. { LEASH, 0, TOOL_CLASS, 1, 0 }, 193. { 0, 0, 0, 0, 0 } 194. }; 195. static struct trobj Towel[] = { 196. { TOWEL, 0, TOOL_CLASS, 1, 0 }, 197. { 0, 0, 0, 0, 0 } 198. }; 199. #endif /* TOURIST */ 200. static struct trobj Wishing[] = { 201. { WAN_WISHING, 3, WAND_CLASS, 1, 0 }, 202. { 0, 0, 0, 0, 0 } 203. }; 204. 205. #ifdef WEAPON_SKILLS 206. static struct def_skill Skill_A[] = { 207. { P_DAGGER, P_BASIC }, { P_KNIFE, P_BASIC }, 208. { P_PICK_AXE, P_EXPERT }, { P_SHORT_SWORD, P_BASIC }, 209. { P_SCIMITAR, P_SKILLED }, { P_SABER, P_EXPERT }, 210. { P_CLUB, P_SKILLED }, { P_QUARTERSTAFF, P_SKILLED }, 211. { P_SLING, P_SKILLED }, { P_DART, P_BASIC }, 212. { P_BOOMERANG, P_EXPERT }, { P_WHIP, P_EXPERT }, 213. { P_UNICORN_HORN, P_SKILLED }, { P_TWO_WEAPON_COMBAT, P_BASIC }, 214. { P_BARE_HANDED_COMBAT, 4 }, 215. { P_NO_TYPE, 0 } 216. }; 217. 218. static struct def_skill Skill_B[] = { 219. { P_DAGGER, P_BASIC }, { P_AXE, P_EXPERT }, 220. { P_PICK_AXE, P_EXPERT }, { P_SHORT_SWORD, P_BASIC }, 221. { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_SKILLED }, 222. { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_SKILLED }, 223. { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED }, 224. { P_MACE, P_SKILLED }, { P_MORNING_STAR, P_SKILLED }, 225. { P_FLAIL, P_BASIC }, { P_HAMMER, P_EXPERT }, 226. { P_QUARTERSTAFF, P_BASIC }, { P_SPEAR, P_SKILLED }, 227. { P_TRIDENT, P_SKILLED }, { P_BOW, P_BASIC }, 228. { P_TWO_WEAPON_COMBAT, P_BASIC }, { P_BARE_HANDED_COMBAT, 6 }, 229. { P_NO_TYPE, 0 } 230. }; 231. 232. static struct def_skill Skill_C[] = { 233. { P_DAGGER, P_BASIC }, { P_KNIFE, P_SKILLED }, 234. { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC }, 235. { P_CLUB, P_EXPERT }, { P_MACE, P_EXPERT }, 236. { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_SKILLED }, 237. { P_HAMMER, P_SKILLED }, { P_QUARTERSTAFF, P_EXPERT }, 238. { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_EXPERT }, 239. { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED }, 240. { P_BOW, P_EXPERT }, { P_SLING, P_SKILLED }, 241. { P_BOOMERANG, P_EXPERT }, { P_UNICORN_HORN, P_BASIC }, 242. { P_BARE_HANDED_COMBAT, 6 }, 243. { P_NO_TYPE, 0 } 244. }; 245. 246. static struct def_skill Skill_E[] = { 247. { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, 248. { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_EXPERT }, 249. { P_LONG_SWORD, P_SKILLED }, { P_TWO_HANDED_SWORD, P_BASIC }, 250. { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED }, 251. { P_SPEAR, P_EXPERT }, { P_JAVELIN, P_BASIC }, 252. { P_BOW, P_EXPERT }, { P_SLING, P_BASIC }, 253. { P_CROSSBOW, P_BASIC }, { P_SHURIKEN, P_BASIC }, 254. { P_TWO_WEAPON_COMBAT, P_EXPERT }, { P_MARTIAL_ARTS, 2 }, 255. { P_NO_TYPE, 0 } 256. }; 257. 258. static struct def_skill Skill_H[] = { 259. { P_DAGGER, P_SKILLED }, { P_KNIFE, P_EXPERT }, 260. { P_SHORT_SWORD, P_SKILLED }, { P_SCIMITAR, P_BASIC }, 261. { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED }, 262. { P_MACE, P_BASIC }, { P_QUARTERSTAFF, P_EXPERT }, 263. { P_POLEARMS, P_BASIC }, { P_SPEAR, P_BASIC }, 264. { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC }, 265. { P_SLING, P_SKILLED }, { P_DART, P_EXPERT }, 266. { P_SHURIKEN, P_SKILLED }, { P_UNICORN_HORN, P_EXPERT }, 267. { P_BARE_HANDED_COMBAT, 2 }, 268. { P_NO_TYPE, 0 } 269. }; 270. 271. static struct def_skill Skill_K[] = { 272. { P_DAGGER, P_BASIC }, { P_KNIFE, P_BASIC }, 273. { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC }, 274. { P_SHORT_SWORD, P_SKILLED }, { P_BROAD_SWORD, P_SKILLED }, 275. { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_SKILLED }, 276. { P_SCIMITAR, P_BASIC }, { P_SABER, P_SKILLED }, 277. { P_CLUB, P_BASIC }, { P_MACE, P_SKILLED }, 278. { P_MORNING_STAR, P_SKILLED }, { P_FLAIL, P_BASIC }, 279. { P_HAMMER, P_BASIC }, { P_POLEARMS, P_SKILLED }, 280. { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_SKILLED }, 281. { P_TRIDENT, P_BASIC }, { P_LANCE, P_EXPERT }, 282. { P_BOW, P_BASIC }, { P_CROSSBOW, P_SKILLED }, 283. { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, 4 }, 284. { P_NO_TYPE, 0 } 285. }; 286. 287. static struct def_skill Skill_P[] = { 288. { P_CLUB, P_EXPERT }, { P_MACE, P_EXPERT }, 289. { P_MORNING_STAR, P_EXPERT }, { P_FLAIL, P_EXPERT }, 290. { P_HAMMER, P_EXPERT }, { P_QUARTERSTAFF, P_EXPERT }, 291. { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_SKILLED }, 292. { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED }, 293. { P_LANCE, P_BASIC }, { P_BOW, P_BASIC }, 294. { P_SLING, P_BASIC }, { P_CROSSBOW, P_BASIC }, 295. { P_DART, P_BASIC }, { P_SHURIKEN, P_BASIC }, 296. { P_BOOMERANG, P_BASIC }, { P_UNICORN_HORN, P_SKILLED }, 297. { P_NO_TYPE, 0 } 298. }; 299. 300. static struct def_skill Skill_R[] = { 301. { P_DAGGER, P_EXPERT }, { P_KNIFE, P_EXPERT }, 302. { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_SKILLED }, 303. { P_LONG_SWORD, P_SKILLED }, { P_TWO_HANDED_SWORD, P_BASIC }, 304. { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED }, 305. { P_CLUB, P_SKILLED }, { P_MACE, P_SKILLED }, 306. { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_BASIC }, 307. { P_HAMMER, P_BASIC }, { P_POLEARMS, P_BASIC }, 308. { P_SPEAR, P_BASIC }, { P_CROSSBOW, P_EXPERT }, 309. { P_DART, P_EXPERT }, { P_SHURIKEN, P_SKILLED }, 310. { P_TWO_WEAPON_COMBAT, P_EXPERT }, { P_BARE_HANDED_COMBAT, 2 }, 311. { P_NO_TYPE, 0 } 312. }; 313. 314. static struct def_skill Skill_S[] = { 315. { P_DAGGER, P_BASIC }, { P_KNIFE, P_SKILLED }, 316. { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_SKILLED }, 317. { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_EXPERT }, 318. { P_SCIMITAR, P_BASIC }, { P_SABER, P_BASIC }, 319. { P_FLAIL, P_SKILLED }, { P_QUARTERSTAFF, P_BASIC }, 320. { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_BASIC }, 321. { P_JAVELIN, P_BASIC }, { P_LANCE, P_SKILLED }, 322. { P_BOW, P_EXPERT }, { P_SHURIKEN, P_EXPERT }, 323. { P_TWO_WEAPON_COMBAT, P_EXPERT }, { P_MARTIAL_ARTS, 6 }, 324. { P_NO_TYPE, 0 } 325. }; 326. 327. #ifdef TOURIST 328. static struct def_skill Skill_T[] = { 329. { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, 330. { P_AXE, P_BASIC }, { P_PICK_AXE, P_BASIC }, 331. { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_BASIC }, 332. { P_LONG_SWORD, P_BASIC }, { P_TWO_HANDED_SWORD, P_BASIC }, 333. { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED }, 334. { P_MACE, P_BASIC }, { P_MORNING_STAR, P_BASIC }, 335. { P_FLAIL, P_BASIC }, { P_HAMMER, P_BASIC }, 336. { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_BASIC }, 337. { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, 338. { P_TRIDENT, P_BASIC }, { P_LANCE, P_BASIC }, 339. { P_BOW, P_BASIC }, { P_SLING, P_BASIC }, 340. { P_CROSSBOW, P_BASIC }, { P_DART, P_EXPERT }, 341. { P_SHURIKEN, P_BASIC }, { P_BOOMERANG, P_BASIC }, 342. { P_WHIP, P_BASIC }, { P_UNICORN_HORN, P_SKILLED }, 343. { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, 4 }, 344. { P_NO_TYPE, 0 } 345. }; 346. #endif /* TOURIST */ 347. 348. static struct def_skill Skill_V[] = { 349. { P_DAGGER, P_EXPERT }, { P_AXE, P_EXPERT }, 350. { P_PICK_AXE, P_SKILLED }, { P_SHORT_SWORD, P_SKILLED }, 351. { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_EXPERT }, 352. { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_BASIC }, 353. { P_SABER, P_BASIC }, { P_HAMMER, P_EXPERT }, 354. { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED }, 355. { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_BASIC }, 356. { P_TRIDENT, P_BASIC }, { P_LANCE, P_SKILLED }, 357. { P_SLING, P_BASIC }, { P_TWO_WEAPON_COMBAT, P_SKILLED }, 358. { P_BARE_HANDED_COMBAT, 4 }, 359. { P_NO_TYPE, 0 } 360. }; 361. 362. static struct def_skill Skill_W[] = { 363. { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, 364. { P_AXE, P_SKILLED }, { P_SHORT_SWORD, P_BASIC }, 365. { P_CLUB, P_SKILLED }, { P_MACE, P_BASIC }, 366. { P_QUARTERSTAFF, P_EXPERT }, { P_POLEARMS, P_SKILLED }, 367. { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, 368. { P_TRIDENT, P_BASIC }, { P_SLING, P_SKILLED }, 369. { P_DART, P_EXPERT }, { P_SHURIKEN, P_BASIC }, 370. { P_BARE_HANDED_COMBAT, 2 }, 371. { P_NO_TYPE, 0 } 372. }; 373. #endif /* WEAPON_SKILLS */ 374. 375. 376. static void 377. knows_object(obj) 378. register int obj; 379. { 380. makeknown(obj); 381. objects[obj].oc_pre_discovered = 1; /* not a "discovery" */ 382. } 383. 384. /* Know ordinary (non-magical) objects of a certain class, 385. * like all gems except the loadstone and luckstone. 386. */ 387. static void 388. knows_class(sym) 389. register char sym; 390. { 391. register int ct; 392. for (ct = 1; ct < NUM_OBJECTS; ct++) 393. if (objects[ct].oc_class == sym && !objects[ct].oc_magic) 394. knows_object(ct); 395. } 396. 397. static int 398. role_index(pc) 399. char pc; 400. { 401. register const char *cp; 402. 403. if ((cp = index(pl_classes, pc)) != 0) 404. return(cp - pl_classes); 405. return(-1); 406. } 407. 408. void 409. u_init() 410. { 411. register int i; 412. char pc; 413. 414. pc = pl_character[0]; 415. if(pc == '\0') { 416. /* should be unnecessary now */ 417. exit_nhwindows((char *)0); 418. terminate(EXIT_SUCCESS); 419. } 420. i = role_index(pc); 421. if (random_role) { 422. pline("This game you will be %s.", an(roles[i])); 423. display_nhwindow(WIN_MESSAGE, TRUE); 424. } 425. 426. (void) strncpy(pl_character, roles[i], PL_CSIZ-1); 427. pl_character[PL_CSIZ-1] = 0; 428. flags.beginner = 1; 429. 430. /* zero u, including pointer values -- 431. * necessary when aborting from a failed restore */ 432. (void) memset((genericptr_t)&u, 0, sizeof(u)); 433. u.ustuck = (struct monst *)0; 434. 435. #if 0 /* documentation of more zero values as desirable */ 436. u.usick_cause[0] = 0; 437. u.uluck = u.moreluck = 0; 438. # ifdef TOURIST 439. uarmu = 0; 440. # endif 441. uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0; 442. uwep = uball = uchain = uleft = uright = 0; 443. u.ublessed = 0; /* not worthy yet */ 444. u.ugangr = 0; /* gods not angry */ 445. # ifdef ELBERETH 446. u.uevent.uhand_of_elbereth = 0; 447. # endif 448. u.uevent.uheard_tune = 0; 449. u.uevent.uopened_dbridge = 0; 450. u.uevent.udemigod = 0; /* not a demi-god yet... */ 451. u.udg_cnt = 0; 452. u.mh = u.mhmax = u.mtimedone = 0; 453. u.uz.dnum = u.uz0.dnum = 0; 454. u.utotype = 0; 455. #endif /* 0 */ 456. u.uz.dlevel = 1; 457. u.uz0.dlevel = 0; 458. u.utolev = u.uz; 459. 460. u.role = pl_character[0]; 461. u.usym = S_HUMAN; 462. u.umoved = FALSE; 463. u.umortality = 0; 464. u.ugrave_arise = NON_PM; 465. 466. u.ulevel = 0; /* set up some of the initial attributes */ 467. u.uhp = u.uhpmax = newhp(); 468. adjabil(0,1); 469. u.ulevel = 1; 470. 471. init_uhunger(); 472. u.uen = u.uenmax = 2; 473. for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL; 474. u.ublesscnt = 300; /* no prayers just yet */ 475. u.umonnum = PM_PLAYERMON; 476. u.ulycn = NON_PM; 477. set_uasmon(); 478. 479. #ifdef BSD 480. (void) time((long *)&u.ubirthday); 481. #else 482. (void) time(&u.ubirthday); 483. #endif 484. 485. /* 486. * For now, everyone starts out with a night vision range of 1 and 487. * their xray range disabled. 488. */ 489. u.nv_range = 1; 490. u.xray_range = -1; 491. 492. 493. switch(pc) { 494. /* pc will always be in uppercase by this point */ 495. case 'A': 496. u.umonster = PM_ARCHEOLOGIST; 497. ini_inv(Archeologist); 498. if(!rn2(10)) ini_inv(Tinopener); 499. else if(!rn2(4)) ini_inv(Lamp); 500. else if(!rn2(10)) ini_inv(Magicmarker); 501. knows_class(GEM_CLASS); 502. knows_object(SACK); 503. #ifdef WEAPON_SKILLS 504. skill_init(Skill_A); 505. #endif /* WEAPON_SKILLS */ 506. break; 507. case 'B': 508. u.umonster = PM_BARBARIAN; 509. if (rn2(100) >= 50) { /* see Elf comment */ 510. Barbarian[B_MAJOR].trotyp = BATTLE_AXE; 511. Barbarian[B_MINOR].trotyp = SHORT_SWORD; 512. } 513. ini_inv(Barbarian); 514. if(!rn2(6)) ini_inv(Lamp); 515. knows_class(WEAPON_CLASS); 516. knows_class(ARMOR_CLASS); 517. #ifdef WEAPON_SKILLS 518. skill_init(Skill_B); 519. #endif /* WEAPON_SKILLS */ 520. break; 521. case 'C': 522. u.umonster = flags.female ? PM_CAVEWOMAN : PM_CAVEMAN; 523. Cave_man[C_ARROWS].trquan = rn1(30, 13); 524. ini_inv(Cave_man); 525. #ifdef WEAPON_SKILLS 526. skill_init(Skill_C); 527. #endif /* WEAPON_SKILLS */ 528. break; 529. case 'E': 530. u.umonster = PM_ELF; 531. Elf[E_ARROWS].trquan = rn1(20, 16); 532. Elf[E_ARMOR].trotyp = ((rn2(100) >= 50) 533. ? ELVEN_MITHRIL_COAT : ELVEN_CLOAK); 534. /* rn2(100) > 50 necessary because some random number 535. * generators are bad enough to seriously skew the 536. * results if we use rn2(2)... --KAA 537. */ 538. ini_inv(Elf); 539. /* 540. * Elves are people of music and song, or they are warriors. 541. * Warriors get mithril coats; non-warriors MAY get an 542. * instrument. We use a kludge to get only non-magic 543. * instruments. 544. */ 545. if (Elf[E_ARMOR].trotyp == ELVEN_CLOAK && !rn2(5)) { 546. static int trotyp[] = { 547. WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP, 548. BELL, BUGLE, LEATHER_DRUM 549. }; 550. Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))]; 551. ini_inv(Instrument); 552. } 553. if(!rn2(5)) ini_inv(Blindfold); 554. else if(!rn2(6)) ini_inv(Lamp); 555. knows_object(ELVEN_SHORT_SWORD); 556. knows_object(ELVEN_ARROW); 557. knows_object(ELVEN_BOW); 558. knows_object(ELVEN_SPEAR); 559. knows_object(ELVEN_DAGGER); 560. knows_object(ELVEN_BROADSWORD); 561. knows_object(ELVEN_MITHRIL_COAT); 562. knows_object(ELVEN_LEATHER_HELM); 563. knows_object(ELVEN_SHIELD); 564. knows_object(ELVEN_BOOTS); 565. knows_object(ELVEN_CLOAK); 566. #ifdef WEAPON_SKILLS 567. skill_init(Skill_E); 568. #endif /* WEAPON_SKILLS */ 569. break; 570. case 'H': 571. u.umonster = PM_HEALER; 572. u.uen = u.uenmax += rn1(4, 1); 573. u.ugold = u.ugold0 = rn1(1000, 1001); 574. ini_inv(Healer); 575. if(!rn2(25)) ini_inv(Lamp); 576. #ifdef WEAPON_SKILLS 577. skill_init(Skill_H); 578. #endif /* WEAPON_SKILLS */ 579. break; 580. case 'K': 581. u.umonster = PM_KNIGHT; 582. u.uen = u.uenmax += rn1(4, 1); 583. ini_inv(Knight); 584. knows_class(WEAPON_CLASS); 585. knows_class(ARMOR_CLASS); 586. /* give knights chess-like mobility 587. * -- idea from wooledge@skybridge.scl.cwru.edu */ 588. Jumping |= FROMOUTSIDE; 589. #ifdef WEAPON_SKILLS 590. skill_init(Skill_K); 591. #endif /* WEAPON_SKILLS */ 592. break; 593. case 'P': 594. u.umonster = flags.female ? PM_PRIESTESS : PM_PRIEST; 595. u.uen = u.uenmax += rn1(3, 4); 596. ini_inv(Priest); 597. if(!rn2(10)) ini_inv(Magicmarker); 598. else if(!rn2(10)) ini_inv(Lamp); 599. knows_object(POT_WATER); 600. #ifdef WEAPON_SKILLS 601. skill_init(Skill_P); 602. #endif /* WEAPON_SKILLS */ 603. break; 604. case 'R': 605. u.umonster = PM_ROGUE; 606. Rogue[R_DAGGERS].trquan = rn1(10, 6); 607. u.ugold = u.ugold0 = 0; 608. ini_inv(Rogue); 609. if(!rn2(5)) ini_inv(Blindfold); 610. knows_object(SACK); 611. #ifdef WEAPON_SKILLS 612. skill_init(Skill_R); 613. #endif /* WEAPON_SKILLS */ 614. break; 615. case 'S': 616. u.umonster = PM_SAMURAI; 617. Samurai[S_ARROWS].trquan = rn1(20, 26); 618. ini_inv(Samurai); 619. if(!rn2(5)) ini_inv(Blindfold); 620. knows_class(WEAPON_CLASS); 621. knows_class(ARMOR_CLASS); 622. #ifdef WEAPON_SKILLS 623. skill_init(Skill_S); 624. #endif /* WEAPON_SKILLS */ 625. break; 626. #ifdef TOURIST 627. case 'T': 628. u.umonster = PM_TOURIST; 629. Tourist[T_DARTS].trquan = rn1(20, 21); 630. u.ugold = u.ugold0 = rnd(1000); 631. ini_inv(Tourist); 632. if(!rn2(25)) ini_inv(Tinopener); 633. else if(!rn2(25)) ini_inv(Leash); 634. else if(!rn2(25)) ini_inv(Towel); 635. else if(!rn2(25)) ini_inv(Magicmarker); 636. #ifdef WEAPON_SKILLS 637. skill_init(Skill_T); 638. #endif /* WEAPON_SKILLS */ 639. break; 640. #endif 641. case 'V': 642. u.umonster = PM_VALKYRIE; 643. flags.female = TRUE; 644. ini_inv(Valkyrie); 645. if(!rn2(6)) ini_inv(Lamp); 646. knows_class(WEAPON_CLASS); 647. knows_class(ARMOR_CLASS); 648. #ifdef WEAPON_SKILLS 649. skill_init(Skill_V); 650. #endif /* WEAPON_SKILLS */ 651. break; 652. case 'W': 653. u.umonster = PM_WIZARD; 654. u.uen = u.uenmax += rn1(3, 4); 655. ini_inv(Wizard); 656. if(!rn2(5)) ini_inv(Magicmarker); 657. if(!rn2(5)) ini_inv(Blindfold); 658. #ifdef WEAPON_SKILLS 659. skill_init(Skill_W); 660. #endif /* WEAPON_SKILLS */ 661. break; 662. 663. default: /* impossible */ 664. break; 665. } 666. if (discover) 667. ini_inv(Wishing); 668. 669. u.ugold0 += hidden_gold(); /* in case sack has gold in it */ 670. 671. find_ac(); /* get initial ac value */ 672. init_attr(75); /* init attribute values */ 673. max_rank_sz(); /* set max str size for class ranks */ 674. /* 675. * Do we really need this? 676. */ 677. for(i = 0; i < A_MAX; i++) 678. if(!rn2(20)) { 679. register int xd = rn2(7) - 2; /* biased variation */ 680. (void) adjattrib(i, xd, TRUE); 681. if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i); 682. } 683. 684. /* make sure you can carry all you have - especially for Tourists */ 685. while(inv_weight() > 0 && ACURR(A_STR) < 118) 686. (void) adjattrib(A_STR, 1, TRUE); 687. /* undo exercise for wisdom due to `makeknown' of prediscovered items */ 688. AEXE(A_WIS) = 0; 689. 690. u.ualignbase[0] = u.ualignbase[1] = u.ualign.type; 691. } 692. 693. static void 694. ini_inv(trop) 695. register struct trobj *trop; 696. { 697. struct obj *obj; 698. while(trop->trclass) { 699. boolean undefined = (trop->trotyp == UNDEF_TYP); 700. 701. if (!undefined) 702. obj = mksobj((int)trop->trotyp, TRUE, FALSE); 703. else obj = mkobj(trop->trclass,FALSE); 704. 705. /* For random objects, do not create certain overly powerful 706. * items: wand of wishing, ring of levitation, or the 707. * polymorph/polymorph control combination. Specific objects, 708. * i.e. the discovery wishing, are still OK. 709. * Also, don't get a couple of really useless items. (Note: 710. * punishment isn't "useless". Some players who start out with 711. * one will immediately read it and use the iron ball as a 712. * weapon.) 713. */ 714. if (undefined) { 715. static NEARDATA short nocreate = STRANGE_OBJECT; 716. static NEARDATA short nocreate2 = STRANGE_OBJECT; 717. static NEARDATA short nocreate3 = STRANGE_OBJECT; 718. 719. while(obj->otyp == WAN_WISHING 720. || obj->otyp == nocreate 721. || obj->otyp == nocreate2 722. || obj->otyp == nocreate3 723. #ifdef ELBERETH 724. || obj->otyp == RIN_LEVITATION 725. #endif 726. /* 'useless' items */ 727. || obj->otyp == POT_HALLUCINATION 728. || obj->otyp == SCR_AMNESIA 729. || obj->otyp == SCR_FIRE 730. || obj->otyp == RIN_AGGRAVATE_MONSTER 731. || obj->otyp == RIN_HUNGER 732. || obj->otyp == WAN_NOTHING 733. /* powerful spells are either useless to 734. low level players or unbalancing */ 735. || (obj->oclass == SPBOOK_CLASS && 736. objects[obj->otyp].oc_level > 3) 737. ) { 738. dealloc_obj(obj); 739. obj = mkobj(trop->trclass, FALSE); 740. } 741. 742. /* Don't start with +0 or negative rings */ 743. if(objects[obj->otyp].oc_charged && obj->spe <= 0) 744. obj->spe = rne(3); 745. 746. /* Heavily relies on the fact that 1) we create wands 747. * before rings, 2) that we create rings before 748. * spellbooks, and that 3) not more than 1 object of a 749. * particular symbol is to be prohibited. (For more 750. * objects, we need more nocreate variables...) 751. */ 752. switch (obj->otyp) { 753. case WAN_POLYMORPH: 754. case RIN_POLYMORPH: 755. nocreate = RIN_POLYMORPH_CONTROL; 756. break; 757. case RIN_POLYMORPH_CONTROL: 758. nocreate = RIN_POLYMORPH; 759. nocreate2 = SPE_POLYMORPH; 760. } 761. /* Don't have 2 of the same ring or spellbook */ 762. if (obj->oclass == RING_CLASS || 763. obj->oclass == SPBOOK_CLASS) 764. nocreate3 = obj->otyp; 765. } 766. 767. obj->dknown = obj->bknown = obj->rknown = 1; 768. if (objects[obj->otyp].oc_uses_known) obj->known = 1; 769. obj->cursed = 0; 770. if(obj->oclass == WEAPON_CLASS || obj->oclass == TOOL_CLASS) { 771. obj->quan = (long) trop->trquan; 772. trop->trquan = 1; 773. } 774. if(trop->trspe != UNDEF_SPE) 775. obj->spe = trop->trspe; 776. if(trop->trbless != UNDEF_BLESS) 777. obj->blessed = trop->trbless; 778. 779. /* defined after setting otyp+quan + blessedness */ 780. obj->owt = weight(obj); 781. obj = addinv(obj); 782. 783. /* Make the type known if necessary */ 784. if (OBJ_DESCR(objects[obj->otyp]) && obj->known) 785. makeknown(obj->otyp); 786. if (obj->otyp == OIL_LAMP) 787. knows_object(POT_OIL); 788. 789. if(obj->oclass == ARMOR_CLASS){ 790. if (is_shield(obj) && !uarms) 791. setworn(obj, W_ARMS); 792. else if (is_helmet(obj) && !uarmh) 793. setworn(obj, W_ARMH); 794. else if (is_gloves(obj) && !uarmg) 795. setworn(obj, W_ARMG); 796. #ifdef TOURIST 797. else if (is_shirt(obj) && !uarmu) 798. setworn(obj, W_ARMU); 799. #endif 800. else if (is_cloak(obj) && !uarmc) 801. setworn(obj, W_ARMC); 802. else if (is_boots(obj) && !uarmf) 803. setworn(obj, W_ARMF); 804. else if (!uarm) 805. setworn(obj, W_ARM); 806. } 807. /* below changed by GAN 01/09/87 to allow wielding of 808. * pick-axe or can-opener if there is no weapon 809. */ 810. if(obj->oclass == WEAPON_CLASS || obj->otyp == PICK_AXE || 811. obj->otyp == TIN_OPENER) 812. if(!uwep) setuwep(obj); 813. #if !defined(PYRAMID_BUG) && !defined(MAC) 814. if(--trop->trquan) continue; /* make a similar object */ 815. #else 816. if(trop->trquan) { /* check if zero first */ 817. --trop->trquan; 818. if(trop->trquan) 819. continue; /* make a similar object */ 820. } 821. #endif 822. trop++; 823. } 824. } 825. 826. void 827. plnamesuffix() 828. { 829. register char *p; 830. if ((p = rindex(plname, '-')) != 0) { 831. *p = '\0'; 832. pl_character[0] = p[1]; 833. pl_character[1] = '\0'; 834. random_role = FALSE; 835. if(!plname[0]) { 836. askname(); 837. plnamesuffix(); 838. } 839. } 840. if (pl_character[0] == '@') { /* explicit request for random class */ 841. int i = rn2((int)strlen(pl_classes)); 842. pl_character[0] = pl_classes[i]; 843. pl_character[1] = '\0'; 844. random_role = TRUE; 845. } 846. } 847. 848. /*u_init.c*/