Skip to content

Commit f6c4271

Browse files
committed
Properly apply both duration and damaging ailment duration separately
Swift Affliction less duration and less damaging ailment duration do not applies only once, but applies separately. Testable on Viper Strike of the Mamba in game for example Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
1 parent e392284 commit f6c4271

3 files changed

Lines changed: 21 additions & 20 deletions

File tree

src/Data/SkillStatMap.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,8 @@ return {
654654
mod("FortifyDuration", "INC", nil),
655655
},
656656
["support_swift_affliction_skill_effect_and_damaging_ailment_duration_+%_final"] = {
657-
mod("SkillAndDamagingAilmentDuration", "MORE", nil),
657+
mod("Duration", "MORE", nil),
658+
mod("DamagingAilmentDuration", "MORE", nil),
658659
},
659660
["base_bleed_duration_+%"] = {
660661
mod("EnemyBleedDuration", "INC", nil),

src/Modules/CalcOffence.lua

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ local function calcWarcryCastTime(skillModList, skillCfg, skillData, actor)
289289
end
290290

291291
function calcSkillDuration(skillModList, skillCfg, skillData, env, enemyDB)
292-
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
292+
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
293293
durationMod = m_max(durationMod, 0)
294294
local durationBase = (skillData.duration or 0) + skillModList:Sum("BASE", skillCfg, "Duration", "PrimaryDuration")
295295
local duration = durationBase * durationMod
@@ -1395,10 +1395,10 @@ function calcs.offence(env, actor, activeSkill)
13951395
debuffDurationMult = 1 / m_max(data.misc.BuffExpirationSlowCap, calcLib.mod(enemyDB, skillCfg, "BuffExpireFaster"))
13961396
end
13971397
do
1398-
output.DurationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
1398+
output.DurationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
13991399
output.DurationMod = m_max(output.DurationMod, 0)
14001400
if breakdown then
1401-
breakdown.DurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
1401+
breakdown.DurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
14021402
if breakdown.DurationMod and skillData.durationSecondary then
14031403
t_insert(breakdown.DurationMod, 1, "Primary duration:")
14041404
end
@@ -1426,15 +1426,15 @@ function calcs.offence(env, actor, activeSkill)
14261426
end
14271427
durationBase = (skillData.durationSecondary or 0) + skillModList:Sum("BASE", skillCfg, "Duration", "SecondaryDuration")
14281428
if durationBase > 0 then
1429-
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "SecondaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
1429+
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "SecondaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
14301430
durationMod = m_max(durationMod, 0)
14311431
output.DurationSecondary = durationBase * durationMod
14321432
if skillData.debuffSecondary then
14331433
output.DurationSecondary = output.DurationSecondary * debuffDurationMult
14341434
end
14351435
output.DurationSecondary = m_ceil(output.DurationSecondary * data.misc.ServerTickRate) / data.misc.ServerTickRate
14361436
if breakdown and output.DurationSecondary ~= durationBase then
1437-
breakdown.SecondaryDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "SecondaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
1437+
breakdown.SecondaryDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "SecondaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
14381438
if breakdown.SecondaryDurationMod then
14391439
t_insert(breakdown.SecondaryDurationMod, 1, "Secondary duration:")
14401440
end
@@ -1453,15 +1453,15 @@ function calcs.offence(env, actor, activeSkill)
14531453
end
14541454
durationBase = (skillData.durationTertiary or 0) + skillModList:Sum("BASE", skillCfg, "Duration", "TertiaryDuration")
14551455
if durationBase > 0 then
1456-
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "TertiaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
1456+
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "TertiaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
14571457
durationMod = m_max(durationMod, 0)
14581458
output.DurationTertiary = durationBase * durationMod
14591459
if skillData.debuffTertiary then
14601460
output.DurationTertiary = output.DurationTertiary * debuffDurationMult
14611461
end
14621462
output.DurationTertiary = m_ceil(output.DurationTertiary * data.misc.ServerTickRate) / data.misc.ServerTickRate
14631463
if breakdown and output.DurationTertiary ~= durationBase then
1464-
breakdown.TertiaryDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "TertiaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
1464+
breakdown.TertiaryDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "TertiaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
14651465
if breakdown.TertiaryDurationMod then
14661466
t_insert(breakdown.TertiaryDurationMod, 1, "Tertiary duration:")
14671467
end
@@ -1480,7 +1480,7 @@ function calcs.offence(env, actor, activeSkill)
14801480
end
14811481
durationBase = (skillData.auraDuration or 0)
14821482
if durationBase > 0 then
1483-
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "SkillAndDamagingAilmentDuration")
1483+
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration")
14841484
durationMod = m_max(durationMod, 0)
14851485
output.AuraDuration = durationBase * durationMod
14861486
output.AuraDuration = m_ceil(output.AuraDuration * data.misc.ServerTickRate) / data.misc.ServerTickRate
@@ -1495,7 +1495,7 @@ function calcs.offence(env, actor, activeSkill)
14951495
end
14961496
durationBase = (skillData.reserveDuration or 0)
14971497
if durationBase > 0 then
1498-
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "SkillAndDamagingAilmentDuration")
1498+
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration")
14991499
durationMod = m_max(durationMod, 0)
15001500
output.ReserveDuration = durationBase * durationMod
15011501
output.ReserveDuration = m_ceil(output.ReserveDuration * data.misc.ServerTickRate) / data.misc.ServerTickRate
@@ -1510,7 +1510,7 @@ function calcs.offence(env, actor, activeSkill)
15101510
end
15111511
durationBase = (skillData.soulPreventionDuration or 0)
15121512
if durationBase > 0 then
1513-
local durationMod = calcLib.mod(skillModList, skillCfg, "SoulGainPreventionDuration", skillData.skillEffectAppliesToSoulGainPrevention and "Duration" or "SkillAndDamagingAilmentDuration" or nil, skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
1513+
local durationMod = calcLib.mod(skillModList, skillCfg, "SoulGainPreventionDuration", skillData.skillEffectAppliesToSoulGainPrevention and "Duration" or nil, skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
15141514
durationMod = m_max(durationMod, 0)
15151515
output.SoulGainPreventionDuration = durationBase * durationMod
15161516
output.SoulGainPreventionDuration = m_max(m_ceil(output.SoulGainPreventionDuration * data.misc.ServerTickRate), 1) / data.misc.ServerTickRate
@@ -2140,7 +2140,7 @@ function calcs.offence(env, actor, activeSkill)
21402140
--Calculates the max number of trauma stacks you can sustain
21412141
if skillModList:Flag(nil, "HasTrauma") then
21422142
local effectiveAttackRateCap = data.misc.ServerTickRate * output.Repeats
2143-
local duration = skillModList:Sum("BASE", cfg, "TraumaDuration") * calcLib.mod(skillModList, skillCfg, "Duration", "SkillAndDamagingAilmentDuration")
2143+
local duration = skillModList:Sum("BASE", cfg, "TraumaDuration") * calcLib.mod(skillModList, skillCfg, "Duration")
21442144
local traumaPerAttack = 1 + m_min(skillModList:Sum("BASE", cfg, "ExtraTrauma"), 100) / 100
21452145
local incAttackSpeedPerTrauma = skillModList:Sum("INC", skillCfg, "SpeedPerTrauma")
21462146
-- compute trauma using an exact form.
@@ -3974,7 +3974,7 @@ function calcs.offence(env, actor, activeSkill)
39743974
local overrideStackPotential = skillModList:Override(nil, "BleedStackPotentialOverride") and skillModList:Override(nil, "BleedStackPotentialOverride") / maxStacks
39753975
globalOutput.BleedStacksMax = maxStacks
39763976
local durationBase = skillData.bleedDurationIsSkillDuration and skillData.duration or data.misc.BleedDurationBase
3977-
local durationMod = calcLib.mod(skillModList, dotCfg, "EnemyBleedDuration", "EnemyAilmentDuration", "SkillAndDamagingAilmentDuration", skillData.bleedIsSkillEffect and "Duration" or nil) * calcLib.mod(enemyDB, nil, "SelfBleedDuration", "SelfAilmentDuration") / calcLib.mod(enemyDB, dotCfg, "BleedExpireRate")
3977+
local durationMod = calcLib.mod(skillModList, dotCfg, "EnemyBleedDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", skillData.bleedIsSkillEffect and "Duration" or nil) * calcLib.mod(enemyDB, nil, "SelfBleedDuration", "SelfAilmentDuration") / calcLib.mod(enemyDB, dotCfg, "BleedExpireRate")
39783978
durationMod = m_max(durationMod, 0)
39793979
local rateMod = calcLib.mod(skillModList, cfg, "BleedFaster") + enemyDB:Sum("INC", nil, "SelfBleedFaster") / 100
39803980
globalOutput.BleedDuration = durationBase * durationMod / rateMod * debuffDurationMult
@@ -4247,7 +4247,7 @@ function calcs.offence(env, actor, activeSkill)
42474247
else
42484248
durationBase = data.misc.PoisonDurationBase
42494249
end
4250-
local durationMod = calcLib.mod(skillModList, dotCfg, "EnemyPoisonDuration", "EnemyAilmentDuration", "SkillAndDamagingAilmentDuration", skillData.poisonIsSkillEffect and "Duration" or nil) * calcLib.mod(enemyDB, nil, "SelfPoisonDuration", "SelfAilmentDuration")
4250+
local durationMod = calcLib.mod(skillModList, dotCfg, "EnemyPoisonDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", skillData.poisonIsSkillEffect and "Duration" or nil) * calcLib.mod(enemyDB, nil, "SelfPoisonDuration", "SelfAilmentDuration")
42514251
durationMod = m_max(durationMod, 0)
42524252
globalOutput.PoisonDuration = durationBase * durationMod / rateMod * debuffDurationMult
42534253
-- The chance any given hit applies poison
@@ -4527,7 +4527,7 @@ function calcs.offence(env, actor, activeSkill)
45274527

45284528
local rateMod = (calcLib.mod(skillModList, cfg, "IgniteBurnFaster") + enemyDB:Sum("INC", nil, "SelfIgniteBurnFaster") / 100) / calcLib.mod(skillModList, cfg, "IgniteBurnSlower")
45294529
local durationBase = data.misc.IgniteDurationBase
4530-
local durationMod = m_max(calcLib.mod(skillModList, dotCfg, "EnemyIgniteDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration", "SkillAndDamagingAilmentDuration") * calcLib.mod(enemyDB, nil, "SelfIgniteDuration", "SelfAilmentDuration", "SelfElementalAilmentDuration"), 0)
4530+
local durationMod = m_max(calcLib.mod(skillModList, dotCfg, "EnemyIgniteDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration", "DamagingAilmentDuration") * calcLib.mod(enemyDB, nil, "SelfIgniteDuration", "SelfAilmentDuration", "SelfElementalAilmentDuration"), 0)
45314531
durationMod = m_max(durationMod, 0)
45324532
globalOutput.IgniteDuration = durationBase * durationMod / rateMod * debuffDurationMult
45334533
-- The chance any given hit applies ignite

src/Modules/CalcSections.lua

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ return {
637637
{ breakdown = "DurationMod" },
638638
{ breakdown = "SecondaryDurationMod" },
639639
{ breakdown = "TertiaryDurationMod" },
640-
{ modName = { "Duration", "PrimaryDuration", "SecondaryDuration", "TertiaryDuration", "SkillAndDamagingAilmentDuration" }, cfg = "skill" },
640+
{ modName = { "Duration", "PrimaryDuration", "SecondaryDuration", "TertiaryDuration" }, cfg = "skill" },
641641
}, },
642642
{ label = "Skill Duration", flag = "duration", haveOutput = "Duration", { format = "{3:output:Duration}s", { breakdown = "Duration" }, }, },
643643
{ label = "Secondary Duration", flag = "duration", haveOutput = "DurationSecondary", { format = "{3:output:DurationSecondary}s", { breakdown = "DurationSecondary" }, }, },
@@ -650,7 +650,7 @@ return {
650650
{ label = "Tertiary Uptime", haveOutput = "DurationTertiaryUptime", { format = "{2:output:DurationTertiaryUptime}%", { breakdown = "DurationTertiaryUptime" }, }, },
651651
{ label = "Aura Uptime", haveOutput = "AuraDurationUptime", { format = "{2:output:AuraDurationUptime}%", { breakdown = "AuraDurationUptime" }, }, },
652652
{ label = "Reserve Uptime", haveOutput = "ReserveDurationUptime", { format = "{2:output:ReserveDurationUptime}%", { breakdown = "ReserveDurationUptime" }, }, },
653-
{ label = "Sustainable Trauma", haveOutput = "SustainableTrauma", { format = "{0:output:SustainableTrauma}", { breakdown = "SustainableTrauma" }, { modName = { "ExtraTrauma", "RepeatCount", "Duration", "PrimaryDuration", "SecondaryDuration", "SkillAndDamagingAilmentDuration"}, cfg = "skill" }, }, },
653+
{ label = "Sustainable Trauma", haveOutput = "SustainableTrauma", { format = "{0:output:SustainableTrauma}", { breakdown = "SustainableTrauma" }, { modName = { "ExtraTrauma", "RepeatCount", "Duration", "PrimaryDuration", "SecondaryDuration"}, cfg = "skill" }, }, },
654654
{ label = "Repeat Count", haveOutput = "RepeatCount", { format = "{output:Repeats}", { modName = { "RepeatCount" }, cfg = "skill" }, }, },
655655
{ label = "Projectile Count", flag = "projectile", { format = "{output:ProjectileCount}", { modName = { "NoAdditionalProjectiles" , "ProjectileCount", "ProjectileCountMinimum" }, cfg = "skill" }, }, },
656656
{ label = "Pierce Count", haveOutput = "PierceCount", { format = "{output:PierceCountString}", { modName = { "CannotPierce", "PierceCount", "PierceAllTargets" }, cfg = "skill" }, }, },
@@ -884,7 +884,7 @@ return {
884884
{ label = "Bleed DPS", { format = "{1:output:BleedDPS}", { breakdown = "BleedDPS" }, { breakdown = "MainHand.BleedDPS" }, { breakdown = "OffHand.BleedDPS" }, }, },
885885
{ label = "Bleed Duration", { format = "{2:output:BleedDuration}s",
886886
{ breakdown = "BleedDuration" },
887-
{ label = "Player modifiers", modName = { "EnemyBleedDuration", "EnemyAilmentDuration", "SkillAndDamagingAilmentDuration", "BleedFaster" }, cfg = "bleed" },
887+
{ label = "Player modifiers", modName = { "EnemyBleedDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", "BleedFaster" }, cfg = "bleed" },
888888
{ label = "Enemy modifiers", modName = { "SelfBleedDuration", "SelfAilmentDuration", "SelfBleedFaster", "BleedExpireRate" }, enemy = true },
889889
}, },
890890
} }
@@ -937,7 +937,7 @@ return {
937937
}, },
938938
{ label = "Poison Duration", { format = "{2:output:PoisonDuration}s",
939939
{ breakdown = "PoisonDuration" },
940-
{ label = "Player modifiers", modName = { "EnemyPoisonDuration", "EnemyAilmentDuration", "SkillAndDamagingAilmentDuration", "PoisonFaster" }, cfg = "poison" },
940+
{ label = "Player modifiers", modName = { "EnemyPoisonDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", "PoisonFaster" }, cfg = "poison" },
941941
{ label = "Enemy modifiers", modName = { "SelfPoisonDuration", "SelfAilmentDuration", "SelfPoisonFaster" }, enemy = true },
942942
}, },
943943
{ label = "Dmg. per Poison", { format = "{1:output:PoisonDamage}",
@@ -1002,7 +1002,7 @@ return {
10021002
{ label = "Burning Ground", haveOutput = "BurningGroundFromIgnite", { format = "{0:output:BurningGroundDPS}", { breakdown = "BurningGroundDPS" } } },
10031003
{ label = "Ignite Duration", { format = "{2:output:IgniteDuration}s",
10041004
{ breakdown = "IgniteDuration" },
1005-
{ label = "Player modifiers", modName = { "EnemyIgniteDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration", "SkillAndDamagingAilmentDuration", "IgniteBurnFaster", "IgniteBurnSlower" }, cfg = "skill" },
1005+
{ label = "Player modifiers", modName = { "EnemyIgniteDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration", "DamagingAilmentDuration", "IgniteBurnFaster", "IgniteBurnSlower" }, cfg = "skill" },
10061006
{ label = "Enemy modifiers", modName = {"SelfIgniteDuration", "SelfAilmentDuration", "SelfElementalAilmentDuration", "SelfIgniteBurnFaster"}, enemy = true },
10071007
}, },
10081008
{ label = "Dmg. per Ignite", { format = "{1:output:IgniteDamage}",

0 commit comments

Comments
 (0)