From 73a8a871584c47c17578104fe26e7def40a03353 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Sun, 1 Feb 2026 23:56:04 -0800 Subject: [PATCH 1/3] raidboss: sort r9s bat positions for consistency When tracking the bat positions it is possible for the different lines to arrive in an arbitrary order. This results in the callout being inconsistent even when the bats are in the same position. For example it might call out "away from bats S/N" instead of always consistently saying "away from bats N/S". Use sort() to make sure the bat callouts are consistent and always display the directions in the same order. --- ui/raidboss/data/07-dt/raid/r9s.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/raidboss/data/07-dt/raid/r9s.ts b/ui/raidboss/data/07-dt/raid/r9s.ts index 7e6ef85c6db..7f3d7ecffd0 100644 --- a/ui/raidboss/data/07-dt/raid/r9s.ts +++ b/ui/raidboss/data/07-dt/raid/r9s.ts @@ -172,7 +172,7 @@ const triggerSet: TriggerSet = { durationSeconds: 5.5, suppressSeconds: 1, infoText: (data, _matches, output) => { - const [dir1, dir2] = data.bats.inner; + const [dir1, dir2] = data.bats.inner.sort(); return output.away!({ dir1: output[dir1 ?? 'unknown']!(), @@ -202,7 +202,7 @@ const triggerSet: TriggerSet = { durationSeconds: 3.4, suppressSeconds: 1, infoText: (data, _matches, output) => { - const [dir1, dir2, dir3] = data.bats.middle; + const [dir1, dir2, dir3] = data.bats.middle.sort(); return output.away!({ dir1: output[dir1 ?? 'unknown']!(), From dab5246da8a797e5b2cc3060fd190aade69e9a49 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Mon, 2 Feb 2026 19:55:50 -0800 Subject: [PATCH 2/3] add a custom sorting function for directions Add a custom sorting function for direction outputs which sorts directions based on the index in the output16Dir. This works because DirectionOutput16 is a superset of all the directions and is listed in clockwise order starting with 'dirN'. By implementing a single function we don't need to implement a separate custom function per each direction type, and we don't need to re-implement the sorting logic at each code point where sorting is required. --- resources/util.ts | 22 ++++++++++++++++++++++ ui/raidboss/data/07-dt/raid/r9s.ts | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/resources/util.ts b/resources/util.ts index 3f93d7201bb..278a531dd22 100644 --- a/resources/util.ts +++ b/resources/util.ts @@ -263,6 +263,27 @@ const output16Dir: DirectionOutput16[] = [ const outputCardinalDir: DirectionOutputCardinal[] = ['dirN', 'dirE', 'dirS', 'dirW']; const outputIntercardDir: DirectionOutputIntercard[] = ['dirNE', 'dirSE', 'dirSW', 'dirNW']; +type DirectionOutput = + | DirectionOutput8 + | DirectionOutput16 + | DirectionOutputCardinal + | DirectionOutputIntercard; + +const compareDirectionOutput = (a: DirectionOutput, b: DirectionOutput): number => { + const aDir16: DirectionOutput16 = a as DirectionOutput16; + const bDir16: DirectionOutput16 = b as DirectionOutput16; + + // Sort any element not in output16Dir after. + const aIndex = output16Dir.indexOf(aDir16) ?? output16Dir.length; + const bIndex = output16Dir.indexOf(bDir16) ?? output16Dir.length; + + if (aIndex < bIndex) + return -1; + if (aIndex > bIndex) + return 1; + return 0; +}; + const outputStrings16Dir: OutputStrings = { dirN: Outputs.dirN, dirNNE: Outputs.dirNNE, @@ -375,6 +396,7 @@ export const Directions = { output16Dir: output16Dir, outputCardinalDir: outputCardinalDir, outputIntercardDir: outputIntercardDir, + compareDirectionOutput: compareDirectionOutput, outputStrings16Dir: outputStrings16Dir, outputStrings8Dir: outputStrings8Dir, outputStringsCardinalDir: outputStringsCardinalDir, diff --git a/ui/raidboss/data/07-dt/raid/r9s.ts b/ui/raidboss/data/07-dt/raid/r9s.ts index 7f3d7ecffd0..534502eb801 100644 --- a/ui/raidboss/data/07-dt/raid/r9s.ts +++ b/ui/raidboss/data/07-dt/raid/r9s.ts @@ -172,7 +172,7 @@ const triggerSet: TriggerSet = { durationSeconds: 5.5, suppressSeconds: 1, infoText: (data, _matches, output) => { - const [dir1, dir2] = data.bats.inner.sort(); + const [dir1, dir2] = data.bats.inner.sort(Directions.compareDirectionOutput); return output.away!({ dir1: output[dir1 ?? 'unknown']!(), @@ -202,7 +202,7 @@ const triggerSet: TriggerSet = { durationSeconds: 3.4, suppressSeconds: 1, infoText: (data, _matches, output) => { - const [dir1, dir2, dir3] = data.bats.middle.sort(); + const [dir1, dir2, dir3] = data.bats.middle.sort(Directions.compareDirectionOutput); return output.away!({ dir1: output[dir1 ?? 'unknown']!(), From 8a7d9e444d330be83f536b90e0286d20effd1464 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Mon, 2 Feb 2026 22:11:20 -0800 Subject: [PATCH 3/3] remove unnecessary type juggling Co-authored-by: valarnin --- resources/util.ts | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/resources/util.ts b/resources/util.ts index 278a531dd22..e2f6b06db93 100644 --- a/resources/util.ts +++ b/resources/util.ts @@ -263,19 +263,10 @@ const output16Dir: DirectionOutput16[] = [ const outputCardinalDir: DirectionOutputCardinal[] = ['dirN', 'dirE', 'dirS', 'dirW']; const outputIntercardDir: DirectionOutputIntercard[] = ['dirNE', 'dirSE', 'dirSW', 'dirNW']; -type DirectionOutput = - | DirectionOutput8 - | DirectionOutput16 - | DirectionOutputCardinal - | DirectionOutputIntercard; - -const compareDirectionOutput = (a: DirectionOutput, b: DirectionOutput): number => { - const aDir16: DirectionOutput16 = a as DirectionOutput16; - const bDir16: DirectionOutput16 = b as DirectionOutput16; - +const compareDirectionOutput = (a: DirectionOutput16, b: DirectionOutput16): number => { // Sort any element not in output16Dir after. - const aIndex = output16Dir.indexOf(aDir16) ?? output16Dir.length; - const bIndex = output16Dir.indexOf(bDir16) ?? output16Dir.length; + const aIndex = output16Dir.indexOf(a) ?? output16Dir.length; + const bIndex = output16Dir.indexOf(b) ?? output16Dir.length; if (aIndex < bIndex) return -1;