From 09a0339b268037b674d689db50ed164cda4f11f8 Mon Sep 17 00:00:00 2001 From: Xaver-DaRed Date: Wed, 21 Jan 2026 01:54:15 +0100 Subject: [PATCH] AEs: Create dispel function. Convert past usage. --- .../action_additional_effect_status.lua | 34 +++++++++++++ scripts/globals/mobs.lua | 48 +------------------ .../Balgas_Dais/mobs/Gilagoge_Tlugvi.lua | 14 ++++-- .../zones/Balgas_Dais/mobs/King_of_Coins.lua | 14 ++++-- .../mobs/Olla_Grande.lua | 13 ++++- .../mobs/Olla_Media.lua | 13 ++++- .../mobs/Olla_Pequena.lua | 13 ++++- 7 files changed, 87 insertions(+), 62 deletions(-) diff --git a/scripts/globals/combat/action_additional_effect_status.lua b/scripts/globals/combat/action_additional_effect_status.lua index 1a7a900e6c9..117e33bd444 100644 --- a/scripts/globals/combat/action_additional_effect_status.lua +++ b/scripts/globals/combat/action_additional_effect_status.lua @@ -18,6 +18,7 @@ local defaultsTable = [xi.effect.DEFENSE_DOWN ] = { xi.subEffect.DEFENSE_DOWN }, [xi.effect.EVASION_DOWN ] = { xi.subEffect.EVASION_DOWN }, [xi.effect.KO ] = { xi.subEffect.DEATH }, + [xi.effect.NONE ] = { xi.subEffect.DARKNESS_DAMAGE }, [xi.effect.PARALYSIS ] = { xi.subEffect.PARALYSIS }, [xi.effect.PETRIFICATION] = { xi.subEffect.PETRIFY }, [xi.effect.PLAGUE ] = { xi.subEffect.PLAGUE }, @@ -112,3 +113,36 @@ xi.combat.action.executeAdditionalStatus = function(actor, target, fedData) return 0, 0, 0 end + +xi.combat.action.executeAdditionalDispel = function(actor, target, fedData) + local params = validateParameters(fedData) + + -- Early return: Incorrect effect ID. + if params.effectId ~= xi.effect.NONE then + return 0, 0, 0 + end + + -- Early return: No proc. + if math.random(1, 100) > params.chance then + return 0, 0, 0 + end + + -- Early return: No dispelable effect. + if not target:hasStatusEffectByFlag(xi.effectFlag.DISPELABLE) then + return 0, 0, 0 + end + + -- Early return: Resist rate too high. + local resistanceRate = xi.combat.magicHitRate.calculateResistRate(actor, target, 0, 0, xi.skillRank.A_PLUS, params.element, params.actorStat, params.effectId, params.macc) + if not xi.data.statusEffect.isResistRateSuccessfull(params.effectId, resistanceRate, params.resistRate) then + return 0, 0, 0 + end + + -- Early return: No effect fetched. + local dispelledEffect = target:dispelStatusEffect(xi.effectFlag.DISPELABLE) + if dispelledEffect == xi.effect.NONE then + return 0, 0, 0 + end + + return params.animation, xi.msg.basic.ADD_EFFECT_DISPEL, dispelledEffect +end diff --git a/scripts/globals/mobs.lua b/scripts/globals/mobs.lua index c2bdd70130a..d405ab12192 100644 --- a/scripts/globals/mobs.lua +++ b/scripts/globals/mobs.lua @@ -211,7 +211,7 @@ end -- mob additional melee effects ----------------------------------- -xi.mob.additionalEffect = +xi.mob.ae = { CURSE = 1, ENAERO = 2, @@ -242,7 +242,6 @@ xi.mob.additionalEffect = DEFENSE_DOWN = 27, ATTACK_DOWN = 28, } -xi.mob.ae = xi.mob.additionalEffect local additionalEffects = { @@ -538,16 +537,6 @@ local additionalEffects = maxDuration = 45, }, - [xi.mob.ae.DISPEL] = - { - chance = 25, - ele = xi.element.DARK, - sub = xi.subEffect.DARKNESS_DAMAGE, - msg = xi.msg.basic.ADD_EFFECT_DISPEL, - applyEffect = false, - power = 1, - }, - [xi.mob.ae.BIND] = { chance = 10, @@ -622,19 +611,6 @@ local addEffectStatus = function(mob, target, ae, params) return 0, 0, 0 end ---[[ - Helper function for xi.mob.onAddEffect that dispels an effect. ---]] -local addEffectDispel = function(target, ae) - local dispelledEffect = target:dispelStatusEffect(xi.effectFlag.DISPELABLE) - - if dispelledEffect == xi.effect.NONE then - return 0, 0, 0 - end - - return ae.sub, ae.msg, dispelledEffect -end - --[[ Helper function for xi.mob.onAddEffect that applies damage. --]] @@ -729,10 +705,6 @@ xi.mob.onAddEffect = function(mob, target, damage, effect, params) if ae.applyEffect then return addEffectStatus(mob, target, ae, params) - -- DISPEL - elseif effect == xi.mob.ae.DISPEL and target then - return addEffectDispel(target, ae) - -- IMMEDIATE EFFECT else return addEffectImmediate(mob, target, damage, ae, params) @@ -745,24 +717,6 @@ xi.mob.onAddEffect = function(mob, target, damage, effect, params) return 0, 0, 0 end ------------------------------------ --- mob difficulty enums for checkDifficulty() ------------------------------------ - -xi.mob.difficulty = -{ - TOO_WEAK = 0, - INCREDIBLY_EASY_PREY = 1, - EASY_PREY = 2, - DECENT_CHALLENGE = 3, - EVEN_MATCH = 4, - TOUGH = 5, - VERY_TOUGH = 6, - INCREDIBLY_TOUGH = 7, - MAX = 8, -} -xi.mob.diff = xi.mob.difficulty - ----------------------------------- -- Centralized function for calling one or more mob "pets" -- It may be helpful to think of mobs with multiple as having "helpers" rather than explicitly pets diff --git a/scripts/zones/Balgas_Dais/mobs/Gilagoge_Tlugvi.lua b/scripts/zones/Balgas_Dais/mobs/Gilagoge_Tlugvi.lua index a260473f4a1..6b61854ee0b 100644 --- a/scripts/zones/Balgas_Dais/mobs/Gilagoge_Tlugvi.lua +++ b/scripts/zones/Balgas_Dais/mobs/Gilagoge_Tlugvi.lua @@ -9,11 +9,11 @@ mixins = { require('scripts/mixins/job_special') } local entity = {} entity.onMobInitialize = function(mob) - mob:addImmunity(xi.immunity.PETRIFY) - mob:addImmunity(xi.immunity.SILENCE) mob:setMobMod(xi.mobMod.ADD_EFFECT, 1) mob:setMobMod(xi.mobMod.NO_LINK, 1) mob:setMobMod(xi.mobMod.NO_STANDBACK, 1) + mob:addImmunity(xi.immunity.PETRIFY) + mob:addImmunity(xi.immunity.SILENCE) end entity.onMobSpawn = function(mob) @@ -43,12 +43,16 @@ entity.onMobFight = function(mob, target) end end --- Has additional effect: Dispel (15% chance) entity.onAdditionalEffect = function(mob, target, damage) - return xi.mob.onAddEffect(mob, target, damage, xi.mob.ae.DISPEL, { chance = 15 }) + local pTable = + { + chance = 25, + element = xi.element.DARK, + } + + return xi.combat.action.executeAdditionalDispel(mob, target, pTable) end --- Only uses Entangle. entity.onMobMobskillChoose = function(mob, target) return xi.mobSkill.ENTANGLE end diff --git a/scripts/zones/Balgas_Dais/mobs/King_of_Coins.lua b/scripts/zones/Balgas_Dais/mobs/King_of_Coins.lua index baab2cfc46e..e16e800d2f0 100644 --- a/scripts/zones/Balgas_Dais/mobs/King_of_Coins.lua +++ b/scripts/zones/Balgas_Dais/mobs/King_of_Coins.lua @@ -9,18 +9,18 @@ mixins = { require('scripts/mixins/job_special') } local entity = {} entity.onMobInitialize = function(mob) + mob:setMobMod(xi.mobMod.ADD_EFFECT, 1) mob:addImmunity(xi.immunity.LIGHT_SLEEP) mob:addImmunity(xi.immunity.DARK_SLEEP) mob:addImmunity(xi.immunity.PETRIFY) mob:addImmunity(xi.immunity.SILENCE) mob:addImmunity(xi.immunity.PARALYZE) - mob:setMobMod(xi.mobMod.ADD_EFFECT, 1) - mob:setMobMod(xi.mobMod.BASE_DAMAGE_MULTIPLIER, 150) end entity.onMobSpawn = function(mob) - mob:setMod(xi.mod.DOUBLE_ATTACK, 40) + mob:setMobMod(xi.mobMod.BASE_DAMAGE_MULTIPLIER, 150) mob:setMobMod(xi.mobMod.MAGIC_COOL, 25) + mob:setMod(xi.mod.DOUBLE_ATTACK, 40) end entity.onMobEngage = function(mob, target) @@ -34,7 +34,13 @@ entity.onMobEngage = function(mob, target) end entity.onAdditionalEffect = function(mob, target, damage) - return xi.mob.onAddEffect(mob, target, damage, xi.mob.ae.DISPEL) + local pTable = + { + chance = 25, + element = xi.element.DARK, + } + + return xi.combat.action.executeAdditionalDispel(mob, target, pTable) end entity.onMobSpellChoose = function(mob, target, spellId) diff --git a/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Grande.lua b/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Grande.lua index febb2c8ebad..495f03d80b3 100644 --- a/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Grande.lua +++ b/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Grande.lua @@ -15,12 +15,21 @@ entity.onMobInitialize = function(mob) mob:addImmunity(xi.immunity.SILENCE) mob:addImmunity(xi.immunity.TERROR) mob:addImmunity(xi.immunity.PLAGUE) - mob:setMod(xi.mod.REGAIN, 300) +end + +entity.onMobSpawn = function(mob) mob:setMobMod(xi.mobMod.BASE_DAMAGE_MULTIPLIER, 150) + mob:setMod(xi.mod.REGAIN, 300) end entity.onAdditionalEffect = function(mob, target, damage) - return xi.mob.onAddEffect(mob, target, damage, xi.mob.ae.DISPEL, { chance = 5 }) + local pTable = + { + chance = 25, + element = xi.element.DARK, + } + + return xi.combat.action.executeAdditionalDispel(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams) diff --git a/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Media.lua b/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Media.lua index 8b2170755e8..f6accd9d4d1 100644 --- a/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Media.lua +++ b/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Media.lua @@ -15,12 +15,21 @@ entity.onMobInitialize = function(mob) mob:addImmunity(xi.immunity.SILENCE) mob:addImmunity(xi.immunity.TERROR) mob:addImmunity(xi.immunity.PLAGUE) - mob:setMod(xi.mod.REGAIN, 200) +end + +entity.onMobSpawn = function(mob) mob:setMobMod(xi.mobMod.BASE_DAMAGE_MULTIPLIER, 150) + mob:setMod(xi.mod.REGAIN, 200) end entity.onAdditionalEffect = function(mob, target, damage) - return xi.mob.onAddEffect(mob, target, damage, xi.mob.ae.DISPEL, { chance = 5 }) + local pTable = + { + chance = 25, + element = xi.element.DARK, + } + + return xi.combat.action.executeAdditionalDispel(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams) diff --git a/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Pequena.lua b/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Pequena.lua index 3d0168235d6..4aa7f5cb807 100644 --- a/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Pequena.lua +++ b/scripts/zones/The_Shrine_of_RuAvitau/mobs/Olla_Pequena.lua @@ -15,12 +15,21 @@ entity.onMobInitialize = function(mob) mob:addImmunity(xi.immunity.SILENCE) mob:addImmunity(xi.immunity.TERROR) mob:addImmunity(xi.immunity.PLAGUE) - mob:setMod(xi.mod.REGAIN, 100) +end + +entity.onMobSpawn = function(mob) mob:setMobMod(xi.mobMod.BASE_DAMAGE_MULTIPLIER, 150) + mob:setMod(xi.mod.REGAIN, 100) end entity.onAdditionalEffect = function(mob, target, damage) - return xi.mob.onAddEffect(mob, target, damage, xi.mob.ae.DISPEL, { chance = 5 }) + local pTable = + { + chance = 25, + element = xi.element.DARK, + } + + return xi.combat.action.executeAdditionalDispel(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams)