farming-weight 0.14.3 → 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 (280) hide show
  1. package/README.md +45 -18
  2. package/dist/constants/attributes.d.ts +12 -7
  3. package/dist/constants/attributes.js +5 -27
  4. package/dist/constants/attributes.js.map +1 -1
  5. package/dist/constants/chips.d.ts +0 -5
  6. package/dist/constants/chips.js +10 -14
  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 +99 -50
  13. package/dist/constants/enchants.js.map +1 -1
  14. package/dist/constants/garden.js +15 -0
  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/stats.d.ts +1 -0
  26. package/dist/constants/stats.js +2 -0
  27. package/dist/constants/stats.js.map +1 -1
  28. package/dist/constants/tempfortune.d.ts +5 -0
  29. package/dist/constants/tempfortune.js +29 -0
  30. package/dist/constants/tempfortune.js.map +1 -1
  31. package/dist/constants/upgrades.d.ts +36 -3
  32. package/dist/constants/upgrades.js +12 -0
  33. package/dist/constants/upgrades.js.map +1 -1
  34. package/dist/crops/special.d.ts +1 -1
  35. package/dist/crops/special.js.map +1 -1
  36. package/dist/effects/environment.d.ts +12 -0
  37. package/dist/effects/environment.js +33 -0
  38. package/dist/effects/environment.js.map +1 -0
  39. package/dist/effects/index.d.ts +4 -0
  40. package/dist/effects/index.js +5 -0
  41. package/dist/effects/index.js.map +1 -0
  42. package/dist/effects/matcher.d.ts +23 -0
  43. package/dist/effects/matcher.js +108 -0
  44. package/dist/effects/matcher.js.map +1 -0
  45. package/dist/effects/resolver.d.ts +63 -0
  46. package/dist/effects/resolver.js +239 -0
  47. package/dist/effects/resolver.js.map +1 -0
  48. package/dist/effects/summary.d.ts +5 -0
  49. package/dist/effects/summary.js +21 -0
  50. package/dist/effects/summary.js.map +1 -0
  51. package/dist/effects/types.d.ts +147 -0
  52. package/dist/effects/types.js +9 -0
  53. package/dist/effects/types.js.map +1 -0
  54. package/dist/fortune/farmingaccessory.d.ts +9 -1
  55. package/dist/fortune/farmingaccessory.js +24 -13
  56. package/dist/fortune/farmingaccessory.js.map +1 -1
  57. package/dist/fortune/farmingarmor.d.ts +21 -10
  58. package/dist/fortune/farmingarmor.js +89 -29
  59. package/dist/fortune/farmingarmor.js.map +1 -1
  60. package/dist/fortune/farmingequipment.d.ts +10 -1
  61. package/dist/fortune/farmingequipment.js +44 -11
  62. package/dist/fortune/farmingequipment.js.map +1 -1
  63. package/dist/fortune/farmingpet.d.ts +16 -0
  64. package/dist/fortune/farmingpet.js +207 -0
  65. package/dist/fortune/farmingpet.js.map +1 -1
  66. package/dist/fortune/farmingtool.d.ts +13 -6
  67. package/dist/fortune/farmingtool.js +60 -44
  68. package/dist/fortune/farmingtool.js.map +1 -1
  69. package/dist/fortune/lotuspiecebonus.d.ts +6 -0
  70. package/dist/fortune/lotuspiecebonus.js +20 -0
  71. package/dist/fortune/lotuspiecebonus.js.map +1 -0
  72. package/dist/fortune/upgradeable.d.ts +2 -4
  73. package/dist/fortune/upgradeablebase.d.ts +2 -4
  74. package/dist/fortune/upgradeablebase.js +4 -10
  75. package/dist/fortune/upgradeablebase.js.map +1 -1
  76. package/dist/index.d.ts +4 -0
  77. package/dist/index.js +4 -0
  78. package/dist/index.js.map +1 -1
  79. package/dist/items/accessories/base.d.ts +3 -0
  80. package/dist/items/accessories/base.js +4 -0
  81. package/dist/items/accessories/base.js.map +1 -0
  82. package/dist/items/accessories/fermento-family.d.ts +91 -0
  83. package/dist/items/accessories/fermento-family.js +125 -0
  84. package/dist/items/accessories/fermento-family.js.map +1 -0
  85. package/dist/items/accessories/freshly-baked.d.ts +80 -0
  86. package/dist/items/accessories/freshly-baked.js +119 -0
  87. package/dist/items/accessories/freshly-baked.js.map +1 -0
  88. package/dist/items/accessories/index.d.ts +25 -0
  89. package/dist/items/accessories/index.js +25 -0
  90. package/dist/items/accessories/index.js.map +1 -0
  91. package/dist/items/accessories/power-relic.d.ts +18 -0
  92. package/dist/items/accessories/power-relic.js +37 -0
  93. package/dist/items/accessories/power-relic.js.map +1 -0
  94. package/dist/items/accessories/special.d.ts +24 -0
  95. package/dist/items/accessories/special.js +41 -0
  96. package/dist/items/accessories/special.js.map +1 -0
  97. package/dist/items/accessories.d.ts +2 -3
  98. package/dist/items/accessories.js +1 -137
  99. package/dist/items/accessories.js.map +1 -1
  100. package/dist/items/armor/cropie.d.ts +4 -0
  101. package/dist/items/armor/cropie.js +6 -0
  102. package/dist/items/armor/cropie.js.map +1 -1
  103. package/dist/items/armor/fermento.d.ts +4 -0
  104. package/dist/items/armor/fermento.js +6 -0
  105. package/dist/items/armor/fermento.js.map +1 -1
  106. package/dist/items/armor/groups.d.ts +2 -0
  107. package/dist/items/armor/groups.js +17 -0
  108. package/dist/items/armor/groups.js.map +1 -0
  109. package/dist/items/armor/melon.d.ts +4 -0
  110. package/dist/items/armor/melon.js +6 -0
  111. package/dist/items/armor/melon.js.map +1 -1
  112. package/dist/items/armor/special.js +1 -1
  113. package/dist/items/armor/special.js.map +1 -1
  114. package/dist/items/armor/squash.d.ts +4 -0
  115. package/dist/items/armor/squash.js +6 -0
  116. package/dist/items/armor/squash.js.map +1 -1
  117. package/dist/items/gems/base.d.ts +19 -0
  118. package/dist/items/gems/base.js +60 -0
  119. package/dist/items/gems/base.js.map +1 -0
  120. package/dist/items/gems/index.d.ts +1 -0
  121. package/dist/items/gems/index.js +2 -0
  122. package/dist/items/gems/index.js.map +1 -0
  123. package/dist/items/pets/bee.d.ts +9 -0
  124. package/dist/items/pets/bee.js +32 -0
  125. package/dist/items/pets/bee.js.map +1 -1
  126. package/dist/items/pets/hedgehog.d.ts +5 -0
  127. package/dist/items/pets/hedgehog.js +5 -0
  128. package/dist/items/pets/hedgehog.js.map +1 -1
  129. package/dist/items/pets/pig.d.ts +5 -0
  130. package/dist/items/pets/pig.js +18 -13
  131. package/dist/items/pets/pig.js.map +1 -1
  132. package/dist/items/pets/rose-dragon.js +11 -13
  133. package/dist/items/pets/rose-dragon.js.map +1 -1
  134. package/dist/items/pets.d.ts +1 -1
  135. package/dist/items/pets.js +15 -1
  136. package/dist/items/pets.js.map +1 -1
  137. package/dist/items/reforges/base.d.ts +18 -0
  138. package/dist/items/reforges/base.js +54 -0
  139. package/dist/items/reforges/base.js.map +1 -0
  140. package/dist/items/reforges/blessed.d.ts +7 -0
  141. package/dist/items/reforges/blessed.js +90 -0
  142. package/dist/items/reforges/blessed.js.map +1 -0
  143. package/dist/items/reforges/blooming.d.ts +4 -0
  144. package/dist/items/reforges/blooming.js +43 -0
  145. package/dist/items/reforges/blooming.js.map +1 -0
  146. package/dist/items/reforges/bountiful.d.ts +4 -0
  147. package/dist/items/reforges/bountiful.js +63 -0
  148. package/dist/items/reforges/bountiful.js.map +1 -0
  149. package/dist/items/reforges/bustling.d.ts +4 -0
  150. package/dist/items/reforges/bustling.js +26 -0
  151. package/dist/items/reforges/bustling.js.map +1 -0
  152. package/dist/items/reforges/deep-fried.d.ts +7 -0
  153. package/dist/items/reforges/deep-fried.js +38 -0
  154. package/dist/items/reforges/deep-fried.js.map +1 -0
  155. package/dist/items/reforges/earthy.d.ts +4 -0
  156. package/dist/items/reforges/earthy.js +26 -0
  157. package/dist/items/reforges/earthy.js.map +1 -0
  158. package/dist/items/reforges/green-thumb.d.ts +4 -0
  159. package/dist/items/reforges/green-thumb.js +43 -0
  160. package/dist/items/reforges/green-thumb.js.map +1 -0
  161. package/dist/items/reforges/index.d.ts +16 -0
  162. package/dist/items/reforges/index.js +43 -0
  163. package/dist/items/reforges/index.js.map +1 -0
  164. package/dist/items/reforges/mantid.d.ts +4 -0
  165. package/dist/items/reforges/mantid.js +43 -0
  166. package/dist/items/reforges/mantid.js.map +1 -0
  167. package/dist/items/reforges/mossy.d.ts +4 -0
  168. package/dist/items/reforges/mossy.js +44 -0
  169. package/dist/items/reforges/mossy.js.map +1 -0
  170. package/dist/items/reforges/overpriced.d.ts +4 -0
  171. package/dist/items/reforges/overpriced.js +43 -0
  172. package/dist/items/reforges/overpriced.js.map +1 -0
  173. package/dist/items/reforges/robust.d.ts +4 -0
  174. package/dist/items/reforges/robust.js +22 -0
  175. package/dist/items/reforges/robust.js.map +1 -0
  176. package/dist/items/reforges/rooted.d.ts +4 -0
  177. package/dist/items/reforges/rooted.js +43 -0
  178. package/dist/items/reforges/rooted.js.map +1 -0
  179. package/dist/items/reforges/squeaky.d.ts +4 -0
  180. package/dist/items/reforges/squeaky.js +47 -0
  181. package/dist/items/reforges/squeaky.js.map +1 -0
  182. package/dist/items/sources/attributes.d.ts +119 -0
  183. package/dist/items/sources/attributes.js +285 -0
  184. package/dist/items/sources/attributes.js.map +1 -0
  185. package/dist/items/sources/base.d.ts +33 -0
  186. package/dist/items/sources/base.js +13 -0
  187. package/dist/items/sources/base.js.map +1 -0
  188. package/dist/items/sources/chips.d.ts +54 -0
  189. package/dist/items/sources/chips.js +100 -0
  190. package/dist/items/sources/chips.js.map +1 -0
  191. package/dist/items/sources/effects-util.d.ts +10 -0
  192. package/dist/items/sources/effects-util.js +35 -0
  193. package/dist/items/sources/effects-util.js.map +1 -0
  194. package/dist/items/sources/enchants.d.ts +28 -0
  195. package/dist/items/sources/enchants.js +87 -0
  196. package/dist/items/sources/enchants.js.map +1 -0
  197. package/dist/items/sources/gems.d.ts +9 -0
  198. package/dist/items/sources/gems.js +35 -0
  199. package/dist/items/sources/gems.js.map +1 -0
  200. package/dist/items/sources/index.d.ts +6 -0
  201. package/dist/items/sources/index.js +7 -0
  202. package/dist/items/sources/index.js.map +1 -0
  203. package/dist/items/sources/reforges.d.ts +8 -0
  204. package/dist/items/sources/reforges.js +10 -0
  205. package/dist/items/sources/reforges.js.map +1 -0
  206. package/dist/items/tools/cactus-knife.js +3 -3
  207. package/dist/items/tools/cactus-knife.js.map +1 -1
  208. package/dist/items/tools/cocoa-chopper.js +3 -3
  209. package/dist/items/tools/cocoa-chopper.js.map +1 -1
  210. package/dist/items/tools/fungi-cutter.js +3 -3
  211. package/dist/items/tools/fungi-cutter.js.map +1 -1
  212. package/dist/items/tools/mathematical-hoes.d.ts +5 -5
  213. package/dist/items/tools/mathematical-hoes.js +5 -5
  214. package/dist/items/tools/mathematical-hoes.js.map +1 -1
  215. package/dist/items/tools/special.js +1 -1
  216. package/dist/items/tools/special.js.map +1 -1
  217. package/dist/items/types/pets.d.ts +0 -2
  218. package/dist/player/player.d.ts +60 -7
  219. package/dist/player/player.js +318 -128
  220. package/dist/player/player.js.map +1 -1
  221. package/dist/player/playeroptions.d.ts +25 -1
  222. package/dist/player/playeroptions.js.map +1 -1
  223. package/dist/upgrades/enchantupgrades.js +22 -8
  224. package/dist/upgrades/enchantupgrades.js.map +1 -1
  225. package/dist/upgrades/getsourceprogress.js +7 -0
  226. package/dist/upgrades/getsourceprogress.js.map +1 -1
  227. package/dist/upgrades/groups.d.ts +3 -0
  228. package/dist/upgrades/groups.js +86 -0
  229. package/dist/upgrades/groups.js.map +1 -0
  230. package/dist/upgrades/itemcatalog.d.ts +3 -0
  231. package/dist/upgrades/itemcatalog.js +21 -0
  232. package/dist/upgrades/itemcatalog.js.map +1 -0
  233. package/dist/upgrades/itemregistry.d.ts +1 -2
  234. package/dist/upgrades/itemregistry.js +23 -3
  235. package/dist/upgrades/itemregistry.js.map +1 -1
  236. package/dist/upgrades/sources/armorsetsources.js +14 -14
  237. package/dist/upgrades/sources/armorsetsources.js.map +1 -1
  238. package/dist/upgrades/sources/cropsources.js +5 -0
  239. package/dist/upgrades/sources/cropsources.js.map +1 -1
  240. package/dist/upgrades/sources/dynamicfortunesources.d.ts +5 -2
  241. package/dist/upgrades/sources/effectsources.d.ts +4 -0
  242. package/dist/upgrades/sources/effectsources.js +60 -0
  243. package/dist/upgrades/sources/effectsources.js.map +1 -0
  244. package/dist/upgrades/sources/gearsources.js +32 -7
  245. package/dist/upgrades/sources/gearsources.js.map +1 -1
  246. package/dist/upgrades/sources/generalsources.d.ts +3 -2
  247. package/dist/upgrades/sources/generalsources.js +308 -17
  248. package/dist/upgrades/sources/generalsources.js.map +1 -1
  249. package/dist/upgrades/sources/toolsources.js +61 -81
  250. package/dist/upgrades/sources/toolsources.js.map +1 -1
  251. package/dist/upgrades/upgradekeys.d.ts +2 -0
  252. package/dist/upgrades/upgradekeys.js +5 -0
  253. package/dist/upgrades/upgradekeys.js.map +1 -0
  254. package/dist/upgrades/upgrades.d.ts +5 -7
  255. package/dist/upgrades/upgrades.js +142 -43
  256. package/dist/upgrades/upgrades.js.map +1 -1
  257. package/dist/upgrades/upgradeutils.d.ts +2 -4
  258. package/dist/upgrades/upgradeutils.js +26 -6
  259. package/dist/upgrades/upgradeutils.js.map +1 -1
  260. package/dist/util/bestiary.d.ts +10 -0
  261. package/dist/util/bestiary.js +41 -0
  262. package/dist/util/bestiary.js.map +1 -0
  263. package/dist/util/enchants.d.ts +6 -0
  264. package/dist/util/enchants.js +20 -5
  265. package/dist/util/enchants.js.map +1 -1
  266. package/dist/util/gems.js +4 -30
  267. package/dist/util/gems.js.map +1 -1
  268. package/dist/util/itemstats.d.ts +3 -0
  269. package/dist/util/itemstats.js +20 -2
  270. package/dist/util/itemstats.js.map +1 -1
  271. package/dist/util/ratecalc-effects.d.ts +64 -0
  272. package/dist/util/ratecalc-effects.js +252 -0
  273. package/dist/util/ratecalc-effects.js.map +1 -0
  274. package/dist/util/ratecalc.d.ts +0 -33
  275. package/dist/util/ratecalc.js +0 -187
  276. package/dist/util/ratecalc.js.map +1 -1
  277. package/dist/util/skyblocktime.d.ts +1 -0
  278. package/dist/util/skyblocktime.js +4 -0
  279. package/dist/util/skyblocktime.js.map +1 -1
  280. package/package.json +2 -1
