PROXiCiDE

Perk Menu Implementation v3

Apr 8th, 2014
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.82 KB | None | 0 0
  1. ScriptName _PX_PerkUI Extends SKI_ConfigBase
  2.  
  3. ;---------------------------------------------------------------------------------[Author Information]
  4. ;PROXiCide aka Taewon
  5. ;Steam: http://steamcommunity.com/id/PROXiCiDE
  6. ;Nexus: http://skyrim.nexusmods.com/users/3018315
  7. ;Bethesda: http://forums.bethsoft.com/user/425376-taewon/
  8. ;CreationKit: http://www.creationkit.com/User:PROXiCiDE
  9. ;---------------------------------------------------------------------------------
  10.  
  11. Actor Property PlayerRef Auto
  12. String[] _sSkillName
  13.  
  14. Event OnConfigInit()
  15. _sSkillName = New String[18]
  16. ;Combat
  17. _sSkillName[0] = "Marksman"
  18. _sSkillName[1] = "Block"
  19. _sSkillName[2] = "HeavyArmor"
  20. _sSkillName[3] = "OneHanded"
  21. _sSkillName[4] = "Smithing"
  22. _sSkillName[5] = "TwoHanded"
  23. ;Magic
  24. _sSkillName[6] = "Alteration"
  25. _sSkillName[7] = "Conjuration"
  26. _sSkillName[8] = "Destruction"
  27. _sSkillName[9] = "Enchanting"
  28. _sSkillName[10] = "Illusion"
  29. _sSkillName[11] = "Restoration"
  30. ;Stealth
  31. _sSkillName[12] = "Alchemy"
  32. _sSkillName[13] = "LightArmor"
  33. _sSkillName[14] = "Lockpicking"
  34. _sSkillName[15] = "Pickpocket"
  35. _sSkillName[16] = "Sneak"
  36. _sSkillName[17] = "Speechcraft"
  37. EndEvent
  38.  
  39. String Function PerkUI_GetSkillNameFromIndex(Int aiIndexed)
  40. aiIndexed = ClampInt(aiIndexed, 0, _sSkillName.Length - 1)
  41. Return _sSkillName[aiIndexed]
  42. EndFunction
  43.  
  44. Int Function PerkUI_SetSkillNameToIndex(String asActorValue = "")
  45. If asActorValue == ""
  46. Return -1
  47. EndIf
  48. Return _sSkillName.Find(asActorValue)
  49. EndFunction
  50.  
  51. ;---------------------------------------------------------------------------------[Locale Format]
  52. ; Menu.Skill.Option.[.Name | .Desc]
  53. ; | | | -\ The name or description of the Perk
  54. ; | | -\ Perk Name
  55. ; | -\ Skill Tree
  56. ; -\ Name of the Menu we selected in SkyUI
  57. ;
  58. ; Perk.Bound.BoundFocus.Name Bound Focus
  59. ; Perk.Bound.BoundFocus.Desc Increases your chance to gain magicka on attack
  60.  
  61. ;---------------------------------------------------------------------------------[PerkUI_ApplyByFormList]
  62. ; Applys a FormList that contain Perk(s).
  63. ; This function acts exactly like Add*Option
  64. ;
  65. ; akList -
  66. ; A FormList must contain only perks, and the very first rank. As a example List
  67. ; OverDraw00,EagleEye,CriticalShot30,SteadyHand40,.....
  68. ;
  69. ; aiPerkCTX -
  70. ; [0...4] Contains configuration settings
  71. ; 0 - Ordered Boolean
  72. ; 1 - Perk Reset Boolean
  73. ; 2 - Perk Mult
  74. ; 3 - Perk Rank Mult
  75. ; 4 - Perk Reset Button ID
  76. ;
  77. ; [5] >= Contains all the Button ID's
  78. ;
  79. ; abAddPerks - Add or Remove Perks
  80. ; abOrdered - Ordered
  81. ; abPerkReset - Add a Perk Count / Perk Reset feature
  82.  
  83. ;---------------------------------------------------------------------------------[Perk Context Information]
  84. Int PerkCTX_Ordered = 0
  85. Int PerkCTX_PerkReset = 1
  86. Int PerkCTX_PerkMult = 2
  87. Int PerkCTX_PerkRankMult = 3
  88. Int PerkCTX_PerkSkillRequiredOverride = 4
  89. Int PerkCTX_PerkSkillAttribute = 5
  90. Int PerkCTX_PerkResetBID = 6
  91. Int PerkCTX_List = 7
  92.  
  93. Function PerkUI_Init(Int[] aiPerkCTX, Bool abOrdered = True, Bool abPerkReset = True, String asActorValue = "", Int aiPerkMult = 20, Int aiPerkRankMult = 20, Bool abSkillReqOverride = False)
  94. aiPerkCTX[PerkCTX_Ordered] = (abOrdered As Int)
  95. aiPerkCTX[PerkCTX_PerkReset] = (abPerkReset As Int)
  96. aiPerkCTX[PerkCTX_PerkMult] = aiPerkMult
  97. aiPerkCTX[PerkCTX_PerkRankMult] = aiPerkRankMult
  98. aiPerkCTX[PerkCTX_PerkSkillAttribute] = PerkUI_SetSkillNameToIndex(asActorValue)
  99. aiPerkCTX[PerkCTX_PerkSkillRequiredOverride] = (abSkillReqOverride As Int)
  100. aiPerkCTX[PerkCTX_PerkResetBID] = 0;
  101. EndFunction
  102.  
  103. ;---------------------------------------------------------------------------------[TODO]
  104. ; Fix Perk display when updating each element when have no perk points
  105. ;
  106. ;
  107. ;
  108.  
  109. Function PerkUI_ApplyByFormList(FormList akList, Int[] aiPerkCTX, Bool abAddPerks = True)
  110. If akList == None
  111. Return
  112. EndIf
  113.  
  114.  
  115. Bool abOrdered = (aiPerkCTX[PerkCTX_Ordered] As Bool)
  116. Bool abPerkReset = (aiPerkCTX[PerkCTX_PerkReset] As Bool)
  117. Int iActorValue = aiPerkCTX[PerkCTX_PerkSkillAttribute]
  118.  
  119. If abPerkReset
  120. aiPerkCTX[PerkCTX_PerkResetBID] = AddTextOption("$Perk.Reset",Game.GetPerkPoints())
  121. AddEmptyOption()
  122. EndIf
  123.  
  124. Int i = 0
  125. While (i < akList.GetSize())
  126. If i >= aiPerkCTX.Length
  127. Return
  128. EndIf
  129. Form fmItem = akList.GetAt(i)
  130. If fmItem As Perk
  131. Perk pPerk = fmItem As Perk
  132. Bool bChecked = False
  133. Int iFlag = OPTION_FLAG_NONE
  134. If abAddPerks
  135. If PlayerRef.HasPerk(pPerk)
  136. bChecked = True
  137. ElseIf i>0 && abOrdered
  138. Perk pPrevPerk = akList.GetAt(i - 1) As Perk
  139. If pPrevPerk && !PlayerRef.HasPerk(pPrevPerk)
  140. iFlag = OPTION_FLAG_DISABLED
  141. EndIf
  142. EndIf
  143. Else
  144. If PlayerRef.HasPerk(pPerk)
  145. Game.ModPerkPoints(PerkRemoveRanked(pPerk))
  146. EndIf
  147. EndIf
  148.  
  149. Int[] iNumRanks = PerkGetRankInfo(pPerk)
  150. String sPerkName = pPerk.GetName()
  151. If IsPerkLocale(pPerk)
  152. sPerkName = sPerkName + ".Name"
  153. EndIf
  154.  
  155. If iNumRanks[0] > 1
  156. If iNumRanks[1] >= 2
  157. Perk pNext = PerkSelectRank(pPerk,iNumRanks[1] + 1)
  158. If pNext != None && !PlayerRef.HasPerk(pNext)
  159. iFlag = OPTION_FLAG_NONE
  160. EndIf
  161. EndIf
  162.  
  163. If iActorValue != -1
  164. If PlayerRef.GetBaseActorValue(PerkUI_GetSkillNameFromIndex(iActorValue)) < CalcSkillRequirements(akList,i)
  165. iFlag = OPTION_FLAG_DISABLED
  166. EndIf
  167. EndIf
  168.  
  169. aiPerkCTX[i + PerkCTX_List] = AddTextOption(sPerkName, " ( " + iNumRanks[1] + " / " + iNumRanks[0] + " )" ,iFlag)
  170. Else
  171.  
  172. If iActorValue != -1
  173. If PlayerRef.GetBaseActorValue(PerkUI_GetSkillNameFromIndex(iActorValue)) < CalcSkillRequirements(akList,i)
  174. iFlag = OPTION_FLAG_DISABLED
  175. EndIf
  176. EndIf
  177.  
  178. aiPerkCTX[i + PerkCTX_List] = AddToggleOption(sPerkName, bChecked,iFlag)
  179. EndIf
  180.  
  181. EndIf
  182. i += 1
  183. EndWhile
  184.  
  185. ;---------------------------------------------------------------------------------[TODO]
  186. ; !abAddPerks
  187. ; Use SetValue instead of AddOption
  188. ; No Update until last element
  189. ; Remove ForcePageReset
  190. If !abAddPerks
  191. ForcePageReset()
  192. EndIf
  193.  
  194. If abPerkReset
  195. SetTextOptionValue(aiPerkCTX[PerkCTX_PerkResetBID], Game.GetPerkPoints())
  196. EndIf
  197.  
  198. Debug.TraceUser("BoundSpellScale","\n")
  199. EndFunction
  200.  
  201. ;---------------------------------------------------------------------------------[PerkUI_SelectByFormList]
  202. ; This Function acts as Select*OptionValue
  203.  
  204. ;---------------------------------------------------------------------------------[TODO]
  205. ; FIX PERK RANK ENABLED for NEXT, and Selecting for Requirements, and Current Rank
  206. ;
  207. ;
  208. ;
  209.  
  210. Function PerkUI_SelectByFormList(FormList akList, Int[] aiPerkCTX, Int aiOption, String asActorValue = "")
  211. If akList == None || aiPerkCTX.Length < (PerkCTX_PerkResetBID + 1)
  212. Return
  213. EndIf
  214.  
  215. Bool abOrdered = (aiPerkCTX[PerkCTX_Ordered] As Bool)
  216. Bool abPerkReset = (aiPerkCTX[PerkCTX_PerkReset] As Bool)
  217. Int iActorValue = aiPerkCTX[PerkCTX_PerkSkillAttribute]
  218.  
  219. Int iTemp = aiPerkCTX.Find(aiOption)
  220. If iTemp != -1
  221. If abPerkReset && iTemp == PerkCTX_PerkResetBID
  222. Bool bIsOk = ShowMessage("$Perk.ConfirmReset",True,"$Yes","$No")
  223. If bIsOk
  224. PerkUI_ApplyByFormList(akList,aiPerkCTX,False)
  225. EndIf
  226. ElseIf iTemp >= PerkCTX_List
  227. Bool abEnableNext = False
  228. Perk pPerk = akList.GetAt(iTemp - PerkCTX_List) As Perk
  229. If pPerk != None
  230. Int iPerkPoints = Game.GetPerkPoints()
  231. If iPerkPoints > 0
  232. Bool bChecked = False
  233. Int[] iNumRanks = PerkGetRankInfo(pPerk)
  234.  
  235. Int iLearned = iNumRanks[1]
  236.  
  237. If iNumRanks[0] > 1 && iNumRanks[0] != iNumRanks[1] && PlayerRef.HasPerk(pPerk)
  238. Perk pNext = PerkSelectRank(pPerk, iLearned + 1)
  239. If !PlayerRef.HasPerk(pNext)
  240. PlayerRef.AddPerk(pNext)
  241. Game.ModPerkPoints(-1)
  242. iLearned += 1
  243. If abOrdered
  244. abEnableNext = True
  245. EndIf
  246. EndIf
  247. Else
  248. If !PlayerRef.HasPerk(pPerk)
  249. iLearned += 1
  250.  
  251. PlayerRef.AddPerk(pPerk)
  252. bChecked = True
  253. Game.ModPerkPoints(-1)
  254.  
  255. If abOrdered
  256. abEnableNext = True
  257. EndIf
  258. Else
  259. bChecked = True
  260. EndIf
  261. EndIf
  262.  
  263.  
  264. ;Check for Ranked Perks
  265. If iNumRanks[0] > 1
  266. If iLearned > iNumRanks[0]
  267. iLearned = iNumRanks[0]
  268. EndIf
  269.  
  270. SetTextOptionValue(aiOption, " ( " + iLearned + " / " + iNumRanks[0] + " )")
  271. Else
  272. SetToggleOptionValue(aiOption,bChecked)
  273. EndIf
  274.  
  275. iPerkPoints = Game.GetPerkPoints()
  276. If abOrdered
  277. If iPerkPoints > 0
  278. If abEnableNext
  279. Int iFlag = OPTION_FLAG_NONE
  280. Int idxNext = iTemp+1
  281.  
  282. If (idxNext < aiPerkCTX.Length)
  283. If iActorValue != -1
  284. iFlag = OPTION_FLAG_DISABLED
  285. If PlayerRef.GetBaseActorValue(PerkUI_GetSkillNameFromIndex(iActorValue)) >= CalcSkillRequirements(akList, idxNext)
  286. iFlag = OPTION_FLAG_NONE
  287. EndIf
  288. EndIf
  289. SetOptionFlags(aiPerkCTX[idxNext],iFlag)
  290. EndIf
  291. EndIf
  292. Else
  293. ;---------------------------------------------------------------------------------[TODO]
  294. ; Disable the rest of the Perks iTemp+All
  295. ; Check for Skill Requirements for iTemp+All
  296. ; Check for Skill Requirements for pNext
  297. ; Need a way to save the Highest Achieved Perk in this Skill, otherwise it will do iTemp>=
  298. ; when disabling
  299.  
  300. Int i = iTemp + iPerkPoints
  301. If i >= aiPerkCTX.Length
  302. i = aiPerkCTX.Length - 1
  303. EndIf
  304. While (i < aiPerkCTX.Length)
  305. SetOptionFlags(aiPerkCTX[i],OPTION_FLAG_DISABLED)
  306. i += 1
  307. EndWhile
  308. EndIf
  309. EndIf
  310. EndIf
  311.  
  312. EndIf
  313.  
  314. If abPerkReset
  315. SetTextOptionValue(aiPerkCTX[PerkCTX_PerkResetBID], Game.GetPerkPoints())
  316. EndIf
  317. EndIf
  318. EndIf
  319. EndFunction
  320.  
  321. ;---------------------------------------------------------------------------------[PerkUI_SetInfoByFormList]
  322. ; This function acts as SetInfoText
  323. Function PerkUI_SetInfoByFormList(FormList akList, Int[] aiPerkCTX, Int aiOption)
  324. If akList == None
  325. Return
  326. EndIf
  327.  
  328. Bool abPerkReset = (aiPerkCTX[PerkCTX_PerkReset] As Bool)
  329. Int iTemp = aiPerkCTX.Find(aiOption)
  330.  
  331. If iTemp == PerkCTX_PerkResetBID && abPerkReset
  332. SetInfoText("$Perk.Reset.Desc")
  333. EndIf
  334.  
  335. If iTemp != -1 && iTemp >= PerkCTX_List
  336. Perk pPerk = akList.GetAt(iTemp - PerkCTX_List) As Perk
  337. If pPerk != None
  338. CalcSkillRequirements(akList, iTemp - PerkCTX_List)
  339. String sPerkName = pPerk.GetName()
  340. If IsPerkLocale(pPerk)
  341. sPerkName = sPerkName + ".Desc"
  342. EndIf
  343. SetInfoText(sPerkName)
  344. EndIf
  345. EndIf
  346. EndFunction
  347.  
  348.  
  349. Function PerkUI_ApplyByFormListEx(FormList akList, Int[] aiPerkCTX, Bool abAddPerks = True, Bool abOrdered = True, String[] asSections)
  350. If akList == None
  351. Return
  352. EndIf
  353.  
  354. Int i = 0
  355. Int iHeaderCount = 0
  356. While (i < akList.GetSize())
  357. Form fmItem = akList.GetAt(i)
  358. If fmItem As Perk
  359. Perk pPerk = fmItem As Perk
  360. Bool bChecked = False
  361. Int iFlag = OPTION_FLAG_NONE
  362. If abAddPerks
  363. If PlayerRef.HasPerk(pPerk)
  364. bChecked = True
  365. ; iFlag = OPTION_FLAG_DISABLED
  366. ElseIf i>0 && abOrdered
  367. Perk pPrevPerk = akList.GetAt(i - 1) As Perk
  368. If pPrevPerk && !PlayerRef.HasPerk(pPrevPerk)
  369. iFlag = OPTION_FLAG_DISABLED
  370. EndIf
  371. EndIf
  372. Else
  373. If PlayerRef.HasPerk(pPerk)
  374. Game.ModPerkPoints(PerkRemoveRanked(pPerk))
  375. EndIf
  376. EndIf
  377.  
  378. Int[] iNumRanks = PerkGetRankInfo(pPerk)
  379. String sPerkName = pPerk.GetName()
  380. If IsPerkLocale(pPerk)
  381. sPerkName = sPerkName + ".Name"
  382. EndIf
  383.  
  384. If (asSections[i] != "" || asSections[i] != " ") && StringUtil.GetLength(asSections[i]) > 1 && abAddPerks
  385. If abOrdered
  386. If iHeaderCount > 0
  387. AddEmptyOption()
  388. EndIf
  389. EndIf
  390. AddHeaderOption(asSections[i])
  391. iHeaderCount += 1
  392. EndIf
  393.  
  394. ;TODO
  395. ;Figure out how to handle Perk Ranks
  396. If iNumRanks[0] > 1
  397. If iNumRanks[1] >= 2
  398. Perk pNext = PerkSelectRank(pPerk,iNumRanks[1] + 1)
  399. If pNext != None && !PlayerRef.HasPerk(pNext)
  400. iFlag = OPTION_FLAG_NONE
  401. EndIf
  402. EndIf
  403.  
  404. aiPerkCTX[i] = AddTextOption(sPerkName, " ( " + iNumRanks[1] + " / " + iNumRanks[0] + " )" ,iFlag)
  405. Else
  406. aiPerkCTX[i] = AddToggleOption(sPerkName, bChecked,iFlag)
  407. EndIf
  408. EndIf
  409. i += 1
  410. EndWhile
  411. If !abAddPerks
  412. ForcePageReset()
  413. EndIf
  414. EndFunction
  415.  
  416. ;---------------------------------------------------------------------------------[Perk Utilities]
  417. Int Function CalcSkillRequirements(FormList akList, Int aiIndexed, Int aiPerkMult = 20, Int aiPerkRankMult = 20)
  418. If akList == None
  419. Return 0
  420. EndIf
  421.  
  422. Int iPerkCount = akList.GetSize() - 1
  423.  
  424. If iPerkCount >= 0
  425. Perk pPerk = (akList.GetAt(aiIndexed) As Perk)
  426. Int[] iNumRanks = PerkGetRankInfo(pPerk)
  427.  
  428. Int iPct = ClampInt(Math.Floor(((aiIndexed*100) / iPerkCount)),0,100)
  429.  
  430. If aiIndexed > 0 && iPct < aiPerkMult
  431. iPct = aiPerkMult
  432. EndIf
  433.  
  434. Int iResults = RoundUp(iPct , aiPerkMult)
  435.  
  436. If iNumRanks[0] > 1 && iNumRanks[1] > 1
  437. iPct = ClampInt(Math.Floor(((iNumRanks[1] * 100) / iNumRanks[0])),0,100)
  438. If aiIndexed > 0 && iPct < aiPerkRankMult
  439. iPct = aiPerkRankMult
  440. EndIf
  441. iResults = RoundUp(iPct, aiPerkRankMult)
  442. EndIf
  443.  
  444. iResults = ClampInt(iResults,0,100)
  445. Debug.TraceUser("BoundSpellScale","CalcSkillRequirements() "+pPerk.GetName()+", aiIndexed="+aiIndexed+", iPct="+iPct+", iResults="+iResults+", iNumRanks="+iNumRanks)
  446. Return iResults
  447. EndIf
  448.  
  449. Return 0
  450. EndFunction
  451.  
  452. Bool Function IsPerkLocale(Perk akPerk)
  453. If akPerk != None
  454. String sStr = akPerk.GetName()
  455. Int iLen = StringUtil.GetLength(sStr)
  456. If iLen <= 0
  457. Return False
  458. EndIf
  459.  
  460. If StringUtil.GetNthChar(sStr,0) == "$"
  461. Return True
  462. EndIf
  463. EndIf
  464.  
  465. Return False
  466. EndFunction
  467.  
  468. ;---------------------------------------------------------------------------------[PerkGetRankInfo]
  469. ; Returns array
  470. ; [0] = The total number of ranks the perk contains, is always >= 1
  471. ; [1] = The number of ranks that have been learned
  472. Int[] Function PerkGetRankInfo(Perk akPerk)
  473. Int[] iResults
  474.  
  475. If akPerk == None
  476. Return iResults
  477. EndIf
  478.  
  479. iResults = New Int[2]
  480.  
  481. Int iNumRanks = 1
  482. Int iNumRanksLearned = 0
  483.  
  484. If akPerk != None
  485.  
  486. If PlayerRef.HasPerk(akPerk)
  487. iNumRanksLearned += 1
  488. EndIf
  489.  
  490. Perk pNext = akPerk.GetNextPerk()
  491. While pNext != None
  492. If PlayerRef.HasPerk(pNext)
  493. iNumRanksLearned += 1
  494. EndIf
  495.  
  496. iNumRanks += 1
  497. pNext = pNext.GetNextPerk()
  498. EndWhile
  499. EndIf
  500.  
  501. iResults[0] = iNumRanks
  502. iResults[1] = iNumRanksLearned
  503.  
  504. Return iResults
  505. EndFunction
  506.  
  507. ;---------------------------------------------------------------------------------[PerkSelectRank]
  508. ; Selects a rank from a perk
  509. ; PerkSelectRank(Overdraw00, 2) == Overdraw20
  510. ; PerkSelectRank(Overdraw00, 5) == Overdraw80
  511. Perk Function PerkSelectRank(Perk akPerk,Int aiRank = 2)
  512. If akPerk != None
  513. Int[] iNumRanks = PerkGetRankInfo(akPerk)
  514.  
  515. If aiRank > iNumRanks[0]
  516. aiRank = iNumRanks[0]
  517. EndIf
  518.  
  519. If aiRank < 2
  520. Return akPerk
  521. EndIf
  522.  
  523. Int i = 2
  524. Perk pNext = akPerk.GetNextPerk()
  525. While (i <= aiRank) && pNext != None
  526. If i == aiRank
  527. Return pNext
  528. EndIf
  529. pNext = pNext.GetNextPerk()
  530. i += 1
  531. EndWhile
  532. EndIf
  533. Return None
  534. EndFunction
  535.  
  536.  
  537. ;---------------------------------------------------------------------------------[PerkRemoveRanked]
  538. ; Removes all perk(s) learned from the specific perk
  539. ; Example
  540. ; PerkRemoveRanked(Overdraw00) will remove all ranks if they are learned
  541. Int Function PerkRemoveRanked(Perk akPerk)
  542. Int iResults = 0
  543. If akPerk != None
  544. If PlayerRef.HasPerk(akPerk)
  545. PlayerRef.RemovePerk(akPerk)
  546. iResults += 1
  547. EndIf
  548.  
  549. Perk pNext = akPerk.GetNextPerk()
  550. While pNext != None
  551. If PlayerRef.HasPerk(pNext)
  552. PlayerRef.RemovePerk(pNext)
  553. iResults += 1
  554. EndIf
  555. pNext = pNext.GetNextPerk()
  556. EndWhile
  557. EndIf
  558. Return iResults
  559. EndFunction
  560.  
  561. ;---------------------------------------------------------------------------------[Math Utilities]
  562. Int Function MaxInt(Int x,Int y)
  563. If x > y
  564. Return x
  565. Else
  566. Return y
  567. EndIf
  568. EndFunction
  569.  
  570. Int Function MinInt(Int x,Int y)
  571. If x < y
  572. Return x
  573. Else
  574. Return y
  575. EndIf
  576. EndFunction
  577.  
  578. Int Function ClampInt(Int x,Int min,Int max)
  579. Return MinInt(MaxInt(x,min),max)
  580. EndFunction
  581.  
  582. Int Function ClampRangeInt(Int aiValue, Int aiMinValue, Int aiMaxValue, Int aiDefaultValue = -1)
  583. If aiDefaultValue < 0
  584. aiDefaultValue = aiMaxValue
  585. EndIf
  586.  
  587. If (aiMinValue <= aiValue && aiValue <= aiMaxValue)
  588. Return aiDefaultValue
  589. EndIf
  590. Return aiValue
  591. EndFunction
  592.  
  593. Int Function RoundUp(Int aiValue, Int aiMult = 10)
  594. Return Math.Ceiling(aiValue / aiMult) * aiMult
  595. EndFunction
  596.  
  597. Int Function RoundDown(Int aiValue, Int aiMult = 10)
  598. Return Math.Floor(aiValue / aiMult) * aiMult
  599. EndFunction
  600.  
  601. ;---------------------------------------------------------------------------------[Array Utilities]
  602. Int[] Function CreateIntArray(Int aiNum1,Int aiNum2,Int aiNum3,Int aiNum4,Int aiNum5)
  603. Int[] arRes = New Int[5]
  604. arRes[0] = aiNum1
  605. arRes[1] = aiNum2
  606. arRes[2] = aiNum3
  607. arRes[3] = aiNum4
  608. arRes[4] = aiNum5
  609. Return arRes
  610. EndFunction
  611.  
  612. String[] Function CreateStringArray(String asText1,String asText2 = "",String asText3 = "",String asText4 = "",String asText5 = "")
  613. String[] arRes
  614. If asText5 != ""
  615. arRes = New String[5]
  616. arRes[0] = asText1
  617. arRes[1] = asText2
  618. arRes[2] = asText3
  619. arRes[3] = asText4
  620. arRes[4] = asText5
  621. ElseIf asText4 != ""
  622. arRes = New String[4]
  623. arRes[0] = asText1
  624. arRes[1] = asText2
  625. arRes[2] = asText3
  626. arRes[3] = asText4
  627. ElseIf asText3 != ""
  628. arRes = New String[3]
  629. arRes[0] = asText1
  630. arRes[1] = asText2
  631. arRes[2] = asText3
  632. ElseIf asText2 != ""
  633. arRes = New String[2]
  634. arRes[0] = asText1
  635. arRes[1] = asText2
  636. ElseIf asText1 != ""
  637. arRes = New String[1]
  638. arRes[0] = asText1
  639. EndIf
  640. Return arRes
  641. EndFunction
  642.  
  643.  
  644. ;---------------------------------------------------------------------------------[Debug Utilities]
  645. Function PerkDumpInfo(Perk akPerk)
  646. If akPerk != None
  647. Int[] iNumRanks = PerkGetRankInfo(akPerk)
  648. Int iNumEntries = akPerk.GetNumEntries()
  649.  
  650. Debug.TraceUser("BoundSpellScale","")
  651. Debug.TraceUser("BoundSpellScale","---------------------------------------------------------------------------------[PerkDumpInfo BEGIN]")
  652. Debug.TraceUser("BoundSpellScale","akPerk ="+akPerk+", GetName="+akPerk.GetName())
  653. Debug.TraceUser("BoundSpellScale","iNumRanks ="+iNumRanks)
  654. Debug.TraceUser("BoundSpellScale","iNumEntries ="+iNumEntries)
  655.  
  656. Int i = 0
  657. While i < iNumEntries
  658. Int iEntryRank = akPerk.GetNthEntryRank(i)
  659. Int iEntryPriority = akPerk.GetNthEntryPriority(i)
  660. Quest pEntryQuest = akPerk.GetNthEntryQuest(i)
  661. Int iEntryStage = akPerk.GetNthEntryStage(i)
  662. Spell pEntrySpell = akPerk.GetNthEntrySpell(i)
  663. LeveledItem pLeveledItem = akPerk.GetNthEntryLeveledList(i)
  664. String sText = akPerk.GetNthEntryText(i)
  665. Float fFloat = akPerk.GetNthEntryValue(i,0)
  666.  
  667. Debug.TraceUser("BoundSpellScale","iEntryRank ="+iEntryRank)
  668. Debug.TraceUser("BoundSpellScale","iEntryPriority ="+iEntryPriority)
  669.  
  670. If pEntryQuest != None
  671. Debug.TraceUser("BoundSpellScale","pEntryQuest ="+pEntryQuest)
  672. EndIf
  673. Debug.TraceUser("BoundSpellScale","iEntryStage ="+iEntryStage)
  674.  
  675. If pEntrySpell != None
  676. Debug.TraceUser("BoundSpellScale","pEntrySpell ="+pEntrySpell)
  677. EndIf
  678.  
  679. If pLeveledItem != None
  680. Debug.TraceUser("BoundSpellScale","pLeveledItem ="+pLeveledItem)
  681. EndIf
  682.  
  683. If sText != ""
  684. Debug.TraceUser("BoundSpellScale","sText ="+sText)
  685. EndIf
  686.  
  687. Debug.TraceUser("BoundSpellScale","fFloat ="+fFloat)
  688. i+=1
  689. EndWhile
  690.  
  691. Debug.TraceUser("BoundSpellScale","---------------------------------------------------------------------------------[PerkDumpInfo END]")
  692. Debug.TraceUser("BoundSpellScale","")
  693.  
  694. EndIf
  695. EndFunction
Advertisement
Add Comment
Please, Sign In to add comment