farming-weight 0.14.2 → 0.15.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 (318) hide show
  1. package/README.md +45 -18
  2. package/dist/constants/attributes.d.ts +12 -7
  3. package/dist/constants/attributes.js +17 -39
  4. package/dist/constants/attributes.js.map +1 -1
  5. package/dist/constants/chips.d.ts +1 -6
  6. package/dist/constants/chips.js +11 -15
  7. package/dist/constants/chips.js.map +1 -1
  8. package/dist/constants/crops.d.ts +28 -4
  9. package/dist/constants/crops.js +65 -2
  10. package/dist/constants/crops.js.map +1 -1
  11. package/dist/constants/enchants.d.ts +1 -1
  12. package/dist/constants/enchants.js +117 -68
  13. package/dist/constants/enchants.js.map +1 -1
  14. package/dist/constants/garden.js +152 -137
  15. package/dist/constants/garden.js.map +1 -1
  16. package/dist/constants/pests.d.ts +3 -2
  17. package/dist/constants/pests.js +5 -0
  18. package/dist/constants/pests.js.map +1 -1
  19. package/dist/constants/reforge-types.d.ts +57 -0
  20. package/dist/constants/reforge-types.js +40 -0
  21. package/dist/constants/reforge-types.js.map +1 -0
  22. package/dist/constants/reforges.d.ts +8 -55
  23. package/dist/constants/reforges.js +10 -635
  24. package/dist/constants/reforges.js.map +1 -1
  25. package/dist/constants/specific.js +11 -11
  26. package/dist/constants/specific.js.map +1 -1
  27. package/dist/constants/stats.d.ts +1 -0
  28. package/dist/constants/stats.js +2 -0
  29. package/dist/constants/stats.js.map +1 -1
  30. package/dist/constants/tempfortune.d.ts +5 -0
  31. package/dist/constants/tempfortune.js +36 -7
  32. package/dist/constants/tempfortune.js.map +1 -1
  33. package/dist/constants/upgrades.d.ts +36 -3
  34. package/dist/constants/upgrades.js +12 -0
  35. package/dist/constants/upgrades.js.map +1 -1
  36. package/dist/crops/special.d.ts +1 -1
  37. package/dist/crops/special.js.map +1 -1
  38. package/dist/effects/environment.d.ts +12 -0
  39. package/dist/effects/environment.js +33 -0
  40. package/dist/effects/environment.js.map +1 -0
  41. package/dist/effects/index.d.ts +4 -0
  42. package/dist/effects/index.js +5 -0
  43. package/dist/effects/index.js.map +1 -0
  44. package/dist/effects/matcher.d.ts +23 -0
  45. package/dist/effects/matcher.js +108 -0
  46. package/dist/effects/matcher.js.map +1 -0
  47. package/dist/effects/resolver.d.ts +63 -0
  48. package/dist/effects/resolver.js +239 -0
  49. package/dist/effects/resolver.js.map +1 -0
  50. package/dist/effects/summary.d.ts +5 -0
  51. package/dist/effects/summary.js +21 -0
  52. package/dist/effects/summary.js.map +1 -0
  53. package/dist/effects/types.d.ts +147 -0
  54. package/dist/effects/types.js +9 -0
  55. package/dist/effects/types.js.map +1 -0
  56. package/dist/features/composter/upgrades.js +5 -5
  57. package/dist/features/composter/upgrades.js.map +1 -1
  58. package/dist/fortune/farmingaccessory.d.ts +9 -1
  59. package/dist/fortune/farmingaccessory.js +24 -13
  60. package/dist/fortune/farmingaccessory.js.map +1 -1
  61. package/dist/fortune/farmingarmor.d.ts +21 -10
  62. package/dist/fortune/farmingarmor.js +89 -29
  63. package/dist/fortune/farmingarmor.js.map +1 -1
  64. package/dist/fortune/farmingequipment.d.ts +10 -1
  65. package/dist/fortune/farmingequipment.js +44 -11
  66. package/dist/fortune/farmingequipment.js.map +1 -1
  67. package/dist/fortune/farmingpet.d.ts +16 -0
  68. package/dist/fortune/farmingpet.js +207 -0
  69. package/dist/fortune/farmingpet.js.map +1 -1
  70. package/dist/fortune/farmingtool.d.ts +13 -6
  71. package/dist/fortune/farmingtool.js +60 -44
  72. package/dist/fortune/farmingtool.js.map +1 -1
  73. package/dist/fortune/lotuspiecebonus.d.ts +6 -0
  74. package/dist/fortune/lotuspiecebonus.js +20 -0
  75. package/dist/fortune/lotuspiecebonus.js.map +1 -0
  76. package/dist/fortune/upgradeable.d.ts +2 -4
  77. package/dist/fortune/upgradeablebase.d.ts +2 -4
  78. package/dist/fortune/upgradeablebase.js +4 -10
  79. package/dist/fortune/upgradeablebase.js.map +1 -1
  80. package/dist/index.d.ts +4 -0
  81. package/dist/index.js +4 -0
  82. package/dist/index.js.map +1 -1
  83. package/dist/items/accessories/base.d.ts +3 -0
  84. package/dist/items/accessories/base.js +4 -0
  85. package/dist/items/accessories/base.js.map +1 -0
  86. package/dist/items/accessories/fermento-family.d.ts +91 -0
  87. package/dist/items/accessories/fermento-family.js +125 -0
  88. package/dist/items/accessories/fermento-family.js.map +1 -0
  89. package/dist/items/accessories/freshly-baked.d.ts +80 -0
  90. package/dist/items/accessories/freshly-baked.js +119 -0
  91. package/dist/items/accessories/freshly-baked.js.map +1 -0
  92. package/dist/items/accessories/index.d.ts +25 -0
  93. package/dist/items/accessories/index.js +25 -0
  94. package/dist/items/accessories/index.js.map +1 -0
  95. package/dist/items/accessories/power-relic.d.ts +18 -0
  96. package/dist/items/accessories/power-relic.js +37 -0
  97. package/dist/items/accessories/power-relic.js.map +1 -0
  98. package/dist/items/accessories/special.d.ts +24 -0
  99. package/dist/items/accessories/special.js +41 -0
  100. package/dist/items/accessories/special.js.map +1 -0
  101. package/dist/items/accessories.d.ts +2 -3
  102. package/dist/items/accessories.js +1 -137
  103. package/dist/items/accessories.js.map +1 -1
  104. package/dist/items/armor/biohazard.js +4 -4
  105. package/dist/items/armor/biohazard.js.map +1 -1
  106. package/dist/items/armor/cropie.d.ts +4 -0
  107. package/dist/items/armor/cropie.js +10 -4
  108. package/dist/items/armor/cropie.js.map +1 -1
  109. package/dist/items/armor/farm.js +4 -4
  110. package/dist/items/armor/farm.js.map +1 -1
  111. package/dist/items/armor/fermento.d.ts +4 -0
  112. package/dist/items/armor/fermento.js +10 -4
  113. package/dist/items/armor/fermento.js.map +1 -1
  114. package/dist/items/armor/groups.d.ts +2 -0
  115. package/dist/items/armor/groups.js +17 -0
  116. package/dist/items/armor/groups.js.map +1 -0
  117. package/dist/items/armor/helianthus.js +4 -4
  118. package/dist/items/armor/helianthus.js.map +1 -1
  119. package/dist/items/armor/melon.d.ts +4 -0
  120. package/dist/items/armor/melon.js +10 -4
  121. package/dist/items/armor/melon.js.map +1 -1
  122. package/dist/items/armor/mushroom.js +4 -4
  123. package/dist/items/armor/mushroom.js.map +1 -1
  124. package/dist/items/armor/rabbit.js +4 -4
  125. package/dist/items/armor/rabbit.js.map +1 -1
  126. package/dist/items/armor/special.js +4 -4
  127. package/dist/items/armor/special.js.map +1 -1
  128. package/dist/items/armor/squash.d.ts +4 -0
  129. package/dist/items/armor/squash.js +10 -4
  130. package/dist/items/armor/squash.js.map +1 -1
  131. package/dist/items/equipment/blossom.js +4 -4
  132. package/dist/items/equipment/blossom.js.map +1 -1
  133. package/dist/items/equipment/lotus.js +4 -4
  134. package/dist/items/equipment/lotus.js.map +1 -1
  135. package/dist/items/equipment/pesthunter.js +4 -4
  136. package/dist/items/equipment/pesthunter.js.map +1 -1
  137. package/dist/items/equipment/special.js +2 -2
  138. package/dist/items/equipment/special.js.map +1 -1
  139. package/dist/items/gems/base.d.ts +19 -0
  140. package/dist/items/gems/base.js +60 -0
  141. package/dist/items/gems/base.js.map +1 -0
  142. package/dist/items/gems/index.d.ts +1 -0
  143. package/dist/items/gems/index.js +2 -0
  144. package/dist/items/gems/index.js.map +1 -0
  145. package/dist/items/pets/bee.d.ts +9 -0
  146. package/dist/items/pets/bee.js +33 -1
  147. package/dist/items/pets/bee.js.map +1 -1
  148. package/dist/items/pets/chicken.js +1 -1
  149. package/dist/items/pets/chicken.js.map +1 -1
  150. package/dist/items/pets/elephant.js +1 -1
  151. package/dist/items/pets/elephant.js.map +1 -1
  152. package/dist/items/pets/hedgehog.d.ts +5 -0
  153. package/dist/items/pets/hedgehog.js +6 -1
  154. package/dist/items/pets/hedgehog.js.map +1 -1
  155. package/dist/items/pets/mooshroom-cow.js +1 -1
  156. package/dist/items/pets/mooshroom-cow.js.map +1 -1
  157. package/dist/items/pets/mosquito.js +1 -1
  158. package/dist/items/pets/mosquito.js.map +1 -1
  159. package/dist/items/pets/pig.d.ts +5 -0
  160. package/dist/items/pets/pig.js +19 -14
  161. package/dist/items/pets/pig.js.map +1 -1
  162. package/dist/items/pets/rabbit.js +1 -1
  163. package/dist/items/pets/rabbit.js.map +1 -1
  164. package/dist/items/pets/rose-dragon.js +12 -14
  165. package/dist/items/pets/rose-dragon.js.map +1 -1
  166. package/dist/items/pets/slug.js +1 -1
  167. package/dist/items/pets/slug.js.map +1 -1
  168. package/dist/items/pets.d.ts +1 -1
  169. package/dist/items/pets.js +18 -4
  170. package/dist/items/pets.js.map +1 -1
  171. package/dist/items/reforges/base.d.ts +18 -0
  172. package/dist/items/reforges/base.js +54 -0
  173. package/dist/items/reforges/base.js.map +1 -0
  174. package/dist/items/reforges/blessed.d.ts +7 -0
  175. package/dist/items/reforges/blessed.js +90 -0
  176. package/dist/items/reforges/blessed.js.map +1 -0
  177. package/dist/items/reforges/blooming.d.ts +4 -0
  178. package/dist/items/reforges/blooming.js +43 -0
  179. package/dist/items/reforges/blooming.js.map +1 -0
  180. package/dist/items/reforges/bountiful.d.ts +4 -0
  181. package/dist/items/reforges/bountiful.js +63 -0
  182. package/dist/items/reforges/bountiful.js.map +1 -0
  183. package/dist/items/reforges/bustling.d.ts +4 -0
  184. package/dist/items/reforges/bustling.js +26 -0
  185. package/dist/items/reforges/bustling.js.map +1 -0
  186. package/dist/items/reforges/deep-fried.d.ts +7 -0
  187. package/dist/items/reforges/deep-fried.js +38 -0
  188. package/dist/items/reforges/deep-fried.js.map +1 -0
  189. package/dist/items/reforges/earthy.d.ts +4 -0
  190. package/dist/items/reforges/earthy.js +26 -0
  191. package/dist/items/reforges/earthy.js.map +1 -0
  192. package/dist/items/reforges/green-thumb.d.ts +4 -0
  193. package/dist/items/reforges/green-thumb.js +43 -0
  194. package/dist/items/reforges/green-thumb.js.map +1 -0
  195. package/dist/items/reforges/index.d.ts +16 -0
  196. package/dist/items/reforges/index.js +43 -0
  197. package/dist/items/reforges/index.js.map +1 -0
  198. package/dist/items/reforges/mantid.d.ts +4 -0
  199. package/dist/items/reforges/mantid.js +43 -0
  200. package/dist/items/reforges/mantid.js.map +1 -0
  201. package/dist/items/reforges/mossy.d.ts +4 -0
  202. package/dist/items/reforges/mossy.js +44 -0
  203. package/dist/items/reforges/mossy.js.map +1 -0
  204. package/dist/items/reforges/overpriced.d.ts +4 -0
  205. package/dist/items/reforges/overpriced.js +43 -0
  206. package/dist/items/reforges/overpriced.js.map +1 -0
  207. package/dist/items/reforges/robust.d.ts +4 -0
  208. package/dist/items/reforges/robust.js +22 -0
  209. package/dist/items/reforges/robust.js.map +1 -0
  210. package/dist/items/reforges/rooted.d.ts +4 -0
  211. package/dist/items/reforges/rooted.js +43 -0
  212. package/dist/items/reforges/rooted.js.map +1 -0
  213. package/dist/items/reforges/squeaky.d.ts +4 -0
  214. package/dist/items/reforges/squeaky.js +47 -0
  215. package/dist/items/reforges/squeaky.js.map +1 -0
  216. package/dist/items/sources/attributes.d.ts +119 -0
  217. package/dist/items/sources/attributes.js +285 -0
  218. package/dist/items/sources/attributes.js.map +1 -0
  219. package/dist/items/sources/base.d.ts +33 -0
  220. package/dist/items/sources/base.js +13 -0
  221. package/dist/items/sources/base.js.map +1 -0
  222. package/dist/items/sources/chips.d.ts +54 -0
  223. package/dist/items/sources/chips.js +100 -0
  224. package/dist/items/sources/chips.js.map +1 -0
  225. package/dist/items/sources/effects-util.d.ts +10 -0
  226. package/dist/items/sources/effects-util.js +35 -0
  227. package/dist/items/sources/effects-util.js.map +1 -0
  228. package/dist/items/sources/enchants.d.ts +28 -0
  229. package/dist/items/sources/enchants.js +87 -0
  230. package/dist/items/sources/enchants.js.map +1 -0
  231. package/dist/items/sources/gems.d.ts +9 -0
  232. package/dist/items/sources/gems.js +35 -0
  233. package/dist/items/sources/gems.js.map +1 -0
  234. package/dist/items/sources/index.d.ts +6 -0
  235. package/dist/items/sources/index.js +7 -0
  236. package/dist/items/sources/index.js.map +1 -0
  237. package/dist/items/sources/reforges.d.ts +8 -0
  238. package/dist/items/sources/reforges.js +10 -0
  239. package/dist/items/sources/reforges.js.map +1 -0
  240. package/dist/items/tools/cactus-knife.js +6 -6
  241. package/dist/items/tools/cactus-knife.js.map +1 -1
  242. package/dist/items/tools/cocoa-chopper.js +6 -6
  243. package/dist/items/tools/cocoa-chopper.js.map +1 -1
  244. package/dist/items/tools/dicers.js +6 -6
  245. package/dist/items/tools/dicers.js.map +1 -1
  246. package/dist/items/tools/fungi-cutter.js +6 -6
  247. package/dist/items/tools/fungi-cutter.js.map +1 -1
  248. package/dist/items/tools/mathematical-hoes.d.ts +5 -5
  249. package/dist/items/tools/mathematical-hoes.js +26 -26
  250. package/dist/items/tools/mathematical-hoes.js.map +1 -1
  251. package/dist/items/tools/special.js +2 -2
  252. package/dist/items/tools/special.js.map +1 -1
  253. package/dist/items/types/pets.d.ts +0 -2
  254. package/dist/player/player.d.ts +60 -7
  255. package/dist/player/player.js +318 -128
  256. package/dist/player/player.js.map +1 -1
  257. package/dist/player/playeroptions.d.ts +25 -1
  258. package/dist/player/playeroptions.js.map +1 -1
  259. package/dist/upgrades/enchantupgrades.js +22 -8
  260. package/dist/upgrades/enchantupgrades.js.map +1 -1
  261. package/dist/upgrades/getsourceprogress.js +7 -0
  262. package/dist/upgrades/getsourceprogress.js.map +1 -1
  263. package/dist/upgrades/groups.d.ts +3 -0
  264. package/dist/upgrades/groups.js +86 -0
  265. package/dist/upgrades/groups.js.map +1 -0
  266. package/dist/upgrades/itemcatalog.d.ts +3 -0
  267. package/dist/upgrades/itemcatalog.js +21 -0
  268. package/dist/upgrades/itemcatalog.js.map +1 -0
  269. package/dist/upgrades/itemregistry.d.ts +1 -2
  270. package/dist/upgrades/itemregistry.js +23 -3
  271. package/dist/upgrades/itemregistry.js.map +1 -1
  272. package/dist/upgrades/sources/accessorysources.js +1 -1
  273. package/dist/upgrades/sources/accessorysources.js.map +1 -1
  274. package/dist/upgrades/sources/armorsetsources.js +16 -16
  275. package/dist/upgrades/sources/armorsetsources.js.map +1 -1
  276. package/dist/upgrades/sources/cropsources.js +10 -5
  277. package/dist/upgrades/sources/cropsources.js.map +1 -1
  278. package/dist/upgrades/sources/dynamicfortunesources.d.ts +5 -2
  279. package/dist/upgrades/sources/effectsources.d.ts +4 -0
  280. package/dist/upgrades/sources/effectsources.js +60 -0
  281. package/dist/upgrades/sources/effectsources.js.map +1 -0
  282. package/dist/upgrades/sources/gearsources.js +33 -8
  283. package/dist/upgrades/sources/gearsources.js.map +1 -1
  284. package/dist/upgrades/sources/generalsources.d.ts +3 -2
  285. package/dist/upgrades/sources/generalsources.js +313 -22
  286. package/dist/upgrades/sources/generalsources.js.map +1 -1
  287. package/dist/upgrades/sources/toolsources.js +64 -84
  288. package/dist/upgrades/sources/toolsources.js.map +1 -1
  289. package/dist/upgrades/upgradekeys.d.ts +2 -0
  290. package/dist/upgrades/upgradekeys.js +5 -0
  291. package/dist/upgrades/upgradekeys.js.map +1 -0
  292. package/dist/upgrades/upgrades.d.ts +5 -7
  293. package/dist/upgrades/upgrades.js +142 -43
  294. package/dist/upgrades/upgrades.js.map +1 -1
  295. package/dist/upgrades/upgradeutils.d.ts +2 -4
  296. package/dist/upgrades/upgradeutils.js +26 -6
  297. package/dist/upgrades/upgradeutils.js.map +1 -1
  298. package/dist/util/bestiary.d.ts +10 -0
  299. package/dist/util/bestiary.js +41 -0
  300. package/dist/util/bestiary.js.map +1 -0
  301. package/dist/util/enchants.d.ts +6 -0
  302. package/dist/util/enchants.js +20 -5
  303. package/dist/util/enchants.js.map +1 -1
  304. package/dist/util/gems.js +4 -30
  305. package/dist/util/gems.js.map +1 -1
  306. package/dist/util/itemstats.d.ts +3 -0
  307. package/dist/util/itemstats.js +20 -2
  308. package/dist/util/itemstats.js.map +1 -1
  309. package/dist/util/ratecalc-effects.d.ts +64 -0
  310. package/dist/util/ratecalc-effects.js +252 -0
  311. package/dist/util/ratecalc-effects.js.map +1 -0
  312. package/dist/util/ratecalc.d.ts +0 -33
  313. package/dist/util/ratecalc.js +0 -187
  314. package/dist/util/ratecalc.js.map +1 -1
  315. package/dist/util/skyblocktime.d.ts +1 -0
  316. package/dist/util/skyblocktime.js +4 -0
  317. package/dist/util/skyblocktime.js.map +1 -1
  318. package/package.json +2 -1
