From 6957761d2f6d4a032ee7d7d8dea6edaba372666e Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Thu, 24 Sep 2026 04:20:35 +0300 Subject: [PATCH 1/2] Avoid incorrect Doedre's Undoing setup resulting in inf dps --- spec/System/TestSkills_spec.lua | 20 +++++++++++++++++++- src/Data/Skills/other.lua | 4 ++-- src/Data/Skills/sup_int.lua | 4 +++- src/Export/Skills/sup_int.txt | 4 +++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index c9d8f1e6f2..64a6cb2b20 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -2228,5 +2228,23 @@ describe("TestSkills", function() local noParrySpellDmg = build.calcsTab.mainOutput.AverageDamage assert.equals(withParrySpellDmg, noParrySpellDmg, "Parry should not affect spell damage") end) - + it("deals no damage when the support is not attached to a curse", function() + build.skillsTab:PasteSocketGroup([[Weapon Set: Both +Fireball 20/0 1 +Doedre's Undoing 1/0 1]]) + runCallback("OnFrame") + selectActiveSkillById(build.skillsTab.socketGroupList[#build.skillsTab.socketGroupList], "ChaosFrogExplosionPlayer") + assert.are.equals(0, build.calcsTab.calcsOutput.TotalDPS) + assert.are.equals(0, build.calcsTab.calcsOutput.HitSpeed) + end) + + it("deals damage when the support is attached to a curse", function() + build.skillsTab:PasteSocketGroup([[Weapon Set: Both +Doedre's Undoing 1/0 1 +Elemental Weakness 20/0 1]]) + runCallback("OnFrame") + selectActiveSkillById(build.skillsTab.socketGroupList[#build.skillsTab.socketGroupList], "ChaosFrogExplosionPlayer") + assert.True(build.calcsTab.calcsOutput.TotalDPS > 0) + assert.True(build.calcsTab.calcsOutput.HitSpeed > 0) + end) end) diff --git a/src/Data/Skills/other.lua b/src/Data/Skills/other.lua index 3edbbbd09b..f7ba893aaa 100644 --- a/src/Data/Skills/other.lua +++ b/src/Data/Skills/other.lua @@ -5776,7 +5776,7 @@ skills["EncaseInJadePlayer"] = { } skills["SupportEshsProwess"] = { name = "Esh's Prowess", - description = "Supports Lightning skills that Hit targets, granting them an additional level and causing them to only roll the minimum or maximum value for Lightning damage. Does not support skills which do not have levels.", + description = "Supports Lightning Skills that Hit, granting them an additional level and causing them to only roll the minimum or maximum value for Lightning damage. Does not Support Skills which do not have levels.", color = 4, support = true, requireSkillTypes = { SkillType.Lightning, SkillType.Damage, }, @@ -17787,7 +17787,7 @@ skills["StarbornOnslaughtPlayer"] = { } skills["SupportStyrnsFerocity"] = { name = "Styrn's Ferocity", - description = "Supports Shield Skills that Hit enemies, causing those Hits to Crush their targets, additionally causing any Physical Damage Hits against those targets while Crushed to Break their Armour.", + description = "Supports Shield Skills that Hit, causing those Hits to Crush their targets, and Physical Hits against those targets while Crushed to Break their Armour.", color = 4, support = true, requireSkillTypes = { SkillType.Attack, SkillType.Damage, SkillType.OR, SkillType.RequiresShield, SkillType.AND, }, diff --git a/src/Data/Skills/sup_int.lua b/src/Data/Skills/sup_int.lua index 6520fa75e8..1097d6aca5 100644 --- a/src/Data/Skills/sup_int.lua +++ b/src/Data/Skills/sup_int.lua @@ -3182,7 +3182,9 @@ skills["ChaosFrogExplosionPlayer"] = { [40] = { critChance = 7, levelRequirement = 0, cost = { Mana = 0, }, }, }, preDamageFunc = function(activeSkill, output) - activeSkill.skillData.hitTimeMultiplier = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "ToadSpawnInterval") / 1000 + local interval = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "ToadSpawnInterval") + -- returning infinity sets dps to zero if the support part of this isn't actually active + activeSkill.skillData.hitTimeMultiplier = (interval != 0) and (interval / 1000) or math.huge end, statSets = { [1] = { diff --git a/src/Export/Skills/sup_int.txt b/src/Export/Skills/sup_int.txt index 3922e923f3..1613e3c32f 100644 --- a/src/Export/Skills/sup_int.txt +++ b/src/Export/Skills/sup_int.txt @@ -548,7 +548,9 @@ statMap = { #skill ChaosFrogExplosionPlayer preDamageFunc = function(activeSkill, output) - activeSkill.skillData.hitTimeMultiplier = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "ToadSpawnInterval") / 1000 + local interval = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "ToadSpawnInterval") + -- returning infinity sets dps to zero if the support part of this isn't actually active + activeSkill.skillData.hitTimeMultiplier = (interval != 0) and (interval / 1000) or math.huge end, #set ChaosFrogExplosionPlayer #flags spell area triggered From 185e233149236b5c7364adacf9e1dc41e73b4cc8 Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Tue, 29 Sep 2026 17:25:27 +1000 Subject: [PATCH 2/2] Fix handling when used with ailments --- src/Data/Skills/sup_int.lua | 9 +++++++-- src/Export/Skills/sup_int.txt | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Data/Skills/sup_int.lua b/src/Data/Skills/sup_int.lua index 1097d6aca5..25e27b56a2 100644 --- a/src/Data/Skills/sup_int.lua +++ b/src/Data/Skills/sup_int.lua @@ -3183,8 +3183,13 @@ skills["ChaosFrogExplosionPlayer"] = { }, preDamageFunc = function(activeSkill, output) local interval = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "ToadSpawnInterval") - -- returning infinity sets dps to zero if the support part of this isn't actually active - activeSkill.skillData.hitTimeMultiplier = (interval != 0) and (interval / 1000) or math.huge + if interval == 0 then + -- An inactive support cannot spawn toads or deal damage, including ailments. + activeSkill.skillData.hitTimeMultiplier = math.huge + activeSkill.skillModList:NewMod("DealNoDamage", "FLAG", true, "Doedre's Undoing") + else + activeSkill.skillData.hitTimeMultiplier = interval / 1000 + end end, statSets = { [1] = { diff --git a/src/Export/Skills/sup_int.txt b/src/Export/Skills/sup_int.txt index 1613e3c32f..3fede5fee0 100644 --- a/src/Export/Skills/sup_int.txt +++ b/src/Export/Skills/sup_int.txt @@ -549,8 +549,13 @@ statMap = { #skill ChaosFrogExplosionPlayer preDamageFunc = function(activeSkill, output) local interval = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "ToadSpawnInterval") - -- returning infinity sets dps to zero if the support part of this isn't actually active - activeSkill.skillData.hitTimeMultiplier = (interval != 0) and (interval / 1000) or math.huge + if interval == 0 then + -- An inactive support cannot spawn toads or deal damage, including ailments. + activeSkill.skillData.hitTimeMultiplier = math.huge + activeSkill.skillModList:NewMod("DealNoDamage", "FLAG", true, "Doedre's Undoing") + else + activeSkill.skillData.hitTimeMultiplier = interval / 1000 + end end, #set ChaosFrogExplosionPlayer #flags spell area triggered