Source:NetHack 3.4.0/attrib.c
Jump to navigation
Jump to search
Below is the full text to attrib.c from the source code of NetHack 3.4.0. To link to a particular line, write [[NetHack 3.4.0/attrib.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: @(#)attrib.c 3.4 2000/05/17 */ 2. /* Copyright 1988, 1989, 1990, 1992, M. Stephenson */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. /* attribute modification routines. */ 6. 7. #include "hack.h" 8. #include "artifact.h" 9. 10. /* #define DEBUG */ /* uncomment for debugging info */ 11. 12. #ifdef OVLB 13. 14. /* part of the output on gain or loss of attribute */ 15. static 16. const char *plusattr[] = { 17. "strong", "smart", "wise", "agile", "tough", "charismatic" 18. }, 19. *minusattr[] = { 20. "weak", "stupid", "foolish", "clumsy", "fragile", "repulsive" 21. }; 22. 23. 24. static 25. const struct innate { 26. schar ulevel; 27. long *ability; 28. const char *gainstr, *losestr; 29. } arc_abil[] = { { 1, &(HStealth), "", "" }, 30. { 1, &(HFast), "", "" }, 31. { 10, &(HSearching), "perceptive", "" }, 32. { 0, 0, 0, 0 } }, 33. 34. bar_abil[] = { { 1, &(HPoison_resistance), "", "" }, 35. { 7, &(HFast), "quick", "slow" }, 36. { 15, &(HStealth), "stealthy", "" }, 37. { 0, 0, 0, 0 } }, 38. 39. cav_abil[] = { { 7, &(HFast), "quick", "slow" }, 40. { 15, &(HWarning), "sensitive", "" }, 41. { 0, 0, 0, 0 } }, 42. 43. hea_abil[] = { { 1, &(HPoison_resistance), "", "" }, 44. { 15, &(HWarning), "sensitive", "" }, 45. { 0, 0, 0, 0 } }, 46. 47. kni_abil[] = { { 7, &(HFast), "quick", "slow" }, 48. { 0, 0, 0, 0 } }, 49. 50. mon_abil[] = { { 1, &(HFast), "", "" }, 51. { 1, &(HSleep_resistance), "", "" }, 52. { 1, &(HSee_invisible), "", "" }, 53. { 3, &(HPoison_resistance), "healthy", "" }, 54. { 5, &(HStealth), "stealthy", "" }, 55. { 7, &(HWarning), "sensitive", "" }, 56. { 9, &(HSearching), "perceptive", "unaware" }, 57. { 11, &(HFire_resistance), "cool", "warmer" }, 58. { 13, &(HCold_resistance), "warm", "cooler" }, 59. { 15, &(HShock_resistance), "insulated", "conductive" }, 60. { 17, &(HTeleport_control), "controlled","uncontrolled" }, 61. { 0, 0, 0, 0 } }, 62. 63. pri_abil[] = { { 15, &(HWarning), "sensitive", "" }, 64. { 20, &(HFire_resistance), "cool", "warmer" }, 65. { 0, 0, 0, 0 } }, 66. 67. ran_abil[] = { { 1, &(HSearching), "", "" }, 68. { 7, &(HStealth), "stealthy", "" }, 69. { 15, &(HSee_invisible), "", "" }, 70. { 0, 0, 0, 0 } }, 71. 72. rog_abil[] = { { 1, &(HStealth), "", "" }, 73. { 10, &(HSearching), "perceptive", "" }, 74. { 0, 0, 0, 0 } }, 75. 76. sam_abil[] = { { 1, &(HFast), "", "" }, 77. { 15, &(HStealth), "stealthy", "" }, 78. { 0, 0, 0, 0 } }, 79. 80. tou_abil[] = { { 10, &(HSearching), "perceptive", "" }, 81. { 20, &(HPoison_resistance), "hardy", "" }, 82. { 0, 0, 0, 0 } }, 83. 84. val_abil[] = { { 1, &(HCold_resistance), "", "" }, 85. { 1, &(HStealth), "", "" }, 86. { 7, &(HFast), "quick", "slow" }, 87. { 0, 0, 0, 0 } }, 88. 89. wiz_abil[] = { { 15, &(HWarning), "sensitive", "" }, 90. { 17, &(HTeleport_control), "controlled","uncontrolled" }, 91. { 0, 0, 0, 0 } }, 92. 93. /* Intrinsics conferred by race */ 94. elf_abil[] = { { 4, &(HSleep_resistance), "awake", "tired" }, 95. { 0, 0, 0, 0 } }, 96. 97. orc_abil[] = { { 1, &(HPoison_resistance), "", "" }, 98. { 0, 0, 0, 0 } }; 99. 100. static long next_check = 600L; /* arbitrary first setting */ 101. STATIC_DCL void NDECL(exerper); 102. 103. /* adjust an attribute; return TRUE if change is made, FALSE otherwise */ 104. boolean 105. adjattrib(ndx, incr, msgflg) 106. int ndx, incr; 107. int msgflg; /* positive => no message, zero => message, and */ 108. { /* negative => conditional (msg if change made) */ 109. if (Fixed_abil || !incr) return FALSE; 110. 111. if ((ndx == A_INT || ndx == A_WIS) 112. && uarmh && uarmh->otyp == DUNCE_CAP) { 113. if (msgflg == 0) 114. Your("cap constricts briefly, then relaxes again."); 115. return FALSE; 116. } 117. 118. if (incr > 0) { 119. if ((AMAX(ndx) >= ATTRMAX(ndx)) && (ACURR(ndx) >= AMAX(ndx))) { 120. if (msgflg == 0 && flags.verbose) 121. pline("You're already as %s as you can get.", 122. plusattr[ndx]); 123. ABASE(ndx) = AMAX(ndx) = ATTRMAX(ndx); /* just in case */ 124. return FALSE; 125. } 126. 127. ABASE(ndx) += incr; 128. if(ABASE(ndx) > AMAX(ndx)) { 129. incr = ABASE(ndx) - AMAX(ndx); 130. AMAX(ndx) += incr; 131. if(AMAX(ndx) > ATTRMAX(ndx)) 132. AMAX(ndx) = ATTRMAX(ndx); 133. ABASE(ndx) = AMAX(ndx); 134. } 135. } else { 136. if (ABASE(ndx) <= ATTRMIN(ndx)) { 137. if (msgflg == 0 && flags.verbose) 138. pline("You're already as %s as you can get.", 139. minusattr[ndx]); 140. ABASE(ndx) = ATTRMIN(ndx); /* just in case */ 141. return FALSE; 142. } 143. 144. ABASE(ndx) += incr; 145. if(ABASE(ndx) < ATTRMIN(ndx)) { 146. incr = ABASE(ndx) - ATTRMIN(ndx); 147. ABASE(ndx) = ATTRMIN(ndx); 148. AMAX(ndx) += incr; 149. if(AMAX(ndx) < ATTRMIN(ndx)) 150. AMAX(ndx) = ATTRMIN(ndx); 151. } 152. } 153. if (msgflg <= 0) 154. You_feel("%s%s!", 155. (incr > 1 || incr < -1) ? "very ": "", 156. (incr > 0) ? plusattr[ndx] : minusattr[ndx]); 157. flags.botl = 1; 158. if (moves > 1 && (ndx == A_STR || ndx == A_CON)) 159. (void)encumber_msg(); 160. return TRUE; 161. } 162. 163. void 164. gainstr(otmp, incr) 165. register struct obj *otmp; 166. register int incr; 167. { 168. int num = 1; 169. 170. if(incr) num = incr; 171. else { 172. if(ABASE(A_STR) < 18) num = (rn2(4) ? 1 : rnd(6) ); 173. else if (ABASE(A_STR) < STR18(85)) num = rnd(10); 174. } 175. (void) adjattrib(A_STR, (otmp && otmp->cursed) ? -num : num, TRUE); 176. } 177. 178. void 179. losestr(num) /* may kill you; cause may be poison or monster like 'a' */ 180. register int num; 181. { 182. int ustr = ABASE(A_STR) - num; 183. 184. while(ustr < 3) { 185. ++ustr; 186. --num; 187. if (Upolyd) { 188. u.mh -= 6; 189. u.mhmax -= 6; 190. } else { 191. u.uhp -= 6; 192. u.uhpmax -= 6; 193. } 194. } 195. (void) adjattrib(A_STR, -num, TRUE); 196. } 197. 198. void 199. change_luck(n) 200. register schar n; 201. { 202. u.uluck += n; 203. if (u.uluck < 0 && u.uluck < LUCKMIN) u.uluck = LUCKMIN; 204. if (u.uluck > 0 && u.uluck > LUCKMAX) u.uluck = LUCKMAX; 205. } 206. 207. int 208. stone_luck(parameter) 209. boolean parameter; /* So I can't think up of a good name. So sue me. --KAA */ 210. { 211. register struct obj *otmp; 212. register long bonchance = 0; 213. 214. for(otmp = invent; otmp; otmp=otmp->nobj) 215. if (otmp->otyp == LUCKSTONE 216. || (otmp->oartifact && spec_ability(otmp, SPFX_LUCK))) { 217. if (otmp->cursed) bonchance -= otmp->quan; 218. else if (otmp->blessed) bonchance += otmp->quan; 219. else if (parameter) bonchance += otmp->quan; 220. } 221. 222. return sgn((int)bonchance); 223. } 224. 225. /* there has just been an inventory change affecting a luck-granting item */ 226. void 227. set_moreluck() 228. { 229. int luckbon = stone_luck(TRUE); 230. 231. if (!luckbon && !carrying(LUCKSTONE)) u.moreluck = 0; 232. else if (luckbon >= 0) u.moreluck = LUCKADD; 233. else u.moreluck = -LUCKADD; 234. } 235. 236. #endif /* OVLB */ 237. #ifdef OVL1 238. 239. void 240. restore_attrib() 241. { 242. int i; 243. 244. for(i = 0; i < A_MAX; i++) { /* all temporary losses/gains */ 245. 246. if(ATEMP(i) && ATIME(i)) { 247. if(!(--(ATIME(i)))) { /* countdown for change */ 248. ATEMP(i) += ATEMP(i) > 0 ? -1 : 1; 249. 250. if(ATEMP(i)) /* reset timer */ 251. ATIME(i) = 100 / ACURR(A_CON); 252. } 253. } 254. } 255. (void)encumber_msg(); 256. } 257. 258. #endif /* OVL1 */ 259. #ifdef OVLB 260. 261. #define AVAL 50 /* tune value for exercise gains */ 262. 263. void 264. exercise(i, inc_or_dec) 265. int i; 266. boolean inc_or_dec; 267. { 268. #ifdef DEBUG 269. pline("Exercise:"); 270. #endif 271. if (i == A_INT || i == A_CHA) return; /* can't exercise these */ 272. 273. /* no physical exercise while polymorphed; the body's temporary */ 274. if (Upolyd && i != A_WIS) return; 275. 276. if(abs(AEXE(i)) < AVAL) { 277. /* 278. * Law of diminishing returns (Part I): 279. * 280. * Gain is harder at higher attribute values. 281. * 79% at "3" --> 0% at "18" 282. * Loss is even at all levels (50%). 283. * 284. * Note: *YES* ACURR is the right one to use. 285. */ 286. AEXE(i) += (inc_or_dec) ? (rn2(19) > ACURR(i)) : -rn2(2); 287. #ifdef DEBUG 288. pline("%s, %s AEXE = %d", 289. (i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" : 290. (i == A_DEX) ? "Dex" : "Con", 291. (inc_or_dec) ? "inc" : "dec", AEXE(i)); 292. #endif 293. } 294. if (moves > 0 && (i == A_STR || i == A_CON)) (void)encumber_msg(); 295. } 296. 297. /* hunger values - from eat.c */ 298. #define SATIATED 0 299. #define NOT_HUNGRY 1 300. #define HUNGRY 2 301. #define WEAK 3 302. #define FAINTING 4 303. #define FAINTED 5 304. #define STARVED 6 305. 306. STATIC_OVL void 307. exerper() 308. { 309. if(!(moves % 10)) { 310. /* Hunger Checks */ 311. 312. int hs = (u.uhunger > 1000) ? SATIATED : 313. (u.uhunger > 150) ? NOT_HUNGRY : 314. (u.uhunger > 50) ? HUNGRY : 315. (u.uhunger > 0) ? WEAK : FAINTING; 316. 317. #ifdef DEBUG 318. pline("exerper: Hunger checks"); 319. #endif 320. switch (hs) { 321. case SATIATED: exercise(A_DEX, FALSE); break; 322. case NOT_HUNGRY: exercise(A_CON, TRUE); break; 323. case WEAK: exercise(A_STR, FALSE); break; 324. case FAINTING: 325. case FAINTED: exercise(A_CON, FALSE); break; 326. } 327. 328. /* Encumberance Checks */ 329. #ifdef DEBUG 330. pline("exerper: Encumber checks"); 331. #endif 332. switch (near_capacity()) { 333. case MOD_ENCUMBER: exercise(A_STR, TRUE); break; 334. case HVY_ENCUMBER: exercise(A_STR, TRUE); 335. exercise(A_DEX, FALSE); break; 336. case EXT_ENCUMBER: exercise(A_DEX, FALSE); 337. exercise(A_CON, FALSE); break; 338. } 339. 340. } 341. 342. /* status checks */ 343. if(!(moves % 5)) { 344. #ifdef DEBUG 345. pline("exerper: Status checks"); 346. #endif 347. if ((HClairvoyant & (INTRINSIC|TIMEOUT)) && 348. !BClairvoyant) exercise(A_WIS, TRUE); 349. if (HRegeneration) exercise(A_STR, TRUE); 350. 351. if(Sick || Vomiting) exercise(A_CON, FALSE); 352. if(Confusion || Hallucination) exercise(A_WIS, FALSE); 353. if((Wounded_legs 354. #ifdef STEED 355. && !u.usteed 356. #endif 357. ) || Fumbling || HStun) exercise(A_DEX, FALSE); 358. } 359. } 360. 361. void 362. exerchk() 363. { 364. int i, mod_val; 365. 366. /* Check out the periodic accumulations */ 367. exerper(); 368. 369. #ifdef DEBUG 370. if(moves >= next_check) 371. pline("exerchk: ready to test. multi = %d.", multi); 372. #endif 373. /* Are we ready for a test? */ 374. if(moves >= next_check && !multi) { 375. #ifdef DEBUG 376. pline("exerchk: testing."); 377. #endif 378. /* 379. * Law of diminishing returns (Part II): 380. * 381. * The effects of "exercise" and "abuse" wear 382. * off over time. Even if you *don't* get an 383. * increase/decrease, you lose some of the 384. * accumulated effects. 385. */ 386. for(i = 0; i < A_MAX; AEXE(i++) /= 2) { 387. 388. if(ABASE(i) >= 18 || !AEXE(i)) continue; 389. if(i == A_INT || i == A_CHA) continue;/* can't exercise these */ 390. 391. #ifdef DEBUG 392. pline("exerchk: testing %s (%d).", 393. (i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" : 394. (i == A_DEX) ? "Dex" : "Con", AEXE(i)); 395. #endif 396. /* 397. * Law of diminishing returns (Part III): 398. * 399. * You don't *always* gain by exercising. 400. * [MRS 92/10/28 - Treat Wisdom specially for balance.] 401. */ 402. if(rn2(AVAL) > ((i != A_WIS) ? abs(AEXE(i)*2/3) : abs(AEXE(i)))) 403. continue; 404. mod_val = sgn(AEXE(i)); 405. 406. #ifdef DEBUG 407. pline("exerchk: changing %d.", i); 408. #endif 409. if(adjattrib(i, mod_val, -1)) { 410. #ifdef DEBUG 411. pline("exerchk: changed %d.", i); 412. #endif 413. /* if you actually changed an attrib - zero accumulation */ 414. AEXE(i) = 0; 415. /* then print an explanation */ 416. switch(i) { 417. case A_STR: You((mod_val >0) ? 418. "must have been exercising." : 419. "must have been abusing your body."); 420. break; 421. case A_WIS: You((mod_val >0) ? 422. "must have been very observant." : 423. "haven't been paying attention."); 424. break; 425. case A_DEX: You((mod_val >0) ? 426. "must have been working on your reflexes." : 427. "haven't been working on reflexes lately."); 428. break; 429. case A_CON: You((mod_val >0) ? 430. "must be leading a healthy life-style." : 431. "haven't been watching your health."); 432. break; 433. } 434. } 435. } 436. next_check += rn1(200,800); 437. #ifdef DEBUG 438. pline("exerchk: next check at %ld.", next_check); 439. #endif 440. } 441. } 442. 443. /* next_check will otherwise have its initial 600L after a game restore */ 444. void 445. reset_attribute_clock() 446. { 447. if (moves > 600L) next_check = moves + rn1(50,800); 448. } 449. 450. 451. void 452. init_attr(np) 453. register int np; 454. { 455. register int i, x, tryct; 456. 457. 458. for(i = 0; i < A_MAX; i++) { 459. ABASE(i) = AMAX(i) = urole.attrbase[i]; 460. ATEMP(i) = ATIME(i) = 0; 461. np -= urole.attrbase[i]; 462. } 463. 464. tryct = 0; 465. while(np > 0 && tryct < 100) { 466. 467. x = rn2(100); 468. for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++) ; 469. if(i >= A_MAX) continue; /* impossible */ 470. 471. if(ABASE(i) >= ATTRMAX(i)) { 472. 473. tryct++; 474. continue; 475. } 476. tryct = 0; 477. ABASE(i)++; 478. AMAX(i)++; 479. np--; 480. } 481. 482. tryct = 0; 483. while(np < 0 && tryct < 100) { /* for redistribution */ 484. 485. x = rn2(100); 486. for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++) ; 487. if(i >= A_MAX) continue; /* impossible */ 488. 489. if(ABASE(i) <= ATTRMIN(i)) { 490. 491. tryct++; 492. continue; 493. } 494. tryct = 0; 495. ABASE(i)--; 496. AMAX(i)--; 497. np++; 498. } 499. } 500. 501. void 502. redist_attr() 503. { 504. register int i, tmp; 505. 506. for(i = 0; i < A_MAX; i++) { 507. if (i==A_INT || i==A_WIS) continue; 508. /* Polymorphing doesn't change your mind */ 509. tmp = AMAX(i); 510. AMAX(i) += (rn2(5)-2); 511. if (AMAX(i) > ATTRMAX(i)) AMAX(i) = ATTRMAX(i); 512. if (AMAX(i) < ATTRMIN(i)) AMAX(i) = ATTRMIN(i); 513. ABASE(i) = ABASE(i) * AMAX(i) / tmp; 514. /* ABASE(i) > ATTRMAX(i) is impossible */ 515. if (ABASE(i) < ATTRMIN(i)) ABASE(i) = ATTRMIN(i); 516. } 517. (void)encumber_msg(); 518. } 519. 520. void 521. adjabil(oldlevel,newlevel) 522. int oldlevel, newlevel; 523. { 524. register const struct innate *abil, *rabil; 525. long mask = FROMEXPER; 526. 527. 528. switch (Role_switch) { 529. case PM_ARCHEOLOGIST: abil = arc_abil; break; 530. case PM_BARBARIAN: abil = bar_abil; break; 531. case PM_CAVEMAN: abil = cav_abil; break; 532. case PM_HEALER: abil = hea_abil; break; 533. case PM_KNIGHT: abil = kni_abil; break; 534. case PM_MONK: abil = mon_abil; break; 535. case PM_PRIEST: abil = pri_abil; break; 536. case PM_RANGER: abil = ran_abil; break; 537. case PM_ROGUE: abil = rog_abil; break; 538. case PM_SAMURAI: abil = sam_abil; break; 539. #ifdef TOURIST 540. case PM_TOURIST: abil = tou_abil; break; 541. #endif 542. case PM_VALKYRIE: abil = val_abil; break; 543. case PM_WIZARD: abil = wiz_abil; break; 544. default: abil = 0; break; 545. } 546. 547. switch (Race_switch) { 548. case PM_ELF: rabil = elf_abil; break; 549. case PM_ORC: rabil = orc_abil; break; 550. case PM_HUMAN: 551. case PM_DWARF: 552. case PM_GNOME: 553. default: rabil = 0; break; 554. } 555. 556. while (abil || rabil) { 557. /* Have we finished with the intrinsics list? */ 558. if (!abil || !abil->ability) { 559. /* Try the race intrinsics */ 560. if (!rabil || !rabil->ability) break; 561. abil = rabil; 562. rabil = 0; 563. mask = FROMRACE; 564. } 565. 566. if(oldlevel < abil->ulevel && newlevel >= abil->ulevel) { 567. /* Abilities gained at level 1 can never be lost 568. * via level loss, only via means that remove _any_ 569. * sort of ability. A "gain" of such an ability from 570. * an outside source is devoid of meaning, so we set 571. * FROMOUTSIDE to avoid such gains. 572. */ 573. if (abil->ulevel == 1) 574. *(abil->ability) |= (mask|FROMOUTSIDE); 575. else 576. *(abil->ability) |= mask; 577. if(!(*(abil->ability) & INTRINSIC & ~mask)) { 578. if(*(abil->gainstr)) 579. You_feel("%s!", abil->gainstr); 580. } 581. } else if (oldlevel >= abil->ulevel && newlevel < abil->ulevel) { 582. *(abil->ability) &= ~mask; 583. if(!(*(abil->ability) & INTRINSIC)) { 584. if(*(abil->losestr)) 585. You_feel("%s!", abil->losestr); 586. else if(*(abil->gainstr)) 587. You_feel("less %s!", abil->gainstr); 588. } 589. } 590. abil++; 591. } 592. 593. if (oldlevel > 0) { 594. if (newlevel > oldlevel) 595. add_weapon_skill(newlevel - oldlevel); 596. else 597. lose_weapon_skill(oldlevel - newlevel); 598. } 599. } 600. 601. 602. int 603. newhp() 604. { 605. int hp, conplus; 606. 607. 608. if (u.ulevel == 0) { 609. /* Initialize hit points */ 610. hp = urole.hpadv.infix + urace.hpadv.infix; 611. if (urole.hpadv.inrnd > 0) hp += rnd(urole.hpadv.inrnd); 612. if (urace.hpadv.inrnd > 0) hp += rnd(urace.hpadv.inrnd); 613. 614. /* Initialize alignment stuff */ 615. u.ualign.type = aligns[flags.initalign].value; 616. u.ualign.record = urole.initrecord; 617. 618. return hp; 619. } else { 620. if (u.ulevel < urole.xlev) { 621. hp = urole.hpadv.lofix + urace.hpadv.lofix; 622. if (urole.hpadv.lornd > 0) hp += rnd(urole.hpadv.lornd); 623. if (urace.hpadv.lornd > 0) hp += rnd(urace.hpadv.lornd); 624. } else { 625. hp = urole.hpadv.hifix + urace.hpadv.hifix; 626. if (urole.hpadv.hirnd > 0) hp += rnd(urole.hpadv.hirnd); 627. if (urace.hpadv.hirnd > 0) hp += rnd(urace.hpadv.hirnd); 628. } 629. } 630. 631. if (ACURR(A_CON) <= 3) conplus = -2; 632. else if (ACURR(A_CON) <= 6) conplus = -1; 633. else if (ACURR(A_CON) <= 14) conplus = 0; 634. else if (ACURR(A_CON) <= 16) conplus = 1; 635. else if (ACURR(A_CON) == 17) conplus = 2; 636. else if (ACURR(A_CON) == 18) conplus = 3; 637. else conplus = 4; 638. 639. hp += conplus; 640. return((hp <= 0) ? 1 : hp); 641. } 642. 643. #endif /* OVLB */ 644. #ifdef OVL0 645. 646. schar 647. acurr(x) 648. int x; 649. { 650. register int tmp = (u.abon.a[x] + u.atemp.a[x] + u.acurr.a[x]); 651. 652. if (x == A_STR) { 653. if (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER) return(125); 654. #ifdef WIN32_BUG 655. else return(x=((tmp >= 125) ? 125 : (tmp <= 3) ? 3 : tmp)); 656. #else 657. else return((schar)((tmp >= 125) ? 125 : (tmp <= 3) ? 3 : tmp)); 658. #endif 659. } else if (x == A_CHA) { 660. if (tmp < 18 && (youmonst.data->mlet == S_NYMPH || 661. u.umonnum==PM_SUCCUBUS || u.umonnum == PM_INCUBUS)) 662. return 18; 663. } else if (x == A_INT || x == A_WIS) { 664. /* yes, this may raise int/wis if player is sufficiently 665. * stupid. there are lower levels of cognition than "dunce". 666. */ 667. if (uarmh && uarmh->otyp == DUNCE_CAP) return(6); 668. } 669. #ifdef WIN32_BUG 670. return(x=((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp)); 671. #else 672. return((schar)((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp)); 673. #endif 674. } 675. 676. /* condense clumsy ACURR(A_STR) value into value that fits into game formulas 677. */ 678. schar 679. acurrstr() 680. { 681. register int str = ACURR(A_STR); 682. 683. if (str <= 18) return((schar)str); 684. if (str <= 121) return((schar)(19 + str / 50)); /* map to 19-21 */ 685. else return((schar)(str - 100)); 686. } 687. 688. #endif /* OVL0 */ 689. #ifdef OVL2 690. 691. /* avoid possible problems with alignment overflow, and provide a centralized 692. * location for any future alignment limits 693. */ 694. void 695. adjalign(n) 696. register int n; 697. { 698. register int newalign = u.ualign.record + n; 699. 700. if(n < 0) { 701. if(newalign < u.ualign.record) 702. u.ualign.record = newalign; 703. } else 704. if(newalign > u.ualign.record) { 705. u.ualign.record = newalign; 706. if(u.ualign.record > ALIGNLIM) 707. u.ualign.record = ALIGNLIM; 708. } 709. } 710. 711. #endif /* OVL2 */ 712. 713. /*attrib.c*/