import type { AbilityDefinition } from "./abilityCatalog"; import type { AuraDefinition, AuraModifier } from "./combatAuras"; /** RuneWaker's local payload for Scout/Priest passive 493010. */ export const ROM_SCOUT_PRIEST_DRUMS_OF_WAR = Object.freeze({ passiveSpellId: 493010, triggerSpellId: 490423, internalCooldownMs: 15_000, durationMs: 8_000, radius: 50, modifiers: [ { kind: "stat", stat: "physical-critical-strike", operation: "flat", value: 20 }, { kind: "stat", stat: "magical-critical-strike", operation: "flat", value: 20 }, ] satisfies readonly AuraModifier[], cooldownKey: "rom-scout-priest:drums-of-war", }); export const ROM_SCOUT_PRIEST_DRUMS_OF_WAR_AURA: AuraDefinition = Object.freeze({ id: "rom-scout-priest:drums-of-war", name: "Drums of War", description: "Increases physical and magical critical strike by 20 for 8 seconds.", disposition: "buff", durationMs: ROM_SCOUT_PRIEST_DRUMS_OF_WAR.durationMs, stackBehavior: "replace", uniqueBySource: true, modifiers: ROM_SCOUT_PRIEST_DRUMS_OF_WAR.modifiers, }); export interface RomScoutPriestDrumsOfWarProc { readonly internalCooldownMs: number; readonly durationMs: number; /** The RuneWaker tooltip says nearby party; 50 is from the CoA range field. */ readonly radius: number; readonly scope: "party"; readonly modifiers: readonly AuraModifier[]; } /** Select Drums of War's exact sourced payload after a landed Shot when its ICD is ready. */ export function romScoutPriestDrumsOfWarProc( characterClassId: string, secondaryClassId: string | null | undefined, ability: Pick, learnedPassiveSpellIds: readonly number[], landed: boolean, now: number, readyAt: number, attackKind: "melee" | "ranged" | "spell" = "ranged", ): RomScoutPriestDrumsOfWarProc | null { if (characterClassId !== "rom-scout" || secondaryClassId !== "rom-priest" || ability.source !== "runewaker" || ability.classId !== "rom-scout" || ability.dbcSpellId !== ROM_SCOUT_PRIEST_DRUMS_OF_WAR.triggerSpellId || attackKind !== "ranged" || !learnedPassiveSpellIds.includes(ROM_SCOUT_PRIEST_DRUMS_OF_WAR.passiveSpellId) || !landed || now < readyAt) return null; return { internalCooldownMs: ROM_SCOUT_PRIEST_DRUMS_OF_WAR.internalCooldownMs, durationMs: ROM_SCOUT_PRIEST_DRUMS_OF_WAR.durationMs, radius: ROM_SCOUT_PRIEST_DRUMS_OF_WAR.radius, scope: "party", modifiers: ROM_SCOUT_PRIEST_DRUMS_OF_WAR.modifiers, }; }