forked from phenom/healer-man
28 lines
1.2 KiB
TypeScript
28 lines
1.2 KiB
TypeScript
import { WOW335_TALENT_NODES } from "./wow335Talents.generated";
|
|
|
|
export const WOW335_WARRIOR_DAMAGE_SHIELD_TALENT_ID = "talent-2246";
|
|
export const WOW335_WARRIOR_DAMAGE_SHIELD_ABILITY_ID = "wow335-warrior-damage-shield";
|
|
|
|
const DAMAGE_SHIELD_SOURCE = WOW335_TALENT_NODES.find((node) => (
|
|
node.id === WOW335_WARRIOR_DAMAGE_SHIELD_TALENT_ID
|
|
));
|
|
|
|
/**
|
|
* Returns the generated-rank block-value reflection for a landed direct melee
|
|
* hit. The generated tooltip is the authoritative source for both the 10/20%
|
|
* values and the direct-melee trigger.
|
|
*/
|
|
export function wow335WarriorDamageShieldReflectDamage(
|
|
blockValue: number,
|
|
rank: number,
|
|
directMeleeHit: boolean,
|
|
): number {
|
|
const safeRank = Math.min(2, Math.max(0, Math.trunc(Number.isFinite(rank) ? rank : 0)));
|
|
if (safeRank === 0 || !directMeleeHit || !Number.isFinite(blockValue) || blockValue <= 0) return 0;
|
|
|
|
const rankDescription = DAMAGE_SHIELD_SOURCE?.rankDescriptions[safeRank - 1];
|
|
const percentage = Number(rankDescription?.match(/damage equal to (\d+)% of your block value/i)?.[1]);
|
|
if (!Number.isFinite(percentage) || percentage <= 0) return 0;
|
|
return Math.max(0, Math.round(blockValue * percentage / 100));
|
|
}
|