diff --git a/resources/util.ts b/resources/util.ts index 904cb1c86b..3f93d7201b 100644 --- a/resources/util.ts +++ b/resources/util.ts @@ -379,6 +379,7 @@ export const Directions = { outputStrings8Dir: outputStrings8Dir, outputStringsCardinalDir: outputStringsCardinalDir, outputStringsIntercardDir: outputStringsIntercardDir, + xyTo4DirIntercardNum: xyTo4DirIntercardNum, xyTo16DirNum: xyTo16DirNum, xyTo8DirNum: xyTo8DirNum, xyTo4DirNum: xyTo4DirNum, 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..b796362aca --- /dev/null +++ b/ui/raidboss/data/07-dt/raid/r11s.ts @@ -0,0 +1,1366 @@ +import Conditions from '../../../../../resources/conditions'; +import { UnreachableCode } from '../../../../../resources/not_reached'; +import Outputs from '../../../../../resources/outputs'; +import { callOverlayHandler } from '../../../../../resources/overlay_plugin_api'; +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'; + +// TODO: Include Meteorain lines for Arena split + +type Phase = 'one' | 'arenaSplit' | 'avalanche' | '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; + myPlatform?: 'east' | 'west'; + arenaSplitMeteorain?: 'westIn' | 'westOut'; + arenaSplitStretchDirNum?: number; + arenaSplitTethers: string[]; + arenaSplitCalledTether: boolean; + arenaSplitCalledBait: boolean; + fireballCount: number; + hasAtomic: boolean; + hadEclipticTether: boolean; + heartbreakerCount: number; +} + +const center = { + x: 100, + y: 100, +}; + +const phaseMap: { [id: string]: Phase } = { + 'B43F': 'arenaSplit', // Flatliner + 'B448': 'avalanche', // Massive Meteor stacks near end of arena split + '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, + arenaSplitTethers: [], + arenaSplitCalledTether: false, + arenaSplitCalledBait: false, + fireballCount: 0, + hasAtomic: false, + hadEclipticTether: 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 && mechanic !== 'stack') + 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 2 Early Calls', + type: 'ActorControlExtra', + netRegex: { category: '0197', param1: ['11D1', '11D2', '11D3'], capture: true }, + condition: (data, matches) => { + if (data.weaponMechCount !== 1) + return false; + + const actor = data.actorPositions[matches.id]; + + if (actor === undefined) + return false; + + const actorDir = Math.atan2(actor.x - center.x, actor.y - center.y); + + if ((Math.abs(actorDir - actor.heading) % Math.PI) < 0.1) + return true; + return false; + }, + suppressSeconds: 9999, + infoText: (data, matches, output) => { + const actor = data.actorPositions[matches.id]; + + if (actor === undefined) + return; + + const mechanic = matches.param1 === '11D1' + ? 'healerGroups' + : (matches.param1 === '11D2' ? 'stack' : 'protean'); + + const dir = Directions.xyTo8DirOutput(actor.x, actor.y, center.x, center.y); + + return output.text!({ + dir: output[dir]!(), + weapon: output[mechanic]!(), + }); + }, + outputStrings: { + ...Directions.outputStrings8Dir, + healerGroups: Outputs.healerGroups, + stack: Outputs.stackMiddle, + protean: Outputs.protean, + text: { + en: '${dir}: ${weapon} (1st later)', + }, + }, + }, + { + 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) => { + // Only setting this once + if (data.voidStardust === undefined) + 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) => { + // Only setting this once + if (data.voidStardust === undefined) + data.voidStardust = 'stack'; + }, + }, + { + id: 'R11S Crushing Comet', + type: 'StartsUsing', + netRegex: { id: 'B415', source: 'The Tyrant', capture: true }, + response: Responses.stackMarkerOn(), + }, + { + 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', + }, + }, + }, + { + 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', + }, + }, + }, + { + // 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 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 Arena Split Majestic Meteorain Collect', + // Two MapEffects happen simultaneously with tethers + // Coincides with light tethers connecting the Meteorain portals + // NOTE: Unsure location is which, but they are paired so only collect one + // Location Pattern 1: + // 17 => West Out? + // 19 => East In? + // Location Pattern 2: + // 16 => East Out? + // 18 => West In? + type: 'MapEffect', + netRegex: { flags: '00200010', location: ['16', '17'], capture: true }, + condition: (data) => data.phase === 'arenaSplit', + run: (data, matches) => { + // The second set of these can also be known from the first set as it will be oppposite + data.arenaSplitMeteorain = matches.location === '16' + ? 'westIn' + : 'westOut'; + }, + }, + { + id: 'R11S Arena Split Majestic Meteowrath Tether Collect', + // Tethers have 2 patterns + // Pattern 1 + // (69, 85) + // (131, 95) + // (131, 105) + // (69, 115) + // Pattern 2: + // (131, 85) + // (69, 95) + // (69, 105) + // (131, 115) + type: 'Tether', + netRegex: { id: [headMarkerData.closeTether, headMarkerData.farTether], capture: true }, + condition: (data) => { + // Assuming log line of same player doesn't happen before 4 players collected + if (data.phase === 'arenaSplit' && data.arenaSplitTethers.length < 4) + return true; + return false; + }, + preRun: (data, matches) => data.arenaSplitTethers.push(matches.target), + delaySeconds: 0.1, // Race condition with Tether lines and actor positions + run: (data, matches) => { + const actor = data.actorPositions[matches.sourceId]; + const hasTether = (data.me === matches.target); + if (actor === undefined) { + if (hasTether) + data.arenaSplitStretchDirNum = -1; // Return -1 so that we know we at least don't bait fire breath + return; + } + + if (hasTether) { + const portalDirNum = Directions.xyTo4DirIntercardNum( + actor.x, + actor.y, + center.x, + center.y, + ); + // While two could be inter inter cards, furthest stretches will be an intercard + const stretchDirNum = (portalDirNum + 2) % 4; + data.arenaSplitStretchDirNum = stretchDirNum; + } + }, + }, + { + id: 'R11S Arena Split Fire Breath Bait Later', + type: 'Tether', + netRegex: { id: [headMarkerData.closeTether, headMarkerData.farTether], capture: false }, + condition: (data) => { + if ( + data.phase === 'arenaSplit' && + data.arenaSplitTethers.length === 4 && + !data.arenaSplitCalledBait + ) { + if (!data.arenaSplitTethers.includes(data.me)) + return data.arenaSplitCalledBait = true; + } + return false; + }, + delaySeconds: 0.1, + infoText: (_data, _matches, output) => output.fireBreathLater!(), + outputStrings: { + fireBreathLater: { + en: 'Bait Fire Breath (later)', + }, + }, + }, + { + id: 'R11S Arena Split Majestic Meteowrath Tether Stretch Later', + type: 'Tether', + netRegex: { id: [headMarkerData.closeTether, headMarkerData.farTether], capture: true }, + condition: (data, matches) => { + if ( + data.phase === 'arenaSplit' && + data.me === matches.target + ) { + // Prevent spamming tethers + if (!data.arenaSplitCalledTether) + return data.arenaSplitCalledTether = true; + } + return false; + }, + delaySeconds: 0.1, // Race condition with Tether lines and actor positions + infoText: (data, matches, output) => { + const actor = data.actorPositions[matches.sourceId]; + if (actor === undefined) + return output.stretchTetherLater!(); + + const portalDirNum = Directions.xyTo4DirIntercardNum( + actor.x, + actor.y, + center.y, + center.x, + ); + // While these are inter inter cards, furthest stretch will be an intercard + const stretchDirNum = (portalDirNum + 2) % 4; + const dir = Directions.outputIntercardDir[stretchDirNum]; + return output.stretchTetherDirLater!({ dir: output[dir ?? '???']!() }); + }, + outputStrings: { + ...Directions.outputStringsIntercardDir, + stretchTetherDirLater: { + en: 'Tether on YOU: Stretch ${dir} (later)', + }, + stretchTetherLater: { + en: 'Tether on YOU: Stretch (later)', + }, + }, + }, + { + id: 'R11S Explosion Towers', // Knockback towers + // 10s castTime + type: 'StartsUsing', + netRegex: { id: 'B444', source: 'The Tyrant', capture: true }, + condition: (data) => data.phase === 'arenaSplit', + delaySeconds: (_data, matches) => parseFloat(matches.castTime) - 6, + durationSeconds: (_data, matches) => parseFloat(matches.castTime) - 4, + suppressSeconds: 1, + promise: async (data) => { + // Get player location for output + const combatants = (await callOverlayHandler({ + call: 'getCombatants', + names: [data.me], + })).combatants; + const me = combatants[0]; + if (combatants.length !== 1 || me === undefined) { + console.error( + `R11S Explosion Towers: Wrong combatants count ${combatants.length}`, + ); + return; + } + + data.myPlatform = me.PosX < 100 ? 'west' : 'east'; + }, + alertText: (data, _matches, output) => { + const myPlatform = data.myPlatform; + const dirNum = data.arenaSplitStretchDirNum; + if (dirNum === 0 || dirNum === 1) { + if (myPlatform === 'east') { + return output.tetherTowers!({ + mech1: output.northSouthSafe!(), + mech2: output.avoidFireBreath!(), + }); + } + return output.tetherTowers!({ + mech1: output.eastSafe!(), + mech2: output.avoidFireBreath!(), + }); + } + if (dirNum === 2 || dirNum === 3) { + if (myPlatform === 'west') { + return output.tetherTowers!({ + mech1: output.northSouthSafe!(), + mech2: output.avoidFireBreath!(), + }); + } + return output.tetherTowers!({ + mech1: output.westSafe!(), + mech2: output.avoidFireBreath!(), + }); + } + if (!data.arenaSplitTethers.includes(data.me)) + return output.fireBreathTowers!({ + mech1: output.northSouthSafe!(), + mech2: output.baitFireBreath!(), + }); + return output.knockbackTowers!(); + }, + outputStrings: { + knockbackTowers: { + en: 'Get Knockback Towers', + fr: 'Prenez une tour (poussée)', + cn: '踩击退塔', + ko: '넉백탑 들어가기', + }, + fireBreathTowers: { + en: '${mech1} => ${mech2}', + }, + tetherTowers: { + en: '${mech1} => ${mech2}', + }, + baitFireBreath: { + en: 'Bait Near', + }, + avoidFireBreath: Outputs.outOfHitbox, + northSouthSafe: { + en: 'Tower Knockback to Same Platform', + }, + eastSafe: { + en: 'Tower Knockback Across to East', + }, + westSafe: { + en: 'Tower Knockback Across to West', + }, + }, + }, + { + id: 'R11S Fire Breath and Bait Puddles', + type: 'HeadMarker', + netRegex: { id: headMarkerData['fireBreath'], capture: true }, + condition: (data, matches) => { + if (data.me === matches.target && data.phase === 'arenaSplit') + return true; + return false; + }, + durationSeconds: 6, + promise: async (data) => { + // Get player location for output + const combatants = (await callOverlayHandler({ + call: 'getCombatants', + names: [data.me], + })).combatants; + const me = combatants[0]; + if (combatants.length !== 1 || me === undefined) { + console.error( + `R11S Fire Breath and Bait Puddles: Wrong combatants count ${combatants.length}`, + ); + return; + } + + data.myPlatform = me.PosX < 100 ? 'west' : 'east'; + }, + alertText: (data, _matches, output) => { + const meteorain = data.arenaSplitMeteorain; + const isWestIn = meteorain === 'westIn'; + const myPlatform = data.myPlatform; + if (meteorain !== undefined && myPlatform !== undefined) { + if (myPlatform === 'west') { + const dir = isWestIn ? 'front' : 'back'; + return output.fireBreathMechsPlayerWest!({ + mech1: output.fireBreathOnYou!(), + mech2: output.bait3Puddles!(), + dir: output[dir]!(), + }); + } + const dir = isWestIn ? 'back' : 'front'; + return output.fireBreathMechsPlayerEast!({ + mech1: output.fireBreathOnYou!(), + mech2: output.bait3Puddles!(), + dir: output[dir]!(), + }); + } + return output.fireBreathMechs!({ + mech1: output.fireBreathOnYou!(), + mech2: output.bait3Puddles!(), + mech3: output.lines!(), + }); + }, + outputStrings: { + bait3Puddles: { + en: 'Bait Puddles x3', + de: 'Flächen ködern x3', + fr: 'Déposez les flaques x3', + cn: '引导圈圈 x3', + ko: '장판 유도 x3', + }, + back: { + en: 'Inner Back', + }, + front: { + en: 'Inner Front', + }, + lines: { + en: 'Avoid Lines', + de: 'Vermeide Linien', + fr: 'Évitez les lignes', + ja: '直線攻撃を避ける', + cn: '躲避直线 AoE', + ko: '직선장판 피하기', + tc: '躲避直線 AoE', + }, + fireBreathOnYou: { + en: 'Fire Breath on YOU', + }, + fireBreathMechsPlayerWest: { + en: '${mech1} + ${mech2} => ${dir}', + }, + fireBreathMechsPlayerEast: { + en: '${mech1} + ${mech2} => ${dir}', + }, + fireBreathMechs: { + en: '${mech1} + ${mech2} => ${mech3}', + }, + }, + }, + { + id: 'R11S Arena Split Majestic Meteowrath Tether Bait Puddles', + type: 'HeadMarker', + netRegex: { id: headMarkerData['fireBreath'], capture: false }, + condition: (data) => { + if (data.phase === 'arenaSplit' && data.arenaSplitTethers.includes(data.me)) + return true; + return false; + }, + durationSeconds: 6, + suppressSeconds: 1, + promise: async (data) => { + // Get player location for output + const combatants = (await callOverlayHandler({ + call: 'getCombatants', + names: [data.me], + })).combatants; + const me = combatants[0]; + if (combatants.length !== 1 || me === undefined) { + console.error( + `R11S Arena Split Majestic Meteowrath Tether Bait Puddles: Wrong combatants count ${combatants.length}`, + ); + return; + } + + data.myPlatform = me.PosX < 100 ? 'west' : 'east'; + }, + alertText: (data, _matches, output) => { + const meteorain = data.arenaSplitMeteorain; + const isWestIn = meteorain === 'westIn'; + const dirNum = data.arenaSplitStretchDirNum; + const myPlatform = data.myPlatform; + if (dirNum !== undefined && myPlatform !== undefined) { + const dir1 = Directions.outputIntercardDir[dirNum] ?? '???'; + if (myPlatform === 'west') { + const dir2 = isWestIn ? 'front' : 'back'; + return output.tetherMechsPlayerWest!({ + mech1: output.bait3Puddles!(), + mech2: output.stretchTetherDir!({ dir: output[dir1]!() }), + dir: output[dir2]!(), + }); + } + const dir2 = isWestIn ? 'back' : 'front'; + return output.tetherMechsPlayerEast!({ + mech1: output.bait3Puddles!(), + mech2: output.stretchTetherDir!({ dir: output[dir1]!() }), + dir: output[dir2]!(), + }); + } + return output.baitThenStretchMechs!({ + mech1: output.bait3Puddles!(), + mech2: output.stretchTether!(), + mech3: output.lines!(), + }); + }, + outputStrings: { + ...Directions.outputStringsIntercardDir, + bait3Puddles: { + en: 'Bait Puddles x3', + de: 'Flächen ködern x3', + fr: 'Déposez les flaques x3', + cn: '引导圈圈 x3', + ko: '장판 유도 x3', + }, + back: { + en: 'Outer Back', + }, + front: { + en: 'Outer Front', + }, + lines: { + en: 'Avoid Lines', + de: 'Vermeide Linien', + fr: 'Évitez les lignes', + ja: '直線攻撃を避ける', + cn: '躲避直线 AoE', + ko: '직선장판 피하기', + tc: '躲避直線 AoE', + }, + baitThenStretchMechs: { + en: '${mech1} => ${mech2} + ${mech3}', + }, + stretchTether: { + en: 'Stretch Tether', + de: 'Verbindung langziehen', + fr: 'Étirez les liens', + cn: '拉远连线', + ko: '선 늘이기', + tc: '拉遠連線', + }, + stretchTetherDir: { + en: 'Stretch ${dir}', + }, + tetherMechsPlayerEast: { + en: '${mech1} => ${mech2} + ${dir}', + }, + tetherMechsPlayerWest: { + en: '${mech1} => ${mech2} + ${dir}', + }, + }, + }, + { + id: 'R11S Majestic Meteowrath Tether and Fire Breath Reset', + // Reset tracker on B442 Majestic Meteowrath for next set of tethers + type: 'Ability', + netRegex: { id: 'B442', source: 'The Tyrant', capture: false }, + condition: (data) => data.phase === 'arenaSplit', + suppressSeconds: 9999, + run: (data) => { + delete data.arenaSplitMeteorain; + delete data.arenaSplitStretchDirNum; + data.arenaSplitTethers = []; + data.arenaSplitCalledTether = false; + data.arenaSplitCalledBait = false; + }, + }, + { + 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 Ecliptic Stampede Majestic Meteowrath Tether Collect', + 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: 9999, + run: (data) => data.hadEclipticTether = true, + }, + { + id: 'R11S Ecliptic Stampede 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: 9999, + infoText: (data, matches, output) => { + const actor = data.actorPositions[matches.sourceId]; + if (actor === undefined) + return; + + const portalDirNum = Directions.xyTo8DirNum(actor.x, actor.y, center.x, center.y); + // TODO: Make config for options? + const stretchDirNum = (portalDirNum + 5) % 8; + const stretchDir = Directions.output8Dir[stretchDirNum] ?? 'unknown'; + 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.hadEclipticTether) + return output.twoWayBehind!(); + return output.twoWayFront!(); + }, + outputStrings: { + twoWayFront: { + en: 'East/West Line Stack, Be in Front', + }, + twoWayBehind: { + en: 'Move; East/West Line Stack, Get behind', + }, + }, + }, + { + id: 'R11S Four-way Fireball', + type: 'StartsUsing', + netRegex: { id: 'B45A', source: 'The Tyrant', capture: false }, + alertText: (data, _matches, output) => { + if (data.hadEclipticTether) + return output.fourWayBehind!(); + return output.fourWayFront!(); + }, + outputStrings: { + fourWayFront: { + en: 'Intercardinal Line Stack, Be in Front', + }, + fourWayBehind: { + en: 'Intercardinal Line Stack, Get behind', + }, + }, + }, + { + 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}', + }, + }, + }, + ], + timelineReplace: [ + { + 'locale': 'en', + 'replaceText': { + 'Majestic Meteowrath/Majestic Meteorain/Fire Breath': 'Fire Breath + Meteor Lines', + }, + }, + ], +}; + +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..ecd5e2e279 --- /dev/null +++ b/ui/raidboss/data/07-dt/raid/r11s.txt @@ -0,0 +1,529 @@ +### AAC HEAVYWEIGHT M3 (SAVAGE) +# ZoneId: 1325 + +# -ii B405 B40E B40D B40A B41E B42D B429 B426 B437 B43B B445 B455 B439 B458 B461 B446 B431 +# -it "The Tyrant" + +hideall "--Reset--" +hideall "--sync--" + +0.0 "--Reset--" ActorControl { command: "4000000F" } window 0,100000 jump 0 + +# NOTE: A rough description of the layout for this timeline is as follows: +# Timeline reaches Raw Steel Branch point +# "r11s-raw-steel-axe-1": Raw Steel Axe First +# "r11s-axe-1-comet-1": Raw Steel Axe First + Comet First +# "r11s-axe-1-crush-1": Raw Steel Axe First + Crushing Comet First +# "r11s-axe-1-post-cometcrush": Label for Dance of Domination section within Raw Steel Axe First +# "r11s-charybdistopia": Jump to end of Raw Steel branch +# +# "r11s-raw-steel-scythe-1": Raw Steel Scythe +# "r11s-scythe-1-comet-1": Raw Steel Scythe First + Comet First +# "r11s-scythe-1-crush-1": Raw Steel Scythe First + Crushing Comet First +# "r11s-scythe-1-post-cometcrush": Label for Dance of Domination section within Raw Steel Scythe First +# "r11s-charybdistopia": Label for the end of Raw Steel branch +# Timeline continues + +0.0 "--sync--" InCombat { inGameCombat: "1" } window 0,1 +5.6 "--sync--" StartsUsing { id: "B406", source: "The Tyrant" } window 10,10 +10.6 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } + +# Branch for Raw Steel Axe or Raw Steel Scythe First +15.7 "--sync--" StartsUsing { id: "B422", source: "The Tyrant" } window 15.7,5 jump "r11s-raw-steel-axe-1" +15.7 "--sync--" StartsUsing { id: "B423", source: "The Tyrant" } window 15.7,5 jump "r11s-raw-steel-scythe-1" +17.7 "Raw Steel Trophy (Scythe/Axe)" #Ability { id: ["B423", "B422"], source: "The Tyrant" } +24.0 "Raw Steel (Axe)?" #Ability { id: "B40B", source: "The Tyrant" } # Only tanks +25.1 "Heavy Hitter (Scythe)/Impact x6 (Axe)" #Ability { id: ["B410", "B40C"], source: "The Tyrant" } # Only non-tanks +25.1 "Raw Steel x2 (Scythe)?" #Ability { id: "B40F", source: "The Tyrant" } # Only tanks +33.1 "--middle--" #Ability { id: "B404", source: "The Tyrant" } +38.4 "Trophy Weapons" #Ability { id: "B416", source: "The Tyrant" } + +# Raw Steel Axe First +115.7 label "r11s-raw-steel-axe-1" +117.7 "Raw Steel Trophy Axe" Ability { id: "B422", source: "The Tyrant" } +124.0 "Raw Steel (Axe)" Ability { id: "B40B", source: "The Tyrant" } # Only tanks +125.1 "Impact x6 (Axe)" Ability { id: "B40C", source: "The Tyrant" } # Only non-tanks +133.1 "--middle--" Ability { id: "B404", source: "The Tyrant" } +138.4 "Trophy Weapons" Ability { id: "B416", source: "The Tyrant" } +148.2 "Assault Evolved" Ability { id: "B417", source: "The Tyrant" } +148.4 "--jump 1--" Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +150.3 "Weapon 1" Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +150.4 "Assault Evolved 1" Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } +153.5 "--jump 2--" Ability { id: ["B545", "B543", "B544"], source: "The Tyrant" } +155.4 "Weapon 2" Ability { id: ["B41D", "B41B", "B41C"], source: "The Tyrant" } +155.5 "Assault Evolved 2" Ability { id: ["B41A", "B418", "B419"], source: "The Tyrant" } +158.6 "--jump 3--" Ability { id: ["B543", "B544", "B545"], source: "The Tyrant" } +160.5 "Weapon 3" Ability { id: ["B41B", "B41C", "B41D"], source: "The Tyrant" } +160.6 "Assault Evolved 3" Ability { id: ["B418", "B419", "B41A"], source: "The Tyrant" } + +# Trophy Weapons 2 (Axe) +167.7 "--middle--" Ability { id: "B404", source: "The Tyrant" } +172.7 "Trophy Weapons" Ability { id: "B416", source: "The Tyrant" } +179.8 "Void Stardust" Ability { id: "B412", source: "The Tyrant" } +183.9 "Cometite 1" #Ability { id: "B413", source: "The Tyrant" } + +# Branch for Raw Steel Axe + Comet or Crushing Comet First +184.9 "--sync--" StartsUsing { id: "B414", source: "The Tyrant" } jump "r11s-axe-1-comet-1" +184.9 "--sync--" StartsUsing { id: "B415", source: "The Tyrant" } jump "r11s-axe-1-crush-1" +185.9 "Cometite 2" #Ability { id: "B413", source: "The Tyrant" } +187.9 "Cometite 3" #Ability { id: "B413", source: "The Tyrant" } +189.9 "Comet/Crushing Comet?" #Ability { id: ["B414", "B415"], source: "The Tyrant" } +192.7 "Assault Evolved" #Ability { id: "B417", source: "The Tyrant" } +192.9 "--jump 1--" #Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +194.8 "Weapon 1" #Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +194.9 "Assault Evolved 1" #Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } + +# Raw Steel Axe First + Comet First +284.9 label "r11s-axe-1-comet-1" +289.9 "Comet" Ability { id: "B414", source: "The Tyrant" } +292.7 "Assault Evolved" Ability { id: "B417", source: "The Tyrant" } +292.9 "--jump 1--" Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +294.8 "Weapon 1" Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +294.9 "Assault Evolved 1" Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } +298.0 "--jump 2--" Ability { id: ["B545", "B543", "B544"], source: "The Tyrant" } +299.9 "Weapon 2" Ability { id: ["B41D", "B41B", "B41C"], source: "The Tyrant" } +300.0 "Assault Evolved 2" Ability { id: ["B41A", "B418", "B419"], source: "The Tyrant" } +303.1 "--jump scythe--" Ability { id: ["B543", "B544", "B545"], source: "The Tyrant" } +305.0 "Weapon 3" Ability { id: ["B41B", "B41C", "B41D"], source: "The Tyrant" } +305.1 "Assault Evolved 3" Ability { id: ["B418", "B419", "B41A"], source: "The Tyrant" } +310.2 "Cometite 1" #Ability { id: "B413", source: "The Tyrant" } +312.2 "Cometite 2" #Ability { id: "B413", source: "The Tyrant" } +314.2 "Cometite 3" #Ability { id: "B413", source: "The Tyrant" } +316.2 "Crushing Comet" Ability { id: "B415", source: "The Tyrant" } + +317.2 "--sync--" StartsUsing { id: "B406", source: "The Tyrant" } forcejump "r11s-axe-1-post-cometcrush" + + +# Raw Steel Axe First + Crushing Comet First +484.9 label "r11s-axe-1-crush-1" +489.9 "Crushing Comet" Ability { id: "B415", source: "The Tyrant" } +492.7 "Assault Evolved" Ability { id: "B417", source: "The Tyrant" } +492.9 "--jump 1--" Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +494.8 "Weapon 1" Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +494.9 "Assault Evolved 1" Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } +498.0 "--jump 2--" Ability { id: ["B545", "B543", "B544"], source: "The Tyrant" } +499.9 "Weapon 2" Ability { id: ["B41D", "B41B", "B41C"], source: "The Tyrant" } +500.0 "Assault Evolved 2" Ability { id: ["B41A", "B418", "B419"], source: "The Tyrant" } +503.1 "--jump scythe--" Ability { id: ["B543", "B544", "B545"], source: "The Tyrant" } +505.0 "Weapon 3" Ability { id: ["B41B", "B41C", "B41D"], source: "The Tyrant" } +505.1 "Assault Evolved 3" Ability { id: ["B418", "B419", "B41A"], source: "The Tyrant" } +510.2 "Cometite 1" #Ability { id: "B413", source: "The Tyrant" } +512.2 "Cometite 2" #Ability { id: "B413", source: "The Tyrant" } +514.2 "Cometite 3" #Ability { id: "B413", source: "The Tyrant" } +516.2 "Comet" Ability { id: "B414", source: "The Tyrant" } + +517.2 label "r11s-axe-1-post-cometcrush" +522.2 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } + +# Dance of Domination (Axe) +530.4 "--middle--" Ability { id: "B404", source: "The Tyrant" } +534.6 "Dance of Domination Trophy" Ability { id: "B7BB", source: "The Tyrant" } +541.3 "Dance of Domination 1" Ability { id: "B41F", source: "The Tyrant" } +542.0 "Dance of Domination 2" #Ability { id: "B421", source: "The Tyrant" } +542.6 "Dance of Domination 3" #Ability { id: "B421", source: "The Tyrant" } +543.2 "Dance of Domination 4" #Ability { id: "B421", source: "The Tyrant" } +543.8 "Dance of Domination 5" #Ability { id: "B421", source: "The Tyrant" } +544.4 "Dance of Domination 6" #Ability { id: "B421", source: "The Tyrant" } +545.5 "Dance of Domination 7" Ability { id: "B7EA", source: "The Tyrant" } +550.5 "Eye of the Hurricane" Ability { id: "B424", source: "The Tyrant" } +550.7 "Explosion" Ability { id: "B420", source: "The Tyrant" } +551.1 "Explosion" Ability { id: "B7BC", source: "The Tyrant" } +556.4 "Raw Steel Trophy Scythe" Ability { id: "B423", source: "The Tyrant" } +563.8 "Heavy Hitter (Scythe)" Ability { id: "B410", source: "The Tyrant" } # Only non-tanks +563.8 "Raw Steel x2 (Scythe)" #Ability { id: "B40F", source: "The Tyrant" } # Only tanks +571.8 "--middle--" Ability { id: "B404", source: "The Tyrant" } + +# Ultimate Trophy Weapons (Axe) +573.9 "--sync--" StartsUsing { id: "B425", source: "The Tyrant" } forcejump "r11s-charybdistopia" + + +# Raw Steel Scythe First +715.7 label "r11s-raw-steel-scythe-1" +717.7 "Raw Steel Trophy Scythe" Ability { id: "B423", source: "The Tyrant" } +725.1 "Heavy Hitter (Scythe)" Ability { id: "B410", source: "The Tyrant" } # Only non-tanks +725.1 "Raw Steel x2 (Scythe)" #Ability { id: "B40F", source: "The Tyrant" } # Only tanks +733.1 "--middle--" Ability { id: "B404", source: "The Tyrant" } + +# Trophy Weapons 1 (Scythe) +738.4 "Trophy Weapons" Ability { id: "B416", source: "The Tyrant" } +748.2 "Assault Evolved" Ability { id: "B417", source: "The Tyrant" } +748.4 "--jump 1--" Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +750.3 "Weapon 1" Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +750.4 "Assault Evolved 1" Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } +753.5 "--jump 2--" Ability { id: ["B545", "B543", "B544"], source: "The Tyrant" } +755.4 "Weapon 2" Ability { id: ["B41D", "B41B", "B41C"], source: "The Tyrant" } +755.5 "Assault Evolved 2" Ability { id: ["B41A", "B418", "B419"], source: "The Tyrant" } +758.6 "--jump 3--" Ability { id: ["B543", "B544", "B545"], source: "The Tyrant" } +760.5 "Weapon 3" Ability { id: ["B41B", "B41C", "B41D"], source: "The Tyrant" } +760.6 "Assault Evolved 3" Ability { id: ["B418", "B419", "B41A"], source: "The Tyrant" } + +# Trophy Weapons 2 (Scythe) +767.7 "--middle--" Ability { id: "B404", source: "The Tyrant" } +772.7 "Trophy Weapons" Ability { id: "B416", source: "The Tyrant" } +779.8 "Void Stardust" Ability { id: "B412", source: "The Tyrant" } +783.9 "Cometite 1" #Ability { id: "B413", source: "The Tyrant" } + +# Branch for Raw Steel Scythe + Comet or Crushing Comet First +784.9 "--sync--" StartsUsing { id: "B414", source: "The Tyrant" } jump "r11s-scythe-1-comet-1" +784.9 "--sync--" StartsUsing { id: "B415", source: "The Tyrant" } jump "r11s-scythe-1-crush-1" +785.9 "Cometite 2" #Ability { id: "B413", source: "The Tyrant" } +787.9 "Cometite 3" #Ability { id: "B413", source: "The Tyrant" } +789.9 "Comet/Crushing Comet?" #Ability { id: ["B414", "B415"], source: "The Tyrant" } +792.7 "Assault Evolved" #Ability { id: "B417", source: "The Tyrant" } +792.9 "--jump 1--" #Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +794.8 "Weapon 1" #Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +794.9 "Assault Evolved 1" #Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } + +# Raw Steel Scythe First + Comet First +884.9 label "r11s-scythe-1-comet-1" +889.9 "Comet" Ability { id: "B414", source: "The Tyrant" } +892.7 "Assault Evolved" Ability { id: "B417", source: "The Tyrant" } +892.9 "--jump 1--" Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +894.8 "Weapon 1" Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +894.9 "Assault Evolved 1" Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } +898.0 "--jump 2--" Ability { id: ["B545", "B543", "B544"], source: "The Tyrant" } +899.9 "Weapon 2" Ability { id: ["B41D", "B41B", "B41C"], source: "The Tyrant" } +900.0 "Assault Evolved 2" Ability { id: ["B41A", "B418", "B419"], source: "The Tyrant" } +903.1 "--jump scythe--" Ability { id: ["B543", "B544", "B545"], source: "The Tyrant" } +905.0 "Weapon 3" Ability { id: ["B41B", "B41C", "B41D"], source: "The Tyrant" } +905.1 "Assault Evolved 3" Ability { id: ["B418", "B419", "B41A"], source: "The Tyrant" } +910.2 "Cometite 1" #Ability { id: "B413", source: "The Tyrant" } +912.2 "Cometite 2" #Ability { id: "B413", source: "The Tyrant" } +914.2 "Cometite 3" #Ability { id: "B413", source: "The Tyrant" } +916.2 "Crushing Comet" Ability { id: "B415", source: "The Tyrant" } + +917.2 "--sync--" StartsUsing { id: "B406", source: "The Tyrant" } forcejump "r11s-scythe-1-post-cometcrush" + +# Raw Steel Scythe First + Crushing Comet First +1084.9 label "r11s-scythe-1-crush-1" +1089.9 "Crushing Comet" Ability { id: "B415", source: "The Tyrant" } +1092.7 "Assault Evolved" Ability { id: "B417", source: "The Tyrant" } +1092.9 "--jump 1--" Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +1094.8 "Weapon 1" Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +1094.9 "Assault Evolved 1" Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } +1098.0 "--jump 2--" Ability { id: ["B545", "B543", "B544"], source: "The Tyrant" } +1099.9 "Weapon 2" Ability { id: ["B41D", "B41B", "B41C"], source: "The Tyrant" } +1100.0 "Assault Evolved 2" Ability { id: ["B41A", "B418", "B419"], source: "The Tyrant" } +1103.1 "--jump scythe--" Ability { id: ["B543", "B544", "B545"], source: "The Tyrant" } +1105.0 "Weapon 3" Ability { id: ["B41B", "B41C", "B41D"], source: "The Tyrant" } +1105.1 "Assault Evolved 3" Ability { id: ["B418", "B419", "B41A"], source: "The Tyrant" } +1110.2 "Cometite 1" #Ability { id: "B413", source: "The Tyrant" } +1112.2 "Cometite 2" #Ability { id: "B413", source: "The Tyrant" } +1114.2 "Cometite 3" #Ability { id: "B413", source: "The Tyrant" } +1116.2 "Comet" Ability { id: "B414", source: "The Tyrant" } + +1117.2 label "r11s-scythe-1-post-cometcrush" +1122.2 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } + +# Dance of Domination (Scythe) +1130.4 "--middle--" Ability { id: "B404", source: "The Tyrant" } +1134.6 "Dance of Domination Trophy" Ability { id: "B7BB", source: "The Tyrant" } +1141.3 "Dance of Domination 1" Ability { id: "B41F", source: "The Tyrant" } +1142.0 "Dance of Domination 2" #Ability { id: "B421", source: "The Tyrant" } +1142.6 "Dance of Domination 3" #Ability { id: "B421", source: "The Tyrant" } +1143.2 "Dance of Domination 4" #Ability { id: "B421", source: "The Tyrant" } +1143.8 "Dance of Domination 5" #Ability { id: "B421", source: "The Tyrant" } +1144.4 "Dance of Domination 6" #Ability { id: "B421", source: "The Tyrant" } +1145.5 "Dance of Domination 7" Ability { id: "B7EA", source: "The Tyrant" } +1150.5 "Eye of the Hurricane" Ability { id: "B424", source: "The Tyrant" } +1150.7 "Explosion" Ability { id: "B420", source: "The Tyrant" } +1151.1 "Explosion" Ability { id: "B7BC", source: "The Tyrant" } +1156.4 "Raw Steel Trophy Axe" Ability { id: "B422", source: "The Tyrant" } +1162.7 "Raw Steel (Axe)" Ability { id: "B40B", source: "The Tyrant" } # Only tanks +1163.8 "Impact x6 (Axe)" Ability { id: "B40C", source: "The Tyrant" } # Only non-tanks +1171.8 "--middle--" Ability { id: "B404", source: "The Tyrant" } + +# Ultimate Trophy Weapons +1173.9 label "r11s-charybdistopia" +1178.9 "Charybdistopia" Ability { id: "B425", source: "The Tyrant" } +1184.6 "Ultimate Trophy Weapons" Ability { id: "B7ED", source: "The Tyrant" } +1192.4 "Assault Apex" Ability { id: "B7EE", source: "The Tyrant" } +1192.6 "--jump 1--" Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +1194.5 "Weapon 1" Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +1194.6 "Assault Evolved 1" Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } +1197.7 "--jump 2--" Ability { id: ["B544", "B545", "B543"], source: "The Tyrant" } +1199.6 "Weapon 2" Ability { id: ["B41C", "B41D", "B41B"], source: "The Tyrant" } +1199.7 "Assault Evolved 2" Ability { id: ["B419", "B41A", "B418"], source: "The Tyrant" } +1202.8 "--jump 3--" Ability { id: ["B545", "B543", "B544"], source: "The Tyrant" } +1204.7 "Weapon 3" Ability { id: ["B41D", "B41B", "B41C"], source: "The Tyrant" } +1204.8 "Assault Evolved 3" Ability { id: ["B41A", "B418", "B419"], source: "The Tyrant" } +1207.9 "--jump 4--" Ability { id: ["B545", "B543", "B544"], source: "The Tyrant" } +1209.8 "Weapon 4" Ability { id: ["B41D", "B41B", "B41C"], source: "The Tyrant" } +1209.9 "Assault Evolved 4" Ability { id: ["B41A", "B418", "B419"], source: "The Tyrant" } +1213.0 "--jump 5--" Ability { id: ["B543", "B544", "B545"], source: "The Tyrant" } +1214.9 "Weapon 5" Ability { id: ["B41B", "B41C", "B41D"], source: "The Tyrant" } +1215.0 "Assault Evolved 5" Ability { id: ["B418", "B419", "B41A"], source: "The Tyrant" } +1218.1 "--jump 6--" Ability { id: ["B543", "B544", "B545"], source: "The Tyrant" } +1220.0 "Weapon 6" Ability { id: ["B41B", "B41C", "B41D"], source: "The Tyrant" } +1220.1 "Assault Evolved 6" Ability { id: ["B418", "B419", "B41A"], source: "The Tyrant" } +1221.2 "--middle--" Ability { id: "B404", source: "The Tyrant" } +1226.3 "Powerful Gust" Ability { id: "B427", source: "The Tyrant" } +1227.3 "Immortal Reign" Ability { id: "B428", source: "The Tyrant" } + +# Orbitel Omen 1 +1240.4 "One and Only" Ability { id: "B42A", source: "The Tyrant" } +1252.6 "Great Wall of Fire (castbar)" Ability { id: "B42B", source: "The Tyrant" } +1252.8 "Great Wall of Fire 1" #Ability { id: "B42C", source: "The Tyrant" } +1256.0 "Great Wall of Fire 2" #Ability { id: "B42C", source: "The Tyrant" } +1256.6 "Explosion 1" Ability { id: "B42E", source: "The Tyrant" } +1259.8 "Explosion 2" Ability { id: "B42E", source: "The Tyrant" } +1266.1 "Orbital Omen (castbar)" Ability { id: "B432", source: "The Tyrant" } +1274.8 "Fire and Fury (castbar)" Ability { id: "B42F", source: "The Tyrant" } +1275.2 "Orbital Omen 1" #Ability { id: "B433", source: "The Tyrant" } +1275.8 "Fire and Fury" #Ability { id: "B430", source: "The Tyrant" } +1276.8 "Orbital Omen 2" #Ability { id: "B433", source: "The Tyrant" } +1278.4 "Orbital Omen 3" #Ability { id: "B433", source: "The Tyrant" } +1279.8 "Orbital Omen 4" #Ability { id: "B433", source: "The Tyrant" } + +# Meteorain +1285.0 "--middle--" Ability { id: "B404", source: "The Tyrant" } +1292.1 "Meteorain" Ability { id: "B434", source: "The Tyrant" } +1293.2 "--Meteor Markers 1--" HeadMarker { id: "00F4" } +1300.1 "Fearsome Fireball" Ability { id: "B43A", source: "The Tyrant" } +1301.3 "Cosmic Kiss" Ability { id: "B435", source: "Comet" } +1303.1 "--Meteor Markers 2--" HeadMarker { id: "00F4" } +1303.5 "--tethers--" +1309.3 "Foregone Fatality" Ability { id: "B436", source: "The Tyrant" } +1310.2 "Fearsome Fireball" Ability { id: "B43A", source: "The Tyrant" } +1311.4 "Cosmic Kiss" Ability { id: "B435", source: "Comet" } +1313.1 "--Meteor Markers 3--" HeadMarker { id: "00F4" } +1313.5 "--tethers--" +1314.0 "Explosion" Ability { id: "B438", source: "Comet" } +1319.3 "Foregone Fatality" Ability { id: "B436", source: "The Tyrant" } +1320.2 "Fearsome Fireball" Ability { id: "B43A", source: "The Tyrant" } +1321.4 "Cosmic Kiss" Ability { id: "B435", source: "Comet" } +1324.0 "Explosion" Ability { id: "B438", source: "Comet" } +1329.3 "Foregone Fatality" Ability { id: "B436", source: "The Tyrant" } +1330.2 "Fearsome Fireball" Ability { id: "B43A", source: "The Tyrant" } +1334.0 "--sync--" Ability { id: "B43B", source: "The Tyrant" } +1334.0 "Explosion" #Ability { id: "B438", source: "Comet" } +1342.9 "Triple Tyrannhilation" Ability { id: "B43C", source: "The Tyrant" } +1344.0 "Shockwave" #Ability { id: "B43D", source: "The Tyrant" } +1344.4 "--sync--" #Ability { id: "B43E", source: "Comet" } +1345.4 "Shockwave" #Ability { id: "B43D", source: "The Tyrant" } +1345.8 "--sync--" #Ability { id: "B43E", source: "Comet" } +1346.8 "Shockwave" #Ability { id: "B43D", source: "The Tyrant" } +1347.2 "--sync--" #Ability { id: "B43E", source: "Comet" } +1347.6 "--sync--" Ability { id: "B460", source: "The Tyrant" } + +# Arena Split +# NOTE: Need to move to safe spot at meteor 3 +1359.8 "--sync--" Ability { id: "B43F", source: "The Tyrant" } window 360,10 +1361.8 "Flatliner (split)" Ability { id: "BA90", source: "The Tyrant" } +1375.9 "Majestic Meteor" Ability { id: "B440", source: "The Tyrant" } +1377.0 "--tethers--" +1389.0 "Explosion" Ability { id: "B444", source: "The Tyrant" } +1394.9 "--Fire Breath Markers--" HeadMarker { id: '00F4' } +1397.0 "--meteor 1--" #StartsUsing { id: "B441", source: "The Tyrant" } +1399.0 "--meteor 2--" #StartsUsing { id: "B441", source: "The Tyrant" } +1400.0 "Majestic Meteor 1" #Ability { id: "B441", source: "The Tyrant" } +1401.1 "--meteor 3--" #StartsUsing { id: "B441", source: "The Tyrant" } +1402.0 "Majestic Meteor 2" #Ability { id: "B441", source: "The Tyrant" } +1403.9 "Majestic Meteowrath/Majestic Meteorain/Fire Breath" Ability { id: ["B442", "B443", "B447"], source: "The Tyrant" } +1404.1 "Majestic Meteor 3" #Ability { id: "B441", source: "The Tyrant" } + +1409.0 "--tethers--" +1421.1 "Explosion" Ability { id: "B444", source: "The Tyrant" } +1427.0 "--Fire Breath Markers--" HeadMarker { id: '00F4' } +1429.1 "--meteor 1--" #StartsUsing { id: "B441", source: "The Tyrant" } +1431.1 "--meteor 2--" #StartsUsing { id: "B441", source: "The Tyrant" } +1432.1 "Majestic Meteor 1" #Ability { id: "B441", source: "The Tyrant" } +1433.1 "--meteor 3--" #StartsUsing { id: "B441", source: "The Tyrant" } +1434.1 "Majestic Meteor 2" #Ability { id: "B441", source: "The Tyrant" } +1436.0 "Majestic Meteowrath/Majestic Meteorain/Fire Breath" Ability { id: ["B442", "B443", "B447"], source: "The Tyrant" } +1436.1 "Majestic Meteor 3" #Ability { id: "B441", source: "The Tyrant" } +1445.3 "Massive Meteor (castbar)" Ability { id: "B448", source: "The Tyrant" } +1446.4 "Massive Meteor x5" #Ability { id: "B449", source: "The Tyrant" } duration 5.6 +1458.8 "Explosion" Ability { id: "B444", source: "The Tyrant" } +1459.1 "Arcadion Avalanche (castbar)" Ability { id: ["B44A", "B44C", "B44E", "B450"], source: "The Tyrant" } +1468.7 "Arcadion Avalanche" Ability { id: ["B44B", "B44D", "B44F", "B451"], source: "The Tyrant" } +1479.4 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } + +# Orbital Omen 2 +# Normal arena +1490.5 "Great Wall of Fire (castbar)" Ability { id: "B42B", source: "The Tyrant" } +1490.7 "Great Wall of Fire 1" #Ability { id: "B42C", source: "The Tyrant" } +1493.9 "Great Wall of Fire 2" #Ability { id: "B42C", source: "The Tyrant" } +1494.5 "Explosion 1" Ability { id: "B42E", source: "The Tyrant" } +1497.7 "Explosion 2" Ability { id: "B42E", source: "The Tyrant" } +1504.0 "Orbital Omen (castbar)" Ability { id: "B432", source: "The Tyrant" } +1512.7 "Fire and Fury (castbar)" Ability { id: "B42F", source: "The Tyrant" } +1513.1 "Orbital Omen 1" #Ability { id: "B433", source: "The Tyrant" } +1513.7 "Fire and Fury" Ability { id: "B430", source: "The Tyrant" } +1514.7 "Orbital Omen 2" #Ability { id: "B433", source: "The Tyrant" } +1516.3 "Orbital Omen 3" #Ability { id: "B433", source: "The Tyrant" } +1517.7 "Orbital Omen 4" #Ability { id: "B433", source: "The Tyrant" } +1521.8 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } +1527.0 "--middle--" Ability { id: "B404", source: "The Tyrant" } + +# Ecliptic Stampede +1534.1 "Ecliptic Stampede" Ability { id: "B452", source: "The Tyrant" } +1541.2 "Mammoth Meteor x2" #Ability { id: "B453", source: "The Tyrant" } +1541.2 "Atomic Impact 1" Ability { id: "B454", source: "The Tyrant" } +1544.2 "Atomic Impact 2" Ability { id: "B454", source: "The Tyrant" } +1547.2 "Atomic Impact 3" Ability { id: "B454", source: "The Tyrant" } +1550.2 "Atomic Impact 4" Ability { id: "B454", source: "The Tyrant" } +1553.2 "Atomic Impact 5" Ability { id: "B454", source: "The Tyrant" } +1556.2 "Atomic Impact 6" Ability { id: "B454", source: "The Tyrant" } +1557.2 "Cosmic Kiss" Ability { id: "B456", source: "The Tyrant" } +1557.2 "Weighty Impact" #Ability { id: "B457", source: "The Tyrant" } +1559.7 "--tethers--" +1566.8 "Majestic Meteowrath x4" Ability { id: "B459", source: "The Tyrant" } +1570.2 "Two-way Fireball / Four-way Fireball (castbar)" Ability { id: ["B7BD", "B45A"], source: "The Tyrant" } +1571.1 "Two-way Fireball / Four-way Fireball" Ability { id: ["B7BE", "B45B"], source: "The Tyrant" } +1579.4 "Crown of Arcadia" Ability { id: "B406", source: "The Tyrant" } + +# Heartbreak (Enrage Sequence) +1584.6 "--middle--" Ability { id: "B404", source: "The Tyrant" } +1586.7 "--sync--" Ability { id: "B45C", source: "The Tyrant" } +1593.3 "Heartbreak Kick" Ability { id: "B45D", source: "The Tyrant" } +1594.4 "Heartbreak Kick 1" #Ability { id: "B45E", source: "The Tyrant" } +1596.4 "Heartbreak Kick 2" #Ability { id: "B45E", source: "The Tyrant" } +1598.4 "Heartbreak Kick 3" #Ability { id: "B45E", source: "The Tyrant" } +1600.4 "Heartbreak Kick 4" #Ability { id: "B45E", source: "The Tyrant" } +1602.4 "Heartbreak Kick 5" #Ability { id: "B45E", source: "The Tyrant" } +1604.4 "--sync--" Ability { id: "B45F", source: "The Tyrant" } +1612.4 "Heartbreak Kick" Ability { id: "B45D", source: "The Tyrant" } +1613.5 "Heartbreak Kick 1" #Ability { id: "B45E", source: "The Tyrant" } +1615.5 "Heartbreak Kick 2" #Ability { id: "B45E", source: "The Tyrant" } +1617.5 "Heartbreak Kick 3" #Ability { id: "B45E", source: "The Tyrant" } +1619.5 "Heartbreak Kick 4" #Ability { id: "B45E", source: "The Tyrant" } +1621.5 "Heartbreak Kick 5" #Ability { id: "B45E", source: "The Tyrant" } +1623.5 "Heartbreak Kick 6" #Ability { id: "B45E", source: "The Tyrant" } +1625.5 "--sync--" Ability { id: "B45F", source: "The Tyrant" } +1633.5 "Heartbreak Kick" Ability { id: "B45D", source: "The Tyrant" } +1634.6 "Heartbreak Kick 1" #Ability { id: "B45E", source: "The Tyrant" } +1636.6 "Heartbreak Kick 2" #Ability { id: "B45E", source: "The Tyrant" } +1638.6 "Heartbreak Kick 3" #Ability { id: "B45E", source: "The Tyrant" } +1640.6 "Heartbreak Kick 4" #Ability { id: "B45E", source: "The Tyrant" } +1642.6 "Heartbreak Kick 5" #Ability { id: "B45E", source: "The Tyrant" } +1644.6 "Heartbreak Kick 6" #Ability { id: "B45E", source: "The Tyrant" } +1646.6 "Heartbreak Kick 7" #Ability { id: "B45E", source: "The Tyrant" } +1648.6 "--sync--" Ability { id: "B45F", source: "The Tyrant" } +1651.6 "--sync--" StartsUsing { id: "B462", source: "The Tyrant" } +1659.6 "Heartbreaker (Enrage)" Ability { id: "B462", source: "The Tyrant" } +1659.6 "--untargetable--" +1659.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 +# B431 Fire and Fury: 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