From 5bbac79e5946170293a250f03acffe9ca696b5b2 Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Sun, 10 May 2026 19:27:58 -0500 Subject: [PATCH] add support for many lineage supports --- spec/System/TestSkills_spec.lua | 17 +++++++++++++++++ src/Data/SkillStatMap.lua | 9 +++++++++ src/Data/Skills/sup_int.lua | 8 ++++++++ src/Data/Skills/sup_str.lua | 8 ++++++++ src/Export/Skills/sup_int.txt | 8 ++++++++ src/Export/Skills/sup_str.txt | 8 ++++++++ src/Modules/CalcOffence.lua | 3 ++- src/Modules/CalcPerform.lua | 8 ++++---- 8 files changed, 64 insertions(+), 5 deletions(-) diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index f0c02d4f3c..5b1fe20bc2 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -84,4 +84,21 @@ describe("TestSkills", function() local finalCost = build.calcsTab.mainOutput.ManaCost assert.are.equals(16, round(finalCost)) 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") + runCallback("OnFrame") + + local curseList = build.calcsTab.calcsOutput.CurseList + assert.True(curseList:match("Flammability") ~= nil and curseList:match("Elemental Weakness") ~= nil) + end) + + -- skills that don't have a base CD and have more than one use need to use the added cooldown by whatever support allows the +1 limit to be supportable + it("Test Added Cooldown interaction with +1 Limit", function() + build.skillsTab:PasteSocketGroup("Thunderstorm 20/0 1\nHourglass 1/0 1\nOverabundance I 1/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.calcsOutput.Cooldown == 10) + end) end) \ No newline at end of file diff --git a/src/Data/SkillStatMap.lua b/src/Data/SkillStatMap.lua index 1e2c80fc62..5c01e96f96 100644 --- a/src/Data/SkillStatMap.lua +++ b/src/Data/SkillStatMap.lua @@ -576,6 +576,9 @@ return { ["base_cooldown_speed_+%_final"] = { mod("CooldownRecovery", "MORE", nil), }, +["support_cooldown_reduction_cooldown_recovery_+%"] = { + mod("CooldownRecovery", "MORE", nil), +}, ["additional_weapon_base_attack_time_ms"] = { mod("Speed", "BASE", nil, ModFlag.Attack), div = 1000, @@ -1622,6 +1625,9 @@ return { ["number_of_additional_curses_allowed"] = { mod("EnemyCurseLimit", "BASE", nil), }, +["curse_ignores_curse_limit"] = { + flag("CursesIgnoreCurseLimit") +}, ["consecrated_ground_enemy_damage_taken_+%"] = { mod("DamageTakenConsecratedGround", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Debuff" }, { type = "Condition", var = "OnConsecratedGround" }), }, @@ -2680,6 +2686,9 @@ return { ["base_limit_+"] = { mod("AdditionalCooldownUses", "BASE", nil), }, +["support_storm_skill_limit_+"] = { + mod("AdditionalCooldownUses", "BASE", nil, 0, 0, { type = "SkillType", skillType = SkillType.Storm }), +}, ["kill_enemy_on_hit_if_under_10%_life"] = { mod("CullPercent", "MAX", nil), value = 10 diff --git a/src/Data/Skills/sup_int.lua b/src/Data/Skills/sup_int.lua index 612992061c..79201b874d 100644 --- a/src/Data/Skills/sup_int.lua +++ b/src/Data/Skills/sup_int.lua @@ -6142,6 +6142,14 @@ skills["SupportMorganasTempestPlayer"] = { label = "Morgana's Tempest", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["support_approaching_storms_area_of_effect_+%_final"] = { + mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillType", skillType = SkillType.Storm }), + }, + ["support_approaching_storms_damage_+%_final"] = { + mod("Damage", "MORE", nil, 0, 0, { type = "SkillType", skillType = SkillType.Storm }), + }, + }, baseFlags = { }, constantStats = { diff --git a/src/Data/Skills/sup_str.lua b/src/Data/Skills/sup_str.lua index 4e04c7162d..d1c411f4b4 100644 --- a/src/Data/Skills/sup_str.lua +++ b/src/Data/Skills/sup_str.lua @@ -7879,6 +7879,14 @@ skills["SupportZerphisLegacyPlayer"] = { label = "Zerphi's Infamy", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["support_zerphis_legacy_area_of_effect_+%"] = { + mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillType", skillTypeList = { SkillType.Warcry, SkillType.Area } }) + }, + ["support_zerphis_legacy_damage_+%_final"] = { + mod("Damage", "MORE", nil, 0, 0, { type = "SkillType", skillTypeList = { SkillType.Warcry, SkillType.Area } }) + }, + }, baseFlags = { }, constantStats = { diff --git a/src/Export/Skills/sup_int.txt b/src/Export/Skills/sup_int.txt index 0b1786e046..9cd646d98b 100644 --- a/src/Export/Skills/sup_int.txt +++ b/src/Export/Skills/sup_int.txt @@ -1144,6 +1144,14 @@ statMap = { #skill SupportMorganasTempestPlayer #set SupportMorganasTempestPlayer +statMap = { + ["support_approaching_storms_area_of_effect_+%_final"] = { + mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillType", skillType = SkillType.Storm }), + }, + ["support_approaching_storms_damage_+%_final"] = { + mod("Damage", "MORE", nil, 0, 0, { type = "SkillType", skillType = SkillType.Storm }), + }, +}, #mods #skillEnd diff --git a/src/Export/Skills/sup_str.txt b/src/Export/Skills/sup_str.txt index 9af608efa4..c8b6eaa6e2 100644 --- a/src/Export/Skills/sup_str.txt +++ b/src/Export/Skills/sup_str.txt @@ -1782,5 +1782,13 @@ statMap = { #skill SupportZerphisLegacyPlayer #set SupportZerphisLegacyPlayer +statMap = { + ["support_zerphis_legacy_area_of_effect_+%"] = { + mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillType", skillTypeList = { SkillType.Warcry, SkillType.Area } }) + }, + ["support_zerphis_legacy_damage_+%_final"] = { + mod("Damage", "MORE", nil, 0, 0, { type = "SkillType", skillTypeList = { SkillType.Warcry, SkillType.Area } }) + }, +}, #mods #skillEnd \ No newline at end of file diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index 3e87cc8ace..36a6a3fecf 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -327,7 +327,8 @@ function calcSkillCooldown(skillModList, skillCfg, skillData) -- If a skill can store extra uses and has a cooldown, it doesn't round the cooldown value to server ticks local rounded = false if (skillData.storedUses and skillData.storedUses > 1) or (skillData.VaalStoredUses and skillData.VaalStoredUses > 1) or skillModList:Sum("BASE", skillCfg, "AdditionalCooldownUses") > 0 then - return cooldown, rounded, nil, noCooldownChance + -- if the skill does not have an innate cooldown, we need to pass the added otherwise things go boom + return cooldown, rounded, skillData.cooldown and nil or addedCooldown, noCooldownChance else cooldown = m_ceil(cooldown * data.misc.ServerTickRate) / data.misc.ServerTickRate rounded = true diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index cd5a2bc12d..38babdd7f8 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -2147,13 +2147,13 @@ function calcs.perform(env, skipEHP) elseif buff.type == "Curse" or buff.type == "CurseBuff" then local mark = activeSkill.skillTypes[SkillType.Mark] modDB.conditions["SelfCast"..buff.name:gsub(" ","")] = not (activeSkill.skillTypes[SkillType.Triggered] or activeSkill.skillTypes[SkillType.Aura]) - if env.mode_effective and (not enemyDB:Flag(nil, "Hexproof") or modDB:Flag(nil, "CursesIgnoreHexproof") or activeSkill.skillData.ignoreHexLimit or activeSkill.skillData.ignoreHexproof) or mark then + if env.mode_effective and (not enemyDB:Flag(nil, "Hexproof") or modDB:Flag(nil, "CursesIgnoreHexproof") or activeSkill.skillData.ignoreCurseLimit or activeSkill.skillData.ignoreHexproof) or mark then local curse = { name = buff.name, fromPlayer = true, priority = determineCursePriority(buff.name, activeSkill), isMark = mark, - ignoreHexLimit = (modDB:Flag(activeSkill.skillCfg, "CursesIgnoreHexLimit") or activeSkill.skillData.ignoreHexLimit) and not mark or false, + ignoreCurseLimit = (modDB:Flag(activeSkill.skillCfg, "CursesIgnoreCurseLimit") or activeSkill.skillData.ignoreCurseLimit or activeSkill.skillModList:Flag(nil, "CursesIgnoreCurseLimit")) and not mark or false, socketedCursesHexLimit = modDB:Flag(activeSkill.skillCfg, "SocketedCursesAdditionalLimit") } local inc = skillModList:Sum("INC", skillCfg, "CurseEffect") + enemyDB:Sum("INC", nil, "CurseEffectOnSelf") @@ -2697,7 +2697,7 @@ function calcs.perform(env, skipEHP) for _, source in ipairs({curses, minionCurses, allyCurses}) do for _, curse in ipairs(source) do -- Calculate curses that ignore hex limit after - if not curse.ignoreHexLimit and not curse.socketedCursesHexLimit then + if not curse.ignoreCurseLimit and not curse.socketedCursesHexLimit then local slot local skipAddingCurse = false -- Check if we need to disable a certain curse aura. @@ -2741,7 +2741,7 @@ function calcs.perform(env, skipEHP) for _, source in ipairs({curses, minionCurses}) do for _, curse in ipairs(source) do - if curse.ignoreHexLimit then + if curse.ignoreCurseLimit then local skipAddingCurse = false for i = 1, #curseSlots do if curseSlots[i].name == curse.name then