Skip to content

Commit 3e8adf8

Browse files
committed
Fix interaction with Prospero's Protection and Iron Reflexes
Add tests and update others
1 parent 7e12149 commit 3e8adf8

2 files changed

Lines changed: 53 additions & 12 deletions

File tree

spec/System/TestDefence_spec.lua

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -945,8 +945,19 @@ describe("TestDefence", function()
945945

946946
-- Get the base + Shabby Jerkin to make this test more adaptable to changes
947947
local ironReflexesArmour = build.calcsTab.mainOutput.Armour - baseArmour - baseEvasion
948+
assert.are.equals(ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
948949

949-
print("build.calcsTab.mainOutput.Armour:" .. build.calcsTab.mainOutput.Armour)
950+
build.configTab.input.customMods = [[
951+
Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating
952+
you have no dexterity
953+
Gain no armour from equipped body armour
954+
]]
955+
build.configTab:BuildModList()
956+
runCallback("OnFrame")
957+
-- Iron Reflexes and Prospero's Protection
958+
assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
959+
960+
--print("build.calcsTab.mainOutput.Armour:" .. build.calcsTab.mainOutput.Armour)
950961

951962
build.configTab.input.customMods = [[
952963
Armour from Equipped Body Armour is doubled
@@ -955,7 +966,6 @@ describe("TestDefence", function()
955966
]]
956967
build.configTab:BuildModList()
957968
runCallback("OnFrame")
958-
959969
-- Evasion from Body Armour is converted to Armour before being doubled
960970
assert.are.equals(2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
961971

@@ -967,25 +977,21 @@ describe("TestDefence", function()
967977
]]
968978
build.configTab:BuildModList()
969979
runCallback("OnFrame")
970-
971980
-- Only the base armour from the chest is affected.
972981
-- Armour converted with Iron Reflexes still applies
973-
assert.are.equals(2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
982+
assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
983+
974984
build.configTab.input.customMods = [[
975985
Armour from Equipped Body Armour is doubled
976986
Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating
977-
Gain no armour from equipped body armour
978987
defences from equipped body armour are doubled if it has no socketed gems
979988
you have no dexterity
980989
]]
981990
build.configTab:BuildModList()
982991
runCallback("OnFrame")
983-
984-
-- Oath Of Maji double defences stack with Unbreakable
985992
assert.are.equals(2*2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
986993

987994
build.configTab.input.customMods = [[
988-
Armour from Equipped Body Armour is doubled
989995
Armour from Equipped Body Armour is doubled
990996
Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating
991997
Gain no armour from equipped body armour
@@ -994,7 +1000,17 @@ describe("TestDefence", function()
9941000
]]
9951001
build.configTab:BuildModList()
9961002
runCallback("OnFrame")
1003+
assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
9971004

1005+
build.configTab.input.customMods = [[
1006+
Armour from Equipped Body Armour is doubled
1007+
Armour from Equipped Body Armour is doubled
1008+
Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating
1009+
defences from equipped body armour are doubled if it has no socketed gems
1010+
you have no dexterity
1011+
]]
1012+
build.configTab:BuildModList()
1013+
runCallback("OnFrame")
9981014
-- Mod form unbreakable should apply only once
9991015
assert.are.equals(2*2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
10001016

@@ -1004,14 +1020,37 @@ describe("TestDefence", function()
10041020
Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating
10051021
Gain no armour from equipped body armour
10061022
defences from equipped body armour are doubled if it has no socketed gems
1007-
defences from equipped body armour are doubled if it has no socketed gems
10081023
you have no dexterity
10091024
]]
10101025
build.configTab:BuildModList()
10111026
runCallback("OnFrame")
1027+
assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
10121028

1029+
build.configTab.input.customMods = [[
1030+
Armour from Equipped Body Armour is doubled
1031+
Armour from Equipped Body Armour is doubled
1032+
Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating
1033+
defences from equipped body armour are doubled if it has no socketed gems
1034+
defences from equipped body armour are doubled if it has no socketed gems
1035+
you have no dexterity
1036+
]]
1037+
build.configTab:BuildModList()
1038+
runCallback("OnFrame")
10131039
-- Oath Of Maji should apply only once
10141040
assert.are.equals(2*2*ironReflexesArmour + baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
1041+
1042+
build.configTab.input.customMods = [[
1043+
Armour from Equipped Body Armour is doubled
1044+
Armour from Equipped Body Armour is doubled
1045+
Converts all Evasion Rating to Armour. Dexterity provides no bonus to Evasion Rating
1046+
Gain no armour from equipped body armour
1047+
defences from equipped body armour are doubled if it has no socketed gems
1048+
defences from equipped body armour are doubled if it has no socketed gems
1049+
you have no dexterity
1050+
]]
1051+
build.configTab:BuildModList()
1052+
runCallback("OnFrame")
1053+
assert.are.equals(baseArmour + baseEvasion, build.calcsTab.mainOutput.Armour)
10151054
end)
10161055

10171056
it("MoM + EB", function()

src/Modules/CalcDefence.lua

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -846,12 +846,12 @@ function calcs.defence(env, actor)
846846
slotCfg.slotName = slot
847847
energyShieldBase = not modDB:Flag(nil, "GainNoEnergyShieldFrom" .. slot) and armourData.EnergyShield or 0
848848
armourBase = not modDB:Flag(nil, "GainNoArmourFrom" .. slot) and armourData.Armour or 0
849-
evasionBase = not modDB:Flag(nil, "GainNoEvasionFrom" .. slot) and armourData.Evasion or 0
849+
evasionBase = not (modDB:Flag(nil, "GainNoEvasionFrom" .. slot) or (modDB:Flag(nil, "GainNoArmourFrom" .. slot) and ironReflexes)) and armourData.Evasion or 0
850850
wardBase = not modDB:Flag(nil, "GainNoWardFrom" .. slot) and armourData.Ward or 0
851851
if slot == "Body Armour" and modDB:Flag(nil, "ConvertBodyArmourArmourEvasionToWard") then
852852
local conversion = m_min(modDB:Sum("BASE", nil, "BodyArmourArmourEvasionToWardPercent") / 100, 1)
853-
local convertedArmour = armourBase * conversion
854-
local convertedEvasion = evasionBase * conversion
853+
local convertedArmour = armourBase * conversion
854+
local convertedEvasion = evasionBase * conversion
855855
armourBase = armourBase - convertedArmour
856856
evasionBase = evasionBase - convertedEvasion
857857
wardBase = wardBase + (convertedEvasion + convertedArmour)
@@ -914,6 +914,7 @@ function calcs.defence(env, actor)
914914
if breakdown then
915915
breakdown.slot(slot, nil, slotCfg, evasionBase, nil, "Evasion", "ArmourAndEvasion", "Defences")
916916
end
917+
917918
if ironReflexes then
918919
armour = armour + evasionBase * calcLib.mod(modDB, slotCfg, "Armour", "Evasion", "ArmourAndEvasion", "Defences")
919920
else
@@ -975,6 +976,7 @@ function calcs.defence(env, actor)
975976
end
976977
evasionBase = modDB:Sum("BASE", nil, "Evasion", "ArmourAndEvasion")
977978
if evasionBase > 0 then
979+
978980
if ironReflexes then
979981
armour = armour + evasionBase * calcLib.mod(modDB, nil, "Armour", "Evasion", "ArmourAndEvasion", "Defences")
980982
if breakdown then

0 commit comments

Comments
 (0)