@@ -0,0 +1,119 @@
1
+ import type { Effect, EffectEnvironment } from '../../effects/types.js';
2
+ import type { FarmingPlayer } from '../../player/player.js';
3
+ import { FortuneSource, type FortuneSourceActiveState } from './base.js';
4
+ export declare class CropeetleShard extends FortuneSource {
5
+ readonly id = "cropeetle";
6
+ readonly name: string;
7
+ getEffects(player: FarmingPlayer, _env: EffectEnvironment): Effect[];
8
+ }
9
+ /**
10
+ * Warty Bug Shard - adds Warty drops while farming Nether Wart.
11
+ *
12
+ * Emits an `add-drop` effect crop-scoped to Nether Wart. Drops are tagged
13
+ * `['overbloom','rare-crop']` so Overbloom (and any future global rare-crop
14
+ * multipliers) buff them by default. The drop kind is `'rare'`.
15
+ */
16
+ export declare class WartyBugShard extends FortuneSource {
17
+ readonly id = "wart_eater";
18
+ readonly name: string;
19
+ getEffects(player: FarmingPlayer, env: EffectEnvironment): Effect[];
20
+ }
21
+ /**
22
+ * Dragonfly Shard - `+0.5` Farming Wisdom per level. Always active.
23
+ */
24
+ export declare class DragonflyShard extends FortuneSource {
25
+ readonly id = "dragonfly";
26
+ readonly name: string;
27
+ getEffects(player: FarmingPlayer, _env: EffectEnvironment): Effect[];
28
+ }
29
+ /**
30
+ * Firefly Shard - `+5` Farming Fortune per level during the day.
31
+ *
32
+ * Active rules (preserved from the existing implementation, which assumes the
33
+ * world is during the day unless overridden):
34
+ * - If the player has selected Sunflower, force active.
35
+ * - If the player has selected Moonflower, force inactive.
36
+ * - If Lunar Moth shard is at an equal-or-higher level, defer to it (inactive).
37
+ * - Otherwise active.
38
+ */
39
+ export declare class FireflyShard extends FortuneSource {
40
+ readonly id = "firefly";
41
+ readonly name: string;
42
+ private resolve;
43
+ getActive(player: FarmingPlayer, env: EffectEnvironment): FortuneSourceActiveState;
44
+ getEffects(player: FarmingPlayer, env: EffectEnvironment): Effect[];
45
+ }
46
+ /**
47
+ * Lunar Moth Shard - `+5` Farming Fortune per level during the night.
48
+ *
49
+ * Active rules mirror Firefly (Moonflower forces active, Sunflower forces
50
+ * inactive, otherwise the higher-level shard wins ties going to Lunar Moth).
51
+ */
52
+ export declare class LunarMothShard extends FortuneSource {
53
+ readonly id = "lunar_moth";
54
+ readonly name: string;
55
+ private resolve;
56
+ getActive(player: FarmingPlayer, env: EffectEnvironment): FortuneSourceActiveState;
57
+ getEffects(player: FarmingPlayer, env: EffectEnvironment): Effect[];
58
+ }
59
+ /**
60
+ * Termite Shard - `+3` Farming Fortune per level while on an infested plot.
61
+ */
62
+ export declare class TermiteShard extends FortuneSource {
63
+ readonly id = "termite";
64
+ readonly name: string;
65
+ getActive(player: FarmingPlayer, env: EffectEnvironment): FortuneSourceActiveState;
66
+ getEffects(player: FarmingPlayer, env: EffectEnvironment): Effect[];
67
+ }
68
+ /**
69
+ * Galaxy Fish Shard - `+1` Farming/Mining/Foraging Fortune per level.
70
+ */
71
+ export declare class GalaxyFishShard extends FortuneSource {
72
+ readonly id = "galaxy_fish";
73
+ readonly name: string;
74
+ getEffects(player: FarmingPlayer, _env: EffectEnvironment): Effect[];
75
+ }
76
+ export declare class LadybugShard extends FortuneSource {
77
+ readonly id = "ladybug";
78
+ readonly name: string;
79
+ getEffects(_player: FarmingPlayer, _env: EffectEnvironment): Effect[];
80
+ }
81
+ export declare class InvisibugShard extends FortuneSource {
82
+ readonly id = "invisibug";
83
+ readonly name: string;
84
+ getEffects(_player: FarmingPlayer, _env: EffectEnvironment): Effect[];
85
+ }
86
+ export declare class PrayingMantisShard extends FortuneSource {
87
+ readonly id = "praying_mantis";
88
+ readonly name: string;
89
+ getEffects(_player: FarmingPlayer, _env: EffectEnvironment): Effect[];
90
+ }
91
+ export declare class PestShard extends FortuneSource {
92
+ readonly id = "pest";
93
+ readonly name: string;
94
+ getEffects(player: FarmingPlayer, _env: EffectEnvironment): Effect[];
95
+ }
96
+ export declare class MudwormShard extends FortuneSource {
97
+ readonly id = "mudworm";
98
+ readonly name: string;
99
+ getEffects(_player: FarmingPlayer, _env: EffectEnvironment): Effect[];
100
+ }
101
+ /**
102
+ * Class registry of every farming attribute shard, keyed by the SkyBlock
103
+ * attribute key (matching `FARMING_ATTRIBUTE_SHARDS`). Use this to enumerate
104
+ * sources during effect collection.
105
+ */
106
+ export declare const FARMING_ATTRIBUTE_SHARD_CLASSES: {
107
+ readonly wart_eater: WartyBugShard;
108
+ readonly garden_wisdom: DragonflyShard;
109
+ readonly solar_power: FireflyShard;
110
+ readonly lunar_power: LunarMothShard;
111
+ readonly pretty_clothes: LadybugShard;
112
+ readonly crop_bug: CropeetleShard;
113
+ readonly fancy_visit: InvisibugShard;
114
+ readonly infiltration: TermiteShard;
115
+ readonly insect_power: PrayingMantisShard;
116
+ readonly pest_luck: PestShard;
117
+ readonly visitor_bait: MudwormShard;
118
+ readonly ultimate_dna: GalaxyFishShard;
119
+ };
@@ -0,0 +1,285 @@
1
+ import { FARMING_ATTRIBUTE_SHARDS, getAttributeAmount, getShardLevel } from '../../constants/attributes.js';
2
+ import { Crop } from '../../constants/crops.js';
3
+ import { Rarity } from '../../constants/reforges.js';
4
+ import { Stat } from '../../constants/stats.js';
5
+ import { FortuneSource } from './base.js';
6
+ import { statsToEffects } from './effects-util.js';
7
+ const ATTRIBUTE_SHARDS_STAT_SOURCE = 'Attribute Shards';
8
+ export class CropeetleShard extends FortuneSource {
9
+ id = 'cropeetle';
10
+ name = FARMING_ATTRIBUTE_SHARDS.crop_bug?.name ?? 'Cropeetle Shard';
11
+ getEffects(player, _env) {
12
+ const level = getShardLevel(Rarity.Rare, getAttributeAmount(player.options.attributes, 'crop_bug'));
13
+ if (level <= 0)
14
+ return [];
15
+ return statsToEffects({ [Stat.Overbloom]: level }, this.name);
16
+ }
17
+ }
18
+ /**
19
+ * Warty Bug Shard - adds Warty drops while farming Nether Wart.
20
+ *
21
+ * Emits an `add-drop` effect crop-scoped to Nether Wart. Drops are tagged
22
+ * `['overbloom','rare-crop']` so Overbloom (and any future global rare-crop
23
+ * multipliers) buff them by default. The drop kind is `'rare'`.
24
+ */
25
+ export class WartyBugShard extends FortuneSource {
26
+ id = 'wart_eater';
27
+ name = FARMING_ATTRIBUTE_SHARDS.wart_eater?.name ?? 'Warty Bug Shard';
28
+ getEffects(player, env) {
29
+ if (env.crop !== Crop.NetherWart)
30
+ return [];
31
+ const level = getShardLevel(Rarity.Legendary, getAttributeAmount(player.options.attributes, 'wart_eater'));
32
+ if (level <= 0)
33
+ return [];
34
+ const chance = 0.00005 * level;
35
+ return [
36
+ {
37
+ source: this.name,
38
+ op: 'add-drop',
39
+ scope: { crops: [Crop.NetherWart] },
40
+ drop: {
41
+ itemId: 'WARTY',
42
+ chance,
43
+ dropKind: 'rare',
44
+ tags: ['overbloom', 'rare-crop'],
45
+ },
46
+ meta: { description: `${(chance * 100).toFixed(3)}% chance per block to drop Warty` },
47
+ },
48
+ ];
49
+ }
50
+ }
51
+ /**
52
+ * Dragonfly Shard - `+0.5` Farming Wisdom per level. Always active.
53
+ */
54
+ export class DragonflyShard extends FortuneSource {
55
+ id = 'dragonfly';
56
+ name = FARMING_ATTRIBUTE_SHARDS.garden_wisdom?.name ?? 'Dragonfly Shard';
57
+ getEffects(player, _env) {
58
+ const level = getShardLevel(Rarity.Epic, getAttributeAmount(player.options.attributes, 'garden_wisdom'));
59
+ if (level <= 0)
60
+ return [];
61
+ return [{ source: ATTRIBUTE_SHARDS_STAT_SOURCE, op: 'add-stat', stat: Stat.FarmingWisdom, value: 0.5 * level }];
62
+ }
63
+ }
64
+ /**
65
+ * Firefly Shard - `+5` Farming Fortune per level during the day.
66
+ *
67
+ * Active rules (preserved from the existing implementation, which assumes the
68
+ * world is during the day unless overridden):
69
+ * - If the player has selected Sunflower, force active.
70
+ * - If the player has selected Moonflower, force inactive.
71
+ * - If Lunar Moth shard is at an equal-or-higher level, defer to it (inactive).
72
+ * - Otherwise active.
73
+ */
74
+ export class FireflyShard extends FortuneSource {
75
+ id = 'firefly';
76
+ name = FARMING_ATTRIBUTE_SHARDS.solar_power?.name ?? 'Firefly Shard';
77
+ resolve(player, env) {
78
+ const fireflyAmount = getAttributeAmount(player.options.attributes, 'solar_power');
79
+ const lunarAmount = getAttributeAmount(player.options.attributes, 'lunar_power');
80
+ const fireflyLevel = getShardLevel(Rarity.Epic, fireflyAmount);
81
+ const lunarLevel = getShardLevel(Rarity.Epic, lunarAmount);
82
+ return { fireflyLevel, lunarLevel, env };
83
+ }
84
+ getActive(player, env) {
85
+ const { fireflyLevel, lunarLevel } = this.resolve(player, env);
86
+ if (env.selectedCrop === Crop.Sunflower) {
87
+ return { active: true, reason: 'Forced active by selected Sunflower.' };
88
+ }
89
+ if (env.selectedCrop === Crop.Moonflower) {
90
+ return {
91
+ active: false,
92
+ reason: 'Disabled by selected Moonflower (Lunar Moth used instead).',
93
+ fortune: 5 * lunarLevel,
94
+ };
95
+ }
96
+ if (lunarLevel >= fireflyLevel) {
97
+ return {
98
+ active: false,
99
+ reason: 'Lunar Moth shard is at a higher or equal level, using it instead.',
100
+ fortune: 5 * lunarLevel,
101
+ };
102
+ }
103
+ return { active: true, reason: 'Active during the day.' };
104
+ }
105
+ getEffects(player, env) {
106
+ const { fireflyLevel } = this.resolve(player, env);
107
+ if (fireflyLevel <= 0)
108
+ return [];
109
+ const state = this.getActive(player, env);
110
+ if (!state.active)
111
+ return [];
112
+ return [
113
+ {
114
+ source: ATTRIBUTE_SHARDS_STAT_SOURCE,
115
+ op: 'add-stat',
116
+ stat: Stat.FarmingFortune,
117
+ value: 5 * fireflyLevel,
118
+ },
119
+ ];
120
+ }
121
+ }
122
+ /**
123
+ * Lunar Moth Shard - `+5` Farming Fortune per level during the night.
124
+ *
125
+ * Active rules mirror Firefly (Moonflower forces active, Sunflower forces
126
+ * inactive, otherwise the higher-level shard wins ties going to Lunar Moth).
127
+ */
128
+ export class LunarMothShard extends FortuneSource {
129
+ id = 'lunar_moth';
130
+ name = FARMING_ATTRIBUTE_SHARDS.lunar_power?.name ?? 'Lunar Moth Shard';
131
+ resolve(player) {
132
+ const fireflyAmount = getAttributeAmount(player.options.attributes, 'solar_power');
133
+ const lunarAmount = getAttributeAmount(player.options.attributes, 'lunar_power');
134
+ const fireflyLevel = getShardLevel(Rarity.Epic, fireflyAmount);
135
+ const lunarLevel = getShardLevel(Rarity.Epic, lunarAmount);
136
+ return { fireflyLevel, lunarLevel };
137
+ }
138
+ getActive(player, env) {
139
+ const { fireflyLevel, lunarLevel } = this.resolve(player);
140
+ if (env.selectedCrop === Crop.Moonflower) {
141
+ return { active: true, reason: 'Forced active by selected Moonflower.' };
142
+ }
143
+ if (env.selectedCrop === Crop.Sunflower) {
144
+ return {
145
+ active: false,
146
+ reason: 'Disabled by selected Sunflower (Firefly used instead).',
147
+ fortune: 5 * fireflyLevel,
148
+ };
149
+ }
150
+ if (fireflyLevel > lunarLevel) {
151
+ return {
152
+ active: false,
153
+ reason: 'Firefly shard is at a higher level, using it instead.',
154
+ fortune: 5 * fireflyLevel,
155
+ };
156
+ }
157
+ return { active: true, reason: 'Active during the night.' };
158
+ }
159
+ getEffects(player, env) {
160
+ const { lunarLevel } = this.resolve(player);
161
+ if (lunarLevel <= 0)
162
+ return [];
163
+ const state = this.getActive(player, env);
164
+ if (!state.active)
165
+ return [];
166
+ return [
167
+ { source: ATTRIBUTE_SHARDS_STAT_SOURCE, op: 'add-stat', stat: Stat.FarmingFortune, value: 5 * lunarLevel },
168
+ ];
169
+ }
170
+ }
171
+ /**
172
+ * Termite Shard - `+3` Farming Fortune per level while on an infested plot.
173
+ */
174
+ export class TermiteShard extends FortuneSource {
175
+ id = 'termite';
176
+ name = FARMING_ATTRIBUTE_SHARDS.infiltration?.name ?? 'Termite Shard';
177
+ getActive(player, env) {
178
+ const level = getShardLevel(Rarity.Uncommon, getAttributeAmount(player.options.attributes, 'infiltration'));
179
+ if (!env.infestedPlot) {
180
+ return {
181
+ active: false,
182
+ reason: 'Termite shard is only active on infested plots.',
183
+ fortune: 3 * level,
184
+ };
185
+ }
186
+ return { active: true, reason: 'Active on infested plots.' };
187
+ }
188
+ getEffects(player, env) {
189
+ if (!env.infestedPlot)
190
+ return [];
191
+ const level = getShardLevel(Rarity.Uncommon, getAttributeAmount(player.options.attributes, 'infiltration'));
192
+ if (level <= 0)
193
+ return [];
194
+ return [{ source: ATTRIBUTE_SHARDS_STAT_SOURCE, op: 'add-stat', stat: Stat.FarmingFortune, value: 3 * level }];
195
+ }
196
+ }
197
+ /**
198
+ * Galaxy Fish Shard - `+1` Farming/Mining/Foraging Fortune per level.
199
+ */
200
+ export class GalaxyFishShard extends FortuneSource {
201
+ id = 'galaxy_fish';
202
+ name = FARMING_ATTRIBUTE_SHARDS.ultimate_dna?.name ?? 'Galaxy Fish Shard';
203
+ getEffects(player, _env) {
204
+ const level = getShardLevel(Rarity.Legendary, getAttributeAmount(player.options.attributes, 'ultimate_dna'));
205
+ if (level <= 0)
206
+ return [];
207
+ const out = [
208
+ { source: ATTRIBUTE_SHARDS_STAT_SOURCE, op: 'add-stat', stat: Stat.FarmingFortune, value: 1 * level },
209
+ { source: ATTRIBUTE_SHARDS_STAT_SOURCE, op: 'add-stat', stat: Stat.MiningFortune, value: 1 * level },
210
+ { source: ATTRIBUTE_SHARDS_STAT_SOURCE, op: 'add-stat', stat: Stat.ForagingFortune, value: 1 * level },
211
+ ];
212
+ return out;
213
+ }
214
+ }
215
+ export class LadybugShard extends FortuneSource {
216
+ id = 'ladybug';
217
+ name = FARMING_ATTRIBUTE_SHARDS.pretty_clothes?.name ?? 'Ladybug Shard';
218
+ getEffects(_player, _env) {
219
+ return [];
220
+ }
221
+ }
222
+ export class InvisibugShard extends FortuneSource {
223
+ id = 'invisibug';
224
+ name = FARMING_ATTRIBUTE_SHARDS.fancy_visit?.name ?? 'Invisibug Shard';
225
+ getEffects(_player, _env) {
226
+ return [];
227
+ }
228
+ }
229
+ export class PrayingMantisShard extends FortuneSource {
230
+ id = 'praying_mantis';
231
+ name = FARMING_ATTRIBUTE_SHARDS.insect_power?.name ?? 'Praying Mantis Shard';
232
+ getEffects(_player, _env) {
233
+ return [];
234
+ }
235
+ }
236
+ export class PestShard extends FortuneSource {
237
+ id = 'pest';
238
+ name = FARMING_ATTRIBUTE_SHARDS.pest_luck?.name ?? 'Pest Shard';
239
+ getEffects(player, _env) {
240
+ const level = getShardLevel(Rarity.Uncommon, getAttributeAmount(player.options.attributes, 'pest_luck'));
241
+ if (level <= 0)
242
+ return [];
243
+ return [
244
+ {
245
+ source: this.name,
246
+ op: 'add-rare-pct',
247
+ value: level * 2,
248
+ scope: { tags: ['pest'] },
249
+ relatedStats: [Stat.Overbloom],
250
+ meta: {
251
+ description: 'Pest Overbloom',
252
+ valueDisplay: 'stat',
253
+ valueStat: Stat.Overbloom,
254
+ },
255
+ },
256
+ ];
257
+ }
258
+ }
259
+ export class MudwormShard extends FortuneSource {
260
+ id = 'mudworm';
261
+ name = FARMING_ATTRIBUTE_SHARDS.visitor_bait?.name ?? 'Mudworm Shard';
262
+ getEffects(_player, _env) {
263
+ return [];
264
+ }
265
+ }
266
+ /**
267
+ * Class registry of every farming attribute shard, keyed by the SkyBlock
268
+ * attribute key (matching `FARMING_ATTRIBUTE_SHARDS`). Use this to enumerate
269
+ * sources during effect collection.
270
+ */
271
+ export const FARMING_ATTRIBUTE_SHARD_CLASSES = {
272
+ wart_eater: new WartyBugShard(),
273
+ garden_wisdom: new DragonflyShard(),
274
+ solar_power: new FireflyShard(),
275
+ lunar_power: new LunarMothShard(),
276
+ pretty_clothes: new LadybugShard(),
277
+ crop_bug: new CropeetleShard(),
278
+ fancy_visit: new InvisibugShard(),
279
+ infiltration: new TermiteShard(),
280
+ insect_power: new PrayingMantisShard(),
281
+ pest_luck: new PestShard(),
282
+ visitor_bait: new MudwormShard(),
283
+ ultimate_dna: new GalaxyFishShard(),
284
+ };
285
+ //# sourceMappingURL=attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../../src/items/sources/attributes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Effect, EffectEnvironment } from '../../effects/types.js';
2
+ import type { FarmingPlayer } from '../../player/player.js';
3
+ /**
4
+ * Result of `getActive` - explains *why* a source is or isn't currently
5
+ * contributing. Used by progress/upgrade UI.
6
+ */
7
+ export interface FortuneSourceActiveState {
8
+ active: boolean;
9
+ reason?: string;
10
+ /**
11
+ * Optional preview fortune number to show when `active === false` (e.g. the
12
+ * fortune the source *would* contribute if it were active).
13
+ */
14
+ fortune?: number;
15
+ }
16
+ /**
17
+ * Base class for any object that can contribute Effects to a calculation.
18
+ *
19
+ * Subclass `getEffects(player, env)` returns the declarative list of effects
20
+ * this source emits in the given environment. The resolver pipeline takes care
21
+ * of scoping, ordering, and aggregation.
22
+ *
23
+ * `getActive` is optional - only override when a source has env-conditional
24
+ * activation (e.g. day/night shards, infested-plot shards).
25
+ */
26
+ export declare abstract class FortuneSource {
27
+ /** Stable id for the source, used as the default `Effect.source`. */
28
+ abstract readonly id: string;
29
+ /** Human-friendly name for breakdowns. */
30
+ abstract readonly name: string;
31
+ abstract getEffects(player: FarmingPlayer, env: EffectEnvironment): Effect[];
32
+ getActive?(player: FarmingPlayer, env: EffectEnvironment): FortuneSourceActiveState;
33
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Base class for any object that can contribute Effects to a calculation.
3
+ *
4
+ * Subclass `getEffects(player, env)` returns the declarative list of effects
5
+ * this source emits in the given environment. The resolver pipeline takes care
6
+ * of scoping, ordering, and aggregation.
7
+ *
8
+ * `getActive` is optional - only override when a source has env-conditional
9
+ * activation (e.g. day/night shards, infested-plot shards).
10
+ */
11
+ export class FortuneSource {
12
+ }
13
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/items/sources/base.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;GASG;AACH,MAAM,OAAgB,aAAa;CASlC"}
@@ -0,0 +1,54 @@
1
+ import { type GardenChipId } from '../../constants/chips.js';
2
+ import type { Effect, EffectEnvironment } from '../../effects/types.js';
3
+ import type { FarmingPlayer } from '../../player/player.js';
4
+ import { FortuneSource } from './base.js';
5
+ /**
6
+ * Generic chip source - turns the chip's `statsPerRarity` table into
7
+ * `add-stat` effects keyed by the chip's level-derived rarity.
8
+ *
9
+ * Skips `Stat.Overbloom` because Overbloom is a virtual stat in the new model,
10
+ * not an additive number; the dedicated {@link RarefinderChipSource} emits the
11
+ * correct `add-rare-pct` effect for that case.
12
+ *
13
+ * Hypercharge's `tempMultiplierPerLevel` and Mechamind/Synthesis's bespoke
14
+ * mechanics are NOT modeled here - they remain in the legacy temp-fortune /
15
+ * tool exp pipelines and are wired in at the calculator level.
16
+ */
17
+ export declare class GenericChipSource extends FortuneSource {
18
+ readonly id: string;
19
+ readonly name: string;
20
+ private readonly chipId;
21
+ constructor(chipId: GardenChipId);
22
+ getEffects(player: FarmingPlayer, _env: EffectEnvironment): Effect[];
23
+ }
24
+ /**
25
+ * Rarefinder Chip - global Overbloom contributor. The legacy implementation
26
+ * surfaces this as a flat `Stat.Overbloom` value (2/2.5/3 by rarity); in the
27
+ * effect model it becomes an `add-rare-pct` with a global Overbloom scope and
28
+ * `relatedStats: [Stat.Overbloom]`, which the resolver consumes both as a
29
+ * scalar contribution to the virtual Overbloom stat AND as an additive percent
30
+ * to the rare-drop pipeline.
31
+ */
32
+ export declare class RarefinderChipSource extends FortuneSource {
33
+ readonly id = "chip:rarefinder";
34
+ readonly name: string;
35
+ getEffects(player: FarmingPlayer, _env: EffectEnvironment): Effect[];
36
+ }
37
+ /**
38
+ * Class registry of every garden chip keyed by chip id. Hypercharge,
39
+ * Synthesis, Mechamind, Evergreen, Overdrive, Quickdraw have no stat or
40
+ * rare-pct contribution; they're either bespoke (temp-fortune multiplier,
41
+ * tool-exp multiplier) or progress-only and intentionally emit `[]`.
42
+ */
43
+ export declare const GARDEN_CHIP_CLASSES: {
44
+ readonly cropshot: GenericChipSource;
45
+ readonly vermin_vaporizer: GenericChipSource;
46
+ readonly synthesis: GenericChipSource;
47
+ readonly sowledge: GenericChipSource;
48
+ readonly mechamind: GenericChipSource;
49
+ readonly hypercharge: GenericChipSource;
50
+ readonly evergreen: GenericChipSource;
51
+ readonly overdrive: GenericChipSource;
52
+ readonly quickdraw: GenericChipSource;
53
+ readonly rarefinder: RarefinderChipSource;
54
+ };
@@ -0,0 +1,100 @@
1
+ import { GARDEN_CHIPS, getChipInputLevel, getChipLevel, getChipRarity, } from '../../constants/chips.js';
2
+ import { Stat } from '../../constants/stats.js';
3
+ import { FortuneSource } from './base.js';
4
+ /**
5
+ * Generic chip source - turns the chip's `statsPerRarity` table into
6
+ * `add-stat` effects keyed by the chip's level-derived rarity.
7
+ *
8
+ * Skips `Stat.Overbloom` because Overbloom is a virtual stat in the new model,
9
+ * not an additive number; the dedicated {@link RarefinderChipSource} emits the
10
+ * correct `add-rare-pct` effect for that case.
11
+ *
12
+ * Hypercharge's `tempMultiplierPerLevel` and Mechamind/Synthesis's bespoke
13
+ * mechanics are NOT modeled here - they remain in the legacy temp-fortune /
14
+ * tool exp pipelines and are wired in at the calculator level.
15
+ */
16
+ export class GenericChipSource extends FortuneSource {
17
+ id;
18
+ name;
19
+ chipId;
20
+ constructor(chipId) {
21
+ super();
22
+ this.chipId = chipId;
23
+ this.id = `chip:${chipId}`;
24
+ this.name = GARDEN_CHIPS[chipId].name;
25
+ }
26
+ getEffects(player, _env) {
27
+ const level = getChipInputLevel(player.options.chips, this.chipId);
28
+ const chipLevel = getChipLevel(level);
29
+ if (chipLevel <= 0)
30
+ return [];
31
+ const info = GARDEN_CHIPS[this.chipId];
32
+ const stats = info.statsPerRarity?.[getChipRarity(chipLevel)];
33
+ if (!stats)
34
+ return [];
35
+ const out = [];
36
+ for (const [statKey, value] of Object.entries(stats)) {
37
+ if (statKey === Stat.Overbloom)
38
+ continue;
39
+ if (!value)
40
+ continue;
41
+ out.push({ source: this.name, op: 'add-stat', stat: statKey, value: value * chipLevel });
42
+ }
43
+ return out;
44
+ }
45
+ }
46
+ /**
47
+ * Rarefinder Chip - global Overbloom contributor. The legacy implementation
48
+ * surfaces this as a flat `Stat.Overbloom` value (2/2.5/3 by rarity); in the
49
+ * effect model it becomes an `add-rare-pct` with a global Overbloom scope and
50
+ * `relatedStats: [Stat.Overbloom]`, which the resolver consumes both as a
51
+ * scalar contribution to the virtual Overbloom stat AND as an additive percent
52
+ * to the rare-drop pipeline.
53
+ */
54
+ export class RarefinderChipSource extends FortuneSource {
55
+ id = 'chip:rarefinder';
56
+ name = GARDEN_CHIPS.rarefinder.name;
57
+ getEffects(player, _env) {
58
+ const level = getChipInputLevel(player.options.chips, 'rarefinder');
59
+ const chipLevel = getChipLevel(level);
60
+ if (chipLevel <= 0)
61
+ return [];
62
+ const stats = GARDEN_CHIPS.rarefinder.statsPerRarity?.[getChipRarity(chipLevel)];
63
+ const value = stats?.[Stat.Overbloom];
64
+ if (!value)
65
+ return [];
66
+ return [
67
+ {
68
+ source: this.name,
69
+ op: 'add-rare-pct',
70
+ value: value * chipLevel,
71
+ scope: { tags: ['overbloom'] },
72
+ relatedStats: [Stat.Overbloom],
73
+ meta: {
74
+ description: 'Normal Overbloom',
75
+ valueDisplay: 'stat',
76
+ valueStat: Stat.Overbloom,
77
+ },
78
+ },
79
+ ];
80
+ }
81
+ }
82
+ /**
83
+ * Class registry of every garden chip keyed by chip id. Hypercharge,
84
+ * Synthesis, Mechamind, Evergreen, Overdrive, Quickdraw have no stat or
85
+ * rare-pct contribution; they're either bespoke (temp-fortune multiplier,
86
+ * tool-exp multiplier) or progress-only and intentionally emit `[]`.
87
+ */
88
+ export const GARDEN_CHIP_CLASSES = {
89
+ cropshot: new GenericChipSource('cropshot'),
90
+ vermin_vaporizer: new GenericChipSource('vermin_vaporizer'),
91
+ synthesis: new GenericChipSource('synthesis'),
92
+ sowledge: new GenericChipSource('sowledge'),
93
+ mechamind: new GenericChipSource('mechamind'),
94
+ hypercharge: new GenericChipSource('hypercharge'),
95
+ evergreen: new GenericChipSource('evergreen'),
96
+ overdrive: new GenericChipSource('overdrive'),
97
+ quickdraw: new GenericChipSource('quickdraw'),
98
+ rarefinder: new RarefinderChipSource(),
99
+ };
100
+ //# sourceMappingURL=chips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chips.js","sourceRoot":"","sources":["../../../src/items/sources/chips.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Stat } from '../../constants/stats.js';
2
+ import type { Effect } from '../../effects/types.js';
3
+ /**
4
+ * Convert a `Partial<Record<Stat, number>>` to an `Effect[]`. Each non-zero
5
+ * stat becomes an `add-stat` effect, except `Stat.Overbloom` which is rerouted
6
+ * to a global `add-rare-pct` effect with `relatedStats: [Stat.Overbloom]` so
7
+ * the resolver picks it up both as a virtual-stat contribution and as an
8
+ * additive percent on overbloom-tagged drops.
9
+ */
10
+ export declare function statsToEffects(stats: Partial<Record<Stat, number>> | undefined, source: string): Effect[];