From 1f9de513e709e2b3f0b0dfda9834f71c10d1de4c Mon Sep 17 00:00:00 2001 From: Paliak <91493239+Paliak@users.noreply.github.com> Date: Fri, 30 Jan 2026 17:48:43 +0100 Subject: [PATCH 1/3] FIX: Charge max override being set during charge pre-pass After #7186 doActorCharges is ran early to supply charge data to other logic in CalcPerform.lua #7328 added an extra override to improve max charge count display causing the pre pass to set the override which is then not overwritten during the main charge calculation pass. This means that conditional maximum charge mods such as "+1 to Maximum Frenzy Charges while affected by Grace" which rely on conditions set after the charge pre-pass were not accounted for in the main pass. This pr simply uses the ReplaceMod function to replace the max charges override mod during the last/main pass. Signed-off-by: Paliak <91493239+Paliak@users.noreply.github.com> --- src/Modules/CalcPerform.lua | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index b5d6957bd9..30b4918fc0 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -897,18 +897,14 @@ local function doActorCharges(env, actor) output.PowerChargesDuration = m_floor(modDB:Sum("BASE", nil, "ChargeDuration") * calcLib.mod(modDB, nil, "PowerChargesDuration", "ChargeDuration")) if modDB:Flag(nil, "MaximumFrenzyChargesIsMaximumPowerCharges") then local source = modDB.mods["MaximumFrenzyChargesIsMaximumPowerCharges"][1].source - if not modDB:HasMod("OVERRIDE", {source = source:match("[^:]+")}, "FrenzyChargesMax") then - modDB:NewMod("FrenzyChargesMax", "OVERRIDE", output.PowerChargesMax, source) - end + modDB:ReplaceMod("FrenzyChargesMax", "OVERRIDE", output.PowerChargesMax, source) end output.FrenzyChargesMin = m_max(modDB:Sum("BASE", nil, "FrenzyChargesMin"), 0) output.FrenzyChargesMax = modDB:Override(nil, "FrenzyChargesMax") or m_max(modDB:Flag(nil, "MaximumFrenzyChargesIsMaximumPowerCharges") and output.PowerChargesMax or modDB:Sum("BASE", nil, "FrenzyChargesMax"), 0) output.FrenzyChargesDuration = m_floor(modDB:Sum("BASE", nil, "ChargeDuration") * calcLib.mod(modDB, nil, "FrenzyChargesDuration", "ChargeDuration")) if modDB:Flag(nil, "MaximumEnduranceChargesIsMaximumFrenzyCharges") then local source = modDB.mods["MaximumEnduranceChargesIsMaximumFrenzyCharges"][1].source - if not modDB:HasMod("OVERRIDE", {source = source:match("[^:]+")}, "EnduranceChargesMax") then - modDB:NewMod("EnduranceChargesMax", "OVERRIDE", output.FrenzyChargesMax, source) - end + modDB:ReplaceMod("EnduranceChargesMax", "OVERRIDE", output.FrenzyChargesMax, source) end output.EnduranceChargesMin = m_max(modDB:Sum("BASE", nil, "EnduranceChargesMin"), 0) output.EnduranceChargesMax = modDB:Override(nil, "EnduranceChargesMax") or m_max(env.partyMembers.modDB:Flag(nil, "PartyMemberMaximumEnduranceChargesEqualToYours") and env.partyMembers.output.EnduranceChargesMax or (modDB:Flag(nil, "MaximumEnduranceChargesIsMaximumFrenzyCharges") and output.FrenzyChargesMax or modDB:Sum("BASE", nil, "EnduranceChargesMax")), 0) From 376a5851ef26bf9e8a70c01415e8a1b640068055 Mon Sep 17 00:00:00 2001 From: Paliak <91493239+Paliak@users.noreply.github.com> Date: Fri, 30 Jan 2026 18:13:54 +0100 Subject: [PATCH 2/3] CHORE: add test --- spec/System/TestItemMods_spec.lua | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index f49b1e7c70..b319096f19 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -585,4 +585,32 @@ describe("TetsItemMods", function() assert.are.equals(0.86, build.calcsTab.calcsOutput.LightningEffMult) end) + + it("Max charges with conditional mod", function() -- see #9442 + build.skillsTab:PasteSocketGroup("Grace 20/20 Default 1\n") + runCallback("OnFrame") + + local baseFrenzyChargesMax = build.calcsTab.calcsOutput.FrenzyChargesMax + local baseEnduranceChargesMax = build.calcsTab.calcsOutput.EnduranceChargesMax + + build.configTab.input.customMods = [[ + +1 to Maximum Frenzy Charges while affected by Grace + ]] + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(baseFrenzyChargesMax + 1, build.calcsTab.calcsOutput.FrenzyChargesMax) + assert.are.equals(baseEnduranceChargesMax, build.calcsTab.calcsOutput.EnduranceChargesMax) + + build.configTab.input.customMods = [[ + Your Maximum Endurance Charges is equal to your Maximum Frenzy Charges + +1 to Maximum Frenzy Charges while affected by Grace + ]] + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(baseFrenzyChargesMax + 1, build.calcsTab.calcsOutput.FrenzyChargesMax) + assert.are.equals(baseEnduranceChargesMax + 1, build.calcsTab.calcsOutput.EnduranceChargesMax) + end) +end) end) From 0c9d6ac4879f449a04b3c11714267a5e6af11f19 Mon Sep 17 00:00:00 2001 From: Paliak <91493239+Paliak@users.noreply.github.com> Date: Fri, 30 Jan 2026 18:44:14 +0100 Subject: [PATCH 3/3] FIX: duplicate function end in test Signed-off-by: Paliak <91493239+Paliak@users.noreply.github.com> --- spec/System/TestItemMods_spec.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index b319096f19..b7a24e7b49 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -613,4 +613,3 @@ describe("TetsItemMods", function() assert.are.equals(baseEnduranceChargesMax + 1, build.calcsTab.calcsOutput.EnduranceChargesMax) end) end) -end)