import { WOW335_TALENT_NODES } from "./wow335Talents.generated"; export const WOW335_SHAMAN_ELEMENTAL_FOCUS_TALENT_ID = "talent-574"; export const WOW335_SHAMAN_ELEMENTAL_FOCUS_AURA_TAG = "wow335-shaman-elemental-focus-clearcasting"; export const WOW335_SHAMAN_ELEMENTAL_FOCUS_DURATION_MS = 15_000; const ELEMENTAL_FOCUS_SOURCE = WOW335_TALENT_NODES.find((node) => ( node.id === WOW335_SHAMAN_ELEMENTAL_FOCUS_TALENT_ID )); export interface Wow335ShamanElementalFocusProfile { readonly procChancePercent: number; readonly costReductionPercent: number; readonly charges: 2; readonly durationMs: number; } /** Reads the proc chance and discount from the generated local talent tooltip. */ export function wow335ShamanElementalFocusProfileForRank( rank: number, ): Wow335ShamanElementalFocusProfile | null { const safeRank = Math.max(0, Math.min(2, Math.trunc(Number.isFinite(rank) ? rank : 0))); const description = safeRank > 0 ? ELEMENTAL_FOCUS_SOURCE?.rankDescriptions[safeRank - 1] : undefined; const match = description?.match(/you have a (\d+(?:\.\d+)?)% chance.*?next two .*? by (\d+(?:\.\d+)?)%/i); if (!match) return null; const procChancePercent = Number(match[1]); const costReductionPercent = Number(match[2]); if (!Number.isFinite(procChancePercent) || !Number.isFinite(costReductionPercent)) return null; return { procChancePercent, costReductionPercent, charges: 2, // The local triggered Clearcasting effect is 15 seconds (SpellDuration row 8). durationMs: WOW335_SHAMAN_ELEMENTAL_FOCUS_DURATION_MS, }; } export function wow335ShamanElementalFocusShouldProc( profile: Wow335ShamanElementalFocusProfile | null, school: string, critical: boolean, periodic: boolean, roll: number, ): boolean { return profile !== null && critical && !periodic && ["fire", "frost", "nature"].includes(school.toLowerCase()) && Number.isFinite(roll) && roll >= 0 && roll < profile.procChancePercent / 100; }