From 0ee3ef8c89e4fee5c9611227460f2002adc6f121 Mon Sep 17 00:00:00 2001 From: Skold <113406182+Skold177@users.noreply.github.com> Date: Sat, 25 Apr 2026 16:25:47 -0400 Subject: [PATCH] Implement katana mobskills Implement Katana mobskills --- scripts/actions/mobskills/blade_chi.lua | 47 +++++++++++++++++++++++ scripts/actions/mobskills/blade_ei.lua | 37 ++++++++++++++++++ scripts/actions/mobskills/blade_hi.lua | 35 +++++++++++++++++ scripts/actions/mobskills/blade_jin.lua | 12 +++--- scripts/actions/mobskills/blade_kamu.lua | 37 ++++++++++++++++++ scripts/actions/mobskills/blade_ku.lua | 19 ++++----- scripts/actions/mobskills/blade_metsu.lua | 9 +++-- scripts/actions/mobskills/blade_retsu.lua | 38 ++++++++++++++++++ scripts/actions/mobskills/blade_rin.lua | 36 +++++++++++++++++ scripts/actions/mobskills/blade_shun.lua | 35 +++++++++++++++++ scripts/actions/mobskills/blade_teki.lua | 47 +++++++++++++++++++++++ scripts/actions/mobskills/blade_ten.lua | 34 ++++++++++++++++ scripts/actions/mobskills/blade_to.lua | 35 +++++++++++------ scripts/actions/mobskills/blade_yu.lua | 36 +++++++++++++++++ scripts/actions/mobskills/zesho_meppo.lua | 34 ++++++++++++++++ sql/mob_skills.sql | 30 +++++++-------- 16 files changed, 476 insertions(+), 45 deletions(-) create mode 100644 scripts/actions/mobskills/blade_chi.lua create mode 100644 scripts/actions/mobskills/blade_ei.lua create mode 100644 scripts/actions/mobskills/blade_hi.lua create mode 100644 scripts/actions/mobskills/blade_kamu.lua create mode 100644 scripts/actions/mobskills/blade_retsu.lua create mode 100644 scripts/actions/mobskills/blade_rin.lua create mode 100644 scripts/actions/mobskills/blade_shun.lua create mode 100644 scripts/actions/mobskills/blade_teki.lua create mode 100644 scripts/actions/mobskills/blade_ten.lua create mode 100644 scripts/actions/mobskills/blade_yu.lua create mode 100644 scripts/actions/mobskills/zesho_meppo.lua diff --git a/scripts/actions/mobskills/blade_chi.lua b/scripts/actions/mobskills/blade_chi.lua new file mode 100644 index 00000000000..0b279065f05 --- /dev/null +++ b/scripts/actions/mobskills/blade_chi.lua @@ -0,0 +1,47 @@ +----------------------------------- +-- Blade: Chi +-- Family: Humanoid Katana Weaponskill +-- Description: Delivers a twofold attack that deals earth elemental damage. 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 = { 0.5, 0.75, 1.0 } + -- 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.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.hybridSkill = true + params.hybridSkillElement = xi.element.EARTH + params.hybridAttackType = xi.attackType.MAGICAL + params.hybridDamageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + local totalDamage = 0 + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + if info.damage > 0 then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + totalDamage = totalDamage + info.damage + end + + if info.hybridDamage > 0 and target:getHP() > 0 then + target:takeDamage(info.hybridDamage, mob, info.hybridAttackType, info.hybridDamageType) + totalDamage = totalDamage + info.hybridDamage + end + end + + return totalDamage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/blade_ei.lua b/scripts/actions/mobskills/blade_ei.lua new file mode 100644 index 00000000000..167dc9f221b --- /dev/null +++ b/scripts/actions/mobskills/blade_ei.lua @@ -0,0 +1,37 @@ +----------------------------------- +-- Blade: Ei +-- Family: Humanoid Katana Weaponskill +-- Description: Deals darkness elemental damage. 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:getMainLvl() + 2 + params.fTP = { 1.0, 1.5, 2.0 } + -- 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.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + 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) + + 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/blade_hi.lua b/scripts/actions/mobskills/blade_hi.lua new file mode 100644 index 00000000000..2dce0d0a2be --- /dev/null +++ b/scripts/actions/mobskills/blade_hi.lua @@ -0,0 +1,35 @@ +----------------------------------- +-- Blade: Hi +-- Family: Humanoid Katana Weaponskill +-- Description: Deals critical damage. Chance of critical hit 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 = { 4.0, 4.0, 4.0 } + -- params.agi_wSC = 0.6 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.canCrit = true + params.criticalChance = { 0.15, 0.2, 0.25 } + + 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/blade_jin.lua b/scripts/actions/mobskills/blade_jin.lua index 6189c37e9d6..da653946579 100644 --- a/scripts/actions/mobskills/blade_jin.lua +++ b/scripts/actions/mobskills/blade_jin.lua @@ -1,14 +1,12 @@ ----------------------------------- -- Blade: Jin -- Family: Humanoid Katana Weaponskill --- Description: Delivers a 3 hit attack. +-- Description: Delivers a threefold attack. Chance of critical hit varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - mob:messageBasic(xi.msg.basic.READIES_WS, 0, 134) - return 0 end @@ -17,12 +15,14 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) params.baseDamage = mob:getWeaponDmg() params.numHits = 3 - params.fTP = { 2.0, 2.0, 2.0 } -- TODO: Capture fTPs + params.fTP = { 1.0, 1.0, 1.0 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.dex_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_3 - -- params.canCrit = true -- TODO: Capture if mobskill crits or not. - -- params.criticalChance = { 1.0, 1.0, 1.0 } -- TODO: Capture crit rate + params.canCrit = true + params.criticalChance = { 0.1, 0.3, 0.5 } local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) diff --git a/scripts/actions/mobskills/blade_kamu.lua b/scripts/actions/mobskills/blade_kamu.lua new file mode 100644 index 00000000000..dc2f30a0ba7 --- /dev/null +++ b/scripts/actions/mobskills/blade_kamu.lua @@ -0,0 +1,37 @@ +----------------------------------- +-- Blade: Kamu +-- Family: Humanoid Katana Weaponskill +-- Description: Lowers target's accuracy. Duration of effect 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 = { 1.0, 1.0, 1.0 } + -- params.str_wSC = 0.5 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.int_wSC = 0.5 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackMultiplier = { 1.3, 1.3, 1.3 } + 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.ACCURACY_DOWN, 10, 0, math.floor(6 * skill:getTP() / 100)) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/blade_ku.lua b/scripts/actions/mobskills/blade_ku.lua index b95b820401b..532e33ac875 100644 --- a/scripts/actions/mobskills/blade_ku.lua +++ b/scripts/actions/mobskills/blade_ku.lua @@ -1,26 +1,27 @@ ----------------------------------- -- Blade: Ku -- Family: Humanoid Katana Weaponskill --- Description: Delivers a 5 hit attack. +-- Description: Delivers a fivefold attack. Accuracy varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - mob:messageBasic(xi.msg.basic.READIES_WS, 0, 136) - 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 } -- TODO: Capture fTPs - params.attackType = xi.attackType.PHYSICAL - params.damageType = xi.damageType.SLASHING - params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_5 + params.baseDamage = mob:getWeaponDmg() + params.numHits = 5 + params.fTP = { 1.0, 1.0, 1.0 } + -- params.str_wSC = 0.1 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.dex_wSC = 0.1 -- TODO: Capture if mobskill weaponskills have wSC. + params.accuracyModifier = { 0, 30, 60 } -- TODO: Verify exact number. + 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) diff --git a/scripts/actions/mobskills/blade_metsu.lua b/scripts/actions/mobskills/blade_metsu.lua index 488fb1ab1a5..7f8867e320f 100644 --- a/scripts/actions/mobskills/blade_metsu.lua +++ b/scripts/actions/mobskills/blade_metsu.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Blade Metsu +-- Blade: Metsu -- Family: Humanoid Katana Weaponskill --- Description: Additional effect: Paralysis +-- Description: Additional effect: Paralysis. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,7 +15,8 @@ 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.dex_wSC = 0.6 -- TODO: Capture if mobskill weaponskills have wSC. params.attackType = xi.attackType.PHYSICAL params.damageType = xi.damageType.SLASHING params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 @@ -25,7 +26,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) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 10, 0, 60) -- TODO: Capture effect + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 10, 0, 60) end return info.damage diff --git a/scripts/actions/mobskills/blade_retsu.lua b/scripts/actions/mobskills/blade_retsu.lua new file mode 100644 index 00000000000..00888f629a2 --- /dev/null +++ b/scripts/actions/mobskills/blade_retsu.lua @@ -0,0 +1,38 @@ +----------------------------------- +-- Blade: Retsu +-- Family: Humanoid Katana Weaponskill +-- Description: Delivers a twofold attack that paralyzes target. Duration of paralysis 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.0, 1.0, 1.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.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) + + local power = utils.clamp(30 + 3 * (mob:getMainLvl() - target:getMainLvl()), 5, 35) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, power, 0, xi.mobskills.calculateDuration(skill:getTP(), 30, 120)) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/blade_rin.lua b/scripts/actions/mobskills/blade_rin.lua new file mode 100644 index 00000000000..18d7f9d6572 --- /dev/null +++ b/scripts/actions/mobskills/blade_rin.lua @@ -0,0 +1,36 @@ +----------------------------------- +-- Blade: Rin +-- Family: Humanoid Katana Weaponskill +-- Description: Deals critical damage. Chance of critical hit 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 = { 1.0, 1.0, 1.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.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.canCrit = true + params.criticalChance = { 0.3, 0.6, 0.9 } + + 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/blade_shun.lua b/scripts/actions/mobskills/blade_shun.lua new file mode 100644 index 00000000000..80cee7081f6 --- /dev/null +++ b/scripts/actions/mobskills/blade_shun.lua @@ -0,0 +1,35 @@ +----------------------------------- +-- Blade: Shun +-- Family: Humanoid Katana Weaponskill +-- Description: Delivers a fivefold attack. 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 = { 0.6875, 0.6875, 0.6875 } + params.fTPSubsequentHits = { 0.6875, 0.6875, 0.6875 } + -- params.dex_wSC = 0.85 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_5 + params.attackMultiplier = { 1.0, 2.0, 3.0 } + + 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/blade_teki.lua b/scripts/actions/mobskills/blade_teki.lua new file mode 100644 index 00000000000..481055523d4 --- /dev/null +++ b/scripts/actions/mobskills/blade_teki.lua @@ -0,0 +1,47 @@ +----------------------------------- +-- Blade: Teki +-- Family: Humanoid Katana Weaponskill +-- Description: Deals water elemental damage. 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 = { 0.5, 0.75, 1.0 } + -- 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.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.hybridSkill = true + params.hybridSkillElement = xi.element.WATER + params.hybridAttackType = xi.attackType.MAGICAL + params.hybridDamageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + local totalDamage = 0 + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + if info.damage > 0 then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + totalDamage = totalDamage + info.damage + end + + if info.hybridDamage > 0 and target:getHP() > 0 then + target:takeDamage(info.hybridDamage, mob, info.hybridAttackType, info.hybridDamageType) + totalDamage = totalDamage + info.hybridDamage + end + end + + return totalDamage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/blade_ten.lua b/scripts/actions/mobskills/blade_ten.lua new file mode 100644 index 00000000000..974980c3b65 --- /dev/null +++ b/scripts/actions/mobskills/blade_ten.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Blade: Ten +-- Family: Humanoid Katana 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 = { 2.5, 2.75, 3.0 } + -- params.str_wSC = 0.3 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.dex_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) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/blade_to.lua b/scripts/actions/mobskills/blade_to.lua index 628e71581fb..067205d0cb3 100644 --- a/scripts/actions/mobskills/blade_to.lua +++ b/scripts/actions/mobskills/blade_to.lua @@ -1,34 +1,47 @@ ----------------------------------- -- Blade: To -- Family: Humanoid Katana Weaponskill --- Description: +-- Description: Deals ice elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - mob:messageBasic(xi.msg.basic.READIES_WS, 0, 131) - return 0 end mobskillObject.onMobWeaponSkill = function(mob, target, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.numHits = 1 - params.fTP = { 2.0, 2.0, 2.0 } -- TODO: Capture fTPs - params.attackType = xi.attackType.PHYSICAL - params.damageType = xi.damageType.BLUNT - params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.baseDamage = mob:getWeaponDmg() + params.numHits = 1 + params.fTP = { 0.5, 0.75, 1.0 } + -- 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.hybridSkill = true + params.hybridSkillElement = xi.element.ICE + params.hybridAttackType = xi.attackType.MAGICAL + params.hybridDamageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, action, params) + local totalDamage = 0 if xi.mobskills.processDamage(mob, target, skill, action, info) then - target:takeDamage(info.damage, mob, info.attackType, info.damageType) + if info.damage > 0 then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + totalDamage = totalDamage + info.damage + end + + if info.hybridDamage > 0 and target:getHP() > 0 then + target:takeDamage(info.hybridDamage, mob, info.hybridAttackType, info.hybridDamageType) + totalDamage = totalDamage + info.hybridDamage + end end - return info.damage + return totalDamage end return mobskillObject diff --git a/scripts/actions/mobskills/blade_yu.lua b/scripts/actions/mobskills/blade_yu.lua new file mode 100644 index 00000000000..50ceb00ba51 --- /dev/null +++ b/scripts/actions/mobskills/blade_yu.lua @@ -0,0 +1,36 @@ +----------------------------------- +-- Blade: Yu +-- Family: Humanoid Katana Weaponskill +-- Description: Deals water elemental damage. Additional effect: Poison. Duration 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:getMainLvl() + 2 + params.fTP = { 2.25, 2.25, 2.25 } + -- params.dex_wSC = 0.28 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.int_wSC = 0.28 -- TODO: Capture if mobskill weaponskills have wSC. + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + + 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) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 10, 3, math.floor(75 + 15 * skill:getTP() / 1000)) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/zesho_meppo.lua b/scripts/actions/mobskills/zesho_meppo.lua new file mode 100644 index 00000000000..2100b3f77bb --- /dev/null +++ b/scripts/actions/mobskills/zesho_meppo.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Zesho Meppo +-- Family: Humanoid Katana Weaponskill +-- Description: Delivers a fourfold 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 = 4 + params.fTP = { 4.0, 11.3575, 18.715 } + -- params.dex_wSC = 0.25 -- TODO: Capture if mobskill weaponskills have wSC. + -- params.agi_wSC = 0.25 -- TODO: Capture if mobskill weaponskills have wSC. + params.attackType = xi.attackType.PHYSICAL + params.damageType = xi.damageType.SLASHING + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_4 + + 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/sql/mob_skills.sql b/sql/mob_skills.sql index 2fd0008433d..e17fd2ebbb6 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -165,21 +165,21 @@ INSERT INTO `mob_skills` VALUES (123,132,'sonic_thrust',2,10.0,7.0,2000,0,4,0,0, INSERT INTO `mob_skills` VALUES (124,133,'camlanns_torment',0,0.0,7.0,2000,0,4,0,0,0,13,12,0); INSERT INTO `mob_skills` VALUES (125,134,'stardiver',0,0.0,7.0,2000,0,4,0,0,0,9,1,0); INSERT INTO `mob_skills` VALUES (126,130,'diarmuid',0,0.0,7.0,2000,0,4,0,0,0,10,4,1); --- INSERT INTO `mob_skills` VALUES (128,??,'blade_rin' --- INSERT INTO `mob_skills` VALUES (129,??,'blade_retsu' --- INSERT INTO `mob_skills` VALUES (130,??,'blade_teki' -INSERT INTO `mob_skills` VALUES (131,154,'blade_to',0,0.0,7.0,2000,0,4,0,0,0,9,0,0); --- INSERT INTO `mob_skills` VALUES (132,??,'blade_chi' --- INSERT INTO `mob_skills` VALUES (133,??,'blade_ei' -INSERT INTO `mob_skills` VALUES (134,157,'blade_jin',0,0.0,7.0,2000,0,4,0,0,0,9,0,0); --- INSERT INTO `mob_skills` VALUES (135,??,'blade_ten' -INSERT INTO `mob_skills` VALUES (136,159,'blade_ku',0,0.0,7.0,2000,0,4,0,0,0,9,0,0); --- INSERT INTO `mob_skills` VALUES (137,??,'blade_metsu' --- INSERT INTO `mob_skills` VALUES (138,??,'blade_kamu' --- INSERT INTO `mob_skills` VALUES (139,??,'blade_yu' --- INSERT INTO `mob_skills` VALUES (140,??,'blade_hi' --- INSERT INTO `mob_skills` VALUES (141,??,'blade_shun' --- INSERT INTO `mob_skills` VALUES (142,??,'jijin_kaimetsu' +INSERT INTO `mob_skills` VALUES (128,151,'blade_rin',0,0.0,7.0,2000,0,4,0,0,0,1,0,0); +INSERT INTO `mob_skills` VALUES (129,152,'blade_retsu',0,0.0,7.0,2000,0,4,0,0,0,4,0,0); +INSERT INTO `mob_skills` VALUES (130,153,'blade_teki',0,0.0,7.0,2000,0,4,0,0,0,5,0,0); +INSERT INTO `mob_skills` VALUES (131,154,'blade_to',0,0.0,7.0,2000,0,4,0,0,0,7,6,0); +INSERT INTO `mob_skills` VALUES (132,155,'blade_chi',0,0.0,7.0,2000,0,4,0,0,0,1,8,0); +INSERT INTO `mob_skills` VALUES (133,156,'blade_ei',0,0.0,7.0,2000,0,4,0,0,0,2,0,0); +INSERT INTO `mob_skills` VALUES (134,157,'blade_jin',0,0.0,7.0,2000,0,4,0,0,0,6,8,0); +INSERT INTO `mob_skills` VALUES (135,158,'blade_ten',0,0.0,7.0,2000,0,4,0,0,0,9,0,0); +INSERT INTO `mob_skills` VALUES (136,159,'blade_ku',0,0.0,7.0,2000,0,4,0,0,0,9,1,0); +INSERT INTO `mob_skills` VALUES (137,160,'blade_metsu',0,0.0,7.0,2000,0,4,0,0,0,14,12,0); +INSERT INTO `mob_skills` VALUES (138,161,'blade_kamu',0,0.0,7.0,2000,0,4,0,0,0,12,2,0); +INSERT INTO `mob_skills` VALUES (139,162,'blade_yu',0,0.0,7.0,2000,0,4,0,0,0,5,4,0); +INSERT INTO `mob_skills` VALUES (140,163,'blade_hi',0,0.0,7.0,2000,0,4,0,0,0,14,9,0); +INSERT INTO `mob_skills` VALUES (141,164,'blade_shun',0,0.0,7.0,2000,0,4,0,0,0,11,8,0); +INSERT INTO `mob_skills` VALUES (142,160,'zesho_meppo',0,0.0,7.0,2000,0,4,0,0,0,11,7,5); -- INSERT INTO `mob_skills` VALUES (144,??,'tachi_enpi' -- INSERT INTO `mob_skills` VALUES (145,??,'tachi_hobaku' -- INSERT INTO `mob_skills` VALUES (146,??,'tachi_goten'