Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions scripts/actions/mobskills/arrogance_incarnate.lua
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ mobskillObject.onMobWeaponSkill = function(mob, target, skill, action)

dmg = math.floor(dmg * 2.5)
dmg = math.floor(dmg * xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true))
dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false))
dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, true))
dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false, false, false, true))
dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, false, false, true))
dmg = math.floor(target:handleSevereDamage(dmg, false))
dmg = utils.handlePhalanx(target, dmg)

Expand Down
4 changes: 2 additions & 2 deletions scripts/actions/spells/black/meteor.lua
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ spellObject.onSpellCast = function(caster, target, spell)
damage = ((100 + caster:getMod(xi.mod.MATT)) / (100 + target:getMod(xi.mod.MDEF))) * (caster:getStat(xi.mod.INT) + (caster:getMaxSkillLevel(caster:getMainLvl(), xi.job.BLM, xi.skill.ELEMENTAL_MAGIC)) / 6) * 9.4
end

damage = math.floor(damage * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, true))
damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, true, false))
damage = math.floor(damage * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false, true, false, false))
damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, true, false, false))
damage = math.floor(damage * xi.spells.damage.calculateMTDR(caster, spell))
damage = math.floor(damage * xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false))

Expand Down
4 changes: 2 additions & 2 deletions scripts/actions/weaponskills/atonement.lua
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ weaponskillObject.onUseWeaponSkill = function(player, target, wsID, tp, primary,

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(damage * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false, false, false, true))
damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, false, false, true))
damage = math.floor(target:handleSevereDamage(damage, false))

if player:getMod(xi.mod.WEAPONSKILL_DAMAGE_BASE + wsID) > 0 then
Expand Down
4 changes: 2 additions & 2 deletions scripts/actions/weaponskills/spirits_within.lua
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ weaponskillObject.onUseWeaponSkill = function(player, target, wsID, tp, primary,

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(damage * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false, false, false, true))
damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, false, false, true))
damage = math.floor(target:handleSevereDamage(damage, false))

if damage > 0 then
Expand Down
52 changes: 25 additions & 27 deletions scripts/combat/action_additional_effect_damage.lua
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,20 @@ local function validateParameters(actor, target, fedData)
-- Limit undead
params.limitUndead = fedData.limitUndead or false -- Default: Works on undead.

-- Source is ranged attack or melee? Skip en-spell check if so.
params.isRanged = fedData.isRanged or false -- Assume melee.

-- Base damage parameters.
params.basePower = fedData.basePower or 0

-- Action properties.
params.attackType = fedData.attackType or xi.attackType.SPECIAL -- Physical, Magical, Ranged, Breath or Special.
params.physicalElement = fedData.physicalElement or xi.damageType.NONE -- None, H2H, Slashing, Piercing or Blunt.
params.magicalElement = fedData.magicalElement or xi.element.NONE -- None, Fire, Ice, Wind, Earth, Thunder, Water, Light, Dark.

-- Base damage parameters.
params.basePower = fedData.basePower or 0
params.actorStat = fedData.actorStat or 0
params.targetStat = fedData.targetStat or params.actorStat
params.targetStat = fedData.targetStat or params.actorStat -- Currently unused. For future use.
params.skillRank = fedData.skillRank or xi.skillRank.A_PLUS
params.macc = fedData.macc or 0

-- Multiplier properties.
params.canMAB = fedData.canMAB or false
Expand Down Expand Up @@ -100,8 +105,8 @@ end
xi.combat.action.executeAddEffectDamage = function(actor, target, fedData)
local params = validateParameters(actor, target, fedData)

-- Early return: En-spell overrides innate/weapon additional effects.
if hasEnspell(actor) then
-- Early return: En-spell overrides innate/weapon additional effects, except ranged attacks.
if not params.isRanged and hasEnspell(actor) then
return 0, 0, 0
end

Expand All @@ -115,19 +120,24 @@ xi.combat.action.executeAddEffectDamage = function(actor, target, fedData)
return 0, 0, 0
end

-- Additional variables.
local isPhysical = params.attackType == xi.attackType.PHYSICAL or false
local isMagical = params.attackType == xi.attackType.MAGICAL or false
local isRanged = params.attackType == xi.attackType.RANGED or false
local isBreath = params.attackType == xi.attackType.BREATH or false
-- Early return: Effect is nullified.
local nullification = xi.spells.damage.calculateNullification(params.aeTarget, params.magicalElement, params.attackType == xi.attackType.PHYSICAL, params.params.attackType == xi.attackType.MAGICAL, params.attackType == xi.attackType.RANGED, params.attackType == xi.attackType.BREATH)
if nullification == 0 then
return 0, 0, 0
end

