abstract
| - Below is the full text to exper.c from the source code of NetHack 3.2.0. To link to a particular line, write [[NetHack 3.2.0/exper.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)exper.c 3.2 96/01/21 */ 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. static long FDECL(newuexp, (int)); 8. static int FDECL(enermod, (int)); 9. 10. static long 11. newuexp(lev) 12. int lev; 13. { 14. if (lev < 10) return (10L * (1L << lev)); 15. if (lev < 20) return (10000L * (1L << (lev - 10))); 16. return (10000000L * ((long)(lev - 19))); 17. } 18. 19. static int 20. enermod(en) 21. int en; 22. { 23. if(Role_is('W') || Role_is('P')) return(2 * en); 24. else if(Role_is('H') || Role_is('K')) return((3 * en) / 2); 25. else if(Role_is('B') || Role_is('V')) return((3 * en) / 4); 26. else return(en); 27. } 28. 29. int 30. experience(mtmp, nk) /* return # of exp points for mtmp after nk killed */ 31. register struct monst *mtmp; 32. register int nk; 33. #if defined(applec) 34. # pragma unused(nk) 35. #endif 36. { 37. register struct permonst *ptr = mtmp->data; 38. int i, tmp, tmp2; 39. 40. tmp = 1 + mtmp->m_lev * mtmp->m_lev; 41. 42. /* For higher ac values, give extra experience */ 43. if((i = find_mac(mtmp)) < 3) tmp += (7 - i) * (i < 0) ? 2 : 1; 44. 45. /* For very fast monsters, give extra experience */ 46. if(ptr->mmove >= 12) tmp += (ptr->mmove >= 18) ? 5 : 3; 47. 48. /* For each "special" attack type give extra experience */ 49. for(i = 0; i < NATTK; i++) { 50. 51. tmp2 = ptr->mattk[i].aatyp; 52. if(tmp2 > AT_BUTT) { 53. 54. if(tmp2 == AT_WEAP) tmp += 5; 55. else if(tmp2 == AT_MAGC) tmp += 10; 56. else tmp += 3; 57. } 58. } 59. 60. /* For each "special" damage type give extra experience */ 61. for(i = 0; i < NATTK; i++) { 62. 63. tmp2 = ptr->mattk[i].adtyp; 64. if(tmp2 > AD_PHYS && tmp2 < AD_BLND) tmp += 2*mtmp->m_lev; 65. else if((tmp2 == AD_DRLI) || (tmp2 == AD_STON)) tmp += 50; 66. else if(tmp != AD_PHYS) tmp += mtmp->m_lev; 67. /* extra heavy damage bonus */ 68. if((int)(ptr->mattk[i].damd * ptr->mattk[i].damn) > 23) 69. tmp += mtmp->m_lev; 70. } 71. 72. /* For certain "extra nasty" monsters, give even more */ 73. if (extra_nasty(ptr)) tmp += (7 * mtmp->m_lev); 74. if (ptr->mlet == S_EEL && !Amphibious) tmp += 1000; 75. 76. /* For higher level monsters, an additional bonus is given */ 77. if(mtmp->m_lev > 8) tmp += 50; 78. 79. #ifdef MAIL 80. /* Mail daemons put up no fight. */ 81. if(mtmp->data == &mons[PM_MAIL_DAEMON]) tmp = 1; 82. #endif 83. 84. return(tmp); 85. } 86. 87. void 88. more_experienced(exp, rexp) 89. register int exp, rexp; 90. { 91. u.uexp += exp; 92. u.urexp += 4*exp + rexp; 93. if(exp 94. #ifdef SCORE_ON_BOTL 95. || flags.showscore 96. #endif 97. ) flags.botl = 1; 98. if (u.urexp >= (Role_is('W') ? 1000 : 2000)) 99. flags.beginner = 0; 100. } 101. 102. void 103. losexp() /* hit by drain life attack */ 104. { 105. register int num; 106. 107. if (resists_drli(&youmonst)) return; 108. 109. if(u.ulevel > 1) { 110. pline("Goodbye level %d.", u.ulevel--); 111. /* remove intrinsic abilities */ 112. adjabil(u.ulevel + 1, u.ulevel); 113. reset_rndmonst(NON_PM); /* new monster selection */ 114. #ifdef WEAPON_SKILLS 115. lose_weapon_skill(); 116. #endif /* WEAPON_SKILLS */ 117. } else 118. u.uhp = -1; 119. num = newhp(); 120. u.uhp -= num; 121. u.uhpmax -= num; 122. num = enermod(rn1(u.ulevel/2 + 1, 2)); /* M. Stephenson */ 123. u.uen -= num; 124. if (u.uen < 0) u.uen = 0; 125. u.uenmax -= num; 126. if (u.uenmax < 0) u.uenmax = 0; 127. u.uexp = newuexp(u.ulevel) - 1; 128. flags.botl = 1; 129. } 130. 131. /* 132. * Make experience gaining similar to AD&D(tm), whereby you can at most go 133. * up by one level at a time, extra expr possibly helping you along. 134. * After all, how much real experience does one get shooting a wand of death 135. * at a dragon created with a wand of polymorph?? 136. */ 137. void 138. newexplevel() 139. { 140. register int tmp; 141. 142. if(u.ulevel < MAXULEV && u.uexp >= newuexp(u.ulevel)) { 143. 144. u.ulevel++; 145. if (u.uexp >= newuexp(u.ulevel)) u.uexp = newuexp(u.ulevel) - 1; 146. pline("Welcome to experience level %d.", u.ulevel); 147. /* give new intrinsics */ 148. adjabil(u.ulevel - 1, u.ulevel); 149. reset_rndmonst(NON_PM); /* new monster selection */ 150. tmp = newhp(); 151. u.uhpmax += tmp; 152. u.uhp += tmp; 153. tmp = enermod(rn1((int)ACURR(A_WIS)/2+1, 2)); /* M. Stephenson */ 154. u.uenmax += tmp; 155. u.uen += tmp; 156. #ifdef WEAPON_SKILLS 157. add_weapon_skill(); 158. #endif /* WEAPON_SKILLS */ 159. flags.botl = 1; 160. } 161. } 162. 163. void 164. pluslvl() 165. { 166. register int num; 167. 168. You_feel("more experienced."); 169. num = newhp(); 170. u.uhpmax += num; 171. u.uhp += num; 172. num = enermod(rn1((int)ACURR(A_WIS)/2+1, 2)); /* M. Stephenson */ 173. u.uenmax += num; 174. u.uen += num; 175. if(u.ulevel < MAXULEV) { 176. u.uexp = newuexp(u.ulevel); 177. pline("Welcome to experience level %d.", ++u.ulevel); 178. adjabil(u.ulevel - 1, u.ulevel); 179. reset_rndmonst(NON_PM); /* new monster selection */ 180. } 181. #ifdef WEAPON_SKILLS 182. add_weapon_skill(); 183. #endif /* WEAPON_SKILLS */ 184. flags.botl = 1; 185. } 186. 187. long 188. rndexp() 189. { 190. register long minexp,maxexp; 191. 192. if(u.ulevel == 1) 193. return rn2((int)newuexp(1)); 194. else { 195. minexp = newuexp(u.ulevel - 1); 196. maxexp = newuexp(u.ulevel); 197. return(minexp + rn2((int)(maxexp - minexp))); 198. } 199. } 200. 201. /*exper.c*/
|