From 4f9bcaa0feaf44dfd2d8d3f10ac090102c3928f4 Mon Sep 17 00:00:00 2001 From: Metra Date: Sun, 26 Jan 2025 01:35:05 -0600 Subject: [PATCH] Base implementation of barrage turbine --- .../pets/attachments/barrage_turbine.lua | 31 ++++++++++++ .../pets/automaton/barrage_turbine.lua | 49 +++++++++++++++++++ scripts/globals/automaton.lua | 1 + scripts/globals/pets/automaton.lua | 3 ++ scripts/globals/weaponskills.lua | 2 + sql/automaton_abilities.sql | 1 + sql/mob_skills.sql | 2 +- 7 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 scripts/actions/abilities/pets/attachments/barrage_turbine.lua create mode 100644 scripts/actions/abilities/pets/automaton/barrage_turbine.lua diff --git a/scripts/actions/abilities/pets/attachments/barrage_turbine.lua b/scripts/actions/abilities/pets/attachments/barrage_turbine.lua new file mode 100644 index 00000000000..981390635ae --- /dev/null +++ b/scripts/actions/abilities/pets/attachments/barrage_turbine.lua @@ -0,0 +1,31 @@ +----------------------------------- +-- Attachment: Barrage Turbine +----------------------------------- +---@type TAttachment +local attachmentObject = {} + +attachmentObject.onEquip = function(pet) + pet:addListener('AUTOMATON_ATTACHMENT_CHECK', 'ATTACHMENT_BARRAGE_TURBINE', function(automaton, target) + local master = automaton:getMaster() + + if + not automaton:hasRecast(xi.recast.ABILITY, xi.automaton.abilities.BARRAGE_TURBINE) and + master and + master:countEffect(xi.effect.WIND_MANEUVER) > 0 + then + automaton:useMobAbility(xi.automaton.abilities.BARRAGE_TURBINE, target) + end + end) +end + +attachmentObject.onUnequip = function(pet) + pet:removeListener('ATTACHMENT_BARRAGE_TURBINE') +end + +attachmentObject.onManeuverGain = function(pet, maneuvers) +end + +attachmentObject.onManeuverLose = function(pet, maneuvers) +end + +return attachmentObject diff --git a/scripts/actions/abilities/pets/automaton/barrage_turbine.lua b/scripts/actions/abilities/pets/automaton/barrage_turbine.lua new file mode 100644 index 00000000000..d8531878b4b --- /dev/null +++ b/scripts/actions/abilities/pets/automaton/barrage_turbine.lua @@ -0,0 +1,49 @@ +----------------------------------- +-- Barrage Turbine +-- https://www.bg-wiki.com/ffxi/Barrage_Turbine +-- https://wiki.ffo.jp/html/23698.html +----------------------------------- +---@type TAbilityAutomaton +local abilityObject = {} + +abilityObject.onAutomatonAbilityCheck = function(target, automaton, skill) + return 0 +end + +abilityObject.onAutomatonAbility = function(target, automaton, skill, master, action) + automaton:addRecast(xi.recast.ABILITY, skill:getID(), 60 * 3) + + -- Apply overload. + -- TODO: This is a placeholder that adds zero overload for now. + -- For reference, the full maneuver handling is xi.automaton.onUseManeuver. + -- local overload = automaton:addBurden(xi.element.WIND - 1, 0) + + local windManeuvers = master:countEffect(xi.effect.WIND_MANEUVER) + windManeuvers = utils.clamp(windManeuvers, 0, 3) + + -- Shots per wind maneuver. + local shotCount = + { + [1] = 4, + [2] = 6, + [3] = 9, + } + + -- Barrage set up and execution. + local params = + { + numHits = shotCount[windManeuvers], + isBarrage = true, + atkmulti = 1.5, + ftpMod = { 1.0, 1.0, 1.0 }, + str_wsc = 0.5, + dex_wsc = 0.25, + } + + -- TODO: Remove/adjust the 8 hit weaponskill cap; tweak damage and TP return. + local damage = xi.autows.doAutoRangedWeaponskill(automaton, target, 0, params, 1000, true, skill, action) + + return damage +end + +return abilityObject diff --git a/scripts/globals/automaton.lua b/scripts/globals/automaton.lua index 1d50585da30..9d86b38a59a 100644 --- a/scripts/globals/automaton.lua +++ b/scripts/globals/automaton.lua @@ -29,6 +29,7 @@ xi.automaton.abilities = STRING_SHREDDER = 2743, ARMOR_SHATTERER = 2744, HEAT_CAPACITOR = 2745, + BARRAGE_TURBINE = 2746, DISRUPTOR = 2747, } diff --git a/scripts/globals/pets/automaton.lua b/scripts/globals/pets/automaton.lua index 5ca2794b2e3..3b2c540b275 100644 --- a/scripts/globals/pets/automaton.lua +++ b/scripts/globals/pets/automaton.lua @@ -13,6 +13,9 @@ xi.pets.automaton.onMobSpawn = function(mob) automaton:setLocalVar('MANEUVER_DURATION', math.min(dur + 3, 300)) end end) + + -- Barrage Turbine cannot be used unless the automaton has been active for at least 3 minutes. + mob:addRecast(xi.recast.ABILITY, xi.automaton.abilities.BARRAGE_TURBINE, 60 * 3) end xi.pets.automaton.onMobDeath = function(mob) diff --git a/scripts/globals/weaponskills.lua b/scripts/globals/weaponskills.lua index 97aa6bcec83..87d67d7b257 100644 --- a/scripts/globals/weaponskills.lua +++ b/scripts/globals/weaponskills.lua @@ -637,6 +637,8 @@ xi.weaponskills.calculateRawWSDmg = function(attacker, target, wsID, tp, action, -- Needs better verification if calcParams.extraOffhandHit and hitsDone == 1 then calcParams.tpHitsLanded = calcParams.tpHitsLanded + calcParams.hitsLanded + elseif wsParams.isBarrage then + calcParams.tpHitsLanded = calcParams.tpHitsLanded + calcParams.hitsLanded else -- Otherwise, add a hit to the "extra" hits which is 10 tp each calcParams.mainHitsLanded = calcParams.mainHitsLanded + calcParams.hitsLanded end diff --git a/sql/automaton_abilities.sql b/sql/automaton_abilities.sql index 1cd8f0871bf..e31b99547f2 100644 --- a/sql/automaton_abilities.sql +++ b/sql/automaton_abilities.sql @@ -54,6 +54,7 @@ INSERT INTO `automaton_abilities` VALUES (2301,'magic_mortar',23,225); INSERT INTO `automaton_abilities` VALUES (2743,'string_shredder',21,324); INSERT INTO `automaton_abilities` VALUES (2744,'armor_shatterer',22,324); INSERT INTO `automaton_abilities` VALUES (2745,'heat_capacitor',0,0); +INSERT INTO `automaton_abilities` VALUES (2746,'barrage_turbine',22,0); INSERT INTO `automaton_abilities` VALUES (2747,'disruptor',0,0); /*!40000 ALTER TABLE `automaton_abilities` ENABLE KEYS */; diff --git a/sql/mob_skills.sql b/sql/mob_skills.sql index 542e63dbd9f..872d978679d 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -2758,7 +2758,7 @@ INSERT INTO `mob_skills` VALUES (2740,1890,'silent_storm',0,0.0,7.0,2000,1500,4, INSERT INTO `mob_skills` VALUES (2743,1509,'string_shredder',0,0.0,7.0,2000,1,4,0,324,0,10,4,0); INSERT INTO `mob_skills` VALUES (2744,1510,'armor_shatterer',0,0.0,7.0,2000,1,4,0,324,0,11,8,0); INSERT INTO `mob_skills` VALUES (2745,433,'heat_capacitor',0,0.0,7.0,2000,0,16,4,0,0,0,0,0); -INSERT INTO `mob_skills` VALUES (2746,434,'barrage_turbine',0,0.0,7.0,2000,0,16,4,0,0,0,0,0); +INSERT INTO `mob_skills` VALUES (2746,16,'barrage_turbine',0,0.0,25.0,2000,0,4,4,0,0,0,0,0); INSERT INTO `mob_skills` VALUES (2747,439,'disruptor',0,0.0,7.0,2000,0,4,4,0,0,0,0,0); -- INSERT INTO `mob_skills` VALUES (2748,1922,'mantid_melee_double',0,0.0,7.0,2000,0,4,4,0,0,0,0,0); -- kaggan melee specials -- INSERT INTO `mob_skills` VALUES (2749,1923,'mantid_melee_slice',0,0.0,7.0,2000,0,4,4,0,0,0,0,0); -- kaggan melee specials