Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
191 changes: 149 additions & 42 deletions ui/raidboss/data/07-dt/ultimate/dancing_mad.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -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);
Expand All @@ -344,6 +343,24 @@ 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';
};
Expand Down Expand Up @@ -529,6 +546,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}向右+吃分散',
Expand Down Expand Up @@ -2491,22 +2511,22 @@ const triggerSet: TriggerSet<Data> = {

// 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'])
Expand Down Expand Up @@ -2647,14 +2667,37 @@ const triggerSet: TriggerSet<Data> = {
(!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,
Expand Down Expand Up @@ -3469,14 +3512,37 @@ const triggerSet: TriggerSet<Data> = {
(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,
Expand Down Expand Up @@ -3789,14 +3855,34 @@ const triggerSet: TriggerSet<Data> = {
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,
Expand Down Expand Up @@ -4142,14 +4228,35 @@ const triggerSet: TriggerSet<Data> = {

// 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,
});
Expand Down