From e4b5ecb8e175e658d2abef456fd5cff5adf62400 Mon Sep 17 00:00:00 2001 From: MrSent Date: Sun, 10 May 2026 00:28:02 +0100 Subject: [PATCH 1/8] lua_baseentity getShieldSize amend to account for trust --- scripts/enum/mob_mod.lua | 1 + src/map/lua/lua_baseentity.cpp | 31 ++++++++++++++++++++++--------- src/map/mob_modifier.h | 1 + 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/scripts/enum/mob_mod.lua b/scripts/enum/mob_mod.lua index 965f26bdc95..64e90ad0acf 100644 --- a/scripts/enum/mob_mod.lua +++ b/scripts/enum/mob_mod.lua @@ -104,4 +104,5 @@ xi.mobMod = RANGED_ATTACK_RANGE = 93, -- Max range for ranged auto attacks. Mob will move closer if target is beyond this range. FOLLOW_LEASH_RANGE = 94, -- Distance the leader can walk before their followers start moving. Applied to followers. FOLLOW_STOP_RANGE = 95, -- Distance the followers attempt to stop at once their leader stops moving. Applied to followers. + SHIELD_SIZE_TRUST = 96, -- Set the size of the mob's shield. 3 = Default size, only used for trusts that use shields. } diff --git a/src/map/lua/lua_baseentity.cpp b/src/map/lua/lua_baseentity.cpp index 8bf41a9feff..cc281b2631c 100644 --- a/src/map/lua/lua_baseentity.cpp +++ b/src/map/lua/lua_baseentity.cpp @@ -5281,19 +5281,32 @@ bool CLuaBaseEntity::hasSlotEquipped(uint8 slot) int8 CLuaBaseEntity::getShieldSize() { - // TODO: Why is TYPE_PET being checked below, when we only act on TYPE_PC? - if (m_PBaseEntity->objtype != TYPE_PC && m_PBaseEntity->objtype != TYPE_PET) - { - ShowWarning("Entity is not a Player or Pet type (%s).", m_PBaseEntity->getName()); - return 0; - } + int8 shieldSize = 0; - if (m_PBaseEntity->objtype == TYPE_PC) + switch (m_PBaseEntity->objtype) { - return static_cast(m_PBaseEntity)->getShieldSize(); + case TYPE_PC: + { + shieldSize = static_cast(m_PBaseEntity)->getShieldSize(); + break; + } + case TYPE_TRUST: + { + constexpr int8 defaultTrustShieldSize = 3; + const int16 shieldMobModValue = static_cast(m_PBaseEntity)->getMobMod(MOBMOD_SHIELD_SIZE_TRUST); + const int8 trustShieldSize = static_cast(shieldMobModValue); + + shieldSize = trustShieldSize > 0 ? trustShieldSize : defaultTrustShieldSize; + break; + } + default: + { + ShowWarning("Entity is not a Player or Trust (%s).", m_PBaseEntity->getName()); + shieldSize = 0; + } } - return 0; + return shieldSize; } /************************************************************************ diff --git a/src/map/mob_modifier.h b/src/map/mob_modifier.h index 5b0dfcb66d6..e5bf8895825 100644 --- a/src/map/mob_modifier.h +++ b/src/map/mob_modifier.h @@ -124,6 +124,7 @@ enum MOBMODIFIER : int MOBMOD_RANGED_ATTACK_RANGE = 93, // Max range for ranged auto attacks. Mob will move closer if target is beyond this range. MOBMOD_FOLLOW_LEASH_RANGE = 94, // Distance the leader can walk before their followers start moving. Applied to followers. MOBMOD_FOLLOW_STOP_RANGE = 95, // Distance the followers attempt to stop at once their leader stops moving. Applied to followers. + MOBMOD_SHIELD_SIZE_TRUST = 96, // Set the size of the mob's shield. 3 = Default size, only used for trusts that use shields. }; #endif From 762f89f0aa71d8765d6af302d05814ee32075eb5 Mon Sep 17 00:00:00 2001 From: MrSent Date: Sun, 10 May 2026 00:30:35 +0100 Subject: [PATCH 2/8] trustentity.cpp: spawn, addition to set maxHP/maxMP for HP/MP mods --- src/map/entities/trustentity.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/map/entities/trustentity.cpp b/src/map/entities/trustentity.cpp index 5bc80abdb86..74ab7ddd6fd 100644 --- a/src/map/entities/trustentity.cpp +++ b/src/map/entities/trustentity.cpp @@ -119,6 +119,14 @@ void CTrustEntity::Spawn() // we need to skip CMobEntity's spawn because it calculates stats (and our stats are already calculated) CBattleEntity::Spawn(); luautils::OnMobSpawn(this); + + // Recompute derived HP/MP after spawn-time modifiers (e.g. HPP/MPP) + // and force current HP/MP to max so trusts start in a fully synchronized state. + UpdateHealth(); + health.hp = GetMaxHP(); + health.mp = GetMaxMP(); + updatemask |= UPDATE_HP; + static_cast(PMaster)->pushPacket(this); } From 72a4c6d77529fe78bb45c1d058c9cb8fe712e800 Mon Sep 17 00:00:00 2001 From: MrSent Date: Sun, 10 May 2026 00:31:32 +0100 Subject: [PATCH 3/8] trust script audit, set correct values and cleanup --- scripts/actions/spells/trust/aaev.lua | 83 +++++++++------ scripts/actions/spells/trust/aahm.lua | 57 +++++++---- scripts/actions/spells/trust/amchuchu.lua | 106 +++++++++++++------- scripts/actions/spells/trust/august.lua | 75 +++++++++----- scripts/actions/spells/trust/curilla.lua | 50 ++++++--- scripts/actions/spells/trust/gessho.lua | 29 ++++-- scripts/actions/spells/trust/mnejing.lua | 11 +- scripts/actions/spells/trust/rahal.lua | 60 +++++++---- scripts/actions/spells/trust/rughadjeen.lua | 50 +++++---- scripts/actions/spells/trust/trion.lua | 53 ++++++++-- scripts/actions/spells/trust/valaineral.lua | 6 +- scripts/enum/mob_skill.lua | 6 +- sql/mob_skills.sql | 4 +- 13 files changed, 398 insertions(+), 192 deletions(-) diff --git a/scripts/actions/spells/trust/aaev.lua b/scripts/actions/spells/trust/aaev.lua index b8799ac4950..4eb0e0f1ba8 100644 --- a/scripts/actions/spells/trust/aaev.lua +++ b/scripts/actions/spells/trust/aaev.lua @@ -1,5 +1,12 @@ ----------------------------------- -- Trust: AAEV +-- Possesses Fast Cast, Cure Potency Bonus+50%, Damage Taken-10%, HP+20%, MP+50%, Converts 5% of Damage Taken to MP. +-- Lacks Provoke; however, AAEV's additional Fast Cast trait reduces the recast time on Flash and Reprisal for solid enmity control. +-- AAEV has improved Shield stats compared to other trusts, implied by the [Nov 2021 Patch Notes]. This would also make her Reprisal better. +-- Ark Angel Elvaan doesn't use any WHM-only abilities or spells, but /WHM has Auto-Regen and Magic Defense Bonus, making her a good physical/magical hybrid tank. +-- Uses Rampart when her target is under the effects of Chainspell, Manafont, or Astral Flow. +-- Uses Shield Strike to interrupt enemies casting high tier spells. +-- Holds up to 2000 TP to try to close skillchains. ----------------------------------- ---@type TSpellTrust local spellObject = {} @@ -19,6 +26,7 @@ spellObject.onMobSpawn = function(mob) mob:setMobMod(xi.mobMod.CAN_PARRY, 3) local lvl = mob:getMainLvl() + local lastSynergyBonus = 0 local shieldMasteryPower = 0 if lvl >= 96 then @@ -32,13 +40,13 @@ spellObject.onMobSpawn = function(mob) end mob:setMod(xi.mod.SHIELD_MASTERY_TP, shieldMasteryPower) - mob:setMod(xi.mod.SHIELDBLOCKRATE, 45) -- 45% base block rate - mob:addMod(xi.mod.FASTCAST, 30) - mob:addMod(xi.mod.CURE_POTENCY, 50) - mob:addMod(xi.mod.DMG, -10) - mob:addMod(xi.mod.HPP, 20) - mob:addMod(xi.mod.ABSORB_PHYSDMG_TO_MP, 5) - local lastSynergyBonus = 0 + mob:setMod(xi.mod.SHIELDBLOCKRATE, 45) -- 45% base block rate at 99 from testing without reprisal on + mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% + mob:addMod(xi.mod.CURE_POTENCY, 50) -- Cure Potency Bonus+50% + mob:addMod(xi.mod.ENMITY, 25) -- Enmity+ + mob:addMod(xi.mod.DMG, -1000) -- Damage Taken -10% + mob:addMod(xi.mod.HPP, 20) -- HP+20% + mob:addMod(xi.mod.ABSORB_PHYSDMG_TO_MP, 5) -- Converts DMG to MP 5% -- Dynamic modifier that checks party member list on tick to apply mob:addListener('COMBAT_TICK', 'AAEV_CTICK', function(mobArg) @@ -75,40 +83,55 @@ spellObject.onMobSpawn = function(mob) mobArg:delMod(xi.mod.MEVA, lastSynergyBonus) -- Add the new bonus mobArg:addMod(xi.mod.MEVA, targetBonus) - -- Update lastSynergyBonus lastSynergyBonus = targetBonus end end) - ----------------------------------- - -- Gambits - ----------------------------------- - -- 1 condition - mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) - mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) - mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 50 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) - mob:addGambit(ai.t.TARGET, { ai.c.CASTING_ELE_MA_AOE, 0 }, { ai.r.MS, ai.s.SPECIFIC, 3714 }) -- Shield Strike - mob:addGambit(ai.t.TARGET, { ai.c.STATUS, xi.effect.MANAFONT }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.RAMPART }) - mob:addGambit(ai.t.TARGET, { ai.c.STATUS, xi.effect.CHAINSPELL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.RAMPART }) - mob:addGambit(ai.t.TARGET, { ai.c.STATUS, xi.effect.ASTRAL_FLOW }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.RAMPART }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.PHALANX }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.REPRISAL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REPRISAL }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.ENLIGHT }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.DIVINE_EMBLEM }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.DIVINE_EMBLEM }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PALISADE }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PALISADE }) - - -- 2 conditions - mob:addGambit(ai.t.SELF, { { ai.c.MPP_LT, 25 }, { ai.c.TP_GTE, 1000 }, }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.CHIVALRY }) + if lvl >= 15 then + mob:addGambit(ai.t.TARGET, { ai.c.CASTING_ELE_MA_AOE, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.SHIELD_STRIKE_TRUST }) + end + + if lvl >= 30 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) + end + + if lvl >= 50 then + mob:addGambit(ai.t.SELF, { { ai.c.MPP_LT, 50 }, { ai.c.TP_GTE, 1000 } }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.CHIVALRY }) + end + + if lvl >= 62 then + mob:addGambit(ai.t.TARGET, { ai.c.STATUS, xi.effect.MANAFONT }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.RAMPART }) + mob:addGambit(ai.t.TARGET, { ai.c.STATUS, xi.effect.CHAINSPELL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.RAMPART }) + mob:addGambit(ai.t.TARGET, { ai.c.STATUS, xi.effect.ASTRAL_FLOW }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.RAMPART }) + end + + if lvl >= 75 then + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.DIVINE_EMBLEM }) + end + + if lvl >= 95 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PALISADE }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PALISADE }) + end + + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) + mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) + mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 50 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.ENLIGHT }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.PHALANX }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.REPRISAL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REPRISAL }) + mob:addGambit(ai.t.PARTY, { ai.l.OR( + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.RANDOM, 2000) mob:addListener('WEAPONSKILL_USE', 'AAEV_WEAPONSKILL_USE', function(mobArg, target, skill, tp, action) local skillId = skill:getID() - if skillId == xi.mobSkill.ARROGANCE_INCARNATE_2 then + if skillId == xi.mobSkill.ARROGANCE_INCARNATE_TRUST then xi.trust.message(mobArg, xi.trust.messageOffset.SPECIAL_MOVE_1) - elseif skillId == xi.mobSkill.DOMINION_SLASH_2 then + elseif skillId == xi.mobSkill.DOMINION_SLASH_TRUST then xi.trust.message(mobArg, xi.trust.messageOffset.SPECIAL_MOVE_2) end end) diff --git a/scripts/actions/spells/trust/aahm.lua b/scripts/actions/spells/trust/aahm.lua index acd3c3f1e80..655e5d3dc1f 100644 --- a/scripts/actions/spells/trust/aahm.lua +++ b/scripts/actions/spells/trust/aahm.lua @@ -1,5 +1,12 @@ ----------------------------------- -- Trust: AAHM +-- Possesses HP+20% +-- Possesses an Utsusemi +1 trait which grants AA HM an extra shadow. +-- f there is a Tank in the party, behaves as a damage dealer: Uses Innin, Berserk. +-- If there are no other tanks in the party, behaves as a tank: Uses Yonin, Warcry. +-- Uses Provoke in both situations in order to be sub tank. +-- Casts debuffs when does not have hate. +-- Uses weapon skills at 1000 TP and does not try to skillchain. ----------------------------------- ---@type TSpellTrust local spellObject = {} @@ -17,10 +24,14 @@ spellObject.onMobSpawn = function(mob) mob:addMobMod(xi.mobMod.CAN_PARRY, 3) - mob:addMod(xi.mod.HPP, 20) - mob:addMod(xi.mod.UTSUSEMI_BONUS, 1) - mob:addMod(xi.mod.FASTCAST, 30) - mob:addMod(xi.mod.DUAL_WIELD, 10) + mob:addMod(xi.mod.UTSUSEMI_BONUS, 1) -- Utsusemi +1 trait which grants AAHM an extra shadow. + mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% + mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ + mob:addMod(xi.mod.DUAL_WIELD, 10) -- Dual Wield +10 + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 20) -- HP+20% + + local lvl = mob:getMainLvl() local lastSynergyBonus = 0 -- Dynamic modifier that checks party member list on tick to apply @@ -50,34 +61,38 @@ spellObject.onMobSpawn = function(mob) -- Determine what the bonus should be local targetBonus = (synergyCount == #synergyMembers) and 50 or 0 - -- Only update if the state has changed if targetBonus ~= lastSynergyBonus then -- Subtract exactly what we added last time mobArg:delMod(xi.mod.MEVA, lastSynergyBonus) -- Add the new bonus mobArg:addMod(xi.mod.MEVA, targetBonus) - -- Update lastSynergyBonus lastSynergyBonus = targetBonus end end) - ----------------------------------- - -- Gambits - ----------------------------------- - -- 1 condition - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.MIGAWARI }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.MIGAWARI_ICHI }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.COPY_IMAGE }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.UTSUSEMI }) - mob:addGambit(ai.t.TARGET, { ai.c.ALWAYS, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.HOJO }, 45) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.KURAYAMI }, 45) - - -- 2 conditions - mob:addGambit(ai.t.SELF, { { ai.c.PT_HAS_TANK, 0 }, { ai.c.NOT_STATUS, xi.effect.YONIN }, }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.YONIN }) - mob:addGambit(ai.t.SELF, { { ai.c.PT_HAS_TANK, 0 }, { ai.c.NOT_STATUS, xi.effect.WARCRY }, }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.WARCRY }) - mob:addGambit(ai.t.SELF, { { ai.c.NOT_PT_HAS_TANK, 0 }, { ai.c.NOT_STATUS, xi.effect.INNIN }, }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.INNIN }) - mob:addGambit(ai.t.SELF, { { ai.c.NOT_PT_HAS_TANK, 0 }, { ai.c.NOT_STATUS, xi.effect.BERSERK }, }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.BERSERK }) + if lvl >= 10 then + mob:addGambit(ai.t.TARGET, { ai.c.ALWAYS, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) + end + + if lvl >= 30 then + mob:addGambit(ai.t.SELF, { { ai.c.NOT_PT_HAS_TANK, 0 }, { ai.c.NOT_STATUS, xi.effect.BERSERK } }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.BERSERK }) + end + + if lvl >= 40 then + mob:addGambit(ai.t.SELF, { { ai.c.NOT_PT_HAS_TANK, 0 }, { ai.c.NOT_STATUS, xi.effect.INNIN } }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.INNIN }) + mob:addGambit(ai.t.SELF, { { ai.c.PT_HAS_TANK, 0 }, { ai.c.NOT_STATUS, xi.effect.YONIN } }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.YONIN }) + end + + if lvl >= 70 then + mob:addGambit(ai.t.SELF, { { ai.c.PT_HAS_TANK, 0 }, { ai.c.NOT_STATUS, xi.effect.WARCRY } }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.WARCRY }) + end + + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.MIGAWARI }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.MIGAWARI_ICHI }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.COPY_IMAGE }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.UTSUSEMI }) + mob:addGambit(ai.t.TARGET, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.HOJO }, 30) + mob:addGambit(ai.t.TARGET, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.KURAYAMI }, 30) mob:setTrustTPSkillSettings(ai.tp.ASAP, ai.s.RANDOM) diff --git a/scripts/actions/spells/trust/amchuchu.lua b/scripts/actions/spells/trust/amchuchu.lua index 0579e44a9f7..a05103e06ea 100644 --- a/scripts/actions/spells/trust/amchuchu.lua +++ b/scripts/actions/spells/trust/amchuchu.lua @@ -1,5 +1,13 @@ ----------------------------------- -- Trust: Amchuchu +-- Possesses Inspiration (50% Fast Cast effect during Vallation, is party-wide during Valiance), Converts 5% of Physical Damage Taken to MP. +-- Only casts enhancing spells on herself. +-- Uses Embolden when casting Protect. +-- She can rapidly generate Volatile Enmity for initial threat or recovery from enmity reset attacks with a cornucopia of abilties and spells like Provoke, Flash, and Foil. +-- Uses Runes resisting the element of the current day. After taking magic damage, uses the appropriate Bar-spell and changes runes. +-- Uses One for All in response to enemies casting high-tier damaging spells. +-- Magic Bursts Level 4 Light or Level 4 Darkness skillchains using Lunge. +-- Holds up to 3000 TP to close skillchains. Weapon skills are a lower priority, ----------------------------------- ---@type TSpellTrust local spellObject = {} @@ -17,41 +25,69 @@ spellObject.onMobSpawn = function(mob) mob:addMobMod(xi.mobMod.CAN_PARRY, 3) - mob:addMod(xi.mod.INSPIRATION_FAST_CAST, 50) - - ----------------------------------- - -- Gambits - ----------------------------------- - -- 1 condition - mob:addGambit(ai.t.SELF, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) - mob:addGambit(ai.t.TARGET, { ai.c.CASTING_ELE_MA_AOE, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.ONE_FOR_ALL }) - mob:addGambit(ai.t.TARGET, { ai.c.CASTING_ELE_MA_AOE, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.VALIANCE }) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.PHALANX }) - mob:addGambit(ai.t.SELF, { ai.c.NO_MAX_RUNE, 0 }, { ai.r.JA, ai.s.RUNE_DAY, xi.ja.IGNIS }) - mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 50 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.VIVACIOUS_PULSE }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SWORDPLAY }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SWORDPLAY }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.FOIL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FOIL }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.EMBOLDEN }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.EMBOLDEN }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PROTECT }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.PROTECT }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SHELL }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.SHELL }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.BERSERK }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.BERSERK }) - mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 75 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.BATTUTA }) - mob:addGambit(ai.t.TARGET, { ai.c.LUNGE_MB_AVAILABLE, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.LUNGE }) - mob:addGambit(ai.t.TARGET, { ai.c.LUNGE_MB_AVAILABLE, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SWIPE }) - mob:addGambit(ai.t.TARGET, { ai.c.CAST_ELE_MA_SELF, xi.effect.VALLATION }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.VALLATION }) - - -- 2 conditions - mob:addGambit(ai.t.TARGET, { { ai.c.CAST_ELE_MA_SELF, 0 }, { ai.c.NEED_ELE_BAREFFECT, 0 }, }, { ai.r.MA, ai.s.DEF_BAR_ELEMENT, 0 }) - mob:addGambit(ai.t.SELF, { { ai.c.NOT_STATUS, xi.effect.REGEN }, { ai.c.HPP_LT, 75 }, }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.REGEN }) - mob:addGambit(ai.t.SELF, { { ai.c.NOT_STATUS, xi.effect.REFRESH }, { ai.c.MPP_LT, 75 }, }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REFRESH }) - - -- 3 conditions - mob:addGambit( - ai.t.SELF, - { { ai.c.NOT_STATUS, xi.effect.STONESKIN }, { ai.c.HPP_LT, 75 }, { ai.c.MPP_GTE, 50 }, }, - { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.STONESKIN } - ) + mob:addMod(xi.mod.INSPIRATION_FAST_CAST, 50) -- 50% Fast Cast effect during Vallation, Converts 5% of Physical Damage Taken to MP. + mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 10) -- HP+10% + mob:addMod(xi.mod.MPP, 10) -- MP+10% + + local lvl = mob:getMainLvl() + + if lvl >= 5 then + mob:addGambit(ai.t.SELF, { ai.c.NO_MAX_RUNE, 0 }, { ai.r.JA, ai.s.RUNE_DAY, xi.ja.IGNIS }) + end + + if lvl >= 10 then + mob:addGambit(ai.t.TARGET, { ai.c.ALWAYS, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) + mob:addGambit(ai.t.TARGET, { ai.c.CAST_ELE_MA_SELF, xi.effect.VALLATION }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.VALLATION }) + end + + if lvl >= 20 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SWORDPLAY }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SWORDPLAY }) + end + + if lvl >= 25 then + mob:addGambit(ai.t.TARGET, { ai.c.LUNGE_MB_AVAILABLE, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.LUNGE }) + mob:addGambit(ai.t.TARGET, { ai.c.LUNGE_MB_AVAILABLE, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SWIPE }) + end + + if lvl >= 30 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.BERSERK }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.BERSERK }) + end + + if lvl >= 50 then + mob:addGambit(ai.t.TARGET, { ai.c.CASTING_ELE_MA_AOE, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.VALIANCE }) + end + + if lvl >= 60 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.EMBOLDEN }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.EMBOLDEN }) + end + + if lvl >= 65 then + mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 50 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.VIVACIOUS_PULSE }) + end + + if lvl >= 75 then + mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 75 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.BATTUTA }) + end + + if lvl >= 95 then + mob:addGambit(ai.t.TARGET, { ai.c.CASTING_ELE_MA_AOE, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.ONE_FOR_ALL }) + end + + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.PHALANX }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.FOIL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FOIL }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PROTECT }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.PROTECT }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SHELL }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.SHELL }) + + mob:addGambit(ai.t.TARGET, { { ai.c.CAST_ELE_MA_SELF, 0 }, { ai.c.NEED_ELE_BAREFFECT, 0 }, }, { ai.r.MA, ai.s.DEF_BAR_ELEMENT, 0 }) + mob:addGambit(ai.t.SELF, { { ai.c.NOT_STATUS, xi.effect.REGEN }, { ai.c.HPP_LT, 75 }, }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.REGEN }) + mob:addGambit(ai.t.SELF, { { ai.c.NOT_STATUS, xi.effect.REFRESH }, { ai.c.MPP_LT, 75 }, }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REFRESH }) + + mob:addGambit(ai.t.SELF, { { ai.c.NOT_STATUS, xi.effect.STONESKIN }, + { ai.c.HPP_LT, 75 }, + { ai.c.MPP_GTE, 50 }, },{ ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.STONESKIN }) mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.HIGHEST, 3000) diff --git a/scripts/actions/spells/trust/august.lua b/scripts/actions/spells/trust/august.lua index ed3fb8b24b7..17c41c92718 100644 --- a/scripts/actions/spells/trust/august.lua +++ b/scripts/actions/spells/trust/august.lua @@ -1,5 +1,18 @@ ----------------------------------- -- Trust: August +-- Possesses HP+10% +-- Uses Divine Emblem to enhance Holy II. +-- August's attacks are not affected by Sambas. +-- August wears the Founder's Gear and has accordingly all Killer Effects and high resistance to Terror. +-- August can switch weapons at will while auto attacking and performing weapon skills, it is unknown if this changes his damage type or is merely cosmetic. +-- August is considered to be wielding a Great Sword for the purposes of Damage Limit+ and Inundation. +-- Uses weapon skills at 1000 TP and does not try to skillchain. +-- Daybreak (~3 min cooldown, ~1 min 30 sec duration) +-- When August's HP drops below a certain threshold (~66%), he uses Daybreak if it's available which partially restores some HP and MP, resets his TP, and activates an aura with wings of light +-- Daybreak is a -50% PDT effect, full Erase, Stats boost, Regen, and Store TP +-- During Daybreak, August's next weapon skill will be Fulminous Fury or Noble Frenzy, followed by No Quarter +-- Daybreak is removed after the use of No Quarter. +-- Daybreak's cooldown starts when No Quarter is used. ----------------------------------- ---@type TSpellTrust local spellObject = {} @@ -20,6 +33,9 @@ spellObject.onMobSpawn = function(mob) [xi.magic.spell.MORIMAR] = xi.trust.messageOffset.TEAMWORK_4, }) + mob:setMobMod(xi.mobMod.CAN_SHIELD_BLOCK, 1) + mob:setMobMod(xi.mobMod.CAN_PARRY, 3) + local killerEffects = { xi.mod.VERMIN_KILLER, @@ -57,11 +73,11 @@ spellObject.onMobSpawn = function(mob) end mob:setMod(xi.mod.SHIELD_MASTERY_TP, shieldMasteryPower) - mob:addMod(xi.mod.DMG, -10) - mob:addMod(xi.mod.UFASTCAST, 50) -- August casts stupid fast - mob:setMod(xi.mod.SHIELDBLOCKRATE, xi.trust.modGrowthValMax(mob, 35)) -- around 35% max block rate at 99 from testing - mob:addMod(xi.mod.HPP, 10) - mob:addMod(xi.mod.ENMITY, 25) + mob:setMod(xi.mod.SHIELDBLOCKRATE, 35) -- around 35% max block rate at 99 from testing + mob:addMod(xi.mod.UFASTCAST, 50) -- August casts stupid fast + mob:addMod(xi.mod.DMG, -1000) -- Damage Taken -10% + mob:addMod(xi.mod.ENMITY, 25) -- Enmity+ + mob:addMod(xi.mod.HPP, 10) -- HP+10% -- Founders gear mods: August gets all effects from founders gear -- see xi.trust.modGrowthVal in trust.lua for current curve value @@ -76,9 +92,6 @@ spellObject.onMobSpawn = function(mob) mob:addMod(xi.mod.MATT, xi.trust.modGrowthValMax(mob, 60)) -- Founders gear: MATT + 60 -- there is a few more, but these make the most sense for now. - mob:setMobMod(xi.mobMod.CAN_SHIELD_BLOCK, 1) - mob:setMobMod(xi.mobMod.CAN_PARRY, 3) - mob:setAnimationSub(0) -- this is probably not needed but its here because August's daybreak status is tested against it. -- mob:addImmunity(xi.immunity.TERROR) -- this is wrong but we currently have no TERRORRES mod and no way to use one @@ -101,25 +114,35 @@ spellObject.onMobSpawn = function(mob) end end) - ----------------------------------- - -- Gambits - ----------------------------------- - - mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) - mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.REPRISAL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REPRISAL }) - mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 50 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PALISADE }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PALISADE }) - - -- Only uses Divine Emblen and Holy when daybreak active (subAnimation 5) - mob:addGambit(ai.t.SELF, { - { ai.c.SUB_ANIMATION, 5 }, - { ai.c.NOT_STATUS, xi.effect.DIVINE_EMBLEM }, }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.DIVINE_EMBLEM }) + if lvl >= 10 then + mob:addGambit(ai.t.TARGET, { ai.c.ALWAYS, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) + end + + if lvl >= 30 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) + end + + if lvl >= 95 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PALISADE }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PALISADE }) + end + + if lvl >= 75 then + -- Only uses Divine Emblen and Holy when daybreak active (subAnimation 5) + mob:addGambit(ai.t.SELF, { { ai.c.SUB_ANIMATION, 5 }, { ai.c.NOT_STATUS, xi.effect.DIVINE_EMBLEM }, }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.DIVINE_EMBLEM }) + end + + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) + mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.REPRISAL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REPRISAL }) + mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 50 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) + mob:addGambit(ai.t.PARTY, { ai.l.OR( + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + mob:addGambit(ai.t.TRIGGER_SELF_ACTION_TARGET, { - { ai.c.SUB_ANIMATION, 5 }, - { ai.c.STATUS, xi.effect.DIVINE_EMBLEM }, }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.HOLY }) + { ai.c.SUB_ANIMATION, 5 }, + { ai.c.STATUS, xi.effect.DIVINE_EMBLEM }, }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.HOLY }) mob:setMobSkillAttack(1197) diff --git a/scripts/actions/spells/trust/curilla.lua b/scripts/actions/spells/trust/curilla.lua index 1aeae0da211..1625e169ead 100644 --- a/scripts/actions/spells/trust/curilla.lua +++ b/scripts/actions/spells/trust/curilla.lua @@ -1,5 +1,9 @@ ----------------------------------- -- Trust: Curilla +-- Possesses MP+30%, Guardian (Sentinel enmity loss -95%), Sentinel Recast merited (-50 sec), Cure Potency Bonus+25%, and Cure Casting Time Down. +-- Does not use Provoke, but will use Flash. This leads to poor hate control. +-- Uses TP randomly and does not try to skillchain. +-- Cures players and trusts in yellow (<75%) HP. ----------------------------------- ---@type TSpellTrust local spellObject = {} @@ -22,30 +26,46 @@ spellObject.onMobSpawn = function(mob) mob:addListener('ABILITY_USE', 'SENTINEL_USE' .. 'ABILITY', function(mobArg, target, skill, action) if skill:getID() == xi.jobAbility.SENTINEL then - skill:setRecast(skill:getRecast() - 50) + skill:setRecast(skill:getRecast() - 50) -- Sentinel Recast merited (-50 sec) end end) mob:addListener('COMBAT_TICK', 'CURILLA_CTICK', function(mobArg) local effect = mob:getStatusEffect(xi.effect.SENTINEL) if effect and effect:getSubPower() ~= 95 then - effect:setSubPower(95) + effect:setSubPower(95) -- Guardian (Sentinel enmity loss -95%) end end) - mob:addMod(xi.mod.CURE_POTENCY, xi.trust.modGrowthValMax(mob, 25)) - mob:addMod(xi.mod.CURE_CAST_TIME, xi.trust.modGrowthValMax(mob, 50)) - mob:setMod(xi.mod.SENTINEL_EFFECT, xi.trust.modGrowthValMax(mob, 20)) - mob:addMod(xi.mod.ENHANCES_GUARDIAN, xi.trust.modGrowthValMax(mob, 30)) - mob:setMod(xi.mod.SHIELDBLOCKRATE, xi.trust.modGrowthValMax(mob, 25)) -- around 25% max block rate at 99 from testing - mob:addMod(xi.mod.DMG, -xi.trust.modGrowthValMax(mob, 10)) - mob:addMod(xi.mod.HPP, 10) - mob:addMod(xi.mod.MPP, 30) - mob:addMod(xi.mod.ENMITY, 25) - - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) - mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) + local lvl = mob:getMainLvl() + local shieldMasteryPower = 0 + + if lvl >= 96 then + shieldMasteryPower = 40 + elseif lvl >= 75 then + shieldMasteryPower = 30 + elseif lvl >= 50 then + shieldMasteryPower = 20 + elseif lvl >= 25 then + shieldMasteryPower = 10 + end + + mob:setMod(xi.mod.SHIELD_MASTERY_TP, shieldMasteryPower) + mob:addMod(xi.mod.ENHANCES_GUARDIAN, 30) -- Sentinel lasts around 30sec longer from testing + mob:setMod(xi.mod.SHIELDBLOCKRATE, 25) -- around 25% max block rate at 99 from testing + mob:addMod(xi.mod.CURE_CAST_TIME, 50) -- Cure Casting Time Down roughly 50% from testing + mob:addMod(xi.mod.CURE_POTENCY, 25) -- Cure Potency Bonus+25% + mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 10) -- HP+10% + mob:addMod(xi.mod.MPP, 30) -- MP+30% + + if lvl >= 30 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) + end + + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) + mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) mob:setTrustTPSkillSettings(ai.tp.ASAP, ai.s.RANDOM) end diff --git a/scripts/actions/spells/trust/gessho.lua b/scripts/actions/spells/trust/gessho.lua index fdd78b0a1a0..add1138633b 100644 --- a/scripts/actions/spells/trust/gessho.lua +++ b/scripts/actions/spells/trust/gessho.lua @@ -1,5 +1,8 @@ ----------------------------------- -- Trust: Gessho +-- Will only use the highest tier debuff available, but will use both Utsusemi spells. +-- Will maintain Yonin full time. +-- Holds TP until 1500 to try to close skillchains. ----------------------------------- ---@type TSpellTrust local spellObject = {} @@ -19,11 +22,25 @@ spellObject.onMobSpawn = function(mob) }) mob:addMobMod(xi.mobMod.CAN_PARRY, 1) + + mob:addMod(xi.mod.MAIN_DMG_RATING, xi.trust.modGrowthValMax(mob, 35)) + mob:addMod(xi.mod.DOUBLE_ATTACK, xi.trust.modGrowthValMax(mob, 15)) mob:addMod(xi.mod.ACC, xi.trust.modGrowthValMax(mob, 200)) mob:addMod(xi.mod.EVA, xi.trust.modGrowthValMax(mob, 125)) - mob:addMod(xi.mod.FASTCAST, xi.trust.modGrowthValMax(mob, 30)) - mob:addMod(xi.mod.DOUBLE_ATTACK, xi.trust.modGrowthValMax(mob, 15)) - mob:addMod(xi.mod.MAIN_DMG_RATING, xi.trust.modGrowthValMax(mob, 35)) + mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% + mob:addMod(xi.mod.ENMITY, 10) -- Enmity+ + + if lvl >= 5 then + mob:addGambit(ai.t.SELF, { ai.c.ALWAYS, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) + end + + if lvl >= 40 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.YONIN }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.YONIN }) + end + + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.COPY_IMAGE }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.UTSUSEMI }) + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.BLINDNESS }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.KURAYAMI }, 30) + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.SLOW }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.HOJO }, 30) mob:addListener('WEAPONSKILL_USE', 'GESSHO_WEAPONSKILL_USE', function(mobArg, target, skill, tp, action, damage) if skill:getID() == xi.mobSkill.SHIBARAKU_TRUST then -- Shibaraku @@ -32,12 +49,6 @@ spellObject.onMobSpawn = function(mob) end end) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.YONIN }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.YONIN }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.COPY_IMAGE }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.UTSUSEMI }) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.BLINDNESS }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.KURAYAMI }, 60) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.SLOW }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.HOJO }, 60) - mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.RANDOM, 1500) end diff --git a/scripts/actions/spells/trust/mnejing.lua b/scripts/actions/spells/trust/mnejing.lua index 2ee6445fff5..d905c0db582 100644 --- a/scripts/actions/spells/trust/mnejing.lua +++ b/scripts/actions/spells/trust/mnejing.lua @@ -17,9 +17,12 @@ spellObject.onMobSpawn = function(mob) mob:setMobMod(xi.mobMod.CAN_SHIELD_BLOCK, 1) mob:setMobMod(xi.mobMod.CAN_PARRY, 3) + mob:setMod(xi.mod.SHIELD_MASTERY_TP, 40) -- Possesses Barrier Module (Increased Shield Mastery) - mob:setMod(xi.mod.SHIELDBLOCKRATE, 45) -- Possesses Barrier Module (Increased Block Chance, 45% base block rate from testing) - mob:addMod(xi.mod.DMG, -375) -- Passive -37.5% Damage Taken Reduction. + mob:setMod(xi.mod.SHIELDBLOCKRATE, 45) -- Possesses Barrier Module (Increased Block Chance, 45% base block rate from testing) + mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ + mob:addMod(xi.mod.DMG, -375) -- Passive -37.5% Damage Taken Reduction. + mob:addMod(xi.mod.HPP, 20) -- HP+20% local lastSynergyBonus = 0 @@ -47,8 +50,8 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.TARGET, { ai.c.ALWAYS, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.PROVOKE_AUTOMATON }, 30) mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.FLASHBULB_AUTOMATON }, 45) - mob:addGambit(ai.t.TARGET, { ai.c.READYING_MS, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.SHIELD_BASH_AUTOMATON }, 60) - mob:addGambit(ai.t.TARGET, { ai.c.READYING_WS, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.SHIELD_BASH_AUTOMATON }, 60) + mob:addGambit(ai.t.TARGET, { ai.c.READYING_MS, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.SHIELD_BASH_AUTOMATON }, 30) + mob:addGambit(ai.t.TARGET, { ai.c.READYING_WS, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.SHIELD_BASH_AUTOMATON }, 30) mob:addGambit(ai.t.TARGET, { ai.c.STATUS_FLAG, xi.effectFlag.DISPELABLE }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.DISRUPTOR_AUTOMATON }, 15) mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.RANDOM, 1500) diff --git a/scripts/actions/spells/trust/rahal.lua b/scripts/actions/spells/trust/rahal.lua index ec73f64a7d9..603755d49be 100644 --- a/scripts/actions/spells/trust/rahal.lua +++ b/scripts/actions/spells/trust/rahal.lua @@ -1,5 +1,12 @@ ----------------------------------- -- Trust: Rahal +-- Possesses Dragon Killer. +-- Rahal is an aggressive tank who uses Berserk. +-- Prioritizes Flash over Provoke. +-- Will only cast Cure when a party member is below 33% health and will use the highest tier available. +-- Will only use Sentinel when he is below 35% health. +-- He tries to interrupt TP-abilities and high-tier spells with Shield Bash. +-- Holds up to 2500 TP to close skillchains. ----------------------------------- ---@type TSpellTrust local spellObject = {} @@ -13,7 +20,6 @@ spellObject.onSpellCast = function(caster, target, spell) end spellObject.onMobSpawn = function(mob) - -- Dragon Killer handled in mob_pool_mods xi.trust.teamworkMessage(mob, { [xi.magic.spell.TRION] = xi.trust.messageOffset.TEAMWORK_1, [xi.magic.spell.CURILLA] = xi.trust.messageOffset.TEAMWORK_2, @@ -21,24 +27,40 @@ spellObject.onMobSpawn = function(mob) [xi.magic.spell.EXCENMILLE_S] = xi.trust.messageOffset.TEAMWORK_4, }) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) - mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 33 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) - mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) - }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) - mob:addGambit(ai.t.TARGET, { ai.l.OR( - { ai.c.CASTING_MA, 0 }, - { ai.c.READYING_JA, 0 }, - { ai.c.READYING_MS, 0 }, - { ai.c.READYING_WS, 0 }) - }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SHIELD_BASH }) - mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 33 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.ENLIGHT }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.PHALANX }) - mob:addGambit(ai.t.MASTER, { ai.c.NOT_STATUS, xi.effect.BERSERK }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.BERSERK }) + -- Dragon Killer handled in mob_pool_mods + mob:addMod(xi.mod.ENMITY, 10) -- Enmity+ + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 10) -- HP+10% + + local lvl = mob:getMainLvl() + + if lvl >= 10 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) + end + + if lvl >= 15 then + mob:addGambit(ai.t.TARGET, { ai.l.OR( + { ai.c.CASTING_MA, 0 }, + { ai.c.READYING_JA, 0 }, + { ai.c.READYING_MS, 0 }, + { ai.c.READYING_WS, 0 }) }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SHIELD_BASH }) + end + + if lvl >= 30 then + mob:addGambit(ai.t.MASTER, { ai.c.NOT_STATUS, xi.effect.BERSERK }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.BERSERK }) + mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 35 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) + end + + mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 33 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.ENLIGHT }) + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.PHALANX }) + mob:addGambit(ai.t.TARGET, { ai.c.ALWAYS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) + mob:addGambit(ai.t.PARTY, { ai.l.OR( + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + + mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.HIGHEST, 2500) end diff --git a/scripts/actions/spells/trust/rughadjeen.lua b/scripts/actions/spells/trust/rughadjeen.lua index a14b25e69d9..76b514d747d 100644 --- a/scripts/actions/spells/trust/rughadjeen.lua +++ b/scripts/actions/spells/trust/rughadjeen.lua @@ -27,15 +27,17 @@ spellObject.onMobSpawn = function(mob) [xi.magic.spell.MIHLI_ALIAPOH] = xi.trust.messageOffset.TEAMWORK_5 }) - mob:addMod(xi.mod.HPP, 20) - mob:addMod(xi.mod.MPP, 20) - mob:addMod(xi.mod.FASTCAST, 30) - mob:addMod(xi.mod.CURE_POTENCY_RCVD, 30) - mob:addMod(xi.mod.DMG, -500) - mob:addMod(xi.mod.TRIPLE_ATTACK, 3) + mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% + mob:addMod(xi.mod.CURE_POTENCY_RCVD, 30) -- Cure Potency Received +30% + mob:addMod(xi.mod.TRIPLE_ATTACK, 3) -- 3% triple attack rat + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 20) -- HP+20% + mob:addMod(xi.mod.MPP, 20) -- HP+20% + + local lvl = mob:getMainLvl() -- Algol Additional Effect: Fire DMG, procs around 33%, dmg seems to be around 30 at lvl 99 from testing. - local potency = utils.clamp(math.floor(mob:getMainLvl() * 0.26), 3, 30) + local potency = utils.clamp(math.floor(lvl * 0.26), 3, 30) mob:addMod(xi.mod.ENSPELL, xi.element.FIRE) mob:addMod(xi.mod.ENSPELL_DMG, potency) mob:addMod(xi.mod.ENSPELL_CHANCE, 33) @@ -80,16 +82,30 @@ spellObject.onMobSpawn = function(mob) end end) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.DIVINE_EMBLEM }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.DIVINE_EMBLEM }) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_SC_AVAILABLE, 0 }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.HOLY }) - mob:addGambit(ai.t.PARTY, { ai.c.STATUS, xi.effect.SLEEP_I }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) - mob:addGambit(ai.t.PARTY, { ai.c.STATUS, xi.effect.SLEEP_II }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) - mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) - mob:addGambit(ai.t.TARGET, { ai.c.IS_ECOSYSTEM, xi.ecosystem.UNDEAD }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.HOLY_CIRCLE }) - mob:addGambit(ai.t.SELF, { ai.c.MPP_LT, 50 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.CHIVALRY }) - mob:addGambit(ai.t.PARTY_DEAD, { ai.c.MPP_GTE, 200 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.RAISE }) + if lvl >= 5 then + mob:addGambit(ai.t.TARGET, { ai.c.IS_ECOSYSTEM, xi.ecosystem.UNDEAD }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.HOLY_CIRCLE }) + end + + if lvl >= 30 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) + end + + if lvl >= 50 then + mob:addGambit(ai.t.SELF, { { ai.c.MPP_LT, 50 }, { ai.c.TP_GTE, 1000 } }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.CHIVALRY }) + end + + if lvl >= 75 then + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.DIVINE_EMBLEM }) + end + + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) + mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) + mob:addGambit(ai.t.PARTY_DEAD, { ai.c.MPP_GTE, 200 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.RAISE }) + mob:addGambit(ai.t.TARGET, { ai.c.IS_ECOSYSTEM, xi.ecosystem.UNDEAD }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.HOLY }) + mob:addGambit(ai.t.PARTY, { ai.l.OR( + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.ASAP, ai.s.RANDOM, 1000) diff --git a/scripts/actions/spells/trust/trion.lua b/scripts/actions/spells/trust/trion.lua index 09c41c9e1ad..054a71254b7 100644 --- a/scripts/actions/spells/trust/trion.lua +++ b/scripts/actions/spells/trust/trion.lua @@ -1,5 +1,10 @@ ----------------------------------- -- Trust: Trion +-- Royal Bash is stronger than a normal Shield Bash. +-- Royal Saviour is a secondary, stronger version of Sentinel. Trion alternates between this and the normal version of Sentinel. +-- Trion tries to interrupt TP-abilities with Royal Bash. +-- Uses TP randomly and does not try to skillchain. +-- With his two defensive TP moves, he's not likely to interrupt skillchains much. ----------------------------------- ---@type TSpellTrust local spellObject = {} @@ -22,16 +27,46 @@ spellObject.onMobSpawn = function(mob) mob:setMobMod(xi.mobMod.CAN_SHIELD_BLOCK, 1) mob:setMobMod(xi.mobMod.CAN_PARRY, 3) - mob:addMod(xi.mod.HPP, 10) - mob:addMod(xi.mod.MPP, 10) - mob:addMod(xi.mod.FASTCAST, 30) - mob:addMod(xi.mod.DMG, -1000) - mob:addMod(xi.mod.ENMITY, 25) + local lvl = mob:getMainLvl() + local shieldMasteryPower = 0 - mob:addGambit(ai.t.SELF, { ai.c.NOT_HAS_TOP_ENMITY, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) - mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) - mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) - mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) + if lvl >= 96 then + shieldMasteryPower = 40 + elseif lvl >= 75 then + shieldMasteryPower = 30 + elseif lvl >= 50 then + shieldMasteryPower = 20 + elseif lvl >= 25 then + shieldMasteryPower = 10 + end + + mob:setMod(xi.mod.SHIELD_MASTERY_TP, shieldMasteryPower) + mob:setMod(xi.mod.SHIELDBLOCKRATE, 35) -- Around 35% block rate at 99 from testing + mob:addMod(xi.mod.SPELLINTERRUPT, 30) -- Spell interruption rate decrease + mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% + mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 10) -- HP+10% + mob:addMod(xi.mod.MPP, 10) -- MP+10% + + if lvl >= 5 then + mob:addGambit(ai.t.SELF, { ai.c.ALWAYS, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) + end + + if lvl >= 15 then + mob:addGambit(ai.t.TARGET, { ai.l.OR( + { ai.c.CASTING_MA, 0 }, + { ai.c.READYING_JA, 0 }, + { ai.c.READYING_MS, 0 }, + { ai.c.READYING_WS, 0 }) }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.ROYAL_BASH_TRUST }, 60) + end + + if lvl >= 30 then + mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) + end + + mob:addGambit(ai.t.TARGET, { ai.c.NOT_STATUS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) + mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) mob:setTrustTPSkillSettings(ai.tp.RANDOM, ai.s.RANDOM, 1500) diff --git a/scripts/actions/spells/trust/valaineral.lua b/scripts/actions/spells/trust/valaineral.lua index 9e53f5cb094..79bab24f939 100644 --- a/scripts/actions/spells/trust/valaineral.lua +++ b/scripts/actions/spells/trust/valaineral.lua @@ -86,8 +86,10 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 70 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.ENLIGHT }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.PHALANX }) - mob:addGambit(ai.t.PARTY, { ai.c.STATUS, xi.effect.SLEEP_I }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) - mob:addGambit(ai.t.PARTY, { ai.c.STATUS, xi.effect.SLEEP_II }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + mob:addGambit(ai.t.PARTY, { ai.l.OR( + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.OPENER, ai.s.RANDOM, 2000) diff --git a/scripts/enum/mob_skill.lua b/scripts/enum/mob_skill.lua index d11e6cb081f..b68140e39b8 100644 --- a/scripts/enum/mob_skill.lua +++ b/scripts/enum/mob_skill.lua @@ -1223,9 +1223,9 @@ xi.mobSkill = CROSS_REAVER_3 = 3706, -- Ark Angel HM Trust - ARROGANCE_INCARNATE_2 = 3710, -- Ark Angel EV Trust - - DOMINION_SLASH_2 = 3712, -- Ark Angel EV Trust + ARROGANCE_INCARNATE_TRUST = 3710, -- Ark Angel EV Trust + DOMINION_SLASH_TRUST = 3712, -- Ark Angel EV Trust + SHIELD_STRIKE_TRUST = 3714, -- Ark Angel EV Trust ARROGANCE_INCARNATE_3 = 3728, diff --git a/sql/mob_skills.sql b/sql/mob_skills.sql index 24fe8247b84..794e389bf02 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -998,7 +998,7 @@ INSERT INTO `mob_skills` VALUES (962,663,'warp_in_aatt',0,0.0,22.0,500,0,1,0,0,0 -- INSERT INTO `mob_skills` VALUES (967,711,'eald1',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (968,676,'red_lotus_blade',0,0.0,7.0,2500,1500,4,0,0,0,3,6,0); INSERT INTO `mob_skills` VALUES (969,677,'flat_blade',0,0.0,7.0,2500,1500,4,0,0,0,8,0,0); -INSERT INTO `mob_skills` VALUES (970,678,'savage_blade',0,0.0,7.0,2500,1500,4,0,0,0,12,4,0); +INSERT INTO `mob_skills` VALUES (970,678,'savage_blade',0,0.0,7.0,2500,500,4,0,0,0,12,4,0); INSERT INTO `mob_skills` VALUES (971,669,'royal_bash',2,0.0,10.0,2000,500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (972,670,'royal_savior',1,0.0,15.0,2000,200,1,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (973,679,'red_lotus_blade',0,0.0,7.0,2500,1500,4,0,0,0,3,6,0); @@ -3221,7 +3221,7 @@ INSERT INTO `mob_skills` VALUES (3189,1508,'king_cobra_clamp',1,0.0,7.0,2000,150 -- INSERT INTO `mob_skills` VALUES (3190,2934,'red_lotus_blade',0,0.0,7.0,2000,1500,4,0,0,0,3,6,0); -- INSERT INTO `mob_skills` VALUES (3191,2935,'spirits_within',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (3192,681,'vorpal_blade',0,0.0,7.0,2000,1500,4,0,0,0,4,8,0); -- Trion -INSERT INTO `mob_skills` VALUES (3193,669,'royal_bash',0,0.0,7.0,0,1500,4,0,0,0,0,0,0); +INSERT INTO `mob_skills` VALUES (3193,669,'royal_bash', 0,0.0,7.0,2000,0,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (3194,670,'royal_savior',0,0.0,7.0,1000,1500,1,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (3195,671,'abyssal_drain',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); -- Zeid INSERT INTO `mob_skills` VALUES (3196,672,'abyssal_strike',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); From b6c317461f31f6fa1c7654ab00fcab2fea4a6c04 Mon Sep 17 00:00:00 2001 From: MrSent Date: Sun, 10 May 2026 00:44:10 +0100 Subject: [PATCH 4/8] accidental space in mob_skills.sql --- sql/mob_skills.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/mob_skills.sql b/sql/mob_skills.sql index 794e389bf02..81437646f7b 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -3221,7 +3221,7 @@ INSERT INTO `mob_skills` VALUES (3189,1508,'king_cobra_clamp',1,0.0,7.0,2000,150 -- INSERT INTO `mob_skills` VALUES (3190,2934,'red_lotus_blade',0,0.0,7.0,2000,1500,4,0,0,0,3,6,0); -- INSERT INTO `mob_skills` VALUES (3191,2935,'spirits_within',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (3192,681,'vorpal_blade',0,0.0,7.0,2000,1500,4,0,0,0,4,8,0); -- Trion -INSERT INTO `mob_skills` VALUES (3193,669,'royal_bash', 0,0.0,7.0,2000,0,4,0,0,0,0,0,0); +INSERT INTO `mob_skills` VALUES (3193,669,'royal_bash',0,0.0,7.0,2000,0,4,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (3194,670,'royal_savior',0,0.0,7.0,1000,1500,1,0,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (3195,671,'abyssal_drain',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); -- Zeid INSERT INTO `mob_skills` VALUES (3196,672,'abyssal_strike',0,0.0,7.0,2000,1500,4,0,0,0,0,0,0); From e675c9d299b53e45b1f5b9297ccf5074211254cc Mon Sep 17 00:00:00 2001 From: MrSent Date: Sun, 10 May 2026 01:20:01 +0100 Subject: [PATCH 5/8] Sanity check fixes for gambit spaces in trust scripts --- scripts/actions/spells/trust/aaev.lua | 9 +++++---- scripts/actions/spells/trust/amchuchu.lua | 7 ++++--- scripts/actions/spells/trust/august.lua | 11 ++++++----- scripts/actions/spells/trust/gessho.lua | 2 ++ scripts/actions/spells/trust/rahal.lua | 17 ++++++++--------- scripts/actions/spells/trust/rughadjeen.lua | 9 +++++---- scripts/actions/spells/trust/trion.lua | 10 +++++----- scripts/actions/spells/trust/valaineral.lua | 7 ++++--- 8 files changed, 39 insertions(+), 33 deletions(-) diff --git a/scripts/actions/spells/trust/aaev.lua b/scripts/actions/spells/trust/aaev.lua index 4eb0e0f1ba8..04920ad17c4 100644 --- a/scripts/actions/spells/trust/aaev.lua +++ b/scripts/actions/spells/trust/aaev.lua @@ -120,10 +120,11 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.ENLIGHT }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.PHALANX }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.REPRISAL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REPRISAL }) - mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + + mob:addGambit(ai.t.PARTY, { ai.l.OR( + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.RANDOM, 2000) diff --git a/scripts/actions/spells/trust/amchuchu.lua b/scripts/actions/spells/trust/amchuchu.lua index a05103e06ea..3ed733406ca 100644 --- a/scripts/actions/spells/trust/amchuchu.lua +++ b/scripts/actions/spells/trust/amchuchu.lua @@ -85,9 +85,10 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { { ai.c.NOT_STATUS, xi.effect.REGEN }, { ai.c.HPP_LT, 75 }, }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.REGEN }) mob:addGambit(ai.t.SELF, { { ai.c.NOT_STATUS, xi.effect.REFRESH }, { ai.c.MPP_LT, 75 }, }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REFRESH }) - mob:addGambit(ai.t.SELF, { { ai.c.NOT_STATUS, xi.effect.STONESKIN }, - { ai.c.HPP_LT, 75 }, - { ai.c.MPP_GTE, 50 }, },{ ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.STONESKIN }) + mob:addGambit(ai.t.SELF, { + { ai.c.NOT_STATUS, xi.effect.STONESKIN }, + { ai.c.HPP_LT, 75 }, + { ai.c.MPP_GTE, 50 }, }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.STONESKIN }) mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.HIGHEST, 3000) diff --git a/scripts/actions/spells/trust/august.lua b/scripts/actions/spells/trust/august.lua index 17c41c92718..3890272d419 100644 --- a/scripts/actions/spells/trust/august.lua +++ b/scripts/actions/spells/trust/august.lua @@ -135,14 +135,15 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.REPRISAL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REPRISAL }) mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 50 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) + mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:addGambit(ai.t.TRIGGER_SELF_ACTION_TARGET, { - { ai.c.SUB_ANIMATION, 5 }, - { ai.c.STATUS, xi.effect.DIVINE_EMBLEM }, }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.HOLY }) + { ai.c.SUB_ANIMATION, 5 }, + { ai.c.STATUS, xi.effect.DIVINE_EMBLEM }, }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.HOLY }) mob:setMobSkillAttack(1197) diff --git a/scripts/actions/spells/trust/gessho.lua b/scripts/actions/spells/trust/gessho.lua index add1138633b..a8e5007afc7 100644 --- a/scripts/actions/spells/trust/gessho.lua +++ b/scripts/actions/spells/trust/gessho.lua @@ -30,6 +30,8 @@ spellObject.onMobSpawn = function(mob) mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% mob:addMod(xi.mod.ENMITY, 10) -- Enmity+ + local lvl = mob:getMainLvl() + if lvl >= 5 then mob:addGambit(ai.t.SELF, { ai.c.ALWAYS, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) end diff --git a/scripts/actions/spells/trust/rahal.lua b/scripts/actions/spells/trust/rahal.lua index 603755d49be..2afb9dc7de5 100644 --- a/scripts/actions/spells/trust/rahal.lua +++ b/scripts/actions/spells/trust/rahal.lua @@ -40,10 +40,10 @@ spellObject.onMobSpawn = function(mob) if lvl >= 15 then mob:addGambit(ai.t.TARGET, { ai.l.OR( - { ai.c.CASTING_MA, 0 }, - { ai.c.READYING_JA, 0 }, - { ai.c.READYING_MS, 0 }, - { ai.c.READYING_WS, 0 }) }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SHIELD_BASH }) + { ai.c.CASTING_MA, 0 }, + { ai.c.READYING_JA, 0 }, + { ai.c.READYING_MS, 0 }, + { ai.c.READYING_WS, 0 }) }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SHIELD_BASH }) end if lvl >= 30 then @@ -55,12 +55,11 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.ENLIGHT }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.PHALANX }) mob:addGambit(ai.t.TARGET, { ai.c.ALWAYS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) - mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) - + mob:addGambit(ai.t.PARTY, { ai.l.OR( + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.HIGHEST, 2500) end diff --git a/scripts/actions/spells/trust/rughadjeen.lua b/scripts/actions/spells/trust/rughadjeen.lua index 76b514d747d..0d3744d00a8 100644 --- a/scripts/actions/spells/trust/rughadjeen.lua +++ b/scripts/actions/spells/trust/rughadjeen.lua @@ -102,10 +102,11 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) mob:addGambit(ai.t.PARTY_DEAD, { ai.c.MPP_GTE, 200 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.RAISE }) mob:addGambit(ai.t.TARGET, { ai.c.IS_ECOSYSTEM, xi.ecosystem.UNDEAD }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.HOLY }) - mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + + mob:addGambit(ai.t.PARTY, { ai.l.OR( + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.ASAP, ai.s.RANDOM, 1000) diff --git a/scripts/actions/spells/trust/trion.lua b/scripts/actions/spells/trust/trion.lua index 054a71254b7..ecec674281d 100644 --- a/scripts/actions/spells/trust/trion.lua +++ b/scripts/actions/spells/trust/trion.lua @@ -1,6 +1,6 @@ ----------------------------------- -- Trust: Trion --- Royal Bash is stronger than a normal Shield Bash. +-- Royal Bash is stronger than a normal Shield Bash. -- Royal Saviour is a secondary, stronger version of Sentinel. Trion alternates between this and the normal version of Sentinel. -- Trion tries to interrupt TP-abilities with Royal Bash. -- Uses TP randomly and does not try to skillchain. @@ -55,10 +55,10 @@ spellObject.onMobSpawn = function(mob) if lvl >= 15 then mob:addGambit(ai.t.TARGET, { ai.l.OR( - { ai.c.CASTING_MA, 0 }, - { ai.c.READYING_JA, 0 }, - { ai.c.READYING_MS, 0 }, - { ai.c.READYING_WS, 0 }) }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.ROYAL_BASH_TRUST }, 60) + { ai.c.CASTING_MA, 0 }, + { ai.c.READYING_JA, 0 }, + { ai.c.READYING_MS, 0 }, + { ai.c.READYING_WS, 0 }) }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.ROYAL_BASH_TRUST }, 60) end if lvl >= 30 then diff --git a/scripts/actions/spells/trust/valaineral.lua b/scripts/actions/spells/trust/valaineral.lua index 79bab24f939..3db1feb374a 100644 --- a/scripts/actions/spells/trust/valaineral.lua +++ b/scripts/actions/spells/trust/valaineral.lua @@ -86,10 +86,11 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 70 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.ENLIGHT }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.PHALANX }) + mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + { ai.c.STATUS, xi.effect.SLEEP_I }, + { ai.c.STATUS, xi.effect.SLEEP_II }, + { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.OPENER, ai.s.RANDOM, 2000) From 1c989962cbad76eba9833096b79a2979d3ffe2cc Mon Sep 17 00:00:00 2001 From: MrSent Date: Sun, 10 May 2026 14:17:35 +0100 Subject: [PATCH 6/8] trustentity addition for getShieldSize() and default shield size --- src/map/entities/trustentity.cpp | 7 +++++++ src/map/entities/trustentity.h | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/map/entities/trustentity.cpp b/src/map/entities/trustentity.cpp index 74ab7ddd6fd..68f47d0fd8c 100644 --- a/src/map/entities/trustentity.cpp +++ b/src/map/entities/trustentity.cpp @@ -36,6 +36,7 @@ #include "enmity_container.h" #include "mob_spell_container.h" #include "mob_spell_list.h" +#include "mob_modifier.h" #include "packets/entity_set_name.h" #include "packets/entity_update.h" #include "packets/s2c/0x029_battle_message.h" @@ -68,6 +69,12 @@ CTrustEntity::~CTrustEntity() TracyZoneScoped; } +auto CTrustEntity::getShieldSize() -> int8 +{ + const auto shieldSizeMod = static_cast(getMobMod(MOBMOD_TRUST_SHIELD_SIZE)); + return shieldSizeMod > 0 ? shieldSizeMod : m_defaultShieldSize; +} + void CTrustEntity::PostTick() { // NOTE: This is purposefully calling CBattleEntity's impl. diff --git a/src/map/entities/trustentity.h b/src/map/entities/trustentity.h index a5b5e836f8f..c29cd3254be 100644 --- a/src/map/entities/trustentity.h +++ b/src/map/entities/trustentity.h @@ -38,6 +38,8 @@ class CTrustEntity : public CMobEntity explicit CTrustEntity(CCharEntity*); ~CTrustEntity() override; + auto getShieldSize() -> int8; + void PostTick() override; void FadeOut() override; void Die() override; @@ -50,6 +52,8 @@ class CTrustEntity : public CMobEntity void OnWeaponSkillFinished(CWeaponSkillState& state, action_t& action) override; uint32 m_TrustID{}; +private: + static constexpr int8 m_defaultShieldSize = 3; }; #endif From b91f83e8e8c217bfae68ff3c2a0036df6fe09e23 Mon Sep 17 00:00:00 2001 From: MrSent Date: Sun, 10 May 2026 14:19:19 +0100 Subject: [PATCH 7/8] naming prefix MOBMOD_TRUST amendment and remove unnecessary comments --- scripts/actions/spells/trust/aaev.lua | 14 +++++++------- scripts/actions/spells/trust/aahm.lua | 14 +++++++------- scripts/actions/spells/trust/amchuchu.lua | 10 +++++----- scripts/actions/spells/trust/august.lua | 10 +++++----- scripts/actions/spells/trust/mnejing.lua | 10 +++++----- scripts/actions/spells/trust/rahal.lua | 6 +++--- scripts/actions/spells/trust/trion.lua | 14 +++++++------- scripts/actions/spells/trust/valaineral.lua | 18 +++++++++--------- scripts/enum/mob_mod.lua | 2 +- src/map/entities/trustentity.cpp | 2 +- src/map/entities/trustentity.h | 1 + src/map/lua/lua_baseentity.cpp | 10 ++-------- src/map/mob_modifier.h | 2 +- 13 files changed, 54 insertions(+), 59 deletions(-) diff --git a/scripts/actions/spells/trust/aaev.lua b/scripts/actions/spells/trust/aaev.lua index 04920ad17c4..678a857db37 100644 --- a/scripts/actions/spells/trust/aaev.lua +++ b/scripts/actions/spells/trust/aaev.lua @@ -40,13 +40,13 @@ spellObject.onMobSpawn = function(mob) end mob:setMod(xi.mod.SHIELD_MASTERY_TP, shieldMasteryPower) - mob:setMod(xi.mod.SHIELDBLOCKRATE, 45) -- 45% base block rate at 99 from testing without reprisal on - mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% - mob:addMod(xi.mod.CURE_POTENCY, 50) -- Cure Potency Bonus+50% - mob:addMod(xi.mod.ENMITY, 25) -- Enmity+ - mob:addMod(xi.mod.DMG, -1000) -- Damage Taken -10% - mob:addMod(xi.mod.HPP, 20) -- HP+20% - mob:addMod(xi.mod.ABSORB_PHYSDMG_TO_MP, 5) -- Converts DMG to MP 5% + mob:setMod(xi.mod.SHIELDBLOCKRATE, 45) + mob:addMod(xi.mod.FASTCAST, 30) + mob:addMod(xi.mod.CURE_POTENCY, 50) + mob:addMod(xi.mod.ENMITY, 25) + mob:addMod(xi.mod.DMG, -1000) -- Damage Taken -10% + mob:addMod(xi.mod.HPP, 20) + mob:addMod(xi.mod.ABSORB_PHYSDMG_TO_MP, 5) -- Dynamic modifier that checks party member list on tick to apply mob:addListener('COMBAT_TICK', 'AAEV_CTICK', function(mobArg) diff --git a/scripts/actions/spells/trust/aahm.lua b/scripts/actions/spells/trust/aahm.lua index 655e5d3dc1f..41aff9f7c38 100644 --- a/scripts/actions/spells/trust/aahm.lua +++ b/scripts/actions/spells/trust/aahm.lua @@ -2,7 +2,7 @@ -- Trust: AAHM -- Possesses HP+20% -- Possesses an Utsusemi +1 trait which grants AA HM an extra shadow. --- f there is a Tank in the party, behaves as a damage dealer: Uses Innin, Berserk. +-- If there is a Tank in the party, behaves as a damage dealer: Uses Innin, Berserk. -- If there are no other tanks in the party, behaves as a tank: Uses Yonin, Warcry. -- Uses Provoke in both situations in order to be sub tank. -- Casts debuffs when does not have hate. @@ -24,12 +24,12 @@ spellObject.onMobSpawn = function(mob) mob:addMobMod(xi.mobMod.CAN_PARRY, 3) - mob:addMod(xi.mod.UTSUSEMI_BONUS, 1) -- Utsusemi +1 trait which grants AAHM an extra shadow. - mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% - mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ - mob:addMod(xi.mod.DUAL_WIELD, 10) -- Dual Wield +10 - mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% - mob:addMod(xi.mod.HPP, 20) -- HP+20% + mob:addMod(xi.mod.UTSUSEMI_BONUS, 1) + mob:addMod(xi.mod.FASTCAST, 30) + mob:addMod(xi.mod.ENMITY, 15) + mob:addMod(xi.mod.DUAL_WIELD, 10) + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 20) local lvl = mob:getMainLvl() local lastSynergyBonus = 0 diff --git a/scripts/actions/spells/trust/amchuchu.lua b/scripts/actions/spells/trust/amchuchu.lua index 3ed733406ca..155f0d9b551 100644 --- a/scripts/actions/spells/trust/amchuchu.lua +++ b/scripts/actions/spells/trust/amchuchu.lua @@ -25,11 +25,11 @@ spellObject.onMobSpawn = function(mob) mob:addMobMod(xi.mobMod.CAN_PARRY, 3) - mob:addMod(xi.mod.INSPIRATION_FAST_CAST, 50) -- 50% Fast Cast effect during Vallation, Converts 5% of Physical Damage Taken to MP. - mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ - mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% - mob:addMod(xi.mod.HPP, 10) -- HP+10% - mob:addMod(xi.mod.MPP, 10) -- MP+10% + mob:addMod(xi.mod.INSPIRATION_FAST_CAST, 50) + mob:addMod(xi.mod.ENMITY, 15) + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 10) + mob:addMod(xi.mod.MPP, 10) local lvl = mob:getMainLvl() diff --git a/scripts/actions/spells/trust/august.lua b/scripts/actions/spells/trust/august.lua index 3890272d419..451275f749d 100644 --- a/scripts/actions/spells/trust/august.lua +++ b/scripts/actions/spells/trust/august.lua @@ -73,11 +73,11 @@ spellObject.onMobSpawn = function(mob) end mob:setMod(xi.mod.SHIELD_MASTERY_TP, shieldMasteryPower) - mob:setMod(xi.mod.SHIELDBLOCKRATE, 35) -- around 35% max block rate at 99 from testing - mob:addMod(xi.mod.UFASTCAST, 50) -- August casts stupid fast - mob:addMod(xi.mod.DMG, -1000) -- Damage Taken -10% - mob:addMod(xi.mod.ENMITY, 25) -- Enmity+ - mob:addMod(xi.mod.HPP, 10) -- HP+10% + mob:setMod(xi.mod.SHIELDBLOCKRATE, 35) + mob:addMod(xi.mod.UFASTCAST, 50) + mob:addMod(xi.mod.DMG, -1000) -- Damage Taken -10% + mob:addMod(xi.mod.ENMITY, 25) + mob:addMod(xi.mod.HPP, 10) -- Founders gear mods: August gets all effects from founders gear -- see xi.trust.modGrowthVal in trust.lua for current curve value diff --git a/scripts/actions/spells/trust/mnejing.lua b/scripts/actions/spells/trust/mnejing.lua index d905c0db582..fac4b875915 100644 --- a/scripts/actions/spells/trust/mnejing.lua +++ b/scripts/actions/spells/trust/mnejing.lua @@ -18,11 +18,11 @@ spellObject.onMobSpawn = function(mob) mob:setMobMod(xi.mobMod.CAN_SHIELD_BLOCK, 1) mob:setMobMod(xi.mobMod.CAN_PARRY, 3) - mob:setMod(xi.mod.SHIELD_MASTERY_TP, 40) -- Possesses Barrier Module (Increased Shield Mastery) - mob:setMod(xi.mod.SHIELDBLOCKRATE, 45) -- Possesses Barrier Module (Increased Block Chance, 45% base block rate from testing) - mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ - mob:addMod(xi.mod.DMG, -375) -- Passive -37.5% Damage Taken Reduction. - mob:addMod(xi.mod.HPP, 20) -- HP+20% + mob:setMod(xi.mod.SHIELD_MASTERY_TP, 40) + mob:setMod(xi.mod.SHIELDBLOCKRATE, 45) + mob:addMod(xi.mod.ENMITY, 15) + mob:addMod(xi.mod.DMG, -375) -- Passive -37.5% Damage Taken Reduction. + mob:addMod(xi.mod.HPP, 20) local lastSynergyBonus = 0 diff --git a/scripts/actions/spells/trust/rahal.lua b/scripts/actions/spells/trust/rahal.lua index 2afb9dc7de5..a6b76c0cd3f 100644 --- a/scripts/actions/spells/trust/rahal.lua +++ b/scripts/actions/spells/trust/rahal.lua @@ -28,9 +28,9 @@ spellObject.onMobSpawn = function(mob) }) -- Dragon Killer handled in mob_pool_mods - mob:addMod(xi.mod.ENMITY, 10) -- Enmity+ - mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% - mob:addMod(xi.mod.HPP, 10) -- HP+10% + mob:addMod(xi.mod.ENMITY, 10) + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 10) local lvl = mob:getMainLvl() diff --git a/scripts/actions/spells/trust/trion.lua b/scripts/actions/spells/trust/trion.lua index ecec674281d..d9665def099 100644 --- a/scripts/actions/spells/trust/trion.lua +++ b/scripts/actions/spells/trust/trion.lua @@ -41,13 +41,13 @@ spellObject.onMobSpawn = function(mob) end mob:setMod(xi.mod.SHIELD_MASTERY_TP, shieldMasteryPower) - mob:setMod(xi.mod.SHIELDBLOCKRATE, 35) -- Around 35% block rate at 99 from testing - mob:addMod(xi.mod.SPELLINTERRUPT, 30) -- Spell interruption rate decrease - mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% - mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ - mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% - mob:addMod(xi.mod.HPP, 10) -- HP+10% - mob:addMod(xi.mod.MPP, 10) -- MP+10% + mob:setMod(xi.mod.SHIELDBLOCKRATE, 35) + mob:addMod(xi.mod.SPELLINTERRUPT, 30) + mob:addMod(xi.mod.FASTCAST, 30) + mob:addMod(xi.mod.ENMITY, 15) + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 10) + mob:addMod(xi.mod.MPP, 10) if lvl >= 5 then mob:addGambit(ai.t.SELF, { ai.c.ALWAYS, 0 }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.PROVOKE }) diff --git a/scripts/actions/spells/trust/valaineral.lua b/scripts/actions/spells/trust/valaineral.lua index 3db1feb374a..3d44118f245 100644 --- a/scripts/actions/spells/trust/valaineral.lua +++ b/scripts/actions/spells/trust/valaineral.lua @@ -37,15 +37,15 @@ spellObject.onMobSpawn = function(mob) end mob:setMod(xi.mod.SHIELD_MASTERY_TP, shieldMasteryPower) - mob:setMod(xi.mod.SHIELDBLOCKRATE, 35) -- Around 35% block rate at 99 from testing without reprisal on - mob:addMod(xi.mod.SPELLINTERRUPT, 30) -- Spell interruption rate decrease - mob:addMod(xi.mod.CURE_POTENCY, 50) -- Cure Potency Bonus+50% - mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% - mob:addMod(xi.mod.REFRESH, 2) -- PLD auto refresh +2mp a tick Refresh+ - mob:addMod(xi.mod.ENMITY, 25) -- Enmity+ - mob:addMod(xi.mod.DMG, -800) -- Damage Taken -8% - mob:addMod(xi.mod.HPP, 10) -- HP+10% - mob:addMod(xi.mod.MPP, 20) -- MP+20% + mob:setMod(xi.mod.SHIELDBLOCKRATE, 35) + mob:addMod(xi.mod.SPELLINTERRUPT, 30) + mob:addMod(xi.mod.CURE_POTENCY, 50) + mob:addMod(xi.mod.FASTCAST, 30) + mob:addMod(xi.mod.REFRESH, 2) + mob:addMod(xi.mod.ENMITY, 25) + mob:addMod(xi.mod.DMG, -800) -- Damage Taken -8% + mob:addMod(xi.mod.HPP, 10) + mob:addMod(xi.mod.MPP, 20) if lvl >= 1 then mob:addGambit(ai.t.TARGET, { ai.c.VAL_URIEL_CHECK, 0 }, { ai.r.MS, ai.s.SPECIFIC, xi.mobSkill.URIEL_BLADE_1 }) diff --git a/scripts/enum/mob_mod.lua b/scripts/enum/mob_mod.lua index 64e90ad0acf..92d7601f179 100644 --- a/scripts/enum/mob_mod.lua +++ b/scripts/enum/mob_mod.lua @@ -104,5 +104,5 @@ xi.mobMod = RANGED_ATTACK_RANGE = 93, -- Max range for ranged auto attacks. Mob will move closer if target is beyond this range. FOLLOW_LEASH_RANGE = 94, -- Distance the leader can walk before their followers start moving. Applied to followers. FOLLOW_STOP_RANGE = 95, -- Distance the followers attempt to stop at once their leader stops moving. Applied to followers. - SHIELD_SIZE_TRUST = 96, -- Set the size of the mob's shield. 3 = Default size, only used for trusts that use shields. + TRUST_SHIELD_SIZE = 96, -- TRUSTS ONLY: Set the size of the mob's shield. 3 = Default size, only used for trusts that use shields. } diff --git a/src/map/entities/trustentity.cpp b/src/map/entities/trustentity.cpp index 68f47d0fd8c..6b159228f60 100644 --- a/src/map/entities/trustentity.cpp +++ b/src/map/entities/trustentity.cpp @@ -34,9 +34,9 @@ #include "ai/states/weaponskill_state.h" #include "attack.h" #include "enmity_container.h" +#include "mob_modifier.h" #include "mob_spell_container.h" #include "mob_spell_list.h" -#include "mob_modifier.h" #include "packets/entity_set_name.h" #include "packets/entity_update.h" #include "packets/s2c/0x029_battle_message.h" diff --git a/src/map/entities/trustentity.h b/src/map/entities/trustentity.h index c29cd3254be..3aae5c371e6 100644 --- a/src/map/entities/trustentity.h +++ b/src/map/entities/trustentity.h @@ -52,6 +52,7 @@ class CTrustEntity : public CMobEntity void OnWeaponSkillFinished(CWeaponSkillState& state, action_t& action) override; uint32 m_TrustID{}; + private: static constexpr int8 m_defaultShieldSize = 3; }; diff --git a/src/map/lua/lua_baseentity.cpp b/src/map/lua/lua_baseentity.cpp index cc281b2631c..2e36a2dd601 100644 --- a/src/map/lua/lua_baseentity.cpp +++ b/src/map/lua/lua_baseentity.cpp @@ -5287,17 +5287,11 @@ int8 CLuaBaseEntity::getShieldSize() { case TYPE_PC: { - shieldSize = static_cast(m_PBaseEntity)->getShieldSize(); - break; + return static_cast(m_PBaseEntity)->getShieldSize(); } case TYPE_TRUST: { - constexpr int8 defaultTrustShieldSize = 3; - const int16 shieldMobModValue = static_cast(m_PBaseEntity)->getMobMod(MOBMOD_SHIELD_SIZE_TRUST); - const int8 trustShieldSize = static_cast(shieldMobModValue); - - shieldSize = trustShieldSize > 0 ? trustShieldSize : defaultTrustShieldSize; - break; + return static_cast(m_PBaseEntity)->getShieldSize(); } default: { diff --git a/src/map/mob_modifier.h b/src/map/mob_modifier.h index e5bf8895825..c4735338584 100644 --- a/src/map/mob_modifier.h +++ b/src/map/mob_modifier.h @@ -124,7 +124,7 @@ enum MOBMODIFIER : int MOBMOD_RANGED_ATTACK_RANGE = 93, // Max range for ranged auto attacks. Mob will move closer if target is beyond this range. MOBMOD_FOLLOW_LEASH_RANGE = 94, // Distance the leader can walk before their followers start moving. Applied to followers. MOBMOD_FOLLOW_STOP_RANGE = 95, // Distance the followers attempt to stop at once their leader stops moving. Applied to followers. - MOBMOD_SHIELD_SIZE_TRUST = 96, // Set the size of the mob's shield. 3 = Default size, only used for trusts that use shields. + MOBMOD_TRUST_SHIELD_SIZE = 96, // TRUSTS ONLY: Set the size of the mob's shield. 3 = Default size, only used for trusts that use shields. }; #endif From fab3a748f4beb6171e6abe1bcaf7b0e495b43171 Mon Sep 17 00:00:00 2001 From: MrSent Date: Sun, 10 May 2026 17:24:02 +0100 Subject: [PATCH 8/8] Change party wake on sleep gambits to only check for SLEEP_I --- scripts/actions/spells/trust/aaev.lua | 6 +----- scripts/actions/spells/trust/august.lua | 6 +----- scripts/actions/spells/trust/curilla.lua | 16 ++++++++-------- scripts/actions/spells/trust/gessho.lua | 4 ++-- scripts/actions/spells/trust/rahal.lua | 6 +----- scripts/actions/spells/trust/rughadjeen.lua | 18 +++++++----------- scripts/actions/spells/trust/valaineral.lua | 6 +----- 7 files changed, 21 insertions(+), 41 deletions(-) diff --git a/scripts/actions/spells/trust/aaev.lua b/scripts/actions/spells/trust/aaev.lua index 678a857db37..e5078d100f6 100644 --- a/scripts/actions/spells/trust/aaev.lua +++ b/scripts/actions/spells/trust/aaev.lua @@ -120,11 +120,7 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.ENLIGHT }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.PHALANX }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.REPRISAL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REPRISAL }) - - mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + mob:addGambit(ai.t.PARTY, { ai.c.STATUS, xi.effect.SLEEP_I }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.RANDOM, 2000) diff --git a/scripts/actions/spells/trust/august.lua b/scripts/actions/spells/trust/august.lua index 451275f749d..871684441c4 100644 --- a/scripts/actions/spells/trust/august.lua +++ b/scripts/actions/spells/trust/august.lua @@ -135,11 +135,7 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.REPRISAL }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.REPRISAL }) mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 50 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) - - mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + mob:addGambit(ai.t.PARTY, { ai.c.STATUS, xi.effect.SLEEP_I }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:addGambit(ai.t.TRIGGER_SELF_ACTION_TARGET, { { ai.c.SUB_ANIMATION, 5 }, diff --git a/scripts/actions/spells/trust/curilla.lua b/scripts/actions/spells/trust/curilla.lua index 1625e169ead..e1d56ecbaaa 100644 --- a/scripts/actions/spells/trust/curilla.lua +++ b/scripts/actions/spells/trust/curilla.lua @@ -51,14 +51,14 @@ spellObject.onMobSpawn = function(mob) end mob:setMod(xi.mod.SHIELD_MASTERY_TP, shieldMasteryPower) - mob:addMod(xi.mod.ENHANCES_GUARDIAN, 30) -- Sentinel lasts around 30sec longer from testing - mob:setMod(xi.mod.SHIELDBLOCKRATE, 25) -- around 25% max block rate at 99 from testing - mob:addMod(xi.mod.CURE_CAST_TIME, 50) -- Cure Casting Time Down roughly 50% from testing - mob:addMod(xi.mod.CURE_POTENCY, 25) -- Cure Potency Bonus+25% - mob:addMod(xi.mod.ENMITY, 15) -- Enmity+ - mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% - mob:addMod(xi.mod.HPP, 10) -- HP+10% - mob:addMod(xi.mod.MPP, 30) -- MP+30% + mob:addMod(xi.mod.ENHANCES_GUARDIAN, 30) + mob:setMod(xi.mod.SHIELDBLOCKRATE, 25) + mob:addMod(xi.mod.CURE_CAST_TIME, 50) + mob:addMod(xi.mod.CURE_POTENCY, 25) + mob:addMod(xi.mod.ENMITY, 15) + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 10) + mob:addMod(xi.mod.MPP, 30) if lvl >= 30 then mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.SENTINEL }, { ai.r.JA, ai.s.SPECIFIC, xi.ja.SENTINEL }) diff --git a/scripts/actions/spells/trust/gessho.lua b/scripts/actions/spells/trust/gessho.lua index a8e5007afc7..5b88544ca9d 100644 --- a/scripts/actions/spells/trust/gessho.lua +++ b/scripts/actions/spells/trust/gessho.lua @@ -27,8 +27,8 @@ spellObject.onMobSpawn = function(mob) mob:addMod(xi.mod.DOUBLE_ATTACK, xi.trust.modGrowthValMax(mob, 15)) mob:addMod(xi.mod.ACC, xi.trust.modGrowthValMax(mob, 200)) mob:addMod(xi.mod.EVA, xi.trust.modGrowthValMax(mob, 125)) - mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% - mob:addMod(xi.mod.ENMITY, 10) -- Enmity+ + mob:addMod(xi.mod.FASTCAST, 30) + mob:addMod(xi.mod.ENMITY, 10) local lvl = mob:getMainLvl() diff --git a/scripts/actions/spells/trust/rahal.lua b/scripts/actions/spells/trust/rahal.lua index a6b76c0cd3f..242d419678b 100644 --- a/scripts/actions/spells/trust/rahal.lua +++ b/scripts/actions/spells/trust/rahal.lua @@ -55,11 +55,7 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.ENLIGHT }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.PHALANX }) mob:addGambit(ai.t.TARGET, { ai.c.ALWAYS, xi.effect.FLASH }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.FLASH }) - - mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + mob:addGambit(ai.t.PARTY, { ai.c.STATUS, xi.effect.SLEEP_I }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.CLOSER_UNTIL_TP, ai.s.HIGHEST, 2500) end diff --git a/scripts/actions/spells/trust/rughadjeen.lua b/scripts/actions/spells/trust/rughadjeen.lua index 0d3744d00a8..6d1041e6d2d 100644 --- a/scripts/actions/spells/trust/rughadjeen.lua +++ b/scripts/actions/spells/trust/rughadjeen.lua @@ -27,12 +27,12 @@ spellObject.onMobSpawn = function(mob) [xi.magic.spell.MIHLI_ALIAPOH] = xi.trust.messageOffset.TEAMWORK_5 }) - mob:addMod(xi.mod.FASTCAST, 30) -- Has fastcast around 30% - mob:addMod(xi.mod.CURE_POTENCY_RCVD, 30) -- Cure Potency Received +30% - mob:addMod(xi.mod.TRIPLE_ATTACK, 3) -- 3% triple attack rat - mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% - mob:addMod(xi.mod.HPP, 20) -- HP+20% - mob:addMod(xi.mod.MPP, 20) -- HP+20% + mob:addMod(xi.mod.FASTCAST, 30) + mob:addMod(xi.mod.CURE_POTENCY_RCVD, 30) + mob:addMod(xi.mod.TRIPLE_ATTACK, 3) + mob:addMod(xi.mod.DMG, -500) -- Damage Taken -5% + mob:addMod(xi.mod.HPP, 20) + mob:addMod(xi.mod.MPP, 20) local lvl = mob:getMainLvl() @@ -102,11 +102,7 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.PARTY, { ai.c.HPP_LT, 75 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) mob:addGambit(ai.t.PARTY_DEAD, { ai.c.MPP_GTE, 200 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.RAISE }) mob:addGambit(ai.t.TARGET, { ai.c.IS_ECOSYSTEM, xi.ecosystem.UNDEAD }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.HOLY }) - - mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + mob:addGambit(ai.t.PARTY, { ai.c.STATUS, xi.effect.SLEEP_I }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.ASAP, ai.s.RANDOM, 1000) diff --git a/scripts/actions/spells/trust/valaineral.lua b/scripts/actions/spells/trust/valaineral.lua index 3d44118f245..f19c22f76fa 100644 --- a/scripts/actions/spells/trust/valaineral.lua +++ b/scripts/actions/spells/trust/valaineral.lua @@ -86,11 +86,7 @@ spellObject.onMobSpawn = function(mob) mob:addGambit(ai.t.SELF, { ai.c.HPP_LT, 70 }, { ai.r.MA, ai.s.HIGHEST, xi.magic.spellFamily.CURE }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.ENLIGHT }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.ENLIGHT }) mob:addGambit(ai.t.SELF, { ai.c.NOT_STATUS, xi.effect.PHALANX }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.PHALANX }) - - mob:addGambit(ai.t.PARTY, { ai.l.OR( - { ai.c.STATUS, xi.effect.SLEEP_I }, - { ai.c.STATUS, xi.effect.SLEEP_II }, - { ai.c.STATUS, xi.effect.LULLABY }) }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) + mob:addGambit(ai.t.PARTY, { ai.c.STATUS, xi.effect.SLEEP_I }, { ai.r.MA, ai.s.SPECIFIC, xi.magic.spell.CURE }) mob:setTrustTPSkillSettings(ai.tp.OPENER, ai.s.RANDOM, 2000)