From 732a6f3b598f1a57284235b7d255dbd3aa5fa39d Mon Sep 17 00:00:00 2001 From: Andrey Goder Date: Sat, 18 Nov 2023 16:39:48 -0800 Subject: [PATCH] Add support for Wintertide Brand average DOT calculation --- src/Data/Skills/act_int.lua | 26 ++++++++++++++++++++++++-- src/Export/Skills/act_int.txt | 26 ++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/Data/Skills/act_int.lua b/src/Data/Skills/act_int.lua index 226662ad3b..4646a3ab03 100644 --- a/src/Data/Skills/act_int.lua +++ b/src/Data/Skills/act_int.lua @@ -12032,12 +12032,34 @@ skills["ImmolationSigil"] = { castTime = 0.7, preDamageFunc = function(activeSkill, output) activeSkill.skillData.hitTimeOverride = activeSkill.skillData.repeatFrequency / (1 + activeSkill.skillModList:Sum("INC", activeSkill.skillCfg, "Speed", "BrandActivationFrequency") / 100) / activeSkill.skillModList:More(activeSkill.skillCfg, "BrandActivationFrequency") + if activeSkill.skillPart == 2 then + local skillMaxStages = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "Multiplier:WintertideBrandMaxStages") + local duration = calcSkillDuration(activeSkill.skillModList, activeSkill.skillCfg, activeSkill.skillData, {}) + local maxStages = math.min(duration / activeSkill.skillData.hitTimeOverride + 1, skillMaxStages) + local timeToReachMaxStages = (maxStages - 1) * activeSkill.skillData.hitTimeOverride + local timeAtMaxStages = duration - timeToReachMaxStages + local damagePerStage = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "Multiplier:WintertideBrandDamagePerStage") + -- Get the average damage before reaching max stages and then damage at max stages + local dpsMultiplier = ((2 + damagePerStage + maxStages * damagePerStage)/2*timeToReachMaxStages+timeAtMaxStages*(1+maxStages*damagePerStage))/duration + activeSkill.skillModList:NewMod("Damage", "MORE", dpsMultiplier, "Wintertide Brand Average Multiplier") + end end, + parts = { + { + name = "Manual Stages", + stages = true + }, + { + name = "Average Damage", + } + }, statMap = { ["base_skill_show_average_damage_instead_of_dps"] = { }, ["immolation_brand_burn_damage_+%_final_per_stage"] = { - mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "WintertideBrandStage", limitVar = "WintertideBrandMaxStages" }), + -- Only apply to Manual Stages part + mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "WintertideBrandStage", limitVar = "WintertideBrandMaxStages" }, { type = "SkillPart", skillPart = 1 }), + mod("Multiplier:WintertideBrandDamagePerStage", "BASE", nil), }, ["winter_brand_max_number_of_stages"] = { mod("Multiplier:WintertideBrandMaxStages", "BASE", nil), @@ -12572,4 +12594,4 @@ skills["DestructiveLink"] = { [39] = { 63, 11400, levelRequirement = 99, statInterpolation = { 1, 1, }, cost = { ManaPerMinute = 2830, }, }, [40] = { 64, 11450, levelRequirement = 100, statInterpolation = { 1, 1, }, cost = { ManaPerMinute = 2850, }, }, }, -} \ No newline at end of file +} diff --git a/src/Export/Skills/act_int.txt b/src/Export/Skills/act_int.txt index 619859308c..40a55caaa4 100644 --- a/src/Export/Skills/act_int.txt +++ b/src/Export/Skills/act_int.txt @@ -2549,12 +2549,34 @@ local skills, mod, flag, skill = ... #flags spell area duration brand preDamageFunc = function(activeSkill, output) activeSkill.skillData.hitTimeOverride = activeSkill.skillData.repeatFrequency / (1 + activeSkill.skillModList:Sum("INC", activeSkill.skillCfg, "Speed", "BrandActivationFrequency") / 100) / activeSkill.skillModList:More(activeSkill.skillCfg, "BrandActivationFrequency") + if activeSkill.skillPart == 2 then + local skillMaxStages = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "Multiplier:WintertideBrandMaxStages") + local duration = calcSkillDuration(activeSkill.skillModList, activeSkill.skillCfg, activeSkill.skillData, {}) + local maxStages = math.min(duration / activeSkill.skillData.hitTimeOverride + 1, skillMaxStages) + local timeToReachMaxStages = (maxStages - 1) * activeSkill.skillData.hitTimeOverride + local timeAtMaxStages = duration - timeToReachMaxStages + local damagePerStage = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "Multiplier:WintertideBrandDamagePerStage") + -- Get the average damage before reaching max stages and then damage at max stages + local dpsMultiplier = ((2 + damagePerStage + maxStages * damagePerStage)/2*timeToReachMaxStages+timeAtMaxStages*(1+maxStages*damagePerStage))/duration + activeSkill.skillModList:NewMod("Damage", "MORE", dpsMultiplier, "Wintertide Brand Average Multiplier") + end end, + parts = { + { + name = "Manual Stages", + stages = true + }, + { + name = "Average Damage", + } + }, statMap = { ["base_skill_show_average_damage_instead_of_dps"] = { }, ["immolation_brand_burn_damage_+%_final_per_stage"] = { - mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "WintertideBrandStage", limitVar = "WintertideBrandMaxStages" }), + -- Only apply to Manual Stages part + mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "WintertideBrandStage", limitVar = "WintertideBrandMaxStages" }, { type = "SkillPart", skillPart = 1 }), + mod("Multiplier:WintertideBrandDamagePerStage", "BASE", nil), }, ["winter_brand_max_number_of_stages"] = { mod("Multiplier:WintertideBrandMaxStages", "BASE", nil), @@ -2650,4 +2672,4 @@ local skills, mod, flag, skill = ... flag("MainHandCritIsEqualToParent", { type = "GlobalEffect", effectType = "Link" }, { type = "Condition", var = "MainHandAttack" }), }, }, -#mods \ No newline at end of file +#mods