diff --git a/scripts/actions/mobskills/arrogance_incarnate.lua b/scripts/actions/mobskills/arrogance_incarnate.lua index 8ca8b598189..69751e82a14 100644 --- a/scripts/actions/mobskills/arrogance_incarnate.lua +++ b/scripts/actions/mobskills/arrogance_incarnate.lua @@ -23,8 +23,8 @@ 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.calculateNullification(target, xi.element.NONE, 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, 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 c1582326562..b7268d74f1d 100644 --- a/scripts/actions/spells/black/meteor.lua +++ b/scripts/actions/spells/black/meteor.lua @@ -38,8 +38,8 @@ 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.calculateNullification(target, xi.element.NONE, true, false)) + 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, 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 c43e4227c17..72bdfbf501e 100644 --- a/scripts/actions/weaponskills/atonement.lua +++ b/scripts/actions/weaponskills/atonement.lua @@ -74,8 +74,8 @@ 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.calculateNullification(target, xi.element.NONE, 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, 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 9513c6a7f1b..9924bbbd741 100644 --- a/scripts/actions/weaponskills/spirits_within.lua +++ b/scripts/actions/weaponskills/spirits_within.lua @@ -49,8 +49,8 @@ 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.calculateNullification(target, xi.element.NONE, 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, 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 f549b83ef7c..8cc0517a82f 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.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.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.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 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/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/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/combat/skillchain.lua b/scripts/combat/skillchain.lua index 9fff31ff41a..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 @@ -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..d6c87662c47 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.calculateNullification(target, element, true, 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, 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)) - 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..08942759b64 100644 --- a/scripts/globals/additional_effects.lua +++ b/scripts/globals/additional_effects.lua @@ -84,16 +84,22 @@ 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.calculateNullification(defender, element, true, false)) - -- Todo: make sure day/weather/affinity bonuses tie in right here - damage = finalMagicNonSpellAdjustments(attacker, defender, element, damage) - - --[[ - 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) + 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(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) + + 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/bluemagic.lua b/scripts/globals/bluemagic.lua index a57d6914df1..83b53151a97 100644 --- a/scripts/globals/bluemagic.lua +++ b/scripts/globals/bluemagic.lua @@ -443,8 +443,8 @@ 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.calculateNullification(target, spell:getElement(), true, false) ~= 1 or + xi.spells.damage.calculateAbsorption(target, spell:getElement(), false, true, false, 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) @@ -549,8 +549,8 @@ 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 nullify = xi.spells.damage.calculateNullification(target, spellElement, false, true) + local absorb = xi.spells.damage.calculateAbsorption(target, spellElement, false, true, 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) @@ -629,8 +629,8 @@ 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 nullify = xi.spells.damage.calculateNullification(target, spell:getElement(), true, false) + local absorb = xi.spells.damage.calculateAbsorption(target, spell:getElement(), false, true, false, 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 f192f400bbc..4cdb337b88c 100644 --- a/scripts/globals/job_utils/corsair.lua +++ b/scripts/globals/job_utils/corsair.lua @@ -627,8 +627,8 @@ 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 elementalNullification = xi.spells.damage.calculateNullification(target, element, false, false) + local elementalAbsorption = xi.spells.damage.calculateAbsorption(target, element, false, false, true, 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 bf626057051..94ab601d130 100644 --- a/scripts/globals/job_utils/dragoon.lua +++ b/scripts/globals/job_utils/dragoon.lua @@ -701,8 +701,8 @@ 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 nullify = xi.spells.damage.calculateNullification(target, element, true, true) + local absorb = xi.spells.damage.calculateAbsorption(target, element, false, true, false, 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 2903900953b..db76e5391b0 100644 --- a/scripts/globals/job_utils/rune_fencer.lua +++ b/scripts/globals/job_utils/rune_fencer.lua @@ -523,8 +523,8 @@ 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.nullify = xi.spells.damage.calculateNullification(target, element, true, false) + multipliers.absorb = xi.spells.damage.calculateAbsorption(target, element, false, true, false, 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 04b7cb659fa..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, 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) diff --git a/scripts/globals/mobs.lua b/scripts/globals/mobs.lua index b77a8885d00..c7fa07fd574 100644 --- a/scripts/globals/mobs.lua +++ b/scripts/globals/mobs.lua @@ -553,11 +553,24 @@ 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.calculateNullification(target, ae.ele, true, false) + power = power * xi.spells.damage.calculateAbsorption(target, ae.ele, false, true, false, 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) + 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/globals/mobskills.lua b/scripts/globals/mobskills.lua index c1060baaf59..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 @@ -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 ---------------------------------- @@ -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. @@ -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? @@ -1757,8 +1757,8 @@ 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 absorbDamage = xi.spells.damage.calculateAbsorption(target, element, true) + 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 local magicDamageAdjustment = 1 diff --git a/scripts/globals/spells/absorb_spell.lua b/scripts/globals/spells/absorb_spell.lua index a5247fb1ce4..bf56e5020e7 100644 --- a/scripts/globals/spells/absorb_spell.lua +++ b/scripts/globals/spells/absorb_spell.lua @@ -103,8 +103,8 @@ 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.calculateNullification(target, xi.element.DARK, true, false) ~= 1 + xi.spells.damage.calculateAbsorption(target, xi.element.DARK, false, true, false, false) ~= 1 or + xi.spells.damage.calculateNullification(target, xi.element.DARK, false, true, false, false) ~= 1 then spell:setMsg(xi.msg.basic.MAGIC_RESIST) return finalDamage @@ -218,8 +218,8 @@ 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.calculateNullification(target, xi.element.DARK, true, false) ~= 1 + xi.spells.damage.calculateAbsorption(target, xi.element.DARK, false, true, false, false) ~= 1 or + 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 4698c56d7e4..ebf8df9806c 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,20 +924,36 @@ 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, 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 - isMagic and + isMagical and math.randomInt(1, 100) <= target:getMod(xi.mod.NULL_MAGICAL_DAMAGE) then 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 @@ -935,9 +962,9 @@ xi.spells.damage.calculateNullification = function(target, element, isMagic, isB 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 @@ -1066,14 +1093,14 @@ 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 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..44590432a39 100644 --- a/scripts/globals/weaponskills.lua +++ b/scripts/globals/weaponskills.lua @@ -251,8 +251,8 @@ 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.calculateNullification(target, wsParams.ele, true, false)) + 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, false, true, false, false)) end if magicdmg > 0 then -- handle nonzero damage if previous function does not absorb or nullify @@ -890,8 +890,8 @@ 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.calculateNullification(target, wsParams.ele, true, false) + dmg = dmg * xi.spells.damage.calculateAbsorption(target, wsParams.ele, false, true, false, 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/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 3b3f40b542b..9aecfefea24 100644 --- a/scripts/items/bloody_bolt.lua +++ b/scripts/items/bloody_bolt.lua @@ -6,22 +6,16 @@ ---@type TItem 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 +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 local pTable = { - chance = 100, -- Seems to always proc barring massive resistance - basePower = power, - attackType = xi.attackType.PHYSICAL, - physicalElement = xi.damageType.PIERCING, + isRanged = true, + basePower = 60 + utils.clamp(dStat, -3, 16) + utils.clamp(math.floor((dStat - 16) / 2), 0, 16), + attackType = xi.attackType.MAGICAL, magicalElement = xi.element.DARK, canResist = true, lowestResist = 0.5, @@ -31,7 +25,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 24aa4807975..c3c8fdcf9d4 100644 --- a/scripts/items/dainslaif.lua +++ b/scripts/items/dainslaif.lua @@ -6,20 +6,13 @@ ---@type TItem 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 +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target: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, @@ -31,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 new file mode 100644 index 00000000000..141451532fe --- /dev/null +++ b/scripts/items/darkling_bolt.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- ID: 19196 +-- Item: Darkling Bolt +-- Additional effect: Darkness damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target: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.MAGICAL, + magicalElement = xi.element.DARK, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..66c6bfaa451 --- /dev/null +++ b/scripts/items/earth_arrow.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- ID: 18699 +-- Item: Earth Arrow +-- Additional effect: Earth damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target: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.MAGICAL, + magicalElement = xi.element.EARTH, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..3ca7bf0206e --- /dev/null +++ b/scripts/items/fire_arrow.lua @@ -0,0 +1,23 @@ +----------------------------------- +-- ID: 17322 +-- Item: Fire Arrow +-- Additional effect: Fire damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + -- Unconfirmed power. + local pTable = + { + isRanged = true, + basePower = math.random(7, 10), + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.FIRE, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..b2617eef711 --- /dev/null +++ b/scripts/items/grand_knights_arrow.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- ID: 17327 +-- Item: Grand Knights Arrow +-- Additional effect: Fire damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target: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.MAGICAL, + magicalElement = xi.element.FIRE, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..aa4dccc3fc3 --- /dev/null +++ b/scripts/items/holy_bolt.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- ID: 18153 +-- Item: Holy Bolt +-- Additional effect: Light damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.MND) - target: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.MAGICAL, + magicalElement = xi.element.LIGHT, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..12337e285a0 --- /dev/null +++ b/scripts/items/ice_arrow.lua @@ -0,0 +1,23 @@ +----------------------------------- +-- ID: 17323 +-- Item: Ice Arrow +-- Additional effect: Ice damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + -- Unconfirmed power. + local pTable = + { + isRanged = true, + basePower = math.random(7, 10), + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.ICE, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..a8cd7f44a21 --- /dev/null +++ b/scripts/items/lightning_arrow.lua @@ -0,0 +1,23 @@ +----------------------------------- +-- ID: 17324 +-- Item: Lightning Arrow +-- Additional effect: Lightning damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + -- Unconfirmed power. + local pTable = + { + isRanged = true, + basePower = math.random(7, 10), + attackType = xi.attackType.MAGICAL, + magicalElement = xi.element.THUNDER, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..19e0e4d816a --- /dev/null +++ b/scripts/items/righteous_bolt.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- ID: 21315 +-- Item: Righteous Bolt +-- Additional effect: Light damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.MND) - target: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.MAGICAL, + magicalElement = xi.element.LIGHT, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..2bf3373c20a --- /dev/null +++ b/scripts/items/scouts_bolt.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- ID: 22287 +-- Item: Scouts Bolt +-- Additional effect: Light damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.MND) - target: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.MAGICAL, + magicalElement = xi.element.LIGHT, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..89796e3c53b --- /dev/null +++ b/scripts/items/temple_knights_arrow.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- ID: 18738 +-- Item: Temple Knights Arrow +-- Additional effect: Fire damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target: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.MAGICAL, + magicalElement = xi.element.FIRE, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..d6102fad7d5 --- /dev/null +++ b/scripts/items/water_arrow.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- ID: 18698 +-- Item: Water Arrow +-- Additional effect: Water damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target: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.MAGICAL, + magicalElement = xi.element.WATER, + canResist = true, + } + + 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 new file mode 100644 index 00000000000..0b551137643 --- /dev/null +++ b/scripts/items/wind_arrow.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- ID: 18700 +-- Item: Wind Arrow +-- Additional effect: Wind damage +----------------------------------- +---@type TItem +local itemObject = {} + +itemObject.onItemAdditionalEffect = function(actor, target, baseAttackDamage, item) + local dStat = actor:getStat(xi.mod.INT) - target: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.MAGICAL, + magicalElement = xi.element.WIND, + canResist = true, + } + + return xi.combat.action.executeAddEffectDamage(actor, target, pTable) +end + +return itemObject diff --git a/scripts/zones/Arrapago_Reef/mobs/Velionis.lua b/scripts/zones/Arrapago_Reef/mobs/Velionis.lua index 32e7bda776a..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, 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 9dc4b6e3b7a..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, true, 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 8af10dc9134..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, 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 719758f315c..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, 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 c007d501976..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, 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 f44e15b6bd2..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, 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 afe2e592378..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.FIRE, true, 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 c909ea4dc51..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, true, 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 9510d437f9d..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, 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 dda03c37237..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.ICE, true, 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 0868c6ca2b9..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, true)) - dmg = math.floor(dmg * xi.spells.damage.calculateNullification(target, xi.element.THUNDER, true, 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/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