@@ -0,0 +1,239 @@
1
+ import { isGlobalOverbloomScope, matchesScopeForDrop, matchesScopeForStat } from './matcher.js';
2
+ import { DEFAULT_PHASE_FOR_OP, } from './types.js';
3
+ /** Resolve an effect's phase, defaulting from its op when omitted. */
4
+ export function effectPhase(effect) {
5
+ return effect.phase ?? DEFAULT_PHASE_FOR_OP[effect.op];
6
+ }
7
+ /** Resolve the numeric `value` of an effect at a given context. */
8
+ function resolveValue(effect, ctx) {
9
+ const { value } = effect;
10
+ if (typeof value === 'function')
11
+ return value(ctx);
12
+ return typeof value === 'number' ? value : 0;
13
+ }
14
+ /**
15
+ * Throw if a multiplicative effect carries an invalid value. Catches the
16
+ * Cropeetle/Deep-Fried delta-vs-factor mismatch class of bugs at the source.
17
+ */
18
+ export function assertValidEffect(effect) {
19
+ if (effect.op === 'mul-rare' || effect.op === 'mul-drop') {
20
+ const v = effect.value;
21
+ const numeric = typeof v === 'number' ? v : null;
22
+ if (numeric !== null && numeric < 0) {
23
+ throw new Error(`Invalid ${effect.op} effect from "${effect.source}": value must be >= 0 (got ${numeric}). ` +
24
+ 'Multiplicative ops carry a factor (1.2 = x1.2), not a delta.');
25
+ }
26
+ }
27
+ if (effect.op === 'add-stat' && !effect.stat) {
28
+ throw new Error(`Invalid add-stat effect from "${effect.source}": missing 'stat' field.`);
29
+ }
30
+ if (effect.op === 'add-drop' && !effect.drop) {
31
+ throw new Error(`Invalid add-drop effect from "${effect.source}": missing 'drop' field.`);
32
+ }
33
+ }
34
+ /**
35
+ * Sum `add-stat` effects matching a stat query and a `StatContext`.
36
+ *
37
+ * Drop-only scoped effects are rejected by the matcher.
38
+ */
39
+ export function resolveStatTotal(effects, stat, ctx) {
40
+ let total = 0;
41
+ for (const effect of effects) {
42
+ if (effect.op !== 'add-stat')
43
+ continue;
44
+ if (effect.stat !== stat)
45
+ continue;
46
+ if (!matchesScopeForStat(effect.scope, ctx))
47
+ continue;
48
+ total += resolveValue(effect, ctx);
49
+ }
50
+ return total;
51
+ }
52
+ /**
53
+ * Per-stat breakdown of `add-stat` contributions matching a `StatContext`.
54
+ * Returns `{ source: amount }` aggregated by source name.
55
+ */
56
+ export function resolveStatBreakdown(effects, stat, ctx) {
57
+ const out = {};
58
+ for (const effect of effects) {
59
+ if (effect.op !== 'add-stat')
60
+ continue;
61
+ if (effect.stat !== stat)
62
+ continue;
63
+ if (!matchesScopeForStat(effect.scope, ctx))
64
+ continue;
65
+ const v = resolveValue(effect, ctx);
66
+ if (!v)
67
+ continue;
68
+ out[effect.source] = (out[effect.source] ?? 0) + v;
69
+ }
70
+ return out;
71
+ }
72
+ /**
73
+ * Compute the virtual scalar for `Stat.Overbloom`.
74
+ *
75
+ * Sums `value` from `add-rare-pct` effects whose `relatedStats` includes
76
+ * `Stat.Overbloom` and whose scope is global Overbloom-shaped. Scoped Overbloom-
77
+ * flavored effects are excluded by design - see the architecture plan.
78
+ */
79
+ export function resolveOverbloomScalar(effects, ctx, overbloomStat) {
80
+ let total = 0;
81
+ for (const effect of effects) {
82
+ if (effect.op !== 'add-rare-pct')
83
+ continue;
84
+ if (!effect.relatedStats?.includes(overbloomStat))
85
+ continue;
86
+ if (!isGlobalOverbloomScope(effect.scope))
87
+ continue;
88
+ // Env-level requirements still apply to the scalar (e.g. Harvest Feast-only flat Overbloom would only
89
+ // contribute when the feast is active). `requiresInSeason` requires a crop in the StatContext.
90
+ if (effect.scope?.requiresHarvestFeast && !ctx.env.harvestFeast)
91
+ continue;
92
+ if (effect.scope?.requiresInSeason && (!ctx.crop || !ctx.env.inSeason))
93
+ continue;
94
+ total += resolveValue(effect, ctx);
95
+ }
96
+ return total;
97
+ }
98
+ /**
99
+ * Per-source breakdown of the global Overbloom scalar.
100
+ */
101
+ export function resolveOverbloomBreakdown(effects, ctx, overbloomStat) {
102
+ const out = {};
103
+ for (const effect of effects) {
104
+ if (effect.op !== 'add-rare-pct')
105
+ continue;
106
+ if (!effect.relatedStats?.includes(overbloomStat))
107
+ continue;
108
+ if (!isGlobalOverbloomScope(effect.scope))
109
+ continue;
110
+ if (effect.scope?.requiresHarvestFeast && !ctx.env.harvestFeast)
111
+ continue;
112
+ if (effect.scope?.requiresInSeason && (!ctx.crop || !ctx.env.inSeason))
113
+ continue;
114
+ const v = resolveValue(effect, ctx);
115
+ if (!v)
116
+ continue;
117
+ out[effect.source] = (out[effect.source] ?? 0) + v;
118
+ }
119
+ return out;
120
+ }
121
+ /**
122
+ * Collect drops emitted by `add-drop` effects whose env-level scope matches.
123
+ *
124
+ * Real per-drop scope filtering (tags, items, etc.) happens later when the
125
+ * calculator builds a `DropContext` for each candidate.
126
+ */
127
+ export function produceAddedDrops(effects, env) {
128
+ const out = [];
129
+ for (const effect of effects) {
130
+ if (effect.op !== 'add-drop')
131
+ continue;
132
+ if (!effect.drop)
133
+ continue;
134
+ const scope = effect.scope;
135
+ if (scope) {
136
+ if (scope.crops) {
137
+ if (!env.crop)
138
+ continue;
139
+ if (!scope.crops.includes(env.crop))
140
+ continue;
141
+ }
142
+ if (scope.requiresHarvestFeast && !env.harvestFeast)
143
+ continue;
144
+ if (scope.requiresInSeason && !env.inSeason)
145
+ continue;
146
+ }
147
+ out.push({ source: effect.source, payload: effect.drop });
148
+ }
149
+ return out;
150
+ }
151
+ /**
152
+ * Resolve `add-rare-pct`, `mul-rare`, and `mul-drop` effects for a single drop.
153
+ *
154
+ * The calculator is expected to combine the parts as:
155
+ * `final = base * (1 + addRarePct/100) * mulRare * mulDrop`
156
+ *
157
+ * `applied` records every effect that touched this drop, with phase and
158
+ * resolved amount, for breakdown UIs.
159
+ */
160
+ export function resolveDropEffects(effects, ctx) {
161
+ let addRarePct = 0;
162
+ let mulRare = 1;
163
+ let mulDrop = 1;
164
+ const applied = [];
165
+ // Phase: add-rare
166
+ for (const effect of effects) {
167
+ if (effect.op !== 'add-rare-pct')
168
+ continue;
169
+ if (!matchesScopeForDrop(effect.scope, ctx))
170
+ continue;
171
+ const v = resolveValue(effect, ctx);
172
+ if (!v)
173
+ continue;
174
+ addRarePct += v;
175
+ applied.push({
176
+ source: effect.source,
177
+ op: effect.op,
178
+ phase: 'add-rare',
179
+ amount: v,
180
+ relatedStats: effect.relatedStats,
181
+ scope: effect.scope,
182
+ description: effect.meta?.description,
183
+ valueDisplay: effect.meta?.valueDisplay,
184
+ valueStat: effect.meta?.valueStat,
185
+ });
186
+ }
187
+ // Phase: mul-rare
188
+ for (const effect of effects) {
189
+ if (effect.op !== 'mul-rare')
190
+ continue;
191
+ if (!matchesScopeForDrop(effect.scope, ctx))
192
+ continue;
193
+ const v = resolveValue(effect, ctx);
194
+ if (v < 0) {
195
+ throw new Error(`Invalid mul-rare value ${v} from "${effect.source}" (must be >= 0; factor semantics).`);
196
+ }
197
+ if (v === 1)
198
+ continue;
199
+ mulRare *= v;
200
+ applied.push({
201
+ source: effect.source,
202
+ op: effect.op,
203
+ phase: 'mul-rare',
204
+ amount: v,
205
+ relatedStats: effect.relatedStats,
206
+ scope: effect.scope,
207
+ description: effect.meta?.description,
208
+ valueDisplay: effect.meta?.valueDisplay,
209
+ valueStat: effect.meta?.valueStat,
210
+ });
211
+ }
212
+ // Phase: mul-drop
213
+ for (const effect of effects) {
214
+ if (effect.op !== 'mul-drop')
215
+ continue;
216
+ if (!matchesScopeForDrop(effect.scope, ctx))
217
+ continue;
218
+ const v = resolveValue(effect, ctx);
219
+ if (v < 0) {
220
+ throw new Error(`Invalid mul-drop value ${v} from "${effect.source}" (must be >= 0; factor semantics).`);
221
+ }
222
+ if (v === 1)
223
+ continue;
224
+ mulDrop *= v;
225
+ applied.push({
226
+ source: effect.source,
227
+ op: effect.op,
228
+ phase: 'mul-drop',
229
+ amount: v,
230
+ relatedStats: effect.relatedStats,
231
+ scope: effect.scope,
232
+ description: effect.meta?.description,
233
+ valueDisplay: effect.meta?.valueDisplay,
234
+ valueStat: effect.meta?.valueStat,
235
+ });
236
+ }
237
+ return { addRarePct, mulRare, mulDrop, applied };
238
+ }
239
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/effects/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Stat } from '../constants/stats.js';
2
+ import type { EffectSummary } from '../constants/upgrades.js';
3
+ import type { Effect } from './types.js';
4
+ export declare function effectToSummary(effect: Effect): EffectSummary | undefined;
5
+ export declare function effectsToSummaries(effects: readonly Effect[], stats?: readonly Stat[]): EffectSummary[];
@@ -0,0 +1,21 @@
1
+ export function effectToSummary(effect) {
2
+ if (!effect.relatedStats || effect.relatedStats.length === 0)
3
+ return undefined;
4
+ return {
5
+ source: effect.source,
6
+ op: effect.op,
7
+ description: effect.meta?.description,
8
+ relatedStats: effect.relatedStats,
9
+ scope: effect.scope,
10
+ value: typeof effect.value === 'number' ? effect.value : undefined,
11
+ valueDisplay: effect.meta?.valueDisplay,
12
+ valueStat: effect.meta?.valueStat,
13
+ };
14
+ }
15
+ export function effectsToSummaries(effects, stats) {
16
+ const summaries = effects.map(effectToSummary).filter((summary) => summary !== undefined);
17
+ if (!stats || stats.length === 0)
18
+ return summaries;
19
+ return summaries.filter((summary) => summary.relatedStats?.some((stat) => stats.includes(stat)));
20
+ }
21
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/effects/summary.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC7C,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/E,OAAO;QACN,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW;QACrC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAClE,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY;QACvC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS;KACjC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA0B,EAAE,KAAuB;IACrF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IAC1F,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClG,CAAC"}
@@ -0,0 +1,147 @@
1
+ import type { Crop } from '../constants/crops.js';
2
+ import type { SpecialCrop } from '../constants/specialcrops.js';
3
+ import type { Stat } from '../constants/stats.js';
4
+ /**
5
+ * Built-in well-known drop tags. Sources can use any string, but built-ins are
6
+ * the auditable set used by the package's own drop entries and effects.
7
+ *
8
+ * - `overbloom`: drop is buffed by Overbloom-class effects (`add-rare-pct` + `mul-rare`).
9
+ * - `rare-crop`: drop is part of the SkyBlock "Rare Crop" pool conceptually.
10
+ * - `special-crop`: drop is a Special Crop (Cropie/Squash/Fermento/Helianthus).
11
+ * - `seasoning`: Harvest Feast Seasoning category.
12
+ * - `feast`: any Harvest Feast drop (seasoning + per-crop materials).
13
+ * - `pest`: drop comes from a pest, not a regular crop break.
14
+ */
15
+ export type DropTagBuiltin = 'overbloom' | 'rare-crop' | 'special-crop' | 'seasoning' | 'feast' | 'pest';
16
+ export type DropTag = DropTagBuiltin | (string & {});
17
+ /**
18
+ * Minimal player/world environment data needed to collect effects. Constructed
19
+ * exclusively by `buildEffectEnvironment(player, crop?)`.
20
+ */
21
+ export interface EffectEnvironment {
22
+ /** Active crop for the rate calc, if any. `undefined` for crop-agnostic stat queries. */
23
+ crop?: Crop;
24
+ /** Harvest Feast active in the world. */
25
+ harvestFeast: boolean;
26
+ /** True only when `crop` is provided AND it is in-season under an active Harvest Feast. */
27
+ inSeason: boolean;
28
+ /** Player is currently on an infested plot (probability > 0). */
29
+ infestedPlot: boolean;
30
+ /** Selected crop from the player's options (used by some shards' force-active rules). */
31
+ selectedCrop?: Crop;
32
+ }
33
+ /**
34
+ * Drop kinds carried on every candidate drop. Used by `Scope.dropKinds` and
35
+ * for resolver phase routing.
36
+ */
37
+ export type DropKind = 'rare' | 'rng' | 'special-crop' | 'pest' | 'crop';
38
+ /**
39
+ * Per-drop context built by the resolver during `produce-drops`/`add-rare`/etc.
40
+ * Sources never construct one of these directly.
41
+ */
42
+ export interface DropContext {
43
+ env: EffectEnvironment;
44
+ crop: Crop;
45
+ dropKind: DropKind;
46
+ /** Item id of the drop being evaluated, e.g. `'CROPIE'`, `'SEASONING'`, `'WARTY'`. */
47
+ itemId: string;
48
+ specialCropType?: SpecialCrop;
49
+ tags: ReadonlySet<DropTag>;
50
+ /** True iff this drop was produced by an `add-drop` effect this run. */
51
+ fromAddDrop?: boolean;
52
+ }
53
+ /**
54
+ * Context for stat-shaped queries (`getStat`). Carries no drop fields by design.
55
+ * The stat matcher rejects any scope that uses drop-only fields.
56
+ */
57
+ export interface StatContext {
58
+ env: EffectEnvironment;
59
+ /** Optional crop scoping for crop-specific fortunes. */
60
+ crop?: Crop;
61
+ }
62
+ /**
63
+ * Declarative scope for an effect. Empty scope = global match.
64
+ *
65
+ * Drop-only fields (`items`, `dropKinds`, `specialCropTypes`, `tags`, `match`)
66
+ * cause the stat matcher to reject the effect outright.
67
+ */
68
+ export interface Scope {
69
+ crops?: readonly Crop[];
70
+ dropKinds?: readonly DropKind[];
71
+ items?: readonly string[];
72
+ specialCropTypes?: readonly SpecialCrop[];
73
+ /** Match if every listed tag is present on the drop. */
74
+ tags?: readonly DropTag[];
75
+ /** Effect only applies when a Harvest Feast is active in the env. */
76
+ requiresHarvestFeast?: boolean;
77
+ /** Effect only applies when the drop's crop is in-season. */
78
+ requiresInSeason?: boolean;
79
+ /**
80
+ * If `false`, the effect won't match drops produced by an `add-drop` effect.
81
+ * Default `true`.
82
+ */
83
+ appliesToAddedDrops?: boolean;
84
+ /** Predicate escape hatch. Drop-only; never invoked during stat resolution. */
85
+ match?: (ctx: DropContext) => boolean;
86
+ }
87
+ export type EffectOp = 'add-stat' | 'add-rare-pct' | 'mul-rare' | 'add-drop' | 'mul-drop';
88
+ export type EffectPhase = 'scalar' | 'produce-drops' | 'add-rare' | 'mul-rare' | 'mul-drop';
89
+ /** Default phase for each op. Effects rarely override. */
90
+ export declare const DEFAULT_PHASE_FOR_OP: Record<EffectOp, EffectPhase>;
91
+ export interface EffectAddDropPayload {
92
+ itemId: string;
93
+ /** Output bucket for the produced drop. Defaults to `rng`. */
94
+ output?: 'rng' | 'collection' | 'currency';
95
+ /** Optional flat amount per block broken (alternative to `chance`). */
96
+ baseAmount?: number;
97
+ /** Optional 0..1 chance per block broken. */
98
+ chance?: number;
99
+ specialCropType?: SpecialCrop;
100
+ /** Tags assigned to the produced drop. Defaults to `['rare-crop','overbloom']`. */
101
+ tags?: readonly DropTag[];
102
+ /** Drop kind for the produced drop. Defaults to `'rare'`. */
103
+ dropKind?: DropKind;
104
+ }
105
+ /**
106
+ * Numeric semantics by op (no mixing of factor vs delta within an op):
107
+ * - `add-stat`: additive scalar contribution to `stat` (e.g. 5 = +5 Fortune).
108
+ * - `add-rare-pct`: additive percentage points (e.g. 50 = +50% on rare drops).
109
+ * - `mul-rare`: multiplicative factor (e.g. 1.2 = x1.2). Must be >= 0.
110
+ * - `mul-drop`: multiplicative factor (e.g. 1.25 = x1.25). Must be >= 0.
111
+ * - `add-drop`: `value` is unused; `drop` carries the payload.
112
+ */
113
+ export interface Effect {
114
+ source: string;
115
+ op: EffectOp;
116
+ phase?: EffectPhase;
117
+ scope?: Scope;
118
+ stat?: Stat;
119
+ value?: number | ((ctx: DropContext | StatContext) => number);
120
+ drop?: EffectAddDropPayload;
121
+ relatedStats?: readonly Stat[];
122
+ meta?: {
123
+ description?: string;
124
+ valueDisplay?: 'stat' | 'percent' | 'factor';
125
+ valueStat?: Stat;
126
+ };
127
+ }
128
+ /**
129
+ * Per-drop record of an applied effect, surfaced via `DetailedDropsResult`.
130
+ */
131
+ export interface AppliedEffect {
132
+ source: string;
133
+ op: EffectOp;
134
+ phase: EffectPhase;
135
+ /** Resolved numeric contribution at this drop. */
136
+ amount: number;
137
+ relatedStats?: readonly Stat[];
138
+ scope?: Scope;
139
+ description?: string;
140
+ valueDisplay?: 'stat' | 'percent' | 'factor';
141
+ valueStat?: Stat;
142
+ }
143
+ /**
144
+ * Aggregate per-source totals across the whole rate calc.
145
+ * Replaces today's `rareItemBonusBreakdown`.
146
+ */
147
+ export type EffectsBreakdown = Record<string, number>;
@@ -0,0 +1,9 @@
1
+ /** Default phase for each op. Effects rarely override. */
2
+ export const DEFAULT_PHASE_FOR_OP = {
3
+ 'add-stat': 'scalar',
4
+ 'add-rare-pct': 'add-rare',
5
+ 'mul-rare': 'mul-rare',
6
+ 'add-drop': 'produce-drops',
7
+ 'mul-drop': 'mul-drop',
8
+ };
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/effects/types.ts"],"names":[],"mappings":"AAkGA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAkC;IAClE,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,UAAU;IAC1B,UAAU,EAAE,UAAU;IACtB,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,UAAU;CACtB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { Rarity } from '../constants/reforges.js';
2
2
  import { Stat } from '../constants/stats.js';
