forked from phenom/healer-man
67 lines
2.5 KiB
TypeScript
67 lines
2.5 KiB
TypeScript
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<AbilityDefinition, "source" | "classId" | "dbcSpellId">,
|
|
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,
|
|
};
|
|
}
|