stat_sklattrib.qsrc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. # stat_sklattrib
  2. !!******************** Warning! ********************
  3. !!The code in this location is both complex and very fundamental to most systems!
  4. !!Use EXTREME caution if modifying!
  5. !!Ask if understanding is required
  6. !!****************************************************
  7. !!For Users;
  8. !! For any Attribute or Skill, outside of "stat_sklattrib", the only things that get used are;
  9. !! the variables themselves, pcs_"name", for checks
  10. !! "name"_exp to replace straight adds (i.e. stren_exp +=1 instead of pcs_stren += 1)
  11. !! "name"_deg to replace losses (i.e. stren_deg -= 1 instead of pcs_stren -= 1)
  12. !! "name"_muta if setting higher attribute limits due to "mutations" ("name"_muta replaces the "mutagen" variables)
  13. !! And checking "name"_lvl if and only if it''s being used to check if an NPC/Item can still train the PC. That is also the only time there should be a gate on "name"_exp += x and should be a minimum of += rand(3,5). No other gates should be used.
  14. !! The others are used in the code as controllers and modifying anything except "name"_exp, "name"_deg, and "name"_muta outside of this routine can break things
  15. !! Attributes & Skills
  16. !! $att_name[x] and $skl_name[x]; an array that stores the name of each attribute variable
  17. !! For each attribute and skill variable, there are the following sub-variables
  18. !! _lvl, is the base level of an attribute/skill before adjustment
  19. !! _lvlst, level yesterday, used for error checking
  20. !! _deg is the days to attribute/skill loss and is reset on XP gain
  21. !! _exp is the amount of total XP gained so far for each and will replace all the gains in the rest of the code
  22. !! _mem is the amount of XP yesterday
  23. !! _muta replaces the assorted mutagen variables for attributes, this is to replace the 30 lines of code with 1
  24. !! _flr, this is the floor through which an attribute/skill cannot fall
  25. !! _xpnxt is the XP required to reach the next level
  26. !! Traits
  27. !! $traitattskl[x], this stores a list of all traits that can affect attribute or skill advancement or degradation, if a trait does not, it does not go in this array
  28. !! For each trait that can affect attribute or skill advancement or degradation;
  29. !! "trait"[y1] = 1 if affecting an attribute or = 2 if affecting a skill;
  30. !! "trait"[y2] = the index number in $att_name or $skl_name that corresponds to the skill/attribute to be effected;
  31. !! "trait"[y3] = indicates if it effects XP required to level by adjusting the base rate as a plus to the default of 60
  32. !! "trait"[y4] = indicates if it effects degradation rate by adjusting the base rate as a plus to the default of 60 for attributes or 90 (3/2) for skills
  33. !! the 'y' in the above is for traits that affect more than 1 skill or attribute, note they must be contiguous 0x, 1x, 2x, etc. there can be no gaps
  34. !! Note, the effects of multiple traits on a single skill or attribute stack
  35. !!Attribute variable list
  36. $att_name[0] = 'stren'
  37. $att_name[1] = 'agil'
  38. $att_name[2] = 'vital'
  39. $att_name[3] = 'intel'
  40. $att_name[4] = 'react'
  41. $att_name[5] = 'sprt'
  42. $att_name[6] = 'chrsm'
  43. $att_name[7] = 'prcptn'
  44. $att_name[8] = 'magik'
  45. !!Skill variable list
  46. !!Add new skills to the end; if removing a skill, move the rest up and then edit the Traits so that the index numbers are correct
  47. $skl_name[0] = 'jab'
  48. $skl_name[1] = 'punch'
  49. $skl_name[2] = 'kick'
  50. $skl_name[3] = 'def'
  51. $skl_name[4] = 'shoot'
  52. $skl_name[5] = 'vokal'
  53. $skl_name[6] = 'sewng'
  54. $skl_name[7] = 'instrmusic'
  55. $skl_name[8] = 'photoskl'
  56. $skl_name[9] = 'artskls'
  57. $skl_name[10] = 'danc'
  58. $skl_name[11] = 'dancero'
  59. $skl_name[12] = 'dancpol'
  60. $skl_name[13] = 'chess'
  61. $skl_name[14] = 'gaming'
  62. $skl_name[15] = 'humint'
  63. $skl_name[16] = 'persuas'
  64. $skl_name[17] = 'run'
  65. $skl_name[18] = 'vball'
  66. $skl_name[19] = 'icesktng'
  67. $skl_name[20] = 'wrstlng'
  68. $skl_name[21] = 'ftbll'
  69. $skl_name[22] = 'splcstng'
  70. $skl_name[23] = 'observ'
  71. $skl_name[24] = 'makupskl'
  72. $skl_name[25] = 'compskl'
  73. $skl_name[26] = 'comphckng'
  74. $skl_name[27] = 'hndiwrk'
  75. $skl_name[28] = 'servng'
  76. $skl_name[29] = 'mdlng'
  77. $skl_name[30] = 'medcn'
  78. $skl_name[31] = 'heels'
  79. $skl_name[32] = 'pool'
  80. $skl_name[33] = 'inhib'
  81. $skl_name[34] = 'perform'
  82. $skl_name[35] = 'bushcraft'
  83. $skl_name[36] = 'cleaning'
  84. $skl_name[37] = 'bkbll'
  85. $skl_name[38] = 'cheer'
  86. $skl_name[39] = 'musicprod'
  87. !!Trait Section
  88. !!This is where Traits that will affect attribute or skill advancement or degradation have those aspects defined.
  89. !!Always put the trait name, variable name, and skill or attribute variable in a comment
  90. !!Natural Dancer; Provides a 10% reduction in xp required to level dance skills
  91. nat_dancer[1] = 2 & nat_dancer[2] = 10 & nat_dancer[3] = -6 & nat_dancer[4] = 0
  92. nat_dancer[11] = 2 & nat_dancer[12] = 11 & nat_dancer[13] = -6 & nat_dancer[14] = 0
  93. nat_dancer[21] = 2 & nat_dancer[22] = 12 & nat_dancer[23] = -6 & nat_dancer[24] = 0
  94. !!Natural Athlete; Provides a 10% reduction in xp required to level sports skills
  95. nat_athlete[1] = 2 & nat_athlete[2] = 17 & nat_athlete[3] = -6 & nat_athlete[4] = 0
  96. nat_athlete[11] = 2 & nat_athlete[12] = 18 & nat_athlete[13] = -6 & nat_athlete[14] = 0
  97. nat_athlete[21] = 2 & nat_athlete[22] = 19 & nat_athlete[23] = -6 & nat_athlete[24] = 0
  98. nat_athlete[31] = 2 & nat_athlete[32] = 20 & nat_athlete[33] = -6 & nat_athlete[34] = 0
  99. nat_athlete[41] = 2 & nat_athlete[42] = 21 & nat_athlete[43] = -6 & nat_athlete[44] = 0
  100. !!Scholarly; Provides a 10% reduction in xp required to level Intelligence, easier to get good notes at school, faster studying in the university
  101. schlrly[1] = 1 & schlrly[2] = 3 & schlrly[3] = -6 & schlrly[4] = 0
  102. !!Trait variable list; only traits that can affect attribute or skill advancement or degradation goes here
  103. $traitattskl[0] = 'nat_dancer'
  104. $traitattskl[1] = 'nat_athlete'
  105. $traitattskl[2] = 'schlrly'
  106. !!This is sets _lvl and _exp based on the value of pcs_"name" the first time so that _lvl and _exp do not need to set on start.
  107. !!Theoretically this can be eventually deleted.
  108. if attsklupdate = 0:
  109. i = 0 & x = 1
  110. :rstloop
  111. expadj = func('_difficulty','getexpadj')
  112. tl = 0
  113. :trtrstloop
  114. tltp = 0
  115. :trtrstinsdlp
  116. !! Note this loop is done with a flag set in the dynamic that is checked outside; this is because testing showed inconsistent results when jumping from inside the dynamic and with the whole loop in the dynamic.
  117. dynamic "
  118. if <<$traitattskl[tl]>> > 0 and <<$traitattskl[tl]>>[tltp + 1] = x and <<$traitattskl[tl]>>[tltp + 2] = i and <<$traitattskl[tl]>>[tltp + 3] ! 0: expadj += <<$traitattskl[tl]>>[tltp + 3]
  119. if <<$traitattskl[tl]>>[tltp + 11] ! 0: insdlpflag = 1
  120. "
  121. if insdlpflag = 1: tltp += 10 & insdlpflag = 0 & jump 'trtrstinsdlp'
  122. tl += 1
  123. if tl < arrsize ('$traitattskl'): jump 'trtrstloop'
  124. killvar 'tl' & killvar 'tltp' & killvar 'insdlpflag'
  125. if x = 1:
  126. $attskltmp = $att_name[i]
  127. else
  128. $attskltmp = $skl_name[i]
  129. end
  130. dynamic "
  131. if pcs_<<$attskltmp>> > 0 and <<$attskltmp>>_lvl = 0:
  132. <<$attskltmp>>_exp = (expadj * (pcs_<<$attskltmp>> - 1) * (pcs_<<$attskltmp>> - 1) / 180) + 1
  133. <<$attskltmp>>_mem = <<$attskltmp>>_exp - 1
  134. <<$attskltmp>>_lvl = pcs_<<$attskltmp>>
  135. <<$attskltmp>>_lvlst = <<$attskltmp>>_lvl
  136. end
  137. "
  138. killvar 'expadj' & killvar '$attskltmp'
  139. i += 1
  140. if (x = 1 and i < arrsize ('$att_name')) or (x = 2 and i < arrsize ('$skl_name')): jump 'rstloop'
  141. i = 0 & x += 1
  142. if x < 3: jump 'rstloop'
  143. killvar 'i' & killvar 'x'
  144. attsklupdate = 1
  145. end
  146. !!This is the section that runs when the call is from cikl
  147. if $ARGS[0] = 'daycall':
  148. !! Attribute XP with Skill XP gain
  149. x = 0
  150. :sklxploop
  151. y = 1
  152. :persklloop
  153. dynamic "$attnamtmp = $att_name[<<$skl_name[x]>>[y]]"
  154. dynamic "
  155. if <<$skl_name[x]>>_exp > <<$skl_name[x]>>_mem: <<$attnamtmp>>_exp += (<<$skl_name[x]>>_exp - <<$skl_name[x]>>_mem) / 5
  156. if <<$skl_name[x]>>[y + 1] = -1 or y >= 9: lpstopflg = 1
  157. "
  158. killvar '$attnamtmp'
  159. if lpstopflg = 0: y += 1 & jump 'persklloop'
  160. killvar 'lpstopflg'
  161. x += 1
  162. if x < arrsize ('$skl_name'): jump 'sklxploop'
  163. killvar 'x' & killvar 'y' & killvar '$attnamtmp'
  164. !! Degradation Loop
  165. i = 0 & x = 1
  166. :degloop
  167. degadj = 60
  168. if x = 2: degadj += 30
  169. expadj = func('_difficulty','getexpadj')
  170. tl = 0
  171. :trtdegloop
  172. tltp = 0
  173. :trtdeginsdlp
  174. !! Note this loop is done with a flag set in the dynamic that is checked outside; this is because testing showed inconsistent results when jumping from inside the dynamic and with the whole loop in the dynamic.
  175. dynamic "
  176. if <<$traitattskl[tl]>> > 0 and <<$traitattskl[tl]>>[tltp + 1] = x and <<$traitattskl[tl]>>[tltp + 2] = i and <<$traitattskl[tl]>>[tltp + 3] ! 0: expadj += <<$traitattskl[tl]>>[tltp + 3]
  177. if <<$traitattskl[tl]>> > 0 and <<$traitattskl[tl]>>[tltp + 1] = x and <<$traitattskl[tl]>>[tltp + 2] = i and <<$traitattskl[tl]>>[tltp + 4] ! 0: degadj += <<$traitattskl[tl]>>[tltp + 4]
  178. if <<$traitattskl[tl]>>[tltp + 11] ! 0: insdlpflag = 1
  179. "
  180. if insdlpflag = 1: tltp += 10 & insdlpflag = 0 & jump 'trtdeginsdlp'
  181. tl += 1
  182. if tl < arrsize ('$traitattskl'): jump 'trtdegloop'
  183. killvar 'tl' & killvar 'tltp' & killvar 'insdlpflag'
  184. if x = 1:
  185. $attskltmp = $att_name[i]
  186. else
  187. $attskltmp = $skl_name[i]
  188. end
  189. dynamic "
  190. if <<$attskltmp>>_lvl ! <<$attskltmp>>_lvlst: <<$attskltmp>>_lvl = <<$attskltmp>>_lvlst
  191. if <<$attskltmp>>_lvl < 100:
  192. degtmp = (102 - <<$attskltmp>>_lvl + <<$attskltmp>>_muta)
  193. else
  194. degtmp = 2 + <<$attskltmp>>_muta
  195. end
  196. degtmp = degadj * degtmp / 60
  197. if degtmp < 2: degtmp = 2
  198. if <<$attskltmp>>_exp < <<$attskltmp>>_mem: <<$attskltmp>>_exp = <<$attskltmp>>_mem
  199. if <<$attskltmp>>_exp = <<$attskltmp>>_mem:
  200. <<$attskltmp>>_deg -= 1
  201. else
  202. <<$attskltmp>>_deg = degtmp
  203. end
  204. if <<$attskltmp>>_deg <= 0 and <<$attskltmp>>_lvl > <<$attskltmp>>_flr:
  205. exptmp = <<$attskltmp>>_exp - (expadj * (<<$attskltmp>>_lvl - 1) * (<<$attskltmp>>_lvl - 1) / 180)
  206. if exptmp < 0: exptmp = 0
  207. <<$attskltmp>>_lvl -= 1
  208. <<$attskltmp>>_deg = degtmp
  209. <<$attskltmp>>_exp = (expadj * (<<$attskltmp>>_lvl - 1) * (<<$attskltmp>>_lvl - 1) / 180) + exptmp
  210. !! This will only do anything if the PC builds exp well in excess of what is needed to level
  211. if <<$attskltmp>>_exp > (expadj * (<<$attskltmp>>_lvl) * (<<$attskltmp>>_lvl) / 180): <<$attskltmp>>_exp -= (2 * <<$attskltmp>> - 1) / 10
  212. end
  213. <<$attskltmp>>_lvlst = <<$attskltmp>>_lvl
  214. <<$attskltmp>>_mem = <<$attskltmp>>_exp
  215. "
  216. killvar 'degtmp' & killvar 'exptmp'
  217. killvar 'degadj' & killvar 'expadj' & killvar '$attskltmp'
  218. i += 1
  219. if (x = 1 and i < arrsize ('$att_name')) or (x = 2 and i < arrsize ('$skl_name')): jump 'degloop'
  220. i = 0 & x += 1
  221. if x < 3: jump 'degloop'
  222. killvar 'i' & killvar 'x'
  223. end
  224. !!Advancement Loop
  225. i = 0 & x = 1
  226. :advloop
  227. expadj = func('_difficulty','getexpadj')
  228. tl = 0
  229. :trtadvloop
  230. tltp = 0
  231. :trtadvinsdlp
  232. !!Note this loop is done with a flag set in the dynamic that is checked outside; this is because testing showed inconsistent results when jumping from inside the dynamic and with the whole loop in the dynamic.
  233. dynamic "
  234. if <<$traitattskl[tl]>> > 0 and <<$traitattskl[tl]>>[tltp + 1] = x and <<$traitattskl[tl]>>[tltp + 2] = i and <<$traitattskl[tl]>>[tltp + 3] ! 0: expadj += <<$traitattskl[tl]>>[tltp + 3]
  235. if <<$traitattskl[tl]>>[tltp + 11] ! 0: insdlpflag = 1
  236. "
  237. if insdlpflag = 1: tltp += 10 & insdlpflag = 0 & jump 'trtadvinsdlp'
  238. tl += 1
  239. if tl < arrsize ('$traitattskl'): jump 'trtadvloop'
  240. killvar 'tl' & killvar 'tltp' & killvar 'insdlpflag'
  241. if x = 1:
  242. $attskltmp = $att_name[i]
  243. else
  244. $attskltmp = $skl_name[i]
  245. end
  246. dynamic "
  247. if <<$attskltmp>>_lvl ! <<$attskltmp>>_lvlst: <<$attskltmp>>_lvl = <<$attskltmp>>_lvlst
  248. if <<$attskltmp>>_exp > (expadj * <<$attskltmp>>_lvl * <<$attskltmp>>_lvl / 180): <<$attskltmp>>_lvl += 1
  249. <<$attskltmp>>_lvlst = <<$attskltmp>>_lvl
  250. <<$attskltmp>>_xpnxt = (expadj * <<$attskltmp>>_lvl * <<$attskltmp>>_lvl / 180) + 1
  251. if <<$attskltmp>>_lvl / 5 > <<$attskltmp>>_flr: <<$attskltmp>>_flr = <<$attskltmp>>_lvl / 5
  252. if <<$attskltmp>>_lvl > (100 + (<<$attskltmp>>_muta * 50)): <<$attskltmp>>_lvl = (100 + (<<$attskltmp>>_muta * 50))
  253. "
  254. !! removed by rachels 17/10/23 to correct the "marksman" bug - belongs into preceding dynamic code
  255. !! if <<$attskltmp>>_exp > (expadj * (<<$attskltmp>>_lvl + 1) * (<<$attskltmp>>_lvl + 1) / 180) - 1:
  256. !! <<$attskltmp>>_exp = (expadj * (<<$attskltmp>>_lvl + 1) * (<<$attskltmp>>_lvl + 1) / 180) - 1
  257. !! <<$attskltmp>>_mem = <<$attskltmp>>_exp
  258. !! end
  259. killvar 'expadj' & killvar '$attskltmp'
  260. i += 1
  261. if (x = 1 and i < arrsize ('$att_name')) or (x = 2 and i < arrsize ('$skl_name')): jump 'advloop'
  262. i = 0 & x += 1
  263. if x < 3: jump 'advloop'
  264. killvar 'i' & killvar 'x'
  265. gs 'stat_sklattrib_lvlset'
  266. --- stat_sklattrib ---------------------------------