From 26cfe73402d00ea062a6c665c40d988ee8bbe9cc Mon Sep 17 00:00:00 2001 From: Mickael Cagnion Date: Fri, 28 Aug 2026 21:51:25 +0200 Subject: [PATCH 1/2] Fix Mana-Infused Staff zero-mana reservation state Disable forced mana reservations before aggregation so a disabled Mana-Infused Staff cannot remain in reservation totals or breakdowns. Follow-up to PR 10283. --- spec/System/TestSkills_spec.lua | 6 +++++- src/Modules/CalcPerform.lua | 9 +++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index 8075f75884c..58baeec85de 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -132,8 +132,12 @@ describe("TestSkills", function() activeSkill = build.calcsTab.mainEnv.player.mainSkill assert.is_true(activeSkill.skillFlags.disable) assert.are.equals("This skill requires reserving Mana", activeSkill.disableReason) - assert.are.equals(0, activeSkill.skillData.ManaReservedBase) + assert.is_nil(activeSkill.skillData.ManaReservedBase) + assert.is_nil(activeSkill.skillData.ManaReservedPercent) assert.is_nil(activeSkill.skillData.LifeReservedBase) + assert.are.equals(0, build.calcsTab.mainEnv.player.reserved_ManaPercent) + assert.is_nil(build.calcsTab.mainEnv.player.output.ManaReservedPercent) + assert.are.equals(0, #build.calcsTab.mainEnv.player.breakdown.ManaReserved.reservations) end) it("Test Scorching ray applying exposure at max stages", function() diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index c7f75eda6c4..cc6a136cc04 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -1976,6 +1976,11 @@ function calcs.perform(env, skipEHP) breakdown.ManaReserved = { reservations = { } } end for _, activeSkill in ipairs(env.player.activeSkillList) do + local forcedManaReservation = activeSkill.skillData.ManaReservationPercentForced + if forcedManaReservation and m_ceil((output.Mana or 0) * forcedManaReservation / 100) == 0 then + activeSkill.skillFlags.disable = true + activeSkill.disableReason = "This skill requires reserving Mana" + end if (activeSkill.skillTypes[SkillType.HasReservation] or activeSkill.skillData.triggeredByAutoexertion ) and not activeSkill.skillTypes[SkillType.ReservationBecomesCost] and not activeSkill.skillFlags.disable then local skillModList = activeSkill.skillModList local skillCfg = activeSkill.skillCfg @@ -2081,10 +2086,6 @@ function calcs.perform(env, skipEHP) env.player["uncancellable_"..name.."Reservation"] = env.player["uncancellable_"..name.."Reservation"] + values.reservedPercent end end - if activeSkill.skillData.ManaReservationPercentForced and activeSkill.skillData.ManaReservedBase == 0 then - activeSkill.skillFlags.disable = true - activeSkill.disableReason = "This skill requires reserving Mana" - end end end From a54ea4ec740ee47cf101392f4caa1f73bbc7bda1 Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Thu, 29 Oct 2026 17:47:20 +1100 Subject: [PATCH 2/2] Simplify --- spec/System/TestSkills_spec.lua | 2 +- src/Data/Skills/act_int.lua | 3 +++ src/Export/Skills/act_int.txt | 1 + src/Modules/CalcPerform.lua | 5 ++--- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index 58baeec85de..544fa347881 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -113,7 +113,7 @@ describe("TestSkills", function() assert.is_nil(supports.SupportSacredWisps) end) - it("keeps forced mana reservations on mana", function() + it("keeps Mana-Infused Staff reservation on mana and disables it without mana", function() build.itemsTab:CreateDisplayItemFromRaw("Test Staff\nJudgement Staff") build.itemsTab:AddDisplayItem() build.skillsTab:PasteSocketGroup("Mana-Infused Staff 20/0 1\nArrogance 20/0 1\n") diff --git a/src/Data/Skills/act_int.lua b/src/Data/Skills/act_int.lua index 1357761081a..24e2afa31b3 100644 --- a/src/Data/Skills/act_int.lua +++ b/src/Data/Skills/act_int.lua @@ -13456,6 +13456,9 @@ skills["ManaInfusedStaff"] = { area = true, duration = true, }, + baseMods = { + skill("requiresManaReservation", true), + }, qualityStats = { { "base_skill_effect_duration", 2.5 }, }, diff --git a/src/Export/Skills/act_int.txt b/src/Export/Skills/act_int.txt index 7c0ea12dc98..1b5588714c6 100644 --- a/src/Export/Skills/act_int.txt +++ b/src/Export/Skills/act_int.txt @@ -3198,6 +3198,7 @@ return function(skills, mod, flag, skill) #skill ManaInfusedStaff #flags spell area duration +#baseMod skill("requiresManaReservation", true) statMap = { ["mana_infused_staff_base_trigger_interval_ms"] = { skill("hitTimeOverride", nil), diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index cc6a136cc04..aaa0904d7ea 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -1976,8 +1976,7 @@ function calcs.perform(env, skipEHP) breakdown.ManaReserved = { reservations = { } } end for _, activeSkill in ipairs(env.player.activeSkillList) do - local forcedManaReservation = activeSkill.skillData.ManaReservationPercentForced - if forcedManaReservation and m_ceil((output.Mana or 0) * forcedManaReservation / 100) == 0 then + if activeSkill.skillData.requiresManaReservation and output.Mana == 0 then activeSkill.skillFlags.disable = true activeSkill.disableReason = "This skill requires reserving Mana" end @@ -1996,7 +1995,7 @@ function calcs.perform(env, skipEHP) pool.Life.baseFlat = skillModList:Sum("BASE", skillCfg, "LifeCostBase") + (activeSkill.activeEffect.grantedEffectLevel.cost.Life or 0) end pool.Life.basePercent = activeSkill.skillData.lifeReservationPercent or activeSkill.activeEffect.grantedEffectLevel.lifeReservationPercent or 0 - if skillModList:Flag(skillCfg, "BloodMagicReserved") and not activeSkill.skillData.ManaReservationPercentForced then + if skillModList:Flag(skillCfg, "BloodMagicReserved") and not activeSkill.skillData.requiresManaReservation then pool.Life.baseFlat = pool.Life.baseFlat + pool.Mana.baseFlat pool.Mana.baseFlat = 0 activeSkill.skillData["LifeReservationFlatForced"] = activeSkill.skillData["ManaReservationFlatForced"]