osrs-tools 2.5.4 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +270 -270
  2. package/dist/runescape/model/quest/QuestTool.d.ts.map +1 -1
  3. package/dist/runescape/model/quest/QuestTool.js +102 -4
  4. package/dist/runescape/model/quest/all/ANightAtTheTheatre.d.ts +4 -0
  5. package/dist/runescape/model/quest/all/ANightAtTheTheatre.d.ts.map +1 -0
  6. package/dist/runescape/model/quest/all/ANightAtTheTheatre.js +4 -0
  7. package/dist/runescape/model/quest/all/AtFirstLight.d.ts +4 -0
  8. package/dist/runescape/model/quest/all/AtFirstLight.d.ts.map +1 -0
  9. package/dist/runescape/model/quest/all/AtFirstLight.js +4 -0
  10. package/dist/runescape/model/quest/all/BeneathCursedSands.d.ts +4 -0
  11. package/dist/runescape/model/quest/all/BeneathCursedSands.d.ts.map +1 -0
  12. package/dist/runescape/model/quest/all/BeneathCursedSands.js +4 -0
  13. package/dist/runescape/model/quest/all/ChildrenOfTheSun.d.ts +4 -0
  14. package/dist/runescape/model/quest/all/ChildrenOfTheSun.d.ts.map +1 -0
  15. package/dist/runescape/model/quest/all/ChildrenOfTheSun.js +4 -0
  16. package/dist/runescape/model/quest/all/ColdWar.js +1 -1
  17. package/dist/runescape/model/quest/all/DeathOnTheIsle.d.ts +4 -0
  18. package/dist/runescape/model/quest/all/DeathOnTheIsle.d.ts.map +1 -0
  19. package/dist/runescape/model/quest/all/DeathOnTheIsle.js +4 -0
  20. package/dist/runescape/model/quest/all/DefenderOfVarrock.d.ts +4 -0
  21. package/dist/runescape/model/quest/all/DefenderOfVarrock.d.ts.map +1 -0
  22. package/dist/runescape/model/quest/all/DefenderOfVarrock.js +4 -0
  23. package/dist/runescape/model/quest/all/DesertTreasureI.d.ts +4 -0
  24. package/dist/runescape/model/quest/all/DesertTreasureI.d.ts.map +1 -0
  25. package/dist/runescape/model/quest/all/DesertTreasureI.js +4 -0
  26. package/dist/runescape/model/quest/all/DesertTreasureIITheFallenEmpire.d.ts +4 -0
  27. package/dist/runescape/model/quest/all/DesertTreasureIITheFallenEmpire.d.ts.map +1 -0
  28. package/dist/runescape/model/quest/all/DesertTreasureIITheFallenEmpire.js +4 -0
  29. package/dist/runescape/model/quest/all/DragonSlayerI.js +1 -1
  30. package/dist/runescape/model/quest/all/ErnestTheChicken.d.ts +4 -0
  31. package/dist/runescape/model/quest/all/ErnestTheChicken.d.ts.map +1 -0
  32. package/dist/runescape/model/quest/all/ErnestTheChicken.js +38 -0
  33. package/dist/runescape/model/quest/all/EthicallyAcquiredAntiquities.d.ts +4 -0
  34. package/dist/runescape/model/quest/all/EthicallyAcquiredAntiquities.d.ts.map +1 -0
  35. package/dist/runescape/model/quest/all/EthicallyAcquiredAntiquities.js +4 -0
  36. package/dist/runescape/model/quest/all/LandOfTheGoblins.d.ts +4 -0
  37. package/dist/runescape/model/quest/all/LandOfTheGoblins.d.ts.map +1 -0
  38. package/dist/runescape/model/quest/all/LandOfTheGoblins.js +4 -0
  39. package/dist/runescape/model/quest/all/LearningTheRopes.d.ts +4 -0
  40. package/dist/runescape/model/quest/all/LearningTheRopes.d.ts.map +1 -0
  41. package/dist/runescape/model/quest/all/LearningTheRopes.js +37 -0
  42. package/dist/runescape/model/quest/all/MakingFriendsWithMyArm.d.ts +4 -0
  43. package/dist/runescape/model/quest/all/MakingFriendsWithMyArm.d.ts.map +1 -0
  44. package/dist/runescape/model/quest/all/MakingFriendsWithMyArm.js +25 -0
  45. package/dist/runescape/model/quest/all/MisthalinMystery.d.ts +4 -0
  46. package/dist/runescape/model/quest/all/MisthalinMystery.d.ts.map +1 -0
  47. package/dist/runescape/model/quest/all/MisthalinMystery.js +4 -0
  48. package/dist/runescape/model/quest/all/MonkeyMadnessI.d.ts +4 -0
  49. package/dist/runescape/model/quest/all/MonkeyMadnessI.d.ts.map +1 -0
  50. package/dist/runescape/model/quest/all/MonkeyMadnessI.js +4 -0
  51. package/dist/runescape/model/quest/all/MountainDaughter.d.ts +4 -0
  52. package/dist/runescape/model/quest/all/MountainDaughter.d.ts.map +1 -0
  53. package/dist/runescape/model/quest/all/MountainDaughter.js +25 -0
  54. package/dist/runescape/model/quest/all/MourningsEndPartI.d.ts +4 -0
  55. package/dist/runescape/model/quest/all/MourningsEndPartI.d.ts.map +1 -0
  56. package/dist/runescape/model/quest/all/MourningsEndPartI.js +4 -0
  57. package/dist/runescape/model/quest/all/MourningsEndPartII.d.ts +4 -0
  58. package/dist/runescape/model/quest/all/MourningsEndPartII.d.ts.map +1 -0
  59. package/dist/runescape/model/quest/all/MourningsEndPartII.js +4 -0
  60. package/dist/runescape/model/quest/all/PerilousMoons.d.ts +4 -0
  61. package/dist/runescape/model/quest/all/PerilousMoons.d.ts.map +1 -0
  62. package/dist/runescape/model/quest/all/PerilousMoons.js +4 -0
  63. package/dist/runescape/model/quest/all/PiratesTreasure.d.ts +4 -0
  64. package/dist/runescape/model/quest/all/PiratesTreasure.d.ts.map +1 -0
  65. package/dist/runescape/model/quest/all/PiratesTreasure.js +4 -0
  66. package/dist/runescape/model/quest/all/PrinceAliRescue.d.ts +4 -0
  67. package/dist/runescape/model/quest/all/PrinceAliRescue.d.ts.map +1 -0
  68. package/dist/runescape/model/quest/all/PrinceAliRescue.js +4 -0
  69. package/dist/runescape/model/quest/all/RagAndBoneManI.d.ts +4 -0
  70. package/dist/runescape/model/quest/all/RagAndBoneManI.d.ts.map +1 -0
  71. package/dist/runescape/model/quest/all/RagAndBoneManI.js +4 -0
  72. package/dist/runescape/model/quest/all/RagAndBoneManII.d.ts +4 -0
  73. package/dist/runescape/model/quest/all/RagAndBoneManII.d.ts.map +1 -0
  74. package/dist/runescape/model/quest/all/RagAndBoneManII.js +4 -0
  75. package/dist/runescape/model/quest/all/RomeoAndJuliet.d.ts +4 -0
  76. package/dist/runescape/model/quest/all/RomeoAndJuliet.d.ts.map +1 -0
  77. package/dist/runescape/model/quest/all/RomeoAndJuliet.js +25 -0
  78. package/dist/runescape/model/quest/all/RuneMysteries.d.ts +4 -0
  79. package/dist/runescape/model/quest/all/RuneMysteries.d.ts.map +1 -0
  80. package/dist/runescape/model/quest/all/RuneMysteries.js +4 -0
  81. package/dist/runescape/model/quest/all/SecretsOfTheNorth.d.ts +4 -0
  82. package/dist/runescape/model/quest/all/SecretsOfTheNorth.d.ts.map +1 -0
  83. package/dist/runescape/model/quest/all/SecretsOfTheNorth.js +4 -0
  84. package/dist/runescape/model/quest/all/SheepShearer.d.ts +4 -0
  85. package/dist/runescape/model/quest/all/SheepShearer.d.ts.map +1 -0
  86. package/dist/runescape/model/quest/all/SheepShearer.js +4 -0
  87. package/dist/runescape/model/quest/all/ShieldOfArrav.d.ts +4 -0
  88. package/dist/runescape/model/quest/all/ShieldOfArrav.d.ts.map +1 -0
  89. package/dist/runescape/model/quest/all/ShieldOfArrav.js +4 -0
  90. package/dist/runescape/model/quest/all/SinsOfTheFather.d.ts +4 -0
  91. package/dist/runescape/model/quest/all/SinsOfTheFather.d.ts.map +1 -0
  92. package/dist/runescape/model/quest/all/SinsOfTheFather.js +4 -0
  93. package/dist/runescape/model/quest/all/SleepingGiants.d.ts +4 -0
  94. package/dist/runescape/model/quest/all/SleepingGiants.d.ts.map +1 -0
  95. package/dist/runescape/model/quest/all/SleepingGiants.js +4 -0
  96. package/dist/runescape/model/quest/all/TaleOfTheRighteous.d.ts +4 -0
  97. package/dist/runescape/model/quest/all/TaleOfTheRighteous.d.ts.map +1 -0
  98. package/dist/runescape/model/quest/all/TaleOfTheRighteous.js +4 -0
  99. package/dist/runescape/model/quest/all/TearsOfGuthix.d.ts +4 -0
  100. package/dist/runescape/model/quest/all/TearsOfGuthix.d.ts.map +1 -0
  101. package/dist/runescape/model/quest/all/TearsOfGuthix.js +4 -0
  102. package/dist/runescape/model/quest/all/TempleOfIkov.d.ts +4 -0
  103. package/dist/runescape/model/quest/all/TempleOfIkov.d.ts.map +1 -0
  104. package/dist/runescape/model/quest/all/TempleOfIkov.js +4 -0
  105. package/dist/runescape/model/quest/all/TempleOfTheEye.d.ts +4 -0
  106. package/dist/runescape/model/quest/all/TempleOfTheEye.d.ts.map +1 -0
  107. package/dist/runescape/model/quest/all/TempleOfTheEye.js +4 -0
  108. package/dist/runescape/model/quest/all/TheCorsairCurse.d.ts +4 -0
  109. package/dist/runescape/model/quest/all/TheCorsairCurse.d.ts.map +1 -0
  110. package/dist/runescape/model/quest/all/TheCorsairCurse.js +25 -0
  111. package/dist/runescape/model/quest/all/TheCurseOfArrav.d.ts +4 -0
  112. package/dist/runescape/model/quest/all/TheCurseOfArrav.d.ts.map +1 -0
  113. package/dist/runescape/model/quest/all/TheCurseOfArrav.js +34 -0
  114. package/dist/runescape/model/quest/all/TheDigSite.d.ts +4 -0
  115. package/dist/runescape/model/quest/all/TheDigSite.d.ts.map +1 -0
  116. package/dist/runescape/model/quest/all/TheDigSite.js +4 -0
  117. package/dist/runescape/model/quest/all/TheEyesOfGlouphrie.d.ts +4 -0
  118. package/dist/runescape/model/quest/all/TheEyesOfGlouphrie.d.ts.map +1 -0
  119. package/dist/runescape/model/quest/all/TheEyesOfGlouphrie.js +4 -0
  120. package/dist/runescape/model/quest/all/TheFeud.d.ts +4 -0
  121. package/dist/runescape/model/quest/all/TheFeud.d.ts.map +1 -0
  122. package/dist/runescape/model/quest/all/TheFeud.js +4 -0
  123. package/dist/runescape/model/quest/all/TheGardenOfDeath.d.ts +4 -0
  124. package/dist/runescape/model/quest/all/TheGardenOfDeath.d.ts.map +1 -0
  125. package/dist/runescape/model/quest/all/TheGardenOfDeath.js +4 -0
  126. package/dist/runescape/model/quest/all/TheHandInTheSand.js +1 -1
  127. package/dist/runescape/model/quest/all/TheHeartOfDarkness.d.ts +4 -0
  128. package/dist/runescape/model/quest/all/TheHeartOfDarkness.d.ts.map +1 -0
  129. package/dist/runescape/model/quest/all/TheHeartOfDarkness.js +4 -0
  130. package/dist/runescape/model/quest/all/TheIdesOfMilk.d.ts +4 -0
  131. package/dist/runescape/model/quest/all/TheIdesOfMilk.d.ts.map +1 -0
  132. package/dist/runescape/model/quest/all/TheIdesOfMilk.js +4 -0
  133. package/dist/runescape/model/quest/all/ThePathOfGlouphrie.d.ts +4 -0
  134. package/dist/runescape/model/quest/all/ThePathOfGlouphrie.d.ts.map +1 -0
  135. package/dist/runescape/model/quest/all/ThePathOfGlouphrie.js +4 -0
  136. package/dist/runescape/model/quest/all/TheRestlessGhost.d.ts +4 -0
  137. package/dist/runescape/model/quest/all/TheRestlessGhost.d.ts.map +1 -0
  138. package/dist/runescape/model/quest/all/TheRestlessGhost.js +4 -0
  139. package/dist/runescape/model/quest/all/TheRibbitingTaleOfALilyPadLabourDispute.d.ts +4 -0
  140. package/dist/runescape/model/quest/all/TheRibbitingTaleOfALilyPadLabourDispute.d.ts.map +1 -0
  141. package/dist/runescape/model/quest/all/TheRibbitingTaleOfALilyPadLabourDispute.js +4 -0
  142. package/dist/runescape/model/quest/all/TwilightsPromise.d.ts +4 -0
  143. package/dist/runescape/model/quest/all/TwilightsPromise.d.ts.map +1 -0
  144. package/dist/runescape/model/quest/all/TwilightsPromise.js +4 -0
  145. package/dist/runescape/model/quest/all/WhileGuthixSleeps.d.ts +4 -0
  146. package/dist/runescape/model/quest/all/WhileGuthixSleeps.d.ts.map +1 -0
  147. package/dist/runescape/model/quest/all/WhileGuthixSleeps.js +4 -0
  148. package/dist/runescape/model/quest/all/WitchsPotion.d.ts +4 -0
  149. package/dist/runescape/model/quest/all/WitchsPotion.d.ts.map +1 -0
  150. package/dist/runescape/model/quest/all/WitchsPotion.js +4 -0
  151. package/dist/runescape/model/quest/all/XMarksTheSpot.d.ts +4 -0
  152. package/dist/runescape/model/quest/all/XMarksTheSpot.d.ts.map +1 -0
  153. package/dist/runescape/model/quest/all/XMarksTheSpot.js +4 -0
  154. package/dist/runescape/model/quest/all/index.d.ts +47 -0
  155. package/dist/runescape/model/quest/all/index.d.ts.map +1 -1
  156. package/dist/runescape/model/quest/all/index.js +47 -0
  157. package/package.json +96 -96
  158. package/public/assets/icons/diaries/Ardougne_Diary.png +0 -0
  159. package/public/assets/icons/diaries/Desert_Diary.png +0 -0
  160. package/public/assets/icons/diaries/Falador_Diary.png +0 -0
  161. package/public/assets/icons/diaries/Fremennik_Diary.png +0 -0
  162. package/public/assets/icons/diaries/Kandarin_Diary.png +0 -0
  163. package/public/assets/icons/diaries/Karamja_Diary.png +0 -0
  164. package/public/assets/icons/diaries/Morytania_Diary.png +0 -0
  165. package/public/assets/icons/diaries/Varrock_Diary.png +0 -0
  166. package/public/assets/icons/diaries/Wilderness_Diary.png +0 -0
  167. package/public/assets/icons/skills/Agility_icon.png +0 -0
  168. package/public/assets/icons/skills/Attack_icon.png +0 -0
  169. package/public/assets/icons/skills/Construction_icon.png +0 -0
  170. package/public/assets/icons/skills/Cooking_icon.png +0 -0
  171. package/public/assets/icons/skills/Crafting_icon.png +0 -0
  172. package/public/assets/icons/skills/Defence_icon.png +0 -0
  173. package/public/assets/icons/skills/Farming_icon.png +0 -0
  174. package/public/assets/icons/skills/Firemaking_icon.png +0 -0
  175. package/public/assets/icons/skills/Fishing_icon.png +0 -0
  176. package/public/assets/icons/skills/Fletching_icon.png +0 -0
  177. package/public/assets/icons/skills/Herblore_icon.png +0 -0
  178. package/public/assets/icons/skills/Hitpoints_icon.png +0 -0
  179. package/public/assets/icons/skills/Magic_icon.png +0 -0
  180. package/public/assets/icons/skills/Mining_icon.png +0 -0
  181. package/public/assets/icons/skills/Prayer_icon.png +0 -0
  182. package/public/assets/icons/skills/Ranged_icon.png +0 -0
  183. package/public/assets/icons/skills/Sailing_icon.png +0 -0
  184. package/public/assets/icons/skills/Slayer_icon.png +0 -0
  185. package/public/assets/icons/skills/Smithing_icon.png +0 -0
  186. package/public/assets/icons/skills/Strength_icon.png +0 -0
  187. package/public/assets/icons/skills/Thieving_icon.png +0 -0
  188. package/public/assets/icons/skills/Woodcutting_icon.png +0 -0
  189. package/public/assets/icons/tabs/Combat_Tab.png +0 -0
  190. package/public/assets/icons/tabs/Inventory_Tab.png +0 -0
  191. package/public/assets/icons/tabs/Magic_Tab.png +0 -0
  192. package/public/assets/icons/tabs/Prayer_Tab.png +0 -0
  193. package/public/assets/icons/tabs/Quest_Tab.png +0 -0
  194. package/public/assets/icons/tabs/Skills_Tab.png +0 -0
  195. package/public/assets/icons/ui/Bank.png +0 -0
  196. package/public/assets/icons/ui/Music.png +0 -0
  197. package/public/assets/icons/ui/Quest_Points.png +0 -0
  198. package/public/assets/icons/ui/Settings.png +0 -0
  199. package/dist/runescape/model/Item/ClueScrollRewards.js +0 -286
  200. package/dist/runescape/model/Item/all/StudiedChaps.js +0 -35
  201. package/dist/runescape/model/Item/models/YellowPartyhat.obj +0 -149
  202. package/dist/runescape/tools/ClueScrollHelper.js +0 -103
  203. package/dist/runescape/utils/cache.js +0 -124
  204. /package/dist/runescape/model/slayer/{Masters.js → masters.js} +0 -0
