require('scripts/globals/combat/magic_hit_rate') require('scripts/globals/jobpoints') 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, 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, true)) dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, ele, true, 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) 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