-- Early return: Effect is resisted.
local multiplierResist = params.canResist and xi.combat.magicHitRate.calculateResistRate(actor, params.aeTarget, 0, 0, params.skillRank, params.magicalElement, params.actorStat, 0, params.macc) or 1
if multiplierResist < params.lowestResist then
return 0, 0, 0
end

-- Calculate base power.
local damage = params.basePower + actor:getMod(params.actorStat) - params.aeTarget:getMod(params.targetStat)

-- Calculate mandatory multipliers.
local multiplierAbsorption = xi.spells.damage.calculateAbsorption(params.aeTarget, params.magicalElement, params.isMagical)
local multiplierNullification = xi.spells.damage.calculateNullification(params.aeTarget, params.magicalElement, isMagical, isBreath)
local multiplierDamageTypeSDT = xi.combat.damage.calculateDamageAdjustment(params.aeTarget, isPhysical, isMagical, isRanged, isBreath)
local multiplierAbsorption = xi.spells.damage.calculateAbsorption(params.aeTarget, params.magicalElement, params.attackType == xi.attackType.PHYSICAL, params.params.attackType == xi.attackType.MAGICAL, params.attackType == xi.attackType.RANGED, params.attackType == xi.attackType.BREATH)
local multiplierDamageTypeSDT = xi.combat.damage.calculateDamageAdjustment(params.aeTarget, params.attackType == xi.attackType.PHYSICAL, params.attackType == xi.attackType.MAGICAL, params.attackType == xi.attackType.RANGED, params.attackType == xi.attackType.BREATH)
local multiplierPhysicalElementSDT = xi.combat.damage.physicalElementSDT(params.aeTarget, params.physicalElement)
local multiplierMagicalElementSDT = xi.combat.damage.magicalElementSDT(params.aeTarget, params.magicalElement)
local multiplierElementalStaff = xi.spells.damage.calculateElementalStaffBonus(actor, params.magicalElement)
Expand All @@ -136,17 +146,10 @@ xi.combat.action.executeAddEffectDamage = function(actor, target, fedData)

-- Calculate optional multipliers.
local multiplierMagicDiff = params.canMAB and xi.spells.damage.calculateMagicBonusDiff(actor, params.aeTarget, 0, 0, params.magicalElement, 0) or 1
local multiplierResist = params.canResist and xi.combat.magicHitRate.calculateResistRate(actor, params.aeTarget, 0, 0, xi.skillRank.A_PLUS, params.magicalElement, params.actorStat, 0, 0) or 1
local multiplierForcedResistTier = params.canResistExtra and xi.spells.damage.calculateAdditionalResistTier(actor, params.aeTarget, params.magicalElement) or 1

-- Early return: Resist state is too low. Auto-fail.
if multiplierResist < params.lowestResist then
return 0, 0, 0
end

-- Calculate final damage.
damage = math.floor(damage * multiplierAbsorption)
damage = math.floor(damage * multiplierNullification)
damage = math.floor(damage * multiplierDamageTypeSDT)
damage = math.floor(damage * multiplierPhysicalElementSDT)
damage = math.floor(damage * multiplierMagicalElementSDT)
Expand Down Expand Up @@ -183,12 +186,7 @@ xi.combat.action.executeAddEffectDamage = function(actor, target, fedData)
actor:addTP(damage)
end

-- No damage, no proc.
if damage == 0 then
return 0, 0, 0
end

if damage < 0 then
if damage < 0 then
params.aeTarget:addHP(-damage) -- Heal target.
return params.animation, params.messageHeal, -damage
end
Expand Down
55 changes: 29 additions & 26 deletions scripts/combat/action_additional_effect_status.lua
Original file line number Diff line number Diff line change
Expand Up @@ -38,34 +38,37 @@ local function validateParameters(actor, target, fedData)
local params = {}

-- Additional effect target.
params.aeTarget = fedData.aeTarget or target -- Default to the current attack target.
params.aeTarget = fedData.aeTarget or target -- Default to the current attack target.

-- Chance.
params.chance = fedData.chance or 100 -- Default: Always proc.
params.chance = fedData.chance or 100 -- Default: Always proc.

-- Source is ranged attack or melee? Skip en-spell check if so.
params.isRanged = fedData.isRanged or false -- Assume melee.

