Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

raidboss: Barbariccia Ex minor improvements #5865

Merged
merged 1 commit into from
Oct 23, 2023
Merged
Show file tree
Hide file tree
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
226 changes: 200 additions & 26 deletions ui/raidboss/data/06-ew/trial/barbariccia-ex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,18 @@ import { RaidbossData } from '../../../../../types/data';
import { TriggerSet } from '../../../../../types/trigger';

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

const triggerSet: TriggerSet<Data> = {
Expand All @@ -16,25 +26,49 @@ const triggerSet: TriggerSet<Data> = {
timelineFile: 'barbariccia-ex.txt',
initData: () => {
return {
secretBreezeCount: 0,
boldBoulderTargets: [],
boulderBreakCount: 0,
hairFlayUpbraidTargets: [],
blowAwayCount: 0,
blowAwayPuddleCount: 0,
};
},
timelineTriggers: [
{
id: 'BarbaricciaEx Knuckle Drum',
regex: /Knuckle Drum/,
beforeSeconds: 5,
suppressSeconds: 15,
response: Responses.bigAoe(),
},
{
id: 'BarbaricciaEx Blow Away',
regex: /Blow Away/,
beforeSeconds: 5,
response: Responses.getTogether('info'),
beforeSeconds: 10,
durationSeconds: 5,
suppressSeconds: 15,
infoText: (_data, _matches, output) => output.text!(),
outputStrings: {
text: {
en: 'Stack to Bait Puddles',
},
},
},
],
triggers: [
{
id: 'BarbaricciaEx Curling Iron Cleanup',
type: 'StartsUsing',
netRegex: { id: '75B2', source: 'Barbariccia', capture: false },
suppressSeconds: 5,
run: (data) => {
// This is mostly to clean up the rogue "Hair Spray" that happens
// not during Savage Barbery.
delete data.barberyMechanic;
delete data.nextBarberyMechanic;
},
},
{
id: 'BarbaricciaEx Void Aero IV',
type: 'StartsUsing',
Expand Down Expand Up @@ -78,62 +112,151 @@ const triggerSet: TriggerSet<Data> = {
id: 'BarbaricciaEx Hair Raid Donut',
type: 'StartsUsing',
netRegex: { id: '757E', source: 'Barbariccia', capture: false },
response: Responses.getIn(),
durationSeconds: (data) => data.nextBarberyMechanic === undefined ? undefined : 5,
alertText: (data, _matches, output) => {
if (data.nextBarberyMechanic === 'stack')
return output.inAndHealerGroups!();
if (data.nextBarberyMechanic === 'spread')
return output.inThenSpread!();
return output.in!();
},
outputStrings: {
in: Outputs.in,
inThenSpread: {
en: 'In => Spread',
},
inAndHealerGroups: {
en: 'In => Healer Groups',
},
},
},
{
id: 'BarbaricciaEx Hair Raid Donut Move',
type: 'Ability',
netRegex: { id: '757F', source: 'Barbariccia', capture: false },
condition: (data) => data.barberyMechanic === 'spread',
suppressSeconds: 5,
alertText: (_data, _matches, output) => output.text!(),
outputStrings: {
text: {
en: 'Spread Out',
},
},
},
{
id: 'BarbaricciaEx Hair Raid Wall',
type: 'StartsUsing',
netRegex: { id: '757C', source: 'Barbariccia', capture: false },
alertText: (_data, _matches, output) => output.text!(),
durationSeconds: (data) => data.nextBarberyMechanic === undefined ? undefined : 5,
alertText: (data, _matches, output) => {
if (data.nextBarberyMechanic === 'stack')
return output.wallAndHealerGroups!();
if (data.nextBarberyMechanic === 'spread')
return output.wallThenSpread!();
return output.wall!();
},
outputStrings: {
text: {
wall: {
en: 'Wall',
de: 'Wand',
fr: 'Mur',
ja: '壁へ',
cn: '去场边',
ko: '벽으로',
},
wallAndHealerGroups: {
en: 'Wall + Healer Groups',
},
wallThenSpread: {
en: 'Wall => Spread',
},
},
},
{
id: 'BarbaricciaEx Hair Raid Wall Move',
type: 'Ability',
netRegex: { id: '757D', source: 'Barbariccia', capture: false },
condition: (data) => data.barberyMechanic === 'spread',
suppressSeconds: 5,
alertText: (_data, _matches, output) => output.text!(),
outputStrings: {
text: {
en: 'Spread Out',
},
},
},
{
id: 'BarbaricciaEx Hair Spray',
type: 'StartsUsing',
// This spread mechanic is used later in other phases of the fight as well.
netRegex: { id: '75A6', source: 'Barbariccia', capture: false },
suppressSeconds: 1,
response: Responses.spread(),
infoText: (data, _matches, output) => {
// This spread mechanic is used later in other phases of the fight as well.
// However, that extra usage is fixed in the Curling Iron Cleanup trigger.
data.barberyMechanic = 'spread';
data.nextBarberyMechanic ??= 'stack';

// Suppress extra "spread" if we handled it in Hair Raid.
if (data.nextBarberyMechanic === 'spread') {
delete data.nextBarberyMechanic;
return;
}
return output.spread!();
},
outputStrings: {
spread: Outputs.spread,
},
},
{
id: 'BarbaricciaEx Deadly Twist',
type: 'StartsUsing',
netRegex: { id: '75A7', source: 'Barbariccia', capture: false },
suppressSeconds: 2,
infoText: (_data, _matches, output) => output.groups!(),
infoText: (data, _matches, output) => {
data.barberyMechanic = 'stack';
data.nextBarberyMechanic ??= 'spread';

// Suppress extra "stack" if we handled it in Hair Raid.
if (data.nextBarberyMechanic === 'stack') {
delete data.nextBarberyMechanic;
return;
}
return output.groups!();
},
outputStrings: {
groups: {
en: 'Healer Groups',
de: 'Heiler-Gruppen',
fr: 'Groupes sur les heals',
ja: 'ヒラに頭割り',
cn: '治疗分组分摊',
ko: '힐러 그룹 쉐어',
},
groups: Outputs.healerGroups,
},
},
{
id: 'BarbaricciaEx Void Aero III',
type: 'StartsUsing',
netRegex: { id: '7571', source: 'Barbariccia' },
condition: Conditions.caresAboutPhysical(),
response: Responses.tankBusterSwap(),
},
{
id: 'BarbaricciaEx Secret Breeze',
id: 'BarbaricciaEx Secret Breeze 1',
type: 'Ability',
// Trigger on 7413 Hair Flay (large spreads during partner stacks)
netRegex: { id: '7413', source: 'Barbariccia', capture: false },
suppressSeconds: 1,
alertText: (_data, _matches, output) => output.protean!(),
outputStrings: {
protean: {
en: 'Protean Spread',
},
},
},
{
id: 'BarbaricciaEx Secret Breeze Others',
type: 'StartsUsing',
netRegex: { id: '7580', source: 'Barbariccia', capture: false },
preRun: (data) => data.secretBreezeCount++,
durationSeconds: 3,
alertText: (_data, _matches, output) => output.protean!(),
alertText: (data, _matches, output) => {
// On the first one, don't call too early. Call after the spread/partner stacks go off.
if (data.secretBreezeCount !== 1)
return output.protean!();
},
outputStrings: {
protean: {
en: 'Protean',
Expand All @@ -152,14 +275,15 @@ const triggerSet: TriggerSet<Data> = {
response: Responses.sharedTankBuster(),
},
{
id: 'BarbaricciaEx Brittle Boulder',
type: 'HeadMarker',
netRegex: { id: '016D', capture: false },
suppressSeconds: 2,
id: 'BarbaricciaEx Brittle Boulder 1',
type: 'Ability',
netRegex: { id: '7383', source: 'Barbariccia', capture: false },
durationSeconds: 8,
suppressSeconds: 5,
alertText: (_data, _matches, output) => output.text!(),
outputStrings: {
text: {
en: 'Bait Middle => Out (Spread)',
en: 'Bait Middle => Out + Spread',
de: 'In der Mitte Ködern => Raus (verteilen)',
fr: 'Posez au centre -> Écartez-vous à l\'extérieur',
ja: '真ん中で誘導 => 8方向散開',
Expand All @@ -168,6 +292,18 @@ const triggerSet: TriggerSet<Data> = {
},
},
},
{
id: 'BarbaricciaEx Boulder',
type: 'HeadMarker',
netRegex: { id: '0173', capture: false },
suppressSeconds: 2,
infoText: (_data, _matches, output) => output.text!(),
outputStrings: {
text: {
en: 'Out + Spread',
},
},
},
{
// These also favor a certain order of Tank/Healer for first set then DPS second set,
// but if people are dead anybody can get these.
Expand All @@ -191,8 +327,13 @@ const triggerSet: TriggerSet<Data> = {
id: 'BarbaricciaEx Brutal Rush Move',
type: 'Ability',
// When the Brutal Rush hits you, the follow-up Brutal Gust has locked in.
netRegex: { id: '7583', source: 'Barbariccia' },
condition: Conditions.targetIsYou(),
netRegex: { id: ['7583', '7584'], source: 'Barbariccia' },
condition: (data, matches) => {
// Suppress during the middle of puddles where these are (usually) naturally dodged.
if (data.blowAwayPuddleCount !== 0 && data.blowAwayPuddleCount !== 4)
return false;
return matches.target === data.me;
},
response: Responses.moveAway(),
},
{
Expand Down Expand Up @@ -290,6 +431,39 @@ const triggerSet: TriggerSet<Data> = {
stackMarker: Outputs.stackMarker,
},
},
{
id: 'BarbaricciaEx Blow Away Reset',
type: 'Ability',
netRegex: { id: '7595', source: 'Barbariccia', capture: false },
run: (data) => {
data.blowAwayCount++;
data.blowAwayPuddleCount = 0;
},
},
{
id: 'BarbaricciaEx Blow Away Puddle Count',
type: 'StartsUsing',
netRegex: { id: '7596', source: 'Barbariccia', capture: false },
preRun: (data) => data.blowAwayPuddleCount++,
suppressSeconds: 1,
alertText: (data, _matches, output) => {
// This handles Brittle Boulder 2 as well.
if (data.blowAwayCount === 2 && data.blowAwayPuddleCount === 4)
return output.stackMiddle!();
},
infoText: (data, _matches, output) => {
return output[`num${data.blowAwayPuddleCount}`]!();
},
outputStrings: {
num1: Outputs.num1,
num2: Outputs.num2,
num3: Outputs.num3,
num4: Outputs.num4,
stackMiddle: {
en: 'Bait Middle',
},
},
},
{
id: 'BarbaricciaEx Impact',
type: 'StartsUsing',
Expand Down
27 changes: 16 additions & 11 deletions ui/raidboss/data/06-ew/trial/barbariccia-ex.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ hideall "Brush with Death"

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

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

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

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

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

632.3 "Brush with Death" sync / 1[56]:[^:]*:Barbariccia:75A4:/
636.3 "Brush with Death" sync / 1[56]:[^:]*:Barbariccia:75A4:/

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

654.6 "Void Aero IV" sync / 1[56]:[^:]*:Barbariccia:7570:/
656.7 "Raging Storm" sync / 1[56]:[^:]*:Barbariccia:7572:/
658.6 "Void Aero IV" sync / 1[56]:[^:]*:Barbariccia:7570:/
660.7 "Raging Storm" sync / 1[56]:[^:]*:Barbariccia:7572:/

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