diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index f49b1e7c70..b7a24e7b49 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -585,4 +585,31 @@ 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) 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)