From 89efa17575920f5beaca3c9babe925b50b8eeec0 Mon Sep 17 00:00:00 2001 From: Skold <113406182+Skold177@users.noreply.github.com> Date: Sat, 18 Apr 2026 23:51:55 -0400 Subject: [PATCH] [lua] [sql] Sword mobskills Implements Sword mobskills --- scripts/actions/mobskills/atonement.lua | 35 ++++++++++++++ scripts/actions/mobskills/burning_blade.lua | 17 ++++--- scripts/actions/mobskills/chant_du_cygne.lua | 2 +- scripts/actions/mobskills/circle_blade.lua | 6 ++- scripts/actions/mobskills/death_blossom.lua | 37 +++++++++++++++ scripts/actions/mobskills/expiacion.lua | 34 ++++++++++++++ scripts/actions/mobskills/fast_blade.lua | 6 ++- scripts/actions/mobskills/fast_blade_ii.lua | 34 ++++++++++++++ scripts/actions/mobskills/flat_blade.lua | 8 ++-- scripts/actions/mobskills/glory_slash.lua | 35 ++++++++++++++ scripts/actions/mobskills/imperator.lua | 34 ++++++++++++++ .../actions/mobskills/knights_of_rotund.lua | 34 ++++++++++++++ .../actions/mobskills/knights_of_round.lua | 6 ++- scripts/actions/mobskills/leaden_salute.lua | 2 +- scripts/actions/mobskills/red_lotus_blade.lua | 17 ++++--- scripts/actions/mobskills/requiescat.lua | 34 ++++++++++++++ scripts/actions/mobskills/sanguine_blade.lua | 43 +++++++++++++++++ scripts/actions/mobskills/savage_blade.lua | 6 ++- scripts/actions/mobskills/seraph_blade.lua | 16 ++++--- scripts/actions/mobskills/shining_blade.lua | 16 ++++--- scripts/actions/mobskills/spirits_within.lua | 47 +++++-------------- scripts/actions/mobskills/swift_blade.lua | 16 ++++--- scripts/actions/mobskills/trueflight.lua | 2 +- scripts/actions/mobskills/uriel_blade.lua | 37 +++++++++++++++ scripts/actions/mobskills/vorpal_blade.lua | 3 ++ scripts/actions/mobskills/wildfire.lua | 2 +- .../Riverne-Site_B01/mobs/Bahamut_bv2.lua | 4 +- sql/mob_skills.sql | 28 +++++------ 28 files changed, 461 insertions(+), 100 deletions(-) create mode 100644 scripts/actions/mobskills/atonement.lua create mode 100644 scripts/actions/mobskills/death_blossom.lua create mode 100644 scripts/actions/mobskills/expiacion.lua create mode 100644 scripts/actions/mobskills/fast_blade_ii.lua create mode 100644 scripts/actions/mobskills/glory_slash.lua create mode 100644 scripts/actions/mobskills/imperator.lua create mode 100644 scripts/actions/mobskills/knights_of_rotund.lua create mode 100644 scripts/actions/mobskills/requiescat.lua create mode 100644 scripts/actions/mobskills/sanguine_blade.lua create mode 100644 scripts/actions/mobskills/uriel_blade.lua diff --git a/scripts/actions/mobskills/atonement.lua b/scripts/actions/mobskills/atonement.lua new file mode 100644 index 00000000000..d3640aa902e --- /dev/null +++ b/scripts/actions/mobskills/atonement.lua @@ -0,0 +1,35 @@ +----------------------------------- +-- Atonement +-- Family: Humanoid Sword Weaponskill +-- Description: Delivers a twofold attack. Damage varies with TP. +-- NOTE : The player version of this skill is based off of Enmity. TODO : Capture mob version of this skill. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.percentMultipier = 0 + params.damageCap = 750 + params.bonusDamage = math.floor(mob:getWeaponDmg() * 2 * xi.combat.physical.calculateTPfactor(skill:getTP(), { 1.0, 1.5, 2.0 })) + params.resistStat = xi.mod.INT + params.element = xi.element.NONE + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + + local info = xi.mobskills.mobBreathMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/burning_blade.lua b/scripts/actions/mobskills/burning_blade.lua index c31c7fbc2b6..0a75c1024cc 100644 --- a/scripts/actions/mobskills/burning_blade.lua +++ b/scripts/actions/mobskills/burning_blade.lua @@ -14,12 +14,17 @@ end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs - params.element = xi.element.FIRE - params.attackType = xi.attackType.MAGICAL - params.damageType = xi.damageType.FIRE - params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 2.0, 2.5 } + -- params.str_wSC = 0.2 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.int_wSC = 0.2 -- TODO: Capture if mobskill weaponskills have wSC. + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1 + params.dStatAttackerMod = xi.mod.INT + params.dStatDefenderMod = xi.mod.INT local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) diff --git a/scripts/actions/mobskills/chant_du_cygne.lua b/scripts/actions/mobskills/chant_du_cygne.lua index b4c520355e2..77db537086a 100644 --- a/scripts/actions/mobskills/chant_du_cygne.lua +++ b/scripts/actions/mobskills/chant_du_cygne.lua @@ -2,7 +2,6 @@ -- Chant du Cygne -- Family: Humanoid Sword Weaponskill -- Description: Delivers a threefold attack. Chance of critical hit varies with TP. --- Stat Modifier: 80% DEX ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -17,6 +16,7 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) params.baseDamage = mob:getWeaponDmg() params.numHits = 3 params.fTP = { 1.6328125, 1.6328125, 1.6328125 } + -- params.dex_wSC = 0.8 -- TODO: Capture if mobskill weaponskills have wSC. params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.SLASHING params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 diff --git a/scripts/actions/mobskills/circle_blade.lua b/scripts/actions/mobskills/circle_blade.lua index ba6cd29dcec..e713e5db557 100644 --- a/scripts/actions/mobskills/circle_blade.lua +++ b/scripts/actions/mobskills/circle_blade.lua @@ -2,6 +2,7 @@ -- Circle Blade -- Family: Humanoid Sword Weaponskill -- Description: Delivers an area of effect attack. Attack radius varies with TP. +-- TODO: Radius varies with TP. 5y at 2334 TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -16,10 +17,11 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) params.baseDamage = mob:getWeaponDmg() params.numHits = 1 - params.fTP = { 2.5, 2.5, 2.5 } -- TODO: Capture fTPs + params.fTP = { 1.0, 1.0, 1.0 } + -- params.str_wSC = 0.35 -- TODO: Capture if mobskill weaponskills have wSC. params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.SLASHING - params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) diff --git a/scripts/actions/mobskills/death_blossom.lua b/scripts/actions/mobskills/death_blossom.lua new file mode 100644 index 00000000000..8e0f280305b --- /dev/null +++ b/scripts/actions/mobskills/death_blossom.lua @@ -0,0 +1,37 @@ +----------------------------------- +-- Death Blossom +-- Family: Humanoid Sword Weaponskill +-- Description: Delivers a threefold attack that lowers target's magic evasion. +-- TODO: Chance of lowering target's magic evasion varies with TP. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 3 + params.fTP = { 1.125, 1.125, 1.125 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.5 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MAGIC_EVASION_DOWN, 10, 0, 60) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/expiacion.lua b/scripts/actions/mobskills/expiacion.lua new file mode 100644 index 00000000000..efe8605cd6a --- /dev/null +++ b/scripts/actions/mobskills/expiacion.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Expiacion +-- Family: Humanoid Sword Weaponskill +-- Description: Delivers a twofold attack. Damage varies with TP. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 2 + params.fTP = { 1.5, 2.0, 2.5 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.int_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/fast_blade.lua b/scripts/actions/mobskills/fast_blade.lua index 57822c88199..90b2e2225ac 100644 --- a/scripts/actions/mobskills/fast_blade.lua +++ b/scripts/actions/mobskills/fast_blade.lua @@ -16,9 +16,11 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) params.baseDamage = mob:getWeaponDmg() params.numHits = 2 - params.fTP = { 1.0, 1.0, 1.0 } -- TODO: Capture fTPs + params.fTP = { 1.0, 1.5, 2.0 } + -- params.str_wSC = 0.2 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.dex_wSC = 0.2 -- TODO: Capture if mobskill weaponskills have wSC. params.attackType = xi.attackType.PHYSICAL - params.damageType = xi.damageType.BLUNT + params.damageType = xi.damageType.SLASHING params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) diff --git a/scripts/actions/mobskills/fast_blade_ii.lua b/scripts/actions/mobskills/fast_blade_ii.lua new file mode 100644 index 00000000000..495af3fdc4d --- /dev/null +++ b/scripts/actions/mobskills/fast_blade_ii.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Fast Blade +-- Family: Humanoid Sword Weaponskill +-- Description: Delivers a twofold attack. Damage varies with TP. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + mob:messageBasic(xi.msg.basic.READIES_WS, 0, xi.weaponskill.FAST_BLADE) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 2 + params.fTP = { 1.8, 3.5, 5.0 } + -- params.dex_wSC = 0.8 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/flat_blade.lua b/scripts/actions/mobskills/flat_blade.lua index d182bd465b7..c85c2e48f3f 100644 --- a/scripts/actions/mobskills/flat_blade.lua +++ b/scripts/actions/mobskills/flat_blade.lua @@ -19,7 +19,8 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) params.baseDamage = mob:getWeaponDmg() params.numHits = 1 - params.fTP = { 1.25, 1.25, 1.25 } -- TODO: Capture fTPs + params.fTP = { 1.0, 1.0, 1.0 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.SLASHING params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 @@ -29,10 +30,7 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) if xi.mobskills.processDamage(mob, target, skill, action, info) then target:takeDamage(info.damage, mob, info.attackType, info.damageType) - -- TODO: Eventually, we will want to rework mobStatusEffectMove() to accept MACC modifiers based on TP instead of this. - if math.random(1, 100) < skill:getTP() / 3 then - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) -- TODO: Capture stun duration - end + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) end if mob:getPool() == xi.mobPool.QUBIA_ARENA_TRION then diff --git a/scripts/actions/mobskills/glory_slash.lua b/scripts/actions/mobskills/glory_slash.lua new file mode 100644 index 00000000000..04b263a3715 --- /dev/null +++ b/scripts/actions/mobskills/glory_slash.lua @@ -0,0 +1,35 @@ +----------------------------------- +-- Glory Slash +-- Family: Humanoid Sword Weaponskill +-- Delivers an area attack that deals triple damage. Additional effect: Stun. Damage varies with TP. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 1 + params.fTP = { 3.0, 3.5, 4.0 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/imperator.lua b/scripts/actions/mobskills/imperator.lua new file mode 100644 index 00000000000..55f435a9441 --- /dev/null +++ b/scripts/actions/mobskills/imperator.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Imperator +-- Family: Humanoid Sword Weaponskill +-- Description: Damage varies with TP. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 1 + params.fTP = { 3.75, 7.5, 11.75 } + -- params.dex_wSC = 0.7 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.7 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/knights_of_rotund.lua b/scripts/actions/mobskills/knights_of_rotund.lua new file mode 100644 index 00000000000..7c491f73d8d --- /dev/null +++ b/scripts/actions/mobskills/knights_of_rotund.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Knights of Rotund +-- Family: Humanoid Sword Weaponskill +-- Description: BMI varies with TP. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 1 + params.fTP = { 3.0, 3.0, 3.0 } + -- params.str_wSC = 0.4 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.4 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/knights_of_round.lua b/scripts/actions/mobskills/knights_of_round.lua index c633ca0f8cb..b662f407fee 100644 --- a/scripts/actions/mobskills/knights_of_round.lua +++ b/scripts/actions/mobskills/knights_of_round.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Knights of Round -- Family: Humanoid Sword Weaponskill --- Description: Deals physical damage to a target. Excalibur/Caliburn: Regen. +-- Description: Deals physical damage to a target. Caliburn/Excalibur: Additional Effect: Regen ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,7 +15,9 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) params.baseDamage = mob:getWeaponDmg() params.numHits = 1 - params.fTP = { 2.5, 2.5, 2.5 } -- TODO: Capture fTPS + params.fTP = { 3.0, 3.0, 3.0 } + -- params.str_wSC = 0.4 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.4 -- TODO: Capture if mobskill weaponskills have wSC. params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.SLASHING params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 diff --git a/scripts/actions/mobskills/leaden_salute.lua b/scripts/actions/mobskills/leaden_salute.lua index 5905b2a93dc..fa318bb25c4 100644 --- a/scripts/actions/mobskills/leaden_salute.lua +++ b/scripts/actions/mobskills/leaden_salute.lua @@ -13,7 +13,7 @@ end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() + params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 4.0, 4.25, 4.75 } -- params.agi_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. params.element = xi.element.DARK diff --git a/scripts/actions/mobskills/red_lotus_blade.lua b/scripts/actions/mobskills/red_lotus_blade.lua index 3f1b1f64ad1..230a877983b 100644 --- a/scripts/actions/mobskills/red_lotus_blade.lua +++ b/scripts/actions/mobskills/red_lotus_blade.lua @@ -20,12 +20,17 @@ end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5.0, 5.0, 5.0 } -- TODO: Capture fTPs - params.element = xi.element.FIRE - params.attackType = xi.attackType.MAGICAL - params.damageType = xi.damageType.FIRE - params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 2.38, 3.0 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.int_wSC = 0.2 -- TODO: Capture if mobskill weaponskills have wSC. + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1 + params.dStatAttackerMod = xi.mod.INT + params.dStatDefenderMod = xi.mod.INT local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) diff --git a/scripts/actions/mobskills/requiescat.lua b/scripts/actions/mobskills/requiescat.lua new file mode 100644 index 00000000000..0cc4f73fcff --- /dev/null +++ b/scripts/actions/mobskills/requiescat.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Requiescat +-- Family: Humanoid Sword Weaponskill +-- Delivers a fivefold attack, non-elemental damage. Attack power varies with TP. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 5 + params.fTP = { 1.0, 1.0, 1.0 } + -- params.mnd_wSC = 0.85 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackMultiplier = { 0.8, 0.9, 1.0 } + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_5 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/sanguine_blade.lua b/scripts/actions/mobskills/sanguine_blade.lua new file mode 100644 index 00000000000..ed4f4e38a3b --- /dev/null +++ b/scripts/actions/mobskills/sanguine_blade.lua @@ -0,0 +1,43 @@ +----------------------------------- +-- Sanguine Blade +-- Family: Humanoid Sword Weaponskill +-- Description: Drains target's HP. Amount drained varies with TP. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local tp = skill:getTP() + local drain = 25 + (tp / 1000) * 25 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.75, 2.75, 2.75 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.5 -- TODO: Capture if mobskill weaponskills have wSC. + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 2 + params.dStatAttackerMod = xi.mod.INT + params.dStatDefenderMod = xi.mod.INT + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + + if not target:isUndead() then + mob:addHP(info.damage * drain / 100) + end + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/savage_blade.lua b/scripts/actions/mobskills/savage_blade.lua index 2584abd9370..81b747ebbb6 100644 --- a/scripts/actions/mobskills/savage_blade.lua +++ b/scripts/actions/mobskills/savage_blade.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Savage Blade -- Family: Humanoid Sword Weaponskill --- Description: Delivers a twofold attack. Damage varies with TP. +-- Description: Delivers an aerial attack comprised of two hits. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -19,7 +19,9 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) params.baseDamage = mob:getWeaponDmg() params.numHits = 2 - params.fTP = { 2.0, 2.0, 2.0 } -- TODO: Capture fTPs + params.fTP = { 1.0, 1.75, 3.5 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.5 -- TODO: Capture if mobskill weaponskills have wSC. params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.SLASHING params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2 diff --git a/scripts/actions/mobskills/seraph_blade.lua b/scripts/actions/mobskills/seraph_blade.lua index bae167e8ee7..09b781aa812 100644 --- a/scripts/actions/mobskills/seraph_blade.lua +++ b/scripts/actions/mobskills/seraph_blade.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Seraph Blade -- Family: Humanoid Sword Weaponskill --- Description: Deals Light elemental damage. +-- Description: Deals light elemental damage to enemy. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,12 +14,14 @@ end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5.0, 5.0, 5.0 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT - params.attackType = xi.attackType.MAGICAL - params.damageType = xi.damageType.LIGHT - params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 2.5, 3.0 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) diff --git a/scripts/actions/mobskills/shining_blade.lua b/scripts/actions/mobskills/shining_blade.lua index 28c65e91877..f4c4a0e69f3 100644 --- a/scripts/actions/mobskills/shining_blade.lua +++ b/scripts/actions/mobskills/shining_blade.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Shining Blade -- Family: Humanoid Sword Weaponskill --- Description: Deals Light elemental damage. Damage varies with TP. +-- Description: Deals Light elemental damage to enemy. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,12 +14,14 @@ end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT - params.attackType = xi.attackType.MAGICAL - params.damageType = xi.damageType.LIGHT - params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 2.0, 2.5 } + -- params.str_wSC = 0.2 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.2 -- TODO: Capture if mobskill weaponskills have wSC. + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) diff --git a/scripts/actions/mobskills/spirits_within.lua b/scripts/actions/mobskills/spirits_within.lua index 01b62105859..71b8a04a386 100644 --- a/scripts/actions/mobskills/spirits_within.lua +++ b/scripts/actions/mobskills/spirits_within.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Spirits Within --- +-- Family: Humanoid Sword Weaponskill -- Description: Delivers an unavoidable attack. Damage varies with HP and TP. --- Type: Magical/Breath --- Utsusemi/Blink absorb: Ignores shadows and most damage reduction. --- Range: Melee ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -18,45 +15,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) - -- TODO: Rework this to use one of the mobMove functions at some point. - -- Maybe mobBreathMove() with support for fTP ranges. if mob:getPool() == xi.mobPool.THRONE_ROOM_VOLKER then -- Volker@Throne_Room only target:showText(mob, zones[xi.zone.THRONE_ROOM].text.RETURN_TO_THE_DARKNESS) end - -- Should produce 1000 - 3750 @ full HP using the player formula, assuming 8k HP for AA EV. - -- dmg * 2.5, as wiki claims ~2500 at 100% HP, until a better formula comes along. - local tp = skill:getTP() - local hp = mob:getHP() - local dmg = math.floor(hp * (math.floor(0.016 * tp) + 16) / 256) - if tp > 2000 then -- 2001 - 3000 - dmg = math.floor(hp * (math.floor(0.072 * tp) - 96) / 256) - end - - dmg = math.floor(dmg * 2.5) - - -- Believe it or not, it's been proven to be breath damage. - dmg = math.floor(dmg * xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, true)) - dmg = math.floor(target:handleSevereDamage(dmg, false)) + local params = {} - -- Handling phalanx - dmg = utils.handlePhalanx(target, dmg) - - if dmg < 0 then - return 0 - end + params.percentMultipier = xi.combat.physical.calculateTPfactor(skill:getTP(), { 0.0625, 0.1875, 0.46875 }) + params.damageCap = mob:getMaxHP() + params.element = xi.element.NONE + params.resistStat = xi.mod.INT + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - dmg = utils.handleStoneskin(target, dmg) + local info = xi.mobskills.mobBreathMove(mob, target, skill, action, params) - if dmg > 0 then - target:wakeUp() - target:updateEnmityFromDamage(mob, dmg) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - target:takeDamage(dmg, mob, xi.attackType.BREATH, xi.damageType.ELEMENTAL) - return dmg + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/swift_blade.lua b/scripts/actions/mobskills/swift_blade.lua index 28a9a98eda6..c40d3401ebb 100644 --- a/scripts/actions/mobskills/swift_blade.lua +++ b/scripts/actions/mobskills/swift_blade.lua @@ -14,13 +14,15 @@ end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.numHits = 3 - params.fTP = { 2.0, 2.0, 2.0 } -- TODO: Capture fTPs - params.attackType = xi.attackType.PHYSICAL - params.damageType = xi.damageType.SLASHING - params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 - -- TODO: Accuracy modifier + params.baseDamage = mob:getWeaponDmg() + params.numHits = 3 + params.fTP = { 1.5, 1.5, 1.5 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + params.accuracyModifier = { 0, 30, 60 } + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) diff --git a/scripts/actions/mobskills/trueflight.lua b/scripts/actions/mobskills/trueflight.lua index 9fb8a0aaa1a..91de2467da7 100644 --- a/scripts/actions/mobskills/trueflight.lua +++ b/scripts/actions/mobskills/trueflight.lua @@ -13,7 +13,7 @@ end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() + params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 4.0, 4.25, 4.75 } -- params.agi_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. params.element = xi.element.LIGHT diff --git a/scripts/actions/mobskills/uriel_blade.lua b/scripts/actions/mobskills/uriel_blade.lua new file mode 100644 index 00000000000..8bcae9ba219 --- /dev/null +++ b/scripts/actions/mobskills/uriel_blade.lua @@ -0,0 +1,37 @@ +----------------------------------- +-- Uriel Blade +-- Family: Humanoid Sword Weaponskill +-- Delivers an area attack that deals light elemental damage. Additional effect: Flash. Damage varies with TP. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + mob:messageBasic(xi.msg.basic.READIES_WS, 0, xi.weaponskill.FAST_BLADE) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.numHits = 1 + params.fTP = { 4.5, 6.0, 7.5 } + -- params.str_wSC = 0.32 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.mnd_wSC = 0.32 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FLASH, 0, 0, 15) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/vorpal_blade.lua b/scripts/actions/mobskills/vorpal_blade.lua index 333c76d207b..c56cef77a3d 100644 --- a/scripts/actions/mobskills/vorpal_blade.lua +++ b/scripts/actions/mobskills/vorpal_blade.lua @@ -39,6 +39,9 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) params.baseDamage = mob:getWeaponDmg() params.numHits = 4 params.fTP = { 1.0, 1.0, 1.0 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + params.canCrit = true + params.criticalChance = { 0.1, 0.3, 0.5 } params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.SLASHING params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_4 diff --git a/scripts/actions/mobskills/wildfire.lua b/scripts/actions/mobskills/wildfire.lua index 1473abab0cd..0458724aaa2 100644 --- a/scripts/actions/mobskills/wildfire.lua +++ b/scripts/actions/mobskills/wildfire.lua @@ -13,7 +13,7 @@ end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() + params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 5.5, 5.5, 5.5 } -- params.agi_wSC = 0.6 -- TODO: Capture if mobskill weaponskills have wSC. params.element = xi.element.FIRE diff --git a/scripts/zones/Riverne-Site_B01/mobs/Bahamut_bv2.lua b/scripts/zones/Riverne-Site_B01/mobs/Bahamut_bv2.lua index 64741ab2276..eb26c9212ce 100644 --- a/scripts/zones/Riverne-Site_B01/mobs/Bahamut_bv2.lua +++ b/scripts/zones/Riverne-Site_B01/mobs/Bahamut_bv2.lua @@ -2,9 +2,9 @@ -- Area: Riverne - Site B01 (BCNM) -- NM: Bahamut V2 -- !pos -612.800 1.750 693.190 29 --- Uses a flare ability at 90%, 80%, 70%, 60%, 50%, 40%, 30%, 20%, 10%, and 0% HP. --- Summons a Wyrm at 80%, 60%, 40%, and 20% HP. The Wyrms are Ouryu, Tiamat, Jormungand, and Vrtra, but they spawn in random order. +-- Uses a flare ability at 90%, 80%, 70%, 60%, 50%, 40%, 30%, 20%, and 10% HP and repeatedly below 10% until death. -- At 10% HP, Bahamut will stop using magic and only use auto-attacks and Teraflare. +-- Summons a Wyrm at 80%, 60%, 40%, and 20% HP. The Wyrms are Ouryu, Tiamat, Jormungand, and Vrtra, but they spawn in random order. -- Combat loop will always prioritze using the next Flare in the sequence over summoning a Wyrm due to early returns. This is retail accurate. ----------------------------------- local ID = zones[xi.zone.RIVERNE_SITE_B01] diff --git a/sql/mob_skills.sql b/sql/mob_skills.sql index 98d65a03ace..83ef386c811 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -77,16 +77,16 @@ INSERT INTO `mob_skills` VALUES (34,3,'red_lotus_blade',0,0.0,7.0,2000,0,4,0,0,0 INSERT INTO `mob_skills` VALUES (35,6,'flat_blade',0,0.0,7.0,2000,0,4,0,0,0,8,0,0); INSERT INTO `mob_skills` VALUES (36,4,'shining_blade',0,0.0,7.0,2000,0,4,0,0,0,4,0,0); INSERT INTO `mob_skills` VALUES (37,5,'seraph_blade',0,0.0,7.0,2000,0,4,0,0,0,4,0,0); -INSERT INTO `mob_skills` VALUES (38,7,'circle_blade',1,0.0,5.0,2000,0,4,0,0,0,5,8,0); +INSERT INTO `mob_skills` VALUES (38,7,'circle_blade',1,4.0,5.0,2000,0,4,0,0,0,5,8,0); INSERT INTO `mob_skills` VALUES (39,8,'spirits_within',0,0.0,7.0,2000,0,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (40,9,'vorpal_blade',0,0.0,7.0,2000,0,4,0,0,0,5,8,0); INSERT INTO `mob_skills` VALUES (41,10,'swift_blade',0,0.0,7.0,2000,0,4,0,0,0,9,0,0); -INSERT INTO `mob_skills` VALUES (42,11,'savage_blade',0,0.0,7.0,2000,0,4,0,0,0,9,0,0); --- INSERT INTO `mob_skills` VALUES (43,??,'knights_of_round' --- INSERT INTO `mob_skills` VALUES (44,??,'death_blossom' --- INSERT INTO `mob_skills` VALUES (45,??,'atonement' --- INSERT INTO `mob_skills` VALUES (46,??,'expiacion' --- INSERT INTO `mob_skills` VALUES (47,??,'sanguine_blade' +INSERT INTO `mob_skills` VALUES (42,11,'savage_blade',0,0.0,7.0,2000,0,4,0,0,0,12,4,0); +INSERT INTO `mob_skills` VALUES (43,12,'knights_of_round',0,0.0,7.0,2000,0,4,0,0,0,13,11,0); +INSERT INTO `mob_skills` VALUES (44,13,'death_blossom',0,0.0,7.0,2000,0,4,0,0,0,12,10,0); +INSERT INTO `mob_skills` VALUES (45,14,'atonement',0,0.0,7.0,2000,0,4,0,0,0,11,5,0); +INSERT INTO `mob_skills` VALUES (46,15,'expiacion',0,0.0,7.0,2000,0,4,0,0,0,10,4,0); +INSERT INTO `mob_skills` VALUES (47,230,'sanguine_blade',0,0.0,7.0,2000,0,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (48,106,'hard_slash',0,0.0,10.0,2000,0,4,0,0,0,4,0,0); INSERT INTO `mob_skills` VALUES (49,107,'power_slash',0,0.0,10.0,2000,0,4,0,0,0,4,0,0); INSERT INTO `mob_skills` VALUES (50,108,'frostbite',0,0.0,10.0,2000,0,4,0,0,0,7,0,0); @@ -251,19 +251,19 @@ INSERT INTO `mob_skills` VALUES (220,235,'wildfire',0,0.0,15.0,2000,0,4,0,0,0,14 INSERT INTO `mob_skills` VALUES (221,241,'last_stand',0,0.0,15.0,2000,0,4,0,0,0,11,5,0); INSERT INTO `mob_skills` VALUES (222,226,'terminus',0,0.0,15.0,2000,0,4,0,0,0,11,7,5); -- INSERT INTO `mob_skills` VALUES (224,??,'exenterator' --- INSERT INTO `mob_skills` VALUES (225,??,'chant_du_cygne' --- INSERT INTO `mob_skills` VALUES (226,??,'requiescat' --- INSERT INTO `mob_skills` VALUES (227,??,'knights_of_rotund' +INSERT INTO `mob_skills` VALUES (225,233,'chant_du_cygne',0,0.0,7.0,2000,0,4,0,0,0,13,10,0); +INSERT INTO `mob_skills` VALUES (226,237,'requiescat',0,0.0,7.0,2000,0,4,0,0,0,9,4,0); +INSERT INTO `mob_skills` VALUES (227,12,'knights_of_rotund',0,0.0,7.0,2000,0,4,0,0,0,11,0,0); -- INSERT INTO `mob_skills` VALUES (228,??,'final_paradise' --- INSERT INTO `mob_skills` VALUES (229,??,'fast_blade_ii' +INSERT INTO `mob_skills` VALUES (229,1,'fast_blade_ii',0,0.0,7.0,2000,0,4,0,0,0,11,0,0); -- INSERT INTO `mob_skills` VALUES (230,??,'dragon_blow' -- INSERT INTO `mob_skills` VALUES (231,??,'maru_kala' -- INSERT INTO `mob_skills` VALUES (232,??,'merciless_strike' --- INSERT INTO `mob_skills` VALUES (233,??,'imperator' +INSERT INTO `mob_skills` VALUES (233,12,'imperator',0,0.0,7.0,2000,0,4,0,0,0,10,6,2); -- INSERT INTO `mob_skills` VALUES (234,??,'dagda' -- INSERT INTO `mob_skills` VALUES (235,??,'oshala' --- INSERT INTO `mob_skills` VALUES (238,??,'uriel_blade' --- INSERT INTO `mob_skills` VALUES (239,??,'glory_slash' +INSERT INTO `mob_skills` VALUES (238,243,'uriel_blade',1,0.0,10.0,2000,0,4,0,0,0,13,12,4); +INSERT INTO `mob_skills` VALUES (239,242,'glory_slash',1,0.0,10.0,2000,0,4,0,0,0,13,11,0); -- INSERT INTO `mob_skills` VALUES (240,??,'tartarus_torpor' INSERT INTO `mob_skills` VALUES (241,249,'netherspikes',4,0.0,10.0,2000,0,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (242,242,'carnal_nightmare',1,0.0,10.0,2000,0,4,0,0,0,0,0,0);