From e2880c6a4105c4ee95563d6d208aee08f1ec44ab Mon Sep 17 00:00:00 2001 From: Xaver-DaRed Date: Wed, 8 Jul 2026 21:21:44 +0200 Subject: [PATCH 1/6] Audit some Arrows/Bolts `Additional effect: Elemental damage` --- .../action_additional_effect_damage.lua | 52 ++++++++--------- scripts/items/bloody_bolt.lua | 15 ++--- scripts/items/dainslaif.lua | 11 +--- scripts/items/darkling_bolt.lua | 26 +++++++++ scripts/items/earth_arrow.lua | 26 +++++++++ scripts/items/fire_arrow.lua | 24 ++++++++ scripts/items/grand_knights_arrow.lua | 26 +++++++++ scripts/items/holy_bolt.lua | 26 +++++++++ scripts/items/ice_arrow.lua | 24 ++++++++ scripts/items/lightning_arrow.lua | 24 ++++++++ scripts/items/righteous_bolt.lua | 26 +++++++++ scripts/items/scouts_bolt.lua | 26 +++++++++ scripts/items/temple_knights_arrow.lua | 26 +++++++++ scripts/items/water_arrow.lua | 26 +++++++++ scripts/items/wind_arrow.lua | 26 +++++++++ sql/item_mods.sql | 57 ++++++++----------- 16 files changed, 362 insertions(+), 79 deletions(-) create mode 100644 scripts/items/darkling_bolt.lua create mode 100644 scripts/items/earth_arrow.lua create mode 100644 scripts/items/fire_arrow.lua create mode 100644 scripts/items/grand_knights_arrow.lua create mode 100644 scripts/items/holy_bolt.lua create mode 100644 scripts/items/ice_arrow.lua create mode 100644 scripts/items/lightning_arrow.lua create mode 100644 scripts/items/righteous_bolt.lua create mode 100644 scripts/items/scouts_bolt.lua create mode 100644 scripts/items/temple_knights_arrow.lua create mode 100644 scripts/items/water_arrow.lua create mode 100644 scripts/items/wind_arrow.lua diff --git a/scripts/combat/action_additional_effect_damage.lua b/scripts/combat/action_additional_effect_damage.lua index f549b83ef7c..b4f2c2a079f 100644 --- a/scripts/combat/action_additional_effect_damage.lua +++ b/scripts/combat/action_additional_effect_damage.lua @@ -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 @@ -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 @@ -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.MAGICAL, 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.params.attackType == xi.attackType.MAGICAL) + 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) @@ -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) @@ -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 diff --git a/scripts/items/bloody_bolt.lua b/scripts/items/bloody_bolt.lua index 3b3f40b542b..370c4140c6f 100644 --- a/scripts/items/bloody_bolt.lua +++ b/scripts/items/bloody_bolt.lua @@ -7,19 +7,14 @@ local itemObject = {} itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dINT = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) - local power = 0 - - if dINT > 15 then - power = math.min(math.floor(76 + (dINT - 16) * 0.5), 92) -- 92 is the upper cap starting at 48 dINT - else - power = math.max(math.floor(60 + dINT), 57) -- minimum observed at more than -100 dINT is 57. Negative dINT does seem to drop you to 57, but scaling is currently unknown. - end + local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) + -- Minimum observed at more than -100 dStat is 57. Negative dStat does seem to drop you to 57, but scaling is currently unknown. + -- 92 is the upper cap starting at 48 dStat local pTable = { - chance = 100, -- Seems to always proc barring massive resistance - basePower = power, + isRanged = true, + basePower = 60 + utils.clamp(dStat, -3, 16) + utils.clamp(math.floor((dStat - 16) / 2), 0, 16), attackType = xi.attackType.PHYSICAL, physicalElement = xi.damageType.PIERCING, magicalElement = xi.element.DARK, diff --git a/scripts/items/dainslaif.lua b/scripts/items/dainslaif.lua index 24aa4807975..2abed7ac8e4 100644 --- a/scripts/items/dainslaif.lua +++ b/scripts/items/dainslaif.lua @@ -7,19 +7,12 @@ local itemObject = {} itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dINT = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) - local power = 0 - - if dINT > 15 then - power = math.min(math.floor(56 + (dINT - 16) * 0.5), 72) - else - power = math.max(math.floor(40 + dINT), 37) -- Lower end of 37 is guessed, following Bloody Bolt pattern - end + local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) local pTable = { chance = 22, -- Observed rate is 21% which is close to (0.22 * .95) = 21%~ (resist roll failure) - basePower = power, + basePower = 40 + utils.clamp(dStat, -3, 16) + utils.clamp(math.floor((dStat - 16) / 2), 0, 16), attackType = xi.attackType.PHYSICAL, physicalElement = xi.damageType.SLASHING, magicalElement = xi.element.DARK, diff --git a/scripts/items/darkling_bolt.lua b/scripts/items/darkling_bolt.lua new file mode 100644 index 00000000000..3701c28f4c8 --- /dev/null +++ b/scripts/items/darkling_bolt.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- ID: 19196 +-- Item: Darkling Bolt +-- Additional effect: Darkness damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) + -- Unconfirmed power. + + local pTable = + { + isRanged = true, + basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.DARK, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/earth_arrow.lua b/scripts/items/earth_arrow.lua new file mode 100644 index 00000000000..a4d77aede32 --- /dev/null +++ b/scripts/items/earth_arrow.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- ID: 18699 +-- Item: Earth Arrow +-- Additional effect: Earth damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) + -- Unconfirmed power. + + local pTable = + { + isRanged = true, + basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.EARTH, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/fire_arrow.lua b/scripts/items/fire_arrow.lua new file mode 100644 index 00000000000..302223361a5 --- /dev/null +++ b/scripts/items/fire_arrow.lua @@ -0,0 +1,24 @@ +----------------------------------- +-- ID: 17322 +-- Item: Fire Arrow +-- Additional effect: Fire damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + -- Unconfirmed power. + local pTable = + { + isRanged = true, + basePower = math.random(7, 10), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.FIRE, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/grand_knights_arrow.lua b/scripts/items/grand_knights_arrow.lua new file mode 100644 index 00000000000..425e973f08e --- /dev/null +++ b/scripts/items/grand_knights_arrow.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- ID: 17327 +-- Item: Grand Knights Arrow +-- Additional effect: Fire damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) + -- Unconfirmed power. + + local pTable = + { + isRanged = true, + basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.FIRE, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/holy_bolt.lua b/scripts/items/holy_bolt.lua new file mode 100644 index 00000000000..6c287ec3cc6 --- /dev/null +++ b/scripts/items/holy_bolt.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- ID: 18153 +-- Item: Holy Bolt +-- Additional effect: Light damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + local dStat = attacker:getStat(xi.mod.MND) - defender:getStat(xi.mod.MND) + -- Unconfirmed power. + + local pTable = + { + isRanged = true, + basePower = 40 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.LIGHT, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/ice_arrow.lua b/scripts/items/ice_arrow.lua new file mode 100644 index 00000000000..0091bb9c76a --- /dev/null +++ b/scripts/items/ice_arrow.lua @@ -0,0 +1,24 @@ +----------------------------------- +-- ID: 17323 +-- Item: Ice Arrow +-- Additional effect: Ice damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + -- Unconfirmed power. + local pTable = + { + isRanged = true, + basePower = math.random(7, 10), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.ICE, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/lightning_arrow.lua b/scripts/items/lightning_arrow.lua new file mode 100644 index 00000000000..5789127cb46 --- /dev/null +++ b/scripts/items/lightning_arrow.lua @@ -0,0 +1,24 @@ +----------------------------------- +-- ID: 17324 +-- Item: Lightning Arrow +-- Additional effect: Lightning damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + -- Unconfirmed power. + local pTable = + { + isRanged = true, + basePower = math.random(7, 10), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.THUNDER, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/righteous_bolt.lua b/scripts/items/righteous_bolt.lua new file mode 100644 index 00000000000..647151ff13d --- /dev/null +++ b/scripts/items/righteous_bolt.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- ID: 21315 +-- Item: Righteous Bolt +-- Additional effect: Light damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + local dStat = attacker:getStat(xi.mod.MND) - defender:getStat(xi.mod.MND) + -- Unconfirmed power. + + local pTable = + { + isRanged = true, + basePower = 40 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.LIGHT, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/scouts_bolt.lua b/scripts/items/scouts_bolt.lua new file mode 100644 index 00000000000..58f4cf54106 --- /dev/null +++ b/scripts/items/scouts_bolt.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- ID: 22287 +-- Item: Scouts Bolt +-- Additional effect: Light damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + local dStat = attacker:getStat(xi.mod.MND) - defender:getStat(xi.mod.MND) + -- Unconfirmed power. + + local pTable = + { + isRanged = true, + basePower = 40 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.LIGHT, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/temple_knights_arrow.lua b/scripts/items/temple_knights_arrow.lua new file mode 100644 index 00000000000..7857e6f087a --- /dev/null +++ b/scripts/items/temple_knights_arrow.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- ID: 18738 +-- Item: Temple Knights Arrow +-- Additional effect: Fire damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) + -- Unconfirmed power. + + local pTable = + { + isRanged = true, + basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.FIRE, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/water_arrow.lua b/scripts/items/water_arrow.lua new file mode 100644 index 00000000000..e1182975092 --- /dev/null +++ b/scripts/items/water_arrow.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- ID: 18698 +-- Item: Water Arrow +-- Additional effect: Water damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) + -- Unconfirmed power. + + local pTable = + { + isRanged = true, + basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.WATER, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/scripts/items/wind_arrow.lua b/scripts/items/wind_arrow.lua new file mode 100644 index 00000000000..1e5f2667b9a --- /dev/null +++ b/scripts/items/wind_arrow.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- ID: 18700 +-- Item: Wind Arrow +-- Additional effect: Wind damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) + local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) + -- Unconfirmed power. + + local pTable = + { + isRanged = true, + basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.PIERCING, + magicalElement = xi.element.WIND, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) +end + +return itemObject diff --git a/sql/item_mods.sql b/sql/item_mods.sql index df13db29cf9..1cd866e47c9 100644 --- a/sql/item_mods.sql +++ b/sql/item_mods.sql @@ -34206,31 +34206,13 @@ INSERT INTO `item_mods` VALUES (17316,950,1); -- ITEM_ADDEFFECT_ELEMENT: ELEMEN INSERT INTO `item_mods` VALUES (17317,26,15); -- RACC: 15 -- Fire Arrow -INSERT INTO `item_mods` VALUES (17322,278,5); -- ITEM_ADDEFFECT_LVADJUST: 5 -INSERT INTO `item_mods` VALUES (17322,280,12); -- ITEM_ADDEFFECT_DSTAT: INT -INSERT INTO `item_mods` VALUES (17322,431,1); -- ITEM_ADDEFFECT_TYPE: DAMAGE -INSERT INTO `item_mods` VALUES (17322,499,1); -- ITEM_SUBEFFECT: SUBEFFECT_FIRE_DAMAGE -INSERT INTO `item_mods` VALUES (17322,500,15); -- ITEM_ADDEFFECT_DMG: 15 -INSERT INTO `item_mods` VALUES (17322,501,95); -- ITEM_ADDEFFECT_CHANCE: 95 -INSERT INTO `item_mods` VALUES (17322,950,1); -- ITEM_ADDEFFECT_ELEMENT: ELEMENT_FIRE +INSERT INTO `item_mods` VALUES (17322,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 -- Ice Arrow -INSERT INTO `item_mods` VALUES (17323,278,5); -- ITEM_ADDEFFECT_LVADJUST: 5 -INSERT INTO `item_mods` VALUES (17323,280,12); -- ITEM_ADDEFFECT_DSTAT: INT -INSERT INTO `item_mods` VALUES (17323,431,1); -- ITEM_ADDEFFECT_TYPE: DAMAGE -INSERT INTO `item_mods` VALUES (17323,499,2); -- ITEM_SUBEFFECT: SUBEFFECT_ICE_DAMAGE -INSERT INTO `item_mods` VALUES (17323,500,15); -- ITEM_ADDEFFECT_DMG: 15 -INSERT INTO `item_mods` VALUES (17323,501,95); -- ITEM_ADDEFFECT_CHANCE: 95 -INSERT INTO `item_mods` VALUES (17323,950,2); -- ITEM_ADDEFFECT_ELEMENT: ELEMENT_ICE +INSERT INTO `item_mods` VALUES (17323,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 -- Lightning Arrow -INSERT INTO `item_mods` VALUES (17324,278,5); -- ITEM_ADDEFFECT_LVADJUST: 5 -INSERT INTO `item_mods` VALUES (17324,280,12); -- ITEM_ADDEFFECT_DSTAT: INT -INSERT INTO `item_mods` VALUES (17324,431,1); -- ITEM_ADDEFFECT_TYPE: DAMAGE -INSERT INTO `item_mods` VALUES (17324,499,5); -- ITEM_SUBEFFECT: SUBEFFECT_LIGHTNING_DAMAGE -INSERT INTO `item_mods` VALUES (17324,500,15); -- ITEM_ADDEFFECT_DMG: 15 -INSERT INTO `item_mods` VALUES (17324,501,95); -- ITEM_ADDEFFECT_CHANCE: 95 -INSERT INTO `item_mods` VALUES (17324,950,5); -- ITEM_ADDEFFECT_ELEMENT: ELEMENT_THUNDER +INSERT INTO `item_mods` VALUES (17324,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 -- Kabura Arrow INSERT INTO `item_mods` VALUES (17325,26,3); -- RACC: 3 @@ -34243,8 +34225,9 @@ INSERT INTO `item_mods` VALUES (17325,952,1); -- ITEM_ADDEFFECT_POWER: 1 INSERT INTO `item_mods` VALUES (17325,953,60); -- ITEM_ADDEFFECT_DURATION: 60 -- Grand Knights Arrow -INSERT INTO `item_mods` VALUES (17327,24,20); -- RATT: 20 -INSERT INTO `item_mods` VALUES (17327,26,10); -- RACC: 10 +INSERT INTO `item_mods` VALUES (17327,24,20); -- RATT: 20 +INSERT INTO `item_mods` VALUES (17327,26,10); -- RACC: 10 +INSERT INTO `item_mods` VALUES (17327,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 -- Gold Musketeers Bolt INSERT INTO `item_mods` VALUES (17328,24,20); -- RATT: 20 @@ -36738,13 +36721,7 @@ INSERT INTO `item_mods` VALUES (18152,953,30); -- ITEM_ADDEFFECT_DURATION: 30 INSERT INTO `item_mods` VALUES (18152,950,6); -- ITEM_ADDEFFECT_ELEMENT: 6 -- Holy Bolt -INSERT INTO `item_mods` VALUES (18153,278,5); -- ITEM_ADDEFFECT_LVADJUST: 5 -INSERT INTO `item_mods` VALUES (18153,280,13); -- ITEM_ADDEFFECT_DSTAT: MND -INSERT INTO `item_mods` VALUES (18153,431,1); -- ITEM_ADDEFFECT_TYPE: DAMAGE -INSERT INTO `item_mods` VALUES (18153,499,7); -- ITEM_SUBEFFECT: 7 -INSERT INTO `item_mods` VALUES (18153,500,40); -- ITEM_ADDEFFECT_DMG: 40 -INSERT INTO `item_mods` VALUES (18153,501,100); -- ITEM_ADDEFFECT_CHANCE: 100 -INSERT INTO `item_mods` VALUES (18153,950,7); -- ITEM_ADDEFFECT_ELEMENT: 7 +INSERT INTO `item_mods` VALUES (18153,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 -- Beetle Arrow INSERT INTO `item_mods` VALUES (18154,26,5); -- RACC: 5 @@ -38664,6 +38641,15 @@ INSERT INTO `item_mods` VALUES (18695,22,13); -- DARK_MEVA: 13 -- Paralysis Arrow INSERT INTO `item_mods` VALUES (18696,431,1); -- ITEM_ADDEFFECT_TYPE: DAMAGE +-- Water Arrow +INSERT INTO `item_mods` VALUES (18698,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 + +-- Earth Arrow +INSERT INTO `item_mods` VALUES (18699,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 + +-- Wind Arrow +INSERT INTO `item_mods` VALUES (18700,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 + -- Cerberus Bow +1 INSERT INTO `item_mods` VALUES (18701,11,4); -- AGI: 4 INSERT INTO `item_mods` VALUES (18701,15,14); -- FIRE_MEVA: 14 @@ -38753,8 +38739,9 @@ INSERT INTO `item_mods` VALUES (18734,30,2); -- MACC: 2 INSERT INTO `item_mods` VALUES (18735,491,1); -- WALTZ_POTENCY: 1 -- Temple Knights Arrow -INSERT INTO `item_mods` VALUES (18738,24,20); -- RATT: 20 -INSERT INTO `item_mods` VALUES (18738,26,10); -- RACC: 10 +INSERT INTO `item_mods` VALUES (18738,24,20); -- RATT: 20 +INSERT INTO `item_mods` VALUES (18738,26,10); -- RACC: 10 +INSERT INTO `item_mods` VALUES (18738,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 -- Iron Musketeers Bolt INSERT INTO `item_mods` VALUES (18739,24,20); -- RATT: 20 @@ -40199,7 +40186,7 @@ INSERT INTO `item_mods` VALUES (19194,28,15); -- MATT: 15 INSERT INTO `item_mods` VALUES (19195,24,5); -- RATT: 5 -- Darkling Bolt -INSERT INTO `item_mods` VALUES (19196,431,1); -- ITEM_ADDEFFECT_TYPE: DAMAGE +INSERT INTO `item_mods` VALUES (19196,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 -- Oberons Bullet INSERT INTO `item_mods` VALUES (19199,26,6); -- RACC: 6 @@ -44363,6 +44350,9 @@ INSERT INTO `item_mods` VALUES (21314,951,149); -- ITEM_ADDEFFECT_STATUS: 149 INSERT INTO `item_mods` VALUES (21314,952,20); -- ITEM_ADDEFFECT_POWER: 20 INSERT INTO `item_mods` VALUES (21314,953,60); -- ITEM_ADDEFFECT_DURATION: 60 +-- Righteous Bolt +INSERT INTO `item_mods` VALUES (21315,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 + -- Bismuth Bolt INSERT INTO `item_mods` VALUES (21318,24,5); -- RATT: 5 INSERT INTO `item_mods` VALUES (21318,26,5); -- RACC: 5 @@ -47035,6 +47025,7 @@ INSERT INTO `item_mods` VALUES (22286,25,15); -- ACC: 15 INSERT INTO `item_mods` VALUES (22287,26,25); -- RACC: 25 INSERT INTO `item_mods` VALUES (22287,30,25); -- MACC: 25 INSERT INTO `item_mods` VALUES (22287,305,20); -- RECYCLE: 20 +INSERT INTO `item_mods` VALUES (22287,1181,1); -- ITEM_ADDEFFECT_SCRIPTED: 1 -- Hauksbok Arrow INSERT INTO `item_mods` VALUES (22293,8,10); -- STR: 10 From ad00b54ec25e4327111a28d3454d26ad208c13e5 Mon Sep 17 00:00:00 2001 From: Xaver-DaRed Date: Thu, 9 Jul 2026 13:57:19 +0200 Subject: [PATCH 2/6] Edit `calculateAbsorption()` to account for non-magical damage sources --- .../actions/mobskills/arrogance_incarnate.lua | 2 +- scripts/actions/spells/black/meteor.lua | 2 +- scripts/actions/weaponskills/atonement.lua | 2 +- .../actions/weaponskills/spirits_within.lua | 2 +- .../action_additional_effect_damage.lua | 2 +- scripts/combat/skillchain.lua | 2 +- scripts/globals/ability.lua | 4 +-- scripts/globals/additional_effects.lua | 2 +- scripts/globals/bluemagic.lua | 6 ++--- scripts/globals/job_utils/corsair.lua | 2 +- scripts/globals/job_utils/dragoon.lua | 2 +- scripts/globals/job_utils/rune_fencer.lua | 2 +- scripts/globals/magic.lua | 2 +- scripts/globals/mobs.lua | 2 +- scripts/globals/mobskills.lua | 8 +++--- scripts/globals/spells/absorb_spell.lua | 4 +-- scripts/globals/spells/damage_spell.lua | 25 +++++++++++++------ scripts/globals/weaponskills.lua | 4 +-- scripts/zones/Arrapago_Reef/mobs/Velionis.lua | 2 +- scripts/zones/Attohwa_Chasm/mobs/Sargas.lua | 2 +- .../zones/Beaucedine_Glacier/mobs/Humbaba.lua | 2 +- .../zones/Crawlers_Nest/mobs/Aqrabuamelu.lua | 2 +- scripts/zones/Halvung/mobs/Copper_Borer.lua | 2 +- scripts/zones/Ordelles_Caves/mobs/Bombast.lua | 2 +- .../mobs/Unstable_Cluster.lua | 2 +- scripts/zones/RoMaeve/mobs/Martinet.lua | 2 +- .../Toraimarai_Canal/mobs/Brazen_Bones.lua | 2 +- .../Uleguerand_Range/mobs/Father_Frost.lua | 2 +- .../Upper_Delkfutts_Tower/mobs/Autarch.lua | 2 +- 29 files changed, 54 insertions(+), 43 deletions(-) diff --git a/scripts/actions/mobskills/arrogance_incarnate.lua b/scripts/actions/mobskills/arrogance_incarnate.lua index 8ca8b598189..abbaff982a6 100644 --- a/scripts/actions/mobskills/arrogance_incarnate.lua +++ b/scripts/actions/mobskills/arrogance_incarnate.lua @@ -23,7 +23,7 @@ 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.calculateAbsorption(target, xi.element.NONE, false, false, false, true)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, true)) dmg = math.floor(target:handleSevereDamage(dmg, false)) dmg = utils.handlePhalanx(target, dmg) diff --git a/scripts/actions/spells/black/meteor.lua b/scripts/actions/spells/black/meteor.lua index c1582326562..cdecb70e999 100644 --- a/scripts/actions/spells/black/meteor.lua +++ b/scripts/actions/spells/black/meteor.lua @@ -38,7 +38,7 @@ 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.calculateAbsorption(target, xi.element.NONE, false, true, false, false)) damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, true, false)) damage = math.floor(damage * xi.spells.damage.calculateMTDR(caster, spell)) damage = math.floor(damage * xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false)) diff --git a/scripts/actions/weaponskills/atonement.lua b/scripts/actions/weaponskills/atonement.lua index c43e4227c17..bac084f9c67 100644 --- a/scripts/actions/weaponskills/atonement.lua +++ b/scripts/actions/weaponskills/atonement.lua @@ -74,7 +74,7 @@ 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.calculateAbsorption(target, xi.element.NONE, false, false, false, true)) damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, true)) damage = math.floor(target:handleSevereDamage(damage, false)) diff --git a/scripts/actions/weaponskills/spirits_within.lua b/scripts/actions/weaponskills/spirits_within.lua index 9513c6a7f1b..2878261b3be 100644 --- a/scripts/actions/weaponskills/spirits_within.lua +++ b/scripts/actions/weaponskills/spirits_within.lua @@ -49,7 +49,7 @@ 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.calculateAbsorption(target, xi.element.NONE, false, false, false, true)) damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, true)) damage = math.floor(target:handleSevereDamage(damage, false)) diff --git a/scripts/combat/action_additional_effect_damage.lua b/scripts/combat/action_additional_effect_damage.lua index b4f2c2a079f..61c22c4563c 100644 --- a/scripts/combat/action_additional_effect_damage.lua +++ b/scripts/combat/action_additional_effect_damage.lua @@ -136,7 +136,7 @@ xi.combat.action.executeAddEffectDamage = function(actor, target, fedData) 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.params.attackType == xi.attackType.MAGICAL) + 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) diff --git a/scripts/combat/skillchain.lua b/scripts/combat/skillchain.lua index 9fff31ff41a..17902594c28 100644 --- a/scripts/combat/skillchain.lua +++ b/scripts/combat/skillchain.lua @@ -114,7 +114,7 @@ xi.combat.skillchain.calculateSkillchainDamage = function(actor, target, baseDam -- Unconfirmed order. local inninMultiplier = 1 + actor:getMerit(xi.merit.INNIN_EFFECT) / 100 local sengikoriMultiplier = 1 + target:getMod(xi.mod.SENGIKORI_SC_DMG_DEBUFF) / 100 - local absorptionMultiplier = xi.spells.damage.calculateAbsorption(target, skillchainElement, true) + local absorptionMultiplier = xi.spells.damage.calculateAbsorption(target, skillchainElement, false, true, false, false) -- Apply multipliers in order and floor after each step. finalDamage = math.floor(finalDamage * levelMultiplier) diff --git a/scripts/globals/ability.lua b/scripts/globals/ability.lua index 6dd7c5a90ca..940f386601c 100644 --- a/scripts/globals/ability.lua +++ b/scripts/globals/ability.lua @@ -68,12 +68,12 @@ xi.ability.adjustDamage = function(dmg, attacker, skill, target, skilltype, skil dmg = target:physicalDmgTaken(dmg, skillparam) elseif skilltype == xi.attackType.MAGICAL then dmg = math.floor(dmg * xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, element, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, element, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, element, true, false)) dmg = math.floor(target:handleSevereDamage(dmg, false)) elseif skilltype == xi.attackType.BREATH then dmg = math.floor(dmg * xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, element, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, element, false, false, false, true)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, element, false, true)) dmg = math.floor(target:handleSevereDamage(dmg, false)) elseif skilltype == xi.attackType.RANGED then diff --git a/scripts/globals/additional_effects.lua b/scripts/globals/additional_effects.lua index 1e054f780bf..54f51eedd94 100644 --- a/scripts/globals/additional_effects.lua +++ b/scripts/globals/additional_effects.lua @@ -84,7 +84,7 @@ xi.additionalEffect.calcDamage = function(attacker, element, defender, damage) params.includemab = false -- May possibly need to include mab on case by case basis, further tests needed damage = addBonusesAbility(attacker, element, defender, damage, params) damage = math.floor(damage * applyResistanceAddEffect(attacker, defender, element, 0)) - damage = math.floor(damage * xi.spells.damage.calculateAbsorption(defender, element, true)) + damage = math.floor(damage * xi.spells.damage.calculateAbsorption(defender, element, false, true, false, false)) damage = math.floor(damage * xi.spells.damage.calculateNullification(defender, element, true, false)) -- Todo: make sure day/weather/affinity bonuses tie in right here damage = finalMagicNonSpellAdjustments(attacker, defender, element, damage) diff --git a/scripts/globals/bluemagic.lua b/scripts/globals/bluemagic.lua index a57d6914df1..24165a476ce 100644 --- a/scripts/globals/bluemagic.lua +++ b/scripts/globals/bluemagic.lua @@ -443,7 +443,7 @@ xi.spells.blue.useDrainSpell = function(caster, target, spell, params, damageCap -- Early returns if - xi.spells.damage.calculateAbsorption(target, spell:getElement(), true) ~= 1 or + xi.spells.damage.calculateAbsorption(target, spell:getElement(), false, true, false, false) ~= 1 or xi.spells.damage.calculateNullification(target, spell:getElement(), true, false) ~= 1 or target:isUndead() then @@ -549,7 +549,7 @@ xi.spells.blue.useBreathSpell = function(caster, target, spell, params) -- Multipliers local correlationMultiplier = xi.combat.damage.ecosystemMultiplier(caster, target, params.ecosystem) local breathSDT = 1 + caster:getMod(xi.mod.BREATH_DMG_DEALT) / 100 - local absorb = xi.spells.damage.calculateAbsorption(target, spellElement, false) + local absorb = xi.spells.damage.calculateAbsorption(target, spellElement, false, true, false, true) local nullify = xi.spells.damage.calculateNullification(target, spellElement, false, true) local targetMagicDamageAdjustment = xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true) local elementalStaffBonus = xi.spells.damage.calculateElementalStaffBonus(caster, spellElement) @@ -629,7 +629,7 @@ xi.spells.blue.applySpellDamage = function(caster, target, spell, dmg, params, t -- handle MDT, One For All, Liement if attackType == xi.attackType.MAGICAL then - local absorb = xi.spells.damage.calculateAbsorption(target, spell:getElement(), true) + local absorb = xi.spells.damage.calculateAbsorption(target, spell:getElement(), false, true, false, false) local nullify = xi.spells.damage.calculateNullification(target, spell:getElement(), true, false) dmg = math.floor(dmg * absorb * nullify) diff --git a/scripts/globals/job_utils/corsair.lua b/scripts/globals/job_utils/corsair.lua index f192f400bbc..5a66281b67f 100644 --- a/scripts/globals/job_utils/corsair.lua +++ b/scripts/globals/job_utils/corsair.lua @@ -627,7 +627,7 @@ xi.job_utils.corsair.handleQuickDrawDamage = function(player, target, action, el -- Unconfirmed order. local sdtMultiplier = xi.combat.damage.magicalElementSDT(target, element) local additionalResistTier = xi.spells.damage.calculateAdditionalResistTier(player, target, element) - local elementalAbsorption = xi.spells.damage.calculateAbsorption(target, element, false) + local elementalAbsorption = xi.spells.damage.calculateAbsorption(target, element, false, false, true, false) local elementalNullification = xi.spells.damage.calculateNullification(target, element, false, false) -- Apply multipliers and bonuses. diff --git a/scripts/globals/job_utils/dragoon.lua b/scripts/globals/job_utils/dragoon.lua index bf626057051..3f1fb75e0dd 100644 --- a/scripts/globals/job_utils/dragoon.lua +++ b/scripts/globals/job_utils/dragoon.lua @@ -701,7 +701,7 @@ xi.job_utils.dragoon.useDamageBreath = function(wyvern, target, skill, action, d -- Breath accuracy is directly affected by a wyvern's current HP, but no data exists. local resist = xi.combat.magicHitRate.calculateResistRate(wyvern, target, 0, 0, 0, element, 0, 0, bonusMacc) local sdt = xi.combat.damage.magicalElementSDT(target, element) - local absorb = xi.spells.damage.calculateAbsorption(target, element, true) + local absorb = xi.spells.damage.calculateAbsorption(target, element, false, true, false, true) local nullify = xi.spells.damage.calculateNullification(target, element, true, true) local magicBurst = 1 diff --git a/scripts/globals/job_utils/rune_fencer.lua b/scripts/globals/job_utils/rune_fencer.lua index 2903900953b..ef09a69525f 100644 --- a/scripts/globals/job_utils/rune_fencer.lua +++ b/scripts/globals/job_utils/rune_fencer.lua @@ -523,7 +523,7 @@ local function getSwipeLungeDamageMultipliers(player, target, element, bonusMacc multipliers.dayAndWeather = xi.spells.damage.calculateDayAndWeather(player, element, false) multipliers.magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(player, target, 0, 0, element, 0) multipliers.TMDA = xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false) - multipliers.absorb = xi.spells.damage.calculateAbsorption(target, element, true) + multipliers.absorb = xi.spells.damage.calculateAbsorption(target, element, false, true, false, false) multipliers.nullify = xi.spells.damage.calculateNullification(target, element, true, false) multipliers.magicBurst = 1 multipliers.magicBurstBonus = 1 diff --git a/scripts/globals/magic.lua b/scripts/globals/magic.lua index 04b7cb659fa..f55bcaebf0d 100644 --- a/scripts/globals/magic.lua +++ b/scripts/globals/magic.lua @@ -84,7 +84,7 @@ function finalMagicNonSpellAdjustments(caster, target, ele, dmg) -- Handles target's HP adjustment and returns SIGNED dmg (negative values on absorb) dmg = math.floor(dmg * xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, ele, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, ele, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, ele, true, false)) dmg = math.floor(target:handleSevereDamage(dmg, false)) diff --git a/scripts/globals/mobs.lua b/scripts/globals/mobs.lua index b77a8885d00..4ff443c32d4 100644 --- a/scripts/globals/mobs.lua +++ b/scripts/globals/mobs.lua @@ -553,7 +553,7 @@ local addEffectImmediate = function(mob, target, damage, ae, params) power = addBonusesAbility(mob, ae.ele, target, power, ae.bonusAbilityParams) power = power * applyResistanceAddEffect(mob, target, ae.ele, 0) - power = power * xi.spells.damage.calculateAbsorption(target, ae.ele, true) + power = power * xi.spells.damage.calculateAbsorption(target, ae.ele, false, true, false, false) power = power * xi.spells.damage.calculateNullification(target, ae.ele, true, false) if ae.sub ~= xi.subEffect.TP_DRAIN and ae.sub ~= xi.subEffect.MP_DRAIN then diff --git a/scripts/globals/mobskills.lua b/scripts/globals/mobskills.lua index c1060baaf59..3717d06d903 100644 --- a/scripts/globals/mobskills.lua +++ b/scripts/globals/mobskills.lua @@ -1119,9 +1119,9 @@ xi.mobskills.mobMagicalMove = function(mob, target, skill, action, skillParams) end if attackType == xi.attackType.BREATH then - absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, false) + absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, false, false, false, true) else - absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, true) + absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, false, true, false, false) end ---------------------------------- @@ -1335,7 +1335,7 @@ xi.mobskills.mobBreathMove = function(mob, target, skill, action, skillParams) return returnInfo end - absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, false) + absorbDamage = xi.spells.damage.calculateAbsorption(target, actionElement, false, false, false, true) -- Calulate TP and TP_BONUS if applicable. -- TODO: Do mobs benefit from Fencer job trait's TP_BONUS? @@ -1758,7 +1758,7 @@ xi.mobskills.handleHybridDamage = function(mob, target, physicalDamage, element) -- Multipliers. local nullifyDamage = xi.spells.damage.calculateNullification(target, element, true, false) - local absorbDamage = xi.spells.damage.calculateAbsorption(target, element, true) + local absorbDamage = xi.spells.damage.calculateAbsorption(target, element, false, true, false, false) local sdt = 1 local resist = 1 local magicDamageAdjustment = 1 diff --git a/scripts/globals/spells/absorb_spell.lua b/scripts/globals/spells/absorb_spell.lua index a5247fb1ce4..11335b1b33d 100644 --- a/scripts/globals/spells/absorb_spell.lua +++ b/scripts/globals/spells/absorb_spell.lua @@ -103,7 +103,7 @@ xi.spells.absorb.doDrainingSpell = function(caster, target, spell) -- Early return: Target absorbs or nullifies dark. if - xi.spells.damage.calculateAbsorption(target, xi.element.DARK, true) ~= 1 or + xi.spells.damage.calculateAbsorption(target, xi.element.DARK, false, true, false, false) ~= 1 or xi.spells.damage.calculateNullification(target, xi.element.DARK, true, false) ~= 1 then spell:setMsg(xi.msg.basic.MAGIC_RESIST) @@ -218,7 +218,7 @@ xi.spells.absorb.doAbsorbTPSpell = function(caster, target, spell) -- Early return: Target absorbs or nullifies dark. if - xi.spells.damage.calculateAbsorption(target, xi.element.DARK, true) ~= 1 or + xi.spells.damage.calculateAbsorption(target, xi.element.DARK, false, true, false, false) ~= 1 or xi.spells.damage.calculateNullification(target, xi.element.DARK, true, false) ~= 1 then spell:setMsg(xi.msg.basic.MAGIC_RESIST) diff --git a/scripts/globals/spells/damage_spell.lua b/scripts/globals/spells/damage_spell.lua index 4698c56d7e4..41aa127855f 100644 --- a/scripts/globals/spells/damage_spell.lua +++ b/scripts/globals/spells/damage_spell.lua @@ -881,7 +881,7 @@ xi.spells.damage.calculateSpellActionTypeMultiplier = function(caster) return 1 + caster:getMod(xi.mod.POWER_MULTIPLIER_SPELL) / 100 end -xi.spells.damage.calculateAbsorption = function(target, element, isMagic) +xi.spells.damage.calculateAbsorption = function(target, element, isPhysical, isMagical, isRanged, isBreath) -- Absobtion by liement. local liementFactor = target:checkLiementAbsorb(xi.damageType.ELEMENTAL + element) -- Check for Liement. if liementFactor < 0 then @@ -893,17 +893,28 @@ xi.spells.damage.calculateAbsorption = function(target, element, isMagic) return -1 end - -- Absorb: Magic damage. + -- Absorb: Physical or Ranged. if - isMagic and + (isPhysical or isRanged) and + math.randomInt(1, 100) <= target:getMod(xi.mod.PHYS_ABSORB) + then + return -1 + end + + -- Absorb: Magic damage. TODO: Do breaths count as magical damage for this mod usage? + if + isMagical and math.randomInt(1, 100) <= target:getMod(xi.mod.MAGIC_ABSORB) then return -1 end + -- Absorb: Breath + -- Modifier doesn't exist. But it case it ever does, place here. + -- Absorb: Element damage. if - element > 0 and + element > xi.element.NONE and math.randomInt(1, 100) <= target:getMod(xi.data.element.getElementalAbsorptionModifier(element)) then return -1 @@ -913,7 +924,7 @@ xi.spells.damage.calculateAbsorption = function(target, element, isMagic) return 1 end -xi.spells.damage.calculateNullification = function(target, element, isMagic, isBreath) +xi.spells.damage.calculateNullification = function(target, element, isMagical, isBreath) -- Nullify: All damage. if math.randomInt(1, 100) <= target:getMod(xi.mod.NULL_DAMAGE) then return 0 @@ -921,7 +932,7 @@ xi.spells.damage.calculateNullification = function(target, element, isMagic, isB -- Nullify: Magic damage. if - isMagic and + isMagical and math.randomInt(1, 100) <= target:getMod(xi.mod.NULL_MAGICAL_DAMAGE) then return 0 @@ -1073,7 +1084,7 @@ xi.spells.damage.useDamageSpell = function(caster, target, spell) end -- Calculate absoprtion and magic burst. - local absorbFactor = xi.spells.damage.calculateAbsorption(target, spellElement, true) + local absorbFactor = xi.spells.damage.calculateAbsorption(target, spellElement, false, true, false, false) local magicBurstTier = xi.combat.magicBurst.getMagicBurstTier(target, spellElement) local notAbsorb = absorbFactor > 0 diff --git a/scripts/globals/weaponskills.lua b/scripts/globals/weaponskills.lua index ba152d5bc2a..6ad4dc9ec9e 100644 --- a/scripts/globals/weaponskills.lua +++ b/scripts/globals/weaponskills.lua @@ -251,7 +251,7 @@ local function calculateHybridMagicDamage(tp, physicaldmg, attacker, target, wsP magicdmg = math.floor(target:handleSevereDamage(magicdmg, false)) if magicdmg > 0 then - magicdmg = math.floor(magicdmg * xi.spells.damage.calculateAbsorption(target, wsParams.ele, true)) + magicdmg = math.floor(magicdmg * xi.spells.damage.calculateAbsorption(target, wsParams.ele, false, true, false, false)) magicdmg = math.floor(magicdmg * xi.spells.damage.calculateNullification(target, wsParams.ele, true, false)) end @@ -890,7 +890,7 @@ xi.weaponskills.doMagicWeaponskill = function(attacker, target, wsID, wsParams, return dmg end - dmg = dmg * xi.spells.damage.calculateAbsorption(target, wsParams.ele, true) + dmg = dmg * xi.spells.damage.calculateAbsorption(target, wsParams.ele, false, true, false, false) dmg = dmg * xi.spells.damage.calculateNullification(target, wsParams.ele, true, false) dmg = utils.handlePhalanx(target, dmg) diff --git a/scripts/zones/Arrapago_Reef/mobs/Velionis.lua b/scripts/zones/Arrapago_Reef/mobs/Velionis.lua index 32e7bda776a..77a4d2a3381 100644 --- a/scripts/zones/Arrapago_Reef/mobs/Velionis.lua +++ b/scripts/zones/Arrapago_Reef/mobs/Velionis.lua @@ -46,7 +46,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) diff --git a/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua b/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua index 9dc4b6e3b7a..5cca96ee5e1 100644 --- a/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua +++ b/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua @@ -28,7 +28,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.THUNDER, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.THUNDER, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.THUNDER, dmg) diff --git a/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua b/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua index 8af10dc9134..f0e028e0611 100644 --- a/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua +++ b/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua @@ -34,7 +34,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) diff --git a/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua b/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua index 719758f315c..e85635dc8ad 100644 --- a/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua +++ b/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua @@ -73,7 +73,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) diff --git a/scripts/zones/Halvung/mobs/Copper_Borer.lua b/scripts/zones/Halvung/mobs/Copper_Borer.lua index c007d501976..f67b4ccfda3 100644 --- a/scripts/zones/Halvung/mobs/Copper_Borer.lua +++ b/scripts/zones/Halvung/mobs/Copper_Borer.lua @@ -34,7 +34,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) diff --git a/scripts/zones/Ordelles_Caves/mobs/Bombast.lua b/scripts/zones/Ordelles_Caves/mobs/Bombast.lua index f44e15b6bd2..1f43745f841 100644 --- a/scripts/zones/Ordelles_Caves/mobs/Bombast.lua +++ b/scripts/zones/Ordelles_Caves/mobs/Bombast.lua @@ -20,7 +20,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) diff --git a/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua b/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua index afe2e592378..6da0ce1cbc3 100644 --- a/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua +++ b/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua @@ -97,7 +97,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) diff --git a/scripts/zones/RoMaeve/mobs/Martinet.lua b/scripts/zones/RoMaeve/mobs/Martinet.lua index c909ea4dc51..d0e4687a8af 100644 --- a/scripts/zones/RoMaeve/mobs/Martinet.lua +++ b/scripts/zones/RoMaeve/mobs/Martinet.lua @@ -43,7 +43,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.THUNDER, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.THUNDER, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.THUNDER, dmg) diff --git a/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua b/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua index 9510d437f9d..207bbe81966 100644 --- a/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua +++ b/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua @@ -29,7 +29,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) diff --git a/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua b/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua index dda03c37237..d970f0db1cc 100644 --- a/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua +++ b/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua @@ -21,7 +21,7 @@ entity.onSpikesDamage = function(mob, target, damage) local dmg = damage + mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) diff --git a/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua b/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua index 0868c6ca2b9..3958624b97f 100644 --- a/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua +++ b/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua @@ -27,7 +27,7 @@ entity.onSpikesDamage = function(mob, target, damage) params.includemab = false dmg = addBonusesAbility(mob, xi.element.THUNDER, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.THUNDER, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, true)) + dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, true, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.THUNDER, dmg) From 25112ad6fef2da07b371f2e9b66e02941606d23d Mon Sep 17 00:00:00 2001 From: Xaver-DaRed Date: Thu, 9 Jul 2026 14:39:44 +0200 Subject: [PATCH 3/6] Edit `calculateNullification()` to account for non-magical damage source --- .../actions/mobskills/arrogance_incarnate.lua | 2 +- scripts/actions/spells/black/meteor.lua | 2 +- scripts/actions/weaponskills/atonement.lua | 2 +- .../actions/weaponskills/spirits_within.lua | 2 +- .../action_additional_effect_damage.lua | 2 +- scripts/combat/skillchain.lua | 2 +- scripts/globals/ability.lua | 2 +- scripts/globals/additional_effects.lua | 2 +- scripts/globals/bluemagic.lua | 6 ++--- scripts/globals/job_utils/corsair.lua | 2 +- scripts/globals/job_utils/dragoon.lua | 2 +- scripts/globals/job_utils/rune_fencer.lua | 2 +- scripts/globals/magic.lua | 2 +- scripts/globals/mobs.lua | 2 +- scripts/globals/mobskills.lua | 8 +++--- scripts/globals/spells/absorb_spell.lua | 4 +-- scripts/globals/spells/damage_spell.lua | 26 +++++++++++++++---- scripts/globals/weaponskills.lua | 4 +-- scripts/zones/Arrapago_Reef/mobs/Velionis.lua | 2 +- scripts/zones/Attohwa_Chasm/mobs/Sargas.lua | 2 +- .../zones/Beaucedine_Glacier/mobs/Humbaba.lua | 2 +- .../zones/Crawlers_Nest/mobs/Aqrabuamelu.lua | 2 +- scripts/zones/Halvung/mobs/Copper_Borer.lua | 2 +- scripts/zones/Ordelles_Caves/mobs/Bombast.lua | 2 +- .../mobs/Unstable_Cluster.lua | 2 +- scripts/zones/RoMaeve/mobs/Martinet.lua | 2 +- .../Toraimarai_Canal/mobs/Brazen_Bones.lua | 2 +- .../Uleguerand_Range/mobs/Father_Frost.lua | 2 +- .../Upper_Delkfutts_Tower/mobs/Autarch.lua | 2 +- 29 files changed, 56 insertions(+), 40 deletions(-) diff --git a/scripts/actions/mobskills/arrogance_incarnate.lua b/scripts/actions/mobskills/arrogance_incarnate.lua index abbaff982a6..69751e82a14 100644 --- a/scripts/actions/mobskills/arrogance_incarnate.lua +++ b/scripts/actions/mobskills/arrogance_incarnate.lua @@ -24,7 +24,7 @@ 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, false, false, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.NONE, 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) diff --git a/scripts/actions/spells/black/meteor.lua b/scripts/actions/spells/black/meteor.lua index cdecb70e999..b7268d74f1d 100644 --- a/scripts/actions/spells/black/meteor.lua +++ b/scripts/actions/spells/black/meteor.lua @@ -39,7 +39,7 @@ spellObject.onSpellCast = function(caster, target, spell) end 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, true, 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)) diff --git a/scripts/actions/weaponskills/atonement.lua b/scripts/actions/weaponskills/atonement.lua index bac084f9c67..72bdfbf501e 100644 --- a/scripts/actions/weaponskills/atonement.lua +++ b/scripts/actions/weaponskills/atonement.lua @@ -75,7 +75,7 @@ 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, false, false, true)) - damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, 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 diff --git a/scripts/actions/weaponskills/spirits_within.lua b/scripts/actions/weaponskills/spirits_within.lua index 2878261b3be..9924bbbd741 100644 --- a/scripts/actions/weaponskills/spirits_within.lua +++ b/scripts/actions/weaponskills/spirits_within.lua @@ -50,7 +50,7 @@ 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, false, false, true)) - damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, 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 diff --git a/scripts/combat/action_additional_effect_damage.lua b/scripts/combat/action_additional_effect_damage.lua index 61c22c4563c..8cc0517a82f 100644 --- a/scripts/combat/action_additional_effect_damage.lua +++ b/scripts/combat/action_additional_effect_damage.lua @@ -121,7 +121,7 @@ xi.combat.action.executeAddEffectDamage = function(actor, target, fedData) end -- Early return: Effect is nullified. - local nullification = xi.spells.damage.calculateNullification(params.aeTarget, params.magicalElement, params.attackType == xi.attackType.MAGICAL, params.attackType == xi.attackType.BREATH) + 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 diff --git a/scripts/combat/skillchain.lua b/scripts/combat/skillchain.lua index 17902594c28..5ea71950b7e 100644 --- a/scripts/combat/skillchain.lua +++ b/scripts/combat/skillchain.lua @@ -92,7 +92,7 @@ xi.combat.skillchain.calculateSkillchainDamage = function(actor, target, baseDam return 0 end - if xi.spells.damage.calculateNullification(target, skillchainElement, true, false) == 0 then + if xi.spells.damage.calculateNullification(target, skillchainElement, false, true, false, false) == 0 then return 0 end diff --git a/scripts/globals/ability.lua b/scripts/globals/ability.lua index 940f386601c..d6c87662c47 100644 --- a/scripts/globals/ability.lua +++ b/scripts/globals/ability.lua @@ -69,7 +69,7 @@ xi.ability.adjustDamage = function(dmg, attacker, skill, target, skilltype, skil elseif skilltype == xi.attackType.MAGICAL then dmg = math.floor(dmg * xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, element, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, element, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, element, false, true, false, false)) dmg = math.floor(target:handleSevereDamage(dmg, false)) elseif skilltype == xi.attackType.BREATH then dmg = math.floor(dmg * xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true)) diff --git a/scripts/globals/additional_effects.lua b/scripts/globals/additional_effects.lua index 54f51eedd94..077a58db24f 100644 --- a/scripts/globals/additional_effects.lua +++ b/scripts/globals/additional_effects.lua @@ -85,7 +85,7 @@ xi.additionalEffect.calcDamage = function(attacker, element, defender, damage) damage = addBonusesAbility(attacker, element, defender, damage, params) damage = math.floor(damage * applyResistanceAddEffect(attacker, defender, element, 0)) damage = math.floor(damage * xi.spells.damage.calculateAbsorption(defender, element, false, true, false, false)) - damage = math.floor(damage * xi.spells.damage.calculateNullification(defender, element, true, false)) + damage = math.floor(damage * xi.spells.damage.calculateNullification(defender, element, false, true, false, false)) -- Todo: make sure day/weather/affinity bonuses tie in right here damage = finalMagicNonSpellAdjustments(attacker, defender, element, damage) diff --git a/scripts/globals/bluemagic.lua b/scripts/globals/bluemagic.lua index 24165a476ce..83b53151a97 100644 --- a/scripts/globals/bluemagic.lua +++ b/scripts/globals/bluemagic.lua @@ -444,7 +444,7 @@ xi.spells.blue.useDrainSpell = function(caster, target, spell, params, damageCap -- Early returns if xi.spells.damage.calculateAbsorption(target, spell:getElement(), false, true, false, false) ~= 1 or - xi.spells.damage.calculateNullification(target, spell:getElement(), true, false) ~= 1 or + xi.spells.damage.calculateNullification(target, spell:getElement(), false, true, false, false) ~= 1 or target:isUndead() then spell:setMsg(xi.msg.basic.MAGIC_NO_EFFECT) @@ -550,7 +550,7 @@ xi.spells.blue.useBreathSpell = function(caster, target, spell, params) local correlationMultiplier = xi.combat.damage.ecosystemMultiplier(caster, target, params.ecosystem) local breathSDT = 1 + caster:getMod(xi.mod.BREATH_DMG_DEALT) / 100 local absorb = xi.spells.damage.calculateAbsorption(target, spellElement, false, true, false, true) - local nullify = xi.spells.damage.calculateNullification(target, spellElement, false, true) + local nullify = xi.spells.damage.calculateNullification(target, spellElement, false, true, false, true) local targetMagicDamageAdjustment = xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true) local elementalStaffBonus = xi.spells.damage.calculateElementalStaffBonus(caster, spellElement) local elementalAffinityBonus = xi.spells.damage.calculateElementalAffinityBonus(caster, spellElement) @@ -630,7 +630,7 @@ xi.spells.blue.applySpellDamage = function(caster, target, spell, dmg, params, t -- handle MDT, One For All, Liement if attackType == xi.attackType.MAGICAL then local absorb = xi.spells.damage.calculateAbsorption(target, spell:getElement(), false, true, false, false) - local nullify = xi.spells.damage.calculateNullification(target, spell:getElement(), true, false) + local nullify = xi.spells.damage.calculateNullification(target, spell:getElement(), false, true, false, false) dmg = math.floor(dmg * absorb * nullify) if dmg < 0 then diff --git a/scripts/globals/job_utils/corsair.lua b/scripts/globals/job_utils/corsair.lua index 5a66281b67f..4cdb337b88c 100644 --- a/scripts/globals/job_utils/corsair.lua +++ b/scripts/globals/job_utils/corsair.lua @@ -628,7 +628,7 @@ xi.job_utils.corsair.handleQuickDrawDamage = function(player, target, action, el local sdtMultiplier = xi.combat.damage.magicalElementSDT(target, element) local additionalResistTier = xi.spells.damage.calculateAdditionalResistTier(player, target, element) local elementalAbsorption = xi.spells.damage.calculateAbsorption(target, element, false, false, true, false) - local elementalNullification = xi.spells.damage.calculateNullification(target, element, false, false) + local elementalNullification = xi.spells.damage.calculateNullification(target, element, false, false, true, false) -- Apply multipliers and bonuses. damage = math.floor(damage * deathPenaltyMultiplier) diff --git a/scripts/globals/job_utils/dragoon.lua b/scripts/globals/job_utils/dragoon.lua index 3f1fb75e0dd..94ab601d130 100644 --- a/scripts/globals/job_utils/dragoon.lua +++ b/scripts/globals/job_utils/dragoon.lua @@ -702,7 +702,7 @@ xi.job_utils.dragoon.useDamageBreath = function(wyvern, target, skill, action, d local resist = xi.combat.magicHitRate.calculateResistRate(wyvern, target, 0, 0, 0, element, 0, 0, bonusMacc) local sdt = xi.combat.damage.magicalElementSDT(target, element) local absorb = xi.spells.damage.calculateAbsorption(target, element, false, true, false, true) - local nullify = xi.spells.damage.calculateNullification(target, element, true, true) + local nullify = xi.spells.damage.calculateNullification(target, element, false, true, false, true) local magicBurst = 1 if skillchainCount > 0 then diff --git a/scripts/globals/job_utils/rune_fencer.lua b/scripts/globals/job_utils/rune_fencer.lua index ef09a69525f..db76e5391b0 100644 --- a/scripts/globals/job_utils/rune_fencer.lua +++ b/scripts/globals/job_utils/rune_fencer.lua @@ -524,7 +524,7 @@ local function getSwipeLungeDamageMultipliers(player, target, element, bonusMacc multipliers.magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(player, target, 0, 0, element, 0) multipliers.TMDA = xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false) multipliers.absorb = xi.spells.damage.calculateAbsorption(target, element, false, true, false, false) - multipliers.nullify = xi.spells.damage.calculateNullification(target, element, true, false) + multipliers.nullify = xi.spells.damage.calculateNullification(target, element, false, true, false, false) multipliers.magicBurst = 1 multipliers.magicBurstBonus = 1 diff --git a/scripts/globals/magic.lua b/scripts/globals/magic.lua index f55bcaebf0d..81b0fe09d4e 100644 --- a/scripts/globals/magic.lua +++ b/scripts/globals/magic.lua @@ -85,7 +85,7 @@ function finalMagicNonSpellAdjustments(caster, target, ele, dmg) dmg = math.floor(dmg * xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false)) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, ele, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, ele, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, ele, false, true, false, false)) dmg = math.floor(target:handleSevereDamage(dmg, false)) dmg = utils.handlePhalanx(target, dmg) diff --git a/scripts/globals/mobs.lua b/scripts/globals/mobs.lua index 4ff443c32d4..6c07e49dacf 100644 --- a/scripts/globals/mobs.lua +++ b/scripts/globals/mobs.lua @@ -554,7 +554,7 @@ local addEffectImmediate = function(mob, target, damage, ae, params) power = addBonusesAbility(mob, ae.ele, target, power, ae.bonusAbilityParams) power = power * applyResistanceAddEffect(mob, target, ae.ele, 0) power = power * xi.spells.damage.calculateAbsorption(target, ae.ele, false, true, false, false) - power = power * xi.spells.damage.calculateNullification(target, ae.ele, true, false) + power = power * xi.spells.damage.calculateNullification(target, ae.ele, false, true, false, false) if ae.sub ~= xi.subEffect.TP_DRAIN and ae.sub ~= xi.subEffect.MP_DRAIN then power = finalMagicNonSpellAdjustments(mob, target, ae.ele, power) diff --git a/scripts/globals/mobskills.lua b/scripts/globals/mobskills.lua index 3717d06d903..2cbdcf86ae4 100644 --- a/scripts/globals/mobskills.lua +++ b/scripts/globals/mobskills.lua @@ -1104,9 +1104,9 @@ xi.mobskills.mobMagicalMove = function(mob, target, skill, action, skillParams) local nullifyDamage = 1 if attackType == xi.attackType.BREATH then - nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, false, true) + nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, false, false, false, true) else - nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, true, false) + nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, false, true, false, false) end if nullifyDamage == 0 then @@ -1324,7 +1324,7 @@ xi.mobskills.mobBreathMove = function(mob, target, skill, action, skillParams) local absorbDamage = 1 local nullifyDamage = 1 - nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, false, true) + nullifyDamage = xi.spells.damage.calculateNullification(target, actionElement, false, false, false, true) if nullifyDamage == 0 then -- Note: Nullification takes precedence over elemental absorption. @@ -1757,7 +1757,7 @@ xi.mobskills.handleHybridDamage = function(mob, target, physicalDamage, element) local magicDamage = math.floor(physicalDamage) -- Multipliers. - local nullifyDamage = xi.spells.damage.calculateNullification(target, element, true, false) + local nullifyDamage = xi.spells.damage.calculateNullification(target, element, false, true, false, false) local absorbDamage = xi.spells.damage.calculateAbsorption(target, element, false, true, false, false) local sdt = 1 local resist = 1 diff --git a/scripts/globals/spells/absorb_spell.lua b/scripts/globals/spells/absorb_spell.lua index 11335b1b33d..bf56e5020e7 100644 --- a/scripts/globals/spells/absorb_spell.lua +++ b/scripts/globals/spells/absorb_spell.lua @@ -104,7 +104,7 @@ xi.spells.absorb.doDrainingSpell = function(caster, target, spell) -- Early return: Target absorbs or nullifies dark. if xi.spells.damage.calculateAbsorption(target, xi.element.DARK, false, true, false, false) ~= 1 or - xi.spells.damage.calculateNullification(target, xi.element.DARK, true, false) ~= 1 + xi.spells.damage.calculateNullification(target, xi.element.DARK, false, true, false, false) ~= 1 then spell:setMsg(xi.msg.basic.MAGIC_RESIST) return finalDamage @@ -219,7 +219,7 @@ xi.spells.absorb.doAbsorbTPSpell = function(caster, target, spell) -- Early return: Target absorbs or nullifies dark. if xi.spells.damage.calculateAbsorption(target, xi.element.DARK, false, true, false, false) ~= 1 or - xi.spells.damage.calculateNullification(target, xi.element.DARK, true, false) ~= 1 + xi.spells.damage.calculateNullification(target, xi.element.DARK, false, true, false, false) ~= 1 then spell:setMsg(xi.msg.basic.MAGIC_RESIST) return finalDamage diff --git a/scripts/globals/spells/damage_spell.lua b/scripts/globals/spells/damage_spell.lua index 41aa127855f..ebf8df9806c 100644 --- a/scripts/globals/spells/damage_spell.lua +++ b/scripts/globals/spells/damage_spell.lua @@ -924,13 +924,21 @@ xi.spells.damage.calculateAbsorption = function(target, element, isPhysical, isM return 1 end -xi.spells.damage.calculateNullification = function(target, element, isMagical, isBreath) +xi.spells.damage.calculateNullification = function(target, element, isPhysical, isMagical, isRanged, isBreath) -- Nullify: All damage. if math.randomInt(1, 100) <= target:getMod(xi.mod.NULL_DAMAGE) then return 0 end - -- Nullify: Magic damage. + -- Nullify: Physical damage. + if + isPhysical and + math.randomInt(1, 100) <= target:getMod(xi.mod.NULL_PHYSICAL_DAMAGE) + then + return 0 + end + + -- Nullify: Magical damage. if isMagical and math.randomInt(1, 100) <= target:getMod(xi.mod.NULL_MAGICAL_DAMAGE) @@ -938,6 +946,14 @@ xi.spells.damage.calculateNullification = function(target, element, isMagical, i return 0 end + -- Nullify: Ranged damage. + if + isRanged and + math.randomInt(1, 100) <= target:getMod(xi.mod.NULL_RANGED_DAMAGE) + then + return 0 + end + -- Nullify: Breath damage. if isBreath and @@ -946,9 +962,9 @@ xi.spells.damage.calculateNullification = function(target, element, isMagical, i return 0 end - -- Nullify: Element damage. + -- Nullify: Elemental damage. if - element > 0 and + element > xi.element.NONE and math.randomInt(1, 100) <= target:getMod(xi.data.element.getElementalNullificationModifier(element)) then return 0 @@ -1077,7 +1093,7 @@ xi.spells.damage.useDamageSpell = function(caster, target, spell) -- Early return: Spell is nullified. local spellElement = spell:getElement() - if xi.spells.damage.calculateNullification(target, spellElement, true, false) == 0 then + if xi.spells.damage.calculateNullification(target, spellElement, false, true, false, false) == 0 then spell:setMsg(xi.msg.basic.MAGIC_RESIST) return 0 diff --git a/scripts/globals/weaponskills.lua b/scripts/globals/weaponskills.lua index 6ad4dc9ec9e..44590432a39 100644 --- a/scripts/globals/weaponskills.lua +++ b/scripts/globals/weaponskills.lua @@ -252,7 +252,7 @@ local function calculateHybridMagicDamage(tp, physicaldmg, attacker, target, wsP if magicdmg > 0 then magicdmg = math.floor(magicdmg * xi.spells.damage.calculateAbsorption(target, wsParams.ele, false, true, false, false)) - magicdmg = math.floor(magicdmg * xi.spells.damage.calculateNullification(target, wsParams.ele, true, false)) + magicdmg = math.floor(magicdmg * xi.spells.damage.calculateNullification(target, wsParams.ele, false, true, false, false)) end if magicdmg > 0 then -- handle nonzero damage if previous function does not absorb or nullify @@ -891,7 +891,7 @@ xi.weaponskills.doMagicWeaponskill = function(attacker, target, wsID, wsParams, end dmg = dmg * xi.spells.damage.calculateAbsorption(target, wsParams.ele, false, true, false, false) - dmg = dmg * xi.spells.damage.calculateNullification(target, wsParams.ele, true, false) + dmg = dmg * xi.spells.damage.calculateNullification(target, wsParams.ele, false, true, false, false) dmg = utils.handlePhalanx(target, dmg) dmg = utils.handleOneForAll(target, dmg) diff --git a/scripts/zones/Arrapago_Reef/mobs/Velionis.lua b/scripts/zones/Arrapago_Reef/mobs/Velionis.lua index 77a4d2a3381..43e4af1c0b1 100644 --- a/scripts/zones/Arrapago_Reef/mobs/Velionis.lua +++ b/scripts/zones/Arrapago_Reef/mobs/Velionis.lua @@ -47,7 +47,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) if dmg < 0 then diff --git a/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua b/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua index 5cca96ee5e1..44bf7576ea3 100644 --- a/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua +++ b/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua @@ -29,7 +29,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.THUNDER, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.THUNDER, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.THUNDER, dmg) if dmg < 0 then diff --git a/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua b/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua index f0e028e0611..81397ee1944 100644 --- a/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua +++ b/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua @@ -35,7 +35,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) if dmg < 0 then diff --git a/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua b/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua index e85635dc8ad..1ed58d52ef6 100644 --- a/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua +++ b/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua @@ -74,7 +74,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) if dmg < 0 then diff --git a/scripts/zones/Halvung/mobs/Copper_Borer.lua b/scripts/zones/Halvung/mobs/Copper_Borer.lua index f67b4ccfda3..1af50a2f970 100644 --- a/scripts/zones/Halvung/mobs/Copper_Borer.lua +++ b/scripts/zones/Halvung/mobs/Copper_Borer.lua @@ -35,7 +35,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) if dmg < 0 then diff --git a/scripts/zones/Ordelles_Caves/mobs/Bombast.lua b/scripts/zones/Ordelles_Caves/mobs/Bombast.lua index 1f43745f841..cb5014b8c4f 100644 --- a/scripts/zones/Ordelles_Caves/mobs/Bombast.lua +++ b/scripts/zones/Ordelles_Caves/mobs/Bombast.lua @@ -21,7 +21,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) if dmg < 0 then diff --git a/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua b/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua index 6da0ce1cbc3..687332b35bc 100644 --- a/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua +++ b/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua @@ -98,7 +98,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) if dmg < 0 then diff --git a/scripts/zones/RoMaeve/mobs/Martinet.lua b/scripts/zones/RoMaeve/mobs/Martinet.lua index d0e4687a8af..73b6fe94312 100644 --- a/scripts/zones/RoMaeve/mobs/Martinet.lua +++ b/scripts/zones/RoMaeve/mobs/Martinet.lua @@ -44,7 +44,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.THUNDER, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.THUNDER, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.THUNDER, dmg) if dmg < 0 then diff --git a/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua b/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua index 207bbe81966..fa3b04e6f1d 100644 --- a/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua +++ b/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua @@ -30,7 +30,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) if dmg < 0 then diff --git a/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua b/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua index d970f0db1cc..c2a1c8ce2d2 100644 --- a/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua +++ b/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua @@ -22,7 +22,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) if dmg < 0 then diff --git a/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua b/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua index 3958624b97f..b08dbffe589 100644 --- a/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua +++ b/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua @@ -28,7 +28,7 @@ entity.onSpikesDamage = function(mob, target, damage) dmg = addBonusesAbility(mob, xi.element.THUNDER, target, dmg, params) dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.THUNDER, 0) dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, true, false)) + dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, false, true, false, false)) dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.THUNDER, dmg) if dmg < 0 then From 7a055dc19fc79dfe772ff7fca19bb6daf8477057 Mon Sep 17 00:00:00 2001 From: Xaver-DaRed Date: Thu, 9 Jul 2026 15:08:18 +0200 Subject: [PATCH 4/6] Convert `Excalibur` to new AE system and normalize parameters --- scripts/items/balmung.lua | 4 ++-- scripts/items/bloody_bolt.lua | 6 +++--- scripts/items/dainslaif.lua | 6 +++--- scripts/items/darkling_bolt.lua | 6 +++--- scripts/items/earth_arrow.lua | 6 +++--- scripts/items/excalibur_119.lua | 22 ++++++++++------------ scripts/items/excalibur_119_ii.lua | 22 ++++++++++------------ scripts/items/excalibur_119_iii.lua | 22 ++++++++++------------ scripts/items/excalibur_75.lua | 22 ++++++++++------------ scripts/items/excalibur_80.lua | 22 ++++++++++------------ scripts/items/excalibur_85.lua | 22 ++++++++++------------ scripts/items/excalibur_90.lua | 22 ++++++++++------------ scripts/items/excalibur_95.lua | 22 ++++++++++------------ scripts/items/excalibur_99.lua | 22 ++++++++++------------ scripts/items/excalibur_99_ii.lua | 22 ++++++++++------------ scripts/items/fire_arrow.lua | 4 ++-- scripts/items/grand_knights_arrow.lua | 6 +++--- scripts/items/holy_bolt.lua | 6 +++--- scripts/items/ice_arrow.lua | 4 ++-- scripts/items/lightning_arrow.lua | 4 ++-- scripts/items/righteous_bolt.lua | 6 +++--- scripts/items/scouts_bolt.lua | 6 +++--- scripts/items/temple_knights_arrow.lua | 6 +++--- scripts/items/water_arrow.lua | 6 +++--- scripts/items/wind_arrow.lua | 6 +++--- 25 files changed, 141 insertions(+), 161 deletions(-) diff --git a/scripts/items/balmung.lua b/scripts/items/balmung.lua index 83c08cc4b53..81076311a06 100644 --- a/scripts/items/balmung.lua +++ b/scripts/items/balmung.lua @@ -6,14 +6,14 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) local pTable = { chance = 10, element = xi.element.DARK, } - return xi.combat.action.executeAddEffectDispel(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDispel(actor, target, pTable) end return itemObject diff --git a/scripts/items/bloody_bolt.lua b/scripts/items/bloody_bolt.lua index 370c4140c6f..2ff9c9e77a6 100644 --- a/scripts/items/bloody_bolt.lua +++ b/scripts/items/bloody_bolt.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) -- Minimum observed at more than -100 dStat is 57. Negative dStat does seem to drop you to 57, but scaling is currently unknown. -- 92 is the upper cap starting at 48 dStat @@ -26,7 +26,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag animation = xi.subEffect.HP_DRAIN, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/dainslaif.lua b/scripts/items/dainslaif.lua index 2abed7ac8e4..c3c8fdcf9d4 100644 --- a/scripts/items/dainslaif.lua +++ b/scripts/items/dainslaif.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) local pTable = { @@ -24,7 +24,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag animation = xi.subEffect.DARKNESS_DAMAGE, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/darkling_bolt.lua b/scripts/items/darkling_bolt.lua index 3701c28f4c8..ec557c5cc76 100644 --- a/scripts/items/darkling_bolt.lua +++ b/scripts/items/darkling_bolt.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) -- Unconfirmed power. local pTable = @@ -20,7 +20,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/earth_arrow.lua b/scripts/items/earth_arrow.lua index a4d77aede32..fa90e3ec114 100644 --- a/scripts/items/earth_arrow.lua +++ b/scripts/items/earth_arrow.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) -- Unconfirmed power. local pTable = @@ -20,7 +20,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_119.lua b/scripts/items/excalibur_119.lua index 79381801b23..0cefa844ec7 100644 --- a/scripts/items/excalibur_119.lua +++ b/scripts/items/excalibur_119.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_119_ii.lua b/scripts/items/excalibur_119_ii.lua index dd0e5d33736..1f83dc9c9dc 100644 --- a/scripts/items/excalibur_119_ii.lua +++ b/scripts/items/excalibur_119_ii.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_119_iii.lua b/scripts/items/excalibur_119_iii.lua index c7d1a131144..4aee1337e89 100644 --- a/scripts/items/excalibur_119_iii.lua +++ b/scripts/items/excalibur_119_iii.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_75.lua b/scripts/items/excalibur_75.lua index e4fb0984785..f830914ee4a 100644 --- a/scripts/items/excalibur_75.lua +++ b/scripts/items/excalibur_75.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_80.lua b/scripts/items/excalibur_80.lua index 433890df8b2..3b909983690 100644 --- a/scripts/items/excalibur_80.lua +++ b/scripts/items/excalibur_80.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_85.lua b/scripts/items/excalibur_85.lua index 5cce4ccf797..696ddb189bd 100644 --- a/scripts/items/excalibur_85.lua +++ b/scripts/items/excalibur_85.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_90.lua b/scripts/items/excalibur_90.lua index 647098b4a8d..33d93ddc129 100644 --- a/scripts/items/excalibur_90.lua +++ b/scripts/items/excalibur_90.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_95.lua b/scripts/items/excalibur_95.lua index 6bfffad8051..a5b43241b3c 100644 --- a/scripts/items/excalibur_95.lua +++ b/scripts/items/excalibur_95.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_99.lua b/scripts/items/excalibur_99.lua index 7a3531d6faf..b3a28394f5c 100644 --- a/scripts/items/excalibur_99.lua +++ b/scripts/items/excalibur_99.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/excalibur_99_ii.lua b/scripts/items/excalibur_99_ii.lua index 1eba2a79491..35e398ccbff 100644 --- a/scripts/items/excalibur_99_ii.lua +++ b/scripts/items/excalibur_99_ii.lua @@ -6,19 +6,17 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - if math.randomInt(1, 100) <= 7 then -- 7% chance - local params = {} +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local pTable = + { + chance = 7, + basePower = math.floor(actor:getHP() / 4), + attackType = xi.attackType.PHYSICAL, + physicalElement = xi.damageType.SLASHING, + magicalElement = xi.element.NONE, + } - params.subEffect = xi.subEffect.LIGHT_DAMAGE - params.damageType = xi.damageType.SLASHING - params.isPhysical = true - params.damage = math.floor(attacker:getHP() * 0.25) - - return xi.additionalEffect.procFunctions[xi.additionalEffect.procType.PHYS_DAMAGE](attacker, defender, item, params) - end - - return 0, 0, 0 + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/fire_arrow.lua b/scripts/items/fire_arrow.lua index 302223361a5..11dcd13a26a 100644 --- a/scripts/items/fire_arrow.lua +++ b/scripts/items/fire_arrow.lua @@ -6,7 +6,7 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) -- Unconfirmed power. local pTable = { @@ -18,7 +18,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/grand_knights_arrow.lua b/scripts/items/grand_knights_arrow.lua index 425e973f08e..9261b0cf25a 100644 --- a/scripts/items/grand_knights_arrow.lua +++ b/scripts/items/grand_knights_arrow.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) -- Unconfirmed power. local pTable = @@ -20,7 +20,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/holy_bolt.lua b/scripts/items/holy_bolt.lua index 6c287ec3cc6..f469d7f56cf 100644 --- a/scripts/items/holy_bolt.lua +++ b/scripts/items/holy_bolt.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.MND) - defender:getStat(xi.mod.MND) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.MND) - target:getStat(xi.mod.MND) -- Unconfirmed power. local pTable = @@ -20,7 +20,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/ice_arrow.lua b/scripts/items/ice_arrow.lua index 0091bb9c76a..752a0b77932 100644 --- a/scripts/items/ice_arrow.lua +++ b/scripts/items/ice_arrow.lua @@ -6,7 +6,7 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) -- Unconfirmed power. local pTable = { @@ -18,7 +18,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/lightning_arrow.lua b/scripts/items/lightning_arrow.lua index 5789127cb46..2a291fbd116 100644 --- a/scripts/items/lightning_arrow.lua +++ b/scripts/items/lightning_arrow.lua @@ -6,7 +6,7 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) -- Unconfirmed power. local pTable = { @@ -18,7 +18,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/righteous_bolt.lua b/scripts/items/righteous_bolt.lua index 647151ff13d..070db8aec70 100644 --- a/scripts/items/righteous_bolt.lua +++ b/scripts/items/righteous_bolt.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.MND) - defender:getStat(xi.mod.MND) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.MND) - target:getStat(xi.mod.MND) -- Unconfirmed power. local pTable = @@ -20,7 +20,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/scouts_bolt.lua b/scripts/items/scouts_bolt.lua index 58f4cf54106..4377da53d79 100644 --- a/scripts/items/scouts_bolt.lua +++ b/scripts/items/scouts_bolt.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.MND) - defender:getStat(xi.mod.MND) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.MND) - target:getStat(xi.mod.MND) -- Unconfirmed power. local pTable = @@ -20,7 +20,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/temple_knights_arrow.lua b/scripts/items/temple_knights_arrow.lua index 7857e6f087a..0439fb990a1 100644 --- a/scripts/items/temple_knights_arrow.lua +++ b/scripts/items/temple_knights_arrow.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) -- Unconfirmed power. local pTable = @@ -20,7 +20,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/water_arrow.lua b/scripts/items/water_arrow.lua index e1182975092..4e44c50486b 100644 --- a/scripts/items/water_arrow.lua +++ b/scripts/items/water_arrow.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) -- Unconfirmed power. local pTable = @@ -20,7 +20,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject diff --git a/scripts/items/wind_arrow.lua b/scripts/items/wind_arrow.lua index 1e5f2667b9a..1fec304c86a 100644 --- a/scripts/items/wind_arrow.lua +++ b/scripts/items/wind_arrow.lua @@ -6,8 +6,8 @@ ---@type TItem local itemObject = {} -itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamage, item) - local dStat = attacker:getStat(xi.mod.INT) - defender:getStat(xi.mod.INT) +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) -- Unconfirmed power. local pTable = @@ -20,7 +20,7 @@ itemObject.onItemAdditionalEffect = function(attacker, defender, baseAttackDamag canResist = true, } - return xi.combat.action.executeAddEffectDamage(attacker, defender, pTable) + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) end return itemObject From 66197fbad0936066e014e7089cc003da3c074c20 Mon Sep 17 00:00:00 2001 From: Xaver-DaRed Date: Thu, 9 Jul 2026 20:24:09 +0200 Subject: [PATCH 5/6] Make mob spikes use their own spikes global system --- scripts/combat/action_spikes_damage.lua | 155 ++++++++++++++++++ scripts/zones/Arrapago_Reef/mobs/Velionis.lua | 33 ++-- scripts/zones/Attohwa_Chasm/mobs/Sargas.lua | 28 ++-- .../zones/Beaucedine_Glacier/mobs/Humbaba.lua | 28 ++-- .../zones/Crawlers_Nest/mobs/Aqrabuamelu.lua | 26 ++- scripts/zones/Halvung/mobs/Copper_Borer.lua | 27 ++- scripts/zones/Ordelles_Caves/mobs/Bombast.lua | 27 ++- .../mobs/Unstable_Cluster.lua | 27 ++- scripts/zones/RoMaeve/mobs/Martinet.lua | 28 ++-- .../Toraimarai_Canal/mobs/Brazen_Bones.lua | 27 ++- .../Uleguerand_Range/mobs/Father_Frost.lua | 26 ++- .../Upper_Delkfutts_Tower/mobs/Autarch.lua | 29 ++-- 12 files changed, 282 insertions(+), 179 deletions(-) create mode 100644 scripts/combat/action_spikes_damage.lua diff --git a/scripts/combat/action_spikes_damage.lua b/scripts/combat/action_spikes_damage.lua new file mode 100644 index 00000000000..ff996d74a68 --- /dev/null +++ b/scripts/combat/action_spikes_damage.lua @@ -0,0 +1,155 @@ +----------------------------------- +-- Global file for additional effects (damage) +----------------------------------- +require('scripts/globals/spells/damage_spell') +----------------------------------- +xi = xi or {} +xi.combat = xi.combat or {} +xi.combat.action = xi.combat.action or {} +----------------------------------- + +local defaultsTable = +{ + [xi.element.NONE ] = { xi.subEffect.DEATH_SPIKES }, + [xi.element.FIRE ] = { xi.subEffect.BLAZE_SPIKES }, + [xi.element.ICE ] = { xi.subEffect.ICE_SPIKES }, + [xi.element.WIND ] = { xi.subEffect.GALE_SPIKES }, + [xi.element.EARTH ] = { xi.subEffect.CLOD_SPIKES }, + [xi.element.THUNDER] = { xi.subEffect.SHOCK_SPIKES }, + [xi.element.WATER ] = { xi.subEffect.DELUGE_SPIKES }, + [xi.element.LIGHT ] = { xi.subEffect.GLINT_SPIKES }, + [xi.element.DARK ] = { xi.subEffect.DREAD_SPIKES }, +} + +----------------------------------- +-- Local functions to ensure defaults are set. +----------------------------------- +local function validateParameters(actor, target, fedData) + local params = {} + + -- Chance. + params.chance = fedData.chance or 100 -- Default: Always proc. + + -- Limit undead + params.limitUndead = fedData.limitUndead or false -- Default: Works on undead. + + -- 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. + params.actorStat = fedData.actorStat or 0 + params.targetStat = fedData.targetStat or params.actorStat -- Currently unused. For future use. + params.skillRank = fedData.skillRank or 0 + params.macc = fedData.macc or 0 + + -- Multiplier properties. + params.canMAB = fedData.canMAB or false + params.canResist = fedData.canResist or false + params.lowestResist = fedData.lowestResist or 0.125 + params.canResistExtra = fedData.canResistExtra or false + + -- Drain properties. + params.drainHP = fedData.drainHP or false + params.drainMP = fedData.drainMP or false + params.drainTP = fedData.drainTP or false + params.overDrain = fedData.overDrain or false + + -- Animations and messaging. + params.animation = fedData.animation or defaultsTable[params.magicalElement][1] + params.messageDamage = fedData.messageDamage or xi.msg.basic.SPIKES_EFFECT_DMG + params.messageHeal = fedData.messageHeal or xi.msg.basic.SPIKES_EFFECT_HEAL + + return params +end + +----------------------------------- +-- Global functions called from "emtity.onSpikesDamage()" +----------------------------------- +xi.combat.action.executeSpikesDamage = function(actor, target, fedData) + local params = validateParameters(actor, target, fedData) + + -- Early return: No proc. + if math.randomInt(1, 100) > params.chance then + return 0, 0, 0 + end + + -- Early return: Limit undead. + if params.limitUndead and params.aeTarget:isUndead() then + return 0, 0, 0 + end + + -- 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.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 multiplierDayWeather = xi.spells.damage.calculateDayAndWeather(actor, params.magicalElement, false) + + -- Calculate optional multipliers. + local multiplierMagicDiff = params.canMAB and xi.spells.damage.calculateMagicBonusDiff(actor, params.aeTarget, 0, 0, params.magicalElement, 0) or 1 + local multiplierForcedResistTier = params.canResistExtra and xi.spells.damage.calculateAdditionalResistTier(actor, params.aeTarget, params.magicalElement) or 1 + + -- Calculate final damage. + damage = math.floor(damage * multiplierAbsorption) + damage = math.floor(damage * multiplierDamageTypeSDT) + damage = math.floor(damage * multiplierPhysicalElementSDT) + damage = math.floor(damage * multiplierMagicalElementSDT) + damage = math.floor(damage * multiplierDayWeather) + damage = math.floor(damage * multiplierMagicDiff) + damage = math.floor(damage * multiplierResist) + damage = math.floor(damage * multiplierForcedResistTier) + + -- Phalanx, One for all, Stoneskin. + if damage > 0 then + damage = utils.clamp(utils.handlePhalanx(params.aeTarget, damage), 0, 99999) + damage = utils.clamp(utils.handleOneForAll(params.aeTarget, damage), 0, 99999) + damage = utils.clamp(utils.handleStoneskin(params.aeTarget, damage), 0, 99999) + end + + -- Drain HP, MP or TP + if params.drainHP then + damage = params.overDrain and damage or utils.clamp(damage, 0, params.aeTarget:getHP()) + params.messageDamage = xi.msg.basic.ADD_EFFECT_HP_DRAIN + actor:addHP(damage) + end + + if params.drainMP then + damage = params.overDrain and damage or utils.clamp(damage, 0, params.aeTarget:getMP()) + params.messageDamage = xi.msg.basic.ADD_EFFECT_MP_DRAIN + actor:addMP(damage) + end + + if params.drainTP then + damage = params.overDrain and damage or utils.clamp(damage, 0, params.aeTarget:getTP()) + params.messageDamage = xi.msg.basic.ADD_EFFECT_TP_DRAIN + actor:addTP(damage) + end + + if damage < 0 then + params.aeTarget:addHP(-damage) -- Heal target. + return params.animation, params.messageHeal, -damage + end + + local actionDamageType = params.physicalElement > 0 and params.physicalElement or xi.damageType.ELEMENTAL + params.magicalElement + params.aeTarget:takeDamage(damage, actor, params.attackType, actionDamageType) + + return params.animation, params.messageDamage, damage +end diff --git a/scripts/zones/Arrapago_Reef/mobs/Velionis.lua b/scripts/zones/Arrapago_Reef/mobs/Velionis.lua index 43e4af1c0b1..53fe3930836 100644 --- a/scripts/zones/Arrapago_Reef/mobs/Velionis.lua +++ b/scripts/zones/Arrapago_Reef/mobs/Velionis.lua @@ -9,7 +9,7 @@ local entity = {} entity.onMobInitialize = function(mob) mob:setMobMod(xi.mobMod.AUTO_SPIKES, 1) - mob:addStatusEffect(xi.effect.BLAZE_SPIKES, { power = 200, origin = mob }) -- Wiki says "180-230" and we have NO DATA! We don't know what the players conditions/gear was. + mob:addStatusEffect(xi.effect.BLAZE_SPIKES, { power = 250, origin = mob }) -- Wiki says "180-230" and we have NO DATA! We don't know what the players conditions/gear was. mob:getStatusEffect(xi.effect.BLAZE_SPIKES):setEffectFlags(xi.effectFlag.DEATH) mob:setMobMod(xi.mobMod.IDLE_DESPAWN, 300) end @@ -33,29 +33,22 @@ entity.onMobFight = function(mob, target) end entity.onSpikesDamage = function(mob, target, damage) - -- we don't have an "isCasting()" so use getCurrentAction() instead if mob:getCurrentAction() == xi.action.category.MAGIC_CASTING then - -- No spikes when mid-cast. return 0, 0, 0 - else - -- Again per the note above, we have no data for what the actual damage should be. - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) + end - if dmg < 0 then - dmg = 0 - end + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.FIRE, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } - return xi.subEffect.BLAZE_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg - end + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end return entity diff --git a/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua b/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua index 44bf7576ea3..1d26fc207f6 100644 --- a/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua +++ b/scripts/zones/Attohwa_Chasm/mobs/Sargas.lua @@ -21,22 +21,18 @@ entity.onAdditionalEffect = function(mob, target, damage) end entity.onSpikesDamage = function(mob, target, damage) - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.THUNDER, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.THUNDER, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.THUNDER, dmg) - - if dmg < 0 then - dmg = 0 - end - - return xi.subEffect.SHOCK_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.THUNDER, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } + + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams) diff --git a/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua b/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua index 81397ee1944..1c6eee4a9ce 100644 --- a/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua +++ b/scripts/zones/Beaucedine_Glacier/mobs/Humbaba.lua @@ -27,22 +27,18 @@ entity.onMobSpawn = function(mob) end entity.onSpikesDamage = function(mob, target, damage) - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) - - if dmg < 0 then - dmg = 0 - end - - return xi.subEffect.ICE_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.ICE, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } + + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams) diff --git a/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua b/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua index 1ed58d52ef6..163a71f1e21 100644 --- a/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua +++ b/scripts/zones/Crawlers_Nest/mobs/Aqrabuamelu.lua @@ -66,22 +66,18 @@ entity.onMobInitialize = function(mob) end entity.onSpikesDamage = function(mob, target, damage) - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.ICE, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } - if dmg < 0 then - dmg = 0 - end - - return xi.subEffect.ICE_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams) diff --git a/scripts/zones/Halvung/mobs/Copper_Borer.lua b/scripts/zones/Halvung/mobs/Copper_Borer.lua index 1af50a2f970..e5854cc6189 100644 --- a/scripts/zones/Halvung/mobs/Copper_Borer.lua +++ b/scripts/zones/Halvung/mobs/Copper_Borer.lua @@ -26,23 +26,18 @@ entity.onAdditionalEffect = function(mob, target, damage) end entity.onSpikesDamage = function(mob, target, damage) - -- "damage" is the power of the status effect up in onMobinitialize. - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) - - if dmg < 0 then - dmg = 0 - end + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.FIRE, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } - return xi.subEffect.BLAZE_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams) diff --git a/scripts/zones/Ordelles_Caves/mobs/Bombast.lua b/scripts/zones/Ordelles_Caves/mobs/Bombast.lua index cb5014b8c4f..90660a2f8f6 100644 --- a/scripts/zones/Ordelles_Caves/mobs/Bombast.lua +++ b/scripts/zones/Ordelles_Caves/mobs/Bombast.lua @@ -12,23 +12,18 @@ entity.onMobInitialize = function(mob) end entity.onSpikesDamage = function(mob, target, damage) - -- "Damage" is the power of the status effect up in onMobinitialize. - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.FIRE, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } - if dmg < 0 then - dmg = 0 - end - - return xi.subEffect.BLAZE_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams) diff --git a/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua b/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua index 687332b35bc..88244fd55f4 100644 --- a/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua +++ b/scripts/zones/Riverne-Site_B01/mobs/Unstable_Cluster.lua @@ -89,23 +89,18 @@ entity.onAdditionalEffect = function(mob, target, damage) end entity.onSpikesDamage = function(mob, target, damage) - -- "damage" is the power of the status effect up in onMobSpawn. - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.FIRE, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.FIRE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.FIRE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.FIRE, dmg) - - if dmg < 0 then - dmg = 0 - end + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.FIRE, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } - return xi.subEffect.BLAZE_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end return entity diff --git a/scripts/zones/RoMaeve/mobs/Martinet.lua b/scripts/zones/RoMaeve/mobs/Martinet.lua index 73b6fe94312..4f5501e162e 100644 --- a/scripts/zones/RoMaeve/mobs/Martinet.lua +++ b/scripts/zones/RoMaeve/mobs/Martinet.lua @@ -36,22 +36,18 @@ entity.onMobSpawn = function(mob) end entity.onSpikesDamage = function(mob, target, damage) - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.THUNDER, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.THUNDER, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.THUNDER, dmg) - - if dmg < 0 then - dmg = 0 - end - - return xi.subEffect.SHOCK_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.THUNDER, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } + + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams) diff --git a/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua b/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua index fa3b04e6f1d..7e9bcbd0f65 100644 --- a/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua +++ b/scripts/zones/Toraimarai_Canal/mobs/Brazen_Bones.lua @@ -21,23 +21,18 @@ entity.onMobSpawn = function(mob) end entity.onSpikesDamage = function(mob, target, damage) - -- "damage" is the power of the status effect up in onMobinitialize. - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) - - if dmg < 0 then - dmg = 0 - end + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.ICE, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } - return xi.subEffect.ICE_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end entity.onAdditionalEffect = function(mob, target, damage) diff --git a/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua b/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua index c2a1c8ce2d2..4b2eebb326b 100644 --- a/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua +++ b/scripts/zones/Uleguerand_Range/mobs/Father_Frost.lua @@ -14,22 +14,18 @@ entity.onMobSpawn = function(mob) end entity.onSpikesDamage = function(mob, target, damage) - local params = {} - params.bonusmab = 0 - params.includemab = false + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.ICE, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } - local dmg = damage + mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - dmg = addBonusesAbility(mob, xi.element.ICE, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.ICE, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.ICE, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.ICE, dmg) - - if dmg < 0 then - dmg = 0 - end - - return xi.subEffect.ICE_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end entity.onMobDespawn = function(mob) diff --git a/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua b/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua index b08dbffe589..d01c9e4a91f 100644 --- a/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua +++ b/scripts/zones/Upper_Delkfutts_Tower/mobs/Autarch.lua @@ -19,23 +19,18 @@ entity.onMobSpawn = function(mob) end entity.onSpikesDamage = function(mob, target, damage) - -- "damage" is the power of the status effect up in onMobinitialize. - local intDiff = mob:getStat(xi.mod.INT) - target:getStat(xi.mod.INT) - local dmg = damage + intDiff - local params = {} - params.bonusmab = 0 - params.includemab = false - dmg = addBonusesAbility(mob, xi.element.THUNDER, target, dmg, params) - dmg = dmg * applyResistanceAddEffect(mob, target, xi.element.THUNDER, 0) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, xi.element.THUNDER, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, false, true, false, false)) - dmg = finalMagicNonSpellAdjustments(mob, target, xi.element.THUNDER, dmg) - - if dmg < 0 then - dmg = 0 - end - - return xi.subEffect.SHOCK_SPIKES, xi.msg.basic.SPIKES_EFFECT_DMG, dmg + local pTable = + { + basePower = damage, + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.THUNDER, + actorStat = xi.mod.INT, + canMAB = true, + canResist = true, + canResistExtra = true, + } + + return xi.combat.action.executeAddEffectDamage(mob, target, pTable) end entity.onMobDeath = function(mob, player, optParams) From 89c3abef4f5c3ade149ba2a2ae9286c3c0dd0369 Mon Sep 17 00:00:00 2001 From: Xaver-DaRed Date: Thu, 9 Jul 2026 20:33:00 +0200 Subject: [PATCH 6/6] Kill `finalMagicNonSpellAdjustments()` --- .../action_additional_effect_status.lua | 55 ++++++++++--------- scripts/globals/additional_effects.lua | 20 ++++--- scripts/globals/magic.lua | 29 +--------- scripts/globals/mobs.lua | 15 ++++- scripts/items/bloody_bolt.lua | 3 +- scripts/items/darkling_bolt.lua | 3 +- scripts/items/earth_arrow.lua | 3 +- scripts/items/fire_arrow.lua | 3 +- scripts/items/grand_knights_arrow.lua | 3 +- scripts/items/holy_bolt.lua | 3 +- scripts/items/ice_arrow.lua | 3 +- scripts/items/lightning_arrow.lua | 3 +- scripts/items/righteous_bolt.lua | 3 +- scripts/items/scouts_bolt.lua | 3 +- scripts/items/temple_knights_arrow.lua | 3 +- scripts/items/water_arrow.lua | 3 +- scripts/items/wind_arrow.lua | 3 +- 17 files changed, 70 insertions(+), 88 deletions(-) diff --git a/scripts/combat/action_additional_effect_status.lua b/scripts/combat/action_additional_effect_status.lua index f382d495bee..8c1a9c35d93 100644 --- a/scripts/combat/action_additional_effect_status.lua +++ b/scripts/combat/action_additional_effect_status.lua @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 diff --git a/scripts/globals/additional_effects.lua b/scripts/globals/additional_effects.lua index 077a58db24f..08942759b64 100644 --- a/scripts/globals/additional_effects.lua +++ b/scripts/globals/additional_effects.lua @@ -86,14 +86,20 @@ xi.additionalEffect.calcDamage = function(attacker, element, defender, damage) damage = math.floor(damage * applyResistanceAddEffect(attacker, defender, element, 0)) damage = math.floor(damage * xi.spells.damage.calculateAbsorption(defender, element, false, true, false, false)) damage = math.floor(damage * xi.spells.damage.calculateNullification(defender, element, false, true, false, false)) - -- Todo: make sure day/weather/affinity bonuses tie in right here - damage = finalMagicNonSpellAdjustments(attacker, defender, element, damage) + damage = math.floor(damage * xi.combat.damage.calculateDamageAdjustment(defender, false, true, false, false)) + damage = math.floor(damage * xi.spells.damage.calculateAbsorption(defender, element, false, true, false, false)) + damage = math.floor(damage * xi.spells.damage.calculateNullification(defender, element, false, true, false, false)) + damage = math.floor(defender:handleSevereDamage(damage, false)) + damage = utils.handlePhalanx(defender, damage) + damage = utils.handleOneForAll(defender, damage) + damage = utils.handleStoneskin(defender, damage) + damage = utils.clamp(damage, -99999, 99999) - --[[ - This should rightly be modified by resistance checks, and while those DO they are presently not perfect. - If you want to force some extra randomness, un-comment the line below to artificially force 20% variance. - ]] - -- damage = damage * (math.randomInt(90, 110) / 100) + if damage < 0 then + damage = -(defender:addHP(-damage)) + else + defender:takeDamage(damage, attacker, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL + element) + end return damage end diff --git a/scripts/globals/magic.lua b/scripts/globals/magic.lua index 81b0fe09d4e..eaf9564688f 100644 --- a/scripts/globals/magic.lua +++ b/scripts/globals/magic.lua @@ -27,7 +27,7 @@ function getCurePowerOld(caster) end function getBaseCure(power, divisor, constant, basepower) - return ((power - basepower) / divisor) + constant + return (power - basepower) / divisor + constant end function getBaseCureOld(power, divisor, constant) @@ -80,33 +80,6 @@ function applyResistanceAddEffect(actor, target, element, bonusMacc) return xi.combat.magicHitRate.calculateResistRate(actor, target, 0, xi.skill.NONE, 0, element, 0, 0, bonusMacc) end -function finalMagicNonSpellAdjustments(caster, target, ele, dmg) - -- Handles target's HP adjustment and returns SIGNED dmg (negative values on absorb) - - dmg = math.floor(dmg * xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateAbsorption(target, ele, false, true, false, false)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, ele, false, true, false, false)) - dmg = math.floor(target:handleSevereDamage(dmg, false)) - - dmg = utils.handlePhalanx(target, dmg) - dmg = utils.handleOneForAll(target, dmg) - dmg = utils.handleStoneskin(target, dmg) - - dmg = utils.clamp(dmg, -99999, 99999) - - if dmg < 0 then - dmg = -(target:addHP(-dmg)) - else - target:takeDamage(dmg, caster, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL + ele) - end - - -- Not updating enmity from damage, as this is primarily used for additional effects (which don't generate emnity) - -- in the case that updating enmity is needed, do it manually after calling this - -- target:updateEnmityFromDamage(caster, dmg) - - return dmg -end - function addBonusesAbility(caster, ele, target, dmg, params) local affinityBonus = xi.spells.damage.calculateElementalStaffBonus(caster, ele) dmg = math.floor(dmg * affinityBonus) diff --git a/scripts/globals/mobs.lua b/scripts/globals/mobs.lua index 6c07e49dacf..c7fa07fd574 100644 --- a/scripts/globals/mobs.lua +++ b/scripts/globals/mobs.lua @@ -557,7 +557,20 @@ local addEffectImmediate = function(mob, target, damage, ae, params) power = power * xi.spells.damage.calculateNullification(target, ae.ele, false, true, false, false) if ae.sub ~= xi.subEffect.TP_DRAIN and ae.sub ~= xi.subEffect.MP_DRAIN then - power = finalMagicNonSpellAdjustments(mob, target, ae.ele, power) + power = math.floor(power * xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false)) + power = math.floor(power * xi.spells.damage.calculateAbsorption(target, ae.ele, false, true, false, false)) + power = math.floor(power * xi.spells.damage.calculateNullification(target, ae.ele, false, true, false, false)) + power = math.floor(target:handleSevereDamage(power, false)) + power = utils.handlePhalanx(target, power) + power = utils.handleOneForAll(target, power) + power = utils.handleStoneskin(target, power) + power = utils.clamp(power, -99999, 99999) + + if power < 0 then + power = -(target:addHP(-power)) + else + target:takeDamage(power, mob, xi.attackType.MAGICAL, xi.damageType.ELEMENTAL + ae.ele) + end end -- target:printToPlayer(string.format('Adjusted Power: %f', power)) -- DEBUG diff --git a/scripts/items/bloody_bolt.lua b/scripts/items/bloody_bolt.lua index 2ff9c9e77a6..9aecfefea24 100644 --- a/scripts/items/bloody_bolt.lua +++ b/scripts/items/bloody_bolt.lua @@ -15,8 +15,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 60 + utils.clamp(dStat, -3, 16) + utils.clamp(math.floor((dStat - 16) / 2), 0, 16), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.DARK, canResist = true, lowestResist = 0.5, diff --git a/scripts/items/darkling_bolt.lua b/scripts/items/darkling_bolt.lua index ec557c5cc76..141451532fe 100644 --- a/scripts/items/darkling_bolt.lua +++ b/scripts/items/darkling_bolt.lua @@ -14,8 +14,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.DARK, canResist = true, } diff --git a/scripts/items/earth_arrow.lua b/scripts/items/earth_arrow.lua index fa90e3ec114..66c6bfaa451 100644 --- a/scripts/items/earth_arrow.lua +++ b/scripts/items/earth_arrow.lua @@ -14,8 +14,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.EARTH, canResist = true, } diff --git a/scripts/items/fire_arrow.lua b/scripts/items/fire_arrow.lua index 11dcd13a26a..3ca7bf0206e 100644 --- a/scripts/items/fire_arrow.lua +++ b/scripts/items/fire_arrow.lua @@ -12,8 +12,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = math.random(7, 10), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.FIRE, canResist = true, } diff --git a/scripts/items/grand_knights_arrow.lua b/scripts/items/grand_knights_arrow.lua index 9261b0cf25a..b2617eef711 100644 --- a/scripts/items/grand_knights_arrow.lua +++ b/scripts/items/grand_knights_arrow.lua @@ -14,8 +14,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.FIRE, canResist = true, } diff --git a/scripts/items/holy_bolt.lua b/scripts/items/holy_bolt.lua index f469d7f56cf..aa4dccc3fc3 100644 --- a/scripts/items/holy_bolt.lua +++ b/scripts/items/holy_bolt.lua @@ -14,8 +14,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 40 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.LIGHT, canResist = true, } diff --git a/scripts/items/ice_arrow.lua b/scripts/items/ice_arrow.lua index 752a0b77932..12337e285a0 100644 --- a/scripts/items/ice_arrow.lua +++ b/scripts/items/ice_arrow.lua @@ -12,8 +12,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = math.random(7, 10), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.ICE, canResist = true, } diff --git a/scripts/items/lightning_arrow.lua b/scripts/items/lightning_arrow.lua index 2a291fbd116..a8cd7f44a21 100644 --- a/scripts/items/lightning_arrow.lua +++ b/scripts/items/lightning_arrow.lua @@ -12,8 +12,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = math.random(7, 10), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.THUNDER, canResist = true, } diff --git a/scripts/items/righteous_bolt.lua b/scripts/items/righteous_bolt.lua index 070db8aec70..19e0e4d816a 100644 --- a/scripts/items/righteous_bolt.lua +++ b/scripts/items/righteous_bolt.lua @@ -14,8 +14,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 40 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.LIGHT, canResist = true, } diff --git a/scripts/items/scouts_bolt.lua b/scripts/items/scouts_bolt.lua index 4377da53d79..2bf3373c20a 100644 --- a/scripts/items/scouts_bolt.lua +++ b/scripts/items/scouts_bolt.lua @@ -14,8 +14,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 40 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.LIGHT, canResist = true, } diff --git a/scripts/items/temple_knights_arrow.lua b/scripts/items/temple_knights_arrow.lua index 0439fb990a1..89796e3c53b 100644 --- a/scripts/items/temple_knights_arrow.lua +++ b/scripts/items/temple_knights_arrow.lua @@ -14,8 +14,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.FIRE, canResist = true, } diff --git a/scripts/items/water_arrow.lua b/scripts/items/water_arrow.lua index 4e44c50486b..d6102fad7d5 100644 --- a/scripts/items/water_arrow.lua +++ b/scripts/items/water_arrow.lua @@ -14,8 +14,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.WATER, canResist = true, } diff --git a/scripts/items/wind_arrow.lua b/scripts/items/wind_arrow.lua index 1fec304c86a..0b551137643 100644 --- a/scripts/items/wind_arrow.lua +++ b/scripts/items/wind_arrow.lua @@ -14,8 +14,7 @@ itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, it { isRanged = true, basePower = 10 + utils.clamp(dStat, -3, 8) + utils.clamp(math.floor((dStat - 8) / 2), 0, 8), - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.WIND, canResist = true, }