From 3e8adf8aa5bd85f981edc0d9c3e84142ad9e7c99 Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Wed, 22 Apr 2026 12:43:50 -0500 Subject: [PATCH 1/2] Fix interaction with Prospero's Protection and Iron Reflexes Add tests and update others --- spec/System/TestDefence_spec.lua | 57 +++++++++++++++++++++++++++----- src/Modules/CalcDefence.lua | 8 +++-- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/spec/System/TestDefence_spec.lua b/spec/System/TestDefence_spec.lua index ea79c4f747..74f05d0786 100644 --- a/spec/System/TestDefence_spec.lua +++ b/spec/System/TestDefence_spec.lua @@ -945,8 +945,19 @@ describe("TestDefence", function() -- Get the base + Shabby Jerkin to make this test more adaptable to changes local ironReflexesArmour = build.calcsTab.mainOutput.Armour - baseArmour - baseEvasion + assert.are.equals(ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) - print("build.calcsTab.mainOutput.Armour:" .. build.calcsTab.mainOutput.Armour) + build.configTab.input.customMods = [[ + Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating + you have no dexterity + Gain no armour from equipped body armour + ]] + build.configTab:BuildModList() + runCallback("OnFrame") + -- Iron Reflexes and Prospero's Protection + assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) + + --print("build.calcsTab.mainOutput.Armour:" .. build.calcsTab.mainOutput.Armour) build.configTab.input.customMods = [[ Armour from Equipped Body Armour is doubled @@ -955,7 +966,6 @@ describe("TestDefence", function() ]] build.configTab:BuildModList() runCallback("OnFrame") - -- Evasion from Body Armour is converted to Armour before being doubled assert.are.equals(2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) @@ -967,25 +977,21 @@ describe("TestDefence", function() ]] build.configTab:BuildModList() runCallback("OnFrame") - -- Only the base armour from the chest is affected. -- Armour converted with Iron Reflexes still applies - assert.are.equals(2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) + assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) + build.configTab.input.customMods = [[ Armour from Equipped Body Armour is doubled Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating - Gain no armour from equipped body armour defences from equipped body armour are doubled if it has no socketed gems you have no dexterity ]] build.configTab:BuildModList() runCallback("OnFrame") - - -- Oath Of Maji double defences stack with Unbreakable assert.are.equals(2*2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) build.configTab.input.customMods = [[ - Armour from Equipped Body Armour is doubled Armour from Equipped Body Armour is doubled Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating Gain no armour from equipped body armour @@ -994,7 +1000,17 @@ describe("TestDefence", function() ]] build.configTab:BuildModList() runCallback("OnFrame") + assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) + build.configTab.input.customMods = [[ + Armour from Equipped Body Armour is doubled + Armour from Equipped Body Armour is doubled + Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating + defences from equipped body armour are doubled if it has no socketed gems + you have no dexterity + ]] + build.configTab:BuildModList() + runCallback("OnFrame") -- Mod form unbreakable should apply only once assert.are.equals(2*2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) @@ -1004,14 +1020,37 @@ describe("TestDefence", function() Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating Gain no armour from equipped body armour defences from equipped body armour are doubled if it has no socketed gems - defences from equipped body armour are doubled if it has no socketed gems you have no dexterity ]] build.configTab:BuildModList() runCallback("OnFrame") + assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) + build.configTab.input.customMods = [[ + Armour from Equipped Body Armour is doubled + Armour from Equipped Body Armour is doubled + Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating + defences from equipped body armour are doubled if it has no socketed gems + defences from equipped body armour are doubled if it has no socketed gems + you have no dexterity + ]] + build.configTab:BuildModList() + runCallback("OnFrame") -- Oath Of Maji should apply only once assert.are.equals(2*2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) + + build.configTab.input.customMods = [[ + Armour from Equipped Body Armour is doubled + Armour from Equipped Body Armour is doubled + Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating + Gain no armour from equipped body armour + defences from equipped body armour are doubled if it has no socketed gems + defences from equipped body armour are doubled if it has no socketed gems + you have no dexterity + ]] + build.configTab:BuildModList() + runCallback("OnFrame") + assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour) end) it("MoM + EB", function() diff --git a/src/Modules/CalcDefence.lua b/src/Modules/CalcDefence.lua index cfb1699e22..094fd8bdb5 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -846,12 +846,12 @@ function calcs.defence(env, actor) slotCfg.slotName = slot energyShieldBase = not modDB:Flag(nil, "GainNoEnergyShieldFrom" .. slot) and armourData.EnergyShield or 0 armourBase = not modDB:Flag(nil, "GainNoArmourFrom" .. slot) and armourData.Armour or 0 - evasionBase = not modDB:Flag(nil, "GainNoEvasionFrom" .. slot) and armourData.Evasion or 0 + evasionBase = not (modDB:Flag(nil, "GainNoEvasionFrom" .. slot) or (modDB:Flag(nil, "GainNoArmourFrom" .. slot) and ironReflexes)) and armourData.Evasion or 0 wardBase = not modDB:Flag(nil, "GainNoWardFrom" .. slot) and armourData.Ward or 0 if slot == "Body Armour" and modDB:Flag(nil, "ConvertBodyArmourArmourEvasionToWard") then local conversion = m_min(modDB:Sum("BASE", nil, "BodyArmourArmourEvasionToWardPercent") / 100, 1) - local convertedArmour = armourBase * conversion - local convertedEvasion = evasionBase * conversion + local convertedArmour = armourBase * conversion + local convertedEvasion = evasionBase * conversion armourBase = armourBase - convertedArmour evasionBase = evasionBase - convertedEvasion wardBase = wardBase + (convertedEvasion + convertedArmour) @@ -914,6 +914,7 @@ function calcs.defence(env, actor) if breakdown then breakdown.slot(slot, nil, slotCfg, evasionBase, nil, "Evasion", "ArmourAndEvasion", "Defences") end + if ironReflexes then armour = armour + evasionBase * calcLib.mod(modDB, slotCfg, "Armour", "Evasion", "ArmourAndEvasion", "Defences") else @@ -975,6 +976,7 @@ function calcs.defence(env, actor) end evasionBase = modDB:Sum("BASE", nil, "Evasion", "ArmourAndEvasion") if evasionBase > 0 then + if ironReflexes then armour = armour + evasionBase * calcLib.mod(modDB, nil, "Armour", "Evasion", "ArmourAndEvasion", "Defences") if breakdown then From 68ac993a299aa50ad01c421a43d81bebe1aaaa62 Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Wed, 22 Apr 2026 12:55:15 -0500 Subject: [PATCH 2/2] whitespace --- src/Modules/CalcDefence.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Modules/CalcDefence.lua b/src/Modules/CalcDefence.lua index 094fd8bdb5..82447977db 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -914,7 +914,6 @@ function calcs.defence(env, actor) if breakdown then breakdown.slot(slot, nil, slotCfg, evasionBase, nil, "Evasion", "ArmourAndEvasion", "Defences") end - if ironReflexes then armour = armour + evasionBase * calcLib.mod(modDB, slotCfg, "Armour", "Evasion", "ArmourAndEvasion", "Defences") else @@ -976,7 +975,6 @@ function calcs.defence(env, actor) end evasionBase = modDB:Sum("BASE", nil, "Evasion", "ArmourAndEvasion") if evasionBase > 0 then - if ironReflexes then armour = armour + evasionBase * calcLib.mod(modDB, nil, "Armour", "Evasion", "ArmourAndEvasion", "Defences") if breakdown then