From f5c7e3ab6b1b17f0ead31754c9cd85a14daf0a07 Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Fri, 21 Nov 2025 19:59:51 -0600 Subject: [PATCH 01/10] Fix Wings of Entropy not working with Chain Hook, Lacerate and of Haemo, Swordstorm Fix Wings working with Laacerate of Butchery when it shouldn't, keep Ice Crash of Cadence working even with its weird 2H weaponTypes --- src/Modules/CalcActiveSkill.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index de735dc5a3..d944539803 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -189,15 +189,15 @@ function calcs.copyActiveSkill(env, mode, skill) end -- Get weapon flags and info for given weapon -local function getWeaponFlags(env, weaponData, weaponTypes) +local function getWeaponFlags(env, weaponData, weaponTypes, skillTypeDualWieldOnly) local info = env.data.weaponTypeInfo[weaponData.type] if not info then return end if weaponTypes then for _, types in ipairs(weaponTypes) do - if not types[weaponData.type] and - (not weaponData.countsAsAll1H or not (types["Claw"] or types["Dagger"] or types["One Handed Axe"] or types["One Handed Mace"] or types["One Handed Sword"])) then + if (not types[weaponData.type] and (not weaponData.countsAsAll1H or not (types["Claw"] or types["Dagger"] or types["One Handed Axe"] or types["One Handed Mace"] or types["One Handed Sword"])) and not weaponData.countsAsDualWielding) or + (weaponData.countsAsDualWielding and (not (types["One Handed Axe"] or types["One Handed Sword"]) and not skillTypeDualWieldOnly)) then -- Wings of Entropy special case return nil, info end end @@ -284,7 +284,7 @@ function calcs.buildActiveSkillModList(env, activeSkill) t_insert(weaponTypes, skillEffect.grantedEffect.weaponTypes) end end - local weapon1Flags, weapon1Info = getWeaponFlags(env, activeSkill.actor.weaponData1, weaponTypes) + local weapon1Flags, weapon1Info = getWeaponFlags(env, activeSkill.actor.weaponData1, weaponTypes, skillTypes[SkillType.DualWieldOnly]) if not weapon1Flags and activeSkill.summonSkill then -- Minion skills seem to ignore weapon types weapon1Flags, weapon1Info = ModFlag[env.data.weaponTypeInfo["None"].flag], env.data.weaponTypeInfo["None"] @@ -305,7 +305,7 @@ function calcs.buildActiveSkillModList(env, activeSkill) activeSkill.disableReason = "Main Hand weapon is not usable with this skill" end if not skillTypes[SkillType.MainHandOnly] and not skillFlags.forceMainHand then - local weapon2Flags, weapon2Info = getWeaponFlags(env, activeSkill.actor.weaponData2, weaponTypes) + local weapon2Flags, weapon2Info = getWeaponFlags(env, activeSkill.actor.weaponData2, weaponTypes, skillTypes[SkillType.DualWieldOnly]) if weapon2Flags then if skillTypes[SkillType.DualWieldRequiresDifferentTypes] and (activeSkill.actor.weaponData1.type == activeSkill.actor.weaponData2.type) and not (activeSkill.actor.weaponData2.countsAsAll1H or activeSkill.actor.weaponData1.countsAsAll1H) then -- Skill requires a different compatible off hand weapon to main hand weapon From af4a97a5b738b44ff07acfffbb897ded9b89d902 Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Sat, 22 Nov 2025 03:09:12 -0600 Subject: [PATCH 02/10] logic fix, formatting for visibity --- src/Modules/CalcActiveSkill.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index d944539803..45e443ec86 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -196,8 +196,12 @@ local function getWeaponFlags(env, weaponData, weaponTypes, skillTypeDualWieldOn end if weaponTypes then for _, types in ipairs(weaponTypes) do - if (not types[weaponData.type] and (not weaponData.countsAsAll1H or not (types["Claw"] or types["Dagger"] or types["One Handed Axe"] or types["One Handed Mace"] or types["One Handed Sword"])) and not weaponData.countsAsDualWielding) or - (weaponData.countsAsDualWielding and (not (types["One Handed Axe"] or types["One Handed Sword"]) and not skillTypeDualWieldOnly)) then -- Wings of Entropy special case + if (not skillTypeDualWieldOnly and (not types[weaponData.type] or ((weaponData.countsAsDualWielding and not types["One Handed "..info.flag]) or (not weaponData.countsAsDualWielding and not (types["Two Handed Axe"] or types["Two Handed Sword"] or types["Two Handed Mace"] or types["Staff"]))))) + and + (not weaponData.countsAsAll1H or not (types["Claw"] or types["Dagger"] or types["One Handed Axe"] or types["One Handed Mace"] or types["One Handed Sword"])) + and + ((weaponData.countsAsDualWielding and (not types["One Handed "..info.flag])) or (not weaponData.countsAsDualWielding and not (not weaponData.countsAsAll1H and (types["Two Handed Axe"] or types["Two Handed Sword"] or types["Two Handed Mace"] or types["Staff"])))) + then return nil, info end end From ad1882ee8662cde4c1cf2eafd6aa66fd9d91f3fd Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Sat, 22 Nov 2025 20:09:48 -0600 Subject: [PATCH 03/10] cleaner logic, fix for trigger/mirage --- src/Modules/CalcActiveSkill.lua | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index 45e443ec86..45425ac9ac 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -196,11 +196,8 @@ local function getWeaponFlags(env, weaponData, weaponTypes, skillTypeDualWieldOn end if weaponTypes then for _, types in ipairs(weaponTypes) do - if (not skillTypeDualWieldOnly and (not types[weaponData.type] or ((weaponData.countsAsDualWielding and not types["One Handed "..info.flag]) or (not weaponData.countsAsDualWielding and not (types["Two Handed Axe"] or types["Two Handed Sword"] or types["Two Handed Mace"] or types["Staff"]))))) - and - (not weaponData.countsAsAll1H or not (types["Claw"] or types["Dagger"] or types["One Handed Axe"] or types["One Handed Mace"] or types["One Handed Sword"])) - and - ((weaponData.countsAsDualWielding and (not types["One Handed "..info.flag])) or (not weaponData.countsAsDualWielding and not (not weaponData.countsAsAll1H and (types["Two Handed Axe"] or types["Two Handed Sword"] or types["Two Handed Mace"] or types["Staff"])))) + if weaponData.countsAsDualWielding and ((not skillTypeDualWieldOnly and (not types[weaponData.type] or not types["One Handed "..info.flag])) and (not types["One Handed "..info.flag])) -- Wings of Entropy + or (not weaponData.countsAsDualWielding and not types[weaponData.type] and (not weaponData.countsAsAll1H or not (types["Claw"] or types["Dagger"] or types["One Handed Axe"] or types["One Handed Mace"] or types["One Handed Sword"]))) then return nil, info end From 68013a3c7d86764ad3c728a3b7b08e0062a5b306 Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:31:24 -0500 Subject: [PATCH 04/10] simplify conditional --- src/Modules/CalcActiveSkill.lua | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index 45425ac9ac..8451bd3b61 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -194,11 +194,34 @@ local function getWeaponFlags(env, weaponData, weaponTypes, skillTypeDualWieldOn if not info then return end + + local function matchesWeaponType(weaponData, types, skillTypeDualWieldOnly) + -- Wings of Entropy + if weaponData.countsAsDualWielding then + if skillTypeDualWieldOnly then + return true + end + return (types[weaponData.type] or types["One Handed "..info.flag]) and types["One Handed "..info.flag] + end + -- Varunastra + if weaponData.countsAsAll1H then + return types["Claw"] + or types["Dagger"] + or types["One Handed Axe"] + or types["One Handed Mace"] + or types["One Handed Sword"] + end + -- Normal weapon matching + if types[weaponData.type] then + return true + end + + return false + end + if weaponTypes then for _, types in ipairs(weaponTypes) do - if weaponData.countsAsDualWielding and ((not skillTypeDualWieldOnly and (not types[weaponData.type] or not types["One Handed "..info.flag])) and (not types["One Handed "..info.flag])) -- Wings of Entropy - or (not weaponData.countsAsDualWielding and not types[weaponData.type] and (not weaponData.countsAsAll1H or not (types["Claw"] or types["Dagger"] or types["One Handed Axe"] or types["One Handed Mace"] or types["One Handed Sword"]))) - then + if not matchesWeaponType(weaponData, types, skillTypeDualWieldOnly) then return nil, info end end From 7937d6f1563c18e6e811b753bfd79219f40e097a Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:34:31 -0500 Subject: [PATCH 05/10] simplify more! --- src/Modules/CalcActiveSkill.lua | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index 8451bd3b61..37a0dead62 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -212,11 +212,7 @@ local function getWeaponFlags(env, weaponData, weaponTypes, skillTypeDualWieldOn or types["One Handed Sword"] end -- Normal weapon matching - if types[weaponData.type] then - return true - end - - return false + return types[weaponData.type] end if weaponTypes then From 2c06a6a8190c6eec3aa8f279b647b8d3639a6379 Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Thu, 16 Apr 2026 17:15:47 -0500 Subject: [PATCH 06/10] believe it or not there was more to simplify but also a fix to not allow GS of Earthshaking --- src/Modules/CalcActiveSkill.lua | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index 37a0dead62..d36f5f9f39 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -198,10 +198,7 @@ local function getWeaponFlags(env, weaponData, weaponTypes, skillTypeDualWieldOn local function matchesWeaponType(weaponData, types, skillTypeDualWieldOnly) -- Wings of Entropy if weaponData.countsAsDualWielding then - if skillTypeDualWieldOnly then - return true - end - return (types[weaponData.type] or types["One Handed "..info.flag]) and types["One Handed "..info.flag] + return skillTypeDualWieldOnly or types["One Handed "..info.flag] end -- Varunastra if weaponData.countsAsAll1H then From 22c4de100f03ae5f6586566faca0ec9e99f6f38c Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Thu, 16 Apr 2026 19:33:56 -0500 Subject: [PATCH 07/10] change to up-value --- src/Modules/CalcActiveSkill.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index d36f5f9f39..3786e0176c 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -195,7 +195,7 @@ local function getWeaponFlags(env, weaponData, weaponTypes, skillTypeDualWieldOn return end - local function matchesWeaponType(weaponData, types, skillTypeDualWieldOnly) + local function matchesWeaponType(types) -- Wings of Entropy if weaponData.countsAsDualWielding then return skillTypeDualWieldOnly or types["One Handed "..info.flag] @@ -214,7 +214,7 @@ local function getWeaponFlags(env, weaponData, weaponTypes, skillTypeDualWieldOn if weaponTypes then for _, types in ipairs(weaponTypes) do - if not matchesWeaponType(weaponData, types, skillTypeDualWieldOnly) then + if not matchesWeaponType(types) then return nil, info end end From de388bfabf4fd5de6cf73d0c8aa5396c263efade Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Thu, 16 Apr 2026 20:52:31 -0500 Subject: [PATCH 08/10] test --- spec/System/TestItemMods_spec.lua | 82 ++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index 3c185d98ac..5826d1b18f 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -1,4 +1,4 @@ -describe("TetsItemMods", function() +describe("TestItemMods", function() before_each(function() newBuild() end) @@ -612,4 +612,84 @@ describe("TetsItemMods", function() assert.are.equals(baseFrenzyChargesMax + 1, build.calcsTab.calcsOutput.FrenzyChargesMax) assert.are.equals(baseEnduranceChargesMax + 1, build.calcsTab.calcsOutput.EnduranceChargesMax) end) + + it("Test Wings of Entropy skill disabled", function() + local function switchSocketGroup(index) + build.mainSocketGroup = index + build.modFlag = true + build.buildFlag = true + runCallback("OnFrame") + end + + build.itemsTab:CreateDisplayItemFromRaw([[ + Wings of Entropy + {variant:1,2,3,4}Sundering Axe + {variant:5}Ezomyte Axe + Variant: Pre 1.3.0 + Variant: Pre 2.0.0 + Variant: Pre 3.4.0 + Variant: Pre 3.11.0 + Variant: Pre 3.26.0 + Variant: Current + Implicits: 0 + {variant:1,2,3}7% Chance to Block Spell Damage + {variant:4}(6-7)% Chance to Block Spell Damage + {variant:5,6}(7-10)% Chance to Block Spell Damage + {variant:1}+10% Chance to Block Attack Damage while Dual Wielding + {variant:2,3,4}+8% Chance to Block Attack Damage while Dual Wielding + {variant:5,6}+(8-12)% Chance to Block Attack Damage while Dual Wielding + {variant:1,2}(80-120)% increased Physical Damage + {variant:3,4}(100-120)% increased Physical Damage + {variant:5,6}(60-80)% increased Physical Damage + {variant:1,2,3,4}Adds (55-65) to (100-120) Fire Damage in Main Hand + {variant:5}Adds (75-100) to (165-200) Fire Damage in Main Hand + {variant:6}Adds (150-200) to (330-400) Fire Damage in Main Hand + {variant:1,2,3,4}Adds (55-65) to (100-120) Chaos Damage in Off Hand + {variant:5}Adds (75-100) to (165-200) Chaos Damage in Off Hand + {variant:6}Adds (151-199) to (331-401) Chaos Damage in Off Hand + Counts as Dual Wielding + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + + + build.skillsTab:PasteSocketGroup("Lacerate of Hemmorhage 20/0 1") + runCallback("OnFrame") + assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) + + build.skillsTab:PasteSocketGroup("Lacerate of Butchering 20/0 1") + runCallback("OnFrame") + switchSocketGroup(2) + assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == true) + + build.skillsTab:PasteSocketGroup("Ice Crash of Cadence 20/0 1") + runCallback("OnFrame") + switchSocketGroup(3) + assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) + + build.skillsTab:PasteSocketGroup("Swordstorm 20/0 1") + runCallback("OnFrame") + switchSocketGroup(4) + assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) + + build.skillsTab:PasteSocketGroup("Ground Slam of Earthshaking 20/0 1") + runCallback("OnFrame") + switchSocketGroup(5) + assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == true) + + build.skillsTab:PasteSocketGroup("Sunder 20/0 1") + runCallback("OnFrame") + switchSocketGroup(6) + assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) + + build.skillsTab:PasteSocketGroup("Chain Hook 20/0 1") + runCallback("OnFrame") + switchSocketGroup(7) + assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) + + build.skillsTab:PasteSocketGroup("Dual Strike of Ambidexterity 20/0 1") + runCallback("OnFrame") + switchSocketGroup(8) + assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == true) + end) end) From 51d863c638ae47e4f45ea11caef2b379a4d93561 Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Thu, 16 Apr 2026 21:42:34 -0500 Subject: [PATCH 09/10] spelling fix --- spec/System/TestItemMods_spec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index 5826d1b18f..b184d5f97e 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -653,7 +653,7 @@ describe("TestItemMods", function() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Lacerate of Hemmorhage 20/0 1") + build.skillsTab:PasteSocketGroup("Lacerate of Haemorrhage 20/0 1") runCallback("OnFrame") assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) From 53731123d043d2f844c90aa478097abc9e6ccd9e Mon Sep 17 00:00:00 2001 From: Peechey <92683202+Peechey@users.noreply.github.com> Date: Fri, 17 Apr 2026 01:15:17 -0500 Subject: [PATCH 10/10] consolidate tests --- spec/System/TestItemMods_spec.lua | 60 +++++++++---------------------- 1 file changed, 17 insertions(+), 43 deletions(-) diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index b184d5f97e..9cded26365 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -614,13 +614,6 @@ describe("TestItemMods", function() end) it("Test Wings of Entropy skill disabled", function() - local function switchSocketGroup(index) - build.mainSocketGroup = index - build.modFlag = true - build.buildFlag = true - runCallback("OnFrame") - end - build.itemsTab:CreateDisplayItemFromRaw([[ Wings of Entropy {variant:1,2,3,4}Sundering Axe @@ -652,44 +645,25 @@ describe("TestItemMods", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") + local function testSkill(skill, index, expected) + build.skillsTab:PasteSocketGroup(skill.." 20/0 1") + runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Lacerate of Haemorrhage 20/0 1") - runCallback("OnFrame") - assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) - - build.skillsTab:PasteSocketGroup("Lacerate of Butchering 20/0 1") - runCallback("OnFrame") - switchSocketGroup(2) - assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == true) - - build.skillsTab:PasteSocketGroup("Ice Crash of Cadence 20/0 1") - runCallback("OnFrame") - switchSocketGroup(3) - assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) - - build.skillsTab:PasteSocketGroup("Swordstorm 20/0 1") - runCallback("OnFrame") - switchSocketGroup(4) - assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) - - build.skillsTab:PasteSocketGroup("Ground Slam of Earthshaking 20/0 1") - runCallback("OnFrame") - switchSocketGroup(5) - assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == true) - - build.skillsTab:PasteSocketGroup("Sunder 20/0 1") - runCallback("OnFrame") - switchSocketGroup(6) - assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) + build.mainSocketGroup = index + build.modFlag = true + build.buildFlag = true + runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Chain Hook 20/0 1") - runCallback("OnFrame") - switchSocketGroup(7) - assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == nil) + assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == expected) + end - build.skillsTab:PasteSocketGroup("Dual Strike of Ambidexterity 20/0 1") - runCallback("OnFrame") - switchSocketGroup(8) - assert.True(build.calcsTab.mainEnv.player.mainSkill.skillFlags.disable == true) + testSkill("Lacerate of Haemorrhage", 1, nil) + testSkill("Lacerate of Butchering", 2, true) + testSkill("Ice Crash of Cadence", 3, nil) + testSkill("Swordstorm", 4, nil) + testSkill("Ground Slam of Earthshaking", 5, true) + testSkill("Sunder", 6, nil) + testSkill("Chain Hook", 7, nil) + testSkill("Dual Strike of Ambidexterity", 8, true) end) end)