Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions spec/System/TestItemMods_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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", [[
Expand Down
16 changes: 12 additions & 4 deletions src/Modules/CalcDefence.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions src/Modules/ModParser.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
Loading