From 03c91509d370c7b7b1a3e5943a89e60fa734415f Mon Sep 17 00:00:00 2001 From: Xaver-DaRed Date: Fri, 30 Jan 2026 05:03:36 +0100 Subject: [PATCH] Cleanup "formMagicBurst" function --- scripts/globals/bluemagic.lua | 6 +- scripts/globals/combat/magic_hit_rate.lua | 10 ++- scripts/globals/job_utils/dragoon.lua | 2 +- scripts/globals/job_utils/rune_fencer.lua | 2 +- scripts/globals/magicburst.lua | 78 ++++++++++----------- scripts/globals/mobskills.lua | 4 +- scripts/globals/spells/damage_spell.lua | 2 +- scripts/globals/spells/enfeebling_song.lua | 2 +- scripts/globals/spells/enfeebling_spell.lua | 2 +- 9 files changed, 52 insertions(+), 56 deletions(-) diff --git a/scripts/globals/bluemagic.lua b/scripts/globals/bluemagic.lua index 28156da8089..5ba032f629c 100644 --- a/scripts/globals/bluemagic.lua +++ b/scripts/globals/bluemagic.lua @@ -412,7 +412,7 @@ xi.spells.blue.useMagicalSpell = function(caster, target, spell, params) local spellElement = spell:getElement() local spellGroup = spell:getSpellGroup() local skillType = xi.skill.BLUE_MAGIC - local _, skillchainCount = xi.magicburst.formMagicBurst(spellElement, target) -- External function. Not present in magic.lua. + local _, skillchainCount = xi.magicburst.formMagicBurst(target, spellElement) -- External function. Not present in magic.lua. -- Final D value local finalDamage = (initialD + wsc) * (params.multiplier + azureBonus + correlationMultiplier) + statBonus @@ -472,7 +472,7 @@ xi.spells.blue.useDrainSpell = function(caster, target, spell, params, damageCap local spellElement = spell:getElement() local spellGroup = spell:getSpellGroup() local skillType = xi.skill.BLUE_MAGIC - local _, skillchainCount = xi.magicburst.formMagicBurst(spellElement, target) -- External function. Not present in magic.lua. + local _, skillchainCount = xi.magicburst.formMagicBurst(target, spellElement) -- External function. Not present in magic.lua. finalDamage = math.floor(finalDamage * xi.combat.magicHitRate.calculateResistRate(caster, target, spellGroup, skillType, 0, spellElement, params.attribute, 0, 0)) finalDamage = math.floor(finalDamage * xi.spells.damage.calculateElementalStaffBonus(caster, spellElement)) @@ -740,7 +740,7 @@ xi.spells.blue.useEnfeeblingSpell = function(caster, target, spell, params) if target:addStatusEffect(effect, params.power, params.tick, math.floor(params.duration * resist)) then -- Add "Magic Burst!" message - local _, skillchainCount = xi.magicburst.formMagicBurst(spellElement, target) -- External function. Not present in magic.lua. + local _, skillchainCount = xi.magicburst.formMagicBurst(target, spellElement) -- External function. Not present in magic.lua. if skillchainCount > 0 then spell:setMsg(xi.msg.basic.MAGIC_BURST_ENFEEB_IS) diff --git a/scripts/globals/combat/magic_hit_rate.lua b/scripts/globals/combat/magic_hit_rate.lua index 43b2304f95e..ea0c509cf2d 100644 --- a/scripts/globals/combat/magic_hit_rate.lua +++ b/scripts/globals/combat/magic_hit_rate.lua @@ -252,14 +252,12 @@ local function magicAccuracyFromMagicBurst(target, actionElement, statUsed) return 0 end - local magicAcc = 0 - local _, skillchainCount = xi.magicburst.formMagicBurst(actionElement, target) - - if skillchainCount > 0 then - magicAcc = 100 + local _, skillchainCount = xi.magicburst.formMagicBurst(target, actionElement) + if skillchainCount <= 0 then + return 0 end - return magicAcc + return 100 end -- Magic Accuracy from Day and Weather Element. diff --git a/scripts/globals/job_utils/dragoon.lua b/scripts/globals/job_utils/dragoon.lua index 4f1505e605b..76c0f869ff5 100644 --- a/scripts/globals/job_utils/dragoon.lua +++ b/scripts/globals/job_utils/dragoon.lua @@ -688,7 +688,7 @@ xi.job_utils.dragoon.useDamageBreath = function(wyvern, target, skill, action, d local bonusMacc = strafeMeritPower + master:getMod(xi.mod.WYVERN_BREATH_MACC) local element = damageType - xi.damageType.ELEMENTAL - local _, skillchainCount = xi.magicburst.formMagicBurst(element, target) + local _, skillchainCount = xi.magicburst.formMagicBurst(target, element) -- Breath accuracy is directly affected by a wyvern's current HP, but no data exists. local resist = xi.combat.magicHitRate.calculateResistRate(wyvern, target, 0, 0, 0, element, 0, 0, bonusMacc) diff --git a/scripts/globals/job_utils/rune_fencer.lua b/scripts/globals/job_utils/rune_fencer.lua index 633f60422f2..983dcee07ef 100644 --- a/scripts/globals/job_utils/rune_fencer.lua +++ b/scripts/globals/job_utils/rune_fencer.lua @@ -530,7 +530,7 @@ local function getSwipeLungeDamageMultipliers(player, target, element, bonusMacc multipliers.magicBurst = 1 multipliers.magicBurstBonus = 1 - local _, skillchainCount = xi.magicburst.formMagicBurst(element, target) + local _, skillchainCount = xi.magicburst.formMagicBurst(target, element) if skillchainCount > 0 then multipliers.magicBurst = xi.spells.damage.calculateIfMagicBurst(target, element, skillchainCount) diff --git a/scripts/globals/magicburst.lua b/scripts/globals/magicburst.lua index a71672c790d..9eaab8f7d2a 100644 --- a/scripts/globals/magicburst.lua +++ b/scripts/globals/magicburst.lua @@ -1,59 +1,57 @@ xi = xi or {} xi.magicburst = xi.magicburst or {} -local matches = -- [element id][resonance id] +local matches = { +-- [element Id] = { resonance Id } -- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -- N T C L S R D I I G D F F L D L D - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -- (1) NONE - { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0 }, -- (2) FIRE - { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 }, -- (3) ICE - { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0 }, -- (4) WIND - { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1 }, -- (5) EARTH - { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0 }, -- (6) THUNDER - { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1 }, -- (7) WATER - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0 }, -- (8) LIGHT - { 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1 }, -- (9) DARK - -- Blue mage spells. Included for the sake of completeness - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -- (10) BLU - Physical Blunt - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -- (11) BLU - Physical Hand-to-Hand - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -- (12) BLU - Physical Piercing - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -- (13) BLU - Physical Slashing + [xi.element.NONE ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + [xi.element.FIRE ] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0 }, + [xi.element.ICE ] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 }, + [xi.element.WIND ] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0 }, + [xi.element.EARTH ] = { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1 }, + [xi.element.THUNDER] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0 }, + [xi.element.WATER ] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1 }, + [xi.element.LIGHT ] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0 }, + [xi.element.DARK ] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1 }, } --- Returns a boolean if the spell's element matches the resonance given ----@param ele number ----@param resonance CStatusEffect ----@return boolean -local function doesSpellElementMatchResonance(ele, resonance) - if ele == nil or utils.clamp(ele, 0, 12) ~= ele then - return false +---@param target CBaseEntity +---@param actionElement number +---@return number, number +xi.magicburst.formMagicBurst = function(target, actionElement) + if not target then + return 0, 0 end - local isMatch = matches[ele + 1][resonance:getPower() + 1] - return (isMatch ~= nil and isMatch > 0) -end + if not actionElement then + return 0, 0 + end + + if actionElement <= xi.element.NONE or actionElement > xi.element.DARK then + return 0, 0 + end ----@param element number ----@param target CBaseEntity ----@return number, number -xi.magicburst.formMagicBurst = function(element, target) local resonance = target:getStatusEffect(xi.effect.SKILLCHAIN) + if not resonance then + return 0, 0 + end + + local resonanceTier = resonance:getTier() + if resonanceTier <= 0 then + return 0, 0 + end - if - resonance ~= nil and - resonance:getTier() > 0 - then - if doesSpellElementMatchResonance(element, resonance) then - return resonance:getTier(), resonance:getSubPower() - end + local isMatch = matches[actionElement][resonance:getPower() + 1] > 0 and true or false + if not isMatch then + return 0, 0 end - return 0, 0 + return resonanceTier, resonance:getSubPower() end -- Returns a boolean if the element matches the skillchain property given -xi.magicburst.doesElementMatchWeaponskill = function(ele, SCProp) - local isMatch = matches[ele + 1][SCProp + 1] - return (isMatch ~= nil and isMatch > 0) +xi.magicburst.doesElementMatchWeaponskill = function(actionElement, SCProp) + return matches[actionElement][SCProp + 1] > 0 and true or false end diff --git a/scripts/globals/mobskills.lua b/scripts/globals/mobskills.lua index 95e66782944..c5a604cc86b 100644 --- a/scripts/globals/mobskills.lua +++ b/scripts/globals/mobskills.lua @@ -63,7 +63,7 @@ local burstMultipliersByTier = local function calculateMobMagicBurst(caster, ele, target) local burstMultiplier = 1.0 - local skillchainTier, skillchainCount = xi.magicburst.formMagicBurst(ele, target) + local skillchainTier, skillchainCount = xi.magicburst.formMagicBurst(target, ele) if skillchainTier > 0 then burstMultiplier = burstMultipliersByTier[skillchainCount] @@ -360,7 +360,7 @@ xi.mobskills.mobMagicalMove = function(actor, target, action, baseDamage, action petAccBonus = utils.clamp(master:getSkillLevel(xi.skill.SUMMONING_MAGIC) - master:getMaxSkillLevel(actor:getMainLvl(), xi.job.SMN, xi.skill.SUMMONING_MAGIC), 0, 200) end - local skillchainTier, _ = xi.magicburst.formMagicBurst(actionElement, target) + local skillchainTier, _ = xi.magicburst.formMagicBurst(target, actionElement) if actor:getPetID() > 0 and skillchainTier > 0 diff --git a/scripts/globals/spells/damage_spell.lua b/scripts/globals/spells/damage_spell.lua index 3907632480b..2572fed2986 100644 --- a/scripts/globals/spells/damage_spell.lua +++ b/scripts/globals/spells/damage_spell.lua @@ -1087,7 +1087,7 @@ xi.spells.damage.useDamageSpell = function(caster, target, spell) (caster:hasStatusEffect(xi.effect.BURST_AFFINITY) or caster:hasStatusEffect(xi.effect.AZURE_LORE))) then - local _, skillchainCount = xi.magicburst.formMagicBurst(spellElement, target) -- External function. Not present in magic.lua. + local _, skillchainCount = xi.magicburst.formMagicBurst(target, spellElement) -- External function. Not present in magic.lua. if skillchainCount > 0 then magicBurst = xi.spells.damage.calculateIfMagicBurst(target, spellElement, skillchainCount) diff --git a/scripts/globals/spells/enfeebling_song.lua b/scripts/globals/spells/enfeebling_song.lua index 246d09f4523..02f76aa3aa6 100644 --- a/scripts/globals/spells/enfeebling_song.lua +++ b/scripts/globals/spells/enfeebling_song.lua @@ -240,7 +240,7 @@ xi.spells.enfeebling.useEnfeeblingSong = function(caster, target, spell) -- STEP 5: Attempt to apply the status effect. Check for magic burst. ------------------------------ if target:addStatusEffect(spellEffect, power, tick, duration, 0, subEffect) then - local _, skillchainCount = xi.magicburst.formMagicBurst(spellElement, target) + local _, skillchainCount = xi.magicburst.formMagicBurst(target, spellElement) if skillchainCount > 0 then spell:setMsg(xi.msg.basic.MAGIC_BURST_ENFEEB) caster:triggerRoeEvent(xi.roeTrigger.MAGIC_BURST) diff --git a/scripts/globals/spells/enfeebling_spell.lua b/scripts/globals/spells/enfeebling_spell.lua index 786763b9029..96a646b7157 100644 --- a/scripts/globals/spells/enfeebling_spell.lua +++ b/scripts/globals/spells/enfeebling_spell.lua @@ -504,7 +504,7 @@ xi.spells.enfeebling.useEnfeeblingSpell = function(caster, target, spell) end -- Add "Magic Burst!" message - local _, skillchainCount = xi.magicburst.formMagicBurst(spellElement, target) -- External function. Not present in magic.lua. + local _, skillchainCount = xi.magicburst.formMagicBurst(target, spellElement) -- External function. Not present in magic.lua. if skillchainCount > 0 then spell:setMsg(xi.msg.basic.MAGIC_BURST_ENFEEB_IS - message * 3)