import type { Iwt2BossId } from './bosses' import type { Iwt2PlayerClassId } from './classes' export type Iwt2InfusionAbilityId = | 'healer-sanctuary' | 'healer-guardian-pulse' | 'healer-emergency-miracle' | 'paladin-unbreakable' | 'paladin-bulwark-field' | 'paladin-intercept' | 'ranger-decoy-companion' | 'ranger-pinning-volley' | 'ranger-hunters-mark' | 'mage-panic-blink' | 'mage-arcane-barrier' | 'mage-overcharge' | 'rogue-shadow-step' | 'rogue-vanish' | 'rogue-expose-weakness' | 'warrior-bladestorm' | 'warrior-iron-rush' | 'warrior-blood-rally' export type Iwt2InfusionAbilityTrigger = | 'active' | 'danger' | 'passive' | 'postMechanic' | 'survival' export type Iwt2InfusionAbilityEffectKey = | 'arcaneBarrier' | 'bladestorm' | 'bloodRally' | 'bulwarkField' | 'decoyCompanion' | 'emergencyMiracle' | 'exposeWeakness' | 'guardianPulse' | 'huntersMark' | 'intercept' | 'ironRush' | 'overcharge' | 'panicBlink' | 'pinningVolley' | 'sanctuary' | 'shadowStep' | 'unbreakable' | 'vanish' export type Iwt2InfusionAbility = { id: Iwt2InfusionAbilityId classId: Iwt2PlayerClassId name: string icon: string linkedBossId: Iwt2BossId cooldownSeconds: number | null description: string trigger: Iwt2InfusionAbilityTrigger effectKey: Iwt2InfusionAbilityEffectKey slot: 6 reuseTags: string[] } export const IWT2_INFUSION_ABILITIES: Record = { 'healer-sanctuary': infusion('healer-sanctuary', 'healer', 'Sanctuary', 'S', 'rimebastion', 45, 'Place a safe zone that reduces hazard damage for party members inside it.', 'active', 'sanctuary', ['healer', 'hazard-counter', 'zone']), 'healer-guardian-pulse': infusion('healer-guardian-pulse', 'healer', 'Guardian Pulse', 'G', 'khezu', 40, 'Shield the party after a major boss telegraph resolves.', 'postMechanic', 'guardianPulse', ['healer', 'shield', 'telegraph-counter']), 'healer-emergency-miracle': infusion('healer-emergency-miracle', 'healer', 'Emergency Miracle', 'M', 'hollowcrown-revenant', 75, 'Auto-cast a large heal on the lowest-health ally at danger threshold.', 'survival', 'emergencyMiracle', ['healer', 'survival', 'auto-save']), 'paladin-unbreakable': infusion('paladin-unbreakable', 'paladin', 'Unbreakable', 'U', 'bulldrome', null, 'Become immune to stuns and knockdowns.', 'passive', 'unbreakable', ['tank', 'control-immunity']), 'paladin-bulwark-field': infusion('paladin-bulwark-field', 'paladin', 'Bulwark Field', 'B', 'barroth', 35, 'Nearby party members take reduced damage.', 'active', 'bulwarkField', ['tank', 'aura', 'damage-reduction']), 'paladin-intercept': infusion('paladin-intercept', 'paladin', 'Intercept', 'I', 'obsidian-ram-golem', 30, 'Dash to an endangered party member and absorb the next hit.', 'danger', 'intercept', ['tank', 'dash', 'protection']), 'ranger-decoy-companion': infusion('ranger-decoy-companion', 'ranger', 'Decoy Companion', 'D', 'great-jaggi', 60, 'Summon a pet that holds boss attention for 8 seconds.', 'active', 'decoyCompanion', ['ranged', 'summon', 'aggro-decoy']), 'ranger-pinning-volley': infusion('ranger-pinning-volley', 'ranger', 'Pinning Volley', 'P', 'crystal-bat-matriarch', 35, 'Fire a periodic shot that briefly slows the boss.', 'active', 'pinningVolley', ['ranged', 'slow', 'projectile']), 'ranger-hunters-mark': infusion('ranger-hunters-mark', 'ranger', "Hunter's Mark", 'H', 'cinderback-ricochet', 45, 'Mark a boss so ranged hits deal increased damage briefly.', 'active', 'huntersMark', ['ranged', 'debuff', 'damage-window']), 'mage-panic-blink': infusion('mage-panic-blink', 'mage', 'Panic Blink', 'B', 'tobi-kadachi', 45, 'Teleport across the arena when danger scoring says the mage is trapped.', 'danger', 'panicBlink', ['caster', 'teleport', 'escape']), 'mage-arcane-barrier': infusion('mage-arcane-barrier', 'mage', 'Arcane Barrier', 'A', 'rimebastion', 60, 'Gain a shield before a lethal hit.', 'survival', 'arcaneBarrier', ['caster', 'shield', 'survival']), 'mage-overcharge': infusion('mage-overcharge', 'mage', 'Overcharge', 'O', 'stormcoil-wyrm', 40, 'Gain faster casts after avoiding a major mechanic.', 'postMechanic', 'overcharge', ['caster', 'haste', 'telegraph-reward']), 'rogue-shadow-step': infusion('rogue-shadow-step', 'rogue', 'Shadow Step', 'S', 'ember-mantis-duelist', 30, 'Teleport to any party member, then gain 30% damage for 8 seconds.', 'active', 'shadowStep', ['melee', 'teleport', 'burst']), 'rogue-vanish': infusion('rogue-vanish', 'rogue', 'Vanish', 'V', 'hollowcrown-revenant', 45, 'Drop boss focus and evade the next hit.', 'survival', 'vanish', ['melee', 'evade', 'survival']), 'rogue-expose-weakness': infusion('rogue-expose-weakness', 'rogue', 'Expose Weakness', 'E', 'rathian', 35, 'Flanking attacks increase party damage briefly.', 'active', 'exposeWeakness', ['melee', 'debuff', 'flank']), 'warrior-bladestorm': infusion('warrior-bladestorm', 'warrior', 'Bladestorm', 'B', 'bulldrome', 30, 'Spin for 5 seconds, damaging nearby enemies and taking 50% less damage.', 'active', 'bladestorm', ['melee', 'aoe', 'damage-reduction']), 'warrior-iron-rush': infusion('warrior-iron-rush', 'warrior', 'Iron Rush', 'I', 'obsidian-ram-golem', 35, 'Charge through the boss with brief damage reduction.', 'active', 'ironRush', ['melee', 'charge', 'damage-reduction']), 'warrior-blood-rally': infusion('warrior-blood-rally', 'warrior', 'Blood Rally', 'R', 'venom-orchid-hydra', 50, 'Gain damage when party health is low.', 'survival', 'bloodRally', ['melee', 'survival', 'damage-window']), } export function iwt2InfusionAbilitiesForClass(classId: Iwt2PlayerClassId): Iwt2InfusionAbility[] { return Object.values(IWT2_INFUSION_ABILITIES).filter((ability) => ability.classId === classId) } export function asIwt2InfusionAbilityId(value: unknown): Iwt2InfusionAbilityId | null { return typeof value === 'string' && value in IWT2_INFUSION_ABILITIES ? value as Iwt2InfusionAbilityId : null } function infusion( id: Iwt2InfusionAbilityId, classId: Iwt2PlayerClassId, name: string, icon: string, linkedBossId: Iwt2BossId, cooldownSeconds: number | null, description: string, trigger: Iwt2InfusionAbilityTrigger, effectKey: Iwt2InfusionAbilityEffectKey, reuseTags: string[], ): Iwt2InfusionAbility { return { classId, cooldownSeconds, description, effectKey, icon, id, linkedBossId, name, reuseTags, slot: 6, trigger, } }