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