From 6819bf5ac07b05382cac5063f1b474e64f51d4b5 Mon Sep 17 00:00:00 2001 From: cupkax Date: Tue, 4 Aug 2026 08:34:32 +1000 Subject: [PATCH 1/5] Expand the power table with more stats --- src/Modules/Data.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index 1045958434..61252e48c7 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -170,6 +170,22 @@ data.powerStatList = { { stat="BlockChance", label="Block Chance" }, { stat="SpellBlockChance", label="Spell Block Chance" }, { stat="SpellSuppressionChance", label="Spell Suppression Chance" }, + { stat="AreaOfEffectMod", label="Area of Effect" }, + { stat="DurationMod", label="Skill Effect Duration" }, + { stat="CritExtraDamageReduction", label="Reduced Critical Strike Damage Taken" }, + { stat="CurseEffectOnSelf", label="Curse Effect on You", transform=function(value) return -value end }, + { stat="CurseEffectMod", label="Curse Effect" }, + { stat="AuraEffectMod", label="Aura Effect" }, + { stat="StunDuration", label="Stun Duration", transform=function(value) return -value end }, + { stat="StunThreshold", label="Stun Threshold" }, + { stat="EnemyStunThresholdMod", label="Enemy Stun Threshold", transform=function(value) return -value end }, + { stat="ElusiveEffectMod", label="Elusive Effect" }, + { stat="LifeRecoupRecoveryAvg", label="Life Recoup" }, + { stat="ManaRecoupRecoveryAvg", label="Mana Recoup" }, + { stat="EnergyShieldRecoupRecoveryAvg", label="Energy Shield Recoup" }, + { stat="ImpaleChance", label="Impale Chance" }, + { stat="ImpaleStoredDamage", label="Impale Effect" }, + { stat="MaximumRage", label="Maximum Rage" }, } ---@param output any Calc output From b2d136edb9bc27571aebecca67f59e35abd1273e Mon Sep 17 00:00:00 2001 From: cupkax Date: Tue, 4 Aug 2026 16:44:29 +1000 Subject: [PATCH 2/5] Reorganise nodes --- src/Modules/Data.lua | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index 61252e48c7..fcc5c1edbe 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -128,6 +128,8 @@ data.powerStatList = { { stat="WithImpaleDPS", label="Impale + Hit DPS" }, { stat="AverageDamage", label="Average Hit" }, { stat="Speed", label="Attack/Cast Speed" }, + { stat="AreaOfEffectMod", label="Area of Effect" }, + { stat="DurationMod", label="Skill Effect Duration" }, { stat="TotalDot", label="DoT DPS" }, { stat="BleedDPS", label="Bleed DPS" }, { stat="IgniteDPS", label="Ignite DPS" }, @@ -135,16 +137,20 @@ data.powerStatList = { { stat="Life", label="Life" }, { stat="LifeRegen", label="Life regen" }, { stat="LifeLeechRate", label="Life leech" }, + { stat="LifeRecoupRecoveryAvg", label="Life Recoup" }, { stat="Armour", label="Armour" }, { stat="Evasion", label="Evasion" }, { stat="EnergyShield", label="Energy Shield" }, { stat="EnergyShieldRecoveryCap", label="Recoverable ES" }, { stat="EnergyShieldRegen", label="Energy Shield regen" }, { stat="EnergyShieldLeechRate", label="Energy Shield leech" }, + { stat="EnergyShieldRecoupRecoveryAvg", label="Energy Shield Recoup" }, { stat="Mana", label="Mana" }, { stat="ManaRegen", label="Mana regen" }, { stat="ManaLeechRate", label="Mana leech" }, + { stat="ManaRecoupRecoveryAvg", label="Mana Recoup" }, { stat="Ward", label="Ward" }, + { stat="MaximumRage", label="Maximum Rage" }, { stat="Str", label="Strength" }, { stat="Dex", label="Dexterity" }, { stat="Int", label="Intelligence" }, @@ -159,33 +165,27 @@ data.powerStatList = { { stat="ColdTakenHit", label="Taken Cold dmg", transform=function(value) return -value end }, { stat="FireTakenHit", label="Taken Fire dmg", transform=function(value) return -value end }, { stat="ChaosTakenHit", label="Taken Chaos dmg", transform=function(value) return -value end }, + { stat="CritExtraDamageReduction", label="Reduced Critical Strike Damage Taken" }, + { stat="StunThreshold", label="Stun Threshold" }, + { stat="StunDuration", label="Stun Duration", transform=function(value) return -value end }, + { stat="EnemyStunThresholdMod", label="Enemy Stun Threshold", transform=function(value) return -value end }, { stat="CritChance", label="Crit Chance" }, { stat="CritMultiplier", label="Crit Multiplier" }, + { stat="ImpaleChance", label="Impale Chance" }, + { stat="ImpaleStoredDamage", label="Impale Effect" }, { stat="BleedChance", label="Bleed Chance" }, { stat="FreezeChance", label="Freeze Chance" }, { stat="IgniteChance", label="Ignite Chance" }, { stat="ShockChance", label="Shock Chance" }, + { stat="CurseEffectMod", label="Curse Effect" }, + { stat="CurseEffectOnSelf", label="Curse Effect on You", transform=function(value) return -value end }, + { stat="AuraEffectMod", label="Aura Effect" }, + { stat="ElusiveEffectMod", label="Elusive Effect" }, { stat="EffectiveMovementSpeedMod", label="Move speed" }, { stat="LightRadiusMod", label="Light Radius" }, { stat="BlockChance", label="Block Chance" }, { stat="SpellBlockChance", label="Spell Block Chance" }, { stat="SpellSuppressionChance", label="Spell Suppression Chance" }, - { stat="AreaOfEffectMod", label="Area of Effect" }, - { stat="DurationMod", label="Skill Effect Duration" }, - { stat="CritExtraDamageReduction", label="Reduced Critical Strike Damage Taken" }, - { stat="CurseEffectOnSelf", label="Curse Effect on You", transform=function(value) return -value end }, - { stat="CurseEffectMod", label="Curse Effect" }, - { stat="AuraEffectMod", label="Aura Effect" }, - { stat="StunDuration", label="Stun Duration", transform=function(value) return -value end }, - { stat="StunThreshold", label="Stun Threshold" }, - { stat="EnemyStunThresholdMod", label="Enemy Stun Threshold", transform=function(value) return -value end }, - { stat="ElusiveEffectMod", label="Elusive Effect" }, - { stat="LifeRecoupRecoveryAvg", label="Life Recoup" }, - { stat="ManaRecoupRecoveryAvg", label="Mana Recoup" }, - { stat="EnergyShieldRecoupRecoveryAvg", label="Energy Shield Recoup" }, - { stat="ImpaleChance", label="Impale Chance" }, - { stat="ImpaleStoredDamage", label="Impale Effect" }, - { stat="MaximumRage", label="Maximum Rage" }, } ---@param output any Calc output From 6ff8e28cccaf1d68fab1462a2ba1e47435270303 Mon Sep 17 00:00:00 2001 From: cupkax Date: Tue, 4 Aug 2026 17:22:11 +1000 Subject: [PATCH 3/5] Add more stats --- src/Modules/CalcDefence.lua | 1 + src/Modules/Data.lua | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/Modules/CalcDefence.lua b/src/Modules/CalcDefence.lua index 72af401ae5..af0cb278fc 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -608,6 +608,7 @@ function calcs.resistances(actor) output[elem.."Resist"] = final + output[elem.."ResistMax"] = max output[elem.."ResistTotal"] = total output[elem.."ResistOverCap"] = m_max(0, total - max) output[elem.."ResistOver75"] = m_max(0, final - 75) diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index fcc5c1edbe..18251d2d9b 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -130,10 +130,17 @@ data.powerStatList = { { stat="Speed", label="Attack/Cast Speed" }, { stat="AreaOfEffectMod", label="Area of Effect" }, { stat="DurationMod", label="Skill Effect Duration" }, + { stat="Cooldown", label="Cooldown Recovery", transform=function(value) return -value end }, { stat="TotalDot", label="DoT DPS" }, { stat="BleedDPS", label="Bleed DPS" }, + { stat="BleedDamage", label="Bleed Total Damage" }, + { stat="BleedDuration", label="Bleed Duration" }, { stat="IgniteDPS", label="Ignite DPS" }, + { stat="IgniteDamage", label="Ignite Total Damage" }, + { stat="IgniteDuration", label="Ignite Duration" }, { stat="PoisonDPS", label="Poison DPS" }, + { stat="PoisonDamage", label="Poison Total Damage" }, + { stat="PoisonDuration", label="Poison Duration" }, { stat="Life", label="Life" }, { stat="LifeRegen", label="Life regen" }, { stat="LifeLeechRate", label="Life leech" }, @@ -165,6 +172,10 @@ data.powerStatList = { { stat="ColdTakenHit", label="Taken Cold dmg", transform=function(value) return -value end }, { stat="FireTakenHit", label="Taken Fire dmg", transform=function(value) return -value end }, { stat="ChaosTakenHit", label="Taken Chaos dmg", transform=function(value) return -value end }, + { stat="FireResistMax", label="Maximum Fire Resistance" }, + { stat="ColdResistMax", label="Maximum Cold Resistance" }, + { stat="LightningResistMax", label="Maximum Lightning Resistance" }, + { stat="ChaosResistMax", label="Maximum Chaos Resistance" }, { stat="CritExtraDamageReduction", label="Reduced Critical Strike Damage Taken" }, { stat="StunThreshold", label="Stun Threshold" }, { stat="StunDuration", label="Stun Duration", transform=function(value) return -value end }, @@ -177,6 +188,16 @@ data.powerStatList = { { stat="FreezeChance", label="Freeze Chance" }, { stat="IgniteChance", label="Ignite Chance" }, { stat="ShockChance", label="Shock Chance" }, + { stat="ChillEffectMod", label="Chill Effect" }, + { stat="ChillDuration", label="Chill Duration" }, + { stat="ShockEffectMod", label="Shock Effect" }, + { stat="ShockDuration", label="Shock Duration" }, + { stat="ScorchEffectMod", label="Scorch Effect" }, + { stat="ScorchDuration", label="Scorch Duration" }, + { stat="BrittleEffectMod", label="Brittle Effect" }, + { stat="BrittleDuration", label="Brittle Duration" }, + { stat="SapEffectMod", label="Sap Effect" }, + { stat="SapDuration", label="Sap Duration" }, { stat="CurseEffectMod", label="Curse Effect" }, { stat="CurseEffectOnSelf", label="Curse Effect on You", transform=function(value) return -value end }, { stat="AuraEffectMod", label="Aura Effect" }, @@ -230,6 +251,7 @@ local minionNonApplicableStats = { Spirit = true, EffectiveLootRarityMod = true, LightRadiusMod = true, + TotalCost = true, } for i = 1, #data.powerStatList do local statEntry = data.powerStatList[i] From 7106bc009c66a670d7b1e517c62aa4768a8996f4 Mon Sep 17 00:00:00 2001 From: cupkax Date: Tue, 4 Aug 2026 17:24:36 +1000 Subject: [PATCH 4/5] Add mana cost efficiency --- src/Modules/Data.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index 18251d2d9b..f7a278281a 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -156,6 +156,7 @@ data.powerStatList = { { stat="ManaRegen", label="Mana regen" }, { stat="ManaLeechRate", label="Mana leech" }, { stat="ManaRecoupRecoveryAvg", label="Mana Recoup" }, + { stat="ManaCost", label="Mana Cost Efficiency", transform=function(value) return -value end }, { stat="Ward", label="Ward" }, { stat="MaximumRage", label="Maximum Rage" }, { stat="Str", label="Strength" }, From 036501e97e23438067ec7aacdec36c2c37235117 Mon Sep 17 00:00:00 2001 From: cupkax Date: Tue, 4 Aug 2026 18:45:30 +1000 Subject: [PATCH 5/5] Add flask mods --- src/Modules/CalcPerform.lua | 13 +++++++++++-- src/Modules/Data.lua | 16 +++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index 73025efe92..7ae906bb7a 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -1574,8 +1574,11 @@ function calcs.perform(env, skipEHP) local flaskTotalRateInc = modDB:Sum("INC", nil, "FlaskRecoveryRate") local flaskDurInc = modDB:Sum("INC", nil, "FlaskDuration") - -- flask breakdown - if breakdown then + -- flask stats + -- These are plain modifier aggregates rather than per-flask outcomes, so they are calculated + -- unconditionally: node power runs the calculator without a breakdown, and would otherwise + -- read every one of them as zero. + do local chargesGenerated = modDB:Sum("BASE", nil, "FlaskChargesGenerated") local usedFlasks = 0 for i, v in pairs(env.flasks) do @@ -1591,6 +1594,12 @@ function calcs.perform(env, skipEHP) local manaChargesGenerated = modDB:Sum("BASE", nil, "ManaFlaskChargesGenerated") output.FlaskEffect = effectInc + output.FlaskDuration = flaskDurInc + output.FlaskRecoveryRate = flaskTotalRateInc + output.FlaskChargesUsed = modDB:Sum("INC", nil, "FlaskChargesUsed") + output.FlaskChargesGained = modDB:Sum("INC", nil, "FlaskChargesGained") + output.FlaskLifeRecovery = modDB:Sum("INC", nil, "FlaskLifeRecovery") + output.FlaskManaRecovery = modDB:Sum("INC", nil, "FlaskManaRecovery") output.FlaskChargeGen = totalChargesGenerated output.LifeFlaskChargeGen = totalChargesGenerated + lifeChargesGenerated output.ManaFlaskChargeGen = totalChargesGenerated + manaChargesGenerated diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index f7a278281a..6002b253f7 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -159,6 +159,13 @@ data.powerStatList = { { stat="ManaCost", label="Mana Cost Efficiency", transform=function(value) return -value end }, { stat="Ward", label="Ward" }, { stat="MaximumRage", label="Maximum Rage" }, + { stat="FlaskEffect", label="Flask Effect" }, + { stat="FlaskDuration", label="Flask Effect Duration" }, + { stat="FlaskRecoveryRate", label="Flask Recovery Rate" }, + { stat="FlaskLifeRecovery", label="Flask Life Recovery" }, + { stat="FlaskManaRecovery", label="Flask Mana Recovery" }, + { stat="FlaskChargesGained", label="Flask Charges Gained" }, + { stat="FlaskChargesUsed", label="Flask Charges Used", transform=function(value) return -value end }, { stat="Str", label="Strength" }, { stat="Dex", label="Dexterity" }, { stat="Int", label="Intelligence" }, @@ -252,7 +259,14 @@ local minionNonApplicableStats = { Spirit = true, EffectiveLootRarityMod = true, LightRadiusMod = true, - TotalCost = true, + -- flask stats are only ever written to the player's output + FlaskEffect = true, + FlaskDuration = true, + FlaskRecoveryRate = true, + FlaskLifeRecovery = true, + FlaskManaRecovery = true, + FlaskChargesGained = true, + FlaskChargesUsed = true, } for i = 1, #data.powerStatList do local statEntry = data.powerStatList[i]