From beafdae06874a1aa51d5c40f50c8a533bbea1120 Mon Sep 17 00:00:00 2001 From: Legends0 Date: Sun, 13 Sep 2026 21:02:29 -0400 Subject: [PATCH 1/3] re-use target --- ui/raidboss/data/07-dt/ultimate/dancing_mad.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts index 33cb1d9c9f..0a27ba7f7a 100644 --- a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts +++ b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts @@ -2491,22 +2491,22 @@ const triggerSet: TriggerSet = { // Clear previous Headmarker if set data.pathOfLightStackPlayers = data.pathOfLightStackPlayers.filter((t) => t !== target); - data.forsakenPlayerHeadmarkers[matches.target] = forsakenHeadmarkerIdToName[id] ?? + data.forsakenPlayerHeadmarkers[target] = forsakenHeadmarkerIdToName[id] ?? 'unknown'; // On first headmarker, start everyone in same group // Excluding self as this reduces number of lookups to find partner - if (data.pathOfLightCounter === 1 && data.me !== matches.target) - data.forsakenGroupB.push(matches.target); + if (data.pathOfLightCounter === 1 && data.me !== target) + data.forsakenGroupB.push(target); // If the groups are uneven a tower was missed and it's probably a wipe if (data.pathOfLightCounter === 2) { // Remove from Group B data.forsakenGroupB = data.forsakenGroupB.filter((t) => t !== target); - if (data.me === matches.target) + if (data.me === target) data.isForsakenGroupA = true; else - data.forsakenGroupA.push(matches.target); + data.forsakenGroupA.push(target); } if (id === headMarkerData['stackPath']) From ae75500476bf048789f1444164edf98f14524765 Mon Sep 17 00:00:00 2001 From: Legends0 Date: Sun, 13 Sep 2026 22:02:35 -0400 Subject: [PATCH 2/3] support DPS even bait priorities This now only calls bait clones or cone if cant find players partner --- .../data/07-dt/ultimate/dancing_mad.ts | 182 ++++++++++++++---- 1 file changed, 145 insertions(+), 37 deletions(-) diff --git a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts index 0a27ba7f7a..982e7e6556 100644 --- a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts +++ b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts @@ -282,18 +282,18 @@ const trapOutputStrings: OutputStrings = { }, }; -// Get Partner's HeadMarker following HTMR Priority +// Get Partner following HTMR Priority // Requires data and Forsaken Group -// Will return the forsaken headmarker of partner: +// Will return the player: // Tanks + Healers are partners // Melee DPS + Range/Caster are Partners // Tanks look for healer as they are left unless healer has it // Melee DPS look for the Range/Caster as they are left if ranged has it // Range/Caster looks for existence of a Melee DPS in case there is fake melee -const getHTMRPartnerMarker = ( +const getHTMRPartner = ( data: Data, group: string[], -): forsakenHeadmarker => { +): string => { // Healer role should not be parsed with this function // as they have highest priority left if (data.role === 'healer') @@ -329,7 +329,6 @@ const getHTMRPartnerMarker = ( // Partner should be a melee dps, for optimal comp return isMeleeDPS; }; - const playerHeadmarkers = data.forsakenPlayerHeadmarkers; // Check each player in the group if they are our partner const isMyPartner = getRoleFunction(data.role); @@ -344,6 +343,25 @@ const getHTMRPartnerMarker = ( ? member3 : 'unknown'; + return partner; +}; + + +// Get Partner's HeadMarker following HTMR Priority +// Requires data and Forsaken Group +// Will return the forsaken headmarker of partner: +// Tanks + Healers are partners +// Melee DPS + Range/Caster are Partners +// Tanks look for healer as they are left unless healer has it +// Melee DPS look for the Range/Caster as they are left if ranged has it +// Range/Caster looks for existence of a Melee DPS in case there is fake melee +const getHTMRPartnerMarker = ( + data: Data, + group: string[], +): forsakenHeadmarker => { + const partner = getHTMRPartner(data, group); + const playerHeadmarkers = data.forsakenPlayerHeadmarkers; + // Return partner's marker return playerHeadmarkers[partner ?? 0] ?? 'unknown'; }; @@ -529,6 +547,9 @@ const forsakenOutputStrings: OutputStrings = { cn: '${num}左扇形向左引导', ko: '${num}왼쪽 부채꼴 왼쪽으로 유도', }, + baitRightConeRightEvens: { + en: '${num}Bait Right Cone Right', + }, getHitBySpreadRightBowtie: { // Used only in 5th tower for AAAABBBB en: '${num}Get Right + Hit by Spread', cn: '${num}向右+吃分散', @@ -2647,14 +2668,37 @@ const triggerSet: TriggerSet = { (!isForsakenGroupA && config === 'kroxy-rinon') || (isForsakenGroupA && config === 'abba') ) { - if (data.role === 'healer') - return output.baitLeftConeLeftEvens!({ - num: num, - }); - if (data.role === 'tank') - return output.baitCloneOppositeTowers!({ - num: num, - }); + switch (data.role) { + case 'healer': + return output.baitLeftConeLeftEvens!({ + num: num, + }); + case 'tank': + return output.baitCloneOppositeTowers!({ + num: num, + }); + default: { + const group = config === 'kroxy-rinon' + ? data.forsakenGroupB + : data.forsakenGroupA; + const partner = getHTMRPartner(data, group); + + // Could not get priority + if (partner === 'unknown') + break; + + if (Util.isMeleeDpsJob(data.job)) + return output.baitCloneOppositeTowers!({ + num: num, + }); + + // Ranged DPS highest priority right + return output.baitRightConeRightEvens!({ + num: num, + }); + } + } + // DPS Unknown party composition return output.bait!({ num: num, @@ -3469,14 +3513,37 @@ const triggerSet: TriggerSet = { (isForsakenGroupA && config === 'kroxy-rinon') || (!isForsakenGroupA && config === 'abba') ) { - if (data.role === 'healer') - return output.baitLeftConeLeftEvens!({ - num: num, - }); - if (data.role === 'tank') - return output.baitCloneOppositeTowers!({ - num: num, - }); + switch (data.role) { + case 'healer': + return output.baitLeftConeLeftEvens!({ + num: num, + }); + case 'tank': + return output.baitCloneOppositeTowers!({ + num: num, + }); + default: { + const group = config === 'kroxy-rinon' + ? data.forsakenGroupA + : data.forsakenGroupB; + const partner = getHTMRPartner(data, group); + + // Could not get priority + if (partner === 'unknown') + break; + + if (Util.isMeleeDpsJob(data.job)) + return output.baitCloneOppositeTowers!({ + num: num, + }); + + // Ranged DPS highest priority right + return output.baitRightConeRightEvens!({ + num: num, + }); + } + } + // DPS Unknown party composition return output.bait!({ num: num, @@ -3789,14 +3856,34 @@ const triggerSet: TriggerSet = { isForsakenGroupA && (config === 'kroxy-rinon' || config === 'abba') ) { - if (data.role === 'healer') - return output.baitLeftConeLeftEvens!({ - num: num, - }); - if (data.role === 'tank') - return output.baitCloneOppositeTowers!({ - num: num, - }); + switch (data.role) { + case 'healer': + return output.baitLeftConeLeftEvens!({ + num: num, + }); + case 'tank': + return output.baitCloneOppositeTowers!({ + num: num, + }); + default: { + const partner = getHTMRPartner(data, data.forsakenGroupA); + + // Could not get priority + if (partner === 'unknown') + break; + + if (Util.isMeleeDpsJob(data.job)) + return output.baitCloneOppositeTowers!({ + num: num, + }); + + // Ranged DPS highest priority right + return output.baitRightConeRightEvens!({ + num: num, + }); + } + } + // DPS Unknown party composition return output.bait!({ num: num, @@ -4142,14 +4229,35 @@ const triggerSet: TriggerSet = { // Baits for ABBAABBA and AAABBBBA if (config === 'kroxy-rinon' || config === 'abba') { - if (data.role === 'healer') - return output.baitLeftConeLeftEvens!({ - num: num, - }); - if (data.role === 'tank') - return output.baitCloneOppositeTowers!({ - num: num, - }); + switch (data.role) { + case 'healer': + return output.baitLeftConeLeftEvens!({ + num: num, + }); + case 'tank': + return output.baitCloneOppositeTowers!({ + num: num, + }); + default: { + const partner = getHTMRPartner(data, data.forsakenGroupB); + + // Could not get priority + if (partner === 'unknown') + break; + + if (Util.isMeleeDpsJob(data.job)) + return output.baitCloneOppositeTowers!({ + num: num, + }); + + // Ranged DPS highest priority right + return output.baitRightConeRightEvens!({ + num: num, + }); + } + } + + // DPS Unknown party composition return output.bait!({ num: num, }); From 38c7548b96ed6bc9afbfee71832666a59245399b Mon Sep 17 00:00:00 2001 From: Legends0 Date: Sun, 13 Sep 2026 22:08:13 -0400 Subject: [PATCH 3/3] remove whitespace --- 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 982e7e6556..09df121791 100644 --- a/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts +++ b/ui/raidboss/data/07-dt/ultimate/dancing_mad.ts @@ -346,7 +346,6 @@ const getHTMRPartner = ( return partner; }; - // Get Partner's HeadMarker following HTMR Priority // Requires data and Forsaken Group // Will return the forsaken headmarker of partner: