diff --git a/scripts/globals/bluemagic.lua b/scripts/globals/bluemagic.lua index 402994612ed..9f34681cd40 100644 --- a/scripts/globals/bluemagic.lua +++ b/scripts/globals/bluemagic.lua @@ -217,6 +217,7 @@ xi.spells.blue.usePhysicalSpell = function(caster, target, spell, params) params.offcratiomod = params.offcratiomod * (caster:getMerit(xi.merit.PHYSICAL_POTENCY) + 100) / 100 params.bonusacc = params.bonusacc == nil and 0 or params.bonusacc + params.tphitslanded = 0 -- params.critchance will only be non-nil if base critchance is passed from spell lua local nativecrit = xi.combat.physical.calculateSwingCriticalRate(caster, target, 0, false) @@ -240,7 +241,6 @@ xi.spells.blue.usePhysicalSpell = function(caster, target, spell, params) spell:isAoE() == 0 and params.attackType ~= xi.attackType.RANGED) and caster:getTrickAttackChar(target) or nil - while hitsdone < params.numhits do local chance = math.random() @@ -271,9 +271,9 @@ xi.spells.blue.usePhysicalSpell = function(caster, target, spell, params) hitslanded = hitslanded + 1 sneakIsApplicable = false - -- increment target's TP (100TP per hit landed) + -- Store number of hits that did > 0 damage if finaldmg > 0 then - target:addTP(100) + params.tphitslanded = params.tphitslanded + 1 end end @@ -422,9 +422,10 @@ xi.spells.blue.applySpellDamage = function(caster, target, spell, dmg, params, t dmg = 0 end - dmg = dmg * xi.settings.main.BLUE_POWER - local attackType = params.attackType or xi.attackType.NONE - local damageType = params.damageType or xi.damageType.NONE + dmg = dmg * xi.settings.main.BLUE_POWER + local attackType = params.attackType or xi.attackType.NONE + local damageType = params.damageType or xi.damageType.NONE + local extraTPGained = xi.combat.tp.calculateTPGainOnMagicalDamage(dmg, caster, target) * math.max(params.tphitslanded - 1, 0) -- Calculate extra TP gained from multihits. takeSpellDamage accounts for one already. -- handle MDT, One For All, Liement if attackType == xi.attackType.MAGICAL then @@ -433,6 +434,7 @@ xi.spells.blue.applySpellDamage = function(caster, target, spell, dmg, params, t if dmg < 0 then target:takeSpellDamage(caster, spell, dmg, attackType, damageType) + target:addTP(extraTPGained) -- TODO: verify Afflatus/enmity from absorb? return dmg end @@ -452,6 +454,7 @@ xi.spells.blue.applySpellDamage = function(caster, target, spell, dmg, params, t dmg = target:checkDamageCap(dmg) target:takeSpellDamage(caster, spell, dmg, attackType, damageType) + target:addTP(extraTPGained) if not target:isPC() then if trickAttackTarget then diff --git a/scripts/globals/magic.lua b/scripts/globals/magic.lua index 79cd1e130c7..1439c6c0742 100644 --- a/scripts/globals/magic.lua +++ b/scripts/globals/magic.lua @@ -476,11 +476,6 @@ function finalMagicAdjustments(caster, target, spell, dmg) -- Handle Enmity. target:updateEnmityFromDamage(caster, dmg) - - -- Only add TP if the target is a mob - if target:getObjType() ~= xi.objType.PC and dmg > 0 then - target:addTP(100) - end end return dmg diff --git a/scripts/globals/spells/damage_spell.lua b/scripts/globals/spells/damage_spell.lua index e0bf98bea66..d974c0f5ebd 100644 --- a/scripts/globals/spells/damage_spell.lua +++ b/scripts/globals/spells/damage_spell.lua @@ -1044,11 +1044,6 @@ xi.spells.damage.useDamageSpell = function(caster, target, spell) -- Handle Enmity. target:updateEnmityFromDamage(caster, finalDamage) - -- Only add TP if the target is a mob and if the spell actually does damage. - if target:getObjType() ~= xi.objType.PC and finalDamage > 0 then - target:addTP(100) - end - -- Add "Magic Burst!" message if magicBurst > 1 then spell:setMsg(xi.msg.basic.MAGIC_BURST_DAMAGE) diff --git a/src/map/utils/battleutils.cpp b/src/map/utils/battleutils.cpp index 28453c00923..4ac4de3b50c 100644 --- a/src/map/utils/battleutils.cpp +++ b/src/map/utils/battleutils.cpp @@ -2559,7 +2559,7 @@ namespace battleutils PDefender->takeDamage(damage, PAttacker, attackType, damageType); // Remove effects from damage - if (PSpell->canTargetEnemy() && damage > 0 && PSpell->dealsDamage()) + if (PSpell->canTargetEnemy() && damage > 0) { PDefender->StatusEffectContainer->DelStatusEffectsByFlag(EFFECTFLAG_DAMAGE); @@ -2570,9 +2570,12 @@ namespace battleutils int16 tp = battleutils::CalculateSpellTP(PAttacker, PSpell); PAttacker->addTP(tp); - // Targets of damaging spells gain 50 tp + store tp bonus - float storeTPMultiplier = 1.0f + 0.01f * static_cast(PDefender->getMod(Mod::STORETP) + getStoreTPbonusFromMerit(PDefender)); - PDefender->addTP(static_cast(50 * storeTPMultiplier)); + // Targets of damaging spells gain TP + auto tpGainFunc = lua["xi"]["combat"]["tp"]["calculateTPGainOnMagicalDamage"]; + if (tpGainFunc.valid()) + { + PDefender->addTP(tpGainFunc(damage, CLuaBaseEntity(PAttacker), CLuaBaseEntity(PDefender))); + } } return damage;