From 2c9ce21e258667e9a2d68f41aba4eaa08c466c47 Mon Sep 17 00:00:00 2001 From: majochem Date: Fri, 11 Apr 2025 15:30:11 +0200 Subject: [PATCH 1/3] Add support for "Crimson Assault" Keystone --- src/Data/ModCache.lua | 5 ++--- src/Modules/ModParser.lua | 5 +++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 0e2ba6a078..d14d1a5cd2 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -3467,7 +3467,7 @@ c["Banner Skills have 20% increased Area of Effect"]={{[1]={[1]={skillType=88,ty c["Banner Skills have 20% increased Duration"]={{[1]={[1]={skillType=88,type="SkillType"},flags=0,keywordFlags=0,name="Duration",type="INC",value=20}},nil} c["Banners also grant +5% to all Elemental Resistances to you and Allies"]={{[1]={[1]={skillType=88,type="SkillType"},flags=0,keywordFlags=0,name="ExtraAuraEffect",type="LIST",value={mod={flags=0,keywordFlags=0,name="ElementalResist",type="BASE",value=5}}}},nil} c["Banners always have maximum Valour"]={nil,"Banners always have maximum Valour "} -c["Base Bleeding Duration is 1 second"]={{[1]={flags=0,keywordFlags=0,name="EnemyBleedDuration",type="OVERRIDE",value=1}},"Base second "} +c["Base Bleeding Duration is 1 second"]={{[1]={flags=0,keywordFlags=0,name="EnemyBleedDuration",type="MORE",value=-80}},nil} c["Base Critical Hit Chance for Attacks with Weapons is 7%"]={{[1]={flags=0,keywordFlags=0,name="WeaponBaseCritChance",type="OVERRIDE",value=7}},nil} c["Base Critical Hit Chance for Attacks with Weapons is 8%"]={{[1]={flags=0,keywordFlags=0,name="WeaponBaseCritChance",type="OVERRIDE",value=8}},nil} c["Base Critical Hit Chance for Spells is 15%"]={{[1]={[1]={skillType=2,type="SkillType"},flags=0,keywordFlags=0,name="CritChanceBase",type="OVERRIDE",value=15}},nil} @@ -3475,8 +3475,7 @@ c["Base Maximum Darkness is 100"]={{[1]={flags=0,keywordFlags=0,name="PlayerHasD c["Become Ignited when you deal a Critical Hit, taking 15% of your maximum Life and Energy Shield as Fire Damage per second"]={nil,"Become Ignited when you deal a Critical Hit, taking 15% of your maximum Life and Energy Shield as Fire Damage per second "} c["Become Ignited when you deal a Critical Hit, taking 15% of your maximum Life and Energy Shield as Fire Damage per second 50% more Critical Damage Bonus"]={nil,"Become Ignited when you deal a Critical Hit, taking 15% of your maximum Life and Energy Shield as Fire Damage per second 50% more Critical Damage Bonus "} c["Bleeding you inflict deals Damage 10% faster"]={{[1]={flags=0,keywordFlags=0,name="BleedFaster",type="INC",value=10}},nil} -c["Bleeding you inflict is Aggravated"]={nil,"Bleeding you inflict is Aggravated "} -c["Bleeding you inflict is Aggravated Base Bleeding Duration is 1 second"]={{[1]={flags=0,keywordFlags=0,name="EnemyBleedDuration",type="OVERRIDE",value=1}},"Bleeding you inflict is Aggravated Base second "} +c["Bleeding you inflict is Aggravated"]={{[1]={flags=0,keywordFlags=0,name="EnemyModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Condition:BleedAggravated",type="FLAG",value=true}}}},nil} c["Bleeding you inflict on Cursed targets is Aggravated"]={{[1]={flags=0,keywordFlags=0,name="EnemyModifier",type="LIST",value={mod={[1]={type="Condition",var="Cursed"},flags=0,keywordFlags=0,name="Condition:BleedAggravated",type="FLAG",value=true}}}},nil} c["Blind Chilled enemies on Hit"]={nil,"Blind Chilled enemies on Hit "} c["Blind Enemies when they Stun you"]={nil,"Blind Enemies when they Stun you "} diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 33bce848b0..e716428983 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -2231,6 +2231,11 @@ local specialModList = { mod("BleedStacksMax", "OVERRIDE", num), flag("Condition:HaveCrimsonDance"), } end, + ["base (%a+) duration is (%d+) seconds?"] = function(_, ailment, num) -- Crimson Assault (but also supports poison & ignite variants with same wording) + ailment = firstToUpper(ailment) + local defaultBase = data.gameConstants["Base" .. ailment .. "Duration"] + return { defaultBase and mod("Enemy" .. string.gsub(ailment, "ing", "") .. "Duration", "MORE", ((num / defaultBase) - 1) * 100) } end, -- mod for "bleeding" duration is "bleed" duration, so removing "ing" + ["bleeding you inflict is aggravated"] = { mod("EnemyModifier", "LIST", { mod = flag("Condition:BleedAggravated") }) }, ["your minions spread caustic ground on death, dealing 20%% of their maximum life as chaos damage per second"] = { mod("ExtraMinionSkill", "LIST", { skillId = "SiegebreakerCausticGround" }) }, ["your minions spread burning ground on death, dealing 20%% of their maximum life as fire damage per second"] = { mod("ExtraMinionSkill", "LIST", { skillId = "ReplicaSiegebreakerBurningGround" }) }, ["you can have an additional brand attached to an enemy"] = { mod("BrandsAttachedLimit", "BASE", 1) }, From 75d8d6e7d2acb5216543c3fae1d069bfb54a97d5 Mon Sep 17 00:00:00 2001 From: majochem Date: Fri, 11 Apr 2025 15:32:09 +0200 Subject: [PATCH 2/3] Remove unnecessary function syntax for Blood Mage Blood Barbs mod parsing --- src/Modules/ModParser.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index e716428983..945af4f8b4 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -2520,9 +2520,7 @@ local specialModList = { ["gain additional maximum life equal to (%d+)%% of the energy shield on equipped body armour"] = function(num) return { mod("Life", "BASE", 1, { type = "PercentStat", stat = "EnergyShieldOnBody Armour", percent = num }), } end, - ["bleeding you inflict on cursed targets is aggravated"] = function(num) return { - mod("EnemyModifier", "LIST", { mod = flag("Condition:BleedAggravated", { type = "Condition", var = "Cursed" }) }), - } end, + ["bleeding you inflict on cursed targets is aggravated"] = { mod("EnemyModifier", "LIST", { mod = flag("Condition:BleedAggravated", { type = "Condition", var = "Cursed" }) }) }, ["critical hits ignore monster armour"] = { flag("IgnoreEnemyArmour", { type = "Condition", var = "CriticalStrike" }) }, ["(%d+)%% of life loss from hits is prevented, then that much life is lost over 4 seconds instead"] = function(num) return { mod("LifeLossPrevented", "BASE", num) } end, -- Champion From 79f9694571b759d11258a7a1c841400cffc4adfd Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Mon, 14 Apr 2025 21:23:19 +1000 Subject: [PATCH 3/3] Use override --- src/Data/ModCache.lua | 2 +- src/Modules/CalcOffence.lua | 4 ++-- src/Modules/ModParser.lua | 7 +++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index d14d1a5cd2..92c49ba358 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -3467,7 +3467,7 @@ c["Banner Skills have 20% increased Area of Effect"]={{[1]={[1]={skillType=88,ty c["Banner Skills have 20% increased Duration"]={{[1]={[1]={skillType=88,type="SkillType"},flags=0,keywordFlags=0,name="Duration",type="INC",value=20}},nil} c["Banners also grant +5% to all Elemental Resistances to you and Allies"]={{[1]={[1]={skillType=88,type="SkillType"},flags=0,keywordFlags=0,name="ExtraAuraEffect",type="LIST",value={mod={flags=0,keywordFlags=0,name="ElementalResist",type="BASE",value=5}}}},nil} c["Banners always have maximum Valour"]={nil,"Banners always have maximum Valour "} -c["Base Bleeding Duration is 1 second"]={{[1]={flags=0,keywordFlags=0,name="EnemyBleedDuration",type="MORE",value=-80}},nil} +c["Base Bleeding Duration is 1 second"]={{[1]={flags=0,keywordFlags=0,name="BleedDurationBase",type="OVERRIDE",value="1"}},nil} c["Base Critical Hit Chance for Attacks with Weapons is 7%"]={{[1]={flags=0,keywordFlags=0,name="WeaponBaseCritChance",type="OVERRIDE",value=7}},nil} c["Base Critical Hit Chance for Attacks with Weapons is 8%"]={{[1]={flags=0,keywordFlags=0,name="WeaponBaseCritChance",type="OVERRIDE",value=8}},nil} c["Base Critical Hit Chance for Spells is 15%"]={{[1]={[1]={skillType=2,type="SkillType"},flags=0,keywordFlags=0,name="CritChanceBase",type="OVERRIDE",value=15}},nil} diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index 16492f6e74..e3dedd2e25 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -4341,7 +4341,7 @@ function calcs.offence(env, actor, activeSkill) ailmentTypeMod = ailmentDamageType end local rateMod = (calcLib.mod(skillModList, cfg, ailment .. "Faster") + enemyDB:Sum("INC", nil, "Self" .. ailment .. "Faster") / 100) / calcLib.mod(skillModList, cfg, ailment .. "Slower") - local durationBase = data.misc[ailment .. "DurationBase"] + local durationBase = env.modDB:Override(nil, ailment .. "DurationBase") or data.misc[ailment .. "DurationBase"] local durationMod = m_max(calcLib.mod(skillModList, dotCfg, "Enemy" .. ailment .. "Duration", "EnemyAilmentDuration", "Enemy" .. ailmentTypeMod .. "AilmentDuration", "SkillAndDamagingAilmentDuration") * calcLib.mod(enemyDB, nil, "Self" .. ailment .. "Duration", "SelfAilmentDuration", "Self" .. ailmentTypeMod .. "AilmentDuration"), 0) durationMod = m_max(durationMod, 0) globalOutput[ailment .. "Duration"] = durationBase * durationMod / rateMod * debuffDurationMult @@ -4588,7 +4588,7 @@ function calcs.offence(env, actor, activeSkill) t_insert(breakdown[ailment .. "Damage"], s_format("x %.2fs ^8(ailment duration)", globalOutput[ailment .. "Duration"])) t_insert(breakdown[ailment .. "Damage"], s_format("= %.1f ^8total damage of all stacks", output[ailment .. "Damage"])) end - if globalOutput[ailment .. "Duration"] ~= data.misc[ailment .. "DurationBase"] then + if globalOutput[ailment .. "Duration"] ~= durationBase then globalBreakdown[ailment .. "Duration"] = { s_format("%.2fs ^8(base duration)", durationBase) } diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 945af4f8b4..92d9827606 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -2231,10 +2231,9 @@ local specialModList = { mod("BleedStacksMax", "OVERRIDE", num), flag("Condition:HaveCrimsonDance"), } end, - ["base (%a+) duration is (%d+) seconds?"] = function(_, ailment, num) -- Crimson Assault (but also supports poison & ignite variants with same wording) - ailment = firstToUpper(ailment) - local defaultBase = data.gameConstants["Base" .. ailment .. "Duration"] - return { defaultBase and mod("Enemy" .. string.gsub(ailment, "ing", "") .. "Duration", "MORE", ((num / defaultBase) - 1) * 100) } end, -- mod for "bleeding" duration is "bleed" duration, so removing "ing" + ["base (%a+) duration is (%d+) seconds?"] = function(_, ailment, num) return {-- Crimson Assault (but also supports poison & ignite variants with same wording) + mod(firstToUpper(ailment:gsub("ing","")) .. "DurationBase", "OVERRIDE", num) + } end, ["bleeding you inflict is aggravated"] = { mod("EnemyModifier", "LIST", { mod = flag("Condition:BleedAggravated") }) }, ["your minions spread caustic ground on death, dealing 20%% of their maximum life as chaos damage per second"] = { mod("ExtraMinionSkill", "LIST", { skillId = "SiegebreakerCausticGround" }) }, ["your minions spread burning ground on death, dealing 20%% of their maximum life as fire damage per second"] = { mod("ExtraMinionSkill", "LIST", { skillId = "ReplicaSiegebreakerBurningGround" }) },