3
3
  import type { FortuneSourceProgress } from '../constants/upgrades.js';
4
+ import type { Effect, EffectEnvironment } from '../effects/types.js';
4
5
  import { type FarmingAccessoryInfo } from '../items/accessories.js';
5
6
  import type { PlayerOptions } from '../player/playeroptions.js';
6
7
  import type { EliteItemDto } from './item.js';
@@ -16,9 +17,16 @@ export declare class FarmingAccessory extends UpgradeableBase {
16
17
  options?: PlayerOptions;
17
18
  constructor(item: EliteItemDto, options?: PlayerOptions);
18
19
  getProgress(stats?: Stat[], zeroed?: boolean): FortuneSourceProgress[];
20
+ setOptions(options: PlayerOptions): void;
19
21
  getStat(stat: Stat): number;
22
+ /**
23
+ * Returns the declarative `Effect[]` representation of every contribution
24
+ * this accessory makes. Base stats, computed stats, and (halved) gem
25
+ * stats.
26
+ */
27
+ getEffects(_env: EffectEnvironment): Effect[];
20
28
  getFortune(): number;
21
29
  static isValid(item: EliteItemDto): boolean;
22
- static fromArray(items: EliteItemDto[]): FarmingAccessory[];
30
+ static fromArray(items: EliteItemDto[], options?: PlayerOptions): FarmingAccessory[];
23
31
  static fakeItem(info: UpgradeableInfo, options?: PlayerOptions): FarmingAccessory | undefined;
24
32
  }
