From e1a90aef54aa7384606c151287234bbd12b08ccc Mon Sep 17 00:00:00 2001 From: Igor Wessel Date: Sat, 25 Jan 2025 07:03:32 -0300 Subject: [PATCH 1/8] add slow magnitude modifier and apex moment --- src/Modules/ModParser.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index eddf4962f2..99e26eb7e6 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -2890,6 +2890,10 @@ local specialModList = { mod("Speed", "MORE", num, nil, ModFlag.Cast, { type = "GlobalEffect", effectType = "Buff", effectName = "Quicksand Hourglass" }, { type = "Condition", var = "QuicksandHourglass" }), flag("Condition:CanGainQuicksandHourglass") } end, + ["enemies in your presence are slowed by (%d+)%%"] = function(num) return { + mod("EnemyModifier", "LIST", { mod = flag("Condition:Slowed") }), + mod("EnemyModifier", "LIST", { mod = mod("ApexOfMomentSlow", "INC", -num, { type = "GlobalEffect", effectType = "AuraDebuff" }, { type = "Condition", var = "Slowed" }) }), + } end, -- Item local modifiers ["has no sockets"] = { flag("NoSockets") }, ["reflects your other ring"] = { @@ -3593,6 +3597,12 @@ local specialModList = { ["adrenaline"] = { flag("Condition:Adrenaline") }, ["arcane surge"] = { flag("Condition:ArcaneSurge") }, ["your aura buffs do not affect allies"] = { flag("SelfAurasCannotAffectAllies") }, + ["debuffs you inflict have (%d+)%% increased slow magnitude"] = function(num) return { + mod("EnemySlowMagnitude", "INC", num), + } end, + ["debuffs you inflict have (%d+)%% reduced slow magnitude"] = function(num) return { + mod("EnemySlowMagnitude", "INC", -num), + } end, ["your curses have (%d+)%% increased effect if (%d+)%% of curse duration expired"] = function(num, _, limit) return { mod("CurseEffect", "INC", num, { type = "MultiplierThreshold", actor = "enemy", var = "CurseExpired", threshold = tonumber(limit) }, { type = "SkillType", skillType = SkillType.AppliesCurse }) } end, From b9e2767a0fd69f727f661a98a9a5bb0510f76dee Mon Sep 17 00:00:00 2001 From: Igor Wessel Date: Sat, 25 Jan 2025 07:05:02 -0300 Subject: [PATCH 2/8] implement slow magnitude --- src/Data/ModCache.lua | 12 +++++------- src/Data/Skills/act_int.lua | 8 ++++++++ src/Export/Skills/act_int.txt | 10 +++++++++- src/Modules/CalcPerform.lua | 33 +++++++++++++++++++++++++++++---- src/Modules/CalcSections.lua | 5 +++-- src/Modules/ConfigOptions.lua | 18 +++++++++++++++++- src/Modules/Data.lua | 1 - 7 files changed, 71 insertions(+), 16 deletions(-) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 930e53b57c..df2746ff05 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -2522,12 +2522,10 @@ c["Deal up to 30% more Damage to Enemies based on their missing Concentration"]= c["Deals 25% of current Mana as Chaos Damage to you when Effect ends"]={nil,"Deals 25% of current Mana as Chaos Damage to you when Effect ends "} c["Debuffs on you expire 10% faster"]={{[1]={flags=0,keywordFlags=0,name="SelfDebuffExpirationRate",type="BASE",value=10}},nil} c["Debuffs on you expire 20% faster"]={{[1]={flags=0,keywordFlags=0,name="SelfDebuffExpirationRate",type="BASE",value=20}},nil} -c["Debuffs you inflict have 10% increased Slow Magnitude"]={nil,"Debuffs you inflict have 10% increased Slow Magnitude "} -c["Debuffs you inflict have 10% increased Slow Magnitude Debuffs on you expire 20% faster"]={nil,"Debuffs you inflict have 10% increased Slow Magnitude Debuffs on you expire 20% faster "} -c["Debuffs you inflict have 4% increased Slow Magnitude"]={nil,"Debuffs you inflict have 4% increased Slow Magnitude "} -c["Debuffs you inflict have 4% increased Slow Magnitude 20% increased Hinder Duration"]={nil,"Debuffs you inflict have 4% increased Slow Magnitude 20% increased Hinder Duration "} -c["Debuffs you inflict have 5% increased Slow Magnitude"]={nil,"Debuffs you inflict have 5% increased Slow Magnitude "} -c["Debuffs you inflict have 6% increased Slow Magnitude"]={nil,"Debuffs you inflict have 6% increased Slow Magnitude "} +c["Debuffs you inflict have 10% increased Slow Magnitude"]={{[1]={flags=0,keywordFlags=0,name="EnemySlowMagnitude",type="INC",value=10}},nil} +c["Debuffs you inflict have 4% increased Slow Magnitude"]={{[1]={flags=0,keywordFlags=0,name="EnemySlowMagnitude",type="INC",value=4}},nil} +c["Debuffs you inflict have 5% increased Slow Magnitude"]={{[1]={flags=0,keywordFlags=0,name="EnemySlowMagnitude",type="INC",value=5}},nil} +c["Debuffs you inflict have 6% increased Slow Magnitude"]={{[1]={flags=0,keywordFlags=0,name="EnemySlowMagnitude",type="INC",value=6}},nil} c["Decimating Strike"]={nil,"Decimating Strike "} c["Defend with 120% of Armour against Projectile Attacks"]={nil,"Defend with 120% of Armour against Projectile Attacks "} c["Defend with 120% of Armour while not on Low Energy Shield"]={{[1]={[1]={neg=true,type="Condition",var="LowEnergyShield"},flags=0,keywordFlags=0,name="ArmourDefense",source="Armour and Energy Shield Mastery",type="MAX",value=20}},nil} @@ -2580,7 +2578,7 @@ c["Enemies in your Presence are Blinded"]={nil,"Enemies in your Presence are Bli c["Enemies in your Presence are Blinded Enemies in your Presence gain Critical Weakness every second"]={nil,"Enemies in your Presence are Blinded Enemies in your Presence gain Critical Weakness every second "} c["Enemies in your Presence are Ignited as though dealt 100 Base Fire Damage"]={nil,"Enemies in your Presence are Ignited as though dealt 100 Base Fire Damage "} c["Enemies in your Presence are Intimidated"]={nil,"Enemies in your Presence are Intimidated "} -c["Enemies in your Presence are Slowed by 20%"]={nil,"Enemies in your Presence are Slowed by 20% "} +c["Enemies in your Presence are Slowed by 20%"]={{[1]={flags=0,keywordFlags=0,name="EnemyModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Condition:Slowed",type="FLAG",value=true}}},[2]={flags=0,keywordFlags=0,name="EnemyModifier",type="LIST",value={mod={[1]={effectType="AuraDebuff",type="GlobalEffect"},[2]={type="Condition",var="Slowed"},flags=0,keywordFlags=0,name="ApexOfMomentSlow",type="INC",value=-20}}}},nil} c["Enemies in your Presence gain Critical Weakness every second"]={{[1]={flags=0,keywordFlags=0,name="ApplyCriticalWeakness",type="FLAG",value=true}},nil} c["Enemies in your Presence have 10% reduced Cooldown Recovery Rate"]={nil,"Enemies in your Presence have 10% reduced Cooldown Recovery Rate "} c["Enemies in your Presence have Fire Exposure"]={nil,"Enemies in your Presence have Fire Exposure "} diff --git a/src/Data/Skills/act_int.lua b/src/Data/Skills/act_int.lua index ce2dfc328b..5f6cf21dcd 100644 --- a/src/Data/Skills/act_int.lua +++ b/src/Data/Skills/act_int.lua @@ -16616,6 +16616,14 @@ skills["TemporalChainsPlayer"] = { baseEffectiveness = 0, incrementalEffectiveness = 0.092720001935959, statDescriptionScope = "temporal_chains", + statMap = { + ["temporal_chains_base_action_speed_+%_final_to_apply"] = { + mod("TemporalChainsActionSpeed", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }) + }, + ["buff_time_passed_+%_other_than_temporal_chains"] = { + mod("BuffExpireFaster", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }), + }, + }, baseFlags = { area = true, duration = true, diff --git a/src/Export/Skills/act_int.txt b/src/Export/Skills/act_int.txt index 394de02c6b..d507b2fc61 100644 --- a/src/Export/Skills/act_int.txt +++ b/src/Export/Skills/act_int.txt @@ -989,7 +989,15 @@ statMap = { #skill TemporalChainsPlayer #set TemporalChainsPlayer -#flags area duration +#flags spell area duration curse +statMap = { + ["temporal_chains_base_action_speed_+%_final_to_apply"] = { + mod("TemporalChainsActionSpeed", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }) + }, + ["buff_time_passed_+%_other_than_temporal_chains"] = { + mod("BuffExpireFaster", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }), + }, +}, #mods #skillEnd diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index 4b45496791..a707a99d01 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -748,24 +748,46 @@ local function doActorCharges(env, actor) modDB.multipliers["SpiritCharge"] = output.SpiritCharges end +-- Process slow effects/magnitude +local function applySlowMagnitude(env) + local modDB = env.modDB + local enemyDB = env.enemyDB + if enemyDB:HasMod("INC", nil, "TemporalChainsActionSpeed", nil) then + enemyDB:NewMod("Condition:Slowed", "FLAG", true, 'Skill:TemporalChainsPlayer') + end + + if enemyDB:Flag(nil, "Condition:Slowed") then + local slowMagnitude = modDB:Sum("INC", nil, "EnemySlowMagnitude") / 100 + if slowMagnitude > 0 then + enemyDB:ScaleAddMod(modLib.createMod("TemporalChainsActionSpeed", "INC", enemyDB:Sum("INC", nil, "TemporalChainsActionSpeed"), "Slow Magnitude"), slowMagnitude) + enemyDB:ScaleAddMod(modLib.createMod("ApexOfMomentSlow", "INC", enemyDB:Sum("INC", nil, "ApexOfMomentSlow"), "Slow Magnitude"), slowMagnitude) + end + end +end function calcs.actionSpeedMod(actor) local modDB = actor.modDB local minimumActionSpeed = modDB:Max(nil, "MinimumActionSpeed") or 0 local maximumActionSpeedReduction = modDB:Max(nil, "MaximumActionSpeedReduction") local actionSpeedSum - local tempChainsSum + local slowEffectsSum -- if we are unaffected by slows, only count the positive modifiers to action speed if modDB:Flag(nil, "UnaffectedBySlows") then actionSpeedSum = modDB:SumPositiveValues("INC", nil, "ActionSpeed") - tempChainsSum = modDB:SumPositiveValues("INC", nil, "TemporalChainsActionSpeed") + slowEffectsSum = modDB:SumPositiveValues("INC", nil, "ApexOfMomentSlow", "TemporalChainsActionSpeed") else actionSpeedSum = modDB:Sum("INC", nil, "ActionSpeed") - tempChainsSum = modDB:Sum("INC", nil, "TemporalChainsActionSpeed") + slowEffectsSum = modDB:Sum("INC", nil, "ApexOfMomentSlow", "TemporalChainsActionSpeed") end + + -- local slowMultiplier = (1 + tempChains / 100) * (1 + apexOfMoment / 100) * (1 + modDB:Sum("INC", nil, "ActionSpeed", "Chill") / 100) * modDB:More(nil, "ActionSpeed", "Less Slow") + local slowMultiplier = (1 + slowEffectsSum / 100) * (1 + modDB:Sum("INC", nil, "ActionSpeed", "Chill") / 100) * modDB:More(nil, "ActionSpeed", "Less Slow") + local slowEffect = (1 - slowMultiplier) * 100 + + local actionSpeedMod = 1 + (-slowEffect + actionSpeedSum) / 100 - local actionSpeedMod = 1 + (m_max(-data.misc.TemporalChainsEffectCap, tempChainsSum) + actionSpeedSum) / 100 + -- local actionSpeedMod = 1 + (slowEffectsSum + actionSpeedSum) / 100 actionSpeedMod = m_max(minimumActionSpeed / 100, actionSpeedMod) if maximumActionSpeedReduction then actionSpeedMod = m_min((100 - maximumActionSpeedReduction) / 100, actionSpeedMod) @@ -2872,6 +2894,9 @@ function calcs.perform(env, skipEHP) enemyDB:NewMod("DamageTaken", "INC", enemyDB:Sum("INC", nil, "DamageTakenConsecratedGround") * effect, "Consecrated Ground") end + -- Handle Slow + applySlowMagnitude(env) + -- Defence/offence calculations calcs.defence(env, env.player) if not skipEHP then diff --git a/src/Modules/CalcSections.lua b/src/Modules/CalcSections.lua index c663b74e61..b986ddb0e2 100644 --- a/src/Modules/CalcSections.lua +++ b/src/Modules/CalcSections.lua @@ -2196,8 +2196,9 @@ return { { label = "Hits before death", { format = "{2:output:TotalNumberOfHits}", { breakdown = "TotalNumberOfHits" }}, }, { label = "Effective Hit Pool",{ format = "{0:output:TotalEHP}", { breakdown = "TotalEHP" }, },}, { label = "Time before death",{ format = "{2:output:EHPSurvivalTime}s", - { breakdown = "EHPSurvivalTime" }, - { label = "Enemy modifiers", modName = { "TemporalChainsActionSpeed", "ActionSpeed", "Speed", "MinimumActionSpeed" }, enemy = true }, + { breakdown = "EHPSurvivalTime" }, + { label = "Player modifiers", modName = { "EnemySlowMagnitude" } }, + { label = "Enemy modifiers", modName = { "TemporalChainsActionSpeed", "ApexOfMomentSlow", "EnemySlowMagnitude", "Slow", "ActionSpeed", "Speed", "MinimumActionSpeed" }, enemy = true }, },} }, }, { defaultCollapsed = false, label = "Maximum Hit Taken", data = { colWidth = 114, diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index 44f19bb278..bfe7d9aa63 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -1458,6 +1458,9 @@ Huge sets the radius to 11. { var = "conditionEnemyMoving", type = "check", label = "Is the enemy Moving?", ifMod = "BleedChance", apply = function(val, modList, enemyModList) enemyModList:NewMod("Condition:Moving", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) end }, + { var = "conditionEnemySlowed", type = "check", label = "Is the enemy Slowed?", apply = function(val, modList, enemyModList) + enemyModList:NewMod("Condition:Slowed", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) + end }, { var = "conditionEnemyFullLife", type = "check", label = "Is the enemy on Full ^xE05030Life?", ifEnemyCond = "FullLife", apply = function(val, modList, enemyModList) enemyModList:NewMod("Condition:FullLife", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) end }, @@ -1732,6 +1735,14 @@ Huge sets the radius to 11. { var = "conditionEnemyRareOrUnique", type = "check", label = "Is the enemy Rare or Unique?", ifEnemyCond = "EnemyRareOrUnique", tooltip = "The enemy will automatically be considered to be Unique if they are a Boss,\nbut you can use this option to force it if necessary.", apply = function(val, modList, enemyModList) enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) end }, + { var = "conditionEnemyMagic", type = "check", label = s_format("Is the enemy %sMagic?", colorCodes.MAGIC), tooltip = "", apply = function(val, modList, enemyModList) + enemyModList:NewMod("Condition:Magic", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) + enemyModList:NewMod("ActionSpeed", "MORE", 15, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) + end }, + { var = "conditionEnemyRare", type = "check", label = s_format("Is the enemy %sRare?", colorCodes.RARE), tooltip = "", apply = function(val, modList, enemyModList) + enemyModList:NewMod("Condition:Rare", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) + enemyModList:NewMod("ActionSpeed", "MORE", 30, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) + end }, { var = "enemyIsBoss", type = "list", label = "Is the enemy a Boss?", defaultIndex = 3, tooltip = data.enemyIsBossTooltip, list = {{val="None",label="No"},{val="Boss",label="Standard Boss"},{val="Pinnacle",label="Guardian/Pinnacle Boss"},{val="Uber",label="Uber Pinnacle Boss"}}, apply = function(val, modList, enemyModList, build) -- These defaults are here so that the placeholders get reset correctly build.configTab.varControls['enemySpeed']:SetPlaceholder(700, true) @@ -1766,8 +1777,10 @@ Huge sets the radius to 11. build.configTab.varControls['enemyArmour']:SetPlaceholder(data.monsterArmourTable[defaultLevel], true) build.configTab.varControls['enemyEvasion']:SetPlaceholder(data.monsterEvasionTable[defaultLevel], true) - elseif val == "Boss" then + elseif val == "Boss" then + enemyModList:NewMod("Condition:Unique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) + enemyModList:NewMod("ActionSpeed", "MORE", 50, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) enemyModList:NewMod("AilmentThreshold", "MORE", 488, "Boss") modList:NewMod("WarcryPower", "BASE", 20, "Boss") modList:NewMod("Multiplier:EnemyPower", "BASE", 20, "Boss") @@ -1801,8 +1814,10 @@ Huge sets the radius to 11. build.configTab.varControls['enemyArmour']:SetPlaceholder(data.monsterArmourTable[defaultLevel], true) build.configTab.varControls['enemyEvasion']:SetPlaceholder(data.monsterEvasionTable[defaultLevel], true) elseif val == "Pinnacle" then + enemyModList:NewMod("Condition:Unique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:PinnacleBoss", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) + enemyModList:NewMod("ActionSpeed", "MORE", 50, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) enemyModList:NewMod("AilmentThreshold", "MORE", 404, "Boss") modList:NewMod("WarcryPower", "BASE", 20, "Boss") modList:NewMod("Multiplier:EnemyPower", "BASE", 20, "Boss") @@ -1836,6 +1851,7 @@ Huge sets the radius to 11. elseif val == "Uber" then enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:PinnacleBoss", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) + enemyModList:NewMod("ActionSpeed", "MORE", 50, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) enemyModList:NewMod("DamageTaken", "MORE", -70, "Boss") enemyModList:NewMod("AilmentThreshold", "MORE", 404, "Boss") modList:NewMod("WarcryPower", "BASE", 20, "Boss") diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index 2c07d84d06..ab5a59ba6a 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -154,7 +154,6 @@ data.misc = { -- magic numbers ServerTickRate = 1 / 0.033, AccuracyPerDexBase = 5, LowPoolThreshold = 0.35, - TemporalChainsEffectCap = 75, BuffExpirationSlowCap = 0.25, DamageReductionCap = 90, ResistFloor = -200, From 966154165eb51b17510c1e2c06920f3b377fa578 Mon Sep 17 00:00:00 2001 From: Igor Wessel Date: Sun, 26 Jan 2025 07:50:29 -0300 Subject: [PATCH 3/8] add slow magnitude in modnamelist/preflaglist --- src/Modules/ModParser.lua | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 99e26eb7e6..87a311de35 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -782,6 +782,7 @@ local modNameList = { ["to ignore enemy physical damage reduction"] = "ChanceToIgnoreEnemyPhysicalDamageReduction", ["weapon swap speed"] = "WeaponSwapSpeed", ["to chain an additional time from terrain"] = "TerrainChainChance", + ["slow magnitude"] = "EnemySlowMagnitude", -- Flask and Charm modifiers ["effect"] = "LocalEffect", ["effect of flasks"] = "FlaskEffect", @@ -1216,6 +1217,7 @@ local preFlagList = { ["^hits against you "] = { applyToEnemy = true, flags = ModFlag.Hit }, ["^hits against you [hd][ae][va][el] "] = { applyToEnemy = true, flags = ModFlag.Hit }, ["^enemies near your totems deal "] = { applyToEnemy = true }, + ["^debuffs you inflict [hd][ae][va][el] "] = { }, -- Other ["^your flasks grant "] = { }, ["^when hit, "] = { }, @@ -3597,12 +3599,6 @@ local specialModList = { ["adrenaline"] = { flag("Condition:Adrenaline") }, ["arcane surge"] = { flag("Condition:ArcaneSurge") }, ["your aura buffs do not affect allies"] = { flag("SelfAurasCannotAffectAllies") }, - ["debuffs you inflict have (%d+)%% increased slow magnitude"] = function(num) return { - mod("EnemySlowMagnitude", "INC", num), - } end, - ["debuffs you inflict have (%d+)%% reduced slow magnitude"] = function(num) return { - mod("EnemySlowMagnitude", "INC", -num), - } end, ["your curses have (%d+)%% increased effect if (%d+)%% of curse duration expired"] = function(num, _, limit) return { mod("CurseEffect", "INC", num, { type = "MultiplierThreshold", actor = "enemy", var = "CurseExpired", threshold = tonumber(limit) }, { type = "SkillType", skillType = SkillType.AppliesCurse }) } end, From 9cb617e9a4fc65d7529fd16dcd768fda3c32ac6a Mon Sep 17 00:00:00 2001 From: Igor Wessel Date: Mon, 27 Jan 2025 02:40:31 -0300 Subject: [PATCH 4/8] refactor handle slow magnitude and slow effect --- src/Modules/CalcPerform.lua | 25 ++++++++++++++++++------- src/Modules/ConfigOptions.lua | 10 +++++----- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index a707a99d01..6570d28cc6 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -757,15 +757,27 @@ local function applySlowMagnitude(env) end if enemyDB:Flag(nil, "Condition:Slowed") then - local slowMagnitude = modDB:Sum("INC", nil, "EnemySlowMagnitude") / 100 - if slowMagnitude > 0 then - enemyDB:ScaleAddMod(modLib.createMod("TemporalChainsActionSpeed", "INC", enemyDB:Sum("INC", nil, "TemporalChainsActionSpeed"), "Slow Magnitude"), slowMagnitude) - enemyDB:ScaleAddMod(modLib.createMod("ApexOfMomentSlow", "INC", enemyDB:Sum("INC", nil, "ApexOfMomentSlow"), "Slow Magnitude"), slowMagnitude) + local slowMagnitude = modDB:Sum("INC", nil, "EnemySlowMagnitude") + local lessSlow = enemyDB:More("MORE", nil, "Slow", "Less Slow") + slowMagnitude = slowMagnitude * lessSlow / 100 + + -- magic 34% in my current build + -- rare 28% in my current build + -- unique 20% in my current build + for _, value in ipairs(enemyDB:Tabulate("INC", nil, "TemporalChainsActionSpeed", "ApexOfMomentSlow")) do + local mod = value.mod + if lessSlow ~= 0 then + enemyDB:ReplaceMod(mod.name, mod.type, mod.value * lessSlow, mod.source, mod.flags, mod.keywordFlags, unpack(mod)) + end + + enemyDB:ScaleAddMod(modLib.createMod(value.mod.name, value.mod.type, value.mod.value, "Slow Magnitude"), slowMagnitude) + + ConPrintTable(value, false) end end end -function calcs.actionSpeedMod(actor) +function calcs.actionSpeedMod(actor) local modDB = actor.modDB local minimumActionSpeed = modDB:Max(nil, "MinimumActionSpeed") or 0 local maximumActionSpeedReduction = modDB:Max(nil, "MaximumActionSpeedReduction") @@ -781,8 +793,7 @@ function calcs.actionSpeedMod(actor) slowEffectsSum = modDB:Sum("INC", nil, "ApexOfMomentSlow", "TemporalChainsActionSpeed") end - -- local slowMultiplier = (1 + tempChains / 100) * (1 + apexOfMoment / 100) * (1 + modDB:Sum("INC", nil, "ActionSpeed", "Chill") / 100) * modDB:More(nil, "ActionSpeed", "Less Slow") - local slowMultiplier = (1 + slowEffectsSum / 100) * (1 + modDB:Sum("INC", nil, "ActionSpeed", "Chill") / 100) * modDB:More(nil, "ActionSpeed", "Less Slow") + local slowMultiplier = (1 + slowEffectsSum / 100) * (1 + modDB:Sum("INC", nil, "ActionSpeed", "Chill") / 100) local slowEffect = (1 - slowMultiplier) * 100 local actionSpeedMod = 1 + (-slowEffect + actionSpeedSum) / 100 diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index bfe7d9aa63..782e520af7 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -1737,11 +1737,11 @@ Huge sets the radius to 11. end }, { var = "conditionEnemyMagic", type = "check", label = s_format("Is the enemy %sMagic?", colorCodes.MAGIC), tooltip = "", apply = function(val, modList, enemyModList) enemyModList:NewMod("Condition:Magic", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) - enemyModList:NewMod("ActionSpeed", "MORE", 15, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) + enemyModList:NewMod("Slow", "MORE", -15, "Less Slow", { type = "Condition", var = "Effective" }) end }, { var = "conditionEnemyRare", type = "check", label = s_format("Is the enemy %sRare?", colorCodes.RARE), tooltip = "", apply = function(val, modList, enemyModList) enemyModList:NewMod("Condition:Rare", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) - enemyModList:NewMod("ActionSpeed", "MORE", 30, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) + enemyModList:NewMod("Slow", "MORE", -30, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) end }, { var = "enemyIsBoss", type = "list", label = "Is the enemy a Boss?", defaultIndex = 3, tooltip = data.enemyIsBossTooltip, list = {{val="None",label="No"},{val="Boss",label="Standard Boss"},{val="Pinnacle",label="Guardian/Pinnacle Boss"},{val="Uber",label="Uber Pinnacle Boss"}}, apply = function(val, modList, enemyModList, build) -- These defaults are here so that the placeholders get reset correctly @@ -1780,7 +1780,7 @@ Huge sets the radius to 11. elseif val == "Boss" then enemyModList:NewMod("Condition:Unique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) - enemyModList:NewMod("ActionSpeed", "MORE", 50, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) + enemyModList:NewMod("Slow", "MORE", -50, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) enemyModList:NewMod("AilmentThreshold", "MORE", 488, "Boss") modList:NewMod("WarcryPower", "BASE", 20, "Boss") modList:NewMod("Multiplier:EnemyPower", "BASE", 20, "Boss") @@ -1817,7 +1817,7 @@ Huge sets the radius to 11. enemyModList:NewMod("Condition:Unique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:PinnacleBoss", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) - enemyModList:NewMod("ActionSpeed", "MORE", 50, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) + enemyModList:NewMod("Slow", "MORE", -50, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) enemyModList:NewMod("AilmentThreshold", "MORE", 404, "Boss") modList:NewMod("WarcryPower", "BASE", 20, "Boss") modList:NewMod("Multiplier:EnemyPower", "BASE", 20, "Boss") @@ -1851,7 +1851,7 @@ Huge sets the radius to 11. elseif val == "Uber" then enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:PinnacleBoss", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) - enemyModList:NewMod("ActionSpeed", "MORE", 50, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) + enemyModList:NewMod("Slow", "MORE", -50, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) enemyModList:NewMod("DamageTaken", "MORE", -70, "Boss") enemyModList:NewMod("AilmentThreshold", "MORE", 404, "Boss") modList:NewMod("WarcryPower", "BASE", 20, "Boss") From ef9720c8dc25722cecce8330b384fea37baf3843 Mon Sep 17 00:00:00 2001 From: Igor Wessel Date: Mon, 27 Jan 2025 03:22:30 -0300 Subject: [PATCH 5/8] fix round values for less slow --- src/Modules/CalcPerform.lua | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index 6570d28cc6..28d2de0224 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -760,19 +760,13 @@ local function applySlowMagnitude(env) local slowMagnitude = modDB:Sum("INC", nil, "EnemySlowMagnitude") local lessSlow = enemyDB:More("MORE", nil, "Slow", "Less Slow") slowMagnitude = slowMagnitude * lessSlow / 100 - - -- magic 34% in my current build - -- rare 28% in my current build - -- unique 20% in my current build for _, value in ipairs(enemyDB:Tabulate("INC", nil, "TemporalChainsActionSpeed", "ApexOfMomentSlow")) do local mod = value.mod if lessSlow ~= 0 then - enemyDB:ReplaceMod(mod.name, mod.type, mod.value * lessSlow, mod.source, mod.flags, mod.keywordFlags, unpack(mod)) + enemyDB:ReplaceMod(mod.name, mod.type, -round(mod.value * -lessSlow, nil), mod.source, mod.flags, mod.keywordFlags, unpack(mod)) end enemyDB:ScaleAddMod(modLib.createMod(value.mod.name, value.mod.type, value.mod.value, "Slow Magnitude"), slowMagnitude) - - ConPrintTable(value, false) end end end From 4b9feb7051fd2a114df2a381b5d46dc63c64a216 Mon Sep 17 00:00:00 2001 From: Igor Wessel Date: Sat, 8 Feb 2025 06:45:50 -0300 Subject: [PATCH 6/8] refactor to use a list for enemy rarity --- src/Modules/ConfigOptions.lua | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index 782e520af7..380b0396a9 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -1735,13 +1735,14 @@ Huge sets the radius to 11. { var = "conditionEnemyRareOrUnique", type = "check", label = "Is the enemy Rare or Unique?", ifEnemyCond = "EnemyRareOrUnique", tooltip = "The enemy will automatically be considered to be Unique if they are a Boss,\nbut you can use this option to force it if necessary.", apply = function(val, modList, enemyModList) enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) end }, - { var = "conditionEnemyMagic", type = "check", label = s_format("Is the enemy %sMagic?", colorCodes.MAGIC), tooltip = "", apply = function(val, modList, enemyModList) - enemyModList:NewMod("Condition:Magic", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) - enemyModList:NewMod("Slow", "MORE", -15, "Less Slow", { type = "Condition", var = "Effective" }) - end }, - { var = "conditionEnemyRare", type = "check", label = s_format("Is the enemy %sRare?", colorCodes.RARE), tooltip = "", apply = function(val, modList, enemyModList) - enemyModList:NewMod("Condition:Rare", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) - enemyModList:NewMod("Slow", "MORE", -30, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) + { var = "enemyRarity", type = "list", label = "Enemy Rarity:", defaultIndex = 1, tooltip = "", list = {{val="White",label="White"},{val="Magic",label=s_format("%sMagic", colorCodes.MAGIC)},{val="Rare",label=s_format("%sRare", colorCodes.RARE)}}, apply = function(val, modList, enemyModList, build) + if val == "Magic" then + enemyModList:NewMod("Condition:Magic", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) + enemyModList:NewMod("Slow", "MORE", -15, "Less Slow", { type = "Condition", var = "Effective" }) + elseif val == "Rare" then + enemyModList:NewMod("Condition:Rare", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) + enemyModList:NewMod("Slow", "MORE", -30, "Less Slow", { type = "Condition", var = "Effective" }, { type = "Condition", var = "Slowed" }) + end end }, { var = "enemyIsBoss", type = "list", label = "Is the enemy a Boss?", defaultIndex = 3, tooltip = data.enemyIsBossTooltip, list = {{val="None",label="No"},{val="Boss",label="Standard Boss"},{val="Pinnacle",label="Guardian/Pinnacle Boss"},{val="Uber",label="Uber Pinnacle Boss"}}, apply = function(val, modList, enemyModList, build) -- These defaults are here so that the placeholders get reset correctly From 9a34ad5e45587945db08aabef0a45cce8a83c555 Mon Sep 17 00:00:00 2001 From: Igor Wessel Date: Sat, 8 Feb 2025 06:48:48 -0300 Subject: [PATCH 7/8] remove comment --- src/Modules/CalcPerform.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index 28d2de0224..7d095dc9dd 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -792,7 +792,6 @@ function calcs.actionSpeedMod(actor) local actionSpeedMod = 1 + (-slowEffect + actionSpeedSum) / 100 - -- local actionSpeedMod = 1 + (slowEffectsSum + actionSpeedSum) / 100 actionSpeedMod = m_max(minimumActionSpeed / 100, actionSpeedMod) if maximumActionSpeedReduction then actionSpeedMod = m_min((100 - maximumActionSpeedReduction) / 100, actionSpeedMod) From f2e0a7a28ca784659f2475bbfa1647843fd2ca53 Mon Sep 17 00:00:00 2001 From: Igor Wessel Date: Sat, 8 Feb 2025 07:12:30 -0300 Subject: [PATCH 8/8] refactor use local mod in apply slow magnitude --- src/Modules/CalcPerform.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index 7d095dc9dd..f3d3eeaa92 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -766,7 +766,7 @@ local function applySlowMagnitude(env) enemyDB:ReplaceMod(mod.name, mod.type, -round(mod.value * -lessSlow, nil), mod.source, mod.flags, mod.keywordFlags, unpack(mod)) end - enemyDB:ScaleAddMod(modLib.createMod(value.mod.name, value.mod.type, value.mod.value, "Slow Magnitude"), slowMagnitude) + enemyDB:ScaleAddMod(modLib.createMod(mod.name, mod.type, mod.value, "Slow Magnitude"), slowMagnitude) end end end