From 0ec320bf3d81bd76c4154b1b16366679fcfb132c Mon Sep 17 00:00:00 2001 From: Legends0 Date: Sun, 26 Jul 2026 23:04:23 -0400 Subject: [PATCH 1/6] reminder on ultima upsurge if fake entropy --- .../data/07-dt/ultimate/dancing_mad.ts | 109 +++++++++++++++++- 1 file changed, 105 insertions(+), 4 deletions(-) diff --git a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts index 0a3a9faa72..a63954a3db 100644 --- a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts +++ b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts @@ -15,7 +15,6 @@ const phases: { [id: string]: Phase } = { 'C24C': 'p2', // Ultimate Embrace, God Kefka 'C3F7': 'p3', // Aero III Assault (from Kefka), Chaos and Exdeath 'C2DC': 'p4', // Kefka Says, Kefka with Chaos and Neo Exdeath - 'BB40': 'p5', // Ultima Repeater, Ultima Kefka }; const centerX = 100; @@ -40,6 +39,7 @@ export interface Data extends RaidbossData { }; // General phase: Phase | 'unknown'; + middleCount: number; // Phase 1 actorPositions: { [id: string]: { x: number; y: number; heading: number } }; gravenImageCount: number; @@ -931,6 +931,7 @@ const triggerSet: TriggerSet = { initData: () => { return { phase: 'p1', + middleCount: 0, // Phase 1 actorPositions: {}, gravenImageCount: 0, @@ -977,11 +978,24 @@ const triggerSet: TriggerSet = { }, triggers: [ { - id: 'DMU Phase Tracker', + id: 'DMU Phase 1-4 Tracker', type: 'StartsUsing', netRegex: { id: Object.keys(phases) }, run: (data, matches) => data.phase = phases[matches.id] ?? 'unknown', }, + { + id: 'DMU Phase 5 Tracker', + // Ultimate Kefka + // Track jumps to middle for earlier P5 and Ultima Upsurge + // Rather than using BB40 Ultima Repeater + type: 'StartsUsing', + netRegex: { id: 'C3FD', source: 'Kefka', capture: false }, + run: (data) => { + data.middleCount = data.middleCount + 1; + if (data.middleCount === 5) + data.phase === 'p5'; + }, + }, { id: 'DMU ActorSetPos Tracker', // P1 Graven Image tethers @@ -7869,10 +7883,90 @@ const triggerSet: TriggerSet = { }, }, { - id: 'DMU P4/P5 Ultima Upsurge', + id: 'DMU P4 Ultima Upsurge', type: 'StartsUsing', netRegex: { id: 'C24A', source: 'Kefka', capture: false }, - response: Responses.bigAoe(), + condition: (data) => data.phase === 'p4', + durationSeconds: (data) => { + return (data.isEntropyTrue || data.isEntropyTrue === undefined) + ? 5 + : 7; // Time until Donuts + }, + infoText: (data, _matches, output) => { + const bigAoe = output.bigAoe!(); + if (data.isEntropyTrue || data.isEntropyTrue === undefined) + return bigAoe; // Player needs to move within 2.6s, TTS would be too long + const is1stTrue = data.areFirstDebuffsTrue; + const is2ndTrue = data.areThirdDebuffsTrue; + const isFirstShort = data.isFirstDebuffShort; + if (is1stTrue === undefined || is2ndTrue === undefined || isFirstShort === undefined) + return bigAoe; + const isLongTrue = isFirstShort ? is2ndTrue : is1stTrue; + + const hasFork = data.longForkedPlayers.includes(data.me); + const hasCompressed = data.longCompressedPlayers.includes(data.me); + const hasFirstBomb = data.firstLongBombPlayers.includes(data.me); + const hasSecondBomb = data.secondLongBombPlayers.includes(data.me); + const isBombTrue = hasFirstBomb ? is1stTrue : is2ndTrue; + + const hasSpread = (hasFork && isLongTrue) || (hasCompressed && !isLongTrue); + const hasStack = (hasFork && !isLongTrue) || (hasCompressed && isLongTrue); + const hasBomb = hasFirstBomb || hasSecondBomb; + + // Handle 2 Mechs + let mechs = output.noDebuff!(); // Has nothing + if (hasSpread && hasBomb) + mechs = output.forkBomb!({ + mech1: output.spread!(), + mech2: isBombTrue ? output.bomb!() : output.fakeBomb!(), + }); + if (hasStack && hasBomb) + mechs = output.compressedBomb!({ + mech1: output.stack!(), + mech2: isBombTrue ? output.bomb!() : output.fakeBomb!(), + }); + if (hasSpread) + mechs = output.spread!(); + if (hasStack) + mechs = output.stack!(); + if (hasBomb) + mechs = output.bombStack!({ + mech1: isBombTrue ? output.bomb!() : output.fakeBomb!(), + mech2: output.stack!(), + }); + + return output.aoeThenMech!({ + aoe: bigAoe, + mech: mechs, + }); + }, + outputStrings: { + bigAoe: Outputs.bigAoe, + you: { + en: 'YOU', + }, + bombStack: { + en: '${mech1} + ${mech2}', + }, + forkBomb: { + en: '${mech1} + ${mech2}', + }, + compressedBomb: { + en: '${mech1} + ${mech2}', + }, + noDebuff: Outputs.stackMarker, + stack: Outputs.stackMarker, + spread: Outputs.spread, + bomb: { + en: 'Stillness', + }, + fakeBomb: { + en: 'Motion', + }, + aoeThenMech: { + en: '${aoe} => ${mech} (later)', + }, + }, }, { id: 'DMU P4 Stray Flames and Long Debuffs', @@ -8126,6 +8220,13 @@ const triggerSet: TriggerSet = { suppressSeconds: 99999, response: Responses.moveAway('alert'), }, + { + id: 'DMU P5 Ultima Upsurge', + type: 'StartsUsing', + netRegex: { id: 'C24A', source: 'Kefka', capture: false }, + condition: (data) => data.phase === 'p5', + response: Responses.bigAoe(), + }, ], timelineReplace: [ { From 3969de2d411e2aaa2ece8cd164c682c9f7c3431f Mon Sep 17 00:00:00 2001 From: Legends0 Date: Sun, 26 Jul 2026 23:06:58 -0400 Subject: [PATCH 2/6] remove todo comment --- ui/raidboss/data/07-dt/ultimate/dancing_mad.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts index a63954a3db..84dec16422 100644 --- a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts +++ b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts @@ -8,7 +8,6 @@ import { LocaleText, OutputStrings, TriggerSet } from '../../../../../types/trig // TODO: P2 Old AAAABBBB plan was found at https://raidplan.io/plan/kj2d734d36es2ugs, would like to find replacement // TODO: P3 Better Blackhole no-config support via debuff tracking? -// TODO: Earlier phase tracking for P5 (counting the jumps to middle?) type Phase = 'p1' | 'p2' | 'p3' | 'p4' | 'p5'; const phases: { [id: string]: Phase } = { From de873866b08f9383c2c21a700656459d59adbb2a Mon Sep 17 00:00:00 2001 From: Legends0 Date: Mon, 27 Jul 2026 00:24:27 -0400 Subject: [PATCH 3/6] remove (later) --- ui/raidboss/data/07-dt/ultimate/dancing_mad.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts index 84dec16422..dcd4a1b088 100644 --- a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts +++ b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts @@ -7963,7 +7963,7 @@ const triggerSet: TriggerSet = { en: 'Motion', }, aoeThenMech: { - en: '${aoe} => ${mech} (later)', + en: '${aoe} => ${mech}', }, }, }, From b3ee10b2eef04271dc20e139b9603acc790a3af0 Mon Sep 17 00:00:00 2001 From: Legends0 Date: Mon, 27 Jul 2026 04:06:25 -0400 Subject: [PATCH 4/6] fix --- ui/raidboss/data/07-dt/ultimate/dancing_mad.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts index dcd4a1b088..0480eb18e6 100644 --- a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts +++ b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts @@ -992,7 +992,7 @@ const triggerSet: TriggerSet = { run: (data) => { data.middleCount = data.middleCount + 1; if (data.middleCount === 5) - data.phase === 'p5'; + data.phase = 'p5'; }, }, { From 41cd2f3cc00c8302133c3990e057e98811a406c6 Mon Sep 17 00:00:00 2001 From: Legends0 Date: Mon, 27 Jul 2026 04:10:14 -0400 Subject: [PATCH 5/6] change to ability it doesn't have a startsUsing line --- ui/raidboss/data/07-dt/ultimate/dancing_mad.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts index 0480eb18e6..03be68a0a4 100644 --- a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts +++ b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts @@ -987,7 +987,7 @@ const triggerSet: TriggerSet = { // Ultimate Kefka // Track jumps to middle for earlier P5 and Ultima Upsurge // Rather than using BB40 Ultima Repeater - type: 'StartsUsing', + type: 'Ability', netRegex: { id: 'C3FD', source: 'Kefka', capture: false }, run: (data) => { data.middleCount = data.middleCount + 1; From 45ead7ff182940de603a477d160b0bac722a3593 Mon Sep 17 00:00:00 2001 From: Legends0 Date: Mon, 27 Jul 2026 20:50:11 -0400 Subject: [PATCH 6/6] use else if --- ui/raidboss/data/07-dt/ultimate/dancing_mad.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts index dea17c3975..576a4aa0bc 100644 --- a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts +++ b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts @@ -8096,16 +8096,16 @@ const triggerSet: TriggerSet = { mech1: output.spread!(), mech2: isBombTrue ? output.bomb!() : output.fakeBomb!(), }); - if (hasStack && hasBomb) + else if (hasStack && hasBomb) mechs = output.compressedBomb!({ mech1: output.stack!(), mech2: isBombTrue ? output.bomb!() : output.fakeBomb!(), }); - if (hasSpread) + else if (hasSpread) mechs = output.spread!(); - if (hasStack) + else if (hasStack) mechs = output.stack!(); - if (hasBomb) + else if (hasBomb) mechs = output.bombStack!({ mech1: isBombTrue ? output.bomb!() : output.fakeBomb!(), mech2: output.stack!(),