658 lines
29 KiB
Lua
658 lines
29 KiB
Lua
describe("TestDefence", function()
|
|
before_each(function()
|
|
newBuild()
|
|
end)
|
|
|
|
teardown(function()
|
|
-- newBuild() takes care of resetting everything in setup()
|
|
end)
|
|
|
|
-- boring part
|
|
it("no armour max hits", function()
|
|
assert.are.equals(60, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(38, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(38, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(38, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(38, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+200 to all resistances\n\z
|
|
200% additional Physical Damage Reduction\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(600, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(240, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(240, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(240, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(240, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+200 to all resistances\n\z
|
|
+200 to all maximum resistances\n\z
|
|
200% additional Physical Damage Reduction\n\z
|
|
"
|
|
build.configTab.input.enemyPhysicalOverwhelm = 15 -- should result 75% DR
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(240, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(600, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(600, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(600, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(600, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+200 to all resistances\n\z
|
|
+200 to all maximum resistances\n\z
|
|
50% reduced damage taken\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(120, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(1200, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(1200, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(1200, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(1200, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+200 to all resistances\n\z
|
|
+200 to all maximum resistances\n\z
|
|
50% reduced damage taken\n\z
|
|
50% less damage taken\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(240, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(2400, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(2400, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(2400, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(2400, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+200 to all resistances\n\z
|
|
+200 to all maximum resistances\n\z
|
|
50% reduced damage taken\n\z
|
|
50% less damage taken\n\z
|
|
Nearby enemies deal 20% less damage\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(300, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(3000, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(3000, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(3000, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(3000, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
end)
|
|
|
|
-- a small helper function to calculate damage taken from limited test parameters
|
|
local function takenHitFromTypeMaxHit(type, enemyDamageMulti)
|
|
return build.calcsTab.calcs.takenHitFromDamage(build.calcsTab.calcsOutput[type.."MaximumHitTaken"] * (enemyDamageMulti or 1), type, build.calcsTab.calcsEnv.player)
|
|
end
|
|
|
|
it("progenesis and petrified blood", function()
|
|
-- Petrified blood
|
|
--build.skillsTab:PasteSocketGroup("\z
|
|
--Label: 50% petrified\n\z
|
|
--Petrified Blood 20/40 Alternate1 1\n\z
|
|
--Arrogance 21/200 Alternate1 1\n\z
|
|
--") -- 50% petrified effect, when exactly half of the life is reserved, should make the life pool be equivalent to no petrified effect and full life.
|
|
--build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1])
|
|
--build.configTab.input.customMods = "\z
|
|
--+200 to all resistances\n\z
|
|
--+200 to all maximum resistances\n\z
|
|
--50% reduced damage taken\n\z
|
|
--50% less damage taken\n\z
|
|
--Nearby enemies deal 20% less damage\n\z
|
|
--"
|
|
--build.configTab:BuildModList()
|
|
--runCallback("OnFrame")
|
|
--assert.are.equals(300, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
--assert.are.equals(3000, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
--assert.are.equals(3000, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
--assert.are.equals(3000, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
--assert.are.equals(3000, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
--build.skillsTab.socketGroupList = {}
|
|
--
|
|
--build.skillsTab:PasteSocketGroup("\z
|
|
--Label: 50% petrified\n\z
|
|
--Petrified Blood 20/40 Alternate1 1\n\z
|
|
--Arrogance 21/200 Alternate1 1\n\z
|
|
--")
|
|
--build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1])
|
|
--build.configTab.input.customMods = "\z
|
|
--+200 to all resistances\n\z
|
|
--+200 to all maximum resistances\n\z
|
|
--50% reduced damage taken\n\z
|
|
--50% less damage taken\n\z
|
|
--Nearby enemies deal 20% less damage\n\z
|
|
--100% less intelligence\n\z
|
|
--+60 to maximum energy shield\n\z
|
|
--" -- petrified blood should not interact with pools other than life.
|
|
--build.configTab:BuildModList()
|
|
--runCallback("OnFrame")
|
|
--assert.are.equals(600, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
--assert.are.equals(6000, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
--assert.are.equals(6000, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
--assert.are.equals(6000, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
--assert.are.equals(3000, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
--build.skillsTab.socketGroupList = {}
|
|
--
|
|
--build.skillsTab:PasteSocketGroup("\z
|
|
--Label: 75% petrified\n\z
|
|
--Petrified Blood 20/140 Alternate1 1\n\z
|
|
--") -- 75% petrified effect, starting from full life, should make the life pool be equivalent to 0.5 * life (unprotected upper half) and then 4 * 0.5 * life (protected lower half), making it 2.5* bigger in total
|
|
--build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1])
|
|
--build.configTab.input.customMods = "\z
|
|
--+200 to all resistances\n\z
|
|
--+200 to all maximum resistances\n\z
|
|
--50% reduced damage taken\n\z
|
|
--50% less damage taken\n\z
|
|
--Nearby enemies deal 20% less damage\n\z
|
|
--"
|
|
--build.configTab:BuildModList()
|
|
--runCallback("OnFrame")
|
|
--assert.are.equals(750, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
--assert.are.equals(7500, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
--assert.are.equals(7500, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
--assert.are.equals(7500, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
--assert.are.equals(7500, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
--build.skillsTab.socketGroupList = {}
|
|
|
|
-- Progenesis
|
|
build.configTab.input.customMods = "\z
|
|
+200 to all resistances\n\z
|
|
+200 to all maximum resistances\n\z
|
|
50% reduced damage taken\n\z
|
|
50% less damage taken\n\z
|
|
Nearby enemies deal 20% less damage\n\z
|
|
When Hit during effect, 50% of Life loss from Damage taken occurs over 4 seconds instead\n\z
|
|
" -- 50% progenesis should just simply double the life pool
|
|
build.configTab.input.conditionUsingFlask = true
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(600, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(6000, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(6000, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(6000, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(6000, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+200 to all resistances\n\z
|
|
+200 to all maximum resistances\n\z
|
|
50% reduced damage taken\n\z
|
|
50% less damage taken\n\z
|
|
Nearby enemies deal 20% less damage\n\z
|
|
When Hit during effect, 50% of Life loss from Damage taken occurs over 4 seconds instead\n\z
|
|
100% less intelligence\n\z
|
|
+60 to maximum energy shield\n\z
|
|
" -- progenesis should not interact with pools other than life.
|
|
build.configTab.input.conditionUsingFlask = true
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(900, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(9000, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(9000, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(9000, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(6000, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
-- Progenesis + petrified blood
|
|
--build.skillsTab:PasteSocketGroup("\z
|
|
--Label: 50% petrified\n\z
|
|
--Petrified Blood 20/40 Alternate1 1\n\z
|
|
--Arrogance 21/200 Alternate1 1\n\z
|
|
--")
|
|
--build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1])
|
|
--build.configTab.input.customMods = "\z
|
|
--+200 to all resistances\n\z
|
|
--+200 to all maximum resistances\n\z
|
|
--50% reduced damage taken\n\z
|
|
--50% less damage taken\n\z
|
|
--Nearby enemies deal 20% less damage\n\z
|
|
--When Hit during effect, 50% of Life loss from Damage taken occurs over 4 seconds instead\n\z
|
|
--" -- With half of life reserved, both effects are active and multiplicative with each other, making the effective life pool 4 * half life = 2 * life (or same as no petrified, no reserve and 50% progenesis)
|
|
--build.configTab.input.conditionUsingFlask = true
|
|
--build.configTab:BuildModList()
|
|
--runCallback("OnFrame")
|
|
--assert.are.equals(600, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
--assert.are.equals(6000, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
--assert.are.equals(6000, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
--assert.are.equals(6000, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
--assert.are.equals(6000, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
--build.skillsTab.socketGroupList = {}
|
|
--
|
|
--build.skillsTab:PasteSocketGroup("\z
|
|
--Label: 50% petrified\n\z
|
|
--Petrified Blood 20/40 Alternate1 1\n\z
|
|
--")
|
|
--build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1])
|
|
--build.configTab.input.customMods = "\z
|
|
--+200 to all resistances\n\z
|
|
--+200 to all maximum resistances\n\z
|
|
--50% reduced damage taken\n\z
|
|
--50% less damage taken\n\z
|
|
--Nearby enemies deal 20% less damage\n\z
|
|
--When Hit during effect, 50% of Life loss from Damage taken occurs over 4 seconds instead\n\z
|
|
--" -- With no life reserved, progenesis first doubles the pool of life above low, then both progenesis and petrified quadruple the pool of life below low, so effective pool is 3 * life
|
|
--build.configTab.input.conditionUsingFlask = true
|
|
--build.configTab:BuildModList()
|
|
--runCallback("OnFrame")
|
|
--assert.are.equals(900, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
--assert.are.equals(9000, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
--assert.are.equals(9000, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
--assert.are.equals(9000, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
--assert.are.equals(9000, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
--build.skillsTab.socketGroupList = {}
|
|
|
|
build.skillsTab:PasteSocketGroup("\z
|
|
Petrified Blood 20/0 Default 1\n\z
|
|
")
|
|
build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1])
|
|
build.configTab.input.customMods = "\z
|
|
+200 to all resistances\n\z
|
|
+200 to all maximum resistances\n\z
|
|
50% reduced damage taken\n\z
|
|
50% less damage taken\n\z
|
|
Nearby enemies deal 20% less damage\n\z
|
|
When Hit during effect, 60% of Life loss from Damage taken occurs over 4 seconds instead\n\z
|
|
100% less intelligence\n\z
|
|
+60 to maximum energy shield\n\z
|
|
" -- wonkier numbers to test the pool reduction function
|
|
build.configTab.input.conditionUsingFlask = true
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(1300, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(13000, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(13000, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(13000, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(10000, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
local _, takenDamages = takenHitFromTypeMaxHit("Fire", 0.8)
|
|
local poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
assert.are.equals(0, poolsRemaining.EnergyShield)
|
|
assert.are.equals(0, poolsRemaining.Life)
|
|
assert.are.equals(120, poolsRemaining.LifeLossLostOverTime)
|
|
assert.are.equals(20, poolsRemaining.LifeBelowHalfLossLostOverTime)
|
|
|
|
--build.skillsTab:PasteSocketGroup("\z
|
|
--Label: 50% petrified\n\z
|
|
--Petrified Blood 20/40 Alternate1 1\n\z
|
|
--")
|
|
--build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1])
|
|
--build.configTab.input.customMods = "\z
|
|
--+1950 to life\n\z
|
|
--+2960 to mana\n\z
|
|
--+3000 to energy shield\n\z
|
|
--100% less attributes\n\z
|
|
--100% less mana reserved\n\z
|
|
--+60% to all resistances\n\z
|
|
--chaos damage does not bypass energy shield\n\z
|
|
--mind over matter\n\z
|
|
--eldritch battery\n\z
|
|
--10% of lightning damage is taken from mana before life\n\z
|
|
--chaos damage is taken from mana before life\n\z
|
|
--When Hit during effect, 50% of Life loss from Damage taken occurs over 4 seconds instead\n\z
|
|
--"
|
|
--build.configTab.input.conditionUsingFlask = true
|
|
--build.configTab:BuildModList()
|
|
--runCallback("OnFrame")
|
|
--
|
|
--_, takenDamages = takenHitFromTypeMaxHit("Fire")
|
|
--poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
--assert.are.equals(0, poolsRemaining.Life)
|
|
--assert.are.equals(0, poolsRemaining.EnergyShield)
|
|
--assert.is.not_false(poolsRemaining.Mana > 0)
|
|
--
|
|
--_, takenDamages = takenHitFromTypeMaxHit("Lightning")
|
|
--poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
--assert.are.equals(0, poolsRemaining.Life)
|
|
--assert.are.equals(0, poolsRemaining.EnergyShield)
|
|
--assert.are.equals(0, poolsRemaining.Mana)
|
|
--
|
|
--_, takenDamages = takenHitFromTypeMaxHit("Chaos")
|
|
--poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
--assert.are.equals(0, poolsRemaining.Life)
|
|
--assert.are.equals(0, poolsRemaining.EnergyShield)
|
|
--assert.are.equals(0, poolsRemaining.Mana)
|
|
|
|
build.skillsTab.socketGroupList = {}
|
|
end)
|
|
|
|
-- fun part
|
|
it("armoured max hits", function()
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+10000 to armour\n\z
|
|
" -- hit of 2000 on 10000 armour results in 50% DR which reduces the damage to 1000 - total HP
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Physical"))
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+100000 to armour\n\z
|
|
" -- hit of 5000 on 100000 armour results in 80% DR which reduces the damage to 1000 - total HP
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Physical"))
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+1000000000 to armour\n\z
|
|
" -- 90% DR cap
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Physical"))
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+1000000000 to armour\n\z
|
|
" -- 90% DR cap
|
|
build.configTab.input.enemyPhysicalOverwhelm = 15 -- should result 75% DR
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Physical"))
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ColdMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.LightningMaximumHitTaken)
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+10000 to armour\n\z
|
|
+60% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
" -- with no resistances results should be same as physical
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(1000, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Fire"))
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Cold"))
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Lightning"))
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
" -- max hit should be 4000
|
|
-- [max] [res] [armour] [armour] [max] [res]
|
|
-- 4000 * 0.5 * (1 - 10000 / (10000 + 5 * 4000 * 0.5)) = 1000
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(1000, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Fire"))
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Cold"))
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Lightning"))
|
|
assert.are.equals(625, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
50% less damage taken\n\z
|
|
" -- max hit should be 6472
|
|
-- [max] [res] [armour] [armour] [max] [res] [less]
|
|
-- 6472 * 0.5 * (1 - 10000 / (10000 + 5 * 6472 * 0.5)) * 0.5 = 1000
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(2000, build.calcsTab.calcsOutput.PhysicalMaximumHitTaken)
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Fire"))
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Cold"))
|
|
assert.are.equals(1000, takenHitFromTypeMaxHit("Lightning"))
|
|
assert.are.equals(1250, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
end)
|
|
|
|
local function withinTenPercent(value, otherValue)
|
|
local ratio = otherValue / value
|
|
return 0.9 < ratio and ratio < 1.1
|
|
end
|
|
it("damage conversion max hits", function()
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+200 to all resistances\n\z
|
|
+200 to all maximum resistances\n\z
|
|
50% reduced damage taken\n\z
|
|
50% less damage taken\n\z
|
|
50% of physical damage taken as fire\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.is.not_false(withinTenPercent(1000, takenHitFromTypeMaxHit("Physical")))
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+200 to all resistances\n\z
|
|
+200 to all maximum resistances\n\z
|
|
50% reduced damage taken\n\z
|
|
50% less damage taken\n\z
|
|
50% of physical damage taken as fire\n\z
|
|
50% of cold damage taken as fire\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.is.not_false(withinTenPercent(1000, takenHitFromTypeMaxHit("Physical")))
|
|
assert.is.not_false(withinTenPercent(1000, takenHitFromTypeMaxHit("Cold")))
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
50% of physical damage taken as fire\n\z
|
|
50% of cold damage taken as fire\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.is.not_false(withinTenPercent(1000, takenHitFromTypeMaxHit("Physical")))
|
|
assert.is.not_false(withinTenPercent(1000, takenHitFromTypeMaxHit("Cold")))
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
50% of physical damage taken as fire\n\z
|
|
50% of cold damage taken as fire\n\z
|
|
50% less fire damage taken\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.is.not_false(withinTenPercent(1000, takenHitFromTypeMaxHit("Physical")))
|
|
assert.is.not_false(withinTenPercent(1000, takenHitFromTypeMaxHit("Cold")))
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+940 to maximum life\n\z
|
|
+10000 to armour\n\z
|
|
+110% to fire resistance\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
100% of cold damage taken as fire\n\z
|
|
50% of lightning damage taken as fire\n\z
|
|
50% less fire damage taken\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.is.not_false(withinTenPercent(1000, takenHitFromTypeMaxHit("Physical")))
|
|
assert.is.not_false(withinTenPercent(1000, takenHitFromTypeMaxHit("Cold")))
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+99 to energy shield\n\z
|
|
100% less attributes\n\z
|
|
+60% to all elemental resistances\n\z
|
|
25% of Elemental Damage from Hits taken as Chaos Damage\n\z
|
|
Chaos Inoculation\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
local _, takenDamages = takenHitFromTypeMaxHit("Cold")
|
|
local poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
assert.are.equals(0, round(poolsRemaining.Life))
|
|
end)
|
|
|
|
it("damage conversion to different size pools", function()
|
|
-- conversion into a smaller pool
|
|
build.configTab.input.customMods = "\z
|
|
+40 to maximum life\n\z
|
|
+950 to mana\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
100% of Lightning Damage is taken from Mana before Life\n\z
|
|
10% of lightning damage taken as cold damage\n\z
|
|
" -- Small amount of conversion into a smaller pool leads to the higher pool damage type (lightning) draining it's own excess pool (mana), and then joining back on the shared pools (life)
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
local _, takenDamages = takenHitFromTypeMaxHit("Lightning")
|
|
local poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
assert.are.equals(0, round(poolsRemaining.Mana))
|
|
assert.are.not_false(poolsRemaining.Life / 100 < 0.1)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+40 to maximum life\n\z
|
|
+950 to mana\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
100% of Lightning Damage is taken from Mana before Life\n\z
|
|
20% of lightning damage taken as cold damage\n\z
|
|
" -- This is a case where cold damage drains the whole life pool and lightning damage drains the entire mana pool, leaving nothing
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
_, takenDamages = takenHitFromTypeMaxHit("Lightning")
|
|
poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
assert.are.equals(0, round(poolsRemaining.Life))
|
|
assert.are.equals(0, round(poolsRemaining.Mana))
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+40 to maximum life\n\z
|
|
+1950 to mana\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
100% of Lightning Damage is taken from Mana before Life\n\z
|
|
20% of lightning damage taken as cold damage\n\z
|
|
" -- Any extra mana in this case will not help and be left over after death, since life hits 0 from the cold damage alone
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
_, takenDamages = takenHitFromTypeMaxHit("Lightning")
|
|
poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
assert.are.equals(0, round(poolsRemaining.Life))
|
|
assert.are.equals(1000, round(poolsRemaining.Mana))
|
|
|
|
-- conversion into a bigger pool
|
|
build.configTab.input.customMods = "\z
|
|
+40 to maximum life\n\z
|
|
+950 to mana\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
100% of Lightning Damage is taken from Mana before Life\n\z
|
|
90% of cold damage taken as lightning damage\n\z
|
|
" -- With inverted conversion amounts the behaviour of converting into a bigger pool should be exactly the same as converting into a lower one.
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
_, takenDamages = takenHitFromTypeMaxHit("Cold")
|
|
poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
assert.are.equals(0, round(poolsRemaining.Mana))
|
|
assert.are.not_false(poolsRemaining.Life / 100 < 0.1)
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+40 to maximum life\n\z
|
|
+950 to mana\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
100% of Lightning Damage is taken from Mana before Life\n\z
|
|
80% of cold damage taken as lightning damage\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
_, takenDamages = takenHitFromTypeMaxHit("Cold")
|
|
poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
assert.are.equals(0, round(poolsRemaining.Life))
|
|
assert.are.equals(0, round(poolsRemaining.Mana))
|
|
|
|
build.configTab.input.customMods = "\z
|
|
+40 to maximum life\n\z
|
|
+1950 to mana\n\z
|
|
+10000 to armour\n\z
|
|
+110% to all elemental resistances\n\z
|
|
Armour applies to Fire, Cold and Lightning Damage taken from Hits instead of Physical Damage\n\z
|
|
100% of Lightning Damage is taken from Mana before Life\n\z
|
|
80% of cold damage taken as lightning damage\n\z
|
|
"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
_, takenDamages = takenHitFromTypeMaxHit("Cold")
|
|
poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, takenDamages, build.calcsTab.calcsEnv.player)
|
|
assert.are.equals(0, round(poolsRemaining.Life))
|
|
assert.are.equals(1000, round(poolsRemaining.Mana))
|
|
end)
|
|
|
|
it("energy shield bypass tests #pet", function()
|
|
-- Mastery
|
|
build.configTab.input.customMods = [[
|
|
+40 to maximum life
|
|
+200 to energy shield
|
|
50% of chaos damage taken does not bypass energy shield
|
|
You have no intelligence
|
|
+60% to all resistances
|
|
]]
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(300, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(200, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
-- Negative overrides positive
|
|
build.configTab.input.customMods = [[
|
|
+40 to maximum life
|
|
+100 to energy shield
|
|
Chaos damage does not bypass energy shield
|
|
You have no intelligence
|
|
+60% to all resistances
|
|
]]
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(200, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(200, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
-- Chaos damage should still bypass
|
|
build.configTab.input.customMods = build.configTab.input.customMods .. "\nAll damage taken bypasses energy shield"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(100, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(100, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
|
|
-- Make sure we can't reach over 100% bypass
|
|
build.configTab.input.customMods = [[
|
|
+40 to maximum life
|
|
+100 to energy shield
|
|
Chaos damage does not bypass energy shield
|
|
50% of chaos damage taken does not bypass energy shield
|
|
You have no intelligence
|
|
+60% to all resistances
|
|
]]
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(200, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(200, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
-- Chaos damage should still bypass
|
|
build.configTab.input.customMods = build.configTab.input.customMods .. "\nAll damage taken bypasses energy shield"
|
|
build.configTab:BuildModList()
|
|
runCallback("OnFrame")
|
|
assert.are.equals(100, build.calcsTab.calcsOutput.FireMaximumHitTaken)
|
|
assert.are.equals(100, build.calcsTab.calcsOutput.ChaosMaximumHitTaken)
|
|
end)
|
|
end) |