diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index 3afa41ce0..ff4cfbc9b 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -229,6 +229,31 @@ describe("TestSkills", function() assert.True(baseCorruptingCryDps == build.calcsTab.mainOutput.CorruptingBloodDPS) end) + it("Flame Breath attack speed scales DPS and is not capped by its channel cooldown", function() + build.itemsTab:CreateDisplayItemFromRaw([[ + New Item + Roaring Talisman + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + + build.skillsTab:PasteSocketGroup("Flame Breath 20/0 1") + runCallback("OnFrame") + + local baseSpeed = build.calcsTab.mainOutput.Speed + local baseDPS = build.calcsTab.mainOutput.TotalDPS + + assert.True(baseSpeed > 1) + assert.True(baseDPS > 0) + + build.configTab.input.customMods = "100% increased attack speed" + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.Speed > baseSpeed * 1.9) + assert.True(build.calcsTab.mainOutput.TotalDPS > baseDPS * 1.9) + end) + it("Test Atziri's Allure - ignore curse limit", function() build.skillsTab:PasteSocketGroup("Elemental Weakness 20/0 1\nAtziri's Allure 1/0 1") build.skillsTab:PasteSocketGroup("Flammability 20/0 1\n") diff --git a/src/Data/SkillStatMap.lua b/src/Data/SkillStatMap.lua index 78811af1a..209b4bf81 100644 --- a/src/Data/SkillStatMap.lua +++ b/src/Data/SkillStatMap.lua @@ -589,6 +589,9 @@ return { ["display_this_skill_cooldown_does_not_recover_during_buff"] = { flag("NoCooldownRecoveryInDuration"), }, +["channelled_skill_do_not_go_on_cooldown_on_finishing_channel"] = { + flag("CooldownDoesNotLimitSkillSpeed"), +}, ["totem_skill_cast_speed_+%"] = { mod("Speed", "INC", nil, ModFlag.Cast, KeywordFlag.Totem), }, diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index abf822011..763799fe7 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -2741,7 +2741,9 @@ function calcs.offence(env, actor, activeSkill) end if globalOutput.Cooldown then output.Cooldown = globalOutput.Cooldown - output.Speed = m_min(output.Speed, 1 / output.Cooldown * output.Repeats) + if not skillModList:Flag(skillCfg, "CooldownDoesNotLimitSkillSpeed") then + output.Speed = m_min(output.Speed, 1 / output.Cooldown * output.Repeats) + end end if output.Cooldown and skillFlags.selfCast or skillData.maxHitRatePerEnemy or skillData.hitTimeOverride then skillFlags.notAverage = true @@ -2844,7 +2846,7 @@ function calcs.offence(env, actor, activeSkill) t_insert(breakdown.Speed, s_format("= %.2f ^8(eff. attack rate)", output.Speed)) end -- Cooldown: - if output.Cooldown and (1 / output.Cooldown) < output.CastRate then + if output.Cooldown and (1 / output.Cooldown) < output.CastRate and not skillModList:Flag(skillCfg, "CooldownDoesNotLimitSkillSpeed") then t_insert(breakdown.Speed, s_format("\n")) t_insert(breakdown.Speed, s_format("1 / %.2f ^8(skill cooldown)", output.Cooldown)) if output.Repeats > 1 then