Properly apply both duration and damaging ailment duration separately (#8754)

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>
This commit is contained in:
Tomas Slusny
2025-06-30 09:09:25 +02:00
committed by GitHub
parent 7e5dd946ce
commit 71ce8fa34f
3 changed files with 21 additions and 20 deletions

View File

@@ -654,7 +654,8 @@ return {
mod("FortifyDuration", "INC", nil),
},
["support_swift_affliction_skill_effect_and_damaging_ailment_duration_+%_final"] = {
mod("SkillAndDamagingAilmentDuration", "MORE", nil),
mod("Duration", "MORE", nil),
mod("DamagingAilmentDuration", "MORE", nil),
},
["base_bleed_duration_+%"] = {
mod("EnemyBleedDuration", "INC", nil),

View File

@@ -289,7 +289,7 @@ local function calcWarcryCastTime(skillModList, skillCfg, skillData, actor)
end
function calcSkillDuration(skillModList, skillCfg, skillData, env, enemyDB)
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
durationMod = m_max(durationMod, 0)
local durationBase = (skillData.duration or 0) + skillModList:Sum("BASE", skillCfg, "Duration", "PrimaryDuration")
local duration = durationBase * durationMod
@@ -1395,10 +1395,10 @@ function calcs.offence(env, actor, activeSkill)
debuffDurationMult = 1 / m_max(data.misc.BuffExpirationSlowCap, calcLib.mod(enemyDB, skillCfg, "BuffExpireFaster"))
end
do
output.DurationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
output.DurationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
output.DurationMod = m_max(output.DurationMod, 0)
if breakdown then
breakdown.DurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
breakdown.DurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
if breakdown.DurationMod and skillData.durationSecondary then
t_insert(breakdown.DurationMod, 1, "Primary duration:")
end
@@ -1426,7 +1426,7 @@ function calcs.offence(env, actor, activeSkill)
end
durationBase = (skillData.durationSecondary or 0) + skillModList:Sum("BASE", skillCfg, "Duration", "SecondaryDuration")
if durationBase > 0 then
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "SecondaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "SecondaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
durationMod = m_max(durationMod, 0)
output.DurationSecondary = durationBase * durationMod
if skillData.debuffSecondary then
@@ -1434,7 +1434,7 @@ function calcs.offence(env, actor, activeSkill)
end
output.DurationSecondary = m_ceil(output.DurationSecondary * data.misc.ServerTickRate) / data.misc.ServerTickRate
if breakdown and output.DurationSecondary ~= durationBase then
breakdown.SecondaryDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "SecondaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
breakdown.SecondaryDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "SecondaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
if breakdown.SecondaryDurationMod then
t_insert(breakdown.SecondaryDurationMod, 1, "Secondary duration:")
end
@@ -1453,7 +1453,7 @@ function calcs.offence(env, actor, activeSkill)
end
durationBase = (skillData.durationTertiary or 0) + skillModList:Sum("BASE", skillCfg, "Duration", "TertiaryDuration")
if durationBase > 0 then
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "TertiaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "TertiaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
durationMod = m_max(durationMod, 0)
output.DurationTertiary = durationBase * durationMod
if skillData.debuffTertiary then
@@ -1461,7 +1461,7 @@ function calcs.offence(env, actor, activeSkill)
end
output.DurationTertiary = m_ceil(output.DurationTertiary * data.misc.ServerTickRate) / data.misc.ServerTickRate
if breakdown and output.DurationTertiary ~= durationBase then
breakdown.TertiaryDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "TertiaryDuration", "SkillAndDamagingAilmentDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
breakdown.TertiaryDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "TertiaryDuration", skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
if breakdown.TertiaryDurationMod then
t_insert(breakdown.TertiaryDurationMod, 1, "Tertiary duration:")
end
@@ -1480,7 +1480,7 @@ function calcs.offence(env, actor, activeSkill)
end
durationBase = (skillData.auraDuration or 0)
if durationBase > 0 then
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "SkillAndDamagingAilmentDuration")
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration")
durationMod = m_max(durationMod, 0)
output.AuraDuration = durationBase * durationMod
output.AuraDuration = m_ceil(output.AuraDuration * data.misc.ServerTickRate) / data.misc.ServerTickRate
@@ -1495,7 +1495,7 @@ function calcs.offence(env, actor, activeSkill)
end
durationBase = (skillData.reserveDuration or 0)
if durationBase > 0 then
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "SkillAndDamagingAilmentDuration")
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration")
durationMod = m_max(durationMod, 0)
output.ReserveDuration = durationBase * durationMod
output.ReserveDuration = m_ceil(output.ReserveDuration * data.misc.ServerTickRate) / data.misc.ServerTickRate
@@ -1510,7 +1510,7 @@ function calcs.offence(env, actor, activeSkill)
end
durationBase = (skillData.soulPreventionDuration or 0)
if durationBase > 0 then
local durationMod = calcLib.mod(skillModList, skillCfg, "SoulGainPreventionDuration", skillData.skillEffectAppliesToSoulGainPrevention and "Duration" or "SkillAndDamagingAilmentDuration" or nil, skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
local durationMod = calcLib.mod(skillModList, skillCfg, "SoulGainPreventionDuration", skillData.skillEffectAppliesToSoulGainPrevention and "Duration" or nil, skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
durationMod = m_max(durationMod, 0)
output.SoulGainPreventionDuration = durationBase * durationMod
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)
--Calculates the max number of trauma stacks you can sustain
if skillModList:Flag(nil, "HasTrauma") then
local effectiveAttackRateCap = data.misc.ServerTickRate * output.Repeats
local duration = skillModList:Sum("BASE", cfg, "TraumaDuration") * calcLib.mod(skillModList, skillCfg, "Duration", "SkillAndDamagingAilmentDuration")
local duration = skillModList:Sum("BASE", cfg, "TraumaDuration") * calcLib.mod(skillModList, skillCfg, "Duration")
local traumaPerAttack = 1 + m_min(skillModList:Sum("BASE", cfg, "ExtraTrauma"), 100) / 100
local incAttackSpeedPerTrauma = skillModList:Sum("INC", skillCfg, "SpeedPerTrauma")
-- compute trauma using an exact form.
@@ -3974,7 +3974,7 @@ function calcs.offence(env, actor, activeSkill)
local overrideStackPotential = skillModList:Override(nil, "BleedStackPotentialOverride") and skillModList:Override(nil, "BleedStackPotentialOverride") / maxStacks
globalOutput.BleedStacksMax = maxStacks
local durationBase = skillData.bleedDurationIsSkillDuration and skillData.duration or data.misc.BleedDurationBase
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")
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")
durationMod = m_max(durationMod, 0)
local rateMod = calcLib.mod(skillModList, cfg, "BleedFaster") + enemyDB:Sum("INC", nil, "SelfBleedFaster") / 100
globalOutput.BleedDuration = durationBase * durationMod / rateMod * debuffDurationMult
@@ -4247,7 +4247,7 @@ function calcs.offence(env, actor, activeSkill)
else
durationBase = data.misc.PoisonDurationBase
end
local durationMod = calcLib.mod(skillModList, dotCfg, "EnemyPoisonDuration", "EnemyAilmentDuration", "SkillAndDamagingAilmentDuration", skillData.poisonIsSkillEffect and "Duration" or nil) * calcLib.mod(enemyDB, nil, "SelfPoisonDuration", "SelfAilmentDuration")
local durationMod = calcLib.mod(skillModList, dotCfg, "EnemyPoisonDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", skillData.poisonIsSkillEffect and "Duration" or nil) * calcLib.mod(enemyDB, nil, "SelfPoisonDuration", "SelfAilmentDuration")
durationMod = m_max(durationMod, 0)
globalOutput.PoisonDuration = durationBase * durationMod / rateMod * debuffDurationMult
-- The chance any given hit applies poison
@@ -4527,7 +4527,7 @@ function calcs.offence(env, actor, activeSkill)
local rateMod = (calcLib.mod(skillModList, cfg, "IgniteBurnFaster") + enemyDB:Sum("INC", nil, "SelfIgniteBurnFaster") / 100) / calcLib.mod(skillModList, cfg, "IgniteBurnSlower")
local durationBase = data.misc.IgniteDurationBase
local durationMod = m_max(calcLib.mod(skillModList, dotCfg, "EnemyIgniteDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration", "SkillAndDamagingAilmentDuration") * calcLib.mod(enemyDB, nil, "SelfIgniteDuration", "SelfAilmentDuration", "SelfElementalAilmentDuration"), 0)
local durationMod = m_max(calcLib.mod(skillModList, dotCfg, "EnemyIgniteDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration", "DamagingAilmentDuration") * calcLib.mod(enemyDB, nil, "SelfIgniteDuration", "SelfAilmentDuration", "SelfElementalAilmentDuration"), 0)
durationMod = m_max(durationMod, 0)
globalOutput.IgniteDuration = durationBase * durationMod / rateMod * debuffDurationMult
-- The chance any given hit applies ignite

View File

@@ -637,7 +637,7 @@ return {
{ breakdown = "DurationMod" },
{ breakdown = "SecondaryDurationMod" },
{ breakdown = "TertiaryDurationMod" },
{ modName = { "Duration", "PrimaryDuration", "SecondaryDuration", "TertiaryDuration", "SkillAndDamagingAilmentDuration" }, cfg = "skill" },
{ modName = { "Duration", "PrimaryDuration", "SecondaryDuration", "TertiaryDuration" }, cfg = "skill" },
}, },
{ label = "Skill Duration", flag = "duration", haveOutput = "Duration", { format = "{3:output:Duration}s", { breakdown = "Duration" }, }, },
{ label = "Secondary Duration", flag = "duration", haveOutput = "DurationSecondary", { format = "{3:output:DurationSecondary}s", { breakdown = "DurationSecondary" }, }, },
@@ -650,7 +650,7 @@ return {
{ label = "Tertiary Uptime", haveOutput = "DurationTertiaryUptime", { format = "{2:output:DurationTertiaryUptime}%", { breakdown = "DurationTertiaryUptime" }, }, },
{ label = "Aura Uptime", haveOutput = "AuraDurationUptime", { format = "{2:output:AuraDurationUptime}%", { breakdown = "AuraDurationUptime" }, }, },
{ label = "Reserve Uptime", haveOutput = "ReserveDurationUptime", { format = "{2:output:ReserveDurationUptime}%", { breakdown = "ReserveDurationUptime" }, }, },
{ label = "Sustainable Trauma", haveOutput = "SustainableTrauma", { format = "{0:output:SustainableTrauma}", { breakdown = "SustainableTrauma" }, { modName = { "ExtraTrauma", "RepeatCount", "Duration", "PrimaryDuration", "SecondaryDuration", "SkillAndDamagingAilmentDuration"}, cfg = "skill" }, }, },
{ label = "Sustainable Trauma", haveOutput = "SustainableTrauma", { format = "{0:output:SustainableTrauma}", { breakdown = "SustainableTrauma" }, { modName = { "ExtraTrauma", "RepeatCount", "Duration", "PrimaryDuration", "SecondaryDuration"}, cfg = "skill" }, }, },
{ label = "Repeat Count", haveOutput = "RepeatCount", { format = "{output:Repeats}", { modName = { "RepeatCount" }, cfg = "skill" }, }, },
{ label = "Projectile Count", flag = "projectile", { format = "{output:ProjectileCount}", { modName = { "NoAdditionalProjectiles" , "ProjectileCount", "ProjectileCountMinimum" }, cfg = "skill" }, }, },
{ label = "Pierce Count", haveOutput = "PierceCount", { format = "{output:PierceCountString}", { modName = { "CannotPierce", "PierceCount", "PierceAllTargets" }, cfg = "skill" }, }, },
@@ -884,7 +884,7 @@ return {
{ label = "Bleed DPS", { format = "{1:output:BleedDPS}", { breakdown = "BleedDPS" }, { breakdown = "MainHand.BleedDPS" }, { breakdown = "OffHand.BleedDPS" }, }, },
{ label = "Bleed Duration", { format = "{2:output:BleedDuration}s",
{ breakdown = "BleedDuration" },
{ label = "Player modifiers", modName = { "EnemyBleedDuration", "EnemyAilmentDuration", "SkillAndDamagingAilmentDuration", "BleedFaster" }, cfg = "bleed" },
{ label = "Player modifiers", modName = { "EnemyBleedDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", "BleedFaster" }, cfg = "bleed" },
{ label = "Enemy modifiers", modName = { "SelfBleedDuration", "SelfAilmentDuration", "SelfBleedFaster", "BleedExpireRate" }, enemy = true },
}, },
} }
@@ -937,7 +937,7 @@ return {
}, },
{ label = "Poison Duration", { format = "{2:output:PoisonDuration}s",
{ breakdown = "PoisonDuration" },
{ label = "Player modifiers", modName = { "EnemyPoisonDuration", "EnemyAilmentDuration", "SkillAndDamagingAilmentDuration", "PoisonFaster" }, cfg = "poison" },
{ label = "Player modifiers", modName = { "EnemyPoisonDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", "PoisonFaster" }, cfg = "poison" },
{ label = "Enemy modifiers", modName = { "SelfPoisonDuration", "SelfAilmentDuration", "SelfPoisonFaster" }, enemy = true },
}, },
{ label = "Dmg. per Poison", { format = "{1:output:PoisonDamage}",
@@ -1002,7 +1002,7 @@ return {
{ label = "Burning Ground", haveOutput = "BurningGroundFromIgnite", { format = "{0:output:BurningGroundDPS}", { breakdown = "BurningGroundDPS" } } },
{ label = "Ignite Duration", { format = "{2:output:IgniteDuration}s",
{ breakdown = "IgniteDuration" },
{ label = "Player modifiers", modName = { "EnemyIgniteDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration", "SkillAndDamagingAilmentDuration", "IgniteBurnFaster", "IgniteBurnSlower" }, cfg = "skill" },
{ label = "Player modifiers", modName = { "EnemyIgniteDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration", "DamagingAilmentDuration", "IgniteBurnFaster", "IgniteBurnSlower" }, cfg = "skill" },
{ label = "Enemy modifiers", modName = {"SelfIgniteDuration", "SelfAilmentDuration", "SelfElementalAilmentDuration", "SelfIgniteBurnFaster"}, enemy = true },
}, },
{ label = "Dmg. per Ignite", { format = "{1:output:IgniteDamage}",