116 lines
4.2 KiB
Lua
116 lines
4.2 KiB
Lua
-----------------------------------
|
|
require('scripts/globals/spells/damage_spell')
|
|
-----------------------------------
|
|
xi = xi or {}
|
|
xi.magic = xi.magic or {}
|
|
-----------------------------------
|
|
|
|
-----------------------------------
|
|
-- getCurePower returns the caster's cure power
|
|
-- getCureFinal returns the final cure amount
|
|
-- Source: http://members.shaw.ca/pizza_steve/cure/Cure_Calculator.html
|
|
-----------------------------------
|
|
function getCurePower(caster, isBlueMagic)
|
|
local mnd = caster:getStat(xi.mod.MND)
|
|
local vit = caster:getStat(xi.mod.VIT)
|
|
local skill = caster:getSkillLevel(xi.skill.HEALING_MAGIC)
|
|
local power = math.floor(mnd / 2) + math.floor(vit / 4) + skill
|
|
return power
|
|
end
|
|
|
|
function getCurePowerOld(caster)
|
|
local mnd = caster:getStat(xi.mod.MND)
|
|
local vit = caster:getStat(xi.mod.VIT)
|
|
local skill = caster:getSkillLevel(xi.skill.HEALING_MAGIC) -- it's healing magic skill for the BLU cures as well
|
|
local power = (3 * mnd) + vit + (3 * math.floor(skill / 5))
|
|
return power
|
|
end
|
|
|
|
function getBaseCure(power, divisor, constant, basepower)
|
|
return (power - basepower) / divisor + constant
|
|
end
|
|
|
|
function getBaseCureOld(power, divisor, constant)
|
|
return (power / 2) / divisor + constant
|
|
end
|
|
|
|
function getCureFinal(caster, spell, basecure, minCure, isBlueMagic)
|
|
if basecure < minCure then
|
|
basecure = minCure
|
|
end
|
|
|
|
local curePot = math.min(caster:getMod(xi.mod.CURE_POTENCY), 50) / 100 -- caps at 50%
|
|
local curePotII = math.min(caster:getMod(xi.mod.CURE_POTENCY_II), 30) / 100 -- caps at 30%
|
|
local potency = 1 + curePot + curePotII
|
|
local dayWeatherBonus = xi.spells.damage.calculateDayAndWeather(caster, spell:getElement(), false)
|
|
local dSeal = 1
|
|
|
|
if caster:hasStatusEffect(xi.effect.DIVINE_SEAL) then
|
|
dSeal = 2
|
|
end
|
|
|
|
local rapture = 1
|
|
if not isBlueMagic then --rapture doesn't affect BLU cures as they're not white magic
|
|
if caster:hasStatusEffect(xi.effect.RAPTURE) then
|
|
rapture = 1.5 + caster:getMod(xi.mod.RAPTURE_AMOUNT) / 100
|
|
caster:delStatusEffectSilent(xi.effect.RAPTURE)
|
|
end
|
|
end
|
|
|
|
-- Floor and return.
|
|
local final = math.floor(basecure)
|
|
final = math.floor(final * potency)
|
|
final = math.floor(final * dayWeatherBonus)
|
|
final = math.floor(final * rapture)
|
|
final = math.floor(final * dSeal)
|
|
|
|
return final
|
|
end
|
|
|
|
function isValidHealTarget(caster, target)
|
|
return target:getAllegiance() == caster:getAllegiance() and
|
|
(target:getObjType() == xi.objType.PC or
|
|
target:getObjType() == xi.objType.MOB or
|
|
target:getObjType() == xi.objType.TRUST or
|
|
target:getObjType() == xi.objType.FELLOW)
|
|
end
|
|
|
|
-- Applies resistance for additional effects
|
|
function applyResistanceAddEffect(actor, target, element, bonusMacc)
|
|
return xi.combat.magicHitRate.calculateResistRate(actor, target, { magicalElement = element, bonusMacc = bonusMacc })
|
|
end
|
|
|
|
function addBonusesAbility(caster, ele, target, dmg, params)
|
|
local affinityBonus = xi.spells.damage.calculateElementalStaffBonus(caster, ele)
|
|
dmg = math.floor(dmg * affinityBonus)
|
|
|
|
local magicDefense = xi.combat.damage.magicalElementSDT(target, ele)
|
|
dmg = math.floor(dmg * magicDefense)
|
|
|
|
local dayWeatherBonus = xi.spells.damage.calculateDayAndWeather(caster, ele, false)
|
|
dmg = math.floor(dmg * dayWeatherBonus)
|
|
|
|
local mab = 1
|
|
local mdefBarBonus = 0
|
|
if
|
|
ele >= xi.element.FIRE and
|
|
ele <= xi.element.WATER and
|
|
target:hasStatusEffect(xi.data.element.getAssociatedBarspellEffect(ele))
|
|
then -- bar- spell magic defense bonus
|
|
mdefBarBonus = target:getStatusEffect(xi.data.element.getAssociatedBarspellEffect(ele)):getSubPower()
|
|
end
|
|
|
|
if params ~= nil and params.bonusmab ~= nil and params.includemab then
|
|
mab = (100 + caster:getMod(xi.mod.MATT) + params.bonusmab) / (100 + target:getMod(xi.mod.MDEF) + mdefBarBonus)
|
|
elseif params == nil or (params ~= nil and params.includemab) then
|
|
mab = (100 + caster:getMod(xi.mod.MATT)) / (100 + target:getMod(xi.mod.MDEF) + mdefBarBonus)
|
|
end
|
|
|
|
if mab < 0 then
|
|
mab = 0
|
|
end
|
|
|
|
dmg = math.floor(dmg * mab)
|
|
|
|
return dmg
|
|
end
|