From 7ab5a4477075b9760ba191ba70f0c59e9487eb17 Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 28 Dec 2025 11:48:20 +0800 Subject: [PATCH 01/18] adding blue spells --- .../actions/spells/blue/amorphic_spikes.lua | 53 +++++++++++++++ scripts/actions/spells/blue/auroral_drape.lua | 47 +++++++++++++ .../actions/spells/blue/charged_whisker.lua | 45 ++++++++++++ scripts/actions/spells/blue/delta_thrust.lua | 68 +++++++++++++++++++ scripts/actions/spells/blue/dream_flower.lua | 37 ++++++++++ scripts/actions/spells/blue/empty_thrash.lua | 47 +++++++++++++ scripts/actions/spells/blue/fantod.lua | 38 +++++++++++ scripts/actions/spells/blue/goblin_rush.lua | 53 +++++++++++++++ scripts/actions/spells/blue/heavy_strike.lua | 48 +++++++++++++ .../actions/spells/blue/quad_continuum.lua | 47 +++++++++++++ scripts/actions/spells/blue/quadrastrike.lua | 54 +++++++++++++++ scripts/actions/spells/blue/thermal_pulse.lua | 57 ++++++++++++++++ scripts/actions/spells/blue/whirl_of_rage.lua | 62 +++++++++++++++++ scripts/actions/spells/blue/white_wind.lua | 37 ++++++++++ scripts/actions/spells/blue/wind_breath.lua | 36 ++++++++++ 15 files changed, 729 insertions(+) create mode 100644 scripts/actions/spells/blue/amorphic_spikes.lua create mode 100644 scripts/actions/spells/blue/auroral_drape.lua create mode 100644 scripts/actions/spells/blue/charged_whisker.lua create mode 100644 scripts/actions/spells/blue/delta_thrust.lua create mode 100644 scripts/actions/spells/blue/dream_flower.lua create mode 100644 scripts/actions/spells/blue/empty_thrash.lua create mode 100644 scripts/actions/spells/blue/fantod.lua create mode 100644 scripts/actions/spells/blue/goblin_rush.lua create mode 100644 scripts/actions/spells/blue/heavy_strike.lua create mode 100644 scripts/actions/spells/blue/quad_continuum.lua create mode 100644 scripts/actions/spells/blue/quadrastrike.lua create mode 100644 scripts/actions/spells/blue/thermal_pulse.lua create mode 100644 scripts/actions/spells/blue/whirl_of_rage.lua create mode 100644 scripts/actions/spells/blue/white_wind.lua create mode 100644 scripts/actions/spells/blue/wind_breath.lua diff --git a/scripts/actions/spells/blue/amorphic_spikes.lua b/scripts/actions/spells/blue/amorphic_spikes.lua new file mode 100644 index 00000000000..45346c6d618 --- /dev/null +++ b/scripts/actions/spells/blue/amorphic_spikes.lua @@ -0,0 +1,53 @@ +----------------------------------- +-- Spell: Amorphic Spikes +-- Delivers a fivefold attack. Danage varies with TP +-- Spell cost: 79 MP +-- Monster Type: AMORPH +-- Spell Type: Physical (Piercing) +-- Blue Magic Points: 4 +-- Stat Bonus: INT+5 MND+2 +-- Level: 98 +-- Casting Time: 0.5 seconds +-- Recast Time: 58.25 seconds +-- Skillchain Element(s): Gravitation/Transfixion +-- Combos: Gilfinder / Treasure Hunter +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.AMORPH + params.tpmod = xi.spells.blue.tpMod.ATTACK + params.bonusacc = 0 + if caster:hasStatusEffect(xi.effect.AZURE_LORE) then + params.bonusacc = 70 + elseif caster:hasStatusEffect(xi.effect.CHAIN_AFFINITY) then + params.bonusacc = math.floor(caster:getTP() / 50) + end + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.PIERCING + params.scattr = xi.skillchainType.GRAVITATION + params.scattr2 = xi.skillchainType.TRANSFIXION + params.numhits = 5 + params.multiplier = 1.0 + params.tp150 = 1.375 + params.tp300 = 1.750 + params.azuretp = 2.125 + params.duppercap = 75 + params.str_wsc = 0.0 + params.dex_wsc = 0.20 + params.vit_wsc = 0.0 + params.agi_wsc = 0.0 + params.int_wsc = 0.20 + params.mnd_wsc = 0.0 + params.chr_wsc = 0.0 + + return xi.spells.blue.usePhysicalSpell(caster, target, spell, params) +end + +return spellObject diff --git a/scripts/actions/spells/blue/auroral_drape.lua b/scripts/actions/spells/blue/auroral_drape.lua new file mode 100644 index 00000000000..1a546028004 --- /dev/null +++ b/scripts/actions/spells/blue/auroral_drape.lua @@ -0,0 +1,47 @@ +----------------------------------- +-- Spell: Auroral Drape +-- Silences and blinds enemies within range. +-- Spell cost: 51 MP +-- Monster Type: Empty +-- Spell Type: Magical (Wind) +-- Blue Magic Points: 4 +-- Stat Bonus: INT+3 CHR-2 +-- Level: 84 +-- Casting Time: Casting Time: 4 seconds +-- Recast Time: Recast Time: 60 seconds +-- Duration: 40-60 seconds +-- Magic Bursts on: None +-- Combos: Fast Cast +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.EMPTY + params.effect = xi.effect.SILENCE + params.power = 1 + params.tick = 0 + params.duration = 60 + params.resistThreshold = 0.50 + params.isGaze = false + params.isConal = false + + local resist = xi.combat.magicHitRate.calculateResistRate(caster, target, spell:getSpellGroup(), xi.skill.BLUE_MAGIC, 0, spell:getElement(), xi.mod.INT, 0, 0) + + -- Handle status effects. + local effectTable = + { + [1] = { xi.effect.BIND, 25, 0, 40 + math.floor(resist * 20) }, + } + + xi.spells.blue.applyBlueAdditionalEffect(caster, target, params, effectTable) + + return xi.spells.blue.useEnfeeblingSpell(caster, target, spell, params) +end + +return spellObject diff --git a/scripts/actions/spells/blue/charged_whisker.lua b/scripts/actions/spells/blue/charged_whisker.lua new file mode 100644 index 00000000000..46b5b46b7fb --- /dev/null +++ b/scripts/actions/spells/blue/charged_whisker.lua @@ -0,0 +1,45 @@ +----------------------------------- +-- Spell: Charged Whisker +-- Deals Lightning damage to enemies within area of effect. +-- Spell cost: 183 MP +-- Monster Type: Beast +-- Spell Type: Magical (Lightning) +-- Blue Magic Points: 4 +-- Stat Bonus: HP-10 DEX+2 INT+2 +-- Level: 88 +-- Casting Time: 5 seconds +-- Recast Time: 85 seconds +-- Magic Bursts on: Reverberation, Distortion, and Darkness +-- Combos: Gilfinder, Treasure Hunter +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.BEAST + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHTNING + params.attribute = xi.mod.INT + params.multiplier = 2.0 + params.tMultiplier = 4.5 + params.duppercap = 100 + params.str_wsc = 0.0 + params.dex_wsc = 0.5 + params.vit_wsc = 0.0 + params.agi_wsc = 0.0 + params.int_wsc = 0.0 + params.mnd_wsc = 0.0 + params.chr_wsc = 0.0 + + -- Handle damage. + local damage = xi.spells.blue.useMagicalSpell(caster, target, spell, params) + + return damage +end + +return spellObject diff --git a/scripts/actions/spells/blue/delta_thrust.lua b/scripts/actions/spells/blue/delta_thrust.lua new file mode 100644 index 00000000000..5c62406b9db --- /dev/null +++ b/scripts/actions/spells/blue/delta_thrust.lua @@ -0,0 +1,68 @@ +----------------------------------- +-- Spell: Delta Thrust +-- Delivers a threefold attack. Additional effect: Plague +-- Spell cost: 28 MP +-- Monster Type: Lizard +-- Spell Type: Physical (Slashing) +-- Blue Magic Points: 2 +-- Stat Bonus: HP+15 MP-5 INT-1 +-- Level: 89 +-- Casting Time: 0.5 seconds +-- Recast Time: 15.0 seconds +-- Skillchain Element(s): Liquefaction/Detonation +-- Combos: Dual Wield +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.LIZARD + params.bonusacc = 0 + if caster:hasStatusEffect(xi.effect.AZURE_LORE) then + params.bonusacc = 70 + elseif caster:hasStatusEffect(xi.effect.CHAIN_AFFINITY) then + params.bonusacc = math.floor(caster:getTP() / 50) + end + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.scattr = xi.skillchainType.LIQUEFACTION + params.scattr2 = xi.skillchainType.DETONATION + params.numhits = 3 + params.multiplier = 1.0 + params.tp150 = 1.0 + params.tp300 = 1.0 + params.azuretp = 1.0 + params.duppercap = 75 + params.str_wsc = 0.20 + params.dex_wsc = 0.0 + params.vit_wsc = 0.50 + params.agi_wsc = 0.0 + params.int_wsc = 0.0 + params.mnd_wsc = 0.0 + params.chr_wsc = 0.0 + + -- Handle damage. + local damage = xi.spells.blue.usePhysicalSpell(caster, target, spell, params) + + if damage <= 0 then + return damage + end + + -- Handle status effects. + local effectTable = + { + [1] = { xi.effect.PLAGUE, 9, 6, 40 + math.floor(caster:getTP() / 3000) }, + } + + xi.spells.blue.applyBlueAdditionalEffect(caster, target, params, effectTable) + + + return damage +end + +return spellObject diff --git a/scripts/actions/spells/blue/dream_flower.lua b/scripts/actions/spells/blue/dream_flower.lua new file mode 100644 index 00000000000..227ea927bb4 --- /dev/null +++ b/scripts/actions/spells/blue/dream_flower.lua @@ -0,0 +1,37 @@ +----------------------------------- +-- Spell: Dream Flower +-- Puts all enemies within range to sleep +-- Spell cost: 68 MP +-- Monster Type: Plantoid +-- Spell Type: Magical (Dark) +-- Blue Magic Points: 3 +-- Stat Bonus: HP+5 MP+5 CHR+2 +-- Level: 87 +-- Casting Time: Casting Time: 2.5 seconds +-- Recast Time: Recast Time: 45 seconds +-- Duration: 90~120 seconds +-- Magic Bursts on: None +-- Combos: Magic Attack Bonus +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.PLANTOID + params.effect = xi.effect.SLEEP_II + params.power = 1 + params.tick = 0 + params.duration = 120 + params.resistThreshold = 0.50 + params.isGaze = false + params.isConal = false + + return xi.spells.blue.useEnfeeblingSpell(caster, target, spell, params) +end + +return spellObject diff --git a/scripts/actions/spells/blue/empty_thrash.lua b/scripts/actions/spells/blue/empty_thrash.lua new file mode 100644 index 00000000000..8b23d692200 --- /dev/null +++ b/scripts/actions/spells/blue/empty_thrash.lua @@ -0,0 +1,47 @@ +----------------------------------- +-- Spell: Empty Thrash +-- Delivers an area attack. Accuracy varies with TP +-- Spell cost: 33 MP +-- Monster Type: Empty +-- Spell Type: Physical (Slashing) +-- Blue Magic Points: 3 +-- Stat Bonus: STR+3 CHR-2 +-- Level: 87 +-- Casting Time: 0.5 seconds +-- Recast Time: 40.75 seconds +-- Skillchain Element(s): Compression, Scission +-- Combos: Doule Attack, Triple Attack +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.EMPTY + params.tpmod = xi.spells.blue.tpMod.ACC + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.scattr = xi.skillchainType.COMPRESSION + params.scattr2 = xi.skillchainType.SCISSION + params.numhits = 1 + params.multiplier = 2.0 + params.tp150 = 2.0 + params.tp300 = 2.0 + params.azuretp = 2.0 + params.duppercap = 33 + params.str_wsc = 0.5 + params.dex_wsc = 0.0 + params.vit_wsc = 0.0 + params.agi_wsc = 0.0 + params.int_wsc = 0.0 + params.mnd_wsc = 0.0 + params.chr_wsc = 0.0 + + return xi.spells.blue.usePhysicalSpell(caster, target, spell, params) +end + +return spellObject diff --git a/scripts/actions/spells/blue/fantod.lua b/scripts/actions/spells/blue/fantod.lua new file mode 100644 index 00000000000..d5cc16aaee4 --- /dev/null +++ b/scripts/actions/spells/blue/fantod.lua @@ -0,0 +1,38 @@ +----------------------------------- +-- Spell: Fantod +-- Enhances attack and magic attack. +-- Spell cost: 12 MP +-- Monster Type: Birds +-- Spell Type: Magical (Fire) +-- Blue Magic Points: 1 +-- Stat Bonus: HP-20 DEX+2 AGI+2 +-- Level: 85 +-- Casting Time: 0.5 Seconds +-- Recast Time: 10 Seconds +-- 3 minutes or next attack +----------------------------------- +-- Combos: Store TP +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local power = 12.5 + (0.10 * caster:getMod(xi.mod.BOOST_EFFECT)) + + if caster:hasStatusEffect(xi.effect.BOOST) then + local effect = caster:getStatusEffect(xi.effect.BOOST) + + effect:setPower(effect:getPower() + power) -- Store updated power in boost for zoning + effect:addMod(xi.mod.ATTP, power) + else + caster:addStatusEffect(xi.effect.ATTACK_BOOST, power, 0, 180) + caster:addStatusEffect(xi.effect.MAGIC_ATK_BOOST, power, 0, 180) + end + return xi.mod.BOOST_EFFECT +end + +return spellObject diff --git a/scripts/actions/spells/blue/goblin_rush.lua b/scripts/actions/spells/blue/goblin_rush.lua new file mode 100644 index 00000000000..6a36137907e --- /dev/null +++ b/scripts/actions/spells/blue/goblin_rush.lua @@ -0,0 +1,53 @@ +----------------------------------- +-- Spell: Goblin Rush +-- Delivers a threefold attack. Accuracy varies with TP +-- Spell cost: 81 MP +-- Monster Type: BEASTMEN +-- Spell Type: Physical (Blunt) +-- Blue Magic Points: 3 +-- Stat Bonus: HP+10 DEX+3 MND-3 +-- Level: 81 +-- Casting Time: 0.5 seconds +-- Recast Time: 25.5 seconds +-- Skillchain Element(s): Fusion/Impaction +-- Combos: Skillchain Bonus +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.BEASTMEN + params.tpmod = xi.spells.blue.tpMod.ACC + params.bonusacc = 0 + if caster:hasStatusEffect(xi.effect.AZURE_LORE) then + params.bonusacc = 70 + elseif caster:hasStatusEffect(xi.effect.CHAIN_AFFINITY) then + params.bonusacc = math.floor(caster:getTP() / 50) + end + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.BLUNT + params.scattr = xi.skillchainType.FUSION + params.scattr2 = xi.skillchainType.IMPACTION + params.numhits = 3 + params.multiplier = 1.25 + params.tp150 = 1.25 + params.tp300 = 1.25 + params.azuretp = 1.25 + params.duppercap = 75 + params.str_wsc = 0.30 + params.dex_wsc = 0.0 + params.vit_wsc = 0.0 + params.agi_wsc = 0.0 + params.int_wsc = 0.0 + params.mnd_wsc = 0.0 + params.chr_wsc = 0.0 + + return xi.spells.blue.usePhysicalSpell(caster, target, spell, params) +end + +return spellObject diff --git a/scripts/actions/spells/blue/heavy_strike.lua b/scripts/actions/spells/blue/heavy_strike.lua new file mode 100644 index 00000000000..86fc149b87e --- /dev/null +++ b/scripts/actions/spells/blue/heavy_strike.lua @@ -0,0 +1,48 @@ +----------------------------------- +-- Spell: Heavy Strike +-- Damage varies with TP +-- Spell cost: 32 MP +-- Monster Type: Arcana +-- Spell Type: Physical (Blunt) +-- Blue Magic Points: 3 +-- Stat Bonus: STR+2 +-- Level: 92 +-- Casting Time: 1 seconds +-- Recast Time: 30 seconds +-- Skillchain Element(s): Fragmentation, Transfixion +-- Combos: Double Attack, Triple Attack +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +-- Need to implement Automatic crit +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.ARCANA + params.tpmod = xi.spells.blue.tpMod.ATTACK + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.HTH + params.scattr = xi.skillchainType.FRAGMENTATION + params.scattr2 = xi.skillchainType.TRANSFIXION + params.numhits = 1 + params.multiplier = 2.25 + params.tp150 = 3.5 + params.tp300 = 4.0 + params.azuretp = 4.0 + params.duppercap = 75 + params.str_wsc = 0.5 + params.dex_wsc = 0.0 + params.vit_wsc = 0.0 + params.agi_wsc = 0.0 + params.int_wsc = 0.0 + params.mnd_wsc = 0.0 + params.chr_wsc = 0.0 + + return xi.spells.blue.usePhysicalSpell(caster, target, spell, params) +end + +return spellObject diff --git a/scripts/actions/spells/blue/quad_continuum.lua b/scripts/actions/spells/blue/quad_continuum.lua new file mode 100644 index 00000000000..7b64542fba0 --- /dev/null +++ b/scripts/actions/spells/blue/quad_continuum.lua @@ -0,0 +1,47 @@ +----------------------------------- +-- Spell: Quadratic Continuum +-- Delivers a fourfold attack. Damage varies with TP +-- Spell cost: 91 MP +-- Monster Type: Empty +-- Spell Type: Physical (Piercing) +-- Blue Magic Points: 4 +-- Stat Bonus: DEX+3 CHR-2 +-- Level: 85 +-- Casting Time: 1 seconds +-- Recast Time: 31.75 seconds +-- Skillchain Element(s): Distortion/Scission +-- Combos: Dual Wield +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.EMPTY + params.tpmod = xi.spells.blue.tpMod.DAMAGE + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.PIERCING + params.scattr = xi.skillchainType.DISTORTION + params.scattr2 = xi.skillchainType.SCISSION + params.numhits = 4 + params.multiplier = 1.25 + params.tp150 = 1.5 + params.tp300 = 1.75 + params.azuretp = 2.0 + params.duppercap = 75 + params.str_wsc = 0.32 + params.dex_wsc = 0.0 + params.vit_wsc = 0.32 + params.agi_wsc = 0.0 + params.int_wsc = 0.0 + params.mnd_wsc = 0.0 + params.chr_wsc = 0.0 + + return xi.spells.blue.usePhysicalSpell(caster, target, spell, params) +end + +return spellObject diff --git a/scripts/actions/spells/blue/quadrastrike.lua b/scripts/actions/spells/blue/quadrastrike.lua new file mode 100644 index 00000000000..6b48919689a --- /dev/null +++ b/scripts/actions/spells/blue/quadrastrike.lua @@ -0,0 +1,54 @@ +----------------------------------- +-- Spell: Quadrastrike +-- Delivers a fourfold attack. Chance of critical hit varies with TP. +-- Spell cost: 98 MP +-- Monster Type: Demons +-- Spell Type: Physical (Slashing) +-- Blue Magic Points: 5 +-- Stat Bonus: STR+3 CHR+3 +-- Level: 96 +-- Casting Time: 2 seconds +-- Recast Time: 42.5 seconds +-- Skillchain Element(s): Liquefaction, Scission +-- Combos: Sillchain Bonus +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.DEMON + params.tpmod = xi.spells.blue.tpMod.CRITHITRATE + params.bonusacc = 0 + if caster:hasStatusEffect(xi.effect.AZURE_LORE) then + params.bonusacc = 70 + elseif caster:hasStatusEffect(xi.effect.CHAIN_AFFINITY) then + params.bonusacc = math.floor(caster:getTP() / 50) + end + + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.scattr = xi.skillchainType.LIQUEFACTION + params.scattr2 = xi.skillchainType.SCISSION + params.numhits = 4 + params.multiplier = 1.1875 + params.tp150 = 1.1875 + params.tp300 = 1.1875 + params.azuretp = 1.1875 + params.duppercap = 100 + params.str_wsc = 0.3 + params.dex_wsc = 0.0 + params.vit_wsc = 0.0 + params.agi_wsc = 0.0 + params.int_wsc = 0.0 + params.mnd_wsc = 0.0 + params.chr_wsc = 0.0 + + return xi.spells.blue.usePhysicalSpell(caster, target, spell, params) +end + +return spellObject diff --git a/scripts/actions/spells/blue/thermal_pulse.lua b/scripts/actions/spells/blue/thermal_pulse.lua new file mode 100644 index 00000000000..7995771615b --- /dev/null +++ b/scripts/actions/spells/blue/thermal_pulse.lua @@ -0,0 +1,57 @@ +----------------------------------- +-- Spell: Thermal Pulse +-- Deals Fire damage to enemies within area of effect. Additional effect: Blindness +-- Spell cost: 151 MP +-- Monster Type: Vermin +-- Spell Type: Magical (FIRE) +-- Blue Magic Points: 3 +-- Stat Bonus: VIT+2 +-- Level: 86 +-- Casting Time: 5.5 seconds +-- Recast Time: 70 seconds +-- Magic Bursts on: None +-- Combos: Attck Bonus +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.VERMIN + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.attribute = xi.mod.INT + params.multiplier = 2.0 + params.tMultiplier = 2.75 + params.duppercap = 100 + params.str_wsc = 0.0 + params.dex_wsc = 0.0 + params.vit_wsc = 0.4 + params.agi_wsc = 0.0 + params.int_wsc = 0.0 + params.mnd_wsc = 0.0 + params.chr_wsc = 0.0 + + -- Handle damage. + local damage = xi.spells.blue.useMagicalSpell(caster, target, spell, params) + + if damage <= 0 then + return damage + end + + -- Handle status effects. + local effectTable = + { + [1] = { xi.effect.BLINDNESS, 25, 0, 60 }, + } + + xi.spells.blue.applyBlueAdditionalEffect(caster, target, params, effectTable) + + return damage +end + +return spellObject diff --git a/scripts/actions/spells/blue/whirl_of_rage.lua b/scripts/actions/spells/blue/whirl_of_rage.lua new file mode 100644 index 00000000000..53183abdfe9 --- /dev/null +++ b/scripts/actions/spells/blue/whirl_of_rage.lua @@ -0,0 +1,62 @@ +----------------------------------- +-- Spell: Whirl Of Rage +-- Delivers an area attack that stuns enemies. Damage varies with TP. +-- Spell cost: 73 MP +-- Monster Type: Arcana +-- Spell Type: Physical (Slashing) +-- Blue Magic Points: 2 +-- Stat Bonus: STR+2 DEX+2 +-- Level: 83 +-- Casting Time: 1 second +-- Recast Time: 30 seconds +-- Skillchain Element(s): Scission, Detonation +-- Combos: Zanshin +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.ARCANA + params.tpmod = xi.spells.blue.tpMod.DURATION + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.scattr = xi.skillchainType.SCISSION + params.scattr2 = xi.skillchainType.DETONATION + params.numhits = 1 + params.multiplier = 3.0 + params.tp150 = 3.5 + params.tp300 = 4.0 + params.azuretp = 4.25 + params.duppercap = 83 + params.str_wsc = 0.3 + params.dex_wsc = 0.0 + params.vit_wsc = 0.0 + params.agi_wsc = 0.0 + params.int_wsc = 0.0 + params.mnd_wsc = 0.3 + params.chr_wsc = 0.0 + + -- Handle damage. + local damage = xi.spells.blue.usePhysicalSpell(caster, target, spell, params) + + if damage <= 0 then + return damage + end + + -- Handle status effects. + local effectTable = + { + [1] = { xi.effect.STUN, 1, 0, 5 }, + } + + xi.spells.blue.applyBlueAdditionalEffect(caster, target, params, effectTable) + + return damage +end + +return spellObject diff --git a/scripts/actions/spells/blue/white_wind.lua b/scripts/actions/spells/blue/white_wind.lua new file mode 100644 index 00000000000..f37e877fe41 --- /dev/null +++ b/scripts/actions/spells/blue/white_wind.lua @@ -0,0 +1,37 @@ +----------------------------------- +-- Spell: White Wind +-- Restores HP of all party members within area of effect. +-- Spell cost: 145 MP +-- Monster Type: Dragon +-- Spell Type: Magical (Wind) +-- Blue Magic Points: 5 +-- Stat Bonus: HP+5 AGI+1 +-- Level: 94 +-- Casting Time: 7 seconds +-- Recast Time: 20 seconds +----------------------------------- +-- Combos: Auto Regen +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.minCure = math.floor(caster:getMaxHP() / 7) * 2 + params.divisor0 = 0.6666 + params.constant0 = -45 + params.powerThreshold1 = 0 + params.divisor1 = 2 + params.constant1 = 65 + params.powerThreshold2 = 0 + params.divisor2 = 6.5 + params.constant2 = 144.6666 + + return xi.spells.blue.useCuringSpell(caster, target, spell, params) +end + +return spellObject diff --git a/scripts/actions/spells/blue/wind_breath.lua b/scripts/actions/spells/blue/wind_breath.lua new file mode 100644 index 00000000000..4d26dbb6067 --- /dev/null +++ b/scripts/actions/spells/blue/wind_breath.lua @@ -0,0 +1,36 @@ +----------------------------------- +-- Spell: Wind Breath +-- Deals Wind breath damage to enemies within a fan-shaped area originating from the caster. +-- Spell cost: 26 MP +-- Monster Type: Dragons +-- Spell Type: Magical (Wind) +-- Blue Magic Points: 2 +-- Stat Bonus: STR+2 AGI+2 +-- Level: 99 +-- Casting Time: 1.5 seconds +-- Recast Time: 29.5 seconds +-- Magic Bursts on: None +-- Combos: Fast Cast +----------------------------------- +---@type TSpell +local spellObject = {} + +spellObject.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spellObject.onSpellCast = function(caster, target, spell) + local params = {} + params.ecosystem = xi.ecosystem.DRAGON + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.WIND + params.diff = 0 -- no stat increases magic accuracy + params.skillType = xi.skill.BLUE_MAGIC + params.hpMod = 3 + params.lvlMod = 0.625 + params.isConal = true + + return xi.spells.blue.useBreathSpell(caster, target, spell, params) +end + +return spellObject From 5b7dc1a19891f772b66ae9d471a1ec64b7fa6d12 Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 28 Dec 2025 12:02:09 +0800 Subject: [PATCH 02/18] fixing lua syntax sanity checks --- scripts/actions/spells/blue/amorphic_spikes.lua | 3 ++- scripts/actions/spells/blue/auroral_drape.lua | 6 +++--- scripts/actions/spells/blue/charged_whisker.lua | 4 ++-- scripts/actions/spells/blue/delta_thrust.lua | 1 + scripts/actions/spells/blue/dream_flower.lua | 2 +- scripts/actions/spells/blue/fantod.lua | 5 +++-- scripts/actions/spells/blue/goblin_rush.lua | 1 + scripts/actions/spells/blue/quad_continuum.lua | 2 +- scripts/actions/spells/blue/quadrastrike.lua | 4 ++-- scripts/actions/spells/blue/white_wind.lua | 2 +- scripts/actions/spells/blue/wind_breath.lua | 4 ++-- 11 files changed, 19 insertions(+), 15 deletions(-) diff --git a/scripts/actions/spells/blue/amorphic_spikes.lua b/scripts/actions/spells/blue/amorphic_spikes.lua index 45346c6d618..ddd7494172e 100644 --- a/scripts/actions/spells/blue/amorphic_spikes.lua +++ b/scripts/actions/spells/blue/amorphic_spikes.lua @@ -1,5 +1,5 @@ ----------------------------------- --- Spell: Amorphic Spikes +-- Spell: Amorphic Spikes -- Delivers a fivefold attack. Danage varies with TP -- Spell cost: 79 MP -- Monster Type: AMORPH @@ -29,6 +29,7 @@ spellObject.onSpellCast = function(caster, target, spell) elseif caster:hasStatusEffect(xi.effect.CHAIN_AFFINITY) then params.bonusacc = math.floor(caster:getTP() / 50) end + params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.PIERCING params.scattr = xi.skillchainType.GRAVITATION diff --git a/scripts/actions/spells/blue/auroral_drape.lua b/scripts/actions/spells/blue/auroral_drape.lua index 1a546028004..e4f88004bf9 100644 --- a/scripts/actions/spells/blue/auroral_drape.lua +++ b/scripts/actions/spells/blue/auroral_drape.lua @@ -1,6 +1,6 @@ ----------------------------------- --- Spell: Auroral Drape --- Silences and blinds enemies within range. +-- Spell: Auroral Drape +-- Silences and blinds enemies within range. -- Spell cost: 51 MP -- Monster Type: Empty -- Spell Type: Magical (Wind) @@ -10,7 +10,7 @@ -- Casting Time: Casting Time: 4 seconds -- Recast Time: Recast Time: 60 seconds -- Duration: 40-60 seconds --- Magic Bursts on: None +-- Magic Bursts on: None -- Combos: Fast Cast ----------------------------------- ---@type TSpell diff --git a/scripts/actions/spells/blue/charged_whisker.lua b/scripts/actions/spells/blue/charged_whisker.lua index 46b5b46b7fb..0ae61a0e206 100644 --- a/scripts/actions/spells/blue/charged_whisker.lua +++ b/scripts/actions/spells/blue/charged_whisker.lua @@ -1,11 +1,11 @@ ----------------------------------- -- Spell: Charged Whisker --- Deals Lightning damage to enemies within area of effect. +-- Deals Lightning damage to enemies within area of effect. -- Spell cost: 183 MP -- Monster Type: Beast -- Spell Type: Magical (Lightning) -- Blue Magic Points: 4 --- Stat Bonus: HP-10 DEX+2 INT+2 +-- Stat Bonus: HP-10 DEX+2 INT+2 -- Level: 88 -- Casting Time: 5 seconds -- Recast Time: 85 seconds diff --git a/scripts/actions/spells/blue/delta_thrust.lua b/scripts/actions/spells/blue/delta_thrust.lua index 5c62406b9db..87750a747a9 100644 --- a/scripts/actions/spells/blue/delta_thrust.lua +++ b/scripts/actions/spells/blue/delta_thrust.lua @@ -28,6 +28,7 @@ spellObject.onSpellCast = function(caster, target, spell) elseif caster:hasStatusEffect(xi.effect.CHAIN_AFFINITY) then params.bonusacc = math.floor(caster:getTP() / 50) end + params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.SLASHING params.scattr = xi.skillchainType.LIQUEFACTION diff --git a/scripts/actions/spells/blue/dream_flower.lua b/scripts/actions/spells/blue/dream_flower.lua index 227ea927bb4..da6d87e315e 100644 --- a/scripts/actions/spells/blue/dream_flower.lua +++ b/scripts/actions/spells/blue/dream_flower.lua @@ -1,5 +1,5 @@ ----------------------------------- --- Spell: Dream Flower +-- Spell: Dream Flower -- Puts all enemies within range to sleep -- Spell cost: 68 MP -- Monster Type: Plantoid diff --git a/scripts/actions/spells/blue/fantod.lua b/scripts/actions/spells/blue/fantod.lua index d5cc16aaee4..400cc420a1d 100644 --- a/scripts/actions/spells/blue/fantod.lua +++ b/scripts/actions/spells/blue/fantod.lua @@ -1,6 +1,6 @@ ----------------------------------- --- Spell: Fantod --- Enhances attack and magic attack. +-- Spell: Fantod +-- Enhances attack and magic attack. -- Spell cost: 12 MP -- Monster Type: Birds -- Spell Type: Magical (Fire) @@ -32,6 +32,7 @@ spellObject.onSpellCast = function(caster, target, spell) caster:addStatusEffect(xi.effect.ATTACK_BOOST, power, 0, 180) caster:addStatusEffect(xi.effect.MAGIC_ATK_BOOST, power, 0, 180) end + return xi.mod.BOOST_EFFECT end diff --git a/scripts/actions/spells/blue/goblin_rush.lua b/scripts/actions/spells/blue/goblin_rush.lua index 6a36137907e..c1149563c2a 100644 --- a/scripts/actions/spells/blue/goblin_rush.lua +++ b/scripts/actions/spells/blue/goblin_rush.lua @@ -29,6 +29,7 @@ spellObject.onSpellCast = function(caster, target, spell) elseif caster:hasStatusEffect(xi.effect.CHAIN_AFFINITY) then params.bonusacc = math.floor(caster:getTP() / 50) end + params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.BLUNT params.scattr = xi.skillchainType.FUSION diff --git a/scripts/actions/spells/blue/quad_continuum.lua b/scripts/actions/spells/blue/quad_continuum.lua index 7b64542fba0..b3e0e78044d 100644 --- a/scripts/actions/spells/blue/quad_continuum.lua +++ b/scripts/actions/spells/blue/quad_continuum.lua @@ -6,7 +6,7 @@ -- Spell Type: Physical (Piercing) -- Blue Magic Points: 4 -- Stat Bonus: DEX+3 CHR-2 --- Level: 85 +-- Level: 85 -- Casting Time: 1 seconds -- Recast Time: 31.75 seconds -- Skillchain Element(s): Distortion/Scission diff --git a/scripts/actions/spells/blue/quadrastrike.lua b/scripts/actions/spells/blue/quadrastrike.lua index 6b48919689a..879ff5c256e 100644 --- a/scripts/actions/spells/blue/quadrastrike.lua +++ b/scripts/actions/spells/blue/quadrastrike.lua @@ -1,6 +1,6 @@ ----------------------------------- --- Spell: Quadrastrike --- Delivers a fourfold attack. Chance of critical hit varies with TP. +-- Spell: Quadrastrike +-- Delivers a fourfold attack. Chance of critical hit varies with TP. -- Spell cost: 98 MP -- Monster Type: Demons -- Spell Type: Physical (Slashing) diff --git a/scripts/actions/spells/blue/white_wind.lua b/scripts/actions/spells/blue/white_wind.lua index f37e877fe41..ac15dd09b3d 100644 --- a/scripts/actions/spells/blue/white_wind.lua +++ b/scripts/actions/spells/blue/white_wind.lua @@ -1,6 +1,6 @@ ----------------------------------- -- Spell: White Wind --- Restores HP of all party members within area of effect. +-- Restores HP of all party members within area of effect. -- Spell cost: 145 MP -- Monster Type: Dragon -- Spell Type: Magical (Wind) diff --git a/scripts/actions/spells/blue/wind_breath.lua b/scripts/actions/spells/blue/wind_breath.lua index 4d26dbb6067..d3df399bc35 100644 --- a/scripts/actions/spells/blue/wind_breath.lua +++ b/scripts/actions/spells/blue/wind_breath.lua @@ -5,11 +5,11 @@ -- Monster Type: Dragons -- Spell Type: Magical (Wind) -- Blue Magic Points: 2 --- Stat Bonus: STR+2 AGI+2 +-- Stat Bonus: STR+2 AGI+2 -- Level: 99 -- Casting Time: 1.5 seconds -- Recast Time: 29.5 seconds --- Magic Bursts on: None +-- Magic Bursts on: None -- Combos: Fast Cast ----------------------------------- ---@type TSpell From defe2948e4bd384dabfdf148f5f655dfe6a0e866 Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 28 Dec 2025 12:18:07 +0800 Subject: [PATCH 03/18] more lua sanity and removing whitespace --- scripts/actions/spells/blue/delta_thrust.lua | 1 - scripts/actions/spells/blue/goblin_rush.lua | 2 +- scripts/actions/spells/blue/thermal_pulse.lua | 4 ++-- scripts/actions/spells/blue/whirl_of_rage.lua | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/scripts/actions/spells/blue/delta_thrust.lua b/scripts/actions/spells/blue/delta_thrust.lua index 87750a747a9..d3d3cfde20a 100644 --- a/scripts/actions/spells/blue/delta_thrust.lua +++ b/scripts/actions/spells/blue/delta_thrust.lua @@ -62,7 +62,6 @@ spellObject.onSpellCast = function(caster, target, spell) xi.spells.blue.applyBlueAdditionalEffect(caster, target, params, effectTable) - return damage end diff --git a/scripts/actions/spells/blue/goblin_rush.lua b/scripts/actions/spells/blue/goblin_rush.lua index c1149563c2a..ecd0f09a823 100644 --- a/scripts/actions/spells/blue/goblin_rush.lua +++ b/scripts/actions/spells/blue/goblin_rush.lua @@ -1,5 +1,5 @@ ----------------------------------- --- Spell: Goblin Rush +-- Spell: Goblin Rush -- Delivers a threefold attack. Accuracy varies with TP -- Spell cost: 81 MP -- Monster Type: BEASTMEN diff --git a/scripts/actions/spells/blue/thermal_pulse.lua b/scripts/actions/spells/blue/thermal_pulse.lua index 7995771615b..bcd7ae34867 100644 --- a/scripts/actions/spells/blue/thermal_pulse.lua +++ b/scripts/actions/spells/blue/thermal_pulse.lua @@ -1,6 +1,6 @@ ----------------------------------- -- Spell: Thermal Pulse --- Deals Fire damage to enemies within area of effect. Additional effect: Blindness +-- Deals Fire damage to enemies within area of effect. Additional effect: Blindness -- Spell cost: 151 MP -- Monster Type: Vermin -- Spell Type: Magical (FIRE) @@ -9,7 +9,7 @@ -- Level: 86 -- Casting Time: 5.5 seconds -- Recast Time: 70 seconds --- Magic Bursts on: None +-- Magic Bursts on: None -- Combos: Attck Bonus ----------------------------------- ---@type TSpell diff --git a/scripts/actions/spells/blue/whirl_of_rage.lua b/scripts/actions/spells/blue/whirl_of_rage.lua index 53183abdfe9..50f197883b1 100644 --- a/scripts/actions/spells/blue/whirl_of_rage.lua +++ b/scripts/actions/spells/blue/whirl_of_rage.lua @@ -1,6 +1,6 @@ ----------------------------------- --- Spell: Whirl Of Rage --- Delivers an area attack that stuns enemies. Damage varies with TP. +-- Spell: Whirl Of Rage +-- Delivers an area attack that stuns enemies. Damage varies with TP. -- Spell cost: 73 MP -- Monster Type: Arcana -- Spell Type: Physical (Slashing) From daa30917f15161d917cf0fa7574cc7d4ec44dbb1 Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 28 Dec 2025 12:22:03 +0800 Subject: [PATCH 04/18] fixing delta thrust sanity --- scripts/actions/spells/blue/delta_thrust.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/actions/spells/blue/delta_thrust.lua b/scripts/actions/spells/blue/delta_thrust.lua index d3d3cfde20a..8d087939076 100644 --- a/scripts/actions/spells/blue/delta_thrust.lua +++ b/scripts/actions/spells/blue/delta_thrust.lua @@ -1,5 +1,5 @@ ----------------------------------- --- Spell: Delta Thrust +-- Spell: Delta Thrust -- Delivers a threefold attack. Additional effect: Plague -- Spell cost: 28 MP -- Monster Type: Lizard @@ -62,7 +62,7 @@ spellObject.onSpellCast = function(caster, target, spell) xi.spells.blue.applyBlueAdditionalEffect(caster, target, params, effectTable) - return damage + return damage end return spellObject From aba2deb9f6864cd877eeb1122c4b317febc9deef Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 28 Dec 2025 13:10:15 +0800 Subject: [PATCH 05/18] fixing charged_whisker --- scripts/actions/spells/blue/charged_whisker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/actions/spells/blue/charged_whisker.lua b/scripts/actions/spells/blue/charged_whisker.lua index 0ae61a0e206..86a9b15350f 100644 --- a/scripts/actions/spells/blue/charged_whisker.lua +++ b/scripts/actions/spells/blue/charged_whisker.lua @@ -23,7 +23,7 @@ spellObject.onSpellCast = function(caster, target, spell) local params = {} params.ecosystem = xi.ecosystem.BEAST params.attackType = xi.attackType.MAGICAL - params.damageType = xi.damageType.LIGHTNING + params.damageType = xi.damageType.THUNDER params.attribute = xi.mod.INT params.multiplier = 2.0 params.tMultiplier = 4.5 From d063380773765e60ba97a18584632f3aea2f4c56 Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 28 Dec 2025 13:29:16 +0800 Subject: [PATCH 06/18] adding checks for nil in fantod --- scripts/actions/spells/blue/fantod.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/actions/spells/blue/fantod.lua b/scripts/actions/spells/blue/fantod.lua index 400cc420a1d..ee9606469be 100644 --- a/scripts/actions/spells/blue/fantod.lua +++ b/scripts/actions/spells/blue/fantod.lua @@ -25,8 +25,7 @@ spellObject.onSpellCast = function(caster, target, spell) if caster:hasStatusEffect(xi.effect.BOOST) then local effect = caster:getStatusEffect(xi.effect.BOOST) - - effect:setPower(effect:getPower() + power) -- Store updated power in boost for zoning + effect:setPower(effect:getPower() or 0 + power) -- Store updated power in boost for zoning effect:addMod(xi.mod.ATTP, power) else caster:addStatusEffect(xi.effect.ATTACK_BOOST, power, 0, 180) From fdf0eff6dfafdb063bd8ca82665740bf0f78e9cc Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 28 Dec 2025 15:34:40 +0800 Subject: [PATCH 07/18] updating fantod to try syntax. Same as boost but not passing --- scripts/actions/spells/blue/fantod.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/actions/spells/blue/fantod.lua b/scripts/actions/spells/blue/fantod.lua index ee9606469be..dcc0f025783 100644 --- a/scripts/actions/spells/blue/fantod.lua +++ b/scripts/actions/spells/blue/fantod.lua @@ -25,11 +25,11 @@ spellObject.onSpellCast = function(caster, target, spell) if caster:hasStatusEffect(xi.effect.BOOST) then local effect = caster:getStatusEffect(xi.effect.BOOST) - effect:setPower(effect:getPower() or 0 + power) -- Store updated power in boost for zoning + + effect:setPower((effect:getPower() or 0) + power) -- Store updated power in boost for zoning effect:addMod(xi.mod.ATTP, power) else - caster:addStatusEffect(xi.effect.ATTACK_BOOST, power, 0, 180) - caster:addStatusEffect(xi.effect.MAGIC_ATK_BOOST, power, 0, 180) + caster:addStatusEffect(xi.effect.BOOST, power, 0, 180) end return xi.mod.BOOST_EFFECT From b5e679e98d33ccca067104c39b2400ea86649e60 Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 28 Dec 2025 16:32:14 +0800 Subject: [PATCH 08/18] adding nil checks for fantod --- scripts/actions/spells/blue/amorphic_spikes.lua | 4 ++-- scripts/actions/spells/blue/auroral_drape.lua | 1 + scripts/actions/spells/blue/dream_flower.lua | 2 +- scripts/actions/spells/blue/fantod.lua | 10 +++++++++- scripts/actions/spells/blue/heavy_strike.lua | 2 +- scripts/actions/spells/blue/quadrastrike.lua | 2 ++ scripts/actions/spells/blue/white_wind.lua | 1 + scripts/actions/spells/blue/wind_breath.lua | 4 ++-- 8 files changed, 19 insertions(+), 7 deletions(-) diff --git a/scripts/actions/spells/blue/amorphic_spikes.lua b/scripts/actions/spells/blue/amorphic_spikes.lua index ddd7494172e..a832ec1832c 100644 --- a/scripts/actions/spells/blue/amorphic_spikes.lua +++ b/scripts/actions/spells/blue/amorphic_spikes.lua @@ -37,8 +37,8 @@ spellObject.onSpellCast = function(caster, target, spell) params.numhits = 5 params.multiplier = 1.0 params.tp150 = 1.375 - params.tp300 = 1.750 - params.azuretp = 2.125 + params.tp300 = 1.750 -- guessing as blue gartr wiki doesn't have this info + params.azuretp = 2.125 -- guessing as blue gartr wiki doesn't have this info params.duppercap = 75 params.str_wsc = 0.0 params.dex_wsc = 0.20 diff --git a/scripts/actions/spells/blue/auroral_drape.lua b/scripts/actions/spells/blue/auroral_drape.lua index e4f88004bf9..126ee255319 100644 --- a/scripts/actions/spells/blue/auroral_drape.lua +++ b/scripts/actions/spells/blue/auroral_drape.lua @@ -34,6 +34,7 @@ spellObject.onSpellCast = function(caster, target, spell) local resist = xi.combat.magicHitRate.calculateResistRate(caster, target, spell:getSpellGroup(), xi.skill.BLUE_MAGIC, 0, spell:getElement(), xi.mod.INT, 0, 0) -- Handle status effects. + -- Not sure if there's a better way to implement both status effects local effectTable = { [1] = { xi.effect.BIND, 25, 0, 40 + math.floor(resist * 20) }, diff --git a/scripts/actions/spells/blue/dream_flower.lua b/scripts/actions/spells/blue/dream_flower.lua index da6d87e315e..5023886480d 100644 --- a/scripts/actions/spells/blue/dream_flower.lua +++ b/scripts/actions/spells/blue/dream_flower.lua @@ -23,7 +23,7 @@ end spellObject.onSpellCast = function(caster, target, spell) local params = {} params.ecosystem = xi.ecosystem.PLANTOID - params.effect = xi.effect.SLEEP_II + params.effect = xi.effect.SLEEP_II -- guessing it's sleep II as it blue gartr wiki says it doesn't overwrite itself or sleep II params.power = 1 params.tick = 0 params.duration = 120 diff --git a/scripts/actions/spells/blue/fantod.lua b/scripts/actions/spells/blue/fantod.lua index dcc0f025783..19200511c0e 100644 --- a/scripts/actions/spells/blue/fantod.lua +++ b/scripts/actions/spells/blue/fantod.lua @@ -21,12 +21,20 @@ spellObject.onMagicCastingCheck = function(caster, target, spell) end spellObject.onSpellCast = function(caster, target, spell) + -- Using Monk's boost logic for now local power = 12.5 + (0.10 * caster:getMod(xi.mod.BOOST_EFFECT)) + if power == nil then + power = 0 + end if caster:hasStatusEffect(xi.effect.BOOST) then local effect = caster:getStatusEffect(xi.effect.BOOST) + local oldPower = effect:getPower() + if oldPower == nil then + oldPower = 0 + end - effect:setPower((effect:getPower() or 0) + power) -- Store updated power in boost for zoning + effect:setPower(oldPower + power) -- Store updated power in boost for zoning effect:addMod(xi.mod.ATTP, power) else caster:addStatusEffect(xi.effect.BOOST, power, 0, 180) diff --git a/scripts/actions/spells/blue/heavy_strike.lua b/scripts/actions/spells/blue/heavy_strike.lua index 86fc149b87e..024812310c8 100644 --- a/scripts/actions/spells/blue/heavy_strike.lua +++ b/scripts/actions/spells/blue/heavy_strike.lua @@ -32,7 +32,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.multiplier = 2.25 params.tp150 = 3.5 params.tp300 = 4.0 - params.azuretp = 4.0 + params.azuretp = 4.0 -- This is a guess as blue gartr doesn't have this info params.duppercap = 75 params.str_wsc = 0.5 params.dex_wsc = 0.0 diff --git a/scripts/actions/spells/blue/quadrastrike.lua b/scripts/actions/spells/blue/quadrastrike.lua index 879ff5c256e..6174a4cb5a6 100644 --- a/scripts/actions/spells/blue/quadrastrike.lua +++ b/scripts/actions/spells/blue/quadrastrike.lua @@ -20,6 +20,8 @@ spellObject.onMagicCastingCheck = function(caster, target, spell) end spellObject.onSpellCast = function(caster, target, spell) + + -- Missing proper info and logic for crit. local params = {} params.ecosystem = xi.ecosystem.DEMON params.tpmod = xi.spells.blue.tpMod.CRITHITRATE diff --git a/scripts/actions/spells/blue/white_wind.lua b/scripts/actions/spells/blue/white_wind.lua index ac15dd09b3d..8a00878b269 100644 --- a/scripts/actions/spells/blue/white_wind.lua +++ b/scripts/actions/spells/blue/white_wind.lua @@ -20,6 +20,7 @@ spellObject.onMagicCastingCheck = function(caster, target, spell) end spellObject.onSpellCast = function(caster, target, spell) + -- Need to confirm increases by Divine Seal and Cure Potency equipment local params = {} params.minCure = math.floor(caster:getMaxHP() / 7) * 2 params.divisor0 = 0.6666 diff --git a/scripts/actions/spells/blue/wind_breath.lua b/scripts/actions/spells/blue/wind_breath.lua index d3df399bc35..d7601fc75be 100644 --- a/scripts/actions/spells/blue/wind_breath.lua +++ b/scripts/actions/spells/blue/wind_breath.lua @@ -26,8 +26,8 @@ spellObject.onSpellCast = function(caster, target, spell) params.damageType = xi.damageType.WIND params.diff = 0 -- no stat increases magic accuracy params.skillType = xi.skill.BLUE_MAGIC - params.hpMod = 3 - params.lvlMod = 0.625 + params.hpMod = 4 + params.lvlMod = 0 params.isConal = true return xi.spells.blue.useBreathSpell(caster, target, spell, params) From ce6d527e7c0731070ee1767d39e6d6a160095546 Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 28 Dec 2025 16:37:55 +0800 Subject: [PATCH 09/18] removing extra newline --- scripts/actions/spells/blue/quadrastrike.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/actions/spells/blue/quadrastrike.lua b/scripts/actions/spells/blue/quadrastrike.lua index 6174a4cb5a6..c86e6334703 100644 --- a/scripts/actions/spells/blue/quadrastrike.lua +++ b/scripts/actions/spells/blue/quadrastrike.lua @@ -20,7 +20,6 @@ spellObject.onMagicCastingCheck = function(caster, target, spell) end spellObject.onSpellCast = function(caster, target, spell) - -- Missing proper info and logic for crit. local params = {} params.ecosystem = xi.ecosystem.DEMON From 8f57f15089a2e22e84f81e914e1e45a6af45602b Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Mon, 29 Dec 2025 22:11:57 +0800 Subject: [PATCH 10/18] one more pass at need-check-nil error --- scripts/actions/spells/blue/fantod.lua | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/scripts/actions/spells/blue/fantod.lua b/scripts/actions/spells/blue/fantod.lua index 19200511c0e..0c501453fbe 100644 --- a/scripts/actions/spells/blue/fantod.lua +++ b/scripts/actions/spells/blue/fantod.lua @@ -23,18 +23,11 @@ end spellObject.onSpellCast = function(caster, target, spell) -- Using Monk's boost logic for now local power = 12.5 + (0.10 * caster:getMod(xi.mod.BOOST_EFFECT)) - if power == nil then - power = 0 - end - if caster:hasStatusEffect(xi.effect.BOOST) then + if caster:hasStatusEffect(xi.effect.BOOST) and effect ~= nil then local effect = caster:getStatusEffect(xi.effect.BOOST) - local oldPower = effect:getPower() - if oldPower == nil then - oldPower = 0 - end - effect:setPower(oldPower + power) -- Store updated power in boost for zoning + effect:setPower(effect:getPower() + power) -- Store updated power in boost for zoning effect:addMod(xi.mod.ATTP, power) else caster:addStatusEffect(xi.effect.BOOST, power, 0, 180) From fb6a67b4676936a6e252fe3efa2e8ed8326cde7e Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Mon, 29 Dec 2025 22:19:01 +0800 Subject: [PATCH 11/18] another attempt to solve need-check-nil --- scripts/actions/spells/blue/fantod.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/actions/spells/blue/fantod.lua b/scripts/actions/spells/blue/fantod.lua index 0c501453fbe..9c549038a8b 100644 --- a/scripts/actions/spells/blue/fantod.lua +++ b/scripts/actions/spells/blue/fantod.lua @@ -24,11 +24,13 @@ spellObject.onSpellCast = function(caster, target, spell) -- Using Monk's boost logic for now local power = 12.5 + (0.10 * caster:getMod(xi.mod.BOOST_EFFECT)) - if caster:hasStatusEffect(xi.effect.BOOST) and effect ~= nil then + if caster:hasStatusEffect(xi.effect.BOOST) then local effect = caster:getStatusEffect(xi.effect.BOOST) - effect:setPower(effect:getPower() + power) -- Store updated power in boost for zoning - effect:addMod(xi.mod.ATTP, power) + if effect ~= nil then + effect:setPower(effect:getPower() + power) -- Store updated power in boost for zoning + effect:addMod(xi.mod.ATTP, power) + end else caster:addStatusEffect(xi.effect.BOOST, power, 0, 180) end From adc2da1b4467c3f31002dc247f8a258a296a0faa Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sat, 3 Jan 2026 21:00:32 +0800 Subject: [PATCH 12/18] fixing comment on amorphic spike --- scripts/actions/spells/blue/amorphic_spikes.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/actions/spells/blue/amorphic_spikes.lua b/scripts/actions/spells/blue/amorphic_spikes.lua index a832ec1832c..d5f552d8018 100644 --- a/scripts/actions/spells/blue/amorphic_spikes.lua +++ b/scripts/actions/spells/blue/amorphic_spikes.lua @@ -37,8 +37,8 @@ spellObject.onSpellCast = function(caster, target, spell) params.numhits = 5 params.multiplier = 1.0 params.tp150 = 1.375 - params.tp300 = 1.750 -- guessing as blue gartr wiki doesn't have this info - params.azuretp = 2.125 -- guessing as blue gartr wiki doesn't have this info + params.tp300 = 1.750 -- as per https://wiki.ffo.jp/html/24665.html + params.azuretp = 2.125 -- guessing as no wiki has this info. params.duppercap = 75 params.str_wsc = 0.0 params.dex_wsc = 0.20 From cbf6bcead938d0c2cb29fad9c6f23bd80c8a530c Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sat, 3 Jan 2026 22:14:05 +0800 Subject: [PATCH 13/18] making changes to PR --- .../actions/spells/blue/amorphic_spikes.lua | 2 +- scripts/actions/spells/blue/delta_thrust.lua | 2 +- scripts/actions/spells/blue/dream_flower.lua | 4 +- scripts/actions/spells/blue/fantod.lua | 41 ------------------- scripts/actions/spells/blue/goblin_rush.lua | 2 +- scripts/actions/spells/blue/heavy_strike.lua | 4 +- scripts/actions/spells/blue/quadrastrike.lua | 2 + scripts/actions/spells/blue/thermal_pulse.lua | 2 +- 8 files changed, 11 insertions(+), 48 deletions(-) delete mode 100644 scripts/actions/spells/blue/fantod.lua diff --git a/scripts/actions/spells/blue/amorphic_spikes.lua b/scripts/actions/spells/blue/amorphic_spikes.lua index d5f552d8018..831c1b69227 100644 --- a/scripts/actions/spells/blue/amorphic_spikes.lua +++ b/scripts/actions/spells/blue/amorphic_spikes.lua @@ -37,7 +37,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.numhits = 5 params.multiplier = 1.0 params.tp150 = 1.375 - params.tp300 = 1.750 -- as per https://wiki.ffo.jp/html/24665.html + params.tp300 = 1.750 -- as per https://wiki.ffo.jp/html/24665.html params.azuretp = 2.125 -- guessing as no wiki has this info. params.duppercap = 75 params.str_wsc = 0.0 diff --git a/scripts/actions/spells/blue/delta_thrust.lua b/scripts/actions/spells/blue/delta_thrust.lua index 8d087939076..e2a238f50f0 100644 --- a/scripts/actions/spells/blue/delta_thrust.lua +++ b/scripts/actions/spells/blue/delta_thrust.lua @@ -57,7 +57,7 @@ spellObject.onSpellCast = function(caster, target, spell) -- Handle status effects. local effectTable = { - [1] = { xi.effect.PLAGUE, 9, 6, 40 + math.floor(caster:getTP() / 3000) }, + [1] = { xi.effect.PLAGUE, 10, 3, 30 + math.random(0, 30) }, -- https://wiki.ffo.jp/html/22338.html } xi.spells.blue.applyBlueAdditionalEffect(caster, target, params, effectTable) diff --git a/scripts/actions/spells/blue/dream_flower.lua b/scripts/actions/spells/blue/dream_flower.lua index 5023886480d..4b4006b39e8 100644 --- a/scripts/actions/spells/blue/dream_flower.lua +++ b/scripts/actions/spells/blue/dream_flower.lua @@ -23,10 +23,10 @@ end spellObject.onSpellCast = function(caster, target, spell) local params = {} params.ecosystem = xi.ecosystem.PLANTOID - params.effect = xi.effect.SLEEP_II -- guessing it's sleep II as it blue gartr wiki says it doesn't overwrite itself or sleep II + params.effect = xi.effect.SLEEP_I -- https://wiki.ffo.jp/html/5502.html params.power = 1 params.tick = 0 - params.duration = 120 + params.duration = 120 -- https://wiki.ffo.jp/html/5502.html says the duration might be reduced based on number of targets. Might need to be fixed in the future params.resistThreshold = 0.50 params.isGaze = false params.isConal = false diff --git a/scripts/actions/spells/blue/fantod.lua b/scripts/actions/spells/blue/fantod.lua deleted file mode 100644 index 9c549038a8b..00000000000 --- a/scripts/actions/spells/blue/fantod.lua +++ /dev/null @@ -1,41 +0,0 @@ ------------------------------------ --- Spell: Fantod --- Enhances attack and magic attack. --- Spell cost: 12 MP --- Monster Type: Birds --- Spell Type: Magical (Fire) --- Blue Magic Points: 1 --- Stat Bonus: HP-20 DEX+2 AGI+2 --- Level: 85 --- Casting Time: 0.5 Seconds --- Recast Time: 10 Seconds --- 3 minutes or next attack ------------------------------------ --- Combos: Store TP ------------------------------------ ----@type TSpell -local spellObject = {} - -spellObject.onMagicCastingCheck = function(caster, target, spell) - return 0 -end - -spellObject.onSpellCast = function(caster, target, spell) - -- Using Monk's boost logic for now - local power = 12.5 + (0.10 * caster:getMod(xi.mod.BOOST_EFFECT)) - - if caster:hasStatusEffect(xi.effect.BOOST) then - local effect = caster:getStatusEffect(xi.effect.BOOST) - - if effect ~= nil then - effect:setPower(effect:getPower() + power) -- Store updated power in boost for zoning - effect:addMod(xi.mod.ATTP, power) - end - else - caster:addStatusEffect(xi.effect.BOOST, power, 0, 180) - end - - return xi.mod.BOOST_EFFECT -end - -return spellObject diff --git a/scripts/actions/spells/blue/goblin_rush.lua b/scripts/actions/spells/blue/goblin_rush.lua index ecd0f09a823..673f5d192ca 100644 --- a/scripts/actions/spells/blue/goblin_rush.lua +++ b/scripts/actions/spells/blue/goblin_rush.lua @@ -41,7 +41,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.azuretp = 1.25 params.duppercap = 75 params.str_wsc = 0.30 - params.dex_wsc = 0.0 + params.dex_wsc = 0.30 params.vit_wsc = 0.0 params.agi_wsc = 0.0 params.int_wsc = 0.0 diff --git a/scripts/actions/spells/blue/heavy_strike.lua b/scripts/actions/spells/blue/heavy_strike.lua index 024812310c8..af7eeccaeac 100644 --- a/scripts/actions/spells/blue/heavy_strike.lua +++ b/scripts/actions/spells/blue/heavy_strike.lua @@ -29,7 +29,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.scattr = xi.skillchainType.FRAGMENTATION params.scattr2 = xi.skillchainType.TRANSFIXION params.numhits = 1 - params.multiplier = 2.25 + params.multiplier = 2.5 -- Using https://wiki.ffo.jp/html/24367.html over bg-wiki for this params.tp150 = 3.5 params.tp300 = 4.0 params.azuretp = 4.0 -- This is a guess as blue gartr doesn't have this info @@ -41,6 +41,8 @@ spellObject.onSpellCast = function(caster, target, spell) params.int_wsc = 0.0 params.mnd_wsc = 0.0 params.chr_wsc = 0.0 + params.bonusacc = -100 + params.critchance = 100 -- TODO: this should cap to 100% return xi.spells.blue.usePhysicalSpell(caster, target, spell, params) end diff --git a/scripts/actions/spells/blue/quadrastrike.lua b/scripts/actions/spells/blue/quadrastrike.lua index c86e6334703..7540949740d 100644 --- a/scripts/actions/spells/blue/quadrastrike.lua +++ b/scripts/actions/spells/blue/quadrastrike.lua @@ -20,6 +20,7 @@ spellObject.onMagicCastingCheck = function(caster, target, spell) end spellObject.onSpellCast = function(caster, target, spell) + -- Missing proper info and logic for crit. local params = {} params.ecosystem = xi.ecosystem.DEMON @@ -48,6 +49,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.int_wsc = 0.0 params.mnd_wsc = 0.0 params.chr_wsc = 0.0 + params.critchance = 30 -- Guessed, this probably scales with TP, BG wiki says 33% which likely includes base crit rate so we're reducing it a bit lower return xi.spells.blue.usePhysicalSpell(caster, target, spell, params) end diff --git a/scripts/actions/spells/blue/thermal_pulse.lua b/scripts/actions/spells/blue/thermal_pulse.lua index bcd7ae34867..deec2a11b2c 100644 --- a/scripts/actions/spells/blue/thermal_pulse.lua +++ b/scripts/actions/spells/blue/thermal_pulse.lua @@ -26,7 +26,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.damageType = xi.damageType.FIRE params.attribute = xi.mod.INT params.multiplier = 2.0 - params.tMultiplier = 2.75 + params.tMultiplier = 4.0 -- Using numbers in https://wiki.ffo.jp/html/22468.html params.duppercap = 100 params.str_wsc = 0.0 params.dex_wsc = 0.0 From 385fded1c51593861355b4349f515a487ae38dcb Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sat, 3 Jan 2026 22:18:34 +0800 Subject: [PATCH 14/18] updating dream flower duration --- scripts/actions/spells/blue/dream_flower.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/actions/spells/blue/dream_flower.lua b/scripts/actions/spells/blue/dream_flower.lua index 4b4006b39e8..1740879ac83 100644 --- a/scripts/actions/spells/blue/dream_flower.lua +++ b/scripts/actions/spells/blue/dream_flower.lua @@ -26,7 +26,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.effect = xi.effect.SLEEP_I -- https://wiki.ffo.jp/html/5502.html params.power = 1 params.tick = 0 - params.duration = 120 -- https://wiki.ffo.jp/html/5502.html says the duration might be reduced based on number of targets. Might need to be fixed in the future + params.duration = 90 -- https://wiki.ffo.jp/html/5502.html says the duration might be reduced based on number of targets. Might need to be fixed in the future params.resistThreshold = 0.50 params.isGaze = false params.isConal = false From fbf7189ed598d8ab480427a0ba90c422ed4f6403 Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sat, 3 Jan 2026 22:23:28 +0800 Subject: [PATCH 15/18] updating thermal pulse's tp back to 2.75 --- scripts/actions/spells/blue/thermal_pulse.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/actions/spells/blue/thermal_pulse.lua b/scripts/actions/spells/blue/thermal_pulse.lua index deec2a11b2c..00e28e4cdcd 100644 --- a/scripts/actions/spells/blue/thermal_pulse.lua +++ b/scripts/actions/spells/blue/thermal_pulse.lua @@ -26,7 +26,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.damageType = xi.damageType.FIRE params.attribute = xi.mod.INT params.multiplier = 2.0 - params.tMultiplier = 4.0 -- Using numbers in https://wiki.ffo.jp/html/22468.html + params.tMultiplier = 2.75 -- Using numbers in bg-wiki instead of https://wiki.ffo.jp/html/22468.html. As per policy "Whenever in doubt, balance content against players" params.duppercap = 100 params.str_wsc = 0.0 params.dex_wsc = 0.0 From fd29f46c95e8c5f258407a605cfdb83322ad39fa Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sat, 3 Jan 2026 22:28:00 +0800 Subject: [PATCH 16/18] fixing sanity check for quadrastrike --- scripts/actions/spells/blue/quadrastrike.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/actions/spells/blue/quadrastrike.lua b/scripts/actions/spells/blue/quadrastrike.lua index 7540949740d..8f94eb49bab 100644 --- a/scripts/actions/spells/blue/quadrastrike.lua +++ b/scripts/actions/spells/blue/quadrastrike.lua @@ -20,7 +20,6 @@ spellObject.onMagicCastingCheck = function(caster, target, spell) end spellObject.onSpellCast = function(caster, target, spell) - -- Missing proper info and logic for crit. local params = {} params.ecosystem = xi.ecosystem.DEMON From 28535f0f53ad0d6e04602f15cda205c0bfb8e775 Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 4 Jan 2026 22:13:11 +0800 Subject: [PATCH 17/18] fixing thermal pulse again --- scripts/actions/spells/blue/thermal_pulse.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/actions/spells/blue/thermal_pulse.lua b/scripts/actions/spells/blue/thermal_pulse.lua index 00e28e4cdcd..80bb3038d0a 100644 --- a/scripts/actions/spells/blue/thermal_pulse.lua +++ b/scripts/actions/spells/blue/thermal_pulse.lua @@ -26,7 +26,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.damageType = xi.damageType.FIRE params.attribute = xi.mod.INT params.multiplier = 2.0 - params.tMultiplier = 2.75 -- Using numbers in bg-wiki instead of https://wiki.ffo.jp/html/22468.html. As per policy "Whenever in doubt, balance content against players" + params.tMultiplier = 4.0 -- https://www.ffxiah.com/forum/topic/30626/the-beast-within-a-guide-to-blue-mage/#spells has concurrs with https://wiki.ffo.jp/html/22468.html on tp params.duppercap = 100 params.str_wsc = 0.0 params.dex_wsc = 0.0 From 9f4bd53e42698f55faaea8d2d457e4360d0d78cb Mon Sep 17 00:00:00 2001 From: sleepingkirby Date: Sun, 4 Jan 2026 22:14:03 +0800 Subject: [PATCH 18/18] fixing comment on thermal pulse --- scripts/actions/spells/blue/thermal_pulse.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/actions/spells/blue/thermal_pulse.lua b/scripts/actions/spells/blue/thermal_pulse.lua index 80bb3038d0a..6c34cb60ff8 100644 --- a/scripts/actions/spells/blue/thermal_pulse.lua +++ b/scripts/actions/spells/blue/thermal_pulse.lua @@ -26,7 +26,7 @@ spellObject.onSpellCast = function(caster, target, spell) params.damageType = xi.damageType.FIRE params.attribute = xi.mod.INT params.multiplier = 2.0 - params.tMultiplier = 4.0 -- https://www.ffxiah.com/forum/topic/30626/the-beast-within-a-guide-to-blue-mage/#spells has concurrs with https://wiki.ffo.jp/html/22468.html on tp + params.tMultiplier = 4.0 -- https://www.ffxiah.com/forum/topic/30626/the-beast-within-a-guide-to-blue-mage/#spells concurs with https://wiki.ffo.jp/html/22468.html on tp params.duppercap = 100 params.str_wsc = 0.0 params.dex_wsc = 0.0