From b449b86183f613032a241477992ba8627d172488 Mon Sep 17 00:00:00 2001 From: GreatNameIncoming Date: Tue, 24 Mar 2026 18:57:58 +0100 Subject: [PATCH] Added support for remnant effect --- src/Data/ModCache.lua | 8 ++--- src/Data/SkillStatMap.lua | 19 +++++++++++ src/Modules/CalcOffence.lua | 62 +++++++++++++++++++++++++++++++++++ src/Modules/CalcPerform.lua | 11 +++++++ src/Modules/CalcSections.lua | 19 +++++++++++ src/Modules/ConfigOptions.lua | 10 +++--- src/Modules/ModParser.lua | 3 +- 7 files changed, 119 insertions(+), 13 deletions(-) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 2bd89bc8a..8ace5a64e 100644 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -5903,13 +5903,9 @@ c["Remnants can be collected from 50% further away All Flames of Chayula that yo c["Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Purple"]={nil,"Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Purple "} c["Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Red"]={nil,"Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Red "} c["Remnants can be collected from 50% further away Remnants you create reappear once, 3 seconds after being collected"]={nil,"Remnants can be collected from 50% further away Remnants you create reappear once, 3 seconds after being collected "} -c["Remnants have 10% increased effect"]={nil,"Remnants have 10% increased effect "} +c["Remnants have 10% increased effect"]={{[1]={flags=0,keywordFlags=0,name="RemnantEffect",type="INC",value=10}},nil} c["Remnants have 2% increased effect per 10 Tribute"]={nil,"Remnants have 2% increased effect per 10 Tribute "} -c["Remnants have 50% increased effect"]={nil,"Remnants have 50% increased effect "} -c["Remnants have 50% increased effect Remnants can be collected from 50% further away"]={nil,"Remnants have 50% increased effect Remnants can be collected from 50% further away "} -c["Remnants have 50% increased effect Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Blue"]={nil,"Remnants have 50% increased effect Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Blue "} -c["Remnants have 50% increased effect Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Purple"]={nil,"Remnants have 50% increased effect Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Purple "} -c["Remnants have 50% increased effect Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Red"]={nil,"Remnants have 50% increased effect Remnants can be collected from 50% further away All Flames of Chayula that you manifest are Red "} +c["Remnants have 50% increased effect"]={{[1]={flags=0,keywordFlags=0,name="RemnantEffect",type="INC",value=50}},nil} c["Remnants you create reappear once, 3 seconds after being collected"]={nil,"Remnants you create reappear once, 3 seconds after being collected "} c["Remove Ignite when you Warcry"]={nil,"Remove Ignite when you Warcry "} c["Remove a Curse after Channelling for 2 seconds"]={nil,"Remove a Curse after Channelling for 2 seconds "} diff --git a/src/Data/SkillStatMap.lua b/src/Data/SkillStatMap.lua index 99a3e994c..05792d089 100644 --- a/src/Data/SkillStatMap.lua +++ b/src/Data/SkillStatMap.lua @@ -2820,6 +2820,25 @@ return { ["supported_minion_skill_gem_level_+"] = { mod("SupportedGemProperty", "LIST", { keyword = "grants_active_skill", key = "level", value = nil }, 0, 0, { type = "SkillType", skillType = SkillType.Minion }), }, +-- Remnant stats +["remnant_effect_+%"] = { + mod("RemnantEffect", "INC", nil), +}, +["life_remnants_gain_per_globe"] = { + mod("LifeGainPerRemnant", "BASE", nil), +}, +["mana_remnants_mana_gain_per_globe"] = { + mod("ManaGainPerRemnant", "BASE", nil), +}, +["breach_flame_life_leech_%"] = { + mod("BreachFlameLifeLeech", "BASE", nil), +}, +["breach_flame_mana_leech_%"] = { + mod("BreachFlameManaLeech", "BASE", nil), +}, +["breach_flame_chaos_addition_%"] = { + mod("BreachFlameChaosGain", "BASE", nil), +}, -- Display only ["quality_display_base_additional_arrows_is_gem"] = { -- Display only diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index 7f237aa2f..e33bf8558 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -1421,6 +1421,68 @@ function calcs.offence(env, actor, activeSkill) breakdown.LinkEffectMod = breakdown.mod(skillModList, skillCfg, "LinkEffect", "BuffEffect") end end + if activeSkill.skillTypes[SkillType.GeneratesRemnants] then + local remnantEffectMod = calcLib.mod(skillModList, skillCfg, "RemnantEffect") + output.RemnantEffectMod = remnantEffectMod + if breakdown then + breakdown.RemnantEffectMod = breakdown.mod(skillModList, skillCfg, "RemnantEffect") + end + local baseLifeGain = skillModList:Sum("BASE", skillCfg, "LifeGainPerRemnant") + if baseLifeGain > 0 then + output.LifeGainPerRemnant = m_floor(baseLifeGain * remnantEffectMod) + if breakdown then + breakdown.LifeGainPerRemnant = { + s_format("%d ^8(base life per remnant)", baseLifeGain), + s_format("x %.2f ^8(remnant effect modifier)", remnantEffectMod), + s_format("= %d ^8(life per remnant)", output.LifeGainPerRemnant), + } + end + end + local baseManaGain = skillModList:Sum("BASE", skillCfg, "ManaGainPerRemnant") + if baseManaGain > 0 then + output.ManaGainPerRemnant = m_floor(baseManaGain * remnantEffectMod) + if breakdown then + breakdown.ManaGainPerRemnant = { + s_format("%d ^8(base mana per remnant)", baseManaGain), + s_format("x %.2f ^8(remnant effect modifier)", remnantEffectMod), + s_format("= %d ^8(mana per remnant)", output.ManaGainPerRemnant), + } + end + end + local baseChaosGainPerFlame = skillModList:Sum("BASE", skillCfg, "BreachFlameChaosGain") + if baseChaosGainPerFlame > 0 then + output.ChaosGainPerFlame = m_floor(baseChaosGainPerFlame * remnantEffectMod) + if breakdown then + breakdown.ChaosGainPerFlame = { + s_format("%d%% ^8(base chaos gain per flame)", baseChaosGainPerFlame), + s_format("x %.2f ^8(remnant effect modifier)", remnantEffectMod), + s_format("= %d%% ^8(damage gained as chaos per flame)", output.ChaosGainPerFlame), + } + end + end + local baseLifeLeech = skillModList:Sum("BASE", skillCfg, "BreachFlameLifeLeech") + if baseLifeLeech > 0 then + output.BreachFlameLifeLeech = m_floor(baseLifeLeech * remnantEffectMod) + if breakdown then + breakdown.BreachFlameLifeLeech = { + s_format("%d%% ^8(base life leech per flame)", baseLifeLeech), + s_format("x %.2f ^8(remnant effect modifier)", remnantEffectMod), + s_format("= %d%% ^8(life leech per flame)", output.BreachFlameLifeLeech), + } + end + end + local baseManaLeech = skillModList:Sum("BASE", skillCfg, "BreachFlameManaLeech") + if baseManaLeech > 0 then + output.BreachFlameManaLeech = m_floor(baseManaLeech * remnantEffectMod) + if breakdown then + breakdown.BreachFlameManaLeech = { + s_format("%d%% ^8(base mana leech per flame)", baseManaLeech), + s_format("x %.2f ^8(remnant effect modifier)", remnantEffectMod), + s_format("= %d%% ^8(mana leech per flame)", output.BreachFlameManaLeech), + } + end + end + end if activeSkill.skillTypes[SkillType.IceCrystal] then local IceCrystalLifeMod = calcLib.mod(skillModList, skillCfg, "IceCrystalLife") local baseIceCrystal = skillModList:Sum("BASE", skillCfg, "IceCrystalLifeBase") diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index cd5a2bc12..f9cc34855 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -1178,6 +1178,17 @@ function calcs.perform(env, skipEHP) -- Set trigger time to 1 min in ms ( == 6000 ). Technically any large value would do. activeSkill.skillData.triggerTime = 60 * 1000 end + -- Into the Breach: only purple flames get calculated + if activeSkill.activeEffect.grantedEffect.name == "Into the Breach" then + local purpleFlameCount = modDB:Sum("BASE", nil, "Multiplier:PurpleFlamesCount") + local baseChaosGain = activeSkill.skillModList:Sum("BASE", nil, "BreachFlameChaosGain") + if purpleFlameCount > 0 and baseChaosGain > 0 then + local remnantEffectMod = calcLib.mod(activeSkill.skillModList, nil, "RemnantEffect") + local doubled = modDB:Flag(nil, "BreachFlameEffectDoubled") and 2 or 1 + local chaosGainPerFlame = m_floor(baseChaosGain * remnantEffectMod * doubled) + modDB:NewMod("DamageGainAsChaos", "BASE", chaosGainPerFlame * purpleFlameCount, "Into the Breach", { type = "GlobalEffect", effectType = "Buff" }) + end + end -- The Saviour if activeSkill.activeEffect.grantedEffect.name == "Reflection" or activeSkill.skillData.triggeredBySaviour then activeSkill.infoMessage = "Triggered by a Crit from The Saviour" diff --git a/src/Modules/CalcSections.lua b/src/Modules/CalcSections.lua index ab1596c29..fa8931b92 100644 --- a/src/Modules/CalcSections.lua +++ b/src/Modules/CalcSections.lua @@ -745,6 +745,25 @@ return { { breakdown = "LinkEffectMod" }, { modName = { "LinkEffect", "BuffEffect" }, cfg = "skill" }, }, }, + { label = "Remnant Effect Mod", haveOutput = "RemnantEffectMod", { format = "x {2:output:RemnantEffectMod}", + { breakdown = "RemnantEffectMod" }, + { modName = "RemnantEffect", cfg = "skill" }, + }, }, + { label = "Life per Remnant", haveOutput = "LifeGainPerRemnant", { format = "{0:output:LifeGainPerRemnant}", + { breakdown = "LifeGainPerRemnant" }, + }, }, + { label = "Mana per Remnant", haveOutput = "ManaGainPerRemnant", { format = "{0:output:ManaGainPerRemnant}", + { breakdown = "ManaGainPerRemnant" }, + }, }, + { label = "Chaos Gain/Flame", haveOutput = "ChaosGainPerFlame", { format = "{0:output:ChaosGainPerFlame}%", + { breakdown = "ChaosGainPerFlame" }, + }, }, + { label = "Life Leech/Flame", haveOutput = "BreachFlameLifeLeech", { format = "{0:output:BreachFlameLifeLeech}%", + { breakdown = "BreachFlameLifeLeech" }, + }, }, + { label = "Mana Leech/Flame", haveOutput = "BreachFlameManaLeech", { format = "{0:output:BreachFlameManaLeech}%", + { breakdown = "BreachFlameManaLeech" }, + }, }, { label = "Area of Effect Mod", haveOutput = "AreaOfEffectMod", { format = "x {2:output:AreaOfEffectMod}", { breakdown = "AreaOfEffectMod" }, { modName = "AreaOfEffect", cfg = "skill" }, diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index 721a75876..0e959773e 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -206,12 +206,6 @@ local configSettings = { { var = "arcaneCloakUsedRecentlyCheck", type = "check", label = "Include in ^x7070FFMana ^7spent Recently?", ifSkill = "Arcane Cloak", tooltip = "When enabled, the mana spent by Arcane Cloak used at full mana \nwill be added to the value provided in # of ^x7070FFMana ^7spent Recently.", apply = function(val, modList, enemyModList) modList:NewMod("Condition:ArcaneCloakUsedRecently", "FLAG", true, "Config") end }, - { label = "Flame of Chayula Breaches:", ifSkill = "Into the Breach" }, - { var = "flameStacks", type = "count", label = "Chayula Breach Flames:", tooltip = "Amount of Red, Blue & Purple Flames consumed during duration (max 10)", ifSkill = { "Into the Breach" }, apply = function(val, modList, enemyModList) - modList:NewMod("Multiplier:BreachFlamesCount", "BASE", m_min(val, 10), "Config") - modList:NewMod("Multiplier:FlameEffect", "BASE", 1, "Config") - modList:NewMod("DamageGainAsChaos", "BASE", 7, "Config", { type = "Multiplier", var = "BreachFlamesCount" }, { type = "Multiplier", var = "FlameEffect" }, { type = "GlobalEffect", effectType = "Buff" }) - end }, { label = "Aspect of the Avian:", ifSkill = "Aspect of the Avian" }, { var = "aspectOfTheAvianAviansMight", type = "check", label = "Is Avian's Might active?", ifSkill = "Aspect of the Avian", apply = function(val, modList, enemyModList) modList:NewMod("Condition:AviansMightActive", "FLAG", true, "Config") @@ -420,6 +414,10 @@ local configSettings = { { var = "intensifyIntensity", type = "count", label = "# of Intensity:", ifSkill = { "Intensify", "Crackling Lance", "Pinpoint" }, apply = function(val, modList, enemyModList) modList:NewMod("Multiplier:Intensity", "BASE", val, "Config") end }, + { label = "Into the Breach:", ifSkill = "Into the Breach" }, + { var = "purpleFlameStacks", type = "count", label = "Purple Flames collected:", tooltip = "Number of Purple Flames of Chayula collected (max 10).", ifSkill = { "Into the Breach" },apply = function(val, modList, enemyModList) + modList:NewMod("Multiplier:PurpleFlamesCount", "BASE", m_min(val, 10), "Config") + end }, { label = "Link Skills:", ifSkill = { "Destructive Link", "Flame Link", "Intuitive Link", "Protective Link", "Soul Link", "Vampiric Link" } }, { var = "multiplierLinkedTargets", type = "count", label = "# of linked Targets:", ifSkill = { "Destructive Link", "Flame Link", "Intuitive Link", "Protective Link", "Soul Link", "Vampiric Link" }, apply = function(val, modList, enemyModList) modList:NewMod("Multiplier:LinkedTargets", "BASE", val, "Config") diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 3feb3402a..32f67e3c1 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -3288,7 +3288,7 @@ local specialModList = { ["(%d+)%% chance to gain (%d+)%% of damage with hits as extra (%a+) damage"] = function(num, _, num2, strType) return { mod("DamageGainAs"..firstToUpper(strType), "BASE", tonumber(num2) * (num / 100), nil, ModFlag.Hit, 0), } end, - ["effect and duration of flames of chayula on you is doubled"] = { mod("Multiplier:FlameEffect", "BASE", 1) } , + ["effect and duration of flames of chayula on you is doubled"] = { flag("BreachFlameEffectDoubled") }, ["mana leech recovers based on other damage types damage as well as physical damage"] = { -- legacy wording flag("ManaLeechBasedOnElementalDamage"), flag("ManaLeechBasedOnChaosDamage"), @@ -5358,6 +5358,7 @@ local specialModList = { ["while a pinnacle atlas boss is in your presence, flasks applied to you have (%d+)%% increased effect"] = function(num) return { mod("FlaskEffect", "INC", num, { type = "ActorCondition", actor = "enemy", var = "PinnacleBoss" }, { type = "ActorCondition", actor = "player"}) } end, ["magic utility flasks applied to you have (%d+)%% increased effect"] = function(num) return { mod("MagicUtilityFlaskEffect", "INC", num, { type = "ActorCondition", actor = "player"}) } end, ["flasks applied to you have (%d+)%% reduced effect"] = function(num) return { mod("FlaskEffect", "INC", -num, { type = "ActorCondition", actor = "player"}) } end, + ["remnants have (%d+)%% increased effect"] = function(num) return { mod("RemnantEffect", "INC", num) } end, ["(%d+)%% increased charm cooldown recovery rate"] = function(num) return { mod("CharmCooldownRecovery", "INC", num) } end, ["adds (%d+) passive skills"] = function(num) return { mod("JewelData", "LIST", { key = "clusterJewelNodeCount", value = num }) } end, ["1 added passive skill is a jewel socket"] = { mod("JewelData", "LIST", { key = "clusterJewelSocketCount", value = 1 }) },