From 86d6cd5d308bd46ffe1fbbfcfb83f58f00d9e5a7 Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Sun, 8 Nov 2026 16:50:32 +0100 Subject: [PATCH 1/4] Support Onslaught after using a Vaal skill Recognize the current and legacy Vaal Caress modifiers for gloves and Reliquarian. Reuse global Onslaught with distinct five- and twenty-second conditions so ordinary skills and movement receive the buff beyond Recently. --- spec/System/TestVaalCaress_spec.lua | 90 +++++++++++++++++++++++++++++ src/Data/ModCache.lua | 6 +- src/Modules/ConfigOptions.lua | 7 +++ src/Modules/ModParser.lua | 2 + 4 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 spec/System/TestVaalCaress_spec.lua diff --git a/spec/System/TestVaalCaress_spec.lua b/spec/System/TestVaalCaress_spec.lua new file mode 100644 index 00000000000..d280ddd664a --- /dev/null +++ b/spec/System/TestVaalCaress_spec.lua @@ -0,0 +1,90 @@ +describe("Vaal Caress Onslaught", function() + local function addGloves(variant) + build.itemsTab:CreateDisplayItemFromRaw(main.uniqueDB.byTitle["vaal caress"]:BuildRaw()) + build.itemsTab.displayItem.variant = variant + build.itemsTab.displayItem:BuildModList() + build.itemsTab:AddDisplayItem() + end + + local function allocateNotable() + build.spec:SelectClass(0) + for id, ascendancy in pairs(build.spec.curClass.classes) do + if ascendancy.name == "Reliquarian" then + build.spec:SelectAscendClass(id) + end + end + assert.are.equal("Reliquarian", build.spec.curAscendClassName) + local vaalCaress + for _, node in pairs(build.spec.nodes) do + if node.dn == "Vaal Caress" and node.ascendancyName == "Reliquarian" then + vaalCaress = node + end + end + assert.is_not_nil(vaalCaress) + build.spec:AllocNode(vaalCaress) + assert.is_true(vaalCaress.alloc) + build.buildFlag = true + end + + local function configure(input) + for _, name in ipairs({ "conditionUsedVaalSkillRecently", "conditionUsedVaalSkillInPast5Sec", "conditionUsedVaalSkillInPast20Sec", "buffOnslaught" }) do + build.configTab.input[name] = input[name] + end + build.configTab:BuildModList() + runCallback("OnFrame") + end + + for _, case in ipairs({ + { name = "current gloves", duration = 20, setup = function() addGloves(3) end }, + { name = "legacy gloves", duration = 5, setup = function() addGloves(2) end }, + { name = "Reliquarian notable", duration = 20, setup = allocateNotable }, + }) do + it("applies " .. case.name .. " to an ordinary spell for the configured Vaal-use window", function() + newBuild() + case.setup() + build.skillsTab:PasteSocketGroup("Fireball 20/0 1\n") + runCallback("OnFrame") + assert.are.equal("Fireball", build.calcsTab.mainEnv.player.mainSkill.activeEffect.grantedEffect.name) + assert.is_falsy(build.calcsTab.mainEnv.player.mainSkill.skillTypes[SkillType.Vaal]) + local inactiveMovement = build.calcsTab.mainOutput.MovementSpeedMod + local inactiveSpeed = build.calcsTab.mainOutput.Speed + local mainSkill = build.calcsTab.mainEnv.player.mainSkill + local inactiveSpeedInc = mainSkill.skillModList:Sum("INC", mainSkill.skillCfg, "Speed") + local function check(active) + assert.are.near(inactiveMovement + (active and 0.2 or 0), build.calcsTab.mainOutput.MovementSpeedMod, 1e-9) + if active then + assert.are.near(inactiveSpeed * (1 + 20 / (100 + inactiveSpeedInc)), build.calcsTab.mainOutput.Speed, 1e-9) + else + assert.are.equal(inactiveSpeed, build.calcsTab.mainOutput.Speed) + end + end + + configure({ conditionUsedVaalSkillRecently = true }) + check(true) + configure({}) + check(false) + configure({ conditionUsedVaalSkillInPast20Sec = true }) + check(case.duration == 20) + assert.is_falsy((build.calcsTab.mainEnv.player.modDB:Flag(nil, "Condition:UsedVaalSkillRecently"))) + configure({ conditionUsedVaalSkillInPast5Sec = true }) + check(true) + configure({ conditionUsedVaalSkillInPast5Sec = true, buffOnslaught = true }) + check(true) + configure({ buffOnslaught = true }) + check(true) + configure({}) + check(false) + end) + end + + it("automatically grants Onslaught while using a main Vaal skill", function() + newBuild() + addGloves(3) + runCallback("OnFrame") + local inactiveMovement = build.calcsTab.mainOutput.MovementSpeedMod + build.skillsTab:PasteSocketGroup("Vaal Arc 20/0 1\n") + runCallback("OnFrame") + assert.is_true(build.calcsTab.mainEnv.player.mainSkill.skillTypes[SkillType.Vaal]) + assert.are.near(inactiveMovement + 0.2, build.calcsTab.mainOutput.MovementSpeedMod, 1e-9) + end) +end) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index c0ba5d23632..94a3b1c2b1c 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -22850,8 +22850,7 @@ c["You gain Onslaught for 2 seconds on Killing Taunted Enemies"]={{[1]={[1]={typ c["You gain Onslaught for 2 seconds per Endurance Charge when Hit"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} c["You gain Onslaught for 2 seconds per Endurance Charge when Hit You gain Onslaught for 5 seconds per Endurance Charge when Hit"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit You gain for 5 seconds per Endurance Charge when Hit "} c["You gain Onslaught for 2 seconds when Hit"]={{[1]={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} -c["You gain Onslaught for 20 seconds on using a Vaal Skill"]={{[1]={flags=0,keywordFlags=512,name="Condition:Onslaught",type="FLAG",value=true}}," on using a "} -c["You gain Onslaught for 20 seconds on using a Vaal Skill +2 to Level of all Vaal Skill Gems"]={{[1]={flags=0,keywordFlags=512,name="Condition:Onslaught",type="FLAG",value=true}}," on using a +2 to Level of all Vaal Skill Gems "} +c["You gain Onslaught for 20 seconds on using a Vaal Skill"]={{[1]={[1]={type="Condition",varList={[1]="UsedVaalSkillRecently",[2]="UsedVaalSkillInPast20Sec"}},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} c["You gain Onslaught for 3 seconds on Culling Strike"]={{[1]={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," on Culling Strike "} c["You gain Onslaught for 3 seconds on Culling Strike 100% chance to Avoid being Chilled during Onslaught"]={{[1]={[1]={type="Condition",var="Onslaught"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," on Culling Strike 100% chance "} c["You gain Onslaught for 3 seconds on Kill"]={{[1]={[1]={type="Condition",var="KilledRecently"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} @@ -22861,8 +22860,7 @@ c["You gain Onslaught for 4 seconds on Hit"]={{[1]={flags=4,keywordFlags=0,name= c["You gain Onslaught for 4 seconds on Kill"]={{[1]={[1]={type="Condition",var="KilledRecently"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} c["You gain Onslaught for 4 seconds on Kill while affected by Haste"]={{[1]={[1]={type="Condition",var="KilledRecently"},[2]={type="Condition",var="AffectedByHaste"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} c["You gain Onslaught for 4 seconds when Hit"]={{[1]={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} -c["You gain Onslaught for 5 seconds on using a Vaal Skill"]={{[1]={flags=0,keywordFlags=512,name="Condition:Onslaught",type="FLAG",value=true}}," on using a "} -c["You gain Onslaught for 5 seconds on using a Vaal Skill You gain Onslaught for 20 seconds on using a Vaal Skill"]={{[1]={flags=0,keywordFlags=512,name="Condition:Onslaught",type="FLAG",value=true}}," on using a You gain on using a Vaal Skill "} +c["You gain Onslaught for 5 seconds on using a Vaal Skill"]={{[1]={[1]={type="Condition",varList={[1]="UsedVaalSkillRecently",[2]="UsedVaalSkillInPast5Sec"}},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} c["You gain Onslaught for 5 seconds per Endurance Charge when Hit"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} c["You gain Onslaught for 5 seconds per Endurance Charge when Hit 100% increased Effect of Onslaught on you"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit 100% increased "} c["You gain Onslaught for 6 seconds when Hit"]={{[1]={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index 8ff3e6f8c79..2d219d4da2f 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -1557,6 +1557,13 @@ Huge sets the radius to 11. modList:NewMod("Condition:UsedVaalSkillRecently", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) modList:NewMod("Condition:UsedSkillRecently", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) end }, + { var = "conditionUsedVaalSkillInPast5Sec", type = "check", label = "Used a Vaal Skill in the past 5 seconds?", ifCond = "UsedVaalSkillInPast5Sec", implyCond = "UsedVaalSkillInPast20Sec", tooltip = "This also counts as having used a Vaal Skill in the past 20 seconds.", apply = function(val, modList, enemyModList) + modList:NewMod("Condition:UsedVaalSkillInPast5Sec", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) + modList:NewMod("Condition:UsedVaalSkillInPast20Sec", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) + end }, + { var = "conditionUsedVaalSkillInPast20Sec", type = "check", label = "Used a Vaal Skill in the past 20 seconds?", ifCond = "UsedVaalSkillInPast20Sec", apply = function(val, modList, enemyModList) + modList:NewMod("Condition:UsedVaalSkillInPast20Sec", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) + end }, { var = "multiplierUsedVaalSkillInPast8Seconds", type = "count", label = "# of Vaal Skills used in the past 8 Seconds:", ifMult = "VaalSkillsUsedInPast8Seconds", apply = function(val, modList, enemyModList) modList:NewMod("Multiplier:VaalSkillsUsedInPast8Seconds", "BASE", val, "Config", { type = "Condition", var = "Combat" }) end }, diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 9d5d1db3a05..dd0e9a49e1d 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -4026,6 +4026,8 @@ local specialModList = { -- Buffs/debuffs ["phasing"] = { flag("Condition:Phasing") }, ["onslaught"] = { flag("Condition:Onslaught") }, + ["you gain onslaught for 5 seconds on using a vaal skill"] = { flag("Condition:Onslaught", { type = "Condition", varList = { "UsedVaalSkillRecently", "UsedVaalSkillInPast5Sec" } }) }, + ["you gain onslaught for 20 seconds on using a vaal skill"] = { flag("Condition:Onslaught", { type = "Condition", varList = { "UsedVaalSkillRecently", "UsedVaalSkillInPast20Sec" } }) }, ["rampage"] = { flag("Condition:Rampage") }, ["soul eater"] = { flag("Condition:CanHaveSoulEater") }, ["unholy might"] = { flag("Condition:UnholyMight"), flag("Condition:CanWither"), }, From 9ef038406cfb191f0098f65f64482464557e2771 Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Sun, 8 Nov 2026 19:08:41 +0100 Subject: [PATCH 2/4] Reuse existing Vaal Recently configuration for Onslaught Keep the Vaal Caress fix on the existing Recently condition without adding duration-specific settings. The existing manual Onslaught option represents states beyond Recently while the five- or twenty-second buff remains active. --- spec/System/TestVaalCaress_spec.lua | 17 ++++++----------- src/Data/ModCache.lua | 4 ++-- src/Modules/ConfigOptions.lua | 7 ------- src/Modules/ModParser.lua | 4 ++-- 4 files changed, 10 insertions(+), 22 deletions(-) diff --git a/spec/System/TestVaalCaress_spec.lua b/spec/System/TestVaalCaress_spec.lua index d280ddd664a..85681e59f6c 100644 --- a/spec/System/TestVaalCaress_spec.lua +++ b/spec/System/TestVaalCaress_spec.lua @@ -27,7 +27,7 @@ describe("Vaal Caress Onslaught", function() end local function configure(input) - for _, name in ipairs({ "conditionUsedVaalSkillRecently", "conditionUsedVaalSkillInPast5Sec", "conditionUsedVaalSkillInPast20Sec", "buffOnslaught" }) do + for _, name in ipairs({ "conditionUsedVaalSkillRecently", "buffOnslaught" }) do build.configTab.input[name] = input[name] end build.configTab:BuildModList() @@ -35,11 +35,11 @@ describe("Vaal Caress Onslaught", function() end for _, case in ipairs({ - { name = "current gloves", duration = 20, setup = function() addGloves(3) end }, - { name = "legacy gloves", duration = 5, setup = function() addGloves(2) end }, - { name = "Reliquarian notable", duration = 20, setup = allocateNotable }, + { name = "current gloves", setup = function() addGloves(3) end }, + { name = "legacy gloves", setup = function() addGloves(2) end }, + { name = "Reliquarian notable", setup = allocateNotable }, }) do - it("applies " .. case.name .. " to an ordinary spell for the configured Vaal-use window", function() + it("applies " .. case.name .. " to an ordinary spell after recent Vaal skill use", function() newBuild() case.setup() build.skillsTab:PasteSocketGroup("Fireball 20/0 1\n") @@ -63,12 +63,7 @@ describe("Vaal Caress Onslaught", function() check(true) configure({}) check(false) - configure({ conditionUsedVaalSkillInPast20Sec = true }) - check(case.duration == 20) - assert.is_falsy((build.calcsTab.mainEnv.player.modDB:Flag(nil, "Condition:UsedVaalSkillRecently"))) - configure({ conditionUsedVaalSkillInPast5Sec = true }) - check(true) - configure({ conditionUsedVaalSkillInPast5Sec = true, buffOnslaught = true }) + configure({ conditionUsedVaalSkillRecently = true, buffOnslaught = true }) check(true) configure({ buffOnslaught = true }) check(true) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 94a3b1c2b1c..e2849619262 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -22850,7 +22850,7 @@ c["You gain Onslaught for 2 seconds on Killing Taunted Enemies"]={{[1]={[1]={typ c["You gain Onslaught for 2 seconds per Endurance Charge when Hit"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} c["You gain Onslaught for 2 seconds per Endurance Charge when Hit You gain Onslaught for 5 seconds per Endurance Charge when Hit"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit You gain for 5 seconds per Endurance Charge when Hit "} c["You gain Onslaught for 2 seconds when Hit"]={{[1]={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} -c["You gain Onslaught for 20 seconds on using a Vaal Skill"]={{[1]={[1]={type="Condition",varList={[1]="UsedVaalSkillRecently",[2]="UsedVaalSkillInPast20Sec"}},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} +c["You gain Onslaught for 20 seconds on using a Vaal Skill"]={{[1]={[1]={type="Condition",var="UsedVaalSkillRecently"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} c["You gain Onslaught for 3 seconds on Culling Strike"]={{[1]={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," on Culling Strike "} c["You gain Onslaught for 3 seconds on Culling Strike 100% chance to Avoid being Chilled during Onslaught"]={{[1]={[1]={type="Condition",var="Onslaught"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," on Culling Strike 100% chance "} c["You gain Onslaught for 3 seconds on Kill"]={{[1]={[1]={type="Condition",var="KilledRecently"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} @@ -22860,7 +22860,7 @@ c["You gain Onslaught for 4 seconds on Hit"]={{[1]={flags=4,keywordFlags=0,name= c["You gain Onslaught for 4 seconds on Kill"]={{[1]={[1]={type="Condition",var="KilledRecently"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} c["You gain Onslaught for 4 seconds on Kill while affected by Haste"]={{[1]={[1]={type="Condition",var="KilledRecently"},[2]={type="Condition",var="AffectedByHaste"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} c["You gain Onslaught for 4 seconds when Hit"]={{[1]={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} -c["You gain Onslaught for 5 seconds on using a Vaal Skill"]={{[1]={[1]={type="Condition",varList={[1]="UsedVaalSkillRecently",[2]="UsedVaalSkillInPast5Sec"}},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} +c["You gain Onslaught for 5 seconds on using a Vaal Skill"]={{[1]={[1]={type="Condition",var="UsedVaalSkillRecently"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}},nil} c["You gain Onslaught for 5 seconds per Endurance Charge when Hit"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} c["You gain Onslaught for 5 seconds per Endurance Charge when Hit 100% increased Effect of Onslaught on you"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit 100% increased "} c["You gain Onslaught for 6 seconds when Hit"]={{[1]={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}," when Hit "} diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index 2d219d4da2f..8ff3e6f8c79 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -1557,13 +1557,6 @@ Huge sets the radius to 11. modList:NewMod("Condition:UsedVaalSkillRecently", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) modList:NewMod("Condition:UsedSkillRecently", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) end }, - { var = "conditionUsedVaalSkillInPast5Sec", type = "check", label = "Used a Vaal Skill in the past 5 seconds?", ifCond = "UsedVaalSkillInPast5Sec", implyCond = "UsedVaalSkillInPast20Sec", tooltip = "This also counts as having used a Vaal Skill in the past 20 seconds.", apply = function(val, modList, enemyModList) - modList:NewMod("Condition:UsedVaalSkillInPast5Sec", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) - modList:NewMod("Condition:UsedVaalSkillInPast20Sec", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) - end }, - { var = "conditionUsedVaalSkillInPast20Sec", type = "check", label = "Used a Vaal Skill in the past 20 seconds?", ifCond = "UsedVaalSkillInPast20Sec", apply = function(val, modList, enemyModList) - modList:NewMod("Condition:UsedVaalSkillInPast20Sec", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) - end }, { var = "multiplierUsedVaalSkillInPast8Seconds", type = "count", label = "# of Vaal Skills used in the past 8 Seconds:", ifMult = "VaalSkillsUsedInPast8Seconds", apply = function(val, modList, enemyModList) modList:NewMod("Multiplier:VaalSkillsUsedInPast8Seconds", "BASE", val, "Config", { type = "Condition", var = "Combat" }) end }, diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index dd0e9a49e1d..57bf9d10f94 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -4026,8 +4026,8 @@ local specialModList = { -- Buffs/debuffs ["phasing"] = { flag("Condition:Phasing") }, ["onslaught"] = { flag("Condition:Onslaught") }, - ["you gain onslaught for 5 seconds on using a vaal skill"] = { flag("Condition:Onslaught", { type = "Condition", varList = { "UsedVaalSkillRecently", "UsedVaalSkillInPast5Sec" } }) }, - ["you gain onslaught for 20 seconds on using a vaal skill"] = { flag("Condition:Onslaught", { type = "Condition", varList = { "UsedVaalSkillRecently", "UsedVaalSkillInPast20Sec" } }) }, + ["you gain onslaught for 5 seconds on using a vaal skill"] = { flag("Condition:Onslaught", { type = "Condition", var = "UsedVaalSkillRecently" }) }, + ["you gain onslaught for 20 seconds on using a vaal skill"] = { flag("Condition:Onslaught", { type = "Condition", var = "UsedVaalSkillRecently" }) }, ["rampage"] = { flag("Condition:Rampage") }, ["soul eater"] = { flag("Condition:CanHaveSoulEater") }, ["unholy might"] = { flag("Condition:UnholyMight"), flag("Condition:CanWither"), }, From 197a206565c93140114386192c84dd54fdf6d3fd Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Mon, 9 Nov 2026 23:57:28 +0100 Subject: [PATCH 3/4] Recognize Vaal Caress Onslaught across buff durations Replace duplicate duration literals with one full-line pattern and cover the ten-second Ruthless Reliquarian modifier with the existing cast-speed test. Keep the shared Onslaught calculation and Recently configuration unchanged. --- spec/System/TestVaalCaress_spec.lua | 8 +++++++- src/Modules/ModParser.lua | 3 +-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/spec/System/TestVaalCaress_spec.lua b/spec/System/TestVaalCaress_spec.lua index 85681e59f6c..3cafb134952 100644 --- a/spec/System/TestVaalCaress_spec.lua +++ b/spec/System/TestVaalCaress_spec.lua @@ -38,6 +38,10 @@ describe("Vaal Caress Onslaught", function() { name = "current gloves", setup = function() addGloves(3) end }, { name = "legacy gloves", setup = function() addGloves(2) end }, { name = "Reliquarian notable", setup = allocateNotable }, + { name = "Ruthless Reliquarian notable", setup = function() + build.spec:Init(latestTreeVersion .. "_ruthless") + allocateNotable() + end, movement = false }, }) do it("applies " .. case.name .. " to an ordinary spell after recent Vaal skill use", function() newBuild() @@ -51,7 +55,9 @@ describe("Vaal Caress Onslaught", function() local mainSkill = build.calcsTab.mainEnv.player.mainSkill local inactiveSpeedInc = mainSkill.skillModList:Sum("INC", mainSkill.skillCfg, "Speed") local function check(active) - assert.are.near(inactiveMovement + (active and 0.2 or 0), build.calcsTab.mainOutput.MovementSpeedMod, 1e-9) + if case.movement ~= false then + assert.are.near(inactiveMovement + (active and 0.2 or 0), build.calcsTab.mainOutput.MovementSpeedMod, 1e-9) + end if active then assert.are.near(inactiveSpeed * (1 + 20 / (100 + inactiveSpeedInc)), build.calcsTab.mainOutput.Speed, 1e-9) else diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 57bf9d10f94..266223e3751 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -4026,8 +4026,7 @@ local specialModList = { -- Buffs/debuffs ["phasing"] = { flag("Condition:Phasing") }, ["onslaught"] = { flag("Condition:Onslaught") }, - ["you gain onslaught for 5 seconds on using a vaal skill"] = { flag("Condition:Onslaught", { type = "Condition", var = "UsedVaalSkillRecently" }) }, - ["you gain onslaught for 20 seconds on using a vaal skill"] = { flag("Condition:Onslaught", { type = "Condition", var = "UsedVaalSkillRecently" }) }, + ["you gain onslaught for %d+ seconds on using a vaal skill"] = { flag("Condition:Onslaught", { type = "Condition", var = "UsedVaalSkillRecently" }) }, ["rampage"] = { flag("Condition:Rampage") }, ["soul eater"] = { flag("Condition:CanHaveSoulEater") }, ["unholy might"] = { flag("Condition:UnholyMight"), flag("Condition:CanWither"), }, From 6b5acf67eb182a3aac28e05a3cd09abecec19796 Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Tue, 10 Nov 2026 00:17:49 +0100 Subject: [PATCH 4/4] Simplify Vaal Caress Onslaught regression tests Exercise the modifier durations in a minimal Fireball build instead of reconstructing equipment and passive trees. Keep activation, deactivation and overlapping manual Onslaught checks on the calculated results. --- spec/System/TestVaalCaress_spec.lua | 100 ++++++---------------------- 1 file changed, 19 insertions(+), 81 deletions(-) diff --git a/spec/System/TestVaalCaress_spec.lua b/spec/System/TestVaalCaress_spec.lua index 3cafb134952..332b7c13121 100644 --- a/spec/System/TestVaalCaress_spec.lua +++ b/spec/System/TestVaalCaress_spec.lua @@ -1,91 +1,29 @@ describe("Vaal Caress Onslaught", function() - local function addGloves(variant) - build.itemsTab:CreateDisplayItemFromRaw(main.uniqueDB.byTitle["vaal caress"]:BuildRaw()) - build.itemsTab.displayItem.variant = variant - build.itemsTab.displayItem:BuildModList() - build.itemsTab:AddDisplayItem() - end - - local function allocateNotable() - build.spec:SelectClass(0) - for id, ascendancy in pairs(build.spec.curClass.classes) do - if ascendancy.name == "Reliquarian" then - build.spec:SelectAscendClass(id) - end - end - assert.are.equal("Reliquarian", build.spec.curAscendClassName) - local vaalCaress - for _, node in pairs(build.spec.nodes) do - if node.dn == "Vaal Caress" and node.ascendancyName == "Reliquarian" then - vaalCaress = node - end - end - assert.is_not_nil(vaalCaress) - build.spec:AllocNode(vaalCaress) - assert.is_true(vaalCaress.alloc) - build.buildFlag = true - end - - local function configure(input) - for _, name in ipairs({ "conditionUsedVaalSkillRecently", "buffOnslaught" }) do - build.configTab.input[name] = input[name] - end - build.configTab:BuildModList() - runCallback("OnFrame") - end - - for _, case in ipairs({ - { name = "current gloves", setup = function() addGloves(3) end }, - { name = "legacy gloves", setup = function() addGloves(2) end }, - { name = "Reliquarian notable", setup = allocateNotable }, - { name = "Ruthless Reliquarian notable", setup = function() - build.spec:Init(latestTreeVersion .. "_ruthless") - allocateNotable() - end, movement = false }, - }) do - it("applies " .. case.name .. " to an ordinary spell after recent Vaal skill use", function() + for _, duration in ipairs({ 5, 10, 20 }) do + it("activates the " .. duration .. "-second modifier after recent Vaal skill use", function() newBuild() - case.setup() - build.skillsTab:PasteSocketGroup("Fireball 20/0 1\n") + build.skillsTab:PasteSocketGroup("Fireball 1/0 1\n") + build.mainSocketGroup = 1 runCallback("OnFrame") assert.are.equal("Fireball", build.calcsTab.mainEnv.player.mainSkill.activeEffect.grantedEffect.name) - assert.is_falsy(build.calcsTab.mainEnv.player.mainSkill.skillTypes[SkillType.Vaal]) - local inactiveMovement = build.calcsTab.mainOutput.MovementSpeedMod local inactiveSpeed = build.calcsTab.mainOutput.Speed - local mainSkill = build.calcsTab.mainEnv.player.mainSkill - local inactiveSpeedInc = mainSkill.skillModList:Sum("INC", mainSkill.skillCfg, "Speed") - local function check(active) - if case.movement ~= false then - assert.are.near(inactiveMovement + (active and 0.2 or 0), build.calcsTab.mainOutput.MovementSpeedMod, 1e-9) - end - if active then - assert.are.near(inactiveSpeed * (1 + 20 / (100 + inactiveSpeedInc)), build.calcsTab.mainOutput.Speed, 1e-9) - else - assert.are.equal(inactiveSpeed, build.calcsTab.mainOutput.Speed) - end + local inactiveMovement = build.calcsTab.mainOutput.MovementSpeedMod + build.configTab.input.customMods = "You gain Onslaught for " .. duration .. " seconds on using a Vaal Skill" + + local function check(input, multiplier) + build.configTab.input.conditionUsedVaalSkillRecently = input.conditionUsedVaalSkillRecently + build.configTab.input.buffOnslaught = input.buffOnslaught + build.configTab:BuildModList() + runCallback("OnFrame") + assert.are.near(inactiveSpeed * multiplier, build.calcsTab.mainOutput.Speed, 1e-9) + assert.are.near(inactiveMovement + multiplier - 1, build.calcsTab.mainOutput.MovementSpeedMod, 1e-9) end - configure({ conditionUsedVaalSkillRecently = true }) - check(true) - configure({}) - check(false) - configure({ conditionUsedVaalSkillRecently = true, buffOnslaught = true }) - check(true) - configure({ buffOnslaught = true }) - check(true) - configure({}) - check(false) + check({}, 1) + check({ conditionUsedVaalSkillRecently = true }, 1.2) + check({ conditionUsedVaalSkillRecently = true, buffOnslaught = true }, 1.2) + check({ buffOnslaught = true }, 1.2) + check({}, 1) end) end - - it("automatically grants Onslaught while using a main Vaal skill", function() - newBuild() - addGloves(3) - runCallback("OnFrame") - local inactiveMovement = build.calcsTab.mainOutput.MovementSpeedMod - build.skillsTab:PasteSocketGroup("Vaal Arc 20/0 1\n") - runCallback("OnFrame") - assert.is_true(build.calcsTab.mainEnv.player.mainSkill.skillTypes[SkillType.Vaal]) - assert.are.near(inactiveMovement + 0.2, build.calcsTab.mainOutput.MovementSpeedMod, 1e-9) - end) end)