Skip to content

Commit d0699da

Browse files
authored
fix negative impale dps for dual wield simultaneous attacks (#8554)
1 parent 1894a04 commit d0699da

File tree

2 files changed

+75
-15
lines changed

2 files changed

+75
-15
lines changed

spec/System/TestImpale_spec.lua

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,4 +284,45 @@ describe("TestAttacks", function()
284284
assert.are.near(120*1.3, build.calcsTab.mainOutput.ImpaleDPS, 0.0000001) -- 6 impales * 10% stored damage * 1.3 attacks per second
285285
end)
286286

287+
it("impale dual wield simultaneous attack", function()
288+
newBuild()
289+
build.skillsTab:PasteSocketGroup("Cleave 20/0 Default 1\n")
290+
-- exactly 100
291+
build.itemsTab:CreateDisplayItemFromRaw("New Item\nVaal Blade\nQuality: 0\nAdds 54 to 14 physical damage\n50% chance to Impale Enemies on Hit with Attacks")
292+
build.itemsTab:AddDisplayItem()
293+
-- exactly 200 offhand
294+
build.itemsTab:CreateDisplayItemFromRaw("New Item\nVaal Blade\nQuality: 0\nAdds 54 to 14 physical damage\n100% increased Physical Damage\n50% chance to Impale Enemies on Hit with Attacks")
295+
build.itemsTab:AddDisplayItem()
296+
build.itemsTab:CreateDisplayItemFromRaw("New Item\nPaua Amulet\nYour hits can't be evaded\n-20 strength\n")
297+
build.itemsTab:AddDisplayItem()
298+
299+
-- 0% crit
300+
build.configTab.input.customMods = "\z
301+
never deal critical strikes\n\z
302+
Impale Damage dealt to Enemies Impaled by you Overwhelms 100% Physical Damage Reduction\n\z
303+
Overwhelm 100% physical damage reduction\n\z
304+
"
305+
build.configTab:BuildModList()
306+
runCallback("OnFrame")
307+
308+
assert.are.equals(50, build.calcsTab.mainOutput.MainHand.ImpaleChance)
309+
assert.are.equals(50, build.calcsTab.mainOutput.OffHand.ImpaleChance)
310+
assert.are.equals(50, build.calcsTab.mainOutput.MainHand.ImpaleChanceOnCrit)
311+
assert.are.equals(50, build.calcsTab.mainOutput.OffHand.ImpaleChanceOnCrit)
312+
313+
-- level 20 cleave (currently) has 511.2% damage effectiveness and a 40% less modifier for combined attacks
314+
-- things get rounded in the calc tab so there's some margin
315+
assert.are.near(5.112*100*0.6, build.calcsTab.mainOutput.MainHand.PhysicalHitAverage, 1)
316+
assert.are.near(5.112*200*0.6, build.calcsTab.mainOutput.OffHand.PhysicalHitAverage, 1)
317+
assert.are.near(5.112*100*0.6, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg, 1)
318+
assert.are.near(5.112*200*0.6, build.calcsTab.mainOutput.OffHand.impaleStoredHitAvg, 1)
319+
-- 5 impales * 10% stored damage * 50% impale chance
320+
assert.are.equals(1+(5*0.1*0.5), build.calcsTab.mainOutput.MainHand.ImpaleModifier)
321+
assert.are.equals(1+(5*0.1*0.5), build.calcsTab.mainOutput.OffHand.ImpaleModifier)
322+
323+
-- stored damage * 0.25 impale modifier * 1.3 attacks per second * 0.8 cleave modifier * 1.1 dual wield modifier
324+
assert.are.near(300*5.112*0.6*0.25*1.3*0.8*1.1, build.calcsTab.mainOutput.ImpaleDPS, 0.1)
325+
326+
end)
327+
287328
end)

