Skip to content

Commit a9b1dfa

Browse files
author
LocalIdentity
committed
Simplify calc and add test
1 parent ad95d2d commit a9b1dfa

2 files changed

Lines changed: 33 additions & 39 deletions

File tree

spec/System/TestSkills_spec.lua

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,23 @@ describe("TestSkills", function()
9494
assert.True(build.calcsTab.mainOutput.SpiritReservedPercent > oneCurseReservation)
9595
end)
9696

97+
it("applies life reservation efficiency to Atziri's Communion Blasphemy reservation", function()
98+
build.skillsTab:PasteSocketGroup("Blasphemy 20/0 1\nDespair 20/0 1\nAtziri's Communion 1/0 1\n")
99+
runCallback("OnFrame")
100+
101+
assert.are.equals(0, build.calcsTab.mainOutput.SpiritReserved)
102+
assert.are.equals(0, build.calcsTab.mainOutput.SpiritReservedPercent)
103+
assert.are.equals(26, build.calcsTab.mainOutput.LifeReserved)
104+
assert.are.equals(40, build.calcsTab.mainOutput.LifeReservedPercent)
105+
106+
build.configTab.input.customMods = "100% increased Life Reservation Efficiency"
107+
build.configTab:BuildModList()
108+
runCallback("OnFrame")
109+
110+
assert.are.equals(13, build.calcsTab.mainOutput.LifeReserved)
111+
assert.are.equals(20, build.calcsTab.mainOutput.LifeReservedPercent)
112+
end)
113+
97114
it("applies active skill reservation multiplier to linked buff spirit reservation", function()
98115
build.skillsTab:PasteSocketGroup("Purity of Fire 20/0 1\nVitality II 1/0 1\n")
99116
runCallback("OnFrame")

src/Modules/CalcDefence.lua

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,16 @@ function calcs.doActorLifeManaSpiritReservation(actor)
225225
pool.Life.baseFlat = skillModList:Sum("BASE", skillCfg, "LifeCostBase") + (activeSkill.activeEffect.grantedEffectLevel.cost.Life or 0)
226226
end
227227
pool.Life.basePercent = activeSkill.skillData.lifeReservationPercent or activeSkill.activeEffect.grantedEffectLevel.lifeReservationPercent or 0
228+
if activeSkill.skillTypes[SkillType.IsBlasphemy] and activeSkill.activeEffect.srcInstance.supportEffect and activeSkill.activeEffect.srcInstance.supportEffect.isSupporting then
229+
-- Sadly no better way to get key/val table element count in lua.
230+
local instances = 0
231+
for _ in pairs(activeSkill.activeEffect.srcInstance.supportEffect.isSupporting) do
232+
instances = instances + 1
233+
end
234+
for name, values in pairs(pool) do
235+
values.baseFlat = values.baseFlat + (activeSkill.skillData["blasphemyReservationFlat" .. name] or 0) * instances
236+
end
237+
end
228238
if skillModList:Flag(skillCfg, "BloodMagicReserved") then
229239
pool.Life.baseFlat = pool.Life.baseFlat + pool.Mana.baseFlat
230240
pool.Mana.baseFlat = 0
@@ -235,14 +245,12 @@ function calcs.doActorLifeManaSpiritReservation(actor)
235245
activeSkill.skillData["LifeReservationPercentForced"] = activeSkill.skillData["ManaReservationPercentForced"]
236246
activeSkill.skillData["ManaReservationPercentForced"] = nil
237247
end
238-
do
239-
local lifePerSpirit = skillModList:Sum("BASE", skillCfg, "LifeReservePercentPerSpirit")
240-
if lifePerSpirit > 0 then
241-
pool.Life.basePercent = pool.Life.basePercent + pool.Spirit.baseFlat * lifePerSpirit
242-
pool.Spirit.baseFlat = 0
243-
pool.Life.basePercent = pool.Life.basePercent + pool.Spirit.basePercent * lifePerSpirit
244-
pool.Spirit.basePercent = 0
245-
end
248+
local spiritToLifeReservation = skillModList:Sum("BASE", skillCfg, "LifeReservePercentPerSpirit")
249+
if spiritToLifeReservation > 0 then
250+
pool.Life.basePercent = pool.Life.basePercent + pool.Spirit.baseFlat * spiritToLifeReservation
251+
pool.Spirit.baseFlat = 0
252+
pool.Life.basePercent = pool.Life.basePercent + pool.Spirit.basePercent * spiritToLifeReservation
253+
pool.Spirit.basePercent = 0
246254
end
247255
for name, values in pairs(pool) do
248256
values.more = skillModList:More(skillCfg, name.."Reserved", "Reserved")
@@ -278,37 +286,6 @@ function calcs.doActorLifeManaSpiritReservation(actor)
278286
values.count = activeSkillCount
279287
local minionFreeSpiritCount = skillModList:Sum("BASE", skillCfg, "MinionFreeSpiritCount")
280288
values.reservedFlat = values.reservedFlat * m_max(activeSkillCount - minionFreeSpiritCount, 0)
281-
end
282-
if activeSkill.skillTypes[SkillType.IsBlasphemy] and activeSkill.activeEffect.srcInstance.supportEffect and activeSkill.activeEffect.srcInstance.supportEffect.isSupporting and activeSkill.skillData["blasphemyReservationFlat" .. name] then
283-
-- Sadly no better way to get key/val table element count in lua.
284-
local instances = 0
285-
for _ in pairs(activeSkill.activeEffect.srcInstance.supportEffect.isSupporting) do
286-
instances = instances + 1
287-
end
288-
289-
-- Extra reservation of blasphemy needs to be separated from the reservation caused by curses
290-
local blasphemyFlat = activeSkill.skillData["blasphemyReservationFlat" .. name]
291-
local blasphemyEffectiveFlat = m_max(round(blasphemyFlat * mult * (100 + values.inc) / 100 * values.more / (1 + values.efficiency / 100) / values.efficiencyMore, 0), 0)
292-
local lifePerSpirit = skillModList:Sum("BASE", skillCfg, "LifeReservePercentPerSpirit")
293-
if name == "Spirit" and lifePerSpirit > 0 then
294-
local lifeBasePercent = blasphemyFlat * instances * lifePerSpirit
295-
local lifeEffectivePercent = m_max(round(lifeBasePercent * mult * (100 + values.inc) / 100 * values.more / (1 + values.efficiency / 100) / values.efficiencyMore, 2), 0)
296-
actor["reserved_LifePercent"] = actor["reserved_LifePercent"] + lifeEffectivePercent
297-
if breakdown then
298-
t_insert(breakdown["LifeReserved"].reservations, {
299-
skillName = activeSkill.activeEffect.grantedEffect.name,
300-
base = lifeBasePercent .. "%",
301-
mult = mult ~= 1 and ("x "..mult),
302-
more = values.more ~= 1 and ("x "..values.more),
303-
inc = values.inc ~= 0 and ("x "..(1 + values.inc / 100)),
304-
efficiency = values.efficiency ~= 0 and ("x " .. round(100 / (100 + values.efficiency), 4)),
305-
efficiencyMore = values.efficiencyMore ~= 1 and ("x "..values.efficiencyMore),
306-
total = lifeEffectivePercent .. "%",
307-
})
308-
end
309-
else
310-
values.reservedFlat = values.reservedFlat + blasphemyEffectiveFlat * instances
311-
end
312289
end
313290
-- Blood Sacrament increases reservation per stage channelled
314291
if activeSkill.skillCfg.skillName == "Blood Sacrament" and activeSkill.activeStageCount then

0 commit comments

Comments
 (0)