From cb79a4573f01d7d6d0d3382099f3ad179f6636aa Mon Sep 17 00:00:00 2001 From: Trifall Date: Wed, 5 Aug 2026 19:49:17 -0400 Subject: [PATCH 1/3] add global limit to Chip Away notable for brands --- spec/System/TestSkills_spec.lua | 24 ++++++++++++++++++++++++ src/Data/ModCache.lua | 2 +- src/Modules/ModParser.lua | 6 ++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index b3c7963caf..b987ce8e85 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -231,6 +231,30 @@ describe("TestSkills", function() assert.are.near(singleBrandDPS * 2, build.calcsTab.mainOutput.TotalDot, 10 ^ -9) end) + it("caps total Brand Recall Cooldown Recovery from multiple Chip Away notables at 40%", function() + build.skillsTab:PasteSocketGroup("Storm Brand 20/0 1\n") + build.configTab.input.ActiveBrands = 10 + build.configTab.input.customMods = [[ + You can cast 7 additional brands + Brand Recall has 4% increased Cooldown Recovery Rate per Brand, up to a maximum of 40% + Brand Recall has 4% increased Cooldown Recovery Rate per Brand, up to a maximum of 40% + ]] + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(40, build.calcsTab.mainEnv.modDB:Sum("INC", { skillName = "Brand Recall" }, "CooldownRecovery")) + end) + + it("applies a single Chip Away notable per active Brand", function() + build.skillsTab:PasteSocketGroup("Storm Brand 20/0 1\n") + build.configTab.input.ActiveBrands = 3 + build.configTab.input.customMods = "Brand Recall has 4% increased Cooldown Recovery Rate per Brand, up to a maximum of 40%" + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(12, build.calcsTab.mainEnv.modDB:Sum("INC", { skillName = "Brand Recall" }, "CooldownRecovery")) + end) + it("averages inverted elemental resistance after penetration", function() build.skillsTab:PasteSocketGroup("Fireball 20/0 1") build.configTab.input.enemyIsBoss = "None" diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 25671ca0da..fb7d2ac92e 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -7913,7 +7913,7 @@ c["Brand Recall has 10% increased Cooldown Recovery Rate"]={{[1]={[1]={includeTr c["Brand Recall has 100% increased Cooldown Recovery Rate"]={{[1]={[1]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=100}},nil} c["Brand Recall has 15% increased Cooldown Recovery Rate"]={{[1]={[1]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=15}},nil} c["Brand Recall has 20% increased Cooldown Recovery Rate"]={{[1]={[1]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=20}},nil} -c["Brand Recall has 4% increased Cooldown Recovery Rate per Brand, up to a maximum of 40%"]={{[1]={[1]={limit=40,limitTotal=true,type="Multiplier",var="ActiveBrand"},[2]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=4}},nil} +c["Brand Recall has 4% increased Cooldown Recovery Rate per Brand, up to a maximum of 40%"]={{[1]={[1]={globalLimit=40,globalLimitKey="ChipAway",type="Multiplier",var="ActiveBrand"},[2]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=4}},nil} c["Brand Recall has 50% increased Cooldown Recovery Rate"]={{[1]={[1]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=50}},nil} c["Brand Skills have 10% increased Duration"]={{[1]={[1]={skillType=65,type="SkillType"},flags=0,keywordFlags=0,name="Duration",type="INC",value=10}},nil} c["Brand Skills have 100% increased Duration"]={{[1]={[1]={skillType=65,type="SkillType"},flags=0,keywordFlags=0,name="Duration",type="INC",value=100}},nil} diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index c0e5600906..57a55e141a 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -4007,6 +4007,12 @@ local specialModList = { ["(%d+)%% increased area of effect per second you've been stationary, up to a maximum of (%d+)%%"] = function(num, _, limit) return { mod("AreaOfEffect", "INC", num, { type = "Multiplier", var = "StationarySeconds", globalLimit = tonumber(limit), globalLimitKey = "ExpansiveMight", limitTotal = true }) } end, + ["brand recall has (%d+)%% increased cooldown recovery rate per brand, up to a maximum of (%d+)%%"] = function(num, _, limit) return { + mod("CooldownRecovery", "INC", num, { type = "Multiplier", var = "ActiveBrand", globalLimit = tonumber(limit), globalLimitKey = "ChipAway" }, { type = "SkillName", skillName = "Brand Recall", includeTransfigured = true }) + } end, + ["brand recall has (%d+)%% increased cooldown recovery speed per brand, up to a maximum of (%d+)%%"] = function(num, _, limit) return { + mod("CooldownRecovery", "INC", num, { type = "Multiplier", var = "ActiveBrand", globalLimit = tonumber(limit), globalLimitKey = "ChipAway" }, { type = "SkillName", skillName = "Brand Recall", includeTransfigured = true }) + } end, ["(%d+)%% increased chaos damage per (%d+) maximum mana, up to a maximum of (%d+)%%"] = function(num, _, div, limit) return { mod("ChaosDamage", "INC", num, { type = "PerStat", stat = "Mana", div = tonumber(div), globalLimit = tonumber(limit), globalLimitKey = "DarkIdeation" }) } end, From 82c72b7c01d8511c9d97c3d4d87654fff6908917 Mon Sep 17 00:00:00 2001 From: Trifall Date: Wed, 5 Aug 2026 20:45:26 -0400 Subject: [PATCH 2/3] count support gem brand limit increases in active Brand count --- spec/System/TestSkills_spec.lua | 21 +++++++++++++++++++++ src/Modules/CalcPerform.lua | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index b987ce8e85..23b6b864ec 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -255,6 +255,27 @@ describe("TestSkills", function() assert.are.equals(12, build.calcsTab.mainEnv.modDB:Sum("INC", { skillName = "Brand Recall" }, "CooldownRecovery")) end) + it("counts support gem brand limit increases in the active Brand count", function() + build.skillsTab:PasteSocketGroup("Storm Brand 20/0 1\nFoul Grasp 1/0 1\n") + build.configTab.input.ActiveBrands = 5 + build.configTab.input.customMods = "Brand Recall has 4% increased Cooldown Recovery Rate per Brand, up to a maximum of 40%" + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(20, build.calcsTab.mainEnv.modDB:Sum("INC", { skillName = "Brand Recall" }, "CooldownRecovery")) + end) + + it("uses the highest brand limit across multiple brand skills for the active Brand count", function() + build.skillsTab:PasteSocketGroup("Storm Brand 20/0 1\nFoul Grasp 1/0 1\n") + build.skillsTab:PasteSocketGroup("Armageddon Brand 20/0 1\n") + build.configTab.input.ActiveBrands = 5 + build.configTab.input.customMods = "Brand Recall has 4% increased Cooldown Recovery Rate per Brand, up to a maximum of 40%" + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(20, build.calcsTab.mainEnv.modDB:Sum("INC", { skillName = "Brand Recall" }, "CooldownRecovery")) + end) + it("averages inverted elemental resistance after penetration", function() build.skillsTab:PasteSocketGroup("Fireball 20/0 1") build.configTab.input.enemyIsBoss = "None" diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index 9217e3b8d7..6fb9a2f984 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -1326,7 +1326,8 @@ function calcs.perform(env, skipEHP) activeSkill.skillData.attachedBrandCount = attached local activeBrands = modDB:Sum("BASE", nil, "Multiplier:ConfigActiveBrands") -- Cap the number of active brands by the limit, which is 3 by default - modDB.multipliers["ActiveBrand"] = m_min(activeBrands, modDB:Sum("BASE", nil, "ActiveBrandLimit")) + -- Also consider increase to number of active brands from other sources (e.g. Foulgrasp Support) + modDB.multipliers["ActiveBrand"] = m_max(m_min(activeBrands, activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "ActiveBrandLimit")), modDB.multipliers["ActiveBrand"] or 0) modDB.multipliers["BrandsAttachedToEnemy"] = m_max(attached, modDB.multipliers["BrandsAttachedToEnemy"] or 0) enemyDB.multipliers["BrandsAttached"] = m_max(attached, enemyDB.multipliers["BrandsAttached"] or 0) end From 5ef7bae405a97a9dd078dadada42fbda9c1620aa Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Thu, 6 Aug 2026 12:13:49 +1000 Subject: [PATCH 3/3] Use existing mod parser line --- src/Data/ModCache.lua | 2 +- src/Modules/ModParser.lua | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index fb7d2ac92e..225d1302f8 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -7908,7 +7908,7 @@ c["Bow Skills have +6% to Damage over Time Multiplier"]={{[1]={flags=0,keywordFl c["Bow Skills have 10% increased Skill Effect Duration"]={{[1]={flags=0,keywordFlags=1024,name="Duration",type="INC",value=10}},nil} c["Bow Skills have 25% increased Area of Effect"]={{[1]={flags=0,keywordFlags=1024,name="AreaOfEffect",type="INC",value=25}},nil} c["Brand Recall grants 20% increased Brand Attachment range to recalled Brands"]={{[1]={[1]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},[2]={type="Condition",var="{Hand}Attack"},flags=0,keywordFlags=1048576,name="BrandAttachmentRange",type="BASE",value=20}},"% increased to recalled s "} -c["Brand Recall grants 20% increased Brand Attachment range to recalled Brands Brand Recall has 4% increased Cooldown Recovery Rate per Brand, up to a maximum of 40%"]={{[1]={[1]={limit=40,limitTotal=true,type="Multiplier",var="ActiveBrand"},[2]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},[3]={type="Condition",var="{Hand}Attack"},flags=0,keywordFlags=1048576,name="BrandAttachmentRange",type="BASE",value=20}},"% increased to recalled s Brand Recall has 4% increased Cooldown Recovery Rate "} +c["Brand Recall grants 20% increased Brand Attachment range to recalled Brands Brand Recall has 4% increased Cooldown Recovery Rate per Brand, up to a maximum of 40%"]={{[1]={[1]={globalLimit=40,globalLimitKey="ChipAway",type="Multiplier",var="ActiveBrand"},[2]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},[3]={type="Condition",var="{Hand}Attack"},flags=0,keywordFlags=1048576,name="BrandAttachmentRange",type="BASE",value=20}},"% increased to recalled s Brand Recall has 4% increased Cooldown Recovery Rate "} c["Brand Recall has 10% increased Cooldown Recovery Rate"]={{[1]={[1]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=10}},nil} c["Brand Recall has 100% increased Cooldown Recovery Rate"]={{[1]={[1]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=100}},nil} c["Brand Recall has 15% increased Cooldown Recovery Rate"]={{[1]={[1]={includeTransfigured=true,skillName="Brand Recall",type="SkillName"},flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=15}},nil} diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 57a55e141a..5653133ebf 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -1340,7 +1340,7 @@ local modTagList = { ["per gale force"] = { tag = { type = "Multiplier", var = "GaleForce" } }, ["per intensity"] = { tag = { type = "Multiplier", var = "Intensity" } }, ["per brand"] = { tag = { type = "Multiplier", var = "ActiveBrand" } }, - ["per brand, up to a maximum of (%d+)%%"] = function(num) return { tag = { type = "Multiplier", var = "ActiveBrand", limit = tonumber(num), limitTotal = true } } end, + ["per brand, up to a maximum of (%d+)%%"] = function(num) return { tag = { type = "Multiplier", var = "ActiveBrand", globalLimit = tonumber(num), globalLimitKey = "ChipAway" } } end, ["per blitz charge"] = { tag = { type = "Multiplier", var = "BlitzCharge" } }, ["per ghost shroud"] = { tag = { type = "Multiplier", var = "GhostShroud" } }, ["per crab barrier"] = { tag = { type = "Multiplier", var = "CrabBarrier" } }, @@ -4007,12 +4007,6 @@ local specialModList = { ["(%d+)%% increased area of effect per second you've been stationary, up to a maximum of (%d+)%%"] = function(num, _, limit) return { mod("AreaOfEffect", "INC", num, { type = "Multiplier", var = "StationarySeconds", globalLimit = tonumber(limit), globalLimitKey = "ExpansiveMight", limitTotal = true }) } end, - ["brand recall has (%d+)%% increased cooldown recovery rate per brand, up to a maximum of (%d+)%%"] = function(num, _, limit) return { - mod("CooldownRecovery", "INC", num, { type = "Multiplier", var = "ActiveBrand", globalLimit = tonumber(limit), globalLimitKey = "ChipAway" }, { type = "SkillName", skillName = "Brand Recall", includeTransfigured = true }) - } end, - ["brand recall has (%d+)%% increased cooldown recovery speed per brand, up to a maximum of (%d+)%%"] = function(num, _, limit) return { - mod("CooldownRecovery", "INC", num, { type = "Multiplier", var = "ActiveBrand", globalLimit = tonumber(limit), globalLimitKey = "ChipAway" }, { type = "SkillName", skillName = "Brand Recall", includeTransfigured = true }) - } end, ["(%d+)%% increased chaos damage per (%d+) maximum mana, up to a maximum of (%d+)%%"] = function(num, _, div, limit) return { mod("ChaosDamage", "INC", num, { type = "PerStat", stat = "Mana", div = tonumber(div), globalLimit = tonumber(limit), globalLimitKey = "DarkIdeation" }) } end,