UNPKG

mh3-data

Version:

Monster Hunter Tri data for monsters, quests, and weapons

67 lines 2.98 kB
import { Weapons } from '../../model'; import { WeaponClass } from '../../model/weapons'; import { applyDefenseMultiplier, calculateElementalDamage, getRawMultiplier, getSharpnessRawMultiplier, getWeaponClassMultiplier, validateWeaponSharpness } from './damage-util'; /** * @returns Attack properties for a {@link HammerTypes.HammerAttack} */ function getHammerAttack(attackName) { const hammerAttacks = Weapons.getWeaponDamageProperties(WeaponClass.HAMMER) .attackModes[0]; const result = hammerAttacks.attacks.find(atk => atk.name === attackName); if (!result) { throw new Error(`${attackName} is not a valid ${WeaponClass.HAMMER} attack`); } return result; } function validateHammer(weapon) { if (weapon.type !== WeaponClass.HAMMER) { throw new Error(`${weapon.name} is not a ${WeaponClass.HAMMER}`); } } /** * Calculates damage for a {@link HammerTypes.Hammer} */ export function calculateHammerDamage(weaponArgs, monsterMultipliers, damageBuffArgs) { const { weaponId, attackName, sharpness } = weaponArgs; const { hitzoneValues, levelMultipliers } = monsterMultipliers; const { rawArgs, elementArgs, weaponClassArgs } = damageBuffArgs; const hammer = Weapons.getWeapon(Weapons.WeaponClass.HAMMER, weaponId); validateHammer(hammer); validateWeaponSharpness(hammer, sharpness); const { classModifier } = Weapons.getWeaponDamageProperties(WeaponClass.HAMMER); const attack = getHammerAttack(attackName); const sharpnessMultiplier = getSharpnessRawMultiplier(sharpness); const rawMultiplier = getRawMultiplier(rawArgs); const attackBuffMultiplier = getWeaponClassMultiplier(weaponClassArgs); const attackWithBuffs = hammer.attack + attackBuffMultiplier * classModifier; return attack.hits.map(hit => { const isCut = Weapons.isCutHit(hit); const hitzoneMultiplier = isCut ? hitzoneValues.cut : hitzoneValues.impact; const rawDamage = (attackWithBuffs * hit.power * rawMultiplier * sharpnessMultiplier * hitzoneMultiplier * 1) / // Hammer does not have a [SpecialVar], but this is here for consistency classModifier; const elementalDamage = calculateElementalDamage({ weapon: hammer, sharpness, hitzoneValues, elementArgs }); // Decimal is dropped const totalDamage = applyDefenseMultiplier(rawDamage + elementalDamage, levelMultipliers.defense); // KO is always rounded down const koDamage = !isCut ? Math.floor(hit.ko * sharpnessMultiplier) : undefined; return { rawDamage: applyDefenseMultiplier(rawDamage, levelMultipliers.defense), elementalDamage: applyDefenseMultiplier(elementalDamage, levelMultipliers.defense), totalDamage, koDamage }; }); } //# sourceMappingURL=hammer-damage.js.map