diff --git a/ui/raidboss/data/07-dt/raid/r11s.ts b/ui/raidboss/data/07-dt/raid/r11s.ts new file mode 100644 index 0000000000..15f624618d --- /dev/null +++ b/ui/raidboss/data/07-dt/raid/r11s.ts @@ -0,0 +1,900 @@ +import Conditions from '../../../../../resources/conditions'; +import { UnreachableCode } from '../../../../../resources/not_reached'; +import Outputs from '../../../../../resources/outputs'; +import { Responses } from '../../../../../resources/responses'; +import { DirectionOutputCardinal, Directions } from '../../../../../resources/util'; +import ZoneId from '../../../../../resources/zone_id'; +import { RaidbossData } from '../../../../../types/data'; +import { TriggerSet } from '../../../../../types/trigger'; + +type Phase = 'one' | 'arenaSplit' | 'ecliptic'; + +type WeaponInfo = { + delay: number; + duration: number; +}; + +export interface Data extends RaidbossData { + phase: Phase; + actorPositions: { [id: string]: { x: number; y: number; heading: number } }; + weapons: { + id: string; + type: 'stack' | 'healerGroups' | 'protean'; + dir: number; + actor: { x: number; y: number; heading: number }; + }[]; + voidStardust?: 'spread' | 'stack'; + assaultEvolvedCount: number; + weaponMechCount: number; + domDirectionCount: { + vertCount: number; + horizCount: number; + outerSafe: DirectionOutputCardinal[]; + }; + maelstromCount: number; + hasMeteor: boolean; + fireballCount: number; + hasAtomic: boolean; + heartbreakerCount: number; +} + +const center = { + x: 100, + y: 100, +}; + +const phaseMap: { [id: string]: Phase } = { + 'B43F': 'arenaSplit', // Flatliner + 'B452': 'ecliptic', // Ecliptic Stampede +}; + +const headMarkerData = { + // Vfx Path: target_ae_s5f + 'cometSpread': '008B', + // Vfx Path: com_share4a1 + 'partnerStack': '00A1', + // Vfx Path: com_share3t + 'fiveHitStack': '0131', + // Vfx Path: lockon8_t0w + 'meteor': '00F4', + 'fireBreath': '00F4', + // Vfx Path: share_laser_5sec_0t, targets The Tyrant + 'lineStack': '020D', + // Vfx Path: m0017trg_a0c + 'atomicImpact': '001E', + 'meteorTether': '0164', + 'closeTether': '0039', + 'farTether': '00F9', +} as const; + +const ultimateTrophyWeaponsMap: (WeaponInfo | undefined)[] = [ + undefined, + undefined, + { + delay: 0, + duration: 8.7, + }, + { + delay: 4.7, + duration: 5.1, + }, + { + delay: 5.8, + duration: 5.1, + }, + { + delay: 6.9, + duration: 5.1, + }, + { + delay: 8, + duration: 5.1, + }, + { + delay: 9.1, + duration: 5.1, + }, +]; + +const triggerSet: TriggerSet = { + id: 'AacHeavyweightM3Savage', + zoneId: ZoneId.AacHeavyweightM3Savage, + timelineFile: 'r11s.txt', + initData: () => ({ + phase: 'one', + actorPositions: {}, + weapons: [], + weaponMechCount: 0, + domDirectionCount: { + horizCount: 0, + vertCount: 0, + outerSafe: ['dirN', 'dirE', 'dirS', 'dirW'], + }, + assaultEvolvedCount: 0, + maelstromCount: 0, + hasMeteor: false, + fireballCount: 0, + hasAtomic: false, + heartbreakerCount: 0, + }), + timelineTriggers: [], + triggers: [ + { + id: 'R11S Phase Tracker', + type: 'StartsUsing', + netRegex: { id: Object.keys(phaseMap), source: 'The Tyrant' }, + suppressSeconds: 1, + run: (data, matches) => { + const phase = phaseMap[matches.id]; + if (phase === undefined) + throw new UnreachableCode(); + + data.phase = phase; + }, + }, + { + id: 'R11S ActorSetPos Tracker', + type: 'ActorSetPos', + netRegex: { id: '4[0-9A-Fa-f]{7}', capture: true }, + run: (data, matches) => + data.actorPositions[matches.id] = { + x: parseFloat(matches.x), + y: parseFloat(matches.y), + heading: parseFloat(matches.heading), + }, + }, + { + id: 'R11S Crown of Arcadia', + type: 'StartsUsing', + netRegex: { id: 'B406', source: 'The Tyrant', capture: false }, + response: Responses.bigAoe(), + }, + { + id: 'R11S Raw Steel Trophy Axe', + type: 'StartsUsing', + netRegex: { id: 'B422', capture: false }, + infoText: (_data, _matches, output) => { + return output.text!({ + party: output.partySpread!(), + tank: output.sharedTankStack!(), + }); + }, + outputStrings: { + partySpread: { + en: 'Party Spread', + }, + sharedTankStack: { + en: 'Tanks Stack', + de: 'Tanks Sammeln', + fr: 'Package Tanks', + ja: 'タンク頭割り', + cn: '坦克分摊', + ko: '탱끼리 모이기', + tc: '坦克分攤', + }, + text: { + en: '${party}/${tank}', + }, + }, + }, + { + id: 'R11S Raw Steel Trophy Scythe', + type: 'StartsUsing', + netRegex: { id: 'B423', capture: false }, + infoText: (_data, _matches, output) => { + return output.text!({ + party: output.partyStack!(), + tank: output.tankCleaves!(), + }); + }, + outputStrings: { + partyStack: { + en: 'Party Stack', + de: 'In der Gruppe sammeln', + fr: 'Package en groupe', + ja: 'あたまわり', + cn: '分摊', + ko: '쉐어', + tc: '分攤', + }, + tankCleaves: { + en: 'Tank Cleaves', + de: 'Tank Cleaves', + fr: 'Tank Cleaves', + ja: 'タンク前方攻撃', + cn: '坦克顺劈', + ko: '광역 탱버', + tc: '坦克順劈', + }, + text: { + en: '${party}/${tank}', + }, + }, + }, + // For logic reasons Ultimate has to be before normal Trophy Weapons + { + id: 'R11S Ultimate Trophy Weapons', + type: 'ActorControlExtra', + netRegex: { category: '0197', param1: ['11D1', '11D2', '11D3'], capture: true }, + condition: (data) => data.weaponMechCount > 1, + delaySeconds: (data) => { + return ultimateTrophyWeaponsMap[data.weaponMechCount]?.delay ?? 0; + }, + durationSeconds: (data) => { + return ultimateTrophyWeaponsMap[data.weaponMechCount]?.duration ?? 0; + }, + countdownSeconds: (data) => { + return ultimateTrophyWeaponsMap[data.weaponMechCount]?.duration ?? 0; + }, + infoText: (data, matches, output) => { + const mechanic = matches.param1 === '11D1' + ? 'healerGroups' + : (matches.param1 === '11D2' ? 'stack' : 'protean'); + if (data.weaponMechCount === 7) + return output.mechanicThenBait!({ mech: output[mechanic]!(), bait: output.bait!() }); + if (data.weaponMechCount > 3) + return output.mechanicThenMove!({ mech: output[mechanic]!(), move: output.move!() }); + return output[mechanic]!(); + }, + run: (data) => data.weaponMechCount++, + outputStrings: { + healerGroups: Outputs.healerGroups, + stack: Outputs.stackMiddle, + protean: Outputs.protean, + move: Outputs.moveAway, + bait: { + en: 'Bait Gust', + }, + mechanicThenMove: { + en: '${mech} => ${move}', + }, + mechanicThenBait: { + en: '${mech} => ${bait}', + }, + }, + }, + { + id: 'R11S Trophy Weapons', + type: 'ActorControlExtra', + netRegex: { category: '0197', param1: ['11D1', '11D2', '11D3'], capture: true }, + condition: (data) => data.weaponMechCount < 2, + delaySeconds: (data) => { + if (data.weaponMechCount === 0) + return 0.1; + if (data.weaponMechCount === 1) + return 10.6; + return 0.1; + }, + durationSeconds: (data) => { + if (data.weaponMechCount < 2) + return 20.9; + return 0; + }, + infoText: (data, matches, output) => { + const actor = data.actorPositions[matches.id]; + + if (actor === undefined) + return; + + data.weapons.push({ + id: matches.id, + type: matches.param1 === '11D1' + ? 'healerGroups' + : (matches.param1 === '11D2' ? 'stack' : 'protean'), + dir: Math.atan2(actor.x - center.x, actor.y - center.y), + actor: actor, + }); + // Have info for 1st or 2nd mech + if (data.weaponMechCount < 2 && data.weapons.length > 2) { + data.weaponMechCount++; + let candidates = data.weapons; + data.weapons = []; + + // First weapon is the one facing towards middle + const weapon1 = candidates.find((c) => + (Math.abs(c.dir - c.actor.heading) % Math.PI) < 0.1 + ); + if (weapon1 === undefined) + return; + candidates = candidates.filter((c) => c !== weapon1); + // remap dir to weapon1 + candidates.forEach((c) => { + c.dir = Math.atan2(c.actor.x - weapon1.actor.x, c.actor.y - weapon1.actor.y); + }); + // second weapon is facing first weapon + const weapon2 = candidates.find((c) => + (Math.abs(c.dir - c.actor.heading) % Math.PI) < 0.1 + ); + // third weapon is the last remaining one + const weapon3 = candidates.find((c) => c !== weapon2); + if (weapon2 === undefined || weapon3 === undefined) + return; + return output.text!({ + weapon1: output[weapon1.type]!(), + weapon2: output[weapon2.type]!(), + weapon3: output[weapon3.type]!(), + }); + } + }, + outputStrings: { + text: { + en: '${weapon1} => ${weapon2} => ${weapon3}', + }, + healerGroups: Outputs.healerGroups, + stack: Outputs.stackMiddle, + protean: Outputs.protean, + }, + }, + { + id: 'R11S Void Stardust', + type: 'StartsUsing', + netRegex: { id: 'B412', source: 'The Tyrant', capture: false }, + infoText: (_data, _matches, output) => output.baitPuddles!(), + outputStrings: { + baitPuddles: { + en: 'Bait 3x puddles', + de: 'Ködere Flächen x3', + fr: 'Déposez les flaques 3x', + cn: '诱导3次圈圈', + ko: '장판 유도 3x', + }, + }, + }, + { + id: 'R11S Comet Spread Collect', + type: 'HeadMarker', + netRegex: { id: headMarkerData['cometSpread'], capture: false }, + suppressSeconds: 1, + run: (data) => data.voidStardust = 'spread', + }, + { + id: 'R11S Comet Spread', + type: 'HeadMarker', + netRegex: { id: headMarkerData['cometSpread'], capture: true }, + condition: Conditions.targetIsYou(), + response: Responses.spread(), + }, + { + id: 'R11S Crushing Comet Collect', + type: 'StartsUsing', + netRegex: { id: 'B415', source: 'The Tyrant', capture: false }, + run: (data) => data.voidStardust = 'stack', + }, + { + id: 'R11S Crushing Comet', + type: 'StartsUsing', + netRegex: { id: 'B415', source: 'The Tyrant', capture: true }, + response: Responses.stackMarkerOn(), + }, + { + id: 'R11S Dance Of Domination Trophy', + // 2s cast, but B41F damage cast (0.5s) starts ~6s later. + // There are 12.9s from B7BB startsUsing to bigAoe B7EA Ability + type: 'StartsUsing', + netRegex: { id: 'B7BB', source: 'The Tyrant', capture: false }, + delaySeconds: 3.7, // 5s before AoEs start + durationSeconds: 5, + infoText: (_data, _matches, output) => output.text!(), + outputStrings: { + text: { + en: 'AoE x6 => Big AoE', + }, + }, + }, + { + id: 'R11S Void Stardust End', + // The second set of comets does not have a startsUsing cast + // Timing is on the last Assault Evolved + type: 'StartsUsing', + netRegex: { id: ['B418', 'B419', 'B41A'], source: 'The Tyrant', capture: true }, + condition: (data) => { + if (data.voidStardust === undefined) + return false; + data.assaultEvolvedCount++; + if (data.assaultEvolvedCount === 3) + return true; + return false; + }, + delaySeconds: (_data, matches) => parseFloat(matches.castTime), + suppressSeconds: 1, + infoText: (data, _matches, output) => { + if (data.voidStardust === 'spread') + return output.baitPuddlesThenStack!(); + if (data.voidStardust === 'stack') + return output.baitPuddlesThenSpread!(); + }, + outputStrings: { + baitPuddlesThenStack: { + en: 'Bait 3x Puddles => Stack', + }, + baitPuddlesThenSpread: { + en: 'Bait 3x Puddles => Spread', + }, + }, + }, + { + // Adapted from normal mode + id: 'R11S Dance Of Domination Trophy Safe Spots', + // B7BC Explosion + type: 'StartsUsingExtra', + netRegex: { id: 'B7BC', capture: true }, + preRun: (data, matches) => { + // Determine whether the AoE is orthogonal or diagonal + // Discard diagonal headings, then count orthogonals. + const headingDirNum = Directions.hdgTo8DirNum(parseFloat(matches.heading)); + if (headingDirNum % 2 !== 0) + return; + const isVert = headingDirNum % 4 === 0; + let dangerDir: DirectionOutputCardinal | undefined = undefined; + if (isVert) { + data.domDirectionCount.vertCount += 1; + if (parseFloat(matches.x) < center.x - 5) + dangerDir = 'dirW'; + else if (parseFloat(matches.x) > center.x + 5) + dangerDir = 'dirE'; + } else { + data.domDirectionCount.horizCount += 1; + if (parseFloat(matches.y) < center.y - 5) + dangerDir = 'dirN'; + else if (parseFloat(matches.y) > center.y + 5) + dangerDir = 'dirS'; + } + if (dangerDir !== undefined) + data.domDirectionCount.outerSafe = data.domDirectionCount.outerSafe.filter((dir) => + dir !== dangerDir + ); + }, + infoText: (data, _matches, output) => { + if (data.domDirectionCount.outerSafe.length !== 1) + return; + + const outerSafeDir = data.domDirectionCount.outerSafe[0]; + + if (outerSafeDir === undefined) + return; + + if (data.domDirectionCount.vertCount === 1) + return output.northSouth!({ dir: output[outerSafeDir]!() }); + else if (data.domDirectionCount.horizCount === 1) + return output.eastWest!({ dir: output[outerSafeDir]!() }); + }, + // clear the safe dirs array to prevent further outputs + run: (data) => { + if (data.domDirectionCount.outerSafe.length === 1) + data.domDirectionCount.outerSafe = []; + }, + outputStrings: { + northSouth: { + en: 'N/S Mid / ${dir} Outer + Partner Stacks', + }, + eastWest: { + en: 'E/W Mid / ${dir} Outer + Partner Stacks', + }, + ...Directions.outputStringsCardinalDir, + }, + }, + { + id: 'R11S Charybdistopia', + type: 'StartsUsing', + netRegex: { id: 'B425', source: 'The Tyrant', capture: false }, + response: Responses.hpTo1Aoe(), + }, + { + id: 'R11S Maelstrom Count', + type: 'AddedCombatant', + netRegex: { name: 'Maelstrom', capture: false }, + run: (data) => data.maelstromCount = data.maelstromCount + 1, + }, + { + id: 'R11S Maelstrom 3 Reminder', + type: 'AddedCombatant', + netRegex: { name: 'Maelstrom', capture: false }, + condition: (data) => data.maelstromCount === 3, + response: Responses.moveAway(), + }, + { + id: 'R11S Powerful Gust Reminder', + type: 'AddedCombatant', + netRegex: { name: 'Maelstrom', capture: false }, + condition: (data) => data.maelstromCount === 4, + infoText: (_data, _matches, output) => output.bait!(), + outputStrings: { + bait: { + en: 'Bait Gust', + }, + }, + }, + { + id: 'R11S One and Only', + type: 'StartsUsing', + netRegex: { id: 'B429', source: 'The Tyrant', capture: false }, + durationSeconds: 6, + response: Responses.bigAoe(), + }, + { + id: 'R11S Great Wall of Fire', + // Target is boss, Line AOE that will later explode + type: 'StartsUsing', + netRegex: { id: 'B42B', source: 'The Tyrant', capture: false }, + infoText: (_data, _matches, output) => output.sharedTankbuster!(), + outputStrings: { + sharedTankbuster: Outputs.sharedTankbuster, + }, + }, + { + id: 'R11S Fire and Fury', + type: 'StartsUsing', + netRegex: { id: 'B42F', source: 'The Tyrant', capture: false }, + response: Responses.goSides(), + }, + { + id: 'R11S Meteor', + type: 'HeadMarker', + netRegex: { id: headMarkerData['meteor'], capture: true }, + condition: (data, matches) => { + if (data.me === matches.target && data.phase === 'one') + return true; + return false; + }, + response: Responses.meteorOnYou(), + run: (data) => data.hasMeteor = true, + }, + { + id: 'R11S Fearsome Fireball', + type: 'HeadMarker', + netRegex: { id: headMarkerData['lineStack'], capture: false }, + condition: (data) => { + data.fireballCount = data.fireballCount + 1; + return !data.hasMeteor; + }, + delaySeconds: 0.1, // Delay for meteor headmarkers + alertText: (data, _matches, output) => { + if (data.fireballCount === 1) { + if (data.role === 'tank') + return output.wildChargeTank!(); + return output.wildCharge!(); + } + if (data.role === 'tank') + return output.tetherBusters!(); + return output.wildChargeMeteor!(); + }, + run: (data) => data.hasMeteor = false, + outputStrings: { + wildCharge: { + en: 'Wild Charge (behind tank)', + }, + wildChargeMeteor: { + en: 'Wild Charge (behind meteor)', + }, + wildChargeTank: { + en: 'Wild Charge (be in front)', + }, + tetherBusters: Outputs.tetherBusters, + }, + }, + { + id: 'R11S Meteor Cleanup', + // Player hit by Cosmic Kiss + type: 'Ability', + netRegex: { id: 'B435', source: 'Comet', capture: true }, + condition: Conditions.targetIsYou(), + run: (data) => data.hasMeteor = false, + }, + { + id: 'R11S Triple Tyrannhilation', + type: 'StartsUsing', + netRegex: { id: 'B43C', source: 'The Tyrant', capture: false }, + alertText: (_data, _matches, output) => output.losMeteor!(), + outputStrings: { + losMeteor: { + en: 'LoS behind 3x meteor', + }, + }, + }, + { + id: 'R11S Flatliner', + type: 'StartsUsing', + netRegex: { id: 'B43F', source: 'The Tyrant', capture: false }, + infoText: (_data, _matches, output) => output.flatliner!(), + outputStrings: { + flatliner: { + en: 'Short knockback to sides', + fr: 'Légère poussée vers les côtés', + cn: '向两侧短距离击退', + ko: '양 옆으로 짧은 넉백', + }, + }, + }, + { + id: 'R11S Explosion Towers', // Knockback towers + type: 'StartsUsing', + netRegex: { id: 'B444', source: 'The Tyrant', capture: false }, + durationSeconds: 10, + suppressSeconds: 1, + alertText: (_data, _matches, output) => output.knockbackTowers!(), + outputStrings: { + knockbackTowers: { + en: 'Get Knockback Towers', + fr: 'Prenez une tour (poussée)', + cn: '踩击退塔', + ko: '넉백탑 들어가기', + }, + }, + }, + { + id: 'R11S Fire Breath', + type: 'HeadMarker', + netRegex: { id: headMarkerData['fireBreath'], capture: true }, + condition: (data, matches) => { + if (data.me === matches.target && data.phase === 'arenaSplit') + return true; + return false; + }, + infoText: (_data, _matches, output) => output.fireBreath!(), + outputStrings: { + fireBreath: { + en: 'Fire Breath on YOU', + }, + }, + }, + { + id: 'R11S Massive Meteor', + type: 'HeadMarker', + netRegex: { id: headMarkerData['fiveHitStack'], capture: false }, + suppressSeconds: 1, + alertText: (_data, _matches, output) => output.stackFivex!(), + outputStrings: { + stackFivex: { + en: 'Stack 5x', + de: '5x Sammeln', + fr: '5x Packages', + ja: '頭割り5回', + cn: '5连分摊', + ko: '쉐어 5번', + tc: '5連分攤', + }, + }, + }, + { + id: 'R11S Arcadion Avalanche West Safe', + type: 'StartsUsing', + netRegex: { id: ['B44E', 'B450'], source: 'The Tyrant', capture: false }, + infoText: (_data, _matches, output) => output.westSafe!(), + outputStrings: { + westSafe: { + en: 'Tower Knockback to West', + fr: 'Prenez une tour (poussée vers l\'Ouest)', + cn: '被塔击飞到左侧平台', + ko: '탑 넉백 서쪽으로', + }, + }, + }, + { + id: 'R11S Arcadion Avalanche East Safe', + type: 'StartsUsing', + netRegex: { id: ['B44A', 'B44C'], source: 'The Tyrant', capture: false }, + infoText: (_data, _matches, output) => output.eastSafe!(), + outputStrings: { + eastSafe: { + en: 'Tower Knockback to East', + fr: 'Prenez une tour (poussée vers l\'Est)', + cn: '被塔击飞到右侧平台', + ko: '탑 넉백 동쪽으로', + }, + }, + }, + { + id: 'R11S Arcadion Avalanche Follow Up North Safe', + type: 'StartsUsing', + netRegex: { id: ['B44B', 'B451'], source: 'The Tyrant', capture: true }, + delaySeconds: (_data, matches) => parseFloat(matches.castTime) - 6, + infoText: (_data, _matches, output) => output.goNorth!(), + outputStrings: { + goNorth: Outputs.north, + }, + }, + { + id: 'R11S Arcadion Avalanche Follow Up South Safe', + type: 'StartsUsing', + netRegex: { id: ['B44D', 'B44F'], source: 'The Tyrant', capture: true }, + delaySeconds: (_data, matches) => parseFloat(matches.castTime) - 6, + infoText: (_data, _matches, output) => output.goSouth!(), + outputStrings: { + goSouth: Outputs.south, + }, + }, + { + id: 'R11S Atomic Impact Collect', + type: 'HeadMarker', + netRegex: { id: headMarkerData['atomicImpact'], capture: true }, + condition: Conditions.targetIsYou(), + run: (data) => data.hasAtomic = true, + }, + { + id: 'R11S Mammoth Meteor', + // Occurs same time as Atomic Impact headmarkers + type: 'StartsUsingExtra', + netRegex: { id: 'B453', capture: true }, + delaySeconds: 0.1, + suppressSeconds: 1, + infoText: (data, matches, output) => { + // Mammoth Meteor is always at two opposite intercardinals. + // Once we see one, we know where the safespots are + // without waiting on the second. + const meteorX = parseFloat(matches.x); + const meteorY = parseFloat(matches.y); + const meteorQuad = Directions.xyToIntercardDirOutput(meteorX, meteorY, center.x, center.y); + if (data.hasAtomic) { + if (meteorQuad === 'dirNE' || meteorQuad === 'dirSW') + return output.comboDir!({ dir1: output.nw!(), dir2: output.se!() }); + return output.comboDir!({ dir1: output.ne!(), dir2: output.sw!() }); + } + return output.getMiddle!(); + }, + outputStrings: { + nw: Outputs.dirNW, + ne: Outputs.dirNE, + sw: Outputs.dirSW, + se: Outputs.dirSE, + comboDir: { + en: 'Go ${dir1}/${dir2} => Bait Impacts, Avoid Corners', + }, + getMiddle: { + en: 'Proximity AoE; Get Middle => Bait Puddles', + }, + }, + }, + { + id: 'R11S Cosmic Kiss', // Meteor towers + type: 'StartsUsing', + netRegex: { id: 'B456', source: 'The Tyrant', capture: false }, + condition: (data) => { + if (data.hasAtomic) + return false; + return true; + }, + suppressSeconds: 1, + response: Responses.getTowers(), + }, + { + id: 'R11S Majestic Meteowrath Tethers', + type: 'Tether', + netRegex: { id: [headMarkerData.closeTether, headMarkerData.farTether], capture: true }, + condition: (data, matches) => { + if ( + data.me === matches.target && + data.phase === 'ecliptic' + ) + return true; + return false; + }, + suppressSeconds: 99, + infoText: (data, matches, output) => { + const actor = data.actorPositions[matches.sourceId]; + if (actor === undefined) + return; + + const dirNum = Directions.xyTo8DirNum(actor.x, actor.y, center.x, center.y); + if (dirNum === undefined) + return; + + type dirNumStretchMap = { + [key: number]: string; + }; + // TODO: Make config for options? + const stretchCW: dirNumStretchMap = { + 0: 'dirSW', + 2: 'dirNW', + 4: 'dirNE', + 6: 'dirSE', + }; + const stretchDir = stretchCW[dirNum]; + return output.stretchTetherDir!({ dir: output[stretchDir ?? '???']!() }); + }, + outputStrings: { + ...Directions.outputStrings8Dir, + stretchTetherDir: { + en: 'Stretch Tether ${dir}', + }, + }, + }, + { + id: 'R11S Two-way Fireball', + type: 'StartsUsing', + netRegex: { id: 'B7BD', source: 'The Tyrant', capture: false }, + alertText: (data, _matches, output) => { + if (data.hasAtomic) + return output.twoWayAtomic!(); + return output.twoWay!(); + }, + outputStrings: { + twoWay: { + en: 'East/West Line Stack', + }, + twoWayAtomic: { + en: 'Move; East/West Line Stack', + }, + }, + }, + { + id: 'R11S Four-way Fireball', + type: 'StartsUsing', + netRegex: { id: 'B45A', source: 'The Tyrant', capture: false }, + alertText: (data, _matches, output) => { + if (data.hasAtomic) + return output.fourWayAtomic!(); + return output.fourWay!(); + }, + outputStrings: { + fourWay: { + en: 'Intercardinal Line Stack', + }, + fourWayAtomic: { + en: 'Stay Corner, Intercardinal Line Stack', + }, + }, + }, + { + id: 'R11S Heartbreaker (Enrage Sequence)', + type: 'StartsUsing', + netRegex: { id: 'B45D', source: 'The Tyrant', capture: false }, + preRun: (data) => data.heartbreakerCount = data.heartbreakerCount + 1, + infoText: (data, _matches, output) => { + switch (data.heartbreakerCount) { + case 1: + return output.heartbreaker1!({ + tower: output.getTower!(), + stack: output.stack5x!(), + }); + case 2: + return output.heartbreaker2!({ + tower: output.getTower!(), + stack: output.stack6x!(), + }); + case 3: + return output.heartbreaker3!({ + tower: output.getTower!(), + stack: output.stack7x!(), + }); + } + }, + outputStrings: { + getTower: { + en: 'Get Tower', + de: 'Turm nehmen', + fr: 'Prenez la tour', + ja: '塔を踏む', + cn: '踩塔', + ko: '장판 들어가기', + tc: '踩塔', + }, + stack5x: { + en: 'Stack 5x', + de: '5x Sammeln', + fr: '5x Packages', + ja: '頭割り5回', + cn: '5连分摊', + ko: '쉐어 5번', + tc: '5連分攤', + }, + stack6x: { + en: 'Stack 6x', + }, + stack7x: { + en: 'Stack 7x', + }, + heartbreaker1: { + en: '${tower} => ${stack}', + }, + heartbreaker2: { + en: '${tower} => ${stack}', + }, + heartbreaker3: { + en: '${tower} => ${stack}', + }, + }, + }, + ], +}; + +export default triggerSet; diff --git a/ui/raidboss/data/07-dt/raid/r11s.txt b/ui/raidboss/data/07-dt/raid/r11s.txt new file mode 100644 index 0000000000..64fa889f7b --- /dev/null +++ b/ui/raidboss/data/07-dt/raid/r11s.txt @@ -0,0 +1,361 @@ +### AAC HEAVYWEIGHT M3 (SAVAGE) +# ZoneId: 1325 + +# -ii B405 B40E B40D B40A B41E B42D B429 B426 B437 B43B B445 B455 B439 B458 B461 B446 +# -it "The Tyrant" + +hideall "--Reset--" +hideall "--sync--" + +0.0 "--Reset--" ActorControl { command: "4000000F" } window 0,100000 jump 0 + +0.0 "--sync--" InCombat { inGameCombat: "1" } window 0,1 +10.6 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } window 10,10 +17.7 "Raw Steel Trophy (Scythe/Axe)" Ability { id: ["B423", "B422"], source: "The Tyrant" } +24.0 "Raw Steel" Ability { id: ["B40F", "B40B"], source: "The Tyrant" } # Only tanks +25.1 "Heavy Hitter/Impact" #Ability { id: ["B410","B40C"], source: "The Tyrant" } # Only non-tanks + +# Trophy Weapons 1 +33.1 "--middle--" Ability { id: "B404", source: "The Tyrant" } +38.4 "Trophy Weapons" Ability { id: "B416", source: "The Tyrant" } +48.2 "Assault Evolved" Ability { id: "B417", source: "The Tyrant" } +48.4 "--jump scythe--" Ability { id: "B544", source: "The Tyrant" } +50.3 "Sweeping Victory" Ability { id: "B41C", source: "The Tyrant" } +50.4 "Assault Evolved (scythe)" Ability { id: "B419", source: "The Tyrant" } +53.5 "--jump sword--" Ability { id: "B545", source: "The Tyrant" } +55.4 "Sharp Taste" Ability { id: "B41D", source: "The Tyrant" } +55.5 "Assault Evolved (sword)" Ability { id: "B41A", source: "The Tyrant" } +58.6 "--jump axe--" Ability { id: "B543", source: "The Tyrant" } +60.5 "Heavy Weight" Ability { id: "B41B", source: "The Tyrant" } +60.6 "Assault Evolved (axe)" Ability { id: "B418", source: "The Tyrant" } + +# Trophy Weapons 2 +67.7 "--middle--" Ability { id: "B404", source: "The Tyrant" } +72.7 "Trophy Weapons" Ability { id: "B416", source: "The Tyrant" } +79.8 "Void Stardust" Ability { id: "B412", source: "The Tyrant" } +83.9 "Cometite 1" #Ability { id: "B413", source: "The Tyrant" } +85.9 "Cometite 2" #Ability { id: "B413", source: "The Tyrant" } +87.9 "Cometite 3" #Ability { id: "B413", source: "The Tyrant" } +89.9 "Comet/Crushing Comet" Ability { id: ["B414", "B415"], source: "The Tyrant" } +92.7 "Assault Evolved" Ability { id: "B417", source: "The Tyrant" } +92.9 "--jump axe--" Ability { id: "B543", source: "The Tyrant" } +94.8 "Heavy Weight" Ability { id: "B41B", source: "The Tyrant" } +94.9 "Assault Evolved (axe)" Ability { id: "B418", source: "The Tyrant" } +98.0 "--jump sword--" Ability { id: "B545", source: "The Tyrant" } +99.9 "Sharp Taste" Ability { id: "B41D", source: "The Tyrant" } +100.0 "Assault Evolved (sword)" Ability { id: "B41A", source: "The Tyrant" } +103.1 "--jump scythe--" Ability { id: "B544", source: "The Tyrant" } +105.0 "Sweeping Victory" #Ability { id: "B41C", source: "The Tyrant" } +105.1 "Assault Evolved (scythe)" Ability { id: "B419", source: "The Tyrant" } +110.2 "Cometite 1" #Ability { id: "B413", source: "The Tyrant" } +112.2 "Cometite 2" #Ability { id: "B413", source: "The Tyrant" } +114.2 "Cometite 3" #Ability { id: "B413", source: "The Tyrant" } +116.2 "Crushing Comet/Comet" Ability { id: ["B415", "B414"], source: "The Tyrant" } +122.2 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } + +# Dance of Domination +130.4 "--middle--" Ability { id: "B404", source: "The Tyrant" } +134.6 "Dance of Domination Trophy" Ability { id: "B7BB", source: "The Tyrant" } +141.3 "Dance of Domination 1" Ability { id: "B41F", source: "The Tyrant" } +142.0 "Dance of Domination 2" #Ability { id: "B421", source: "The Tyrant" } +142.6 "Dance of Domination 3" #Ability { id: "B421", source: "The Tyrant" } +143.2 "Dance of Domination 4" #Ability { id: "B421", source: "The Tyrant" } +143.8 "Dance of Domination 5" #Ability { id: "B421", source: "The Tyrant" } +144.4 "Dance of Domination 6" #Ability { id: "B421", source: "The Tyrant" } +145.5 "Dance of Domination 7" Ability { id: "B7EA", source: "The Tyrant" } +150.5 "Eye of the Hurricane" Ability { id: "B424", source: "The Tyrant" } +150.7 "Explosion" Ability { id: "B420", source: "The Tyrant" } +151.1 "Explosion" Ability { id: "B7BC", source: "The Tyrant" } +156.4 "Raw Steel Trophy (Axe/Scythe)" Ability { id: ["B422", "B423"], source: "The Tyrant" } +163.8 "Raw Steel" Ability { id: ["B40F", "B40B"], source: "The Tyrant" } # Only tanks +163.8 "Impact/Heavy Hitter" #Ability { id: ["B40C","B410"], source: "The Tyrant" } # Only non-tanks + +# Ultimate Trophy Weapons +171.8 "--middle--" Ability { id: "B404", source: "The Tyrant" } +178.9 "Charybdistopia" Ability { id: "B425", source: "The Tyrant" } +184.6 "Ultimate Trophy Weapons" Ability { id: "B7ED", source: "The Tyrant" } +192.4 "Assault Apex" Ability { id: "B7EE", source: "The Tyrant" } +192.6 "--jump sword--" Ability { id: "B545", source: "The Tyrant" } +194.5 "Sharp Taste" Ability { id: "B41D", source: "The Tyrant" } +194.6 "Assault Evolved (sword)" Ability { id: "B41A", source: "The Tyrant" } +197.7 "--jump scythe)" Ability { id: "B544", source: "The Tyrant" } +199.6 "Sweeping Victory" Ability { id: "B41C", source: "The Tyrant" } +199.7 "Assault Evolved (scythe)" Ability { id: "B419", source: "The Tyrant" } +202.8 "--jump axe--" Ability { id: "B543", source: "The Tyrant" } +204.7 "Heavy Weight" Ability { id: "B41B", source: "The Tyrant" } +204.8 "Assault Evolved (axe)" Ability { id: "B418", source: "The Tyrant" } +207.9 "--jump sword--" Ability { id: "B545", source: "The Tyrant" } +209.8 "Sharp Taste" #Ability { id: "B41D", source: "The Tyrant" } +209.9 "Assault Evolved (sword)" Ability { id: "B41A", source: "The Tyrant" } +213.0 "--jump axe--" Ability { id: "B543", source: "The Tyrant" } +214.9 "Heavy Weight" Ability { id: "B41B", source: "The Tyrant" } +215.0 "Assault Evolved (axe)" Ability { id: "B418", source: "The Tyrant" } +218.1 "--jump scythe--" Ability { id: "B544", source: "The Tyrant" } +220.0 "Sweeping Victory" Ability { id: "B41C", source: "The Tyrant" } +220.1 "Assault Evolved (scythe)" Ability { id: "B419", source: "The Tyrant" } +221.2 "--middle--" Ability { id: "B404", source: "The Tyrant" } +226.3 "Powerful Gust" Ability { id: "B427", source: "The Tyrant" } +227.3 "Immortal Reign" Ability { id: "B428", source: "The Tyrant" } + +# Orbitel Omen 1 +240.4 "One and Only" Ability { id: "B42A", source: "The Tyrant" } +252.6 "Great Wall of Fire (castbar)" Ability { id: "B42B", source: "The Tyrant" } +252.8 "Great Wall of Fire 1" #Ability { id: "B42C", source: "The Tyrant" } +256.0 "Great Wall of Fire 2" #Ability { id: "B42C", source: "The Tyrant" } +256.6 "Explosion" Ability { id: "B42E", source: "The Tyrant" } +259.8 "Explosion" Ability { id: "B42E", source: "The Tyrant" } +266.1 "Orbital Omen (castbar)" Ability { id: "B432", source: "The Tyrant" } +274.8 "Fire and Fury (castbar)" Ability { id: "B42F", source: "The Tyrant" } +275.2 "Orbital Omen 1" #Ability { id: "B433", source: "The Tyrant" } +275.8 "Fire and Fury" #Ability { id: "B431", source: "The Tyrant" } +275.8 "Fire and Fury" #Ability { id: "B430", source: "The Tyrant" } +276.8 "Orbital Omen 2" #Ability { id: "B433", source: "The Tyrant" } +278.4 "Orbital Omen 3" #Ability { id: "B433", source: "The Tyrant" } +279.8 "Orbital Omen 4" #Ability { id: "B433", source: "The Tyrant" } + +# Meteorain +285.0 "--middle--" Ability { id: "B404", source: "The Tyrant" } +292.1 "Meteorain" Ability { id: "B434", source: "The Tyrant" } +300.1 "Fearsome Fireball" Ability { id: "B43A", source: "The Tyrant" } +301.3 "Cosmic Kiss" Ability { id: "B435", source: "Comet" } +309.3 "Foregone Fatality" Ability { id: "B436", source: "The Tyrant" } +310.2 "Fearsome Fireball" Ability { id: "B43A", source: "The Tyrant" } +311.4 "Cosmic Kiss" Ability { id: "B435", source: "Comet" } +314.0 "Explosion" Ability { id: "B438", source: "Comet" } +319.3 "Foregone Fatality" Ability { id: "B436", source: "The Tyrant" } +320.2 "Fearsome Fireball" Ability { id: "B43A", source: "The Tyrant" } +321.4 "Cosmic Kiss" Ability { id: "B435", source: "Comet" } +324.0 "Explosion" Ability { id: "B438", source: "Comet" } +329.3 "Foregone Fatality" Ability { id: "B436", source: "The Tyrant" } +330.2 "Fearsome Fireball" Ability { id: "B43A", source: "The Tyrant" } +334.0 "--sync--" Ability { id: "B43B", source: "The Tyrant" } +334.0 "Explosion" #Ability { id: "B438", source: "Comet" } +342.9 "Triple Tyrannhilation" Ability { id: "B43C", source: "The Tyrant" } +344.0 "Shockwave" #Ability { id: "B43D", source: "The Tyrant" } +344.4 "--sync--" #Ability { id: "B43E", source: "Comet" } +345.4 "Shockwave" #Ability { id: "B43D", source: "The Tyrant" } +345.8 "--sync--" #Ability { id: "B43E", source: "Comet" } +346.8 "Shockwave" #Ability { id: "B43D", source: "The Tyrant" } +347.2 "--sync--" #Ability { id: "B43E", source: "Comet" } +347.6 "--sync--" Ability { id: "B460", source: "The Tyrant" } + +# Arena Split +# NOTE: Need to move to safe spot at meteor 3 +359.8 "Flatliner (castbar)" Ability { id: "B43F", source: "The Tyrant" } window 360,10 +361.8 "Flatliner (split)" Ability { id: "BA90", source: "The Tyrant" } +375.9 "Majestic Meteor" Ability { id: "B440", source: "The Tyrant" } +389.0 "Explosion" Ability { id: "B444", source: "The Tyrant" } +397.0 "--meteor 1--" #StartsUsing { id: "B441", source: "The Tyrant" } +399.0 "--meteor 2--" #StartsUsing { id: "B441", source: "The Tyrant" } +400.0 "Majestic Meteor 1" #Ability { id: "B441", source: "The Tyrant" } +401.1 "--meteor 3--" #StartsUsing { id: "B441", source: "The Tyrant" } +402.0 "Majestic Meteor 2" #Ability { id: "B441", source: "The Tyrant" } +403.9 "Majestic Meteowrath x2" Ability { id: "B443", source: "The Tyrant" } +403.9 "Majestic Meteorain x2" #Ability { id: "B442", source: "The Tyrant" } +403.9 "Fire Breath x2" Ability { id: "B447", source: "The Tyrant" } +404.1 "Majestic Meteor 3" #Ability { id: "B441", source: "The Tyrant" } +421.1 "Explosion" Ability { id: "B444", source: "The Tyrant" } + +429.1 "--meteor 1--" #StartsUsing { id: "B441", source: "The Tyrant" } +431.1 "--meteor 2--" #StartsUsing { id: "B441", source: "The Tyrant" } +432.1 "Majestic Meteor 1" #Ability { id: "B441", source: "The Tyrant" } +433.1 "--meteor 3--" #StartsUsing { id: "B441", source: "The Tyrant" } +434.1 "Majestic Meteor 2" #Ability { id: "B441", source: "The Tyrant" } +436.0 "Majestic Meteowrath x2" Ability { id: "B443", source: "The Tyrant" } +436.0 "Majestic Meteorain x2" Ability { id: "B442", source: "The Tyrant" } +436.0 "Fire Breath x2" Ability { id: "B447", source: "The Tyrant" } +436.1 "Majestic Meteor 3" #Ability { id: "B441", source: "The Tyrant" } +445.3 "Massive Meteor (castbar)" Ability { id: "B448", source: "The Tyrant" } +446.4 "Massive Meteor x5" #Ability { id: "B449", source: "The Tyrant" } duration 5.6 +458.8 "Explosion" Ability { id: "B444", source: "The Tyrant" } +459.1 "Arcadion Avalanche (castbar)" Ability { id: ["B44A", "B44C", "B44E", "B450"], source: "The Tyrant" } +468.7 "Arcadion Avalanche" Ability { id: ["B44B", "B44D", "B44F", "B451"], source: "The Tyrant" } +479.4 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } + +# Orbital Omen 2 +# Normal arena +490.5 "Great Wall of Fire (castbar)" Ability { id: "B42B", source: "The Tyrant" } +490.7 "Great Wall of Fire 1" #Ability { id: "B42C", source: "The Tyrant" } +493.9 "Great Wall of Fire 2" #Ability { id: "B42C", source: "The Tyrant" } +494.5 "Explosion" Ability { id: "B42E", source: "The Tyrant" } +497.7 "Explosion" Ability { id: "B42E", source: "The Tyrant" } +504.0 "Orbital Omen (castbar)" Ability { id: "B432", source: "The Tyrant" } +512.7 "Fire and Fury (castbar)" Ability { id: "B42F", source: "The Tyrant" } +513.1 "Orbital Omen 1" #Ability { id: "B433", source: "The Tyrant" } +513.7 "Fire and Fury" Ability { id: "B431", source: "The Tyrant" } +513.7 "Fire and Fury" Ability { id: "B430", source: "The Tyrant" } +514.7 "Orbital Omen 2" #Ability { id: "B433", source: "The Tyrant" } +516.3 "Orbital Omen 3" #Ability { id: "B433", source: "The Tyrant" } +517.7 "Orbital Omen 4" #Ability { id: "B433", source: "The Tyrant" } +521.8 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } +527.0 "--middle--" Ability { id: "B404", source: "The Tyrant" } + +# Ecliptic Stampede +534.1 "Ecliptic Stampede" Ability { id: "B452", source: "The Tyrant" } +541.2 "Mammoth Meteor x2" #Ability { id: "B453", source: "The Tyrant" } +541.2 "Atomic Impact 1" Ability { id: "B454", source: "The Tyrant" } +544.2 "Atomic Impact 2" Ability { id: "B454", source: "The Tyrant" } +547.2 "Atomic Impact 3" Ability { id: "B454", source: "The Tyrant" } +550.2 "Atomic Impact 4" Ability { id: "B454", source: "The Tyrant" } +553.2 "Atomic Impact 5" Ability { id: "B454", source: "The Tyrant" } +556.2 "Atomic Impact 6" Ability { id: "B454", source: "The Tyrant" } +557.2 "Cosmic Kiss" Ability { id: "B456", source: "The Tyrant" } +557.2 "Weighty Impact" #Ability { id: "B457", source: "The Tyrant" } +566.8 "Majestic Meteowrath" Ability { id: "B459", source: "The Tyrant" } +570.2 "Two-way Fireball / Four-way Fireball (castbar)" Ability { id: ["B7BD", "B45A"], source: "The Tyrant" } +571.1 "Two-way Fireball / Four-way Fireball" Ability { id: ["B7BE", "B45B"], source: "The Tyrant" } +579.4 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } + +# Heartbreak (Enrage Sequence) +584.6 "--middle--" Ability { id: "B404", source: "The Tyrant" } +586.7 "--sync--" Ability { id: "B45C", source: "The Tyrant" } +593.3 "Heartbreak Kick" Ability { id: "B45D", source: "The Tyrant" } +594.4 "Heartbreak Kick 1" #Ability { id: "B45E", source: "The Tyrant" } +596.4 "Heartbreak Kick 2" #Ability { id: "B45E", source: "The Tyrant" } +598.4 "Heartbreak Kick 3" #Ability { id: "B45E", source: "The Tyrant" } +600.4 "Heartbreak Kick 4" #Ability { id: "B45E", source: "The Tyrant" } +602.4 "Heartbreak Kick 5" #Ability { id: "B45E", source: "The Tyrant" } +604.4 "--sync--" Ability { id: "B45F", source: "The Tyrant" } +612.4 "Heartbreak Kick" Ability { id: "B45D", source: "The Tyrant" } +613.5 "Heartbreak Kick 1" #Ability { id: "B45E", source: "The Tyrant" } +615.5 "Heartbreak Kick 2" #Ability { id: "B45E", source: "The Tyrant" } +617.5 "Heartbreak Kick 3" #Ability { id: "B45E", source: "The Tyrant" } +619.5 "Heartbreak Kick 4" #Ability { id: "B45E", source: "The Tyrant" } +621.5 "Heartbreak Kick 5" #Ability { id: "B45E", source: "The Tyrant" } +623.5 "Heartbreak Kick 6" #Ability { id: "B45E", source: "The Tyrant" } +625.5 "--sync--" Ability { id: "B45F", source: "The Tyrant" } +633.5 "Heartbreak Kick" Ability { id: "B45D", source: "The Tyrant" } +634.6 "Heartbreak Kick 1" #Ability { id: "B45E", source: "The Tyrant" } +636.6 "Heartbreak Kick 2" #Ability { id: "B45E", source: "The Tyrant" } +638.6 "Heartbreak Kick 3" #Ability { id: "B45E", source: "The Tyrant" } +640.6 "Heartbreak Kick 4" #Ability { id: "B45E", source: "The Tyrant" } +642.6 "Heartbreak Kick 5" #Ability { id: "B45E", source: "The Tyrant" } +644.6 "Heartbreak Kick 6" #Ability { id: "B45E", source: "The Tyrant" } +646.6 "Heartbreak Kick 7" #Ability { id: "B45E", source: "The Tyrant" } +648.6 "--sync--" Ability { id: "B45F", source: "The Tyrant" } +651.6 "--sync--" StartsUsing { id: "B462", source: "The Tyrant" } +659.6 "Heartbreaker (Enrage)" Ability { id: "B462", source: "The Tyrant" } +659.6 "--untargetable--" +659.8 "Heartbreaker (Enrage)" Ability { id: "B463", source: "The Tyrant" } + +# IGNORED ABILITIES +# B40A Raw Steel: VFX for Axe +# B40D Raw Steel: VFX for Scythe +# B40E Raw Steel: VFX for Scythe, comes after B40D +# B41E Dance of Domination: VFX +# B42D Great Wall of Fire: VFX +# B426 Charybdis: Knocbkack Damage from standing in tornado +# B429 One and Only: VFX +# B42B Great Wall of Fire: VFX +# B439 Fearsome Fireball: VFX +# B446 Fire Breath: VFX +# B437 Unmitigated Explosion: Meteors dropped too close to each other +# B445 Unmitigated Explosion: Missed tower during arena split +# B458 Unmitigated Explosion: Missed tower during Ecliptic Stampede +# B461 Tough Break: Missed Heartbreak soaks +# B405 --sync--: Auto-attack + +# ALL ENCOUNTER ABILITIES +# B404 --sync-- +# B405 --sync-- +# B406 Crown of Arcadia +# B40A Raw Steel +# B40B Raw Steel: Shared tankbuster +# B40C Impact +# B40D Raw Steel +# B40E Raw Steel +# B40F Raw Steel +# B410 Heavy Hitter +# B412 Void Stardust +# B413 Cometite +# B414 Comet +# B415 Crushing Comet +# B416 Trophy Weapons +# B417 Assault Evolved: Castbar +# B418 Assault Evolved: Damage from inside Trophy Axe chariot +# B419 Assault Evolved: Damage from outside of Trophy Scythe donut +# B41A Assault Evolved: Damage from Trophy Sword cross aoe +# B41B Heavy Weight: Damage from Trophy Axe group share +# B41C Sweeping Victory: Damage from Trophy Scythe protean +# B41D Sharp Taste: Damage from Trophy Sword healer group line aoe +# B41E Dance of Domination +# B41F Dance of Domination +# B420 Explosion +# B421 Dance of Domination +# B422 Raw Steel Trophy +# B423 Raw Steel Trophy +# B424 Eye of the Hurricane +# B425 Charybdistopia +# B426 Charybdis +# B427 Powerful Gust +# B428 Immortal Reign +# B429 One and Only +# B42A One and Only +# B42B Great Wall of Fire +# B42C Great Wall of Fire +# B42D Great Wall of Fire +# B42E Explosion +# B42F Fire and Fury +# B430 Fire and Fury +# B431 Fire and Fury +# B432 Orbital Omen +# B433 Orbital Omen +# B434 Meteorain +# B435 Cosmic Kiss +# B436 Foregone Fatality +# B437 Unmitigated Explosion +# B438 Explosion +# B439 Fearsome Fireball +# B43A Fearsome Fireball +# B43B Triple Tyrannhilation +# B43C Triple Tyrannhilation +# B43D Shockwave +# B43E --sync-- +# B43F Flatliner +# B440 Majestic Meteor +# B441 Majestic Meteor +# B442 Majestic Meteorain +# B443 Majestic Meteowrath +# B444 Explosion +# B445 Unmitigated Explosion +# B446 Fire Breath +# B447 Fire Breath +# B448 Massive Meteor +# B449 Massive Meteor +# B44A Arcadion Avalanche: VFX for NE Safe +# B44B Arcadion Avalanche: Damage for NE Safe +# B44C Arcadion Avalanche: VFX for SE Safe +# B44D Arcadion Avalanche: Damage for SE Safe +# B44E Arcadion Avalanche: VFX for SW Safe +# B44F Arcadion Avalanche: Damage for SW Safe +# B450 Arcadion Avalanche: VFX for NW Safe +# B451 Arcadion Avalanche: Damage for NW Safe +# B452 Ecliptic Stampede +# B453 Mammoth Meteor +# B454 Atomic Impact +# B455 Majestic Meteor +# B456 Cosmic Kiss +# B457 Weighty Impact +# B458 Unmitigated Explosion +# B459 Majestic Meteowrath +# B45A Four-way Fireball +# B45B Four-way Fireball +# B45C --sync-- +# B45D Heartbreak Kick +# B45E Heartbreak Kick +# B45F --sync-- +# B460 --sync-- +# B461 Tough Break +# B462 Heartbreaker +# B463 Heartbreaker +# B543 Assault Evolved: VFX Jumping to Trophy Axe +# B544 Assault Evolved: VFX Jumping to Trophy Scythe +# B545 Assault Evolved: VFX Jumping to Trophy Sword +# B7BD Two-way Fireball: VFX +# B7BE Two-way Fireball +# B7BB Dance of Domination Trophy +# B7BC Explosion +# B7EA Dance of Domination +# B7ED Ultimate Trophy Weapons +# B7EE Assault Apex +# BA90 Flatliner