src/Modules/CalcOffence.lua

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5553,11 +5553,15 @@ function calcs.offence(env, actor, activeSkill)
55535553
output.WithBleedDPS = baseDPS
55545554
end
55555555
if skillFlags.impale then
5556+
local mainHandImpaleDPS, offHandImpaleDPS
55565557
if skillFlags.attack and skillData.doubleHitsWhenDualWielding and skillFlags.bothWeaponAttack then
5557-
-- due to how its being combined
5558-
output.ImpaleModifier = output.ImpaleModifier / 2
5558+
-- separately combine
5559+
mainHandImpaleDPS = output.MainHand.impaleStoredHitAvg * ((output.MainHand.ImpaleModifier or 1) - 1) * output.MainHand.HitChance / 100 * skillData.dpsMultiplier
5560+
offHandImpaleDPS = output.OffHand.impaleStoredHitAvg * ((output.OffHand.ImpaleModifier or 1) - 1) * output.OffHand.HitChance / 100 * skillData.dpsMultiplier
5561+
output.ImpaleDPS = mainHandImpaleDPS + offHandImpaleDPS
5562+
else
5563+
output.ImpaleDPS = output.impaleStoredHitAvg * ((output.ImpaleModifier or 1) - 1) * output.HitChance / 100 * skillData.dpsMultiplier
55595564
end
5560-
output.ImpaleDPS = output.impaleStoredHitAvg * ((output.ImpaleModifier or 1) - 1) * output.HitChance / 100 * skillData.dpsMultiplier
55615565
if skillData.showAverage then
55625566
output.WithImpaleDPS = output.AverageDamage + output.ImpaleDPS
55635567
output.CombinedAvg = output.CombinedAvg + output.ImpaleDPS
@@ -5572,19 +5576,34 @@ function calcs.offence(env, actor, activeSkill)
55725576
output.CombinedDPS = output.CombinedDPS + output.ImpaleDPS
55735577
if breakdown then
55745578
breakdown.ImpaleDPS = {}
5575-
t_insert(breakdown.ImpaleDPS, s_format("%.2f ^8(average physical hit before mitigation)", output.impaleStoredHitAvg))
5576-
t_insert(breakdown.ImpaleDPS, s_format("x %.2f ^8(chance to hit)", output.HitChance / 100))
5577-
if skillFlags.notAverage then
5578-
t_insert(breakdown.ImpaleDPS, output.HitSpeed and s_format("x %.2f ^8(hit rate)", output.HitSpeed) or s_format("x %.2f ^8(%s rate)", output.Speed, skillFlags.attack and "attack" or "cast"))
5579-
end
5580-
t_insert(breakdown.ImpaleDPS, s_format("x %.2f ^8(impale damage multiplier)", ((output.ImpaleModifier or 1) - 1)))
5581-
if skillData.dpsMultiplier ~= 1 then
5582-
t_insert(breakdown.ImpaleDPS, s_format("x %g ^8(dps multiplier for this skill)", skillData.dpsMultiplier))
5583-
end
5584-
if quantityMultiplier > 1 then
5585-
t_insert(breakdown.ImpaleDPS, s_format("x %g ^8(quantity multiplier for this skill)", quantityMultiplier))
5579+
if skillFlags.attack and skillData.doubleHitsWhenDualWielding and skillFlags.bothWeaponAttack then
5580+
t_insert(breakdown.ImpaleDPS, s_format("Main Hand:"))
5581+
t_insert(breakdown.ImpaleDPS, s_format("%.2f ^8(MH average physical hit before mitigation)", output.MainHand.impaleStoredHitAvg))
5582+
t_insert(breakdown.ImpaleDPS, s_format("x %.2f ^8(MH chance to hit)", output.MainHand.HitChance / 100))
5583+
t_insert(breakdown.ImpaleDPS, s_format("x %.2f ^8(MH impale damage multiplier)\n", ((output.MainHand.ImpaleModifier or 1) - 1)))
5584+
t_insert(breakdown.ImpaleDPS, s_format("= %.2f", mainHandImpaleDPS))
5585+
t_insert(breakdown.ImpaleDPS, s_format("Off Hand:"))
5586+
t_insert(breakdown.ImpaleDPS, s_format("%.2f ^8(OH average physical hit before mitigation)", output.OffHand.impaleStoredHitAvg))
5587+
t_insert(breakdown.ImpaleDPS, s_format("x %.2f ^8(OH chance to hit)", output.OffHand.HitChance / 100))
5588+
t_insert(breakdown.ImpaleDPS, s_format("x %.2f ^8(OH impale damage multiplier)", ((output.OffHand.ImpaleModifier or 1) - 1)))
5589+
t_insert(breakdown.ImpaleDPS, s_format("= %.2f", offHandImpaleDPS))
5590+
t_insert(breakdown.ImpaleDPS, s_format("Combined total:"))
5591+
t_insert(breakdown.ImpaleDPS, s_format("%.2f + %.2f", mainHandImpaleDPS, offHandImpaleDPS))
5592+
else
5593+
t_insert(breakdown.ImpaleDPS, s_format("%.2f ^8(average physical hit before mitigation)", output.impaleStoredHitAvg))
5594+
t_insert(breakdown.ImpaleDPS, s_format("x %.2f ^8(chance to hit)", output.HitChance / 100))
5595+
t_insert(breakdown.ImpaleDPS, s_format("x %.2f ^8(impale damage multiplier)", ((output.ImpaleModifier or 1) - 1)))
55865596
end
5587-
t_insert(breakdown.ImpaleDPS, s_format("= %.1f", output.ImpaleDPS))
5597+
if skillFlags.notAverage then
5598+
t_insert(breakdown.ImpaleDPS, output.HitSpeed and s_format("x %.2f ^8(hit rate)", output.HitSpeed) or s_format("x %.2f ^8(%s rate)", output.Speed, skillFlags.attack and "attack" or "cast"))
5599+
end
5600+
if skillData.dpsMultiplier ~= 1 then
5601+
t_insert(breakdown.ImpaleDPS, s_format("x %g ^8(dps multiplier for this skill)", skillData.dpsMultiplier))
5602+
end
5603+
if quantityMultiplier > 1 then
5604+
t_insert(breakdown.ImpaleDPS, s_format("x %g ^8(quantity multiplier for this skill)", quantityMultiplier))
5605+
end
5606+
t_insert(breakdown.ImpaleDPS, s_format("= %.1f", output.ImpaleDPS))
55885607
end
55895608
end
55905609

0 commit comments

Comments
 (0)