From df872439351109d34321b3244db2450b327b8c67 Mon Sep 17 00:00:00 2001 From: Xaver-DaRed Date: Sat, 18 Jan 2025 12:34:24 +0100 Subject: [PATCH] Move additional resist tier multiplier to its own step Since it only applies to nukes, lets move it there --- scripts/globals/combat/magic_hit_rate.lua | 23 +++++------------------ scripts/globals/spells/damage_spell.lua | 21 ++++++++++++++++++--- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/scripts/globals/combat/magic_hit_rate.lua b/scripts/globals/combat/magic_hit_rate.lua index 4eb1a21458d..c324454d203 100644 --- a/scripts/globals/combat/magic_hit_rate.lua +++ b/scripts/globals/combat/magic_hit_rate.lua @@ -385,7 +385,6 @@ xi.combat.magicHitRate.calculateTargetMagicEvasion = function(actor, target, act local magicEva = target:getMod(xi.mod.MEVA) -- Base MACC. local resistRank = 0 -- Elemental specific Resistance rank. Acts as multiplier to base MACC. local resMod = 0 -- Elemental specific magic evasion. Acts as a additive bonus to base MACC after affected by resistance rank. - local levelDiff = target:getMainLvl() - actor:getMainLvl() -- Elemental magic evasion. if actionElement ~= xi.element.NONE then @@ -407,11 +406,10 @@ xi.combat.magicHitRate.calculateTargetMagicEvasion = function(actor, target, act -- Level correction. Target gets a bonus the higher the level if it's a mob. Never a penalty. if - levelDiff > 0 and - xi.combat.levelCorrection.isLevelCorrectedZone(actor) and - not target:isPC() + not target:isPC() and + xi.combat.levelCorrection.isLevelCorrectedZone(actor) then - magicEva = magicEva + levelDiff * 4 + magicEva = magicEva + utils.clamp(target:getMainLvl() - actor:getMainLvl(), 0, 100) * 4 end return magicEva @@ -437,7 +435,7 @@ end -- Calculate resist tier. ----------------------------------- -xi.combat.magicHitRate.calculateResistanceFactor = function(actor, target, skillType, actionElement, magicHitRate, rankModifier) +xi.combat.magicHitRate.calculateResistanceFactor = function(actor, target, actionElement, magicHitRate, rankModifier) local targetResistRate = 1 -- The variable we return. ---------------------------------------- @@ -521,17 +519,6 @@ xi.combat.magicHitRate.calculateResistanceFactor = function(actor, target, skill targetResistRate = 1 / (2 ^ resistTier) - ---------------------------------------- - -- Calculate additional resist tier. - ---------------------------------------- - if - not actor:hasStatusEffect(xi.effect.SUBTLE_SORCERY) and -- Subtle sorcery bypasses this tier. - targetResistRank >= 4 and -- Forced only at and after rank 4 (50% EEM). - skillType == xi.skill.ELEMENTAL_MAGIC -- Only applies to nukes. - then - targetResistRate = targetResistRate / 2 - end - return targetResistRate end @@ -553,7 +540,7 @@ xi.combat.magicHitRate.calculateResistRate = function(actor, target, spellGroup, local magicAcc = xi.combat.magicHitRate.calculateActorMagicAccuracy(actor, target, spellGroup, skillType, skillRank, actionElement, statUsed, bonusMacc) local magicEva = xi.combat.magicHitRate.calculateTargetMagicEvasion(actor, target, actionElement, magicEvasionModifier, rankModifier) local magicHitRate = xi.combat.magicHitRate.calculateMagicHitRate(magicAcc, magicEva) - local resistRate = xi.combat.magicHitRate.calculateResistanceFactor(actor, target, skillType, actionElement, magicHitRate, rankModifier) + local resistRate = xi.combat.magicHitRate.calculateResistanceFactor(actor, target, actionElement, magicHitRate, rankModifier) return resistRate end diff --git a/scripts/globals/spells/damage_spell.lua b/scripts/globals/spells/damage_spell.lua index 5b87ba5d984..e593febf32b 100644 --- a/scripts/globals/spells/damage_spell.lua +++ b/scripts/globals/spells/damage_spell.lua @@ -416,6 +416,19 @@ xi.spells.damage.calculateSDT = function(target, spellElement) return utils.clamp(sdt, 0, 3) end +xi.spells.damage.calculateAdditionalResistTier = function(caster, target, spellElement) + local additionalResistTier = 1 + + if + not caster:hasStatusEffect(xi.effect.SUBTLE_SORCERY) and -- Subtle sorcery bypasses this tier. + target:getMod(xi.combat.element.getElementalResistanceRankModifier(spellElement)) >= 4 -- Forced only at and after rank 4 (50% EEM). + then + additionalResistTier = additionalResistTier / 2 + end + + return additionalResistTier +end + xi.spells.damage.calculateDayAndWeather = function(caster, spellId, spellElement) local dayAndWeather = 1 -- The variable we want to calculate @@ -944,13 +957,13 @@ xi.spells.damage.useDamageSpell = function(caster, target, spell) end -- Skip resistances, magic damage adjustment (TMDA), magic burst and nuke-wall if we absorb the spell. - local resist = 1 + local resistTier = 1 local targetMagicDamageAdjustment = 1 local magicBurst = 1 local magicBurstBonus = 1 if nukeAbsorbOrNullify > 0 then - resist = xi.combat.magicHitRate.calculateResistRate(caster, target, spellGroup, skillType, 0, spellElement, statUsed, 0, bonusMacc) + resistTier = xi.combat.magicHitRate.calculateResistRate(caster, target, spellGroup, skillType, 0, spellElement, statUsed, 0, bonusMacc) targetMagicDamageAdjustment = xi.spells.damage.calculateTMDA(target, spellElement) -- If spell is NOT blue magic OR (if its blue magic AND has status effect) @@ -978,6 +991,7 @@ xi.spells.damage.useDamageSpell = function(caster, target, spell) local multipleTargetReduction = xi.spells.damage.calculateMTDR(spell) local elementalStaffBonus = xi.spells.damage.calculateElementalStaffBonus(caster, spellElement) local magianAffinity = xi.spells.damage.calculateMagianAffinity() + local additionalResistTier = xi.spells.damage.calculateAdditionalResistTier(caster, target, spellElement) local sdt = xi.spells.damage.calculateSDT(target, spellElement) local dayAndWeather = xi.spells.damage.calculateDayAndWeather(caster, spellId, spellElement) local magicBonusDiff = xi.spells.damage.calculateMagicBonusDiff(caster, target, spellId, skillType, spellElement) @@ -998,7 +1012,8 @@ xi.spells.damage.useDamageSpell = function(caster, target, spell) finalDamage = math.floor(finalDamage * elementalStaffBonus) finalDamage = math.floor(finalDamage * magianAffinity) finalDamage = math.floor(finalDamage * sdt) - finalDamage = math.floor(finalDamage * resist) + finalDamage = math.floor(finalDamage * resistTier) + finalDamage = math.floor(finalDamage * additionalResistTier) finalDamage = math.floor(finalDamage * dayAndWeather) finalDamage = math.floor(finalDamage * magicBonusDiff) finalDamage = math.floor(finalDamage * targetMagicDamageAdjustment)