-- Status effect application parameters.
params.effectId = fedData.effectId or xi.effect.NONE
params.power = fedData.power or 0
params.tick = fedData.tick or 0
params.duration = fedData.duration or 120
params.subType = fedData.subType or 0
params.subPower = fedData.subPower or 0
params.tier = fedData.tier or 0
params.effectId = fedData.effectId or xi.effect.NONE
params.power = fedData.power or 0
params.tick = fedData.tick or 0
params.duration = fedData.duration or 120
params.subType = fedData.subType or 0
params.subPower = fedData.subPower or 0
params.tier = fedData.tier or 0

-- Action properties.
params.element = fedData.element or xi.element.NONE
params.actorStat = fedData.actorStat or 0
params.targetStat = fedData.targetStat or params.actorStat -- Currently unused. For future use.
params.macc = fedData.macc or 0
params.resistRate = fedData.resistRate or 0
params.element = fedData.element or xi.element.NONE -- None, Fire, Ice, Wind, Earth, Thunder, Water, Light, Dark.
params.actorStat = fedData.actorStat or 0
params.targetStat = fedData.targetStat or params.actorStat -- Currently unused. For future use.
params.skillRank = fedData.skillRank or xi.skillRank.A_PLUS
params.macc = fedData.macc or 0

-- Optional behavior.
params.resetEmnity = fedData.resetEmnity or false
params.absorbEffect = fedData.absorbEffect or false
params.resetEmnity = fedData.resetEmnity or false -- Currently unused. For future use.
params.absorbEffect = fedData.absorbEffect or false

-- Animations and messaging.
params.animation = fedData.animation or (defaultsTable[params.effectId][1] or 0)
params.message = fedData.message or (defaultsTable[params.effectId][2] or 0)
params.animation = fedData.animation or (defaultsTable[params.effectId][1] or 0)
params.message = fedData.message or (defaultsTable[params.effectId][2] or 0)

return params
end
Expand Down Expand Up @@ -104,8 +107,8 @@ end
xi.combat.action.executeAddEffectEnhancement = function(actor, target, fedData)
local params = validateParameters(actor, target, fedData)

-- Early return: En-spell overrides innate/weapon additional effects.
if hasEnspell(actor) then
-- Early return: En-spell overrides innate/weapon additional effects, except ranged attacks.
if not params.isRanged and hasEnspell(actor) then
return 0, 0, 0
end

Expand Down Expand Up @@ -135,8 +138,8 @@ end
xi.combat.action.executeAddEffectEnfeeblement = function(actor, target, fedData)
local params = validateParameters(actor, target, fedData)

-- Early return: En-spell overrides innate/weapon additional effects.
if hasEnspell(actor) then
-- Early return: En-spell overrides innate/weapon additional effects, except ranged attacks.
if not params.isRanged and hasEnspell(actor) then
return 0, 0, 0
end

Expand Down Expand Up @@ -166,7 +169,7 @@ xi.combat.action.executeAddEffectEnfeeblement = function(actor, target, fedData)
end

-- Early return: Resist rate too high.
local resistanceRate = xi.combat.magicHitRate.calculateResistRate(actor, params.aeTarget, 0, 0, xi.skillRank.A_PLUS, params.element, params.actorStat, params.effectId, params.macc)
local resistanceRate = xi.combat.magicHitRate.calculateResistRate(actor, params.aeTarget, 0, 0, params.skillRank, params.element, params.actorStat, params.effectId, params.macc)
if not xi.data.statusEffect.isResistRateSuccessfull(params.effectId, resistanceRate, params.resistRate) then
return 0, 0, 0
end
Expand All @@ -185,8 +188,8 @@ end
xi.combat.action.executeAddEffectDispel = function(actor, target, fedData)
local params = validateParameters(actor, target, fedData)

-- Early return: En-spell overrides innate/weapon additional effects.
if hasEnspell(actor) then
-- Early return: En-spell overrides innate/weapon additional effects, except ranged attacks.
if not params.isRanged and hasEnspell(actor) then
return 0, 0, 0
end

Expand All @@ -206,7 +209,7 @@ xi.combat.action.executeAddEffectDispel = function(actor, target, fedData)
end

-- Early return: Resist rate too high.
local resistanceRate = xi.combat.magicHitRate.calculateResistRate(actor, params.aeTarget, 0, 0, xi.skillRank.A_PLUS, params.element, params.actorStat, params.effectId, params.macc)
local resistanceRate = xi.combat.magicHitRate.calculateResistRate(actor, params.aeTarget, 0, 0, params.skillRank, params.element, params.actorStat, params.effectId, params.macc)
if not xi.data.statusEffect.isResistRateSuccessfull(params.effectId, resistanceRate, params.resistRate) then
return 0, 0, 0
end
Expand Down
Loading
Loading