diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index 8606a2a5fa7..c571c124152 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -612,6 +612,21 @@ describe("TetsItemMods", function() assert.are.equals(baseFrenzyChargesMax + 1, build.calcsTab.calcsOutput.FrenzyChargesMax) assert.are.equals(baseEnduranceChargesMax + 1, build.calcsTab.calcsOutput.EnduranceChargesMax) end) + + it("adds life recoup to energy shield recoup", function() + build.configTab.input.customMods = [[ + 20% of Damage taken Recouped as Life + 10% of Physical Damage taken Recouped as Life + Damage taken Recouped as Life is also Recouped as Energy Shield + ]] + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(20, build.calcsTab.calcsOutput.LifeRecoup) + assert.are.equals(20, build.calcsTab.calcsOutput.EnergyShieldRecoup) + assert.are.equals(10, build.calcsTab.calcsOutput.PhysicalLifeRecoup) + assert.are.equals(10, build.calcsTab.calcsOutput.PhysicalEnergyShieldRecoup) + end) it("shows a fallback tooltip when an item's base is no longer supported", function() local item = new("Item", [[ diff --git a/src/Modules/CalcDefence.lua b/src/Modules/CalcDefence.lua index 2e109d14f57..2362948bc52 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -1418,6 +1418,11 @@ function calcs.defence(env, actor) end end end + local addToEnergyShieldFlag = "Add"..recoupType.."RecoupToEnergyShieldRecoup" + if modDB:Flag(nil, addToEnergyShieldFlag) then + local flagMod = modDB:Tabulate("FLAG", nil, addToEnergyShieldFlag)[1].mod + modDB:ReplaceMod("EnergyShieldRecoup", "BASE", baseRecoup, flagMod.source) + end end if modDB:Flag(nil, "UsePowerCharges") and modDB:Flag(nil, "PowerChargesConvertToAbsorptionCharges") then @@ -1429,12 +1434,11 @@ function calcs.defence(env, actor) for _, recoupType in ipairs(recoupTypeList) do for _, damageType in ipairs(dmgTypeList) do + local recoup = modDB:Sum("BASE", nil, damageType..recoupType.."Recoup") if recoupType == "Life" and modDB:Flag(nil, "EnergyShieldRecoupInsteadOfLife") then output[damageType.."LifeRecoup"] = 0 - local lifeRecoup = modDB:Sum("BASE", nil, damageType.."LifeRecoup") - modDB:NewMod(damageType.."EnergyShieldRecoup", "BASE", lifeRecoup, "Life Recoup Conversion") + modDB:NewMod(damageType.."EnergyShieldRecoup", "BASE", recoup, "Life Recoup Conversion") else - local recoup = modDB:Sum("BASE", nil, damageType..recoupType.."Recoup") output[damageType..recoupType.."Recoup"] = recoup * output[recoupType.."RecoveryRateMod"] output["anyRecoup"] = output["anyRecoup"] + output[damageType..recoupType.."Recoup"] if breakdown then @@ -1449,9 +1453,13 @@ function calcs.defence(env, actor) end end end + local addToEnergyShieldFlag = "Add"..recoupType.."RecoupToEnergyShieldRecoup" + if modDB:Flag(nil, addToEnergyShieldFlag) then + local flagMod = modDB:Tabulate("FLAG", nil, addToEnergyShieldFlag)[1].mod + modDB:ReplaceMod(damageType.."EnergyShieldRecoup", "BASE", recoup, flagMod.source) + end end end - -- pseudo recoup (eg %physical damage prevented from hits regenerated) for _, resource in ipairs(recoupTypeList) do if not modDB:Flag(nil, "No"..resource.."Regen") and not modDB:Flag(nil, "CannotGain"..resource) then diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index bc4a0ccf005..8475a7ebd24 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -4617,6 +4617,9 @@ local specialModList = { ["recoup effects instead occur over 3 seconds"] = { flag("3SecondRecoup") }, ["life recoup effects instead occur over 3 seconds"] = { flag("3SecondLifeRecoup") }, ["recoup energy shield instead of life"] = { flag("EnergyShieldRecoupInsteadOfLife") }, + ["damage taken recouped as (%a+) is also recouped as energy shield"] = function(_, type) return { + flag("Add"..firstToUpper(type).."RecoupToEnergyShieldRecoup"), + } end, ["([%d%.]+)%% of physical damage prevented from hits in the past (%d+) seconds is regenerated as life per second"] = function(num, _, duration) return { mod("PhysicalDamageMitigatedLifePseudoRecoup", "BASE", num * duration), mod("PhysicalDamageMitigatedLifePseudoRecoupDuration", "BASE", duration),