From 39e93b651f7151284aa5d0cfcbe79ba03a453a7d Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Fri, 8 May 2026 11:46:08 -0500 Subject: [PATCH 1/2] add support for Expand, add flags for Area vs Damage Seal Supports --- src/Data/Skills/sup_int.lua | 16 ++++++++++++++++ src/Export/Skills/sup_int.txt | 14 ++++++++++++++ src/Modules/CalcOffence.lua | 12 ++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/Data/Skills/sup_int.lua b/src/Data/Skills/sup_int.lua index 612992061..f2af83438 100644 --- a/src/Data/Skills/sup_int.lua +++ b/src/Data/Skills/sup_int.lua @@ -3778,8 +3778,23 @@ skills["SupportExpandPlayer"] = { label = "Expand", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["support_expand_max_seals"] = { + mod("SealCount", "BASE", nil), + }, + ["skill_area_of_effect_+%_per_expand_seal"] = { + mod("SealRepeatPenalty", "MORE", nil), + }, + ["expand_support_seal_gain_frequency_as_%_of_total_cast_time"] = { + mod("SealGainFrequency", "BASE", nil), + }, + }, baseFlags = { }, + baseMods = { + flag("HasSeals"), + flag("AreaSeal"), + }, constantStats = { { "support_expand_max_seals", 3 }, { "support_expand_charge_gain_interval_ms", 0 }, @@ -7556,6 +7571,7 @@ skills["SupportUnleashPlayer"] = { }, baseMods = { flag("HasSeals"), + flag("DamageSeal"), }, constantStats = { { "support_spell_rapid_fire_repeat_use_damage_+%_final", -50 }, diff --git a/src/Export/Skills/sup_int.txt b/src/Export/Skills/sup_int.txt index 0b1786e04..3bb6dea23 100644 --- a/src/Export/Skills/sup_int.txt +++ b/src/Export/Skills/sup_int.txt @@ -654,6 +654,19 @@ statMap = { #skill SupportExpandPlayer #set SupportExpandPlayer +statMap = { + ["support_expand_max_seals"] = { + mod("SealCount", "BASE", nil), + }, + ["skill_area_of_effect_+%_per_expand_seal"] = { + mod("SealRepeatPenalty", "MORE", nil), + }, + ["expand_support_seal_gain_frequency_as_%_of_total_cast_time"] = { + mod("SealGainFrequency", "BASE", nil), + }, +}, +#baseMod flag("HasSeals") +#baseMod flag("AreaSeal") #mods #skillEnd @@ -1432,6 +1445,7 @@ statMap = { }, }, #baseMod flag("HasSeals") +#baseMod flag("DamageSeal") #mods #skillEnd diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index 3e87cc8ac..e2cd8fbd4 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -393,6 +393,14 @@ function calcs.offence(env, actor, activeSkill) output.ArmourBreakPerHit = calcLib.val(skillModList, "ArmourBreakPerHit", skillCfg) local function calcAreaOfEffect(skillModList, skillCfg, skillData, skillFlags, output, breakdown) + -- Applies increased AoE based on seals count + if skillModList:Flag(nil, "HasSeals") and skillModList:Flag(nil, "AreaSeal") and not skillModList:Flag(nil, "NoRepeatBonuses") then + output.SealCooldown = activeSkill.activeEffect.grantedEffect.castTime * skillModList:Sum("BASE", skillCfg, "SealGainFrequency") / calcLib.mod(skillModList, skillCfg, "SealGainFrequency") / 100 + output.SealMax = skillModList:Sum("BASE", skillCfg, "SealCount") + output.TimeMaxSeals = output.SealCooldown * output.SealMax + env.player.mainSkill.skillModList:NewMod("AreaOfEffect", "INC", (output.SealMax * (calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") - 1) * 100), "Expand") + end + local incArea, moreArea = calcLib.mods(skillModList, skillCfg, "AreaOfEffect", "AreaOfEffectPrimary") output.AreaOfEffectMod = round(round(incArea * moreArea, 10), 2) if skillData.radiusIsWeaponRange then @@ -1076,7 +1084,7 @@ function calcs.offence(env, actor, activeSkill) modDB:NewMod("DPS", "MORE", detonateTwice, "Grenade Activate Twice") end - if skillModList:Flag(nil, "HasSeals") and activeSkill.skillTypes[SkillType.Unleashable] and not skillModList:Flag(nil, "NoRepeatBonuses") then + if skillModList:Flag(nil, "HasSeals") and skillModList:Flag(nil, "DamageSeal") and not skillModList:Flag(nil, "NoRepeatBonuses") then -- Applies DPS multiplier based on seals count local totalCastSpeed = 1 / activeSkill.activeEffect.grantedEffect.castTime * calcLib.mod(skillModList, skillCfg, "Speed") output.SealCooldown = activeSkill.activeEffect.grantedEffect.castTime * skillModList:Sum("BASE", skillCfg, "SealGainFrequency") / calcLib.mod(skillModList, skillCfg, "SealGainFrequency") / 100 @@ -5648,7 +5656,7 @@ function calcs.offence(env, actor, activeSkill) elseif skillFlags.totem then useSpeed = (output.Cooldown and output.Cooldown > 0 and (output.TotemPlacementSpeed > 0 and output.TotemPlacementSpeed or 1 / output.Cooldown) or output.TotemPlacementSpeed) / repeats timeType = "totem placement" - elseif skillModList:Flag(nil, "HasSeals") and skillModList:Flag(nil, "UseMaxUnleash") then + elseif skillModList:Flag(nil, "HasSeals") and skillModList:Flag(nil, "DamageSeal") and skillModList:Flag(nil, "UseMaxUnleash") then useSpeed = env.player.mainSkill.skillData.hitTimeOverride / repeats timeType = "full unleash" elseif output.EffectiveReloadTime then -- Crossbows: Account for mana cost only happening on reload (once all bolts are fired) From 51a0f8b92b8478353c08ea0e8154e0c097a64fa6 Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Fri, 8 May 2026 12:17:10 -0500 Subject: [PATCH 2/2] dynamic skill name for damage/aoe source --- src/Modules/CalcOffence.lua | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index e2cd8fbd4..68f5c5548 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -392,13 +392,21 @@ function calcs.offence(env, actor, activeSkill) -- Calculate armour break output.ArmourBreakPerHit = calcLib.val(skillModList, "ArmourBreakPerHit", skillCfg) + local function getSkillNameFromFlag(skillModList, flag) + local sourceMod = skillModList:Tabulate("FLAG", nil, flag) + local sourceName = sourceMod[1] and sourceMod[1].mod and sourceMod[1].mod.source -- e.g. Skill:SupportExpandPlayer + local dataSkill = env.data.skills[(sourceName:gsub("Skill:", ""))] + return dataSkill and dataSkill.name + end + local function calcAreaOfEffect(skillModList, skillCfg, skillData, skillFlags, output, breakdown) -- Applies increased AoE based on seals count if skillModList:Flag(nil, "HasSeals") and skillModList:Flag(nil, "AreaSeal") and not skillModList:Flag(nil, "NoRepeatBonuses") then output.SealCooldown = activeSkill.activeEffect.grantedEffect.castTime * skillModList:Sum("BASE", skillCfg, "SealGainFrequency") / calcLib.mod(skillModList, skillCfg, "SealGainFrequency") / 100 output.SealMax = skillModList:Sum("BASE", skillCfg, "SealCount") output.TimeMaxSeals = output.SealCooldown * output.SealMax - env.player.mainSkill.skillModList:NewMod("AreaOfEffect", "INC", (output.SealMax * (calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") - 1) * 100), "Expand") + local skillName = getSkillNameFromFlag(skillModList, "AreaSeal") or "Support" + env.player.mainSkill.skillModList:NewMod("AreaOfEffect", "INC", (output.SealMax * (calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") - 1) * 100), skillName) end local incArea, moreArea = calcLib.mods(skillModList, skillCfg, "AreaOfEffect", "AreaOfEffectPrimary") @@ -1093,15 +1101,16 @@ function calcs.offence(env, actor, activeSkill) output.TimeMaxSeals = output.SealCooldown * output.SealMax if not skillData.hitTimeOverride then + local skillName = getSkillNameFromFlag(skillModList, "DamageSeal") or "Support" if skillModList:Flag(nil, "UseMaxUnleash") then for i, value in ipairs(skillModList:Tabulate("INC", { }, "MaxSealCrit")) do local mod = value.mod skillModList:NewMod("CritChance", "INC", mod.value, mod.source, mod.flags, mod.keywordFlags, unpack(mod)) end - env.player.mainSkill.skillModList:NewMod("DPS", "MORE", (output.SealMax * calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty")) * 100, "Unleash") + env.player.mainSkill.skillModList:NewMod("DPS", "MORE", (output.SealMax * calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty")) * 100, skillName) env.player.mainSkill.skillData.hitTimeOverride = m_max(output.TimeMaxSeals, totalCastSpeed * 1.1) else - env.player.mainSkill.skillModList:NewMod("DPS", "MORE", round(1 / output.SealCooldown / (totalCastSpeed * 1.1) * calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") * 100, 2), "Unleash") + env.player.mainSkill.skillModList:NewMod("DPS", "MORE", round(1 / output.SealCooldown / (totalCastSpeed * 1.1) * calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") * 100, 2), skillName) end end