landsandboat/scripts/actions/weaponskills/spirits_within.lua
WinterSolstice8 f8703d079a
[lua] Add 'hitsLanded' = 1 to calcparams of magic ws (#9701)
* [lua] Add 'hitsLanded' = 1 to calcparams of magic ws

* [lua] Adjust Atonement & Spirits Within to have hitsLanded = 1
2026-04-03 03:53:46 +02:00

77 lines
2.6 KiB
Lua

-----------------------------------
-- Spirits Within
-- Sword weapon skill
-- Spirits Within Sword Weapon Skill
-- TrolandAdded by Troland
-- Skill Level: 175
-- Delivers an unavoidable attack. Damage varies with HP and TP.
-- Not aligned with any "elemental gorgets" or "elemental belts" due to it's absence of Skillchain properties.
-- Element: None
-- Modifiers: HP:
-- 100%TP 200%TP 300%TP
-- 12.5% 50% 100%
-----------------------------------
---@type TWeaponSkill
local weaponskillObject = {}
weaponskillObject.onUseWeaponSkill = function(player, target, wsID, tp, primary, action, taChar)
local params = {}
params.ftpMod = { 0.0625, 0.1875, 0.46875 } -- https://www.bg-wiki.com/index.php?title=Spirits_Within&oldid=269806
local attack =
{
['type'] = xi.attackType.BREATH,
['slot'] = xi.slot.MAIN,
['weaponType'] = player:getWeaponSkillType(xi.slot.MAIN),
['damageType'] = xi.damageType.ELEMENTAL
}
local calcParams =
{
wsID = wsID, -- need 'calcParams.wsID' passed to global
criticalHit = false,
hitsLanded = 1,
tpHitsLanded = 0,
extraHitsLanded = 0,
shadowsAbsorbed = 0,
bonusTP = 0
}
local playerHP = player:getHP()
local dmg = 0
if xi.settings.main.USE_ADOULIN_WEAPON_SKILL_CHANGES then
params.ftpMod = { 0.125, 0.5, 1 } -- https://www.bg-wiki.com/ffxi/Spirits_Within
end
local ftp = xi.weaponskills.fTP(tp, params.ftpMod)
dmg = math.floor(playerHP * ftp)
local damage = dmg
damage = math.floor(damage * xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true))
damage = math.floor(damage * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false))
damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, true))
damage = math.floor(target:handleSevereDamage(damage, false))
if damage > 0 then
if player:getOffhandDmg() > 0 then
calcParams.tpHitsLanded = 2
else
calcParams.tpHitsLanded = 1
end
end
if player:getMod(xi.mod.WEAPONSKILL_DAMAGE_BASE + wsID) > 0 then
damage = damage * (100 + player:getMod(xi.mod.WEAPONSKILL_DAMAGE_BASE + wsID)) / 100
end
damage = damage * xi.settings.main.WEAPON_SKILL_POWER
calcParams.finalDmg = damage
-- Todo: xi.weaponskills.doBreathWeaponskill() instead of all this.
damage = xi.weaponskills.takeWeaponskillDamage(target, player, {}, primary, attack, calcParams, action)
return calcParams.tpHitsLanded, calcParams.extraHitsLanded, calcParams.criticalHit, damage
end
return weaponskillObject