abstract
| - Below is the full text to u_init.c from the source code of NetHack 1.3d. To link to a particular line, write [[NetHack 1.3d/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 1.3 87/07/14 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* u_init.c - version 1.0.3 */ 4. 5. #include 6. #include 7. #include "hack.h" 8. #define Strcpy (void) strcpy 9. #define Strcat (void) strcat 10. #define UNDEF_TYP 0 11. #define UNDEF_SPE '\177' 12. extern struct obj *addinv(); 13. extern char *eos(); 14. extern char plname[]; 15. 16. struct you zerou; 17. char pl_character[PL_CSIZ]; 18. char *(roles[]) = { /* must all have distinct first letter */ 19. /* roles[4] & [7] may be changed for females */ 20. "Archeologist", "Tourist", "Fighter", "Knight", "Cave-man", 21. #ifdef NEWCLASS 22. "Samurai", "Ninja", "Priest", 23. #endif 24. #ifdef KAA 25. "Valkyrie", "Elf", "Healer", 26. #endif 27. "Wizard" 28. }; 29. #define NR_OF_ROLES SIZE(roles) 30. char rolesyms[NR_OF_ROLES + 1]; /* filled by u_init() */ 31. 32. struct trobj { 33. uchar trotyp; 34. schar trspe; 35. char trolet; 36. Bitfield(trquan,6); 37. Bitfield(trknown,1); 38. }; 39. 40. #ifdef WIZARD 41. struct trobj Extra_objs[] = { 42. { 0, 0, 0, 0, 0 }, 43. { 0, 0, 0, 0, 0 } 44. }; 45. #endif 46. 47. struct trobj Cave_man[] = { 48. #ifdef KAA 49. { CLUB, 1, WEAPON_SYM, 1, 1 }, 50. #else 51. { MACE, 1, WEAPON_SYM, 1, 1 }, 52. #endif 53. { BOW, 1, WEAPON_SYM, 1, 1 }, 54. { ARROW, 0, WEAPON_SYM, 25, 1 }, /* quan is variable */ 55. { LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 }, 56. { 0, 0, 0, 0, 0} 57. }; 58. 59. struct trobj Fighter[] = { 60. { TWO_HANDED_SWORD, 0, WEAPON_SYM, 1, 1 }, 61. { RING_MAIL, 0, ARMOR_SYM, 1, 1 }, 62. { 0, 0, 0, 0, 0 } 63. }; 64. 65. struct trobj Knight[] = { 66. { LONG_SWORD, 0, WEAPON_SYM, 1, 1 }, 67. { SPEAR, 2, WEAPON_SYM, 1, 1 }, 68. { RING_MAIL, 1, ARMOR_SYM, 1, 1 }, 69. { HELMET, 0, ARMOR_SYM, 1, 1 }, 70. { SHIELD, 0, ARMOR_SYM, 1, 1 }, 71. { PAIR_OF_GLOVES, 0, ARMOR_SYM, 1, 1 }, 72. { 0, 0, 0, 0, 0 } 73. }; 74. 75. #ifdef KAA 76. struct trobj Elf[] = { 77. { SHORT_SWORD, 0, WEAPON_SYM, 1, 1 }, 78. { BOW, 0, WEAPON_SYM, 1, 1 }, 79. { ARROW, 0, WEAPON_SYM, 25, 1 }, 80. { UNDEF_TYP, 0, ARMOR_SYM, 1, 1 }, 81. { 0, 0, 0, 0, 0 } 82. }; 83. 84. struct trobj Valkyrie[] = { 85. { LONG_SWORD, 1, WEAPON_SYM, 1, 1 }, 86. { SHIELD, 3, ARMOR_SYM, 1, 1 }, 87. { FOOD_RATION, 0, FOOD_SYM, 1, 1 }, 88. { 0, 0, 0, 0, 0 } 89. }; 90. 91. struct trobj Healer[] = { 92. { STETHOSCOPE, 0, TOOL_SYM, 1, 0 }, 93. { POT_HEALING, 0, POTION_SYM, 4, 0 }, 94. { POT_EXTRA_HEALING, 0, POTION_SYM, 4, 0 }, 95. { APPLE, 0, FOOD_SYM, 5, 0 }, 96. { 0, 0, 0, 0, 0} 97. }; 98. #endif /* KAA /**/ 99. 100. struct trobj Archeologist[] = { 101. { STUDDED_LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 }, 102. { UNDEF_TYP, 0, POTION_SYM, 2, 0 }, 103. { FOOD_RATION, 0, FOOD_SYM, 3, 1 }, 104. { PICK_AXE, UNDEF_SPE, TOOL_SYM, 1, 0 }, 105. { ICE_BOX, 0, TOOL_SYM, 1, 0 }, 106. { 0, 0, 0, 0, 0} 107. }; 108. 109. struct trobj Tinopener[] = { 110. { CAN_OPENER, 0, TOOL_SYM, 1, 1 }, 111. { 0, 0, 0, 0, 0 } 112. }; 113. 114. #ifdef MARKER 115. struct trobj Magicmarker[] = { 116. { MAGIC_MARKER, 50, TOOL_SYM, 1, 0 }, 117. { 0, 0, 0, 0, 0 } 118. }; 119. #endif 120. 121. #ifdef WALKIES 122. struct trobj Leash[] = { 123. { LEASH, 0, CHAIN_SYM, 1, 0 }, 124. { 0, 0, 0, 0, 0 } 125. }; 126. #endif 127. 128. struct trobj Tourist[] = { 129. { UNDEF_TYP, 0, FOOD_SYM, 10, 1 }, 130. { POT_EXTRA_HEALING, 0, POTION_SYM, 2, 0 }, 131. { EXPENSIVE_CAMERA, 0, TOOL_SYM, 1, 1 }, 132. { DART, 2, WEAPON_SYM, 25, 1 }, /* quan is variable */ 133. { 0, 0, 0, 0, 0 } 134. }; 135. 136. struct trobj Wizard[] = { 137. { ELVEN_CLOAK, 0, ARMOR_SYM, 1, 1 }, 138. { UNDEF_TYP, UNDEF_SPE, WAND_SYM, 2, 0 }, 139. { UNDEF_TYP, UNDEF_SPE, RING_SYM, 2, 0 }, 140. { UNDEF_TYP, UNDEF_SPE, POTION_SYM, 2, 0 }, 141. { UNDEF_TYP, UNDEF_SPE, SCROLL_SYM, 3, 0 }, 142. #ifdef SPELLS 143. { UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 1, 0 }, 144. #endif 145. { 0, 0, 0, 0, 0 } 146. }; 147. 148. #ifdef NEWCLASS 149. struct trobj Samurai[] = { 150. { KATANA, 0, WEAPON_SYM, 1, 1 }, 151. { BOW, 1, WEAPON_SYM, 1, 1 }, 152. { ARROW, 0, WEAPON_SYM, 25, 1 }, /* quan is variable */ 153. { SPLINT_MAIL, 0, ARMOR_SYM, 1, 1}, 154. { 0, 0, 0, 0, 0 } 155. }; 156. 157. struct trobj Ninja[] = { 158. { KATANA, 0, WEAPON_SYM, 1, 1 }, 159. { SHURIKEN, 0, WEAPON_SYM, 25, 1 }, /* quan is variable */ 160. { LEATHER_ARMOR, 1, ARMOR_SYM, 1, 1}, 161. { 0, 0, 0, 0, 0 } 162. }; 163. 164. struct trobj Priest[] = { 165. { CHAIN_MAIL, 0, ARMOR_SYM, 1, 1 }, 166. { SHIELD, 0, ARMOR_SYM, 1, 1 }, 167. { MACE, 1, WEAPON_SYM, 1, 1 }, 168. #ifdef SPELLS 169. { UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 2, 0 }, 170. #endif 171. { 0, 0, 0, 0, 0 } 172. }; 173. #endif /* NEWCLASS /**/ 174. 175. u_init(){ 176. register int i; 177. char exper = 'y', pc; 178. extern char readchar(); 179. if(flags.female) { /* should have been set in HACKOPTIONS */ 180. roles[4] = "Cave-woman"; 181. #ifdef NEWCLASS 182. roles[7] = "Priestess"; 183. #endif 184. } 185. for(i = 0; i < NR_OF_ROLES; i++) 186. rolesyms[i] = roles[i][0]; 187. rolesyms[i] = 0; 188. 189. if(pc = pl_character[0]) { 190. if('a' <= pc && pc <= 'z') pc += 'A'-'a'; 191. if((i = role_index(pc)) >= 0) 192. goto got_suffix; /* implies experienced */ 193. printf("
Unknown role: %c
", pc); 194. pl_character[0] = pc = 0; 195. } 196. 197. printf("
Shall I pick a character for you (yes, no, or quit) ? [ynq] "); 198. 199. while(!index("yYnNqQ", (exper = readchar()))) bell(); 200. 201. printf("%c
", exper); /* echo */ 202. 203. if (index("qQ", exper)) exit(0); 204. 205. if(index("Yy", exper)) { 206. exper = 0; 207. goto beginner; 208. } 209. 210. printf("
Tell me what kind of character you are:
"); 211. printf(" Are you"); 212. for(i = 0; i < NR_OF_ROLES; i++) { 213. printf(" %s %s", index("AEIOU",roles[i][0]) ? "an" : "a", roles[i]); 214. if((((i + 1) % 4) == 0) && (i != NR_OF_ROLES -1)) printf(",
"); 215. else if(i < NR_OF_ROLES - 2) printf(","); 216. if(i == NR_OF_ROLES - 2) printf(" or"); 217. } 218. printf("? [%s or q(quit)] ", rolesyms); 219. 220. while(pc = readchar()) { 221. if (pc == 'q' || pc == 'Q') exit(0); 222. if('a' <= pc && pc <= 'z') pc += 'A'-'a'; 223. if((i = role_index(pc)) >= 0) { 224. printf("%c
", pc); /* echo */ 225. (void) fflush(stdout); /* should be seen */ 226. break; 227. } 228. if(pc == '
') break; 229. bell(); 230. } 231. if(pc == '
') pc = 0; 232. 233. beginner: 234. if(!pc) { 235. i = rn2(NR_OF_ROLES); 236. pc = rolesyms[i]; 237. printf("
This game you will be %s %s%s.
", 238. (exper || index("AEIOU", roles[i][0])) ? "an" : "a", 239. exper ? "experienced " : "", roles[i]); 240. getret(); 241. /* give him some feedback in case mklev takes much time */ 242. (void) putchar('
'); 243. (void) fflush(stdout); 244. } 245. if(exper) { 246. roles[i][0] = pc; 247. } 248. 249. got_suffix: 250. 251. (void) strncpy(pl_character, roles[i], PL_CSIZ-1); 252. pl_character[PL_CSIZ-1] = 0; 253. flags.beginner = 1; 254. u = zerou; 255. u.usym = '@'; 256. u.ulevel = 1; 257. #ifdef SPELLS 258. u.uen = u.uenmax = 1; 259. #endif 260. #ifdef PRAYERS 261. u.ublesscnt = 300; /* no prayers just yet */ 262. u.ublessed = 0; /* not worthy yet */ 263. u.ugangr = 0; /* gods not angry */ 264. #endif 265. #ifdef KAA 266. u.mh = u.mhmax = u.umonnum = u.mtimedone = 0; 267. #endif 268. init_uhunger(); 269. #ifdef QUEST 270. u.uhorizon = 6; 271. #endif 272. uarm = uarm2 = uarmh = uarms = uarmg = uwep = uball = uchain = 273. uleft = uright = 0; 274. #ifdef SPELLS 275. for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL; 276. #endif 277. switch(pc) { 278. case 'c': 279. case 'C': 280. Cave_man[2].trquan = 12 + rnd(9)*rnd(9); 281. u.uhp = u.uhpmax = 16; 282. u.ustr = u.ustrmax = 18; 283. ini_inv(Cave_man); 284. break; 285. case 't': 286. case 'T': 287. #ifdef KAA 288. objects[POT_EXTRA_HEALING].oc_name_known=1; 289. #endif 290. Tourist[3].trquan = 20 + rnd(20); 291. u.ugold = u.ugold0 = rnd(1000); 292. u.uhp = u.uhpmax = 10; 293. u.ustr = u.ustrmax = 8; 294. ini_inv(Tourist); 295. if(!rn2(25)) ini_inv(Tinopener); 296. #ifdef MARKER 297. else if(!rn2(25)) ini_inv(Magicmarker); 298. #endif 299. #ifdef WALKIES 300. else if(!rn2(25)) ini_inv(Leash); 301. #endif 302. break; 303. case 'w': 304. case 'W': 305. for(i=1; i<=4; i++) if(!rn2(5)) 306. Wizard[i].trquan += rn2(3) - 1; 307. u.uhp = u.uhpmax = 15; 308. u.ustr = u.ustrmax = 16; 309. #ifdef SPELLS 310. u.uen = u.uenmax += rn2(4); 311. #endif 312. ini_inv(Wizard); 313. #ifdef MARKER 314. if(!rn2(5)) ini_inv(Magicmarker); 315. #endif 316. break; 317. case 'a': 318. case 'A': 319. Fast = INTRINSIC; 320. Stealth = INTRINSIC; 321. u.uhp = u.uhpmax = 12; 322. u.ustr = u.ustrmax = 10; 323. ini_inv(Archeologist); 324. if(!rn2(10)) ini_inv(Tinopener); 325. #ifdef MARKER 326. else if(!rn2(10)) ini_inv(Magicmarker); 327. #endif 328. break; 329. #ifdef KAA 330. case 'e': 331. case 'E': 332. Elf[2].trquan = 15+rnd(20); 333. Elf[3].trotyp = (rn2(2) ? ELFIN_CHAIN_MAIL : ELVEN_CLOAK); 334. Fast = INTRINSIC; 335. HSee_invisible = INTRINSIC; 336. u.uhp = u.uhpmax = 16; 337. u.ustr = u.ustrmax = 16; 338. ini_inv(Elf); 339. break; 340. case 'v': 341. case 'V': 342. Stealth = INTRINSIC; 343. HCold_resistance = INTRINSIC; 344. flags.female = TRUE; 345. u.uhp = u.uhpmax = 16; 346. u.ustr = u.ustrmax = 17; 347. ini_inv(Valkyrie); 348. break; 349. case 'h': 350. case 'H': 351. objects[POT_HEALING].oc_name_known=1; 352. objects[POT_EXTRA_HEALING].oc_name_known=1; 353. HPoison_resistance = INTRINSIC; 354. u.uhp = u.uhpmax = 16; 355. u.ustr = u.ustrmax = 15; 356. ini_inv(Healer); 357. break; 358. #endif 359. case 'k': 360. case 'K': 361. u.uhp = u.uhpmax = 12; 362. u.ustr = u.ustrmax = 10; 363. ini_inv(Knight); 364. break; 365. case 'f': 366. case 'F': 367. u.uhp = u.uhpmax = 14; 368. u.ustr = u.ustrmax = 17; 369. ini_inv(Fighter); 370. break; 371. #ifdef NEWCLASS 372. case 's': 373. case 'S': 374. Fast = INTRINSIC; 375. u.uhp = u.uhpmax = 16; 376. u.ustr = u.ustrmax = 16; 377. Samurai[2].trquan = 12 + rnd(9)*rnd(9); 378. ini_inv(Samurai); 379. break; 380. case 'n': 381. case 'N': 382. Fast = INTRINSIC; 383. Stealth = INTRINSIC; 384. u.uhp = u.uhpmax = 15; 385. u.ustr = u.ustrmax = 10; 386. Ninja[1].trquan = 12 + rnd(9)*rnd(9); 387. ini_inv(Ninja); 388. break; 389. case 'p': 390. case 'P': 391. u.uhp = u.uhpmax = 13; 392. u.ustr = u.ustrmax = 15; 393. # ifdef SPELLS 394. u.uen = u.uenmax += rn2(4); 395. # endif 396. ini_inv(Priest); 397. # ifdef MARKER 398. if(!rn2(10)) ini_inv(Magicmarker); 399. # endif 400. break; 401. #endif /* NEWCLASS /**/ 402. default: /* impossible */ 403. u.uhp = u.uhpmax = 12; 404. u.ustr = u.ustrmax = 16; 405. } 406. find_ac(); 407. if(!rn2(20)) { 408. register int d = rn2(7) - 2; /* biased variation */ 409. u.ustr += d; 410. u.ustrmax += d; 411. } 412. 413. #ifdef WIZARD 414. if(wizard) wiz_inv(); 415. #endif 416. 417. /* make sure he can carry all he has - especially for T's */ 418. while(inv_weight() > 0 && u.ustr < 118) 419. u.ustr++, u.ustrmax++; 420. } 421. 422. ini_inv(trop) register struct trobj *trop; { 423. register struct obj *obj; 424. extern struct obj *mkobj(); 425. while(trop->trolet) { 426. obj = mkobj(trop->trolet); 427. obj->known = trop->trknown; 428. /* not obj->dknown = 1; - let him look at it at least once */ 429. obj->cursed = 0; 430. if(obj->olet == WEAPON_SYM){ 431. obj->quan = trop->trquan; 432. trop->trquan = 1; 433. } 434. if(trop->trspe != UNDEF_SPE) 435. obj->spe = trop->trspe; 436. if(trop->trotyp != UNDEF_TYP) 437. obj->otyp = trop->trotyp; 438. else 439. if(obj->otyp == WAN_WISHING) /* gitpyr!robert */ 440. obj->otyp = WAN_DEATH; 441. obj->owt = weight(obj); /* defined after setting otyp+quan */ 442. obj = addinv(obj); 443. if(obj->olet == ARMOR_SYM){ 444. switch(obj->otyp){ 445. case SHIELD: 446. if(!uarms) setworn(obj, W_ARMS); 447. break; 448. case HELMET: 449. if(!uarmh) setworn(obj, W_ARMH); 450. break; 451. case PAIR_OF_GLOVES: 452. if(!uarmg) setworn(obj, W_ARMG); 453. break; 454. case ELVEN_CLOAK: 455. if(!uarm2) 456. setworn(obj, W_ARM); 457. break; 458. default: 459. if(!uarm) setworn(obj, W_ARM); 460. } 461. } 462. /* below changed by GAN 01/09/87 to allow wielding of 463. * pick-axe or can-opener if there is no weapon 464. */ 465. if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE || 466. obj->otyp == CAN_OPENER) 467. if(!uwep) setuwep(obj); 468. #ifndef PYRAMID_BUG 469. if(--trop->trquan) continue; /* make a similar object */ 470. #else 471. if(trop->trquan) { /* check if zero first */ 472. --trop->trquan; 473. if(trop->trquan) 474. continue; /* make a similar object */ 475. } 476. #endif 477. trop++; 478. } 479. } 480. 481. #ifdef WIZARD 482. wiz_inv(){ 483. register struct trobj *trop = &Extra_objs[0]; 484. extern char *getenv(); 485. register char *ep = getenv("INVENT"); 486. register int type; 487. while(ep && *ep) { 488. type = atoi(ep); 489. ep = index(ep, ','); 490. if(ep) while(*ep == ',' || *ep == ' ') ep++; 491. if(type <= 0 || type > NROFOBJECTS) continue; 492. trop->trotyp = type; 493. trop->trolet = objects[type].oc_olet; 494. trop->trspe = 4; 495. trop->trknown = 1; 496. trop->trquan = 1; 497. ini_inv(trop); 498. } 499. /* give him a wand of wishing by default */ 500. trop->trotyp = WAN_WISHING; 501. trop->trolet = WAND_SYM; 502. trop->trspe = 20; 503. trop->trknown = 1; 504. trop->trquan = 1; 505. ini_inv(trop); 506. } 507. #endif /* WIZARD /**/ 508. 509. plnamesuffix() { 510. register char *p; 511. if(p = rindex(plname, '-')) { 512. *p = 0; 513. pl_character[0] = p[1]; 514. pl_character[1] = 0; 515. if(!plname[0]) { 516. askname(); 517. plnamesuffix(); 518. } 519. } 520. } 521. 522. role_index(pc) 523. char pc; 524. { /* must be called only from u_init() */ 525. /* so that rolesyms[] is defined */ 526. register char *cp; 527. 528. if(cp = index(rolesyms, pc)) 529. return(cp - rolesyms); 530. return(-1); 531. }
|