@@ -1,149 +0,0 @@
1
- # Made by RuneLite Model-Dumper Plugin
2
- mtllib Item Yellow partyhat 2026-03-24_23-28-34.mtl
3
- o Item Yellow partyhat 2026-03-24_23-28-34
4
- v 0 7 9
5
- v 7 7 9
6
- v 7 2 9
7
- v 0 2 9
8
- v -7 7 9
9
- v 0 10 10
10
- v 5 17 11
11
- v -7 2 9
12
- v -10 3 -2
13
- v -10 9 -2
14
- v -10 17 4
15
- v 10 9 -2
16
- v 10 3 -2
17
- v 10 17 4
18
- v 8 7 -12
19
- v 7 0 -11
20
- v 9 17 -7
21
- v -7 0 -11
22
- v -8 7 -12
23
- v -10 17 -7
24
- v 0 7 -14
25
- v 0 -1 -13
26
- v 5 17 -13
27
- v -5 17 -13
28
- v -5 17 11
29
- v 7 9 9
30
- v 0 9 9
31
- v -7 9 9
32
- v -10 10 -2
33
- v -8 9 -12
34
- v 0 9 -14
35
- v 8 9 -12
36
- v 10 10 -2
37
- v -5 19 11
38
- v 0 12 10
39
- v 5 19 11
40
- v -10 19 4
41
- v -10 19 -7
42
- v -5 19 -13
43
- v 5 19 -13
44
- v 9 19 -7
45
- v 10 19 4
46
- usemtl c0
47
- f 1 2 3
48
- usemtl c1
49
- f 1 3 4
50
- usemtl c2
51
- f 1 4 5
52
- usemtl c3
53
- f 1 5 6
54
- usemtl c4
55
- f 1 6 2
56
- usemtl c5
57
- f 2 6 7
58
- usemtl c6
59
- f 4 8 5
60
- usemtl c7
61
- f 5 8 9
62
- usemtl c8
63
- f 5 9 10
64
- usemtl c9
65
- f 5 10 11
66
- usemtl c10
67
- f 12 13 3
68
- usemtl c11
69
- f 12 3 2
70
- usemtl c12
71
- f 12 2 14
72
- usemtl c13
73
- f 15 16 13
74
- usemtl c14
75
- f 15 13 12
76
- usemtl c15
77
- f 15 12 17
78
- usemtl c16
79
- f 10 9 18
80
- usemtl c17
81
- f 10 18 19
82
- usemtl c18
83
- f 10 19 20
84
- usemtl c19
85
- f 21 22 16
86
- usemtl c20
87
- f 21 16 15
88
- usemtl c21
89
- f 21 15 23
90
- usemtl c22
91
- f 19 18 22
92
- usemtl c23
93
- f 19 22 21
94
- usemtl c24
95
- f 19 21 24
96
- usemtl c9
97
- f 6 5 25
98
- usemtl c25
99
- f 4 3 26
100
- usemtl c26
101
- f 4 26 27
102
- usemtl c27
103
- f 4 27 8
104
- usemtl c28
105
- f 8 27 28
106
- usemtl c29
107
- f 8 28 29
108
- usemtl c30
109
- f 8 29 9
110
- usemtl c31
111
- f 9 29 30
112
- usemtl c32
113
- f 9 30 18
114
- usemtl c33
115
- f 18 30 31
116
- usemtl c16
117
- f 18 31 22
118
- usemtl c8
119
- f 22 31 32
120
- usemtl c34
121
- f 22 32 16
122
- usemtl c2
123
- f 16 32 33
124
- usemtl c35
125
- f 16 33 13
126
- usemtl c36
127
- f 13 33 26
128
- usemtl c37
129
- f 13 26 3
130
- usemtl c38
131
- f 34 28 35
132
- usemtl c39
133
- f 35 28 27
134
- usemtl c40
135
- f 35 27 26
136
- usemtl c41
137
- f 35 26 36
138
- usemtl c42
139
- f 28 37 29
140
- usemtl c43
141
- f 29 38 30
142
- usemtl c44
143
- f 30 39 31
144
- usemtl c9
145
- f 31 40 32
146
- usemtl c45
147
- f 32 41 33
148
- usemtl c46
149
- f 33 42 26
@@ -1,103 +0,0 @@
1
- /**
2
- * Helper class for OSRS Clue Scrolls
3
- * Handles casket opening simulation with accurate wiki-based reward odds
4
- */
5
- import { getClueRewardsByTier, } from '../model/Item/ClueScrollRewards';
6
- /**
7
- * Main ClueScrollHelper class that provides methods to simulate clue scroll rewards, calculate probabilities, and list possible rewards
8
- *
9
- * Reference: https://oldschool.runescape.wiki/w/Clue_scrolls
10
- */
11
- export class ClueScrollHelper {
12
- /**
13
- * Select a random reward based on rarity tiers
14
- * Uses item rarity values to create weighted selection
15
- */
16
- static selectRandomReward(rewards) {
17
- const items = [];
18
- let totalWeight = 0;
19
- for (const { item, rarity } of Object.values(rewards)) {
20
- const probability = 1 / rarity;
21
- items.push({ item, probability });
22
- totalWeight += probability;
23
- }
24
- const random = Math.random() * totalWeight;
25
- let cumulative = 0;
26
- for (const { item, probability } of items) {
27
- cumulative += probability;
28
- if (random < cumulative) {
29
- return item;
30
- }
31
- }
32
- // Fallback to last item if rounding errors occur
33
- return items[items.length - 1].item;
34
- }
35
- /**
36
- * Simulate opening a clue casket and return a random reward item
37
- * @param tier The difficulty tier of the clue scroll
38
- * @returns The Item object that is the reward
39
- */
40
- static openCasket(tier) {
41
- const rewards = getClueRewardsByTier(tier);
42
- return this.selectRandomReward(rewards);
43
- }
44
- /**
45
- * Get the probability of obtaining a specific item from a casket as a fraction
46
- * @param tier The difficulty tier
47
- * @param itemName The item name to check probability for
48
- * @returns The probability as a fraction (e.g., 0.0278 for 1/36)
49
- */
50
- static getItemProbability(tier, itemName) {
51
- const rewards = getClueRewardsByTier(tier);
52
- const reward = rewards[itemName];
53
- return reward ? 1 / reward.rarity : 0;
54
- }
55
- /**
56
- * Get the rarity denominator (X in "1 in X") for an item
57
- */
58
- static getItemRarity(tier, itemName) {
59
- const rewards = getClueRewardsByTier(tier);
60
- const reward = rewards[itemName];
61
- return reward ? reward.rarity : 0;
62
- }
63
- /**
64
- * Get all possible rewards for a tier as Item objects
65
- */
66
- static getPossibleRewards(tier) {
67
- const rewards = getClueRewardsByTier(tier);
68
- return Object.values(rewards).map(r => r.item);
69
- }
70
- /**
71
- * Get all possible reward items names for a tier
72
- */
73
- static getPossibleRewardNames(tier) {
74
- const rewards = getClueRewardsByTier(tier);
75
- return Object.keys(rewards);
76
- }
77
- /**
78
- * Simulate opening multiple caskets
79
- * @param tier The clue tier
80
- * @param count Number of caskets to open
81
- * @returns Array of reward Item objects
82
- */
83
- static simulateMultiple(tier, count) {
84
- const rewards = [];
85
- for (let i = 0; i < count; i++) {
86
- rewards.push(this.openCasket(tier));
87
- }
88
- return rewards;
89
- }
90
- /**
91
- * Get reward statistics for a tier
92
- */
93
- static getRewardStats(tier) {
94
- const rewards = getClueRewardsByTier(tier);
95
- const items = Object.values(rewards);
96
- return {
97
- tier,
98
- totalUnique: items.length,
99
- rareItems: items.filter(r => r.rarity > 100).length,
100
- commonItems: items.filter(r => r.rarity <= 50).length,
101
- };
102
- }
103
- }
@@ -1,124 +0,0 @@
1
- /**
2
- * Generic cache implementation with LRU eviction and TTL support
3
- */
4
- export class Cache {
5
- store = new Map();
6
- maxSize;
7
- ttl;
8
- /**
9
- * Creates a new Cache instance
10
- * @param options Cache configuration options
11
- */
12
- constructor(options = {}) {
13
- this.maxSize = options.maxSize || 100;
14
- this.ttl = options.ttl;
15
- }
16
- /**
17
- * Store a value in the cache
18
- * @param key Cache key
19
- * @param value Value to store
20
- * @param ttl Optional TTL override for this item
21
- */
22
- set(key, value, ttl) {
23
- // Enforce size limit using LRU eviction
24
- if (this.store.size >= this.maxSize) {
25
- const firstKey = this.store.keys().next().value;
26
- this.store.delete(firstKey);
27
- }
28
- const expiresAt = ttl || this.ttl ? Date.now() + (ttl || this.ttl) : undefined;
29
- this.store.set(key, { expiresAt, value });
30
- }
31
- /**
32
- * Retrieve a value from the cache
33
- * @param key Cache key
34
- * @returns Stored value or undefined if not found/expired
35
- */
36
- get(key) {
37
- const item = this.store.get(key);
38
- if (!item) {
39
- return undefined;
40
- }
41
- // Check if item has expired
42
- if (item.expiresAt && Date.now() > item.expiresAt) {
43
- this.store.delete(key);
44
- return undefined;
45
- }
46
- return item.value;
47
- }
48
- /**
49
- * Remove an item from the cache
50
- * @param key Cache key
51
- * @returns true if item was found and removed
52
- */
53
- delete(key) {
54
- return this.store.delete(key);
55
- }
56
- /**
57
- * Clear all items from the cache
58
- */
59
- clear() {
60
- this.store.clear();
61
- }
62
- /**
63
- * Get the number of items in the cache
64
- */
65
- get size() {
66
- return this.store.size;
67
- }
68
- /**
69
- * Get all valid keys in the cache
70
- * @returns Array of cache keys
71
- */
72
- keys() {
73
- const now = Date.now();
74
- return Array.from(this.store.entries())
75
- .filter(([, item]) => !item.expiresAt || item.expiresAt > now)
76
- .map(([key]) => key);
77
- }
78
- /**
79
- * Remove all expired items from the cache
80
- * @returns Number of items removed
81
- */
82
- prune() {
83
- const now = Date.now();
84
- let removed = 0;
85
- for (const [key, item] of this.store.entries()) {
86
- if (item.expiresAt && item.expiresAt <= now) {
87
- this.store.delete(key);
88
- removed++;
89
- }
90
- }
91
- return removed;
92
- }
93
- /**
94
- * Check if a key exists in the cache and isn't expired
95
- * @param key Cache key
96
- * @returns true if key exists and isn't expired
97
- */
98
- has(key) {
99
- const item = this.store.get(key);
100
- if (!item) {
101
- return false;
102
- }
103
- if (item.expiresAt && Date.now() > item.expiresAt) {
104
- this.store.delete(key);
105
- return false;
106
- }
107
- return true;
108
- }
109
- /**
110
- * Get or set a cache value
111
- * @param key Cache key
112
- * @param factory Function to create value if not found
113
- * @returns Cached or newly created value
114
- */
115
- async getOrSet(key, factory) {
116
- const existing = this.get(key);
117
- if (existing !== undefined) {
118
- return existing;
119
- }
120
- const value = await factory();
121
- this.set(key, value);
122
- return value;
123
- }
124
- }