Releases: brues-code/ReforgeLite
Releases · brues-code/ReforgeLite
v3.0.0-alpha16
ReforgeLite Classic
v3.0.0-alpha16 (2026-06-18)
Full Changelog Previous Releases
- revert human spirit change
- stop aliasing the shared classPresets table for the player's class
InitClassPresets set self.presets = classPresets[playerClass] (a shared
reference), so InitCustomPresets/Pawn polluted it and a later wipe()
cleared classPresets[playerClass] itself. Toggling debug then rebuilt
the player's class entry as a self-reference, making its submenu list
every other class. Populate the addon's own self.presets table by spec
instead of aliasing. - resolve function-valued spec presets in the preset menu
The class-level preset value is resolved with GetValueOrCallFunction, but
the per-spec loop used each preset raw -- so a function-valued spec preset
hit 'attempt to index a function value' when building the menu (and would
have errored on selection too, since the handler reads value.weights/caps).
Resolve each spec preset the same way. - fix B&B ignoring the 17th item slot on Cata
B&B hardcoded 16 item slots (MoP), but the Cata ranged slot makes 17.
It silently skipped slot 17, so it couldn't reforge that item and
returned a suboptimal result whenever the optimum used it (e.g. Shadow
Priest losing the Spirit->Mastery reforge there, scoring 404380 vs the
DP's 407630). Drive all slot counts from #data.method.items / #sortedSlots
so B&B covers every equipped slot. Validated B&B == DP on Cata. - print build info for algo compare
- refactor amplification + Human Spirit into stat multipliers
Encapsulate AmplificationItems/RandPropPoints as locals behind
GetAmplificationFactor(itemInfo).
Move The Human Spirit (+3% Spirit) from a SPIRIT->SPIRIT conversion to a
proper stat multiplier. - cleanup
- fix tooltip stat parsing on non-comma locales
getTooltipPatterns hardcoded [%d,] for the stat value, so it only
handled the enUS thousands separator. On deDE (separator '.') a value
like '+1.038 Willenskraft' captured just '1' and failed the match,
leaving the stat undetected -- corrupting GetItemStatsFromTooltip for
upgraded items (wrong reforge, and a stuck reforge from the bad index
count in DoReforgeUpdate). Build the digit class from the client's
LARGE_NUMBER_SEPERATOR so it works on every locale. - make GetStatScore iterate caps instead of hardcoding two
- avoid per-branch stat-table copy in B&B search
Apply each reforge to currentStats in place and undo it after recursing,
instead of CopyTable-ing the whole stat table for every branch. Search
is unchanged (same node count, same result == DP); per-node cost drops
~8% from eliminating the per-option allocation. - remove dead GetSmartReforgeOptions
B&B now uses GetFullReforgeOptions exclusively; the old smart-options
generator and its references are gone. - add best-effort B&B pass for infeasible cap configs
When the caps are unreachable (e.g. Hit AtMost below the reforge floor),
the constrained search prunes every branch and finds no solution, which
previously dropped to the full DP (~6min). Add a second pass with
constraint pruning relaxed: every complete path becomes a candidate and
the score bound keeps the highest-scoring (closest) one. Validated to
return the exact same best-effort solution as the DP (matching score) in
623 nodes vs the DP's 367s. - make Branch & Bound exact with a tighter joint bound
B&B previously searched only GetSmartReforgeOptions (one source stat per
item plus a few destinations), which excludes reforges the optimum needs
-- so it returned suboptimal results. Switch to full reforge enumeration
(GetFullReforgeOptions, deduped by cap effect) so B&B searches the same
space as the DP and reaches the true optimum.
To keep that tractable, add a joint per-item upper bound: each remaining
item is credited only its single best reforge (score + linear cap gains),
which is far tighter than the old frankenitem bound that summed
independently-maxed score/cap1/cap2 a single reforge can't all achieve.
Both bounds are kept and pruned on the min. Validated equal to DP on a
dual-AtLeast case in ~1/4 the time. Also guard a debug-only nil deref
when no feasible solution exists. - delete whitespace
- fix amplification factor and trim rpp table
Derive the Amplify equip bonus from the actual in-game spell (146051,
coefficient 0.00177 on the Epic_0 budget) and floor to match the
truncated tooltip percent, replacing the Round(rpp/420) approximation
that overshot at ilvl 528 (1.06 vs 1.05). Move the logic into
GetAmplificationFactor, and trim RandPropPoints to the single Epic_0
value per ilvl since that column was the only one ever read. - method window height is now dynamic
- cata: include ranged slot in calc
- grant contents:write so packager can create GitHub releases
The default GITHUB_TOKEN is read-only on newer repos, which would block
release creation; explicit permission ensures the tag release and zip
asset are published. - add GitHub Actions workflow to package and release on tag push
Runs the BigWigs packager on tag push (same release.sh path proven
working locally), uploading to CurseForge via CF_API_KEY and creating
a GitHub release via the built-in GITHUB_TOKEN. - add release to git ignore
- fix cap optimizer targeting 1 below displayed cap
The engine re-derived preset cap values with floor() while the UI
display/storage used ceil(), so the optimizer solved for AtLeast 960
when the cap shown was 961. Align the engine to max(0, ceil(getter())). - use currentlocale
- ignore release folder
- cleanup
- refresh conversion before running calc
- moved locales folder
- unused in cata
- revert
- test
- rename root file
- rename cata toc
v3.0.0-alpha15
ReforgeLite Classic
v3.0.0-alpha15 (2026-06-18)
Full Changelog Previous Releases
- fix tooltip stat parsing on non-comma locales
getTooltipPatterns hardcoded [%d,] for the stat value, so it only
handled the enUS thousands separator. On deDE (separator '.') a value
like '+1.038 Willenskraft' captured just '1' and failed the match,
leaving the stat undetected -- corrupting GetItemStatsFromTooltip for
upgraded items (wrong reforge, and a stuck reforge from the bad index
count in DoReforgeUpdate). Build the digit class from the client's
LARGE_NUMBER_SEPERATOR so it works on every locale. - make GetStatScore iterate caps instead of hardcoding two
- avoid per-branch stat-table copy in B&B search
Apply each reforge to currentStats in place and undo it after recursing,
instead of CopyTable-ing the whole stat table for every branch. Search
is unchanged (same node count, same result == DP); per-node cost drops
~8% from eliminating the per-option allocation. - remove dead GetSmartReforgeOptions
B&B now uses GetFullReforgeOptions exclusively; the old smart-options
generator and its references are gone. - add best-effort B&B pass for infeasible cap configs
When the caps are unreachable (e.g. Hit AtMost below the reforge floor),
the constrained search prunes every branch and finds no solution, which
previously dropped to the full DP (~6min). Add a second pass with
constraint pruning relaxed: every complete path becomes a candidate and
the score bound keeps the highest-scoring (closest) one. Validated to
return the exact same best-effort solution as the DP (matching score) in
623 nodes vs the DP's 367s. - make Branch & Bound exact with a tighter joint bound
B&B previously searched only GetSmartReforgeOptions (one source stat per
item plus a few destinations), which excludes reforges the optimum needs
-- so it returned suboptimal results. Switch to full reforge enumeration
(GetFullReforgeOptions, deduped by cap effect) so B&B searches the same
space as the DP and reaches the true optimum.
To keep that tractable, add a joint per-item upper bound: each remaining
item is credited only its single best reforge (score + linear cap gains),
which is far tighter than the old frankenitem bound that summed
independently-maxed score/cap1/cap2 a single reforge can't all achieve.
Both bounds are kept and pruned on the min. Validated equal to DP on a
dual-AtLeast case in ~1/4 the time. Also guard a debug-only nil deref
when no feasible solution exists. - delete whitespace
- fix amplification factor and trim rpp table
Derive the Amplify equip bonus from the actual in-game spell (146051,
coefficient 0.00177 on the Epic_0 budget) and floor to match the
truncated tooltip percent, replacing the Round(rpp/420) approximation
that overshot at ilvl 528 (1.06 vs 1.05). Move the logic into
GetAmplificationFactor, and trim RandPropPoints to the single Epic_0
value per ilvl since that column was the only one ever read. - method window height is now dynamic
- cata: include ranged slot in calc
- grant contents:write so packager can create GitHub releases
The default GITHUB_TOKEN is read-only on newer repos, which would block
release creation; explicit permission ensures the tag release and zip
asset are published. - add GitHub Actions workflow to package and release on tag push
Runs the BigWigs packager on tag push (same release.sh path proven
working locally), uploading to CurseForge via CF_API_KEY and creating
a GitHub release via the built-in GITHUB_TOKEN. - add release to git ignore
- fix cap optimizer targeting 1 below displayed cap
The engine re-derived preset cap values with floor() while the UI
display/storage used ceil(), so the optimizer solved for AtLeast 960
when the cap shown was 961. Align the engine to max(0, ceil(getter())). - use currentlocale
- ignore release folder
- cleanup
- refresh conversion before running calc
- moved locales folder
- unused in cata
- revert
- test
- rename root file
- rename cata toc
v3.0.0-alpha14
ReforgeLite Classic
v3.0.0-alpha14 (2026-06-18)
Full Changelog Previous Releases
- make GetStatScore iterate caps instead of hardcoding two
- avoid per-branch stat-table copy in B&B search
Apply each reforge to currentStats in place and undo it after recursing,
instead of CopyTable-ing the whole stat table for every branch. Search
is unchanged (same node count, same result == DP); per-node cost drops
~8% from eliminating the per-option allocation. - remove dead GetSmartReforgeOptions
B&B now uses GetFullReforgeOptions exclusively; the old smart-options
generator and its references are gone. - add best-effort B&B pass for infeasible cap configs
When the caps are unreachable (e.g. Hit AtMost below the reforge floor),
the constrained search prunes every branch and finds no solution, which
previously dropped to the full DP (~6min). Add a second pass with
constraint pruning relaxed: every complete path becomes a candidate and
the score bound keeps the highest-scoring (closest) one. Validated to
return the exact same best-effort solution as the DP (matching score) in
623 nodes vs the DP's 367s. - make Branch & Bound exact with a tighter joint bound
B&B previously searched only GetSmartReforgeOptions (one source stat per
item plus a few destinations), which excludes reforges the optimum needs
-- so it returned suboptimal results. Switch to full reforge enumeration
(GetFullReforgeOptions, deduped by cap effect) so B&B searches the same
space as the DP and reaches the true optimum.
To keep that tractable, add a joint per-item upper bound: each remaining
item is credited only its single best reforge (score + linear cap gains),
which is far tighter than the old frankenitem bound that summed
independently-maxed score/cap1/cap2 a single reforge can't all achieve.
Both bounds are kept and pruned on the min. Validated equal to DP on a
dual-AtLeast case in ~1/4 the time. Also guard a debug-only nil deref
when no feasible solution exists. - delete whitespace
- fix amplification factor and trim rpp table
Derive the Amplify equip bonus from the actual in-game spell (146051,
coefficient 0.00177 on the Epic_0 budget) and floor to match the
truncated tooltip percent, replacing the Round(rpp/420) approximation
that overshot at ilvl 528 (1.06 vs 1.05). Move the logic into
GetAmplificationFactor, and trim RandPropPoints to the single Epic_0
value per ilvl since that column was the only one ever read. - method window height is now dynamic
- cata: include ranged slot in calc
- grant contents:write so packager can create GitHub releases
The default GITHUB_TOKEN is read-only on newer repos, which would block
release creation; explicit permission ensures the tag release and zip
asset are published. - add GitHub Actions workflow to package and release on tag push
Runs the BigWigs packager on tag push (same release.sh path proven
working locally), uploading to CurseForge via CF_API_KEY and creating
a GitHub release via the built-in GITHUB_TOKEN. - add release to git ignore
- fix cap optimizer targeting 1 below displayed cap
The engine re-derived preset cap values with floor() while the UI
display/storage used ceil(), so the optimizer solved for AtLeast 960
when the cap shown was 961. Align the engine to max(0, ceil(getter())). - use currentlocale
- ignore release folder
- cleanup
- refresh conversion before running calc
- moved locales folder
- unused in cata
- revert
- test
- rename root file
- rename cata toc
v2.3.15
ReforgeLite Classic
v2.3.15 (2026-06-18)
Full Changelog Previous Releases
- fix tooltip stat parsing on non-comma locales
getTooltipPatterns hardcoded [%d,] for the stat value, so it only
handled the enUS thousands separator. On deDE (separator '.') a value
like '+1.038 Willenskraft' captured just '1' and failed the match,
leaving the stat undetected -- corrupting GetItemStatsFromTooltip for
upgraded items (wrong reforge, and a stuck reforge from the bad index
count in DoReforgeUpdate). Build the digit class from the client's
LARGE_NUMBER_SEPERATOR so it works on every locale.
v3.0.0-alpha13
ReforgeLite Classic
v3.0.0-alpha13 (2026-06-17)
Full Changelog Previous Releases
- method window height is now dynamic
- cata: include ranged slot in calc
- grant contents:write so packager can create GitHub releases
The default GITHUB_TOKEN is read-only on newer repos, which would block
release creation; explicit permission ensures the tag release and zip
asset are published. - add GitHub Actions workflow to package and release on tag push
Runs the BigWigs packager on tag push (same release.sh path proven
working locally), uploading to CurseForge via CF_API_KEY and creating
a GitHub release via the built-in GITHUB_TOKEN. - add release to git ignore
- fix cap optimizer targeting 1 below displayed cap
The engine re-derived preset cap values with floor() while the UI
display/storage used ceil(), so the optimizer solved for AtLeast 960
when the cap shown was 961. Align the engine to max(0, ceil(getter())). - use currentlocale
- ignore release folder
- cleanup
- refresh conversion before running calc
- moved locales folder
- unused in cata
- revert
- test
- rename root file
- rename cata toc
v2.3.14
ReforgeLite Classic
v2.3.14 (2026-06-17)
Full Changelog Previous Releases
- grant contents:write so packager can create GitHub releases
The default GITHUB_TOKEN is read-only on newer repos, which would block
release creation; explicit permission ensures the tag release and zip
asset are published. - add GitHub Actions workflow to package and release on tag push
Runs the BigWigs packager on tag push (same release.sh path proven
working locally), uploading to CurseForge via CF_API_KEY and creating
a GitHub release via the built-in GITHUB_TOKEN. - AmplificationItems fix
- Update .gitignore
- staticpopup cleanup
v1.4.7
Full Changelog: v1.4.6...v1.4.7
v1.4.6
Full Changelog: v1.4.5...v1.4.6
v1.4.5
Full Changelog: v1.4.4...v1.4.5