From bfd92af85362d0dd4bace2e82301f83e555ca455 Mon Sep 17 00:00:00 2001 From: Umeboshi Date: Wed, 8 Oct 2025 13:29:44 -0700 Subject: [PATCH 1/6] [lua] Mobskill Rework: Magical --- scripts/actions/mobskills/abyss_blast.lua | 31 +- scripts/actions/mobskills/abyssal_drain.lua | 23 +- scripts/actions/mobskills/acheron_flame.lua | 34 ++ scripts/actions/mobskills/acid_mist.lua | 26 +- scripts/actions/mobskills/acid_spray.lua | 23 +- scripts/actions/mobskills/acrid_stream.lua | 29 +- scripts/actions/mobskills/aeolian_edge.lua | 21 +- scripts/actions/mobskills/aeolian_void.lua | 20 +- scripts/actions/mobskills/aerial_blast.lua | 18 +- scripts/actions/mobskills/aero_ii.lua | 18 +- scripts/actions/mobskills/aero_iv.lua | 18 +- .../actions/mobskills/aero_meeble_warble.lua | 22 +- scripts/actions/mobskills/antimatter.lua | 21 +- scripts/actions/mobskills/aqua_ball.lua | 23 +- scripts/actions/mobskills/aqua_blast.lua | 28 +- scripts/actions/mobskills/arctic_impact.lua | 19 +- scripts/actions/mobskills/armor_buster.lua | 24 +- .../actions/mobskills/artificial_gravity.lua | 27 +- .../mobskills/artificial_gravity_1.lua | 27 +- .../mobskills/artificial_gravity_2.lua | 27 +- .../mobskills/artificial_gravity_3.lua | 27 +- .../actions/mobskills/auroral_uppercut.lua | 19 +- scripts/actions/mobskills/auroral_wind.lua | 25 +- scripts/actions/mobskills/bai_wing.lua | 26 +- scripts/actions/mobskills/barofield.lua | 26 +- .../actions/mobskills/binary_absorption.lua | 22 +- scripts/actions/mobskills/binary_tap.lua | 13 +- .../actions/mobskills/binding_microtube.lua | 22 +- scripts/actions/mobskills/black_cloud.lua | 31 +- scripts/actions/mobskills/blastbomb.lua | 21 +- scripts/actions/mobskills/blazing_bound.lua | 25 +- scripts/actions/mobskills/blitzstrahl.lua | 24 +- scripts/actions/mobskills/blizzard_ii.lua | 18 +- scripts/actions/mobskills/blizzard_iv.lua | 18 +- .../mobskills/blizzard_meeble_warble.lua | 19 +- scripts/actions/mobskills/blood_drain.lua | 28 +- scripts/actions/mobskills/blood_saber.lua | 18 +- scripts/actions/mobskills/bloody_beak.lua | 18 +- scripts/actions/mobskills/bomb_toss.lua | 18 +- .../actions/mobskills/bomb_toss_suicide.lua | 27 +- scripts/actions/mobskills/burning_blade.lua | 23 +- scripts/actions/mobskills/calamitous_wind.lua | 32 +- scripts/actions/mobskills/chaos_blade.lua | 31 +- scripts/actions/mobskills/charged_whisker.lua | 18 +- scripts/actions/mobskills/choke_chain.lua | 23 +- .../actions/mobskills/circle_of_flames.lua | 36 +- scripts/actions/mobskills/citadel_buster.lua | 38 +- scripts/actions/mobskills/clarsach_call.lua | 17 +- scripts/actions/mobskills/cold_wave.lua | 10 +- scripts/actions/mobskills/core_meltdown.lua | 23 +- scripts/actions/mobskills/corrosive_ooze.lua | 30 +- .../actions/mobskills/cosmic_elucidation.lua | 30 +- scripts/actions/mobskills/crispy_candle.lua | 18 +- .../actions/mobskills/crispy_candle_self.lua | 34 ++ scripts/actions/mobskills/cryo_jet.lua | 19 +- scripts/actions/mobskills/crystal_rain.lua | 18 +- .../actions/mobskills/crystal_weapon_fire.lua | 26 +- .../mobskills/crystal_weapon_stone.lua | 26 +- .../mobskills/crystal_weapon_water.lua | 26 +- .../actions/mobskills/crystal_weapon_wind.lua | 26 +- scripts/actions/mobskills/cursed_sphere.lua | 23 +- scripts/actions/mobskills/cyclone_wing.lua | 15 +- .../actions/mobskills/cyclonic_torrent.lua | 34 +- .../actions/mobskills/cyclonic_turmoil.lua | 36 +- scripts/actions/mobskills/dark_mist.lua | 30 +- scripts/actions/mobskills/dark_nova.lua | 17 +- scripts/actions/mobskills/dark_orb.lua | 27 +- scripts/actions/mobskills/dark_sphere.lua | 23 +- scripts/actions/mobskills/dark_wave.lua | 43 +- scripts/actions/mobskills/death_ray.lua | 21 +- .../actions/mobskills/decayed_filament.lua | 21 +- scripts/actions/mobskills/decussate.lua | 16 +- scripts/actions/mobskills/diamond_dust.lua | 18 +- scripts/actions/mobskills/dice_damage.lua | 21 +- scripts/actions/mobskills/diffusion_ray.lua | 26 +- scripts/actions/mobskills/digest.lua | 20 +- scripts/actions/mobskills/discharge.lua | 26 +- scripts/actions/mobskills/discoid.lua | 32 +- scripts/actions/mobskills/divine_judgment.lua | 19 +- scripts/actions/mobskills/divine_spear.lua | 16 +- scripts/actions/mobskills/doctors_orders.lua | 15 +- scripts/actions/mobskills/double_ray.lua | 22 +- scripts/actions/mobskills/drain_whip.lua | 22 +- scripts/actions/mobskills/drainkiss.lua | 20 +- scripts/actions/mobskills/dreadstorm.lua | 24 +- scripts/actions/mobskills/dust_cloud.lua | 21 +- scripts/actions/mobskills/dustvoid.lua | 33 +- scripts/actions/mobskills/earth_pounder.lua | 34 +- scripts/actions/mobskills/earthbreaker.lua | 24 +- scripts/actions/mobskills/earthen_fury.lua | 19 +- scripts/actions/mobskills/electrocharge.lua | 18 +- .../mobskills/electromagnetic_field.lua | 19 +- .../actions/mobskills/empirical_research.lua | 15 +- scripts/actions/mobskills/empty_salvation.lua | 19 +- scripts/actions/mobskills/erosion_dust.lua | 26 +- scripts/actions/mobskills/erratic_flutter.lua | 35 +- scripts/actions/mobskills/eyes_on_me.lua | 25 +- scripts/actions/mobskills/final_exam.lua | 15 +- scripts/actions/mobskills/fire_arrow.lua | 21 - scripts/actions/mobskills/fire_ii.lua | 18 +- scripts/actions/mobskills/fire_iv.lua | 18 +- .../actions/mobskills/fire_meeble_warble.lua | 23 +- scripts/actions/mobskills/fireball.lua | 21 +- scripts/actions/mobskills/firebomb.lua | 17 +- scripts/actions/mobskills/firespit.lua | 39 +- scripts/actions/mobskills/flame_arrow.lua | 25 +- scripts/actions/mobskills/flame_blast.lua | 30 +- scripts/actions/mobskills/flame_blast_alt.lua | 28 +- scripts/actions/mobskills/flame_thrower.lua | 2 +- scripts/actions/mobskills/floodlight.lua | 27 +- .../actions/mobskills/flying_hip_press.lua | 27 +- scripts/globals/bluemagic.lua | 6 +- scripts/globals/mobskills.lua | 428 ++++++++++++++---- scripts/globals/spells/damage_spell.lua | 23 +- sql/mob_skills.sql | 2 +- 115 files changed, 2056 insertions(+), 1017 deletions(-) create mode 100644 scripts/actions/mobskills/acheron_flame.lua create mode 100644 scripts/actions/mobskills/crispy_candle_self.lua delete mode 100644 scripts/actions/mobskills/fire_arrow.lua diff --git a/scripts/actions/mobskills/abyss_blast.lua b/scripts/actions/mobskills/abyss_blast.lua index 58cbd70d00a..3231dc09a00 100644 --- a/scripts/actions/mobskills/abyss_blast.lua +++ b/scripts/actions/mobskills/abyss_blast.lua @@ -1,11 +1,7 @@ ----------------------------------- --- Abyss Blast --- --- Description: Blasts a single target with dark energy. Additional effect: Blind --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown --- Notes: Blinds target +-- Abyss Blast +-- Family: Doomed +-- Description: Blasts a single target with dark energy. Additional Effect: Blind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,15 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 2.5 - local power = 15 - local duration = 120 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.50, 3.50, 4.50 } + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, power, 0, duration) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + local power = 20 + local duration = 120 + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, power, 0, duration) + end return damage end diff --git a/scripts/actions/mobskills/abyssal_drain.lua b/scripts/actions/mobskills/abyssal_drain.lua index 81e7cdb98be..984d88d14cf 100644 --- a/scripts/actions/mobskills/abyssal_drain.lua +++ b/scripts/actions/mobskills/abyssal_drain.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Abyssal Drain --- Deals dark damage to a single target. Additional effect: Drain --- Type: Magical --- Utsusemi/Blink absorb: 1 shadow --- Range: Melee +-- Family: Humanoid (Zeid) +-- Description: Deals Dark damage to a single target. Additional Effect: Drain ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,8 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- TODO: Implement this - return 0 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } -- TODO: Capture fTPs + params.element = xi.element.DARK + -- TODO: Capture shadow behavior + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage, xi.attackType.MAGICAL, xi.damageType.DARK)) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/acheron_flame.lua b/scripts/actions/mobskills/acheron_flame.lua new file mode 100644 index 00000000000..4e556c59b82 --- /dev/null +++ b/scripts/actions/mobskills/acheron_flame.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Acheron Flame +-- Family: Cerberus +-- Description: Deals severe Fire damage to enemies within an area of effect. Additional Effect: Burn +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 12.50, 12.50, 12.50 } -- TODO: Captures fTPs + params.element = xi.element.FIRE + params.dStatMultiplier = 1 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + local power = 30 -- TODO: Capture power/duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, power, 3, 60) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/acid_mist.lua b/scripts/actions/mobskills/acid_mist.lua index 8ad3d3450f0..0517bd47729 100644 --- a/scripts/actions/mobskills/acid_mist.lua +++ b/scripts/actions/mobskills/acid_mist.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Acid Mist --- Deals Water damage to enemies within an area of effect. Additional effect: Attack Down +-- Family: Leech +-- Description: Deals Water damage to enemies within an area of effect. Additional Effect: Attack Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,15 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3.2 - local power = 50 - local duration = 120 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.75, 2.00, 2.25 } + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, power, 0, duration) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + local power = 50 + local duration = 120 + -- TODO: Leeches in Dynamis lower attack to 1. + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, power, 0, duration) + end return damage end diff --git a/scripts/actions/mobskills/acid_spray.lua b/scripts/actions/mobskills/acid_spray.lua index 36606a2cd80..212023b046e 100644 --- a/scripts/actions/mobskills/acid_spray.lua +++ b/scripts/actions/mobskills/acid_spray.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Acid Spray --- Deals Water damage to targets in a fan-shaped area of effect. Additional effect: Poison +-- Family: Spider +-- Description: Deals Water damage to a target. Additional Effect: Poison ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,14 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 - local power = mob:getMainLvl() / 3.5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, power, 3, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + local power = math.floor(mob:getMainLvl() / 10 * 2) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, power, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/acrid_stream.lua b/scripts/actions/mobskills/acrid_stream.lua index 6c53bac4f81..9a127c28365 100644 --- a/scripts/actions/mobskills/acrid_stream.lua +++ b/scripts/actions/mobskills/acrid_stream.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Acrid Stream --- --- Description: Deals water damage to enemies within a fan-shaped area originating from the caster. Additional effect: Lowers target's Magic Defense. --- Type: Magical (Water) +-- Acrid Stream +-- Family: Vorageans +-- Description: Deals water damage to enemies within a fan-shaped area originating from the caster. Additional Effect: Magic Defense Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,15 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3.5 - local power = 20 - local duration = 120 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.50, 3.50, 3.50 } -- TODO: Capture fTPs + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MAGIC_DEF_DOWN, power, 0, duration) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + -- TODO: Capture power/duration + local power = 20 + local duration = 120 + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MAGIC_DEF_DOWN, power, 0, duration) + end return damage end diff --git a/scripts/actions/mobskills/aeolian_edge.lua b/scripts/actions/mobskills/aeolian_edge.lua index 72897e68bfc..f4f65c8224a 100644 --- a/scripts/actions/mobskills/aeolian_edge.lua +++ b/scripts/actions/mobskills/aeolian_edge.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Aeolian Edge +-- Family: Humanoid Dagger Weaponskill +-- Description: Deals Wind damage to enemies in range. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,15 +12,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 3 - local accmod = 1 - local ftp = 2 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.ACC_VARIES, 1, 2, 3) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) + local params = {} - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 3.00, 4.50 } -- TODO: Capture fTPs + params.element = xi.element.WIND - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/aeolian_void.lua b/scripts/actions/mobskills/aeolian_void.lua index af4736a3f7c..aad86b65003 100644 --- a/scripts/actions/mobskills/aeolian_void.lua +++ b/scripts/actions/mobskills/aeolian_void.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Aeolian Void --- Family: Sand Worm --- Description: Deals conal AoE Wind damage to targets in front of mob. Additional Effect: Blind, Silence +-- Family: Sandworm +-- Description: Deals Wind damage to enemies in front of mob. Additional Effect: Blind, Silence ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +13,19 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local damage = mob:getWeaponDmg() * 2 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.WIND - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 180) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 50, 0, 180) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 180) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 50, 0, 180) + end return damage end diff --git a/scripts/actions/mobskills/aerial_blast.lua b/scripts/actions/mobskills/aerial_blast.lua index ae8b14c9ac4..46d22e1dabb 100644 --- a/scripts/actions/mobskills/aerial_blast.lua +++ b/scripts/actions/mobskills/aerial_blast.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Aerial Blast --- Deals wind elemental damage to enemies within area of effect. +-- Family: Avatar (Garuda) +-- Description: Deals wind elemental damage to enemies within area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 3, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.WIND + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/aero_ii.lua b/scripts/actions/mobskills/aero_ii.lua index 0a89f2bc3ea..c8629f8413e 100644 --- a/scripts/actions/mobskills/aero_ii.lua +++ b/scripts/actions/mobskills/aero_ii.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Aero II --- Deals wind elemental damage. Damage varies with TP. +-- Family: Avatar (Garuda) +-- Description: Deals Wind elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } + params.element = xi.element.WIND + -- params.dStatMultiplier = 1 -- TODO: Do non astral flow abilities use a multiplier? - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/aero_iv.lua b/scripts/actions/mobskills/aero_iv.lua index 0e2e2dbc189..b4a0b7d2e82 100644 --- a/scripts/actions/mobskills/aero_iv.lua +++ b/scripts/actions/mobskills/aero_iv.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Aero IV --- Deals wind elemental damage. +-- Family: Avatar (Garuda) +-- Description: Deals Wind elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } + params.element = xi.element.WIND + -- params.dStatMultiplier = 1 -- TODO: Do non astral flow abilities use a multiplier? - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/aero_meeble_warble.lua b/scripts/actions/mobskills/aero_meeble_warble.lua index ef4827f7179..c9a1ca1d526 100644 --- a/scripts/actions/mobskills/aero_meeble_warble.lua +++ b/scripts/actions/mobskills/aero_meeble_warble.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Aero Meeble Warble --- AOE Wind Elemental damage, inflicts Silence and Choke (50 HP/tick). +-- Family: Meebles +-- Description: AOE Wind Elemental damage, inflicts Silence and Choke (50 HP/tick). ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,14 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9.00, 9.00, 9.00 } -- TODO: Capture fTPs + params.element = xi.element.WIND - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 0, 0, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CHOKE, 50, 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 0, 0, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CHOKE, 50, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/antimatter.lua b/scripts/actions/mobskills/antimatter.lua index b75f60b102b..fb598bc8834 100644 --- a/scripts/actions/mobskills/antimatter.lua +++ b/scripts/actions/mobskills/antimatter.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Antimatter --- --- Description: Single-target ranged Light damage (~700-1500), ignores Utsusemi. --- Type: Magical +-- Antimatter +-- Family: Ultima +-- Description: Deals Light damage to a single target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, 750, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + params.baseDamage = 750 + params.fTP = { 1, 1, 1 } + params.element = xi.element.LIGHT + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/aqua_ball.lua b/scripts/actions/mobskills/aqua_ball.lua index 4a670b44064..cb42a68600e 100644 --- a/scripts/actions/mobskills/aqua_ball.lua +++ b/scripts/actions/mobskills/aqua_ball.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Aqua Ball --- Deals Water damage in a splash area of effect. Additional effect: STR Down +-- Family: Pugils +-- Description: Deals Water damage in a splash area of effect. Additional Effect: STR Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,16 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 - local power = 20 - local tick = 3 - local duration = power * tick + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.50, 3.00 } + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, power, tick, duration) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, 10, 9, 180) + end return damage end diff --git a/scripts/actions/mobskills/aqua_blast.lua b/scripts/actions/mobskills/aqua_blast.lua index 44c3701dfad..f71ab27b263 100644 --- a/scripts/actions/mobskills/aqua_blast.lua +++ b/scripts/actions/mobskills/aqua_blast.lua @@ -1,12 +1,9 @@ ----------------------------------- --- Aqua Blast --- --- Description: Fires a blast of Water, dealing damage in a fan-shaped area. Additional effect: knockback --- Type: Magical (Water) --- Utsusemi/Blink absorb: Wipes shadows --- Range: Fan (cone) --- Note: There was not a lot of information about this spell available online, so --- the initial implementation is relatively basic. +-- Aqua Blast +-- Family: Ruszors +-- Description: Fires a blast of Water, dealing damage in a fan-shaped area. Additional Effect: Knockback +-- Note: There was not a lot of information about this spell available online, so +-- the initial implementation is relatively basic. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -22,12 +19,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2, 2, 2 } + params.element = xi.element.WATER + -- TODO: Capture knockback range - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end return damage end diff --git a/scripts/actions/mobskills/arctic_impact.lua b/scripts/actions/mobskills/arctic_impact.lua index d81ea982b02..09fcc5f58ac 100644 --- a/scripts/actions/mobskills/arctic_impact.lua +++ b/scripts/actions/mobskills/arctic_impact.lua @@ -1,7 +1,8 @@ ----------------------------------- -- Arctic Impact --- Deals Ice damage to enemies within range. --- Area of Effect is centered around caster. +-- Family: Bombs (Snolls) +-- Description: Deals Ice damage to enemies within range. +-- Note: Used by Snoll Tzar ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,10 +12,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 3, 0) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs. + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + end return damage end diff --git a/scripts/actions/mobskills/armor_buster.lua b/scripts/actions/mobskills/armor_buster.lua index b735e979829..66e71088ab9 100644 --- a/scripts/actions/mobskills/armor_buster.lua +++ b/scripts/actions/mobskills/armor_buster.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Armor_Buster --- Description: --- Type: Magical --- additional effect: WEIGHT +-- Armor Buster +-- Family: Ultima +-- Description: Deals Light damage to players in an area of effect. Additional Effect: Weight ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -16,13 +15,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 2.5, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 -- TODO: Capture fTP + params.fTP = { 7.5, 7.5, 7.5 } + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.WEIGHT, 20, 3, 45) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 20, 0, 45) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/artificial_gravity.lua b/scripts/actions/mobskills/artificial_gravity.lua index eaaaf1c37fc..fdb2cb1a763 100644 --- a/scripts/actions/mobskills/artificial_gravity.lua +++ b/scripts/actions/mobskills/artificial_gravity.lua @@ -1,7 +1,8 @@ ----------------------------------- -- Artifical Gravity --- Always single gear --- Damage plaus Weight effect +-- Family: Gear (Single) +-- Description: Deals Light damage to targets in range. Additional Effect: Weight +-- Notes: This is for gear mobs that only have a single gear at all times (Example: Not 1/3 gears). ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,16 +12,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local ftp = 2 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 15, 0, 60) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 15, 0, 60) -- TODO: Capture power/duration + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/artificial_gravity_1.lua b/scripts/actions/mobskills/artificial_gravity_1.lua index 74e20e34e69..9524422d1db 100644 --- a/scripts/actions/mobskills/artificial_gravity_1.lua +++ b/scripts/actions/mobskills/artificial_gravity_1.lua @@ -1,6 +1,7 @@ ----------------------------------- --- Artifical Gravity w/ Single gear --- Damage plus Weight effect +-- Artifical Gravity +-- Family: Gears (1/3) +-- Description: Deals Light damage to targets in range. Additional Effect: Weight ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,16 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local ftp = 2 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 15, 0, 60) - target:delHP(dmg) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 15, 0, 60) -- TODO: Capture power/duration + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/artificial_gravity_2.lua b/scripts/actions/mobskills/artificial_gravity_2.lua index baf2e1f4e8c..f4d5d1a6a22 100644 --- a/scripts/actions/mobskills/artificial_gravity_2.lua +++ b/scripts/actions/mobskills/artificial_gravity_2.lua @@ -1,6 +1,7 @@ ----------------------------------- --- Artifical Gravity w/ 2 Gears --- Damage plus Weight effect +-- Artifical Gravity +-- Family: Gears (2/3) +-- Description: Deals Light damage to targets in range. Additional Effect: Weight ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,16 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local ftp = 2 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 30, 0, 60) - target:delHP(dmg) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 30, 0, 60) -- TODO: Capture power/duration + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/artificial_gravity_3.lua b/scripts/actions/mobskills/artificial_gravity_3.lua index ca60b222373..ea5961baf35 100644 --- a/scripts/actions/mobskills/artificial_gravity_3.lua +++ b/scripts/actions/mobskills/artificial_gravity_3.lua @@ -1,6 +1,7 @@ ----------------------------------- --- Artifical Gravity W/ 3 gears --- Damage plus Weight effect +-- Artifical Gravity +-- Family: Gears (3/3) +-- Description: Deals Light damage to targets in range. Additional Effect: Weight ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,16 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local ftp = 2 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 60, 0, 60) - target:delHP(dmg) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 45, 0, 60) -- TODO: Capture power/duration + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/auroral_uppercut.lua b/scripts/actions/mobskills/auroral_uppercut.lua index b4514b44003..acd6c3eb055 100644 --- a/scripts/actions/mobskills/auroral_uppercut.lua +++ b/scripts/actions/mobskills/auroral_uppercut.lua @@ -1,5 +1,7 @@ ----------------------------------- --- Auroral Uppercut +-- Auroral Uppercut +-- Famiy: Prish +-- Description: Deals Light damage to target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -8,11 +10,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end + mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.LIGHT, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/auroral_wind.lua b/scripts/actions/mobskills/auroral_wind.lua index cb0d7ea268b..53e4d70af62 100644 --- a/scripts/actions/mobskills/auroral_wind.lua +++ b/scripts/actions/mobskills/auroral_wind.lua @@ -1,11 +1,8 @@ ----------------------------------- -- Auroral Wind --- -- Family: Aern --- Type: Magical --- Can be dispelled: N/A --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown cone +-- Description: Deals Light damage to targets in front of mob. Additional Effect: Silence +-- Notes: Base damage seems to be (Level * 2) or (Level * 3) at random. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,14 +12,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = 1 + mob:getMainLvl() * math.random(2, 3) + local params = {} - -- TODO: Needs damage scaling capture - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = 1 + mob:getMainLvl() * math.random(2, 3) + params.fTP = { 1.0, 1.0, 1.0 } + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/bai_wing.lua b/scripts/actions/mobskills/bai_wing.lua index 1a1cf46ea81..f6bd3f3dc6a 100644 --- a/scripts/actions/mobskills/bai_wing.lua +++ b/scripts/actions/mobskills/bai_wing.lua @@ -1,17 +1,14 @@ ----------------------------------- -- Bai Wing --- --- Description: A dust storm deals Earth damage to enemies within a very wide area of effect. Additional effect: Slow --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 30' radial. +-- Family: Wyrm (Earth) +-- Description: A dust storm deals Earth damage to enemies within a very wide area of effect. Additional Effect: Slow -- Notes: Used only by Ouryu and Cuelebre while flying. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getAnimationSub() ~= 1 then + if mob:getAnimationSub() ~= 1 then -- Not used while flying return 1 end @@ -19,13 +16,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.EARTH - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 3000, 0, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 9000, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/barofield.lua b/scripts/actions/mobskills/barofield.lua index e46f0acaf9e..67b32a1c91e 100644 --- a/scripts/actions/mobskills/barofield.lua +++ b/scripts/actions/mobskills/barofield.lua @@ -1,10 +1,7 @@ ----------------------------------- --- Barofield --- --- Description: Deals Wind damage to enemies within a fan-shaped area. Additional effect: Weight --- Type: Magical --- Ignores Shadows --- Range: 15' Cone +-- Barofield +-- Family: Hydra +-- Description: Deals Wind damage to enemies within a fan-shaped area. Additional Effect: Weight ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs + params.element = xi.element.WIND - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 25, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 25, 0, 60) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/binary_absorption.lua b/scripts/actions/mobskills/binary_absorption.lua index 018a7705eed..4f89fe3e748 100644 --- a/scripts/actions/mobskills/binary_absorption.lua +++ b/scripts/actions/mobskills/binary_absorption.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Binary Absorption --- Deals elemental damage to the target. Additional effect: Drain. --- Type: Magical --- Utsusemi/Blink absorb: 1 Shadows --- Range: Melee +-- Family: Thinker +-- Description: Drains HP ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() * 3.5, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, dmg)) + params.baseDamage = mob:getMainLvl() + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.DARK - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/binary_tap.lua b/scripts/actions/mobskills/binary_tap.lua index 2a4db24f11c..556ede7c7dc 100644 --- a/scripts/actions/mobskills/binary_tap.lua +++ b/scripts/actions/mobskills/binary_tap.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Binary Tap --- Attempts to absorb two buffs from a single target. --- Type: Magical --- Utsusemi/Blink absorb: Ignores Shadows --- Range: Melee --- Notes: Can be any (positive) buff, including food. +-- Family: Thinkers +-- Description: Steals up to 2 buffs from a target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,8 +12,8 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local dispel = nil - local count = 0 - local msg -- to be set later + local count = 0 + local msg -- To be set later for i = 1, 2 do dispel = mob:stealStatusEffect(target, bit.bor(xi.effectFlag.DISPELABLE, xi.effectFlag.FOOD)) @@ -27,7 +24,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) end if count == 0 then - msg = xi.msg.basic.SKILL_NO_EFFECT -- no effect + msg = xi.msg.basic.SKILL_NO_EFFECT -- No effect else msg = xi.msg.basic.DISAPPEAR_NUM end diff --git a/scripts/actions/mobskills/binding_microtube.lua b/scripts/actions/mobskills/binding_microtube.lua index 8c7a50ccd79..4937612eb6b 100644 --- a/scripts/actions/mobskills/binding_microtube.lua +++ b/scripts/actions/mobskills/binding_microtube.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Binding Microtube --- Deals Magic damage to target. Additional effect: Bind --- Used by Adelheid (Trust) +-- Description: Deals Magic damage to target. Additional Effect: Bind +-- Notes: Used by Adelheid (Trust) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 2.45, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 6.45, 6.45, 6.45 } -- TODO: Capture fTPs + params.element = xi.element.NONE + -- TODO: Capture shadow behavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE, { breakBind = false }) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 60) + end return damage end diff --git a/scripts/actions/mobskills/black_cloud.lua b/scripts/actions/mobskills/black_cloud.lua index 77cac5e493e..53bc00c663f 100644 --- a/scripts/actions/mobskills/black_cloud.lua +++ b/scripts/actions/mobskills/black_cloud.lua @@ -1,11 +1,7 @@ ----------------------------------- --- Black Cloud --- --- Description: A cloud deals Dark damage to enemies in an area of effect. Additional effect: Blind --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 15' radial --- Notes: +-- Black Cloud +-- Family: Skeletons +-- Description: A cloud deals Dark damage to enemies in an area of effect. Additional Effect: Blind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,11 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 1.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 20, 0, 420) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + -- TODO: Determine duration type(Random, Scaling based on TP, etc.) + -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=A683 + local duration = xi.mobskills.calculateDuration(skill:getTP(), 300, 420) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 20, 0, duration) + end return damage end diff --git a/scripts/actions/mobskills/blastbomb.lua b/scripts/actions/mobskills/blastbomb.lua index dd621a6ce2a..7a415c40a9e 100644 --- a/scripts/actions/mobskills/blastbomb.lua +++ b/scripts/actions/mobskills/blastbomb.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Blastbomb --- Deals Fire damage in an area of effect and bind. +-- Family: Orc Warmachine +-- Description: Deals Fire damage in an area of effect. Additional Effect: Bind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE, { breakBind = false }) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.FIRE - local duration = xi.mobskills.calculateDuration(skill:getTP(), 30, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, duration) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE, { breakBind = false }) + + local duration = xi.mobskills.calculateDuration(skill:getTP(), 30, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, duration) + end return damage end diff --git a/scripts/actions/mobskills/blazing_bound.lua b/scripts/actions/mobskills/blazing_bound.lua index 11cdae3ab67..2edd26efd49 100644 --- a/scripts/actions/mobskills/blazing_bound.lua +++ b/scripts/actions/mobskills/blazing_bound.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Blazing Bound --- Description: Deals fire damage to an enemy. --- Type: Magical (Fire) +-- Blazing Bound +-- Family: Limules +-- Description: Deals Fire damage to target. Additional Effect: Burn ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + -- TODO: Capture power/durations/ if it scales on level/tp + -- xi.mobskills.mobBuffMove(mob, xi.effect.DEFENSE_BOOST, 25, 0, 120) -- Need power/duration data + -- xi.mobskills.mobBuffMove(mob, xi.effect.MAGIC_DEF_BOOST, 25, 0, 120) -- Need power/duration data + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 26, 3, 120) + end return damage end diff --git a/scripts/actions/mobskills/blitzstrahl.lua b/scripts/actions/mobskills/blitzstrahl.lua index 96a2288736b..c7e4d2298d9 100644 --- a/scripts/actions/mobskills/blitzstrahl.lua +++ b/scripts/actions/mobskills/blitzstrahl.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Blitzstrahl --- --- Description: Deals lightning damage to an enemy. Additional effect: "Stun." --- Type: Magical (Lightning) +-- Blitzstrahl +-- Family: Dolls +-- Description: Deals Thunder damage to an enemy. Additional Effect: Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,11 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, 1.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.THUNDER + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + end return damage end diff --git a/scripts/actions/mobskills/blizzard_ii.lua b/scripts/actions/mobskills/blizzard_ii.lua index 1686e406145..80a02b5b943 100644 --- a/scripts/actions/mobskills/blizzard_ii.lua +++ b/scripts/actions/mobskills/blizzard_ii.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Blizzard II --- Deals ice elemental damage. Damage varies with TP. +-- Family: Avatars (Shiva) +-- Description: Deals Ice elemental damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.ICE + -- TODO: Does this also use dStatMultiplier like Astral Flow moves? - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + end return damage end diff --git a/scripts/actions/mobskills/blizzard_iv.lua b/scripts/actions/mobskills/blizzard_iv.lua index 0374ef4ace4..b725816aaae 100644 --- a/scripts/actions/mobskills/blizzard_iv.lua +++ b/scripts/actions/mobskills/blizzard_iv.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Blizzard IV --- Deals ice elemental damage. +-- Family: Avatars (Shiva) +-- Description: Deals Ice elemental damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs + params.element = xi.element.ICE + -- TODO: Does this also use dStatMultiplier like Astral Flow moves? - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + end return damage end diff --git a/scripts/actions/mobskills/blizzard_meeble_warble.lua b/scripts/actions/mobskills/blizzard_meeble_warble.lua index 23b5b1e1d32..7a05d5c9d91 100644 --- a/scripts/actions/mobskills/blizzard_meeble_warble.lua +++ b/scripts/actions/mobskills/blizzard_meeble_warble.lua @@ -10,16 +10,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9.00, 9.00, 9.00 } -- TODO: Capture fTPs + params.element = xi.element.ICE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 50, 0, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FROST, 50, 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - return damage + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 50, 0, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FROST, 50, 3, 60) + end end return mobskillObject diff --git a/scripts/actions/mobskills/blood_drain.lua b/scripts/actions/mobskills/blood_drain.lua index 55681da4df8..84b7fe56cec 100644 --- a/scripts/actions/mobskills/blood_drain.lua +++ b/scripts/actions/mobskills/blood_drain.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Blood Drain --- Steals an enemy's HP. Ineffective against undead. --- TODO: Needs 1.5 + dINT calc +-- Family: Giant Bats +-- Description: Steals an enemy's HP. Ineffective against undead. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,18 +11,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getMainLvl() + 2 - local shadow = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + local params = {} - -- Asanbosam uses a modified blood drain that ignores shadows - if mob:getPool() == xi.mobPool.ASANBOSAM then - shadow = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.DARK + params.dStatMultiplier = 1 + + local shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + + -- Asanbosam (Pool ID 256) uses a modified Blood Drain that ignores shadows + if mob:getPool() == xi.mobPools.ASANBOSAM then + shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, shadow) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, shadowBehavior, info.hitsLanded) - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/blood_saber.lua b/scripts/actions/mobskills/blood_saber.lua index 833b51711a8..edcd624d98a 100644 --- a/scripts/actions/mobskills/blood_saber.lua +++ b/scripts/actions/mobskills/blood_saber.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Blood Drain --- Steals an enemy's HP. Ineffective against undead. +-- Family: Skeletons +-- Family: Steals an enemy's HP. Ineffective against undead. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.DARK + params.dStatMultiplier = 1 - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/bloody_beak.lua b/scripts/actions/mobskills/bloody_beak.lua index 94aa1b96ce5..1e31ba742f9 100644 --- a/scripts/actions/mobskills/bloody_beak.lua +++ b/scripts/actions/mobskills/bloody_beak.lua @@ -5,8 +5,7 @@ -- Type: Magical -- Utsusemi/Blink absorb: Ignores Utsusemi -- Range: 5' --- Notes: Seems to be magical-based Drain. --- Witnessed Paladin taking lower damage from it than Ninja with Shell only. +-- TODO: Umeboshi: "This seems to be a physical skill, will fix it in the pass on mobPhysicalMove()" ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -16,12 +15,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } + params.element = xi.element.WIND + params.dStatMultiplier = 1 - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/bomb_toss.lua b/scripts/actions/mobskills/bomb_toss.lua index 9f9d8958f9e..1da739cec8b 100644 --- a/scripts/actions/mobskills/bomb_toss.lua +++ b/scripts/actions/mobskills/bomb_toss.lua @@ -1,21 +1,29 @@ ----------------------------------- -- Bomb Toss --- Throws a bomb at an enemy. +-- Family: Goblins +-- Description: Throws a bomb at an enemy. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: Bomb Toss suicide skill list weighting. return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/bomb_toss_suicide.lua b/scripts/actions/mobskills/bomb_toss_suicide.lua index b24e5f9c835..0cfd1d2ffd0 100644 --- a/scripts/actions/mobskills/bomb_toss_suicide.lua +++ b/scripts/actions/mobskills/bomb_toss_suicide.lua @@ -1,13 +1,17 @@ ----------------------------------- -- Bomb Toss - Suicide --- Throws a bomb at an enemy. Sometimes backfires. +-- Family: Goblins +-- Description: Bomb toss back fires, killing the mob as well as dealing Fire damage around it based on it's remaining HP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - -- notorious monsters shouldn't explode, nor dynamis - if mob:isMobType(xi.mobType.NOTORIOUS) or mob:isInDynamis() then + -- Notorious monsters and mobs in Dynamis shouldn't explode. + if + mob:isMobType(xi.mobType.NOTORIOUS) or + mob:isInDynamis() + then return 1 end @@ -15,12 +19,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * math.random(12, 18) * skill:getMobHPP() / 100) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() / 3 + params.fTP = { 1, 1, 1 } + params.element = xi.element.FIRE + -- TODO: Capture primary target/target type. (This will determine if this skill always goes off or if it can be canceled by outranging like normal bomb toss.) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + mob:setHP(0) return damage end diff --git a/scripts/actions/mobskills/burning_blade.lua b/scripts/actions/mobskills/burning_blade.lua index 50049e88b88..52b07893d74 100644 --- a/scripts/actions/mobskills/burning_blade.lua +++ b/scripts/actions/mobskills/burning_blade.lua @@ -1,26 +1,29 @@ ----------------------------------- -- Burning Blade --- --- Description: Deals fire elemental damage. Damage varies with TP. --- Type: Physical --- Utsusemi/Blink absorb: 1 Shadow? --- Range: Melee +-- Family: Humanoid Sword Weaponskill +-- Description: Deals Fire damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - mob:messageBasic(xi.msg.basic.READIES_WS, 0, 33) + -- mob:messageBasic(xi.msg.basic.READIES_WS, 0, 33) -- TODO: Is this needed? return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.DMG_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/calamitous_wind.lua b/scripts/actions/mobskills/calamitous_wind.lua index b8feeff4dfc..3a1ba6cb5e1 100644 --- a/scripts/actions/mobskills/calamitous_wind.lua +++ b/scripts/actions/mobskills/calamitous_wind.lua @@ -1,12 +1,8 @@ ----------------------------------- --- Calamitous Wind --- Mob Ability: 2433 --- Description: Destructive winds deal Wind damage to players in range. --- Additional effect: knockback + full dispel --- Type: Magical --- Utsusemi/Blink absorb: 2-3 shadows --- Range: 20' radial --- Notes: Only used by Zirnitra, Turul, and Amhuluk under 50% +-- Calamitous Wind +-- Family: Amphipteres +-- Description: Deals Wind damage to targets in range. Additional Effect: Full Dispel, Knockback +-- Notes: Used by Zirnitra, Turul, and Amhuluk under 50% ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -20,14 +16,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.WIND - -- TODO: Should print *each* effect dispelled in addition to damage taken. - target:dispelAllStatusEffect(bit.bor(xi.effectFlag.DISPELABLE, xi.effectFlag.FOOD)) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + -- TODO: Should print *each* effect dispelled in addition to damage taken. + target:dispelAllStatusEffect(bit.bor(xi.effectFlag.DISPELABLE, xi.effectFlag.FOOD)) + end return damage end diff --git a/scripts/actions/mobskills/chaos_blade.lua b/scripts/actions/mobskills/chaos_blade.lua index 953b106a7f7..8910a8e00f0 100644 --- a/scripts/actions/mobskills/chaos_blade.lua +++ b/scripts/actions/mobskills/chaos_blade.lua @@ -1,10 +1,7 @@ ----------------------------------- --- Chaos Blade --- --- Description: Deals Dark damage to enemies within a fan-shaped area. Additional effect: Curse --- Type: Magical --- Utsusemi/Blink absorb: Ignores Shadows --- Range: Melee +-- Chaos Blade +-- Family: Dragons +-- Description: Deals Dark damage to enemies within a fan-shaped area. Additional Effect: Curse ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,13 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } + params.element = xi.element.DARK + -- TODO: This move should force the mob to look at the target. - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 25, 0, 420) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + -- TODO: Capture power/durations (Varies between different mobs/NMs) + local power = 25 + local duration = 420 + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, power, 0, duration) + end return damage end diff --git a/scripts/actions/mobskills/charged_whisker.lua b/scripts/actions/mobskills/charged_whisker.lua index 13040c96327..a566099c32e 100644 --- a/scripts/actions/mobskills/charged_whisker.lua +++ b/scripts/actions/mobskills/charged_whisker.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Charged Whisker --- Deals Lightning damage to enemies within area of effect. +-- Family: Coeurls +-- Description: Deals Thunder damage to enemies within area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,10 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, 3, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.THUNDER + -- TODO: BST Jug fTPs + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + end return damage end diff --git a/scripts/actions/mobskills/choke_chain.lua b/scripts/actions/mobskills/choke_chain.lua index 85fccb5fe5e..d9214db0804 100644 --- a/scripts/actions/mobskills/choke_chain.lua +++ b/scripts/actions/mobskills/choke_chain.lua @@ -1,10 +1,8 @@ ----------------------------------- --- Roller Chain --- Only used by Ramparts when its door is closed --- Description: Single target Bind --- Type: Magical --- Utsusemi/Blink absorb: removes 2 shadows --- Range: 7' single target +-- Choke Chain +-- Family: Ramparts +-- Description: Inflicts Amnesia, Bind, Silence to a single target. +-- Notes: Only used by Ramparts when its door is closed. ----------------------------------- ---@type TMobSkill @@ -19,15 +17,14 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2 + -- TODO: JPWiki states messaging priority is Amnesia > Silence > Bind. + -- If this is true, we need a way to have a fall back to the next effect for skills that apply multiple effects. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_2) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) + skill:setMsg(xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.AMNESIA, 1, 0, 60)) -- TODO: Capture power - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) - - return damage + return xi.effect.AMNESIA end return mobskillObject diff --git a/scripts/actions/mobskills/circle_of_flames.lua b/scripts/actions/mobskills/circle_of_flames.lua index e5bb388232b..f98be1b2ac7 100644 --- a/scripts/actions/mobskills/circle_of_flames.lua +++ b/scripts/actions/mobskills/circle_of_flames.lua @@ -1,38 +1,52 @@ ----------------------------------- --- Circle of Flames --- --- Description: Deals damage to targets in an area of effect. Additional effect: Weight --- Type: Magical --- Utsusemi/Blink absorb: Wipes --- Range: 10' radial +-- Circle of Flames +-- Family: Clusters +-- Description: Deals Fire damage to targets in an area of effect. Additional Effect: Weight ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + if mob:getAnimationSub() == 2 then -- 1 bomb left + return 1 + end + return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + -- Determine number of bombs exploded based on animation sub -- 3/4 or 11/12 = 3 bombs remaining (0 exploded) -- 5 or 13 = 2 bombs remaining (1 exploded) + + -- TODO: Standardize spawn animation subs for clusters. local animation = mob:getAnimationSub() local bombsExploded = 0 + if animation == 5 or animation == 13 then bombsExploded = 1 elseif animation == 6 or animation == 14 then bombsExploded = 2 end - local damage = (mob:getMainLvl() + 2) + (25 * bombsExploded) + local bombBonusDamage = 25 * bombsExploded + + params.baseDamage = mob:getMainLvl() + 2 + params.additiveDamage = { bombBonusDamage, bombBonusDamage, bombBonusDamage } + params.fTP = { 0.5, 0.5, 0.5 } + params.element = xi.element.FIRE + -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 0.5, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.WEIGHT, 20, 0, 120) + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.WEIGHT, 20, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/citadel_buster.lua b/scripts/actions/mobskills/citadel_buster.lua index c99fffcc197..dcadc6253be 100644 --- a/scripts/actions/mobskills/citadel_buster.lua +++ b/scripts/actions/mobskills/citadel_buster.lua @@ -1,11 +1,7 @@ ----------------------------------- -- Citadel Buster --- Deals extreme Light damage to players in an area of effect. --- Additional effect: Enmity reset --- Damage can be approximated based on Calculating Weapon Skill Damage as a magical WS with a level of 85, fTP of 6 and MAB of 4.0. Or, more simply: --- 2088/(1+MDB%) * (256-MDT)/256 (no day/weather bonus) --- 2608/MDB * (256-MDT)/256 (weather bonus) --- 2816/MDB * (256-MDT)/256 (day+weather bonus) +-- Family: Ultima (Proto-Ultima) +-- Description: Deals extreme Light damage to players in an area of effect. Additional Effect: Enmity reset ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,30 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local basedmg = 2088 + local params = {} - if - mob:getWeather() == xi.weather.AURORAS or - mob:getWeather() == xi.weather.STELLAR_GLARE - then - basedmg = basedmg + 520 - end + params.baseDamage = 2088 + params.fTP = { 1, 1, 1 } + params.element = xi.element.LIGHT - if VanadielDayElement() == xi.element.LIGHT then - basedmg = basedmg + 208 - end + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - local damage = basedmg / (1 + (target:getMod(xi.mod.MDEF) / 100)) - local info = - { - damage = damage - } - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) - target:takeDamage(dmg, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) - mob:resetEnmity(target) + mob:resetEnmity(target) + end - return dmg + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/clarsach_call.lua b/scripts/actions/mobskills/clarsach_call.lua index 9b1d76474b4..52ad682d2b3 100644 --- a/scripts/actions/mobskills/clarsach_call.lua +++ b/scripts/actions/mobskills/clarsach_call.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Clarsach Call +-- Family: Avatar (Siren) +-- Description: Deals Wind damage to targets in range. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2.5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7.0, 7.0, 7.0 } -- TODO: Capture fTPs + params.element = xi.element.WIND + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/cold_wave.lua b/scripts/actions/mobskills/cold_wave.lua index 763fad9a950..389c994d7d8 100644 --- a/scripts/actions/mobskills/cold_wave.lua +++ b/scripts/actions/mobskills/cold_wave.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Cold Wave --- Description: Deals ice damage that lowers Agility and gradually reduces HP of enemies within range. --- Type: Magical (Ice) +-- Cold Wave +-- Family: Bombs (Snolls) +-- Description: Inflicts Frost effect that lowers Agility and gradually reduces HP of enemies within range. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,6 +11,10 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) + -- TODO: Capture possible scaling + -- Jimmayus spreadsheet states 14-15HP/tick. Might scale with level. + -- local power = mob:getMainLvl() / 5 * 0.6 + 6 + skill:setMsg(xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FROST, 14, 3, 60)) return xi.effect.FROST diff --git a/scripts/actions/mobskills/core_meltdown.lua b/scripts/actions/mobskills/core_meltdown.lua index 2d6ee44e516..062ea2ef0bd 100644 --- a/scripts/actions/mobskills/core_meltdown.lua +++ b/scripts/actions/mobskills/core_meltdown.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Core Meltdown (Ghrah) -- Reactor core fails and self-destructs, damaging any nearby targets. --- Note: Very rare, estimated 5% chance +-- Note: Very rare, estimated 5% chance. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,11 +9,11 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) if mob:isMobType(xi.mobType.NOTORIOUS) then return 1 - elseif mob:getAnimationSub() ~= 0 then -- form check + elseif mob:getAnimationSub() ~= 0 then -- Form check (Must be ball form) return 1 - elseif mob:getHPP() > 30 then -- 30% HP threshold + elseif mob:getHPP() > 30 then -- Can only be used under 30% HP return 1 - elseif math.random(1, 100) >= 5 then -- here's the 95% chance to not blow up + elseif math.random(1, 100) >= 5 then -- Here's the 95% chance to not blow up return 1 else return 0 @@ -21,12 +21,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getHP() * 0.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() / 2 + params.fTP = { 1, 1, 1 } + params.element = xi.element.FIRE -- TODO: The damage type should be based off of the Ghrah's element. + -- TODO: Can this be outranged? Or is it guaranteed to go off? - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + end return damage end diff --git a/scripts/actions/mobskills/corrosive_ooze.lua b/scripts/actions/mobskills/corrosive_ooze.lua index 03ea4393a65..57e9d9680c1 100644 --- a/scripts/actions/mobskills/corrosive_ooze.lua +++ b/scripts/actions/mobskills/corrosive_ooze.lua @@ -1,11 +1,7 @@ ----------------------------------- --- Corrosive Ooze --- Family: Slugs --- Description: Deals water damage to an enemy. Additional Effect: Attack Down and Defense Down. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Radial --- Notes: +-- Corrosive Ooze +-- Family: Slugs +-- Description: Deals Water damage to an enemy. Additional Effect: Attack Down, Defense Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,14 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4.2 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, 15, 0, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEFENSE_DOWN, 15, 0, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + -- TODO: Capture power/durations + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, 15, 0, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEFENSE_DOWN, 15, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/cosmic_elucidation.lua b/scripts/actions/mobskills/cosmic_elucidation.lua index fb7872353d5..a51ed32ec4c 100644 --- a/scripts/actions/mobskills/cosmic_elucidation.lua +++ b/scripts/actions/mobskills/cosmic_elucidation.lua @@ -1,24 +1,32 @@ ----------------------------------- --- Cosmic Elucidation --- Description: Cosmic Elucidation inflicts heavy AOE damage to everyone in the battle. --- Type: --- Utsusemi/Blink absorb: Ignores shadows --- Range: --- Notes: Ejects all combatants from the battlefield, resulting in a failure. +-- Cosmic Elucidation +-- Family: Tenzen +-- Description: Cosmic Elucidation inflicts heavy AOE damage to everyone in the battle. +-- Notes: Ejects all combatants from the battlefield, resulting in a failure. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 1 -- only scripted use + return 1 -- Only scripted use end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.LIGHT, 14, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, 0) + local params = {} - target:takeDamage(damage, mob, xi.attackType.SPECIAL, xi.damageType.ELEMENTAL) - skill:setMsg(xi.msg.basic.SKILLCHAIN_COSMIC_ELUCIDATION) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 21, 21, 21 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + damage = math.max(0, damage) -- Cosmic Elucidation does not have an absorb message. + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.SPECIAL, xi.damageType.ELEMENTAL) + + skill:setMsg(xi.msg.basic.SKILLCHAIN_COSMIC_ELUCIDATION) + end return damage end diff --git a/scripts/actions/mobskills/crispy_candle.lua b/scripts/actions/mobskills/crispy_candle.lua index 4944cfc7a4e..bb7a8e7bc38 100644 --- a/scripts/actions/mobskills/crispy_candle.lua +++ b/scripts/actions/mobskills/crispy_candle.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Crispy Candle --- Fires a blowtorch at targets in a fan-shaped area of effect. +-- Family: Moblins +-- Description: Deals Fire damage to targets in a fan-shaped area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/crispy_candle_self.lua b/scripts/actions/mobskills/crispy_candle_self.lua new file mode 100644 index 00000000000..13e01344bd8 --- /dev/null +++ b/scripts/actions/mobskills/crispy_candle_self.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Crispy Candle (Self) +-- Family: Moblin +-- Description: Crispy Candle backfires, dealing Fire damage to mob. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1 + params.resistTierOverride = 0.25 -- 1/4 Resist + -- Jimmayus spreadsheet stats Crispy Candle backfire is a 1/4 resist. + -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=A1102 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/cryo_jet.lua b/scripts/actions/mobskills/cryo_jet.lua index e741d6fc56d..44ece33cc56 100644 --- a/scripts/actions/mobskills/cryo_jet.lua +++ b/scripts/actions/mobskills/cryo_jet.lua @@ -2,6 +2,7 @@ -- Cryo Jet -- Family: Ultima -- Description: Deals Ice breath damage to targets in front of mob. Additional Effect: Paralysis +-- additional effect : Paralyze ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,16 +13,13 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - - params.percentMultipier = 0.05 - params.damageCap = 490 - params.bonusDamage = 0 - params.mAccuracyBonus = { 0, 0, 0 } - params.resistStat = xi.mod.INT - params.element = xi.element.ICE - params.attackType = xi.attackType.BREATH - params.damageType = xi.damageType.ICE - params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.percentMultipier = 0.05 -- TODO: Capture HP multiplier/threshhold. + params.element = xi.element.ICE + params.damageCap = 490 + params.bonusDamage = 0 + params.mAccuracyBonus = { 0, 0, 0 } + params.resistStat = xi.mod.INT + params.resistStat = xi.mod.INT local info = xi.mobskills.mobBreathMove(mob, target, skill, action, params) @@ -34,7 +32,6 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) end end - mob:setLocalVar('nuclearWaste', 0) -- TODO: Migrate logic to mob script. return info.damage diff --git a/scripts/actions/mobskills/crystal_rain.lua b/scripts/actions/mobskills/crystal_rain.lua index 75b4d5950f7..dac8c3bef42 100644 --- a/scripts/actions/mobskills/crystal_rain.lua +++ b/scripts/actions/mobskills/crystal_rain.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Crystal Rain --- Invokes the power of a crystal to deal Light damage to targets in an area of effect. --- Range: 15' radial +-- Family: Golems +-- Description: Invokes the power of a crystal to deal unaspected magic damage to targets in an area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.NONE, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.NONE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + end return damage end diff --git a/scripts/actions/mobskills/crystal_weapon_fire.lua b/scripts/actions/mobskills/crystal_weapon_fire.lua index 7b80c6c11fc..c4147f95338 100644 --- a/scripts/actions/mobskills/crystal_weapon_fire.lua +++ b/scripts/actions/mobskills/crystal_weapon_fire.lua @@ -1,11 +1,7 @@ ----------------------------------- --- Crystal Weapon --- --- Description: Invokes the power of a crystal to deal magical damage of a random element to a single target. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown --- Notes: Can be Fire, Earth, Wind, or Water element. Functions even at a distance (outside of melee range). +-- Crystal Weapon (Fire) +-- Family: Golems +-- Description: Invokes the power of a crystal to deal Fire damage to a single target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,10 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + -- TODO: Dynamis NM: Suttung applies Plague debuff. + end return damage end diff --git a/scripts/actions/mobskills/crystal_weapon_stone.lua b/scripts/actions/mobskills/crystal_weapon_stone.lua index 0408308adc0..61b1802fe7e 100644 --- a/scripts/actions/mobskills/crystal_weapon_stone.lua +++ b/scripts/actions/mobskills/crystal_weapon_stone.lua @@ -1,11 +1,7 @@ ----------------------------------- --- Crystal Weapon --- --- Description: Invokes the power of a crystal to deal magical damage of a random element to a single target. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown --- Notes: Can be Fire, Earth, Wind, or Water element. Functions even at a distance (outside of melee range). +-- Crystal Weapon (Earth) +-- Family: Golems +-- Description: Invokes the power of a crystal to deal Earth damage to a single target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,10 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.EARTH, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.EARTH + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + -- TODO: Dynamis NM: Suttung applies Petrification debuff. + end return damage end diff --git a/scripts/actions/mobskills/crystal_weapon_water.lua b/scripts/actions/mobskills/crystal_weapon_water.lua index d0d50952667..1303aac181a 100644 --- a/scripts/actions/mobskills/crystal_weapon_water.lua +++ b/scripts/actions/mobskills/crystal_weapon_water.lua @@ -1,11 +1,7 @@ ----------------------------------- --- Crystal Weapon --- --- Description: Invokes the power of a crystal to deal magical damage of a random element to a single target. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown --- Notes: Can be Fire, Earth, Wind, or Water element. Functions even at a distance (outside of melee range). +-- Crystal Weapon (Water) +-- Family: Golems +-- Description: Invokes the power of a crystal to deal Water damage to a single target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,10 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.WATER + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + -- TODO: Dynamis NM: Suttung applies Poison debuff. + end return damage end diff --git a/scripts/actions/mobskills/crystal_weapon_wind.lua b/scripts/actions/mobskills/crystal_weapon_wind.lua index b9044590fce..ee2f0a4c9f3 100644 --- a/scripts/actions/mobskills/crystal_weapon_wind.lua +++ b/scripts/actions/mobskills/crystal_weapon_wind.lua @@ -1,11 +1,7 @@ ----------------------------------- --- Crystal Weapon --- --- Description: Invokes the power of a crystal to deal magical damage of a random element to a single target. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown --- Notes: Can be Fire, Earth, Wind, or Water element. Functions even at a distance (outside of melee range). +-- Crystal Weapon (Wind) +-- Family: Golems +-- Description: Invokes the power of a crystal to deal Wind damage to a single target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,10 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.WIND + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + -- TODO: Dynamis NM: Suttung applies Weight debuff. + end return damage end diff --git a/scripts/actions/mobskills/cursed_sphere.lua b/scripts/actions/mobskills/cursed_sphere.lua index dbb5e26e238..d3b9b8c48ba 100644 --- a/scripts/actions/mobskills/cursed_sphere.lua +++ b/scripts/actions/mobskills/cursed_sphere.lua @@ -1,8 +1,8 @@ ----------------------------------- --- Cursed Sphere --- Description: Deals water damage to enemies within area of effect. --- Type: Magical: Dark --- Utsusemi/Blink absorb: Ignores shadows +-- Cursed Sphere +-- Family: Fly +-- Description: Deals Dark damage to enemies within area of effect. +-- Notes: BLU spell deals Water damage but mob version deals Dark damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,10 +12,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.DARK + -- TODO: BST Jugpet fTPs + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/cyclone_wing.lua b/scripts/actions/mobskills/cyclone_wing.lua index 6a9c21164d2..0e86f3703c2 100644 --- a/scripts/actions/mobskills/cyclone_wing.lua +++ b/scripts/actions/mobskills/cyclone_wing.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Cyclone Wing --- --- Description: Deals darkness damage to enemies within a very wide area of effect. Additional effect: Sleep +-- Family: Wyrm (Vrtra) +-- Description: Deals darkness damage to enemies within a very wide area of effect. Additional Effect: Sleep -- Type: Magical -- Utsusemi/Blink absorb: Wipes shadows -- Range: 30' radial. @@ -22,10 +22,17 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLEEP_I, 1, 0, 60) return damage diff --git a/scripts/actions/mobskills/cyclonic_torrent.lua b/scripts/actions/mobskills/cyclonic_torrent.lua index 76ac7ca45b8..50125af0e21 100644 --- a/scripts/actions/mobskills/cyclonic_torrent.lua +++ b/scripts/actions/mobskills/cyclonic_torrent.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Cyclonic Torrent --- --- Description: Area of Effect damage plus Mute to those in range. --- Type: Enfeebling --- Utsusemi/Blink absorb: Wipes Shadows --- Range: 20' radial --- Notes: Only used by Urd, Verthandi, and Carabosse. +-- Cyclonic Torrent +-- Family: Pixies +-- Description: Deals Wind damage to targets in range. Additional Effect: Mute +-- Notes: Used by Urd, Verthandi, and Carabosse. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,16 +12,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local ftp = 2.5 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) + local params = {} - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MUTE, 1, 0, 60) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs + params.element = xi.element.WIND - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + -- TODO: Capture duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MUTE, 1, 0, 60) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/cyclonic_turmoil.lua b/scripts/actions/mobskills/cyclonic_turmoil.lua index 67adb370f8e..c34ee29553e 100644 --- a/scripts/actions/mobskills/cyclonic_turmoil.lua +++ b/scripts/actions/mobskills/cyclonic_turmoil.lua @@ -1,8 +1,8 @@ ----------------------------------- -- Cyclonic Turmoil --- --- Deals Wind damage in an area of effect. Additional effect: Knockback & Dispel --- Notes: Dispels multiple buffs. Wipes shadows. +-- Family: Pixies +-- Deals Wind damage in an area of effect. Additional Effect: Dispel, Knockback +-- Notes: Dispels all buffs except Food. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,32 +12,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2.8 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.WIND - local dispel1 = target:dispelStatusEffect() - local dispel2 = target:dispelStatusEffect() - local total = 0 + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - if dispel1 ~= xi.effect.NONE then - total = total + 1 - end + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - if dispel2 ~= xi.effect.NONE then - total = total + 1 + target:dispelAllStatusEffect(xi.effectFlag.DISPELABLE) end - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - - if total == 0 then - return damage - else - skill:setMsg(xi.msg.basic.DISAPPEAR_NUM) - - return total - end + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/dark_mist.lua b/scripts/actions/mobskills/dark_mist.lua index 353ec6f813b..51c6133efa7 100644 --- a/scripts/actions/mobskills/dark_mist.lua +++ b/scripts/actions/mobskills/dark_mist.lua @@ -1,17 +1,14 @@ ----------------------------------- --- Dark Mist --- Family: Gargouille --- Description: Deals dark damage to an enemy. Additional effect: Weight --- Type: Magical (dark) --- Utsusemi/Blink absorb: Ignores shadows --- Range: Radial --- Notes: Only used when flying +-- Dark Mist +-- Family: Gargouille +-- Description: Deals Dark damage to an enemy. Additional Effect: Weight +-- Notes: Only used when flying ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getAnimationSub() ~= 5 then + if mob:getAnimationSub() ~= 5 then -- Only used while flying return 1 end @@ -19,13 +16,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 50, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 50, 0, 60) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/dark_nova.lua b/scripts/actions/mobskills/dark_nova.lua index 79d9469a32b..fa2736e0099 100644 --- a/scripts/actions/mobskills/dark_nova.lua +++ b/scripts/actions/mobskills/dark_nova.lua @@ -1,5 +1,8 @@ ----------------------------------- -- Dark Nova +-- Family: Shadow Lord +-- Description: Deals Dark damage to targets around mob. +-- Notes: Used by Shadow Lord while in magic immune state. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,10 +16,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.MAB_BONUS) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/dark_orb.lua b/scripts/actions/mobskills/dark_orb.lua index 26ab016e459..22352e80df0 100644 --- a/scripts/actions/mobskills/dark_orb.lua +++ b/scripts/actions/mobskills/dark_orb.lua @@ -1,17 +1,14 @@ ----------------------------------- --- Dark Orb --- Family: Gargouille --- Description: Deals dark damage to an enemy. --- Type: Magical (dark) --- Utsusemi/Blink absorb: Ignores shadows --- Range: Radial --- Notes: Only used when flying +-- Dark Orb +-- Family: Gargouille +-- Description: Deals Dark damage to an enemy. +-- Notes: Only used when flying ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getAnimationSub() ~= 5 then + if mob:getAnimationSub() ~= 5 then -- Only used while flying return 1 else return 0 @@ -19,12 +16,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5.5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.5, 5.5, 5.5 } -- TODO: Capture fTPs + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/dark_sphere.lua b/scripts/actions/mobskills/dark_sphere.lua index a4450922a96..e48943cd327 100644 --- a/scripts/actions/mobskills/dark_sphere.lua +++ b/scripts/actions/mobskills/dark_sphere.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Dark Sphere --- Description: Deals Dark damage to a single target. Additional effect: Blind --- Type: Magical (Dark) --- Utsusemi/Blink absorb: 1 Shadow --- Range: 7.0' +-- Family: Ghosts +-- Description: Deals Dark damage to targets in a fan-shaped area of effect. Additional Effect: Blind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,11 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 3.0, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 20, 0, 300) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 20, 0, 300) + end return damage end diff --git a/scripts/actions/mobskills/dark_wave.lua b/scripts/actions/mobskills/dark_wave.lua index 91686fd646b..8731d5e00c9 100644 --- a/scripts/actions/mobskills/dark_wave.lua +++ b/scripts/actions/mobskills/dark_wave.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Dark Wave --- --- Description: A wave of dark energy washes over targets in an area of effect. Additional effect: Bio --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: 10' radial --- Notes: Severity of Bio effect varies by time of day, from 8/tic at midday to 20/tic at midnight. +-- Dark Wave +-- Family: Bombs (Dijin) +-- Description: Deals Dark damage to targets in range. Additional Effect: Bio +-- Notes: Severity of Bio effect varies by time of day, from 8/tic at midday to 20/tic at midnight. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,19 +12,31 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 - local hour = VanadielHour() - local power = 8 + local params = {} - if hour > 12 then - power = 8 + hour - 11 - end + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } -- TODO: Capture fTPs + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local hour = VanadielHour() + local power = 8 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIO, power, 3, 60) + -- TODO: Need to capture value for Bio effect's ATTP reduction. + -- Does it scale with time of day as well or is it static? + local attPercReduction = 10 -- Set to Bio I value for now. + + if hour > 12 then + power = 8 + hour - 11 + end + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIO, power, 3, 60, 0, attPercReduction) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/death_ray.lua b/scripts/actions/mobskills/death_ray.lua index e040e4e77fd..5643b55bec7 100644 --- a/scripts/actions/mobskills/death_ray.lua +++ b/scripts/actions/mobskills/death_ray.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Death Ray --- --- Description: Deals dark damage to an enemy. --- Type: Magical (Dark) +-- Death Ray +-- Family: Hecteyes +-- Description: Deals Dark damage to an enemy. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getMainLvl() * 4.5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + params.fTP = { 3.0, 3.75, 4.50 } + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/decayed_filament.lua b/scripts/actions/mobskills/decayed_filament.lua index dbb7c91fcf8..9518d82ee5f 100644 --- a/scripts/actions/mobskills/decayed_filament.lua +++ b/scripts/actions/mobskills/decayed_filament.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Decayed Filament --- Zedi, while in Animation form 2 (Bars) --- Blinkable 1-2 hit, addtional effect poison on hit. +-- Family: Zedi, while in Animation form 2 (Bars) +-- Description: Deals Water damage to targets in range. Additional Effect: Poison ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, math.random(1, 2), xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.NUMSHADOWS_2) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.5, 2.0 } + params.element = xi.element.WATER + -- TODO: Capture shadowBehavior - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 18, 3, 180) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.NUMSHADOWS_2, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 18, 3, 180) + end return damage end diff --git a/scripts/actions/mobskills/decussate.lua b/scripts/actions/mobskills/decussate.lua index 2e77bb15c96..f0cdaa78db9 100644 --- a/scripts/actions/mobskills/decussate.lua +++ b/scripts/actions/mobskills/decussate.lua @@ -6,6 +6,8 @@ -- Utsusemi/Blink absorb: 2-3 shadows? -- Range: Less than or equal to 10.0 -- Notes: Unlocked at 20% hp +-- +-- TODO: Umeboshi: "This is a physical skill, will adjust in mobPhysicalMove() pass" ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -19,12 +21,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.EARTH - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1.2, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, math.random(2, 3)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + end return damage end diff --git a/scripts/actions/mobskills/diamond_dust.lua b/scripts/actions/mobskills/diamond_dust.lua index 896b61f05dc..71819075f48 100644 --- a/scripts/actions/mobskills/diamond_dust.lua +++ b/scripts/actions/mobskills/diamond_dust.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Diamond Dust --- Deals ice elemental damage to enemies within area of effect. +-- Family: Avatar (Shiva) +-- Description: Deals Ice elemental damage to enemies within area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 3, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.ICE + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + end return damage end diff --git a/scripts/actions/mobskills/dice_damage.lua b/scripts/actions/mobskills/dice_damage.lua index 524cff9334c..6e20a9eceb4 100644 --- a/scripts/actions/mobskills/dice_damage.lua +++ b/scripts/actions/mobskills/dice_damage.lua @@ -1,7 +1,8 @@ ----------------------------------- --- Goblin Dice --- Description: Deals thunder damage. --- Type: Magical (Water) +-- Goblin Dice (Damage) +-- Family: Goblins +-- Description: Deals Thunder damage. +-- Notes: Used by Goblins in Dynamis. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +12,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 6 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + end return damage end diff --git a/scripts/actions/mobskills/diffusion_ray.lua b/scripts/actions/mobskills/diffusion_ray.lua index 8934b9559a2..af2f7b77d23 100644 --- a/scripts/actions/mobskills/diffusion_ray.lua +++ b/scripts/actions/mobskills/diffusion_ray.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Diffusion Ray --- Family: Chariots --- Description: Deals damage to enemies within a fan-shaped area originating from the caster. +-- Family: Chariot +-- Description: Deals Light damage to enemies within a fan-shaped area originating from the caster. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,20 +13,20 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.percentMultipier = 0.20 - params.damageCap = 500 - params.bonusDamage = 0 - params.mAccuracyBonus = { 0, 0, 0 } - params.resistStat = xi.mod.MND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } params.element = xi.element.LIGHT - params.attackType = xi.attackType.BREATH - params.damageType = xi.damageType.LIGHT - params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobBreathMove(mob, target, skill, action, params) + -- TODO: Pulled from JP Wiki. Need captures to confirm. + params.dStatAttackerMod = xi.mod.MND + params.dStatDefenderMod = xi.mod.MND - if xi.mobskills.processDamage(mob, target, skill, action, info) then - target:takeDamage(info.damage, mob, info.attackType, info.damageType) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) end return info.damage diff --git a/scripts/actions/mobskills/digest.lua b/scripts/actions/mobskills/digest.lua index 2a1d2d34a63..12c1c7129a7 100644 --- a/scripts/actions/mobskills/digest.lua +++ b/scripts/actions/mobskills/digest.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Digest --- Deals dark damage to a single target. Additional effect: Drain --- Type: Magical --- Utsusemi/Blink absorb: 1 shadow --- Range: Melee +-- Family: Slimes +-- Deals Dark damage to a single target. Additional Effect: HP Drain -- Notes: If used against undead, it will simply do damage and not drain HP. ----------------------------------- ---@type TMobSkill @@ -20,10 +18,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/discharge.lua b/scripts/actions/mobskills/discharge.lua index f9d984e1482..1e3e487c3a5 100644 --- a/scripts/actions/mobskills/discharge.lua +++ b/scripts/actions/mobskills/discharge.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Discharge --- Description: Deals lightning damage. Additional effect: "Paralysis" --- Type: Magical (lightning) --- Utsusemi/Blink absorb: Wipes shadows --- Range: Aoe +-- Discharge +-- Family: Chariot +-- Description: Deals Thunder damage. Additional Effect: Paralysis ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1.75, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } + params.element = xi.element.THUNDER + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 20, 0, 180) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 20, 0, 180) -- TODO: Capture poer/duration + end return damage end diff --git a/scripts/actions/mobskills/discoid.lua b/scripts/actions/mobskills/discoid.lua index c1627ec2086..fe6a2f91a77 100644 --- a/scripts/actions/mobskills/discoid.lua +++ b/scripts/actions/mobskills/discoid.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Discoid +-- Family: Chariots +-- Description: Deals damage spread evenly among party members in range of target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,16 +11,30 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local needles = 10000 / skill:getTotalTargets() - local info = - { - damage = needles - } - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(dmg, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + params.baseDamage = 1000 / skill:getTotalTargets() -- TODO: Need captures(See below) + params.fTP = { 1, 1, 1 } + params.element = xi.element.NONE -- TODO: Light or Unaspected? - return dmg + -- TODO: getPool() or skill:getID() might be better here once captured. + -- TODO: These values are pulled from online sources. Need official captures from each mob as they likely use different values. + if mob:getName() == 'Pandemonium_Warden' then + params.baseDamage = 10000 / skill:getTotalTargets() + elseif mob:getName() == 'Battleclad_Chariot' then + params.baseDamage = 4400 / skill:getTotalTargets() + elseif mob:getName() == 'Battledressed_Chariot' then + params.baseDamage = 4400 / skill:getTotalTargets() + end + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/divine_judgment.lua b/scripts/actions/mobskills/divine_judgment.lua index d09b5fe19c4..3fe1b2f3f94 100644 --- a/scripts/actions/mobskills/divine_judgment.lua +++ b/scripts/actions/mobskills/divine_judgment.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Diving Judgement +-- Divine Judgment +-- Family: Avatar (Alexander) -- Description: Deals Light elemental damage to enemies within area of effect. --- Type: Magical (Light) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 8 - local dmgMod = 2.5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, dmgMod, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 20, 20, 20 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/divine_spear.lua b/scripts/actions/mobskills/divine_spear.lua index a0ef879f006..f10705e2f98 100644 --- a/scripts/actions/mobskills/divine_spear.lua +++ b/scripts/actions/mobskills/divine_spear.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Divine Spear +-- Family: Avatar (Alexander) -- Description: Deals Light elemental damage within conal area of effect. --- Type: Magical (Light) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -16,12 +16,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 2.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 12.5, 12.5, 12.5 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/doctors_orders.lua b/scripts/actions/mobskills/doctors_orders.lua index 335de6674ec..417e4c91bf6 100644 --- a/scripts/actions/mobskills/doctors_orders.lua +++ b/scripts/actions/mobskills/doctors_orders.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Doctor's Orders +-- Family: Humanoid (Trust: Shantotto II) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,12 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2.8 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.NONE, xi.damageType.NONE, 1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs + params.element = xi.element.NONE - target:takeDamage(damage, mob, xi.attackType.NONE, xi.damageType.NONE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.NONE, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.NONE, xi.damageType.NONE) + end return damage end diff --git a/scripts/actions/mobskills/double_ray.lua b/scripts/actions/mobskills/double_ray.lua index 61de2b8ae90..6bed56e6b0a 100644 --- a/scripts/actions/mobskills/double_ray.lua +++ b/scripts/actions/mobskills/double_ray.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Double Ray --- Description: An energy ray zaps a single target. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Melee +-- Double Ray +-- Family: Magic Pots +-- Description: An energy ray zaps a single target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.NONE, 2.25, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.25, 2.25, 2.25 } -- TODO: Capture fTP scaling + params.element = xi.element.NONE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + end return damage end diff --git a/scripts/actions/mobskills/drain_whip.lua b/scripts/actions/mobskills/drain_whip.lua index d385febff8e..7ca8734ae16 100644 --- a/scripts/actions/mobskills/drain_whip.lua +++ b/scripts/actions/mobskills/drain_whip.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Drain Whip +-- Family: Morbols -- Description: Drains HP, MP, or TP from the target. --- Type: Magical --- Utsusemi/Blink absorb: ignores shadows --- Range: Melee ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 - local drainTable = { xi.mobskills.drainType.HP, xi.mobskills.drainType.MP, xi.mobskills.drainType.TP } + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + -- TODO: Is this magical or physical? Need captures + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, drainTable[math.random(1, 3)], damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + local drainTable = { xi.mobskills.drainType.HP, xi.mobskills.drainType.MP, xi.mobskills.drainType.TP } + + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, drainTable[math.random(1, 3)], damage)) + end return damage end diff --git a/scripts/actions/mobskills/drainkiss.lua b/scripts/actions/mobskills/drainkiss.lua index d4aefef104a..eb510fb56c3 100644 --- a/scripts/actions/mobskills/drainkiss.lua +++ b/scripts/actions/mobskills/drainkiss.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Drainkiss --- Deals dark damage to a single target. Additional effect: Drain --- Type: Magical --- Utsusemi/Blink absorb: 1 shadow --- Range: Melee +-- Family: Leeches +-- Deals Dark damage to a single target. Additional Effect: HP Drain -- Notes: If used against undead, it will simply do damage and not drain HP. ----------------------------------- ---@type TMobSkill @@ -14,12 +12,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.25, 1.50 } + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/dreadstorm.lua b/scripts/actions/mobskills/dreadstorm.lua index 1985391adb3..b4bc5bcb609 100644 --- a/scripts/actions/mobskills/dreadstorm.lua +++ b/scripts/actions/mobskills/dreadstorm.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Dreadstorm --- --- Description: Deals magical damage in an area of effect. Additional effect: Terror --- Type: Magical --- Wipes Shadows --- Range: 13' radial +-- Family: Khimaira +-- Description: Deals Dark damage in an area of effect. Additional Effect: Terror ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 2.5, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 10.0, 10.0, 10.0 } -- TODO: Capture fTPs + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - skill:setMsg(xi.mobskills.mobGazeMove(mob, target, xi.effect.TERROR, 1, 0, 10)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.TERROR, 1, 0, 10) + end return damage end diff --git a/scripts/actions/mobskills/dust_cloud.lua b/scripts/actions/mobskills/dust_cloud.lua index 98c1778ac7f..2ac458cab3b 100644 --- a/scripts/actions/mobskills/dust_cloud.lua +++ b/scripts/actions/mobskills/dust_cloud.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Dust Cloud --- Deals Earth damage to targets in a fan-shaped area of effect. Additional effect: Blind --- Range: 10' cone +-- Family: Rabbits +-- Description: Deals Earth damage to targets in a fan-shaped area of effect. Additional Effect: Blind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getMainLvl() + 2 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.EARTH - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 30, 0, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 30, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/dustvoid.lua b/scripts/actions/mobskills/dustvoid.lua index 0bdb7ade63a..d4384cff81a 100644 --- a/scripts/actions/mobskills/dustvoid.lua +++ b/scripts/actions/mobskills/dustvoid.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Dustvoid --- Description: (**not in yet** Removes all equipment from player.) Additional effect: Knockback --- Type: Breath --- Utsusemi/Blink absorb: Ignores shadows --- Range: AoE 10' +-- Family: Sandworms +-- Description: Deals Wind damage to targets. Removes all equipment from targets. Additional Effect: Knockback ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,19 +11,30 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 0.5, 0.5, 0.5 } + params.element = xi.element.WIND + params.dStatMultiplier = 1 + -- TODO: Capture knockback - if target:isPC() then - for i = xi.slot.MAIN, xi.slot.BACK do - target:unequipItem(i) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + -- TODO: Wikis state this removes equipment. Need captures + -- If it does remove equipment, does it undress before or after taking damage? + + if target:isPC() then + for i = xi.slot.MAIN, xi.slot.BACK do + target:unequipItem(i) + end end end - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - return damage end diff --git a/scripts/actions/mobskills/earth_pounder.lua b/scripts/actions/mobskills/earth_pounder.lua index 4d2c2eee427..a6846706f4e 100644 --- a/scripts/actions/mobskills/earth_pounder.lua +++ b/scripts/actions/mobskills/earth_pounder.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Earth Pounder --- Description: Deals Earth damage to enemies within area of effect. Additional effect: Dexterity Down --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 15' radial +-- Earth Pounder +-- Family: Scorpions +-- Description: Deals Earth damage to enemies within area of effect. Additional Effect: DEX Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,21 +11,35 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local fTP = 2.0 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.EARTH if mob:getPool() == xi.mobPool.PLATOON_SCORPION then local battlefield = mob:getBattlefield() + local ftpPower = 0 if battlefield then - fTP = fTP + battlefield:getLocalVar('scorpionsDefeated') * .5 + ftpPower = 2.0 + battlefield:getLocalVar('scorpionsDefeated') * 0.5 + params.fTP = { ftpPower, ftpPower, ftpPower } end end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.EARTH, fTP, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEX_DOWN, 10, 3, 120) + -- TODO: Jimmayus Spreadsheet implies this scales with level. Need more captures to determine scaling formula. + -- TODO: Capture decay rate. Many mobs use 9 second decay rate so using that for now. + -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=A598 + local power = 10 + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEX_DOWN, power, 9, 180) + end return damage end diff --git a/scripts/actions/mobskills/earthbreaker.lua b/scripts/actions/mobskills/earthbreaker.lua index d7621f4b627..c2468c84536 100644 --- a/scripts/actions/mobskills/earthbreaker.lua +++ b/scripts/actions/mobskills/earthbreaker.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Earthbreaker --- Description: Deals Earth damage to enemies within area of effect. Additional effect: Stun --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 15' radial +-- Family: Scorpions +-- Description: Deals Earth damage to enemies within area of effect. Additional Effect: Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,11 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.EARTH, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 10) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.0, 1.0 } + params.element = xi.element.EARTH + params.dStatMultiplier = 1 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 8) + end return damage end diff --git a/scripts/actions/mobskills/earthen_fury.lua b/scripts/actions/mobskills/earthen_fury.lua index 6e5973a356f..5f768e62394 100644 --- a/scripts/actions/mobskills/earthen_fury.lua +++ b/scripts/actions/mobskills/earthen_fury.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Earthen Fury --- Deals Earth elemental damage to enemies within area of effect. +-- Family: Avatar (Titan) +-- Description: Deals Earth elemental damage to enemies within area of effect. +-- Notes: Titan's Astral Flow ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +12,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 3, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.EARTH + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + end return damage end diff --git a/scripts/actions/mobskills/electrocharge.lua b/scripts/actions/mobskills/electrocharge.lua index f31dda859f7..bf108b8645f 100644 --- a/scripts/actions/mobskills/electrocharge.lua +++ b/scripts/actions/mobskills/electrocharge.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Electrocharge --- Description: Deals thunder damage. --- Type: Magical (thunder) +-- Family: Spheroids +-- Description: Deals Unaspected elemental damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.NONE, 0.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 0.5, 0.5, 0.5 } + params.element = xi.element.NONE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + end return damage end diff --git a/scripts/actions/mobskills/electromagnetic_field.lua b/scripts/actions/mobskills/electromagnetic_field.lua index b6785bb657e..231f7267f36 100644 --- a/scripts/actions/mobskills/electromagnetic_field.lua +++ b/scripts/actions/mobskills/electromagnetic_field.lua @@ -1,7 +1,8 @@ ----------------------------------- -- Electromagnetic Field --- Description: Deals thunder damage. --- Type: Magical (Thunder) +-- Family: Spheroids +-- Description: Deals Thunder damage to targets in range of mob. +-- Notes: Used by Warders in COP Mission 6-1. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,10 +12,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } -- TODO: Capture fTP scaling. + params.element = xi.element.THUNDER + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + end return damage end diff --git a/scripts/actions/mobskills/empirical_research.lua b/scripts/actions/mobskills/empirical_research.lua index 1acb771817d..6100794a38c 100644 --- a/scripts/actions/mobskills/empirical_research.lua +++ b/scripts/actions/mobskills/empirical_research.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Empirical Research +-- Family: Humanoid (Trust: Shantotto II) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,12 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2.8 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.NONE, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs + params.element = xi.element.NONE - target:takeDamage(damage, mob, xi.attackType.NONE, xi.damageType.NONE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.NONE, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.NONE, xi.damageType.NONE) + end return damage end diff --git a/scripts/actions/mobskills/empty_salvation.lua b/scripts/actions/mobskills/empty_salvation.lua index 2c354db7e98..8c5bcab3086 100644 --- a/scripts/actions/mobskills/empty_salvation.lua +++ b/scripts/actions/mobskills/empty_salvation.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Empty Salvation --- Damages all targets in range with the salvation of emptiness. Additional effect: Dispels 3 effects +-- Family: Promathia +-- Description: Damages all targets in range with the salvation of emptiness. Additional Effect: Dispels 3 effects ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,10 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_3) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + params.element = xi.element.DARK + -- TODO: Capture shadowBehavior + -- TODO: There are two entries for this skill with different animations. + -- Check to see if there are any differences between them. + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) -- Dispel 3 status effects for i = 1, 3 do diff --git a/scripts/actions/mobskills/erosion_dust.lua b/scripts/actions/mobskills/erosion_dust.lua index 08ebc54159a..9e0803f4ecb 100644 --- a/scripts/actions/mobskills/erosion_dust.lua +++ b/scripts/actions/mobskills/erosion_dust.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Erosion Dust --- Description: Spreads eroding dust particles on targets in an area of effect, dealing Light damage and inflicting Dia. --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows +-- Erosion Dust +-- Family: Wamoura +-- Description: Deals Fire damage to enemies in range. Additional Effect: Dia (20% DEF Down) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,14 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3.3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.3, 3.3, 3.3 } + params.element = xi.element.FIRE - local duration = xi.mobskills.calculateDuration(skill:getTP(), 10, 30) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DIA, 3, 3, duration) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DIA, 11, 3, 30, 0, 20) + end return damage end diff --git a/scripts/actions/mobskills/erratic_flutter.lua b/scripts/actions/mobskills/erratic_flutter.lua index 1b701ec07d8..067ee784b87 100644 --- a/scripts/actions/mobskills/erratic_flutter.lua +++ b/scripts/actions/mobskills/erratic_flutter.lua @@ -1,20 +1,12 @@ ----------------------------------- -- Erratic Flutter --- --- Description: Deals Fire damage around the caster. Grants the effect of Haste. -- Family: Wamoura --- Monipulators: Wamoura (MON), Coral Wamoura (MON) --- Level (Monstrosity): 60 --- TP Cost (Monstrosity): 1500 TP --- Type: Enhancing --- Element: Fire --- Can be dispelled: Yes +-- Description: Deals Fire damage to enemies in range. Grants the effect of Haste. -- Notes: --- Blue magic version is 307/1024 haste for 5 minutes. Wamaora haste is presumed identical. --- Wamoura version also deals Fire damage to targets around the wamoura. --- While it does not overwrite most forms of Slowga, Slow II, Slow II TP moves, --- Erratic Flutter does overwrite Hojo: Ni, Hojo: Ichi, and Slow. --- Player Blue magic version is wind element instead of fire. +-- Wamoura version also deals Fire damage to targets around the wamoura. +-- While it does not overwrite most forms of Slowga, Slow II, Slow II TP moves, +-- Erratic Flutter does overwrite Hojo: Ni, Hojo: Ichi, and Slow. +-- Player Blue magic version is wind element instead of fire. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -24,13 +16,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2.75 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info , mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.75, 2.75, 2.75 } + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - xi.mobskills.mobBuffMove(mob, xi.effect.HASTE, 4500, 0, 180) -- There is no message for the self buff aspect, only dmg. + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + xi.mobskills.mobBuffMove(mob, xi.effect.HASTE, 4500, 0, 180) return damage end diff --git a/scripts/actions/mobskills/eyes_on_me.lua b/scripts/actions/mobskills/eyes_on_me.lua index 20dddaf38b0..543b9f56250 100644 --- a/scripts/actions/mobskills/eyes_on_me.lua +++ b/scripts/actions/mobskills/eyes_on_me.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Eyes on Me --- Deals dark damage to an enemy. --- Spell Type: Magical (Dark) --- Range: Casting range 13' +-- Eyes on Me +-- Family: Ahriman +-- Description: Deals Dark damage to an enemy. Not affected by % Magic Damage Taken/Shell. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,16 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 5 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } + params.element = xi.element.DARK + params.skipTMDA = true + -- TODO: JP Wiki states damage might scale based on distance between mob/target. Need a capture to check. if mob:isNM() then - ftp = 7 + params.fTP = { 7, 7, 7 } end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/final_exam.lua b/scripts/actions/mobskills/final_exam.lua index c223e56f6da..1500c7a1a4c 100644 --- a/scripts/actions/mobskills/final_exam.lua +++ b/scripts/actions/mobskills/final_exam.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Final Exam +-- Family: Humanoid (Trust: Shantotto II) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,12 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2.8 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture FTPs/Test Element + params.element = xi.element.NONE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/fire_arrow.lua b/scripts/actions/mobskills/fire_arrow.lua deleted file mode 100644 index 5a256326370..00000000000 --- a/scripts/actions/mobskills/fire_arrow.lua +++ /dev/null @@ -1,21 +0,0 @@ ------------------------------------ --- Fire Arrow --- Deals Fire damage. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.RANGED, xi.damageType.PIERCING, xi.mobskills.shadowBehavior.NUMSHADOWS_1) - - target:takeDamage(damage, mob, xi.attackType.RANGED, xi.damageType.PIERCING) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/fire_ii.lua b/scripts/actions/mobskills/fire_ii.lua index fa0341e0ba1..a72750c5438 100644 --- a/scripts/actions/mobskills/fire_ii.lua +++ b/scripts/actions/mobskills/fire_ii.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Fire II --- Deals fire elemental damage. Damage varies with TP. +-- Family: Avatar (Ifrit) +-- Description: Deals fire elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTP + params.element = xi.element.FIRE + -- TODO: Do non astral flows use a dStatMultiplier? - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/fire_iv.lua b/scripts/actions/mobskills/fire_iv.lua index 71a7b1c91fb..21081b820c7 100644 --- a/scripts/actions/mobskills/fire_iv.lua +++ b/scripts/actions/mobskills/fire_iv.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Fire IV --- Deals fire elemental damage. +-- Family: Avatar (Ifrit) +-- Description: Deals Fire elemental damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTP + params.element = xi.element.FIRE + -- TODO: Do non astral flows use a dStatMultiplier? - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/fire_meeble_warble.lua b/scripts/actions/mobskills/fire_meeble_warble.lua index 917a769a74a..a300f942761 100644 --- a/scripts/actions/mobskills/fire_meeble_warble.lua +++ b/scripts/actions/mobskills/fire_meeble_warble.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Fire Meeble Warble --- AOE Fire Elemental damage, inflicts Plague (50 MP/tick, 300 TP/tick) and Burn (50 HP/tick). +-- Family: Meebles +-- Description: AoE Fire Elemental damage, inflicts Plague (50 MP/tick, 300 TP/tick) and Burn (50 HP/tick). ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,14 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } -- TODO: Capture fTP + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 30, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 50, 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + -- TODO: Capture power/duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 30, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 50, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/fireball.lua b/scripts/actions/mobskills/fireball.lua index f641ff54e57..380d6bd9fd6 100644 --- a/scripts/actions/mobskills/fireball.lua +++ b/scripts/actions/mobskills/fireball.lua @@ -9,14 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 2.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.5, 2.5, 2.5 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - return damage + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) + + if not xi.mobskills.hasMissMessage(mob, target, skill, action, info) then + xi.mobskills.processDamage(mob, target, skill, action, info) + end + + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/firebomb.lua b/scripts/actions/mobskills/firebomb.lua index 343cf8ad34c..286f8ca2194 100644 --- a/scripts/actions/mobskills/firebomb.lua +++ b/scripts/actions/mobskills/firebomb.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Firebomb --- Deals Fire damage. +-- Family: Orc Warmachines +-- Description: Deals Fire damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/firespit.lua b/scripts/actions/mobskills/firespit.lua index 681f98f0f8c..67534b24882 100644 --- a/scripts/actions/mobskills/firespit.lua +++ b/scripts/actions/mobskills/firespit.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Firespit --- Description: Deals fire damage to an enemy. --- Type: Magical (Fire) +-- Firespit +-- Family: Mamool Ja +-- Description: Deals Fire damage to an enemy. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,20 +11,31 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 - local numhits = math.random(2, 3) - - if - mob:getMainJob() == xi.job.BLM or - mob:getMainJob() == xi.job.WHM - then - numhits = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + local params = {} + + params.baseDamage = mob:getMainLvl() * math.random(2, 3) + params.fTP = { 4, 4, 4 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1 + + -- There are two versions of this skill (SkillIDs 1733 and 1923). 1733 is used by Brown Mamool Ja and 1923 is used by Blue Mamool Ja(Usually mage types). + -- Blue types ignore shadows and deal fire damage. Brown types consume shadows. + + -- TODO: Capture AOE type for both skill IDs(Conal AOE, AOE near target, Single Target, etc) + + local shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 + + -- Blue Mamool Ja ignore shadows. + if skill:getID() == xi.mobSkill.FIRESPIT_BLUE_MAMOOLJA then + shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, numhits) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, shadowBehavior, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/flame_arrow.lua b/scripts/actions/mobskills/flame_arrow.lua index 1c70c7265d7..1a2a453f4f1 100644 --- a/scripts/actions/mobskills/flame_arrow.lua +++ b/scripts/actions/mobskills/flame_arrow.lua @@ -1,6 +1,8 @@ ----------------------------------- --- Fire Arrow --- Deals Fire damage. +-- Flame Arrow +-- Family: Orc Warmachines +-- Description: Deals Fire damage to a target. +-- Note: Wikis call it "Fire Arrow" but the actual ingame name for EN client is "Flame Arrow". ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,16 +12,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local dmgmod = 2.5 + local params = {} - local info = xi.mobskills.mobRangedMove(mob, target, skill, numhits, accmod, dmgmod, xi.mobskills.magicalTpBonus.NO_EFFECT) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.FIRE + -- TODO: Capture shadowBehavior - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.RANGED, xi.damageType.PIERCING, info.hitslanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) - target:takeDamage(dmg, mob, xi.attackType.RANGED, xi.damageType.PIERCING) - return dmg + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/flame_blast.lua b/scripts/actions/mobskills/flame_blast.lua index 9bb0f0393dd..f9fb07ac15a 100644 --- a/scripts/actions/mobskills/flame_blast.lua +++ b/scripts/actions/mobskills/flame_blast.lua @@ -1,24 +1,34 @@ ----------------------------------- --- Flame Blast --- --- Description: Deals fire damage to enemies within a wide area of effect. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: 30' --- Notes: Used only by KS99 Wyrm while flying. Only use in a dedicated flying skill set. +-- Flame Blast +-- Family: Wyrms +-- Description: Deals Fire damage to enemies within a wide area of effect. +-- Notes: Used only by KS99 Wyrm while flying. Only use in a dedicated flying skill set. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + if mob:getAnimationSub() ~= 1 then + return 1 + end + return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 11, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } + params.element = xi.element.FIRE + -- TODO: Capture shadowBehavior + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/flame_blast_alt.lua b/scripts/actions/mobskills/flame_blast_alt.lua index 335160cb41a..e30224fd89d 100644 --- a/scripts/actions/mobskills/flame_blast_alt.lua +++ b/scripts/actions/mobskills/flame_blast_alt.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Flame Blast Regular Attack --- --- Description: Deals single target fire damage to target. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: 18' --- Notes: Used only by KS99 Wyrm in while flying as regular attack. Only use in a dedicated flying attack skill set. +-- Flame Blast Regular Attack +-- Family: Wyrms +-- Description: Deals single target Fire damage to target. +-- Notes: Used only by KS99 Wyrm in while flying as regular auto attack. Only use in a dedicated flying attack skill set. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,11 +12,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - skill:setMsg(xi.msg.basic.HIT_DMG) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Move logic to mob final adjustments eventually. + end return damage end diff --git a/scripts/actions/mobskills/flame_thrower.lua b/scripts/actions/mobskills/flame_thrower.lua index c32d7257c8d..f4bef0e7f95 100644 --- a/scripts/actions/mobskills/flame_thrower.lua +++ b/scripts/actions/mobskills/flame_thrower.lua @@ -40,4 +40,4 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) return info.damage end -return mobskillObject +return mobskillObject \ No newline at end of file diff --git a/scripts/actions/mobskills/floodlight.lua b/scripts/actions/mobskills/floodlight.lua index b380e0a9265..e9e937fb145 100644 --- a/scripts/actions/mobskills/floodlight.lua +++ b/scripts/actions/mobskills/floodlight.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Floodlight --- Description: ~300 magic damage, Flash, Blind and Silence, ignores Utsusemi --- Type: Magical +-- Family: Omega (Proto Omega) +-- Description: ~300 magic damage, Flash, Blind and Silence ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,15 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1.5, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.5, 4.5, 4.5 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 15, 3, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FLASH, 0, 0, 20) -- Effect handled in hit rate calculation - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + -- TODO: Capture power/durations. + -- Note: Flash decay not implemented as of time of this comment. + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 15, 3, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FLASH, 200, 3, 20) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) + end return damage end diff --git a/scripts/actions/mobskills/flying_hip_press.lua b/scripts/actions/mobskills/flying_hip_press.lua index 2d399b7c49d..5fa2635040c 100644 --- a/scripts/actions/mobskills/flying_hip_press.lua +++ b/scripts/actions/mobskills/flying_hip_press.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Flying Hip Press --- Description: Deals Wind damage to enemies within area of effect. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: 15' radial +-- Flying Hip Press +-- Family: Bugbears +-- Description: Deals Wind damage to enemies within area of effect. +-- Note: Mobskill is NOT a breath attack like the BLU spell is. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,20 +12,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local fTP = 2.0 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 3.0 } + params.element = xi.element.WIND if mob:getPool() == xi.mobPool.BUGBOY then - fTP = 7.0 + params.fTP = 7.0 end if mob:getPool() == xi.mobPool.BUGBEAR_MATMAN then - fTP = 10.0 + params.fTP = 10.0 end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, fTP, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/globals/bluemagic.lua b/scripts/globals/bluemagic.lua index 6406761d882..12ba30d972d 100644 --- a/scripts/globals/bluemagic.lua +++ b/scripts/globals/bluemagic.lua @@ -421,7 +421,7 @@ xi.spells.blue.useMagicalSpell = function(caster, target, spell, params) finalDamage = math.floor(finalDamage * xi.spells.damage.calculateElementalStaffBonus(caster, spellElement)) finalDamage = math.floor(finalDamage * xi.combat.damage.magicalElementSDT(target, spellElement)) finalDamage = math.floor(finalDamage * xi.spells.damage.calculateDayAndWeather(caster, spellElement, false)) - finalDamage = math.floor(finalDamage * xi.spells.damage.calculateMagicBonusDiff(caster, target, spellId, skillType, spellElement)) + finalDamage = math.floor(finalDamage * xi.spells.damage.calculateMagicBonusDiff(caster, target, spellId, skillType, spellElement, 0)) if caster:hasStatusEffect(xi.effect.BURST_AFFINITY) or @@ -478,7 +478,7 @@ xi.spells.blue.useDrainSpell = function(caster, target, spell, params, damageCap finalDamage = math.floor(finalDamage * xi.spells.damage.calculateElementalStaffBonus(caster, spellElement)) finalDamage = math.floor(finalDamage * xi.combat.damage.magicalElementSDT(target, spellElement)) finalDamage = math.floor(finalDamage * xi.spells.damage.calculateDayAndWeather(caster, spellElement, false)) - finalDamage = math.floor(finalDamage * xi.spells.damage.calculateMagicBonusDiff(caster, target, spellId, skillType, spellElement)) + finalDamage = math.floor(finalDamage * xi.spells.damage.calculateMagicBonusDiff(caster, target, spellId, skillType, spellElement, 0)) if caster:hasStatusEffect(xi.effect.BURST_AFFINITY) or @@ -566,7 +566,7 @@ xi.spells.blue.useBreathSpell = function(caster, target, spell, params) local additionalResistTier = xi.spells.damage.calculateAdditionalResistTier(caster, target, spellElement) local elementalSDT = xi.combat.damage.magicalElementSDT(target, spellElement) local dayAndWeather = xi.spells.damage.calculateDayAndWeather(caster, spellElement, false) - local magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(caster, target, spellId, xi.skill.BLUE_MAGIC, spellElement) + local magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(caster, target, spellId, xi.skill.BLUE_MAGIC, spellElement, 0) local skillTypeMultiplier = xi.spells.damage.calculateSkillTypeMultiplier(xi.skill.BLUE_MAGIC) local ninFutaeBonus = xi.spells.damage.calculateNinFutaeBonus(caster, xi.skill.BLUE_MAGIC) local ninjutsuMultiplier = xi.spells.damage.calculateNinjutsuMultiplier(caster, target, xi.skill.BLUE_MAGIC) diff --git a/scripts/globals/mobskills.lua b/scripts/globals/mobskills.lua index 37379cc883c..ed79e7183bd 100644 --- a/scripts/globals/mobskills.lua +++ b/scripts/globals/mobskills.lua @@ -72,6 +72,18 @@ local function calculateMobMagicBurst(caster, ele, target) return burstMultiplier end +local function MobTakeAoEShadow(mob, target, max) + -- TODO: Use actual NIN skill, not this function + if target:getMainJob() == xi.job.NIN and math.random(1, 100) <= 60 then + max = max - 1 + if max < 1 then + max = 1 + end + end + + return math.random(1, max) +end + local function fTP(tp, ftp1, ftp2, ftp3) tp = math.max(tp, 1000) @@ -313,86 +325,297 @@ xi.mobskills.mobPhysicalMove = function(mob, target, skill, numHits, accMod, ftp return returninfo end --- MAGICAL MOVE --- Call this on every magical move! --- mob/target/skill should be passed from onMobWeaponSkill. --- dmg is the base damage (V value), accmod is a multiplier for accuracy (1 default, more than 1 = higher macc for mob), --- ditto for dmg mod but more damage >1 (equivalent of M value) --- tpeffect is an enum from one of: --- 0 = xi.mobskills.magicalTpBonus.NO_EFFECT --- 1 = xi.mobskills.magicalTpBonus.MACC_BONUS --- 2 = xi.mobskills.magicalTpBonus.MAB_BONUS --- 3 = xi.mobskills.magicalTpBonus.DMG_BONUS --- tpvalue affects the strength of having more TP along the following lines: --- xi.mobskills.magicalTpBonus.NO_EFFECT -> tpvalue has no xi.effect. --- xi.mobskills.magicalTpBonus.MACC_BONUS -> direct multiplier to macc (1 for default) --- xi.mobskills.magicalTpBonus.MAB_BONUS -> direct multiplier to mab (1 for default) --- xi.mobskills.magicalTpBonus.DMG_BONUS -> direct multiplier to damage (V+dINT) (1 for default) ---Examples: --- xi.mobskills.magicalTpBonus.DMG_BONUS and TP = 100, tpvalue = 1, assume V=150 --> damage is now 150*(TP*1) / 100 = 150 --- xi.mobskills.magicalTpBonus.DMG_BONUS and TP = 200, tpvalue = 1, assume V=150 --> damage is now 150*(TP*1) / 100 = 300 --- xi.mobskills.magicalTpBonus.DMG_BONUS and TP = 100, tpvalue = 2, assume V=150 --> damage is now 150*(TP*2) / 100 = 300 --- xi.mobskills.magicalTpBonus.DMG_BONUS and TP = 200, tpvalue = 2, assume V=150 --> damage is now 150*(TP*2) / 100 = 600 - --- return value of xi.mobskills.mobMagicalMove ----@alias magicalMobSkillRetVal { damage: number } +----------------------------------- +-- Documentation: xi.mobskills.mobMagicalMove +-- params.baseDamage = #: Sets the skill's baseDamage. Default: mob:getMainLvl() + 2 +-- params.additiveDamage = { #, #, # }: Bonus damage added after base damage multipliers. Linear scaling based on fTP. +-- params.fTP = { #, #, # }: Linear baseDamage multiplier. Default: { 1, 1, 1 } +-- params.element = element enum : Element of attack. Default: 0 +-- params.mATTBonus = { #, #, # }: Flat MACC bonus/penalty (Integer). Default: { 0, 0, 0 } +-- params.mACCBonus = { #, #, # }: Flat MATT bonus/penalty (Integer). Default: { 0, 0, 0 } +-- params.skipResist = boolean: Ignores resist calculations. Default: False +-- params.skipSDT = boolean: Ignores special damage taken calculations. Default: False +-- params.skipTMDA = boolean: Ignores Target Damage Adjustment calculations. Default: False +-- params.useTBDA = boolean: Uses TBDA instead of TMDA for damage adjustment. Default: False +-- params.resistTierOverride = float: Forces a specific resist tier. +-- params.str_wSC = float: % of STR stat added to baseDamage of skill. Default: 0 +-- params.dex_wSC = float: % of DEX stat added to baseDamage of skill. Default: 0 +-- params.vit_wSC = float: % of VIT stat added to baseDamage of skill. Default: 0 +-- params.agi_wSC = float: % of AGI stat added to baseDamage of skill. Default: 0 +-- params.int_wSC = float: % of INT stat added to baseDamage of skill. Default: 0 +-- params.mnd_wSC = float: % of MND stat added to baseDamage of skill. Default: 0 +-- params.chr_wSC = float: % of CHR stat added to baseDamage of skill. Default: 0 +-- params.dStatMultiplier = float: Multiplier used in dStat calculations. +-- params.dStatAttackerMod = xi.mod.: Defines which of the attacker's stats is used when calculating dStat. Default: xi.mod.INT +-- params.dStatDefenderMod = xi.mod.: Defines which of the defender's stats is used when calculating dStat. Default: xi.mod.INT +----------------------------------- +xi.mobskills.mobMagicalMove = function(mob, target, skill, action, skillParams) + local returnInfo = {} ----@param actor CBaseEntity ----@param target CBaseEntity ----@param action CPetSkill|CMobSkill ----@param baseDamage number ----@param actionElement number ----@param damageModifier number ----@param tpEffect xi.mobskills.magicalTpBonus? ----@param tpMultiplier number? ----@return magicalMobSkillRetVal -xi.mobskills.mobMagicalMove = function(actor, target, action, baseDamage, actionElement, damageModifier, tpEffect, tpMultiplier) - local finalDamage = baseDamage - - -- Base damage - if tpEffect == xi.mobskills.magicalTpBonus.DMG_BONUS then - local multiplier = tpMultiplier or 1000 - finalDamage = math.floor(finalDamage * action:getTP() * multiplier / 1000) - end - - -- Get bonus macc. - local petAccBonus = 0 - if actor:isPet() and actor:getMaster() ~= nil then - local master = actor:getMaster() - if master and actor:isAvatar() then - petAccBonus = utils.clamp(master:getSkillLevel(xi.skill.SUMMONING_MAGIC) - master:getMaxSkillLevel(actor:getMainLvl(), xi.job.SMN, xi.skill.SUMMONING_MAGIC), 0, 200) + -- Setup Params used in mobskill's lua. Set default values if a Param is nil. + local baseDamage = skillParams.baseDamage or mob:getMainLvl() + 2 + local additiveDamage = skillParams.additiveDamage or { 0, 0, 0 } + local fTPScale = skillParams.fTP or { 1.00, 1.00, 1.00 } + local actionElement = skillParams.element or 0 + local attackType = skillParams.attackType or xi.attackType.MAGICAL + local damageType = skillParams.damageType or xi.damageType.ELEMENTAL + local shadowsToRemove = skillParams.shadowBehavior or xi.mobskills.shadowBehavior.NUMSHADOWS_1 + local mATTBonusfTP = skillParams.mATTBonus or { 0, 0, 0 } + local mACCBonusfTP = skillParams.mACCBonus or { 0, 0, 0 } + local skipResist = skillParams.skipResist and true or false + local skipSDT = skillParams.skipSDT and true or false + local skipDamageAdjustment = skillParams.skipDamageAdjustment and true or false + local skipDayWeather = skillParams.skipDayWeather and true or false + local skipMagicBonusDiff = skillParams.skipMagicBonusDiff and true or false + local skipAbsorb = skillParams.skipAbsorbNullify and true or false -- TODO: + local resistTierOverride = skillParams.resistTierOverride or 0 + local dStatMultiplier = skillParams.dStatMultiplier or 0 + local dStatAttackerMod = skillParams.dStatAttackerMod or xi.mod.INT + local dStatDefenderMod = skillParams.dStatDefenderMod or xi.mod.INT + + -- Initialize returnInfo params + returnInfo.damage = 0 + returnInfo.shadowsBlockedSkill = false + returnInfo.hitsLanded = 0 + returnInfo.attackType = attackType + returnInfo.damageType = damageType + returnInfo.damageAbsorbed = false + returnInfo.damageNullified = false + + if mob:hasStatusEffect(xi.effect.HYSTERIA) then + skill:setMsg(xi.msg.basic.NONE) + return 0 + end + + -- Set default message. + if mob:getCurrentAction() == xi.action.category.PET_MOBABILITY_FINISH then + if skill:getMsg() ~= xi.msg.basic.JA_MAGIC_BURST then + skill:setMsg(xi.msg.basic.USES_JA_TAKE_DAMAGE) end + else + skill:setMsg(xi.msg.basic.DAMAGE) + end - local skillchainTier, _ = xi.magicburst.formMagicBurst(target, actionElement) + ---------------------------------- + -- Calculate Base Damage + ---------------------------------- + -- Calculate Weapon Skill Secondary Attribute Modifiers (wSC) + -- If a stat_wSC is not specified in skill script, it will default to 0. (Sanitized in xi.combat.physical.calculateWSC) + local strWSC = skillParams.str_wSC + local dexWSC = skillParams.dex_wSC + local vitWSC = skillParams.vit_wSC + local agiWSC = skillParams.agi_wSC + local intWSC = skillParams.int_wSC + local mndWSC = skillParams.mnd_wSC + local chrWSC = skillParams.chr_wSC + + local wscMods = xi.combat.physical.calculateWSC(mob, strWSC, dexWSC, vitWSC, agiWSC, intWSC, mndWSC, chrWSC) + + local baseDamagefTPMult = xi.combat.physical.calculateTPfactor(skill:getTP(), fTPScale) + local additiveBonusDamage = math.floor(xi.combat.physical.calculateTPfactor(skill:getTP(), additiveDamage)) + + -- dStat Multiplier is usually 1, 1.5, 2 depending on skill. + -- Negative dStat usually subtracts 0.5 from the multiplier. + -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=D8 + local dStat = 0 + + if skillParams.dStatMultiplier then + dStat = math.floor(mob:getStat(dStatAttackerMod) - target:getStat(dStatDefenderMod)) + + if dStat < 0 then + dStatMultiplier = dStatMultiplier - 0.5 + + if dStatMultiplier < 1 then + dStat = -1 + end + end + + dStat = math.floor(dStat * dStatMultiplier) + end + + baseDamage = math.floor((baseDamage + wscMods + mob:getMod(xi.mod.MAGIC_DAMAGE)) * baseDamagefTPMult + dStat + additiveBonusDamage) + + local finalDamage = math.max(1, baseDamage) + local hitsLanded = 1 -- Magic skills can't miss in the same way as physical skills so assume 1 hit landed for calculations. + + -- Handle Shadows (Utsusemi, Blink, etc.) + if + shadowsToRemove ~= xi.mobskills.shadowBehavior.WIPE_SHADOWS and + shadowsToRemove ~= xi.mobskills.shadowBehavior.IGNORE_SHADOWS + then + -- Handle Utsusemi preservation mechanic to reduce shadow consumption. + -- This is usually for AOE physical attacks(AOE Magic usually wipes shadows). if - actor:getPetID() > 0 and - skillchainTier > 0 + skill:isAoE() or + skill:isConal() then - petAccBonus = petAccBonus + 25 + shadowsToRemove = utils.attemptShadowMitigation(target, shadowsToRemove) + end + + -- Remove shadows + finalDamage = utils.takeShadows(target, finalDamage, shadowsToRemove) + + -- Dealt zero damage, so shadows took all hits. + if finalDamage == 0 then + skill:setMsg(xi.msg.basic.SHADOW_ABSORB) + returnInfo.damage = shadowsToRemove + returnInfo.hitsLanded = 0 + returnInfo.shadowsBlockedSkill = true + + return returnInfo + end + + elseif shadowsToRemove == xi.mobskills.shadowBehavior.WIPE_SHADOWS then + target:delStatusEffect(xi.effect.COPY_IMAGE) + target:delStatusEffect(xi.effect.BLINK) + end + + -- Calculate if skill will be absorbed or nullified. + local absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, true) + local nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, true, false) + + if skipAbsorb then + absorbDamage = 1 + end + + if nullifyDamage == 0 then + -- Note: We still count nullifies as a "hit" since additional status effects tied to the skill itself will still apply. + returnInfo.damage = 0 + returnInfo.damageNullified = true + end + + ---------------------------------- + -- Calculate MACC/Resists/Damage Adjustments + ---------------------------------- + local mAccuracyBonus = 0 + local mAttackBonus = 0 + + -- Flat MACC bonus based on fTP scale + mAccuracyBonus = xi.combat.physical.calculateTPfactor(skill:getTP(), mACCBonusfTP) + + -- Flat MATT bonus based on fTP scale + mAttackBonus = xi.combat.physical.calculateTPfactor(skill:getTP(), mATTBonusfTP) + + -- Calculate bonus magic accuracy for pets + local petAccuracyBonus = xi.mobskills.calculatePetMagicAccuracyBonus(mob, target, actionElement) + + -- Add all magic accuracy values together. + mAccuracyBonus = mAccuracyBonus + petAccuracyBonus + + -- Damage Multipliers. + local sdt = xi.spells.damage.calculateSDT(target, actionElement) + local resistTier = 1 + local dayAndWeather = 1 + -- TODO: may need an ignoreMDB param to toggle within xi.spells.damage.calculateMagicBonusDiff. + -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=D9 + local magicBonusDiff = 1 + local magicDamageAdjustment = 1 + + -- If skill was not absorbed, calculate resist and TMDA. + -- Note: Absorb mechanics such as Liement are calculated BEFORE resist/damage adjustments (such as shell/magic bursts). + if absorbDamage > 0 then + resistTier = xi.combat.magicHitRate.calculateResistRate(mob, target, 0, 0, 0, actionElement, dStatAttackerMod, 0, mAccuracyBonus) + + if + not skipDamageAdjustment and + attackType == xi.attackType.BREATH + then + -- Damage Adjustment includes Breath and Magical damage. + magicDamageAdjustment = xi.spells.damage.calculateDamageAdjustment(target, false, true, false, true) + elseif not skipDamageAdjustment then + -- Damage Adjustment only includes Magical damage. + magicDamageAdjustment = xi.spells.damage.calculateDamageAdjustment(target, false, true, false, false) end + + -- TODO: Magic Burst damage for pets? + -- Note: Pets get a MACC bonus(handled further below in this function) but need testing for damage. + end + + if not skipDayWeather then + dayAndWeather = xi.spells.damage.calculateDayAndWeather(mob, actionElement, false) end - -- Multipliers. - local sdt = xi.combat.damage.magicalElementSDT(target, actionElement) - local resistRate = xi.combat.magicHitRate.calculateResistRate(actor, target, 0, 0, 0, actionElement, xi.mod.INT, 0, petAccBonus) - local dayAndWeather = xi.spells.damage.calculateDayAndWeather(actor, actionElement, false) - local magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(actor, target, 0, 0, actionElement) + if not skipMagicBonusDiff then + magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(mob, target, 0, 0, actionElement, mAttackBonus) + end + + -- Force a resist tier if defined. + if skillParams.resistTierOverride then + resistTier = resistTierOverride + end + + -- Skip resist calculations if true. + if skipResist then + resistTier = 1 + end + + -- Skip SDT calculations if true. + if skipSDT then + sdt = 1 + end - -- Calculate final damage. finalDamage = math.floor(finalDamage * sdt) - finalDamage = math.floor(finalDamage * resistRate) + finalDamage = math.floor(finalDamage * resistTier) finalDamage = math.floor(finalDamage * dayAndWeather) finalDamage = math.floor(finalDamage * magicBonusDiff) - finalDamage = math.floor(finalDamage * damageModifier) + finalDamage = math.floor(finalDamage * magicDamageAdjustment) + finalDamage = math.floor(finalDamage * absorbDamage) + + -- If we absorbed, then return early as the rest is not needed. + if absorbDamage < 0 then + skill:setMsg(xi.msg.basic.SKILL_RECOVERS_HP) + target:addHP(-finalDamage) + + returnInfo.damageAbsorbed = true + returnInfo.damage = finalDamage + returnInfo.hitsLanded = hitsLanded + -- Note: We still count absorbs as a "hit" since additional status effects tied to the skill itself will still apply. + + return returnInfo + end + + finalDamage = math.floor(target:handleSevereDamage(finalDamage, false)) + finalDamage = math.floor(target:checkDamageCap(finalDamage)) + finalDamage = math.floor(utils.handleAutomatonAutoAnalyzer(target, skill, finalDamage)) + finalDamage = utils.handlePhalanx(target, finalDamage) + finalDamage = utils.handleOneForAll(target, finalDamage) + finalDamage = utils.handleStoneskin(target, finalDamage) + + target:updateEnmityFromDamage(mob, finalDamage) + target:handleAfflatusMiseryDamage(finalDamage) + + -- Calculate TP return of the mob skill. + xi.mobskills.calculateSkillTPReturn(finalDamage, mob, skill, target, attackType, hitsLanded) + + returnInfo.damage = finalDamage + returnInfo.hitsLanded = hitsLanded + + return returnInfo +end + +xi.mobskills.calculatePetMagicAccuracyBonus = function(mob, target, actionElement) + local petAccBonus = 0 - -- magical mob skills are single hit so provide single Melee hit TP return if primary target - -- TODO: This should probably be moved to AFTER all damage is calculated, since this is not the final step. - if finalDamage > 0 and action:getPrimaryTargetID() == target:getID() then - local tpReturn = xi.combat.tp.getSingleMeleeHitTPReturn(actor, false) - actor:addTP(tpReturn) + if mob:isPet() and mob:getMaster() ~= nil then + local master = mob:getMaster() + + if mob:isAvatar() then + local masterSkillLevel = master:getSkillLevel(xi.skill.SUMMONING_MAGIC) + local masterMaxSkillLevel = master:getMaxSkillLevel(mob:getMainLvl(), xi.job.SMN, xi.skill.SUMMONING_MAGIC) + + petAccBonus = utils.clamp(masterSkillLevel - masterMaxSkillLevel, 0, 200) + end + + local skillchainTier, _ = xi.magicburst.formMagicBurst(actionElement, target) + if + mob:getPetID() > 0 and + skillchainTier > 0 + then + petAccBonus = petAccBonus + 25 + end end - return { damage = finalDamage } + return petAccBonus end ---@param actor CBaseEntity @@ -622,7 +845,7 @@ xi.mobskills.mobFinalAdjustments = function(info, mob, skill, target, attackType local damage = info.damage -- If target has Hysteria, no message skip rest - -- TODO: Need to also handle in core to interrupt the mobskill. Proper behavior is: Mob will attempt to use a skill but it will not fire off. + -- TODO: Need to also handle in core to interrupt the mobskill. Proper behavior is: Mob will ready a skill but it will not fire off. if mob:hasStatusEffect(xi.effect.HYSTERIA) then skill:setMsg(xi.msg.basic.NONE) return 0 @@ -653,7 +876,6 @@ xi.mobskills.mobFinalAdjustments = function(info, mob, skill, target, attackType if skill:getMsg() ~= xi.msg.basic.JA_MAGIC_BURST then skill:setMsg(xi.msg.basic.USES_JA_TAKE_DAMAGE) end - -- TODO: Move messaging from mobskill script to here. else skill:setMsg(xi.msg.basic.DAMAGE) end @@ -701,6 +923,7 @@ xi.mobskills.mobFinalAdjustments = function(info, mob, skill, target, attackType -- Handle Third Eye using shadowbehav as a guide. if xi.combat.physicalHitRate.checkAnticipated(mob, target) then skill:setMsg(xi.msg.basic.ANTICIPATE) + return 0 end end @@ -712,11 +935,6 @@ xi.mobskills.mobFinalAdjustments = function(info, mob, skill, target, attackType damage = damage * xi.combat.damage.physicalElementSDT(target, damageType) damage = target:physicalDmgTaken(damage, damageType) elseif attackType == xi.attackType.MAGICAL then - local element = utils.clamp(damageType - 5, xi.element.NONE, xi.element.DARK) -- Transform damage type to element - damage = math.floor(damage * xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false)) - damage = math.floor(damage * xi.spells.damage.calculateAbsorption(target, element, true)) - damage = math.floor(damage * xi.spells.damage.calculateNullification(target, element, true, false)) - damage = math.floor(target:handleSevereDamage(damage, false)) elseif attackType == xi.attackType.BREATH then -- Handle absorb messaging if damage < 0 then @@ -787,21 +1005,44 @@ xi.mobskills.calculateSkillTPReturn = function(damage, mob, skill, target, attac end end ----@param actor CBaseEntity ----@param target CBaseEntity ----@param skill CPetSkill|CMobSkill ----@param action CAction ----@param info table ----@return boolean --- Used as a conditional filter for target:takeDamage so the target doesn't take chip damage through shadows. -xi.mobskills.processDamage = function(actor, target, skill, action, info) - if info.hitsLanded > 0 then - return true +xi.mobskills.hasMissMessage = function(mob, target, skill, action, info) + local missMessages = + { + xi.msg.basic.EVADES, + xi.msg.basic.HIT_MISS, + xi.msg.basic.JA_MISS, + xi.msg.basic.JA_MISS_2, + xi.msg.basic.SKILL_MISS, + xi.msg.basic.RANGED_ATTACK_MISS, + xi.msg.basic.SHADOW_ABSORB, + xi.msg.basic.ANTICIPATE, + } + + local skillMsg = skill:getMsg() + + -- The attack was a miss, shadow absorbed, or anticipated. + for _, msg in ipairs(missMessages) do + if skillMsg == msg then + + return true + end + end end return false end +-- Filters target:takeDamage so we don't take chip damage through shadows. +xi.mobskills.processDamage = function(mob, target, skill, action, info) + if + info.damage >= 0 and -- Was not absorbed + info.hitsLanded > 0 and -- Was not a miss + info.shadowsBlockedSkill == false -- Was not completely blocked by shadows. + then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end +end + -- returns true if mob attack hit -- used to stop tp move status effects xi.mobskills.mobPhysicalHit = function(skill) @@ -810,6 +1051,10 @@ xi.mobskills.mobPhysicalHit = function(skill) end xi.mobskills.mobDrainMove = function(mob, target, drainType, drain, attackType, damageType) + -- TODO: We clamp the drain in this function so the drain can not be more than what the target has. + -- Is this also reflected in the damage messaging on retail? + -- Currently we do not return the clamped drain afterwards so the damage messaging will not be updated to reflect this. + if not target:isUndead() then if drainType == xi.mobskills.drainType.MP then drain = math.min(drain, target:getMP()) @@ -977,6 +1222,25 @@ xi.mobskills.calculateDuration = function(tp, minimum, maximum) return minimum + (maximum - minimum) * (tp - 1000) / 1000 end +-- Used for mobskills that remove player equipment. +-- Removes items from randomly chosen equipment slots. +xi.mobskills.unequipRandomSlots = function(target, numberToUnequip) + local slots = {} + + -- Collect only slots that actually have something equipped + for i = xi.slot.MAIN, xi.slot.BACK do + local itemID = target:getEquipID(i) + if itemID and itemID ~= 0 then + table.insert(slots, i) + end + end + + for _ = 1, math.min(numberToUnequip, #slots) do + local index = math.random(#slots) + target:unequipItem(table.remove(slots, index)) + end +end + ---@param target CBaseEntity ---@param attacker CBaseEntity ---@param skill CMobSkill diff --git a/scripts/globals/spells/damage_spell.lua b/scripts/globals/spells/damage_spell.lua index 312f1f5307a..371e8127e86 100644 --- a/scripts/globals/spells/damage_spell.lua +++ b/scripts/globals/spells/damage_spell.lua @@ -588,7 +588,7 @@ xi.spells.damage.calculateDayAndWeather = function(caster, spellElement, alwaysA end -- Magic Attack Bonus VS Magic Defense Bonus -xi.spells.damage.calculateMagicBonusDiff = function(caster, target, spellId, skillType, spellElement) +xi.spells.damage.calculateMagicBonusDiff = function(caster, target, spellId, skillType, spellElement, bonusMATT) local magicBonusDiff = 1 -- The variable we want to calculate local casterJob = caster:getMainJob() local mab = caster:getMod(xi.mod.MATT) + cardinalChantBonus(caster, target, xi.direction.EAST, spellId, skillType) @@ -689,6 +689,25 @@ xi.spells.damage.calculateMagicCriticalMultiplier = function(caster) return 1 end +-- Calculate: Target Breath Damage Adjustment (TBDA) +-- Referred to on item as "Breath Damage Taken -%", "Damage Taken -%" (Ex. Defending Ring). +xi.spells.damage.calculateTBDA = function(target, spellElement) + local targetBreathDamageAdjustment = 1 + + -- The values set for this modifiers are base 10000. + -- -2500 in item_mods.sql means -25% damage recived. + -- 2500 would mean 25% ADDITIONAL damage taken. + -- The effects of the "Shell" spells are also included in this step. The effect also aplies a negative value. + local globalDamageTaken = target:getMod(xi.mod.DMG) / 10000 -- Mod is base 10000 + local breathDamageTaken = target:getMod(xi.mod.DMGBREATH) / 10000 -- Mod is base 10000 + local uBreathDamageTaken = target:getMod(xi.mod.UDMGBREATH) / 10000 -- Mod is base 10000 + local combinedDamageTaken = utils.clamp(breathDamageTaken + globalDamageTaken, -0.5, 0.5) -- The combination of regular "Damage Taken" and "Breath Damage Taken" caps at 50%. There is no BDTII known as of yet. + + targetBreathDamageAdjustment = utils.clamp(1 + combinedDamageTaken + uBreathDamageTaken, 0, 2) -- Uncapped breath damage modifier. Cap is 100% both ways. + + return targetBreathDamageAdjustment +end + -- Divine seal applies its own multiplier to healing spells when used against undead. xi.spells.damage.calculateDivineSealMultiplier = function(caster, target, skillType) if not caster:hasStatusEffect(xi.effect.DIVINE_SEAL) then @@ -1130,7 +1149,7 @@ xi.spells.damage.useDamageSpell = function(caster, target, spell) local additionalResistTier = xi.spells.damage.calculateAdditionalResistTier(caster, target, spellElement) local sdt = xi.combat.damage.magicalElementSDT(target, spellElement) local dayAndWeather = xi.spells.damage.calculateDayAndWeather(caster, spellElement, forceDayWeatherBonus) - local magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(caster, target, spellId, skillType, spellElement) + local magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(caster, target, spellId, skillType, spellElement, 0) local criticalDamageMultiplier = xi.spells.damage.calculateMagicCriticalMultiplier(caster) local divineSealMultiplier = xi.spells.damage.calculateDivineSealMultiplier(caster, target, skillType) local divineEmblemMultiplier = xi.spells.damage.calculateDivineEmblemMultiplier(caster, skillType) diff --git a/sql/mob_skills.sql b/sql/mob_skills.sql index 60c5f3dbaa5..15b12e3d251 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -1109,7 +1109,7 @@ INSERT INTO `mob_skills` VALUES (1081,743,'frypan',1,0.0,10.0,2000,1500,4,0,0,0, INSERT INTO `mob_skills` VALUES (1082,744,'smokebomb',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1083,745,'smokebomb',0,0.0,10.0,2000,1500,1,0,0,0,0,0,0); -- fail INSERT INTO `mob_skills` VALUES (1084,746,'crispy_candle',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1085,747,'crispy_candle',0,0.0,10.0,2000,1500,1,0,0,0,0,0,0); -- fail +INSERT INTO `mob_skills` VALUES (1085,747,'crispy_candle_self',0,0.0,10.0,2000,1500,1,0,0,0,0,0,0); -- fail INSERT INTO `mob_skills` VALUES (1086,748,'paralysis_shower',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1087,749,'paralysis_shower',0,0.0,10.0,2000,1500,1,0,0,0,0,0,0); -- fail INSERT INTO `mob_skills` VALUES (1088,334,'goblin_rush',0,0.0,7.0,2000,1500,4,0,0,1,0,0,0); From 4e3d25c0aadcf6275fee1d36c9225abeb1ff6b82 Mon Sep 17 00:00:00 2001 From: Umeboshi Date: Mon, 8 Dec 2025 15:43:10 -0800 Subject: [PATCH 2/6] [lua][sql] Correcting Amphiptere Knockback Skill ID --- sql/mob_skills.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/mob_skills.sql b/sql/mob_skills.sql index 15b12e3d251..0df9cf1b64f 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -621,7 +621,7 @@ INSERT INTO `mob_skills` VALUES (593,879,'berserk_bomb_big',0,0.0,7.0,2000,1500, INSERT INTO `mob_skills` VALUES (594,880,'vulcanian_impact',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (595,881,'heat_wave',1,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (596,882,'hellstorm',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (597,883,'self-destruct_bomb_big',1,0.0,20.0,2000,1500,4,0,0,0,0,0,0); +INSERT INTO `mob_skills` VALUES (597,883,'self-destruct_bomb_big',1,0.0,20.0,2000,1500,4,0,0,0,0,0,0); -- Used by Aerial Torpedo in Besieged, Single Target INSERT INTO `mob_skills` VALUES (598,1598,'berserk',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (599,885,'arctic_impact',1,0.0,15.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (600,886,'cold_wave',1,0.0,15.0,2000,1500,4,0,0,0,0,0,0); @@ -2450,7 +2450,7 @@ INSERT INTO `mob_skills` VALUES (2422,1678,'dark_mist',1,0.0,14.0,2000,1000,4,0, INSERT INTO `mob_skills` VALUES (2423,1680,'triumphant_roar',0,0.0,7.0,2000,1000,1,0,0,0,0,0,0); -- standing only. INSERT INTO `mob_skills` VALUES (2424,1681,'terror_eye',4,0.0,10.0,2000,1000,4,0,0,0,0,0,0); -- standing only. INSERT INTO `mob_skills` VALUES (2425,1679,'bloody_claw',0,0.0,7.0,2000,1000,4,0,0,0,0,0,0); --- INSERT INTO `mob_skills` VALUES (2426,1704,'shadow_burst',1,0.0,10.0,2000,0,4,4,0,5,0,0,0); +INSERT INTO `mob_skills` VALUES (2426,1683,'shadow_burst',1,0.0,10.0,2000,3000,4,0,0,0,0,0,0); -- From animation, looks meant to be used from standing. INSERT INTO `mob_skills` VALUES (2427,1705,'tail_lash',4,0.0,10.0,2000,1000,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (2428,1706,'bloody_beak',1,0.0,15.0,2000,1000,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (2429,1707,'feral_peck',0,0.0,9.0,2000,1000,4,0,0,0,0,0,0); From aca65af5d361795ec78239253b8b5ceba9fafe7b Mon Sep 17 00:00:00 2001 From: Umeboshi Date: Mon, 8 Dec 2025 19:39:02 -0800 Subject: [PATCH 3/6] [lua] Magic Mobskill Rework 2/3 --- .../actions/mobskills/binary_absorption.lua | 6 +-- scripts/actions/mobskills/blood_drain.lua | 7 ++- scripts/actions/mobskills/corrosive_ooze.lua | 5 +- scripts/actions/mobskills/fire_ii.lua | 2 +- .../actions/mobskills/flying_hip_press.lua | 4 +- scripts/actions/mobskills/fountain.lua | 17 +++++-- scripts/actions/mobskills/freeze_rush.lua | 3 +- scripts/actions/mobskills/frozen_mist.lua | 33 +++++++------ scripts/actions/mobskills/fulmination.lua | 40 +++++++-------- scripts/actions/mobskills/fuscous_ooze.lua | 22 +++------ scripts/actions/mobskills/gastric_bomb.lua | 26 ++++++---- scripts/actions/mobskills/gates_of_hades.lua | 29 ++++++----- scripts/actions/mobskills/geocrush.lua | 21 +++++--- scripts/actions/mobskills/gigaflare.lua | 49 ++++++++++++------- scripts/actions/mobskills/grand_fall.lua | 19 +++++-- scripts/actions/mobskills/grave_reel.lua | 23 ++++++--- scripts/actions/mobskills/great_sandstorm.lua | 24 +++++---- scripts/actions/mobskills/great_whirlwind.lua | 24 +++++---- scripts/actions/mobskills/gregale_wing.lua | 30 +++++++----- .../actions/mobskills/gregale_wing_air.lua | 33 ++++++++----- .../actions/mobskills/guided_missile_ii.lua | 23 ++++++--- scripts/actions/mobskills/heavenly_strike.lua | 18 +++++-- scripts/actions/mobskills/heavy_whisk.lua | 19 ++++--- scripts/actions/mobskills/hellfire_arrow.lua | 22 ++++++--- scripts/actions/mobskills/hellstorm.lua | 22 ++++++--- scripts/actions/mobskills/hex_palm.lua | 22 ++++++--- .../mobskills/high-tension_discharger.lua | 8 +-- scripts/actions/mobskills/homing_missile.lua | 27 ++++++---- scripts/actions/mobskills/howling_moon.lua | 19 +++++-- scripts/actions/mobskills/hurricane_wing.lua | 29 ++++++----- .../mobskills/hurricane_wing_flying.lua | 32 +++++++----- scripts/actions/mobskills/hydro_ball.lua | 38 ++++++++++---- scripts/actions/mobskills/hydro_cannon.lua | 39 +++++++++++++++ scripts/actions/mobskills/hydro_canon.lua | 44 ----------------- scripts/actions/mobskills/hydro_wave.lua | 36 ++++++++------ scripts/actions/mobskills/hyper_pulse.lua | 7 ++- .../mobskills/hypothermal_combustion.lua | 14 ++++-- scripts/actions/mobskills/ice_break.lua | 22 ++++++--- scripts/actions/mobskills/ice_break_2128.lua | 22 ++++++--- scripts/actions/mobskills/ice_guillotine.lua | 39 +++++++++++++++ scripts/actions/mobskills/ill_wind.lua | 32 ++++++------ scripts/actions/mobskills/impact_stream.lua | 37 ++++++++------ scripts/actions/mobskills/implosion.lua | 21 +++++--- scripts/actions/mobskills/impulsion.lua | 42 ++++++++++++++++ scripts/actions/mobskills/inertia_stream.lua | 20 +++++--- scripts/actions/mobskills/inferno.lua | 19 +++++-- scripts/actions/mobskills/inferno_blast.lua | 27 +++++----- .../actions/mobskills/inferno_blast_alt.lua | 27 ++++++---- scripts/actions/mobskills/ink_jet.lua | 25 +++++++--- scripts/actions/mobskills/ion_shower.lua | 26 ++++++---- scripts/actions/mobskills/iridal_pierce.lua | 17 +++++-- scripts/actions/mobskills/judgment_bolt.lua | 18 +++++-- scripts/actions/mobskills/kartstrahl.lua | 21 +++++--- .../actions/mobskills/knuckle_sandwich.lua | 17 +++++-- scripts/actions/mobskills/lamentation.lua | 29 ++++++----- scripts/actions/mobskills/lava_spit.lua | 20 +++++--- .../actions/mobskills/leeching_current.lua | 29 +++++++---- scripts/actions/mobskills/lesson_in_pain.lua | 14 ++++-- scripts/actions/mobskills/lightning_spear.lua | 29 +++++------ scripts/actions/mobskills/lux_arrow.lua | 17 +++++-- scripts/actions/mobskills/maelstrom.lua | 25 +++++++--- scripts/actions/mobskills/magic_hammer.lua | 29 ++++++++--- scripts/actions/mobskills/magic_mortar.lua | 32 ++++++++++++ scripts/actions/mobskills/malediction.lua | 17 +++++-- .../actions/mobskills/malevolent_blessing.lua | 24 +++++++-- scripts/actions/mobskills/mana_storm.lua | 18 ++++--- scripts/actions/mobskills/marrow_drain.lua | 33 +++++++++---- scripts/actions/mobskills/mega_holy.lua | 26 +++++----- scripts/actions/mobskills/megaflare.lua | 49 +++++++++++++------ scripts/actions/mobskills/meltdown.lua | 20 +++++--- scripts/actions/mobskills/memory_of_dark.lua | 21 +++++--- scripts/actions/mobskills/memory_of_earth.lua | 22 ++++++--- scripts/actions/mobskills/memory_of_fire.lua | 22 ++++++--- scripts/actions/mobskills/memory_of_ice.lua | 22 ++++++--- scripts/actions/mobskills/memory_of_light.lua | 22 ++++++--- .../actions/mobskills/memory_of_lightning.lua | 22 ++++++--- scripts/actions/mobskills/memory_of_water.lua | 22 ++++++--- scripts/actions/mobskills/memory_of_wind.lua | 22 ++++++--- scripts/actions/mobskills/mephitic_spore.lua | 26 ++++++---- scripts/actions/mobskills/meteor.lua | 27 +++++++--- scripts/actions/mobskills/meteor_strike.lua | 17 +++++-- scripts/actions/mobskills/meteorite.lua | 19 ++++--- scripts/actions/mobskills/miasma.lua | 33 +++++++------ scripts/actions/mobskills/miasmic_breath.lua | 37 +++++++++++--- scripts/actions/mobskills/mighty_snort.lua | 19 +++++-- scripts/actions/mobskills/mijin_gakure.lua | 17 +++++-- scripts/actions/mobskills/mind_blast.lua | 28 +++++++---- scripts/actions/mobskills/mine_blast.lua | 32 ++++++++++-- scripts/actions/mobskills/molting_burst.lua | 31 +++++++----- scripts/actions/mobskills/mp_absorption.lua | 21 +++++--- scripts/actions/mobskills/mp_drainkiss.lua | 24 +++++---- .../actions/mobskills/mysterious_light.lua | 23 ++++++--- scripts/actions/mobskills/negative_whirl.lua | 41 ++++++++++------ scripts/actions/mobskills/nerve_gas.lua | 30 ++++++++---- scripts/enum/mob_pool.lua | 1 + sql/mob_skills.sql | 18 +++---- 96 files changed, 1524 insertions(+), 774 deletions(-) create mode 100644 scripts/actions/mobskills/hydro_cannon.lua delete mode 100644 scripts/actions/mobskills/hydro_canon.lua create mode 100644 scripts/actions/mobskills/ice_guillotine.lua create mode 100644 scripts/actions/mobskills/impulsion.lua create mode 100644 scripts/actions/mobskills/magic_mortar.lua diff --git a/scripts/actions/mobskills/binary_absorption.lua b/scripts/actions/mobskills/binary_absorption.lua index 4f89fe3e748..7164fc4dd69 100644 --- a/scripts/actions/mobskills/binary_absorption.lua +++ b/scripts/actions/mobskills/binary_absorption.lua @@ -13,9 +13,9 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 3.5, 3.5, 3.5 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.DARK local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) diff --git a/scripts/actions/mobskills/blood_drain.lua b/scripts/actions/mobskills/blood_drain.lua index 84b7fe56cec..637d9fca369 100644 --- a/scripts/actions/mobskills/blood_drain.lua +++ b/scripts/actions/mobskills/blood_drain.lua @@ -14,9 +14,12 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) local params = {} params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.5, 1.5, 1.5 } + params.fTP = { 1.00, 2.00, 2.83 } params.element = xi.element.DARK - params.dStatMultiplier = 1 + + -- From captures, this HP Drains don't seem to be affected by these. + params.skipResist = true + params.skipMagicBonusDiff = true local shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 diff --git a/scripts/actions/mobskills/corrosive_ooze.lua b/scripts/actions/mobskills/corrosive_ooze.lua index 57e9d9680c1..07adb0aafff 100644 --- a/scripts/actions/mobskills/corrosive_ooze.lua +++ b/scripts/actions/mobskills/corrosive_ooze.lua @@ -23,9 +23,8 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - -- TODO: Capture power/durations - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, 15, 0, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEFENSE_DOWN, 15, 0, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, 33, 0, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEFENSE_DOWN, 33, 0, 120) end return damage diff --git a/scripts/actions/mobskills/fire_ii.lua b/scripts/actions/mobskills/fire_ii.lua index a72750c5438..0d6d97ef45e 100644 --- a/scripts/actions/mobskills/fire_ii.lua +++ b/scripts/actions/mobskills/fire_ii.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Fire II -- Family: Avatar (Ifrit) --- Description: Deals fire elemental damage. Damage varies with TP. +-- Description: Deals Fire elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} diff --git a/scripts/actions/mobskills/flying_hip_press.lua b/scripts/actions/mobskills/flying_hip_press.lua index 5fa2635040c..932e612b74a 100644 --- a/scripts/actions/mobskills/flying_hip_press.lua +++ b/scripts/actions/mobskills/flying_hip_press.lua @@ -2,7 +2,7 @@ -- Flying Hip Press -- Family: Bugbears -- Description: Deals Wind damage to enemies within area of effect. --- Note: Mobskill is NOT a breath attack like the BLU spell is. +-- Note: Mob version of this skill is NOT a breath attack like the BLU spell is. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,7 +15,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) local params = {} params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 3.0 } + params.fTP = { 2.0, 2.0, 2.0 } params.element = xi.element.WIND if mob:getPool() == xi.mobPool.BUGBOY then diff --git a/scripts/actions/mobskills/fountain.lua b/scripts/actions/mobskills/fountain.lua index 2495b5e8fea..129619d44eb 100644 --- a/scripts/actions/mobskills/fountain.lua +++ b/scripts/actions/mobskills/fountain.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Fountain --- Deals water damage. +-- Family: Orc Warmachines +-- Description: Deals Water damage to targets in front of mob. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.WATER + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end return damage end diff --git a/scripts/actions/mobskills/freeze_rush.lua b/scripts/actions/mobskills/freeze_rush.lua index 8dc8567b63e..8cbc85ccd4d 100644 --- a/scripts/actions/mobskills/freeze_rush.lua +++ b/scripts/actions/mobskills/freeze_rush.lua @@ -17,7 +17,8 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) local accmod = 1 local ftp = 2 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) + local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) + -- TODO: Get captures for this skill to determine if physical or magical target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) diff --git a/scripts/actions/mobskills/frozen_mist.lua b/scripts/actions/mobskills/frozen_mist.lua index 9953be43f7c..6bca8be3b79 100644 --- a/scripts/actions/mobskills/frozen_mist.lua +++ b/scripts/actions/mobskills/frozen_mist.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Frozen Mist --- Description: Deals ice damage to enemies around the caster. Additional effect: Terror --- Type: Magical (Ice) +-- Frozen Mist +-- Family: Ruszors +-- Description: Deals Ice damage to enemies around the caster. Additional Effect: Terror ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,20 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- ice aura that provides special stoneskin that absorbs only physical damage - skill:setFinalAnimationSub(1) - mob:delStatusEffectSilent(xi.effect.STONESKIN) - mob:addStatusEffect(xi.effect.STONESKIN, 0, 0, 180, 1, 1500) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.ICE - local damage = mob:getWeaponDmg() - local resistRate = xi.combat.magicHitRate.calculateResistRate(mob, target, 0, 0, 0, xi.element.ICE, xi.mod.INT, xi.effect.TERROR, 0) - local duration = math.floor(30 * resistRate) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 1.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.TERROR, 30, 0, duration) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.TERROR, 1, 0, 30) + end + + -- Ice aura that provides special stoneskin that absorbs only physical damage + skill:setFinalAnimationSub(1) + mob:delStatusEffectSilent(xi.effect.STONESKIN) + mob:addStatusEffect(xi.effect.STONESKIN, 0, 0, 180, 1, 1500) return damage end diff --git a/scripts/actions/mobskills/fulmination.lua b/scripts/actions/mobskills/fulmination.lua index f85d7bc506a..fb85159d596 100644 --- a/scripts/actions/mobskills/fulmination.lua +++ b/scripts/actions/mobskills/fulmination.lua @@ -1,38 +1,32 @@ ----------------------------------- -- Fulmination --- --- Description: Deals heavy magical damage in an area of effect. Additional effect: Paralysis + Stun --- Type: Magical --- Utsusemi/Blink absorb: Wipes Shadows --- Range: 30 yalms +-- Family: Khimaira +-- Description: Deals Thunder damage in an area of effect. Additional Effect: Paralysis, Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - local family = mob:getFamily() - local mobHPP = mob:getHPP() - - if family == 168 and mobHPP < 35 then -- Khimaira < 35% - return 0 - elseif family == 315 and mobHPP < 50 then -- Tyger < 50% - return 0 - elseif family == 316 and mobHPP < 50 then -- Pandemonium Warden - return 0 - end - - return 1 + return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 12, 12, 12 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 3, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 0, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + -- TODO: Capture power/durations + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 0, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + end return damage end diff --git a/scripts/actions/mobskills/fuscous_ooze.lua b/scripts/actions/mobskills/fuscous_ooze.lua index 30bdd067c38..3e9d18c4c5b 100644 --- a/scripts/actions/mobskills/fuscous_ooze.lua +++ b/scripts/actions/mobskills/fuscous_ooze.lua @@ -1,10 +1,7 @@ ----------------------------------- --- Fuscous Ooze --- Family: Slugs --- Description: A dusky slime inflicts encumbrance and weight. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Cone +-- Fuscous Ooze +-- Family: Slugs +-- Description: Inflicts Encumbrance and Weight. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,17 +11,14 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3.7 local duration = math.random(30, 45) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + skill:setMsg(xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 50, 0, duration)) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ENCUMBRANCE_II, 0xFFFF, 0, duration) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ENCUMBRANCE_II, math.random(1, 16), 0, duration) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 50, 0, duration) - - return damage + -- This skill does not return a specific effect in the message. + -- Message returns " uses Fuscous Ooze" and repeats for each target hit. + return xi.msg.basic.USES end return mobskillObject diff --git a/scripts/actions/mobskills/gastric_bomb.lua b/scripts/actions/mobskills/gastric_bomb.lua index e206a1e06da..270d3679940 100644 --- a/scripts/actions/mobskills/gastric_bomb.lua +++ b/scripts/actions/mobskills/gastric_bomb.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Gastric Bomb --- Deals Water damage with a long-range acid bomb. Additional effect: Attack Down --- Range: Long range --- Notes: Attack Down effect is 50%. --- Duration: Three minutes +-- Family: Worms +-- Description: Deals Water damage with a long-range acid bomb. Additional Effect: Attack Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.WATER + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, 50, 0, 180) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + -- TODO: Dreamland Dynamis ATTP power. + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, 50, 0, 180) + end return damage end diff --git a/scripts/actions/mobskills/gates_of_hades.lua b/scripts/actions/mobskills/gates_of_hades.lua index 04dbb5e1745..4b85355e718 100644 --- a/scripts/actions/mobskills/gates_of_hades.lua +++ b/scripts/actions/mobskills/gates_of_hades.lua @@ -1,10 +1,8 @@ ----------------------------------- --- Gates of Hades --- Description: Deals severe Fire damage to enemies within an area of effect. Additional effect: Burn --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 20' radial --- Notes: Only used when a cerberus's health is 25% or lower (may not be the case for Orthrus). The burn effect takes off upwards of 20 HP per tick. +-- Gates of Hades +-- Family: Cerberus +-- Description: Deals severe Fire damage to enemies within an area of effect. Additional effect: Burn +-- Notes: Only used when a cerberus's health is 25% or lower (may not be the case for Orthrus). The burn effect takes off upwards of 20 HP per tick. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -18,13 +16,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 6 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1.8, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + params.fTP = { 12.5, 12.5, 12.5 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 21, 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + local power = 30 + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, power, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/geocrush.lua b/scripts/actions/mobskills/geocrush.lua index 87014205868..1dcf03c4d62 100644 --- a/scripts/actions/mobskills/geocrush.lua +++ b/scripts/actions/mobskills/geocrush.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Geocrush --- Titan deals Earth elemental damage and stuns target. +-- Family: Avatar (Titan) +-- Description: Titan deals Earth elemental damage and stuns target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs + params.element = xi.element.EARTH + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 6) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 6) + end return damage end diff --git a/scripts/actions/mobskills/gigaflare.lua b/scripts/actions/mobskills/gigaflare.lua index 7c0d2d23a73..b36e7df5528 100644 --- a/scripts/actions/mobskills/gigaflare.lua +++ b/scripts/actions/mobskills/gigaflare.lua @@ -1,21 +1,19 @@ ----------------------------------- --- Gigaflare --- Family: Bahamut --- Description: Deals massive Fire damage to enemies within a fan-shaped area. --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: --- Notes: Used by Bahamut when at 10% of its HP, and can use anytime afterwards at will. +-- Gigaflare +-- Family: Bahamut +-- Description: Deals massive Fire damage to enemies within a fan-shaped area. +-- Notes: Used by Bahamut when at 10% of its HP, and can use anytime afterwards at will. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: This logic should probably be in mob script. local mobhp = mob:getHPP() - if mobhp <= 10 then -- set up Gigaflare for being called by the script again. + if mobhp <= 10 then -- Set up Gigaflare for being called by the script again. mob:setLocalVar('GigaFlare', 0) - mob:setMobAbilityEnabled(false) -- disable mobskills/spells until Gigaflare is used successfully (don't want to delay it/queue Megaflare) + mob:setMobAbilityEnabled(false) -- Disable mobskills/spells until Gigaflare is used successfully (don't want to delay it/queue Megaflare) mob:setMagicCastingEnabled(false) end @@ -23,22 +21,39 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + params.fTP = { 14, 14, 14 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1.5 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + + -- Targets that are not the primary target take 300 less damage. + if + target:getID() ~= skill:getPrimaryTargetID() and + info.damage > 0 -- Damage was not nullified or absorbed. + then + info.damage = math.max(0, info.damage - 300) + end + + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + -- TODO: This logic can probably be in the mob script. mob:setLocalVar('GigaFlare', 1) -- When set to 1 the script won't call it. mob:setLocalVar('tauntShown', 0) - mob:setMobAbilityEnabled(true) -- enable the spells/other mobskills again + mob:setMobAbilityEnabled(true) -- Enable the spells/other mobskills again mob:setMagicCastingEnabled(true) if bit.band(mob:getBehavior(), xi.behavior.NO_TURN) == 0 then -- re-enable noturn mob:setBehavior(bit.bor(mob:getBehavior(), xi.behavior.NO_TURN)) end - local damage = mob:getWeaponDmg() * 15 - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - return damage end diff --git a/scripts/actions/mobskills/grand_fall.lua b/scripts/actions/mobskills/grand_fall.lua index 85fbbda297e..0e84eb7d804 100644 --- a/scripts/actions/mobskills/grand_fall.lua +++ b/scripts/actions/mobskills/grand_fall.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Grand Fall --- Leviathan deals water elemental damage to target. +-- Family: Avatar (Leviathan) +-- Description: Leviathan deals Water elemental damage to target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,14 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 3, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } -- TODO: Capture fTPs + params.element = xi.element.WATER + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end return damage end return mobskillObject + diff --git a/scripts/actions/mobskills/grave_reel.lua b/scripts/actions/mobskills/grave_reel.lua index 226eb8d35a0..30f45c09881 100644 --- a/scripts/actions/mobskills/grave_reel.lua +++ b/scripts/actions/mobskills/grave_reel.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Blood Drain --- Description: Steals an enemy's HP. Ineffective against undead. --- Type: Magical (Dark) --- Utsusemi/Blink absorb: Wipes shadows --- Range: 15.0' radial +-- Grave Reel +-- Family: Ghosts +-- Description: Steals HP from targets around mob. Ineffective against undead. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 1.0, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.0, 1.0 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end return damage end return mobskillObject + diff --git a/scripts/actions/mobskills/great_sandstorm.lua b/scripts/actions/mobskills/great_sandstorm.lua index aa2a70f97d6..74bb7238cd1 100644 --- a/scripts/actions/mobskills/great_sandstorm.lua +++ b/scripts/actions/mobskills/great_sandstorm.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Great Sandstorm --- Description: Deals Wind damage to single target. Additional effect: Blind --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Single target +-- Great Sandstorm +-- Family: Manticores +-- Description: Deals Earth damage to single target. Additional Effect: Blind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() * 3, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + params.baseDamage = mob:getMainLvl() + params.fTP = { 3, 3, 3 } + params.element = xi.element.EARTH - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 20, 0, 180) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 20, 0, 180) + end return damage end diff --git a/scripts/actions/mobskills/great_whirlwind.lua b/scripts/actions/mobskills/great_whirlwind.lua index 9cbe631132a..34e9ade8b97 100644 --- a/scripts/actions/mobskills/great_whirlwind.lua +++ b/scripts/actions/mobskills/great_whirlwind.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Great Whirlwind --- Description: Deals Wind damage to targets in front. Additional effect: Choke --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown cone +-- Great Whirlwind +-- Family: Manticores +-- Description: Deals Wind damage to targets in front. Additional Effect: Choke ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() * 4, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + params.baseDamage = mob:getMainLvl() + params.fTP = { 4, 4, 4 } + params.element = xi.element.WIND - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CHOKE, 3, 3, 90) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CHOKE, 3, 3, 90) + end return damage end diff --git a/scripts/actions/mobskills/gregale_wing.lua b/scripts/actions/mobskills/gregale_wing.lua index cbcc3449bf1..80b14369edf 100644 --- a/scripts/actions/mobskills/gregale_wing.lua +++ b/scripts/actions/mobskills/gregale_wing.lua @@ -1,10 +1,8 @@ ----------------------------------- --- Gregale Wing --- Description: An icy wind deals Ice damage to enemies within a very wide area of effect. Additional effect: Paralyze --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 30' radial. --- Notes: Used only by Jormungand and Isgebind +-- Gregale Wing +-- Family: Wyrms +-- Description: An icy wind deals Ice damage to enemies within a very wide area of effect. Additional Effect: Paralyze +-- Notes: Used by Jormungand and Isgebind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,7 +10,7 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) if mob:hasStatusEffect(xi.effect.BLOOD_WEAPON) then return 1 - elseif mob:getAnimationSub() == 1 then + elseif mob:getAnimationSub() == 1 then -- Only use while on ground return 1 elseif target:isBehind(mob, 48) then return 1 @@ -22,11 +20,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 0, 120) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + + -- TODO: Capture power/duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/gregale_wing_air.lua b/scripts/actions/mobskills/gregale_wing_air.lua index 94a72899b09..ecc755be95b 100644 --- a/scripts/actions/mobskills/gregale_wing_air.lua +++ b/scripts/actions/mobskills/gregale_wing_air.lua @@ -1,17 +1,14 @@ ----------------------------------- --- Gregale Wing --- --- Description: An icy wind deals Ice damage to enemies within a very wide area of effect. Additional effect: Paralyze --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 30' radial. --- Notes: Used only Jormungand and Isgebind +-- Gregale Wing +-- Family: Wyrms +-- Description: An icy wind deals Ice damage to enemies within a very wide area of effect. Additional Effect: Paralyze +-- Notes: Used by Jormungand and Isgebind ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getAnimationSub() ~= 1 then + if mob:getAnimationSub() ~= 1 then -- Only use while flying return 1 end @@ -19,13 +16,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 6, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 0, 120) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + + -- TODO: Capture power/duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 0, 120) + end return damage end -return mobskillObject +return mobskillObject \ No newline at end of file diff --git a/scripts/actions/mobskills/guided_missile_ii.lua b/scripts/actions/mobskills/guided_missile_ii.lua index cd74ecc9681..57063ba3a57 100644 --- a/scripts/actions/mobskills/guided_missile_ii.lua +++ b/scripts/actions/mobskills/guided_missile_ii.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Guided_Missile_II --- Description: ~475 magic damage, ignores Utsusemi --- Type: Magical --- Range: 5 yalms +-- Guided Missile II +-- Family: Omega +-- Notes: Similar to Guided Missile but used during standing form. Ignores Shadows. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -16,12 +15,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + -- TODO: This is a physical skill, will fix in mobPhysicalMove() PR. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/heavenly_strike.lua b/scripts/actions/mobskills/heavenly_strike.lua index 407766cbf78..a1502909419 100644 --- a/scripts/actions/mobskills/heavenly_strike.lua +++ b/scripts/actions/mobskills/heavenly_strike.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Heavenly Strike --- Shiva deals ice damage to target. +-- Family: Avatar (Shiva) +-- Description: Shiva deals ice damage to target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 2.7, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.7, 2.7, 2.7 } -- TODO: Capture fTPs + params.element = xi.element.ICE + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + end return damage end diff --git a/scripts/actions/mobskills/heavy_whisk.lua b/scripts/actions/mobskills/heavy_whisk.lua index eb729d97505..23d8b54a19d 100644 --- a/scripts/actions/mobskills/heavy_whisk.lua +++ b/scripts/actions/mobskills/heavy_whisk.lua @@ -1,8 +1,7 @@ ----------------------------------- -- Heavy Whisk --- Description: Deals Wind Damage, Additional Effect : Knockback --- Type: Wind (Magical) --- Utsusemi/Blink absorb: Ignores shadows +-- Family: Bugbears +-- Description: Deals Wind Damage to a target. Additional Effect : Knockback ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 3.5, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.WIND + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/hellfire_arrow.lua b/scripts/actions/mobskills/hellfire_arrow.lua index 519e4743dec..c0c1f9674dc 100644 --- a/scripts/actions/mobskills/hellfire_arrow.lua +++ b/scripts/actions/mobskills/hellfire_arrow.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Hellfire Arrow +-- Family: Yztarg (Red) +-- Description: Deals Fire damage to targets in front of mob. Additional Effect: Burn ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,14 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2.7 - local power = math.random(10, 30) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.7, 2.7, 2.7 } -- TODO: Capture fTPs + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, power, 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + -- TODO: Capture power/duration + local power = math.random(10, 30) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, power, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/hellstorm.lua b/scripts/actions/mobskills/hellstorm.lua index 93f4a8502ee..d7cb5524c0e 100644 --- a/scripts/actions/mobskills/hellstorm.lua +++ b/scripts/actions/mobskills/hellstorm.lua @@ -1,9 +1,6 @@ -- Hellstorm --- Description : Deals fire damage to targets in a cone --- Type: Magical Fire damage --- Utsusemi/Blink absorb: Ignores shadows --- Range: 10' cone --- Hellstorm is only used by large or giant bombs. +-- Family: Bombs +-- Description: Deals Fire damage to targets in front of mob. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,10 +10,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 4, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } -- TODO: Capture fTPs + params.element = xi.element.FIRE + -- TODO: Possible breathMove. Need captures + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/hex_palm.lua b/scripts/actions/mobskills/hex_palm.lua index 57e97c0e8f1..89106357610 100644 --- a/scripts/actions/mobskills/hex_palm.lua +++ b/scripts/actions/mobskills/hex_palm.lua @@ -2,16 +2,16 @@ -- Hex Palm -- Family: Qutrub -- Description: Steals HP from targets in front. --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: Front cone -- Notes: Used only when wielding no weapon. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getAnimationSub() == 1 or mob:getAnimationSub() == 3 then + if + mob:getAnimationSub() == 1 or -- Main weapon broken, sub weapon sheathed + mob:getAnimationSub() == 3 -- Both weapons broken + then return 0 else return 1 @@ -19,12 +19,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getMainLvl() * 2 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + params.fTP = { 2, 2, 2 } + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/high-tension_discharger.lua b/scripts/actions/mobskills/high-tension_discharger.lua index bccd0d9826d..fcb2d959197 100644 --- a/scripts/actions/mobskills/high-tension_discharger.lua +++ b/scripts/actions/mobskills/high-tension_discharger.lua @@ -1,7 +1,7 @@ ----------------------------------- --- High-Tension Discharger +-- High-Tension_Discharger -- Family: Ultima --- Description: Discharges a powerful current that deals Lightning damage to players in a fan-shaped area. Additional Effect: Stun +-- Description: Discharges a powerful current that deals Thunder damage to players in a fan-shaped area. Additional Effect: Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -28,14 +28,14 @@ mobskillObject.onMobWeaponSkill = function(target, mob, 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.STUN, 1, 3, 4) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) if target:hasStatusEffect(xi.effect.ELEMENTALRES_DOWN) then target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) end end - mob:setLocalVar('nuclearWaste', 0) -- TODO: Migrate to mob script + mob:setLocalVar('nuclearWaste', 0) -- TODO: Move to mob script? return info.damage end diff --git a/scripts/actions/mobskills/homing_missile.lua b/scripts/actions/mobskills/homing_missile.lua index 549a38ecec3..b5b1222dfc9 100644 --- a/scripts/actions/mobskills/homing_missile.lua +++ b/scripts/actions/mobskills/homing_missile.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Homing Missle +-- Family: Chariots +-- Description: Deals near death damage to target. Resets hate. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,19 +11,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local targetcurrentHP = target:getHP() - local targetmaxHP = target:getMaxHP() - local hpset = targetmaxHP * 0.20 - local dmg = 0 + local params = {} - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + params.baseDamage = target:getHP() * 0.90 + params.fTP = { 1, 1, 1 } + params.element = xi.element.NONE -- TODO: Capture element (Possibly Fire?) + params.skipTMDA = true -- TODO: Is it reduced by Shell? - if targetcurrentHP > hpset then - dmg = targetcurrentHP - hpset + -- TODO: Long-Bowed Chariot mechanics + -- https://www.bg-wiki.com/ffxi/Long-Bowed_Chariot + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + + mob:resetEnmity(target) end - target:takeDamage(dmg, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, { breakBind = false }) - return dmg + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/howling_moon.lua b/scripts/actions/mobskills/howling_moon.lua index b19c14b9c0c..77d0a5156ce 100644 --- a/scripts/actions/mobskills/howling_moon.lua +++ b/scripts/actions/mobskills/howling_moon.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Howling Moon --- Deals dark elemental damage to enemies within area of effect. +-- Family: Avatar (Fenrir) +-- Description: Deals Dark elemental damage to enemies within area of effect. +-- Notes: Astral Flow skill. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +12,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 3, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.DARK + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/hurricane_wing.lua b/scripts/actions/mobskills/hurricane_wing.lua index 0c9491356b3..e1d500c1d5a 100644 --- a/scripts/actions/mobskills/hurricane_wing.lua +++ b/scripts/actions/mobskills/hurricane_wing.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Hurricane Wing --- +-- Family: Wyrm -- Description: Deals hurricane-force wind damage to enemies within a very wide area of effect. Additional effect: Blind --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 30' radial. -- Notes: Used only by Dragua, Fafnir, Nidhogg, Cynoprosopi, Wyrm, and Odzmanouk. The blinding effect does not last long -- but is very harsh. The attack is wide enough to generally hit an entire alliance. ----------------------------------- @@ -22,15 +19,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.250, 3.625, 4.000 } + params.element = xi.element.WIND - if mob:getPool() == xi.mobPool.NIDHOGG then - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 160, 0, 30) - else - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 100, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + local power = 100 + + if mob:getPool() == xi.mobPools.NIDHOGG then + power = 160 + end + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, power, 0, 30) end return damage diff --git a/scripts/actions/mobskills/hurricane_wing_flying.lua b/scripts/actions/mobskills/hurricane_wing_flying.lua index 55595d0978d..79d9071b090 100644 --- a/scripts/actions/mobskills/hurricane_wing_flying.lua +++ b/scripts/actions/mobskills/hurricane_wing_flying.lua @@ -1,26 +1,36 @@ ----------------------------------- --- Hurricane Wing (Airborne Version) --- --- Description: Deals hurricane-force wind damage to enemies within a very wide area of effect. Additional effect: Blind --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 30' radial. --- Notes: Used only by Wyrm when in the air. Only use in a dedicated flying skill set. +-- Hurricane Wing (Airborne Version) +-- Family: Wyrm +-- Description: Deals hurricane-force wind damage to enemies within a very wide area of effect. Additional Effect: Blind +-- Notes: Used by Wyrm when in the air. Only use in a dedicated flying skill set. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + if mob:getAnimationSub() ~= 1 then -- Only use while flying + return 1 + end + return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.250, 3.625, 4.000 } + params.element = xi.element.WIND + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 100, 0, 30) + local power = 100 + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, power, 0, 30) + end return damage end diff --git a/scripts/actions/mobskills/hydro_ball.lua b/scripts/actions/mobskills/hydro_ball.lua index 5ab30791ab3..44cee8958ca 100644 --- a/scripts/actions/mobskills/hydro_ball.lua +++ b/scripts/actions/mobskills/hydro_ball.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Hydroball --- Deals Water damage to targets in a fan-shaped area of effect. Additional effect: STR Down --- Type: Breath --- Utsusemi/Blink absorb: Ignores shadows --- Notes: STR reduced by 15%. +-- Hydroball +-- Family: Sahagin +-- Description: Deals Water damage to targets in a fan-shaped area of effect. Additional Effect: STR Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +11,33 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3.5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.WATER + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, 10, 3, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + -- TODO: JP Wiki states this scales off mob level. + -- https://discord.com/channels/443544205206355968/674750598939279400/1367925653667840250 + + -- Need more captures to determine proper forumula. + -- Capture thread: https://discord.com/channels/443544205206355968/674750598939279400/1367925653667840250 + + -- There are at least 2 different versions of this move. Tan sahagin use skillID 771 while blue uses 772. + -- Tan models seem to have a slightly weaker STR down. + + -- Captures had -17 STR at Level 35 and reaching -32 STR at 75. + local power = math.ceil(mob:getMainLvl() * 0.375 + 3.875) -- Basic scaling formula for now until we get more data. + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, power, 9, 120) + end return damage end diff --git a/scripts/actions/mobskills/hydro_cannon.lua b/scripts/actions/mobskills/hydro_cannon.lua new file mode 100644 index 00000000000..a34275dfff7 --- /dev/null +++ b/scripts/actions/mobskills/hydro_cannon.lua @@ -0,0 +1,39 @@ +----------------------------------- +-- Hydro Cannon +-- Family: Ultima +-- Description: Deals Water damage in a conal AOE. Additional Effect : 30hp/tick Poison +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = 350 + params.fTP = { 1, 1, 1 } + params.element = xi.element.WATER + params.useTBDA = true + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.POISON, 30, 3, 120) + + if target:hasStatusEffect(xi.effect.ELEMENTALRES_DOWN) then + target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) + end + end + + mob:setLocalVar('nuclearWaste', 0) -- TODO: Handle in mob script? + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/hydro_canon.lua b/scripts/actions/mobskills/hydro_canon.lua deleted file mode 100644 index d07d5abd9c0..00000000000 --- a/scripts/actions/mobskills/hydro_canon.lua +++ /dev/null @@ -1,44 +0,0 @@ ------------------------------------ --- Hydro_Canon --- Description: --- Type: Magical --- additional effect : 40hp/tick Poison ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) - local params = {} - - params.percentMultipier = 0.05 - params.damageCap = 490 - params.bonusDamage = 0 - params.mAccuracyBonus = { 0, 0, 0 } - params.resistStat = xi.mod.INT - params.element = xi.element.WATER - params.attackType = xi.attackType.BREATH - params.damageType = xi.damageType.WATER - 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) - - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 50, 3, 120) - - if target:hasStatusEffect(xi.effect.ELEMENTALRES_DOWN) then - target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) - end - end - - mob:setLocalVar('nuclearWaste', 0) -- TODO: Migrate to mob script - - return info.damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/hydro_wave.lua b/scripts/actions/mobskills/hydro_wave.lua index 41b9008b662..ebad1814729 100644 --- a/scripts/actions/mobskills/hydro_wave.lua +++ b/scripts/actions/mobskills/hydro_wave.lua @@ -1,7 +1,8 @@ ----------------------------------- --- Hydro Wave --- Description: Deals water damage to enemies around the caster. --- Type: Magical (Water) +-- Hydro Wave +-- Family: Ruszors +-- Description: Deals Water damage to enemies around the caster. Removes 1 piece of equipment. +-- Notes: Ruszors will absorb Water damage after using this move. (Handled in Ruszor mixin) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,21 +12,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- water aura that provides special stoneskin that absorbs only magical/breath/non-elemental damage - skill:setFinalAnimationSub(2) - mob:delStatusEffectSilent(xi.effect.STONESKIN) - mob:addStatusEffect(xi.effect.STONESKIN, 0, 0, 180, 2, 1500) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.50, 2.50, 2.50 } + params.element = xi.element.WATER - local damage = mob:getWeaponDmg() - local power = math.random(1, 16) - local resistRate = xi.combat.magicHitRate.calculateResistRate(mob, target, 0, 0, 0, xi.element.WATER, xi.mod.INT, xi.effect.ENCUMBRANCE_II, 0) - local duration = math.floor(30 * resistRate) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 2.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ENCUMBRANCE_II, power, 0, duration) + -- Remove 1 piece of equipment from a random slot. + xi.mobskills.unequipRandomSlots(target, 1) + end + + -- Water aura that provides special stoneskin that absorbs only magical/breath/non-elemental damage + skill:setFinalAnimationSub(2) + mob:delStatusEffectSilent(xi.effect.STONESKIN) + mob:addStatusEffect(xi.effect.STONESKIN, 0, 0, 180, 2, 1500) return damage end diff --git a/scripts/actions/mobskills/hyper_pulse.lua b/scripts/actions/mobskills/hyper_pulse.lua index e139793bab4..6a05f8a760e 100644 --- a/scripts/actions/mobskills/hyper_pulse.lua +++ b/scripts/actions/mobskills/hyper_pulse.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Hyper_Pulse --- --- Description: 300 magic damage, Gravity and short Bind, wipes Utsusemi --- Type: Physical +-- Hyper Pulse +-- Family: Omega +-- Description: Deals damage. Additional Effect: Bind, Gravity ----------------------------------- ---@type TMobSkill local mobskillObject = {} diff --git a/scripts/actions/mobskills/hypothermal_combustion.lua b/scripts/actions/mobskills/hypothermal_combustion.lua index 1e004392418..c60678151c2 100644 --- a/scripts/actions/mobskills/hypothermal_combustion.lua +++ b/scripts/actions/mobskills/hypothermal_combustion.lua @@ -17,12 +17,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getHP() / 3) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() / 3 + params.fTP = { 1, 1, 1 } + params.element = xi.element.ICE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + end return damage end diff --git a/scripts/actions/mobskills/ice_break.lua b/scripts/actions/mobskills/ice_break.lua index 6ce33e48512..c67dae057dc 100644 --- a/scripts/actions/mobskills/ice_break.lua +++ b/scripts/actions/mobskills/ice_break.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Ice Break --- Deals ice damage to enemies within range. Additional Effect: "Bind." +-- Family: Golems +-- Description: Deals Ice damage to enemies within range. Additional Effect: Bind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- TODO: Damage should be 1 + dINT - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, math.random(120, 180)) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.ICE + params.dStatMultiplier = 1 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE, { breakBind = false }) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, xi.mobskills.calculateDuration(skill:getTP(), 120, 180)) + end return damage end diff --git a/scripts/actions/mobskills/ice_break_2128.lua b/scripts/actions/mobskills/ice_break_2128.lua index 23183cb18a6..2f954460772 100644 --- a/scripts/actions/mobskills/ice_break_2128.lua +++ b/scripts/actions/mobskills/ice_break_2128.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Ice Break (Hrungnir) +-- Family: Golems -- Description: Deals ice damage to enemies within range. Additional Effect: "Bind." --- Type: Magical (Ice) -- Note: Shows as a regular attack ----------------------------------- ---@type TMobSkill @@ -12,14 +12,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.ICE + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) - skill:setMsg(xi.msg.basic.HIT_DMG) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE, { breakBind = false }) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, xi.mobskills.calculateDuration(skill:getTP(), 120, 180)) + skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Handle in final adjustments eventually. + end return damage end diff --git a/scripts/actions/mobskills/ice_guillotine.lua b/scripts/actions/mobskills/ice_guillotine.lua new file mode 100644 index 00000000000..3dd8dce515d --- /dev/null +++ b/scripts/actions/mobskills/ice_guillotine.lua @@ -0,0 +1,39 @@ +----------------------------------- +-- Ice Guillotine +-- Family: Ruszors +-- Description: Bites at all targets in front. Additional Effect: Max HP Down +-- Notes: +-- * Scylla exclusive, this skill is not used on its own and is scripted to fire after Frozen Mist is used. +-- * This skill can be dodged by side stepping. +-- * Skill can not be interrupted by being out of range. The skill will always go off and hit anyone inside the cone. +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + + -- TODO: Capture durations of effects + -- Capture power of Amnesia. + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MAX_HP_DOWN, 50, 0, 180) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.AMNESIA, 1, 0, 60) + -- TODO: Scylla gains a Paralysis aura after using this skill. Maybe handle in mob script. + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/ill_wind.lua b/scripts/actions/mobskills/ill_wind.lua index dcddfb91f84..90e25acbb76 100644 --- a/scripts/actions/mobskills/ill_wind.lua +++ b/scripts/actions/mobskills/ill_wind.lua @@ -1,30 +1,30 @@ ----------------------------------- --- Ill Wind --- Description: Deals Wind damage to enemies within an area of effect. Additional effect: Dispel --- Type: Magical --- Utsusemi/Blink absorb: Wipes Shadows --- Range: Unknown radial --- Notes: Only used by Puks in Mamook, Besieged, and the following Notorious Monsters: Vulpangue, Nis Puk, Nguruvilu, Seps , Phantom Puk and Waugyl. Dispels one xi.effect. +-- Ill Wind +-- Family: Puks +-- Description: Deals Wind damage to enemies within an area of effect. Additional Effect: Dispel (1 Effect) +-- Notes: Used by Puks in Mamook, Besieged, and the following Notorious Monsters: Vulpangue, Nis Puk, Nguruvilu, Seps , Phantom Puk and Waugyl. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getFamily() == 316 and mob:getModelId() == 1746 then - return 0 - else - return 1 - end end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.5) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.WIND - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - target:dispelStatusEffect() - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + target:dispelStatusEffect() + end return damage end diff --git a/scripts/actions/mobskills/impact_stream.lua b/scripts/actions/mobskills/impact_stream.lua index de6863974fc..557c4f47729 100644 --- a/scripts/actions/mobskills/impact_stream.lua +++ b/scripts/actions/mobskills/impact_stream.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Impact Stream --- Description: 50% Defense Down, Stun --- Type: Magical --- Wipe Shadows --- Range: 10.0' AoE +-- Impact Stream +-- Family: Aerns +-- Description: Deals unaspected magic damage. Additional Effect: Defense Down, Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,19 +11,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() * 2, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + params.baseDamage = mob:getMainLvl() + params.fTP = { 2, 2, 2 } + params.element = xi.element.NONE - -- Defense down power scales with TP - -- 1000-1999 = 50 - -- 2000-2999 = 55 - -- 3000 = 60 - local power = 50 + 5 * math.floor((skill:getTP() - 1000) / 1000) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEFENSE_DOWN, power, 0, 60) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + + -- TODO: Turn this into a function that can be used everywhere. + -- Defense down power scales with TP + -- 1000-1999 = 50 + -- 2000-2999 = 55 + -- 3000 = 60 + local power = 50 + 5 * math.floor((skill:getTP() - 1000) / 1000) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEFENSE_DOWN, power, 0, 60) -- TODO: Capture duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + end return damage end diff --git a/scripts/actions/mobskills/implosion.lua b/scripts/actions/mobskills/implosion.lua index 00e14e92d45..09f828c7389 100644 --- a/scripts/actions/mobskills/implosion.lua +++ b/scripts/actions/mobskills/implosion.lua @@ -1,9 +1,9 @@ ----------------------------------- -- Implosion +-- Family: Shadow Lord -- Description: Channels a wave of negative energy, damaging all targets in very wide area of effect. --- Type: Magical --- Wipes Shadows --- Range: 10' radial +-- Notes: Used during phase 2 of Shadow Lord mission fight. +-- Also used by Shadow Lord in past but with different properties. https://wiki.ffo.jp/html/19868.html ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,10 +13,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + -- TODO: Version used in past reportedly deals 50% Max HP Damage + Knockback + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/impulsion.lua b/scripts/actions/mobskills/impulsion.lua new file mode 100644 index 00000000000..68ee0f4c7fa --- /dev/null +++ b/scripts/actions/mobskills/impulsion.lua @@ -0,0 +1,42 @@ +--------------------------------------------- +-- Impulsion +-- Family: Bahamut +-- Description: Deals unaspected magical damage to enemies within an area of effect. Additional Effects: Blind, Knockback, Petrification +-- Note: Used by Bahamut in The Wyrmking Descends +--------------------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + params.fTP = { 2.75, 2.75, 2.75 } + params.element = xi.element.NONE + -- TODO: Does this ignore or wipe shadows? + -- TODO: Capture Knockback + + -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=A915 + -- TODO: Once Gigaflare is available for use, the fTP of this skill increases to 5.50. + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + + local petrifyDuration = 15 + -- TODO: Once Gigaflare is available for use, the duration of petrification increases to 30. + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PETRIFICATION, 1, 0, petrifyDuration) + + -- TODO: Confirm Blind effect, power/duration. + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 15, 0, 60) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/inertia_stream.lua b/scripts/actions/mobskills/inertia_stream.lua index 6afb9c529aa..18eef73d5c7 100644 --- a/scripts/actions/mobskills/inertia_stream.lua +++ b/scripts/actions/mobskills/inertia_stream.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Inertia Stream --- Deals light ele damage to enemies within range. Additional Effect: "Bind." +-- Family: Chariots +-- Description: Deals Light damage to enemies within range. Additional Effect: Bind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT, { breakBind = false }) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + end return damage end diff --git a/scripts/actions/mobskills/inferno.lua b/scripts/actions/mobskills/inferno.lua index 8a8ac920137..ad51ac13b2a 100644 --- a/scripts/actions/mobskills/inferno.lua +++ b/scripts/actions/mobskills/inferno.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Inferno --- Deals fire elemental damage to enemies within area of effect. +-- Family: Avatar (Ifrit) +-- Description: Deals Fire elemental damage to enemies within area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 3, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1.5 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/inferno_blast.lua b/scripts/actions/mobskills/inferno_blast.lua index 29b895cf79d..821c5328ce9 100644 --- a/scripts/actions/mobskills/inferno_blast.lua +++ b/scripts/actions/mobskills/inferno_blast.lua @@ -1,17 +1,14 @@ ----------------------------------- --- Fiery Blast --- --- Description: Deals fire damage to enemies in area of effect. --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 18' radial. --- Notes: Used only by Tiamat, Smok and Ildebrann while flying. +-- Inferno Blast +-- Family: Wyrms (Tiamat) +-- Description: Deals Fire damage to enemies in area of effect. +-- Notes: Used by Tiamat, Smok and Ildebrann while flying. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getAnimationSub() ~= 1 then + if mob:getAnimationSub() ~= 1 then -- Only use while flying return 1 end @@ -19,10 +16,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 7, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7, 7, 7 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/inferno_blast_alt.lua b/scripts/actions/mobskills/inferno_blast_alt.lua index d21219ae846..5ce02da59ac 100644 --- a/scripts/actions/mobskills/inferno_blast_alt.lua +++ b/scripts/actions/mobskills/inferno_blast_alt.lua @@ -1,10 +1,8 @@ ----------------------------------- --- Fiery Blast Alt --- --- Description: Deals fire damage to a single target --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Notes: Used only by Tiamat, Smok and Ildebrann while flying in place of standard attacks +-- Inferno Blast Alt +-- Family: Wyrm (Tiamat) +-- Description: Deals Fire damage to a single target +-- Notes: Used by Tiamat, Smok and Ildebrann while flying in place of standard attacks ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,11 +12,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - skill:setMsg(xi.msg.basic.HIT_DMG) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Handle in mobFinalAdjustments in future + end return damage end diff --git a/scripts/actions/mobskills/ink_jet.lua b/scripts/actions/mobskills/ink_jet.lua index a76680b52d1..f8375186fe7 100644 --- a/scripts/actions/mobskills/ink_jet.lua +++ b/scripts/actions/mobskills/ink_jet.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Ink Jet --- Description: Unleashes a torrent of black spores in a fan-shaped area of effect, dealing dark damage to targets. Additional effect: Blind --- Type: Magical Dark (Element) +-- Ink Jet +-- Family: Sea Monks +-- Description: Deals Dark damage to targets in front of mob. Additional Effect: Blind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = math.random(1.5, 2.5) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 80, 0, 120) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 2.00, 2.50 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + -- TODO: Jimmayus spreadsheet states 30-120s duration. Not sure if resists accounted for, if random, or tp scaling. + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 80, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/ion_shower.lua b/scripts/actions/mobskills/ion_shower.lua index a2490d6829d..6f9e862d2d2 100644 --- a/scripts/actions/mobskills/ion_shower.lua +++ b/scripts/actions/mobskills/ion_shower.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Ion Shower --- Description: Calls forth an ion storm, dealing Lightning damage to all nearby targets. Additional effect: Stun --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: Unknown radial +-- Ion Shower +-- Family: Yovra +-- Description: Calls forth an ion storm, dealing Thunder damage to all nearby targets. Additional Effect: Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,11 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 5) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.THUNDER + params.dStatMultiplier = 1 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 5) + end return damage end diff --git a/scripts/actions/mobskills/iridal_pierce.lua b/scripts/actions/mobskills/iridal_pierce.lua index 38188f36ccc..ad6944b59c8 100644 --- a/scripts/actions/mobskills/iridal_pierce.lua +++ b/scripts/actions/mobskills/iridal_pierce.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Iridal Pierce --- Deals Light-elemental damage to targets within area of effect. +-- Family: Trust:Lehko +-- Description: Deals Light-elemental damage to targets within area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3.5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7, 7, 7 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/judgment_bolt.lua b/scripts/actions/mobskills/judgment_bolt.lua index db8d56c3e05..0dbae2f8d14 100644 --- a/scripts/actions/mobskills/judgment_bolt.lua +++ b/scripts/actions/mobskills/judgment_bolt.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Judgment Bolt --- Deals lightning elemental damage to enemies within area of effect. +-- Family: Avatar (Rumuh) +-- Description: Deals Thunder elemental damage to enemies within area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 3, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.THUNDER + params.dStatMultiplier = 1.5 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + end return damage end diff --git a/scripts/actions/mobskills/kartstrahl.lua b/scripts/actions/mobskills/kartstrahl.lua index 102ccc21c5b..53e5594f126 100644 --- a/scripts/actions/mobskills/kartstrahl.lua +++ b/scripts/actions/mobskills/kartstrahl.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Kartstrahl --- Description: Single target damage with sleep. --- Type: Ice Magical +-- Family: Dolls +-- Description: Deals Ice damage to a target. Additional Effect: Sleep ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,11 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLEEP_I, 1, 0, math.random(30, 90)) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLEEP_I, 1, 0, 90) + end return damage end diff --git a/scripts/actions/mobskills/knuckle_sandwich.lua b/scripts/actions/mobskills/knuckle_sandwich.lua index f444d6a383a..702e1d01816 100644 --- a/scripts/actions/mobskills/knuckle_sandwich.lua +++ b/scripts/actions/mobskills/knuckle_sandwich.lua @@ -10,12 +10,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + -- TODO: Capture possible skillchain properties + -- TODO: Is this magical or physical skill? + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + -- TODO: Verify shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/lamentation.lua b/scripts/actions/mobskills/lamentation.lua index a2949bad5fd..4028ef4cdd8 100644 --- a/scripts/actions/mobskills/lamentation.lua +++ b/scripts/actions/mobskills/lamentation.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Lamentation --- --- Description: Deals Light damage to all targets in range. Additional effect: Dia --- Range: 10' cone --- Wipes Shadows +-- Family: Seethers +-- Description: Deals Light damage to all targets in range. Additional Effect: Dia ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,16 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + -- TODO: Capture shadowBehavior. JP Wiki says ignores shadows, EN Wikis say it wipes them. - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DIA, 8, 3, 30, 0, 20) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - local effect1 = target:getStatusEffect(xi.effect.DIA) - if effect1 then - effect1:delEffectFlag(xi.effectFlag.ERASABLE) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DIA, 8, 3, 30, 0, 20) + + local effect1 = target:getStatusEffect(xi.effect.DIA) + if effect1 then + effect1:delEffectFlag(xi.effectFlag.ERASABLE) + end end return damage diff --git a/scripts/actions/mobskills/lava_spit.lua b/scripts/actions/mobskills/lava_spit.lua index 352177e0e7b..7d7237d1eb5 100644 --- a/scripts/actions/mobskills/lava_spit.lua +++ b/scripts/actions/mobskills/lava_spit.lua @@ -1,6 +1,7 @@ ----------------------------------- --- Lava_Spit --- Deals Fire damage to enemies within an area of effect. +-- Lava Spit +-- Family: Cerberus +-- Description: Deals Fire damage to enemies within an area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,12 +15,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.FIRE + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/leeching_current.lua b/scripts/actions/mobskills/leeching_current.lua index 03630d8597f..d18df3f1c6e 100644 --- a/scripts/actions/mobskills/leeching_current.lua +++ b/scripts/actions/mobskills/leeching_current.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Leeching Current --- Description: Steals HP with a water current from targets in an area of effect. --- Type: Magical (Water) +-- Family: Orobons +-- Description: Deal Water damage spread evenly among targets in range. Additional Effect: HP Drain ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,20 +11,31 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + -- We use a var here so that mobs can use different values local base = mob:getLocalVar('leechingCurrent') + if base == 0 then base = 1000 end - local info = - { - damage = base / skill:getTotalTargets() - } + params.baseDamage = base / skill:getTotalTargets() + params.fTP = { 1, 1, 1 } + params.element = xi.element.WATER -- TODO: Capture if element is Water or Dark. + params.skipMagicBonusDiff = true -- Captures show this does not get reduced by MDB. + params.skipTMDA = true -- TODO: Is this reduced by shell? + params.skipResist = true -- TODO: Can this be resisted? + -- TODO: Can this be absorbed? Test With Liement. + -- TODO: Does day/weather affect it? - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) - target:takeDamage(damage, mob, xi.attackType.PHYSICAL, xi.damageType.WATER) - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + -- Note: This is a drain move but it returns a normal damage message instead of a drain message. + xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage) + end return damage end diff --git a/scripts/actions/mobskills/lesson_in_pain.lua b/scripts/actions/mobskills/lesson_in_pain.lua index b22814aed95..b47cb6b520a 100644 --- a/scripts/actions/mobskills/lesson_in_pain.lua +++ b/scripts/actions/mobskills/lesson_in_pain.lua @@ -9,12 +9,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.8) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.NONE, xi.damageType.NONE, 1) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs + params.element = xi.element.NONE - target:takeDamage(damage, mob, xi.attackType.NONE, xi.damageType.NONE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.NONE, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.NONE, xi.damageType.NONE) + end return damage end diff --git a/scripts/actions/mobskills/lightning_spear.lua b/scripts/actions/mobskills/lightning_spear.lua index 9efe8f6e273..a8ea78234b6 100644 --- a/scripts/actions/mobskills/lightning_spear.lua +++ b/scripts/actions/mobskills/lightning_spear.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Lightning Spear --- --- Description: Wide Cone Attack lightning damage (600-1500) and powerful Amnesia. --- Type: Magical --- Notes: Will pick a random person on the hate list for this attack. +-- Lightning Spear +-- Family: Monoceros (Dark Ixion) +-- Description: Wide Cone Attack Thunder damage (600-1500). Additional Effect: Amnesia +-- Notes: Will pick a random person on the hate list for this attack. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,22 +12,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- parameters for AE - local typeEffect = xi.effect.AMNESIA - local power = 1 - local duration = xi.mobskills.calculateDuration(30, 120) + local params = {} - -- perform magical attack - local damage = 2 * mob:getWeaponDmg() - local dmgmod = 10 -- unbuffed player hit for ~2k + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 20.0, 20.0, 20.0 } + params.element = xi.element.THUNDER - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, dmgmod, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - if damage > 0 then + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, typeEffect, power, 0, duration) + local duration = xi.mobskills.calculateDuration(30, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.AMNESIA, 1, 0, duration) -- TODO: Capture power of Amnesia end return damage diff --git a/scripts/actions/mobskills/lux_arrow.lua b/scripts/actions/mobskills/lux_arrow.lua index ea0b44d20fa..77f1be803ac 100644 --- a/scripts/actions/mobskills/lux_arrow.lua +++ b/scripts/actions/mobskills/lux_arrow.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Lux Arrow -- Trust: Semih Lafihna --- Fragmentation/Distortion skillchain properties +-- Notes: Fragmentation/Distortion skillchain properties ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.RANGED, xi.damageType.PIERCING, 1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.50, 2.50, 2.50 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.RANGED, xi.damageType.PIERCING) + -- TODO: Capture Damage Type / Attack Type. + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.RANGED, xi.damageType.PIERCING, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.RANGED, xi.damageType.PIERCING) + end return damage end diff --git a/scripts/actions/mobskills/maelstrom.lua b/scripts/actions/mobskills/maelstrom.lua index 089e6c23d8b..bb90d9084fd 100644 --- a/scripts/actions/mobskills/maelstrom.lua +++ b/scripts/actions/mobskills/maelstrom.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Maelstrom --- Description: Deals water damage to enemies within range. Additional effect: STR Down. --- Type: Magical (Water) +-- Maelstrom +-- Family: Sea Monk +-- Description: Deals Water damage to enemies within range. Additional Effect: STR Down. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = math.random(2, 3) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.50, 3.00 } + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, 10, 3, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + local power = 10 + local duration = 180 -- TODO: Capture duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, power, 9, duration) + end return damage end diff --git a/scripts/actions/mobskills/magic_hammer.lua b/scripts/actions/mobskills/magic_hammer.lua index dca53644ef7..36cddab14eb 100644 --- a/scripts/actions/mobskills/magic_hammer.lua +++ b/scripts/actions/mobskills/magic_hammer.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Magic Hammer --- Description: Steals an amount of enemy's MP equal to damage dealt. Ineffective against undead. --- Type: Magical (Light) +-- Magic Hammer +-- Family: Poroggos +-- Description: Steals an amount of enemy's MP equal to damage dealt. Ineffective against undead. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + -- TODO: Verify message + params.baseDamage = mob:getMainLvl() + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.LIGHT + params.dStatMultiplier = 1 - xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + -- TODO: MP Drain might not be linked directly to damage dealt or may have other mechanics involved. See video capture below. + -- Magic Hammer did 14 damage but drained 90 MP. + -- https://youtu.be/Qy-i4KNMnWQ?t=276 + -- https://discord.com/channels/443544205206355968/791182054015762482/1128174532507729941 + local mpDrainRatio = damage * 0.10 + xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, mpDrainRatio) + end return damage end diff --git a/scripts/actions/mobskills/magic_mortar.lua b/scripts/actions/mobskills/magic_mortar.lua new file mode 100644 index 00000000000..091be29ce18 --- /dev/null +++ b/scripts/actions/mobskills/magic_mortar.lua @@ -0,0 +1,32 @@ +----------------------------------- +-- Magic Mortar +-- Family: Automatons +-- Description: Deals Light damage to enemies within an area of effect. +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + -- Wikis say Ob starts using this skill around 50%HP. + -- Damage ranges 1500-2500~ based on mob's missing HP (Unsure if shell was calculated into this account or not or if it applies at all) + + params.baseDamage = (mob:getMaxHP() - skill:getMobHP()) / 6 -- TODO: Capture data for damage formula + params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT -- TODO: Light or None? + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/malediction.lua b/scripts/actions/mobskills/malediction.lua index 2341e073ec8..75102286afd 100644 --- a/scripts/actions/mobskills/malediction.lua +++ b/scripts/actions/mobskills/malediction.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Malediction --- Steals an enemy's HP. Ineffective against undead. +-- Family: Skeletons +-- Description: Deals Dark damage to enemies in range. Additional Effect: HP Drain ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() * 4, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + params.baseDamage = mob:getMainLvl() + params.fTP = { 4, 4, 4 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/malevolent_blessing.lua b/scripts/actions/mobskills/malevolent_blessing.lua index 0b3ac003eee..7cdd5e2894c 100644 --- a/scripts/actions/mobskills/malevolent_blessing.lua +++ b/scripts/actions/mobskills/malevolent_blessing.lua @@ -1,5 +1,7 @@ ----------------------------------- --- Malevolent Blessing +-- Malevolent Blessing +-- Family: Promathia +-- Description: Deals conal aoe Dark damage in front of mob. Additional Effect: Curse ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,12 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 3, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_2) + local params = {} + -- TODO: Verify if Physical/Magical + -- TODO: Capture shadowBehavior + -- TODO: Capture Curse power/duration - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.75, 3.75, 3.75 } -- TODO: Capture fTPs + params.element = xi.element.DARK - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 35, 0, 45) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + -- TODO: Capture power/duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 35, 0, 45) + end return damage end diff --git a/scripts/actions/mobskills/mana_storm.lua b/scripts/actions/mobskills/mana_storm.lua index a2f7656008b..e7d5facc33f 100644 --- a/scripts/actions/mobskills/mana_storm.lua +++ b/scripts/actions/mobskills/mana_storm.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Mana Storm +-- Family: Dynamis Lord -- Description: Steals MP from players within range. --- Type: Magical --- Utsusemi/Blink absorb: Unknown --- Range: Unknown radial ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTP + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/marrow_drain.lua b/scripts/actions/mobskills/marrow_drain.lua index 0fc31fe0247..7bf6ebe7e11 100644 --- a/scripts/actions/mobskills/marrow_drain.lua +++ b/scripts/actions/mobskills/marrow_drain.lua @@ -1,25 +1,38 @@ ----------------------------------- -- Marrow Drain --- Steals an enemy's MP. Ineffective against undead. +-- Family: Big Bat (Single Bat) +-- Description: Steals an enemy's MP. Ineffective against undead. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:isMobType(xi.mobType.NOTORIOUS) then - return 0 - end - - return 1 + return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.3) + local params = {} + + params.baseDamage = mob:getMainLvl() - 2 + params.additiveDamage = { 0, 5, 10 } + params.fTP = { 1, 1, 1 } + params.element = xi.element.DARK - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + -- From captures, TP Drains don't seem to be affected by these. + params.skipTMDA = true + params.skipResist = true + params.skipMagicBonusDiff = true + params.skipAbsorbNullify = true + -- TODO: Does Day/Weather affect MP Drains? Need more capture data. + -- TODO: This skill should penetrate/deal no damage to stoneskin. + -- Need to pass a param into mobFinalAdjustments in the future. - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/mega_holy.lua b/scripts/actions/mobskills/mega_holy.lua index 79378b243be..2095d40005d 100644 --- a/scripts/actions/mobskills/mega_holy.lua +++ b/scripts/actions/mobskills/mega_holy.lua @@ -1,14 +1,10 @@ ----------------------------------- -- Mega Holy --- --- Description: Deals Light damage to targets in an area of effect. --- Type: Magical --- Can be dispelled: N/A --- Utsusemi/Blink absorb: Wipes shadows --- Range: Unknown radial "Extremely large damage radius." says wiki. +-- Family: Avatar (Alexander) +-- Description: Deals Light damage to targets in an area of effect. -- Notes: Accompanied by text --- "Open thine eyes... --- My radiance...shall guide thee..." +-- 'Open thine eyes... +-- My radiance...shall guide thee...' ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -18,12 +14,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/megaflare.lua b/scripts/actions/mobskills/megaflare.lua index ef98ded77e5..3e1b832bd05 100644 --- a/scripts/actions/mobskills/megaflare.lua +++ b/scripts/actions/mobskills/megaflare.lua @@ -1,10 +1,8 @@ ----------------------------------- --- Megaflare --- Family: Bahamut --- Description: Deals heavy Fire damage to enemies within a fan-shaped area. --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Notes: Used by Bahamut every 10% of its HP (except at 10%), but can use at will when under 10%. +-- Megaflare +-- Family: Bahamut +-- Description: Deals heavy Fire damage to enemies within a fan-shaped area. +-- Notes: Used by Bahamut every 10% of its HP (except at 10%), but can use at will when under 10%. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,7 +10,11 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) local mobhp = mob:getHPP() - if mobhp <= 10 and mob:getLocalVar('GigaFlare') ~= 0 then -- make sure Gigaflare has happened first - don't want a random Megaflare to block it. + -- TODO: Handle this in mobscripts? + if + mobhp <= 10 and + mob:getLocalVar('GigaFlare') ~= 0 -- make sure Gigaflare has happened first - don't want a random Megaflare to block it. + then mob:setLocalVar('MegaFlareQueue', 1) -- set up Megaflare for being called by the script again. end @@ -20,7 +22,30 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- Mob logic. TODO: Remove from here + local params = {} + + params.baseDamage = mob:getMainLvl() + params.fTP = { 10, 10, 10 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1.5 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + + -- Targets that are not the primary target take 300 less damage. + if + target:getID() ~= skill:getPrimaryTargetID() and + info.damage > 0 -- Damage was not nullified or absorbed. + then + info.damage = math.max(0, info.damage - 300) + end + + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + -- TODO: Handle this in mob scripts instead. mob:setLocalVar('MegaFlareQueue', mob:getLocalVar('MegaFlareQueue') - 1) mob:setLocalVar('FlareWait', 0) -- reset the variables for Megaflare. mob:setLocalVar('tauntShown', 0) @@ -32,14 +57,6 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) mob:setBehavior(bit.bor(mob:getBehavior(), xi.behavior.NO_TURN)) end - -- Damage calculation - local damage = mob:getWeaponDmg() * 10 - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - return damage end diff --git a/scripts/actions/mobskills/meltdown.lua b/scripts/actions/mobskills/meltdown.lua index 4ab4db67f71..c9f68f009c1 100644 --- a/scripts/actions/mobskills/meltdown.lua +++ b/scripts/actions/mobskills/meltdown.lua @@ -1,12 +1,13 @@ ----------------------------------- -- Meltdown --- Reactor failure causes self-destruct, dealing magic damage to targets in an area of effect. +-- Family: Dolls +-- Description: Doll self destructs and deals Light damage to targets in range. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:isMobType(xi.mobType.NOTORIOUS) then + if mob:isMobType(xi.mobType.NOTORIOUS) then -- TODO: Set skill lists instead of conditional. return 1 end @@ -14,12 +15,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getHP() / 2 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() / 2 + params.fTP = { 1, 1, 1 } + params.element = xi.element.LIGHT + -- TODO: Can this be out ranged or does it always go off? Need packet capture. - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/memory_of_dark.lua b/scripts/actions/mobskills/memory_of_dark.lua index fc8805e6a0d..cd7903ed19f 100644 --- a/scripts/actions/mobskills/memory_of_dark.lua +++ b/scripts/actions/mobskills/memory_of_dark.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Memory Of Dark --- Description: Deals dark damage. --- Type: Magical (Dark) +-- Memory Of Dark +-- Family: Weepers +-- Description: Deals AoE Dark damage ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,11 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/memory_of_earth.lua b/scripts/actions/mobskills/memory_of_earth.lua index c42b3581137..4d7c795fc24 100644 --- a/scripts/actions/mobskills/memory_of_earth.lua +++ b/scripts/actions/mobskills/memory_of_earth.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Memory Of Earth --- Description: Deals earth damage. --- Type: Magical (Earth) +-- Memory Of Earth +-- Family: Weepers +-- Description: Deals AoE Earth damage. ----------------------------------- ----@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) @@ -11,11 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.EARTH, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.EARTH + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + end return damage end diff --git a/scripts/actions/mobskills/memory_of_fire.lua b/scripts/actions/mobskills/memory_of_fire.lua index 8989cd77e4f..5522ab37dd3 100644 --- a/scripts/actions/mobskills/memory_of_fire.lua +++ b/scripts/actions/mobskills/memory_of_fire.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Memory Of Fire --- Description: Deals fire damage. --- Type: Magical (Fire) +-- Memory Of Fire +-- Family: Weepers +-- Description: Deals AoE Fire damage. ----------------------------------- ----@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) @@ -11,11 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/memory_of_ice.lua b/scripts/actions/mobskills/memory_of_ice.lua index c6bf3a3b36e..0626951fbc3 100644 --- a/scripts/actions/mobskills/memory_of_ice.lua +++ b/scripts/actions/mobskills/memory_of_ice.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Memory Of Ice --- Description: Deals ice damage. --- Type: Magical (Ice) +-- Memory Of Ice +-- Family: Weepers +-- Description: Deals AoE Ice damage. ----------------------------------- ----@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) @@ -11,11 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + end return damage end diff --git a/scripts/actions/mobskills/memory_of_light.lua b/scripts/actions/mobskills/memory_of_light.lua index 72e3c08aadf..5281142b25a 100644 --- a/scripts/actions/mobskills/memory_of_light.lua +++ b/scripts/actions/mobskills/memory_of_light.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Memory Of Light --- Description: Deals light damage. --- Type: Magical (Light) +-- Memory Of Light +-- Family: Weepers +-- Description: Deals AoE Light damage. ----------------------------------- ----@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) @@ -11,11 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.LIGHT, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.LIGHT + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/memory_of_lightning.lua b/scripts/actions/mobskills/memory_of_lightning.lua index 916722732ee..ea34ad6cab4 100644 --- a/scripts/actions/mobskills/memory_of_lightning.lua +++ b/scripts/actions/mobskills/memory_of_lightning.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Memory Of Lightning --- Description: Deals lightning damage. --- Type: Magical (Lightning) +-- Memory Of Lightning +-- Family: Weepers +-- Description: Deals AoE Thunder damage. ----------------------------------- ----@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) @@ -11,11 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.THUNDER + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + end return damage end diff --git a/scripts/actions/mobskills/memory_of_water.lua b/scripts/actions/mobskills/memory_of_water.lua index 995a38fef07..81531eccd20 100644 --- a/scripts/actions/mobskills/memory_of_water.lua +++ b/scripts/actions/mobskills/memory_of_water.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Memory Of Water --- Description: Deals water damage. --- Type: Magical (Water) +-- Memory Of Water +-- Family: Weepers +-- Description: Deals AoE Water damage. ----------------------------------- ----@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) @@ -11,11 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.WATER + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end return damage end diff --git a/scripts/actions/mobskills/memory_of_wind.lua b/scripts/actions/mobskills/memory_of_wind.lua index bd0f7b73b77..5c635cc64db 100644 --- a/scripts/actions/mobskills/memory_of_wind.lua +++ b/scripts/actions/mobskills/memory_of_wind.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Memory Of Wind --- Description: Deals wind damage. --- Type: Magical (Wind) +-- Memory Of Wind +-- Family: Weepers +-- Description: Deals AoE Wind damage. ----------------------------------- ----@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) @@ -11,11 +10,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.WIND + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/mephitic_spore.lua b/scripts/actions/mobskills/mephitic_spore.lua index 5e6890b5845..ce737bdcd89 100644 --- a/scripts/actions/mobskills/mephitic_spore.lua +++ b/scripts/actions/mobskills/mephitic_spore.lua @@ -1,9 +1,8 @@ ----------------------------------- -- Mephitic Spore --- Deals Dark damage to targets in a fan-shaped area of effect. Additional effect: Poison --- Type: Breath (But not a breath skill) --- Utsusemi/Blink absorb: Ignores Shadows --- Notes: Only used by Fairy Ring +-- Family: Funguar +-- Description: Deals Dark damage to targets in a fan-shaped area of effect. Additional Effect: Poison +-- Notes: Used by Fairy Ring as its auto attack. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +12,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 4, 4, 4 } + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 50, 3, 180) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 50, 3, 180) + + skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Move logic to mob final adjustments eventually. + end return damage end diff --git a/scripts/actions/mobskills/meteor.lua b/scripts/actions/mobskills/meteor.lua index c862be4db1c..b5eb26125ff 100644 --- a/scripts/actions/mobskills/meteor.lua +++ b/scripts/actions/mobskills/meteor.lua @@ -1,7 +1,8 @@ ----------------------------------- --- Final Meteor --- Description: Extreme non-elemental damage. --- Type: Magical +-- Final Meteor +-- Family: Behemoth (Chlevnik) +-- Description: Extreme non-elemental damage. +-- Notes: Used by Chlevnik upon death. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +12,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getMainLvl() * 32 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() * 32 + params.fTP = { 1, 1, 1 } + params.element = xi.element.NONE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + end + + -- Animation change happens after mobskill finishes. + -- Animation: Chlevnik falls but calls in a final meteor barrage, then dies. + skill:setFinalAnimationSub(1) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) - mob:setAnimationSub(1) return damage end diff --git a/scripts/actions/mobskills/meteor_strike.lua b/scripts/actions/mobskills/meteor_strike.lua index b2955e86650..bfb121c5990 100644 --- a/scripts/actions/mobskills/meteor_strike.lua +++ b/scripts/actions/mobskills/meteor_strike.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Meteor Strike --- Ifrit deals fire elemental damage to target. +-- Family: Avatar (Ifrit) +-- Description: Ifrit deals Fire elemental damage to target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/meteorite.lua b/scripts/actions/mobskills/meteorite.lua index 55f3bc0e85b..37a7ad5c0f9 100644 --- a/scripts/actions/mobskills/meteorite.lua +++ b/scripts/actions/mobskills/meteorite.lua @@ -1,6 +1,7 @@ ----------------------------------- --- meteorite --- Description: Carbuncle deals Light damage to an enemy. +-- Meteorite +-- Family: Avatar (Carbuncle) +-- Description: Carbuncle deals Light damage to an enemy. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/miasma.lua b/scripts/actions/mobskills/miasma.lua index 348bf2d13d3..3e85d9a6330 100644 --- a/scripts/actions/mobskills/miasma.lua +++ b/scripts/actions/mobskills/miasma.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Miasma --- --- Description: Releases a toxic cloud on nearby targets. Additional effects: Slow + Poison + Plague --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows? --- Range: Less than or equal to 10.0 --- Notes: Only used by Gulool Ja Ja. +-- Miasma +-- Family: Mamool Ja (Gulool Ja Ja) +-- Description: Releases a toxic cloud on nearby targets. Additional Effect: Slow, Plague, Poison +-- Notes: Used by Gulool Ja Ja. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,15 +12,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs + params.element = xi.element.EARTH -- TODO: Capture Element - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 5, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, math.floor(mob:getMainLvl() / 3), 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 1250, 3, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + -- TODO: Capture powers/durations + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 5, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, math.floor(mob:getMainLvl() / 3), 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 1250, 3, 120) + end return damage end diff --git a/scripts/actions/mobskills/miasmic_breath.lua b/scripts/actions/mobskills/miasmic_breath.lua index 0621c17c1aa..40ef7d38730 100644 --- a/scripts/actions/mobskills/miasmic_breath.lua +++ b/scripts/actions/mobskills/miasmic_breath.lua @@ -1,9 +1,9 @@ ----------------------------------- -- Miasmic Breath +-- Family: Morbol -- Description: A toxic odor is exhaled on any players in a fan-shaped area of effect. --- Type: Magical --- Utsusemi/Blink absorb: Ignores Shadows --- Notes: Only used by Cirrate Christelle +-- Notes: Deals Breath damage and follows corresponding damage reductions but damage is not based on HP. +-- Used by Cirrate Christelle ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +13,34 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 4, 4, 4 } + params.element = xi.element.DARK + params.useTBDA = true - target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 50, 3, 180) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 50, 3, 60) + + -- TODO: At some point we should handle skill attacks with a param to toggle messaging type. + -- For now, we will just do a check here to convert xi.msg.basic.DAMAGE to xi.msg.basic.HIT_DMG. + + -- Note: Miasmic Breath (1604) uses Msg 185(xi.msg.basic.DAMAGE) + -- Note: Miasmic Breath (1605) uses Msg 1(xi.msg.basic.HIT_DMG) + -- https://youtu.be/QHcGtTR_xQg?t=879 + + if skill:getID() == xi.mobSkill.MIASMIC_BREATH_2 then + if skill:getMsg() == xi.msg.basic.DAMAGE then + skill:setMsg(xi.msg.basic.HIT_DMG) + end + end + end return damage end diff --git a/scripts/actions/mobskills/mighty_snort.lua b/scripts/actions/mobskills/mighty_snort.lua index 1e6a60c14d7..898876cc632 100644 --- a/scripts/actions/mobskills/mighty_snort.lua +++ b/scripts/actions/mobskills/mighty_snort.lua @@ -14,13 +14,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.00, 4.00, 4.00 } + params.element = xi.element.WIND + params.dStatMultiplier = 1 + -- TODO: Capture Knockback range - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - mob:resetEnmity(target) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + -- TODO: NM: Audumbla reportedly has hate reset on this skill. + end return damage end diff --git a/scripts/actions/mobskills/mijin_gakure.lua b/scripts/actions/mobskills/mijin_gakure.lua index c53e6e31fb7..96ca2801e4c 100644 --- a/scripts/actions/mobskills/mijin_gakure.lua +++ b/scripts/actions/mobskills/mijin_gakure.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Mijin Gakure +-- Description: Deals unaspected magic damage to targets in range. +-- Note: Behavior of skill differs from players. Example: Not all mobs die after using skill. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * skill:getMobHPP() / 10) + 6 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + -- TODO: Capture fTPs/Formula + params.baseDamage = mob:getWeaponDmg() * skill:getMobHPP() / 10 + 6 + params.fTP = { 1.0, 1.0, 1.0 } + params.element = xi.element.NONE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + end return damage end diff --git a/scripts/actions/mobskills/mind_blast.lua b/scripts/actions/mobskills/mind_blast.lua index 3e88cc34487..ff541acd84c 100644 --- a/scripts/actions/mobskills/mind_blast.lua +++ b/scripts/actions/mobskills/mind_blast.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Mind Blast --- Description: Deals lightning damage to an enemy. Additional effect: "Paralysis" --- Type: Magical (lightning) --- Utsusemi/Blink absorb: Wipes shadows --- Range: Cone +-- Mind Blast +-- Family: Soulflayers +-- Description: Deals Thunder damage to an enemy. Additional Effect: Paralysis ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 6 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.THUNDER + params.dStatMultiplier = 1.5 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 20, 0, 180) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + -- TODO: Capture Paralysis power. Sources say its extremely potent. + -- TODO: More captures for duration to account for effect resistance. + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 20, 0, xi.mobskills.calculateDuration(skill:getTP(), 15, 45)) + end return damage end diff --git a/scripts/actions/mobskills/mine_blast.lua b/scripts/actions/mobskills/mine_blast.lua index 4e62be07456..8c0f616e03c 100644 --- a/scripts/actions/mobskills/mine_blast.lua +++ b/scripts/actions/mobskills/mine_blast.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Mine Blast --- 20 Aoe Fire damage from a bomb +-- Family: Mines (Qiqirn Mine / Goblin Mine) +-- Description: AOE: Varies. 16' for Goblin Bombs in [S]. +-- TODO: Behavior of mines varies, we may eventually want to split up to multiple files once captures are made. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +12,32 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 20, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 100, 100, 100 } -- TODO: Capture fTPs. (Varies by mob) + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + -- TODO: Cheese Hoarder Gigiroon Mines + + -- TODO: Qiqirn Mines + + -- TODO: Goblin mines in [S] zones + + -- TODO: Excavation Duty Assault + + -- TODO: Blifnix Oilycheek's Goblin Mines + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + -- TODO: Move this to a mob mixin that utilizes a listener. If noone is hit by the skill, this condition will never be reached. + -- mob:entityAnimationPacket('mai1') -- Animation: Mine jumps up and explodes. + -- mob:setHP(0) return damage end diff --git a/scripts/actions/mobskills/molting_burst.lua b/scripts/actions/mobskills/molting_burst.lua index 58e48855018..e3382cf48a8 100644 --- a/scripts/actions/mobskills/molting_burst.lua +++ b/scripts/actions/mobskills/molting_burst.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Molting Burst --- --- Description: Deals Light damage and drains HP. Transfers any negative status effects to the target. --- Type: Magical --- Utsusemi/Blink absorb: Unknown --- Range: Unknown --- Notes: Used by Limules affiliated with light element. +-- Molting Burst +-- Family: Limules +-- Description: Deals Light damage to . Restores HP of mob. Transfers any negative status effects on the mob to the target. +-- Notes: Used by Limules affiliated with light element. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,12 +12,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.NUMSHADOWS_2) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } -- TODO: capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + + -- TODO: Might want to make a new binding to tranfer status effects to other targets based on effect flags. + -- TODO: This skill also transfers debuffs on the mob to the target. + end + + -- TODO: This may need to be handled via mixin or listener since this will execute for every target hit. + -- xi.mobskills.mobHealMove(mob, mob:getMaxHP() * 0.10) -- TODO: Capture heal power return damage end diff --git a/scripts/actions/mobskills/mp_absorption.lua b/scripts/actions/mobskills/mp_absorption.lua index f37a841ae9c..a251f193473 100644 --- a/scripts/actions/mobskills/mp_absorption.lua +++ b/scripts/actions/mobskills/mp_absorption.lua @@ -1,9 +1,8 @@ ----------------------------------- -- MP Absorption --- Single target MP Drain. (Ignores shadows.) --- Type: Magical --- Range: Melee --- Notes: If used against undead, it will simply do damage and not drain HP. +-- Family: Worms +-- Description: Single target MP Drain. +-- Notes: Ineffective against undead. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +12,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/mp_drainkiss.lua b/scripts/actions/mobskills/mp_drainkiss.lua index 78dd32b19c2..abff6d194ea 100644 --- a/scripts/actions/mobskills/mp_drainkiss.lua +++ b/scripts/actions/mobskills/mp_drainkiss.lua @@ -1,10 +1,8 @@ ----------------------------------- -- MP Drainkiss --- Deals dark damage to a single target. Additional effect: Aspir --- Type: Magical --- Utsusemi/Blink absorb: 1 shadow --- Range: Melee --- Notes: If used against undead, it will simply do damage and not drain MP. +-- Family: Leeches +-- Description: Steals MP from target. +-- Notes: Ineffective vs undead. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,12 +12,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 1.6) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } + params.element = xi.element.DARK + params.dStatMultiplier = 1.5 + -- TODO: This skill should penetrate/deal no damage to stoneskin. - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/mysterious_light.lua b/scripts/actions/mobskills/mysterious_light.lua index 8de6dfaf9f8..be2c597e098 100644 --- a/scripts/actions/mobskills/mysterious_light.lua +++ b/scripts/actions/mobskills/mysterious_light.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Mysterious Light --- Description: Deals wind damage to enemies within range. Additional effect: Weight. --- Type: Magical (Wind) +-- Mysterious Light +-- Family: Magic Pots +-- Description: Deals Wind damage to enemies within range. Additional Effect: Weight ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,11 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 2.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 75, 0, 120) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.5, 2.5, 2.5 } -- TODO: Jimmayus spreadsheet says the scales with TP. Need captures. + params.element = xi.element.WIND + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 75, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/negative_whirl.lua b/scripts/actions/mobskills/negative_whirl.lua index 8d10137cbe3..0d1fe7e9fd7 100644 --- a/scripts/actions/mobskills/negative_whirl.lua +++ b/scripts/actions/mobskills/negative_whirl.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Negative Whirl --- --- Description: Slow Wipes shadows --- Utsusemi/Blink absorb: Ignores shadows --- Range: 10' cone +-- Negative Whirl +-- Family: Thinkers +-- Description: Deals Magic damage to targets in range. Additional Effect: Slow +-- Note: Element of damage varies based on mob. (Empty mobs have varying elements) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -38,28 +37,38 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getMainLvl() * 2 + local params = {} + + params.baseDamage = mob:getMainLvl() + params.fTP = { 2, 2, 2 } + params.element = xi.element.NONE if mob:isNM() then - damage = mob:getMainLvl() * 3 + params.fTP = { 3, 3, 3 } end -- Determine element based on model ID and animation sub - local modelId = mob:getModelId() + local modelId = mob:getModelId() local animationSub = mob:getAnimationSub() - local element = xi.element.NONE - local dmgType = xi.damageType.ELEMENTAL + local damageType = xi.damageType.ELEMENTAL if elementTable[modelId] and elementTable[modelId][animationSub] then - element = elementTable[modelId][animationSub].element - dmgType = elementTable[modelId][animationSub].damageType + params.element = elementTable[modelId][animationSub].element + damageType = elementTable[modelId][animationSub].damageType + end + + if mob:isNM() then + params.fTP = { 3, 3, 3 } end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, element, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, dmgType, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, damageType, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, damageType) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, dmgType) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 8500, 0, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 8500, 0, 60) -- TODO: Capture duration + end return damage end diff --git a/scripts/actions/mobskills/nerve_gas.lua b/scripts/actions/mobskills/nerve_gas.lua index f958bcca2a3..c61268b6138 100644 --- a/scripts/actions/mobskills/nerve_gas.lua +++ b/scripts/actions/mobskills/nerve_gas.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Nerve Gas --- --- Description: Inflicts curse and powerful poison xi.effect. --- Type: Magical --- Wipes Shadows --- Range: 10' Radial +-- Family: Hydras +-- Description: Deals Magic (Element unknown) damage to targets around mob. Additional Effect: Curse, Poison ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,7 +10,7 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) if mob:getFamily() == 313 then -- Tinnin can use at will return 0 else - if mob:getAnimationSub() == 0 then + if mob:getAnimationSub() == 0 then -- 3 Heads return 0 else return 1 @@ -22,9 +19,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - skill:setMsg(xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 50, 0, 420)) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 20, 3, 60) - return xi.effect.CURSE_I + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.0, 1.0 } -- TODO: Capture fTPs + params.element = xi.element.NONE -- TODO: Capture element (Water or None?) + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + + -- TODO: Capture power/durations + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 50, 0, 420) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 20, 3, 60) + end + + return damage end return mobskillObject diff --git a/scripts/enum/mob_pool.lua b/scripts/enum/mob_pool.lua index 83d5bbbd13a..3fe210dbbe4 100644 --- a/scripts/enum/mob_pool.lua +++ b/scripts/enum/mob_pool.lua @@ -23,6 +23,7 @@ xi.mobPool = HADAL_SATIATOR = 1869, -- Fission (Number of Adds) INGESTER = 2080, -- Fission (Number of Adds) KING_VINEGARROON = 2262, -- KV poison on Wild Rage + KREUTZET = 2287, -- Mobskill: "Stormwind" fTPs based on successive uses. NIDHOGG = 2840, -- Nidhogg's stronger hurricane wing OSSCHAART = 3064, -- Osschaart's charm duration. PEALLAIDH = 3109, -- Peallaidh's chigoe pets diff --git a/sql/mob_skills.sql b/sql/mob_skills.sql index 0df9cf1b64f..b437002b632 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -1195,10 +1195,10 @@ INSERT INTO `mob_skills` VALUES (1161,343,'damnation_dive',4,0.0,10.0,2000,1500, -- INSERT INTO `mob_skills` VALUES (1168,386,'flame_breath',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); -- INSERT INTO `mob_skills` VALUES (1169,913,'poison_breath',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); -- INSERT INTO `mob_skills` VALUES (1170,388,'wind_breath',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1171,389,'pl_body_slam',1,0.0,15.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1172,390,'pl_heavy_stomp',1,0.0,15.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1173,391,'pl_chaos_blade',4,0.0,9.5,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1174,392,'pl_petro_eyes',4,0.0,9.5,2000,1500,4,0,0,0,0,0,0); +INSERT INTO `mob_skills` VALUES (1171,389,'body_slam',1,0.0,15.0,2000,1500,4,0,0,0,0,0,0); -- formerly pl_body_slam +INSERT INTO `mob_skills` VALUES (1172,390,'heavy_stomp',1,0.0,15.0,2000,1500,4,0,0,0,0,0,0); -- formerly pl_heavy_stomp +INSERT INTO `mob_skills` VALUES (1173,391,'chaos_blade',4,0.0,9.5,2000,1500,4,0,0,0,0,0,0); -- formerly pl_chaos_blade +INSERT INTO `mob_skills` VALUES (1174,392,'petro_eyes',4,0.0,9.5,2000,1500,4,0,0,0,0,0,0); -- formerly pl_petro_eyes -- INSERT INTO `mob_skills` VALUES (1175,393,'voidsong',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1176,920,'thornsong_powerful',0,0.0,15.0,2000,1500,1,0,0,0,0,0,0); -- INSERT INTO `mob_skills` VALUES (1177,921,'lodesong',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); @@ -1291,7 +1291,7 @@ INSERT INTO `mob_skills` VALUES (1263,948,'cryo_jet',4,0.0,10.0,2000,1500,4,0,0, INSERT INTO `mob_skills` VALUES (1264,949,'turbofan',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1265,950,'smoke_discharger',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1266,951,'high-tension_discharger',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1267,952,'hydro_canon',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); +INSERT INTO `mob_skills` VALUES (1267,952,'hydro_cannon',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1268,953,'nuclear_waste',1,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1269,954,'chemical_bomb',0,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1270,955,'particle_shield',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); @@ -1833,12 +1833,12 @@ INSERT INTO `mob_skills` VALUES (1805,1354,'incessant_fists',0,0.0,7.0,2000,1500 INSERT INTO `mob_skills` VALUES (1806,1355,'arcane_stomp',1,0.0,25.0,2000,1500,1,0,0,0,0,0,0); -- corected ? to 1 INSERT INTO `mob_skills` VALUES (1807,1356,'pleiades_ray',1,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1808,1334,'petrifaction',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1809,1335,'pw_shadow_thrust',0,0.0,10.0,2000,2000,4,0,0,0,0,0,0); +INSERT INTO `mob_skills` VALUES (1809,1335,'shadow_thrust',0,0.0,10.0,2000,2000,4,0,0,0,0,0,0); -- formerly pw_shadow_thrust INSERT INTO `mob_skills` VALUES (1810,1336,'tail_slap',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); -- INSERT INTO `mob_skills` VALUES (1811,1555,'.',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1812,1337,'pw_pinning_shot',2,0.0,15.0,2000,2000,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1813,1338,'pw_calcifying_deluge',2,0.0,15.0,2000,2000,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (1814,1339,'pw_gorgon_dance',1,0.0,15.0,2000,2000,4,0,0,0,0,0,0); +INSERT INTO `mob_skills` VALUES (1812,1337,'pinning_shot',2,0.0,15.0,2000,2000,4,0,0,0,0,0,0); -- formerly pw_pinning_shot +INSERT INTO `mob_skills` VALUES (1813,1338,'calcifying_deluge',2,0.0,15.0,2000,2000,4,0,0,0,0,0,0); -- formerly pw_calcifying_deluge +INSERT INTO `mob_skills` VALUES (1814,1339,'gorgon_dance',1,0.0,15.0,2000,2000,4,0,0,0,0,0,0); -- formerly pw_gorgon_dance INSERT INTO `mob_skills` VALUES (1815,1290,'amber_scutum',0,0.0,10.0,2000,1000,1,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1816,1291,'vitriolic_spray',4,0.0,10.0,2000,1000,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (1817,1292,'thermal_pulse',1,0.0,12.5,2000,1000,4,0,0,0,0,0,0); From 4d6a1025337cb19121f3e841f487092e2c47043e Mon Sep 17 00:00:00 2001 From: Umeboshi Date: Mon, 8 Dec 2025 19:39:39 -0800 Subject: [PATCH 4/6] [lua] Magic Mobskill Rework 3/3 --- scripts/actions/mobskills/nether_blast.lua | 40 ++++++++++++ scripts/actions/mobskills/nether_tempest.lua | 35 ++++++++++ .../mobskills/nocturnal_combustion.lua | 29 +++++---- scripts/actions/mobskills/nosferatus_kiss.lua | 54 +++++++++------- scripts/actions/mobskills/nox_blast.lua | 37 +++++++++++ .../actions/mobskills/nutrient_absorption.lua | 20 ++++-- scripts/actions/mobskills/ochre_blast.lua | 26 ++++---- scripts/actions/mobskills/ochre_blast_alt.lua | 24 ++++--- scripts/actions/mobskills/osmosis.lua | 21 ++++-- .../mobskills/paralyzing_microtube.lua | 19 ++++-- .../actions/mobskills/penumbral_impact.lua | 32 +++++++--- .../actions/mobskills/pestilent_penance.lua | 21 ++++-- scripts/actions/mobskills/pl_body_slam.lua | 25 -------- scripts/actions/mobskills/pl_chaos_blade.lua | 27 -------- scripts/actions/mobskills/pl_heavy_stomp.lua | 30 --------- scripts/actions/mobskills/pl_hellclap.lua | 24 ------- scripts/actions/mobskills/pl_hellsnap.lua | 24 ------- scripts/actions/mobskills/pl_petro_eyes.lua | 21 ------ scripts/actions/mobskills/pl_tidal_slash.lua | 30 --------- scripts/actions/mobskills/pleiades_ray.lua | 44 +++++++------ scripts/actions/mobskills/proboscis.lua | 24 ++++--- scripts/actions/mobskills/promyvion_brume.lua | 64 +++++++++++++++---- scripts/actions/mobskills/psychomancy.lua | 23 +++++-- scripts/actions/mobskills/purulent_ooze.lua | 22 ++++--- scripts/actions/mobskills/putrid_breath.lua | 28 +++++--- .../actions/mobskills/pw_acheron_flame.lua | 30 --------- .../mobskills/pw_calcifying_deluge.lua | 30 --------- scripts/actions/mobskills/pw_decussate.lua | 28 -------- .../mobskills/pw_fossilizing_breath.lua | 22 ------- scripts/actions/mobskills/pw_gorgon_dance.lua | 28 -------- scripts/actions/mobskills/pw_groundburst.lua | 28 -------- scripts/actions/mobskills/pw_pinning_shot.lua | 30 --------- .../actions/mobskills/pw_rushing_slash.lua | 27 -------- .../actions/mobskills/pw_shadow_thrust.lua | 27 -------- .../actions/mobskills/pw_tyrranic_blare.lua | 28 -------- scripts/actions/mobskills/quake_blast.lua | 36 +++++++++++ scripts/actions/mobskills/raiden_thrust.lua | 21 +++--- scripts/actions/mobskills/rail_cannon.lua | 21 ++++-- scripts/actions/mobskills/rail_cannon_1.lua | 21 ++++-- scripts/actions/mobskills/rail_cannon_2.lua | 21 ++++-- scripts/actions/mobskills/rail_cannon_3.lua | 21 ++++-- scripts/actions/mobskills/random_kiss.lua | 16 +++-- .../actions/mobskills/reactor_overheat.lua | 22 +++++-- .../actions/mobskills/reactor_overload.lua | 22 +++++-- scripts/actions/mobskills/reaving_wind.lua | 28 +++----- scripts/actions/mobskills/reaving_wind_kb.lua | 9 ++- scripts/actions/mobskills/red_lotus_blade.lua | 28 ++++---- scripts/actions/mobskills/regurgitation.lua | 24 ++++--- scripts/actions/mobskills/rending_deluge.lua | 20 ++++-- scripts/actions/mobskills/revelation.lua | 18 ++++-- scripts/actions/mobskills/rime_spray.lua | 44 +++++++------ scripts/actions/mobskills/roller_chain.lua | 29 +++++---- scripts/actions/mobskills/ruinous_omen.lua | 24 +++++-- scripts/actions/mobskills/sandspin.lua | 23 ++++--- .../actions/mobskills/scintillant_lance.lua | 17 +++-- .../actions/mobskills/scouring_bubbles.lua | 20 ++++-- scripts/actions/mobskills/searing_light.lua | 18 ++++-- .../mobskills/self-destruct_1death.lua | 40 ++++++++++++ scripts/actions/mobskills/self-destruct_2.lua | 39 +++++++++++ .../mobskills/self-destruct_2death.lua | 42 ++++++++++++ scripts/actions/mobskills/self-destruct_3.lua | 38 +++++++++++ .../mobskills/self-destruct_3death.lua | 46 +++++++++++++ .../actions/mobskills/self-destruct_bomb.lua | 17 +++-- scripts/actions/mobskills/seraph_blade.lua | 21 +++--- scripts/actions/mobskills/shadow_burst.lua | 39 +++++++++++ .../actions/mobskills/shantotto_ii_melee.lua | 18 ++++-- scripts/actions/mobskills/shining_blade.lua | 21 +++--- scripts/actions/mobskills/shock_wave.lua | 20 ++++-- .../actions/mobskills/silencing_microtube.lua | 20 ++++-- .../actions/mobskills/siphon_discharge.lua | 26 ++++---- scripts/actions/mobskills/slaverous_gale.lua | 26 +++++--- scripts/actions/mobskills/sleet_blast.lua | 25 +++++--- scripts/actions/mobskills/sleet_blast_alt.lua | 27 +++++--- .../actions/mobskills/smoke_discharger.lua | 2 +- .../actions/mobskills/smouldering_swarm.lua | 28 ++++---- scripts/actions/mobskills/snort.lua | 19 ++++-- scripts/actions/mobskills/snort_2127.lua | 22 +++++-- scripts/actions/mobskills/snow_cloud.lua | 21 ++++-- scripts/actions/mobskills/snowball.lua | 18 ++++-- scripts/actions/mobskills/somnolence.lua | 33 ++++++++++ scripts/actions/mobskills/sonic_buffet.lua | 22 +++++-- scripts/actions/mobskills/soul_drain.lua | 19 ++++-- .../actions/mobskills/soulshattering_roar.lua | 21 ++++-- .../actions/mobskills/spirit_absorption.lua | 22 ++++--- scripts/actions/mobskills/spirit_tap.lua | 12 ++-- scripts/actions/mobskills/static_filament.lua | 25 ++++++-- scripts/actions/mobskills/stellar_burst.lua | 22 +++++-- scripts/actions/mobskills/stone_ii.lua | 17 +++-- scripts/actions/mobskills/stone_iv.lua | 17 +++-- .../actions/mobskills/stone_meeble_warble.lua | 23 +++++-- scripts/actions/mobskills/storm_wing.lua | 25 +++++--- scripts/actions/mobskills/stormwind.lua | 35 ++++++---- scripts/actions/mobskills/stun_cannon.lua | 25 +++++--- scripts/actions/mobskills/stupor_spores.lua | 20 ++++-- .../actions/mobskills/sweeping_somnolence.lua | 31 +++++++++ scripts/actions/mobskills/tebbad_wing.lua | 28 ++++---- scripts/actions/mobskills/tebbad_wing_air.lua | 28 ++++---- scripts/actions/mobskills/tempest_wing.lua | 23 ++++--- .../mobskills/tempestuous_upheaval.lua | 26 ++++---- scripts/actions/mobskills/teraflare.lua | 34 ++++++++++ scripts/actions/mobskills/thermal_pulse.lua | 30 +++++---- scripts/actions/mobskills/thunder_break.lua | 19 ++++-- .../actions/mobskills/thunder_break_2129.lua | 29 ++++++--- scripts/actions/mobskills/thunder_ii.lua | 18 ++++-- scripts/actions/mobskills/thunder_iv.lua | 18 ++++-- .../mobskills/thunder_meeble_warble.lua | 24 +++++-- .../mobskills/thunderbolt_behemoth.lua | 26 +++++--- scripts/actions/mobskills/thunderspark.lua | 21 ++++-- scripts/actions/mobskills/thunderstorm.lua | 19 ++++-- scripts/actions/mobskills/thunderstrike.lua | 32 +++++----- scripts/actions/mobskills/thundris_shriek.lua | 35 +++++----- scripts/actions/mobskills/tidal_slash.lua | 20 ++++-- scripts/actions/mobskills/tidal_wave.lua | 18 ++++-- .../actions/mobskills/torrential_torment.lua | 19 ++++-- scripts/actions/mobskills/touchdown.lua | 24 +++++-- .../actions/mobskills/touchdown_bahamut.lua | 21 ++++-- scripts/actions/mobskills/toxic_spit.lua | 22 +++---- scripts/actions/mobskills/tp_drainkiss.lua | 30 ++++++--- scripts/actions/mobskills/transfusion.lua | 18 ++++-- scripts/actions/mobskills/tremors.lua | 25 +++++--- .../actions/mobskills/trinary_absorption.lua | 28 +++++--- scripts/actions/mobskills/turbofan.lua | 3 +- scripts/actions/mobskills/turbulence.lua | 17 +++-- scripts/actions/mobskills/typhoon_wing.lua | 32 ++++++---- scripts/actions/mobskills/tyrannic_blare.lua | 25 ++++---- scripts/actions/mobskills/unblest_jambiya.lua | 15 +++-- scripts/actions/mobskills/undead_mold.lua | 27 +++++--- .../actions/mobskills/vacuous_osculation.lua | 28 ++++---- scripts/actions/mobskills/vampiric_root.lua | 27 +++++--- scripts/actions/mobskills/venom.lua | 29 ++++++--- scripts/actions/mobskills/venom_spray.lua | 1 + .../actions/mobskills/vitriolic_barrage.lua | 37 ++++++----- .../actions/mobskills/vitriolic_shower.lua | 28 ++++---- scripts/actions/mobskills/vitriolic_spray.lua | 33 ++++++---- scripts/actions/mobskills/voiceless_storm.lua | 24 +++++-- scripts/actions/mobskills/vulcan_shot.lua | 23 ++++--- scripts/actions/mobskills/warped_wail.lua | 27 +++++--- scripts/actions/mobskills/water_bomb.lua | 24 ++++--- scripts/actions/mobskills/water_ii.lua | 18 ++++-- scripts/actions/mobskills/water_iv.lua | 18 ++++-- .../actions/mobskills/water_meeble_warble.lua | 19 ++++-- scripts/actions/mobskills/whirlwind.lua | 23 ++++--- scripts/actions/mobskills/wind_blade.lua | 19 ++++-- scripts/actions/mobskills/wind_shear.lua | 34 ++++++---- scripts/actions/mobskills/wind_shear_znm.lua | 35 +++++----- scripts/actions/mobskills/wing_cutter.lua | 22 ++++--- .../actions/mobskills/wings_of_gehenna.lua | 27 ++++---- scripts/actions/mobskills/wrath_of_zeus.lua | 28 ++++---- scripts/actions/mobskills/zarbzan.lua | 28 ++++---- scripts/actions/mobskills/zarraqa.lua | 26 ++++---- 150 files changed, 2316 insertions(+), 1485 deletions(-) create mode 100644 scripts/actions/mobskills/nether_blast.lua create mode 100644 scripts/actions/mobskills/nether_tempest.lua create mode 100644 scripts/actions/mobskills/nox_blast.lua delete mode 100644 scripts/actions/mobskills/pl_body_slam.lua delete mode 100644 scripts/actions/mobskills/pl_chaos_blade.lua delete mode 100644 scripts/actions/mobskills/pl_heavy_stomp.lua delete mode 100644 scripts/actions/mobskills/pl_hellclap.lua delete mode 100644 scripts/actions/mobskills/pl_hellsnap.lua delete mode 100644 scripts/actions/mobskills/pl_petro_eyes.lua delete mode 100644 scripts/actions/mobskills/pl_tidal_slash.lua delete mode 100644 scripts/actions/mobskills/pw_acheron_flame.lua delete mode 100644 scripts/actions/mobskills/pw_calcifying_deluge.lua delete mode 100644 scripts/actions/mobskills/pw_decussate.lua delete mode 100644 scripts/actions/mobskills/pw_fossilizing_breath.lua delete mode 100644 scripts/actions/mobskills/pw_gorgon_dance.lua delete mode 100644 scripts/actions/mobskills/pw_groundburst.lua delete mode 100644 scripts/actions/mobskills/pw_pinning_shot.lua delete mode 100644 scripts/actions/mobskills/pw_rushing_slash.lua delete mode 100644 scripts/actions/mobskills/pw_shadow_thrust.lua delete mode 100644 scripts/actions/mobskills/pw_tyrranic_blare.lua create mode 100644 scripts/actions/mobskills/quake_blast.lua create mode 100644 scripts/actions/mobskills/self-destruct_1death.lua create mode 100644 scripts/actions/mobskills/self-destruct_2.lua create mode 100644 scripts/actions/mobskills/self-destruct_2death.lua create mode 100644 scripts/actions/mobskills/self-destruct_3.lua create mode 100644 scripts/actions/mobskills/self-destruct_3death.lua create mode 100644 scripts/actions/mobskills/shadow_burst.lua create mode 100644 scripts/actions/mobskills/somnolence.lua create mode 100644 scripts/actions/mobskills/sweeping_somnolence.lua create mode 100644 scripts/actions/mobskills/teraflare.lua diff --git a/scripts/actions/mobskills/nether_blast.lua b/scripts/actions/mobskills/nether_blast.lua new file mode 100644 index 00000000000..a34cd5355ee --- /dev/null +++ b/scripts/actions/mobskills/nether_blast.lua @@ -0,0 +1,40 @@ +----------------------------------- +-- Nether Blast +-- Family: Avatar (Diabolos) +-- Description: Deals Dark breath damage to a target. +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + -- TODO: These values are pulled from JP Wiki: https://wiki.ffo.jp/html/4045.html + -- Need retail captures as mob version may be different from summoned pets. + + params.baseDamage = mob:getMainLvl() + params.additiveDamage = { 10, 10, 10 } + params.fTP = { 5, 5, 5 } + params.element = xi.element.DARK + params.useTBDA = true -- Counts as breath damage + -- params.mACCBonus = { 0, 0, 0 } -- TODO: Stated to have very high accuracy but can be resisted by targets with high DARK_MEVA/DARK_RES_RANK. + + -- Diabolos Dynamis Tavnazia tosses nether blast for ~1k + -- if skill:getID() == 1910 then + -- params.fTP = { 10, 10, 10 } + -- end + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/nether_tempest.lua b/scripts/actions/mobskills/nether_tempest.lua new file mode 100644 index 00000000000..058184fd9cd --- /dev/null +++ b/scripts/actions/mobskills/nether_tempest.lua @@ -0,0 +1,35 @@ +----------------------------------- +-- Nether Tempest +-- Family: Avatar (Diabolos) +-- Description: +-- Notes: Likely an AOE version of Nether Blast +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + -- TODO: Capture fTPs/baseDamage + -- Using Nether Blast values for now. + params.baseDamage = mob:getMainLvl() + params.additiveDamage = { 10, 10, 10 } + params.fTP = { 5, 5, 5 } + params.element = xi.element.DARK + params.useTBDA = true + -- params.mACCBonus = { 0, 0, 0 } + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/nocturnal_combustion.lua b/scripts/actions/mobskills/nocturnal_combustion.lua index 980b94ddc0b..61a40bc4d88 100644 --- a/scripts/actions/mobskills/nocturnal_combustion.lua +++ b/scripts/actions/mobskills/nocturnal_combustion.lua @@ -1,26 +1,33 @@ ----------------------------------- --- Nocturnal Combustion --- --- Description: Self-destructs, releasing dark energy at nearby targets. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: 20' radial --- Notes: Damage is based on remaining HP and time of day (more damaging near midnight). The djinn will not use this until it has been affected by the current day's element. +-- Nocturnal Combustion +-- Family: Bombs (Djinn) +-- Description: Self-destructs, dealing Dark damage to targets around mob. +-- Notes: +-- * Damage is based on remaining HP and time of day (more damaging near midnight). +-- * The djinn will not use this until it has been affected by the current day's element. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: Not unlocked for use unless mob is hit with elemental damage that matches day of week. return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * skill:getMobHPP() / 5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + -- TODO: Time of day scaling + params.baseDamage = skill:getMobHP() / 3 + params.fTP = { 1, 1, 1 } + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/nosferatus_kiss.lua b/scripts/actions/mobskills/nosferatus_kiss.lua index a7882c43dfd..5fec9566ae0 100644 --- a/scripts/actions/mobskills/nosferatus_kiss.lua +++ b/scripts/actions/mobskills/nosferatus_kiss.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Nosferatu's Kiss --- Deals damage to all targets in an area around the user. Additional effect: HP, MP and TP drain. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: AoE +-- Family: Vampyr +-- Deals Dark damage to all targets in an area around the user. Additional effect: HP, MP and TP drain. -- Note: Foe level * 0.5~1 for HP/TP. MP unknown. ----------------------------------- ---@type TMobSkill @@ -14,25 +12,35 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- Capture shows the following effects on a level 99 player from a level 85 mob: - -- 108 HP drained - -- 60 TP drained - -- 25 MP drained - local drainedHp = math.random(mob:getMainLvl() / 2, mob:getMainLvl()) - local drainedTp = math.random(mob:getMainLvl() / 2, mob:getMainLvl()) - -- TODO: This needs more captures - local drainedMp = math.random(mob:getMainLvl() / 3, mob:getMainLvl() / 2) - local info = - { - damage = drainedHp - } - drainedHp = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) - xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, drainedHp) - xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, drainedMp) - xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.TP, drainedTp) - skill:setMsg(xi.msg.basic.SKILL_DRAIN_HP) - - return drainedHp + local params = {} + + params.baseDamage = mob:getMainLvl() + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + + -- Capture shows the following effects on a level 99 player from a level 85 mob: + -- 108 HP drained + -- 60 TP drained + -- 25 MP drained + + local drainedHP = math.random(damage / 2, damage) + local drainedMP = math.random(damage / 3, damage / 2) + local drainedTP = math.random(damage / 2, damage) + + -- TODO: Capture power for effects. Current numbers roughly based off video capture. + xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, drainedHP) + xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, drainedMP) + xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.TP, drainedTP) + + skill:setMsg(xi.msg.basic.SKILL_DRAIN_HP) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/nox_blast.lua b/scripts/actions/mobskills/nox_blast.lua new file mode 100644 index 00000000000..a852c6bb696 --- /dev/null +++ b/scripts/actions/mobskills/nox_blast.lua @@ -0,0 +1,37 @@ +----------------------------------- +-- Nox Blast +-- Family: Gnole +-- Description: Deals conal AoE Dark damage to targets in front of mob. Additional Effect: Knockback, Resets TP +-- Notes: Used while standing +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- animationSub 1 = standing, animationSub 0 = all fours + if mob:getAnimationSub() == 0 then + return 1 + end + + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + target:setTP(0) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/nutrient_absorption.lua b/scripts/actions/mobskills/nutrient_absorption.lua index 71b41b72564..e5a48fa063d 100644 --- a/scripts/actions/mobskills/nutrient_absorption.lua +++ b/scripts/actions/mobskills/nutrient_absorption.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Nutrient Absorption -- Family: Euvhi --- Steals HP from a single target. --- Type: Drain --- Utsusemi/Blink absorb: 1 shadow +-- Description: Deals Dark damage to a target. Additional Effect: HP Drain. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,11 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- Damage is 300 + dINT - local info = xi.mobskills.mobMagicalMove(mob, target, skill, 300, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + params.baseDamage = 300 + params.fTP = { 1, 1, 1 } -- TODO: Jimmayus spreadsheet says this scales with TP. Need captures for scaling. + params.element = xi.element.DARK + params.dStatMultiplier = 1 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/ochre_blast.lua b/scripts/actions/mobskills/ochre_blast.lua index 1898b92e193..ad7ba90c9de 100644 --- a/scripts/actions/mobskills/ochre_blast.lua +++ b/scripts/actions/mobskills/ochre_blast.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Ochre Blast --- --- Description: Deals fire damage to enemies in area of effect. --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 18' radial. --- Notes: Used only by Ouryu and Cuelebre while flying. +-- Ochre Blast +-- Family: Wyrms +-- Description: Deals Earth damage to enemies in area of effect. +-- Notes: Used only by Ouryu and Cuelebre while flying. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -19,12 +16,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 8 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.500, 3.875, 4.250 } + params.element = xi.element.EARTH - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + end return damage end diff --git a/scripts/actions/mobskills/ochre_blast_alt.lua b/scripts/actions/mobskills/ochre_blast_alt.lua index bd2ce478a18..6521e3794e9 100644 --- a/scripts/actions/mobskills/ochre_blast_alt.lua +++ b/scripts/actions/mobskills/ochre_blast_alt.lua @@ -1,10 +1,8 @@ ----------------------------------- -- Ochre Blast Alt --- --- Description: Deals fire damage to a single target --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Notes: Used only by Tiamat, Smok and Ildebrann while flying in place of standard attacks +-- Family: Wyrms +-- Description: Deals Earth damage to a single target +-- Notes: Used by Ouryu in place of regular attacks ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,11 +12,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.EARTH, 5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - skill:setMsg(xi.msg.basic.HIT_DMG) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.EARTH + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Handle in mobFinalAdjustments + end return damage end diff --git a/scripts/actions/mobskills/osmosis.lua b/scripts/actions/mobskills/osmosis.lua index 7d4b258c564..b364d0103ed 100644 --- a/scripts/actions/mobskills/osmosis.lua +++ b/scripts/actions/mobskills/osmosis.lua @@ -1,8 +1,7 @@ ----------------------------------- -- Osmosis --- --- Description: Steals an enemy's HP and one beneficial status xi.effect. Ineffective against undead. --- Type: Magical +-- Family: Amoeban +-- Description: Deals Dark damage to an enemy. Additional Effect: HP Drain, Steals 1 Beneficial Effect ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } -- TODO: Capture fTPs + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + + mob:stealStatusEffect(target, xi.effectFlag.DISPELABLE) + end return damage end diff --git a/scripts/actions/mobskills/paralyzing_microtube.lua b/scripts/actions/mobskills/paralyzing_microtube.lua index 6ae8fc4e5c8..1c12585a5bb 100644 --- a/scripts/actions/mobskills/paralyzing_microtube.lua +++ b/scripts/actions/mobskills/paralyzing_microtube.lua @@ -1,6 +1,6 @@ ----------------------------------- -- Paralyzing Microtube --- Deals Magic damage to target. Additional effect: Paralyze +-- Description: Deals Magic damage to target. Additional effect: Paralyze -- Used by Adelheid (Trust) ----------------------------------- ---@type TMobSkill @@ -11,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 +local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 2.45, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 12.25, 12.25, 12.25 } -- TODO: Capture fTPs + params.element = xi.element.NONE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 20, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 20, 0, 60) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/penumbral_impact.lua b/scripts/actions/mobskills/penumbral_impact.lua index 00c57f3d05f..2ac3ebdd43e 100644 --- a/scripts/actions/mobskills/penumbral_impact.lua +++ b/scripts/actions/mobskills/penumbral_impact.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Penumbral Impact --- Description: Deals dark damage to a single target. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Melee +-- Penumbral Impact +-- Family: Djinn +-- Description: Deals Dark damage to a single target. Deals more damage at night. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +11,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + local timeOfDay = VanadielTOTD() + + if + -- 20:00 to 4:00 + timeOfDay == xi.time.NIGHT or + timeOfDay == xi.time.MIDNIGHT + then + params.fTP = { 4.5, 4.5, 4.5 } -- TODO: Capture fTPs. JP Wiki says damage increase is about 50%. + end + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/pestilent_penance.lua b/scripts/actions/mobskills/pestilent_penance.lua index aa5f73d5b31..f14bd45d172 100644 --- a/scripts/actions/mobskills/pestilent_penance.lua +++ b/scripts/actions/mobskills/pestilent_penance.lua @@ -1,5 +1,7 @@ ----------------------------------- --- Pestilent Penance +-- Pestilent Penance +-- Family: Promathia +-- Description: Conal AoE: Deals Dark damage to targets in range. Additional Effect: Plague ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,12 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 3, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_2) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.DARK + -- TODO: Capture shadowBehavior - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 10, 0, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 10, 0, 120) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/pl_body_slam.lua b/scripts/actions/mobskills/pl_body_slam.lua deleted file mode 100644 index 47f71798fe5..00000000000 --- a/scripts/actions/mobskills/pl_body_slam.lua +++ /dev/null @@ -1,25 +0,0 @@ ------------------------------------ --- Body Slam --- Description: Delivers an area attack. Damage varies with TP. --- Type: Physical (Blunt) ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - --- TODO: can crit -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local ftp = 3 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT, 0, 0, 0) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, info.hitslanded) - - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pl_chaos_blade.lua b/scripts/actions/mobskills/pl_chaos_blade.lua deleted file mode 100644 index 1db252fd301..00000000000 --- a/scripts/actions/mobskills/pl_chaos_blade.lua +++ /dev/null @@ -1,27 +0,0 @@ ------------------------------------ --- Chaos Blade --- Description: Deals Dark damage to enemies within a fan-shaped area. Additional effect: Curse --- Type: Magical --- Utsusemi/Blink absorb: Ignores Shadows --- Range: Melee ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 25, 0, 60) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pl_heavy_stomp.lua b/scripts/actions/mobskills/pl_heavy_stomp.lua deleted file mode 100644 index 1276b9ba37e..00000000000 --- a/scripts/actions/mobskills/pl_heavy_stomp.lua +++ /dev/null @@ -1,30 +0,0 @@ ------------------------------------ --- Heavy Stomp --- --- Description: Deals heavy damage to targets within an area of effect. Additional effect: Paralysis --- Type: Physical --- Utsusemi/Blink absorb: 2-3 shadows --- Range: Unknown radial --- Notes: Paralysis effect has a very long duration. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = math.random(2, 3) - local accmod = 1 - local ftp = .7 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, info.hitslanded) - - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.PARALYSIS, 15, 0, 360) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) - - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pl_hellclap.lua b/scripts/actions/mobskills/pl_hellclap.lua deleted file mode 100644 index acd7d67d7c4..00000000000 --- a/scripts/actions/mobskills/pl_hellclap.lua +++ /dev/null @@ -1,24 +0,0 @@ ------------------------------------ --- Hellclap ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 10 - local ftp = 4.0 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded * math.random(2, 3)) - - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.BIND, 1, 0, 4) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) - - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pl_hellsnap.lua b/scripts/actions/mobskills/pl_hellsnap.lua deleted file mode 100644 index 6f323f7681d..00000000000 --- a/scripts/actions/mobskills/pl_hellsnap.lua +++ /dev/null @@ -1,24 +0,0 @@ ------------------------------------ --- Hellsnap ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 10 - local ftp = 4.0 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded * math.random(2, 3)) - - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.STUN, 1, 0, 4) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) - - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pl_petro_eyes.lua b/scripts/actions/mobskills/pl_petro_eyes.lua deleted file mode 100644 index 329b32ed5ca..00000000000 --- a/scripts/actions/mobskills/pl_petro_eyes.lua +++ /dev/null @@ -1,21 +0,0 @@ ------------------------------------ --- Petro Eyes --- Description: Petrifies opponents with a gaze attack. --- Type: Gaze --- Utsusemi/Blink absorb: Ignores shadows --- Range: Single gaze ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - skill:setMsg(xi.mobskills.mobGazeMove(mob, target, xi.effect.PETRIFICATION, 1, 0, 30)) - - return xi.effect.PETRIFICATION -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pl_tidal_slash.lua b/scripts/actions/mobskills/pl_tidal_slash.lua deleted file mode 100644 index eba848d3b76..00000000000 --- a/scripts/actions/mobskills/pl_tidal_slash.lua +++ /dev/null @@ -1,30 +0,0 @@ ------------------------------------ --- Tidal Slash --- --- Description: Deals Water damage in a threefold --- attack to targets in a fan-shaped area of effect. --- Type: Physical? --- Utsusemi/Blink absorb: 2-3 shadows --- Range: Melee? --- Notes: Used only by Merrows equipped with a spear. --- If they lost their spear, they'll use Hysteric Barrage instead. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 3 - local accmod = 1 - local ftp = 1 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) - - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pleiades_ray.lua b/scripts/actions/mobskills/pleiades_ray.lua index 49b3587adb4..9c2b7801fd4 100644 --- a/scripts/actions/mobskills/pleiades_ray.lua +++ b/scripts/actions/mobskills/pleiades_ray.lua @@ -1,10 +1,8 @@ ----------------------------------- --- Pleiades Ray --- Description: Fires a magical ray at nearby targets. Additional effects: Paralysis + Blind + Poison + Plague + Bind + Silence + Slow --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: Unknown --- Notes: Only used by Gurfurlur the Menacing with health below 20%. +-- Pleiades Ray +-- Family: Trolls +-- Description: Fires a magical ray at nearby targets. Additional Effects: Paralysis + Blind + Poison + Plague + Bind + Silence + Slow +-- Notes: Only used by Gurfurlur the Menacing with health below 20%. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -20,19 +18,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 7 - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 3, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 40, 3, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 10, 3, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 5, 3, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 1250, 0, 120) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7.0, 7.0, 7.0 } -- TODO: Capture fTPs + params.element = xi.element.FIRE -- TODO: Capture element + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE, { breakBind = false }) + + -- TODO: Capture power/durations of status effects. + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 3, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 40, 3, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 10, 3, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 5, 3, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 1250, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/proboscis.lua b/scripts/actions/mobskills/proboscis.lua index 02a09d48497..f3b69411c94 100644 --- a/scripts/actions/mobskills/proboscis.lua +++ b/scripts/actions/mobskills/proboscis.lua @@ -1,8 +1,7 @@ ----------------------------------- -- Proboscis --- Steals MP and dispels one beneficial status effect from targets in front. --- Type: Magical --- Utsusemi/Blink absorb: ignore shadow +-- Family: Wamoura +-- Description: Drains MP from and dispels one beneficial status effect from targets in front. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,14 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() + local params = {} - target:dispelStatusEffect() + -- TODO: This is likely a physical skill with a drain attatched as its subject to PDIF. Return to this in mobPhysicalMove() PR. + -- TODO: Drain can be resisted. Need more data on if the drain is affected by anything other than Dark resists. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + + target:dispelStatusEffect() + end return damage end diff --git a/scripts/actions/mobskills/promyvion_brume.lua b/scripts/actions/mobskills/promyvion_brume.lua index 34786ff9699..9eaade3d982 100644 --- a/scripts/actions/mobskills/promyvion_brume.lua +++ b/scripts/actions/mobskills/promyvion_brume.lua @@ -1,26 +1,66 @@ ----------------------------------- --- Promyvion Brume --- --- Description: AoE Additional effect: poison --- Type: Magical Water --- Utsusemi/Blink absorb: Wipes shadows --- Range: 10' cone --- Notes: Additional effect can be removed with Poisona. +-- Promyvion Brume +-- Family: Cravers +-- Description: Deals AoE Elemental damage. Additional Effect: Poison +-- Notes: Element varies based on Empty mob's core element. ----------------------------------- ---@type TMobSkill local mobskillObject = {} +-- Element table based on Craver model IDs and animation subs +local elementTable = +{ + [1134] = + { + [14] = { element = xi.element.WATER, damageType = xi.damageType.WATER }, + [13] = { element = xi.element.DARK, damageType = xi.damageType.DARK }, + }, + [1135] = + { + [14] = { element = xi.element.EARTH, damageType = xi.damageType.EARTH }, + [13] = { element = xi.element.THUNDER, damageType = xi.damageType.THUNDER }, + }, + [1137] = + { + [14] = { element = xi.element.FIRE, damageType = xi.damageType.FIRE }, + [13] = { element = xi.element.LIGHT, damageType = xi.damageType.LIGHT }, + }, + [1138] = + { + [13] = { element = xi.element.ICE, damageType = xi.damageType.ICE }, + [14] = { element = xi.element.WIND, damageType = xi.damageType.WIND }, + }, +} + mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } + params.element = xi.element.NONE + + -- Determine element based on model ID and animation sub + local modelId = mob:getModelId() + local animationSub = mob:getAnimationSub() + local damageType = xi.damageType.ELEMENTAL + + if elementTable[modelId] and elementTable[modelId][animationSub] then + params.element = elementTable[modelId][animationSub].element + damageType = elementTable[modelId][animationSub].damageType + end + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, damageType, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, damageType) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 9, 3, 180) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 9, 3, 180) + end return damage end diff --git a/scripts/actions/mobskills/psychomancy.lua b/scripts/actions/mobskills/psychomancy.lua index 4c99bc84d3b..392cf9da6bd 100644 --- a/scripts/actions/mobskills/psychomancy.lua +++ b/scripts/actions/mobskills/psychomancy.lua @@ -1,14 +1,13 @@ ----------------------------------- -- Psychomancy --- Steals MP from players in range. --- Type: Magical --- Utsusemi/Blink absorb: ignore shadow +-- Family: Mammets +-- Description: Steals MP from players in range. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getAnimationSub() == 3 then + if mob:getAnimationSub() == 3 then -- Can only use in Staff form. return 0 end @@ -16,10 +15,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 1.7, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local damage = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 1.7, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) + damage = xi.mobskills.mobFinalAdjustments(damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.7, 1.7, 1.7 } + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/purulent_ooze.lua b/scripts/actions/mobskills/purulent_ooze.lua index 9892767db71..0d667a510e0 100644 --- a/scripts/actions/mobskills/purulent_ooze.lua +++ b/scripts/actions/mobskills/purulent_ooze.lua @@ -2,9 +2,6 @@ -- Purulent Ooze -- Family: Slugs -- Description: Deals Water damage in a fan-shaped area of effect. Additional effect: Bio and Max HP Down --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: Cone ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,15 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 +local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIO, 5, 3, 120, 0, 10) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MAX_HP_DOWN, 10, 0, 120) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + -- TODO: Capture durations + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIO, 12, 3, 120, 0, 10) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MAX_HP_DOWN, 10, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/putrid_breath.lua b/scripts/actions/mobskills/putrid_breath.lua index 085574c59be..929f87646f5 100644 --- a/scripts/actions/mobskills/putrid_breath.lua +++ b/scripts/actions/mobskills/putrid_breath.lua @@ -1,9 +1,8 @@ ----------------------------------- -- Putrid Breath --- Description: Deals breath damage to enemies around the target.. --- Type: Magical --- Utsusemi/Blink absorb: Ignores Shadows --- Notes: Only used by Cirrate Christelle +-- Description: Deals Dark damage to enemies. +-- Notes: Deals Breath damage and follows corresponding damage reductions but damage is not based on HP. +-- Notes: Only used by Cirrate Christelle. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +12,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 8 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() -- TODO: Currently balanced around weapon damage. + params.fTP = { 8, 8, 8 } + params.element = xi.element.DARK + params.useTBDA = true - target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + + if skill:getID() == xi.mobSkill.PUTRID_BREATH_1 then + skill:setMsg(xi.msg.basic.DAMAGE) + elseif skill:getID() == xi.mobSkill.PUTRID_BREATH_2 then + skill:setMsg(xi.msg.basic.HIT_DMG) + end + end return damage end diff --git a/scripts/actions/mobskills/pw_acheron_flame.lua b/scripts/actions/mobskills/pw_acheron_flame.lua deleted file mode 100644 index 8648d025cc9..00000000000 --- a/scripts/actions/mobskills/pw_acheron_flame.lua +++ /dev/null @@ -1,30 +0,0 @@ ------------------------------------ --- Acheron Flame --- Description: Deals severe Fire damage to enemies within an area of effect. Additional effect: Burn --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 20' radial --- Notes: Only used when a cerberus's health is 25% or lower (may not be the case for Orthrus). The burn effect takes off upwards of 20 HP per tick. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 6 - local resist = xi.combat.magicHitRate.calculateResistRate(mob, target, 0, 0, 0, xi.element.FIRE, xi.mod.INT, 0, 0) - local power = (resist * 10 - 5) * math.random(1, 2) + 19 -- TODO: wtf is even this? If you are gonna make-up shit, at least limit it to a single math.random - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, power, 3, 60) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pw_calcifying_deluge.lua b/scripts/actions/mobskills/pw_calcifying_deluge.lua deleted file mode 100644 index f98ee45de72..00000000000 --- a/scripts/actions/mobskills/pw_calcifying_deluge.lua +++ /dev/null @@ -1,30 +0,0 @@ ------------------------------------ --- Calcifying Deluge --- --- Description: Delivers a threefold ranged attack to targets in an area of effect. Additional effect: Petrification --- Type: Physical --- Utsusemi/Blink absorb: 2-3 shadows --- Range: Unknown --- Notes: Used only by Medusa. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local ftp = 2 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.PIERCING, xi.mobskills.shadowBehavior.NUMSHADOWS_3) - - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.PETRIFICATION, 1, 0, 30) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.PIERCING) - - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pw_decussate.lua b/scripts/actions/mobskills/pw_decussate.lua deleted file mode 100644 index 0f732fa8c12..00000000000 --- a/scripts/actions/mobskills/pw_decussate.lua +++ /dev/null @@ -1,28 +0,0 @@ ------------------------------------ --- Decussate --- --- Description: Performs a cross attack on nearby targets. --- Type: Magical --- Utsusemi/Blink absorb: 2-3 shadows? --- Range: Less than or equal to 10.0 --- Notes: Only used by Gulool Ja Ja when below 35% health. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1.2, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, math.random(2, 3)) - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pw_fossilizing_breath.lua b/scripts/actions/mobskills/pw_fossilizing_breath.lua deleted file mode 100644 index 9530d155d49..00000000000 --- a/scripts/actions/mobskills/pw_fossilizing_breath.lua +++ /dev/null @@ -1,22 +0,0 @@ ------------------------------------ --- Fossilizaing Breath --- --- Description: Petrifies targets within a fan-shaped area. --- Type: Breath --- Ignores Shadows --- Range: Unknown cone ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - skill:setMsg(xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PETRIFICATION, 1, 0, 30)) - - return xi.effect.PETRIFICATION -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pw_gorgon_dance.lua b/scripts/actions/mobskills/pw_gorgon_dance.lua deleted file mode 100644 index 118c5d27b7f..00000000000 --- a/scripts/actions/mobskills/pw_gorgon_dance.lua +++ /dev/null @@ -1,28 +0,0 @@ ------------------------------------ --- Gorgon Dance --- --- Description: Petrifies all targets in an area of effect. --- Type: Enfeebling --- Utsusemi/Blink absorb: Ignores shadows --- Range: 10' radial? --- Notes: Used only by Medusa. Starts using it at 25%. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - local mobhp = mob:getHPP() - if mobhp <= 25 then -- She's under 25%, it's okay to use this. - return 0 - else - return 1 - end -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - skill:setMsg(xi.mobskills.mobGazeMove(mob, target, xi.effect.PETRIFICATION, 1, 0, math.random(60, 180))) - - return xi.effect.PETRIFICATION -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pw_groundburst.lua b/scripts/actions/mobskills/pw_groundburst.lua deleted file mode 100644 index 505a3169a0f..00000000000 --- a/scripts/actions/mobskills/pw_groundburst.lua +++ /dev/null @@ -1,28 +0,0 @@ ------------------------------------ --- Groundburst --- --- Description: Expels a fireball on targets in an area of effect. --- Type: Physical --- Utsusemi/Blink absorb: Wipes shadows --- Range: Unknown radial --- Notes: Only used by notorious monsters, and from any Mamool Ja in besieged. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local ftp = 3 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) - - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pw_pinning_shot.lua b/scripts/actions/mobskills/pw_pinning_shot.lua deleted file mode 100644 index 83b5896c1b8..00000000000 --- a/scripts/actions/mobskills/pw_pinning_shot.lua +++ /dev/null @@ -1,30 +0,0 @@ ------------------------------------ --- Pinning Shot --- --- Description: Delivers a threefold ranged attack to targets in an area of effect. Additional effect: Bind --- Type: Physical --- Utsusemi/Blink absorb: 2-3 shadows --- Range: Unknown --- Notes: Used only by Medusa. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = math.random(2, 3) - local accmod = 1 - local ftp = 1 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.RANGED, xi.damageType.PIERCING, info.hitslanded) - - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.BIND, 1, 0, 30) - target:takeDamage(dmg, mob, xi.attackType.RANGED, xi.damageType.PIERCING) - - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pw_rushing_slash.lua b/scripts/actions/mobskills/pw_rushing_slash.lua deleted file mode 100644 index 6ddbe91824e..00000000000 --- a/scripts/actions/mobskills/pw_rushing_slash.lua +++ /dev/null @@ -1,27 +0,0 @@ ------------------------------------ --- Rushing Slash --- --- Description: Delivers a fourfold attack on a single target. --- Type: Physical --- Utsusemi/Blink absorb: 4 shadows --- Range: Melee --- Notes: Only used by Mamool Ja with slashing weapons. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 4 - local accmod = 1 - local ftp = 1 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pw_shadow_thrust.lua b/scripts/actions/mobskills/pw_shadow_thrust.lua deleted file mode 100644 index adeea2ebcf2..00000000000 --- a/scripts/actions/mobskills/pw_shadow_thrust.lua +++ /dev/null @@ -1,27 +0,0 @@ ------------------------------------ --- Shadow Thrust --- --- Description: Deals damage to a single target. --- Type: Physical --- Utsusemi/Blink absorb: 1 shadow --- Range: Melee --- Notes: Used only by Medusa. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local ftp = 3 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.PIERCING, info.hitslanded) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.PIERCING) - return dmg -end - -return mobskillObject diff --git a/scripts/actions/mobskills/pw_tyrranic_blare.lua b/scripts/actions/mobskills/pw_tyrranic_blare.lua deleted file mode 100644 index 57b392fe5d4..00000000000 --- a/scripts/actions/mobskills/pw_tyrranic_blare.lua +++ /dev/null @@ -1,28 +0,0 @@ ------------------------------------ --- Tyrranic Blare --- --- Description: Emits an overwhelming scream that damages nearby targets. --- Type: Magical? --- Utsusemi/Blink absorb: Ignores shadows --- Range: Less than or equal to 10.0 --- Notes: Only used by Gulool Ja Ja. ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.8) - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/quake_blast.lua b/scripts/actions/mobskills/quake_blast.lua new file mode 100644 index 00000000000..43f6ba91879 --- /dev/null +++ b/scripts/actions/mobskills/quake_blast.lua @@ -0,0 +1,36 @@ +----------------------------------- +-- Quake Blast +-- Family: Antlions +-- Description: Deals Earth damage to enemies within area of effect. Additional Effect: Unequip All Equipment +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.EARTH + params.dStatMultiplier = 1 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + + for i = xi.slot.MAIN, xi.slot.BACK do + target:unequipItem(i) + end + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/raiden_thrust.lua b/scripts/actions/mobskills/raiden_thrust.lua index 1fdc3726650..c646b1e7b23 100644 --- a/scripts/actions/mobskills/raiden_thrust.lua +++ b/scripts/actions/mobskills/raiden_thrust.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Raiden Thrust --- --- Deals lightning elemental damage. Damage varies with TP. --- Type: Physical --- Utsusemi/Blink absorb: 1 Shadow --- Range: Melee +-- Family: Humanoid Polearm Weaponskil +-- Description: Deals Thunder elemental damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1.25, xi.mobskills.magicalTpBonus.DMG_BONUS, 2) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } -- TODO: Capture fTPS + params.element = xi.element.THUNDER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + end return damage end diff --git a/scripts/actions/mobskills/rail_cannon.lua b/scripts/actions/mobskills/rail_cannon.lua index 04bac133adc..25ce1246148 100644 --- a/scripts/actions/mobskills/rail_cannon.lua +++ b/scripts/actions/mobskills/rail_cannon.lua @@ -1,7 +1,8 @@ ----------------------------------- -- Rail Cannon --- Always single gear --- single Gear: Rail Cannon is single target and ignores Utsusemi +-- Family: Gear +-- Notes: This version is used by single gears models (Not 1/3 triple gears). +-- Single Gear: Rail Cannon is single target and ignores Utsusemi. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +12,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.0, 5.0, 5.0 } + params.element = xi.element.LIGHT + params.dStatMultiplier = 1.5 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/rail_cannon_1.lua b/scripts/actions/mobskills/rail_cannon_1.lua index 35e8861e420..eebb0dbf531 100644 --- a/scripts/actions/mobskills/rail_cannon_1.lua +++ b/scripts/actions/mobskills/rail_cannon_1.lua @@ -1,6 +1,7 @@ ----------------------------------- --- Rail Cannon 1 gear --- 1 Gear: Rail Cannon is single target and ignores Utsusemi +-- Rail Cannon (1/3 Gear) +-- Family: Gears +-- Description: 1/3 Gear: Rail Cannon is single target and ignores Utsusemi ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,13 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.0, 5.0, 5.0 } + params.element = xi.element.LIGHT + params.dStatMultiplier = 1.5 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/rail_cannon_2.lua b/scripts/actions/mobskills/rail_cannon_2.lua index d4cb9ed6dab..5154614298d 100644 --- a/scripts/actions/mobskills/rail_cannon_2.lua +++ b/scripts/actions/mobskills/rail_cannon_2.lua @@ -1,6 +1,7 @@ ----------------------------------- --- Rail Cannon 2 gears --- 2 Gears: Rail Cannon is directional (fan-shaped) AoE and ignores Utsusemi +-- Rail Cannon (2/3 Gears) +-- Family: Gears +-- Description: 2/3 Gears: Rail Cannon is directional (fan-shaped) AoE and ignores Utsusemi ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,13 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.0, 5.0, 5.0 } + params.element = xi.element.LIGHT + params.dStatMultiplier = 1.5 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/rail_cannon_3.lua b/scripts/actions/mobskills/rail_cannon_3.lua index 3b38b291f9f..822395bac46 100644 --- a/scripts/actions/mobskills/rail_cannon_3.lua +++ b/scripts/actions/mobskills/rail_cannon_3.lua @@ -1,6 +1,7 @@ ----------------------------------- --- Rail Cannon 3 gears --- 3 Gears: Rail Cannon is AoE and strips Utsusemi +-- Rail Cannon (3/3 Gears) +-- Family: Gears +-- Description: 3/3 Gears: Rail Cannon is AoE and strips Utsusemi ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,13 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.0, 5.0, 5.0 } + params.element = xi.element.LIGHT + params.dStatMultiplier = 1.5 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/random_kiss.lua b/scripts/actions/mobskills/random_kiss.lua index d1a1a3dc41a..99f5b9925ba 100644 --- a/scripts/actions/mobskills/random_kiss.lua +++ b/scripts/actions/mobskills/random_kiss.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Random Kiss +-- Family: Leech +-- Description: Drains HP/MP/TP chosen at random. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.9) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + params.fTP = { 2.9, 2.9, 2.9 } -- TODO: Capture fTPs. Check fTPs for each type of drain. + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, math.random(0, 2), damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, math.random(0, 2), damage)) + end return damage end diff --git a/scripts/actions/mobskills/reactor_overheat.lua b/scripts/actions/mobskills/reactor_overheat.lua index af33c932a73..3a413a80743 100644 --- a/scripts/actions/mobskills/reactor_overheat.lua +++ b/scripts/actions/mobskills/reactor_overheat.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Reactor Overheat --- Zedi, while in Animation form 3 (Rings) --- Blinkable 1-3 hit, addtional effect Plague on hit. +-- Reactor Overheat +-- Family: Zedi, while in Animation form 3 (Rings) +-- Description: Deals Fire damage to targets in front of mob. Addtional Effect: Plague ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, math.random(1, 2), xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_2) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.5, 2.0 } + params.element = xi.element.FIRE - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 5, 0, math.random(30, 60)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 5, 3, math.random(30, 60)) + end return damage end diff --git a/scripts/actions/mobskills/reactor_overload.lua b/scripts/actions/mobskills/reactor_overload.lua index 9ab65588d00..39db48be3ce 100644 --- a/scripts/actions/mobskills/reactor_overload.lua +++ b/scripts/actions/mobskills/reactor_overload.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Reactor Overload --- Zedi, while in Animation form 3 (Rings) --- Blinkable 1-3 hit, addtional effect Silence on hit. +-- Reactor Overload +-- Family: Zedi, while in Animation form 3 (Rings) +-- Description: Deals Wind damage to targets around mob. Addtional Effect: Silence ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, math.random(1, 2), xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.NUMSHADOWS_3) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.5, 2.0 } + params.element = xi.element.WIND - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, math.random(15, 60)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.SILENCE, 1, 0, math.random(15, 60)) + end return damage end diff --git a/scripts/actions/mobskills/reaving_wind.lua b/scripts/actions/mobskills/reaving_wind.lua index 9fa4a623a14..e85e175943c 100644 --- a/scripts/actions/mobskills/reaving_wind.lua +++ b/scripts/actions/mobskills/reaving_wind.lua @@ -1,11 +1,9 @@ ----------------------------------- --- Reaving Wind --- Mob Ability: 2431 --- Description: Deals damage in an area of effect. Reduces target's TP by 1000. --- Type: Magical --- Utsusemi/Blink absorb: 2-3 shadows --- Range: Unknown radial --- Notes: Causes Amphipteres to enter into an aura state +-- Reaving Wind +-- Family: Amphiptere +-- Description: Resets TP of targets in range. Sometimes causes Amphipteres to enter into an aura state that constantly knocks back. +-- Notes: Sometimes causes Amphipteres to enter into an aura state. TODO: Need captures on conditions/chance for entering state. +-- Notes: The initial Reaving Wind that reduces TP does not seem to knock back. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,20 +13,12 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local tpReduced = 0 + target:setTP(tpReduced) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + skill:setMsg(xi.msg.basic.TP_REDUCED) - if target:getTP() == 0 then - skill:setMsg(xi.msg.basic.SKILL_NO_EFFECT) - else - target:setTP(target:getTP() - 1000) - end - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) - - return damage + return tpReduced end return mobskillObject diff --git a/scripts/actions/mobskills/reaving_wind_kb.lua b/scripts/actions/mobskills/reaving_wind_kb.lua index 53e4cddb49f..564d7a28170 100644 --- a/scripts/actions/mobskills/reaving_wind_kb.lua +++ b/scripts/actions/mobskills/reaving_wind_kb.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Reaving Wing (Aura Knockback) --- Description: Does no damage, knockback only. --- Type: Physical --- Utsusemi/Blink absorb: 2-3 shadows --- Notes: Zirnitra uses multiple times while aura is active. +-- Reaving Wind (Knockback) +-- Family: Amphipteres +-- Description: Does no damage, knockback only. +-- Notes: Zirnitra uses multiple times while reaving wind aura is active. ----------------------------------- ---@type TMobSkill local mobskillObject = {} diff --git a/scripts/actions/mobskills/red_lotus_blade.lua b/scripts/actions/mobskills/red_lotus_blade.lua index 9ff7c8a96b3..b02ad1200c4 100644 --- a/scripts/actions/mobskills/red_lotus_blade.lua +++ b/scripts/actions/mobskills/red_lotus_blade.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Red lotus Blade --- --- Description: Deals fire elemental damage. Damage varies with TP. --- Type: Physical --- Utsusemi/Blink absorb: 1 Shadow? --- Range: Melee +-- Family: Humanoid Sword Weaponskill +-- Description: Deals Fire elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -21,19 +18,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - if mob:getPool() == xi.mobPool.QUBIA_ARENA_TRION then -- Trion: uBia_Arena only + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 5.0, 5.0, 5.0 } -- TODO: Capture fTPs + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + if mob:getPool() == xi.mobPools.QUBIA_ARENA_TRION then -- Trion: uBia_Arena only target:showText(mob, zones[xi.zone.QUBIA_ARENA].text.RLB_LAND) elseif mob:getPool() == xi.mobPool.THRONE_ROOM_VOLKER then -- Volker: Throne_Room only target:showText(mob, zones[xi.zone.THRONE_ROOM].text.FEEL_MY_PAIN) end - local damage = mob:getWeaponDmg() * 4 - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1.25, xi.mobskills.magicalTpBonus.DMG_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - return damage end diff --git a/scripts/actions/mobskills/regurgitation.lua b/scripts/actions/mobskills/regurgitation.lua index 165de5a7a57..c262212bfb4 100644 --- a/scripts/actions/mobskills/regurgitation.lua +++ b/scripts/actions/mobskills/regurgitation.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Regurgitation --- --- Description: Deals Water damage to an enemy. Additional Effect: Bind. --- Type: Magical (Water) +-- Regurgitation +-- Family: Peiste +-- Description: Deals Water damage to an enemy. Additional Effect: Bind. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER, { breakBind = false }) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER, { breakBind = false }) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/rending_deluge.lua b/scripts/actions/mobskills/rending_deluge.lua index 429d0b49f86..610eef707e2 100644 --- a/scripts/actions/mobskills/rending_deluge.lua +++ b/scripts/actions/mobskills/rending_deluge.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Rending Deluge --- Deals water damage to enemies within range. Additional effect: Dispel. +-- Family: Craklaw +-- Description: Deals Water damage to enemies within range. Additional Effect: Dispel. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs + params.element = xi.element.WATER - target:dispelStatusEffect() - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + target:dispelStatusEffect() + end return damage end diff --git a/scripts/actions/mobskills/revelation.lua b/scripts/actions/mobskills/revelation.lua index 7767a5e723a..bfde6324533 100644 --- a/scripts/actions/mobskills/revelation.lua +++ b/scripts/actions/mobskills/revelation.lua @@ -1,5 +1,7 @@ ----------------------------------- --- Revelation +-- Revelation +-- Family: Selh'teus +-- Description: Deals Light damage to target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.LIGHT, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 1.5, 1.5, 1.5 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/rime_spray.lua b/scripts/actions/mobskills/rime_spray.lua index d88d03ff6b6..82356a470cd 100644 --- a/scripts/actions/mobskills/rime_spray.lua +++ b/scripts/actions/mobskills/rime_spray.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Rime Spray --- Description: Deals Ice damage to enemies within a fan-shaped area, inflicting them with Frost and All statuses down. --- Type: Breath --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown cone +-- Rime Spray +-- Family: Clionidae +-- Description: Deals Ice damage to enemies within a fan-shaped area, inflicting them with Frost and All statuses down. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,20 +11,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) - - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FROST, 15, 3, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, 20, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.VIT_DOWN, 20, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEX_DOWN, 20, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.AGI_DOWN, 20, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MND_DOWN, 20, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.INT_DOWN, 20, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CHR_DOWN, 20, 3, 60) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } -- TODO: Capture fTPs + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + + -- TODO: Capture power/durations + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FROST, 15, 3, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, 20, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.VIT_DOWN, 20, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEX_DOWN, 20, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.AGI_DOWN, 20, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MND_DOWN, 20, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.INT_DOWN, 20, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CHR_DOWN, 20, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/roller_chain.lua b/scripts/actions/mobskills/roller_chain.lua index 50b57fe678f..605ffafdb84 100644 --- a/scripts/actions/mobskills/roller_chain.lua +++ b/scripts/actions/mobskills/roller_chain.lua @@ -1,10 +1,8 @@ ----------------------------------- -- Roller Chain --- Only used by Ramparts when its door is closed --- Description: Single target Bind, Silence, Amnesia. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: 10' Aoe +-- Family: Ramparts +-- Description: Deals Physical damage to a target. Additional Effect: Bind. +-- Notes: Only used by Ramparts when its door is closed. ----------------------------------- ---@type TMobSkill @@ -19,15 +17,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + -- TODO: This is a physical skill. Will revisit in mobPhysicalMove() PR + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + params.element = xi.element.DARK - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.AMNESIA, 3000, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + -- TODO: Capture power/durations + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + end return damage end diff --git a/scripts/actions/mobskills/ruinous_omen.lua b/scripts/actions/mobskills/ruinous_omen.lua index 61dda54bb7f..66b1d257aa1 100644 --- a/scripts/actions/mobskills/ruinous_omen.lua +++ b/scripts/actions/mobskills/ruinous_omen.lua @@ -1,6 +1,12 @@ ----------------------------------- -- Ruinous Omen --- Deals dark elemental damage to enemies within area of effect. +-- Family: Avatar (Diabolos) +-- Description: Deals damage equal to a random percentage of HP to enemies within area of effect. + +-- https://ffxiclopedia.fandom.com/wiki/Ruinous_Omen +-- Prime Avatar seems to do an unresisted ~66% HP reduction from players' current HP (not max HP) +-- Ruinous Omen by design cannot KO a target, but can significantly reduce its HP +-- Version used by player summoners seems capped at ~2% except against Behemoths ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +16,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.DARK + + -- TODO: Capture mechanics of this skill. Currently using default old values. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 3, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + end return damage end diff --git a/scripts/actions/mobskills/sandspin.lua b/scripts/actions/mobskills/sandspin.lua index 3dd9123b6e9..46f7cc7a326 100644 --- a/scripts/actions/mobskills/sandspin.lua +++ b/scripts/actions/mobskills/sandspin.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Sandspin --- Deals earth damage to enemies within range. Additional Effect: Accuracy Down. --- Area of Effect is centered around caster. --- The Additional Effect: Accuracy Down may not always process. --- Duration: Three minutes ? +-- Family: Worms +-- Description: Deals Earth damage to enemies around mob. Additional Effect: Accuracy Down. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.3) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.EARTH - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ACCURACY_DOWN, 50, 0, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ACCURACY_DOWN, 25, 0, 180) + end return damage end diff --git a/scripts/actions/mobskills/scintillant_lance.lua b/scripts/actions/mobskills/scintillant_lance.lua index 694eb1c66be..eca2f053e86 100644 --- a/scripts/actions/mobskills/scintillant_lance.lua +++ b/scripts/actions/mobskills/scintillant_lance.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Scintillant Lance --- Deals light damage to targets in a fan-shaped area of effect. +-- Family: Monoceros +-- Description: Deals Light damage to targets in a fan-shaped area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1.5, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.75, 3.75, 3.75 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/scouring_bubbles.lua b/scripts/actions/mobskills/scouring_bubbles.lua index badb0f522af..513928604eb 100644 --- a/scripts/actions/mobskills/scouring_bubbles.lua +++ b/scripts/actions/mobskills/scouring_bubbles.lua @@ -1,7 +1,8 @@ ----------------------------------- -- Scouring Bubbles --- Deals Water Magic damage in an Area of Effect --- Used by Mihli Aliapoh (Trust) +-- Family: Mihli Aliapoh +-- Description: Deals damage in an Area of Effect. +-- Notes: Used by Mihli Aliapoh (Trust) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +12,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 2.45, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 12.25, 12.25, 12.25 } -- TODO: Capture fTPs + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + -- TODO: This is likely a physical move. JPWiki mentions there have been cases of it missing. + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end return damage end diff --git a/scripts/actions/mobskills/searing_light.lua b/scripts/actions/mobskills/searing_light.lua index 85803563905..cac0ba2467a 100644 --- a/scripts/actions/mobskills/searing_light.lua +++ b/scripts/actions/mobskills/searing_light.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Searing Light --- Deals light elemental damage to enemies within area of effect. +-- Family: Avatar (Carbuncle) +-- Description: Deals Light elemental damage to enemies within area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 3, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.LIGHT + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/self-destruct_1death.lua b/scripts/actions/mobskills/self-destruct_1death.lua new file mode 100644 index 00000000000..f147ed0ad9c --- /dev/null +++ b/scripts/actions/mobskills/self-destruct_1death.lua @@ -0,0 +1,40 @@ +----------------------------------- +-- Self-Destruct +-- Family: Clusters +-- Description: Last remaining bomb in the Cluster explodes to deal Fire damage on targets in range. +-- Notes: Bomb Cluster Self Destruct - 1 Bomb up +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + if + mob:isMobType(xi.mobskills.mobType.NOTORIOUS) or -- Don't suicide if NM + mob:getHPP() > 20 or -- Can only be used below 20% + mob:getAnimationSub() ~= 2 -- Only used when 1 bomb remaining + then + return 1 + end + + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + mob:setHP(0) + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_2.lua b/scripts/actions/mobskills/self-destruct_2.lua new file mode 100644 index 00000000000..f22e4768233 --- /dev/null +++ b/scripts/actions/mobskills/self-destruct_2.lua @@ -0,0 +1,39 @@ +----------------------------------- +-- Self-Destruct +-- Family: Clusters +-- Description: The 2nd bomb in the Cluster explodes to deal Fire damage on targets in range. +-- Notes: Bomb Cluster Self Destruct - 2 Bomb up +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + if + mob:getHPP() > 32 or -- Can only be used below 20% + mob:getAnimationSub() ~= 1 -- Only used when 2 bombs remaining + then + return 1 + end + + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + skill:setFinalAnimationSub(2) + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_2death.lua b/scripts/actions/mobskills/self-destruct_2death.lua new file mode 100644 index 00000000000..711627d0e0a --- /dev/null +++ b/scripts/actions/mobskills/self-destruct_2death.lua @@ -0,0 +1,42 @@ +----------------------------------- +-- Self-Destruct +-- Family: Clusters +-- Description: 2 Remaining bombs explode to deal Fire damage on targets in range. +-- Notes: Bomb Cluster Self Destruct - 2 bombs alive. + +-- TODO: These are not properly weighted and we currently do not have support to do this enmass. +-- Ideally, we would want to weight this against self_destruct_2. +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + if + mob:getHPP() > 32 or -- Can only be used below 32% + mob:getAnimationSub() ~= 1 -- Only used when 2 bombs remaining + then + return 1 + end + + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + mob:setHP(0) + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_3.lua b/scripts/actions/mobskills/self-destruct_3.lua new file mode 100644 index 00000000000..7daea8977cd --- /dev/null +++ b/scripts/actions/mobskills/self-destruct_3.lua @@ -0,0 +1,38 @@ +----------------------------------- +-- Self-Destruct +-- Family: Clusters +-- Notes: Bomb Cluster Self Destruct - 3 Bombs up +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + if + mob:getHPP() > 66 or -- Can only be used below 66% + mob:getAnimationSub() > 0 -- Only used when 3 bombs are remaining + then + return 1 + end + + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + skill:setFinalAnimationSub(1) + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_3death.lua b/scripts/actions/mobskills/self-destruct_3death.lua new file mode 100644 index 00000000000..75ff673bcdb --- /dev/null +++ b/scripts/actions/mobskills/self-destruct_3death.lua @@ -0,0 +1,46 @@ +----------------------------------- +-- Self-Destruct +-- Family: Clusters +-- Description: All 3 bombs explode to deal Fire damage on targets in range. +-- Notes: Bomb Cluster Self Destruct - 3 bombs alive. + +-- TODO: These are not properly weighted and we currently do not have support to do this enmass. +-- Ideally, we would want to weight this against self_destruct_3. +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + if + mob:getHPP() > 66 or -- Can only be used below 66% + mob:getAnimationSub() > 0 -- Only used when 3 bombs are remaining + then + return 1 + end + + if math.random(0, 100) > 20 then -- 20% chance for all bombs to explode. + return 1 + end + + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + mob:setHP(0) + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_bomb.lua b/scripts/actions/mobskills/self-destruct_bomb.lua index 18b34090486..62de145e21b 100644 --- a/scripts/actions/mobskills/self-destruct_bomb.lua +++ b/scripts/actions/mobskills/self-destruct_bomb.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Self-Destruct --- Description : Sacrifices user to deal fire damage to targets in the area. +-- Family: Bombs +-- Description: Suicide Move. Deals damage to targets in range based on mob's remaining HP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getHP() / 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() / 3 + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/seraph_blade.lua b/scripts/actions/mobskills/seraph_blade.lua index a9dbf10d186..3e337aa9a67 100644 --- a/scripts/actions/mobskills/seraph_blade.lua +++ b/scripts/actions/mobskills/seraph_blade.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Seraph Blade --- --- Description: Deals light elemental damage. Damage varies with TP. --- Type: Physical --- Utsusemi/Blink absorb: 1 Shadow? --- Range: Melee +-- Family: Humanoid Sword Weaponskill +-- Description: Deals Light elemental damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,12 +12,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1.25, xi.mobskills.magicalTpBonus.DMG_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.0, 5.0, 5.0 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/shadow_burst.lua b/scripts/actions/mobskills/shadow_burst.lua new file mode 100644 index 00000000000..f8be8399197 --- /dev/null +++ b/scripts/actions/mobskills/shadow_burst.lua @@ -0,0 +1,39 @@ +----------------------------------- +-- Shadow Burst +-- Family: Gargouille +-- Description: Deals Dark damage to enemies within area of effect. Additional Effect: Curse +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: Animation looks like it is meant to be used in standing form. Need captures. + if mob:getAnimationSub() ~= 0 then + return 1 + end + + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + -- TODO: Capture duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 50, 0, 300) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/shantotto_ii_melee.lua b/scripts/actions/mobskills/shantotto_ii_melee.lua index 1e5da1cddb3..2c3c1167772 100644 --- a/scripts/actions/mobskills/shantotto_ii_melee.lua +++ b/scripts/actions/mobskills/shantotto_ii_melee.lua @@ -9,13 +9,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 1.0, 1.0, 1.0 } -- TODO: Capture fTPs + params.element = xi.element.NONE + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) - skill:setMsg(xi.msg.basic.HIT_DMG) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + end + + skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Set once params passed to mobFinalAdjustments return damage end diff --git a/scripts/actions/mobskills/shining_blade.lua b/scripts/actions/mobskills/shining_blade.lua index e1a0c5f7ecd..9ab52e572b0 100644 --- a/scripts/actions/mobskills/shining_blade.lua +++ b/scripts/actions/mobskills/shining_blade.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Shining Blade --- --- Description: Deals light elemental damage. Damage varies with TP. --- Type: Physical --- Utsusemi/Blink absorb: 1 Shadow? --- Range: Melee +-- Family: Humanoid Sword Weaponskill +-- Description: Deals Light elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -16,12 +13,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.DMG_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + end return damage end diff --git a/scripts/actions/mobskills/shock_wave.lua b/scripts/actions/mobskills/shock_wave.lua index 31752f63179..98aa0a9b7fe 100644 --- a/scripts/actions/mobskills/shock_wave.lua +++ b/scripts/actions/mobskills/shock_wave.lua @@ -1,6 +1,8 @@ ----------------------------------- --- Shock_Wave --- Deals damage in a frontal area of effect. Additional effect: Knockback +-- Shock Wave +-- Family: Behemoth +-- Description: Deals damage in a frontal area of effect. Additional Effect: Knockback +-- Notes: TODO: The mob seems to turn towards the target when using this skill even if they are behind it and in auto range. https://youtu.be/pazG7AJ6jV8?t=986 ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,10 +16,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 0.6, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 0.6, 0.6, 0.6 } + params.element = xi.element.WIND + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/silencing_microtube.lua b/scripts/actions/mobskills/silencing_microtube.lua index 33d4baf543c..023c83f14c8 100644 --- a/scripts/actions/mobskills/silencing_microtube.lua +++ b/scripts/actions/mobskills/silencing_microtube.lua @@ -1,6 +1,6 @@ ----------------------------------- -- Silencing Microtube --- Deals Magic damage to target. Additional effect: Silence +-- Description: Deals Magic damage to target. Additional effect: Silence -- Used by Adelheid (Trust) ----------------------------------- ---@type TMobSkill @@ -11,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 +local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 2.45, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 12.25, 12.25, 12.25 } -- TODO: Capture fTPs + params.element = xi.element.NONE -- TODO: Capture Element - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + + -- TODO: Capture durations + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) + end return damage end diff --git a/scripts/actions/mobskills/siphon_discharge.lua b/scripts/actions/mobskills/siphon_discharge.lua index 0dc812cefc8..dfa65e70506 100644 --- a/scripts/actions/mobskills/siphon_discharge.lua +++ b/scripts/actions/mobskills/siphon_discharge.lua @@ -1,12 +1,7 @@ ----------------------------------- --- Siphon Discharge --- --- Family: Xzomit --- Type: Water elemental --- Can be dispelled: N/A --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown cone --- Notes: Water Damage Knockback. +-- Siphon Discharge +-- Family: Xzomit +-- Description: Deals Water damage to targets in front of mob. Additional Effect: Knockback ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -16,10 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.WATER + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) return damage end diff --git a/scripts/actions/mobskills/slaverous_gale.lua b/scripts/actions/mobskills/slaverous_gale.lua index 95ce035ef66..172cde0fd16 100644 --- a/scripts/actions/mobskills/slaverous_gale.lua +++ b/scripts/actions/mobskills/slaverous_gale.lua @@ -1,8 +1,7 @@ ----------------------------------- -- Slaverous Gale --- --- Description: Deals earth damage that inflicts Plague and Slow effects on targets in front of the caster --- Type: Magical (Earth) +-- Family: Sandworms +-- Description: Deals damage to targets in front of mob. Additional Effect: Plague, Slow ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,14 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * math.random(4, 6) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.0, 5.0, 5.0 } + params.element = xi.element.EARTH - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 1, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 1250, 0, 60) + -- TODO: JP wiki says this can miss and may be a physical skill. Need more captures to confirm. + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 5, 3, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 5000, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/sleet_blast.lua b/scripts/actions/mobskills/sleet_blast.lua index 033cf2c13a5..14a935d1583 100644 --- a/scripts/actions/mobskills/sleet_blast.lua +++ b/scripts/actions/mobskills/sleet_blast.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Sleet Blast --- --- Description: Deals ice damage to enemies in area of effect. --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 18' radial. --- Notes: Used only by Ouryu and Cuelebre while flying. +-- Sleet Blast +-- Family: Wyrms (Jormungand) +-- Description: Deals Ice damage to enemies in area of effect. +-- Notes: Used in flight mode. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -19,10 +16,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + end return damage end diff --git a/scripts/actions/mobskills/sleet_blast_alt.lua b/scripts/actions/mobskills/sleet_blast_alt.lua index 1e2757dce53..6176e4dc973 100644 --- a/scripts/actions/mobskills/sleet_blast_alt.lua +++ b/scripts/actions/mobskills/sleet_blast_alt.lua @@ -1,10 +1,8 @@ ----------------------------------- --- Ochre Blast Alt --- --- Description: Deals fire damage to a single target --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Notes: Used only by Tiamat, Smok and Ildebrann while flying in place of standard attacks +-- Sleep Blast Alt +-- Family: Wyrms +-- Description: Deals Ice damage to a single target. +-- Notes: Used Jormungand while flying in place of standard attacks. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,11 +12,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) - skill:setMsg(xi.msg.basic.HIT_DMG) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + + skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Handle in mobFinalAdjustments once we pass params + end return damage end diff --git a/scripts/actions/mobskills/smoke_discharger.lua b/scripts/actions/mobskills/smoke_discharger.lua index 5f91728e5af..f1b092aede7 100644 --- a/scripts/actions/mobskills/smoke_discharger.lua +++ b/scripts/actions/mobskills/smoke_discharger.lua @@ -28,7 +28,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, 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, skill, xi.effect.PETRIFICATION, 1, 3, 45) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PETRIFICATION, 1, 0, 45) if target:hasStatusEffect(xi.effect.ELEMENTALRES_DOWN) then target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) diff --git a/scripts/actions/mobskills/smouldering_swarm.lua b/scripts/actions/mobskills/smouldering_swarm.lua index 8edf392fc89..95721d450da 100644 --- a/scripts/actions/mobskills/smouldering_swarm.lua +++ b/scripts/actions/mobskills/smouldering_swarm.lua @@ -1,10 +1,7 @@ ----------------------------------- --- Smouldering Swarm --- --- Description: Deals Fire damage to enemies within an area of effect. Additional effect: Knockback --- Type: Magical (Fire) --- Utsusemi/Blink absorb: 2-3 shadows --- Range: 10' radial +-- Smouldering Swarm +-- Family: Twitherym +-- Description: Deals Fire damage to enemies within an area of effect. Additional Effect: Burn, Knockback ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,16 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local dmgmod = 2 - local duration = math.random(15, 90) - local damage = mob:getWeaponDmg() + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, dmgmod, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } -- TODO: Capture fTPs + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 10, 3, duration) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + -- TODO: Verify duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 10, 3, 90) + end return damage end diff --git a/scripts/actions/mobskills/snort.lua b/scripts/actions/mobskills/snort.lua index fd6abcda353..4b26ddfb61a 100644 --- a/scripts/actions/mobskills/snort.lua +++ b/scripts/actions/mobskills/snort.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Snort --- Description: Deals Wind damage to targets in a fan-shaped area of effect. Additional effect: Knockback --- Type: Magical (Wind) +-- Family: Buffalo +-- Description: Deals Wind damage to targets in a fan-shaped area of effect. Additional Effect: Knockback ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } + params.element = xi.element.WIND + -- params.dStatMultiplier = 1 TODO: Possible dINT multiplier, need more captures. - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/snort_2127.lua b/scripts/actions/mobskills/snort_2127.lua index 625db646298..f0a0efe8381 100644 --- a/scripts/actions/mobskills/snort_2127.lua +++ b/scripts/actions/mobskills/snort_2127.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Snort +-- Family: Buffalo -- Description: Deals Wind damage to targets in a fan-shaped area of effect. Additional effect: Knockback --- Type: Magical (Wind) -- Note: Shows as a regular attack and lowers enmity ----------------------------------- ---@type TMobSkill @@ -12,14 +12,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } + params.element = xi.element.WIND + -- params.dStatMultiplier = 1 TODO: Possible dINT multiplier, need more captures. - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - skill:setMsg(xi.msg.basic.HIT_DMG) - mob:lowerEnmity(target, 25) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + skill:setMsg(xi.msg.basic.HIT_DMG) + mob:lowerEnmity(target, 25) + end return damage end diff --git a/scripts/actions/mobskills/snow_cloud.lua b/scripts/actions/mobskills/snow_cloud.lua index 6d408b479d2..dab6f2f8005 100644 --- a/scripts/actions/mobskills/snow_cloud.lua +++ b/scripts/actions/mobskills/snow_cloud.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Snow Cloud --- Deals Ice damage to targets in a fan-shaped area of effect. Additional effect: Paralyze --- Range: 10' cone +-- Family: Rabbits +-- Description: Deals Ice damage to targets in a fan-shaped area of effect. Additional Effect: Paralysis ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getMainLvl() + 2 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.ICE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 30, 0, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 30, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/snowball.lua b/scripts/actions/mobskills/snowball.lua index f6e81bbd5f5..5767a3556ac 100644 --- a/scripts/actions/mobskills/snowball.lua +++ b/scripts/actions/mobskills/snowball.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Snowball --- Deals Ice damage in an area of effect. +-- Family: Lizards +-- Description: Deals Ice damage in an area around target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,11 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 2.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.5, 2.5, 2.5 } + params.element = xi.element.ICE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + end return damage end diff --git a/scripts/actions/mobskills/somnolence.lua b/scripts/actions/mobskills/somnolence.lua new file mode 100644 index 00000000000..97cd0e36a8c --- /dev/null +++ b/scripts/actions/mobskills/somnolence.lua @@ -0,0 +1,33 @@ +----------------------------------- +-- Somnolence +-- Family: Avatar (Diabolos) +-- Description: Deals Dark damage to enemy. Additional Effect: Weight. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } -- TODO: Capture fTPs + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + -- TODO: Capture power/duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 25, 0, 60) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/sonic_buffet.lua b/scripts/actions/mobskills/sonic_buffet.lua index c9b49f2d012..0f805972d51 100644 --- a/scripts/actions/mobskills/sonic_buffet.lua +++ b/scripts/actions/mobskills/sonic_buffet.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Sonic Buffet +-- Family: Avatar (Siren) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,16 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.50, 2.50, 2.50 } -- TODO: Capture fTPs + params.element = xi.element.WIND + -- TODO: Capture shadowBehavior - for i = 1, math.random(2, 3) do - target:dispelStatusEffect(xi.effectFlag.DISPELABLE) - end + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + for i = 1, math.random(2, 3) do + target:dispelStatusEffect(xi.effectFlag.DISPELABLE) + end + end return damage end diff --git a/scripts/actions/mobskills/soul_drain.lua b/scripts/actions/mobskills/soul_drain.lua index 69802d20474..b173422ea1f 100644 --- a/scripts/actions/mobskills/soul_drain.lua +++ b/scripts/actions/mobskills/soul_drain.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Soul Drain +-- Family: Demons (Kindred) -- Description: Steals an enemy's HP. --- Type: Magical --- Utsusemi/Blink absorb: 1 shadow --- Range: Melee ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,10 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 1.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.BLUNT, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.DARK + -- TODO: This is a physical skill. Will fix in mobPhysicalMove() PR + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/soulshattering_roar.lua b/scripts/actions/mobskills/soulshattering_roar.lua index 65cb23572aa..818842b4c26 100644 --- a/scripts/actions/mobskills/soulshattering_roar.lua +++ b/scripts/actions/mobskills/soulshattering_roar.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Soulshattering Roar +-- Family: Yztarg +-- Description: Deals (TODO: Physical/Magical?) damage to enemies in range of mob. Additional Effect: Terror ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,15 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs + params.element = xi.element.DARK -- TODO: Capture element if skill is a magicalMove + -- TODO: Capture Skill range and AoE Radius - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.TERROR, 1, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) -- TODO: Is move magical or physical? Need captures + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.TERROR, 1, 0, 30) -- TODO: Capture duration + end -- TODO: Temporary immunity to a single weapon damage type + -- Note: This should probably be handled in a mixin or within the mob script. return damage end diff --git a/scripts/actions/mobskills/spirit_absorption.lua b/scripts/actions/mobskills/spirit_absorption.lua index 7c2276f6436..8ca76e39641 100644 --- a/scripts/actions/mobskills/spirit_absorption.lua +++ b/scripts/actions/mobskills/spirit_absorption.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Spirit Absorption --- Deals elemental damage to the target. Additional effect: Drain. --- Type: Magical --- Utsusemi/Blink absorb: 1 Shadows --- Range: Melee +-- Family: Gorgers +-- Description: Deals Dark damage to a target. Additional Effect: HP Drain ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 3.5, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, dmg)) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.DARK - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/spirit_tap.lua b/scripts/actions/mobskills/spirit_tap.lua index 4af0866638c..06fda7ee73b 100644 --- a/scripts/actions/mobskills/spirit_tap.lua +++ b/scripts/actions/mobskills/spirit_tap.lua @@ -1,16 +1,14 @@ ----------------------------------- -- Spirit Tap --- Attempts to absorb one buff from a single target. --- Type: Magical --- Utsusemi/Blink absorb: Ignores Shadows --- Range: Melee +-- Family: Thinkers +-- Description: Attempts to absorb one buff from a single target. -- Notes: Can be any (positive) buff, including food ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:isMobType(xi.mobType.NOTORIOUS) then + if mob:isMobType(xi.mobType.NOTORIOUS) then -- TODO: Set proper skill lists. return 1 end @@ -19,10 +17,10 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local dispel = mob:stealStatusEffect(target, bit.bor(xi.effectFlag.DISPELABLE, xi.effectFlag.FOOD)) - local msg -- to be set later + local msg -- To be set later if dispel == 0 then - msg = xi.msg.basic.SKILL_NO_EFFECT -- no effect + msg = xi.msg.basic.SKILL_NO_EFFECT -- No effect else msg = xi.msg.basic.EFFECT_DRAINED end diff --git a/scripts/actions/mobskills/static_filament.lua b/scripts/actions/mobskills/static_filament.lua index 85a0f9fc1a5..14b19c9b327 100644 --- a/scripts/actions/mobskills/static_filament.lua +++ b/scripts/actions/mobskills/static_filament.lua @@ -1,7 +1,8 @@ ----------------------------------- --- Static Filament --- Zedi, while in Animation form 2 (Bars) --- Blinkable 1-2 hit, addtional effect stun on hit. +-- Static Filament +-- Family: Zdei +-- Description: Deals Thunder damage in a forward cone. Additional Effect: Stun +-- Notes: Zdei, while in Animation form 2 (Bars) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +12,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, math.random(1, 2), xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.NUMSHADOWS_2) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.5, 2.0 } + params.element = xi.element.THUNDER + -- TODO: Capture shadowBehavior - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.STUN, 1, 0, 4) + end return damage end diff --git a/scripts/actions/mobskills/stellar_burst.lua b/scripts/actions/mobskills/stellar_burst.lua index e447f96d644..cb00f300691 100644 --- a/scripts/actions/mobskills/stellar_burst.lua +++ b/scripts/actions/mobskills/stellar_burst.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Stellar Burst --- A starburst damages targets in an area of effect. Additional effect: Silence +-- Family: Eald'narche +-- Description: A starburst damages targets in an area of effect. Additional Effect: Silence ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,15 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.NONE, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_3) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.NONE -- TODO: Capture element - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) - if not target:isTrust() then - mob:resetEnmity(target) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 30) + + if not target:isTrust() then + mob:resetEnmity(target) + end end return damage diff --git a/scripts/actions/mobskills/stone_ii.lua b/scripts/actions/mobskills/stone_ii.lua index 1331d1ea629..f43e6f09953 100644 --- a/scripts/actions/mobskills/stone_ii.lua +++ b/scripts/actions/mobskills/stone_ii.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Stone II --- Deals earth elemental damage. Damage varies with TP. +-- Family: Avatar (Titan) +-- Description: Deals Earth elemental damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.EARTH - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + end return damage end diff --git a/scripts/actions/mobskills/stone_iv.lua b/scripts/actions/mobskills/stone_iv.lua index 82ccaa2a606..751fb2a64c6 100644 --- a/scripts/actions/mobskills/stone_iv.lua +++ b/scripts/actions/mobskills/stone_iv.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Stone IV --- Titan deals earth elemental damage to target. +-- Family: Avatar (Titan) +-- Description: Titan deals Earth elemental damage to target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8.0, 8.0, 8.0 } -- TODO: Capture fTPs + params.element = xi.element.EARTH - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + end return damage end diff --git a/scripts/actions/mobskills/stone_meeble_warble.lua b/scripts/actions/mobskills/stone_meeble_warble.lua index 1f3aa48f661..564cd78f5c8 100644 --- a/scripts/actions/mobskills/stone_meeble_warble.lua +++ b/scripts/actions/mobskills/stone_meeble_warble.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Stone Meeble Warble --- AOE Earth Elemental damage, inflicts Petrification and Rasp (50 HP/tick). +-- Family: Meebles +-- Description: AOE Earth Elemental damage, inflicts Petrification and Rasp (50 HP/tick). ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,14 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 16.00, 16.00, 16.00 } -- TODO: Capture fTPs + params.element = xi.element.EARTH - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PETRIFICATION, 30, 0, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.RASP, 50, 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + -- TODO: Capture power/durations + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PETRIFICATION, 30, 0, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.RASP, 50, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/storm_wing.lua b/scripts/actions/mobskills/storm_wing.lua index 3b88e8cccce..c7390bef513 100644 --- a/scripts/actions/mobskills/storm_wing.lua +++ b/scripts/actions/mobskills/storm_wing.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Storm Wing --- Mob Ability: 2432 --- Description: Deals damage within a fan-shaped area. Additional effect: Silence. --- Type: Magical +-- Storm Wing +-- Family: Amphiptere +-- Description: Deals damage within a fan-shaped area. Additional Effect: Knockback, Silence ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.NUMSHADOWS_3) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.WIND + -- TODO: Capture knockback value. - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 120) + end return damage end diff --git a/scripts/actions/mobskills/stormwind.lua b/scripts/actions/mobskills/stormwind.lua index d5e8f95786c..208320a7098 100644 --- a/scripts/actions/mobskills/stormwind.lua +++ b/scripts/actions/mobskills/stormwind.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Stormwind --- Description: Creates a whirlwind that deals Wind damage to targets in an area of effect. --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: Unknown radial +-- Stormwind +-- Family: Rocs +-- Description: Creates a whirlwind that deals Wind damage to targets in an area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,22 +11,31 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local dmgMod = 3 + local params = {} + + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.WIND + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + + if mob:getPool() == xi.mobPools.KREUTZET then + local stormwindDamage = mob:getLocalVar('stormwindDamage') -- TODO: Maybe change name of localVar to stormwindCounter for clarity. - -- TODO: Use TP for this? Or literally anything else? - if mob:getName() == 'Kreutzet' then - local stormwindDamage = mob:getLocalVar('stormwindDamage') if stormwindDamage == 2 then - dmgMod = 3.25 + params.fTP = { 3.25, 3.25, 3.25 } elseif stormwindDamage == 3 then - dmgMod = 3.6 + params.fTP = { 3.60, 3.60, 3.60 } end end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, dmgMod, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + -- TODO: Nightmare Rocs apply Silence. + end return damage end diff --git a/scripts/actions/mobskills/stun_cannon.lua b/scripts/actions/mobskills/stun_cannon.lua index a634526ab0f..9c6575429f4 100644 --- a/scripts/actions/mobskills/stun_cannon.lua +++ b/scripts/actions/mobskills/stun_cannon.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Stun_Cannon --- Description: 20'(?) cone ~300 magic damage and Paralysis, ignores Utsusemi --- Type: Magical --- Range: 20 yalms +-- Stun Cannon +-- Family: Omega +-- Description: Deals Thunder? damage to targets in front of mob. Additional Effect: Paralysis ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -16,13 +15,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1.5, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.50, 4.50, 4.50 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + -- TODO: Capture AoE type - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 20, 0, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) -- TODO: Capture if Magical or Physical + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 20, 0, 120) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/stupor_spores.lua b/scripts/actions/mobskills/stupor_spores.lua index 840c563cd82..d329040a9a1 100644 --- a/scripts/actions/mobskills/stupor_spores.lua +++ b/scripts/actions/mobskills/stupor_spores.lua @@ -2,8 +2,6 @@ -- Stupor Spores -- Family: Euvhi -- Description: Spreads intoxicating spores that damages nearby targets. Additional effect: Sleep --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- TODO: Damage needs 1 + dINT added - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.NONE + params.dStatMultiplier = 1 - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLEEP_I, 1, 0, math.random(15, 60)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLEEP_I, 1, 0, math.random(15, 60)) + end return damage end diff --git a/scripts/actions/mobskills/sweeping_somnolence.lua b/scripts/actions/mobskills/sweeping_somnolence.lua new file mode 100644 index 00000000000..ced7ad6c73e --- /dev/null +++ b/scripts/actions/mobskills/sweeping_somnolence.lua @@ -0,0 +1,31 @@ +----------------------------------- +-- Sweeping Somnolence +-- Family: Avatar (Diabolos) +-- Description: Deals Dark damage to enemies in range. Additional Effect: Weight. +----------------------------------- +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } -- TODO: Capture fTPs + params.element = xi.element.DARK + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 25, 0, 60) -- TODO: Capture power/duration + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/tebbad_wing.lua b/scripts/actions/mobskills/tebbad_wing.lua index f3059a335af..e730dcbe933 100644 --- a/scripts/actions/mobskills/tebbad_wing.lua +++ b/scripts/actions/mobskills/tebbad_wing.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Tebbad Wing --- --- Description: A hot wind deals Fire damage to enemies within a very wide area of effect. Additional effect: Plague --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 30' radial. --- Notes: Used only by Tiamat, Smok and Ildebrann +-- Tebbad Wing +-- Family: Wyrms +-- Description: A hot wind deals Fire damage to enemies within a very wide area of effect. Additional Effect: Plague +-- Notes: Used by Tiamat, Smok and Ildebrann on round. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -23,11 +20,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 10, 0, 120) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.00, 4.00, 4.00 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 10, 0, 120) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/tebbad_wing_air.lua b/scripts/actions/mobskills/tebbad_wing_air.lua index 88503e5a18f..c0afd6c0fd3 100644 --- a/scripts/actions/mobskills/tebbad_wing_air.lua +++ b/scripts/actions/mobskills/tebbad_wing_air.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Tebbad Wing --- --- Description: A hot wind deals Fire damage to enemies within a very wide area of effect. Additional effect: Plague --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 30' radial. --- Notes: Used only by Tiamat, Smok and Ildebrann +-- Tebbad Wing +-- Family: Wyrms +-- Description: A hot wind deals Fire damage to enemies within a very wide area of effect. Additional Effect: Plague +-- Notes: Used by Tiamat, Smok and Ildebrann while flying. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -19,11 +16,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 6, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 10, 0, 120) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6.00, 6.00, 6.00 } + params.element = xi.element.FIRE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 10, 0, 120) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/tempest_wing.lua b/scripts/actions/mobskills/tempest_wing.lua index d1a1b1be1fe..d5cc4a4d74c 100644 --- a/scripts/actions/mobskills/tempest_wing.lua +++ b/scripts/actions/mobskills/tempest_wing.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Tempest Wing -- Family: Bahamut --- Description: Turbulence deals Wind damage to enemies within a very wide area of effect. Additional effect: Knockback --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: Cone +-- Description: Turbulence deals Wind damage to enemies in front of mob. Additional effect: Blind, Knockback ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -18,12 +15,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + params.fTP = { 4.75, 4.75, 4.75 } + params.element = xi.element.WIND + -- TODO: Forces mob to face target. + -- TODO: Capture knockback range - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 50, 0, 60) + end return damage end diff --git a/scripts/actions/mobskills/tempestuous_upheaval.lua b/scripts/actions/mobskills/tempestuous_upheaval.lua index 734a5a58e84..bf912fe92f2 100644 --- a/scripts/actions/mobskills/tempestuous_upheaval.lua +++ b/scripts/actions/mobskills/tempestuous_upheaval.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Tempestuous Upheaval --- --- Description: Deals Wind damage to enemies within an area of effect. Additional effect: Knockback --- Type: Magical (Wind) --- Utsusemi/Blink absorb: 2-3 shadows --- Range: 10' radial --- Notes: The knockback is rather severe. +-- Tempestuous Upheaval +-- Family: Twitherym +-- Description: Deals Wind damage to enemies within an area of effect. Additional Effect: Knockback +-- Notes: The knockback is rather severe. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,13 +12,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local dmgmod = 2.1 - local damage = mob:getWeaponDmg() + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, dmgmod, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.1, 2.10, 2.10 } -- TODO: Capture fTPs + params.element = xi.element.WIND - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/teraflare.lua b/scripts/actions/mobskills/teraflare.lua new file mode 100644 index 00000000000..fd213678dc2 --- /dev/null +++ b/scripts/actions/mobskills/teraflare.lua @@ -0,0 +1,34 @@ +----------------------------------- +-- Teraflare +-- Family: Bahamut +-- Description: Deals massive Fire damage to enemies. +-- Notes: Used by Bahamut when at 10% of its HP, and can use anytime afterwards at will. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: Mob mechanics where appropriate. + return 1 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local params = {} + + params.baseDamage = mob:getMainLvl() + params.fTP = { 20, 20, 20 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1.5 + -- TODO: Capture AoE type. + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/thermal_pulse.lua b/scripts/actions/mobskills/thermal_pulse.lua index 50cf0146d06..82f11e5be83 100644 --- a/scripts/actions/mobskills/thermal_pulse.lua +++ b/scripts/actions/mobskills/thermal_pulse.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Thermal Pulse --- Family: Wamouracampa --- Description: Deals Fire damage to enemies within area of effect. Additional effect: Blindness --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadow --- Range: 12.5 --- Notes: Open form only. +-- Thermal Pulse +-- Family: Wamouracampa +-- Description: Deals Fire damage to enemies within area of effect. Additional Effect: Blindness +-- Notes: Open form only. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -19,15 +16,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4.5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.5, 4.5, 4.5 } + params.element = xi.element.FIRE - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - local duration = xi.mobskills.calculateDuration(skill:getTP(), 30, 90) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 100, 0, duration) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + local duration = xi.mobskills.calculateDuration(skill:getTP(), 30, 90) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 100, 0, duration) + end return damage end diff --git a/scripts/actions/mobskills/thunder_break.lua b/scripts/actions/mobskills/thunder_break.lua index b9692a86a92..6a33fba7cce 100644 --- a/scripts/actions/mobskills/thunder_break.lua +++ b/scripts/actions/mobskills/thunder_break.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Thunder Break --- Channels the power of Thunder toward targets in an area of effect. Additional effect: Stun +-- Family: Golems +-- Description: Deals Thunder damage to targets in range. Additional Effect: Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTP scaling + params.element = xi.element.THUNDER - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, math.random(10, 20)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, math.random(10, 20)) + end return damage end diff --git a/scripts/actions/mobskills/thunder_break_2129.lua b/scripts/actions/mobskills/thunder_break_2129.lua index b128284946c..3fcab178d4f 100644 --- a/scripts/actions/mobskills/thunder_break_2129.lua +++ b/scripts/actions/mobskills/thunder_break_2129.lua @@ -1,8 +1,8 @@ ----------------------------------- --- Thunder Break (Hrungnir) --- Description: Channels the power of Thunder toward targets in an area of effect. Additional effect: Stun --- Type: Magical (Thunder) --- Note: Shows as a regular attack +-- Thunder Break +-- Family: Golems (Hrungnir) +-- Description: Channels the power of Thunder toward targets in an area of effect. Additional Effect: Stun +-- Note: Shows as a regular attack, used by Hrungnir. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,14 +12,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 3.2) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTP Scaling + params.element = xi.element.THUNDER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) - skill:setMsg(xi.msg.basic.HIT_DMG) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + -- TODO: Capture stun duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + + skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Move to mobFinalAdjustments in future. + end return damage end diff --git a/scripts/actions/mobskills/thunder_ii.lua b/scripts/actions/mobskills/thunder_ii.lua index 587a2e5f40d..c534b59afb3 100644 --- a/scripts/actions/mobskills/thunder_ii.lua +++ b/scripts/actions/mobskills/thunder_ii.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Thunder II --- Deals thunder elemental damage. Damage varies with TP. +-- Family: Avatar (Ramuh) +-- Description: Deals Thunder elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + end return damage end diff --git a/scripts/actions/mobskills/thunder_iv.lua b/scripts/actions/mobskills/thunder_iv.lua index df29dd678ad..bbae1941515 100644 --- a/scripts/actions/mobskills/thunder_iv.lua +++ b/scripts/actions/mobskills/thunder_iv.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Thunder IV --- Deals thunder elemental damage. +-- Family: Avatar (Ramuh) +-- Description: Deals Thunder elemental damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + end return damage end diff --git a/scripts/actions/mobskills/thunder_meeble_warble.lua b/scripts/actions/mobskills/thunder_meeble_warble.lua index adcc0d58223..e93960e4f43 100644 --- a/scripts/actions/mobskills/thunder_meeble_warble.lua +++ b/scripts/actions/mobskills/thunder_meeble_warble.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Thunder Meeble Warble --- AOE Lightning Elemental damage, inflicts Stun and Shock (50 HP/tick). +-- Family: Meebles +-- Description: AOE Lightning Elemental damage, inflicts Stun and Shock (50 HP/tick). ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,14 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 18.00, 18.00, 18.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SHOCK, 50, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 30, 0, 15) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + -- TODO: Capture effect power/duration + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SHOCK, 50, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 30, 0, 15) + end return damage end diff --git a/scripts/actions/mobskills/thunderbolt_behemoth.lua b/scripts/actions/mobskills/thunderbolt_behemoth.lua index 221e6537f5d..8930de77ffa 100644 --- a/scripts/actions/mobskills/thunderbolt_behemoth.lua +++ b/scripts/actions/mobskills/thunderbolt_behemoth.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Thunderbolt --- Description: Deals Lightning damage in an area of effect. Additional effect: Stun --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows +-- Thunderbolt +-- Family: Behemoths +-- Description: Deals Thunder damage in an area of effect. Additional Effect: Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,12 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local duration = math.random(8, 14) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, 0.6, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, duration) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 0.6, 0.6, 0.6 } + params.element = xi.element.THUNDER + -- TODO: Capture shadowBehavior + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, math.random(8, 14)) + end return damage end diff --git a/scripts/actions/mobskills/thunderspark.lua b/scripts/actions/mobskills/thunderspark.lua index 444d6221745..943a65d67dd 100644 --- a/scripts/actions/mobskills/thunderspark.lua +++ b/scripts/actions/mobskills/thunderspark.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Thunderspark --- Ramuh deals lightning damage and paralyzes enemies within area of effect. +-- Family: Avatar (Ramuh) +-- Description: Ramuh deals Thunder damage to enemies within area of effect. Additional Effect: Paralysis ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 30, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 30, 0, 60) -- TODO: Capture power/durations + end return damage end diff --git a/scripts/actions/mobskills/thunderstorm.lua b/scripts/actions/mobskills/thunderstorm.lua index 85efd33fe0c..b52f2eed99f 100644 --- a/scripts/actions/mobskills/thunderstorm.lua +++ b/scripts/actions/mobskills/thunderstorm.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Thunderstorm --- Ramuh deals lightning damage to target. +-- Family: Avatar (Ramuh) +-- Description: Ramuh deals Thunder damage to target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + -- TODO: Capture AoE type + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + end return damage end diff --git a/scripts/actions/mobskills/thunderstrike.lua b/scripts/actions/mobskills/thunderstrike.lua index 80a4202c7ab..b9777c1511d 100644 --- a/scripts/actions/mobskills/thunderstrike.lua +++ b/scripts/actions/mobskills/thunderstrike.lua @@ -1,32 +1,30 @@ ----------------------------------- --- Thunderstrike --- --- Description: Deals Lightning damage in an area of effect. Additional effect: Stun --- Type: Magical --- Ignores Shadows --- Range: 13' radial +-- Thunderstrike +-- Family: Khimaira +-- Description: Deals Thunder damage in an area of effect. Additional Effect: Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if - mob:getFamily() == 316 and - mob:getModelId() ~= 1805 - then - return 1 - end - return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9.00, 9.00, 9.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 3, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) -- TODO: Capture duration + end return damage end diff --git a/scripts/actions/mobskills/thundris_shriek.lua b/scripts/actions/mobskills/thundris_shriek.lua index 5da22fdc46d..a7833e21392 100644 --- a/scripts/actions/mobskills/thundris_shriek.lua +++ b/scripts/actions/mobskills/thundris_shriek.lua @@ -1,37 +1,32 @@ ----------------------------------- -- Thundris Shriek --- --- Description: Deals heavy lightning damage to targets in area of effect. Additional effect: Terror --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: Unknown +-- Family: Dvergr +-- Description: Deals heavy Thunder damage to targets in area of effect. Additional Effect: Terror -- Notes: Players will begin to be intimidated by the dvergr after this attack. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - local mobFamily = mob:getFamily() - local mobModel = mob:getModelId() - - if - (mobFamily == 91 and mobModel ~= 1839) or - (mobFamily == 316 and mobModel ~= 1840) - then - return 1 - end - return 0 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.00, 5.00, 5.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + -- TODO: Mob gains Humanoid Killer effect after using this skill. - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.TERROR, 1, 0, 15) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.TERROR, 1, 0, 15) -- TODO: Capture duration + end return damage end diff --git a/scripts/actions/mobskills/tidal_slash.lua b/scripts/actions/mobskills/tidal_slash.lua index 0dd1dc31013..b203a9b17b4 100644 --- a/scripts/actions/mobskills/tidal_slash.lua +++ b/scripts/actions/mobskills/tidal_slash.lua @@ -9,7 +9,10 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getAnimationSub() ~= 1 and mob:getMainJob() == xi.job.SAM then + if + mob:getAnimationSub() ~= 1 and + mob:getMainJob() == xi.job.SAM + then return 0 else return 1 @@ -17,12 +20,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 3.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 3, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.NUMSHADOWS_3) + params.baseDamage = mob:getWeaponDmg() + 2 + params.fTP = { 9.9, 9.9, 9.9 } + params.element = xi.element.WATER + -- TODO: This is a physical skill, will fix in mobPhysicalMove() PR - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end return damage end diff --git a/scripts/actions/mobskills/tidal_wave.lua b/scripts/actions/mobskills/tidal_wave.lua index 965886c7329..0d7a2ed83bc 100644 --- a/scripts/actions/mobskills/tidal_wave.lua +++ b/scripts/actions/mobskills/tidal_wave.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Tidal Wave --- Deals water elemental damage to enemies within area of effect. +-- Family: Avatar (Leviathan) +-- Description: Deals Water elemental damage to enemies within area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 3, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.WATER + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end return damage end diff --git a/scripts/actions/mobskills/torrential_torment.lua b/scripts/actions/mobskills/torrential_torment.lua index 5cb071a5d43..c7982efe9f9 100644 --- a/scripts/actions/mobskills/torrential_torment.lua +++ b/scripts/actions/mobskills/torrential_torment.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Torrential Torment --- Description: Subjects nearby targets to water torture. Additional effect: Strips all equipment. --- Type: Magical (Water) +-- Torrential Torment +-- Family: Yovra +-- Description: Deals Water damage target and surrounding allies. Additional Effect: Removes all gear. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,10 +11,17 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.WATER + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) for i = xi.slot.MAIN, xi.slot.BACK do target:unequipItem(i) diff --git a/scripts/actions/mobskills/touchdown.lua b/scripts/actions/mobskills/touchdown.lua index 4d2a2971b38..b06c0978da6 100644 --- a/scripts/actions/mobskills/touchdown.lua +++ b/scripts/actions/mobskills/touchdown.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Touchdown --- Description: Deals magical damage to enemies in an area of effect upon landing. --- Further Notes: +-- Touchdown +-- Family: Wyrms +-- Description: Deals magical damage to enemies in an area of effect upon landing. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.NONE, 1.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } + params.element = xi.element.NONE + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + end return damage end @@ -22,7 +30,9 @@ end mobskillObject.onMobSkillFinalize = function(mob, skill) mob:delStatusEffect(xi.effect.ALL_MISS) mob:setMobSkillAttack(0) - mob:setAnimationSub(2) + skill:setFinalAnimationSub(2) + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/touchdown_bahamut.lua b/scripts/actions/mobskills/touchdown_bahamut.lua index b2d9f8c0aa1..81874299b6c 100644 --- a/scripts/actions/mobskills/touchdown_bahamut.lua +++ b/scripts/actions/mobskills/touchdown_bahamut.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Touchdown --- Description: Deals magical damage to enemies in an area of effect. --- Further Notes: Bahamut can use this as a regular move at will. +-- Touchdown +-- Description: Deals magical damage to enemies in an area of effect. +-- Further Notes: Bahamut can use this as a regular move at will. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.NONE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } + params.element = xi.element.NONE + -- TODO: Jimmayus spreadsheet says this is physical. Handle in mobPhysicalMove() PR - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + end return damage end diff --git a/scripts/actions/mobskills/toxic_spit.lua b/scripts/actions/mobskills/toxic_spit.lua index c9cc51cf555..0867b5163d5 100644 --- a/scripts/actions/mobskills/toxic_spit.lua +++ b/scripts/actions/mobskills/toxic_spit.lua @@ -1,10 +1,8 @@ ----------------------------------- --- Toxic Spit --- --- Description: Spews a toxic glob at a single target. Additional effect: Poison --- Type: Magical Water --- Utsusemi/Blink absorb: Ignores shadows --- Notes: Additional effect can be removed with Poisona. +-- Toxic Spit +-- Family: Eft +-- Description: Inflicts poison on targets hit. +-- Notes: Single/AoE hit varies between individuals. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,16 +12,14 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.5) - local power = math.floor(mob:getMainLvl() / 5 + 3) + local power = math.floor(mob:getMainLvl() / 5 + 3) -- TODO: Capture power at different levels to verify. + local duration = 180 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + -- TODO: Jug pet: Duration scales with TP. - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, power, 3, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, power, 3, duration) - return damage + return xi.effect.POISON end return mobskillObject diff --git a/scripts/actions/mobskills/tp_drainkiss.lua b/scripts/actions/mobskills/tp_drainkiss.lua index 5806c3882c2..804435e8c61 100644 --- a/scripts/actions/mobskills/tp_drainkiss.lua +++ b/scripts/actions/mobskills/tp_drainkiss.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Drainkiss --- Deals dark damage to a single target. Additional effect: TP Drain --- Type: Magical --- Utsusemi/Blink absorb: 1 shadow --- Range: Melee +-- TP Drainkiss +-- Family: Leech +-- Description: Steals a targets TP. TP stolen varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,12 +11,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.6) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = target:getTP() + params.fTP = { 0.500, 0.666, 0.833 } + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.TP, damage)) + -- From captures, this TP Drains don't seem to be affected by these. + params.skipTMDA = true + params.skipResist = true + params.skipDayWeather = true + params.skipMagicBonusDiff = true + -- TODO: This skill should penetrate/deal no damage to stoneskin. + -- Need to pass a param into mobFinalAdjustments in the future. + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.TP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/transfusion.lua b/scripts/actions/mobskills/transfusion.lua index 67c1ab97da9..80cbf71ba27 100644 --- a/scripts/actions/mobskills/transfusion.lua +++ b/scripts/actions/mobskills/transfusion.lua @@ -13,12 +13,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.DARK - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage, xi.attackType.MAGICAL, xi.damageType.DARK)) + -- From captures, this HP Drains don't seem to be affected by these. + params.skipResist = true + params.skipMagicBonusDiff = true + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/tremors.lua b/scripts/actions/mobskills/tremors.lua index 8fe2c239baf..2ac046f9bd0 100644 --- a/scripts/actions/mobskills/tremors.lua +++ b/scripts/actions/mobskills/tremors.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Tremors --- Deals Earth damage with a seismic disturbance. Additional effect: DEX Down --- Area of Effect is centered around caster. --- Utsusemi/Blink absorb: Wipes shadows --- Duration: Three minutes ? +-- Family: Worms +-- Description: Deals Earth damage with a seismic disturbance. Additional Effect: DEX Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } + params.element = xi.element.EARTH - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEX_DOWN, 10, 3, 120) + -- TODO: Dynamis - Nightmare Worm fTPs + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEX_DOWN, 10, 9, 180) + end return damage end diff --git a/scripts/actions/mobskills/trinary_absorption.lua b/scripts/actions/mobskills/trinary_absorption.lua index 2d085153b12..56d6236a2b3 100644 --- a/scripts/actions/mobskills/trinary_absorption.lua +++ b/scripts/actions/mobskills/trinary_absorption.lua @@ -1,16 +1,14 @@ ----------------------------------- -- Trinary Absorption --- Deals elemental damage to the target. Additional effect: Drain. --- Type: Magical --- Utsusemi/Blink absorb: 1 Shadows --- Range: Melee +-- Family: Thinker +-- Description: Drains HP from a target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) if - mob:isMobType(xi.mobType.NOTORIOUS) or + mob:isMobType(xi.mobType.NOTORIOUS) or -- TODO: Set skill lists target:hasStatusEffect(xi.effect.BATTLEFIELD) then return 0 @@ -20,12 +18,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() * 5, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, dmg)) + params.baseDamage = mob:getMainLvl() + params.fTP = { 5.0, 5.0, 5.0 } + params.element = xi.element.DARK - return dmg + -- From captures, this HP Drains don't seem to be affected by these. + params.skipResist = true + params.skipMagicBonusDiff = true + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/turbofan.lua b/scripts/actions/mobskills/turbofan.lua index d631dc024ba..a1a8d86c003 100644 --- a/scripts/actions/mobskills/turbofan.lua +++ b/scripts/actions/mobskills/turbofan.lua @@ -2,6 +2,7 @@ -- Turbofan -- Family: Ultima -- Description: Deals Wind damage to targets in front of mob. Additional Effect: Silence +-- additional effect : Silence. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -27,9 +28,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, 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.SILENCE, 1, 3, 30) - if target:hasStatusEffect(xi.effect.ELEMENTALRES_DOWN) then target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) end diff --git a/scripts/actions/mobskills/turbulence.lua b/scripts/actions/mobskills/turbulence.lua index 31d76ccf355..04eac4290f2 100644 --- a/scripts/actions/mobskills/turbulence.lua +++ b/scripts/actions/mobskills/turbulence.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Turbulence --- Deals wind based damage in an area of effect +-- Family: Bats (Trio) +-- Description: Deals Wind damage to targets in range. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,10 +11,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTP scalings. + params.element = xi.element.WIND + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/typhoon_wing.lua b/scripts/actions/mobskills/typhoon_wing.lua index c331ffebe47..7b836251e1c 100644 --- a/scripts/actions/mobskills/typhoon_wing.lua +++ b/scripts/actions/mobskills/typhoon_wing.lua @@ -1,12 +1,9 @@ ----------------------------------- --- Hurricane Wing --- --- Description: Deals hurricane-force wind damage to enemies within a very wide area of effect. Additional effect: Blind --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: 30' radial. --- Notes: Used only by Dragua, Fafnir, Nidhogg, Cynoprosopi, Wyrm, and Odzmanouk. The blinding effect does not last long --- but is very harsh. The attack is wide enough to generally hit an entire alliance. +-- Typhoon Wing +-- Family: Wyrms +-- Description: Deals Wind? damage to enemies within a very wide area of effect. Additional Effect: Blind +-- Notes: Used by Ouryu and Dragua. The blinding effect does not last long +-- but is very harsh. The attack is wide enough to generally hit an entire alliance. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,7 +11,7 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) if target:isBehind(mob, 48) then return 1 - elseif mob:getAnimationSub() ~= 0 then + elseif mob:getAnimationSub() ~= 0 then -- Do not use while flying return 1 end @@ -22,13 +19,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.50, 5.00, 5.50 } + params.element = xi.element.WIND -- TODO: Capture element - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 60, 0, 30) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 60, 0, 30) -- TODO: Capture power/duration + end return damage end diff --git a/scripts/actions/mobskills/tyrannic_blare.lua b/scripts/actions/mobskills/tyrannic_blare.lua index 40a78e231f4..b10431bb13f 100644 --- a/scripts/actions/mobskills/tyrannic_blare.lua +++ b/scripts/actions/mobskills/tyrannic_blare.lua @@ -1,11 +1,7 @@ ----------------------------------- --- Tyrannic Blare --- --- Description: Emits an overwhelming scream that damages nearby targets. --- Type: Magical? --- Utsusemi/Blink absorb: Ignores shadows --- Range: Less than or equal to 10.0 --- Notes: Only used by Gulool Ja Ja. +-- Tyrannic Blare +-- Family: Mamool Ja (Gulool Ja Ja) +-- Description: Emits an overwhelming scream that damages nearby targets. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.8) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2.80, 2.80, 2.80 } -- TODO: Capture fTPs + params.element = xi.element.FIRE -- TODO: Capture element + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/unblest_jambiya.lua b/scripts/actions/mobskills/unblest_jambiya.lua index 23873382699..7f20b6597dc 100644 --- a/scripts/actions/mobskills/unblest_jambiya.lua +++ b/scripts/actions/mobskills/unblest_jambiya.lua @@ -19,12 +19,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1.3, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.DARK + -- TODO: This is a physical skill. Will fix in mobPhysicalMove() PR - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + end return damage end diff --git a/scripts/actions/mobskills/undead_mold.lua b/scripts/actions/mobskills/undead_mold.lua index 52765ac6669..140382bbf1e 100644 --- a/scripts/actions/mobskills/undead_mold.lua +++ b/scripts/actions/mobskills/undead_mold.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Undead Mold --- Description: Releases undead spores that diseases targets in front. --- Type: Enfeebling --- Utsusemi/Blink absorb: Ignores shadows --- Range: Front arc +-- Undead Mold +-- Family: Doomed +-- Description: Releases undead spores that damages targets in front. Additional Effect: Disease ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,11 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DISEASE, 1, 0, 660) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } -- TODO: Capture fTP scalings + params.element = xi.element.DARK + -- TODO: Confirm whether this is physical or magical move. Jimmayus sheet says Unaspected Physical. JP Wiki says Dark. + -- TODO: Confirm AoE type. Jimmayus sheet says single target. JP Wiki says forward cone. + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DISEASE, 1, 0, 660) + end return damage end diff --git a/scripts/actions/mobskills/vacuous_osculation.lua b/scripts/actions/mobskills/vacuous_osculation.lua index 2df31ac8723..6b9b4c6bf25 100644 --- a/scripts/actions/mobskills/vacuous_osculation.lua +++ b/scripts/actions/mobskills/vacuous_osculation.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Vacuous Osculation --- --- Description: Deals damage to a single target. Additional effect: Poison, Plague --- Type: Physical --- Utsusemi/Blink absorb: 1 shadow +-- Vacuous Osculation +-- Family: Weeper +-- Description: Deals unaspected magic damage to a single target. Additional Effect: Poison, Plague ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,14 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = 3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.NONE, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.NONE + -- TODO: Capture shadow behavior - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.PLAGUE, 3, 3, 30) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.POISON, 8, 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.PLAGUE, 5, 3, 30) + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.POISON, 8, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/vampiric_root.lua b/scripts/actions/mobskills/vampiric_root.lua index 8654a21f25e..69ab953c2d0 100644 --- a/scripts/actions/mobskills/vampiric_root.lua +++ b/scripts/actions/mobskills/vampiric_root.lua @@ -10,23 +10,30 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - -- will only use vampiric root if there are buffs to steal + -- Will only use vampiric root if there are buffs to steal return target:countEffectWithFlag(xi.effectFlag.DISPELABLE) > 0 and 0 or 1 end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.DARK + -- TODO: This is a physical skill. Will fix in mobPhysicalMove() PR - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - -- Absorb ALL positive status effects - -- Note: Some sources claim this includes food and reraise which has been proven to be false - local result = mob:stealStatusEffect(target) - while result ~= 0 do - result = mob:stealStatusEffect(target) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + + -- Absorb ALL positive status effects + -- Note: Some sources claim this includes food and reraise which has been proven to be false + local result = mob:stealStatusEffect(target) + while result ~= 0 do + result = mob:stealStatusEffect(target) + end end return damage diff --git a/scripts/actions/mobskills/venom.lua b/scripts/actions/mobskills/venom.lua index b3f7178efe2..863f6a18aad 100644 --- a/scripts/actions/mobskills/venom.lua +++ b/scripts/actions/mobskills/venom.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Venom --- Description: Deals damage in a fan shaped area. Additional effect: poison --- Type: Magical: Water --- Utsusemi/Blink absorb: Ignores shadows --- Range: 10' cone +-- Venom +-- Family: Fly +-- Description: Deals Water damage in a fan shaped area. Additional Effect: Poison ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,13 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local power = math.floor(mob:getMainLvl() / 6 + 1) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, 1.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, power, 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + -- TODO: Jugpet differences + + -- TODO: Dynamis - Nightmare Fly + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 1, 3, 60) -- TODO: Capture duration + end return damage end diff --git a/scripts/actions/mobskills/venom_spray.lua b/scripts/actions/mobskills/venom_spray.lua index 37e2c6f31f0..40b2f7d1728 100644 --- a/scripts/actions/mobskills/venom_spray.lua +++ b/scripts/actions/mobskills/venom_spray.lua @@ -13,6 +13,7 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local power = 15 local duration = 120 + if mob:isNM() then power = 25 end diff --git a/scripts/actions/mobskills/vitriolic_barrage.lua b/scripts/actions/mobskills/vitriolic_barrage.lua index 3024e4ed47c..0b69b1a5b75 100644 --- a/scripts/actions/mobskills/vitriolic_barrage.lua +++ b/scripts/actions/mobskills/vitriolic_barrage.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Vitrolic Barrage --- --- Description: Bombards nearby targets with acid, dealing fixed Water damage. Additional effect: Poison --- Type: ??? (Water) --- Utsusemi/Blink absorb: Wipes shadows --- Range: AoE 10' --- Notes: Poison is 20/tic +-- Vitriolic Barrage +-- Family: Yovra +-- Description: Deals unaspected? magic damage to targets in range. Additional Effect: Poison +-- Notes: Affected by MDEF stat. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,18 +12,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local needles = 1000 / skill:getTotalTargets() + local params = {} - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 18, 3, 180) - local info = - { - damage = needles - } - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = 1000 / skill:getTotalTargets() + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.NONE -- TODO: Verify whether unaspected or elemental - target:takeDamage(dmg, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + -- https://youtu.be/DgQrZQJEqDY?t=409 + -- Looks like it bypasses MDT(Shell). + params.skipTMDA = true - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 18, 3, 180) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/vitriolic_shower.lua b/scripts/actions/mobskills/vitriolic_shower.lua index 0a2badd449a..797c06b11fd 100644 --- a/scripts/actions/mobskills/vitriolic_shower.lua +++ b/scripts/actions/mobskills/vitriolic_shower.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Vitriolic Shower --- Description: Expels a caustic stream at targets in a fan-shaped area of effect. Additional effect: Burn --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadow --- Range: Cone +-- Vitriolic Shower +-- Family: Wamouracampa +-- Description: Deals Fire damage to targets surrounding mob. Additional Effect: Burn +-- Notes: Used by Brass Borer and possibly other NMs. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,14 +12,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.7) - damage = damage + math.random(0, 7.5 + math.max(mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) * 4 / 3, 0)) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7.50, 7.50, 7.50 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1.33 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, math.random(15, 35), 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 30, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/vitriolic_spray.lua b/scripts/actions/mobskills/vitriolic_spray.lua index 922dc8ca79d..80622c639b3 100644 --- a/scripts/actions/mobskills/vitriolic_spray.lua +++ b/scripts/actions/mobskills/vitriolic_spray.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Vitriolic Spray --- Family: Wamouracampa --- Description: Expels a caustic stream at targets in a fan-shaped area of effect. Additional effect: Burn --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadow --- Range: Cone --- Notes: Burn is 10-30/tic +-- Vitriolic Spray +-- Family: Wamouracampa +-- Description: Conal AoE Fire damage in front of mob. Additional Effect: Burn +-- Note: Used while in Open form. (Handled via skill list in family mixin) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,14 +12,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.7) - damage = damage + math.random(0, 4.5 + math.max(mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT), 0)) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.50, 4.50, 4.50 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, math.random(10, 30), 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + + -- TODO: Is power random? Based off level? Different individuals? Need captures + -- Sources say Burn is 10-30/tic but don't go into depth. + -- Personal captures showed 10/tick from Wamoura Prince(Mount Zhayolm). https://youtu.be/2H350wLAlFo?t=228 + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 10, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/voiceless_storm.lua b/scripts/actions/mobskills/voiceless_storm.lua index b0d0b0e8b4f..1a6954614ef 100644 --- a/scripts/actions/mobskills/voiceless_storm.lua +++ b/scripts/actions/mobskills/voiceless_storm.lua @@ -1,6 +1,7 @@ ----------------------------------- --- Voiceless Storm --- Description: AOE Damage, Silence, strips Utsusemi (xi.mobskills.shadowBehavior.WIPE_SHADOWS) +-- Voiceless Storm +-- Family: Phuabo +-- Description: Deals Wind damage to targets in range of mob. Additional Effect: Silence ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,13 +11,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- TODO: 1 + dINT to damage - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + local params = {} - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.SILENCE, 1, 0, 120) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.WIND + params.dStatMultiplier = 1 + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.SILENCE, 1, 0, 120) + end - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) return damage end diff --git a/scripts/actions/mobskills/vulcan_shot.lua b/scripts/actions/mobskills/vulcan_shot.lua index 3e4f1418ead..7f721369aee 100644 --- a/scripts/actions/mobskills/vulcan_shot.lua +++ b/scripts/actions/mobskills/vulcan_shot.lua @@ -1,11 +1,7 @@ ----------------------------------- -- Vulcan Shot --- +-- Family: Fomor -- Description: Fires an explosive bullet at targets in an area of effect. --- Type: Magical --- Can be dispelled: N/A --- Utsusemi/Blink absorb: Wipes shadows? --- Range: 14' radial ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -17,12 +13,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 8, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 32.00, 32.00, 32.00 } -- TODO: Capture fTPs (Original code was Weapon Damage * 4 * 8) + params.element = xi.element.FIRE + -- TODO: Verify if magical or physical skill + -- TODO: Capture shadowBehavior + -- TODO: Capture AoE Type or Single hit. - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/warped_wail.lua b/scripts/actions/mobskills/warped_wail.lua index 1dec20ec626..4705fb87361 100644 --- a/scripts/actions/mobskills/warped_wail.lua +++ b/scripts/actions/mobskills/warped_wail.lua @@ -1,8 +1,8 @@ ----------------------------------- -- Warped Wail --- Mob Ability: 2430 --- Emits a distorted scream, dealing damage and reducing max HP and MP. --- Notes: Wipes Shadows, used only by Zirnitra and Pteranodon +-- Family: Amphipteres +-- Description: Deals Wind damage to targets in range. Additional Effect: Max HP Down, Max MP Down +-- Notes: Used by Zirnitra and Pteranodon ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,14 +12,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.WIND -- TODO: Capture element. - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.MAX_HP_DOWN, 50, 0, 60) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.MAX_MP_DOWN, 50, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + -- TODO Capture power/duration of HP/MP Down. + -- From battle footage, it looks to be around 10-15%. (Hard to tell exact since player was gear swapping). + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.MAX_HP_DOWN, 50, 0, 300) + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.MAX_MP_DOWN, 50, 0, 300) + end return damage end diff --git a/scripts/actions/mobskills/water_bomb.lua b/scripts/actions/mobskills/water_bomb.lua index 2c49323537e..2fafbe41ef9 100644 --- a/scripts/actions/mobskills/water_bomb.lua +++ b/scripts/actions/mobskills/water_bomb.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Water Bomb --- Description: Deals water damage to enemies within area of effect. Additional effect: Silence. --- Type: Magical (Water) +-- Water Bomb +-- Family: Poroggo +-- Description: Deals Water damage to enemies within area of effect. Additional Effect: Silence. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getWeaponDmg() * 2.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.WATER + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) + end return damage end diff --git a/scripts/actions/mobskills/water_ii.lua b/scripts/actions/mobskills/water_ii.lua index c00fd740e9f..1b27bbd512b 100644 --- a/scripts/actions/mobskills/water_ii.lua +++ b/scripts/actions/mobskills/water_ii.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Water II --- Deals water elemental damage. Damage varies with TP. +-- Family: Avatar (Leviathan) +-- Description: Deals Water elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 3 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.WATER + -- TODO: Do non astral flows use a dStatMultiplier? - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end return damage end diff --git a/scripts/actions/mobskills/water_iv.lua b/scripts/actions/mobskills/water_iv.lua index 5a7e8b72850..b1070559080 100644 --- a/scripts/actions/mobskills/water_iv.lua +++ b/scripts/actions/mobskills/water_iv.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Water IV --- Deals water elemental damage. Damage varies with TP. +-- Family: Avatar (Leviathan) +-- Description: Deals Water elemental damage. Damage varies with TP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 8 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs + params.element = xi.element.WATER + -- TODO: Do non astral flows use a dStatMultiplier? - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + end return damage end diff --git a/scripts/actions/mobskills/water_meeble_warble.lua b/scripts/actions/mobskills/water_meeble_warble.lua index ec3f58ecef1..8b1d48c29af 100644 --- a/scripts/actions/mobskills/water_meeble_warble.lua +++ b/scripts/actions/mobskills/water_meeble_warble.lua @@ -10,14 +10,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 9 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WATER, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 18, 18, 18 } -- TODO: Capture fTPs + params.element = xi.element.WATER - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DROWN, 50, 3, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 50, 3, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DROWN, 50, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 50, 3, 60) + end return damage end diff --git a/scripts/actions/mobskills/whirlwind.lua b/scripts/actions/mobskills/whirlwind.lua index 8d4a7fe44b4..29288570bbd 100644 --- a/scripts/actions/mobskills/whirlwind.lua +++ b/scripts/actions/mobskills/whirlwind.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Whirlwind --- Description: Deals wind damage to enemies within range. Additional effect: VIT Down. --- Type: Magical (Wind) +-- Whirlwind +-- Family: Sea Monks +-- Description: Deals Wind damage to enemies within range. Additional Effect: VIT Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local ftp = math.random(2, 3) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.50, 3.00 } + params.element = xi.element.WIND - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.VIT_DOWN, 10, 3, 120) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.VIT_DOWN, 10, 9, 120) -- TODO: Capture duration + end return damage end diff --git a/scripts/actions/mobskills/wind_blade.lua b/scripts/actions/mobskills/wind_blade.lua index 27ba01e0923..024e40223c2 100644 --- a/scripts/actions/mobskills/wind_blade.lua +++ b/scripts/actions/mobskills/wind_blade.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Wind Blade --- Garuda deals wind damage. +-- Family: Avatar (Garuda) +-- Description: Deals Wind damage to targets. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,12 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs + params.element = xi.element.WIND + -- TODO: Does this have skillchain properties? + -- TODO: Capture shadowBehavior - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end return damage end diff --git a/scripts/actions/mobskills/wind_shear.lua b/scripts/actions/mobskills/wind_shear.lua index 0fca97e26f4..85a2031c200 100644 --- a/scripts/actions/mobskills/wind_shear.lua +++ b/scripts/actions/mobskills/wind_shear.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Wind Shear --- --- Description: Deals damage to enemies within an area of effect. Additional effect: Knockback --- Type: Physical --- Utsusemi/Blink absorb: 2-3 shadows --- Range: 10' radial --- Notes: The knockback is rather severe. Vulpangue uses an enhanced version that inflicts Weight. +-- Wind Shear +-- Family: Puks +-- Description: Deals Wind damage to enemies within an area of effect. Additional Effect: Knockback +-- Notes: The knockback is rather severe. Vulpangue uses an enhanced version that inflicts Weight. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,13 +12,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = math.random(2, 3) - local accmod = 1 - local ftp = .8 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) - return dmg + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.25, 1.50, 1.75 } -- TODO: Capture fTP scaling. + params.element = xi.element.WIND + -- TODO: Capture shadowBehavior. + -- TODO: Jimmayus spreadsheet states if this is fully resisted, it misses(Knockback nullified as well?). + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/wind_shear_znm.lua b/scripts/actions/mobskills/wind_shear_znm.lua index cf39799a3f7..734e25aecbf 100644 --- a/scripts/actions/mobskills/wind_shear_znm.lua +++ b/scripts/actions/mobskills/wind_shear_znm.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Wind Shear --- --- Description: Deals damage to enemies within an area of effect. Additional effect: Knockback --- Type: Physical --- Utsusemi/Blink absorb: 2-3 shadows --- Range: 10' radial --- Notes: The knockback is rather severe. Vulpangue uses an enhanced version that inflicts Weight. +-- Wind Shear +-- Family: Puks +-- Description: Deals Wind damage to enemies within an area of effect. Additional Effect: Knockback +-- Notes: The knockback is rather severe. Vulpangue uses an enhanced version that inflicts Weight. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,16 +12,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = math.random(2, 3) - local accmod = 1 - local ftp = 1 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) + local params = {} - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.WEIGHT, 50, 0, 120) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.25, 1.50, 1.75 } -- TODO: Capture fTP scaling. + params.element = xi.element.WIND + -- TODO: Capture shadowBehavior. + -- TODO: Jimmayus spreadsheet states if this is fully resisted, it misses(Knockback nullified as well?). - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 50, 0, 120) + end + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/wing_cutter.lua b/scripts/actions/mobskills/wing_cutter.lua index c070555f943..8654c6a5f83 100644 --- a/scripts/actions/mobskills/wing_cutter.lua +++ b/scripts/actions/mobskills/wing_cutter.lua @@ -1,10 +1,7 @@ ----------------------------------- -- Wing Cutter --- Deals Wind damage to targets in a fan-shaped area of effect. --- TODO: Capture Wing Cutter in Nightmare Dynamis, was unable to verify a difference. fTP looked similar. --- Type: Magical (Wind) --- Utsusemi/Blink absorb: Ignores shadows --- Range: Melee +-- Family: Birds +-- Description: Deals Wind damage to targets in a fan-shaped area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,10 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 3, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.WIND + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + end - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) return damage end diff --git a/scripts/actions/mobskills/wings_of_gehenna.lua b/scripts/actions/mobskills/wings_of_gehenna.lua index 5af37573f7a..9d9063f6d85 100644 --- a/scripts/actions/mobskills/wings_of_gehenna.lua +++ b/scripts/actions/mobskills/wings_of_gehenna.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Wings of Gehenna --- Description: Deals damage to players in an area of effect. Additional effect: Knockback & Stun --- Type: Magical --- Utsusemi/Blink absorb: Wipes shadows --- Range: Unknown radial +-- Wings of Gehenna +-- Family: Vampyr +-- Description: Deals Wind damage to targets in an area of effect. Additional Effect: Knockback, Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,14 +11,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 4 + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.00, 4.00, 4.00 } -- TODO: Capture fTPs + params.element = xi.element.WIND + -- TODO: Capture Knockback range - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - -- KNOCKBACK - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + end return damage end diff --git a/scripts/actions/mobskills/wrath_of_zeus.lua b/scripts/actions/mobskills/wrath_of_zeus.lua index d807501614c..d6f1811d43d 100644 --- a/scripts/actions/mobskills/wrath_of_zeus.lua +++ b/scripts/actions/mobskills/wrath_of_zeus.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Wrath of Zeus --- --- Description: Area of Effect lightning damage around Ixion (400-1000) and Silence. --- Type: Magical +-- Wrath of Zeus +-- Family: Monoceros (Dark Ixion) +-- Description: Area of Effect Thunder damage around Ixion (400-1000). Additional Effect: Silence ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,22 +11,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - -- parameters for AE - local typeEffect = xi.effect.SILENCE - local power = 1 - local duration = xi.mobskills.calculateDuration(30, 60) + local params = {} - -- perform magical attack - local damage = mob:getWeaponDmg() - local dmgmod = 4.5 -- unbuffed hit for ~700 + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.50, 4.50, 4.50 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, dmgmod, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - if damage > 0 then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, typeEffect, power, 0, duration) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, xi.mobskills.calculateDuration(30, 60)) end return damage diff --git a/scripts/actions/mobskills/zarbzan.lua b/scripts/actions/mobskills/zarbzan.lua index e33e71b2c6e..9fccf714e1e 100644 --- a/scripts/actions/mobskills/zarbzan.lua +++ b/scripts/actions/mobskills/zarbzan.lua @@ -1,17 +1,14 @@ ----------------------------------- --- Zarbzan --- --- Description: Launches a firebomb from its cannon. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown --- Notes: Used by RNG trolls only as their ranged special attack. +-- Zarbzan +-- Family: Trolls +-- Description: Deals Fire damage to target and their surrounding allies. +-- Notes: Only used by Troll RNGs. This is an actual skill, not the regular ranged attack. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getMainJob() == xi.job.RNG then + if mob:getMainJob() == xi.job.RNG then -- TODO: Set proper skill lists for Trolls with ranged attacks. return 0 end @@ -19,12 +16,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end diff --git a/scripts/actions/mobskills/zarraqa.lua b/scripts/actions/mobskills/zarraqa.lua index 6c58db67586..fe48db7121f 100644 --- a/scripts/actions/mobskills/zarraqa.lua +++ b/scripts/actions/mobskills/zarraqa.lua @@ -1,11 +1,8 @@ ----------------------------------- --- Zarraqa --- --- Description: Performs a fiery ranged attack with cannon. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown --- Notes: Used by RNG trolls only. +-- Zarraqa +-- Family: Trolls +-- Description: Deals Fire damage to a single target. +-- Notes: Used by Troll RNGs as their standard ranged attack. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,12 +12,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 -- TODO: Does this follow Level + 2 or mob's ranged weapon damage? + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.FIRE + params.dStatMultiplier = 1 - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + + if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + end return damage end From 8a82772fc7cffd96479dd596066ee4718ba69f29 Mon Sep 17 00:00:00 2001 From: Umeboshi Date: Thu, 5 Feb 2026 12:59:56 -0800 Subject: [PATCH 5/6] [lua] Define more monskill ENUMs --- scripts/enum/mob_skill.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/enum/mob_skill.lua b/scripts/enum/mob_skill.lua index 88a551da32e..29260e5a507 100644 --- a/scripts/enum/mob_skill.lua +++ b/scripts/enum/mob_skill.lua @@ -612,6 +612,12 @@ xi.mobSkill = DUST_CLOUD_2 = 1568, WHIRL_CLAWS_2 = 1569, + MIASMIC_BREATH_1 = 1604, -- Cirrate Christelle - Mobskill Version + MIASMIC_BREATH_2 = 1605, -- Cirrate Christelle - Skill Attack version + + PUTRID_BREATH_1 = 1608, -- Cirrate Christelle - Mobskill Version + PUTRID_BREATH_2 = 1609, -- Cirrate Christelle - Skill Attack version + FROGKICK_2 = 1621, SHEEP_BLEAT_2 = 1633, @@ -649,6 +655,7 @@ xi.mobSkill = VENOM_SPRAY_2 = 1843, PIT_AMBUSH_2 = 1844, MANDIBULAR_BITE_2 = 1845, + FIRESPIT_BLUE_MAMOOLJA = 1923, -- Ignores shadows RANGED_ATTACK_15 = 1949, From d221090151027cfd5ccb9edb7b08aa5bb62fac1c Mon Sep 17 00:00:00 2001 From: Umeboshi Date: Mon, 9 Feb 2026 17:12:20 -0800 Subject: [PATCH 6/6] [lua] Magical Mobskill Rework Refactor --- .../actions/abilities/pets/aerial_blast.lua | 28 +- scripts/actions/abilities/pets/aero_ii.lua | 27 +- scripts/actions/abilities/pets/aero_iv.lua | 27 +- .../actions/abilities/pets/blizzard_ii.lua | 25 +- .../actions/abilities/pets/blizzard_iv.lua | 25 +- .../actions/abilities/pets/burning_strike.lua | 60 ++- .../actions/abilities/pets/clarsach_call.lua | 27 +- .../actions/abilities/pets/diamond_dust.lua | 28 +- .../actions/abilities/pets/earthen_fury.lua | 28 +- scripts/actions/abilities/pets/fire_ii.lua | 29 +- scripts/actions/abilities/pets/fire_iv.lua | 29 +- .../actions/abilities/pets/flaming_crush.lua | 63 ++- scripts/actions/abilities/pets/geocrush.lua | 33 +- scripts/actions/abilities/pets/grand_fall.lua | 33 +- .../abilities/pets/heavenly_strike.lua | 30 +- .../actions/abilities/pets/howling_moon.lua | 28 +- scripts/actions/abilities/pets/inferno.lua | 28 +- .../actions/abilities/pets/judgment_bolt.lua | 28 +- .../actions/abilities/pets/level_X_holy.lua | 33 +- .../actions/abilities/pets/meteor_strike.lua | 33 +- .../actions/abilities/pets/nether_blast.lua | 23 +- .../actions/abilities/pets/searing_light.lua | 28 +- scripts/actions/abilities/pets/somnolence.lua | 28 +- .../actions/abilities/pets/sonic_buffet.lua | 33 +- scripts/actions/abilities/pets/stone_ii.lua | 27 +- scripts/actions/abilities/pets/stone_iv.lua | 27 +- scripts/actions/abilities/pets/thunder_ii.lua | 27 +- scripts/actions/abilities/pets/thunder_iv.lua | 25 +- .../actions/abilities/pets/thunderspark.lua | 28 +- .../actions/abilities/pets/thunderstorm.lua | 31 +- scripts/actions/abilities/pets/tidal_wave.lua | 27 +- scripts/actions/abilities/pets/tornado_ii.lua | 28 +- scripts/actions/abilities/pets/water_ii.lua | 27 +- scripts/actions/abilities/pets/water_iv.lua | 27 +- scripts/actions/abilities/pets/wind_blade.lua | 30 +- .../actions/abilities/pets/zantetsuken.lua | 46 +- .../actions/mobskills/Preternatural_Gleam.lua | 34 +- scripts/actions/mobskills/abyss_blast.lua | 20 +- scripts/actions/mobskills/abyssal_drain.lua | 21 +- scripts/actions/mobskills/acheron_flame.lua | 14 +- scripts/actions/mobskills/acid_mist.lua | 20 +- scripts/actions/mobskills/acid_spray.lua | 20 +- scripts/actions/mobskills/acrid_stream.lua | 20 +- scripts/actions/mobskills/aeolian_edge.lua | 20 +- scripts/actions/mobskills/aeolian_void.lua | 20 +- scripts/actions/mobskills/aerial_blast.lua | 14 +- scripts/actions/mobskills/aero_ii.lua | 21 +- scripts/actions/mobskills/aero_iv.lua | 21 +- .../actions/mobskills/aero_meeble_warble.lua | 20 +- scripts/actions/mobskills/antimatter.lua | 20 +- scripts/actions/mobskills/aqua_ball.lua | 20 +- scripts/actions/mobskills/aqua_blast.lua | 20 +- scripts/actions/mobskills/arctic_impact.lua | 20 +- scripts/actions/mobskills/armor_buster.lua | 22 +- .../actions/mobskills/artificial_gravity.lua | 20 +- .../mobskills/artificial_gravity_1.lua | 20 +- .../mobskills/artificial_gravity_2.lua | 20 +- .../mobskills/artificial_gravity_3.lua | 20 +- .../actions/mobskills/auroral_uppercut.lua | 21 +- scripts/actions/mobskills/auroral_wind.lua | 20 +- scripts/actions/mobskills/bai_wing.lua | 20 +- scripts/actions/mobskills/barofield.lua | 20 +- .../actions/mobskills/binary_absorption.lua | 21 +- .../actions/mobskills/binding_microtube.lua | 21 +- scripts/actions/mobskills/black_cloud.lua | 26 +- scripts/actions/mobskills/blastbomb.lua | 20 +- scripts/actions/mobskills/blazing_bound.lua | 20 +- scripts/actions/mobskills/blitzstrahl.lua | 20 +- scripts/actions/mobskills/blizzard_ii.lua | 21 +- scripts/actions/mobskills/blizzard_iv.lua | 21 +- .../mobskills/blizzard_meeble_warble.lua | 20 +- scripts/actions/mobskills/blood_drain.lua | 30 +- scripts/actions/mobskills/blood_saber.lua | 23 +- scripts/actions/mobskills/bloody_beak.lua | 26 +- scripts/actions/mobskills/bomb_toss.lua | 20 +- .../actions/mobskills/bomb_toss_suicide.lua | 23 +- scripts/actions/mobskills/burning_blade.lua | 20 +- scripts/actions/mobskills/calamitous_wind.lua | 24 +- scripts/actions/mobskills/chaos_blade.lua | 20 +- scripts/actions/mobskills/charged_whisker.lua | 20 +- .../actions/mobskills/circle_of_flames.lua | 15 +- scripts/actions/mobskills/citadel_buster.lua | 20 +- scripts/actions/mobskills/clarsach_call.lua | 21 +- scripts/actions/mobskills/core_meltdown.lua | 22 +- scripts/actions/mobskills/corrosive_ooze.lua | 20 +- .../actions/mobskills/cosmic_elucidation.lua | 21 +- scripts/actions/mobskills/counterspore.lua | 25 +- scripts/actions/mobskills/crispy_candle.lua | 14 +- .../actions/mobskills/crispy_candle_self.lua | 15 +- scripts/actions/mobskills/cryo_jet.lua | 2 + scripts/actions/mobskills/crystal_rain.lua | 20 +- .../actions/mobskills/crystal_weapon_fire.lua | 20 +- .../mobskills/crystal_weapon_stone.lua | 20 +- .../mobskills/crystal_weapon_water.lua | 20 +- .../actions/mobskills/crystal_weapon_wind.lua | 20 +- scripts/actions/mobskills/cursed_sphere.lua | 20 +- scripts/actions/mobskills/cyclone_wing.lua | 22 +- .../actions/mobskills/cyclonic_torrent.lua | 20 +- .../actions/mobskills/cyclonic_turmoil.lua | 20 +- scripts/actions/mobskills/dark_mist.lua | 20 +- scripts/actions/mobskills/dark_nova.lua | 20 +- scripts/actions/mobskills/dark_orb.lua | 20 +- scripts/actions/mobskills/dark_sphere.lua | 19 +- scripts/actions/mobskills/dark_wave.lua | 36 +- scripts/actions/mobskills/death_ray.lua | 20 +- .../actions/mobskills/decayed_filament.lua | 21 +- scripts/actions/mobskills/decussate.lua | 20 +- scripts/actions/mobskills/diamond_dust.lua | 14 +- scripts/actions/mobskills/dice_damage.lua | 20 +- scripts/actions/mobskills/diffusion_ray.lua | 13 +- scripts/actions/mobskills/digest.lua | 24 +- scripts/actions/mobskills/discharge.lua | 14 +- scripts/actions/mobskills/discoid.lua | 21 +- scripts/actions/mobskills/divine_judgment.lua | 20 +- scripts/actions/mobskills/divine_spear.lua | 20 +- scripts/actions/mobskills/doctors_orders.lua | 20 +- scripts/actions/mobskills/double_ray.lua | 20 +- scripts/actions/mobskills/drain_whip.lua | 35 +- scripts/actions/mobskills/drainkiss.lua | 21 +- scripts/actions/mobskills/dreadstorm.lua | 20 +- scripts/actions/mobskills/dust_cloud.lua | 20 +- scripts/actions/mobskills/dustvoid.lua | 17 +- scripts/actions/mobskills/earth_pounder.lua | 20 +- scripts/actions/mobskills/earthbreaker.lua | 18 +- scripts/actions/mobskills/earthen_fury.lua | 14 +- scripts/actions/mobskills/electrocharge.lua | 22 +- .../mobskills/electromagnetic_field.lua | 20 +- .../actions/mobskills/empirical_research.lua | 20 +- scripts/actions/mobskills/empty_salvation.lua | 21 +- scripts/actions/mobskills/erosion_dust.lua | 23 +- scripts/actions/mobskills/erratic_flutter.lua | 20 +- scripts/actions/mobskills/exuviation.lua | 7 + scripts/actions/mobskills/eyes_on_me.lua | 23 +- scripts/actions/mobskills/final_exam.lua | 20 +- scripts/actions/mobskills/fire_ii.lua | 21 +- scripts/actions/mobskills/fire_iv.lua | 21 +- .../actions/mobskills/fire_meeble_warble.lua | 20 +- scripts/actions/mobskills/fireball.lua | 7 +- scripts/actions/mobskills/firebomb.lua | 20 +- scripts/actions/mobskills/firespit.lua | 21 +- scripts/actions/mobskills/flame_arrow.lua | 21 +- scripts/actions/mobskills/flame_blast.lua | 21 +- scripts/actions/mobskills/flame_blast_alt.lua | 23 +- scripts/actions/mobskills/flame_thrower.lua | 2 +- scripts/actions/mobskills/floodlight.lua | 25 +- .../actions/mobskills/flying_hip_press.lua | 22 +- scripts/actions/mobskills/fountain.lua | 20 +- scripts/actions/mobskills/freeze_rush.lua | 2 +- scripts/actions/mobskills/freezebite.lua | 25 +- scripts/actions/mobskills/frostbite.lua | 24 +- scripts/actions/mobskills/frozen_mist.lua | 20 +- scripts/actions/mobskills/fulmination.lua | 20 +- scripts/actions/mobskills/gastric_bomb.lua | 17 +- scripts/actions/mobskills/gates_of_hades.lua | 16 +- scripts/actions/mobskills/geocrush.lua | 23 +- scripts/actions/mobskills/gigaflare.lua | 15 +- scripts/actions/mobskills/grand_fall.lua | 22 +- scripts/actions/mobskills/grave_reel.lua | 22 +- scripts/actions/mobskills/great_sandstorm.lua | 20 +- scripts/actions/mobskills/great_whirlwind.lua | 20 +- scripts/actions/mobskills/gregale_wing.lua | 20 +- .../actions/mobskills/gregale_wing_air.lua | 22 +- .../actions/mobskills/guided_missile_ii.lua | 21 +- scripts/actions/mobskills/heavenly_strike.lua | 23 +- scripts/actions/mobskills/heavy_whisk.lua | 20 +- scripts/actions/mobskills/hellfire_arrow.lua | 20 +- scripts/actions/mobskills/hellstorm.lua | 21 +- scripts/actions/mobskills/hex_palm.lua | 21 +- .../mobskills/high-tension_discharger.lua | 4 +- scripts/actions/mobskills/homing_missile.lua | 25 +- scripts/actions/mobskills/howling_moon.lua | 14 +- scripts/actions/mobskills/hungry_crunch.lua | 29 +- scripts/actions/mobskills/hurricane_wing.lua | 30 +- .../mobskills/hurricane_wing_flying.lua | 23 +- scripts/actions/mobskills/hydro_ball.lua | 19 +- scripts/actions/mobskills/hydro_cannon.lua | 30 +- scripts/actions/mobskills/hydro_wave.lua | 21 +- .../mobskills/hypothermal_combustion.lua | 25 +- .../mobskills/hypothermal_combustion_tzar.lua | 27 +- scripts/actions/mobskills/ice_break.lua | 14 +- scripts/actions/mobskills/ice_break_2128.lua | 18 +- scripts/actions/mobskills/ice_guillotine.lua | 23 +- scripts/actions/mobskills/ice_roar.lua | 27 +- scripts/actions/mobskills/ill_wind.lua | 20 +- scripts/actions/mobskills/impact_stream.lua | 21 +- scripts/actions/mobskills/implosion.lua | 22 +- scripts/actions/mobskills/impulsion.lua | 25 +- scripts/actions/mobskills/inertia_stream.lua | 20 +- scripts/actions/mobskills/inferno.lua | 15 +- scripts/actions/mobskills/inferno_blast.lua | 20 +- .../actions/mobskills/inferno_blast_alt.lua | 23 +- scripts/actions/mobskills/ink_jet.lua | 20 +- scripts/actions/mobskills/ink_jet_fee.lua | 35 +- scripts/actions/mobskills/ion_shower.lua | 14 +- scripts/actions/mobskills/iridal_pierce.lua | 21 +- scripts/actions/mobskills/judgment_bolt.lua | 14 +- scripts/actions/mobskills/kartstrahl.lua | 20 +- .../actions/mobskills/knuckle_sandwich.lua | 21 +- scripts/actions/mobskills/lamentation.lua | 22 +- scripts/actions/mobskills/lava_spit.lua | 21 +- scripts/actions/mobskills/leafstorm.lua | 28 +- .../actions/mobskills/leeching_current.lua | 33 +- scripts/actions/mobskills/lesson_in_pain.lua | 20 +- scripts/actions/mobskills/lightning_roar.lua | 24 +- scripts/actions/mobskills/lightning_spear.lua | 23 +- scripts/actions/mobskills/lux_arrow.lua | 22 +- scripts/actions/mobskills/maelstrom.lua | 20 +- scripts/actions/mobskills/magic_hammer.lua | 21 +- scripts/actions/mobskills/magic_mortar.lua | 21 +- scripts/actions/mobskills/malediction.lua | 23 +- .../actions/mobskills/malevolent_blessing.lua | 24 +- scripts/actions/mobskills/mana_storm.lua | 23 +- scripts/actions/mobskills/marrow_drain.lua | 45 +- scripts/actions/mobskills/mega_holy.lua | 22 +- scripts/actions/mobskills/megaflare.lua | 15 +- scripts/actions/mobskills/meltdown.lua | 23 +- scripts/actions/mobskills/memory_of_dark.lua | 20 +- scripts/actions/mobskills/memory_of_earth.lua | 20 +- scripts/actions/mobskills/memory_of_fire.lua | 20 +- scripts/actions/mobskills/memory_of_ice.lua | 20 +- scripts/actions/mobskills/memory_of_light.lua | 20 +- .../actions/mobskills/memory_of_lightning.lua | 20 +- scripts/actions/mobskills/memory_of_water.lua | 20 +- scripts/actions/mobskills/memory_of_wind.lua | 20 +- scripts/actions/mobskills/mephitic_spore.lua | 23 +- scripts/actions/mobskills/meteor.lua | 20 +- scripts/actions/mobskills/meteor_strike.lua | 20 +- scripts/actions/mobskills/meteorite.lua | 20 +- scripts/actions/mobskills/miasma.lua | 20 +- scripts/actions/mobskills/miasmic_breath.lua | 41 +- scripts/actions/mobskills/mighty_snort.lua | 25 +- scripts/actions/mobskills/mijin_gakure.lua | 14 +- scripts/actions/mobskills/mind_blast.lua | 14 +- scripts/actions/mobskills/mine_blast.lua | 28 +- scripts/actions/mobskills/molting_burst.lua | 27 +- scripts/actions/mobskills/mp_absorption.lua | 23 +- scripts/actions/mobskills/mp_drainkiss.lua | 26 +- .../actions/mobskills/mysterious_light.lua | 20 +- scripts/actions/mobskills/negative_whirl.lua | 33 +- scripts/actions/mobskills/nerve_gas.lua | 21 +- scripts/actions/mobskills/nether_blast.lua | 16 +- scripts/actions/mobskills/nether_tempest.lua | 19 +- .../mobskills/nocturnal_combustion.lua | 24 +- scripts/actions/mobskills/nosferatus_kiss.lua | 36 +- scripts/actions/mobskills/nox_blast.lua | 20 +- .../actions/mobskills/nutrient_absorption.lua | 25 +- scripts/actions/mobskills/ochre_blast.lua | 21 +- scripts/actions/mobskills/ochre_blast_alt.lua | 22 +- scripts/actions/mobskills/osmosis.lua | 21 +- .../mobskills/paralyzing_microtube.lua | 22 +- .../actions/mobskills/penumbral_impact.lua | 32 +- .../actions/mobskills/pestilent_penance.lua | 21 +- scripts/actions/mobskills/pile_pitch.lua | 37 +- scripts/actions/mobskills/pleiades_ray.lua | 21 +- scripts/actions/mobskills/proboscis.lua | 26 +- scripts/actions/mobskills/promyvion_brume.lua | 25 +- scripts/actions/mobskills/psychomancy.lua | 25 +- scripts/actions/mobskills/purulent_ooze.lua | 24 +- scripts/actions/mobskills/putrid_breath.lua | 29 +- scripts/actions/mobskills/quake_blast.lua | 15 +- scripts/actions/mobskills/raiden_thrust.lua | 20 +- scripts/actions/mobskills/rail_cannon.lua | 14 +- scripts/actions/mobskills/rail_cannon_1.lua | 14 +- scripts/actions/mobskills/rail_cannon_2.lua | 14 +- scripts/actions/mobskills/rail_cannon_3.lua | 14 +- scripts/actions/mobskills/random_kiss.lua | 33 +- .../actions/mobskills/reactor_overheat.lua | 20 +- .../actions/mobskills/reactor_overload.lua | 20 +- scripts/actions/mobskills/red_lotus_blade.lua | 23 +- scripts/actions/mobskills/regurgitation.lua | 20 +- scripts/actions/mobskills/rending_deluge.lua | 20 +- scripts/actions/mobskills/revelation.lua | 20 +- scripts/actions/mobskills/rime_spray.lua | 20 +- scripts/actions/mobskills/roller_chain.lua | 20 +- scripts/actions/mobskills/ruinous_omen.lua | 23 +- scripts/actions/mobskills/sandspin.lua | 20 +- .../actions/mobskills/scintillant_lance.lua | 20 +- .../actions/mobskills/scouring_bubbles.lua | 22 +- scripts/actions/mobskills/searing_light.lua | 14 +- .../mobskills/self-destruct_1death.lua | 40 -- scripts/actions/mobskills/self-destruct_2.lua | 39 -- .../mobskills/self-destruct_2death.lua | 42 -- scripts/actions/mobskills/self-destruct_3.lua | 38 -- .../mobskills/self-destruct_3death.lua | 46 -- .../actions/mobskills/self-destruct_bomb.lua | 20 +- .../mobskills/self-destruct_bomb_321.lua | 23 +- .../mobskills/self-destruct_bomb_big.lua | 25 +- .../self-destruct_cluster_1_death.lua | 24 +- .../mobskills/self-destruct_cluster_2.lua | 33 +- .../self-destruct_cluster_2_death.lua | 24 +- .../mobskills/self-destruct_cluster_3.lua | 35 +- .../self-destruct_cluster_3_death.lua | 24 +- .../mobskills/self-destruct_cluster_razon.lua | 23 +- scripts/actions/mobskills/seraph_blade.lua | 22 +- scripts/actions/mobskills/shadow_burst.lua | 21 +- .../actions/mobskills/shantotto_ii_melee.lua | 24 +- scripts/actions/mobskills/shining_blade.lua | 22 +- scripts/actions/mobskills/shock_wave.lua | 35 -- .../actions/mobskills/shock_wave_behemoth.lua | 37 ++ .../actions/mobskills/silencing_microtube.lua | 22 +- .../actions/mobskills/siphon_discharge.lua | 20 +- scripts/actions/mobskills/slaverous_gale.lua | 21 +- scripts/actions/mobskills/sleet_blast.lua | 20 +- scripts/actions/mobskills/sleet_blast_alt.lua | 23 +- .../actions/mobskills/smoke_discharger.lua | 2 +- .../actions/mobskills/smouldering_swarm.lua | 20 +- scripts/actions/mobskills/snort.lua | 20 +- scripts/actions/mobskills/snort_2127.lua | 24 +- scripts/actions/mobskills/snow_cloud.lua | 20 +- scripts/actions/mobskills/snowball.lua | 20 +- scripts/actions/mobskills/somnolence.lua | 21 +- scripts/actions/mobskills/sonic_buffet.lua | 21 +- scripts/actions/mobskills/soul_drain.lua | 23 +- .../actions/mobskills/soulshattering_roar.lua | 20 +- .../actions/mobskills/spirit_absorption.lua | 30 -- .../mobskills/spirit_absorption_gorger.lua | 33 ++ .../mobskills/spirit_absorption_thinker.lua | 27 +- scripts/actions/mobskills/spirits_within.lua | 2 + scripts/actions/mobskills/static_filament.lua | 22 +- scripts/actions/mobskills/stellar_burst.lua | 22 +- scripts/actions/mobskills/stone_ii.lua | 20 +- scripts/actions/mobskills/stone_iv.lua | 20 +- .../actions/mobskills/stone_meeble_warble.lua | 20 +- scripts/actions/mobskills/storm_wing.lua | 21 +- scripts/actions/mobskills/stormwind.lua | 23 +- scripts/actions/mobskills/stun_cannon.lua | 21 +- scripts/actions/mobskills/stupor_spores.lua | 16 +- scripts/actions/mobskills/subsonics.lua | 1 + .../actions/mobskills/sweeping_somnolence.lua | 21 +- scripts/actions/mobskills/tebbad_wing.lua | 20 +- scripts/actions/mobskills/tebbad_wing_air.lua | 20 +- scripts/actions/mobskills/tempest_wing.lua | 23 +- .../mobskills/tempestuous_upheaval.lua | 20 +- scripts/actions/mobskills/teraflare.lua | 14 +- scripts/actions/mobskills/thermal_pulse.lua | 21 +- scripts/actions/mobskills/thunder_break.lua | 20 +- .../actions/mobskills/thunder_break_2129.lua | 23 +- scripts/actions/mobskills/thunder_ii.lua | 21 +- scripts/actions/mobskills/thunder_iv.lua | 21 +- .../mobskills/thunder_meeble_warble.lua | 21 +- .../mobskills/thunderbolt_behemoth.lua | 21 +- scripts/actions/mobskills/thunderspark.lua | 21 +- scripts/actions/mobskills/thunderstorm.lua | 23 +- scripts/actions/mobskills/thunderstrike.lua | 20 +- scripts/actions/mobskills/thundris_shriek.lua | 22 +- scripts/actions/mobskills/tidal_slash.lua | 30 +- scripts/actions/mobskills/tidal_wave.lua | 14 +- .../actions/mobskills/torrential_torment.lua | 21 +- scripts/actions/mobskills/touchdown.lua | 22 +- .../actions/mobskills/touchdown_bahamut.lua | 21 +- scripts/actions/mobskills/tp_drainkiss.lua | 37 +- scripts/actions/mobskills/transfusion.lua | 29 +- scripts/actions/mobskills/tremors.lua | 22 +- .../actions/mobskills/trinary_absorption.lua | 25 +- scripts/actions/mobskills/trinary_tap.lua | 2 +- scripts/actions/mobskills/turbofan.lua | 1 - scripts/actions/mobskills/turbulence.lua | 20 +- scripts/actions/mobskills/typhoon_wing.lua | 20 +- scripts/actions/mobskills/tyrannic_blare.lua | 21 +- scripts/actions/mobskills/unblest_jambiya.lua | 20 +- scripts/actions/mobskills/undead_mold.lua | 20 +- .../actions/mobskills/vacuous_osculation.lua | 25 +- scripts/actions/mobskills/vampiric_root.lua | 21 +- scripts/actions/mobskills/venom.lua | 20 +- .../actions/mobskills/vitriolic_barrage.lua | 25 +- .../actions/mobskills/vitriolic_shower.lua | 14 +- scripts/actions/mobskills/vitriolic_spray.lua | 16 +- scripts/actions/mobskills/voiceless_storm.lua | 14 +- scripts/actions/mobskills/vulcan_shot.lua | 29 +- .../actions/mobskills/vulcanian_impact.lua | 23 +- scripts/actions/mobskills/warped_wail.lua | 22 +- scripts/actions/mobskills/water_bomb.lua | 14 +- scripts/actions/mobskills/water_ii.lua | 21 +- scripts/actions/mobskills/water_iv.lua | 21 +- .../actions/mobskills/water_meeble_warble.lua | 21 +- scripts/actions/mobskills/whirlwind.lua | 20 +- scripts/actions/mobskills/wind_blade.lua | 22 +- scripts/actions/mobskills/wind_shear.lua | 24 +- scripts/actions/mobskills/wind_shear_znm.lua | 26 +- scripts/actions/mobskills/wing_cutter.lua | 20 +- .../actions/mobskills/wings_of_gehenna.lua | 22 +- scripts/actions/mobskills/wrath_of_zeus.lua | 20 +- scripts/actions/mobskills/zarbzan.lua | 16 +- scripts/actions/mobskills/zarraqa.lua | 14 +- scripts/enum/mob_skill.lua | 2 +- .../action_additional_effect_damage.lua | 2 +- scripts/globals/job_utils/rune_fencer.lua | 2 +- scripts/globals/mobskills.lua | 492 +++++++++--------- scripts/globals/spells/damage_spell.lua | 21 +- .../Abyssea-Konschtat/mobs/Hadal_Satiator.lua | 2 +- .../zones/Promyvion-Vahzl/mobs/Propagator.lua | 2 +- scripts/zones/Spire_of_Dem/mobs/Ingester.lua | 2 +- .../zones/Spire_of_Dem/mobs/Progenerator.lua | 2 +- .../zones/Spire_of_Vahzl/mobs/Procreator.lua | 2 +- sql/mob_skills.sql | 6 +- 395 files changed, 5015 insertions(+), 4042 deletions(-) delete mode 100644 scripts/actions/mobskills/self-destruct_1death.lua delete mode 100644 scripts/actions/mobskills/self-destruct_2.lua delete mode 100644 scripts/actions/mobskills/self-destruct_2death.lua delete mode 100644 scripts/actions/mobskills/self-destruct_3.lua delete mode 100644 scripts/actions/mobskills/self-destruct_3death.lua delete mode 100644 scripts/actions/mobskills/shock_wave.lua create mode 100644 scripts/actions/mobskills/shock_wave_behemoth.lua delete mode 100644 scripts/actions/mobskills/spirit_absorption.lua create mode 100644 scripts/actions/mobskills/spirit_absorption_gorger.lua diff --git a/scripts/actions/abilities/pets/aerial_blast.lua b/scripts/actions/abilities/pets/aerial_blast.lua index 51a7440aef9..96ba19b256b 100644 --- a/scripts/actions/abilities/pets/aerial_blast.lua +++ b/scripts/actions/abilities/pets/aerial_blast.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Aerial Blast +-- Family: Garuda +-- Note: Garuda's Astral Flow ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,17 +13,29 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(48 + pet:getMainLvl() * 8 + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WIND, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WIND, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 9.0, 9.0, 9.0 } + params.int_wSC = 0.30 + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + -- TODO: Should not consume TP + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end summoner:setMP(0) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WIND) - target:updateEnmityFromDamage(pet, damage) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/aero_ii.lua b/scripts/actions/abilities/pets/aero_ii.lua index af580cf4da4..0ddf1c961fd 100644 --- a/scripts/actions/abilities/pets/aero_ii.lua +++ b/scripts/actions/abilities/pets/aero_ii.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Aero 2 +-- Aero II +-- Family: Garuda (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(45 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WIND, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WIND, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 1.500, 2.750, 3.125 } + params.int_wSC = 0.30 + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WIND) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/aero_iv.lua b/scripts/actions/abilities/pets/aero_iv.lua index 42e8634577c..584ea823c41 100644 --- a/scripts/actions/abilities/pets/aero_iv.lua +++ b/scripts/actions/abilities/pets/aero_iv.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Aero 4 +-- Aero IV +-- Family: Garuda (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(325 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WIND, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WIND, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 3.6250, 5.3125, 6.1250 } + params.int_wSC = 0.30 + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WIND) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/blizzard_ii.lua b/scripts/actions/abilities/pets/blizzard_ii.lua index 08e9cd360ee..c51a013ddf0 100644 --- a/scripts/actions/abilities/pets/blizzard_ii.lua +++ b/scripts/actions/abilities/pets/blizzard_ii.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Blizzard II +-- Family: Shiva (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(45 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.ICE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.ICE, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 1.500, 2.750, 3.125 } + params.int_wSC = 0.30 + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.ICE) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/blizzard_iv.lua b/scripts/actions/abilities/pets/blizzard_iv.lua index 4aa7474fd12..2ea1f2e0f31 100644 --- a/scripts/actions/abilities/pets/blizzard_iv.lua +++ b/scripts/actions/abilities/pets/blizzard_iv.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Blizzard IV +-- Family: Shiva (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(325 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.ICE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.ICE, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 3.6250, 5.3125, 6.1250 } + params.int_wSC = 0.30 + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.ICE) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/burning_strike.lua b/scripts/actions/abilities/pets/burning_strike.lua index a67fe2f1f90..f6ad76568f2 100644 --- a/scripts/actions/abilities/pets/burning_strike.lua +++ b/scripts/actions/abilities/pets/burning_strike.lua @@ -12,18 +12,60 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local baseDamage = xi.summon.avatarPhysicalMove(pet, target, petskill, 1, 1, 6, 0, xi.mobskills.magicalTpBonus.NO_EFFECT, 1, 2, 3) - local damage = math.floor(baseDamage.damage + pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) + -- TODO: Hybrid formula incomplete. Will need to be reworked once physical skills are converted to use param system. - -- Add on bonuses (staff/day/weather/jas/mab/etc all go in this function) - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.FIRE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, 1) + local physicalDamage = xi.summon.avatarPhysicalMove(pet, target, petskill, 1, 1, 2.75, 0, xi.mobskills.magicalTpBonus.NO_EFFECT, 1, 2, 3) + local magicDamage = 0 - target:takeDamage(damage, pet, xi.attackType.PHYSICAL, xi.damageType.BLUNT) - target:updateEnmityFromDamage(pet, damage) + local damage = xi.summon.avatarFinalAdjustments(physicalDamage, pet, petskill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, 1) - return damage + -- TODO: We should probably have a unified function for hybrid mechanics that can be used for mobskills and weaponskills. + + if physicalDamage.hitslanded > 0 then + local dINT = utils.clamp(pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT), -65, 999) + + magicDamage = math.floor(damage / 2 + dINT) + + -- Multipliers. + local nullifyDamage = xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false) + local absorbDamage = xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, true) + local sdt = 1 + local resist = 1 + local magicDamageAdjustment = 1 + local dayAndWeather = 1 + local magicBonusDiff = 1 + + -- Acc Bonus + local petAccBonus = xi.mobskills.calculatePetMagicAccuracyBonus(pet, target, xi.element.FIRE) + + -- Note: Elemental absorb mechanics such as Liement are calculated BEFORE resist/damage adjustments (such as shell/magic bursts). + if absorbDamage > 0 then + sdt = xi.combat.damage.magicalElementSDT(target, xi.element.FIRE) + resist = xi.combat.magicHitRate.calculateResistRate(pet, target, 0, 0, 0, xi.element.FIRE, xi.mod.INT, 0, petAccBonus) + magicDamageAdjustment = xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false) + end + + dayAndWeather = xi.spells.damage.calculateDayAndWeather(pet, xi.element.FIRE, false) + magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(pet, target, 0, 0, xi.element.FIRE, 0) + + -- Calculate final damage. + magicDamage = math.floor(magicDamage * sdt) + magicDamage = math.floor(magicDamage * resist) + magicDamage = math.floor(magicDamage * dayAndWeather) + magicDamage = math.floor(magicDamage * magicBonusDiff) + magicDamage = math.floor(magicDamage * magicDamageAdjustment) + magicDamage = math.floor(magicDamage * absorbDamage) + magicDamage = math.floor(magicDamage * nullifyDamage) + end + + -- Damage check filters shadow chip damage for now. + if damage > 0 then + target:takeDamage(damage, pet, xi.attackType.PHYSICAL, xi.damageType.BLUNT) + target:takeDamage(magicDamage, pet, xi.attackType.MAGICAL, xi.damageType.FIRE) + target:updateEnmityFromDamage(pet, damage + magicDamage) + end + + return damage + magicDamage end return abilityObject diff --git a/scripts/actions/abilities/pets/clarsach_call.lua b/scripts/actions/abilities/pets/clarsach_call.lua index 5b55dea8841..aee7ed4ee81 100644 --- a/scripts/actions/abilities/pets/clarsach_call.lua +++ b/scripts/actions/abilities/pets/clarsach_call.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Clarsach Call +-- Family: Siren (Player Pet) +-- Note: Siren's Astral Flow ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -12,15 +14,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(48 + pet:getMainLvl() * 8 + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WIND, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WIND, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } -- TODO: Need data on fTPs, using standard astral flow ftps for now. + params.int_wSC = 0.30 + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end summoner:setMP(0) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WIND) - target:updateEnmityFromDamage(pet, damage) pet:addStatusEffect(xi.effect.ATTACK_BOOST, 25, 0, 180) pet:addStatusEffect(xi.effect.DEFENSE_BOOST, 25, 0, 180) @@ -29,7 +42,7 @@ abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) pet:addStatusEffect(xi.effect.EVASION_BOOST, 50, 0, 180) pet:addStatusEffect(xi.effect.MAGIC_EVASION_BOOST, 50, 0, 180) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/diamond_dust.lua b/scripts/actions/abilities/pets/diamond_dust.lua index f00e7372c30..80941963898 100644 --- a/scripts/actions/abilities/pets/diamond_dust.lua +++ b/scripts/actions/abilities/pets/diamond_dust.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Diamond Dust +-- Family: Shiva (Player Pet) +-- Note: Shiva's Astral Flow ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,17 +13,29 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(48 + pet:getMainLvl() * 8 + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.ICE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.ICE, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 9.0, 9.0, 9.0 } + params.int_wSC = 0.30 + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + -- TODO: Should not consume TP + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end summoner:setMP(0) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.ICE) - target:updateEnmityFromDamage(pet, damage) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/earthen_fury.lua b/scripts/actions/abilities/pets/earthen_fury.lua index 136824d5e23..bfa8d257a40 100644 --- a/scripts/actions/abilities/pets/earthen_fury.lua +++ b/scripts/actions/abilities/pets/earthen_fury.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Earthen Fury +-- Family: Titan (Player Pet) +-- Note: Titan's Astral Flow ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,17 +13,29 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = 48 + pet:getMainLvl() * 8 + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5 + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.EARTH, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 9.0, 9.0, 9.0 } + params.int_wSC = 0.30 + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + -- TODO: Should not consume TP + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end summoner:setMP(0) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.EARTH) - target:updateEnmityFromDamage(pet, damage) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/fire_ii.lua b/scripts/actions/abilities/pets/fire_ii.lua index 2829456e99b..30d2f2db60f 100644 --- a/scripts/actions/abilities/pets/fire_ii.lua +++ b/scripts/actions/abilities/pets/fire_ii.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Fire 2 +-- Fire II +-- Family: Ifrit (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,28 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(45 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.FIRE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 1.500, 2.750, 3.125 } + params.int_wSC = 0.30 + 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.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.FIRE) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + print('skillID', petskill:getID()) + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/fire_iv.lua b/scripts/actions/abilities/pets/fire_iv.lua index 6275c24d050..08c47788737 100644 --- a/scripts/actions/abilities/pets/fire_iv.lua +++ b/scripts/actions/abilities/pets/fire_iv.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Aero 2 +-- Fire IV +-- Family: Ifrit (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,28 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(325 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.FIRE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 3.6250, 5.3125, 6.1250 } + params.int_wSC = 0.30 + 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.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.FIRE) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + petskill:setMsg(xi.msg.basic.PET_MAGIC_BURST) + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/flaming_crush.lua b/scripts/actions/abilities/pets/flaming_crush.lua index 26096f02f33..e6b18d00e25 100644 --- a/scripts/actions/abilities/pets/flaming_crush.lua +++ b/scripts/actions/abilities/pets/flaming_crush.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Flaming Crush --- Hybrid +-- Family: Ifrit (Player Pet) +-- Notes: Hybrid skill ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -12,18 +13,60 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local baseDamage = xi.summon.avatarPhysicalMove(pet, target, petskill, 2, 1, 10, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 1, 2, 3) - local damage = math.floor(baseDamage.damage + pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) + -- TODO: Hybrid formula incomplete. Will need to be reworked once physical skills are converted to use param system. - -- Add on bonuses (staff/day/weather/jas/mab/etc all go in this function) - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.FIRE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, 3) + local physicalDamage = xi.summon.avatarPhysicalMove(pet, target, petskill, 2, 1, 6, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 1, 1, 1) + local magicDamage = 0 - target:takeDamage(damage, pet, xi.attackType.PHYSICAL, xi.damageType.BLUNT) - target:updateEnmityFromDamage(pet, damage) + local damage = xi.summon.avatarFinalAdjustments(physicalDamage, pet, petskill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, 1) - return damage + -- TODO: We should probably have a unified function for hybrid mechanics that can be used for mobskills and weaponskills. + + if physicalDamage.hitslanded > 0 then + local dINT = utils.clamp(pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT), -65, 999) + + magicDamage = math.floor(damage / 2 + dINT) + + -- Multipliers. + local nullifyDamage = xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false) + local absorbDamage = xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, true) + local sdt = 1 + local resist = 1 + local magicDamageAdjustment = 1 + local dayAndWeather = 1 + local magicBonusDiff = 1 + + -- Acc Bonus + local petAccBonus = xi.mobskills.calculatePetMagicAccuracyBonus(pet, target, xi.element.FIRE) + + -- Note: Elemental absorb mechanics such as Liement are calculated BEFORE resist/damage adjustments (such as shell/magic bursts). + if absorbDamage > 0 then + sdt = xi.combat.damage.magicalElementSDT(target, xi.element.FIRE) + resist = xi.combat.magicHitRate.calculateResistRate(pet, target, 0, 0, 0, xi.element.FIRE, xi.mod.INT, 0, petAccBonus) + magicDamageAdjustment = xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false) + end + + dayAndWeather = xi.spells.damage.calculateDayAndWeather(pet, xi.element.FIRE, false) + magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(pet, target, 0, 0, xi.element.FIRE, 0) + + -- Calculate final damage. + magicDamage = math.floor(magicDamage * sdt) + magicDamage = math.floor(magicDamage * resist) + magicDamage = math.floor(magicDamage * dayAndWeather) + magicDamage = math.floor(magicDamage * magicBonusDiff) + magicDamage = math.floor(magicDamage * magicDamageAdjustment) + magicDamage = math.floor(magicDamage * absorbDamage) + magicDamage = math.floor(magicDamage * nullifyDamage) + end + + -- Damage check filters shadow chip damage for now. + if damage > 0 then + target:takeDamage(damage, pet, xi.attackType.PHYSICAL, xi.damageType.BLUNT) + target:takeDamage(magicDamage, pet, xi.attackType.MAGICAL, xi.damageType.FIRE) + target:updateEnmityFromDamage(pet, damage + magicDamage) + end + + return damage + magicDamage end return abilityObject diff --git a/scripts/actions/abilities/pets/geocrush.lua b/scripts/actions/abilities/pets/geocrush.lua index 414cf887ad4..578be972ee7 100644 --- a/scripts/actions/abilities/pets/geocrush.lua +++ b/scripts/actions/abilities/pets/geocrush.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Geocrush +-- Family: Titan (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,32 +12,36 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local tp = pet:getTP() - -- Merit TP bonus. local merits = 0 if summoner and summoner:isPC() then - merits = summoner:getMerit(xi.merit.GEOCRUSH) + merits = utils.clamp(summoner:getMerit(xi.merit.GEOCRUSH) - 400, 0, 3000) end - tp = utils.clamp(tp + merits - 400, 0, 3000) + local params = {} - --note: this formula is only accurate for level 75 - 76+ may have a different intercept and/or slope - local damage = math.floor(512 + 0.172 * tp + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 5.3570, 8.0273, 10.7031 } + params.fTPBonus = merits + params.int_wSC = 0.30 + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.EARTH, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, 1) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.EARTH) - target:updateEnmityFromDamage(pet, damage) + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) - if not target:hasStatusEffect(xi.effect.STUN) then - target:addStatusEffect(xi.effect.STUN, 3, 3, 3) + xi.mobskills.mobStatusEffectMove(pet, target, xi.effect.STUN, 1, 0, 4) end - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/grand_fall.lua b/scripts/actions/abilities/pets/grand_fall.lua index 70afc1974b7..fec2ea8d49b 100644 --- a/scripts/actions/abilities/pets/grand_fall.lua +++ b/scripts/actions/abilities/pets/grand_fall.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Geocrush +-- Grand Fall +-- Family: Leviathan (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,28 +12,34 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local tp = pet:getTP() - -- Merit TP bonus. local merits = 0 if summoner and summoner:isPC() then - merits = summoner:getMerit(xi.merit.GRANDFALL) + merits = utils.clamp(summoner:getMerit(xi.merit.GRANDFALL) - 400, 0, 3000) end - tp = utils.clamp(tp + merits - 400, 0, 3000) + local params = {} - --note: this formula is only accurate for level 75 - 76+ may have a different intercept and/or slope - local damage = math.floor(512 + 0.172 * tp + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 5.3570, 8.0273, 10.7031 } + params.fTPBonus = merits + params.int_wSC = 0.30 + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WATER, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WATER, 1) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WATER) - target:updateEnmityFromDamage(pet, damage) + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/heavenly_strike.lua b/scripts/actions/abilities/pets/heavenly_strike.lua index 034e492b063..dbcab6fce6b 100644 --- a/scripts/actions/abilities/pets/heavenly_strike.lua +++ b/scripts/actions/abilities/pets/heavenly_strike.lua @@ -11,28 +11,34 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local tp = pet:getTP() - -- Merit TP bonus. local merits = 0 if summoner and summoner:isPC() then - merits = summoner:getMerit(xi.merit.HEAVENLY_STRIKE) + merits = utils.clamp(summoner:getMerit(xi.merit.HEAVENLY_STRIKE) - 400, 0, 3000) end - tp = utils.clamp(tp + merits - 400, 0, 3000) + local params = {} - --note: this formula is only accurate for level 75 - 76+ may have a different intercept and/or slope - local damage = math.floor(512 + 0.172 * tp + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 5.3570, 8.0273, 10.7031 } + params.fTPBonus = merits + params.int_wSC = 0.30 + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.ICE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.ICE, 1) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.ICE) - target:updateEnmityFromDamage(pet, damage) + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/howling_moon.lua b/scripts/actions/abilities/pets/howling_moon.lua index 69112da2dac..90bfa5871ec 100644 --- a/scripts/actions/abilities/pets/howling_moon.lua +++ b/scripts/actions/abilities/pets/howling_moon.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Howling Moon +-- Family: Fenrir (Player Pet) +-- Note: Fenrir's Astral Flow ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,17 +13,29 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(48 + pet:getMainLvl() * 8 + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.DARK, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.DARK, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 9.0, 9.0, 9.0 } + params.int_wSC = 0.30 + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + -- TODO: Should not consume TP + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end summoner:setMP(0) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.DARK) - target:updateEnmityFromDamage(pet, damage) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/inferno.lua b/scripts/actions/abilities/pets/inferno.lua index b1896fff8b8..9298946b0a4 100644 --- a/scripts/actions/abilities/pets/inferno.lua +++ b/scripts/actions/abilities/pets/inferno.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Inferno +-- Family: Ifrit (Player Pet) +-- Note: Ifrit's Astral Flow ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,17 +13,29 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(48 + pet:getMainLvl() * 8 + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.FIRE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 9.0, 9.0, 9.0 } + params.int_wSC = 0.30 + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + -- TODO: Should not consume TP + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end summoner:setMP(0) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.FIRE) - target:updateEnmityFromDamage(pet, damage) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/judgment_bolt.lua b/scripts/actions/abilities/pets/judgment_bolt.lua index 4f15a52c8b1..78996e268d4 100644 --- a/scripts/actions/abilities/pets/judgment_bolt.lua +++ b/scripts/actions/abilities/pets/judgment_bolt.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Judgment Bolt +-- Family: Ramuh (Player Pet) +-- Note: Ramuh's Astral Flow ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,17 +13,29 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(48 + pet:getMainLvl() * 8 + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.THUNDER, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 9.0, 9.0, 9.0 } + params.int_wSC = 0.30 + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + -- TODO: Should not consume TP + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end summoner:setMP(0) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.THUNDER) - target:updateEnmityFromDamage(pet, damage) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/level_X_holy.lua b/scripts/actions/abilities/pets/level_X_holy.lua index 91f78028c53..742a7cb3b85 100644 --- a/scripts/actions/abilities/pets/level_X_holy.lua +++ b/scripts/actions/abilities/pets/level_X_holy.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Level X Holy +-- Family: Cait sith (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -10,7 +11,7 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = 0 + local holyRollOneAnimID = 164 local primaryTargetID = action:getPrimaryTargetID() @@ -27,23 +28,33 @@ abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) local power = action:getAnimation(target:getID()) - 163 - -- Only have an effect if target's level is divisible by die roll - if target:getMainLvl() % power == 0 then - damage = math.floor(pet:getMainLvl() * power + (pet:getStat(xi.mod.MND) - target:getStat(xi.mod.MND)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 10) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.LIGHT, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, 1) + params.baseDamage = pet:getMainLvl() + params.fTP = { power, power, power } + -- TODO: wSCs? + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.dStatAttackerMod = xi.mod.MND + params.dStatDefenderMod = xi.mod.MND + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - -- TODO: Magic burst? + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.element.LIGHT) - target:updateEnmityFromDamage(pet, damage) + -- Only have an effect if target's level is divisible by die roll + if target:getMainLvl() % power == 0 then + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end else petskill:setMsg(xi.msg.basic.JA_NO_EFFECT_2) end - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/meteor_strike.lua b/scripts/actions/abilities/pets/meteor_strike.lua index 68082f88f6e..a8c6cfcd5ed 100644 --- a/scripts/actions/abilities/pets/meteor_strike.lua +++ b/scripts/actions/abilities/pets/meteor_strike.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Geocrush +-- Meteor Strike +-- Family: Ifrit (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,28 +12,34 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local tp = pet:getTP() - -- Merit TP bonus. local merits = 0 if summoner and summoner:isPC() then - merits = summoner:getMerit(xi.merit.METEOR_STRIKE) + merits = utils.clamp(summoner:getMerit(xi.merit.METEOR_STRIKE) - 400, 0, 3000) end - tp = utils.clamp(tp + merits - 400, 0, 3000) + local params = {} - --note: this formula is only accurate for level 75 - 76+ may have a different intercept and/or slope - local damage = math.floor(512 + 0.172 * tp + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 5.3570, 8.0273, 10.7031 } + params.fTPBonus = merits + params.int_wSC = 0.30 + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.FIRE, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, 1) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.FIRE) - target:updateEnmityFromDamage(pet, damage) + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/nether_blast.lua b/scripts/actions/abilities/pets/nether_blast.lua index 7d477721021..4c930ac824c 100644 --- a/scripts/actions/abilities/pets/nether_blast.lua +++ b/scripts/actions/abilities/pets/nether_blast.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Nether Blast +-- Family: Diabolos (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,24 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(10 + 5 * pet:getMainLvl()) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.DARK, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.DARK, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 5.0, 5.0, 5.0 } + params.element = xi.element.DARK + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.DARK) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/searing_light.lua b/scripts/actions/abilities/pets/searing_light.lua index 8295b6c74c3..ade8a41efdb 100644 --- a/scripts/actions/abilities/pets/searing_light.lua +++ b/scripts/actions/abilities/pets/searing_light.lua @@ -1,5 +1,7 @@ ----------------------------------- -- Searing Light +-- Family: Carbuncle (Player Pet) +-- Note: Carbuncle's Astral Flow ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,17 +13,29 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(26 + pet:getMainLvl() * 6 + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.LIGHT, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.LIGHT, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 7.9765, 7.9765, 7.9765 } + params.int_wSC = 0.30 + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + -- TODO: Should not consume TP + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.LIGHT) - target:updateEnmityFromDamage(pet, damage) summoner:setMP(0) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/somnolence.lua b/scripts/actions/abilities/pets/somnolence.lua index 76cf32fc04e..6ae5344a479 100644 --- a/scripts/actions/abilities/pets/somnolence.lua +++ b/scripts/actions/abilities/pets/somnolence.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Somnolence +-- Family: Diabolos ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,23 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - -- Damage - local damage = 10 + pet:getMainLvl() * 2 + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.DARK, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.DARK, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - -- Effect - if not target:hasStatusEffect(xi.effect.WEIGHT) then - local resist = xi.combat.magicHitRate.calculateResistRate(pet, target, 0, 0, 0, xi.element.DARK, xi.mod.INT, xi.effect.WEIGHT, 0) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - if resist >= 0.25 then - target:addStatusEffect(xi.effect.WEIGHT, 50, 0, math.floor(120 * resist)) - end + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + + xi.mobskills.mobStatusEffectMove(pet, target, xi.effect.WEIGHT, 50, 0, 120) end - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/sonic_buffet.lua b/scripts/actions/abilities/pets/sonic_buffet.lua index 2e3ab343e74..d5c7771aa68 100644 --- a/scripts/actions/abilities/pets/sonic_buffet.lua +++ b/scripts/actions/abilities/pets/sonic_buffet.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Sonic Buffet +-- Family: Siren (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -12,24 +13,36 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) + local params = {} + + params.baseDamage = pet:getMainLvl() + 2 -- TODO: upon smn BP damage rewrite, the base damage & mods etc need to be re-evaluated. -- fTP starts at 2.0 and scales every 150 tp by .1 for a range of 2.0 to 4.0. Base value ballparked from retail. - local damage = math.floor(37.5 * (2 + 0.1 * pet:getTP() / 150) + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) - - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WIND, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WIND, 1) - - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WIND) - target:updateEnmityFromDamage(pet, damage) + params.fTP = { 2.0, 3.0, 4.0 } + params.int_wSC = 0.30 + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + -- Note: This dispel is Wind based rather than Dark. local resist = xi.combat.magicHitRate.calculateResistRate(pet, target, 0, 0, 0, xi.element.WIND, 0, 0, 0) if resist > 0.0625 then -- Is there _any_ circumstance wherein a dispel adds a message? Based on testing it seems the ability is magic damage only visibly. target:dispelStatusEffect() end - pet:setTP(0) -- not possible to get Occult Acumen on avatars yet, so unable to determine if magical BPs can return TP. - return damage + pet:setTP(0) -- Not possible to get Occult Acumen on avatars yet, so unable to determine if magical BPs can return TP. + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/stone_ii.lua b/scripts/actions/abilities/pets/stone_ii.lua index 1b099be87e4..9bb384cfead 100644 --- a/scripts/actions/abilities/pets/stone_ii.lua +++ b/scripts/actions/abilities/pets/stone_ii.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Stone 2 +-- Stone II +-- Family: Titan (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(45 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.EARTH, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 1.500, 2.750, 3.125 } + params.int_wSC = 0.30 + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.EARTH) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/stone_iv.lua b/scripts/actions/abilities/pets/stone_iv.lua index 8249a85d339..968233cd5c7 100644 --- a/scripts/actions/abilities/pets/stone_iv.lua +++ b/scripts/actions/abilities/pets/stone_iv.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Stone 4 +-- Stone IV +-- Family: Titan (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(325 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.EARTH, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.EARTH, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 3.6250, 5.3125, 6.1250 } + params.int_wSC = 0.30 + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.EARTH) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/thunder_ii.lua b/scripts/actions/abilities/pets/thunder_ii.lua index f6b6198cf58..bd5175f7280 100644 --- a/scripts/actions/abilities/pets/thunder_ii.lua +++ b/scripts/actions/abilities/pets/thunder_ii.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Thunder 2 +-- Thunder II +-- Family: Ramuh (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(45 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.THUNDER, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 1.500, 2.750, 3.125 } + params.int_wSC = 0.30 + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.THUNDER) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/thunder_iv.lua b/scripts/actions/abilities/pets/thunder_iv.lua index 4b3097e2bfd..8f4bc3cb948 100644 --- a/scripts/actions/abilities/pets/thunder_iv.lua +++ b/scripts/actions/abilities/pets/thunder_iv.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Thunder IV +-- Family: Ramuh (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(325 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.THUNDER, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 3.6250, 5.3125, 6.1250 } + params.int_wSC = 0.30 + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.THUNDER) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/thunderspark.lua b/scripts/actions/abilities/pets/thunderspark.lua index c8f57aac93f..9c638bd643b 100644 --- a/scripts/actions/abilities/pets/thunderspark.lua +++ b/scripts/actions/abilities/pets/thunderspark.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Thunderspark +-- Family: Ramuh (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,19 +12,28 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(275 + pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) + local params = {} - -- Add on bonuses (staff/day/weather/jas/mab/etc all go in this function) - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.THUNDER, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 2.500, 3.000, 3.246 } + params.int_wSC = 0.30 + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.THUNDER) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - target:addStatusEffect(xi.effect.PARALYSIS, 15, 0, 60) + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) - return damage + xi.mobskills.mobStatusEffectMove(pet, target, xi.effect.PARALYSIS, 15, 0, 60) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/thunderstorm.lua b/scripts/actions/abilities/pets/thunderstorm.lua index c4af0e765d6..85b410c2c11 100644 --- a/scripts/actions/abilities/pets/thunderstorm.lua +++ b/scripts/actions/abilities/pets/thunderstorm.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Thunderstorm +-- Family: Ramuh (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,28 +12,34 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local tp = pet:getTP() - -- Merit TP bonus. local merits = 0 if summoner and summoner:isPC() then - merits = summoner:getMerit(xi.merit.THUNDERSTORM) + merits = utils.clamp(summoner:getMerit(xi.merit.THUNDERSTORM) - 400, 0, 3000) end - tp = utils.clamp(tp + merits - 400, 0, 3000) + local params = {} - --note: this formula is only accurate for level 75 - 76+ may have a different intercept and/or slope - local damage = math.floor(256 + 0.172 * tp + pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 5.3570, 8.0273, 10.7031 } + params.fTPBonus = merits + params.int_wSC = 0.30 + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.THUNDER, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, 1) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.THUNDER) - target:updateEnmityFromDamage(pet, damage) + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/tidal_wave.lua b/scripts/actions/abilities/pets/tidal_wave.lua index 56309e7b722..f7c890133a8 100644 --- a/scripts/actions/abilities/pets/tidal_wave.lua +++ b/scripts/actions/abilities/pets/tidal_wave.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Tidal Wave +-- Family: Leviathan (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,17 +12,29 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(48 + pet:getMainLvl() * 8 + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WATER, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WATER, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 9.0, 9.0, 9.0 } + params.int_wSC = 0.30 + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + -- TODO: Should not consume TP + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end summoner:setMP(0) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WATER) - target:updateEnmityFromDamage(pet, damage) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/tornado_ii.lua b/scripts/actions/abilities/pets/tornado_ii.lua index 6ae7be1c13e..198288ca877 100644 --- a/scripts/actions/abilities/pets/tornado_ii.lua +++ b/scripts/actions/abilities/pets/tornado_ii.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Tornado II +-- Family: Siren (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -8,22 +9,31 @@ abilityObject.onAbilityCheck = function(player, target, ability) return xi.job_utils.summoner.canUseBloodPact(player, player:getPet(), target, ability) end --- Modeling this on the known formula for magical Merit BPs of the same level with a merit level of 0 abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - --note: this formula is only accurate for level 75 - 76+ may have a different intercept and/or slope - local damage = math.floor(512 + 0.172 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WIND, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WIND, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 6.0000, 7.6875, 8.5000 } -- Values from JPWiki + params.int_wSC = 0.30 + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE + + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) + + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end pet:setTP(0) -- not possible to get Occult Acumen on avatars yet, so unable to determine if magical BPs can return TP. - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WIND) - target:updateEnmityFromDamage(pet, damage) - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/water_ii.lua b/scripts/actions/abilities/pets/water_ii.lua index efc5c4b3c78..52bfbac8ac5 100644 --- a/scripts/actions/abilities/pets/water_ii.lua +++ b/scripts/actions/abilities/pets/water_ii.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Aero 2 +-- Water II +-- Family: Leviathan (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(45 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WATER, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WATER, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 1.500, 2.750, 3.125 } + params.int_wSC = 0.30 + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WATER) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/water_iv.lua b/scripts/actions/abilities/pets/water_iv.lua index 9253033065e..8ecdd6d472f 100644 --- a/scripts/actions/abilities/pets/water_iv.lua +++ b/scripts/actions/abilities/pets/water_iv.lua @@ -1,5 +1,6 @@ ----------------------------------- --- Aero 2 +-- Water IV +-- Family: Leviathan (Player Pet) ----------------------------------- ---@type TAbilityPet local abilityObject = {} @@ -11,16 +12,26 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local damage = math.floor(325 + 0.025 * pet:getTP() + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WATER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WATER, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WATER, 1) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 3.6250, 5.3125, 6.1250 } + params.int_wSC = 0.30 + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WATER) - target:updateEnmityFromDamage(pet, damage) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - return damage + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end + + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/wind_blade.lua b/scripts/actions/abilities/pets/wind_blade.lua index 648008870e9..843694a8efd 100644 --- a/scripts/actions/abilities/pets/wind_blade.lua +++ b/scripts/actions/abilities/pets/wind_blade.lua @@ -11,28 +11,34 @@ end abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action) - local tp = pet:getTP() - -- Merit TP bonus. local merits = 0 if summoner and summoner:isPC() then - merits = summoner:getMerit(xi.merit.WIND_BLADE) + merits = utils.clamp(summoner:getMerit(xi.merit.WIND_BLADE) - 400, 0, 3000) end - tp = utils.clamp(tp + merits - 400, 0, 3000) + local params = {} - --note: this formula is only accurate for level 75 - 76+ may have a different intercept and/or slope - local damage = math.floor(512 + 0.172 * tp + (pet:getStat(xi.mod.INT) - target:getStat(xi.mod.INT)) * 1.5) + params.baseDamage = pet:getMainLvl() + 2 + params.fTP = { 5.3570, 8.0273, 10.7031 } + params.fTPBonus = merits + params.int_wSC = 0.30 + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior + params.dStatMultiplier = 1.5 + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - local info = xi.mobskills.mobMagicalMove(pet, target, petskill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.WIND, petskill) - damage = xi.summon.avatarFinalAdjustments(info, pet, petskill, target, xi.attackType.MAGICAL, xi.damageType.WIND, 1) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - target:takeDamage(damage, pet, xi.attackType.MAGICAL, xi.damageType.WIND) - target:updateEnmityFromDamage(pet, damage) + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end - return damage + return info.damage end return abilityObject diff --git a/scripts/actions/abilities/pets/zantetsuken.lua b/scripts/actions/abilities/pets/zantetsuken.lua index 6540bfbdbef..4f038d2e54a 100644 --- a/scripts/actions/abilities/pets/zantetsuken.lua +++ b/scripts/actions/abilities/pets/zantetsuken.lua @@ -1,5 +1,10 @@ ----------------------------------- -- Zantetsuken +-- Family: Odin (Player Pet) +-- Notes: Requires Astral Flow to be active. +-- TODO: Ability Needs captures/audit. +-- https://wiki.ffo.jp/html/17522.html + -- Wanna bet this is made up? ----------------------------------- ---@type TAbilityPet @@ -9,48 +14,49 @@ abilityObject.onAbilityCheck = function(player, target, ability) return xi.job_utils.summoner.canUseBloodPact(player, player:getPet(), target, ability) end -abilityObject.onPetAbility = function(target, pet, skill, summoner, action) +abilityObject.onPetAbility = function(target, pet, petskill, summoner, action) local returnParam = 0 + local power = summoner:getMP() / utils.clamp(summoner:getMaxMP(), 1, 9999) - local power = summoner:getMP() / utils.clamp(summoner:getMaxMP(), 1, 9999) - summoner:setMP(0) - - -- Damage if target:isNM() then - local dmg = (target:getHP() + target:getHP() * power) / 10 - - if dmg > 9999 then - dmg = 9999 - end + local params = {} - local info = xi.mobskills.mobMagicalMove(pet, target, skill, dmg, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - info.damage = xi.mobskills.mobAddBonuses(pet, target, info.damage, xi.element.DARK, skill) - dmg = xi.summon.avatarFinalAdjustments(info, pet, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, 1) + params.baseDamage = power + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.canMagicBurst = true + params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE - target:takeDamage(dmg, pet, xi.attackType.MAGICAL, xi.damageType.DARK) - target:updateEnmityFromDamage(pet, dmg) + local info = xi.mobskills.mobMagicalMove(pet, target, petskill, action, params) - returnParam = dmg + if xi.mobskills.processDamage(pet, target, petskill, action, info) then + target:takeDamage(info.damage, pet, info.attackType, info.damageType) + end - -- Insta-kill: Highly innacurate against regular monsters. + returnParam = info.damage else - local chance = 50 * power / utils.clamp(skill:getTotalTargets(), 1, 50) + -- Insta-kill: Highly innacurate against regular monsters. + local chance = 50 * power / utils.clamp(petskill:getTotalTargets(), 1, 50) if math.random(1, 100) <= chance and target:getAnimation() ~= 33 then - skill:setMsg(xi.msg.basic.SKILL_ENFEEB_IS) + petskill:setMsg(xi.msg.basic.SKILL_ENFEEB_IS) target:takeDamage(target:getHP(), pet, xi.attackType.MAGICAL, xi.damageType.DARK) returnParam = xi.effect.KO else - skill:setMsg(xi.msg.basic.EVADES) + petskill:setMsg(xi.msg.basic.EVADES) returnParam = 0 end end + summoner:setMP(0) + return returnParam end diff --git a/scripts/actions/mobskills/Preternatural_Gleam.lua b/scripts/actions/mobskills/Preternatural_Gleam.lua index bb3aa37fa8c..d569de07557 100644 --- a/scripts/actions/mobskills/Preternatural_Gleam.lua +++ b/scripts/actions/mobskills/Preternatural_Gleam.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Preternatural Gleam --- Description: Deals Light damage to enemies in a fan-shaped area originating from caster. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- TODO: Capture range and animation from Cath Palug +-- Preternatural Gleam +-- Family: Coeurl +-- Description: Deals Light damage to enemies in a fan-shaped area originating from caster. Additional Effect: Mute, Paralysis +-- Notes: Used by Cath Palug ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,16 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.LIGHT, 1.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT -- TODO: Capture element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior + -- TODO: Capture range and animation - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MUTE, 1, 0, 60) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 70, 0, 60) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - return damage + 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.MUTE, 1, 0, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 70, 0, 60) + end + + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/abyss_blast.lua b/scripts/actions/mobskills/abyss_blast.lua index 3231dc09a00..5ca798de211 100644 --- a/scripts/actions/mobskills/abyss_blast.lua +++ b/scripts/actions/mobskills/abyss_blast.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.50, 3.50, 4.50 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.50, 3.50, 4.50 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) local power = 20 local duration = 120 xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, power, 0, duration) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/abyssal_drain.lua b/scripts/actions/mobskills/abyssal_drain.lua index 984d88d14cf..2df0f54352a 100644 --- a/scripts/actions/mobskills/abyssal_drain.lua +++ b/scripts/actions/mobskills/abyssal_drain.lua @@ -10,22 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.00, 2.00, 2.00 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } -- TODO: Capture fTPs + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipMagicBonusDiff = true -- TODO: Capture shadow behavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage, xi.attackType.MAGICAL, xi.damageType.DARK)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage, info.attackType, info.damageType)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/acheron_flame.lua b/scripts/actions/mobskills/acheron_flame.lua index 4e556c59b82..8db49667bd3 100644 --- a/scripts/actions/mobskills/acheron_flame.lua +++ b/scripts/actions/mobskills/acheron_flame.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 12.50, 12.50, 12.50 } -- TODO: Captures fTPs params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) local power = 30 -- TODO: Capture power/duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, power, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/acid_mist.lua b/scripts/actions/mobskills/acid_mist.lua index 0517bd47729..eafd7058bd2 100644 --- a/scripts/actions/mobskills/acid_mist.lua +++ b/scripts/actions/mobskills/acid_mist.lua @@ -10,18 +10,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.75, 2.00, 2.25 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.75, 2.00, 2.25 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) local power = 50 local duration = 120 @@ -30,7 +32,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, power, 0, duration) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/acid_spray.lua b/scripts/actions/mobskills/acid_spray.lua index 212023b046e..99b43ac280c 100644 --- a/scripts/actions/mobskills/acid_spray.lua +++ b/scripts/actions/mobskills/acid_spray.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) local power = math.floor(mob:getMainLvl() / 10 * 2) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, power, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/acrid_stream.lua b/scripts/actions/mobskills/acrid_stream.lua index 9a127c28365..01a15ba757a 100644 --- a/scripts/actions/mobskills/acrid_stream.lua +++ b/scripts/actions/mobskills/acrid_stream.lua @@ -10,18 +10,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.50, 3.50, 3.50 } -- TODO: Capture fTPs - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.50, 3.50, 3.50 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/duration local power = 20 @@ -29,7 +31,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MAGIC_DEF_DOWN, power, 0, duration) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/aeolian_edge.lua b/scripts/actions/mobskills/aeolian_edge.lua index f4f65c8224a..4480d41e24e 100644 --- a/scripts/actions/mobskills/aeolian_edge.lua +++ b/scripts/actions/mobskills/aeolian_edge.lua @@ -11,21 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.00, 3.00, 4.50 } -- TODO: Capture fTPs - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 3.00, 4.50 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/aeolian_void.lua b/scripts/actions/mobskills/aeolian_void.lua index aad86b65003..a9feb87b538 100644 --- a/scripts/actions/mobskills/aeolian_void.lua +++ b/scripts/actions/mobskills/aeolian_void.lua @@ -11,23 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) - local damage = mob:getWeaponDmg() * 2 + local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.00, 2.00, 2.00 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.SILENCE, 1, 0, 180) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 50, 0, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/aerial_blast.lua b/scripts/actions/mobskills/aerial_blast.lua index 46d22e1dabb..08280444fff 100644 --- a/scripts/actions/mobskills/aerial_blast.lua +++ b/scripts/actions/mobskills/aerial_blast.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 9, 9, 9 } params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/aero_ii.lua b/scripts/actions/mobskills/aero_ii.lua index c8629f8413e..b0d996694fe 100644 --- a/scripts/actions/mobskills/aero_ii.lua +++ b/scripts/actions/mobskills/aero_ii.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } - params.element = xi.element.WIND - -- params.dStatMultiplier = 1 -- TODO: Do non astral flow abilities use a multiplier? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/aero_iv.lua b/scripts/actions/mobskills/aero_iv.lua index b4a0b7d2e82..eddcd9c5795 100644 --- a/scripts/actions/mobskills/aero_iv.lua +++ b/scripts/actions/mobskills/aero_iv.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8, 8, 8 } - params.element = xi.element.WIND - -- params.dStatMultiplier = 1 -- TODO: Do non astral flow abilities use a multiplier? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/aero_meeble_warble.lua b/scripts/actions/mobskills/aero_meeble_warble.lua index c9a1ca1d526..5d00ec40f16 100644 --- a/scripts/actions/mobskills/aero_meeble_warble.lua +++ b/scripts/actions/mobskills/aero_meeble_warble.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 9.00, 9.00, 9.00 } -- TODO: Capture fTPs - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9.00, 9.00, 9.00 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.SILENCE, 0, 0, 60) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CHOKE, 50, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/antimatter.lua b/scripts/actions/mobskills/antimatter.lua index fb598bc8834..592ea4e6ed2 100644 --- a/scripts/actions/mobskills/antimatter.lua +++ b/scripts/actions/mobskills/antimatter.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = 750 - params.fTP = { 1, 1, 1 } - params.element = xi.element.LIGHT + params.baseDamage = 750 + params.fTP = { 1, 1, 1 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/aqua_ball.lua b/scripts/actions/mobskills/aqua_ball.lua index cb42a68600e..6be6a2a4ab6 100644 --- a/scripts/actions/mobskills/aqua_ball.lua +++ b/scripts/actions/mobskills/aqua_ball.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.00, 2.50, 3.00 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.50, 3.00 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + 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.STR_DOWN, 10, 9, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/aqua_blast.lua b/scripts/actions/mobskills/aqua_blast.lua index f71ab27b263..8dbafc3a13e 100644 --- a/scripts/actions/mobskills/aqua_blast.lua +++ b/scripts/actions/mobskills/aqua_blast.lua @@ -18,22 +18,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 2, 2, 2 } - params.element = xi.element.WATER + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2, 2, 2 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture knockback range - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/arctic_impact.lua b/scripts/actions/mobskills/arctic_impact.lua index 09fcc5f58ac..c2c3443542c 100644 --- a/scripts/actions/mobskills/arctic_impact.lua +++ b/scripts/actions/mobskills/arctic_impact.lua @@ -11,21 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs. - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs. + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/armor_buster.lua b/scripts/actions/mobskills/armor_buster.lua index 66e71088ab9..9779a1d8675 100644 --- a/scripts/actions/mobskills/armor_buster.lua +++ b/scripts/actions/mobskills/armor_buster.lua @@ -7,30 +7,32 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getLocalVar('citadelBuster') == 0 then + if mob:getLocalVar('citadelBuster') == 0 then -- TODO: Handle in mobscript? return 0 end return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 -- TODO: Capture fTP - params.fTP = { 7.5, 7.5, 7.5 } - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7.5, 7.5, 7.5 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + 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.WEIGHT, 20, 0, 45) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/artificial_gravity.lua b/scripts/actions/mobskills/artificial_gravity.lua index fdb2cb1a763..1a5ed626afd 100644 --- a/scripts/actions/mobskills/artificial_gravity.lua +++ b/scripts/actions/mobskills/artificial_gravity.lua @@ -11,23 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + 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.WEIGHT, 15, 0, 60) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/artificial_gravity_1.lua b/scripts/actions/mobskills/artificial_gravity_1.lua index 9524422d1db..09d88c8ed82 100644 --- a/scripts/actions/mobskills/artificial_gravity_1.lua +++ b/scripts/actions/mobskills/artificial_gravity_1.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + 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.WEIGHT, 15, 0, 60) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/artificial_gravity_2.lua b/scripts/actions/mobskills/artificial_gravity_2.lua index f4d5d1a6a22..8b20499c618 100644 --- a/scripts/actions/mobskills/artificial_gravity_2.lua +++ b/scripts/actions/mobskills/artificial_gravity_2.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + 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.WEIGHT, 30, 0, 60) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/artificial_gravity_3.lua b/scripts/actions/mobskills/artificial_gravity_3.lua index ea5961baf35..8e049ea2d4a 100644 --- a/scripts/actions/mobskills/artificial_gravity_3.lua +++ b/scripts/actions/mobskills/artificial_gravity_3.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + 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.WEIGHT, 45, 0, 60) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/auroral_uppercut.lua b/scripts/actions/mobskills/auroral_uppercut.lua index acd6c3eb055..af86e95f808 100644 --- a/scripts/actions/mobskills/auroral_uppercut.lua +++ b/scripts/actions/mobskills/auroral_uppercut.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/auroral_wind.lua b/scripts/actions/mobskills/auroral_wind.lua index 53e4d70af62..5d63125f7c0 100644 --- a/scripts/actions/mobskills/auroral_wind.lua +++ b/scripts/actions/mobskills/auroral_wind.lua @@ -11,23 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = 1 + mob:getMainLvl() * math.random(2, 3) - params.fTP = { 1.0, 1.0, 1.0 } - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() * math.random(2, 3) + params.fTP = { 1.0, 1.0, 1.0 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + 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.SILENCE, 1, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/bai_wing.lua b/scripts/actions/mobskills/bai_wing.lua index f6bd3f3dc6a..9a78ffd40ba 100644 --- a/scripts/actions/mobskills/bai_wing.lua +++ b/scripts/actions/mobskills/bai_wing.lua @@ -15,23 +15,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4, 4, 4 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + 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.SLOW, 9000, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/barofield.lua b/scripts/actions/mobskills/barofield.lua index 67b32a1c91e..9524a9a2d1d 100644 --- a/scripts/actions/mobskills/barofield.lua +++ b/scripts/actions/mobskills/barofield.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.WEIGHT, 25, 0, 60) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/binary_absorption.lua b/scripts/actions/mobskills/binary_absorption.lua index 7164fc4dd69..1c578477ecd 100644 --- a/scripts/actions/mobskills/binary_absorption.lua +++ b/scripts/actions/mobskills/binary_absorption.lua @@ -10,21 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 3.5, 3.5, 3.5 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage, info.attackType, info.damageType)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/binding_microtube.lua b/scripts/actions/mobskills/binding_microtube.lua index 4937612eb6b..95c6001c2a1 100644 --- a/scripts/actions/mobskills/binding_microtube.lua +++ b/scripts/actions/mobskills/binding_microtube.lua @@ -10,24 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 6.45, 6.45, 6.45 } -- TODO: Capture fTPs - params.element = xi.element.NONE - -- TODO: Capture shadow behavior + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 6.45, 6.45, 6.45 } -- TODO: Capture fTPs + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE, { breakBind = false }) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType, { breakBind = false }) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/black_cloud.lua b/scripts/actions/mobskills/black_cloud.lua index 53bc00c663f..56262a8a7e5 100644 --- a/scripts/actions/mobskills/black_cloud.lua +++ b/scripts/actions/mobskills/black_cloud.lua @@ -10,27 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.5, 1.5, 1.5 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) - -- TODO: Determine duration type(Random, Scaling based on TP, etc.) - -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=A683 - local duration = xi.mobskills.calculateDuration(skill:getTP(), 300, 420) - - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 20, 0, duration) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 20, 0, 420) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/blastbomb.lua b/scripts/actions/mobskills/blastbomb.lua index 7a415c40a9e..3988c5c4952 100644 --- a/scripts/actions/mobskills/blastbomb.lua +++ b/scripts/actions/mobskills/blastbomb.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE, { breakBind = false }) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType, { breakBind = false }) local duration = xi.mobskills.calculateDuration(skill:getTP(), 30, 60) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, duration) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/blazing_bound.lua b/scripts/actions/mobskills/blazing_bound.lua index 2edd26efd49..47e8b1c7ae8 100644 --- a/scripts/actions/mobskills/blazing_bound.lua +++ b/scripts/actions/mobskills/blazing_bound.lua @@ -10,18 +10,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/durations/ if it scales on level/tp -- xi.mobskills.mobBuffMove(mob, xi.effect.DEFENSE_BOOST, 25, 0, 120) -- Need power/duration data @@ -29,7 +31,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 26, 3, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/blitzstrahl.lua b/scripts/actions/mobskills/blitzstrahl.lua index c7e4d2298d9..7695cb582ed 100644 --- a/scripts/actions/mobskills/blitzstrahl.lua +++ b/scripts/actions/mobskills/blitzstrahl.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.5, 1.5, 1.5 } - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + 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 damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/blizzard_ii.lua b/scripts/actions/mobskills/blizzard_ii.lua index 80a02b5b943..a7658516da3 100644 --- a/scripts/actions/mobskills/blizzard_ii.lua +++ b/scripts/actions/mobskills/blizzard_ii.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs - params.element = xi.element.ICE - -- TODO: Does this also use dStatMultiplier like Astral Flow moves? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/blizzard_iv.lua b/scripts/actions/mobskills/blizzard_iv.lua index b725816aaae..c898be174ba 100644 --- a/scripts/actions/mobskills/blizzard_iv.lua +++ b/scripts/actions/mobskills/blizzard_iv.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs - params.element = xi.element.ICE - -- TODO: Does this also use dStatMultiplier like Astral Flow moves? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/blizzard_meeble_warble.lua b/scripts/actions/mobskills/blizzard_meeble_warble.lua index 7a05d5c9d91..810a64bc614 100644 --- a/scripts/actions/mobskills/blizzard_meeble_warble.lua +++ b/scripts/actions/mobskills/blizzard_meeble_warble.lua @@ -9,22 +9,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 9.00, 9.00, 9.00 } -- TODO: Capture fTPs - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9.00, 9.00, 9.00 } -- TODO: Capture fTPs + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + 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, 50, 0, 60) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FROST, 50, 3, 60) end + + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/blood_drain.lua b/scripts/actions/mobskills/blood_drain.lua index 637d9fca369..65793e103c2 100644 --- a/scripts/actions/mobskills/blood_drain.lua +++ b/scripts/actions/mobskills/blood_drain.lua @@ -10,32 +10,32 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.00, 2.00, 2.83 } - params.element = xi.element.DARK - - -- From captures, this HP Drains don't seem to be affected by these. - params.skipResist = true + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 2.00, 2.84 } -- Note: 2.84 fTP anchor is actually around 2700TP~. + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 params.skipMagicBonusDiff = true - local shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + -- Projected DMG 48, 96, 135 + -- Check 2334 -- Asanbosam (Pool ID 256) uses a modified Blood Drain that ignores shadows - if mob:getPool() == xi.mobPools.ASANBOSAM then - shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + if mob:getPool() == xi.mobPool.ASANBOSAM then + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, shadowBehavior, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage, info.attackType, info.damageType)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/blood_saber.lua b/scripts/actions/mobskills/blood_saber.lua index edcd624d98a..52697d09169 100644 --- a/scripts/actions/mobskills/blood_saber.lua +++ b/scripts/actions/mobskills/blood_saber.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.5, 1.5, 1.5 } - params.element = xi.element.DARK - params.dStatMultiplier = 1 + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.NONE + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + params.skipMagicBonusDiff = true + params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage, info.attackType, info.damageType)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/bloody_beak.lua b/scripts/actions/mobskills/bloody_beak.lua index 1e31ba742f9..b11b6f8fbc0 100644 --- a/scripts/actions/mobskills/bloody_beak.lua +++ b/scripts/actions/mobskills/bloody_beak.lua @@ -1,11 +1,9 @@ ----------------------------------- --- Bloody Beak --- Mob Ability: 2428 --- Description: Steals HP from targets within a fan-shaped area. --- Type: Magical --- Utsusemi/Blink absorb: Ignores Utsusemi --- Range: 5' --- TODO: Umeboshi: "This seems to be a physical skill, will fix it in the pass on mobPhysicalMove()" +-- Bloody Beak +-- Family: Amphipteres +-- Description: 3 fold physical attack to targets in front of mob. Additional Effect: HP Drain +-- Range: 5' +-- TODO: Umeboshi: "This seems to be a physical skill, will fix it in the pass on mobPhysicalMove()" ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,22 +12,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 3, 3, 3 } params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage, info.attackType, info.damageType)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/bomb_toss.lua b/scripts/actions/mobskills/bomb_toss.lua index 1da739cec8b..3aec95ea32b 100644 --- a/scripts/actions/mobskills/bomb_toss.lua +++ b/scripts/actions/mobskills/bomb_toss.lua @@ -11,21 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/bomb_toss_suicide.lua b/scripts/actions/mobskills/bomb_toss_suicide.lua index 0cfd1d2ffd0..c8715bf4399 100644 --- a/scripts/actions/mobskills/bomb_toss_suicide.lua +++ b/scripts/actions/mobskills/bomb_toss_suicide.lua @@ -18,24 +18,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = skill:getMobHP() / 3 - params.fTP = { 1, 1, 1 } - params.element = xi.element.FIRE - -- TODO: Capture primary target/target type. (This will determine if this skill always goes off or if it can be canceled by outranging like normal bomb toss.) + params.baseDamage = skill:getMobHP() / 3 + params.fTP = { 1, 1, 1 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - mob:setHP(0) - - return damage + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/burning_blade.lua b/scripts/actions/mobskills/burning_blade.lua index 52b07893d74..4f81e49be2d 100644 --- a/scripts/actions/mobskills/burning_blade.lua +++ b/scripts/actions/mobskills/burning_blade.lua @@ -11,21 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, 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.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 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/calamitous_wind.lua b/scripts/actions/mobskills/calamitous_wind.lua index 3a1ba6cb5e1..da27892762e 100644 --- a/scripts/actions/mobskills/calamitous_wind.lua +++ b/scripts/actions/mobskills/calamitous_wind.lua @@ -8,32 +8,32 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getHPP() >= 50 then + if mob:getHPP() >= 50 then -- TODO: Migrate to mob script? return 1 else return 0 end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4, 4, 4 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + 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 xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - - -- TODO: Should print *each* effect dispelled in addition to damage taken. target:dispelAllStatusEffect(bit.bor(xi.effectFlag.DISPELABLE, xi.effectFlag.FOOD)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/chaos_blade.lua b/scripts/actions/mobskills/chaos_blade.lua index 8910a8e00f0..3bd875f71fd 100644 --- a/scripts/actions/mobskills/chaos_blade.lua +++ b/scripts/actions/mobskills/chaos_blade.lua @@ -10,19 +10,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1, 1, 1 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: This move should force the mob to look at the target. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/durations (Varies between different mobs/NMs) local power = 25 @@ -31,7 +33,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, power, 0, duration) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/charged_whisker.lua b/scripts/actions/mobskills/charged_whisker.lua index a566099c32e..bb69d1f65db 100644 --- a/scripts/actions/mobskills/charged_whisker.lua +++ b/scripts/actions/mobskills/charged_whisker.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: BST Jug fTPs - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/circle_of_flames.lua b/scripts/actions/mobskills/circle_of_flames.lua index f98be1b2ac7..5a0344de66d 100644 --- a/scripts/actions/mobskills/circle_of_flames.lua +++ b/scripts/actions/mobskills/circle_of_flames.lua @@ -14,7 +14,7 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} -- Determine number of bombs exploded based on animation sub @@ -37,18 +37,19 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) params.additiveDamage = { bombBonusDamage, bombBonusDamage, bombBonusDamage } params.fTP = { 0.5, 0.5, 0.5 } params.element = xi.element.FIRE - -- TODO: Capture shadowBehavior + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.WEIGHT, 20, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/citadel_buster.lua b/scripts/actions/mobskills/citadel_buster.lua index dcadc6253be..4ddc9b32146 100644 --- a/scripts/actions/mobskills/citadel_buster.lua +++ b/scripts/actions/mobskills/citadel_buster.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = 2088 - params.fTP = { 1, 1, 1 } - params.element = xi.element.LIGHT + params.baseDamage = 2088 + params.fTP = { 1, 1, 1 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) mob:resetEnmity(target) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/clarsach_call.lua b/scripts/actions/mobskills/clarsach_call.lua index 52ad682d2b3..d0012c95d54 100644 --- a/scripts/actions/mobskills/clarsach_call.lua +++ b/scripts/actions/mobskills/clarsach_call.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 7.0, 7.0, 7.0 } -- TODO: Capture fTPs - params.element = xi.element.WIND - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7.0, 7.0, 7.0 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/core_meltdown.lua b/scripts/actions/mobskills/core_meltdown.lua index 062ea2ef0bd..8e44f2d5523 100644 --- a/scripts/actions/mobskills/core_meltdown.lua +++ b/scripts/actions/mobskills/core_meltdown.lua @@ -20,25 +20,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = skill:getMobHP() / 2 - params.fTP = { 1, 1, 1 } - params.element = xi.element.FIRE -- TODO: The damage type should be based off of the Ghrah's element. - -- TODO: Can this be outranged? Or is it guaranteed to go off? + params.baseDamage = skill:getMobHP() / 2 + params.fTP = { 1, 1, 1 } + params.element = xi.element.FIRE -- TODO: The element/damage type should be based off of the Ghrah's element. + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) + -- Note: If no targets in range, the explosion will not animate but the mob will still die. This is accurate retail behavior. mob:setHP(0) end diff --git a/scripts/actions/mobskills/corrosive_ooze.lua b/scripts/actions/mobskills/corrosive_ooze.lua index 07adb0aafff..0949997facf 100644 --- a/scripts/actions/mobskills/corrosive_ooze.lua +++ b/scripts/actions/mobskills/corrosive_ooze.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.5, 1.5, 1.5 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + 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.ATTACK_DOWN, 33, 0, 120) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEFENSE_DOWN, 33, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/cosmic_elucidation.lua b/scripts/actions/mobskills/cosmic_elucidation.lua index a51ed32ec4c..a99dc11133d 100644 --- a/scripts/actions/mobskills/cosmic_elucidation.lua +++ b/scripts/actions/mobskills/cosmic_elucidation.lua @@ -11,24 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 -- Only scripted use end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 21, 21, 21 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 14, 14, 14 } + params.element = xi.element.LIGHT + params.attackType = xi.attackType.SPECIAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - damage = math.max(0, damage) -- Cosmic Elucidation does not have an absorb message. + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.SPECIAL, xi.damageType.ELEMENTAL) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) skill:setMsg(xi.msg.basic.SKILLCHAIN_COSMIC_ELUCIDATION) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/counterspore.lua b/scripts/actions/mobskills/counterspore.lua index 1cce5c8f754..8745805d5e5 100644 --- a/scripts/actions/mobskills/counterspore.lua +++ b/scripts/actions/mobskills/counterspore.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Counterspore --- Deals Water damage to a single target from up to 15 yalms away. Additional effect: Knockback +-- Family: Pugils +-- Deals Water damage to a single target from up to 15 yalms away. Additional Effect: Knockback +-- Notes: Used by pugils in BCNM "Shooting Fish" as a skill attack. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,17 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local dmgMod = 3.0 +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WATER, dmgMod, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.primaryMessage = xi.msg.basic.HIT_DMG - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - skill:setMsg(xi.msg.basic.HIT_DMG) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/crispy_candle.lua b/scripts/actions/mobskills/crispy_candle.lua index bb7a8e7bc38..f7aad468330 100644 --- a/scripts/actions/mobskills/crispy_candle.lua +++ b/scripts/actions/mobskills/crispy_candle.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 3.5, 3.5, 3.5 } 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 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/crispy_candle_self.lua b/scripts/actions/mobskills/crispy_candle_self.lua index 13e01344bd8..4df8095a1b9 100644 --- a/scripts/actions/mobskills/crispy_candle_self.lua +++ b/scripts/actions/mobskills/crispy_candle_self.lua @@ -10,25 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 3.5, 3.5, 3.5 } 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.resistTierOverride = 0.25 -- 1/4 Resist -- Jimmayus spreadsheet stats Crispy Candle backfire is a 1/4 resist. -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=A1102 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + 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 damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/cryo_jet.lua b/scripts/actions/mobskills/cryo_jet.lua index 44ece33cc56..12e6b2a4f2c 100644 --- a/scripts/actions/mobskills/cryo_jet.lua +++ b/scripts/actions/mobskills/cryo_jet.lua @@ -13,6 +13,7 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} + params.percentMultipier = 0.05 -- TODO: Capture HP multiplier/threshhold. params.element = xi.element.ICE params.damageCap = 490 @@ -32,6 +33,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) end end + mob:setLocalVar('nuclearWaste', 0) -- TODO: Migrate logic to mob script. return info.damage diff --git a/scripts/actions/mobskills/crystal_rain.lua b/scripts/actions/mobskills/crystal_rain.lua index dac8c3bef42..1836e5cecce 100644 --- a/scripts/actions/mobskills/crystal_rain.lua +++ b/scripts/actions/mobskills/crystal_rain.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/crystal_weapon_fire.lua b/scripts/actions/mobskills/crystal_weapon_fire.lua index c4147f95338..4a5ba04fd5b 100644 --- a/scripts/actions/mobskills/crystal_weapon_fire.lua +++ b/scripts/actions/mobskills/crystal_weapon_fire.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Dynamis NM: Suttung applies Plague debuff. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/crystal_weapon_stone.lua b/scripts/actions/mobskills/crystal_weapon_stone.lua index 61b1802fe7e..b6b0a290ea0 100644 --- a/scripts/actions/mobskills/crystal_weapon_stone.lua +++ b/scripts/actions/mobskills/crystal_weapon_stone.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Dynamis NM: Suttung applies Petrification debuff. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/crystal_weapon_water.lua b/scripts/actions/mobskills/crystal_weapon_water.lua index 1303aac181a..79b82ae45a4 100644 --- a/scripts/actions/mobskills/crystal_weapon_water.lua +++ b/scripts/actions/mobskills/crystal_weapon_water.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Dynamis NM: Suttung applies Poison debuff. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/crystal_weapon_wind.lua b/scripts/actions/mobskills/crystal_weapon_wind.lua index ee2f0a4c9f3..7b67366fbef 100644 --- a/scripts/actions/mobskills/crystal_weapon_wind.lua +++ b/scripts/actions/mobskills/crystal_weapon_wind.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Dynamis NM: Suttung applies Weight debuff. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/cursed_sphere.lua b/scripts/actions/mobskills/cursed_sphere.lua index d3b9b8c48ba..bf7f9ac4918 100644 --- a/scripts/actions/mobskills/cursed_sphere.lua +++ b/scripts/actions/mobskills/cursed_sphere.lua @@ -11,22 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: BST Jugpet fTPs - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/cyclone_wing.lua b/scripts/actions/mobskills/cyclone_wing.lua index 0e86f3703c2..9b04f71a42c 100644 --- a/scripts/actions/mobskills/cyclone_wing.lua +++ b/scripts/actions/mobskills/cyclone_wing.lua @@ -21,21 +21,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4, 4, 4 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + 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.SLEEP_I, 1, 0, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLEEP_I, 1, 0, 60) + end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/cyclonic_torrent.lua b/scripts/actions/mobskills/cyclonic_torrent.lua index 50125af0e21..7ce9111cd91 100644 --- a/scripts/actions/mobskills/cyclonic_torrent.lua +++ b/scripts/actions/mobskills/cyclonic_torrent.lua @@ -11,24 +11,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MUTE, 1, 0, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/cyclonic_turmoil.lua b/scripts/actions/mobskills/cyclonic_turmoil.lua index c34ee29553e..c0931860f47 100644 --- a/scripts/actions/mobskills/cyclonic_turmoil.lua +++ b/scripts/actions/mobskills/cyclonic_turmoil.lua @@ -11,23 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) target:dispelAllStatusEffect(xi.effectFlag.DISPELABLE) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/dark_mist.lua b/scripts/actions/mobskills/dark_mist.lua index 51c6133efa7..5720d3ee606 100644 --- a/scripts/actions/mobskills/dark_mist.lua +++ b/scripts/actions/mobskills/dark_mist.lua @@ -15,23 +15,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + 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.WEIGHT, 50, 0, 60) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/dark_nova.lua b/scripts/actions/mobskills/dark_nova.lua index fa2736e0099..63c6282adbc 100644 --- a/scripts/actions/mobskills/dark_nova.lua +++ b/scripts/actions/mobskills/dark_nova.lua @@ -15,21 +15,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/dark_orb.lua b/scripts/actions/mobskills/dark_orb.lua index 22352e80df0..ea726537cf1 100644 --- a/scripts/actions/mobskills/dark_orb.lua +++ b/scripts/actions/mobskills/dark_orb.lua @@ -15,21 +15,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5.5, 5.5, 5.5 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.5, 5.5, 5.5 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/dark_sphere.lua b/scripts/actions/mobskills/dark_sphere.lua index e48943cd327..150498f3864 100644 --- a/scripts/actions/mobskills/dark_sphere.lua +++ b/scripts/actions/mobskills/dark_sphere.lua @@ -10,23 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + 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.BLINDNESS, 20, 0, 300) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/dark_wave.lua b/scripts/actions/mobskills/dark_wave.lua index 8731d5e00c9..6869a90b412 100644 --- a/scripts/actions/mobskills/dark_wave.lua +++ b/scripts/actions/mobskills/dark_wave.lua @@ -1,8 +1,8 @@ ----------------------------------- -- Dark Wave -- Family: Bombs (Dijin) --- Description: Deals Dark damage to targets in range. Additional Effect: Bio --- Notes: Severity of Bio effect varies by time of day, from 8/tic at midday to 20/tic at midnight. +-- Description: Inflicts Bio to targets around mob. +-- Notes: Severity of Bio effect slip damage increases at night. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,33 +12,19 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} + local hour = VanadielHour() + local power = 8 - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5, 5, 5 } -- TODO: Capture fTPs - params.element = xi.element.DARK + -- Note: Bio ATTP reduction seems to be static across time of day. + local attPercReduction = 25 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - - local hour = VanadielHour() - local power = 8 - - -- TODO: Need to capture value for Bio effect's ATTP reduction. - -- Does it scale with time of day as well or is it static? - local attPercReduction = 10 -- Set to Bio I value for now. - - if hour > 12 then - power = 8 + hour - 11 - end - - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIO, power, 3, 60, 0, attPercReduction) -- TODO: Capture power/duration + if hour < 6 or hour >= 18 then + power = 20 end - return damage + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIO, power, 3, 60, 0, attPercReduction) -- TODO: Capture power/duration + + return xi.effect.BIO end return mobskillObject diff --git a/scripts/actions/mobskills/death_ray.lua b/scripts/actions/mobskills/death_ray.lua index 5643b55bec7..75b03eca67e 100644 --- a/scripts/actions/mobskills/death_ray.lua +++ b/scripts/actions/mobskills/death_ray.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 3.0, 3.75, 4.50 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + params.fTP = { 3.0, 3.75, 4.50 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/decayed_filament.lua b/scripts/actions/mobskills/decayed_filament.lua index 9518d82ee5f..3ec85df4c89 100644 --- a/scripts/actions/mobskills/decayed_filament.lua +++ b/scripts/actions/mobskills/decayed_filament.lua @@ -10,24 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.0, 1.5, 2.0 } - params.element = xi.element.WATER - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.5, 2.0 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2 -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.NUMSHADOWS_2, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + 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, 18, 3, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/decussate.lua b/scripts/actions/mobskills/decussate.lua index f0cdaa78db9..8824912f1fa 100644 --- a/scripts/actions/mobskills/decussate.lua +++ b/scripts/actions/mobskills/decussate.lua @@ -20,21 +20,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/diamond_dust.lua b/scripts/actions/mobskills/diamond_dust.lua index 71819075f48..d5739b105b0 100644 --- a/scripts/actions/mobskills/diamond_dust.lua +++ b/scripts/actions/mobskills/diamond_dust.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 9, 9, 9 } params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/dice_damage.lua b/scripts/actions/mobskills/dice_damage.lua index 6e20a9eceb4..ee5a73b88d7 100644 --- a/scripts/actions/mobskills/dice_damage.lua +++ b/scripts/actions/mobskills/dice_damage.lua @@ -11,21 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/diffusion_ray.lua b/scripts/actions/mobskills/diffusion_ray.lua index af2f7b77d23..45c71025b4f 100644 --- a/scripts/actions/mobskills/diffusion_ray.lua +++ b/scripts/actions/mobskills/diffusion_ray.lua @@ -16,17 +16,18 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 5, 5, 5 } params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1.5 - - -- TODO: Pulled from JP Wiki. Need captures to confirm. + -- TODO: Pulled from JP Wiki: Damage reduction based on dStat MND value. Need captures to confirm. params.dStatAttackerMod = xi.mod.MND params.dStatDefenderMod = xi.mod.MND - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end return info.damage diff --git a/scripts/actions/mobskills/digest.lua b/scripts/actions/mobskills/digest.lua index 12c1c7129a7..5cc9fb43c6b 100644 --- a/scripts/actions/mobskills/digest.lua +++ b/scripts/actions/mobskills/digest.lua @@ -1,13 +1,14 @@ ----------------------------------- -- Digest -- Family: Slimes --- Deals Dark damage to a single target. Additional Effect: HP Drain +-- Description: Drains HP from a target. -- Notes: If used against undead, it will simply do damage and not drain HP. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: Move to mobskill script? if mob:getFamily() == 290 then -- Claret if mob:checkDistance(target) < 3 then -- Don't use it if he is on his target. return 1 @@ -17,21 +18,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/discharge.lua b/scripts/actions/mobskills/discharge.lua index 1e3e487c3a5..5c5f78bd18e 100644 --- a/scripts/actions/mobskills/discharge.lua +++ b/scripts/actions/mobskills/discharge.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 4.0, 4.0, 4.0 } params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + 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, 20, 0, 180) -- TODO: Capture poer/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/discoid.lua b/scripts/actions/mobskills/discoid.lua index fe6a2f91a77..4f0c93fb905 100644 --- a/scripts/actions/mobskills/discoid.lua +++ b/scripts/actions/mobskills/discoid.lua @@ -10,12 +10,16 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = 1000 / skill:getTotalTargets() -- TODO: Need captures(See below) - params.fTP = { 1, 1, 1 } - params.element = xi.element.NONE -- TODO: Light or Unaspected? + params.baseDamage = 1000 / skill:getTotalTargets() -- TODO: Need captures(See below) + params.fTP = { 1, 1, 1 } + params.element = xi.element.NONE -- TODO: Light or Unaspected? + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + -- TODO: Affected by MDB, Shell? -- TODO: getPool() or skill:getID() might be better here once captured. -- TODO: These values are pulled from online sources. Need official captures from each mob as they likely use different values. @@ -27,14 +31,13 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) params.baseDamage = 4400 / skill:getTotalTargets() end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/divine_judgment.lua b/scripts/actions/mobskills/divine_judgment.lua index 3fe1b2f3f94..c86461ccdb5 100644 --- a/scripts/actions/mobskills/divine_judgment.lua +++ b/scripts/actions/mobskills/divine_judgment.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 20, 20, 20 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 20, 20, 20 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/divine_spear.lua b/scripts/actions/mobskills/divine_spear.lua index f10705e2f98..5e652369cfd 100644 --- a/scripts/actions/mobskills/divine_spear.lua +++ b/scripts/actions/mobskills/divine_spear.lua @@ -15,21 +15,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 12.5, 12.5, 12.5 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 12.5, 12.5, 12.5 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/doctors_orders.lua b/scripts/actions/mobskills/doctors_orders.lua index 417e4c91bf6..5e2808c868c 100644 --- a/scripts/actions/mobskills/doctors_orders.lua +++ b/scripts/actions/mobskills/doctors_orders.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs + params.element = xi.element.NONE -- TODO: Capture element + params.attackType = xi.attackType.NONE + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.NONE, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.NONE, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/double_ray.lua b/scripts/actions/mobskills/double_ray.lua index 6bed56e6b0a..a540b3df29e 100644 --- a/scripts/actions/mobskills/double_ray.lua +++ b/scripts/actions/mobskills/double_ray.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.25, 2.25, 2.25 } -- TODO: Capture fTP scaling - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.25, 2.25, 2.25 } -- TODO: Capture fTP scaling + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/drain_whip.lua b/scripts/actions/mobskills/drain_whip.lua index 7ca8734ae16..4011d78d95b 100644 --- a/scripts/actions/mobskills/drain_whip.lua +++ b/scripts/actions/mobskills/drain_whip.lua @@ -10,24 +10,37 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - -- TODO: Is this magical or physical? Need captures - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs - params.element = xi.element.DARK + local drainType = math.random(xi.mobskills.drainType.HP, xi.mobskills.drainType.TP) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + -- TODO: Is this magical or physical? Need captures + -- TODO: Are the fTPs the same for each drain type? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipMagicBonusDiff = true + + if + drainType == xi.mobskills.drainType.MP or + drainType == xi.mobskills.drainType.TP + then + params.skipDamageAdjustment = true + params.skipMagicBonusDiff = true + params.skipStoneSkin = true + end - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - local drainTable = { xi.mobskills.drainType.HP, xi.mobskills.drainType.MP, xi.mobskills.drainType.TP } + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, drainTable[math.random(1, 3)], damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, drainType, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/drainkiss.lua b/scripts/actions/mobskills/drainkiss.lua index eb510fb56c3..e79df0e7c6a 100644 --- a/scripts/actions/mobskills/drainkiss.lua +++ b/scripts/actions/mobskills/drainkiss.lua @@ -11,21 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.00, 1.25, 1.50 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.25, 1.50 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/dreadstorm.lua b/scripts/actions/mobskills/dreadstorm.lua index b4bc5bcb609..4884b7338a3 100644 --- a/scripts/actions/mobskills/dreadstorm.lua +++ b/scripts/actions/mobskills/dreadstorm.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 10.0, 10.0, 10.0 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 10.0, 10.0, 10.0 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + 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.TERROR, 1, 0, 10) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/dust_cloud.lua b/scripts/actions/mobskills/dust_cloud.lua index 2ac458cab3b..304b830cc21 100644 --- a/scripts/actions/mobskills/dust_cloud.lua +++ b/scripts/actions/mobskills/dust_cloud.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + 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.BLINDNESS, 30, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/dustvoid.lua b/scripts/actions/mobskills/dustvoid.lua index d4384cff81a..b6eb4d8f47b 100644 --- a/scripts/actions/mobskills/dustvoid.lua +++ b/scripts/actions/mobskills/dustvoid.lua @@ -10,23 +10,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 0.5, 0.5, 0.5 } params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 -- TODO: Capture knockback - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - - -- TODO: Wikis state this removes equipment. Need captures - -- If it does remove equipment, does it undress before or after taking damage? + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) if target:isPC() then for i = xi.slot.MAIN, xi.slot.BACK do @@ -35,7 +34,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) end end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/earth_pounder.lua b/scripts/actions/mobskills/earth_pounder.lua index a6846706f4e..31c9c863d6a 100644 --- a/scripts/actions/mobskills/earth_pounder.lua +++ b/scripts/actions/mobskills/earth_pounder.lua @@ -10,12 +10,15 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS if mob:getPool() == xi.mobPool.PLATOON_SCORPION then local battlefield = mob:getBattlefield() @@ -27,11 +30,10 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) end end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Jimmayus Spreadsheet implies this scales with level. Need more captures to determine scaling formula. -- TODO: Capture decay rate. Many mobs use 9 second decay rate so using that for now. @@ -41,7 +43,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DEX_DOWN, power, 9, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/earthbreaker.lua b/scripts/actions/mobskills/earthbreaker.lua index c2468c84536..5efd67e7758 100644 --- a/scripts/actions/mobskills/earthbreaker.lua +++ b/scripts/actions/mobskills/earthbreaker.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.0, 1.0, 1.0 } + params.fTP = { 4, 4, 4 } params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + 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, 8) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 10) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/earthen_fury.lua b/scripts/actions/mobskills/earthen_fury.lua index 5f768e62394..c0c943eb7a2 100644 --- a/scripts/actions/mobskills/earthen_fury.lua +++ b/scripts/actions/mobskills/earthen_fury.lua @@ -11,22 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 9, 9, 9 } params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/electrocharge.lua b/scripts/actions/mobskills/electrocharge.lua index bf108b8645f..43d725d0753 100644 --- a/scripts/actions/mobskills/electrocharge.lua +++ b/scripts/actions/mobskills/electrocharge.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Electrocharge -- Family: Spheroids --- Description: Deals Unaspected elemental damage. +-- Description: Deals Unaspected magic damage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 0.5, 0.5, 0.5 } - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 0.5, 0.5, 0.5 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/electromagnetic_field.lua b/scripts/actions/mobskills/electromagnetic_field.lua index 231f7267f36..185b4184003 100644 --- a/scripts/actions/mobskills/electromagnetic_field.lua +++ b/scripts/actions/mobskills/electromagnetic_field.lua @@ -11,21 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1, 1, 1 } -- TODO: Capture fTP scaling. - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } -- TODO: Capture fTP scaling. + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/empirical_research.lua b/scripts/actions/mobskills/empirical_research.lua index 6100794a38c..b70ec65c367 100644 --- a/scripts/actions/mobskills/empirical_research.lua +++ b/scripts/actions/mobskills/empirical_research.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs + params.element = xi.element.NONE -- TODO: Capture element? + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.NONE, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.NONE, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/empty_salvation.lua b/scripts/actions/mobskills/empty_salvation.lua index 8c5bcab3086..73cf0f68638 100644 --- a/scripts/actions/mobskills/empty_salvation.lua +++ b/scripts/actions/mobskills/empty_salvation.lua @@ -10,21 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior -- TODO: There are two entries for this skill with different animations. -- Check to see if there are any differences between them. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end -- Dispel 3 status effects for i = 1, 3 do @@ -33,7 +36,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) end end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/erosion_dust.lua b/scripts/actions/mobskills/erosion_dust.lua index 9e0803f4ecb..284f5c99944 100644 --- a/scripts/actions/mobskills/erosion_dust.lua +++ b/scripts/actions/mobskills/erosion_dust.lua @@ -10,24 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.3, 3.3, 3.3 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.3, 3.3, 3.3 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + 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.DIA, 11, 3, 30, 0, 20) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DIA, 11, 3, 30, 0, 25) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/erratic_flutter.lua b/scripts/actions/mobskills/erratic_flutter.lua index 067ee784b87..9fae3912b13 100644 --- a/scripts/actions/mobskills/erratic_flutter.lua +++ b/scripts/actions/mobskills/erratic_flutter.lua @@ -15,23 +15,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.75, 2.75, 2.75 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.75, 2.75, 2.75 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end xi.mobskills.mobBuffMove(mob, xi.effect.HASTE, 4500, 0, 180) - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/exuviation.lua b/scripts/actions/mobskills/exuviation.lua index c4a204a5f43..2e427ed09df 100644 --- a/scripts/actions/mobskills/exuviation.lua +++ b/scripts/actions/mobskills/exuviation.lua @@ -23,6 +23,13 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) end skill:setMsg(xi.msg.basic.SELF_HEAL) + + -- TODO: This formula seems wrong, either not based on the average Wamoura or the level scaling is incorrect. + -- Some captures from Mount Zhayolm: + + -- Level 82(1 effect) 494 HP Restored + -- Level 80(1 effect) 479 + -- Level 80(2 effect) 1437 return xi.mobskills.mobHealMove(mob, (699 + (mob:getMainLvl() - 70) * 10) * effectCount) end diff --git a/scripts/actions/mobskills/eyes_on_me.lua b/scripts/actions/mobskills/eyes_on_me.lua index 543b9f56250..c9cd33f3aea 100644 --- a/scripts/actions/mobskills/eyes_on_me.lua +++ b/scripts/actions/mobskills/eyes_on_me.lua @@ -10,27 +10,30 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5, 5, 5 } - params.element = xi.element.DARK - params.skipTMDA = true + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } + params.element = xi.element.DARK -- TODO: Capture element (Dark or unaspected?) + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipDamageAdjustment = true + -- TODO: JP Wiki states damage might scale based on distance between mob/target. Need a capture to check. if mob:isNM() then params.fTP = { 7, 7, 7 } end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/final_exam.lua b/scripts/actions/mobskills/final_exam.lua index 1500c7a1a4c..369cf9a871f 100644 --- a/scripts/actions/mobskills/final_exam.lua +++ b/scripts/actions/mobskills/final_exam.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture FTPs/Test Element - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs + params.element = xi.element.NONE -- TODO: Capture element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/fire_ii.lua b/scripts/actions/mobskills/fire_ii.lua index 0d6d97ef45e..22b18f691a0 100644 --- a/scripts/actions/mobskills/fire_ii.lua +++ b/scripts/actions/mobskills/fire_ii.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } -- TODO: Capture fTP - params.element = xi.element.FIRE - -- TODO: Do non astral flows use a dStatMultiplier? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTP + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/fire_iv.lua b/scripts/actions/mobskills/fire_iv.lua index 21081b820c7..1490fc86bd9 100644 --- a/scripts/actions/mobskills/fire_iv.lua +++ b/scripts/actions/mobskills/fire_iv.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8, 8, 8 } -- TODO: Capture fTP - params.element = xi.element.FIRE - -- TODO: Do non astral flows use a dStatMultiplier? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTP + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/fire_meeble_warble.lua b/scripts/actions/mobskills/fire_meeble_warble.lua index a300f942761..35d55140cd0 100644 --- a/scripts/actions/mobskills/fire_meeble_warble.lua +++ b/scripts/actions/mobskills/fire_meeble_warble.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 9, 9, 9 } -- TODO: Capture fTP - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } -- TODO: Capture fTP + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 30, 3, 60) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 50, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/fireball.lua b/scripts/actions/mobskills/fireball.lua index 380d6bd9fd6..241db9fc3de 100644 --- a/scripts/actions/mobskills/fireball.lua +++ b/scripts/actions/mobskills/fireball.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Fireball --- Deals Fire damage in an area of effect. +-- Family: Lizards +-- Description: Deals Fire damage in an area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -21,8 +22,8 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, action, info) then - xi.mobskills.processDamage(mob, target, skill, action, info) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end return info.damage diff --git a/scripts/actions/mobskills/firebomb.lua b/scripts/actions/mobskills/firebomb.lua index 286f8ca2194..66f6acea4a1 100644 --- a/scripts/actions/mobskills/firebomb.lua +++ b/scripts/actions/mobskills/firebomb.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/firespit.lua b/scripts/actions/mobskills/firespit.lua index 67534b24882..00daefa05f7 100644 --- a/scripts/actions/mobskills/firespit.lua +++ b/scripts/actions/mobskills/firespit.lua @@ -10,12 +10,16 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() * math.random(2, 3) + -- TODO: This move needs more thorough research on damage and mechanics(See notes below on skillIDs). + params.baseDamage = mob:getMainLvl() params.fTP = { 4, 4, 4 } params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 params.dStatMultiplier = 1 -- There are two versions of this skill (SkillIDs 1733 and 1923). 1733 is used by Brown Mamool Ja and 1923 is used by Blue Mamool Ja(Usually mage types). @@ -23,21 +27,18 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) -- TODO: Capture AOE type for both skill IDs(Conal AOE, AOE near target, Single Target, etc) - local shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 - -- Blue Mamool Ja ignore shadows. if skill:getID() == xi.mobSkill.FIRESPIT_BLUE_MAMOOLJA then - shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, shadowBehavior, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/flame_arrow.lua b/scripts/actions/mobskills/flame_arrow.lua index 1a2a453f4f1..3b178531478 100644 --- a/scripts/actions/mobskills/flame_arrow.lua +++ b/scripts/actions/mobskills/flame_arrow.lua @@ -11,22 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.FIRE - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/flame_blast.lua b/scripts/actions/mobskills/flame_blast.lua index f9fb07ac15a..18f8a13d6b1 100644 --- a/scripts/actions/mobskills/flame_blast.lua +++ b/scripts/actions/mobskills/flame_blast.lua @@ -15,22 +15,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5, 5, 5 } - params.element = xi.element.FIRE - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 11, 11, 11 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/flame_blast_alt.lua b/scripts/actions/mobskills/flame_blast_alt.lua index e30224fd89d..fcb4c93e1e5 100644 --- a/scripts/actions/mobskills/flame_blast_alt.lua +++ b/scripts/actions/mobskills/flame_blast_alt.lua @@ -11,23 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.primaryMessage = xi.msg.basic.HIT_DMG - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - - skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Move logic to mob final adjustments eventually. + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/flame_thrower.lua b/scripts/actions/mobskills/flame_thrower.lua index f4bef0e7f95..c32d7257c8d 100644 --- a/scripts/actions/mobskills/flame_thrower.lua +++ b/scripts/actions/mobskills/flame_thrower.lua @@ -40,4 +40,4 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) return info.damage end -return mobskillObject \ No newline at end of file +return mobskillObject diff --git a/scripts/actions/mobskills/floodlight.lua b/scripts/actions/mobskills/floodlight.lua index e9e937fb145..cc98d4e7bc8 100644 --- a/scripts/actions/mobskills/floodlight.lua +++ b/scripts/actions/mobskills/floodlight.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Floodlight -- Family: Omega (Proto Omega) --- Description: ~300 magic damage, Flash, Blind and Silence +-- Description: Deals Light damage to targets hit. Additional Effect: Blind, Flash, Silence ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,27 +10,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.5, 4.5, 4.5 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.5, 4.5, 4.5 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/durations. - -- Note: Flash decay not implemented as of time of this comment. xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 15, 3, 120) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FLASH, 200, 3, 20) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FLASH, 0, 0, 20) -- Effect handled in hit rate calculation xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/flying_hip_press.lua b/scripts/actions/mobskills/flying_hip_press.lua index 932e612b74a..b976b27c4a1 100644 --- a/scripts/actions/mobskills/flying_hip_press.lua +++ b/scripts/actions/mobskills/flying_hip_press.lua @@ -2,7 +2,7 @@ -- Flying Hip Press -- Family: Bugbears -- Description: Deals Wind damage to enemies within area of effect. --- Note: Mob version of this skill is NOT a breath attack like the BLU spell is. +-- Note: Mob version of this skill is NOT a HP based breath attack like the BLU spell is. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +11,15 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS if mob:getPool() == xi.mobPool.BUGBOY then params.fTP = 7.0 @@ -26,14 +29,13 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) params.fTP = 10.0 end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/fountain.lua b/scripts/actions/mobskills/fountain.lua index 129619d44eb..e5864540d55 100644 --- a/scripts/actions/mobskills/fountain.lua +++ b/scripts/actions/mobskills/fountain.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/freeze_rush.lua b/scripts/actions/mobskills/freeze_rush.lua index 8cbc85ccd4d..34ec7d97e3e 100644 --- a/scripts/actions/mobskills/freeze_rush.lua +++ b/scripts/actions/mobskills/freeze_rush.lua @@ -17,7 +17,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) local accmod = 1 local ftp = 2 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) + local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) -- TODO: Get captures for this skill to determine if physical or magical target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) diff --git a/scripts/actions/mobskills/freezebite.lua b/scripts/actions/mobskills/freezebite.lua index f54bbb98c3e..ce1e91547ec 100644 --- a/scripts/actions/mobskills/freezebite.lua +++ b/scripts/actions/mobskills/freezebite.lua @@ -1,11 +1,8 @@ ----------------------------------- -- Freezebite +-- Family: Humanoid Greatsword Weaponskill -- Description: Delivers an Ice elemental attack. --- Type: Magical --- Utsusemi/Blink absorb: 1 shadow --- Range: Melee ----------------------------------- - ---@type TMobSkill local mobskillObject = {} @@ -13,13 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTP Scalings + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/frostbite.lua b/scripts/actions/mobskills/frostbite.lua index 7f515a98dd1..6a500bac63a 100644 --- a/scripts/actions/mobskills/frostbite.lua +++ b/scripts/actions/mobskills/frostbite.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Frostbite +-- Family: Humanoid Greatsword Weaponskill -- Description: Delivers an Ice elemental attack. --- Type: Magical --- Utsusemi/Blink absorb: 1 shadow --- Range: Melee ----------------------------------- ---@type TMobSkill @@ -13,13 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTP scaling + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior - return damage + 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/frozen_mist.lua b/scripts/actions/mobskills/frozen_mist.lua index 6bca8be3b79..54198c8fc53 100644 --- a/scripts/actions/mobskills/frozen_mist.lua +++ b/scripts/actions/mobskills/frozen_mist.lua @@ -10,18 +10,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.5, 1.5, 1.5 } - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + 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.TERROR, 1, 0, 30) end @@ -31,7 +33,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) mob:delStatusEffectSilent(xi.effect.STONESKIN) mob:addStatusEffect(xi.effect.STONESKIN, 0, 0, 180, 1, 1500) - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/fulmination.lua b/scripts/actions/mobskills/fulmination.lua index fb85159d596..359799fa523 100644 --- a/scripts/actions/mobskills/fulmination.lua +++ b/scripts/actions/mobskills/fulmination.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 12, 12, 12 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 12, 12, 12 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/durations xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 0, 60) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/gastric_bomb.lua b/scripts/actions/mobskills/gastric_bomb.lua index 270d3679940..76849a05155 100644 --- a/scripts/actions/mobskills/gastric_bomb.lua +++ b/scripts/actions/mobskills/gastric_bomb.lua @@ -10,26 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 2.0, 2.0, 2.0 } params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + 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 xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) - - -- TODO: Dreamland Dynamis ATTP power. + -- TODO: Dreamland Dynamis Nightmare Worm ATTP power. xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.ATTACK_DOWN, 50, 0, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/gates_of_hades.lua b/scripts/actions/mobskills/gates_of_hades.lua index 4b85355e718..02ee8a59cc7 100644 --- a/scripts/actions/mobskills/gates_of_hades.lua +++ b/scripts/actions/mobskills/gates_of_hades.lua @@ -8,32 +8,34 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:getHPP() < 25 then + if mob:getHPP() < 25 then -- TODO: Move to mob scripts? return 0 end return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() params.fTP = { 12.5, 12.5, 12.5 } params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) local power = 30 xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, power, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/geocrush.lua b/scripts/actions/mobskills/geocrush.lua index 1dcf03c4d62..f877f856f7d 100644 --- a/scripts/actions/mobskills/geocrush.lua +++ b/scripts/actions/mobskills/geocrush.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Geocrush -- Family: Avatar (Titan) --- Description: Titan deals Earth elemental damage and stuns target. +-- Description: Titan deals Earth elemental damage to a target. Additional Effect: Stun ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,24 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs - params.element = xi.element.EARTH - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + 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, 6) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/gigaflare.lua b/scripts/actions/mobskills/gigaflare.lua index b36e7df5528..5a1c1fa094e 100644 --- a/scripts/actions/mobskills/gigaflare.lua +++ b/scripts/actions/mobskills/gigaflare.lua @@ -20,15 +20,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() params.fTP = { 14, 14, 14 } params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) -- Targets that are not the primary target take 300 less damage. if @@ -38,10 +41,8 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) info.damage = math.max(0, info.damage - 300) end - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end -- TODO: This logic can probably be in the mob script. @@ -54,7 +55,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) mob:setBehavior(bit.bor(mob:getBehavior(), xi.behavior.NO_TURN)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/grand_fall.lua b/scripts/actions/mobskills/grand_fall.lua index 0e84eb7d804..0f4d0ed0643 100644 --- a/scripts/actions/mobskills/grand_fall.lua +++ b/scripts/actions/mobskills/grand_fall.lua @@ -10,23 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 9, 9, 9 } -- TODO: Capture fTPs - params.element = xi.element.WATER - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } -- TODO: Capture fTPs + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject - diff --git a/scripts/actions/mobskills/grave_reel.lua b/scripts/actions/mobskills/grave_reel.lua index 30f45c09881..59ba6104c1a 100644 --- a/scripts/actions/mobskills/grave_reel.lua +++ b/scripts/actions/mobskills/grave_reel.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.0, 1.0, 1.0 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.0, 1.0 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject - diff --git a/scripts/actions/mobskills/great_sandstorm.lua b/scripts/actions/mobskills/great_sandstorm.lua index 74bb7238cd1..c01af107fb5 100644 --- a/scripts/actions/mobskills/great_sandstorm.lua +++ b/scripts/actions/mobskills/great_sandstorm.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 3, 3, 3 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + params.fTP = { 3, 3, 3 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + 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.BLINDNESS, 20, 0, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/great_whirlwind.lua b/scripts/actions/mobskills/great_whirlwind.lua index 34e9ade8b97..23e2526f786 100644 --- a/scripts/actions/mobskills/great_whirlwind.lua +++ b/scripts/actions/mobskills/great_whirlwind.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 4, 4, 4 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + params.fTP = { 4, 4, 4 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.CHOKE, 3, 3, 90) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/gregale_wing.lua b/scripts/actions/mobskills/gregale_wing.lua index 80b14369edf..b35bba90eef 100644 --- a/scripts/actions/mobskills/gregale_wing.lua +++ b/scripts/actions/mobskills/gregale_wing.lua @@ -19,24 +19,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/gregale_wing_air.lua b/scripts/actions/mobskills/gregale_wing_air.lua index ecc755be95b..7276e1fedb3 100644 --- a/scripts/actions/mobskills/gregale_wing_air.lua +++ b/scripts/actions/mobskills/gregale_wing_air.lua @@ -15,24 +15,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 0, 120) end - return damage + return info.damage end -return mobskillObject \ No newline at end of file +return mobskillObject diff --git a/scripts/actions/mobskills/guided_missile_ii.lua b/scripts/actions/mobskills/guided_missile_ii.lua index 57063ba3a57..ad971516031 100644 --- a/scripts/actions/mobskills/guided_missile_ii.lua +++ b/scripts/actions/mobskills/guided_missile_ii.lua @@ -14,23 +14,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} -- TODO: This is a physical skill, will fix in mobPhysicalMove() PR. - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/heavenly_strike.lua b/scripts/actions/mobskills/heavenly_strike.lua index a1502909419..2448e6b7179 100644 --- a/scripts/actions/mobskills/heavenly_strike.lua +++ b/scripts/actions/mobskills/heavenly_strike.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Heavenly Strike -- Family: Avatar (Shiva) --- Description: Shiva deals ice damage to target. +-- Description: Shiva deals Ice damage to target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.7, 2.7, 2.7 } -- TODO: Capture fTPs - params.element = xi.element.ICE - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.7, 2.7, 2.7 } -- TODO: Capture fTPs + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/heavy_whisk.lua b/scripts/actions/mobskills/heavy_whisk.lua index 23d8b54a19d..9e3f7dcac82 100644 --- a/scripts/actions/mobskills/heavy_whisk.lua +++ b/scripts/actions/mobskills/heavy_whisk.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.5, 3.5, 3.5 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hellfire_arrow.lua b/scripts/actions/mobskills/hellfire_arrow.lua index c0c1f9674dc..8aaed6ea20c 100644 --- a/scripts/actions/mobskills/hellfire_arrow.lua +++ b/scripts/actions/mobskills/hellfire_arrow.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.7, 2.7, 2.7 } -- TODO: Capture fTPs - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.7, 2.7, 2.7 } -- TODO: Capture fTPs + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/duration local power = math.random(10, 30) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, power, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hellstorm.lua b/scripts/actions/mobskills/hellstorm.lua index d7cb5524c0e..220fbc80388 100644 --- a/scripts/actions/mobskills/hellstorm.lua +++ b/scripts/actions/mobskills/hellstorm.lua @@ -9,22 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.0, 4.0, 4.0 } -- TODO: Capture fTPs - params.element = xi.element.FIRE - -- TODO: Possible breathMove. Need captures + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } -- TODO: Capture fTPs + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hex_palm.lua b/scripts/actions/mobskills/hex_palm.lua index 89106357610..6c401ee8025 100644 --- a/scripts/actions/mobskills/hex_palm.lua +++ b/scripts/actions/mobskills/hex_palm.lua @@ -18,21 +18,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 2, 2, 2 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + params.fTP = { 2, 2, 2 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/high-tension_discharger.lua b/scripts/actions/mobskills/high-tension_discharger.lua index fcb2d959197..fc1e779fd9d 100644 --- a/scripts/actions/mobskills/high-tension_discharger.lua +++ b/scripts/actions/mobskills/high-tension_discharger.lua @@ -28,14 +28,14 @@ mobskillObject.onMobWeaponSkill = function(target, mob, 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.STUN, 1, 0, 4) + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.STUN, 1, 3, 4) if target:hasStatusEffect(xi.effect.ELEMENTALRES_DOWN) then target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) end end - mob:setLocalVar('nuclearWaste', 0) -- TODO: Move to mob script? + mob:setLocalVar('nuclearWaste', 0) return info.damage end diff --git a/scripts/actions/mobskills/homing_missile.lua b/scripts/actions/mobskills/homing_missile.lua index b5b1222dfc9..4ab0f311432 100644 --- a/scripts/actions/mobskills/homing_missile.lua +++ b/scripts/actions/mobskills/homing_missile.lua @@ -1,36 +1,39 @@ ----------------------------------- -- Homing Missle -- Family: Chariots --- Description: Deals near death damage to target. Resets hate. +-- Description: Deals near death damage to target and surrounding allies. Resets hate. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: JPWiki states this can only be used on targets in front. Need captures return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = target:getHP() * 0.90 - params.fTP = { 1, 1, 1 } - params.element = xi.element.NONE -- TODO: Capture element (Possibly Fire?) - params.skipTMDA = true -- TODO: Is it reduced by Shell? + params.baseDamage = target:getHP() * 0.90 + params.fTP = { 1, 1, 1 } + params.element = xi.element.NONE -- TODO: Capture element (Possibly Fire?) + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + -- TODO: Is it reduced by Shell/MDB? -- TODO: Long-Bowed Chariot mechanics -- https://www.bg-wiki.com/ffxi/Long-Bowed_Chariot - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) mob:resetEnmity(target) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/howling_moon.lua b/scripts/actions/mobskills/howling_moon.lua index 77d0a5156ce..b80925e1776 100644 --- a/scripts/actions/mobskills/howling_moon.lua +++ b/scripts/actions/mobskills/howling_moon.lua @@ -11,22 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 9, 9, 9 } params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hungry_crunch.lua b/scripts/actions/mobskills/hungry_crunch.lua index 2bbf84b4476..e9792f3e58a 100644 --- a/scripts/actions/mobskills/hungry_crunch.lua +++ b/scripts/actions/mobskills/hungry_crunch.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Hungry Crunch --- Steals an enemy's HP. Additional effects: TP Reset, Meal Steal. +-- Family: Bugard +-- Description: Steals an enemy's HP. Additional effects: TP Reset, Meal Steal. +-- Notes: Used by Boggelmann. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,18 +11,29 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 2, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + -- TODO: Capture if magic or physical skill. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.skipMagicBonusDiff = true -- Other drain skills tested skipped MDB checks so adding this till we test physical/magical. + + 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) + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) - if damage > 0 then target:setTP(0) - target:delStatusEffectSilent(xi.effect.FOOD) + target:delStatusEffectSilent(xi.effect.FOOD) -- TODO: Does it only delete the food effect or does it steal the buff? end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hurricane_wing.lua b/scripts/actions/mobskills/hurricane_wing.lua index e1d500c1d5a..0737143f491 100644 --- a/scripts/actions/mobskills/hurricane_wing.lua +++ b/scripts/actions/mobskills/hurricane_wing.lua @@ -1,9 +1,9 @@ ----------------------------------- --- Hurricane Wing +-- Hurricane Wing -- Family: Wyrm --- Description: Deals hurricane-force wind damage to enemies within a very wide area of effect. Additional effect: Blind --- Notes: Used only by Dragua, Fafnir, Nidhogg, Cynoprosopi, Wyrm, and Odzmanouk. The blinding effect does not last long --- but is very harsh. The attack is wide enough to generally hit an entire alliance. +-- Description: Deals hurricane-force wind damage to enemies within a very wide area of effect. Additional effect: Blind +-- Notes: Used only by Dragua, Fafnir, Nidhogg, Cynoprosopi, Wyrm, and Odzmanouk. The blinding effect does not last long +-- but is very harsh. The attack is wide enough to generally hit an entire alliance. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -18,29 +18,31 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.250, 3.625, 4.000 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.250, 3.625, 4.000 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) local power = 100 - if mob:getPool() == xi.mobPools.NIDHOGG then + if mob:getPool() == xi.mobPool.NIDHOGG then power = 160 end xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, power, 0, 30) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hurricane_wing_flying.lua b/scripts/actions/mobskills/hurricane_wing_flying.lua index 79d9071b090..b936edbe0f5 100644 --- a/scripts/actions/mobskills/hurricane_wing_flying.lua +++ b/scripts/actions/mobskills/hurricane_wing_flying.lua @@ -15,24 +15,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.250, 3.625, 4.000 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) - local power = 100 - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, power, 0, 30) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 100, 0, 30) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hydro_ball.lua b/scripts/actions/mobskills/hydro_ball.lua index 44cee8958ca..96c9f8b09a4 100644 --- a/scripts/actions/mobskills/hydro_ball.lua +++ b/scripts/actions/mobskills/hydro_ball.lua @@ -10,36 +10,37 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 1.5, 1.5, 1.5 } params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) - -- TODO: JP Wiki states this scales off mob level. + -- TODO: JP Wiki states this scales off mob level. Also observed in captures. -- https://discord.com/channels/443544205206355968/674750598939279400/1367925653667840250 -- Need more captures to determine proper forumula. - -- Capture thread: https://discord.com/channels/443544205206355968/674750598939279400/1367925653667840250 -- There are at least 2 different versions of this move. Tan sahagin use skillID 771 while blue uses 772. -- Tan models seem to have a slightly weaker STR down. -- Captures had -17 STR at Level 35 and reaching -32 STR at 75. - local power = math.ceil(mob:getMainLvl() * 0.375 + 3.875) -- Basic scaling formula for now until we get more data. + local power = math.ceil((mob:getMainLvl() * 3 + 31) / 8) -- Linear scaling formula based on capture data until we get more captures at varying mob levels xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, power, 9, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hydro_cannon.lua b/scripts/actions/mobskills/hydro_cannon.lua index a34275dfff7..a7f359a93c6 100644 --- a/scripts/actions/mobskills/hydro_cannon.lua +++ b/scripts/actions/mobskills/hydro_cannon.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Hydro Cannon -- Family: Ultima --- Description: Deals Water damage in a conal AOE. Additional Effect : 30hp/tick Poison +-- Description: Deals Water damage in a conal AOE. Additional Effect : Poison ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,30 +10,34 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = 350 - params.fTP = { 1, 1, 1 } - params.element = xi.element.WATER - params.useTBDA = true + params.percentMultipier = 0.05 + params.damageCap = 490 + params.bonusDamage = 0 + params.mAccuracyBonus = { 0, 0, 0 } + params.resistStat = xi.mod.INT + params.element = xi.element.WATER + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobBreathMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.POISON, 30, 3, 120) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 50, 3, 120) if target:hasStatusEffect(xi.effect.ELEMENTALRES_DOWN) then target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) end end - mob:setLocalVar('nuclearWaste', 0) -- TODO: Handle in mob script? + mob:setLocalVar('nuclearWaste', 0) -- TODO: Migrate to mob script - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hydro_wave.lua b/scripts/actions/mobskills/hydro_wave.lua index ebad1814729..7929833738f 100644 --- a/scripts/actions/mobskills/hydro_wave.lua +++ b/scripts/actions/mobskills/hydro_wave.lua @@ -11,29 +11,32 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.50, 2.50, 2.50 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.50, 2.50, 2.50 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- Remove 1 piece of equipment from a random slot. xi.mobskills.unequipRandomSlots(target, 1) end -- Water aura that provides special stoneskin that absorbs only magical/breath/non-elemental damage + -- TODO: Make a new function to handle stoneskin types. skill:setFinalAnimationSub(2) mob:delStatusEffectSilent(xi.effect.STONESKIN) mob:addStatusEffect(xi.effect.STONESKIN, 0, 0, 180, 2, 1500) - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/hypothermal_combustion.lua b/scripts/actions/mobskills/hypothermal_combustion.lua index c60678151c2..3f5446bd862 100644 --- a/scripts/actions/mobskills/hypothermal_combustion.lua +++ b/scripts/actions/mobskills/hypothermal_combustion.lua @@ -1,8 +1,7 @@ ----------------------------------- -- Hypothermal Combustion --- Self-destructs, releasing ice at nearby targets. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows +-- Family: Bomb (Snoll) +-- Description: Self-destructs, dealing Ice damage targets near the mob. -- Notes: Damage is based on remaining HP ----------------------------------- ---@type TMobSkill @@ -16,21 +15,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = skill:getMobHP() / 3 - params.fTP = { 1, 1, 1 } - params.element = xi.element.ICE + params.baseDamage = skill:getMobHP() / 3 + params.fTP = { 1, 1, 1 } + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/hypothermal_combustion_tzar.lua b/scripts/actions/mobskills/hypothermal_combustion_tzar.lua index 2787109c7b9..b6b71a878f7 100644 --- a/scripts/actions/mobskills/hypothermal_combustion_tzar.lua +++ b/scripts/actions/mobskills/hypothermal_combustion_tzar.lua @@ -1,10 +1,9 @@ ----------------------------------- -- Hypothermal Combustion --- Self-destructs, releasing ice at nearby targets. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows +-- Family: Bomb (Snoll Tzar) +-- Description: Self-destructs, dealing Ice damage targets near the mob. -- Notes: Damage is based on remaining HP --- CoP 5-3 Snoll Tzar version, does not kill himself +-- CoP 5-3 Snoll Tzar version, does not kill himself ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,15 +12,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getHP() / 3) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.ICE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() / 3 + params.fTP = { 1.0, 1.0, 1.0 } + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - return damage + 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/ice_break.lua b/scripts/actions/mobskills/ice_break.lua index c67dae057dc..45a387eff8c 100644 --- a/scripts/actions/mobskills/ice_break.lua +++ b/scripts/actions/mobskills/ice_break.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 2.00, 2.00, 2.00 } params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE, { breakBind = false }) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType, { breakBind = false }) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, xi.mobskills.calculateDuration(skill:getTP(), 120, 180)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/ice_break_2128.lua b/scripts/actions/mobskills/ice_break_2128.lua index 2f954460772..6e6e5853794 100644 --- a/scripts/actions/mobskills/ice_break_2128.lua +++ b/scripts/actions/mobskills/ice_break_2128.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Ice Break (Hrungnir) -- Family: Golems --- Description: Deals ice damage to enemies within range. Additional Effect: "Bind." +-- Description: Deals ice damage to enemies within range. Additional Effect: Bind -- Note: Shows as a regular attack ----------------------------------- ---@type TMobSkill @@ -11,25 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 2.0, 2.0, 2.0 } params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 + params.primaryMessage = xi.msg.basic.HIT_DMG - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE, { breakBind = false }) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType, { breakBind = false }) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, xi.mobskills.calculateDuration(skill:getTP(), 120, 180)) - skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Handle in final adjustments eventually. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/ice_guillotine.lua b/scripts/actions/mobskills/ice_guillotine.lua index 3dd8dce515d..9f4ce47dd2f 100644 --- a/scripts/actions/mobskills/ice_guillotine.lua +++ b/scripts/actions/mobskills/ice_guillotine.lua @@ -4,7 +4,6 @@ -- Description: Bites at all targets in front. Additional Effect: Max HP Down -- Notes: -- * Scylla exclusive, this skill is not used on its own and is scripted to fire after Frozen Mist is used. --- * This skill can be dodged by side stepping. -- * Skill can not be interrupted by being out of range. The skill will always go off and hit anyone inside the cone. ----------------------------------- local mobskillObject = {} @@ -13,27 +12,29 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture durations of effects - -- Capture power of Amnesia. + -- TODO: Capture power of Amnesia. xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MAX_HP_DOWN, 50, 0, 180) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.AMNESIA, 1, 0, 60) -- TODO: Scylla gains a Paralysis aura after using this skill. Maybe handle in mob script. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/ice_roar.lua b/scripts/actions/mobskills/ice_roar.lua index f7e85d0a1b2..9cf0d10777e 100644 --- a/scripts/actions/mobskills/ice_roar.lua +++ b/scripts/actions/mobskills/ice_roar.lua @@ -1,8 +1,7 @@ ----------------------------------- -- Ice Roar --- Emits the roar of an impact event, dealing damage in a fan-shaped area of effect. Ice damage --- Ignores Shadows --- TODO : Verify spell interrupt effect +-- Family: Gigas +-- Description: Emits the roar of an impact event, dealing damage in a fan-shaped area of effect. Ice damage ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,13 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 1.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + -- TODO: Need more research on if this is a magical or physical skill + -- TODO : Verify spell interrupt effect (If interrupt, then likely physical) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } -- TODO: Capture fTP scalings + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - return damage + 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/ill_wind.lua b/scripts/actions/mobskills/ill_wind.lua index 90e25acbb76..61fe45bd8b8 100644 --- a/scripts/actions/mobskills/ill_wind.lua +++ b/scripts/actions/mobskills/ill_wind.lua @@ -10,23 +10,25 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.5, 3.5, 3.5 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) target:dispelStatusEffect() end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/impact_stream.lua b/scripts/actions/mobskills/impact_stream.lua index 557c4f47729..fbbb6a93e15 100644 --- a/scripts/actions/mobskills/impact_stream.lua +++ b/scripts/actions/mobskills/impact_stream.lua @@ -10,19 +10,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 2, 2, 2 } - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + params.fTP = { 2, 2, 2 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + 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) -- TODO: Turn this into a function that can be used everywhere. -- Defense down power scales with TP -- 1000-1999 = 50 @@ -34,7 +35,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/implosion.lua b/scripts/actions/mobskills/implosion.lua index 09f828c7389..52d5f7cb061 100644 --- a/scripts/actions/mobskills/implosion.lua +++ b/scripts/actions/mobskills/implosion.lua @@ -12,22 +12,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - -- TODO: Version used in past reportedly deals 50% Max HP Damage + Knockback - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs - params.element = xi.element.DARK + -- TODO: Version used in [S](Past) reportedly deals 50% Max HP Damage + Knockback + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/impulsion.lua b/scripts/actions/mobskills/impulsion.lua index 68ee0f4c7fa..f5556981a83 100644 --- a/scripts/actions/mobskills/impulsion.lua +++ b/scripts/actions/mobskills/impulsion.lua @@ -1,32 +1,33 @@ ---------------------------------------------- +----------------------------------- -- Impulsion -- Family: Bahamut -- Description: Deals unaspected magical damage to enemies within an area of effect. Additional Effects: Blind, Knockback, Petrification -- Note: Used by Bahamut in The Wyrmking Descends ---------------------------------------------- +----------------------------------- local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 2.75, 2.75, 2.75 } - params.element = xi.element.NONE - -- TODO: Does this ignore or wipe shadows? + params.baseDamage = mob:getMainLvl() + params.fTP = { 2.75, 2.75, 2.75 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior -- TODO: Capture Knockback -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=A915 -- TODO: Once Gigaflare is available for use, the fTP of this skill increases to 5.50. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) local petrifyDuration = 15 -- TODO: Once Gigaflare is available for use, the duration of petrification increases to 30. @@ -36,7 +37,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 15, 0, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/inertia_stream.lua b/scripts/actions/mobskills/inertia_stream.lua index 18eef73d5c7..90de3bbb60f 100644 --- a/scripts/actions/mobskills/inertia_stream.lua +++ b/scripts/actions/mobskills/inertia_stream.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT, { breakBind = false }) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType, { breakBind = false }) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/inferno.lua b/scripts/actions/mobskills/inferno.lua index ad51ac13b2a..0e4731138c7 100644 --- a/scripts/actions/mobskills/inferno.lua +++ b/scripts/actions/mobskills/inferno.lua @@ -10,23 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 9, 9, 9 } params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1.5 + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/inferno_blast.lua b/scripts/actions/mobskills/inferno_blast.lua index 821c5328ce9..35428e8449d 100644 --- a/scripts/actions/mobskills/inferno_blast.lua +++ b/scripts/actions/mobskills/inferno_blast.lua @@ -15,21 +15,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 7, 7, 7 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7, 7, 7 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/inferno_blast_alt.lua b/scripts/actions/mobskills/inferno_blast_alt.lua index 5ce02da59ac..2575c7fbd6c 100644 --- a/scripts/actions/mobskills/inferno_blast_alt.lua +++ b/scripts/actions/mobskills/inferno_blast_alt.lua @@ -11,23 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4, 4, 4 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + params.primaryMessage = xi.msg.basic.HIT_DMG - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - - skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Handle in mobFinalAdjustments in future + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/ink_jet.lua b/scripts/actions/mobskills/ink_jet.lua index f8375186fe7..382b2eecb58 100644 --- a/scripts/actions/mobskills/ink_jet.lua +++ b/scripts/actions/mobskills/ink_jet.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.50, 2.00, 2.50 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 2.00, 2.50 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Jimmayus spreadsheet states 30-120s duration. Not sure if resists accounted for, if random, or tp scaling. xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 80, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/ink_jet_fee.lua b/scripts/actions/mobskills/ink_jet_fee.lua index d0078b441c9..97fce7abb6b 100644 --- a/scripts/actions/mobskills/ink_jet_fee.lua +++ b/scripts/actions/mobskills/ink_jet_fee.lua @@ -1,9 +1,8 @@ ----------------------------------- --- Ink Jet --- Description: Unleashes a torrent of black spores in a fan-shaped area of effect, dealing dark damage to targets. Additional effect: Blind, Knockback --- Type: Magical Dark (Element) --- Alternative version used once all tentacles are lost. --- TODO: Knockback strength varies based on current HP percentage, becoming extremely weak at low health. 3->2->1 +-- Ink Jet alt +-- Family: Sea Monk +-- Description: Deals Dark damage to targets in front. Additional Effect: Blind, Knockback +-- Notes: Used by Fe'e in Up in Arms BCNM as a regular attack once all tentacles wounded. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,14 +12,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) - local ftp = math.random(1.5, 2.5) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, ftp, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 80, 0, 120) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 2.00, 2.50 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.primaryMessage = xi.msg.basic.HIT_DMG - return damage + -- TODO: Knockback strength varies based on current HP percentage, becoming extremely weak at low health. 3->2->1 + + 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) + + -- TODO: Jimmayus spreadsheet states 30-120s duration. Not sure if resists accounted for, if random, or tp scaling. + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 80, 0, 120) + end + + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/ion_shower.lua b/scripts/actions/mobskills/ion_shower.lua index 6f9e862d2d2..fdf2f974dc8 100644 --- a/scripts/actions/mobskills/ion_shower.lua +++ b/scripts/actions/mobskills/ion_shower.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 2, 2, 2 } params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + 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, 5) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/iridal_pierce.lua b/scripts/actions/mobskills/iridal_pierce.lua index ad6944b59c8..cc3a72ed509 100644 --- a/scripts/actions/mobskills/iridal_pierce.lua +++ b/scripts/actions/mobskills/iridal_pierce.lua @@ -10,21 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 7, 7, 7 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7, 7, 7 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + -- TODO: Light skills sometimes use MND for dStat comparisons. Need captures. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/judgment_bolt.lua b/scripts/actions/mobskills/judgment_bolt.lua index 0dbae2f8d14..001aacc3ebe 100644 --- a/scripts/actions/mobskills/judgment_bolt.lua +++ b/scripts/actions/mobskills/judgment_bolt.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 9, 9, 9 } params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/kartstrahl.lua b/scripts/actions/mobskills/kartstrahl.lua index 53e5594f126..849c374a258 100644 --- a/scripts/actions/mobskills/kartstrahl.lua +++ b/scripts/actions/mobskills/kartstrahl.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + 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.SLEEP_I, 1, 0, 90) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/knuckle_sandwich.lua b/scripts/actions/mobskills/knuckle_sandwich.lua index 702e1d01816..47f3f8b84a7 100644 --- a/scripts/actions/mobskills/knuckle_sandwich.lua +++ b/scripts/actions/mobskills/knuckle_sandwich.lua @@ -9,24 +9,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} -- TODO: Capture possible skillchain properties -- TODO: Is this magical or physical skill? - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT - -- TODO: Verify shadowBehavior + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT -- TODO: Capture element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/lamentation.lua b/scripts/actions/mobskills/lamentation.lua index 4028ef4cdd8..8414e1df6b0 100644 --- a/scripts/actions/mobskills/lamentation.lua +++ b/scripts/actions/mobskills/lamentation.lua @@ -10,20 +10,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT - -- TODO: Capture shadowBehavior. JP Wiki says ignores shadows, EN Wikis say it wipes them. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior. JP Wiki says ignores shadows, EN Wikis say it wipes them. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + 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.DIA, 8, 3, 30, 0, 20) local effect1 = target:getStatusEffect(xi.effect.DIA) @@ -32,7 +32,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) end end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/lava_spit.lua b/scripts/actions/mobskills/lava_spit.lua index 7d7237d1eb5..9d7718661a0 100644 --- a/scripts/actions/mobskills/lava_spit.lua +++ b/scripts/actions/mobskills/lava_spit.lua @@ -14,22 +14,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.5, 1.5, 1.5 } - params.element = xi.element.FIRE - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/leafstorm.lua b/scripts/actions/mobskills/leafstorm.lua index 4619eb2b393..94504640eb2 100644 --- a/scripts/actions/mobskills/leafstorm.lua +++ b/scripts/actions/mobskills/leafstorm.lua @@ -1,8 +1,7 @@ ----------------------------------- --- Leafstorm --- Description: Deals wind damage within area of effect. --- Type: Magical Wind --- Range : 15' AOE +-- Leafstorm +-- Family: Treant +-- Description: Deals Wind damage within area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,12 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 2, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - return damage + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } -- TODO: Capture fTP scaling + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_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) + end + + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/leeching_current.lua b/scripts/actions/mobskills/leeching_current.lua index d18df3f1c6e..7dad32a21a2 100644 --- a/scripts/actions/mobskills/leeching_current.lua +++ b/scripts/actions/mobskills/leeching_current.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Leeching Current -- Family: Orobons --- Description: Deal Water damage spread evenly among targets in range. Additional Effect: HP Drain +-- Description: Deal Water? damage spread evenly among targets in range. Additional Effect: HP Drain ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,7 +10,7 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} -- We use a var here so that mobs can use different values @@ -20,24 +20,21 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) base = 1000 end - params.baseDamage = base / skill:getTotalTargets() - params.fTP = { 1, 1, 1 } - params.element = xi.element.WATER -- TODO: Capture if element is Water or Dark. - params.skipMagicBonusDiff = true -- Captures show this does not get reduced by MDB. - params.skipTMDA = true -- TODO: Is this reduced by shell? - params.skipResist = true -- TODO: Can this be resisted? - -- TODO: Can this be absorbed? Test With Liement. - -- TODO: Does day/weather affect it? - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - -- Note: This is a drain move but it returns a normal damage message instead of a drain message. - xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage) + params.baseDamage = base / skill:getTotalTargets() + params.fTP = { 1, 1, 1 } + params.element = xi.element.NONE -- TODO: Capture if element is Water or Dark or None. + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior + params.skipMagicBonusDiff = true + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/lesson_in_pain.lua b/scripts/actions/mobskills/lesson_in_pain.lua index b47cb6b520a..3caded206d7 100644 --- a/scripts/actions/mobskills/lesson_in_pain.lua +++ b/scripts/actions/mobskills/lesson_in_pain.lua @@ -8,21 +8,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs - params.element = xi.element.NONE + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2.8, 2.8, 2.8 } -- TODO: Capture fTPs + params.element = xi.element.NONE -- TODO: Capture element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.NONE, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.NONE, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/lightning_roar.lua b/scripts/actions/mobskills/lightning_roar.lua index 65844318d80..876aed7aa4e 100644 --- a/scripts/actions/mobskills/lightning_roar.lua +++ b/scripts/actions/mobskills/lightning_roar.lua @@ -1,6 +1,7 @@ ----------------------------------- -- Lightning Roar --- Emits the roar of an impact event, dealing damage in a fan-shaped area of effect. Lightning Damage. +-- Family: Gigas +-- Description: Emits the roar of an impact event, dealing damage in a fan-shaped area of effect. Lightning Damage. -- Ignores Shadows ----------------------------------- ---@type TMobSkill @@ -10,13 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, 1.5, xi.mobskills.magicalTpBonus.NO_EFFECT) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + -- TODO: Need more research on if this is a magical or physical skill + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } -- TODO: Capture fTP scalings + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - return damage + 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/lightning_spear.lua b/scripts/actions/mobskills/lightning_spear.lua index a8ea78234b6..328bb150275 100644 --- a/scripts/actions/mobskills/lightning_spear.lua +++ b/scripts/actions/mobskills/lightning_spear.lua @@ -11,24 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 20.0, 20.0, 20.0 } - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 20.0, 20.0, 20.0 } + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + + local duration = xi.mobskills.calculateDuration(30, 120) - local duration = xi.mobskills.calculateDuration(30, 120) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.AMNESIA, 1, 0, duration) -- TODO: Capture power of Amnesia end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/lux_arrow.lua b/scripts/actions/mobskills/lux_arrow.lua index 77f1be803ac..2f7852ec3e7 100644 --- a/scripts/actions/mobskills/lux_arrow.lua +++ b/scripts/actions/mobskills/lux_arrow.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.50, 2.50, 2.50 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + -- TODO: Is this physical or magical? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.50, 2.50, 2.50 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT -- TODO: Capture element + params.attackType = xi.attackType.RANGED -- TODO: Capture attackType + params.damageType = xi.damageType.PIERCING -- TODO: Capture damageType + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 - -- TODO: Capture Damage Type / Attack Type. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.RANGED, xi.damageType.PIERCING, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.RANGED, xi.damageType.PIERCING) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/maelstrom.lua b/scripts/actions/mobskills/maelstrom.lua index bb90d9084fd..4e888772c08 100644 --- a/scripts/actions/mobskills/maelstrom.lua +++ b/scripts/actions/mobskills/maelstrom.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.00, 2.50, 3.00 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.50, 3.00 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) local power = 10 local duration = 180 -- TODO: Capture duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STR_DOWN, power, 9, duration) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/magic_hammer.lua b/scripts/actions/mobskills/magic_hammer.lua index 36cddab14eb..8fa3b7e669e 100644 --- a/scripts/actions/mobskills/magic_hammer.lua +++ b/scripts/actions/mobskills/magic_hammer.lua @@ -10,30 +10,37 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} -- TODO: Verify message params.baseDamage = mob:getMainLvl() params.fTP = { 2.0, 2.0, 2.0 } params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + -- Note: This deals damage + an MP Drain. The messaging shows damage done to the player. + + -- TODO: What happens if the primary damage is absorbed(If it is subject to absorbs)? Does it drain MP? + -- If it still drains MP after an absorb then the drain calculation is likely a seperate function from the damage. -- TODO: MP Drain might not be linked directly to damage dealt or may have other mechanics involved. See video capture below. -- Magic Hammer did 14 damage but drained 90 MP. -- https://youtu.be/Qy-i4KNMnWQ?t=276 -- https://discord.com/channels/443544205206355968/791182054015762482/1128174532507729941 - local mpDrainRatio = damage * 0.10 + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + + local mpDrainRatio = info.damage * 0.10 xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, mpDrainRatio) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/magic_mortar.lua b/scripts/actions/mobskills/magic_mortar.lua index 091be29ce18..ee4cdf23d6c 100644 --- a/scripts/actions/mobskills/magic_mortar.lua +++ b/scripts/actions/mobskills/magic_mortar.lua @@ -9,24 +9,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} -- Wikis say Ob starts using this skill around 50%HP. -- Damage ranges 1500-2500~ based on mob's missing HP (Unsure if shell was calculated into this account or not or if it applies at all) - params.baseDamage = (mob:getMaxHP() - skill:getMobHP()) / 6 -- TODO: Capture data for damage formula - params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT -- TODO: Light or None? + params.baseDamage = (mob:getMaxHP() - skill:getMobHP()) / 6 -- TODO: Capture more data for damage formula + params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT -- TODO: Light or None? + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + -- TODO: Affected by modifiers like shell, MDB, etc? - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/malediction.lua b/scripts/actions/mobskills/malediction.lua index 75102286afd..83c92d51dff 100644 --- a/scripts/actions/mobskills/malediction.lua +++ b/scripts/actions/mobskills/malediction.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Malediction -- Family: Skeletons --- Description: Deals Dark damage to enemies in range. Additional Effect: HP Drain +-- Description: Steals HP of surrounding targets. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,21 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 4, 4, 4 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + params.fTP = { 4, 4, 4 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/malevolent_blessing.lua b/scripts/actions/mobskills/malevolent_blessing.lua index 7cdd5e2894c..da8c5369521 100644 --- a/scripts/actions/mobskills/malevolent_blessing.lua +++ b/scripts/actions/mobskills/malevolent_blessing.lua @@ -10,27 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - -- TODO: Verify if Physical/Magical - -- TODO: Capture shadowBehavior - -- TODO: Capture Curse power/duration - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.75, 3.75, 3.75 } -- TODO: Capture fTPs - params.element = xi.element.DARK + -- TODO: Verify if Physical/Magical skill + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.DARK -- TODO: Capture element. + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2 -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 35, 0, 45) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/mana_storm.lua b/scripts/actions/mobskills/mana_storm.lua index e7d5facc33f..3c1426fb2b4 100644 --- a/scripts/actions/mobskills/mana_storm.lua +++ b/scripts/actions/mobskills/mana_storm.lua @@ -10,21 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } -- TODO: Capture fTP - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 -- TODO: Capture base damage. Other MP Drains are often Level - 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTP + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipDamageAdjustment = true + params.skipMagicBonusDiff = true + params.skipStoneSkin = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/marrow_drain.lua b/scripts/actions/mobskills/marrow_drain.lua index 7bf6ebe7e11..a661113d828 100644 --- a/scripts/actions/mobskills/marrow_drain.lua +++ b/scripts/actions/mobskills/marrow_drain.lua @@ -7,34 +7,35 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 + -- TODO: This is used by normal bats in COP/TOAU zones. Need to seperate skill lists. + if mob:isMobType(xi.mobType.NOTORIOUS) then + return 0 + end + + return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - 2 - params.additiveDamage = { 0, 5, 10 } - params.fTP = { 1, 1, 1 } - params.element = xi.element.DARK - - -- From captures, TP Drains don't seem to be affected by these. - params.skipTMDA = true - params.skipResist = true - params.skipMagicBonusDiff = true - params.skipAbsorbNullify = true - -- TODO: Does Day/Weather affect MP Drains? Need more capture data. - -- TODO: This skill should penetrate/deal no damage to stoneskin. - -- Need to pass a param into mobFinalAdjustments in the future. - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + params.baseDamage = mob:getMainLvl() - 2 + params.additiveDamage = { 0, 5, 10 } + params.fTP = { 1, 1, 1 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipDamageAdjustment = true + params.skipMagicBonusDiff = true + params.skipStoneSkin = true + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/mega_holy.lua b/scripts/actions/mobskills/mega_holy.lua index 2095d40005d..8c6710e2936 100644 --- a/scripts/actions/mobskills/mega_holy.lua +++ b/scripts/actions/mobskills/mega_holy.lua @@ -2,7 +2,7 @@ -- Mega Holy -- Family: Avatar (Alexander) -- Description: Deals Light damage to targets in an area of effect. --- Notes: Accompanied by text +-- Notes: Accompanied by text: -- 'Open thine eyes... -- My radiance...shall guide thee...' ----------------------------------- @@ -13,21 +13,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 9, 9, 9 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/megaflare.lua b/scripts/actions/mobskills/megaflare.lua index 3e1b832bd05..b7e97650ce4 100644 --- a/scripts/actions/mobskills/megaflare.lua +++ b/scripts/actions/mobskills/megaflare.lua @@ -21,15 +21,18 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() params.fTP = { 10, 10, 10 } params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) -- Targets that are not the primary target take 300 less damage. if @@ -39,10 +42,8 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) info.damage = math.max(0, info.damage - 300) end - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end -- TODO: Handle this in mob scripts instead. @@ -57,7 +58,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) mob:setBehavior(bit.bor(mob:getBehavior(), xi.behavior.NO_TURN)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/meltdown.lua b/scripts/actions/mobskills/meltdown.lua index c9f68f009c1..a3edbd31c2a 100644 --- a/scripts/actions/mobskills/meltdown.lua +++ b/scripts/actions/mobskills/meltdown.lua @@ -2,6 +2,8 @@ -- Meltdown -- Family: Dolls -- Description: Doll self destructs and deals Light damage to targets in range. +-- Note: Dolls will begin an animation sequence that changes their animationSub() before actually using this skill. +-- This sequence may not be tied to normal TP usage. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,22 +16,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = skill:getMobHP() / 2 - params.fTP = { 1, 1, 1 } - params.element = xi.element.LIGHT - -- TODO: Can this be out ranged or does it always go off? Need packet capture. + params.baseDamage = skill:getMobHP() / 2 + params.fTP = { 1, 1, 1 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/memory_of_dark.lua b/scripts/actions/mobskills/memory_of_dark.lua index cd7903ed19f..7b799a1c859 100644 --- a/scripts/actions/mobskills/memory_of_dark.lua +++ b/scripts/actions/mobskills/memory_of_dark.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/memory_of_earth.lua b/scripts/actions/mobskills/memory_of_earth.lua index 4d7c795fc24..489c8ea244c 100644 --- a/scripts/actions/mobskills/memory_of_earth.lua +++ b/scripts/actions/mobskills/memory_of_earth.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/memory_of_fire.lua b/scripts/actions/mobskills/memory_of_fire.lua index 5522ab37dd3..dac9bb58a49 100644 --- a/scripts/actions/mobskills/memory_of_fire.lua +++ b/scripts/actions/mobskills/memory_of_fire.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/memory_of_ice.lua b/scripts/actions/mobskills/memory_of_ice.lua index 0626951fbc3..c0ea7176012 100644 --- a/scripts/actions/mobskills/memory_of_ice.lua +++ b/scripts/actions/mobskills/memory_of_ice.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/memory_of_light.lua b/scripts/actions/mobskills/memory_of_light.lua index 5281142b25a..038641bf374 100644 --- a/scripts/actions/mobskills/memory_of_light.lua +++ b/scripts/actions/mobskills/memory_of_light.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/memory_of_lightning.lua b/scripts/actions/mobskills/memory_of_lightning.lua index ea34ad6cab4..c13dc703320 100644 --- a/scripts/actions/mobskills/memory_of_lightning.lua +++ b/scripts/actions/mobskills/memory_of_lightning.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/memory_of_water.lua b/scripts/actions/mobskills/memory_of_water.lua index 81531eccd20..ab60ac3dae2 100644 --- a/scripts/actions/mobskills/memory_of_water.lua +++ b/scripts/actions/mobskills/memory_of_water.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/memory_of_wind.lua b/scripts/actions/mobskills/memory_of_wind.lua index 5c635cc64db..67f3cafe808 100644 --- a/scripts/actions/mobskills/memory_of_wind.lua +++ b/scripts/actions/mobskills/memory_of_wind.lua @@ -9,21 +9,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/mephitic_spore.lua b/scripts/actions/mobskills/mephitic_spore.lua index ce737bdcd89..c32692a3b91 100644 --- a/scripts/actions/mobskills/mephitic_spore.lua +++ b/scripts/actions/mobskills/mephitic_spore.lua @@ -11,25 +11,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 4, 4, 4 } - params.element = xi.element.DARK + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 4, 4, 4 } + params.element = xi.element.DARK + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.primaryMessage = xi.msg.basic.HIT_DMG - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + 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, 50, 3, 180) - - skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Move logic to mob final adjustments eventually. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/meteor.lua b/scripts/actions/mobskills/meteor.lua index b5eb26125ff..5d7675e8316 100644 --- a/scripts/actions/mobskills/meteor.lua +++ b/scripts/actions/mobskills/meteor.lua @@ -11,25 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() * 32 - params.fTP = { 1, 1, 1 } - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + params.fTP = { 32, 32, 32 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end -- Animation change happens after mobskill finishes. -- Animation: Chlevnik falls but calls in a final meteor barrage, then dies. skill:setFinalAnimationSub(1) - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/meteor_strike.lua b/scripts/actions/mobskills/meteor_strike.lua index bfb121c5990..dca0318dca6 100644 --- a/scripts/actions/mobskills/meteor_strike.lua +++ b/scripts/actions/mobskills/meteor_strike.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/meteorite.lua b/scripts/actions/mobskills/meteorite.lua index 37a7ad5c0f9..7ff5354b4f6 100644 --- a/scripts/actions/mobskills/meteorite.lua +++ b/scripts/actions/mobskills/meteorite.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6, 6, 6 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/miasma.lua b/scripts/actions/mobskills/miasma.lua index 3e85d9a6330..769fb7369ae 100644 --- a/scripts/actions/mobskills/miasma.lua +++ b/scripts/actions/mobskills/miasma.lua @@ -11,18 +11,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs - params.element = xi.element.EARTH -- TODO: Capture Element + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } -- TODO: Capture fTPs + params.element = xi.element.EARTH -- TODO: Capture Element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture powers/durations xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 5, 3, 60) @@ -30,7 +32,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 1250, 3, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/miasmic_breath.lua b/scripts/actions/mobskills/miasmic_breath.lua index 40ef7d38730..b6037e83316 100644 --- a/scripts/actions/mobskills/miasmic_breath.lua +++ b/scripts/actions/mobskills/miasmic_breath.lua @@ -12,37 +12,32 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 4, 4, 4 } - params.element = xi.element.DARK - params.useTBDA = true + params.baseDamage = mob:getWeaponDmg() -- TODO: Mob is likely balanced around weapon damage atm instead of getMainLvl(). + params.fTP = { 4, 4, 4 } + params.element = xi.element.DARK + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + + -- Note: Miasmic Breath (1604) uses Msg 185(xi.msg.basic.DAMAGE) + -- Note: Miasmic Breath (1605) uses Msg 1(xi.msg.basic.HIT_DMG) + -- https://youtu.be/QHcGtTR_xQg?t=879 + if skill:getID() == xi.mobSkill.MIASMIC_BREATH_2 then + params.primaryMessage = xi.msg.basic.HIT_DMG + end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + 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, 50, 3, 60) - - -- TODO: At some point we should handle skill attacks with a param to toggle messaging type. - -- For now, we will just do a check here to convert xi.msg.basic.DAMAGE to xi.msg.basic.HIT_DMG. - - -- Note: Miasmic Breath (1604) uses Msg 185(xi.msg.basic.DAMAGE) - -- Note: Miasmic Breath (1605) uses Msg 1(xi.msg.basic.HIT_DMG) - -- https://youtu.be/QHcGtTR_xQg?t=879 - - if skill:getID() == xi.mobSkill.MIASMIC_BREATH_2 then - if skill:getMsg() == xi.msg.basic.DAMAGE then - skill:setMsg(xi.msg.basic.HIT_DMG) - end - end end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/mighty_snort.lua b/scripts/actions/mobskills/mighty_snort.lua index 898876cc632..41bdb1ff65d 100644 --- a/scripts/actions/mobskills/mighty_snort.lua +++ b/scripts/actions/mobskills/mighty_snort.lua @@ -1,10 +1,7 @@ ----------------------------------- --- Mighty Snort --- --- Deals Wind damage to targets in a fan-shaped area of effect. Additional effect: Hate reset --- Type: Magical (Wind) --- Only used by certain Buffalo NMs --- +-- Mighty Snort +-- Family: Buffalo +-- Description: Deals Wind damage to targets in a fan-shaped area of effect. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -13,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 4.00, 4.00, 4.00 } params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.dStatMultiplier = 1 - -- TODO: Capture Knockback range + -- TODO: Capture Knockback - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: NM: Audumbla reportedly has hate reset on this skill. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/mijin_gakure.lua b/scripts/actions/mobskills/mijin_gakure.lua index 96ca2801e4c..57059aca032 100644 --- a/scripts/actions/mobskills/mijin_gakure.lua +++ b/scripts/actions/mobskills/mijin_gakure.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} -- TODO: Capture fTPs/Formula params.baseDamage = mob:getWeaponDmg() * skill:getMobHPP() / 10 + 6 params.fTP = { 1.0, 1.0, 1.0 } params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/mind_blast.lua b/scripts/actions/mobskills/mind_blast.lua index ff541acd84c..d7795b75735 100644 --- a/scripts/actions/mobskills/mind_blast.lua +++ b/scripts/actions/mobskills/mind_blast.lua @@ -10,26 +10,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 2.0, 2.0, 2.0 } params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture Paralysis power. Sources say its extremely potent. -- TODO: More captures for duration to account for effect resistance. xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 20, 0, xi.mobskills.calculateDuration(skill:getTP(), 15, 45)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/mine_blast.lua b/scripts/actions/mobskills/mine_blast.lua index 8c0f616e03c..12781fac653 100644 --- a/scripts/actions/mobskills/mine_blast.lua +++ b/scripts/actions/mobskills/mine_blast.lua @@ -11,12 +11,15 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 100, 100, 100 } -- TODO: Capture fTPs. (Varies by mob) - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 100, 100, 100 } -- TODO: Capture fTPs. (Varies by mob) + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Cheese Hoarder Gigiroon Mines @@ -28,18 +31,19 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) -- TODO: Blifnix Oilycheek's Goblin Mines - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - -- TODO: Move this to a mob mixin that utilizes a listener. If noone is hit by the skill, this condition will never be reached. - -- mob:entityAnimationPacket('mai1') -- Animation: Mine jumps up and explodes. - -- mob:setHP(0) + return info.damage +end + +mobskillObject.onMobSkillFinalize = function(mob, skill) + mob:entityAnimationPacket('mai1') -- Animation: Mine jumps up and explodes. - return damage + mob:setHP(0) end return mobskillObject diff --git a/scripts/actions/mobskills/molting_burst.lua b/scripts/actions/mobskills/molting_burst.lua index e3382cf48a8..0624091ee18 100644 --- a/scripts/actions/mobskills/molting_burst.lua +++ b/scripts/actions/mobskills/molting_burst.lua @@ -2,7 +2,7 @@ -- Molting Burst -- Family: Limules -- Description: Deals Light damage to . Restores HP of mob. Transfers any negative status effects on the mob to the target. --- Notes: Used by Limules affiliated with light element. +-- Notes: Used by Limules affiliated with Light element. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,27 +11,30 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5, 5, 5 } -- TODO: capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } -- TODO: capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Might want to make a new binding to tranfer status effects to other targets based on effect flags. -- TODO: This skill also transfers debuffs on the mob to the target. end - -- TODO: This may need to be handled via mixin or listener since this will execute for every target hit. - -- xi.mobskills.mobHealMove(mob, mob:getMaxHP() * 0.10) -- TODO: Capture heal power + return info.damage +end - return damage +mobskillObject.onMobSkillFinalize = function(mob, skill) + xi.mobskills.mobHealMove(mob, mob:getMaxHP() * 0.10) -- TODO: Capture heal power end return mobskillObject diff --git a/scripts/actions/mobskills/mp_absorption.lua b/scripts/actions/mobskills/mp_absorption.lua index a251f193473..a1eabf3f896 100644 --- a/scripts/actions/mobskills/mp_absorption.lua +++ b/scripts/actions/mobskills/mp_absorption.lua @@ -11,21 +11,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 1.5, 1.5, 1.5 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() -- Need more captures. Other MP Drains are often Level - 2. + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipDamageAdjustment = true + params.skipMagicBonusDiff = true + params.skipStoneSkin = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/mp_drainkiss.lua b/scripts/actions/mobskills/mp_drainkiss.lua index abff6d194ea..247eed29ff2 100644 --- a/scripts/actions/mobskills/mp_drainkiss.lua +++ b/scripts/actions/mobskills/mp_drainkiss.lua @@ -11,23 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.50, 1.50, 1.50 } - params.element = xi.element.DARK - params.dStatMultiplier = 1.5 - -- TODO: This skill should penetrate/deal no damage to stoneskin. + params.baseDamage = mob:getMainLvl() + 2 -- TODO: Capture base damage. Other MP Drains are often Level - 2 + params.fTP = { 1.50, 1.50, 1.50 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipDamageAdjustment = true + params.skipMagicBonusDiff = true + params.skipStoneSkin = true + params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/mysterious_light.lua b/scripts/actions/mobskills/mysterious_light.lua index be2c597e098..cd16ee1ae2e 100644 --- a/scripts/actions/mobskills/mysterious_light.lua +++ b/scripts/actions/mobskills/mysterious_light.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.5, 2.5, 2.5 } -- TODO: Jimmayus spreadsheet says the scales with TP. Need captures. - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.5, 2.5, 2.5 } -- TODO: Jimmayus spreadsheet says the scales with TP. Need captures. + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.WEIGHT, 75, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/negative_whirl.lua b/scripts/actions/mobskills/negative_whirl.lua index 0d1fe7e9fd7..0cf79301596 100644 --- a/scripts/actions/mobskills/negative_whirl.lua +++ b/scripts/actions/mobskills/negative_whirl.lua @@ -2,7 +2,7 @@ -- Negative Whirl -- Family: Thinkers -- Description: Deals Magic damage to targets in range. Additional Effect: Slow --- Note: Element of damage varies based on mob. (Empty mobs have varying elements) +-- Note: Element of damage varies based on individual mob. (Empty mobs have varying elements) ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -36,41 +36,38 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 2, 2, 2 } - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + params.fTP = { 2, 2, 2 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS if mob:isNM() then params.fTP = { 3, 3, 3 } end - -- Determine element based on model ID and animation sub + -- Determine element based on mob's model ID and animation sub local modelId = mob:getModelId() local animationSub = mob:getAnimationSub() - local damageType = xi.damageType.ELEMENTAL if elementTable[modelId] and elementTable[modelId][animationSub] then - params.element = elementTable[modelId][animationSub].element - damageType = elementTable[modelId][animationSub].damageType + params.element = elementTable[modelId][animationSub].element + params.damageType = elementTable[modelId][animationSub].damageType end - if mob:isNM() then - params.fTP = { 3, 3, 3 } - end - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, damageType, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, damageType) + 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.SLOW, 8500, 0, 60) -- TODO: Capture duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/nerve_gas.lua b/scripts/actions/mobskills/nerve_gas.lua index c61268b6138..4aea9b0cb11 100644 --- a/scripts/actions/mobskills/nerve_gas.lua +++ b/scripts/actions/mobskills/nerve_gas.lua @@ -7,6 +7,7 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: Use conditions vary by mob. Maybe move to mob script if possible? if mob:getFamily() == 313 then -- Tinnin can use at will return 0 else @@ -18,25 +19,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.0, 1.0, 1.0 } -- TODO: Capture fTPs - params.element = xi.element.NONE -- TODO: Capture element (Water or None?) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.0, 1.0 } -- TODO: Capture fTPs + params.element = xi.element.NONE -- TODO: Capture element (Water or None?) + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL -- TODO: Match with element capture + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/durations xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 50, 0, 420) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 20, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/nether_blast.lua b/scripts/actions/mobskills/nether_blast.lua index a34cd5355ee..84be362e232 100644 --- a/scripts/actions/mobskills/nether_blast.lua +++ b/scripts/actions/mobskills/nether_blast.lua @@ -9,7 +9,7 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} -- TODO: These values are pulled from JP Wiki: https://wiki.ffo.jp/html/4045.html @@ -19,22 +19,22 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) params.additiveDamage = { 10, 10, 10 } params.fTP = { 5, 5, 5 } params.element = xi.element.DARK - params.useTBDA = true -- Counts as breath damage - -- params.mACCBonus = { 0, 0, 0 } -- TODO: Stated to have very high accuracy but can be resisted by targets with high DARK_MEVA/DARK_RES_RANK. + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- Diabolos Dynamis Tavnazia tosses nether blast for ~1k -- if skill:getID() == 1910 then -- params.fTP = { 10, 10, 10 } -- end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/nether_tempest.lua b/scripts/actions/mobskills/nether_tempest.lua index 058184fd9cd..e97647e5e5b 100644 --- a/scripts/actions/mobskills/nether_tempest.lua +++ b/scripts/actions/mobskills/nether_tempest.lua @@ -10,26 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - -- TODO: Capture fTPs/baseDamage - -- Using Nether Blast values for now. + -- TODO: Capture fTPs/damage formula params.baseDamage = mob:getMainLvl() params.additiveDamage = { 10, 10, 10 } params.fTP = { 5, 5, 5 } params.element = xi.element.DARK - params.useTBDA = true - -- params.mACCBonus = { 0, 0, 0 } + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/nocturnal_combustion.lua b/scripts/actions/mobskills/nocturnal_combustion.lua index 61a40bc4d88..78cf6570707 100644 --- a/scripts/actions/mobskills/nocturnal_combustion.lua +++ b/scripts/actions/mobskills/nocturnal_combustion.lua @@ -11,25 +11,31 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) -- TODO: Not unlocked for use unless mob is hit with elemental damage that matches day of week. + -- Does not seem to be gated by HP threshholds. return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} + params.baseDamage = skill:getMobHP() / 3 + params.fTP = { 1, 1, 1 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + -- TODO: Time of day scaling - params.baseDamage = skill:getMobHP() / 3 - params.fTP = { 1, 1, 1 } - params.element = xi.element.DARK + -- Damage seems to reach max power around 00:00 - 01:00. + -- https://discord.com/channels/443544205206355968/443894311881408522/1438487786306142231 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/nosferatus_kiss.lua b/scripts/actions/mobskills/nosferatus_kiss.lua index 5fec9566ae0..3f7494bc740 100644 --- a/scripts/actions/mobskills/nosferatus_kiss.lua +++ b/scripts/actions/mobskills/nosferatus_kiss.lua @@ -11,36 +11,44 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + -- TODO: MP/TP Drain should not break stoneskin. May need to rework how drain skills are handled when multiple drians types are done at same time. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + + -- TODO: Considerations for capturing: + -- 1. MP/TP Drains from magic mobskills typically are not affected by Shell/Resists/MDB. + -- 2. HP Drains are typically affected by shell but not MDB. + -- 3. Taking note of the previous points, test and compare the HP Drain and the resulting MP/TP Drains with/without Shell. + -- If these are calculated seperatly, we may need to split drain skills into their own functions with their own parameters. -- Capture shows the following effects on a level 99 player from a level 85 mob: -- 108 HP drained -- 60 TP drained -- 25 MP drained - local drainedHP = math.random(damage / 2, damage) - local drainedMP = math.random(damage / 3, damage / 2) - local drainedTP = math.random(damage / 2, damage) + local drainedHP = math.random(info.damage / 2, info.damage) + local drainedMP = math.random(info.damage / 3, info.damage / 2) + local drainedTP = math.random(info.damage / 2, info.damage) -- TODO: Capture power for effects. Current numbers roughly based off video capture. - xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, drainedHP) + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, drainedHP)) xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, drainedMP) xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.TP, drainedTP) - - skill:setMsg(xi.msg.basic.SKILL_DRAIN_HP) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/nox_blast.lua b/scripts/actions/mobskills/nox_blast.lua index a852c6bb696..62054884ed7 100644 --- a/scripts/actions/mobskills/nox_blast.lua +++ b/scripts/actions/mobskills/nox_blast.lua @@ -15,23 +15,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) target:setTP(0) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/nutrient_absorption.lua b/scripts/actions/mobskills/nutrient_absorption.lua index e5a48fa063d..28623572b37 100644 --- a/scripts/actions/mobskills/nutrient_absorption.lua +++ b/scripts/actions/mobskills/nutrient_absorption.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Nutrient Absorption -- Family: Euvhi --- Description: Deals Dark damage to a target. Additional Effect: HP Drain. +-- Description: Drains HP of target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,22 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = 300 - params.fTP = { 1, 1, 1 } -- TODO: Jimmayus spreadsheet says this scales with TP. Need captures for scaling. - params.element = xi.element.DARK - params.dStatMultiplier = 1 + params.baseDamage = 300 + params.fTP = { 1, 1, 1 } -- TODO: Jimmayus spreadsheet says this scales with TP. Need captures for scaling. + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.skipMagicBonusDiff = true + params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/ochre_blast.lua b/scripts/actions/mobskills/ochre_blast.lua index ad7ba90c9de..45847694c68 100644 --- a/scripts/actions/mobskills/ochre_blast.lua +++ b/scripts/actions/mobskills/ochre_blast.lua @@ -15,22 +15,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.500, 3.875, 4.250 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.500, 3.875, 4.250 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/ochre_blast_alt.lua b/scripts/actions/mobskills/ochre_blast_alt.lua index 6521e3794e9..8842d861a4a 100644 --- a/scripts/actions/mobskills/ochre_blast_alt.lua +++ b/scripts/actions/mobskills/ochre_blast_alt.lua @@ -11,22 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.primaryMessage = xi.msg.basic.HIT_DMG - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) - skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Handle in mobFinalAdjustments + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/osmosis.lua b/scripts/actions/mobskills/osmosis.lua index b364d0103ed..3889ef51a55 100644 --- a/scripts/actions/mobskills/osmosis.lua +++ b/scripts/actions/mobskills/osmosis.lua @@ -10,23 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5, 5, 5 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } -- TODO: Capture fTPs + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) mob:stealStatusEffect(target, xi.effectFlag.DISPELABLE) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/paralyzing_microtube.lua b/scripts/actions/mobskills/paralyzing_microtube.lua index 1c12585a5bb..36a0de8539a 100644 --- a/scripts/actions/mobskills/paralyzing_microtube.lua +++ b/scripts/actions/mobskills/paralyzing_microtube.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) -local params = {} +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 12.25, 12.25, 12.25 } -- TODO: Capture fTPs - params.element = xi.element.NONE + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 12.25, 12.25, 12.25 } -- TODO: Capture fTPs + params.element = xi.element.NONE -- TODO: Capture element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + 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, 20, 0, 60) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/penumbral_impact.lua b/scripts/actions/mobskills/penumbral_impact.lua index 2ac3ebdd43e..9db3a1a878b 100644 --- a/scripts/actions/mobskills/penumbral_impact.lua +++ b/scripts/actions/mobskills/penumbral_impact.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Penumbral Impact -- Family: Djinn --- Description: Deals Dark damage to a single target. Deals more damage at night. +-- Description: Deals Dark damage to a single target. Deals more damage at night(Needs captures). ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,31 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } -- TODO: Capture fTPs. JP Wiki says damage increase is about 50% at night. + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local timeOfDay = VanadielTOTD() + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if - -- 20:00 to 4:00 - timeOfDay == xi.time.NIGHT or - timeOfDay == xi.time.MIDNIGHT - then - params.fTP = { 4.5, 4.5, 4.5 } -- TODO: Capture fTPs. JP Wiki says damage increase is about 50%. + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) - end - - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/pestilent_penance.lua b/scripts/actions/mobskills/pestilent_penance.lua index f14bd45d172..9f48ba3e16a 100644 --- a/scripts/actions/mobskills/pestilent_penance.lua +++ b/scripts/actions/mobskills/pestilent_penance.lua @@ -10,24 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs - params.element = xi.element.DARK - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2 -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + 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.PLAGUE, 10, 0, 120) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/pile_pitch.lua b/scripts/actions/mobskills/pile_pitch.lua index 2dc349f25eb..c8f601950b1 100644 --- a/scripts/actions/mobskills/pile_pitch.lua +++ b/scripts/actions/mobskills/pile_pitch.lua @@ -1,7 +1,7 @@ ----------------------------------- --- Pile Pitch --- Description: Reduces target's HP to 5% of its maximum value, ignores Utsusemi , Bind (30 sec) --- Type: Magical +-- Pile Pitch +-- Family: Omega +-- Description: Reduces target's HP to 5% of its maximum value. Additional Effect: Bind ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,20 +10,29 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local currentHP = target:getHP() - local info = - { - damage = currentHP * .90 - } - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - target:takeDamage(dmg, mob, xi.attackType.MAGICAL, xi.damageType.NONE, { breakBind = false }) + -- TODO: Jimmayus spreadsheet says this is a physical skill. Fix in mobPhysicalMove() pass. + params.baseDamage = target:getHP() * 0.90 -- TODO: Need captures of fTPs/damage. + params.fTP = { 1, 1, 1 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipDamageAdjustment = true + params.skipMagicBonusDiff = true - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) - mob:resetEnmity(target) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - return dmg + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE, { breakBind = false }) + + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) + mob:resetEnmity(target) -- TODO: Check hate reset type (Aggro pause vs full enmity reset.) + end + + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/pleiades_ray.lua b/scripts/actions/mobskills/pleiades_ray.lua index 9c2b7801fd4..3f859433264 100644 --- a/scripts/actions/mobskills/pleiades_ray.lua +++ b/scripts/actions/mobskills/pleiades_ray.lua @@ -8,6 +8,7 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: Handle via mob scripts? local mobhp = mob:getHPP() if mobhp <= 20 then @@ -17,18 +18,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 7.0, 7.0, 7.0 } -- TODO: Capture fTPs - params.element = xi.element.FIRE -- TODO: Capture element + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 7.0, 7.0, 7.0 } -- TODO: Capture fTPs + params.element = xi.element.FIRE -- TODO: Capture element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE, { breakBind = false }) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/durations of status effects. xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PARALYSIS, 40, 3, 120) @@ -40,7 +43,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 1250, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/proboscis.lua b/scripts/actions/mobskills/proboscis.lua index f3b69411c94..b753c2430f8 100644 --- a/scripts/actions/mobskills/proboscis.lua +++ b/scripts/actions/mobskills/proboscis.lua @@ -10,26 +10,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - -- TODO: This is likely a physical skill with a drain attatched as its subject to PDIF. Return to this in mobPhysicalMove() PR. - -- TODO: Drain can be resisted. Need more data on if the drain is affected by anything other than Dark resists. + params.baseDamage = mob:getMainLvl() - 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipDamageAdjustment = true + params.skipMagicBonusDiff = true + params.skipStoneSkin = true - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1, 1, 1 } - params.element = xi.element.DARK + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.MP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, info.damage)) target:dispelStatusEffect() end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/promyvion_brume.lua b/scripts/actions/mobskills/promyvion_brume.lua index 9eaade3d982..cd6ab2fe559 100644 --- a/scripts/actions/mobskills/promyvion_brume.lua +++ b/scripts/actions/mobskills/promyvion_brume.lua @@ -36,33 +36,34 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- Determine element based on model ID and animation sub local modelId = mob:getModelId() local animationSub = mob:getAnimationSub() - local damageType = xi.damageType.ELEMENTAL if elementTable[modelId] and elementTable[modelId][animationSub] then - params.element = elementTable[modelId][animationSub].element - damageType = elementTable[modelId][animationSub].damageType + params.element = elementTable[modelId][animationSub].element + params.damageType = elementTable[modelId][animationSub].damageType end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, damageType, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, damageType) + 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, 9, 3, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/psychomancy.lua b/scripts/actions/mobskills/psychomancy.lua index 392cf9da6bd..5b20bf11523 100644 --- a/scripts/actions/mobskills/psychomancy.lua +++ b/scripts/actions/mobskills/psychomancy.lua @@ -14,23 +14,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.DARK, 1.7, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.7, 1.7, 1.7 } - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 -- TODO: Capture base damage. Other MP Drains are often Level - 2 + params.fTP = { 1.7, 1.7, 1.7 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipDamageAdjustment = true + params.skipMagicBonusDiff = true + params.skipStoneSkin = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.MP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/purulent_ooze.lua b/scripts/actions/mobskills/purulent_ooze.lua index 0d667a510e0..5fb7415812c 100644 --- a/scripts/actions/mobskills/purulent_ooze.lua +++ b/scripts/actions/mobskills/purulent_ooze.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Purulent Ooze -- Family: Slugs --- Description: Deals Water damage in a fan-shaped area of effect. Additional effect: Bio and Max HP Down +-- Description: Deals Water damage in a fan-shaped area of effect. Additional Effect: Bio, Max HP Down ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) -local params = {} +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.5, 1.5, 1.5 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture durations xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIO, 12, 3, 120, 0, 10) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.MAX_HP_DOWN, 10, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/putrid_breath.lua b/scripts/actions/mobskills/putrid_breath.lua index 929f87646f5..b65a57cb630 100644 --- a/scripts/actions/mobskills/putrid_breath.lua +++ b/scripts/actions/mobskills/putrid_breath.lua @@ -11,28 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() -- TODO: Currently balanced around weapon damage. - params.fTP = { 8, 8, 8 } - params.element = xi.element.DARK - params.useTBDA = true + params.baseDamage = mob:getWeaponDmg() -- TODO: Currently balanced around weapon damage. + params.fTP = { 8, 8, 8 } + params.element = xi.element.DARK + params.attackType = xi.attackType.BREATH + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.BREATH, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + if skill:getID() == xi.mobSkill.PUTRID_BREATH_2 then + params.primaryMessage = xi.msg.basic.HIT_DMG + end - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.BREATH, xi.damageType.DARK) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if skill:getID() == xi.mobSkill.PUTRID_BREATH_1 then - skill:setMsg(xi.msg.basic.DAMAGE) - elseif skill:getID() == xi.mobSkill.PUTRID_BREATH_2 then - skill:setMsg(xi.msg.basic.HIT_DMG) - end + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/quake_blast.lua b/scripts/actions/mobskills/quake_blast.lua index 43f6ba91879..c9b37fdbb2d 100644 --- a/scripts/actions/mobskills/quake_blast.lua +++ b/scripts/actions/mobskills/quake_blast.lua @@ -10,27 +10,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 3.0, 3.0, 3.0 } params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + 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) for i = xi.slot.MAIN, xi.slot.BACK do target:unequipItem(i) end end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/raiden_thrust.lua b/scripts/actions/mobskills/raiden_thrust.lua index c646b1e7b23..24870e13c56 100644 --- a/scripts/actions/mobskills/raiden_thrust.lua +++ b/scripts/actions/mobskills/raiden_thrust.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.0, 4.0, 4.0 } -- TODO: Capture fTPS - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } -- TODO: Capture fTPS + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/rail_cannon.lua b/scripts/actions/mobskills/rail_cannon.lua index 25ce1246148..b975d29fe03 100644 --- a/scripts/actions/mobskills/rail_cannon.lua +++ b/scripts/actions/mobskills/rail_cannon.lua @@ -11,22 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 5.0, 5.0, 5.0 } params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/rail_cannon_1.lua b/scripts/actions/mobskills/rail_cannon_1.lua index eebb0dbf531..45c12d2c308 100644 --- a/scripts/actions/mobskills/rail_cannon_1.lua +++ b/scripts/actions/mobskills/rail_cannon_1.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 5.0, 5.0, 5.0 } params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/rail_cannon_2.lua b/scripts/actions/mobskills/rail_cannon_2.lua index 5154614298d..c3dadda39c3 100644 --- a/scripts/actions/mobskills/rail_cannon_2.lua +++ b/scripts/actions/mobskills/rail_cannon_2.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 5.0, 5.0, 5.0 } params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/rail_cannon_3.lua b/scripts/actions/mobskills/rail_cannon_3.lua index 822395bac46..5df0826c9da 100644 --- a/scripts/actions/mobskills/rail_cannon_3.lua +++ b/scripts/actions/mobskills/rail_cannon_3.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 5.0, 5.0, 5.0 } params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.dStatMultiplier = 1.5 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/random_kiss.lua b/scripts/actions/mobskills/random_kiss.lua index 99f5b9925ba..038903e14dc 100644 --- a/scripts/actions/mobskills/random_kiss.lua +++ b/scripts/actions/mobskills/random_kiss.lua @@ -10,21 +10,36 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 2.9, 2.9, 2.9 } -- TODO: Capture fTPs. Check fTPs for each type of drain. - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() -- TODO: MP Drains often use Level - 2, take into consideration when capturing/calculating. + params.fTP = { 2.9, 2.9, 2.9 } -- TODO: Capture fTPs. Check fTPs for each type of drain. + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Check shadows for each drain type. + params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + -- TODO: This probably isn't the ideal but will address in a future PR. + -- Need to think about how to structure/handle drains better. + local drainType = math.random(xi.mobskills.drainType.HP, xi.mobskills.drainType.TP) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, math.random(0, 2), damage)) + if + drainType == xi.mobskills.drainType.MP or + drainType == xi.mobskills.drainType.TP + then + params.skipDamageAdjustment = true + params.skipStoneSkin = true end - return damage + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, drainType, info.damage)) + end + + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/reactor_overheat.lua b/scripts/actions/mobskills/reactor_overheat.lua index 3a413a80743..db7d7dc82b9 100644 --- a/scripts/actions/mobskills/reactor_overheat.lua +++ b/scripts/actions/mobskills/reactor_overheat.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.0, 1.5, 2.0 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.5, 2.0 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + 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.PLAGUE, 5, 3, math.random(30, 60)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/reactor_overload.lua b/scripts/actions/mobskills/reactor_overload.lua index 39db48be3ce..50ee40e98e5 100644 --- a/scripts/actions/mobskills/reactor_overload.lua +++ b/scripts/actions/mobskills/reactor_overload.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.0, 1.5, 2.0 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.5, 2.0 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.SILENCE, 1, 0, math.random(15, 60)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/red_lotus_blade.lua b/scripts/actions/mobskills/red_lotus_blade.lua index b02ad1200c4..0d2f62b385e 100644 --- a/scripts/actions/mobskills/red_lotus_blade.lua +++ b/scripts/actions/mobskills/red_lotus_blade.lua @@ -17,26 +17,29 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 5.0, 5.0, 5.0 } -- TODO: Capture fTPs - params.element = xi.element.FIRE + 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 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - if mob:getPool() == xi.mobPools.QUBIA_ARENA_TRION then -- Trion: uBia_Arena only + + if mob:getPool() == xi.mobPool.QUBIA_ARENA_TRION then -- Trion: QuBia_Arena only target:showText(mob, zones[xi.zone.QUBIA_ARENA].text.RLB_LAND) elseif mob:getPool() == xi.mobPool.THRONE_ROOM_VOLKER then -- Volker: Throne_Room only target:showText(mob, zones[xi.zone.THRONE_ROOM].text.FEEL_MY_PAIN) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/regurgitation.lua b/scripts/actions/mobskills/regurgitation.lua index c262212bfb4..ab502147dce 100644 --- a/scripts/actions/mobskills/regurgitation.lua +++ b/scripts/actions/mobskills/regurgitation.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER, { breakBind = false }) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType, { breakBind = false }) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/rending_deluge.lua b/scripts/actions/mobskills/rending_deluge.lua index 610eef707e2..dcb1fa65e64 100644 --- a/scripts/actions/mobskills/rending_deluge.lua +++ b/scripts/actions/mobskills/rending_deluge.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1, 1, 1 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) target:dispelStatusEffect() end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/revelation.lua b/scripts/actions/mobskills/revelation.lua index bfde6324533..baa5e2d5160 100644 --- a/scripts/actions/mobskills/revelation.lua +++ b/scripts/actions/mobskills/revelation.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 1.5, 1.5, 1.5 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/rime_spray.lua b/scripts/actions/mobskills/rime_spray.lua index 82356a470cd..5ae48f226fd 100644 --- a/scripts/actions/mobskills/rime_spray.lua +++ b/scripts/actions/mobskills/rime_spray.lua @@ -10,18 +10,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5, 5, 5 } -- TODO: Capture fTPs - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } -- TODO: Capture fTPs + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/durations xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.FROST, 15, 3, 120) @@ -34,7 +36,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CHR_DOWN, 20, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/roller_chain.lua b/scripts/actions/mobskills/roller_chain.lua index 605ffafdb84..9df7ca2db67 100644 --- a/scripts/actions/mobskills/roller_chain.lua +++ b/scripts/actions/mobskills/roller_chain.lua @@ -16,25 +16,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} -- TODO: This is a physical skill. Will revisit in mobPhysicalMove() PR - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2, 2, 2 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/durations xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BIND, 1, 0, 30) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/ruinous_omen.lua b/scripts/actions/mobskills/ruinous_omen.lua index 66b1d257aa1..2f385b479fd 100644 --- a/scripts/actions/mobskills/ruinous_omen.lua +++ b/scripts/actions/mobskills/ruinous_omen.lua @@ -15,23 +15,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 9, 9, 9 } - params.element = xi.element.DARK + -- TODO: Capture mechanics of this skill. Currently using default astral flow values. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9, 9, 9 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - -- TODO: Capture mechanics of this skill. Currently using default old values. + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/sandspin.lua b/scripts/actions/mobskills/sandspin.lua index 46f7cc7a326..2967f21a478 100644 --- a/scripts/actions/mobskills/sandspin.lua +++ b/scripts/actions/mobskills/sandspin.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + 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, 25, 0, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/scintillant_lance.lua b/scripts/actions/mobskills/scintillant_lance.lua index eca2f053e86..9b8ccf74137 100644 --- a/scripts/actions/mobskills/scintillant_lance.lua +++ b/scripts/actions/mobskills/scintillant_lance.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.75, 3.75, 3.75 } -- TODO: Capture fTPs - params.element = xi.element.LIGHT + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.75, 3.75, 3.75 } -- TODO: Capture fTPs + params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/scouring_bubbles.lua b/scripts/actions/mobskills/scouring_bubbles.lua index 513928604eb..1a5c6955a88 100644 --- a/scripts/actions/mobskills/scouring_bubbles.lua +++ b/scripts/actions/mobskills/scouring_bubbles.lua @@ -11,22 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 12.25, 12.25, 12.25 } -- TODO: Capture fTPs - params.element = xi.element.WATER + -- TODO: This is likely a physical move despite the water visual effects. JPWiki mentions there have been cases of it missing. + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 12.25, 12.25, 12.25 } -- TODO: Capture fTPs + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - -- TODO: This is likely a physical move. JPWiki mentions there have been cases of it missing. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/searing_light.lua b/scripts/actions/mobskills/searing_light.lua index cac0ba2467a..f1058c612d7 100644 --- a/scripts/actions/mobskills/searing_light.lua +++ b/scripts/actions/mobskills/searing_light.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 9, 9, 9 } params.element = xi.element.LIGHT + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.LIGHT + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_1death.lua b/scripts/actions/mobskills/self-destruct_1death.lua deleted file mode 100644 index f147ed0ad9c..00000000000 --- a/scripts/actions/mobskills/self-destruct_1death.lua +++ /dev/null @@ -1,40 +0,0 @@ ------------------------------------ --- Self-Destruct --- Family: Clusters --- Description: Last remaining bomb in the Cluster explodes to deal Fire damage on targets in range. --- Notes: Bomb Cluster Self Destruct - 1 Bomb up ------------------------------------ -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - if - mob:isMobType(xi.mobskills.mobType.NOTORIOUS) or -- Don't suicide if NM - mob:getHPP() > 20 or -- Can only be used below 20% - mob:getAnimationSub() ~= 2 -- Only used when 1 bomb remaining - then - return 1 - end - - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} - - params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.FIRE - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - end - - mob:setHP(0) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_2.lua b/scripts/actions/mobskills/self-destruct_2.lua deleted file mode 100644 index f22e4768233..00000000000 --- a/scripts/actions/mobskills/self-destruct_2.lua +++ /dev/null @@ -1,39 +0,0 @@ ------------------------------------ --- Self-Destruct --- Family: Clusters --- Description: The 2nd bomb in the Cluster explodes to deal Fire damage on targets in range. --- Notes: Bomb Cluster Self Destruct - 2 Bomb up ------------------------------------ -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - if - mob:getHPP() > 32 or -- Can only be used below 20% - mob:getAnimationSub() ~= 1 -- Only used when 2 bombs remaining - then - return 1 - end - - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} - - params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.FIRE - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - end - - skill:setFinalAnimationSub(2) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_2death.lua b/scripts/actions/mobskills/self-destruct_2death.lua deleted file mode 100644 index 711627d0e0a..00000000000 --- a/scripts/actions/mobskills/self-destruct_2death.lua +++ /dev/null @@ -1,42 +0,0 @@ ------------------------------------ --- Self-Destruct --- Family: Clusters --- Description: 2 Remaining bombs explode to deal Fire damage on targets in range. --- Notes: Bomb Cluster Self Destruct - 2 bombs alive. - --- TODO: These are not properly weighted and we currently do not have support to do this enmass. --- Ideally, we would want to weight this against self_destruct_2. ------------------------------------ -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - if - mob:getHPP() > 32 or -- Can only be used below 32% - mob:getAnimationSub() ~= 1 -- Only used when 2 bombs remaining - then - return 1 - end - - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} - - params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.FIRE - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - end - - mob:setHP(0) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_3.lua b/scripts/actions/mobskills/self-destruct_3.lua deleted file mode 100644 index 7daea8977cd..00000000000 --- a/scripts/actions/mobskills/self-destruct_3.lua +++ /dev/null @@ -1,38 +0,0 @@ ------------------------------------ --- Self-Destruct --- Family: Clusters --- Notes: Bomb Cluster Self Destruct - 3 Bombs up ------------------------------------ -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - if - mob:getHPP() > 66 or -- Can only be used below 66% - mob:getAnimationSub() > 0 -- Only used when 3 bombs are remaining - then - return 1 - end - - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} - - params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.FIRE - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - end - - skill:setFinalAnimationSub(1) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_3death.lua b/scripts/actions/mobskills/self-destruct_3death.lua deleted file mode 100644 index 75ff673bcdb..00000000000 --- a/scripts/actions/mobskills/self-destruct_3death.lua +++ /dev/null @@ -1,46 +0,0 @@ ------------------------------------ --- Self-Destruct --- Family: Clusters --- Description: All 3 bombs explode to deal Fire damage on targets in range. --- Notes: Bomb Cluster Self Destruct - 3 bombs alive. - --- TODO: These are not properly weighted and we currently do not have support to do this enmass. --- Ideally, we would want to weight this against self_destruct_3. ------------------------------------ -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - if - mob:getHPP() > 66 or -- Can only be used below 66% - mob:getAnimationSub() > 0 -- Only used when 3 bombs are remaining - then - return 1 - end - - if math.random(0, 100) > 20 then -- 20% chance for all bombs to explode. - return 1 - end - - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} - - params.baseDamage = math.min(skill:getMobHP() / 3, mob:getMaxHP() / 3) - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.FIRE - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - end - - mob:setHP(0) - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_bomb.lua b/scripts/actions/mobskills/self-destruct_bomb.lua index 62de145e21b..b4d06e8943c 100644 --- a/scripts/actions/mobskills/self-destruct_bomb.lua +++ b/scripts/actions/mobskills/self-destruct_bomb.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = skill:getMobHP() / 3 - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.FIRE + params.baseDamage = skill:getMobHP() / 3 + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/self-destruct_bomb_321.lua b/scripts/actions/mobskills/self-destruct_bomb_321.lua index 0d06149d7bc..bd7b001c355 100644 --- a/scripts/actions/mobskills/self-destruct_bomb_321.lua +++ b/scripts/actions/mobskills/self-destruct_bomb_321.lua @@ -1,8 +1,7 @@ ----------------------------------- -- Self-Destruct (3, 2, 1...) +-- Family: Bomb -- Description: Deals massive fire damage to enemies within range. Damage scales 1:1 with remaining HP. --- Type: Magical Fire --- Utsusemi/Blink absorb: Ignores shadows -- Notes: Used by Time Bomb in the BCNM "3, 2, 1..." when time reaches 0. ----------------------------------- ---@type TMobSkill @@ -12,15 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = 9999 + mob:getHP() +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = 9999 + mob:getHP() + params.fTP = { 2.5, 2.5, 2.5 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - return damage + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/self-destruct_bomb_big.lua b/scripts/actions/mobskills/self-destruct_bomb_big.lua index 32ee81c0be6..a3a90ab4eb3 100644 --- a/scripts/actions/mobskills/self-destruct_bomb_big.lua +++ b/scripts/actions/mobskills/self-destruct_bomb_big.lua @@ -9,22 +9,33 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:isMobType(xi.mobType.NOTORIOUS) or mob:getHPP() >= 90 then + if + mob:isMobType(xi.mobType.NOTORIOUS) or -- TODO: Set skill list + mob:getHPP() >= 90 + then return 1 end return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getHP() / 2 +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() / 2 + params.fTP = { 1.0, 1.0, 1.0 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - return damage + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/self-destruct_cluster_1_death.lua b/scripts/actions/mobskills/self-destruct_cluster_1_death.lua index fb2e95ad96b..aebf781ab39 100644 --- a/scripts/actions/mobskills/self-destruct_cluster_1_death.lua +++ b/scripts/actions/mobskills/self-destruct_cluster_1_death.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Self-Destruct --- Used when only one cluster remains +-- Family: Clusters +-- Description: The last bomb in the Cluster explodes to deal Fire damage on targets in range. +-- Notes: Bomb Cluster Self Destruct - 1 Bomb up. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,15 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getHP() +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 0.24, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() + params.fTP = { 0.24, 0.24, 0.24 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - return damage + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/self-destruct_cluster_2.lua b/scripts/actions/mobskills/self-destruct_cluster_2.lua index c41872ea49a..91d10b5002e 100644 --- a/scripts/actions/mobskills/self-destruct_cluster_2.lua +++ b/scripts/actions/mobskills/self-destruct_cluster_2.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Self-Destruct --- Used when only two clusters remain +-- Family: Clusters +-- Description: The 2nd bomb in the Cluster explodes to deal Fire damage on targets in range. +-- Notes: Bomb Cluster Self Destruct - 2 Bomb up ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,23 +11,34 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getHP() / 3) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} + + params.baseDamage = skill:getMobHP() + params.fTP = { 0.40, 0.40, 0.40 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS if mob:getPool() == xi.mobPool.RAZON then - damage = mob:getMaxHP() / 2 + params.baseDamage = mob:getMaxHP() + params.fTP = { 0.50, 0.50, 0.50 } + if mob:getHPP() <= 33 then - damage = 0 + params.baseDamage = 0 end end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 0.4, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, 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) + end - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - skill:setFinalAnimationSub(6) + skill:setFinalAnimationSub(6) -- TODO: Standardize cluster spawn animations. - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_cluster_2_death.lua b/scripts/actions/mobskills/self-destruct_cluster_2_death.lua index 2f44585a2ce..ce1f4069261 100644 --- a/scripts/actions/mobskills/self-destruct_cluster_2_death.lua +++ b/scripts/actions/mobskills/self-destruct_cluster_2_death.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Self-Destruct --- Used when only two clusters remain +-- Family: Clusters +-- Description: The 2nd bomb in the Cluster explodes to deal Fire damage on targets in range. +-- Notes: Bomb Cluster Self Destruct - 2 Bomb up. This version blows up all bombs in the formation, killing the mob. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,15 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getHP() +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 0.24, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() + params.fTP = { 0.40, 0.40, 0.40 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - return damage + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/self-destruct_cluster_3.lua b/scripts/actions/mobskills/self-destruct_cluster_3.lua index ce0b25d2b1b..54dc0fecba1 100644 --- a/scripts/actions/mobskills/self-destruct_cluster_3.lua +++ b/scripts/actions/mobskills/self-destruct_cluster_3.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Self-Destruct --- Used when all three clusters are alive +-- Family: Clusters +-- Description: The 1st bomb in the Cluster explodes to deal Fire damage on targets in range. +-- Notes: Bomb Cluster Self Destruct - 3 Bomb up. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,23 +11,34 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = math.floor(mob:getHP() / 3) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} + + params.baseDamage = skill:getMobHP() + params.fTP = { 0.40, 0.40, 0.40 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS if mob:getPool() == xi.mobPool.RAZON then - damage = math.floor(mob:getMaxHP() / 3) - if mob:getHPP() <= 66 then - damage = 0 + params.baseDamage = mob:getMaxHP() + params.fTP = { 0.33, 0.33, 0.33 } + + if mob:getHPP() <= 33 then + params.baseDamage = 0 end end - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 0.4, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, 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) + end - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) - skill:setFinalAnimationSub(5) + skill:setFinalAnimationSub(5) -- TODO: Standardize cluster spawn animations. - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/self-destruct_cluster_3_death.lua b/scripts/actions/mobskills/self-destruct_cluster_3_death.lua index ec245a075cb..a4066bfc5e7 100644 --- a/scripts/actions/mobskills/self-destruct_cluster_3_death.lua +++ b/scripts/actions/mobskills/self-destruct_cluster_3_death.lua @@ -1,6 +1,8 @@ ----------------------------------- -- Self-Destruct --- Used when all three clusters are alive +-- Family: Clusters +-- Description: The 1st bomb in the Cluster explodes to deal Fire damage on targets in range. +-- Notes: Bomb Cluster Self Destruct - 3 Bomb up. This version blows up all bombs in the formation, killing the mob. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -9,15 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getHP() +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 0.24, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() + params.fTP = { 0.40, 0.40, 0.40 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - return damage + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/self-destruct_cluster_razon.lua b/scripts/actions/mobskills/self-destruct_cluster_razon.lua index 4dc133a767b..a9b33866ef1 100644 --- a/scripts/actions/mobskills/self-destruct_cluster_razon.lua +++ b/scripts/actions/mobskills/self-destruct_cluster_razon.lua @@ -1,9 +1,8 @@ ----------------------------------- -- Self-Destruct (Fire in the Sky) +-- Family: Cluster -- Description: Deals massive fire damage to enemies within range. Damage scales 1:1 with remaining HP. --- Type: Magical Fire -- Range: 10' --- Utsusemi/Blink absorb: Ignores shadows -- Notes: Used by Razon in ENM "Fire in the Sky" when final self-destruct is triggered. Results in immediate ejection from the battlefield. ----------------------------------- ---@type TMobSkill @@ -13,15 +12,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getHP() * 2 +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - local info = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.FIRE, 1, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + params.baseDamage = skill:getMobHP() + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - return damage + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end + + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) diff --git a/scripts/actions/mobskills/seraph_blade.lua b/scripts/actions/mobskills/seraph_blade.lua index 3e337aa9a67..d7f6de1c79b 100644 --- a/scripts/actions/mobskills/seraph_blade.lua +++ b/scripts/actions/mobskills/seraph_blade.lua @@ -7,25 +7,27 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - mob:messageBasic(xi.msg.basic.READIES_WS, 0, 37) + -- mob:messageBasic(xi.msg.basic.READIES_WS, 0, 37) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, 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.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 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/shadow_burst.lua b/scripts/actions/mobskills/shadow_burst.lua index f8be8399197..acd03c09809 100644 --- a/scripts/actions/mobskills/shadow_burst.lua +++ b/scripts/actions/mobskills/shadow_burst.lua @@ -15,25 +15,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.CURSE_I, 50, 0, 300) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/shantotto_ii_melee.lua b/scripts/actions/mobskills/shantotto_ii_melee.lua index 2c3c1167772..9e07e824654 100644 --- a/scripts/actions/mobskills/shantotto_ii_melee.lua +++ b/scripts/actions/mobskills/shantotto_ii_melee.lua @@ -8,24 +8,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 1.0, 1.0, 1.0 } -- TODO: Capture fTPs - params.element = xi.element.NONE - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getWeaponDmg() -- TODO: capture damage + params.fTP = { 1.0, 1.0, 1.0 } -- TODO: Capture fTPs + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior + params.primaryMessage = xi.msg.basic.HIT_DMG - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Set once params passed to mobFinalAdjustments - - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/shining_blade.lua b/scripts/actions/mobskills/shining_blade.lua index 9ab52e572b0..dc0fe4ba6cf 100644 --- a/scripts/actions/mobskills/shining_blade.lua +++ b/scripts/actions/mobskills/shining_blade.lua @@ -7,26 +7,28 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - mob:messageBasic(xi.msg.basic.READIES_WS, 0, 36) + -- mob:messageBasic(xi.msg.basic.READIES_WS, 0, 36) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, 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.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 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.LIGHT, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.LIGHT) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/shock_wave.lua b/scripts/actions/mobskills/shock_wave.lua deleted file mode 100644 index 98aa0a9b7fe..00000000000 --- a/scripts/actions/mobskills/shock_wave.lua +++ /dev/null @@ -1,35 +0,0 @@ ------------------------------------ --- Shock Wave --- Family: Behemoth --- Description: Deals damage in a frontal area of effect. Additional Effect: Knockback --- Notes: TODO: The mob seems to turn towards the target when using this skill even if they are behind it and in auto range. https://youtu.be/pazG7AJ6jV8?t=986 ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - if target:isBehind(mob, 48) then - return 1 - end - - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} - - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 0.6, 0.6, 0.6 } - params.element = xi.element.WIND - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - end - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/shock_wave_behemoth.lua b/scripts/actions/mobskills/shock_wave_behemoth.lua new file mode 100644 index 00000000000..4d7d11f0d50 --- /dev/null +++ b/scripts/actions/mobskills/shock_wave_behemoth.lua @@ -0,0 +1,37 @@ +----------------------------------- +-- Shock Wave +-- Family: Behemoth +-- Description: Deals damage in a frontal area of effect. Additional Effect: Knockback +-- Notes: TODO: The mob seems to turn towards the target when using this skill even if they are behind it and in auto range. https://youtu.be/pazG7AJ6jV8?t=986 +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + if target:isBehind(mob, 48) then + return 1 + end + + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 0.6, 0.6, 0.6 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + 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) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/silencing_microtube.lua b/scripts/actions/mobskills/silencing_microtube.lua index 023c83f14c8..06bd7c8c93c 100644 --- a/scripts/actions/mobskills/silencing_microtube.lua +++ b/scripts/actions/mobskills/silencing_microtube.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) -local params = {} +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 12.25, 12.25, 12.25 } -- TODO: Capture fTPs - params.element = xi.element.NONE -- TODO: Capture Element + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 12.25, 12.25, 12.25 } -- TODO: Capture fTPs + params.element = xi.element.NONE -- TODO: Capture Element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture durations xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/siphon_discharge.lua b/scripts/actions/mobskills/siphon_discharge.lua index dfa65e70506..0a76c324a0e 100644 --- a/scripts/actions/mobskills/siphon_discharge.lua +++ b/scripts/actions/mobskills/siphon_discharge.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/slaverous_gale.lua b/scripts/actions/mobskills/slaverous_gale.lua index 172cde0fd16..3f1bce4b99b 100644 --- a/scripts/actions/mobskills/slaverous_gale.lua +++ b/scripts/actions/mobskills/slaverous_gale.lua @@ -10,26 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5.0, 5.0, 5.0 } - params.element = xi.element.EARTH - -- TODO: JP wiki says this can miss and may be a physical skill. Need more captures to confirm. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.0, 5.0, 5.0 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + 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.PLAGUE, 5, 3, 120) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLOW, 5000, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/sleet_blast.lua b/scripts/actions/mobskills/sleet_blast.lua index 14a935d1583..a1cc6cd61ca 100644 --- a/scripts/actions/mobskills/sleet_blast.lua +++ b/scripts/actions/mobskills/sleet_blast.lua @@ -15,21 +15,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5, 5, 5 } - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5, 5, 5 } + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/sleet_blast_alt.lua b/scripts/actions/mobskills/sleet_blast_alt.lua index 6176e4dc973..1ee6064139c 100644 --- a/scripts/actions/mobskills/sleet_blast_alt.lua +++ b/scripts/actions/mobskills/sleet_blast_alt.lua @@ -11,23 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4, 4, 4 } - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4, 4, 4 } + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.primaryMessage = xi.msg.basic.HIT_DMG - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) - - skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Handle in mobFinalAdjustments once we pass params + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/smoke_discharger.lua b/scripts/actions/mobskills/smoke_discharger.lua index f1b092aede7..92cc254d216 100644 --- a/scripts/actions/mobskills/smoke_discharger.lua +++ b/scripts/actions/mobskills/smoke_discharger.lua @@ -28,7 +28,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, 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.PETRIFICATION, 1, 0, 45) + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.PETRIFICATION, 1, 3, 45) if target:hasStatusEffect(xi.effect.ELEMENTALRES_DOWN) then target:delStatusEffectSilent(xi.effect.ELEMENTALRES_DOWN) diff --git a/scripts/actions/mobskills/smouldering_swarm.lua b/scripts/actions/mobskills/smouldering_swarm.lua index 95721d450da..e99245bbd53 100644 --- a/scripts/actions/mobskills/smouldering_swarm.lua +++ b/scripts/actions/mobskills/smouldering_swarm.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } -- TODO: Capture fTPs - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } -- TODO: Capture fTPs + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Verify duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 10, 3, 90) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/snort.lua b/scripts/actions/mobskills/snort.lua index 4b26ddfb61a..a4ff1d63e75 100644 --- a/scripts/actions/mobskills/snort.lua +++ b/scripts/actions/mobskills/snort.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.0, 4.0, 4.0 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- params.dStatMultiplier = 1 TODO: Possible dINT multiplier, need more captures. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/snort_2127.lua b/scripts/actions/mobskills/snort_2127.lua index f0a0efe8381..2e07b2894c4 100644 --- a/scripts/actions/mobskills/snort_2127.lua +++ b/scripts/actions/mobskills/snort_2127.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Snort -- Family: Buffalo --- Description: Deals Wind damage to targets in a fan-shaped area of effect. Additional effect: Knockback +-- Description: Deals Wind damage to targets in a fan-shaped area of effect. Additional Effect: Knockback -- Note: Shows as a regular attack and lowers enmity ----------------------------------- ---@type TMobSkill @@ -11,25 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.0, 4.0, 4.0 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.primaryMessage = xi.msg.basic.HIT_DMG -- params.dStatMultiplier = 1 TODO: Possible dINT multiplier, need more captures. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) - skill:setMsg(xi.msg.basic.HIT_DMG) mob:lowerEnmity(target, 25) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/snow_cloud.lua b/scripts/actions/mobskills/snow_cloud.lua index dab6f2f8005..d28906b3ca9 100644 --- a/scripts/actions/mobskills/snow_cloud.lua +++ b/scripts/actions/mobskills/snow_cloud.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.0, 2.0, 2.0 } - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + 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, 30, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/snowball.lua b/scripts/actions/mobskills/snowball.lua index 5767a3556ac..efcf9626b70 100644 --- a/scripts/actions/mobskills/snowball.lua +++ b/scripts/actions/mobskills/snowball.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.5, 2.5, 2.5 } - params.element = xi.element.ICE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.5, 2.5, 2.5 } + params.element = xi.element.ICE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ICE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/somnolence.lua b/scripts/actions/mobskills/somnolence.lua index 97cd0e36a8c..bbae740fe84 100644 --- a/scripts/actions/mobskills/somnolence.lua +++ b/scripts/actions/mobskills/somnolence.lua @@ -10,24 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.50, 1.50, 1.50 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + -- TODO: Need animation ID capture - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.WEIGHT, 25, 0, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/sonic_buffet.lua b/scripts/actions/mobskills/sonic_buffet.lua index 0f805972d51..3c908f3ec0d 100644 --- a/scripts/actions/mobskills/sonic_buffet.lua +++ b/scripts/actions/mobskills/sonic_buffet.lua @@ -9,26 +9,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.50, 2.50, 2.50 } -- TODO: Capture fTPs - params.element = xi.element.WIND - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.50, 2.50, 2.50 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) for i = 1, math.random(2, 3) do target:dispelStatusEffect(xi.effectFlag.DISPELABLE) end end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/soul_drain.lua b/scripts/actions/mobskills/soul_drain.lua index b173422ea1f..9fe3307e0ff 100644 --- a/scripts/actions/mobskills/soul_drain.lua +++ b/scripts/actions/mobskills/soul_drain.lua @@ -10,22 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 1.5, 1.5, 1.5 } - params.element = xi.element.DARK - -- TODO: This is a physical skill. Will fix in mobPhysicalMove() PR + -- TODO: Jimmayus spreadsheet says this is physical? Need testing. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/soulshattering_roar.lua b/scripts/actions/mobskills/soulshattering_roar.lua index 818842b4c26..77b93eed980 100644 --- a/scripts/actions/mobskills/soulshattering_roar.lua +++ b/scripts/actions/mobskills/soulshattering_roar.lua @@ -10,19 +10,21 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs - params.element = xi.element.DARK -- TODO: Capture element if skill is a magicalMove + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs + params.element = xi.element.DARK -- TODO: Capture element if skill is a magicalMove + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture Skill range and AoE Radius - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) -- TODO: Is move magical or physical? Need captures - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.TERROR, 1, 0, 30) -- TODO: Capture duration end @@ -30,7 +32,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) -- TODO: Temporary immunity to a single weapon damage type -- Note: This should probably be handled in a mixin or within the mob script. - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/spirit_absorption.lua b/scripts/actions/mobskills/spirit_absorption.lua deleted file mode 100644 index 8ca76e39641..00000000000 --- a/scripts/actions/mobskills/spirit_absorption.lua +++ /dev/null @@ -1,30 +0,0 @@ ------------------------------------ --- Spirit Absorption --- Family: Gorgers --- Description: Deals Dark damage to a target. Additional Effect: HP Drain ------------------------------------ ----@type TMobSkill -local mobskillObject = {} - -mobskillObject.onMobSkillCheck = function(target, mob, skill) - return 0 -end - -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} - - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.5, 3.5, 3.5 } - params.element = xi.element.DARK - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) - end - - return damage -end - -return mobskillObject diff --git a/scripts/actions/mobskills/spirit_absorption_gorger.lua b/scripts/actions/mobskills/spirit_absorption_gorger.lua new file mode 100644 index 00000000000..2b410b68936 --- /dev/null +++ b/scripts/actions/mobskills/spirit_absorption_gorger.lua @@ -0,0 +1,33 @@ +----------------------------------- +-- Spirit Absorption +-- Family: Gorgers +-- Description: Drains HP from a target. +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} + + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.5, 3.5, 3.5 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.skipMagicBonusDiff = true + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) + end + + return info.damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/spirit_absorption_thinker.lua b/scripts/actions/mobskills/spirit_absorption_thinker.lua index 6853dad4c30..c510bc9e5ba 100644 --- a/scripts/actions/mobskills/spirit_absorption_thinker.lua +++ b/scripts/actions/mobskills/spirit_absorption_thinker.lua @@ -1,9 +1,7 @@ ----------------------------------- -- Spirit Absorption --- Deals elemental damage to the target. Additional effect: Drain. --- Type: Magical --- Utsusemi/Blink absorb: 1 Shadows --- Range: Melee +-- Family: Thinker +-- Description: Drains HP from a target. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,13 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() * 2, xi.element.DARK, 1, xi.mobskills.magicalTpBonus.NO_EFFECT, 0) - local dmg = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, dmg)) + params.baseDamage = mob:getMainLvl() + params.fTP = { 2.0, 2.0, 2.0 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 + params.skipMagicBonusDiff = true - return dmg + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) + end + + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/spirits_within.lua b/scripts/actions/mobskills/spirits_within.lua index 9a053330709..0ec94531a10 100644 --- a/scripts/actions/mobskills/spirits_within.lua +++ b/scripts/actions/mobskills/spirits_within.lua @@ -18,6 +18,8 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) + -- 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 diff --git a/scripts/actions/mobskills/static_filament.lua b/scripts/actions/mobskills/static_filament.lua index 14b19c9b327..78f3a303877 100644 --- a/scripts/actions/mobskills/static_filament.lua +++ b/scripts/actions/mobskills/static_filament.lua @@ -11,25 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.0, 1.5, 2.0 } - params.element = xi.element.THUNDER - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.0, 1.5, 2.0 } + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.STUN, 1, 0, 4) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/stellar_burst.lua b/scripts/actions/mobskills/stellar_burst.lua index cb00f300691..225fc177b3a 100644 --- a/scripts/actions/mobskills/stellar_burst.lua +++ b/scripts/actions/mobskills/stellar_burst.lua @@ -10,26 +10,30 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.0, 3.0, 3.0 } - params.element = xi.element.NONE -- TODO: Capture element + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.0, 3.0, 3.0 } + params.element = xi.element.NONE -- TODO: Capture element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + 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 xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SILENCE, 1, 0, 30) + -- TODO: Should trusts be excluded? if not target:isTrust() then mob:resetEnmity(target) end end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/stone_ii.lua b/scripts/actions/mobskills/stone_ii.lua index f43e6f09953..ab7e0f421d8 100644 --- a/scripts/actions/mobskills/stone_ii.lua +++ b/scripts/actions/mobskills/stone_ii.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/stone_iv.lua b/scripts/actions/mobskills/stone_iv.lua index 751fb2a64c6..e4fbba227bf 100644 --- a/scripts/actions/mobskills/stone_iv.lua +++ b/scripts/actions/mobskills/stone_iv.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8.0, 8.0, 8.0 } -- TODO: Capture fTPs - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8.0, 8.0, 8.0 } -- TODO: Capture fTPs + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/stone_meeble_warble.lua b/scripts/actions/mobskills/stone_meeble_warble.lua index 564cd78f5c8..b70dda23e96 100644 --- a/scripts/actions/mobskills/stone_meeble_warble.lua +++ b/scripts/actions/mobskills/stone_meeble_warble.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 16.00, 16.00, 16.00 } -- TODO: Capture fTPs - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 16.00, 16.00, 16.00 } -- TODO: Capture fTPs + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture power/durations xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PETRIFICATION, 30, 0, 60) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.RASP, 50, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/storm_wing.lua b/scripts/actions/mobskills/storm_wing.lua index c7390bef513..3afc13fb523 100644 --- a/scripts/actions/mobskills/storm_wing.lua +++ b/scripts/actions/mobskills/storm_wing.lua @@ -10,24 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } - params.element = xi.element.WIND - -- TODO: Capture knockback value. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.SILENCE, 1, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/stormwind.lua b/scripts/actions/mobskills/stormwind.lua index 208320a7098..7568cfa2f97 100644 --- a/scripts/actions/mobskills/stormwind.lua +++ b/scripts/actions/mobskills/stormwind.lua @@ -10,16 +10,17 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 3.00, 3.00, 3.00 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - - if mob:getPool() == xi.mobPools.KREUTZET then + if mob:getPool() == xi.mobPool.KREUTZET then local stormwindDamage = mob:getLocalVar('stormwindDamage') -- TODO: Maybe change name of localVar to stormwindCounter for clarity. if stormwindDamage == 2 then @@ -29,15 +30,15 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) end end - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Nightmare Rocs apply Silence. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/stun_cannon.lua b/scripts/actions/mobskills/stun_cannon.lua index 9c6575429f4..fec6821c9aa 100644 --- a/scripts/actions/mobskills/stun_cannon.lua +++ b/scripts/actions/mobskills/stun_cannon.lua @@ -14,24 +14,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.50, 4.50, 4.50 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER + -- TODO: Capture if Magical or Physical + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.50, 4.50, 4.50 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture AoE type - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) -- TODO: Capture if Magical or Physical - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + 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, 20, 0, 120) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/stupor_spores.lua b/scripts/actions/mobskills/stupor_spores.lua index d329040a9a1..e63c78590f7 100644 --- a/scripts/actions/mobskills/stupor_spores.lua +++ b/scripts/actions/mobskills/stupor_spores.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Stupor Spores -- Family: Euvhi --- Description: Spreads intoxicating spores that damages nearby targets. Additional effect: Sleep +-- Description: Spreads intoxicating spores that damages nearby targets. Additional Effect: Sleep ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 1.00, 1.00, 1.00 } params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.ELEMENTAL + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + 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.SLEEP_I, 1, 0, math.random(15, 60)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/subsonics.lua b/scripts/actions/mobskills/subsonics.lua index 761f3c95e2d..ebcc1b1fbfb 100644 --- a/scripts/actions/mobskills/subsonics.lua +++ b/scripts/actions/mobskills/subsonics.lua @@ -6,6 +6,7 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) + -- TODO: This is used by normal bats in COP/TOAU zones. Need to seperate skill lists. if mob:isMobType(xi.mobType.NOTORIOUS) then return 0 end diff --git a/scripts/actions/mobskills/sweeping_somnolence.lua b/scripts/actions/mobskills/sweeping_somnolence.lua index ced7ad6c73e..b3c8b24af2e 100644 --- a/scripts/actions/mobskills/sweeping_somnolence.lua +++ b/scripts/actions/mobskills/sweeping_somnolence.lua @@ -9,23 +9,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.50, 1.50, 1.50 } -- TODO: Capture fTPs - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } -- TODO: Capture fTPs + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + -- TODO: Need animation ID capture - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + 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.WEIGHT, 25, 0, 60) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/tebbad_wing.lua b/scripts/actions/mobskills/tebbad_wing.lua index e730dcbe933..a13312084d7 100644 --- a/scripts/actions/mobskills/tebbad_wing.lua +++ b/scripts/actions/mobskills/tebbad_wing.lua @@ -19,23 +19,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.00, 4.00, 4.00 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.00, 4.00, 4.00 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + 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.PLAGUE, 10, 0, 120) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/tebbad_wing_air.lua b/scripts/actions/mobskills/tebbad_wing_air.lua index c0afd6c0fd3..6219b79d32b 100644 --- a/scripts/actions/mobskills/tebbad_wing_air.lua +++ b/scripts/actions/mobskills/tebbad_wing_air.lua @@ -15,23 +15,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 6.00, 6.00, 6.00 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 6.00, 6.00, 6.00 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + 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.PLAGUE, 10, 0, 120) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/tempest_wing.lua b/scripts/actions/mobskills/tempest_wing.lua index d5cc4a4d74c..c9bb15d4dca 100644 --- a/scripts/actions/mobskills/tempest_wing.lua +++ b/scripts/actions/mobskills/tempest_wing.lua @@ -1,7 +1,7 @@ ----------------------------------- -- Tempest Wing -- Family: Bahamut --- Description: Turbulence deals Wind damage to enemies in front of mob. Additional effect: Blind, Knockback +-- Description: Turbulence deals Wind damage to enemies in front of mob. Additional Effect: Blind, Knockback ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -14,25 +14,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 4.75, 4.75, 4.75 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + params.fTP = { 4.75, 4.75, 4.75 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Forces mob to face target. - -- TODO: Capture knockback range - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.BLINDNESS, 50, 0, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/tempestuous_upheaval.lua b/scripts/actions/mobskills/tempestuous_upheaval.lua index bf912fe92f2..fa72a938019 100644 --- a/scripts/actions/mobskills/tempestuous_upheaval.lua +++ b/scripts/actions/mobskills/tempestuous_upheaval.lua @@ -11,21 +11,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.1, 2.10, 2.10 } -- TODO: Capture fTPs - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.10, 2.10, 2.10 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/teraflare.lua b/scripts/actions/mobskills/teraflare.lua index fd213678dc2..b9c9d1afa3e 100644 --- a/scripts/actions/mobskills/teraflare.lua +++ b/scripts/actions/mobskills/teraflare.lua @@ -12,7 +12,7 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() @@ -20,15 +20,17 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) params.element = xi.element.FIRE params.dStatMultiplier = 1.5 -- TODO: Capture AoE type. + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thermal_pulse.lua b/scripts/actions/mobskills/thermal_pulse.lua index 82f11e5be83..54808db17bc 100644 --- a/scripts/actions/mobskills/thermal_pulse.lua +++ b/scripts/actions/mobskills/thermal_pulse.lua @@ -15,25 +15,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.5, 4.5, 4.5 } - params.element = xi.element.FIRE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.5, 4.5, 4.5 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) local duration = xi.mobskills.calculateDuration(skill:getTP(), 30, 90) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 100, 0, duration) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thunder_break.lua b/scripts/actions/mobskills/thunder_break.lua index 6a33fba7cce..91afae3d14d 100644 --- a/scripts/actions/mobskills/thunder_break.lua +++ b/scripts/actions/mobskills/thunder_break.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTP scaling - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTP scaling + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + 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, math.random(10, 20)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thunder_break_2129.lua b/scripts/actions/mobskills/thunder_break_2129.lua index 3fcab178d4f..a6bb7c7f6d4 100644 --- a/scripts/actions/mobskills/thunder_break_2129.lua +++ b/scripts/actions/mobskills/thunder_break_2129.lua @@ -11,26 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTP Scaling - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTP Scaling + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + params.primaryMessage = xi.msg.basic.HIT_DMG - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture stun duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) - - skill:setMsg(xi.msg.basic.HIT_DMG) -- TODO: Move to mobFinalAdjustments in future. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thunder_ii.lua b/scripts/actions/mobskills/thunder_ii.lua index c534b59afb3..f8014469b45 100644 --- a/scripts/actions/mobskills/thunder_ii.lua +++ b/scripts/actions/mobskills/thunder_ii.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thunder_iv.lua b/scripts/actions/mobskills/thunder_iv.lua index bbae1941515..053290dcd49 100644 --- a/scripts/actions/mobskills/thunder_iv.lua +++ b/scripts/actions/mobskills/thunder_iv.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thunder_meeble_warble.lua b/scripts/actions/mobskills/thunder_meeble_warble.lua index e93960e4f43..4ade7d32675 100644 --- a/scripts/actions/mobskills/thunder_meeble_warble.lua +++ b/scripts/actions/mobskills/thunder_meeble_warble.lua @@ -10,26 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 18.00, 18.00, 18.00 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 18.00, 18.00, 18.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Capture effect power/duration xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SHOCK, 50, 3, 60) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 30, 0, 15) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thunderbolt_behemoth.lua b/scripts/actions/mobskills/thunderbolt_behemoth.lua index 8930de77ffa..f37c322d0aa 100644 --- a/scripts/actions/mobskills/thunderbolt_behemoth.lua +++ b/scripts/actions/mobskills/thunderbolt_behemoth.lua @@ -10,24 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 0.6, 0.6, 0.6 } - params.element = xi.element.THUNDER - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 0.6, 0.6, 0.6 } + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + 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, math.random(8, 14)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thunderspark.lua b/scripts/actions/mobskills/thunderspark.lua index 943a65d67dd..2d46e25e879 100644 --- a/scripts/actions/mobskills/thunderspark.lua +++ b/scripts/actions/mobskills/thunderspark.lua @@ -10,24 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + 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, 30, 0, 60) -- TODO: Capture power/durations end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thunderstorm.lua b/scripts/actions/mobskills/thunderstorm.lua index b52f2eed99f..894a746c9fc 100644 --- a/scripts/actions/mobskills/thunderstorm.lua +++ b/scripts/actions/mobskills/thunderstorm.lua @@ -10,23 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER - -- TODO: Capture AoE type - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior + -- TODO: Capture AOE type - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thunderstrike.lua b/scripts/actions/mobskills/thunderstrike.lua index b9777c1511d..d085ab0de67 100644 --- a/scripts/actions/mobskills/thunderstrike.lua +++ b/scripts/actions/mobskills/thunderstrike.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 9.00, 9.00, 9.00 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 9.00, 9.00, 9.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + 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) -- TODO: Capture duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/thundris_shriek.lua b/scripts/actions/mobskills/thundris_shriek.lua index a7833e21392..7c92ba6b256 100644 --- a/scripts/actions/mobskills/thundris_shriek.lua +++ b/scripts/actions/mobskills/thundris_shriek.lua @@ -11,24 +11,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 5.00, 5.00, 5.00 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 5.00, 5.00, 5.00 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - -- TODO: Mob gains Humanoid Killer effect after using this skill. + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) + 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.TERROR, 1, 0, 15) -- TODO: Capture duration + -- TODO: Mob gains Humanoid Killer effect after using this skill. end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/tidal_slash.lua b/scripts/actions/mobskills/tidal_slash.lua index b203a9b17b4..b645ab58643 100644 --- a/scripts/actions/mobskills/tidal_slash.lua +++ b/scripts/actions/mobskills/tidal_slash.lua @@ -1,9 +1,9 @@ ----------------------------------- -- Tidal Slash --- Deals water damage conal --- Type: Magical --- Only used when wielding a spear --- Utsusemi/Blink absorb: 2-3 shadow +-- Family: Lamia +-- Description: Deals physical damage to enemies in front of mob. +-- Notes: Only used when wielding a spear. +-- Zanshin auto attack can proc on this. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,7 +11,7 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) if mob:getAnimationSub() ~= 1 and - mob:getMainJob() == xi.job.SAM + mob:getMainJob() == xi.job.SAM -- TODO: Set proper skill lists then return 0 else @@ -19,22 +19,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() + 2 - params.fTP = { 9.9, 9.9, 9.9 } - params.element = xi.element.WATER -- TODO: This is a physical skill, will fix in mobPhysicalMove() PR + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 1.5, 1.5, 1.5 } + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/tidal_wave.lua b/scripts/actions/mobskills/tidal_wave.lua index 0d7a2ed83bc..35f11b6e939 100644 --- a/scripts/actions/mobskills/tidal_wave.lua +++ b/scripts/actions/mobskills/tidal_wave.lua @@ -10,22 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 9, 9, 9 } params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/torrential_torment.lua b/scripts/actions/mobskills/torrential_torment.lua index c7982efe9f9..01b57517620 100644 --- a/scripts/actions/mobskills/torrential_torment.lua +++ b/scripts/actions/mobskills/torrential_torment.lua @@ -10,24 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.00, 2.00, 2.00 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + end for i = xi.slot.MAIN, xi.slot.BACK do target:unequipItem(i) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/touchdown.lua b/scripts/actions/mobskills/touchdown.lua index b06c0978da6..82a2bee3dff 100644 --- a/scripts/actions/mobskills/touchdown.lua +++ b/scripts/actions/mobskills/touchdown.lua @@ -10,29 +10,29 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.50, 1.50, 1.50 } - params.element = xi.element.NONE + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end mobskillObject.onMobSkillFinalize = function(mob, skill) mob:delStatusEffect(xi.effect.ALL_MISS) mob:setMobSkillAttack(0) skill:setFinalAnimationSub(2) - - return damage end return mobskillObject diff --git a/scripts/actions/mobskills/touchdown_bahamut.lua b/scripts/actions/mobskills/touchdown_bahamut.lua index 81874299b6c..d26cdf851f3 100644 --- a/scripts/actions/mobskills/touchdown_bahamut.lua +++ b/scripts/actions/mobskills/touchdown_bahamut.lua @@ -1,5 +1,6 @@ ----------------------------------- -- Touchdown +-- Family: Bahamut -- Description: Deals magical damage to enemies in an area of effect. -- Further Notes: Bahamut can use this as a regular move at will. ----------------------------------- @@ -10,22 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.50, 1.50, 1.50 } - params.element = xi.element.NONE -- TODO: Jimmayus spreadsheet says this is physical. Handle in mobPhysicalMove() PR + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/tp_drainkiss.lua b/scripts/actions/mobskills/tp_drainkiss.lua index 804435e8c61..1b5c988f169 100644 --- a/scripts/actions/mobskills/tp_drainkiss.lua +++ b/scripts/actions/mobskills/tp_drainkiss.lua @@ -10,29 +10,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = target:getTP() - params.fTP = { 0.500, 0.666, 0.833 } - params.element = xi.element.DARK - - -- From captures, this TP Drains don't seem to be affected by these. - params.skipTMDA = true - params.skipResist = true - params.skipDayWeather = true - params.skipMagicBonusDiff = true - -- TODO: This skill should penetrate/deal no damage to stoneskin. - -- Need to pass a param into mobFinalAdjustments in the future. - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.TP, damage)) + params.baseDamage = target:getTP() + params.fTP = { 0.500, 0.666, 0.833 } -- TODO: Need more capture samples + -- Note: This has been observed to absorb less than 50% TP(1400~ @ Player: 3000TP, Mob 1000 TP) + -- Also seen to absorb 2000+ TP at Player: 3000% TP, Mob 3000% TP. Interpolating the 2000 TP anchor linearly for now. + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS + params.skipDamageAdjustment = true + params.skipMagicBonusDiff = true + params.skipStoneSkin = true + + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) + + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.TP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/transfusion.lua b/scripts/actions/mobskills/transfusion.lua index 80cbf71ba27..5a3d86ad8ac 100644 --- a/scripts/actions/mobskills/transfusion.lua +++ b/scripts/actions/mobskills/transfusion.lua @@ -1,9 +1,7 @@ ----------------------------------- --- Transfusion --- Description: Steals HP from players within range. --- Type: Magical --- Utsusemi/Blink absorb: Ignores shadows --- Range: Unknown radial +-- Transfusion +-- Family: Shadow Lord +-- Description: Steals HP from players within range. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -12,25 +10,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs - params.element = xi.element.DARK - - -- From captures, this HP Drains don't seem to be affected by these. - params.skipResist = true + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/tremors.lua b/scripts/actions/mobskills/tremors.lua index 2ac046f9bd0..1677c6b6162 100644 --- a/scripts/actions/mobskills/tremors.lua +++ b/scripts/actions/mobskills/tremors.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.50, 1.50, 1.50 } - params.element = xi.element.EARTH + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } + params.element = xi.element.EARTH + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.EARTH + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - -- TODO: Dynamis - Nightmare Worm fTPs + -- TODO: Nightmare Worm version - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.EARTH, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.EARTH) + 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.DEX_DOWN, 10, 9, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/trinary_absorption.lua b/scripts/actions/mobskills/trinary_absorption.lua index 56d6236a2b3..71894407422 100644 --- a/scripts/actions/mobskills/trinary_absorption.lua +++ b/scripts/actions/mobskills/trinary_absorption.lua @@ -8,7 +8,7 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) if - mob:isMobType(xi.mobType.NOTORIOUS) or -- TODO: Set skill lists + mob:isMobType(xi.mobType.NOTORIOUS) or -- TODO: Set proper skill lists target:hasStatusEffect(xi.effect.BATTLEFIELD) then return 0 @@ -17,25 +17,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() - params.fTP = { 5.0, 5.0, 5.0 } - params.element = xi.element.DARK - - -- From captures, this HP Drains don't seem to be affected by these. - params.skipResist = true + params.baseDamage = mob:getMainLvl() + params.fTP = { 5.0, 5.0, 5.0 } + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1 params.skipMagicBonusDiff = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.NUMSHADOWS_1, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/trinary_tap.lua b/scripts/actions/mobskills/trinary_tap.lua index f52bc85d0ed..413aeccf7d0 100644 --- a/scripts/actions/mobskills/trinary_tap.lua +++ b/scripts/actions/mobskills/trinary_tap.lua @@ -11,7 +11,7 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) if - mob:isMobType(xi.mobType.NOTORIOUS) or + mob:isMobType(xi.mobType.NOTORIOUS) or -- TODO: Set Skill lists target:hasStatusEffect(xi.effect.BATTLEFIELD) then return 0 diff --git a/scripts/actions/mobskills/turbofan.lua b/scripts/actions/mobskills/turbofan.lua index a1a8d86c003..baee54e2263 100644 --- a/scripts/actions/mobskills/turbofan.lua +++ b/scripts/actions/mobskills/turbofan.lua @@ -2,7 +2,6 @@ -- Turbofan -- Family: Ultima -- Description: Deals Wind damage to targets in front of mob. Additional Effect: Silence --- additional effect : Silence. ----------------------------------- ---@type TMobSkill local mobskillObject = {} diff --git a/scripts/actions/mobskills/turbulence.lua b/scripts/actions/mobskills/turbulence.lua index 04eac4290f2..b0efcf92930 100644 --- a/scripts/actions/mobskills/turbulence.lua +++ b/scripts/actions/mobskills/turbulence.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTP scalings. - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTP scalings. + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/typhoon_wing.lua b/scripts/actions/mobskills/typhoon_wing.lua index 7b836251e1c..616cdb67803 100644 --- a/scripts/actions/mobskills/typhoon_wing.lua +++ b/scripts/actions/mobskills/typhoon_wing.lua @@ -18,23 +18,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.50, 5.00, 5.50 } - params.element = xi.element.WIND -- TODO: Capture element + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.50, 5.00, 5.50 } + params.element = xi.element.WIND -- TODO: Capture element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.BLINDNESS, 60, 0, 30) -- TODO: Capture power/duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/tyrannic_blare.lua b/scripts/actions/mobskills/tyrannic_blare.lua index b10431bb13f..db635f6e54c 100644 --- a/scripts/actions/mobskills/tyrannic_blare.lua +++ b/scripts/actions/mobskills/tyrannic_blare.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 2.80, 2.80, 2.80 } -- TODO: Capture fTPs - params.element = xi.element.FIRE -- TODO: Capture element - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 -- TODO: Capture baseDamage + params.fTP = { 2.80, 2.80, 2.80 } -- TODO: Capture fTPs + params.element = xi.element.FIRE -- TODO: Capture element + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/unblest_jambiya.lua b/scripts/actions/mobskills/unblest_jambiya.lua index 7f20b6597dc..12c9545b32e 100644 --- a/scripts/actions/mobskills/unblest_jambiya.lua +++ b/scripts/actions/mobskills/unblest_jambiya.lua @@ -18,22 +18,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 2.00, 2.00, 2.00 } - params.element = xi.element.DARK -- TODO: This is a physical skill. Will fix in mobPhysicalMove() PR + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobPhysicalDrainMove(mob, target, skill, xi.mobskills.drainType.HP, info.damage)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/undead_mold.lua b/scripts/actions/mobskills/undead_mold.lua index 140382bbf1e..a1845ddf51a 100644 --- a/scripts/actions/mobskills/undead_mold.lua +++ b/scripts/actions/mobskills/undead_mold.lua @@ -10,25 +10,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.00, 2.00, 2.00 } -- TODO: Capture fTP scalings - params.element = xi.element.DARK + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.00, 2.00 } -- TODO: Capture fTP scalings + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Confirm whether this is physical or magical move. Jimmayus sheet says Unaspected Physical. JP Wiki says Dark. -- TODO: Confirm AoE type. Jimmayus sheet says single target. JP Wiki says forward cone. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.DARK) + 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.DISEASE, 1, 0, 660) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/vacuous_osculation.lua b/scripts/actions/mobskills/vacuous_osculation.lua index 6b9b4c6bf25..547902065b3 100644 --- a/scripts/actions/mobskills/vacuous_osculation.lua +++ b/scripts/actions/mobskills/vacuous_osculation.lua @@ -10,25 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.NONE - -- TODO: Capture shadow behavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.00, 1.00, 1.00 } -- TODO: Capture fTPs + params.element = xi.element.NONE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.PLAGUE, 5, 3, 30) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.POISON, 8, 3, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.PLAGUE, 5, 3, 30) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 8, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/vampiric_root.lua b/scripts/actions/mobskills/vampiric_root.lua index 69ab953c2d0..3e339e81f9d 100644 --- a/scripts/actions/mobskills/vampiric_root.lua +++ b/scripts/actions/mobskills/vampiric_root.lua @@ -14,19 +14,22 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return target:countEffectWithFlag(xi.effectFlag.DISPELABLE) > 0 and 0 or 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getWeaponDmg() - params.fTP = { 2.00, 2.00, 2.00 } - params.element = xi.element.DARK -- TODO: This is a physical skill. Will fix in mobPhysicalMove() PR + params.baseDamage = mob:getWeaponDmg() + params.fTP = { 2.00, 2.00, 2.00 } + params.element = xi.element.DARK + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.DARK + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior + -- Note: Ignores PDIF - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.DARK, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, damage)) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + skill:setMsg(xi.mobskills.mobDrainMove(mob, target, xi.mobskills.drainType.HP, info.damage)) -- Absorb ALL positive status effects -- Note: Some sources claim this includes food and reraise which has been proven to be false @@ -36,7 +39,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) end end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/venom.lua b/scripts/actions/mobskills/venom.lua index 863f6a18aad..c7b9cd04d04 100644 --- a/scripts/actions/mobskills/venom.lua +++ b/scripts/actions/mobskills/venom.lua @@ -10,18 +10,20 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.50, 1.50, 1.50 } - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.50, 1.50, 1.50 } + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Jugpet differences @@ -30,7 +32,7 @@ mobskillObject.onMobWeaponSkill = function(target, mob, skill) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 1, 3, 60) -- TODO: Capture duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/vitriolic_barrage.lua b/scripts/actions/mobskills/vitriolic_barrage.lua index 0b69b1a5b75..bb6c1643f11 100644 --- a/scripts/actions/mobskills/vitriolic_barrage.lua +++ b/scripts/actions/mobskills/vitriolic_barrage.lua @@ -11,27 +11,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = 1000 / skill:getTotalTargets() - params.fTP = { 1.00, 1.00, 1.00 } - params.element = xi.element.NONE -- TODO: Verify whether unaspected or elemental - + params.baseDamage = 1000 / skill:getTotalTargets() + params.fTP = { 1.00, 1.00, 1.00 } + params.element = xi.element.NONE -- TODO: Verify whether unaspected or elemental + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.NONE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- https://youtu.be/DgQrZQJEqDY?t=409 - -- Looks like it bypasses MDT(Shell). - params.skipTMDA = true + -- Looks like it bypasses MDT(Shell) but is reduced by MDEF + params.skipDamageAdjustment = true - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.NONE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.NONE) + 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, 18, 3, 180) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/vitriolic_shower.lua b/scripts/actions/mobskills/vitriolic_shower.lua index 797c06b11fd..724bd920034 100644 --- a/scripts/actions/mobskills/vitriolic_shower.lua +++ b/scripts/actions/mobskills/vitriolic_shower.lua @@ -11,24 +11,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 7.50, 7.50, 7.50 } params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1.33 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + 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.BURN, 30, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/vitriolic_spray.lua b/scripts/actions/mobskills/vitriolic_spray.lua index 80622c639b3..4702bcc9cd2 100644 --- a/scripts/actions/mobskills/vitriolic_spray.lua +++ b/scripts/actions/mobskills/vitriolic_spray.lua @@ -11,27 +11,29 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 4.50, 4.50, 4.50 } params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO: Is power random? Based off level? Different individuals? Need captures - -- Sources say Burn is 10-30/tic but don't go into depth. + -- Sources say Burn is 10-30/tic but does not go into depth. -- Personal captures showed 10/tick from Wamoura Prince(Mount Zhayolm). https://youtu.be/2H350wLAlFo?t=228 xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BURN, 10, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/voiceless_storm.lua b/scripts/actions/mobskills/voiceless_storm.lua index 1a6954614ef..ad0f9340d71 100644 --- a/scripts/actions/mobskills/voiceless_storm.lua +++ b/scripts/actions/mobskills/voiceless_storm.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 1.00, 1.00, 1.00 } params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.SILENCE, 1, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/vulcan_shot.lua b/scripts/actions/mobskills/vulcan_shot.lua index 7f721369aee..f001bb1218c 100644 --- a/scripts/actions/mobskills/vulcan_shot.lua +++ b/scripts/actions/mobskills/vulcan_shot.lua @@ -2,34 +2,37 @@ -- Vulcan Shot -- Family: Fomor -- Description: Fires an explosive bullet at targets in an area of effect. +-- Notes: Used by Ashu Talif Captain, possibly others. ----------------------------------- ---@type TMobSkill local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - mob:messageBasic(xi.msg.basic.READIES_WS, 0, 254) + mob:messageBasic(xi.msg.basic.READIES_WS, 0, 254) -- TODO: Needed? return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 32.00, 32.00, 32.00 } -- TODO: Capture fTPs (Original code was Weapon Damage * 4 * 8) - params.element = xi.element.FIRE -- TODO: Verify if magical or physical skill - -- TODO: Capture shadowBehavior -- TODO: Capture AoE Type or Single hit. - - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) - - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 32.00, 32.00, 32.00 } -- TODO: Capture fTPs (Original code was Weapon Damage * 4 * 8) + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior + -- TODO: Need animation ID capture + + 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 damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/vulcanian_impact.lua b/scripts/actions/mobskills/vulcanian_impact.lua index 5ca6f76ead3..f41f18874ab 100644 --- a/scripts/actions/mobskills/vulcanian_impact.lua +++ b/scripts/actions/mobskills/vulcanian_impact.lua @@ -1,7 +1,6 @@ -- Vulcanian Impact +-- Family: Bomb -- Description : Deals fire damage to a single target. --- Utsusemi/Blink absorb: Ignores Shadows --- Range: Melee -- Vulcanian Impact is only used by small or medium bombs. ----------------------------------- ---@type TMobSkill @@ -11,13 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local info = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.FIRE, 4, xi.mobskills.magicalTpBonus.MAB_BONUS, 1) - local damage = xi.mobskills.mobFinalAdjustments(info, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) + local params = {} - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.0, 4.0, 4.0 } + params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - return damage + 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/warped_wail.lua b/scripts/actions/mobskills/warped_wail.lua index 4705fb87361..6fdce211e09 100644 --- a/scripts/actions/mobskills/warped_wail.lua +++ b/scripts/actions/mobskills/warped_wail.lua @@ -11,26 +11,28 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs - params.element = xi.element.WIND -- TODO: Capture element. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs + params.element = xi.element.WIND -- TODO: Capture element. + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) -- TODO Capture power/duration of HP/MP Down. - -- From battle footage, it looks to be around 10-15%. (Hard to tell exact since player was gear swapping). + -- From found battle footage, it looks to be around 10-15%. (Hard to tell exact since player was gear swapping). xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.MAX_HP_DOWN, 50, 0, 300) xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.MAX_MP_DOWN, 50, 0, 300) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/water_bomb.lua b/scripts/actions/mobskills/water_bomb.lua index 2fafbe41ef9..7161cc016c8 100644 --- a/scripts/actions/mobskills/water_bomb.lua +++ b/scripts/actions/mobskills/water_bomb.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 2.00, 2.00, 2.00 } params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + 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.SILENCE, 1, 0, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/water_ii.lua b/scripts/actions/mobskills/water_ii.lua index 1b27bbd512b..cb90125e840 100644 --- a/scripts/actions/mobskills/water_ii.lua +++ b/scripts/actions/mobskills/water_ii.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs - params.element = xi.element.WATER - -- TODO: Do non astral flows use a dStatMultiplier? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3, 3, 3 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/water_iv.lua b/scripts/actions/mobskills/water_iv.lua index b1070559080..31a10ee4269 100644 --- a/scripts/actions/mobskills/water_iv.lua +++ b/scripts/actions/mobskills/water_iv.lua @@ -10,22 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs - params.element = xi.element.WATER - -- TODO: Do non astral flows use a dStatMultiplier? + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8, 8, 8 } -- TODO: Capture fTPs + 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, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/water_meeble_warble.lua b/scripts/actions/mobskills/water_meeble_warble.lua index 8b1d48c29af..b7343c3d760 100644 --- a/scripts/actions/mobskills/water_meeble_warble.lua +++ b/scripts/actions/mobskills/water_meeble_warble.lua @@ -9,24 +9,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 18, 18, 18 } -- TODO: Capture fTPs - params.element = xi.element.WATER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 18, 18, 18 } -- TODO: Capture fTPs + params.element = xi.element.WATER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WATER + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WATER, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WATER) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) + -- TODO: Capture power/durations xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.DROWN, 50, 3, 60) xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.POISON, 50, 3, 60) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/whirlwind.lua b/scripts/actions/mobskills/whirlwind.lua index 29288570bbd..144331073a9 100644 --- a/scripts/actions/mobskills/whirlwind.lua +++ b/scripts/actions/mobskills/whirlwind.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 2.00, 2.50, 3.00 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 2.00, 2.50, 3.00 } + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.VIT_DOWN, 10, 9, 120) -- TODO: Capture duration end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/wind_blade.lua b/scripts/actions/mobskills/wind_blade.lua index 024e40223c2..a40b3297935 100644 --- a/scripts/actions/mobskills/wind_blade.lua +++ b/scripts/actions/mobskills/wind_blade.lua @@ -10,23 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs - params.element = xi.element.WIND - -- TODO: Does this have skillchain properties? - -- TODO: Capture shadowBehavior + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 8.00, 8.00, 8.00 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/wind_shear.lua b/scripts/actions/mobskills/wind_shear.lua index 85a2031c200..394a9476572 100644 --- a/scripts/actions/mobskills/wind_shear.lua +++ b/scripts/actions/mobskills/wind_shear.lua @@ -2,7 +2,7 @@ -- Wind Shear -- Family: Puks -- Description: Deals Wind damage to enemies within an area of effect. Additional Effect: Knockback --- Notes: The knockback is rather severe. Vulpangue uses an enhanced version that inflicts Weight. +-- Notes: The knockback is rather severe. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,23 +11,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.25, 1.50, 1.75 } -- TODO: Capture fTP scaling. - params.element = xi.element.WIND - -- TODO: Capture shadowBehavior. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.25, 1.50, 1.75 } -- TODO: Capture fTP scaling + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior. -- TODO: Jimmayus spreadsheet states if this is fully resisted, it misses(Knockback nullified as well?). + -- Might want to verify if physical or magical. Spreadsheet says Wind, JP Wiki says physical. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/wind_shear_znm.lua b/scripts/actions/mobskills/wind_shear_znm.lua index 734e25aecbf..2649817b22e 100644 --- a/scripts/actions/mobskills/wind_shear_znm.lua +++ b/scripts/actions/mobskills/wind_shear_znm.lua @@ -1,8 +1,8 @@ ----------------------------------- -- Wind Shear -- Family: Puks --- Description: Deals Wind damage to enemies within an area of effect. Additional Effect: Knockback --- Notes: The knockback is rather severe. Vulpangue uses an enhanced version that inflicts Weight. +-- Description: Deals Wind damage to enemies within an area of effect. Additional Effect: Knockback, Weight +-- Notes: The knockback is rather severe. Used by Vulpangue. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -11,25 +11,27 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 1.25, 1.50, 1.75 } -- TODO: Capture fTP scaling. - params.element = xi.element.WIND - -- TODO: Capture shadowBehavior. + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 1.25, 1.50, 1.75 } -- TODO: Capture fTP scaling + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS -- TODO: Capture shadowBehavior. -- TODO: Jimmayus spreadsheet states if this is fully resisted, it misses(Knockback nullified as well?). + -- Might want to verify if physical or magical. Spreadsheet says Wind, JP Wiki says physical. - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.NUMSHADOWS_3, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.WEIGHT, 50, 0, 120) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/wing_cutter.lua b/scripts/actions/mobskills/wing_cutter.lua index 8654c6a5f83..c4ca696c73d 100644 --- a/scripts/actions/mobskills/wing_cutter.lua +++ b/scripts/actions/mobskills/wing_cutter.lua @@ -10,21 +10,23 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 3.00, 3.00, 3.00 } - params.element = xi.element.WIND + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTP values + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/wings_of_gehenna.lua b/scripts/actions/mobskills/wings_of_gehenna.lua index 9d9063f6d85..6804b41d8b6 100644 --- a/scripts/actions/mobskills/wings_of_gehenna.lua +++ b/scripts/actions/mobskills/wings_of_gehenna.lua @@ -10,24 +10,26 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.00, 4.00, 4.00 } -- TODO: Capture fTPs - params.element = xi.element.WIND - -- TODO: Capture Knockback range + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.00, 4.00, 4.00 } -- TODO: Capture fTPs + params.element = xi.element.WIND + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.WIND + params.shadowBehavior = xi.mobskills.shadowBehavior.WIPE_SHADOWS + -- TODO: Capture knockback range - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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 damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/wrath_of_zeus.lua b/scripts/actions/mobskills/wrath_of_zeus.lua index d6f1811d43d..afa8d12393b 100644 --- a/scripts/actions/mobskills/wrath_of_zeus.lua +++ b/scripts/actions/mobskills/wrath_of_zeus.lua @@ -10,23 +10,25 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} - params.baseDamage = mob:getMainLvl() + 2 - params.fTP = { 4.50, 4.50, 4.50 } -- TODO: Capture fTPs - params.element = xi.element.THUNDER + params.baseDamage = mob:getMainLvl() + 2 + params.fTP = { 4.50, 4.50, 4.50 } -- TODO: Capture fTPs + params.element = xi.element.THUNDER + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.THUNDER + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + 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.SILENCE, 1, 0, xi.mobskills.calculateDuration(30, 60)) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/zarbzan.lua b/scripts/actions/mobskills/zarbzan.lua index 9fccf714e1e..afbb787097b 100644 --- a/scripts/actions/mobskills/zarbzan.lua +++ b/scripts/actions/mobskills/zarbzan.lua @@ -2,7 +2,7 @@ -- Zarbzan -- Family: Trolls -- Description: Deals Fire damage to target and their surrounding allies. --- Notes: Only used by Troll RNGs. This is an actual skill, not the regular ranged attack. +-- Notes: Only used by Troll RNGs. This is an actual mobskill, not the regular ranged attack. ----------------------------------- ---@type TMobSkill local mobskillObject = {} @@ -15,22 +15,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 1 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 params.fTP = { 2.00, 2.00, 2.00 } params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/actions/mobskills/zarraqa.lua b/scripts/actions/mobskills/zarraqa.lua index fe48db7121f..9c8ad0e8453 100644 --- a/scripts/actions/mobskills/zarraqa.lua +++ b/scripts/actions/mobskills/zarraqa.lua @@ -11,22 +11,24 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) return 0 end -mobskillObject.onMobWeaponSkill = function(target, mob, skill) +mobskillObject.onMobWeaponSkill = function(target, mob, skill, action) local params = {} params.baseDamage = mob:getMainLvl() + 2 -- TODO: Does this follow Level + 2 or mob's ranged weapon damage? params.fTP = { 2.00, 2.00, 2.00 } params.element = xi.element.FIRE + params.attackType = xi.attackType.MAGICAL + params.damageType = xi.damageType.FIRE + params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS -- TODO: Capture shadowBehavior params.dStatMultiplier = 1 - local info = xi.mobskills.mobMagicalMove(mob, target, skill, params) - local damage = xi.mobskills.mobFinalAdjustments(info.damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS, info.hitsLanded) + local info = xi.mobskills.mobMagicalMove(mob, target, skill, action, params) - if not xi.mobskills.hasMissMessage(mob, target, skill, damage) then - target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.FIRE) + if xi.mobskills.processDamage(mob, target, skill, action, info) then + target:takeDamage(info.damage, mob, info.attackType, info.damageType) end - return damage + return info.damage end return mobskillObject diff --git a/scripts/enum/mob_skill.lua b/scripts/enum/mob_skill.lua index 29260e5a507..e8e0943bb05 100644 --- a/scripts/enum/mob_skill.lua +++ b/scripts/enum/mob_skill.lua @@ -298,7 +298,7 @@ xi.mobSkill = QUADRATIC_CONTINUUM_2 = 742, - SPIRIT_ABSORPTION_2 = 745, + SPIRIT_ABSORPTION_GORGER_2 = 745, VANITY_DRIVE_2 = 748, diff --git a/scripts/globals/combat/action_additional_effect_damage.lua b/scripts/globals/combat/action_additional_effect_damage.lua index 84fa4c8e80b..1906613c17e 100644 --- a/scripts/globals/combat/action_additional_effect_damage.lua +++ b/scripts/globals/combat/action_additional_effect_damage.lua @@ -87,7 +87,7 @@ xi.combat.action.executeAddEffectDamage = function(actor, target, fedData) local multiplierDayWeather = xi.spells.damage.calculateDayAndWeather(actor, params.magicalElement, false) -- Calculate optional multipliers. - local multiplierMagicDiff = params.canMAB and xi.spells.damage.calculateMagicBonusDiff(actor, params.aeTarget, 0, 0, params.magicalElement) or 1 + local multiplierMagicDiff = params.canMAB and xi.spells.damage.calculateMagicBonusDiff(actor, params.aeTarget, 0, 0, params.magicalElement, 0) or 1 local multiplierResist = params.canResist and xi.combat.magicHitRate.calculateResistRate(actor, params.aeTarget, 0, 0, xi.skillRank.A_PLUS, params.magicalElement, params.actorStat, 0, 0) or 1 local multiplierForcedResistTier = params.canResist and xi.spells.damage.calculateAdditionalResistTier(actor, params.aeTarget, params.magicalElement) or 1 diff --git a/scripts/globals/job_utils/rune_fencer.lua b/scripts/globals/job_utils/rune_fencer.lua index 983dcee07ef..d2172e5f426 100644 --- a/scripts/globals/job_utils/rune_fencer.lua +++ b/scripts/globals/job_utils/rune_fencer.lua @@ -523,7 +523,7 @@ local function getSwipeLungeDamageMultipliers(player, target, element, bonusMacc multipliers.SDT = xi.combat.damage.magicalElementSDT(target, element) multipliers.resist = xi.combat.magicHitRate.calculateResistRate(player, target, 0, 0, 0, element, 0, 0, bonusMacc) multipliers.dayAndWeather = xi.spells.damage.calculateDayAndWeather(player, element, false) - multipliers.magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(player, target, 0, 0, element) + multipliers.magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(player, target, 0, 0, element, 0) multipliers.TMDA = xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false) multipliers.absorb = xi.spells.damage.calculateAbsorption(target, element, true) multipliers.nullify = xi.spells.damage.calculateNullification(target, element, true, false) diff --git a/scripts/globals/mobskills.lua b/scripts/globals/mobskills.lua index ed79e7183bd..c5686b84d15 100644 --- a/scripts/globals/mobskills.lua +++ b/scripts/globals/mobskills.lua @@ -61,27 +61,40 @@ local burstMultipliersByTier = [5] = 1.5, } -local function calculateMobMagicBurst(caster, ele, target) +local function calculateMobMagicBurst(target, actionElement, skillchainCount) local burstMultiplier = 1.0 - local skillchainTier, skillchainCount = xi.magicburst.formMagicBurst(target, ele) - if skillchainTier > 0 then - burstMultiplier = burstMultipliersByTier[skillchainCount] - end - - return burstMultiplier -end + if actionElement > xi.element.NONE then + local resistRank = target:getMod(xi.data.element.getElementalResistanceRankModifier(actionElement)) + local rankTable = { 1.15, 0.85, 0.6, 0.5, 0.4, 0.15, 0.05 } -- TODO: Confirm resist rank tier scaling. + local rankBonus = 0 + + if resistRank <= -3 then + rankBonus = 1.5 + elseif resistRank >= 5 then + rankBonus = 0 + else + rankBonus = rankTable[resistRank + 3] + end -local function MobTakeAoEShadow(mob, target, max) - -- TODO: Use actual NIN skill, not this function - if target:getMainJob() == xi.job.NIN and math.random(1, 100) <= 60 then - max = max - 1 - if max < 1 then - max = 1 + -- https://w.atwiki.jp/bartlett3/pages/329.html + -- This page has a bullet point on pet magic bursts where avatar magic damage is discussed. + if skillchainCount >= 1 then + burstMultiplier = burstMultipliersByTier[skillchainCount] + rankBonus end end - return math.random(1, max) + -- TODO: Do pets gain bonus from Sengikori? + -- Sengikori appears to add to base mb multiplier per JP wiki https://wiki.ffo.jp/html/20051.html + -- if + -- skillchainCount >= 1 and + -- target:getMod(xi.mod.SENGIKORI_MB_DMG_DEBUFF) > 0 + -- then + -- burstMultiplier = burstMultiplier + target:getMod(xi.mod.SENGIKORI_MB_DMG_DEBUFF) / 100 + -- target:setMod(xi.mod.SENGIKORI_MB_DMG_DEBUFF, 0) -- Consume the "Effect" upon magic burst. + -- end + + return burstMultiplier end local function fTP(tp, ftp1, ftp2, ftp3) @@ -327,161 +340,167 @@ end ----------------------------------- -- Documentation: xi.mobskills.mobMagicalMove --- params.baseDamage = #: Sets the skill's baseDamage. Default: mob:getMainLvl() + 2 --- params.additiveDamage = { #, #, # }: Bonus damage added after base damage multipliers. Linear scaling based on fTP. --- params.fTP = { #, #, # }: Linear baseDamage multiplier. Default: { 1, 1, 1 } --- params.element = element enum : Element of attack. Default: 0 --- params.mATTBonus = { #, #, # }: Flat MACC bonus/penalty (Integer). Default: { 0, 0, 0 } --- params.mACCBonus = { #, #, # }: Flat MATT bonus/penalty (Integer). Default: { 0, 0, 0 } --- params.skipResist = boolean: Ignores resist calculations. Default: False --- params.skipSDT = boolean: Ignores special damage taken calculations. Default: False --- params.skipTMDA = boolean: Ignores Target Damage Adjustment calculations. Default: False --- params.useTBDA = boolean: Uses TBDA instead of TMDA for damage adjustment. Default: False --- params.resistTierOverride = float: Forces a specific resist tier. --- params.str_wSC = float: % of STR stat added to baseDamage of skill. Default: 0 --- params.dex_wSC = float: % of DEX stat added to baseDamage of skill. Default: 0 --- params.vit_wSC = float: % of VIT stat added to baseDamage of skill. Default: 0 --- params.agi_wSC = float: % of AGI stat added to baseDamage of skill. Default: 0 --- params.int_wSC = float: % of INT stat added to baseDamage of skill. Default: 0 --- params.mnd_wSC = float: % of MND stat added to baseDamage of skill. Default: 0 --- params.chr_wSC = float: % of CHR stat added to baseDamage of skill. Default: 0 --- params.dStatMultiplier = float: Multiplier used in dStat calculations. --- params.dStatAttackerMod = xi.mod.: Defines which of the attacker's stats is used when calculating dStat. Default: xi.mod.INT --- params.dStatDefenderMod = xi.mod.: Defines which of the defender's stats is used when calculating dStat. Default: xi.mod.INT +-- params.baseDamage = #: Sets the skill's baseDamage. +-- params.additiveDamage = { #, #, # }: Bonus damage added after base damage multipliers. Linear scaling based on fTP. +-- params.fTP = { #, #, # }: Linear baseDamage multiplier +-- params.fTPBonus = #: Acts the same as TP_BONUS for players. Directly adds to the TP value when the skill is used. +-- params.element = element enum: Element of attack +-- params.attackType = attackType enum: The attack type of the skill +-- params.damageType = damageType enum: The damage type of the skill +-- params.shadowBehavior = How many shadows this skill consumes per hit. +-- params.mATTBonus = { #, #, # }: Flat MACC bonus/penalty (Integer) +-- params.mACCBonus = { #, #, # }: Flat MATT bonus/penalty (Integer) +-- params.skipDamageAdjustment = boolean: Ignores Target Damage Adjustment calculations. +-- params.skipMagicBonusDiff = boolean: Ignores MDB step +-- params.skipStoneSkin = boolean: skips stoneskin calculation. +-- params.resistTierOverride = float: Forces a specific resist tier. +-- params.str_wSC = float: % of STR stat added to baseDamage of skill. +-- params.dex_wSC = float: % of DEX stat added to baseDamage of skill. +-- params.vit_wSC = float: % of VIT stat added to baseDamage of skill. +-- params.agi_wSC = float: % of AGI stat added to baseDamage of skill. +-- params.int_wSC = float: % of INT stat added to baseDamage of skill. +-- params.mnd_wSC = float: % of MND stat added to baseDamage of skill. +-- params.chr_wSC = float: % of CHR stat added to baseDamage of skill. +-- params.dStatMultiplier = float: Multiplier used in dStat calculations. +-- params.dStatAttackerMod = xi.mod.: Defines which of the attacker's stats is used when calculating dStat. +-- params.dStatDefenderMod = xi.mod.: Defines which of the defender's stats is used when calculating dStat. +-- params.canMagicBurst = boolean: Determines if the skill is allowed to magic burst. +-- params.primaryMessage = xi.msg enum: Sets the default message of the skill. ----------------------------------- +---@alias magicalMobSkillRetVal { damage: number, hitsLanded: number, attackType: xi.attackType, damageType: xi.damageType } + +---@param mob CBaseEntity +---@param target CBaseEntity +---@param skill CPetSkill|CMobSkill +---@param action CAction +---@param skillParams table +---@return magicalMobSkillRetVal xi.mobskills.mobMagicalMove = function(mob, target, skill, action, skillParams) local returnInfo = {} -- Setup Params used in mobskill's lua. Set default values if a Param is nil. - local baseDamage = skillParams.baseDamage or mob:getMainLvl() + 2 - local additiveDamage = skillParams.additiveDamage or { 0, 0, 0 } - local fTPScale = skillParams.fTP or { 1.00, 1.00, 1.00 } - local actionElement = skillParams.element or 0 - local attackType = skillParams.attackType or xi.attackType.MAGICAL - local damageType = skillParams.damageType or xi.damageType.ELEMENTAL - local shadowsToRemove = skillParams.shadowBehavior or xi.mobskills.shadowBehavior.NUMSHADOWS_1 - local mATTBonusfTP = skillParams.mATTBonus or { 0, 0, 0 } - local mACCBonusfTP = skillParams.mACCBonus or { 0, 0, 0 } - local skipResist = skillParams.skipResist and true or false - local skipSDT = skillParams.skipSDT and true or false - local skipDamageAdjustment = skillParams.skipDamageAdjustment and true or false - local skipDayWeather = skillParams.skipDayWeather and true or false - local skipMagicBonusDiff = skillParams.skipMagicBonusDiff and true or false - local skipAbsorb = skillParams.skipAbsorbNullify and true or false -- TODO: - local resistTierOverride = skillParams.resistTierOverride or 0 - local dStatMultiplier = skillParams.dStatMultiplier or 0 - local dStatAttackerMod = skillParams.dStatAttackerMod or xi.mod.INT - local dStatDefenderMod = skillParams.dStatDefenderMod or xi.mod.INT + local damage = utils.defaultIfNil(skillParams.baseDamage, mob:getMainLvl() + 2) + local additiveDamage = utils.defaultIfNil(skillParams.additiveDamage, { 0, 0, 0 }) + local fTPScale = utils.defaultIfNil(skillParams.fTP, { 1.00, 1.00, 1.00 }) + local fTPBonus = utils.defaultIfNil(skillParams.fTPBonus, 0) + local actionElement = utils.defaultIfNil(skillParams.element, 0) + local attackType = utils.defaultIfNil(skillParams.attackType, xi.attackType.MAGICAL) + local damageType = utils.defaultIfNil(skillParams.damageType, xi.damageType.ELEMENTAL) + local shadowsToRemove = utils.defaultIfNil(skillParams.shadowBehavior, xi.mobskills.shadowBehavior.NUMSHADOWS_1) + local mATTBonusfTP = utils.defaultIfNil(skillParams.mATTBonus, { 0, 0, 0 }) + local mACCBonusfTP = utils.defaultIfNil(skillParams.mACCBonus, { 0, 0, 0 }) + local skipDamageAdjustment = utils.defaultIfNil(skillParams.skipDamageAdjustment and true, false) + local skipMagicBonusDiff = utils.defaultIfNil(skillParams.skipMagicBonusDiff and true, false) + local skipStoneskin = utils.defaultIfNil(skillParams.skipStoneSkin and true, false) + -- TODO: handle different types of Stoneskin(Magical, Physical, Agnostic) + local resistTierOverride = utils.defaultIfNil(skillParams.resistTierOverride, 0) + local dStatMultiplier = utils.defaultIfNil(skillParams.dStatMultiplier, 0) + local dStatAttackerMod = utils.defaultIfNil(skillParams.dStatAttackerMod, xi.mod.INT) + local dStatDefenderMod = utils.defaultIfNil(skillParams.dStatDefenderMod, xi.mod.INT) + local canMagicBurst = utils.defaultIfNil(skillParams.canMagicBurst and true, false) + local primaryMessage = utils.defaultIfNil(skillParams.primaryMessage, xi.msg.basic.DAMAGE) + + -- If a stat_wSC is not specified in skill script, it will default to 0. (Sanitized in xi.combat.physical.calculateWSC) + local strWSC = skillParams.str_wSC + local dexWSC = skillParams.dex_wSC + local vitWSC = skillParams.vit_wSC + local agiWSC = skillParams.agi_wSC + local intWSC = skillParams.int_wSC + local mndWSC = skillParams.mnd_wSC + local chrWSC = skillParams.chr_wSC -- Initialize returnInfo params returnInfo.damage = 0 - returnInfo.shadowsBlockedSkill = false returnInfo.hitsLanded = 0 returnInfo.attackType = attackType returnInfo.damageType = damageType - returnInfo.damageAbsorbed = false - returnInfo.damageNullified = false + + -- Set skill's default message. + skill:setMsg(primaryMessage) if mob:hasStatusEffect(xi.effect.HYSTERIA) then skill:setMsg(xi.msg.basic.NONE) - return 0 - end - -- Set default message. - if mob:getCurrentAction() == xi.action.category.PET_MOBABILITY_FINISH then - if skill:getMsg() ~= xi.msg.basic.JA_MAGIC_BURST then - skill:setMsg(xi.msg.basic.USES_JA_TAKE_DAMAGE) - end - else - skill:setMsg(xi.msg.basic.DAMAGE) + return returnInfo end ---------------------------------- -- Calculate Base Damage ---------------------------------- - -- Calculate Weapon Skill Secondary Attribute Modifiers (wSC) - -- If a stat_wSC is not specified in skill script, it will default to 0. (Sanitized in xi.combat.physical.calculateWSC) - local strWSC = skillParams.str_wSC - local dexWSC = skillParams.dex_wSC - local vitWSC = skillParams.vit_wSC - local agiWSC = skillParams.agi_wSC - local intWSC = skillParams.int_wSC - local mndWSC = skillParams.mnd_wSC - local chrWSC = skillParams.chr_wSC - local wscMods = xi.combat.physical.calculateWSC(mob, strWSC, dexWSC, vitWSC, agiWSC, intWSC, mndWSC, chrWSC) - local baseDamagefTPMult = xi.combat.physical.calculateTPfactor(skill:getTP(), fTPScale) - local additiveBonusDamage = math.floor(xi.combat.physical.calculateTPfactor(skill:getTP(), additiveDamage)) + -- TODO: Do mobs benefit from Fencer job trait's TP_BONUS? + -- Best way to test will likely be to find a mob that uses a magical skill with fTP scaling and has varying jobs to compare (WAR 45 min for Fencer, 80 BST, 85 BRD). + local bonusTP = mob:getMod(xi.mod.TP_BONUS) + fTPBonus + local tpValue = math.min(skill:getTP() + bonusTP, 3000) + local baseDamagefTPMult = xi.combat.physical.calculateTPfactor(tpValue, fTPScale) + local additiveBonusDamage = math.floor(xi.combat.physical.calculateTPfactor(tpValue, additiveDamage)) -- dStat Multiplier is usually 1, 1.5, 2 depending on skill. - -- Negative dStat usually subtracts 0.5 from the multiplier. + -- Negative dStat subtracts 0.5 from the multiplier. -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=D8 local dStat = 0 if skillParams.dStatMultiplier then - dStat = math.floor(mob:getStat(dStatAttackerMod) - target:getStat(dStatDefenderMod)) + dStat = mob:getStat(dStatAttackerMod) - target:getStat(dStatDefenderMod) - if dStat < 0 then - dStatMultiplier = dStatMultiplier - 0.5 + if not mob:isAvatar() then + -- TODO: Does this apply to jug pets and avatars? + if dStat < 0 then + dStatMultiplier = dStatMultiplier - 0.5 - if dStatMultiplier < 1 then - dStat = -1 + if dStatMultiplier < 1 then + dStat = -1 + end end end dStat = math.floor(dStat * dStatMultiplier) + dStat = utils.clamp(dStat, -65, 999) end - baseDamage = math.floor((baseDamage + wscMods + mob:getMod(xi.mod.MAGIC_DAMAGE)) * baseDamagefTPMult + dStat + additiveBonusDamage) + damage = math.floor((damage + wscMods + mob:getMod(xi.mod.MAGIC_DAMAGE)) * baseDamagefTPMult + dStat + additiveBonusDamage) + damage = math.max(0, damage) - local finalDamage = math.max(1, baseDamage) - local hitsLanded = 1 -- Magic skills can't miss in the same way as physical skills so assume 1 hit landed for calculations. + local hitsLanded = 1 -- Magic skills can't miss in the same way as physical skills so assume 1 hit landed for calculations. - -- Handle Shadows (Utsusemi, Blink, etc.) - if - shadowsToRemove ~= xi.mobskills.shadowBehavior.WIPE_SHADOWS and - shadowsToRemove ~= xi.mobskills.shadowBehavior.IGNORE_SHADOWS - then - -- Handle Utsusemi preservation mechanic to reduce shadow consumption. - -- This is usually for AOE physical attacks(AOE Magic usually wipes shadows). - if - skill:isAoE() or - skill:isConal() - then - shadowsToRemove = utils.attemptShadowMitigation(target, shadowsToRemove) - end - - -- Remove shadows - finalDamage = utils.takeShadows(target, finalDamage, shadowsToRemove) + -- TODO: SAM Yaegasumi ability. - -- Dealt zero damage, so shadows took all hits. - if finalDamage == 0 then - skill:setMsg(xi.msg.basic.SHADOW_ABSORB) - returnInfo.damage = shadowsToRemove - returnInfo.hitsLanded = 0 - returnInfo.shadowsBlockedSkill = true + -- Handle Shadows (Utsusemi, Blink, etc.) + damage = xi.mobskills.handleShadows(mob, target, skill, damage, attackType, shadowsToRemove) - return returnInfo - end + if skill:getMsg() == xi.msg.basic.SHADOW_ABSORB then + -- Note: Damage in this case equals the amount of shadows consumed for the purpose of messaging. + -- takeDamage() is gated by returnInfo.hitsLanded being greater than 0 to prevent chip damage through shadows. + returnInfo.damage = damage + returnInfo.hitsLanded = 0 - elseif shadowsToRemove == xi.mobskills.shadowBehavior.WIPE_SHADOWS then - target:delStatusEffect(xi.effect.COPY_IMAGE) - target:delStatusEffect(xi.effect.BLINK) + return returnInfo end -- Calculate if skill will be absorbed or nullified. - local absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, true) - local nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, true, false) + local absorbDamage = 1 + local nullifyDamage = 1 - if skipAbsorb then - absorbDamage = 1 + if attackType == xi.attackType.BREATH then + nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, false, true) + else + nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, true, false) end if nullifyDamage == 0 then + -- Note: Nullification takes precedence over elemental absorption. -- Note: We still count nullifies as a "hit" since additional status effects tied to the skill itself will still apply. - returnInfo.damage = 0 - returnInfo.damageNullified = true + returnInfo.damage = 0 + returnInfo.hitsLanded = hitsLanded + + return returnInfo + end + + if attackType == xi.attackType.BREATH then + absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, false) + else + absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, true) end ---------------------------------- @@ -491,10 +510,10 @@ xi.mobskills.mobMagicalMove = function(mob, target, skill, action, skillParams) local mAttackBonus = 0 -- Flat MACC bonus based on fTP scale - mAccuracyBonus = xi.combat.physical.calculateTPfactor(skill:getTP(), mACCBonusfTP) + mAccuracyBonus = xi.combat.physical.calculateTPfactor(tpValue, mACCBonusfTP) -- Flat MATT bonus based on fTP scale - mAttackBonus = xi.combat.physical.calculateTPfactor(skill:getTP(), mATTBonusfTP) + mAttackBonus = xi.combat.physical.calculateTPfactor(tpValue, mATTBonusfTP) -- Calculate bonus magic accuracy for pets local petAccuracyBonus = xi.mobskills.calculatePetMagicAccuracyBonus(mob, target, actionElement) @@ -503,36 +522,48 @@ xi.mobskills.mobMagicalMove = function(mob, target, skill, action, skillParams) mAccuracyBonus = mAccuracyBonus + petAccuracyBonus -- Damage Multipliers. - local sdt = xi.spells.damage.calculateSDT(target, actionElement) + local sdt = xi.combat.damage.magicalElementSDT(target, actionElement) local resistTier = 1 - local dayAndWeather = 1 - -- TODO: may need an ignoreMDB param to toggle within xi.spells.damage.calculateMagicBonusDiff. - -- https://docs.google.com/spreadsheets/d/1YBoveP-weMdidrirY-vPDzHyxbEI2ryECINlfCnFkLI/edit?pli=1&gid=57955395#gid=57955395&range=D9 + local dayAndWeather = xi.spells.damage.calculateDayAndWeather(mob, actionElement, false) local magicBonusDiff = 1 local magicDamageAdjustment = 1 + local bloodPactMultiplier = 1 + local magicBurst = 1 + local magicBurstBonus = 1 - -- If skill was not absorbed, calculate resist and TMDA. - -- Note: Absorb mechanics such as Liement are calculated BEFORE resist/damage adjustments (such as shell/magic bursts). + -- If skill was not absorbed, calculate resist and damage adjustments. + -- Note: Elemental absorb mechanics such as Liement are calculated BEFORE resist/damage adjustments (such as shell/magic bursts). if absorbDamage > 0 then resistTier = xi.combat.magicHitRate.calculateResistRate(mob, target, 0, 0, 0, actionElement, dStatAttackerMod, 0, mAccuracyBonus) + if mob:isAvatar() then + bloodPactMultiplier = 1 + mob:getMod(xi.mod.BP_DAMAGE) / 100 + end + if not skipDamageAdjustment and attackType == xi.attackType.BREATH then - -- Damage Adjustment includes Breath and Magical damage. - magicDamageAdjustment = xi.spells.damage.calculateDamageAdjustment(target, false, true, false, true) + -- Damage Adjustment for breath damage + magicDamageAdjustment = xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true) elseif not skipDamageAdjustment then - -- Damage Adjustment only includes Magical damage. - magicDamageAdjustment = xi.spells.damage.calculateDamageAdjustment(target, false, true, false, false) + -- Damage Adjustment for Magical damage. + magicDamageAdjustment = xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false) end - -- TODO: Magic Burst damage for pets? - -- Note: Pets get a MACC bonus(handled further below in this function) but need testing for damage. - end + if canMagicBurst then + local _, skillchainCount = xi.magicburst.formMagicBurst(target, actionElement) - if not skipDayWeather then - dayAndWeather = xi.spells.damage.calculateDayAndWeather(mob, actionElement, false) + if skillchainCount > 0 then + -- TODO: Glyphic Bracers magic burst modifiers. https://www.bg-wiki.com/ffxi/Glyphic_Bracers + magicBurst = calculateMobMagicBurst(target, actionElement, skillchainCount) + magicBurstBonus = xi.spells.damage.calculateIfMagicBurstBonus(mob, target, 0, 0, actionElement) + + -- TODO: petskills currently seem to be searching for a mobskillID rather than the petskill ID which causes the magic burst to display the wrong message. Use JA_MAGIC_BURST for now. + -- skill:setMsg(xi.msg.basic.PET_MAGIC_BURST) + skill:setMsg(xi.msg.basic.JA_MAGIC_BURST) + end + end end if not skipMagicBonusDiff then @@ -544,102 +575,49 @@ xi.mobskills.mobMagicalMove = function(mob, target, skill, action, skillParams) resistTier = resistTierOverride end - -- Skip resist calculations if true. - if skipResist then - resistTier = 1 - end - - -- Skip SDT calculations if true. - if skipSDT then - sdt = 1 - end - - finalDamage = math.floor(finalDamage * sdt) - finalDamage = math.floor(finalDamage * resistTier) - finalDamage = math.floor(finalDamage * dayAndWeather) - finalDamage = math.floor(finalDamage * magicBonusDiff) - finalDamage = math.floor(finalDamage * magicDamageAdjustment) - finalDamage = math.floor(finalDamage * absorbDamage) + damage = math.floor(damage * sdt) + damage = math.floor(damage * resistTier) + damage = math.floor(damage * dayAndWeather) + damage = math.floor(damage * magicBonusDiff) + damage = math.floor(damage * magicDamageAdjustment) + damage = math.floor(damage * bloodPactMultiplier) + damage = math.floor(damage * absorbDamage) + damage = math.floor(damage * magicBurst) + damage = math.floor(damage * magicBurstBonus) -- If we absorbed, then return early as the rest is not needed. if absorbDamage < 0 then - skill:setMsg(xi.msg.basic.SKILL_RECOVERS_HP) - target:addHP(-finalDamage) - - returnInfo.damageAbsorbed = true - returnInfo.damage = finalDamage - returnInfo.hitsLanded = hitsLanded - -- Note: We still count absorbs as a "hit" since additional status effects tied to the skill itself will still apply. + -- Messaging is handled in core. Returning a negative damage value automatically sets the absorb message. + -- Note: We still count absorbs as a "hit" since additional status effects tied to the skill itself will still apply even if absorbed. + returnInfo.damage = damage + returnInfo.hitsLanded = hitsLanded return returnInfo end - finalDamage = math.floor(target:handleSevereDamage(finalDamage, false)) - finalDamage = math.floor(target:checkDamageCap(finalDamage)) - finalDamage = math.floor(utils.handleAutomatonAutoAnalyzer(target, skill, finalDamage)) - finalDamage = utils.handlePhalanx(target, finalDamage) - finalDamage = utils.handleOneForAll(target, finalDamage) - finalDamage = utils.handleStoneskin(target, finalDamage) + damage = math.floor(target:handleSevereDamage(damage, false)) + damage = math.floor(target:checkDamageCap(damage)) + damage = math.floor(utils.handleAutomatonAutoAnalyzer(target, skill, damage)) + damage = utils.handlePhalanx(target, damage) + damage = utils.handleOneForAll(target, damage) - target:updateEnmityFromDamage(mob, finalDamage) - target:handleAfflatusMiseryDamage(finalDamage) + if not skipStoneskin then + -- TODO: Some Stoneskin effects only absorb certain damage types. + damage = utils.handleStoneskin(target, damage) + end + + target:updateEnmityFromDamage(mob, damage) + target:handleAfflatusMiseryDamage(damage) -- Calculate TP return of the mob skill. - xi.mobskills.calculateSkillTPReturn(finalDamage, mob, skill, target, attackType, hitsLanded) + xi.mobskills.calculateSkillTPReturn(damage, mob, skill, target, attackType, hitsLanded) - returnInfo.damage = finalDamage + returnInfo.damage = damage returnInfo.hitsLanded = hitsLanded return returnInfo end -xi.mobskills.calculatePetMagicAccuracyBonus = function(mob, target, actionElement) - local petAccBonus = 0 - - if mob:isPet() and mob:getMaster() ~= nil then - local master = mob:getMaster() - - if mob:isAvatar() then - local masterSkillLevel = master:getSkillLevel(xi.skill.SUMMONING_MAGIC) - local masterMaxSkillLevel = master:getMaxSkillLevel(mob:getMainLvl(), xi.job.SMN, xi.skill.SUMMONING_MAGIC) - - petAccBonus = utils.clamp(masterSkillLevel - masterMaxSkillLevel, 0, 200) - end - - local skillchainTier, _ = xi.magicburst.formMagicBurst(actionElement, target) - if - mob:getPetID() > 0 and - skillchainTier > 0 - then - petAccBonus = petAccBonus + 25 - end - end - - return petAccBonus -end - ----@param actor CBaseEntity ----@param target CBaseEntity ----@param damage number ----@param element xi.element ----@param skill CPetSkill|CMobSkill ----@return number -xi.mobskills.mobAddBonuses = function(actor, target, damage, element, skill) -- used for SMN magical bloodpacts, despite the name. - local burst = calculateMobMagicBurst(actor, element, target) - - if - skill and - burst > 1 and - actor:getPetID() > 0 -- all pets except charmed pets can get magic burst message, but only with petskill action - then - skill:setMsg(xi.msg.basic.JA_MAGIC_BURST) - end - - damage = math.floor(damage * burst) - - return damage -end - ----------------------------------- -- Documentation: xi.mobskills.mobBreathMove -- params.percentMultipier = # : % Multiplier on mob's current HP. Damage = mobCurrentHP * percentMultipier @@ -934,7 +912,6 @@ xi.mobskills.mobFinalAdjustments = function(info, mob, skill, target, attackType if attackType == xi.attackType.PHYSICAL then damage = damage * xi.combat.damage.physicalElementSDT(target, damageType) damage = target:physicalDmgTaken(damage, damageType) - elseif attackType == xi.attackType.MAGICAL then elseif attackType == xi.attackType.BREATH then -- Handle absorb messaging if damage < 0 then @@ -1005,49 +982,29 @@ xi.mobskills.calculateSkillTPReturn = function(damage, mob, skill, target, attac end end -xi.mobskills.hasMissMessage = function(mob, target, skill, action, info) - local missMessages = - { - xi.msg.basic.EVADES, - xi.msg.basic.HIT_MISS, - xi.msg.basic.JA_MISS, - xi.msg.basic.JA_MISS_2, - xi.msg.basic.SKILL_MISS, - xi.msg.basic.RANGED_ATTACK_MISS, - xi.msg.basic.SHADOW_ABSORB, - xi.msg.basic.ANTICIPATE, - } - - local skillMsg = skill:getMsg() - - -- The attack was a miss, shadow absorbed, or anticipated. - for _, msg in ipairs(missMessages) do - if skillMsg == msg then - - return true - end - end +---@param actor CBaseEntity +---@param target CBaseEntity +---@param skill CPetSkill|CMobSkill +---@param action CAction +---@param info table +---@return boolean +-- Used as a conditional filter for target:takeDamage so the target doesn't take chip damage through shadows. +xi.mobskills.processDamage = function(actor, target, skill, action, info) + if info.hitsLanded > 0 then + return true end return false end --- Filters target:takeDamage so we don't take chip damage through shadows. -xi.mobskills.processDamage = function(mob, target, skill, action, info) - if - info.damage >= 0 and -- Was not absorbed - info.hitsLanded > 0 and -- Was not a miss - info.shadowsBlockedSkill == false -- Was not completely blocked by shadows. - then - target:takeDamage(info.damage, mob, info.attackType, info.damageType) - end -end - -- returns true if mob attack hit -- used to stop tp move status effects xi.mobskills.mobPhysicalHit = function(skill) - -- if message is not the default. Then there was a miss, shadow taken etc - return skill:hasMissMsg() == false + if skill:hasMissMsg() then + return false + end + + return true end xi.mobskills.mobDrainMove = function(mob, target, drainType, drain, attackType, damageType) @@ -1224,6 +1181,8 @@ end -- Used for mobskills that remove player equipment. -- Removes items from randomly chosen equipment slots. +---@param target CBaseEntity +---@param numberToUnequip number xi.mobskills.unequipRandomSlots = function(target, numberToUnequip) local slots = {} @@ -1303,3 +1262,28 @@ xi.mobskills.handleShadows = function(actor, target, skill, damage, attackType, return damage end + +xi.mobskills.calculatePetMagicAccuracyBonus = function(mob, target, actionElement) + local petAccBonus = 0 + + if mob:isPet() and mob:getMaster() ~= nil then + local master = mob:getMaster() + + if mob:isAvatar() then + local masterSkillLevel = master:getSkillLevel(xi.skill.SUMMONING_MAGIC) + local masterMaxSkillLevel = master:getMaxSkillLevel(mob:getMainLvl(), xi.job.SMN, xi.skill.SUMMONING_MAGIC) + + petAccBonus = utils.clamp(masterSkillLevel - masterMaxSkillLevel, 0, 200) + end + + local skillchainTier, _ = xi.magicburst.formMagicBurst(target, actionElement) + if + mob:getPetID() > 0 and + skillchainTier > 0 + then + petAccBonus = petAccBonus + 25 + end + end + + return petAccBonus +end diff --git a/scripts/globals/spells/damage_spell.lua b/scripts/globals/spells/damage_spell.lua index 371e8127e86..a4ee1807ffd 100644 --- a/scripts/globals/spells/damage_spell.lua +++ b/scripts/globals/spells/damage_spell.lua @@ -591,7 +591,7 @@ end xi.spells.damage.calculateMagicBonusDiff = function(caster, target, spellId, skillType, spellElement, bonusMATT) local magicBonusDiff = 1 -- The variable we want to calculate local casterJob = caster:getMainJob() - local mab = caster:getMod(xi.mod.MATT) + cardinalChantBonus(caster, target, xi.direction.EAST, spellId, skillType) + local mab = caster:getMod(xi.mod.MATT) + cardinalChantBonus(caster, target, xi.direction.EAST, spellId, skillType) + bonusMATT local mabCritChance = caster:getMod(xi.mod.MAGIC_CRITHITRATE) + cardinalChantBonus(caster, target, xi.direction.NORTH, spellId, skillType) local mDefBarBonus = 0 @@ -689,25 +689,6 @@ xi.spells.damage.calculateMagicCriticalMultiplier = function(caster) return 1 end --- Calculate: Target Breath Damage Adjustment (TBDA) --- Referred to on item as "Breath Damage Taken -%", "Damage Taken -%" (Ex. Defending Ring). -xi.spells.damage.calculateTBDA = function(target, spellElement) - local targetBreathDamageAdjustment = 1 - - -- The values set for this modifiers are base 10000. - -- -2500 in item_mods.sql means -25% damage recived. - -- 2500 would mean 25% ADDITIONAL damage taken. - -- The effects of the "Shell" spells are also included in this step. The effect also aplies a negative value. - local globalDamageTaken = target:getMod(xi.mod.DMG) / 10000 -- Mod is base 10000 - local breathDamageTaken = target:getMod(xi.mod.DMGBREATH) / 10000 -- Mod is base 10000 - local uBreathDamageTaken = target:getMod(xi.mod.UDMGBREATH) / 10000 -- Mod is base 10000 - local combinedDamageTaken = utils.clamp(breathDamageTaken + globalDamageTaken, -0.5, 0.5) -- The combination of regular "Damage Taken" and "Breath Damage Taken" caps at 50%. There is no BDTII known as of yet. - - targetBreathDamageAdjustment = utils.clamp(1 + combinedDamageTaken + uBreathDamageTaken, 0, 2) -- Uncapped breath damage modifier. Cap is 100% both ways. - - return targetBreathDamageAdjustment -end - -- Divine seal applies its own multiplier to healing spells when used against undead. xi.spells.damage.calculateDivineSealMultiplier = function(caster, target, skillType) if not caster:hasStatusEffect(xi.effect.DIVINE_SEAL) then diff --git a/scripts/zones/Abyssea-Konschtat/mobs/Hadal_Satiator.lua b/scripts/zones/Abyssea-Konschtat/mobs/Hadal_Satiator.lua index 035809aac0a..6eedcf79139 100644 --- a/scripts/zones/Abyssea-Konschtat/mobs/Hadal_Satiator.lua +++ b/scripts/zones/Abyssea-Konschtat/mobs/Hadal_Satiator.lua @@ -12,7 +12,7 @@ entity.onMobMobskillChoose = function(mob, target) { xi.mobSkill.PROMYVION_BARRIER_2, xi.mobSkill.QUADRATIC_CONTINUUM_2, - xi.mobSkill.SPIRIT_ABSORPTION_2, + xi.mobSkill.SPIRIT_ABSORPTION_GORGER_2, xi.mobSkill.STYGIAN_FLATUS_1, xi.mobSkill.VANITY_DRIVE_2, } diff --git a/scripts/zones/Promyvion-Vahzl/mobs/Propagator.lua b/scripts/zones/Promyvion-Vahzl/mobs/Propagator.lua index 790a8772922..625e01ea8a1 100644 --- a/scripts/zones/Promyvion-Vahzl/mobs/Propagator.lua +++ b/scripts/zones/Promyvion-Vahzl/mobs/Propagator.lua @@ -16,7 +16,7 @@ entity.onMobMobskillChoose = function(mob, target, skillId) { xi.mobSkill.PROMYVION_BARRIER_2, xi.mobSkill.QUADRATIC_CONTINUUM_2, - xi.mobSkill.SPIRIT_ABSORPTION_2, + xi.mobSkill.SPIRIT_ABSORPTION_GORGER_2, xi.mobSkill.STYGIAN_FLATUS_1, xi.mobSkill.VANITY_DRIVE_2, } diff --git a/scripts/zones/Spire_of_Dem/mobs/Ingester.lua b/scripts/zones/Spire_of_Dem/mobs/Ingester.lua index 057e4bacc23..df528df8f9a 100644 --- a/scripts/zones/Spire_of_Dem/mobs/Ingester.lua +++ b/scripts/zones/Spire_of_Dem/mobs/Ingester.lua @@ -33,7 +33,7 @@ entity.onMobMobskillChoose = function(mob, target, skillId) local skillList = { xi.mobSkill.QUADRATIC_CONTINUUM_2, - xi.mobSkill.SPIRIT_ABSORPTION_2, + xi.mobSkill.SPIRIT_ABSORPTION_GORGER_2, xi.mobSkill.VANITY_DRIVE_2, xi.mobSkill.STYGIAN_FLATUS_1, xi.mobSkill.PROMYVION_BARRIER_2, diff --git a/scripts/zones/Spire_of_Dem/mobs/Progenerator.lua b/scripts/zones/Spire_of_Dem/mobs/Progenerator.lua index a2c5995dae0..eaa1275e537 100644 --- a/scripts/zones/Spire_of_Dem/mobs/Progenerator.lua +++ b/scripts/zones/Spire_of_Dem/mobs/Progenerator.lua @@ -26,7 +26,7 @@ end entity.onMobMobskillChoose = function(mob, target, skillId) local tpMoves = { - xi.mobSkill.SPIRIT_ABSORPTION_2, + xi.mobSkill.SPIRIT_ABSORPTION_GORGER_2, xi.mobSkill.VANITY_DRIVE_2, } diff --git a/scripts/zones/Spire_of_Vahzl/mobs/Procreator.lua b/scripts/zones/Spire_of_Vahzl/mobs/Procreator.lua index 6cf771fd631..bc3e502611a 100644 --- a/scripts/zones/Spire_of_Vahzl/mobs/Procreator.lua +++ b/scripts/zones/Spire_of_Vahzl/mobs/Procreator.lua @@ -24,7 +24,7 @@ end entity.onMobMobskillChoose = function(mob, target, skillId) local tpMoves = { - xi.mobSkill.SPIRIT_ABSORPTION_2, + xi.mobSkill.SPIRIT_ABSORPTION_GORGER_2, xi.mobSkill.VANITY_DRIVE_2, } diff --git a/sql/mob_skills.sql b/sql/mob_skills.sql index b437002b632..c49c38d5fb1 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -655,7 +655,7 @@ INSERT INTO `mob_skills` VALUES (627,438,'vulture_4',0,0.0,7.0,2000,0,1,0,0,0,0, INSERT INTO `mob_skills` VALUES (628,372,'wild_horn',4,0.0,10.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (629,373,'thunderbolt_behemoth',1,0.0,40.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (630,374,'kick_out',8,0.0,10.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (631,375,'shock_wave',4,0.0,7.0,2000,1500,4,0,0,4,0,0,0); +INSERT INTO `mob_skills` VALUES (631,375,'shock_wave_behemoth',4,0.0,7.0,2000,1500,4,0,0,4,0,0,0); INSERT INTO `mob_skills` VALUES (632,376,'flame_armor',0,0.0,7.0,2000,1500,1,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (633,377,'howl',1,0.0,20.0,2000,1500,1,0,0,0,0,0,0); -- Behemoth family Howl INSERT INTO `mob_skills` VALUES (634,378,'meteor',1,0.0,30.0,2000,0,4,0,0,0,0,0,0); -- chlevnik's death meteor (not a normal meteor attack animation) @@ -768,8 +768,8 @@ INSERT INTO `mob_skills` VALUES (740,432,'familiar',0,0.0,7.0,2000,0,1,2,0,0,0,0 INSERT INTO `mob_skills` VALUES (741,904,'quadratic_continuum',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (742,904,'quadratic_continuum',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); -- INSERT INTO `mob_skills` VALUES (743,487,'quadratic_continuum',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (744,905,'spirit_absorption',0,0.0,7.0,2000,1500,4,0,150,0,0,0,0); -INSERT INTO `mob_skills` VALUES (745,905,'spirit_absorption',0,0.0,7.0,2000,1500,4,0,150,0,0,0,0); +INSERT INTO `mob_skills` VALUES (744,905,'spirit_absorption_gorger',0,0.0,7.0,2000,1500,4,0,150,0,0,0,0); +INSERT INTO `mob_skills` VALUES (745,905,'spirit_absorption_gorger',0,0.0,7.0,2000,1500,4,0,150,0,0,0,0); -- INSERT INTO `mob_skills` VALUES (746,490,'spirit_absorption',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (747,906,'vanity_drive',4,0.0,10.0,2000,1500,4,0,0,1,0,0,0); INSERT INTO `mob_skills` VALUES (748,906,'vanity_drive',4,0.0,10.0,2000,1500,4,0,0,1,0,0,0);