From 84ce75ce598901265124c7dc125b411da3256dca Mon Sep 17 00:00:00 2001 From: Brian Taylor Date: Sat, 20 Jun 2026 09:22:05 -0400 Subject: [PATCH] Support Vestige of Darkness physical-to-chill/freeze modifier Implements the unique helmet "Vestige of Darkness" (Tenebrous Crown) affix "Physical damage from Hits Contributes to Chill Magnitude and Freeze Buildup", which was previously unparsed. Adds a ModParser rule emitting the PhysicalCanChill and PhysicalCanFreeze flags, which the offence calc's canDoAilment() gate already uses to let a non-default damage type feed Chill magnitude and Freeze buildup. Updates the stale ModCache.lua entry (the line was cached as unrecognised) and adds a system spec covering the behaviour. Co-Authored-By: Claude Opus 4.8 (1M context) --- spec/System/TestAilments_spec.lua | 29 +++++++++++++++++++++++++++++ src/Data/ModCache.lua | 3 +-- src/Modules/ModParser.lua | 3 +++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/spec/System/TestAilments_spec.lua b/spec/System/TestAilments_spec.lua index 83f6ac5f2d..4875d92556 100644 --- a/spec/System/TestAilments_spec.lua +++ b/spec/System/TestAilments_spec.lua @@ -28,4 +28,33 @@ describe("TestAilments", function() assert.are.equals(1.1, build.calcsTab.mainOutput.PoisonEffMult) end) + + it("physical damage contributes to chill and freeze with Vestige of Darkness modifier", function() + -- High flat physical, no cold, so any chill/freeze must come from physical + build.itemsTab:CreateDisplayItemFromRaw([[ + New Item + Razor Quarterstaff + Quality: 20 + Adds 40000 to 60000 Physical Damage + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + build.skillsTab:PasteSocketGroup("Quarterstaff Strike 1/0 1") + runCallback("OnFrame") + build.calcsTab:BuildOutput() + runCallback("OnFrame") + + -- Baseline: physical hits cannot chill or freeze + assert.are.equals(0, build.calcsTab.mainOutput.FreezeBuildupAvg) + + build.configTab.input.customMods = "Physical damage from Hits Contributes to Chill Magnitude and Freeze Buildup" + build.configTab:BuildModList() + runCallback("OnFrame") + build.calcsTab:BuildOutput() + runCallback("OnFrame") + + -- Physical hits now contribute to freeze buildup and chill + assert.True(build.calcsTab.mainOutput.FreezeBuildupAvg > 0) + assert.True((build.calcsTab.mainOutput.ChillDuration or 0) > 0) + end) end) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index e2846de0d0..423b81e215 100644 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -6431,8 +6431,7 @@ c["Physical Damage is Pinning"]={{[1]={flags=0,keywordFlags=0,name="PhysicalCanP c["Physical Damage of Enemies Hitting you is Unlucky"]={nil,"Physical Damage of Enemies Hitting you is Unlucky "} c["Physical Damage of Enemies Hitting you is Unlucky Convert All Armour to Evasion Rating"]={nil,"Physical Damage of Enemies Hitting you is Unlucky Convert All Armour to Evasion Rating "} c["Physical Spell Critical Hits build Pin"]={{[1]={[1]={type="Condition",var="CriticalStrike"},flags=2,keywordFlags=16,name="CanPin",type="FLAG",value=true}},nil} -c["Physical damage from Hits Contributes to Chill Magnitude and Freeze Buildup"]={nil,"Physical damage from Hits Contributes to Chill Magnitude and Freeze Buildup "} -c["Physical damage from Hits Contributes to Chill Magnitude and Freeze Buildup Enemies in your Presence are Blinded"]={nil,"Physical damage from Hits Contributes to Chill Magnitude and Freeze Buildup Enemies in your Presence are Blinded "} +c["Physical damage from Hits Contributes to Chill Magnitude and Freeze Buildup"]={{[1]={flags=0,keywordFlags=0,name="PhysicalCanChill",type="FLAG",value=true},[2]={flags=0,keywordFlags=0,name="PhysicalCanFreeze",type="FLAG",value=true}},nil} c["Pin Enemies which are Primed for Pinning"]={nil,"Pin Enemies which are Primed for Pinning "} c["Pin Enemies which are Primed for Pinning Require 4 fewer enemies to be Surrounded"]={nil,"Pin Enemies which are Primed for Pinning Require 4 fewer enemies to be Surrounded "} c["Pinned Enemies cannot deal Critical Hits"]={{[1]={flags=0,keywordFlags=0,name="EnemyModifier",type="LIST",value={mod={[1]={type="Condition",var="Pinned"},flags=0,keywordFlags=0,name="NeverCrit",type="FLAG",value=true}}},[2]={flags=0,keywordFlags=0,name="EnemyModifier",type="LIST",value={mod={[1]={type="Condition",var="Pinned"},flags=0,keywordFlags=0,name="Condition:NeverCrit",type="FLAG",value=true}}}},nil} diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index ee818e796d..77f4ac37c7 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -4066,6 +4066,9 @@ local specialModList = { flag("ColdCanIgnite"), flag("ColdCanShock"), flag("LightningCanIgnite"), flag("LightningCanChill"), flag("LightningCanFreeze"), }, + ["physical damage from hits contributes to chill magnitude and freeze buildup"] = { + flag("PhysicalCanChill"), flag("PhysicalCanFreeze"), + }, -- Bleed ["melee attacks cause bleeding"] = { mod("BleedChance", "BASE", 100, nil, ModFlag.Melee) }, ["attacks cause bleeding when hitting cursed enemies"] = { mod("BleedChance", "BASE", 100, nil, ModFlag.Attack, { type = "ActorCondition", actor = "enemy", var = "Cursed" }) },