Skip to content

Commit cf7db83

Browse files
authored
raidboss: Barbariccia Ex minor improvements (#5865)
1 parent 354f84d commit cf7db83

File tree

2 files changed

+216
-37
lines changed

2 files changed

+216
-37
lines changed

ui/raidboss/data/06-ew/trial/barbariccia-ex.ts

Lines changed: 200 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,18 @@ import { RaidbossData } from '../../../../../types/data';
66
import { TriggerSet } from '../../../../../types/trigger';
77

88
export interface Data extends RaidbossData {
9+
// The in/out comes before the stacks/spread markers, this value is the
10+
// "current" mechanic so that we can call "spread out" after hair raid finishes.
11+
barberyMechanic?: 'stack' | 'spread';
12+
// This value records once we've seen a given savage barbery mechanic,
13+
// what the next one is going to be to call out slightly earlier.
14+
nextBarberyMechanic?: 'stack' | 'spread';
15+
secretBreezeCount: number;
16+
boulderBreakCount: number;
917
boldBoulderTargets: string[];
1018
hairFlayUpbraidTargets: string[];
19+
blowAwayCount: number;
20+
blowAwayPuddleCount: number;
1121
}
1222

1323
const triggerSet: TriggerSet<Data> = {
@@ -16,25 +26,49 @@ const triggerSet: TriggerSet<Data> = {
1626
timelineFile: 'barbariccia-ex.txt',
1727
initData: () => {
1828
return {
29+
secretBreezeCount: 0,
1930
boldBoulderTargets: [],
31+
boulderBreakCount: 0,
2032
hairFlayUpbraidTargets: [],
33+
blowAwayCount: 0,
34+
blowAwayPuddleCount: 0,
2135
};
2236
},
2337
timelineTriggers: [
2438
{
2539
id: 'BarbaricciaEx Knuckle Drum',
2640
regex: /Knuckle Drum/,
2741
beforeSeconds: 5,
42+
suppressSeconds: 15,
2843
response: Responses.bigAoe(),
2944
},
3045
{
3146
id: 'BarbaricciaEx Blow Away',
3247
regex: /Blow Away/,
33-
beforeSeconds: 5,
34-
response: Responses.getTogether('info'),
48+
beforeSeconds: 10,
49+
durationSeconds: 5,
50+
suppressSeconds: 15,
51+
infoText: (_data, _matches, output) => output.text!(),
52+
outputStrings: {
53+
text: {
54+
en: 'Stack to Bait Puddles',
55+
},
56+
},
3557
},
3658
],
3759
triggers: [
60+
{
61+
id: 'BarbaricciaEx Curling Iron Cleanup',
62+
type: 'StartsUsing',
63+
netRegex: { id: '75B2', source: 'Barbariccia', capture: false },
64+
suppressSeconds: 5,
65+
run: (data) => {
66+
// This is mostly to clean up the rogue "Hair Spray" that happens
67+
// not during Savage Barbery.
68+
delete data.barberyMechanic;
69+
delete data.nextBarberyMechanic;
70+
},
71+
},
3872
{
3973
id: 'BarbaricciaEx Void Aero IV',
4074
type: 'StartsUsing',
@@ -78,62 +112,151 @@ const triggerSet: TriggerSet<Data> = {
78112
id: 'BarbaricciaEx Hair Raid Donut',
79113
type: 'StartsUsing',
80114
netRegex: { id: '757E', source: 'Barbariccia', capture: false },
81-
response: Responses.getIn(),
115+
durationSeconds: (data) => data.nextBarberyMechanic === undefined ? undefined : 5,
116+
alertText: (data, _matches, output) => {
117+
if (data.nextBarberyMechanic === 'stack')
118+
return output.inAndHealerGroups!();
119+
if (data.nextBarberyMechanic === 'spread')
120+
return output.inThenSpread!();
121+
return output.in!();
122+
},
123+
outputStrings: {
124+
in: Outputs.in,
125+
inThenSpread: {
126+
en: 'In => Spread',
127+
},
128+
inAndHealerGroups: {
129+
en: 'In => Healer Groups',
130+
},
131+
},
132+
},
133+
{
134+
id: 'BarbaricciaEx Hair Raid Donut Move',
135+
type: 'Ability',
136+
netRegex: { id: '757F', source: 'Barbariccia', capture: false },
137+
condition: (data) => data.barberyMechanic === 'spread',
138+
suppressSeconds: 5,
139+
alertText: (_data, _matches, output) => output.text!(),
140+
outputStrings: {
141+
text: {
142+
en: 'Spread Out',
143+
},
144+
},
82145
},
83146
{
84147
id: 'BarbaricciaEx Hair Raid Wall',
85148
type: 'StartsUsing',
86149
netRegex: { id: '757C', source: 'Barbariccia', capture: false },
87-
alertText: (_data, _matches, output) => output.text!(),
150+
durationSeconds: (data) => data.nextBarberyMechanic === undefined ? undefined : 5,
151+
alertText: (data, _matches, output) => {
152+
if (data.nextBarberyMechanic === 'stack')
153+
return output.wallAndHealerGroups!();
154+
if (data.nextBarberyMechanic === 'spread')
155+
return output.wallThenSpread!();
156+
return output.wall!();
157+
},
88158
outputStrings: {
89-
text: {
159+
wall: {
90160
en: 'Wall',
91161
de: 'Wand',
92162
fr: 'Mur',
93163
ja: '壁へ',
94164
cn: '去场边',
95165
ko: '벽으로',
96166
},
167+
wallAndHealerGroups: {
168+
en: 'Wall + Healer Groups',
169+
},
170+
wallThenSpread: {
171+
en: 'Wall => Spread',
172+
},
173+
},
174+
},
175+
{
176+
id: 'BarbaricciaEx Hair Raid Wall Move',
177+
type: 'Ability',
178+
netRegex: { id: '757D', source: 'Barbariccia', capture: false },
179+
condition: (data) => data.barberyMechanic === 'spread',
180+
suppressSeconds: 5,
181+
alertText: (_data, _matches, output) => output.text!(),
182+
outputStrings: {
183+
text: {
184+
en: 'Spread Out',
185+
},
97186
},
98187
},
99188
{
100189
id: 'BarbaricciaEx Hair Spray',
101190
type: 'StartsUsing',
102-
// This spread mechanic is used later in other phases of the fight as well.
103191
netRegex: { id: '75A6', source: 'Barbariccia', capture: false },
104192
suppressSeconds: 1,
105-
response: Responses.spread(),
193+
infoText: (data, _matches, output) => {
194+
// This spread mechanic is used later in other phases of the fight as well.
195+
// However, that extra usage is fixed in the Curling Iron Cleanup trigger.
196+
data.barberyMechanic = 'spread';
197+
data.nextBarberyMechanic ??= 'stack';
198+
199+
// Suppress extra "spread" if we handled it in Hair Raid.
200+
if (data.nextBarberyMechanic === 'spread') {
201+
delete data.nextBarberyMechanic;
202+
return;
203+
}
204+
return output.spread!();
205+
},
206+
outputStrings: {
207+
spread: Outputs.spread,
208+
},
106209
},
107210
{
108211
id: 'BarbaricciaEx Deadly Twist',
109212
type: 'StartsUsing',
110213
netRegex: { id: '75A7', source: 'Barbariccia', capture: false },
111214
suppressSeconds: 2,
112-
infoText: (_data, _matches, output) => output.groups!(),
215+
infoText: (data, _matches, output) => {
216+
data.barberyMechanic = 'stack';
217+
data.nextBarberyMechanic ??= 'spread';
218+
219+
// Suppress extra "stack" if we handled it in Hair Raid.
220+
if (data.nextBarberyMechanic === 'stack') {
221+
delete data.nextBarberyMechanic;
222+
return;
223+
}
224+
return output.groups!();
225+
},
113226
outputStrings: {
114-
groups: {
115-
en: 'Healer Groups',
116-
de: 'Heiler-Gruppen',
117-
fr: 'Groupes sur les heals',
118-
ja: 'ヒラに頭割り',
119-
cn: '治疗分组分摊',
120-
ko: '힐러 그룹 쉐어',
121-
},
227+
groups: Outputs.healerGroups,
122228
},
123229
},
124230
{
125231
id: 'BarbaricciaEx Void Aero III',
126232
type: 'StartsUsing',
127233
netRegex: { id: '7571', source: 'Barbariccia' },
128-
condition: Conditions.caresAboutPhysical(),
129234
response: Responses.tankBusterSwap(),
130235
},
131236
{
132-
id: 'BarbaricciaEx Secret Breeze',
237+
id: 'BarbaricciaEx Secret Breeze 1',
238+
type: 'Ability',
239+
// Trigger on 7413 Hair Flay (large spreads during partner stacks)
240+
netRegex: { id: '7413', source: 'Barbariccia', capture: false },
241+
suppressSeconds: 1,
242+
alertText: (_data, _matches, output) => output.protean!(),
243+
outputStrings: {
244+
protean: {
245+
en: 'Protean Spread',
246+
},
247+
},
248+
},
249+
{
250+
id: 'BarbaricciaEx Secret Breeze Others',
133251
type: 'StartsUsing',
134252
netRegex: { id: '7580', source: 'Barbariccia', capture: false },
253+
preRun: (data) => data.secretBreezeCount++,
135254
durationSeconds: 3,
136-
alertText: (_data, _matches, output) => output.protean!(),
255+
alertText: (data, _matches, output) => {
256+
// On the first one, don't call too early. Call after the spread/partner stacks go off.
257+
if (data.secretBreezeCount !== 1)
258+
return output.protean!();
259+
},
137260
outputStrings: {
138261
protean: {
139262
en: 'Protean',
@@ -152,14 +275,15 @@ const triggerSet: TriggerSet<Data> = {
152275
response: Responses.sharedTankBuster(),
153276
},
154277
{
155-
id: 'BarbaricciaEx Brittle Boulder',
156-
type: 'HeadMarker',
157-
netRegex: { id: '016D', capture: false },
158-
suppressSeconds: 2,
278+
id: 'BarbaricciaEx Brittle Boulder 1',
279+
type: 'Ability',
280+
netRegex: { id: '7383', source: 'Barbariccia', capture: false },
281+
durationSeconds: 8,
282+
suppressSeconds: 5,
159283
alertText: (_data, _matches, output) => output.text!(),
160284
outputStrings: {
161285
text: {
162-
en: 'Bait Middle => Out (Spread)',
286+
en: 'Bait Middle => Out + Spread',
163287
de: 'In der Mitte Ködern => Raus (verteilen)',
164288
fr: 'Posez au centre -> Écartez-vous à l\'extérieur',
165289
ja: '真ん中で誘導 => 8方向散開',
@@ -168,6 +292,18 @@ const triggerSet: TriggerSet<Data> = {
168292
},
169293
},
170294
},
295+
{
296+
id: 'BarbaricciaEx Boulder',
297+
type: 'HeadMarker',
298+
netRegex: { id: '0173', capture: false },
299+
suppressSeconds: 2,
300+
infoText: (_data, _matches, output) => output.text!(),
301+
outputStrings: {
302+
text: {
303+
en: 'Out + Spread',
304+
},
305+
},
306+
},
171307
{
172308
// These also favor a certain order of Tank/Healer for first set then DPS second set,
173309
// but if people are dead anybody can get these.
@@ -191,8 +327,13 @@ const triggerSet: TriggerSet<Data> = {
191327
id: 'BarbaricciaEx Brutal Rush Move',
192328
type: 'Ability',
193329
// When the Brutal Rush hits you, the follow-up Brutal Gust has locked in.
194-
netRegex: { id: '7583', source: 'Barbariccia' },
195-
condition: Conditions.targetIsYou(),
330+
netRegex: { id: ['7583', '7584'], source: 'Barbariccia' },
331+
condition: (data, matches) => {
332+
// Suppress during the middle of puddles where these are (usually) naturally dodged.
333+
if (data.blowAwayPuddleCount !== 0 && data.blowAwayPuddleCount !== 4)
334+
return false;
335+
return matches.target === data.me;
336+
},
196337
response: Responses.moveAway(),
197338
},
198339
{
@@ -290,6 +431,39 @@ const triggerSet: TriggerSet<Data> = {
290431
stackMarker: Outputs.stackMarker,
291432
},
292433
},
434+
{
435+
id: 'BarbaricciaEx Blow Away Reset',
436+
type: 'Ability',
437+
netRegex: { id: '7595', source: 'Barbariccia', capture: false },
438+
run: (data) => {
439+
data.blowAwayCount++;
440+
data.blowAwayPuddleCount = 0;
441+
},
442+
},
443+
{
444+
id: 'BarbaricciaEx Blow Away Puddle Count',
445+
type: 'StartsUsing',
446+
netRegex: { id: '7596', source: 'Barbariccia', capture: false },
447+
preRun: (data) => data.blowAwayPuddleCount++,
448+
suppressSeconds: 1,
449+
alertText: (data, _matches, output) => {
450+
// This handles Brittle Boulder 2 as well.
451+
if (data.blowAwayCount === 2 && data.blowAwayPuddleCount === 4)
452+
return output.stackMiddle!();
453+
},
454+
infoText: (data, _matches, output) => {
455+
return output[`num${data.blowAwayPuddleCount}`]!();
456+
},
457+
outputStrings: {
458+
num1: Outputs.num1,
459+
num2: Outputs.num2,
460+
num3: Outputs.num3,
461+
num4: Outputs.num4,
462+
stackMiddle: {
463+
en: 'Bait Middle',
464+
},
465+
},
466+
},
293467
{
294468
id: 'BarbaricciaEx Impact',
295469
type: 'StartsUsing',

ui/raidboss/data/06-ew/trial/barbariccia-ex.txt

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ hideall "Brush with Death"
1515

1616
# Pattern 1a, linked with pattern 2a through 757A+7575 and 757A+757B
1717
# 6? Possible Spell Ids
18+
25.7 "--sync--" sync / 14:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/ window 10,10
1819
31.7 "--sync--" sync / 1[56]:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/
1920
32.7 "Savage Barbery (line/donut)" sync / 1[56]:[^:]*:Barbariccia:(7574|757A):/
2021
34.8 "Savage Barbery (out)" sync / 1[56]:[^:]*:Barbariccia:(7575|757B):/
@@ -28,6 +29,7 @@ hideall "Brush with Death"
2829
51.0 "Raging Storm" sync / 1[56]:[^:]*:Barbariccia:7572:/
2930

3031
# Pattern 2a
32+
54.4 "--sync--" sync / 14:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/ window 10,10
3133
60.4 "--sync--" sync / 1[56]:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/
3234
61.4 "Savage Barbery (donut/line)" sync / 1[56]:[^:]*:Barbariccia:(757A|7574):/
3335
63.5 "Savage Barbery (out)" sync / 1[56]:[^:]*:Barbariccia:(757B|7575):/
@@ -127,6 +129,7 @@ hideall "Brush with Death"
127129
338.2 "Secret Breeze (protean)" #sync / 1[56]:[^:]*:Barbariccia:7581:/
128130

129131
# Pattern 3a, linked with pattern 4a through 757A+7575 and 757A+757B
132+
341.4 "--sync--" sync / 14:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/ window 10,10
130133
347.4 "--sync--" sync / 1[56]:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/
131134
348.4 "Savage Barbery (line/donut)" sync / 1[56]:[^:]*:Barbariccia:(7574|757A):/
132135
350.5 "Savage Barbery (out)" sync / 1[56]:[^:]*:Barbariccia:(7575|757B):/
@@ -150,6 +153,7 @@ hideall "Brush with Death"
150153
409.2 "Upbraid" sync / 1[56]:[^:]*:Barbariccia:75A8:/
151154

152155
# Pattern 4a
156+
410.7 "--sync--" sync / 14:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/ window 10,10
153157
416.7 "--sync--" sync / 1[56]:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/
154158
417.7 "Savage Barbery (donut/line)" sync / 1[56]:[^:]*:Barbariccia:(757A|7574):/
155159
419.8 "Savage Barbery (out)" sync / 1[56]:[^:]*:Barbariccia:(757B|7575):/
@@ -220,19 +224,20 @@ hideall "Brush with Death"
220224
622.9 "Secret Breeze (protean)" #sync / 1[56]:[^:]*:Barbariccia:7581:/
221225

222226
# Pattern 5a
223-
628.2 "--sync--" sync / 1[56]:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/
224-
629.2 "Savage Barbery (line/donut)" sync / 1[56]:[^:]*:Barbariccia:(7574|757A):/
225-
631.3 "Savage Barbery (out)" sync / 1[56]:[^:]*:Barbariccia:(7575|757B):/
227+
626.2 "--sync--" sync / 14:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/ window 10,10
228+
632.2 "--sync--" sync / 1[56]:[^:]*:Barbariccia:(7573|7464|7465|7466|7489|748B):/
229+
633.2 "Savage Barbery (line/donut)" sync / 1[56]:[^:]*:Barbariccia:(7574|757A):/
230+
635.3 "Savage Barbery (out)" sync / 1[56]:[^:]*:Barbariccia:(7575|757B):/
226231

227-
632.3 "Brush with Death" sync / 1[56]:[^:]*:Barbariccia:75A4:/
232+
636.3 "Brush with Death" sync / 1[56]:[^:]*:Barbariccia:75A4:/
228233

229234
# Pattern 5b
230-
641.4 "--sync--" sync / 1[56]:[^:]*:Barbariccia:(757C|757E):/
231-
643.4 "Hair Raid" sync / 1[56]:[^:]*:Barbariccia:(757D|757E):/
232-
645.7 "Hair Spray/Deadly Twist" sync / 1[56]:[^:]*:Barbariccia:(75A6|75A7):/
235+
645.4 "--sync--" sync / 1[56]:[^:]*:Barbariccia:(757C|757E):/
236+
647.4 "Hair Raid" sync / 1[56]:[^:]*:Barbariccia:(757D|757F):/
237+
649.7 "Hair Spray/Deadly Twist" sync / 1[56]:[^:]*:Barbariccia:(75A6|75A7):/
233238

234-
654.6 "Void Aero IV" sync / 1[56]:[^:]*:Barbariccia:7570:/
235-
656.7 "Raging Storm" sync / 1[56]:[^:]*:Barbariccia:7572:/
239+
658.6 "Void Aero IV" sync / 1[56]:[^:]*:Barbariccia:7570:/
240+
660.7 "Raging Storm" sync / 1[56]:[^:]*:Barbariccia:7572:/
236241

237-
660.0 "--sync--" sync / 14:[^:]*:Barbariccia:75BE:/ window 700,10
238-
669.0 "Maelstrom (enrage)" sync / 1[56]:[^:]*:Barbariccia:75BE:/
242+
664.0 "--sync--" sync / 14:[^:]*:Barbariccia:75BE:/ window 700,10
243+
673.0 "Maelstrom (enrage)" sync / 1[56]:[^:]*:Barbariccia:75BE:/

0 commit comments

Comments
 (0)