landsandboat/scripts/actions/abilities/wind_shot.lua
2026-02-20 18:42:33 -07:00

96 lines
3.7 KiB
Lua

-----------------------------------
-- Ability: Wind Shot
-- Consumes a Wind Card to enhance wind-based debuffs. Deals wind-based magic damage
-- Choke Effect: Enhanced DoT and VIT-
-----------------------------------
---@type TAbility
local abilityObject = {}
abilityObject.onAbilityCheck = function(player, target, ability)
--ranged weapon/ammo: You do not have an appropriate ranged weapon equipped.
--no card: <name> cannot perform that action.
if
player:getWeaponSkillType(xi.slot.RANGED) ~= xi.skill.MARKSMANSHIP or
player:getWeaponSkillType(xi.slot.AMMO) ~= xi.skill.MARKSMANSHIP
then
return 216, 0
end
if
player:hasItem(xi.item.WIND_CARD, 0) or
player:hasItem(xi.item.TRUMP_CARD, 0)
then
return 0, 0
else
return 71, 0
end
end
abilityObject.onUseAbility = function(player, target, ability, action)
action:setRecast(math.max(0, action:getRecast() - player:getMod(xi.mod.QUICK_DRAW_RECAST)))
local params = {}
params.includemab = true
local dmg = (2 * (player:getRangedDmg() + player:getAmmoDmg()) + player:getMod(xi.mod.QUICK_DRAW_DMG)) * (1 + player:getMod(xi.mod.QUICK_DRAW_DMG_PERCENT) / 100)
dmg = dmg + 2 * player:getJobPointLevel(xi.jp.QUICK_DRAW_EFFECT)
dmg = addBonusesAbility(player, xi.element.WIND, target, dmg, params)
local bonusAcc = player:getStat(xi.mod.AGI) / 2 + player:getMerit(xi.merit.QUICK_DRAW_ACCURACY) + player:getMod(xi.mod.QUICK_DRAW_MACC)
dmg = math.floor(dmg * xi.combat.magicHitRate.calculateResistRate(player, target, 0, 0, 0, xi.element.WIND, 0, 0, bonusAcc))
dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.WIND, false))
dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.WIND, false, false))
params.targetTPMult = 0 -- Quick Draw does not feed TP
dmg = xi.ability.takeDamage(target, player, params, true, dmg, xi.attackType.MAGICAL, xi.damageType.WIND, xi.slot.RANGED, 1, 0, 0, 0, action, nil)
if dmg > 0 then
local effects = {}
local choke = target:getStatusEffect(xi.effect.CHOKE)
if choke ~= nil then
table.insert(effects, choke)
end
local threnody = target:getStatusEffect(xi.effect.THRENODY)
if threnody ~= nil and threnody:getSubPower() == xi.mod.EARTH_MEVA then
table.insert(effects, threnody)
end
--TODO: Frightful Roar
--[[local frightfulRoar = target:getStatusEffect(xi.effect.)
if (frightfulRoar ~= nil) then
effects[counter] = frightfulRoar
counter = counter + 1
end]]
if #effects > 0 then
local effect = effects[math.random(1, #effects)]
local duration = effect:getDuration()
local startTime = effect:getStartTime()
local tick = effect:getTick()
local power = effect:getPower()
local subpower = effect:getSubPower()
local tier = effect:getTier()
local effectId = effect:getEffectType()
local subId = effect:getSubType()
power = power * 1.2
target:delStatusEffectSilent(effectId)
target:addStatusEffect(effectId, { power = power, duration = duration, origin = player, tick = tick, subType = subId, subPower = subpower, tier = tier })
local newEffect = target:getStatusEffect(effectId)
if newEffect then
newEffect:setStartTime(startTime)
end
end
end
local _ = player:delItem(xi.item.WIND_CARD, 1) or player:delItem(xi.item.TRUMP_CARD, 1)
target:updateClaim(player)
return dmg
end
return abilityObject