@@ -1,7 +1,8 @@
1
1
  import { Stat } from '../constants/stats.js';
2
2
  import { FARMING_ACCESSORIES_INFO } from '../items/accessories.js';
3
+ import { statsToEffects } from '../items/sources/effects-util.js';
4
+ import { gemEffects } from '../items/sources/gems.js';
3
5
  import { getSourceProgress } from '../upgrades/getsourceprogress.js';
4
- import { registerItem } from '../upgrades/itemregistry.js';
5
6
  import { ACCESSORY_FORTUNE_SOURCES } from '../upgrades/sources/accessorysources.js';
6
7
  import { getGemStat, getPeridotFortune } from '../util/gems.js';
7
8
  import { UpgradeableBase } from './upgradeablebase.js';
@@ -13,10 +14,15 @@ export class FarmingAccessory extends UpgradeableBase {
13
14
  getProgress(stats, zeroed = false) {
14
15
  return getSourceProgress(this, ACCESSORY_FORTUNE_SOURCES, zeroed, stats);
15
16
  }
17
+ setOptions(options) {
18
+ this.options = options;
19
+ this.getFortune();
20
+ }
16
21
  getStat(stat) {
17
22
  let sum = 0;
18
23
  // Base fortune
19
24
  sum += this.info.baseStats?.[stat] ?? 0;
25
+ sum += this.getCalculatedStats()[stat] ?? 0;
20
26
  // Gems
21
27
  const gemStat = getGemStat(this.item, stat, this.rarity);
22
28
  if (gemStat > 0) {
@@ -24,11 +30,24 @@ export class FarmingAccessory extends UpgradeableBase {
24
30
  }
25
31
  return sum;
26
32
  }
33
+ /**
34
+ * Returns the declarative `Effect[]` representation of every contribution
35
+ * this accessory makes. Base stats, computed stats, and (halved) gem
36
+ * stats.
37
+ */
38
+ getEffects(_env) {
39
+ const sourceName = this.info.name;
40
+ const effects = [];
41
+ effects.push(...statsToEffects(this.info.baseStats, sourceName));
42
+ effects.push(...statsToEffects(this.getCalculatedStats(), sourceName));
43
+ effects.push(...gemEffects(this.item, this.rarity, `${sourceName} (Gems)`, 0.5));
44
+ return effects;
45
+ }
27
46
  getFortune() {
28
47
  this.fortuneBreakdown = {};
29
48
  let sum = 0;
30
49
  // Base fortune
31
- const base = this.info.baseStats?.[Stat.FarmingFortune] ?? 0;
50
+ const base = (this.info.baseStats?.[Stat.FarmingFortune] ?? 0) + (this.getCalculatedStats()[Stat.FarmingFortune] ?? 0);
32
51
  if (base > 0) {
33
52
  this.fortuneBreakdown['Base Stats'] = base;
34
53
  sum += base;
@@ -36,7 +55,7 @@ export class FarmingAccessory extends UpgradeableBase {
36
55
  // Gems
37
56
  let peridot = getPeridotFortune(this.rarity, this.item);
38
57
  if (peridot > 0) {
39
- peridot = +(peridot / 2).toFixed(2); // Only half the fortune is applied on accessories
58
+ peridot = +(peridot / 2).toFixed(2); // Only half the stats are applied on accessories
40
59
  this.fortuneBreakdown['Peridot Gems'] = peridot;
41
60
  sum += peridot;
42
61
  }
@@ -46,10 +65,10 @@ export class FarmingAccessory extends UpgradeableBase {
46
65
  static isValid(item) {
47
66
  return FARMING_ACCESSORIES_INFO[item.skyblockId] !== undefined;
48
67
  }
49
- static fromArray(items) {
68
+ static fromArray(items, options) {
50
69
  return items
51
70
  .filter((item) => FarmingAccessory.isValid(item))
52
- .map((item) => new FarmingAccessory(item))
71
+ .map((item) => new FarmingAccessory(item, options))
53
72
  .sort((a, b) => b.fortune - a.fortune);
54
73
  }
55
74
  static fakeItem(info, options) {
@@ -66,12 +85,4 @@ export class FarmingAccessory extends UpgradeableBase {
66
85
  return new FarmingAccessory(fake, options);
67
86
  }
68
87
  }
69
- for (const item of Object.values(FARMING_ACCESSORIES_INFO)) {
70
- if (!item)
71
- continue;
72
- registerItem({
73
- info: item,
74
- fakeItem: (i, o) => FarmingAccessory.fakeItem(i, o),
75
- });
76
- }
77
88
  //# sourceMappingURL=farmingaccessory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"farmingaccessory.js","sourceRoot":"","sources":["../../src/fortune/farmingaccessory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"farmingaccessory.js","sourceRoot":"","sources":["../../src/fortune/farmingaccessory.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,8 @@ import type { Crop } from '../constants/crops.js';
2
2
  import { type Rarity, type Reforge, ReforgeTarget, type ReforgeTier } from '../constants/reforges.js';
3
3
  import { type SpecialCrop } from '../constants/specialcrops.js';
4
4
  import { Stat } from '../constants/stats.js';
5
- import type { FortuneSourceProgress, FortuneUpgrade } from '../constants/upgrades.js';
5
+ import { type FortuneSourceProgress, type FortuneUpgrade, type StatQueryOptions } from '../constants/upgrades.js';
6
+ import type { Effect, EffectEnvironment } from '../effects/types.js';
6
7
  import { type ArmorSetBonus, type FarmingArmorInfo, GearSlot } from '../items/armor.js';
7
8
  import type { PlayerOptions } from '../player/playeroptions.js';
8
9
  import { FarmingEquipment } from './farmingequipment.js';
@@ -42,6 +43,7 @@ export declare class ArmorSet {
42
43
  updateArmorSlot(piece: FarmingArmor): void;
43
44
  updateEquipmentSlot(piece: FarmingEquipment): void;
44
45
  getPiece(slot: GearSlot): FarmingArmor | FarmingEquipment | undefined;
46
+ getStartingPiece(slot: GearSlot): FarmingArmor | FarmingEquipment | undefined;
45
47
  setPiece(armor: FarmingArmor | FarmingEquipment): void;
46
48
  private recalculateFamilies;
47
49
  static getSetBonusFrom(armor: (FarmingArmor | FarmingEquipment | null)[]): {
@@ -50,7 +52,13 @@ export declare class ArmorSet {
50
52
  bonus: ArmorSetBonus;
51
53
  special: SpecialCrop[] | undefined;
52
54
  }[];
53
- getStat(stat: Stat): number;
55
+ getStat(stat: Stat, crop?: Crop): number;
56
+ /**
57
+ * Returns the declarative `Effect[]` for the entire armor set: every armor
58
+ * piece's effects, every equipment piece's effects, and the armor / equipment
59
+ * set bonuses keyed by current piece count.
60
+ */
61
+ getEffects(env: EffectEnvironment): Effect[];
54
62
  getFortuneBreakdown(reloadFamilies?: boolean): Record<string, number>;
55
63
  specialDropsCalc(blocksBroken: number, crop: Crop): {
56
64
  id: string;
@@ -58,11 +66,9 @@ export declare class ArmorSet {
58
66
  amount: number;
59
67
  npc: number;
60
68
  } | null;
61
- specialDropsCount(crop: Crop): 0 | 2 | 1 | 3 | 4;
69
+ specialDropsCount(crop: Crop): 0 | 1 | 2 | 3 | 4;
62
70
  getProgress(stats?: Stat[], zeroed?: boolean): FortuneSourceProgress[];
63
- getUpgrades(options?: {
64
- stat?: Stat;
65
- }): FortuneUpgrade[];
71
+ getUpgrades(options?: StatQueryOptions): FortuneUpgrade[];
66
72
  getPieceProgress(slot: GearSlot): FortuneSourceProgress[];
67
73
  get slots(): Record<GearSlot, FarmingArmor | FarmingEquipment | undefined>;
68
74
  get slotOptions(): Record<GearSlot, (FarmingArmor | FarmingEquipment)[]>;
@@ -83,11 +89,16 @@ export declare class FarmingArmor extends UpgradeableBase {
83
89
  options?: PlayerOptions;
84
90
  constructor(item: EliteItemDto, options?: PlayerOptions);
85
91
  setOptions(options: PlayerOptions): void;
86
- getStat(stat: Stat): number;
92
+ getStat(stat: Stat, crop?: Crop): number;
93
+ /**
94
+ * Returns the declarative `Effect[]` representation of every contribution
95
+ * this armor piece makes: base stats, per-farming-level stats, reforge,
96
+ * gems, and enchants. Set bonuses are handled at the `ArmorSet` level (see
97
+ * {@link ArmorSet.getEffects}).
98
+ */
99
+ getEffects(env: EffectEnvironment): Effect[];
87
100
  getFortune(): number;
88
- getUpgrades(options?: {
89
- stat?: Stat;
90
- }): FortuneUpgrade[];
101
+ getUpgrades(options?: StatQueryOptions): FortuneUpgrade[];
91
102
  getItemUpgrade(): import("../constants/upgrades.js").Upgrade | undefined;
92
103
  getLastItemUpgrade(): {
93
104
  upgrade: import("../constants/upgrades.js").Upgrade;