From 7fce4b44b203695b7aa3263bd4fed3456250c251 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 1 Nov 2023 09:50:58 -0700 Subject: [PATCH 01/39] raidboss/oopsy: add Another Aloalo Island --- .../06-ew/dungeon/another_aloalo_island.ts | 66 ++++++++ .../06-ew/dungeon/another_aloalo_island.ts | 119 +++++++++++++++ .../06-ew/dungeon/another_aloalo_island.txt | 143 ++++++++++++++++++ 3 files changed, 328 insertions(+) create mode 100644 ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts create mode 100644 ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts create mode 100644 ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts new file mode 100644 index 0000000000..dfa67a2e31 --- /dev/null +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts @@ -0,0 +1,66 @@ +import NetRegexes from '../../../../../resources/netregexes'; +import ZoneId from '../../../../../resources/zone_id'; +import { OopsyData } from '../../../../../types/data'; +import { OopsyTriggerSet } from '../../../../../types/oopsy'; + +// TODO: people who missed their 8AC2 Burst tower + +export type Data = OopsyData; + +const triggerSet: OopsyTriggerSet = { + zoneId: ZoneId.AnotherAloaloIsland, + damageWarn: { + // Trash 1 + 'AAI Twister': '8BC0', // Twister tornados + 'AAI Kiwakin Tail Screw': '8BB8', // baited circle + 'AAI Snipper Bubble Shower': '8BB9', // front conal + 'AAI Snipper Crab Dribble': '8BBA', // fast back conal after Bubble Shower + 'AAI Ray Hydrocannon': '8BBD', // line aoe + 'AAI Ray Expulsion': '8BBF', // "get out" + 'AAI Ray Electric Whorl': '8BBE', // "get in" + + // Ketuduke + 'AAI Spring Crystal Saturate 1': '8AAB', // orb circle + 'AAI Spring Crystal Saturate 2': '8AAC', // rupee line laser + 'AAI Sphere Shatter': '8ABC', // moving arches + 'AAI Receding Twintides': '8ACC', // initial out during out->in + 'AAI Near Tide': '8ACD', // second out during in->out with 8ACE Encroaching Twintides + 'AAI Encroaching Twintides': '8ACE', // initial in during in->out + 'AAI Far Tide': '8ACF', // second in during out->in with 8ACC Receding Twintides + 'AAI Hydrobomb': '8AD1', // 3x puddles duruing 8ABD Blowing Bubbles + }, + damageFail: { + 'AAI Big Burst': '8AC3', // tower failure damage + }, + shareWarn: { + 'AAI Hydrobullet': '8ABA', // spread debuffs + }, + soloWarn: { + 'AAI Hydrofall': '8AB7', // partner stack debuffs + 'AAI Snipper Water III': '8C64', // Snipper stack marker + }, + triggers: [ + { + // Getting knocked into a wall from the Angry Seas knockback + id: 'AAI Angry Seas Wall', + type: 'Ability', + netRegex: NetRegexes.ability({ id: '8AC1' }), + deathReason: (_data, matches) => { + return { + id: matches.targetId, + name: matches.target, + text: { + en: 'Pushed into wall', + de: 'Rückstoß in die Wand', + fr: 'Poussé(e) dans le mur', + ja: '壁へノックバック', + cn: '击退至墙', + ko: '넉백', + }, + }; + }, + }, + ], +}; + +export default triggerSet; diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts new file mode 100644 index 0000000000..2bdb8749ca --- /dev/null +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -0,0 +1,119 @@ +import Conditions from '../../../../../resources/conditions'; +import { Responses } from '../../../../../resources/responses'; +import ZoneId from '../../../../../resources/zone_id'; +import { RaidbossData } from '../../../../../types/data'; +import { PluginCombatantState } from '../../../../../types/event'; +import { TriggerSet } from '../../../../../types/trigger'; + +export interface Data extends RaidbossData { + readonly triggerSetConfig: { + stackOrder: 'meleeRolesPartners' | 'rolesPartners'; + }; + combatantData: PluginCombatantState[]; +} + +const triggerSet: TriggerSet = { + id: 'AnotherAloaloIsland', + zoneId: ZoneId.AnotherAloaloIsland, + timelineFile: 'another_aloalo_island.txt', + initData: () => { + return { + combatantData: [], + }; + }, + triggers: [ + // ---------------- first trash ---------------- + { + id: 'AAI Kiwakin Lead Hook', + type: 'StartsUsing', + netRegex: { id: '8C6E', source: 'Aloalo Kiwakin' }, + response: (data, matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + tankBusterOnYou: { + en: '3x Tankbuster on YOU', + }, + tankBusterOnPlayer: { + en: '3x Tankbuster on ${player}', + }, + }; + + if (matches.target === data.me) + return { alertText: output.tankBusterOnYou!() }; + const target = data.ShortName(matches.target); + return { infoText: output.tankBusterOnPlayer!({ player: target }) }; + }, + }, + { + id: 'AAI Kiwakin Sharp Strike', + type: 'StartsUsing', + netRegex: { id: '8C63', source: 'Aloalo Kiwakin' }, + response: Responses.tankBuster(), + }, + { + id: 'AAI Kiwakin Tail Screw', + type: 'StartsUsing', + // This is a baited targeted circle. + netRegex: { id: '8BB8', source: 'Aloalo Kiwakin', capture: false }, + response: Responses.moveAway(), + }, + { + id: 'AAI Snipper Water III', + type: 'StartsUsing', + netRegex: { id: '8C64', source: 'Aloalo Snipper' }, + response: Responses.stackMarkerOn(), + }, + { + id: 'AAI Snipper Bubble Shower', + type: 'StartsUsing', + netRegex: { id: '8BB9', source: 'Aloalo Snipper', capture: false }, + response: Responses.getBackThenFront(), + }, + { + id: 'AAI Snipper Crab Dribble', + type: 'Ability', + // Crab Dribble 8BBA has a fast cast, so trigger on Bubble Shower ability + netRegex: { id: '8BB9', source: 'Aloalo Snipper', capture: false }, + response: Responses.goFront('info'), + }, + { + id: 'AAI Ray Hydrocannon', + type: 'StartsUsing', + netRegex: { id: '8BBD', source: 'Aloalo Ray', capture: false }, + response: Responses.getBehind(), + }, + { + id: 'AAI Ray Electric Whorl', + type: 'StartsUsing', + netRegex: { id: '8BBE', source: 'Aloalo Ray', capture: false }, + response: Responses.getUnder(), + }, + { + id: 'AAI Monk Hydroshot', + type: 'StartsUsing', + netRegex: { id: '8BBE', source: 'Aloalo Monk' }, + condition: Conditions.targetIsYou(), + response: Responses.knockbackOn(), + }, + { + id: 'AAI Monk Cross Attack', + type: 'StartsUsing', + netRegex: { id: '8BBB', source: 'Aloalo Monk' }, + response: Responses.tankBuster(), + }, + // ---------------- Ketuduke ---------------- + ], + timelineReplace: [ + { + locale: 'en', + replaceText: { + 'Hydrobullet/Hydrofall': 'Hydrobullet/fall', + 'Hydrofall/Hydrobullet': 'Hydrofall/bullet', + 'Receding Twintides/Encroaching Twintides': 'Receding/Encroaching Twintides', + 'Far Tide/Near Tide': 'Far/Near Tide', + }, + }, + ], +}; + +export default triggerSet; diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt new file mode 100644 index 0000000000..2948f2c44a --- /dev/null +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -0,0 +1,143 @@ +### ANOTHER ALOALO ISLAND +# ZoneId: 49B + +hideall "--Reset--" +hideall "--sync--" + +0.0 "--Reset--" sync / 00:0839::.*is no longer sealed/ window 100000 jump 0 + +#~~~~~~~~~~# +# KETUDUKE # +#~~~~~~~~~~# + +# -p 8AD4:1015.2 +# -ii 8AA7 8AD5 8AAE 8AB9 8AB6 8AD1 8ABE 8ABF 8AC9 8ACB 8AC0 8AAA 8AA9 8AC6 8AC8 8AC3 8A82 8A83 + +1000.0 "--sync--" sync / 00:0839::The Dawn Trial will be sealed off/ window 10000,0 +1010.2 "--sync--" sync / 14:[^:]*:Ketuduke:8AD4:/ window 20,20 +1015.2 "Tidal Roar" sync / 1[56]:[^:]*:Ketuduke:8AD4:/ + +1022.0 "--middle--" sync / 1[56]:[^:]*:Ketuduke:8A77:/ +1027.0 "Spring Crystals 1" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ +1034.0 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ +1041.0 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB8|8AB4):/ +1050.0 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:8AB1:/ +1060.0 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:8AB2:/ +1062.0 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:8AB3:/ +1065.0 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8AAC:/ +1065.1 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(8ABA|8AB7):/ + +1074.0 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB4|8AB8):/ +1077.1 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8C6D|8AB5):/ +1084.3 "Blowing Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABD:/ +1091.4 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:8AD0:/ +1096.3 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8AB7|8ABA):/ +1099.6 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:8AD0:/ +1102.5 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8ABA|8AB7):/ + +1113.6 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ +1118.9 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABB:/ +1130.3 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(8ACC|8ACE):/ +1130.9 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:8ABC:/ +1133.4 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(8ACF|8ACD):/ +1134.0 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:8ABC:/ +1134.0 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8AB7:/ + +1143.7 "Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB8:/ +1149.7 "Roar" sync / 1[56]:[^:]*:Ketuduke:8AC4:/ +1154.6 "Spring Crystals 2" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ +1164.6 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AC5:/ +1177.0 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:8ABA:/ +1177.6 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8AAC:/ +1182.7 "Updraft" sync / 1[56]:[^:]*:Ketuduke:8AC7:/ +1184.1 "Hundred Lashings" sync / 1[56]:[^:]*:Aloalo Zaratan:8ACA:/ + +1190.7 "--middle--" sync / 1[56]:[^:]*:Ketuduke:8A77:/ +# TODO: this is probably either/or +1199.4 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ +1202.4 "Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:8C6D:/ +1210.4 "Angry Seas" sync / 1[56]:[^:]*:Ketuduke:8AC1:/ +1211.6 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8AB7:/ +1212.2 "Hydrobullet" sync / 1[56]:[^:]*:[^:]*:8ABA:/ # this sometimes has the wrong source +1214.8 "Spring Crystals 3" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ +1216.8 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:8ABA:/ +1221.8 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ +1227.8 "Fluke Typhoon (cast)" sync / 1[56]:[^:]*:Ketuduke:8AAF:/ +1233.8 "Fluke Typhoon" sync / 1[56]:[^:]*:Ketuduke:8AB0:/ +1236.4 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8AAB:/ +1238.8 "Burst x4" sync / 1[56]:[^:]*:Ketuduke:8AC2:/ +# ??? + +# ALL ENCOUNTER ABILITIES +# 8A77 --sync-- Ketuduke repositioning +# 8A82 Riptide ability on players from Angry Seas Airy Bubble when you step in one +# 8A83 Fetters ability on players from Angry Seas Airy Bubble when you step in one after 8A82 Riptide +# 8AA7 --sync-- auto damage from Ketuduke +# 8AA8 Spring Crystals cast and ability to summon Spring Crystal adds (all flavors) +# 8AA9 衝撃 self-targeted ability from Spring Crystal orbs +# 8AAA 衝撃 self-targeted ability from Spring Crystal rupees +# 8AAB Saturate cast and damage from Spring Crystal orb circle +# 8AAC Saturate cast and damage from Spring Crystal rupee line laser +# 8AAD Bubble Net self-targeted cast before Bubbles along with 8AAE during Spring Crystals 1 +# 8AAE Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 1 +# 8AAF Fluke Typhoon self-targeted cast before 8AB0 knockback during Spring Crystals 3 +# 8AB0 Fluke Typhoon cast and knockback ability on Spring Crystal and players during Spring Crystals 3 +# 8AB1 Fluke Gale self-targeted cast that adds limit cut winds +# 8AB2 Fluke Gale cast and ability for limit cut 1 wind +# 8AB3 Fluke Gale cast and ability for limit cut 2 wind +# 8AB4 Hydrofall self-targeted cast that adds stack markers +# 8AB5 Hydrofall ability on players to give "stack second" before Blowing Bubbles +# 8AB6 Hydrofall ability on players that adds stack debuffs +# 8AB7 Hydrofall damage from stack debuuffs +# 8AB8 Hydrobullet self-targeted cast that adds stack markers +# 8AB9 Hydrobullet ability on players that adds spread debuffs +# 8ABA Hydrobullet damage from spread debuffs +# 8ABB Strewn Bubbles self-targeted cast before 8ABC Sphere Shatter moving arches +# 8ABC Sphere Shatter damage from moving arches +# 8ABD Blowing Bubbles self-targeted cast that adds Airy Bubble Adds +# 8ABE Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one +# 8ABF Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after 8ABE Riptide +# 8AC0 Angry Seas cast and self-targeted ability for 8AC1 red line knockback +# 8AC1 Angry Seas cast and knockback damage from red line +# 8AC2 Burst tower damage +# 8AC3 Big Burst tower failure damage +# 8AC4 Roar self-targeted cast that summons Zaratan adds +# 8AC5 Bubble Net self-targeted cast before Bubbles along with 8AC6 during Spring Crystals 2 +# 8AC6 Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 2 +# 8AC7 Updraft self-targeted cast to boost adds and players into the air +# 8AC8 Updraft ability on players for 8AC7 Updraft +# 8AC9 Hundred Lashings cast and damage for non-bubbled Zaratan 180 cleave (no damage on bubbled players) +# 8ACA Hundred Lashings cast and self-targeted ability for bubbled Zaratan adds +# 8ACB Hundred Lashings cast and damage for bubbled Zaratan 180 cleave (no damage on non-bubbled players) +# 8ACC Receding Twintides cast and damage for initial out during out->in +# 8ACD Near Tide fast cast and damage for second out during in->out with 8ACE Encroaching Twintides +# 8ACE Encroaching Twintides cast and damage for initial in during in->out +# 8ACF Far Tide fast cast and damage for second in during out->in with 8ACC Receding Twintides +# 8AD0 Hydrobomb self-targeted cast for 8AD1 puddles +# 8AD1 Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles +# 8AD4 Tidal Roar self-targeted cast for raidwide aoe +# 8AD5 Tidal Roar damage from 8AD4 +# 8C6D Hydrobullet ability on players to give "spread second" before Blowing Bubbles + + + +#~~~~~~~~~# +# TRASH 1 # +#~~~~~~~~~# + +# ALL ENCOUNTER ABILITIES +# 7A56 --sync-- various auto damage (trash 1) +# 8BC0 --sync-- damage from Twister tornados +# 8C6E Lead Hook casted damage from Kiwakin 3x tankbuster +# 8C62 Lead Hook damage from hit 2 +# 8C53 Lead Hook damage from hit 3 +# 8C64 Water III casted damage from Snipper stack marker +# 8C63 Sharp Strike casted damage from Kiwakin tank buster with a concussion dot +# 8BB8 Tail Screw casted damage from Kiwakin baited circle +# 8BB9 Bubble Shower casted damage from Snipper front conal +# 8BBA Crab Dribble fast casted damage from Snipper back conal after Bubble Shower 8BB9 +# 8BBD Hydrocannon casted damage from Ray front line +# 8BBF Expulsion casted damage from Ray "get out" +# 8BBE Electric Whorl casted damage from Ray "get in" +# 8C65 Hydroshot casted damage from Monk knockback line with a dot +# 8BBB Cross Attack casted damage from Monk tankbuster From 4c853444f7e52525b218af0b863512559224d864 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 1 Nov 2023 18:36:39 -0700 Subject: [PATCH 02/39] basic ketuduke triggers --- .../06-ew/dungeon/another_aloalo_island.ts | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 2bdb8749ca..b6671ccdf9 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -1,4 +1,5 @@ import Conditions from '../../../../../resources/conditions'; +import Outputs from '../../../../../resources/outputs'; import { Responses } from '../../../../../resources/responses'; import ZoneId from '../../../../../resources/zone_id'; import { RaidbossData } from '../../../../../types/data'; @@ -10,6 +11,8 @@ export interface Data extends RaidbossData { stackOrder: 'meleeRolesPartners' | 'rolesPartners'; }; combatantData: PluginCombatantState[]; + ketuSpringCrystalCount: number; + ketuHydroBuffCount: number; } const triggerSet: TriggerSet = { @@ -19,6 +22,8 @@ const triggerSet: TriggerSet = { initData: () => { return { combatantData: [], + ketuSpringCrystalCount: 0, + ketuHydroBuffCount: 0, }; }, triggers: [ @@ -102,6 +107,88 @@ const triggerSet: TriggerSet = { response: Responses.tankBuster(), }, // ---------------- Ketuduke ---------------- + { + id: 'AAI Ketuduke Tidal Roar', + type: 'StartsUsing', + netRegex: { id: '8AD4', source: 'Ketuduke', capture: false }, + response: Responses.bleedAoe(), + }, + { + id: 'AAI Ketuduke Foamy Fetters', + type: 'GainsEffect', + netRegex: { effectId: 'ECC' }, + condition: Conditions.targetIsYou(), + alertText: (_data, _matches, output) => output.text!(), + outputStrings: { + text: { + en: 'Fetters', + }, + }, + }, + { + id: 'AAI Ketuduke Bubble Weave', + type: 'GainsEffect', + netRegex: { effectId: 'E9F' }, + condition: Conditions.targetIsYou(), + alertText: (_data, _matches, output) => output.text!(), + outputStrings: { + text: { + en: 'Bubble', + }, + }, + }, + { + id: 'AAI Ketuduke Hydro Buff Counter', + type: 'StartsUsing', + // 8AB8 = Hydrobullet (spread) + // 8AB4 = Hydrofall (stack) + netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke', capture: false }, + run: (data) => data.ketuHydroBuffCount++, + }, + { + id: 'AAI Ketuduke Hydro Buff 1', + type: 'StartsUsing', + netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, + condition: (data) => data.ketuHydroBuffCount === 1, + alertText: (_data, matches, output) => { + return matches.id === '8AB8' ? output.spread!() : output.stacks!(); + }, + outputStrings: { + spread: Outputs.spread, + stacks: { + en: 'Stacks', + }, + }, + }, + { + id: 'AAI Ketuduke Hydro Buff 2', + type: 'StartsUsing', + netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, + condition: (data) => data.ketuHydroBuffCount === 2, + alertText: (_data, matches, output) => { + return matches.id === '8AB8' ? output.spread!() : output.stacks!(); + }, + outputStrings: { + spread: { + en: 'Spread => Stacks', + }, + stacks: { + en: 'Stacks => Spread', + }, + }, + }, + { + id: 'AAI Ketuduke Receding Twintides', + type: 'StartsUsing', + netRegex: { id: '8ACC', source: 'Ketuduke', capture: false }, + response: Responses.getOutThenIn(), + }, + { + id: 'AAI Ketuduke Encroaching Twintides', + type: 'StartsUsing', + netRegex: { id: '8ACE', source: 'Ketuduke', capture: false }, + response: Responses.getInThenOut(), + }, ], timelineReplace: [ { From 7a01057fe414ddbc09abed276585b9010c3df18f Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Sat, 4 Nov 2023 18:14:27 -0700 Subject: [PATCH 03/39] speculative spring crystals 1 + 2 --- .../06-ew/dungeon/another_aloalo_island.ts | 27 ++- .../06-ew/dungeon/another_aloalo_island.ts | 168 +++++++++++++++++- 2 files changed, 192 insertions(+), 3 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts index dfa67a2e31..2699203897 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts @@ -1,12 +1,34 @@ import NetRegexes from '../../../../../resources/netregexes'; import ZoneId from '../../../../../resources/zone_id'; import { OopsyData } from '../../../../../types/data'; -import { OopsyTriggerSet } from '../../../../../types/oopsy'; +import { OopsyMistakeType, OopsyTrigger, OopsyTriggerSet } from '../../../../../types/oopsy'; // TODO: people who missed their 8AC2 Burst tower export type Data = OopsyData; +// TODO: we could probably move this helper to some oopsy util. +const nonzeroDamageMistake = ( + triggerId: string, + abilityId: string | string[], + type: OopsyMistakeType, +): OopsyTrigger => { + return { + id: triggerId, + type: 'Ability', + netRegex: NetRegexes.ability({ id: abilityId }), + condition: (data, matches) => data.DamageFromMatches(matches) > 0, + mistake: (_data, matches) => { + return { + type: type, + blame: matches.target, + reportId: matches.targetId, + text: matches.ability, + }; + }, + }; +}; + const triggerSet: OopsyTriggerSet = { zoneId: ZoneId.AnotherAloaloIsland, damageWarn: { @@ -36,8 +58,8 @@ const triggerSet: OopsyTriggerSet = { 'AAI Hydrobullet': '8ABA', // spread debuffs }, soloWarn: { - 'AAI Hydrofall': '8AB7', // partner stack debuffs 'AAI Snipper Water III': '8C64', // Snipper stack marker + 'AAI Hydrofall': '8AB7', // partner stack debuffs }, triggers: [ { @@ -60,6 +82,7 @@ const triggerSet: OopsyTriggerSet = { }; }, }, + nonzeroDamageMistake('AAI Hundred Lashings', ['8AC9', '8ACB'], 'warn'), ], }; diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index b6671ccdf9..4704e68442 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -4,17 +4,29 @@ import { Responses } from '../../../../../resources/responses'; import ZoneId from '../../../../../resources/zone_id'; import { RaidbossData } from '../../../../../types/data'; import { PluginCombatantState } from '../../../../../types/event'; +import { NetMatches } from '../../../../../types/net_matches'; import { TriggerSet } from '../../../../../types/trigger'; +// TODO: use code from AMR to handle cases of "role stacks" when somebody is dead +// TODO: switch crystals 1 to always tell you what fetters do + export interface Data extends RaidbossData { readonly triggerSetConfig: { stackOrder: 'meleeRolesPartners' | 'rolesPartners'; }; combatantData: PluginCombatantState[]; ketuSpringCrystalCount: number; + ketuCrystalAdd: NetMatches['AddedCombatant'][]; ketuHydroBuffCount: number; + ketuBuff?: 'bubble' | 'fetters'; } +// Horizontal crystals have a heading of 0, vertical crystals are -pi/2. +const isHorizontalCrystal = (line: NetMatches['AddedCombatant']) => { + const epsilon = 0.1; + return Math.abs(parseFloat(line.heading)) < epsilon; +}; + const triggerSet: TriggerSet = { id: 'AnotherAloaloIsland', zoneId: ZoneId.AnotherAloaloIsland, @@ -23,6 +35,7 @@ const triggerSet: TriggerSet = { return { combatantData: [], ketuSpringCrystalCount: 0, + ketuCrystalAdd: [], ketuHydroBuffCount: 0, }; }, @@ -113,12 +126,28 @@ const triggerSet: TriggerSet = { netRegex: { id: '8AD4', source: 'Ketuduke', capture: false }, response: Responses.bleedAoe(), }, + { + id: 'AAI Ketuduke Spring Crystals', + type: 'StartsUsing', + netRegex: { id: '8AA8', source: 'Ketuduke', capture: false }, + run: (data) => { + data.ketuSpringCrystalCount++; + data.ketuCrystalAdd = []; + }, + }, + { + id: 'AAI Ketuduke Spring Crystal Collect', + type: 'AddedCombatant', + netRegex: { npcNameId: '12607' }, + run: (data, matches) => data.ketuCrystalAdd.push(matches), + }, { id: 'AAI Ketuduke Foamy Fetters', type: 'GainsEffect', netRegex: { effectId: 'ECC' }, condition: Conditions.targetIsYou(), alertText: (_data, _matches, output) => output.text!(), + run: (data) => data.ketuBuff = 'fetters', outputStrings: { text: { en: 'Fetters', @@ -131,6 +160,7 @@ const triggerSet: TriggerSet = { netRegex: { effectId: 'E9F' }, condition: Conditions.targetIsYou(), alertText: (_data, _matches, output) => output.text!(), + run: (data) => data.ketuBuff = 'bubble', outputStrings: { text: { en: 'Bubble', @@ -147,10 +177,90 @@ const triggerSet: TriggerSet = { }, { id: 'AAI Ketuduke Hydro Buff 1', + comment: { + en: `These directions assume that you always pick a square in the same + quadrant as the crystal specified. + For brevity, "next to" always means horizontal east/west of something. + The number in parentheses is the limit cut wind you should be on.`, + }, type: 'StartsUsing', netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, condition: (data) => data.ketuHydroBuffCount === 1, - alertText: (_data, matches, output) => { + durationSeconds: 8, + alertText: (data, matches, output) => { + // If somebody died and missed a debuff, good luck. + if (data.ketuBuff === undefined) + return; + + // Bubble always does the same thing. + if (data.ketuBuff === 'bubble') + return output.bubble!(); + + // Two layouts, one with each crystal in its own column ("split") + // and one with two columns that have an H and a V in that same column ("columns"). + // Wind doesn't matter, as "1" will always be on the horizontal crystals. + // + // STACK FETTERS COLUMNS (kitty to horizontal) + // stack, counter_nw2 + // 2 2 + // + - - - - + + - - - - + + // | V f | 1 | H f | 1 + // | H b | => | V | + // | H b | | V | + // 1 | f V | 1 | H f | + // + - - - - + + - - - - + + // 2 2 + // + // STACK FETTERS SPLIT (on horizontal) + // stack, clock_nw1 + // 2 2 + // + - - - - + + - - - - + + // 1 | V | 1 | V | + // | H b | => | f H | + // | V | | V | + // | b H | 1 | H f | 1 + // + - - - - + + - - - - + + // 2 2 + // + // SPREAD FETTERS COLUMNS (adjacent to vertical) + // spread, counter_nw2 + // 2 2 + // + - - - - + + - - - - + + // | V f | 1 | f H b | 1 + // | H b | => | V | + // | H b | | V | + // 1 | V f | 1 | H b f | + // + - - - - + + - - - - + + // 2 2 + // + // SPREAD FETTERS SPLIT (kitty to vertical) + // spread, counter_nw2 + // 2 2 + // + - - - - + + - - - - + + // | V | 1 | V | 1 + // | f b H | => | f H b | + // | V | | V | + // 1 | H b f | 1 | b H f | + // + - - - - + + - - - - + + // 2 2 + + const isSpread = matches.id === '8AB8'; + const horizontal = data.ketuCrystalAdd.filter((x) => isHorizontalCrystal(x)); + const vertical = data.ketuCrystalAdd.filter((x) => !isHorizontalCrystal(x)); + + const [firstHorizontal] = horizontal; + if (horizontal.length !== 2 || vertical.length !== 2 || firstHorizontal === undefined) + return; + const firstHorizX = parseFloat(firstHorizontal.x); + // It's split if no vertical is in the same column as either horizontal. + const isSplitLayout = + vertical.find((line) => Math.abs(parseFloat(line.x) - firstHorizX) < 1) === undefined; + + if (isSpread) + return isSplitLayout ? output.fettersSpreadSplit!() : output.fettersSpreadColumn!(); + return isSplitLayout ? output.fettersStackSplit!() : output.fettersStackColumn!(); + }, + infoText: (_data, matches, output) => { return matches.id === '8AB8' ? output.spread!() : output.stacks!(); }, outputStrings: { @@ -158,6 +268,21 @@ const triggerSet: TriggerSet = { stacks: { en: 'Stacks', }, + bubble: { + en: 'Next to Horizontal (1)', + }, + fettersSpreadSplit: { + en: 'Diagonal of Vertical (2)', + }, + fettersSpreadColumn: { + en: 'Next to Vertical (2)', + }, + fettersStackSplit: { + en: 'On Horizontal (1)', + }, + fettersStackColumn: { + en: 'Diagonal of Horizontal (1)', + }, }, }, { @@ -189,6 +314,47 @@ const triggerSet: TriggerSet = { netRegex: { id: '8ACE', source: 'Ketuduke', capture: false }, response: Responses.getInThenOut(), }, + { + id: 'AAI Ketuduke Spring Crystals 2', + type: 'AddedCombatant', + netRegex: { npcNameId: '12607', capture: false }, + condition: (data) => data.ketuSpringCrystalCount === 2 && data.ketuCrystalAdd.length === 4, + alertText: (data, _matches, output) => { + const horizontal = data.ketuCrystalAdd.filter((x) => isHorizontalCrystal(x)); + const vertical = data.ketuCrystalAdd.filter((x) => !isHorizontalCrystal(x)); + if (horizontal.length !== 2 || vertical.length !== 2) + return; + + // Crystal positions are always -15, -5, 5, 15. + + // Check if any verticals are on the outer vertical edges. + for (const line of vertical) { + const y = parseFloat(line.y); + if (y < -10 || y > 10) + return output.eastWestSafe!(); + } + + // Check if any horizontals are on the outer horizontal edges. + for (const line of horizontal) { + const x = parseFloat(line.x); + if (x < -10 || x > 10) + return output.northSouthSafe!(); + } + + return output.cornersSafe!(); + }, + outputStrings: { + northSouthSafe: { + en: 'North/South', + }, + eastWestSafe: { + en: 'East/West', + }, + cornersSafe: { + en: 'Corners', + }, + }, + }, ], timelineReplace: [ { From 4c970ae2ac7dce3740d427433169d62b2c528a29 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 7 Nov 2023 13:38:40 -0800 Subject: [PATCH 04/39] first trash fixes --- ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 4704e68442..ff6c59001a 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -9,6 +9,7 @@ import { TriggerSet } from '../../../../../types/trigger'; // TODO: use code from AMR to handle cases of "role stacks" when somebody is dead // TODO: switch crystals 1 to always tell you what fetters do +// TODO: say who is your bubble/fetters partner (esp for sc2) export interface Data extends RaidbossData { readonly triggerSetConfig: { @@ -92,6 +93,7 @@ const triggerSet: TriggerSet = { type: 'Ability', // Crab Dribble 8BBA has a fast cast, so trigger on Bubble Shower ability netRegex: { id: '8BB9', source: 'Aloalo Snipper', capture: false }, + suppressSeconds: 5, response: Responses.goFront('info'), }, { @@ -100,6 +102,12 @@ const triggerSet: TriggerSet = { netRegex: { id: '8BBD', source: 'Aloalo Ray', capture: false }, response: Responses.getBehind(), }, + { + id: 'AAI Ray Expulsion', + type: 'StartsUsing', + netRegex: { id: '8BBF', source: 'Aloalo Ray', capture: false }, + response: Responses.getOut(), + }, { id: 'AAI Ray Electric Whorl', type: 'StartsUsing', From 87df3ce13f69bbc57ad604ee574e03d5cf125128 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 7 Nov 2023 13:52:37 -0800 Subject: [PATCH 05/39] ketuduke fixups --- .../06-ew/dungeon/another_aloalo_island.ts | 3 ++- .../06-ew/dungeon/another_aloalo_island.txt | 26 +++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index ff6c59001a..124c732a2c 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -193,7 +193,7 @@ const triggerSet: TriggerSet = { }, type: 'StartsUsing', netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, - condition: (data) => data.ketuHydroBuffCount === 1, + condition: (data) => data.ketuHydroBuffCount === 1 || data.ketuHydroBuffCount === 6, durationSeconds: 8, alertText: (data, matches, output) => { // If somebody died and missed a debuff, good luck. @@ -325,6 +325,7 @@ const triggerSet: TriggerSet = { { id: 'AAI Ketuduke Spring Crystals 2', type: 'AddedCombatant', + // This calls absurdly early. <_< netRegex: { npcNameId: '12607', capture: false }, condition: (data) => data.ketuSpringCrystalCount === 2 && data.ketuCrystalAdd.length === 4, alertText: (data, _matches, output) => { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index 2948f2c44a..35b67b842b 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -53,12 +53,11 @@ hideall "--sync--" 1184.1 "Hundred Lashings" sync / 1[56]:[^:]*:Aloalo Zaratan:8ACA:/ 1190.7 "--middle--" sync / 1[56]:[^:]*:Ketuduke:8A77:/ -# TODO: this is probably either/or -1199.4 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ -1202.4 "Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:8C6D:/ +1199.4 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB4|8AB8):/ +1202.4 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8C6D|8AB5):/ 1210.4 "Angry Seas" sync / 1[56]:[^:]*:Ketuduke:8AC1:/ -1211.6 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8AB7:/ -1212.2 "Hydrobullet" sync / 1[56]:[^:]*:[^:]*:8ABA:/ # this sometimes has the wrong source +1211.6 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8AB7|8ABA):/ +1212.2 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:[^:]*:(8ABA|8AB7):/ # this sometimes has the wrong source 1214.8 "Spring Crystals 3" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ 1216.8 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:8ABA:/ 1221.8 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ @@ -66,6 +65,23 @@ hideall "--sync--" 1233.8 "Fluke Typhoon" sync / 1[56]:[^:]*:Ketuduke:8AB0:/ 1236.4 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8AAB:/ 1238.8 "Burst x4" sync / 1[56]:[^:]*:Ketuduke:8AC2:/ + +1246.7 "Spring Crystals 4" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ +1253.7 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ +1260.7 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB8|8AB4):/ +1269.8 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:8AB1:/ +1279.9 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:8AB2:/ +1281.9 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:8AB3:/ +1284.9 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8AAC:/ +1285.0 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(8ABA|8AB7):/ + +1293.9 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ +1299.2 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABB:/ +1310.6 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(8ACC|8ACE):/ +1311.2 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:8ABC:/ +1313.7 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(8ACF|8ACD):/ +1314.3 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:8ABC:/ +1314.3 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8AB7:/ # ??? # ALL ENCOUNTER ABILITIES From acd0a44d850b6de6c359f82d9bf654f4aefb7d04 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 7 Nov 2023 16:03:33 -0800 Subject: [PATCH 06/39] trash 2 --- .../06-ew/dungeon/another_aloalo_island.ts | 6 ++ .../06-ew/dungeon/another_aloalo_island.ts | 67 +++++++++++++++++++ .../06-ew/dungeon/another_aloalo_island.txt | 16 +++++ 3 files changed, 89 insertions(+) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts index 2699203897..6637da06de 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts @@ -50,16 +50,22 @@ const triggerSet: OopsyTriggerSet = { 'AAI Encroaching Twintides': '8ACE', // initial in during in->out 'AAI Far Tide': '8ACF', // second in during out->in with 8ACC Receding Twintides 'AAI Hydrobomb': '8AD1', // 3x puddles duruing 8ABD Blowing Bubbles + + // Trash 2 + 'AAI Wood Golem Ovation': '8BC1', // front line aoe + 'AAI Islekeeper Isle Drop': '8C6F', // front circle }, damageFail: { 'AAI Big Burst': '8AC3', // tower failure damage }, shareWarn: { 'AAI Hydrobullet': '8ABA', // spread debuffs + 'AAI Wood Golem Tornado': '8C4D', // headmarker -> bind and heavy aoe }, soloWarn: { 'AAI Snipper Water III': '8C64', // Snipper stack marker 'AAI Hydrofall': '8AB7', // partner stack debuffs + 'AAI Islekeeper Gravity Force': '8BC5', // stack }, triggers: [ { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 124c732a2c..64decb5d11 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -10,6 +10,7 @@ import { TriggerSet } from '../../../../../types/trigger'; // TODO: use code from AMR to handle cases of "role stacks" when somebody is dead // TODO: switch crystals 1 to always tell you what fetters do // TODO: say who is your bubble/fetters partner (esp for sc2) +// TODO: sc3 should say which bubble to take to the other side (for everyone) export interface Data extends RaidbossData { readonly triggerSetConfig: { @@ -364,6 +365,72 @@ const triggerSet: TriggerSet = { }, }, }, + // ---------------- second trash ---------------- + { + id: 'AAI Wood Golem Ancient Aero III', + type: 'StartsUsing', + netRegex: { id: '8C4C', source: 'Aloalo Wood Golem' }, + condition: (data) => data.CanSilence(), + response: Responses.interrupt('alarm'), + }, + { + id: 'AAI Wood Golem Tornado', + type: 'StartsUsing', + netRegex: { id: '8C4D', source: 'Aloalo Wood Golem' }, + response: Responses.interrupt('alarm'), + }, + { + id: 'AAI Wood Golem Tornado Bind', + type: 'GainsEffect', + netRegex: { effectId: 'EC0' }, + condition: (data) => data.CanCleanse(), + infoText: (data, matches, output) => output.text!({ player: data.ShortName(matches.target) }), + outputStrings: { + text: { + en: 'Esuna ${player}', + de: 'Medica ${player}', + fr: 'Guérison sur ${player}', + ja: 'エスナ: ${player}', + cn: '解除死亡宣告: ${player}', + ko: '${player} 에스나', + }, + }, + }, + { + id: 'AAI Wood Golem Ovation', + type: 'StartsUsing', + netRegex: { id: '8BC1', source: 'Aloalo Wood Golem', capture: false }, + response: Responses.getBehind('info'), + }, + { + id: 'AAI Islekeeper Gravity Force', + type: 'StartsUsing', + netRegex: { id: '8BC5', source: 'Aloalo Islekeeper' }, + response: Responses.stackMarkerOn(), + }, + { + id: 'AAI Islekeeper Isle Drop', + type: 'StartsUsing', + netRegex: { id: '8C6F', source: 'Aloalo Islekeeper', capture: false }, + response: Responses.getBehind('info'), + }, + { + id: 'AAI Islekeeper Ancient Quaga', + type: 'StartsUsing', + netRegex: { id: '8C4E', source: 'Aloalo Islekeeper', capture: false }, + response: Responses.aoe(), + }, + { + id: 'AAI Islekeeper Ancient Quaga Enrage', + type: 'StartsUsing', + netRegex: { id: '8C2F', source: 'Aloalo Islekeeper', capture: false }, + alarmText: (_data, _matches, output) => output.text!(), + outputStrings: { + text: { + en: 'Kill Islekeeper!', + }, + }, + }, ], timelineReplace: [ { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index 35b67b842b..e315f606f7 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -157,3 +157,19 @@ hideall "--sync--" # 8BBE Electric Whorl casted damage from Ray "get in" # 8C65 Hydroshot casted damage from Monk knockback line with a dot # 8BBB Cross Attack casted damage from Monk tankbuster + +#~~~~~~~~~# +# TRASH 2 # +#~~~~~~~~~# + +# TODO: does Wood Golem have an enrage?? + +# ALL ENCOUNTER ABILITIES +# 7A58 --sync-- various auto damage (trash 2) +# 8BC1 Ovation cast and damage from Wood Golem front line aoe +# 8BC5 Gravity Force cast and stack damage from Islekeeper +# 8C2F Ancient Quaga cast and damage for Islekeeper raidwide enrage +# 8C4C Ancient Aero III interruptable cast and damage for Wood Golem raidwide +# 8C4D Tornado cast and damage from Wood Golem that binds the initial target and heavies all targets +# 8C4E Ancient Quaga cast and damage for Islekeeper raidwide +# 8C6F Isle Drop cast and damage for Islekeeper front circle From da9eac1f464073b640eaaeee1d4861d6e880e259 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 7 Nov 2023 16:06:58 -0800 Subject: [PATCH 07/39] remove shortname --- ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts | 6 ++++-- ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 64decb5d11..1a4d5d3ef2 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -60,7 +60,7 @@ const triggerSet: TriggerSet = { if (matches.target === data.me) return { alertText: output.tankBusterOnYou!() }; - const target = data.ShortName(matches.target); + const target = data.party.member(matches.target); return { infoText: output.tankBusterOnPlayer!({ player: target }) }; }, }, @@ -384,7 +384,9 @@ const triggerSet: TriggerSet = { type: 'GainsEffect', netRegex: { effectId: 'EC0' }, condition: (data) => data.CanCleanse(), - infoText: (data, matches, output) => output.text!({ player: data.ShortName(matches.target) }), + infoText: (data, matches, output) => { + return output.text!({ player: data.party.member(matches.target) }); + }, outputStrings: { text: { en: 'Esuna ${player}', diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index e315f606f7..0db9128f6d 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -136,7 +136,6 @@ hideall "--sync--" # 8C6D Hydrobullet ability on players to give "spread second" before Blowing Bubbles - #~~~~~~~~~# # TRASH 1 # #~~~~~~~~~# From ff054a9bd58224b5873a2afceb1daef72e9657d7 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 7 Nov 2023 17:18:36 -0800 Subject: [PATCH 08/39] lala timeline and oopsy --- .../06-ew/dungeon/another_aloalo_island.ts | 31 ++++- .../06-ew/dungeon/another_aloalo_island.ts | 39 ++++++ .../06-ew/dungeon/another_aloalo_island.txt | 126 +++++++++++++++++- 3 files changed, 194 insertions(+), 2 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts index 6637da06de..e4dbf92bf2 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts @@ -4,6 +4,12 @@ import { OopsyData } from '../../../../../types/data'; import { OopsyMistakeType, OopsyTrigger, OopsyTriggerSet } from '../../../../../types/oopsy'; // TODO: people who missed their 8AC2 Burst tower +// TODO: failing 8894 Radiance orb damage during Analysis +// TODO: failing 8CDF Targeted Light during Analysis +// TODO: people who failed Subtractive Suppressor Alpha + Beta +// TODO: walking over 889B Arcane Combustion when you don't have Suppressor +// TODO: taking extra 8893 Inferno Divide squares during Spatial Tactics +// TODO: 01F7(success) and 01F8(fail) check and x markers? export type Data = OopsyData; @@ -54,19 +60,42 @@ const triggerSet: OopsyTriggerSet = { // Trash 2 'AAI Wood Golem Ovation': '8BC1', // front line aoe 'AAI Islekeeper Isle Drop': '8C6F', // front circle + + // Lala + 'AAI Arcane Blight': '888F', // 270 degree rotating cleave + 'AAI Bright Pulse 1': '8891', // initial blue square + 'AAI Bright Pulse 2': '8892', // moving blue square + 'AAI Arcane Mine': '889A', // initial Arcane Mine squares + 'AAI Golem Aero II': '88A4', // line damage from Aloalo Golem during Symmetric Surge + 'AAI Telluric Theorem': '88A9', // puddles from Explosive Theorem spreads }, damageFail: { 'AAI Big Burst': '8AC3', // tower failure damage + 'AAI Massive Explosion 1': '889C', // failing to resolve Subractive Suppressor Alpha + 'AAI Massive Explosion 2': '889D', // failing to resolve Subractive Suppressor Beta + }, + gainsEffectFail: { + // C03 = 9999 duration, ??? = 15s duration + 'AAI Dropsy': 'C03', // standing outside Ketuduke + // C05 = 9999 duration, C06 = 15s duration + 'AAI Bleeding': 'C05', // standing in blue square during Lala + // BF9 = 9999 duration, BFA??? = 15s duration + 'AAI Burns': 'BF9', // standing outside Lala }, shareWarn: { 'AAI Hydrobullet': '8ABA', // spread debuffs 'AAI Wood Golem Tornado': '8C4D', // headmarker -> bind and heavy aoe + 'AAI Powerful Light': '88A6', // spread marker during Symmetric Surge that turns squares blue + 'AAI Explosive Theorem': '88A8', // large spreads with Telluric Theorem puddles }, soloWarn: { 'AAI Snipper Water III': '8C64', // Snipper stack marker - 'AAI Hydrofall': '8AB7', // partner stack debuffs 'AAI Islekeeper Gravity Force': '8BC5', // stack }, + soloFail: { + 'AAI Hydrofall': '8AB7', // partner stack debuffs + 'AAI Symmetric Surge': '889E', // two person stack that gives magic vuln up + }, triggers: [ { // Getting knocked into a wall from the Angry Seas knockback diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 1a4d5d3ef2..d95f49f8d0 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -12,6 +12,45 @@ import { TriggerSet } from '../../../../../types/trigger'; // TODO: say who is your bubble/fetters partner (esp for sc2) // TODO: sc3 should say which bubble to take to the other side (for everyone) +// TODO: map effects for Lala + +/* +[21:58:30.784] StatusAdd 1A:E8E:Front Unseen:9999.00:40013A9C:Lala: +[21:58:30.784] StatusAdd 1A:E90:Right Unseen:9999.00:40013A9C:Lala: +[21:58:30.784] StatusAdd 1A:E8F:Back Unseen:9999.00:40013A9C:Lala: +[21:58:30.784] StatusAdd 1A:E91:Left Unseen:9999.00:40013A9C:Lala: +[21:58:40.884] StatusAdd 1A:E89:Times Three:9999.00:40013A9C:Lala: +[21:58:40.884] StatusAdd 1A:ECE:Times Five:9999.00:40013A9C:Lala: + +[21:58:14.124] StatusAdd 1A:F62:Times Three:9999.00:40013A9C:Lala:40013A9C:Lala:00:10634656:10634656 +[21:58:40.929] StatusAdd 1A:F63:Times Five:9999.00:40013A9C:Lala:40013A9C:Lala:00:10634656:10634656 + +[21:59:21.680] StatusAdd 1A:E8C:Subtractive Suppressor Alpha:22.00:40013A9C:Lala: +[22:00:14.578] StatusAdd 1A:E8D:Subtractive Suppressor Beta:23.00:40013A9C:Lala: + +[21:59:21.680] StatusAdd 1A:E83:Forward March:16.00:40013A9C:Lala: + +// boss counter +[21:58:15.372] TargetIcon 1B:40013A9C:Lala:0000:0000:01E5:0000:0000:0000 + +// boss clock +[21:58:42.181] TargetIcon 1B:40013A9C:Lala:0000:0000:01E4:0000:0000:0000 + +// player counter +// player clock +[21:58:45.757] TargetIcon 1B:_:_:0000:0000:01EE:0000:0000:0000 + +// player clock +[21:58:45.757] TargetIcon 1B:_:_:0000:0000:01ED:0000:0000:0000 +*/ + +/* +map effects +// initial edges after raidwide +[21:58:06.929] 257 101:8003908D:00020001:26:00:0000 + +*/ + export interface Data extends RaidbossData { readonly triggerSetConfig: { stackOrder: 'meleeRolesPartners' | 'rolesPartners'; diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index 0db9128f6d..bf218f9a4f 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -104,7 +104,7 @@ hideall "--sync--" # 8AB4 Hydrofall self-targeted cast that adds stack markers # 8AB5 Hydrofall ability on players to give "stack second" before Blowing Bubbles # 8AB6 Hydrofall ability on players that adds stack debuffs -# 8AB7 Hydrofall damage from stack debuuffs +# 8AB7 Hydrofall damage from stack debuffs # 8AB8 Hydrobullet self-targeted cast that adds stack markers # 8AB9 Hydrobullet ability on players that adds spread debuffs # 8ABA Hydrobullet damage from spread debuffs @@ -136,6 +136,130 @@ hideall "--sync--" # 8C6D Hydrobullet ability on players to give "spread second" before Blowing Bubbles +#~~~~~~# +# LALA # +#~~~~~~# + +# -p 88AE:2011.1 +# -ii 888F 8892 8CDF 889A 889B 88A8 889C 889D + +2000.0 "--sync--" sync / 00:0839::The Dusk Trial will be sealed off/ window 10000,0 +2006.1 "--sync--" sync / 14:[^:]*:Lala:88AE:/ window 20,20 +2011.1 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ + +2013.2 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ +2018.3 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8889|8D2E):/ +2026.4 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(888B|888C|888D|888E):/ + +2029.6 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ +2034.7 "Analysis" sync / 1[56]:[^:]*:Lala:8895:/ +2039.8 "Arcane Array 1" sync / 1[56]:[^:]*:Lala:8890:/ +2044.9 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8889|8D2E):/ +2045.6 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8891:/ +2046.9 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:8894:/ +2053.0 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(888B|888C|888D|888E):/ +# This can be +1.2s if it's on the final square instead of penultimate. +2054.1 "Radiance 2" #sync / 1[56]:[^:]*:Arcane Globe:8894:/ +2061.2 "Targeted Light" sync / 1[56]:[^:]*:Lala:8CDE:/ + +2072.5 "Strategic Strike" sync / 1[56]:[^:]*:Lala:88AD:/ + +2085.6 "Planar Tactics" sync / 1[56]:[^:]*:Lala:8898:/ +2100.7 "Arcane Mine" sync / 1[56]:[^:]*:Lala:8899:/ +2108.6 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:889E:/ + +2112.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ +2122.9 "Strategic Strike" sync / 1[56]:[^:]*:Lala:88AD:/ + +2131.1 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ +2138.3 "Spatial Tactics" sync / 1[56]:[^:]*:Lala:88A0:/ +2143.4 "Arcane Array 2" sync / 1[56]:[^:]*:Lala:889F:/ +2149.2 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8891:/ +2150.5 "Inferno Divide 1" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 +2150.5 "Radiance" sync / 1[56]:[^:]*:Arcane Globe:8D1F:/ +2152.9 "Inferno Divide 2" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 +2156.6 "Inferno Divide 3" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 +2157.6 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8889|8D2E):/ +2157.8 "Inferno Divide 4" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 +2160.2 "Inferno Divide 5" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 +2165.6 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(888B|888C|888D|888E):/ + +2173.7 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ +2184.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ + +2196.9 "Symmetric Surge" sync / 1[56]:[^:]*:Lala:88A1:/ +2202.0 "Constructive Figure" sync / 1[56]:[^:]*:Lala:88A3:/ +2207.1 "Arcane Plot" sync / 1[56]:[^:]*:Lala:88A2:/ +2212.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8891:/ +2221.2 "Arcane Point" sync / 1[56]:[^:]*:Lala:88A5:/ +2221.8 "Aero II" sync / 1[56]:[^:]*:Aloalo Golem:88A4:/ +2222.0 "Powerful Light" sync / 1[56]:[^:]*:Lala:88A6:/ +2230.3 "Explosive Theorem" sync / 1[56]:[^:]*:Lala:88A7:/ +2234.7 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:889E:/ +2235.4 "Telluric Theorem" sync / 1[56]:[^:]*:Lala:88A9:/ + +2248.4 "Strategic Strike" sync / 1[56]:[^:]*:Lala:88AD:/ +2256.5 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ + +2263.6 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ +2269.0 "Analysis" sync / 1[56]:[^:]*:Lala:8895:/ +2274.1 "Arcane Array 3" sync / 1[56]:[^:]*:Lala:8890:/ +2279.2 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8889|8D2E):/ +2279.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8891:/ +2281.2 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:8894:/ +2287.3 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(888B|888C|888D|888E):/ +2290.9 "Radiance 2" sync / 1[56]:[^:]*:Arcane Globe:8894:/ +2295.6 "Targeted Light" sync / 1[56]:[^:]*:Lala:8CDE:/ +2306.7 "Strategic Strike" sync / 1[56]:[^:]*:Lala:88AD:/ + +2316.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ + +2319.9 "--sync--" sync / 14:[^:]*:Lala:8C25:/ window 20,20 +2329.9 "Inferno Theorem Enrage" sync / 1[56]:[^:]*:Lala:8C25:/ + + +# ALL ENCOUNTER ABILITIES +# 368 attack auto damage from Lala +# 8874 --sync-- repositioning for Lala +# 8889 Angular Addition self-targeted ability to give boss III +# 888B Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave +# 888C Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave +# 888D Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave +# 888E Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave +# 888F Arcane Blight cast and damage from 270 degree rotating cleave +# 8890 Arcane Array self-targeted cast to summon moving blue squares (#1) +# 8891 Bright Pulse cast and damage for initial blue square +# 8892 Bright Pulse damage from moving blue square +# 8893 Inferno Divide orange square cross explosion damage during Spatial Tactics +# 8894 Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #1, #3) +# 8895 Analysis self-targeted cast before giving players +# 8898 Planar Tactics self-targeted cast before Arcane Mines +# 8899 Arcane Mine self-targeted cast to create 8 Arcane Mine squares +# 889A Arcane Mine cast and damage for initial Arcane Mine squares +# 889B Arcane Combustion damage from walking over an Arcane Mine +# 889C Massive Explosion damage from failing to resolve Subractive Suppressor Alpha +# 889D Massive Explosion damage from failing to resolve Subractive Suppressor Beta +# 889E Symmetric Surge damage from two person stack that gives magic vuln up +# 889F Arcane Array self-targeted cast to summon moving blue squares (#2) +# 88A0 Spatial Tactics self-targeted cast prior to Arcane Array 2 +# 88A1 Symmetric Surge self-targeted cast before this mechanic +# 88A2 Arcane Plot self-targeted cast to summon blue squares for Symmetric Surge +# 88A3 Constructive Figure self-targeted cast that summons Aloalo Golem on edge +# 88A4 Aero II cast and line damage from Aloalo Golem during Symmetric Surge +# 88A5 Arcane Point self-targeted cast that gives players 88A6 Powerful Light spreads +# 88A6 Powerful Light spread damage on players that turn the squares they are on blue +# 88A7 Explosive Theorem self-targeted cast for very large spreads +# 88A8 Explosive Theorem cast and damage on players for spreads with Telluric Theorem puddles +# 88A9 Telluric Theorem cast and damage for large puddles from Explosive Theorem +# 88AD Strategic Strike cast and damage for non-cleaving 3x tankbuster +# 88AE Inferno Theorem cast and raidwide damage +# 8C25 Inferno Theorem cast and enrage damage +# 8CDE Targeted Light self-targeted cast for weak spot boss tether +# 8CDF Targeted Light cast and damage on players for 8CDE +# 8D1F Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) +# 8D2E Angular Addition self-targeted ability to give boss V + + #~~~~~~~~~# # TRASH 1 # #~~~~~~~~~# From 13f2090bfc70d5b89f1271d28641b981ada49de6 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 7 Nov 2023 18:52:26 -0800 Subject: [PATCH 09/39] lala triggers --- .../06-ew/dungeon/another_aloalo_island.ts | 427 ++++++++++++++++-- 1 file changed, 396 insertions(+), 31 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index d95f49f8d0..9a5e364c20 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -11,39 +11,9 @@ import { TriggerSet } from '../../../../../types/trigger'; // TODO: switch crystals 1 to always tell you what fetters do // TODO: say who is your bubble/fetters partner (esp for sc2) // TODO: sc3 should say which bubble to take to the other side (for everyone) - +// TODO: figure out directions for Lala for Radiance orbs // TODO: map effects for Lala -/* -[21:58:30.784] StatusAdd 1A:E8E:Front Unseen:9999.00:40013A9C:Lala: -[21:58:30.784] StatusAdd 1A:E90:Right Unseen:9999.00:40013A9C:Lala: -[21:58:30.784] StatusAdd 1A:E8F:Back Unseen:9999.00:40013A9C:Lala: -[21:58:30.784] StatusAdd 1A:E91:Left Unseen:9999.00:40013A9C:Lala: -[21:58:40.884] StatusAdd 1A:E89:Times Three:9999.00:40013A9C:Lala: -[21:58:40.884] StatusAdd 1A:ECE:Times Five:9999.00:40013A9C:Lala: - -[21:58:14.124] StatusAdd 1A:F62:Times Three:9999.00:40013A9C:Lala:40013A9C:Lala:00:10634656:10634656 -[21:58:40.929] StatusAdd 1A:F63:Times Five:9999.00:40013A9C:Lala:40013A9C:Lala:00:10634656:10634656 - -[21:59:21.680] StatusAdd 1A:E8C:Subtractive Suppressor Alpha:22.00:40013A9C:Lala: -[22:00:14.578] StatusAdd 1A:E8D:Subtractive Suppressor Beta:23.00:40013A9C:Lala: - -[21:59:21.680] StatusAdd 1A:E83:Forward March:16.00:40013A9C:Lala: - -// boss counter -[21:58:15.372] TargetIcon 1B:40013A9C:Lala:0000:0000:01E5:0000:0000:0000 - -// boss clock -[21:58:42.181] TargetIcon 1B:40013A9C:Lala:0000:0000:01E4:0000:0000:0000 - -// player counter -// player clock -[21:58:45.757] TargetIcon 1B:_:_:0000:0000:01EE:0000:0000:0000 - -// player clock -[21:58:45.757] TargetIcon 1B:_:_:0000:0000:01ED:0000:0000:0000 -*/ - /* map effects // initial edges after raidwide @@ -60,6 +30,13 @@ export interface Data extends RaidbossData { ketuCrystalAdd: NetMatches['AddedCombatant'][]; ketuHydroBuffCount: number; ketuBuff?: 'bubble' | 'fetters'; + lalaBossRotation?: 'clock' | 'counter'; + lalaBossTimes?: 3 | 5; + lalaBossInitialSafe?: 'north' | 'east' | 'south' | 'west'; + lalaUnseen?: 'front' | 'left' | 'right' | 'back'; + lalaPlayerTimes?: 3 | 5; + lalaPlayerRotation?: 'clock' | 'counter'; + lalaSubAlpha: NetMatches['GainsEffect'][]; } // Horizontal crystals have a heading of 0, vertical crystals are -pi/2. @@ -78,8 +55,45 @@ const triggerSet: TriggerSet = { ketuSpringCrystalCount: 0, ketuCrystalAdd: [], ketuHydroBuffCount: 0, + lalaSubAlpha: [], }; }, + timelineTriggers: [ + { + id: 'AAI Lala Radiance', + regex: /^Radiance \d/, + beforeSeconds: 4, + alertText: (data, _matches, output) => { + // TODO: could figure out directions here and say "Point left at NW Orb" + const dir = data.lalaUnseen; + if (dir === undefined) + return output.orbGeneral!(); + return { + front: output.orbDirFront!(), + back: output.orbDirBack!(), + left: output.orbDirLeft!(), + right: output.orbDirRight!(), + }[dir]; + }, + outputStrings: { + orbDirFront: { + en: 'Face Towards Orb', + }, + orbDirBack: { + en: 'Face Away from Orb', + }, + orbDirLeft: { + en: 'Point Left at Orb', + }, + orbDirRight: { + en: 'Point Right at Orb', + }, + orbGeneral: { + en: 'Point opening at Orb', + }, + }, + }, + ], triggers: [ // ---------------- first trash ---------------- { @@ -472,6 +486,357 @@ const triggerSet: TriggerSet = { }, }, }, + // ---------------- Lala ---------------- + { + id: 'AAI Lala Inferno Theorem', + type: 'StartsUsing', + netRegex: { id: '88AE', source: 'Lala', capture: false }, + response: Responses.aoe(), + }, + { + id: 'AAI Lala Rotation Tracker', + type: 'HeadMarker', + netRegex: { id: ['01E4', '01E5'], target: 'Lala' }, + run: (data, matches) => data.lalaBossRotation = matches.id === '01E4' ? 'clock' : 'counter', + }, + { + id: 'AAI Lala Angular Addition Tracker', + type: 'Ability', + netRegex: { id: ['8889', '8D2E'], source: 'Lala' }, + run: (data, matches) => data.lalaBossTimes = matches.id === '8889' ? 3 : 5, + }, + { + id: 'AAI Lala Arcane Blight', + type: 'StartsUsing', + netRegex: { id: ['888B', '888C', '888D', '888E'], source: 'Lala' }, + alertText: (data, matches, output) => { + const initialDir = { + '888B': 2, // initial back safe + '888C': 0, // initial front safe + '888D': 1, // initial right safe + '888E': 3, // initial left safe + }[matches.id]; + if (initialDir === undefined) + return; + if (data.lalaBossTimes === undefined) + return; + if (data.lalaBossRotation === undefined) + return; + const rotationFactor = data.lalaBossRotation === 'clock' ? 1 : -1; + const finalDir = (initialDir + rotationFactor * data.lalaBossTimes + 8) % 4; + + const diff = (finalDir - initialDir + 4) % 4; + if (diff !== 1 && diff !== 3) + return; + const rotateStr = diff === 1 ? output.dirClock!() : output.dirCounter!(); + const dirStr = { + 0: output.front!(), + 1: output.right!(), + 2: output.back!(), + 3: output.left!(), + }[finalDir]; + + return output.text!({ rotate: rotateStr, dir: dirStr }); + }, + run: (data) => { + delete data.lalaBossTimes; + delete data.lalaBossRotation; + }, + outputStrings: { + text: { + en: '${rotate} (${dir})', + }, + front: { + en: 'in front', + }, + back: { + en: 'get behind', + }, + left: { + en: 'on left flank', + }, + right: { + en: 'on right flank', + }, + dirClock: { + en: 'Rotate Left', + }, + dirCounter: { + en: 'Rotate Right', + }, + }, + }, + { + id: 'AAI Lala Analysis Collect', + type: 'GainsEffect', + netRegex: { effectId: ['E8E', 'E8F', 'E90', 'E91'] }, + condition: Conditions.targetIsYou(), + run: (data, matches) => { + const effectMap: { [effectId: string]: typeof data.lalaUnseen } = { + 'E8E': 'front', + 'E8F': 'back', + 'E90': 'right', + 'E91': 'left', + } as const; + data.lalaUnseen = effectMap[matches.effectId]; + }, + }, + { + id: 'AAI Lala Times Collect', + type: 'GainsEffect', + netRegex: { effectId: ['E89', 'ECE'] }, + condition: Conditions.targetIsYou(), + run: (data, matches) => { + const effectMap: { [effectId: string]: typeof data.lalaPlayerTimes } = { + 'E89': 3, + 'ECE': 5, + } as const; + data.lalaPlayerTimes = effectMap[matches.effectId]; + }, + }, + { + id: 'AAI Lala Player Rotation Collect', + type: 'HeadMarker', + netRegex: { id: ['01ED', '01EE'] }, + condition: Conditions.targetIsYou(), + run: (data, matches) => { + const idMap: { [id: string]: typeof data.lalaPlayerRotation } = { + '01ED': 'counter', + '01EE': 'clock', + } as const; + data.lalaPlayerRotation = idMap[matches.id]; + }, + }, + { + id: 'AAI Lala Targeted Light', + type: 'StartsUsing', + netRegex: { id: '8CDE', source: 'Lala', capture: false }, + alertText: (data, _matches, output) => { + const initialUnseen = data.lalaUnseen; + if (initialUnseen === undefined) + return; + + const initialDir = { + front: 0, + right: 1, + back: 2, + left: 3, + }[initialUnseen]; + + const rotation = data.lalaPlayerRotation; + if (rotation === undefined) + return; + const times = data.lalaPlayerTimes; + if (times === undefined) + return; + + // The safe spot rotates, so the player counter-rotates. + const rotationFactor = rotation === 'clock' ? -1 : 1; + const finalDir = (initialDir + rotationFactor * times + 8) % 4; + + return { + 0: output.front!(), + 1: output.right!(), + 2: output.back!(), + 3: output.left!(), + }[finalDir]; + }, + run: (data) => { + delete data.lalaUnseen; + delete data.lalaPlayerTimes; + }, + outputStrings: { + front: { + en: 'Face Towards Lala', + }, + back: { + en: 'Look Away from Lala', + }, + left: { + en: 'Left Flank towards Lala', + }, + right: { + en: 'Right Flank towards Lala', + }, + }, + }, + { + id: 'AAI Lala Strategic Strike', + type: 'StartsUsing', + netRegex: { id: '88AD', source: 'Lala' }, + response: Responses.tankBuster(), + }, + { + id: 'AAI Lala Planar Tactics', + type: 'GainsEffect', + // E8B = Surge Vector + // E8C = Subtractive Suppressor Alpha + netRegex: { effectId: ['E8C', 'E8B'] }, + condition: (data, matches) => { + data.lalaSubAlpha.push(matches); + return data.lalaSubAlpha.length === 6; + }, + durationSeconds: 7, + // Only run once, as Surge Vector is used again. + suppressSeconds: 9999999, + response: (data, _matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + one: { + en: 'One', + }, + closeTwo: { + en: 'Close Two', + }, + farTwo: { + en: 'Far Two', + }, + eitherTwo: { + en: 'Either Two (w/${player})', + }, + three: { + en: 'Three', + }, + farTwoOn: { + en: '(far two on ${players})', + }, + + unknownNum: { + en: '${num}', + }, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + }; + + // Assumptions: "close two" and "three" stack+run together, while "far two" and "one" + // run towards each other and meet for the stack. Stacks COULD be on both/neither twos, + // which makes which two you are ambiguous. + const stacks = data.lalaSubAlpha.filter((x) => x.effectId === 'E8B').map((x) => x.target); + const nums = data.lalaSubAlpha.filter((x) => x.effectId === 'E8C'); + const myNumberStr = nums.find((x) => x.target === data.me)?.count; + if (myNumberStr === undefined) + return; + const myNumber = parseInt(myNumberStr); + if (myNumber < 1 || myNumber > 4) + return; + + const defaultOutput = { + alertText: output.unknownNum!({ num: output[`num${myNumber}`]!() }), + } as const; + + if (stacks.length !== 2 || nums.length !== 4) + return defaultOutput; + + const one = nums.find((x) => parseInt(x.count) === 1)?.target; + if (one === undefined) + return defaultOutput; + const isOneStack = stacks.includes(one); + const twos = nums.filter((x) => parseInt(x.count) === 2).map((x) => x.target); + + const farTwos: string[] = []; + for (const thisTwo of twos) { + // can this two stack with the one? + const isThisTwoStack = stacks.includes(thisTwo); + if (isThisTwoStack && !isOneStack || !isThisTwoStack && isOneStack) + farTwos.push(thisTwo); + } + + const [farTwo1, farTwo2] = farTwos; + if (farTwos.length === 0 || farTwo1 === undefined) + return defaultOutput; + + const isPlayerFarTwo = farTwos.includes(data.me); + + // Worst case adjust + if (isPlayerFarTwo && farTwo2 !== undefined) { + const otherPlayer = farTwo1 === data.me ? farTwo2 : farTwo1; + return { alarmText: output.eitherTwo!({ player: data.party.member(otherPlayer) }) }; + } + + let playerRole: string; + if (one === data.me) { + playerRole = output.one!(); + } else if (twos.includes(data.me)) { + playerRole = isPlayerFarTwo ? output.farTwo!() : output.closeTwo!(); + } else { + playerRole = output.three!(); + } + + if (isPlayerFarTwo) + return { alertText: playerRole }; + + return { + alertText: playerRole, + infoText: output.farTwoOn!({ players: farTwos.map((x) => data.party.member(x)) }), + }; + }, + }, + { + id: 'AAI Lala Forward March', + type: 'GainsEffect', + // E83 = Forward March + netRegex: { effectId: 'E83' }, + condition: Conditions.targetIsYou(), + delaySeconds: (_data, matches) => parseFloat(matches.duration) - 6, + durationSeconds: 4, + alertText: (data, _matches, output) => { + const rotation = data.lalaPlayerRotation; + if (rotation === undefined) + return; + const times = data.lalaPlayerTimes; + if (times === undefined) + return; + + const rotationFactor = rotation === 'clock' ? 1 : -1; + const finalDir = (rotationFactor * times + 8) % 4; + if (finalDir === 1) + return output.right!(); + if (finalDir === 3) + return output.left!(); + }, + run: (data) => { + delete data.lalaPlayerRotation; + delete data.lalaPlayerTimes; + }, + outputStrings: { + // This isn't confusing at all. + left: { + en: 'Rotate Left (your right is forward)', + }, + right: { + en: 'Rotate Right (your left is forward)', + }, + }, + }, + { + id: 'AAI Lala Spatial Tactics', + type: 'GainsEffect', + // E8D = Subtractive Suppressor Beta + netRegex: { effectId: 'E8D' }, + condition: Conditions.targetIsYou(), + alertText: (_data, matches, output) => { + const num = parseInt(matches.count); + if (num < 1 || num > 4) + return; + return output[`num${num}`]!(); + }, + outputStrings: { + num1: { + en: 'One (avoid all)', + }, + num2: { + en: 'Two (stay middle)', + }, + num3: { + en: 'Three (adjacent to middle)', + }, + num4: { + en: 'Four', + }, + }, + }, ], timelineReplace: [ { From 01edaf03c726db2189a0572d2a21a43eda5755c1 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Mon, 13 Nov 2023 18:32:11 -0800 Subject: [PATCH 10/39] list bubble/fetters partner for sc2 mostly --- .../06-ew/dungeon/another_aloalo_island.ts | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 9a5e364c20..26d880862f 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -8,8 +8,6 @@ import { NetMatches } from '../../../../../types/net_matches'; import { TriggerSet } from '../../../../../types/trigger'; // TODO: use code from AMR to handle cases of "role stacks" when somebody is dead -// TODO: switch crystals 1 to always tell you what fetters do -// TODO: say who is your bubble/fetters partner (esp for sc2) // TODO: sc3 should say which bubble to take to the other side (for everyone) // TODO: figure out directions for Lala for Radiance orbs // TODO: map effects for Lala @@ -30,6 +28,7 @@ export interface Data extends RaidbossData { ketuCrystalAdd: NetMatches['AddedCombatant'][]; ketuHydroBuffCount: number; ketuBuff?: 'bubble' | 'fetters'; + ketuBuffCollect: NetMatches['GainsEffect'][]; lalaBossRotation?: 'clock' | 'counter'; lalaBossTimes?: 3 | 5; lalaBossInitialSafe?: 'north' | 'east' | 'south' | 'west'; @@ -55,6 +54,7 @@ const triggerSet: TriggerSet = { ketuSpringCrystalCount: 0, ketuCrystalAdd: [], ketuHydroBuffCount: 0, + ketuBuffCollect: [], lalaSubAlpha: [], }; }, @@ -204,28 +204,40 @@ const triggerSet: TriggerSet = { run: (data, matches) => data.ketuCrystalAdd.push(matches), }, { - id: 'AAI Ketuduke Foamy Fetters', + id: 'AAI Ketuduke Foamy Fetters Bubble Weave', type: 'GainsEffect', - netRegex: { effectId: 'ECC' }, - condition: Conditions.targetIsYou(), - alertText: (_data, _matches, output) => output.text!(), - run: (data) => data.ketuBuff = 'fetters', - outputStrings: { - text: { - en: 'Fetters', - }, + // ECC = Foamy Fetters + // E9F = Bubble Weave + netRegex: { effectId: ['ECC', 'E9F'] }, + delaySeconds: (data, matches) => { + data.ketuBuffCollect.push(matches); + return data.ketuBuffCollect.length === 4 ? 0 : 0.5; }, - }, - { - id: 'AAI Ketuduke Bubble Weave', - type: 'GainsEffect', - netRegex: { effectId: 'E9F' }, - condition: Conditions.targetIsYou(), - alertText: (_data, _matches, output) => output.text!(), - run: (data) => data.ketuBuff = 'bubble', + alertText: (data, _matches, output) => { + if (data.ketuBuffCollect.length === 0) + return; + + const myBuff = data.ketuBuffCollect.find((x) => x.target === data.me)?.effectId; + if (myBuff === undefined) + return; + data.ketuBuff = myBuff === 'ECC' ? 'fetters' : 'bubble'; + + const player = data.party.member( + data.ketuBuffCollect.find((x) => { + return x.target !== data.me && x.effectId === myBuff; + })?.target, + ); + if (data.ketuBuff === 'fetters') + return output.fetters!({ player: player }); + return output.bubble!({ player: player }); + }, + run: (data) => data.ketuBuffCollect = [], outputStrings: { - text: { - en: 'Bubble', + fetters: { + en: 'Fetters (w/${player})', + }, + bubble: { + en: 'Bubble (w/${player})', }, }, }, From 6a053c0d8f3ecd9195ab62e84ae89fd9d2d660cd Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Mon, 13 Nov 2023 18:33:53 -0800 Subject: [PATCH 11/39] clean up diagrams --- ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 26d880862f..ad86358534 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -275,7 +275,6 @@ const triggerSet: TriggerSet = { // Wind doesn't matter, as "1" will always be on the horizontal crystals. // // STACK FETTERS COLUMNS (kitty to horizontal) - // stack, counter_nw2 // 2 2 // + - - - - + + - - - - + // | V f | 1 | H f | 1 @@ -286,7 +285,6 @@ const triggerSet: TriggerSet = { // 2 2 // // STACK FETTERS SPLIT (on horizontal) - // stack, clock_nw1 // 2 2 // + - - - - + + - - - - + // 1 | V | 1 | V | @@ -297,7 +295,6 @@ const triggerSet: TriggerSet = { // 2 2 // // SPREAD FETTERS COLUMNS (adjacent to vertical) - // spread, counter_nw2 // 2 2 // + - - - - + + - - - - + // | V f | 1 | f H b | 1 @@ -308,7 +305,6 @@ const triggerSet: TriggerSet = { // 2 2 // // SPREAD FETTERS SPLIT (kitty to vertical) - // spread, counter_nw2 // 2 2 // + - - - - + + - - - - + // | V | 1 | V | 1 From ea4c65633ebfc218ee10aa7e72b40df3ed6510ee Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 14 Nov 2023 08:41:09 -0800 Subject: [PATCH 12/39] small fixups --- .../06-ew/dungeon/another_aloalo_island.ts | 3 ++- .../06-ew/dungeon/another_aloalo_island.ts | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts index e4dbf92bf2..c020cf08ca 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts @@ -2,6 +2,7 @@ import NetRegexes from '../../../../../resources/netregexes'; import ZoneId from '../../../../../resources/zone_id'; import { OopsyData } from '../../../../../types/data'; import { OopsyMistakeType, OopsyTrigger, OopsyTriggerSet } from '../../../../../types/oopsy'; +import { playerDamageFields } from '../../../oopsy_common'; // TODO: people who missed their 8AC2 Burst tower // TODO: failing 8894 Radiance orb damage during Analysis @@ -22,7 +23,7 @@ const nonzeroDamageMistake = ( return { id: triggerId, type: 'Ability', - netRegex: NetRegexes.ability({ id: abilityId }), + netRegex: NetRegexes.ability({ id: abilityId, ...playerDamageFields }), condition: (data, matches) => data.DamageFromMatches(matches) > 0, mistake: (_data, matches) => { return { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index ad86358534..70956ef095 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -438,7 +438,21 @@ const triggerSet: TriggerSet = { id: 'AAI Wood Golem Tornado', type: 'StartsUsing', netRegex: { id: '8C4D', source: 'Aloalo Wood Golem' }, - response: Responses.interrupt('alarm'), + response: (data, matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + tornadoOn: { + en: 'Away from ${player}', + }, + tornadoOnYou: { + en: 'Tornado on YOU', + }, + }; + + if (data.me === matches.target) + return { alertText: output.tornadoOnYou!() }; + return { infoText: output.tornadoOn!({ player: data.party.member(matches.target) }) }; + }, }, { id: 'AAI Wood Golem Tornado Bind', @@ -787,7 +801,7 @@ const triggerSet: TriggerSet = { // E83 = Forward March netRegex: { effectId: 'E83' }, condition: Conditions.targetIsYou(), - delaySeconds: (_data, matches) => parseFloat(matches.duration) - 6, + delaySeconds: (_data, matches) => parseFloat(matches.duration) - 8, durationSeconds: 4, alertText: (data, _matches, output) => { const rotation = data.lalaPlayerRotation; @@ -824,6 +838,7 @@ const triggerSet: TriggerSet = { // E8D = Subtractive Suppressor Beta netRegex: { effectId: 'E8D' }, condition: Conditions.targetIsYou(), + suppressSeconds: 999999, alertText: (_data, matches, output) => { const num = parseInt(matches.count); if (num < 1 || num > 4) From cde052cef6274f5dd984d943cc5e1f235d7f20b2 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 14 Nov 2023 10:09:13 -0800 Subject: [PATCH 13/39] initial statice --- .../06-ew/dungeon/another_aloalo_island.ts | 58 ++++-- .../06-ew/dungeon/another_aloalo_island.ts | 184 ++++++++++++++++++ .../06-ew/dungeon/another_aloalo_island.txt | 83 +++++++- 3 files changed, 302 insertions(+), 23 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts index c020cf08ca..c192861a8f 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts @@ -11,10 +11,37 @@ import { playerDamageFields } from '../../../oopsy_common'; // TODO: walking over 889B Arcane Combustion when you don't have Suppressor // TODO: taking extra 8893 Inferno Divide squares during Spatial Tactics // TODO: 01F7(success) and 01F8(fail) check and x markers? +// TODO: players not in Trapshooting stack 895A export type Data = OopsyData; -// TODO: we could probably move this helper to some oopsy util. +// TODO: we could probably move these helpers to some oopsy util. +const pushedIntoWall = ( + triggerId: string, + abilityId: string | string[], +): OopsyTrigger => { + return { + id: triggerId, + type: 'Ability', + netRegex: NetRegexes.ability({ id: abilityId, ...playerDamageFields }), + condition: (data, matches) => data.DamageFromMatches(matches) > 0, + deathReason: (_data, matches) => { + return { + id: matches.targetId, + name: matches.target, + text: { + en: 'Pushed into wall', + de: 'Rückstoß in die Wand', + fr: 'Poussé(e) dans le mur', + ja: '壁へノックバック', + cn: '击退至墙', + ko: '넉백', + }, + }; + }, + }; +}; + const nonzeroDamageMistake = ( triggerId: string, abilityId: string | string[], @@ -69,6 +96,11 @@ const triggerSet: OopsyTriggerSet = { 'AAI Arcane Mine': '889A', // initial Arcane Mine squares 'AAI Golem Aero II': '88A4', // line damage from Aloalo Golem during Symmetric Surge 'AAI Telluric Theorem': '88A9', // puddles from Explosive Theorem spreads + + // Statice + 'AAI Trigger Happy': '894C', // limit cut dart board + 'AAI Bomb Burst': '895D', // bomb explosion + 'AAI Uncommon Ground': '8CC2', // people who are on the same dartboard color with Bull's-eye }, damageFail: { 'AAI Big Burst': '8AC3', // tower failure damage @@ -88,36 +120,20 @@ const triggerSet: OopsyTriggerSet = { 'AAI Wood Golem Tornado': '8C4D', // headmarker -> bind and heavy aoe 'AAI Powerful Light': '88A6', // spread marker during Symmetric Surge that turns squares blue 'AAI Explosive Theorem': '88A8', // large spreads with Telluric Theorem puddles + 'AAI Trapshooting Spread': '895B', // spread damage from Trick Reload }, soloWarn: { 'AAI Snipper Water III': '8C64', // Snipper stack marker 'AAI Islekeeper Gravity Force': '8BC5', // stack + 'AAI Trapshooting Stack': '895A', // stack damage from Trick Reload }, soloFail: { 'AAI Hydrofall': '8AB7', // partner stack debuffs 'AAI Symmetric Surge': '889E', // two person stack that gives magic vuln up }, triggers: [ - { - // Getting knocked into a wall from the Angry Seas knockback - id: 'AAI Angry Seas Wall', - type: 'Ability', - netRegex: NetRegexes.ability({ id: '8AC1' }), - deathReason: (_data, matches) => { - return { - id: matches.targetId, - name: matches.target, - text: { - en: 'Pushed into wall', - de: 'Rückstoß in die Wand', - fr: 'Poussé(e) dans le mur', - ja: '壁へノックバック', - cn: '击退至墙', - ko: '넉백', - }, - }; - }, - }, + pushedIntoWall('AAI Angry Seas', '8AC1'), + pushedIntoWall('AAI Pop', '894E'), nonzeroDamageMistake('AAI Hundred Lashings', ['8AC9', '8ACB'], 'warn'), ], }; diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 70956ef095..029333b5df 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -36,6 +36,10 @@ export interface Data extends RaidbossData { lalaPlayerTimes?: 3 | 5; lalaPlayerRotation?: 'clock' | 'counter'; lalaSubAlpha: NetMatches['GainsEffect'][]; + staticeBullet: NetMatches['Ability'][]; + staticeTriggerHappy?: number; + staticeTrapshooting: ('stack' | 'spread')[]; + staticeDart: NetMatches['GainsEffect'][]; } // Horizontal crystals have a heading of 0, vertical crystals are -pi/2. @@ -56,6 +60,9 @@ const triggerSet: TriggerSet = { ketuHydroBuffCount: 0, ketuBuffCollect: [], lalaSubAlpha: [], + staticeBullet: [], + staticeTrapshooting: [], + staticeDart: [], }; }, timelineTriggers: [ @@ -860,6 +867,183 @@ const triggerSet: TriggerSet = { }, }, }, + // ---------------- Statice ---------------- + { + id: 'AAI Statice Aero IV', + type: 'StartsUsing', + netRegex: { id: '8949', source: 'Statice', capture: false }, + response: Responses.aoe(), + }, + { + id: 'AAI Statice Trick Reload', + type: 'Ability', + // 8925 = Locked and Loaded + // 8926 = Misload + netRegex: { id: ['8925', '8926'], source: 'Statice' }, + preRun: (data, matches) => data.staticeBullet.push(matches), + alertText: (data, _matches, output) => { + // Statice loads 8 bullets, two are duds. + // The first and the last are always opposite, and one of them is a dud. + // The first/ last bullets are for Trapshooting and the middle six are for Trigger Happy. + const [bullet] = data.staticeBullet; + if (data.staticeBullet.length !== 1 || bullet === undefined) + return; + const isStack = bullet.id === '8926'; + data.staticeTrapshooting = isStack ? ['stack', 'spread'] : ['spread', 'stack']; + return isStack ? output.stackThenSpread!() : output.spreadThenStack!(); + }, + infoText: (data, _matches, output) => { + const lastBullet = data.staticeBullet[data.staticeBullet.length - 1]; + if (data.staticeBullet.length < 2 || data.staticeBullet.length > 7) + return; + if (lastBullet?.id !== '8926') + return; + data.staticeTriggerHappy = data.staticeBullet.length - 1; + return output.numSafeLater!({ num: output[`num${data.staticeTriggerHappy}`]!() }); + }, + run: (data) => { + if (data.staticeBullet.length === 8) + data.staticeBullet = []; + }, + outputStrings: { + stackThenSpread: Outputs.stackThenSpread, + spreadThenStack: Outputs.spreadThenStack, + numSafeLater: { + en: '(${num} safe later)', + }, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, + }, + }, + { + id: 'AAI Statice Trapshooting', + type: 'StartsUsing', + netRegex: { id: ['8D1A', '8959'], source: 'Statice', capture: false }, + alertText: (data, _matches, output) => { + const mech = data.staticeTrapshooting.shift(); + if (mech === undefined) + return; + return output[mech]!(); + }, + outputStrings: { + spread: Outputs.spread, + stack: Outputs.stackMarker, + }, + }, + { + id: 'AAI Statice Trigger Happy', + type: 'StartsUsing', + netRegex: { id: '894B', source: 'Statice', capture: false }, + alertText: (data, _matches, output) => { + const num = data.staticeTriggerHappy; + if (num === undefined) + return; + return output[`num${num}`]!(); + }, + run: (data) => delete data.staticeTriggerHappy, + outputStrings: { + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, + }, + }, + { + id: 'AAI Statice Bull\'s-eye', + type: 'GainsEffect', + netRegex: { effectId: 'E9E' }, + delaySeconds: (data, matches) => { + data.staticeDart.push(matches); + return data.staticeDart.length === 3 ? 0 : 0.5; + }, + response: (data, _matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + dartOnYou: { + en: 'Dart on YOU', + }, + noDartOnYou: { + en: 'Flex', + }, + flexCall: { + en: '(${player} flex)', + }, + }; + + if (data.staticeDart.length === 0) + return; + + const dartTargets = data.staticeDart.map((x) => x.target); + + if (!dartTargets.includes(data.me)) + return { alertText: output.noDartOnYou!() }; + + const partyNames = data.party.partyNames; + + const flexers = partyNames.filter((x) => !dartTargets.includes(x)); + const [flex] = flexers; + const flexPlayer = flexers.length === 1 ? data.party.member(flex) : undefined; + + return { + alertText: output.dartOnYou!(), + infoText: output.flexCall!({ player: flexPlayer }), + }; + }, + run: (data) => data.staticeDart = [], + }, + { + id: 'AAI Statice Pop', + type: 'StartsUsing', + // TODO: this might need a slight delay + netRegex: { id: '894E', source: 'Statice', capture: false }, + suppressSeconds: 20, + response: Responses.knockback(), + }, + { + id: 'AAI Statice Face', + type: 'GainsEffect', + // DD2 = Forward March + // DD3 = About Face + // DD4 = Left Face + // DD5 = Right Face + netRegex: { effectId: ['DD2', 'DD3', 'DD4', 'DD5'] }, + condition: Conditions.targetIsYou(), + delaySeconds: (_data, matches) => parseFloat(matches.duration) - 7, + durationSeconds: 5, + alertText: (data, matches, output) => { + const mechName = data.staticeTrapshooting[data.staticeTrapshooting.length - 1]; + const mech = mechName === undefined ? output.unknown!() : output[mechName]!(); + return { + 'DD2': output.forward!({ mech: mech }), + 'DD3': output.backward!({ mech: mech }), + 'DD4': output.left!({ mech: mech }), + 'DD5': output.right!({ mech: mech }), + }[matches.effectId]; + }, + outputStrings: { + forward: { + en: 'Forward March (${mech})', + }, + backward: { + en: 'Backward March (${mech})', + }, + left: { + en: 'Left March (${mech})', + }, + right: { + en: 'Right March (${mech})', + }, + spread: Outputs.spread, + stack: Outputs.stackMarker, + unknown: Outputs.unknown, + }, + }, ], timelineReplace: [ { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index bf218f9a4f..3cfa478080 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -113,7 +113,7 @@ hideall "--sync--" # 8ABD Blowing Bubbles self-targeted cast that adds Airy Bubble Adds # 8ABE Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one # 8ABF Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after 8ABE Riptide -# 8AC0 Angry Seas cast and self-targeted ability for 8AC1 red line knockback +# 8AC0 Angry Seas self-targeted cast for 8AC1 red line knockback # 8AC1 Angry Seas cast and knockback damage from red line # 8AC2 Burst tower damage # 8AC3 Big Burst tower failure damage @@ -123,7 +123,7 @@ hideall "--sync--" # 8AC7 Updraft self-targeted cast to boost adds and players into the air # 8AC8 Updraft ability on players for 8AC7 Updraft # 8AC9 Hundred Lashings cast and damage for non-bubbled Zaratan 180 cleave (no damage on bubbled players) -# 8ACA Hundred Lashings cast and self-targeted ability for bubbled Zaratan adds +# 8ACA Hundred Lashings self-targeted cast for bubbled Zaratan adds # 8ACB Hundred Lashings cast and damage for bubbled Zaratan 180 cleave (no damage on non-bubbled players) # 8ACC Receding Twintides cast and damage for initial out during out->in # 8ACD Near Tide fast cast and damage for second out during in->out with 8ACE Encroaching Twintides @@ -260,6 +260,85 @@ hideall "--sync--" # 8D2E Angular Addition self-targeted ability to give boss V +#~~~~~~~~~~~~~~~~~~~~# +# STATICE WITH A GUN # +#~~~~~~~~~~~~~~~~~~~~# + +# -p 8949:3013.8 +# -ii 8947 8925 8926 895A 895B 894C 8987 8A6A 895F 8960 8CC2 + +3000.0 "--sync--" sync / 00:0839::The Midnight Trial will be sealed off/ window 10000,0 +3008.8 "--sync--" sync / 14:[^:]*:Statice:8949:/ window 20,20 +3013.8 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ + +3018.0 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3023.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:894A:/ +3038.2 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8D1A:/ +3048.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:894B:/ +3056.5 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ +3070.6 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8959:/ +3074.6 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ + +3081.8 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3087.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:894A:/ +3101.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ +3106.3 "Dartboard of Dancing Explosives " sync / 1[56]:[^:]*:Statice:8CBD:/ +3120.1 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8959:/ +3122.0 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ +3125.3 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:8954:/ + +3132.3 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3137.7 "Surprise Balloon" sync / 1[56]:[^:]*:Statice:894D:/ +3144.8 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:8963:/ +3149.8 "Surprise Needle 1" #sync / 1[56]:[^:]*:Needle:894F:/ +3150.7 "Pop 1" sync / 1[56]:[^:]*:Statice:894E:/ +3151.5 "Surprise Needle 2" #sync / 1[56]:[^:]*:Needle:894F:/ +3152.4 "Trigger Happy" sync / 1[56]:[^:]*:Statice:894B:/ +3153.2 "Surprise Needle 3" #sync / 1[56]:[^:]*:Needle:894F:/ +3154.9 "Surprise Needle 4" #sync / 1[56]:[^:]*:Needle:894F:/ +3155.6 "Pop 2" sync / 1[56]:[^:]*:Statice:894E:/ +3160.4 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8959:/ + +3172.5 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ +3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ +3189.2 "Present Box" sync / 1[56]:[^:]*:Statice:8955:/ +3194.3 "Fireworks" sync / 1[56]:[^:]*:Statice:895E:/ +3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ +3204.3 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:8956:/ + + +# ALL ENCOUNTER ABILITIES +# 8925 Locked and Loaded ability during 894A Trick Reload when a bullet is in the gun +# 8926 Misload ability during 894A Trick Reload when a bullet missed the gun oops +# 8927 --sync-- repositioning from Statice +# 8947 --sync-- auto damage from Statice +# 8949 Aero IV cast and raidwide damage +# 894A Trick Reload self-targeted cast to load gun with 8925/8926 +# 894B Trigger Happy self-targeted cast for limit cut dart board +# 894C Trigger Happy cast and damage for limit cut dart board (filled pie slice) +# 894D Surprise Balloon self-targeted cast +# 894E Pop knockback from Surprise Balloon being popped +# 894F Surprise Needle short cast and ability blue line aoe from needle adds that pop balloons +# 8954 Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye +# 8955 Present Box self-targeted cast for bombs/donuts/missiles/hands +# 8956 Faerie Ring cast and damage for donut rings during Present Box +# 8959 Trapshooting self-targeted cast after Trick Reload (after the first time) +# 895A Trapshooting stack damage from Trick Reload +# 895B Trapshooting spread damage from Trick Reload +# 895C Ring a Ring o' Explosions self-targeted cast for rotating bombs +# 895D Burst cast and damage from bomb explosion +# 895E Fireworks self-targeted cast +# 895F Fireworks ??? spread/stack damage during Present Box +# 8960 Fireworks ??? spread/stack damage during Present Box +# 8963 Beguiling Glitter self-targeted cast to give players Face debuffs +# 8987 Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) +# 8A6A --sync-- ability on Bomb when rotating +# 8CBD Dartboard of Dancing Explosives self-targeted cast for colored dartboard +# 8CC2 Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye +# 8D1A Trapshooting self-targeted cast after Trick Reload (first time) + + #~~~~~~~~~# # TRASH 1 # #~~~~~~~~~# From 2b444544b9b6fd3c3dc2202e79e1bdc5cdd1e1e6 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 14 Nov 2023 18:48:33 -0800 Subject: [PATCH 14/39] trapshooting cleanup --- .../data/06-ew/dungeon/another_aloalo_island.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 029333b5df..5b5f2759c3 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -1017,7 +1017,7 @@ const triggerSet: TriggerSet = { delaySeconds: (_data, matches) => parseFloat(matches.duration) - 7, durationSeconds: 5, alertText: (data, matches, output) => { - const mechName = data.staticeTrapshooting[data.staticeTrapshooting.length - 1]; + const mechName = data.staticeTrapshooting.shift(); const mech = mechName === undefined ? output.unknown!() : output[mechName]!(); return { 'DD2': output.forward!({ mech: mech }), @@ -1028,16 +1028,16 @@ const triggerSet: TriggerSet = { }, outputStrings: { forward: { - en: 'Forward March (${mech})', + en: 'Forward March => ${mech}', }, backward: { - en: 'Backward March (${mech})', + en: 'Backward March => ${mech}', }, left: { - en: 'Left March (${mech})', + en: 'Left March => ${mech}', }, right: { - en: 'Right March (${mech})', + en: 'Right March => ${mech}', }, spread: Outputs.spread, stack: Outputs.stackMarker, From 5f254239c306e1e9c7c258f72215dee77a973e93 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Sun, 19 Nov 2023 15:54:49 -0800 Subject: [PATCH 15/39] add initial savage files --- test/helper/test_oopsy.ts | 3 + .../dungeon/another_aloalo_island-savage.ts | 144 +++ .../dungeon/another_aloalo_island-savage.ts | 1064 +++++++++++++++++ .../dungeon/another_aloalo_island-savage.txt | 380 ++++++ util/sync_files.ts | 164 ++- 5 files changed, 1753 insertions(+), 2 deletions(-) create mode 100644 ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts create mode 100644 ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts create mode 100644 ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt diff --git a/test/helper/test_oopsy.ts b/test/helper/test_oopsy.ts index 2711dbcab2..b71ccf99a1 100644 --- a/test/helper/test_oopsy.ts +++ b/test/helper/test_oopsy.ts @@ -155,6 +155,9 @@ const testOopsyFile = (file: string, info: OopsyTriggerSetInfo) => { const abilityIdToId: { [abilityid: string]: string } = {}; for (const field of oopsyMistakeMapKeys) { for (const [id, abilityId] of Object.entries(triggerSet[field] ?? {})) { + // Ignore TODOs from `util/sync_files.ts` that haven't been filled out. + if (abilityId.startsWith('TODO')) + continue; const prevId = abilityIdToId[abilityId]; if (prevId === undefined) { abilityIdToId[abilityId] = id; diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts new file mode 100644 index 0000000000..1b4f5ad408 --- /dev/null +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -0,0 +1,144 @@ +// This file was autogenerated from running ts-node util/sync_files.ts. +// DO NOT EDIT THIS FILE DIRECTLY. + +import NetRegexes from '../../../../../resources/netregexes'; +import ZoneId from '../../../../../resources/zone_id'; +import { OopsyData } from '../../../../../types/data'; +import { OopsyMistakeType, OopsyTrigger, OopsyTriggerSet } from '../../../../../types/oopsy'; +import { playerDamageFields } from '../../../oopsy_common'; + +// TODO: people who missed their TODO Burst tower +// TODO: failing TODO Radiance orb damage during Analysis +// TODO: failing TODO Targeted Light during Analysis +// TODO: people who failed Subtractive Suppressor Alpha + Beta +// TODO: walking over TODO Arcane Combustion when you don't have Suppressor +// TODO: taking extra TODO Inferno Divide squares during Spatial Tactics +// TODO: 01F7(success) and 01F8(fail) check and x markers? +// TODO: players not in Trapshooting stack TODO + +export type Data = OopsyData; + +// TODO: we could probably move these helpers to some oopsy util. +const pushedIntoWall = ( + triggerId: string, + abilityId: string | string[], +): OopsyTrigger => { + return { + id: triggerId, + type: 'Ability', + netRegex: NetRegexes.ability({ id: abilityId, ...playerDamageFields }), + condition: (data, matches) => data.DamageFromMatches(matches) > 0, + deathReason: (_data, matches) => { + return { + id: matches.targetId, + name: matches.target, + text: { + en: 'Pushed into wall', + de: 'Rückstoß in die Wand', + fr: 'Poussé(e) dans le mur', + ja: '壁へノックバック', + cn: '击退至墙', + ko: '넉백', + }, + }; + }, + }; +}; + +const nonzeroDamageMistake = ( + triggerId: string, + abilityId: string | string[], + type: OopsyMistakeType, +): OopsyTrigger => { + return { + id: triggerId, + type: 'Ability', + netRegex: NetRegexes.ability({ id: abilityId, ...playerDamageFields }), + condition: (data, matches) => data.DamageFromMatches(matches) > 0, + mistake: (_data, matches) => { + return { + type: type, + blame: matches.target, + reportId: matches.targetId, + text: matches.ability, + }; + }, + }; +}; + +const triggerSet: OopsyTriggerSet = { + zoneId: ZoneId.AnotherAloaloIslandSavage, + damageWarn: { + // Trash 1 + 'AAIS Twister': 'TODO', // Twister tornados + 'AAIS Kiwakin Tail Screw': 'TODO', // baited circle + 'AAIS Snipper Bubble Shower': 'TODO', // front conal + 'AAIS Snipper Crab Dribble': 'TODO', // fast back conal after Bubble Shower + 'AAIS Ray Hydrocannon': 'TODO', // line aoe + 'AAIS Ray Expulsion': 'TODO', // "get out" + 'AAIS Ray Electric Whorl': 'TODO', // "get in" + + // Ketuduke + 'AAIS Spring Crystal Saturate 1': 'TODO', // orb circle + 'AAIS Spring Crystal Saturate 2': 'TODO', // rupee line laser + 'AAIS Sphere Shatter': 'TODO', // moving arches + 'AAIS Receding Twintides': 'TODO', // initial out during out->in + 'AAIS Near Tide': 'TODO', // second out during in->out with TODO Encroaching Twintides + 'AAIS Encroaching Twintides': 'TODO', // initial in during in->out + 'AAIS Far Tide': 'TODO', // second in during out->in with TODO Receding Twintides + 'AAIS Hydrobomb': 'TODO', // 3x puddles duruing TODO Blowing Bubbles + + // Trash 2 + 'AAIS Wood Golem Ovation': 'TODO', // front line aoe + 'AAIS Islekeeper Isle Drop': 'TODO', // front circle + + // Lala + 'AAIS Arcane Blight': 'TODO', // 270 degree rotating cleave + 'AAIS Bright Pulse 1': 'TODO', // initial blue square + 'AAIS Bright Pulse 2': 'TODO', // moving blue square + 'AAIS Arcane Mine': 'TODO', // initial Arcane Mine squares + 'AAIS Golem Aero II': 'TODO', // line damage from Aloalo Golem during Symmetric Surge + 'AAIS Telluric Theorem': 'TODO', // puddles from Explosive Theorem spreads + + // Statice + 'AAIS Trigger Happy': 'TODO', // limit cut dart board + 'AAIS Bomb Burst': 'TODO', // bomb explosion + 'AAIS Uncommon Ground': 'TODO', // people who are on the same dartboard color with Bull's-eye + }, + damageFail: { + 'AAIS Big Burst': 'TODO', // tower failure damage + 'AAIS Massive Explosion 1': 'TODO', // failing to resolve Subractive Suppressor Alpha + 'AAIS Massive Explosion 2': 'TODO', // failing to resolve Subractive Suppressor Beta + }, + gainsEffectFail: { + // C03 = 9999 duration, ??? = 15s duration + 'AAIS Dropsy': 'C03', // standing outside Ketuduke + // C05 = 9999 duration, C06 = 15s duration + 'AAIS Bleeding': 'C05', // standing in blue square during Lala + // BF9 = 9999 duration, BFA??? = 15s duration + 'AAIS Burns': 'BF9', // standing outside Lala + }, + shareWarn: { + 'AAIS Hydrobullet': 'TODO', // spread debuffs + 'AAIS Wood Golem Tornado': 'TODO', // headmarker -> bind and heavy aoe + 'AAIS Powerful Light': 'TODO', // spread marker during Symmetric Surge that turns squares blue + 'AAIS Explosive Theorem': 'TODO', // large spreads with Telluric Theorem puddles + 'AAIS Trapshooting Spread': 'TODO', // spread damage from Trick Reload + }, + soloWarn: { + 'AAIS Snipper Water III': 'TODO', // Snipper stack marker + 'AAIS Islekeeper Gravity Force': 'TODO', // stack + 'AAIS Trapshooting Stack': 'TODO', // stack damage from Trick Reload + }, + soloFail: { + 'AAIS Hydrofall': 'TODO', // partner stack debuffs + 'AAIS Symmetric Surge': 'TODO', // two person stack that gives magic vuln up + }, + triggers: [ + pushedIntoWall('AAIS Angry Seas', 'TODO'), + pushedIntoWall('AAIS Pop', 'TODO'), + nonzeroDamageMistake('AAIS Hundred Lashings', ['TODO', 'TODO'], 'warn'), + ], +}; + +export default triggerSet; diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts new file mode 100644 index 0000000000..fc87a4f0b9 --- /dev/null +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -0,0 +1,1064 @@ +// This file was autogenerated from running ts-node util/sync_files.ts. +// DO NOT EDIT THIS FILE DIRECTLY. + +import Conditions from '../../../../../resources/conditions'; +import Outputs from '../../../../../resources/outputs'; +import { Responses } from '../../../../../resources/responses'; +import ZoneId from '../../../../../resources/zone_id'; +import { RaidbossData } from '../../../../../types/data'; +import { PluginCombatantState } from '../../../../../types/event'; +import { NetMatches } from '../../../../../types/net_matches'; +import { TriggerSet } from '../../../../../types/trigger'; + +// TODO: use code from AMR to handle cases of "role stacks" when somebody is dead +// TODO: sc3 should say which bubble to take to the other side (for everyone) +// TODO: figure out directions for Lala for Radiance orbs +// TODO: map effects for Lala + +/* +map effects +// initial edges after raidwide +[21:58:06.929] 257 101:8003908D:00020001:26:00:0000 + +*/ + +export interface Data extends RaidbossData { + readonly triggerSetConfig: { + stackOrder: 'meleeRolesPartners' | 'rolesPartners'; + }; + combatantData: PluginCombatantState[]; + ketuSpringCrystalCount: number; + ketuCrystalAdd: NetMatches['AddedCombatant'][]; + ketuHydroBuffCount: number; + ketuBuff?: 'bubble' | 'fetters'; + ketuBuffCollect: NetMatches['GainsEffect'][]; + lalaBossRotation?: 'clock' | 'counter'; + lalaBossTimes?: 3 | 5; + lalaBossInitialSafe?: 'north' | 'east' | 'south' | 'west'; + lalaUnseen?: 'front' | 'left' | 'right' | 'back'; + lalaPlayerTimes?: 3 | 5; + lalaPlayerRotation?: 'clock' | 'counter'; + lalaSubAlpha: NetMatches['GainsEffect'][]; + staticeBullet: NetMatches['Ability'][]; + staticeTriggerHappy?: number; + staticeTrapshooting: ('stack' | 'spread')[]; + staticeDart: NetMatches['GainsEffect'][]; +} + +// Horizontal crystals have a heading of 0, vertical crystals are -pi/2. +const isHorizontalCrystal = (line: NetMatches['AddedCombatant']) => { + const epsilon = 0.1; + return Math.abs(parseFloat(line.heading)) < epsilon; +}; + +const triggerSet: TriggerSet = { + id: 'AnotherAloaloIslandSavage', + zoneId: ZoneId.AnotherAloaloIslandSavage, + timelineFile: 'another_aloalo_island-savage.txt', + initData: () => { + return { + combatantData: [], + ketuSpringCrystalCount: 0, + ketuCrystalAdd: [], + ketuHydroBuffCount: 0, + ketuBuffCollect: [], + lalaSubAlpha: [], + staticeBullet: [], + staticeTrapshooting: [], + staticeDart: [], + }; + }, + timelineTriggers: [ + { + id: 'AAIS Lala Radiance', + regex: /^Radiance \d/, + beforeSeconds: 4, + alertText: (data, _matches, output) => { + // TODO: could figure out directions here and say "Point left at NW Orb" + const dir = data.lalaUnseen; + if (dir === undefined) + return output.orbGeneral!(); + return { + front: output.orbDirFront!(), + back: output.orbDirBack!(), + left: output.orbDirLeft!(), + right: output.orbDirRight!(), + }[dir]; + }, + outputStrings: { + orbDirFront: { + en: 'Face Towards Orb', + }, + orbDirBack: { + en: 'Face Away from Orb', + }, + orbDirLeft: { + en: 'Point Left at Orb', + }, + orbDirRight: { + en: 'Point Right at Orb', + }, + orbGeneral: { + en: 'Point opening at Orb', + }, + }, + }, + ], + triggers: [ + // ---------------- first trash ---------------- + { + id: 'AAIS Kiwakin Lead Hook', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Kiwakin' }, + response: (data, matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + tankBusterOnYou: { + en: '3x Tankbuster on YOU', + }, + tankBusterOnPlayer: { + en: '3x Tankbuster on ${player}', + }, + }; + + if (matches.target === data.me) + return { alertText: output.tankBusterOnYou!() }; + const target = data.party.member(matches.target); + return { infoText: output.tankBusterOnPlayer!({ player: target }) }; + }, + }, + { + id: 'AAIS Kiwakin Sharp Strike', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Kiwakin' }, + response: Responses.tankBuster(), + }, + { + id: 'AAIS Kiwakin Tail Screw', + type: 'StartsUsing', + // This is a baited targeted circle. + netRegex: { id: 'TODO', source: 'Aloalo Kiwakin', capture: false }, + response: Responses.moveAway(), + }, + { + id: 'AAIS Snipper Water III', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Snipper' }, + response: Responses.stackMarkerOn(), + }, + { + id: 'AAIS Snipper Bubble Shower', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Snipper', capture: false }, + response: Responses.getBackThenFront(), + }, + { + id: 'AAIS Snipper Crab Dribble', + type: 'Ability', + // Crab Dribble TODO has a fast cast, so trigger on Bubble Shower ability + netRegex: { id: 'TODO', source: 'Aloalo Snipper', capture: false }, + suppressSeconds: 5, + response: Responses.goFront('info'), + }, + { + id: 'AAIS Ray Hydrocannon', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Ray', capture: false }, + response: Responses.getBehind(), + }, + { + id: 'AAIS Ray Expulsion', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Ray', capture: false }, + response: Responses.getOut(), + }, + { + id: 'AAIS Ray Electric Whorl', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Ray', capture: false }, + response: Responses.getUnder(), + }, + { + id: 'AAIS Monk Hydroshot', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Monk' }, + condition: Conditions.targetIsYou(), + response: Responses.knockbackOn(), + }, + { + id: 'AAIS Monk Cross Attack', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Monk' }, + response: Responses.tankBuster(), + }, + // ---------------- Ketuduke ---------------- + { + id: 'AAIS Ketuduke Tidal Roar', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Ketuduke', capture: false }, + response: Responses.bleedAoe(), + }, + { + id: 'AAIS Ketuduke Spring Crystals', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Ketuduke', capture: false }, + run: (data) => { + data.ketuSpringCrystalCount++; + data.ketuCrystalAdd = []; + }, + }, + { + id: 'AAIS Ketuduke Spring Crystal Collect', + type: 'AddedCombatant', + netRegex: { npcNameId: '12607' }, + run: (data, matches) => data.ketuCrystalAdd.push(matches), + }, + { + id: 'AAIS Ketuduke Foamy Fetters Bubble Weave', + type: 'GainsEffect', + // ECC = Foamy Fetters + // E9F = Bubble Weave + netRegex: { effectId: ['ECC', 'E9F'] }, + delaySeconds: (data, matches) => { + data.ketuBuffCollect.push(matches); + return data.ketuBuffCollect.length === 4 ? 0 : 0.5; + }, + alertText: (data, _matches, output) => { + if (data.ketuBuffCollect.length === 0) + return; + + const myBuff = data.ketuBuffCollect.find((x) => x.target === data.me)?.effectId; + if (myBuff === undefined) + return; + data.ketuBuff = myBuff === 'ECC' ? 'fetters' : 'bubble'; + + const player = data.party.member( + data.ketuBuffCollect.find((x) => { + return x.target !== data.me && x.effectId === myBuff; + })?.target, + ); + if (data.ketuBuff === 'fetters') + return output.fetters!({ player: player }); + return output.bubble!({ player: player }); + }, + run: (data) => data.ketuBuffCollect = [], + outputStrings: { + fetters: { + en: 'Fetters (w/${player})', + }, + bubble: { + en: 'Bubble (w/${player})', + }, + }, + }, + { + id: 'AAIS Ketuduke Hydro Buff Counter', + type: 'StartsUsing', + // TODO = Hydrobullet (spread) + // TODO = Hydrofall (stack) + netRegex: { id: ['TODO', 'TODO'], source: 'Ketuduke', capture: false }, + run: (data) => data.ketuHydroBuffCount++, + }, + { + id: 'AAIS Ketuduke Hydro Buff 1', + comment: { + en: `These directions assume that you always pick a square in the same + quadrant as the crystal specified. + For brevity, "next to" always means horizontal east/west of something. + The number in parentheses is the limit cut wind you should be on.`, + }, + type: 'StartsUsing', + netRegex: { id: ['TODO', 'TODO'], source: 'Ketuduke' }, + condition: (data) => data.ketuHydroBuffCount === 1 || data.ketuHydroBuffCount === 6, + durationSeconds: 8, + alertText: (data, matches, output) => { + // If somebody died and missed a debuff, good luck. + if (data.ketuBuff === undefined) + return; + + // Bubble always does the same thing. + if (data.ketuBuff === 'bubble') + return output.bubble!(); + + // Two layouts, one with each crystal in its own column ("split") + // and one with two columns that have an H and a V in that same column ("columns"). + // Wind doesn't matter, as "1" will always be on the horizontal crystals. + // + // STACK FETTERS COLUMNS (kitty to horizontal) + // 2 2 + // + - - - - + + - - - - + + // | V f | 1 | H f | 1 + // | H b | => | V | + // | H b | | V | + // 1 | f V | 1 | H f | + // + - - - - + + - - - - + + // 2 2 + // + // STACK FETTERS SPLIT (on horizontal) + // 2 2 + // + - - - - + + - - - - + + // 1 | V | 1 | V | + // | H b | => | f H | + // | V | | V | + // | b H | 1 | H f | 1 + // + - - - - + + - - - - + + // 2 2 + // + // SPREAD FETTERS COLUMNS (adjacent to vertical) + // 2 2 + // + - - - - + + - - - - + + // | V f | 1 | f H b | 1 + // | H b | => | V | + // | H b | | V | + // 1 | V f | 1 | H b f | + // + - - - - + + - - - - + + // 2 2 + // + // SPREAD FETTERS SPLIT (kitty to vertical) + // 2 2 + // + - - - - + + - - - - + + // | V | 1 | V | 1 + // | f b H | => | f H b | + // | V | | V | + // 1 | H b f | 1 | b H f | + // + - - - - + + - - - - + + // 2 2 + + const isSpread = matches.id === 'TODO'; + const horizontal = data.ketuCrystalAdd.filter((x) => isHorizontalCrystal(x)); + const vertical = data.ketuCrystalAdd.filter((x) => !isHorizontalCrystal(x)); + + const [firstHorizontal] = horizontal; + if (horizontal.length !== 2 || vertical.length !== 2 || firstHorizontal === undefined) + return; + const firstHorizX = parseFloat(firstHorizontal.x); + // It's split if no vertical is in the same column as either horizontal. + const isSplitLayout = + vertical.find((line) => Math.abs(parseFloat(line.x) - firstHorizX) < 1) === undefined; + + if (isSpread) + return isSplitLayout ? output.fettersSpreadSplit!() : output.fettersSpreadColumn!(); + return isSplitLayout ? output.fettersStackSplit!() : output.fettersStackColumn!(); + }, + infoText: (_data, matches, output) => { + return matches.id === 'TODO' ? output.spread!() : output.stacks!(); + }, + outputStrings: { + spread: Outputs.spread, + stacks: { + en: 'Stacks', + }, + bubble: { + en: 'Next to Horizontal (1)', + }, + fettersSpreadSplit: { + en: 'Diagonal of Vertical (2)', + }, + fettersSpreadColumn: { + en: 'Next to Vertical (2)', + }, + fettersStackSplit: { + en: 'On Horizontal (1)', + }, + fettersStackColumn: { + en: 'Diagonal of Horizontal (1)', + }, + }, + }, + { + id: 'AAIS Ketuduke Hydro Buff 2', + type: 'StartsUsing', + netRegex: { id: ['TODO', 'TODO'], source: 'Ketuduke' }, + condition: (data) => data.ketuHydroBuffCount === 2, + alertText: (_data, matches, output) => { + return matches.id === 'TODO' ? output.spread!() : output.stacks!(); + }, + outputStrings: { + spread: { + en: 'Spread => Stacks', + }, + stacks: { + en: 'Stacks => Spread', + }, + }, + }, + { + id: 'AAIS Ketuduke Receding Twintides', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Ketuduke', capture: false }, + response: Responses.getOutThenIn(), + }, + { + id: 'AAIS Ketuduke Encroaching Twintides', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Ketuduke', capture: false }, + response: Responses.getInThenOut(), + }, + { + id: 'AAIS Ketuduke Spring Crystals 2', + type: 'AddedCombatant', + // This calls absurdly early. <_< + netRegex: { npcNameId: '12607', capture: false }, + condition: (data) => data.ketuSpringCrystalCount === 2 && data.ketuCrystalAdd.length === 4, + alertText: (data, _matches, output) => { + const horizontal = data.ketuCrystalAdd.filter((x) => isHorizontalCrystal(x)); + const vertical = data.ketuCrystalAdd.filter((x) => !isHorizontalCrystal(x)); + if (horizontal.length !== 2 || vertical.length !== 2) + return; + + // Crystal positions are always -15, -5, 5, 15. + + // Check if any verticals are on the outer vertical edges. + for (const line of vertical) { + const y = parseFloat(line.y); + if (y < -10 || y > 10) + return output.eastWestSafe!(); + } + + // Check if any horizontals are on the outer horizontal edges. + for (const line of horizontal) { + const x = parseFloat(line.x); + if (x < -10 || x > 10) + return output.northSouthSafe!(); + } + + return output.cornersSafe!(); + }, + outputStrings: { + northSouthSafe: { + en: 'North/South', + }, + eastWestSafe: { + en: 'East/West', + }, + cornersSafe: { + en: 'Corners', + }, + }, + }, + // ---------------- second trash ---------------- + { + id: 'AAIS Wood Golem Ancient Aero III', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Wood Golem' }, + condition: (data) => data.CanSilence(), + response: Responses.interrupt('alarm'), + }, + { + id: 'AAIS Wood Golem Tornado', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Wood Golem' }, + response: (data, matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + tornadoOn: { + en: 'Away from ${player}', + }, + tornadoOnYou: { + en: 'Tornado on YOU', + }, + }; + + if (data.me === matches.target) + return { alertText: output.tornadoOnYou!() }; + return { infoText: output.tornadoOn!({ player: data.party.member(matches.target) }) }; + }, + }, + { + id: 'AAIS Wood Golem Tornado Bind', + type: 'GainsEffect', + netRegex: { effectId: 'EC0' }, + condition: (data) => data.CanCleanse(), + infoText: (data, matches, output) => { + return output.text!({ player: data.party.member(matches.target) }); + }, + outputStrings: { + text: { + en: 'Esuna ${player}', + de: 'Medica ${player}', + fr: 'Guérison sur ${player}', + ja: 'エスナ: ${player}', + cn: '解除死亡宣告: ${player}', + ko: '${player} 에스나', + }, + }, + }, + { + id: 'AAIS Wood Golem Ovation', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Wood Golem', capture: false }, + response: Responses.getBehind('info'), + }, + { + id: 'AAIS Islekeeper Gravity Force', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Islekeeper' }, + response: Responses.stackMarkerOn(), + }, + { + id: 'AAIS Islekeeper Isle Drop', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Islekeeper', capture: false }, + response: Responses.getBehind('info'), + }, + { + id: 'AAIS Islekeeper Ancient Quaga', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Islekeeper', capture: false }, + response: Responses.aoe(), + }, + { + id: 'AAIS Islekeeper Ancient Quaga Enrage', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Aloalo Islekeeper', capture: false }, + alarmText: (_data, _matches, output) => output.text!(), + outputStrings: { + text: { + en: 'Kill Islekeeper!', + }, + }, + }, + // ---------------- Lala ---------------- + { + id: 'AAIS Lala Inferno Theorem', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Lala', capture: false }, + response: Responses.aoe(), + }, + { + id: 'AAIS Lala Rotation Tracker', + type: 'HeadMarker', + netRegex: { id: ['01E4', '01E5'], target: 'Lala' }, + run: (data, matches) => data.lalaBossRotation = matches.id === '01E4' ? 'clock' : 'counter', + }, + { + id: 'AAIS Lala Angular Addition Tracker', + type: 'Ability', + netRegex: { id: ['TODO', 'TODO'], source: 'Lala' }, + run: (data, matches) => data.lalaBossTimes = matches.id === 'TODO' ? 3 : 5, + }, + { + id: 'AAIS Lala Arcane Blight', + type: 'StartsUsing', + netRegex: { id: ['TODO1', 'TODO2', 'TODO3', 'TODO4'], source: 'Lala' }, + alertText: (data, matches, output) => { + const initialDir = { + 'TODO1': 2, // initial back safe + 'TODO2': 0, // initial front safe + 'TODO3': 1, // initial right safe + 'TODO4': 3, // initial left safe + }[matches.id]; + if (initialDir === undefined) + return; + if (data.lalaBossTimes === undefined) + return; + if (data.lalaBossRotation === undefined) + return; + const rotationFactor = data.lalaBossRotation === 'clock' ? 1 : -1; + const finalDir = (initialDir + rotationFactor * data.lalaBossTimes + 8) % 4; + + const diff = (finalDir - initialDir + 4) % 4; + if (diff !== 1 && diff !== 3) + return; + const rotateStr = diff === 1 ? output.dirClock!() : output.dirCounter!(); + const dirStr = { + 0: output.front!(), + 1: output.right!(), + 2: output.back!(), + 3: output.left!(), + }[finalDir]; + + return output.text!({ rotate: rotateStr, dir: dirStr }); + }, + run: (data) => { + delete data.lalaBossTimes; + delete data.lalaBossRotation; + }, + outputStrings: { + text: { + en: '${rotate} (${dir})', + }, + front: { + en: 'in front', + }, + back: { + en: 'get behind', + }, + left: { + en: 'on left flank', + }, + right: { + en: 'on right flank', + }, + dirClock: { + en: 'Rotate Left', + }, + dirCounter: { + en: 'Rotate Right', + }, + }, + }, + { + id: 'AAIS Lala Analysis Collect', + type: 'GainsEffect', + netRegex: { effectId: ['E8E', 'E8F', 'E90', 'E91'] }, + condition: Conditions.targetIsYou(), + run: (data, matches) => { + const effectMap: { [effectId: string]: typeof data.lalaUnseen } = { + 'E8E': 'front', + 'E8F': 'back', + 'E90': 'right', + 'E91': 'left', + } as const; + data.lalaUnseen = effectMap[matches.effectId]; + }, + }, + { + id: 'AAIS Lala Times Collect', + type: 'GainsEffect', + netRegex: { effectId: ['E89', 'ECE'] }, + condition: Conditions.targetIsYou(), + run: (data, matches) => { + const effectMap: { [effectId: string]: typeof data.lalaPlayerTimes } = { + 'E89': 3, + 'ECE': 5, + } as const; + data.lalaPlayerTimes = effectMap[matches.effectId]; + }, + }, + { + id: 'AAIS Lala Player Rotation Collect', + type: 'HeadMarker', + netRegex: { id: ['01ED', '01EE'] }, + condition: Conditions.targetIsYou(), + run: (data, matches) => { + const idMap: { [id: string]: typeof data.lalaPlayerRotation } = { + '01ED': 'counter', + '01EE': 'clock', + } as const; + data.lalaPlayerRotation = idMap[matches.id]; + }, + }, + { + id: 'AAIS Lala Targeted Light', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Lala', capture: false }, + alertText: (data, _matches, output) => { + const initialUnseen = data.lalaUnseen; + if (initialUnseen === undefined) + return; + + const initialDir = { + front: 0, + right: 1, + back: 2, + left: 3, + }[initialUnseen]; + + const rotation = data.lalaPlayerRotation; + if (rotation === undefined) + return; + const times = data.lalaPlayerTimes; + if (times === undefined) + return; + + // The safe spot rotates, so the player counter-rotates. + const rotationFactor = rotation === 'clock' ? -1 : 1; + const finalDir = (initialDir + rotationFactor * times + 8) % 4; + + return { + 0: output.front!(), + 1: output.right!(), + 2: output.back!(), + 3: output.left!(), + }[finalDir]; + }, + run: (data) => { + delete data.lalaUnseen; + delete data.lalaPlayerTimes; + }, + outputStrings: { + front: { + en: 'Face Towards Lala', + }, + back: { + en: 'Look Away from Lala', + }, + left: { + en: 'Left Flank towards Lala', + }, + right: { + en: 'Right Flank towards Lala', + }, + }, + }, + { + id: 'AAIS Lala Strategic Strike', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Lala' }, + response: Responses.tankBuster(), + }, + { + id: 'AAIS Lala Planar Tactics', + type: 'GainsEffect', + // E8B = Surge Vector + // E8C = Subtractive Suppressor Alpha + netRegex: { effectId: ['E8C', 'E8B'] }, + condition: (data, matches) => { + data.lalaSubAlpha.push(matches); + return data.lalaSubAlpha.length === 6; + }, + durationSeconds: 7, + // Only run once, as Surge Vector is used again. + suppressSeconds: 9999999, + response: (data, _matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + one: { + en: 'One', + }, + closeTwo: { + en: 'Close Two', + }, + farTwo: { + en: 'Far Two', + }, + eitherTwo: { + en: 'Either Two (w/${player})', + }, + three: { + en: 'Three', + }, + farTwoOn: { + en: '(far two on ${players})', + }, + + unknownNum: { + en: '${num}', + }, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + }; + + // Assumptions: "close two" and "three" stack+run together, while "far two" and "one" + // run towards each other and meet for the stack. Stacks COULD be on both/neither twos, + // which makes which two you are ambiguous. + const stacks = data.lalaSubAlpha.filter((x) => x.effectId === 'E8B').map((x) => x.target); + const nums = data.lalaSubAlpha.filter((x) => x.effectId === 'E8C'); + const myNumberStr = nums.find((x) => x.target === data.me)?.count; + if (myNumberStr === undefined) + return; + const myNumber = parseInt(myNumberStr); + if (myNumber < 1 || myNumber > 4) + return; + + const defaultOutput = { + alertText: output.unknownNum!({ num: output[`num${myNumber}`]!() }), + } as const; + + if (stacks.length !== 2 || nums.length !== 4) + return defaultOutput; + + const one = nums.find((x) => parseInt(x.count) === 1)?.target; + if (one === undefined) + return defaultOutput; + const isOneStack = stacks.includes(one); + const twos = nums.filter((x) => parseInt(x.count) === 2).map((x) => x.target); + + const farTwos: string[] = []; + for (const thisTwo of twos) { + // can this two stack with the one? + const isThisTwoStack = stacks.includes(thisTwo); + if (isThisTwoStack && !isOneStack || !isThisTwoStack && isOneStack) + farTwos.push(thisTwo); + } + + const [farTwo1, farTwo2] = farTwos; + if (farTwos.length === 0 || farTwo1 === undefined) + return defaultOutput; + + const isPlayerFarTwo = farTwos.includes(data.me); + + // Worst case adjust + if (isPlayerFarTwo && farTwo2 !== undefined) { + const otherPlayer = farTwo1 === data.me ? farTwo2 : farTwo1; + return { alarmText: output.eitherTwo!({ player: data.party.member(otherPlayer) }) }; + } + + let playerRole: string; + if (one === data.me) { + playerRole = output.one!(); + } else if (twos.includes(data.me)) { + playerRole = isPlayerFarTwo ? output.farTwo!() : output.closeTwo!(); + } else { + playerRole = output.three!(); + } + + if (isPlayerFarTwo) + return { alertText: playerRole }; + + return { + alertText: playerRole, + infoText: output.farTwoOn!({ players: farTwos.map((x) => data.party.member(x)) }), + }; + }, + }, + { + id: 'AAIS Lala Forward March', + type: 'GainsEffect', + // E83 = Forward March + netRegex: { effectId: 'E83' }, + condition: Conditions.targetIsYou(), + delaySeconds: (_data, matches) => parseFloat(matches.duration) - 8, + durationSeconds: 4, + alertText: (data, _matches, output) => { + const rotation = data.lalaPlayerRotation; + if (rotation === undefined) + return; + const times = data.lalaPlayerTimes; + if (times === undefined) + return; + + const rotationFactor = rotation === 'clock' ? 1 : -1; + const finalDir = (rotationFactor * times + 8) % 4; + if (finalDir === 1) + return output.right!(); + if (finalDir === 3) + return output.left!(); + }, + run: (data) => { + delete data.lalaPlayerRotation; + delete data.lalaPlayerTimes; + }, + outputStrings: { + // This isn't confusing at all. + left: { + en: 'Rotate Left (your right is forward)', + }, + right: { + en: 'Rotate Right (your left is forward)', + }, + }, + }, + { + id: 'AAIS Lala Spatial Tactics', + type: 'GainsEffect', + // E8D = Subtractive Suppressor Beta + netRegex: { effectId: 'E8D' }, + condition: Conditions.targetIsYou(), + suppressSeconds: 999999, + alertText: (_data, matches, output) => { + const num = parseInt(matches.count); + if (num < 1 || num > 4) + return; + return output[`num${num}`]!(); + }, + outputStrings: { + num1: { + en: 'One (avoid all)', + }, + num2: { + en: 'Two (stay middle)', + }, + num3: { + en: 'Three (adjacent to middle)', + }, + num4: { + en: 'Four', + }, + }, + }, + // ---------------- Statice ---------------- + { + id: 'AAIS Statice Aero IV', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Statice', capture: false }, + response: Responses.aoe(), + }, + { + id: 'AAIS Statice Trick Reload', + type: 'Ability', + // TODO = Locked and Loaded + // TODO = Misload + netRegex: { id: ['TODO', 'TODO'], source: 'Statice' }, + preRun: (data, matches) => data.staticeBullet.push(matches), + alertText: (data, _matches, output) => { + // Statice loads 8 bullets, two are duds. + // The first and the last are always opposite, and one of them is a dud. + // The first/ last bullets are for Trapshooting and the middle six are for Trigger Happy. + const [bullet] = data.staticeBullet; + if (data.staticeBullet.length !== 1 || bullet === undefined) + return; + const isStack = bullet.id === 'TODO'; + data.staticeTrapshooting = isStack ? ['stack', 'spread'] : ['spread', 'stack']; + return isStack ? output.stackThenSpread!() : output.spreadThenStack!(); + }, + infoText: (data, _matches, output) => { + const lastBullet = data.staticeBullet[data.staticeBullet.length - 1]; + if (data.staticeBullet.length < 2 || data.staticeBullet.length > 7) + return; + if (lastBullet?.id !== 'TODO') + return; + data.staticeTriggerHappy = data.staticeBullet.length - 1; + return output.numSafeLater!({ num: output[`num${data.staticeTriggerHappy}`]!() }); + }, + run: (data) => { + if (data.staticeBullet.length === 8) + data.staticeBullet = []; + }, + outputStrings: { + stackThenSpread: Outputs.stackThenSpread, + spreadThenStack: Outputs.spreadThenStack, + numSafeLater: { + en: '(${num} safe later)', + }, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, + }, + }, + { + id: 'AAIS Statice Trapshooting', + type: 'StartsUsing', + netRegex: { id: ['TODO', 'TODO'], source: 'Statice', capture: false }, + alertText: (data, _matches, output) => { + const mech = data.staticeTrapshooting.shift(); + if (mech === undefined) + return; + return output[mech]!(); + }, + outputStrings: { + spread: Outputs.spread, + stack: Outputs.stackMarker, + }, + }, + { + id: 'AAIS Statice Trigger Happy', + type: 'StartsUsing', + netRegex: { id: 'TODO', source: 'Statice', capture: false }, + alertText: (data, _matches, output) => { + const num = data.staticeTriggerHappy; + if (num === undefined) + return; + return output[`num${num}`]!(); + }, + run: (data) => delete data.staticeTriggerHappy, + outputStrings: { + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, + }, + }, + { + id: 'AAIS Statice Bull\'s-eye', + type: 'GainsEffect', + netRegex: { effectId: 'E9E' }, + delaySeconds: (data, matches) => { + data.staticeDart.push(matches); + return data.staticeDart.length === 3 ? 0 : 0.5; + }, + response: (data, _matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + dartOnYou: { + en: 'Dart on YOU', + }, + noDartOnYou: { + en: 'Flex', + }, + flexCall: { + en: '(${player} flex)', + }, + }; + + if (data.staticeDart.length === 0) + return; + + const dartTargets = data.staticeDart.map((x) => x.target); + + if (!dartTargets.includes(data.me)) + return { alertText: output.noDartOnYou!() }; + + const partyNames = data.party.partyNames; + + const flexers = partyNames.filter((x) => !dartTargets.includes(x)); + const [flex] = flexers; + const flexPlayer = flexers.length === 1 ? data.party.member(flex) : undefined; + + return { + alertText: output.dartOnYou!(), + infoText: output.flexCall!({ player: flexPlayer }), + }; + }, + run: (data) => data.staticeDart = [], + }, + { + id: 'AAIS Statice Pop', + type: 'StartsUsing', + // TODO: this might need a slight delay + netRegex: { id: 'TODO', source: 'Statice', capture: false }, + suppressSeconds: 20, + response: Responses.knockback(), + }, + { + id: 'AAIS Statice Face', + type: 'GainsEffect', + // DD2 = Forward March + // DD3 = About Face + // DD4 = Left Face + // DD5 = Right Face + netRegex: { effectId: ['DD2', 'DD3', 'DD4', 'DD5'] }, + condition: Conditions.targetIsYou(), + delaySeconds: (_data, matches) => parseFloat(matches.duration) - 7, + durationSeconds: 5, + alertText: (data, matches, output) => { + const mechName = data.staticeTrapshooting.shift(); + const mech = mechName === undefined ? output.unknown!() : output[mechName]!(); + return { + 'DD2': output.forward!({ mech: mech }), + 'DD3': output.backward!({ mech: mech }), + 'DD4': output.left!({ mech: mech }), + 'DD5': output.right!({ mech: mech }), + }[matches.effectId]; + }, + outputStrings: { + forward: { + en: 'Forward March => ${mech}', + }, + backward: { + en: 'Backward March => ${mech}', + }, + left: { + en: 'Left March => ${mech}', + }, + right: { + en: 'Right March => ${mech}', + }, + spread: Outputs.spread, + stack: Outputs.stackMarker, + unknown: Outputs.unknown, + }, + }, + ], + timelineReplace: [ + { + locale: 'en', + replaceText: { + 'Hydrobullet/Hydrofall': 'Hydrobullet/fall', + 'Hydrofall/Hydrobullet': 'Hydrofall/bullet', + 'Receding Twintides/Encroaching Twintides': 'Receding/Encroaching Twintides', + 'Far Tide/Near Tide': 'Far/Near Tide', + }, + }, + ], +}; + +export default triggerSet; diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt new file mode 100644 index 0000000000..e58d71fa97 --- /dev/null +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -0,0 +1,380 @@ +# This file was autogenerated from running ts-node util/sync_files.ts. +# DO NOT EDIT THIS FILE DIRECTLY. + +### ANOTHER ALOALO ISLAND +# ZoneId: 49B + +hideall "--Reset--" +hideall "--sync--" + +0.0 "--Reset--" sync / 00:0839::.*is no longer sealed/ window 100000 jump 0 + +#~~~~~~~~~~# +# KETUDUKE # +#~~~~~~~~~~# + +# -p TODO:1015.2 +# -ii TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO + +1000.0 "--sync--" sync / 00:0839::The Dawn Trial will be sealed off/ window 10000,0 +1010.2 "--sync--" sync / 14:[^:]*:Ketuduke:TODO:/ window 20,20 +1015.2 "Tidal Roar" sync / 1[56]:[^:]*:Ketuduke:TODO:/ + +1022.0 "--middle--" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1027.0 "Spring Crystals 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1034.0 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1041.0 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1050.0 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1060.0 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1062.0 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1065.0 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:TODO:/ +1065.1 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ + +1074.0 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1077.1 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1084.3 "Blowing Bubbles" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1091.4 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1096.3 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1099.6 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1102.5 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ + +1113.6 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1118.9 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1130.3 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1130.9 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1133.4 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1134.0 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1134.0 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:TODO:/ + +1143.7 "Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1149.7 "Roar" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1154.6 "Spring Crystals 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1164.6 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1177.0 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1177.6 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:TODO:/ +1182.7 "Updraft" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1184.1 "Hundred Lashings" sync / 1[56]:[^:]*:Aloalo Zaratan:TODO:/ + +1190.7 "--middle--" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1199.4 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1202.4 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1210.4 "Angry Seas" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1211.6 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1212.2 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:[^:]*:(TODO|TODO):/ # this sometimes has the wrong source +1214.8 "Spring Crystals 3" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1216.8 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1221.8 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1227.8 "Fluke Typhoon (cast)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1233.8 "Fluke Typhoon" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1236.4 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:TODO:/ +1238.8 "Burst x4" sync / 1[56]:[^:]*:Ketuduke:TODO:/ + +1246.7 "Spring Crystals 4" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1253.7 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1260.7 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1269.8 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1279.9 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1281.9 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1284.9 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:TODO:/ +1285.0 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ + +1293.9 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1299.2 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1310.6 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1311.2 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1313.7 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ +1314.3 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1314.3 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +# ??? + +# ALL ENCOUNTER ABILITIES +# TODO --sync-- Ketuduke repositioning +# TODO Riptide ability on players from Angry Seas Airy Bubble when you step in one +# TODO Fetters ability on players from Angry Seas Airy Bubble when you step in one after TODO Riptide +# TODO --sync-- auto damage from Ketuduke +# TODO Spring Crystals cast and ability to summon Spring Crystal adds (all flavors) +# TODO 衝撃 self-targeted ability from Spring Crystal orbs +# TODO 衝撃 self-targeted ability from Spring Crystal rupees +# TODO Saturate cast and damage from Spring Crystal orb circle +# TODO Saturate cast and damage from Spring Crystal rupee line laser +# TODO Bubble Net self-targeted cast before Bubbles along with TODO during Spring Crystals 1 +# TODO Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 1 +# TODO Fluke Typhoon self-targeted cast before TODO knockback during Spring Crystals 3 +# TODO Fluke Typhoon cast and knockback ability on Spring Crystal and players during Spring Crystals 3 +# TODO Fluke Gale self-targeted cast that adds limit cut winds +# TODO Fluke Gale cast and ability for limit cut 1 wind +# TODO Fluke Gale cast and ability for limit cut 2 wind +# TODO Hydrofall self-targeted cast that adds stack markers +# TODO Hydrofall ability on players to give "stack second" before Blowing Bubbles +# TODO Hydrofall ability on players that adds stack debuffs +# TODO Hydrofall damage from stack debuffs +# TODO Hydrobullet self-targeted cast that adds stack markers +# TODO Hydrobullet ability on players that adds spread debuffs +# TODO Hydrobullet damage from spread debuffs +# TODO Strewn Bubbles self-targeted cast before TODO Sphere Shatter moving arches +# TODO Sphere Shatter damage from moving arches +# TODO Blowing Bubbles self-targeted cast that adds Airy Bubble Adds +# TODO Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one +# TODO Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after TODO Riptide +# TODO Angry Seas self-targeted cast for TODO red line knockback +# TODO Angry Seas cast and knockback damage from red line +# TODO Burst tower damage +# TODO Big Burst tower failure damage +# TODO Roar self-targeted cast that summons Zaratan adds +# TODO Bubble Net self-targeted cast before Bubbles along with TODO during Spring Crystals 2 +# TODO Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 2 +# TODO Updraft self-targeted cast to boost adds and players into the air +# TODO Updraft ability on players for TODO Updraft +# TODO Hundred Lashings cast and damage for non-bubbled Zaratan 180 cleave (no damage on bubbled players) +# TODO Hundred Lashings self-targeted cast for bubbled Zaratan adds +# TODO Hundred Lashings cast and damage for bubbled Zaratan 180 cleave (no damage on non-bubbled players) +# TODO Receding Twintides cast and damage for initial out during out->in +# TODO Near Tide fast cast and damage for second out during in->out with TODO Encroaching Twintides +# TODO Encroaching Twintides cast and damage for initial in during in->out +# TODO Far Tide fast cast and damage for second in during out->in with TODO Receding Twintides +# TODO Hydrobomb self-targeted cast for TODO puddles +# TODO Hydrobomb cast and damage for 3x puddles duruing TODO Blowing Bubbles +# TODO Tidal Roar self-targeted cast for raidwide aoe +# TODO Tidal Roar damage from TODO +# TODO Hydrobullet ability on players to give "spread second" before Blowing Bubbles + + +#~~~~~~# +# LALA # +#~~~~~~# + +# -p TODO:2011.1 +# -ii TODO TODO TODO TODO TODO TODO TODO TODO + +2000.0 "--sync--" sync / 00:0839::The Dusk Trial will be sealed off/ window 10000,0 +2006.1 "--sync--" sync / 14:[^:]*:Lala:TODO:/ window 20,20 +2011.1 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ + +2013.2 "--middle--" sync / 1[56]:[^:]*:Lala:TODO:/ +2018.3 "Angular Addition" sync / 1[56]:[^:]*:Lala:(TODO|TODO):/ +2026.4 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(TODO1|TODO2|TODO3|TODO4):/ + +2029.6 "--middle--" sync / 1[56]:[^:]*:Lala:TODO:/ +2034.7 "Analysis" sync / 1[56]:[^:]*:Lala:TODO:/ +2039.8 "Arcane Array 1" sync / 1[56]:[^:]*:Lala:TODO:/ +2044.9 "Angular Addition" sync / 1[56]:[^:]*:Lala:(TODO|TODO):/ +2045.6 "Bright Pulse" sync / 1[56]:[^:]*:Lala:TODO:/ +2046.9 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:TODO:/ +2053.0 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(TODO1|TODO2|TODO3|TODO4):/ +# This can be +1.2s if it's on the final square instead of penultimate. +2054.1 "Radiance 2" #sync / 1[56]:[^:]*:Arcane Globe:TODO:/ +2061.2 "Targeted Light" sync / 1[56]:[^:]*:Lala:TODO:/ + +2072.5 "Strategic Strike" sync / 1[56]:[^:]*:Lala:TODO:/ + +2085.6 "Planar Tactics" sync / 1[56]:[^:]*:Lala:TODO:/ +2100.7 "Arcane Mine" sync / 1[56]:[^:]*:Lala:TODO:/ +2108.6 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:TODO:/ + +2112.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ +2122.9 "Strategic Strike" sync / 1[56]:[^:]*:Lala:TODO:/ + +2131.1 "--middle--" sync / 1[56]:[^:]*:Lala:TODO:/ +2138.3 "Spatial Tactics" sync / 1[56]:[^:]*:Lala:TODO:/ +2143.4 "Arcane Array 2" sync / 1[56]:[^:]*:Lala:TODO:/ +2149.2 "Bright Pulse" sync / 1[56]:[^:]*:Lala:TODO:/ +2150.5 "Inferno Divide 1" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 +2150.5 "Radiance" sync / 1[56]:[^:]*:Arcane Globe:TODO:/ +2152.9 "Inferno Divide 2" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 +2156.6 "Inferno Divide 3" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 +2157.6 "Angular Addition" sync / 1[56]:[^:]*:Lala:(TODO|TODO):/ +2157.8 "Inferno Divide 4" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 +2160.2 "Inferno Divide 5" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 +2165.6 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(TODO1|TODO2|TODO3|TODO4):/ + +2173.7 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ +2184.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ + +2196.9 "Symmetric Surge" sync / 1[56]:[^:]*:Lala:TODO:/ +2202.0 "Constructive Figure" sync / 1[56]:[^:]*:Lala:TODO:/ +2207.1 "Arcane Plot" sync / 1[56]:[^:]*:Lala:TODO:/ +2212.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:TODO:/ +2221.2 "Arcane Point" sync / 1[56]:[^:]*:Lala:TODO:/ +2221.8 "Aero II" sync / 1[56]:[^:]*:Aloalo Golem:TODO:/ +2222.0 "Powerful Light" sync / 1[56]:[^:]*:Lala:TODO:/ +2230.3 "Explosive Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ +2234.7 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:TODO:/ +2235.4 "Telluric Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ + +2248.4 "Strategic Strike" sync / 1[56]:[^:]*:Lala:TODO:/ +2256.5 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ + +2263.6 "--middle--" sync / 1[56]:[^:]*:Lala:TODO:/ +2269.0 "Analysis" sync / 1[56]:[^:]*:Lala:TODO:/ +2274.1 "Arcane Array 3" sync / 1[56]:[^:]*:Lala:TODO:/ +2279.2 "Angular Addition" sync / 1[56]:[^:]*:Lala:(TODO|TODO):/ +2279.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:TODO:/ +2281.2 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:TODO:/ +2287.3 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(TODO1|TODO2|TODO3|TODO4):/ +2290.9 "Radiance 2" sync / 1[56]:[^:]*:Arcane Globe:TODO:/ +2295.6 "Targeted Light" sync / 1[56]:[^:]*:Lala:TODO:/ +2306.7 "Strategic Strike" sync / 1[56]:[^:]*:Lala:TODO:/ + +2316.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ + +2319.9 "--sync--" sync / 14:[^:]*:Lala:TODO:/ window 20,20 +2329.9 "Inferno Theorem Enrage" sync / 1[56]:[^:]*:Lala:TODO:/ + + +# ALL ENCOUNTER ABILITIES +# 368 attack auto damage from Lala +# TODO --sync-- repositioning for Lala +# TODO Angular Addition self-targeted ability to give boss III +# TODO1 Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave +# TODO2 Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave +# TODO3 Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave +# TODO4 Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave +# TODO Arcane Blight cast and damage from 270 degree rotating cleave +# TODO Arcane Array self-targeted cast to summon moving blue squares (#1) +# TODO Bright Pulse cast and damage for initial blue square +# TODO Bright Pulse damage from moving blue square +# TODO Inferno Divide orange square cross explosion damage during Spatial Tactics +# TODO Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #1, #3) +# TODO Analysis self-targeted cast before giving players +# TODO Planar Tactics self-targeted cast before Arcane Mines +# TODO Arcane Mine self-targeted cast to create 8 Arcane Mine squares +# TODO Arcane Mine cast and damage for initial Arcane Mine squares +# TODO Arcane Combustion damage from walking over an Arcane Mine +# TODO Massive Explosion damage from failing to resolve Subractive Suppressor Alpha +# TODO Massive Explosion damage from failing to resolve Subractive Suppressor Beta +# TODO Symmetric Surge damage from two person stack that gives magic vuln up +# TODO Arcane Array self-targeted cast to summon moving blue squares (#2) +# TODO Spatial Tactics self-targeted cast prior to Arcane Array 2 +# TODO Symmetric Surge self-targeted cast before this mechanic +# TODO Arcane Plot self-targeted cast to summon blue squares for Symmetric Surge +# TODO Constructive Figure self-targeted cast that summons Aloalo Golem on edge +# TODO Aero II cast and line damage from Aloalo Golem during Symmetric Surge +# TODO Arcane Point self-targeted cast that gives players TODO Powerful Light spreads +# TODO Powerful Light spread damage on players that turn the squares they are on blue +# TODO Explosive Theorem self-targeted cast for very large spreads +# TODO Explosive Theorem cast and damage on players for spreads with Telluric Theorem puddles +# TODO Telluric Theorem cast and damage for large puddles from Explosive Theorem +# TODO Strategic Strike cast and damage for non-cleaving 3x tankbuster +# TODO Inferno Theorem cast and raidwide damage +# TODO Inferno Theorem cast and enrage damage +# TODO Targeted Light self-targeted cast for weak spot boss tether +# TODO Targeted Light cast and damage on players for TODO +# TODO Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) +# TODO Angular Addition self-targeted ability to give boss V + + +#~~~~~~~~~~~~~~~~~~~~# +# STATICE WITH A GUN # +#~~~~~~~~~~~~~~~~~~~~# + +# -p TODO:3013.8 +# -ii TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO + +3000.0 "--sync--" sync / 00:0839::The Midnight Trial will be sealed off/ window 10000,0 +3008.8 "--sync--" sync / 14:[^:]*:Statice:TODO:/ window 20,20 +3013.8 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ + +3018.0 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ +3023.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:TODO:/ +3038.2 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:TODO:/ +3048.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:TODO:/ +3056.5 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ +3070.6 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:TODO:/ +3074.6 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ + +3081.8 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ +3087.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:TODO:/ +3101.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ +3106.3 "Dartboard of Dancing Explosives " sync / 1[56]:[^:]*:Statice:TODO:/ +3120.1 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:TODO:/ +3122.0 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ +3125.3 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:TODO:/ + +3132.3 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ +3137.7 "Surprise Balloon" sync / 1[56]:[^:]*:Statice:TODO:/ +3144.8 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:TODO:/ +3149.8 "Surprise Needle 1" #sync / 1[56]:[^:]*:Needle:TODO:/ +3150.7 "Pop 1" sync / 1[56]:[^:]*:Statice:TODO:/ +3151.5 "Surprise Needle 2" #sync / 1[56]:[^:]*:Needle:TODO:/ +3152.4 "Trigger Happy" sync / 1[56]:[^:]*:Statice:TODO:/ +3153.2 "Surprise Needle 3" #sync / 1[56]:[^:]*:Needle:TODO:/ +3154.9 "Surprise Needle 4" #sync / 1[56]:[^:]*:Needle:TODO:/ +3155.6 "Pop 2" sync / 1[56]:[^:]*:Statice:TODO:/ +3160.4 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:TODO:/ + +3172.5 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ +3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ +3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ +3189.2 "Present Box" sync / 1[56]:[^:]*:Statice:TODO:/ +3194.3 "Fireworks" sync / 1[56]:[^:]*:Statice:TODO:/ +3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ +3204.3 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:TODO:/ + + +# ALL ENCOUNTER ABILITIES +# TODO Locked and Loaded ability during TODO Trick Reload when a bullet is in the gun +# TODO Misload ability during TODO Trick Reload when a bullet missed the gun oops +# TODO --sync-- repositioning from Statice +# TODO --sync-- auto damage from Statice +# TODO Aero IV cast and raidwide damage +# TODO Trick Reload self-targeted cast to load gun with TODO/TODO +# TODO Trigger Happy self-targeted cast for limit cut dart board +# TODO Trigger Happy cast and damage for limit cut dart board (filled pie slice) +# TODO Surprise Balloon self-targeted cast +# TODO Pop knockback from Surprise Balloon being popped +# TODO Surprise Needle short cast and ability blue line aoe from needle adds that pop balloons +# TODO Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye +# TODO Present Box self-targeted cast for bombs/donuts/missiles/hands +# TODO Faerie Ring cast and damage for donut rings during Present Box +# TODO Trapshooting self-targeted cast after Trick Reload (after the first time) +# TODO Trapshooting stack damage from Trick Reload +# TODO Trapshooting spread damage from Trick Reload +# TODO Ring a Ring o' Explosions self-targeted cast for rotating bombs +# TODO Burst cast and damage from bomb explosion +# TODO Fireworks self-targeted cast +# TODO Fireworks ??? spread/stack damage during Present Box +# TODO Fireworks ??? spread/stack damage during Present Box +# TODO Beguiling Glitter self-targeted cast to give players Face debuffs +# TODO Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) +# TODO --sync-- ability on Bomb when rotating +# TODO Dartboard of Dancing Explosives self-targeted cast for colored dartboard +# TODO Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye +# TODO Trapshooting self-targeted cast after Trick Reload (first time) + + +#~~~~~~~~~# +# TRASH 1 # +#~~~~~~~~~# + +# ALL ENCOUNTER ABILITIES +# TODO --sync-- various auto damage (trash 1) +# TODO --sync-- damage from Twister tornados +# TODO Lead Hook casted damage from Kiwakin 3x tankbuster +# TODO Lead Hook damage from hit 2 +# TODO Lead Hook damage from hit 3 +# TODO Water III casted damage from Snipper stack marker +# TODO Sharp Strike casted damage from Kiwakin tank buster with a concussion dot +# TODO Tail Screw casted damage from Kiwakin baited circle +# TODO Bubble Shower casted damage from Snipper front conal +# TODO Crab Dribble fast casted damage from Snipper back conal after Bubble Shower TODO +# TODO Hydrocannon casted damage from Ray front line +# TODO Expulsion casted damage from Ray "get out" +# TODO Electric Whorl casted damage from Ray "get in" +# TODO Hydroshot casted damage from Monk knockback line with a dot +# TODO Cross Attack casted damage from Monk tankbuster + +#~~~~~~~~~# +# TRASH 2 # +#~~~~~~~~~# + +# TODO: does Wood Golem have an enrage?? + +# ALL ENCOUNTER ABILITIES +# TODO --sync-- various auto damage (trash 2) +# TODO Ovation cast and damage from Wood Golem front line aoe +# TODO Gravity Force cast and stack damage from Islekeeper +# TODO Ancient Quaga cast and damage for Islekeeper raidwide enrage +# TODO Ancient Aero III interruptable cast and damage for Wood Golem raidwide +# TODO Tornado cast and damage from Wood Golem that binds the initial target and heavies all targets +# TODO Ancient Quaga cast and damage for Islekeeper raidwide +# TODO Isle Drop cast and damage for Islekeeper front circle diff --git a/util/sync_files.ts b/util/sync_files.ts index 9e28e36d3b..ea886b0cdc 100644 --- a/util/sync_files.ts +++ b/util/sync_files.ts @@ -23,7 +23,7 @@ export type ZoneReplace = { const zoneReplace: ZoneReplace[] = [ { - // Criterion + // Sildihn Criterion fileMap: { 'ui/raidboss/data/06-ew/dungeon/another_sildihn_subterrane.ts': 'ui/raidboss/data/06-ew/dungeon/another_sildihn_subterrane-savage.ts', @@ -274,7 +274,7 @@ const zoneReplace: ZoneReplace[] = [ }, }, { - // Criterion + // Mount Rokkon Criterion fileMap: { 'ui/raidboss/data/06-ew/dungeon/another_mount_rokkon.ts': 'ui/raidboss/data/06-ew/dungeon/another_mount_rokkon-savage.ts', @@ -555,6 +555,166 @@ const zoneReplace: ZoneReplace[] = [ '14B5': '89F4', // Comet }, }, + { + // Aloalo Criterion + fileMap: { + 'ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts': + 'ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts', + 'ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts': + 'ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts', + 'ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt': + 'ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt', + }, + prefix: { 'AAI': 'AAIS' }, + other: { + 'AnotherAloaloIsland': 'AnotherAloaloIslandSavage', + 'another_aloalo_island.txt': 'another_aloalo_island-savage.txt', + '# Another Aloalo Island': '# Another Aloalo Island (Savage)', + '\(\'AAI ': '\(\'AAIS ', + }, + // eslint-disable-next-line max-len + // grep "^# [A-F0-9]\{4\} " ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt | sort | sed "s/^..//" | sed "s/^\(....\) \(.*\)$/ '\1': 'TODO', \/\/ \2/" + id: { + '7A56': 'TODO', // --sync-- various auto damage (trash 1) + '7A58': 'TODO', // --sync-- various auto damage (trash 2) + '8874': 'TODO', // --sync-- repositioning for Lala + '8889': 'TODO', // Angular Addition self-targeted ability to give boss III + '888B': 'TODO1', // Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave + '888C': 'TODO2', // Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave + '888D': 'TODO3', // Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave + '888E': 'TODO4', // Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave + '888F': 'TODO', // Arcane Blight cast and damage from 270 degree rotating cleave + '8890': 'TODO', // Arcane Array self-targeted cast to summon moving blue squares (#1) + '8891': 'TODO', // Bright Pulse cast and damage for initial blue square + '8892': 'TODO', // Bright Pulse damage from moving blue square + '8893': 'TODO', // Inferno Divide orange square cross explosion damage during Spatial Tactics + '8894': 'TODO', // Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #1, #3) + '8895': 'TODO', // Analysis self-targeted cast before giving players + '8898': 'TODO', // Planar Tactics self-targeted cast before Arcane Mines + '8899': 'TODO', // Arcane Mine self-targeted cast to create 8 Arcane Mine squares + '889A': 'TODO', // Arcane Mine cast and damage for initial Arcane Mine squares + '889B': 'TODO', // Arcane Combustion damage from walking over an Arcane Mine + '889C': 'TODO', // Massive Explosion damage from failing to resolve Subractive Suppressor Alpha + '889D': 'TODO', // Massive Explosion damage from failing to resolve Subractive Suppressor Beta + '889E': 'TODO', // Symmetric Surge damage from two person stack that gives magic vuln up + '889F': 'TODO', // Arcane Array self-targeted cast to summon moving blue squares (#2) + '88A0': 'TODO', // Spatial Tactics self-targeted cast prior to Arcane Array 2 + '88A1': 'TODO', // Symmetric Surge self-targeted cast before this mechanic + '88A2': 'TODO', // Arcane Plot self-targeted cast to summon blue squares for Symmetric Surge + '88A3': 'TODO', // Constructive Figure self-targeted cast that summons Aloalo Golem on edge + '88A4': 'TODO', // Aero II cast and line damage from Aloalo Golem during Symmetric Surge + '88A5': 'TODO', // Arcane Point self-targeted cast that gives players 88A6 Powerful Light spreads + '88A6': 'TODO', // Powerful Light spread damage on players that turn the squares they are on blue + '88A7': 'TODO', // Explosive Theorem self-targeted cast for very large spreads + '88A8': 'TODO', // Explosive Theorem cast and damage on players for spreads with Telluric Theorem puddles + '88A9': 'TODO', // Telluric Theorem cast and damage for large puddles from Explosive Theorem + '88AD': 'TODO', // Strategic Strike cast and damage for non-cleaving 3x tankbuster + '88AE': 'TODO', // Inferno Theorem cast and raidwide damage + '8925': 'TODO', // Locked and Loaded ability during 894A Trick Reload when a bullet is in the gun + '8926': 'TODO', // Misload ability during 894A Trick Reload when a bullet missed the gun oops + '8927': 'TODO', // --sync-- repositioning from Statice + '8947': 'TODO', // --sync-- auto damage from Statice + '8949': 'TODO', // Aero IV cast and raidwide damage + '894A': 'TODO', // Trick Reload self-targeted cast to load gun with 8925/8926 + '894B': 'TODO', // Trigger Happy self-targeted cast for limit cut dart board + '894C': 'TODO', // Trigger Happy cast and damage for limit cut dart board (filled pie slice) + '894D': 'TODO', // Surprise Balloon self-targeted cast + '894E': 'TODO', // Pop knockback from Surprise Balloon being popped + '894F': 'TODO', // Surprise Needle short cast and ability blue line aoe from needle adds that pop balloons + '8954': 'TODO', // Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye + '8955': 'TODO', // Present Box self-targeted cast for bombs/donuts/missiles/hands + '8956': 'TODO', // Faerie Ring cast and damage for donut rings during Present Box + '8959': 'TODO', // Trapshooting self-targeted cast after Trick Reload (after the first time) + '895A': 'TODO', // Trapshooting stack damage from Trick Reload + '895B': 'TODO', // Trapshooting spread damage from Trick Reload + '895C': 'TODO', // Ring a Ring o' Explosions self-targeted cast for rotating bombs + '895D': 'TODO', // Burst cast and damage from bomb explosion + '895E': 'TODO', // Fireworks self-targeted cast + '895F': 'TODO', // Fireworks ??? spread/stack damage during Present Box + '8960': 'TODO', // Fireworks ??? spread/stack damage during Present Box + '8963': 'TODO', // Beguiling Glitter self-targeted cast to give players Face debuffs + '8987': 'TODO', // Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) + '8A6A': 'TODO', // --sync-- ability on Bomb when rotating + '8A77': 'TODO', // --sync-- Ketuduke repositioning + '8A82': 'TODO', // Riptide ability on players from Angry Seas Airy Bubble when you step in one + '8A83': 'TODO', // Fetters ability on players from Angry Seas Airy Bubble when you step in one after 8A82 Riptide + '8AA7': 'TODO', // --sync-- auto damage from Ketuduke + '8AA8': 'TODO', // Spring Crystals cast and ability to summon Spring Crystal adds (all flavors) + '8AA9': 'TODO', // 衝撃 self-targeted ability from Spring Crystal orbs + '8AAA': 'TODO', // 衝撃 self-targeted ability from Spring Crystal rupees + '8AAB': 'TODO', // Saturate cast and damage from Spring Crystal orb circle + '8AAC': 'TODO', // Saturate cast and damage from Spring Crystal rupee line laser + '8AAD': 'TODO', // Bubble Net self-targeted cast before Bubbles along with 8AAE during Spring Crystals 1 + '8AAE': 'TODO', // Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 1 + '8AAF': 'TODO', // Fluke Typhoon self-targeted cast before 8AB0 knockback during Spring Crystals 3 + '8AB0': 'TODO', // Fluke Typhoon cast and knockback ability on Spring Crystal and players during Spring Crystals 3 + '8AB1': 'TODO', // Fluke Gale self-targeted cast that adds limit cut winds + '8AB2': 'TODO', // Fluke Gale cast and ability for limit cut 1 wind + '8AB3': 'TODO', // Fluke Gale cast and ability for limit cut 2 wind + '8AB4': 'TODO', // Hydrofall self-targeted cast that adds stack markers + '8AB5': 'TODO', // Hydrofall ability on players to give "stack second" before Blowing Bubbles + '8AB6': 'TODO', // Hydrofall ability on players that adds stack debuffs + '8AB7': 'TODO', // Hydrofall damage from stack debuffs + '8AB8': 'TODO', // Hydrobullet self-targeted cast that adds stack markers + '8AB9': 'TODO', // Hydrobullet ability on players that adds spread debuffs + '8ABA': 'TODO', // Hydrobullet damage from spread debuffs + '8ABB': 'TODO', // Strewn Bubbles self-targeted cast before 8ABC Sphere Shatter moving arches + '8ABC': 'TODO', // Sphere Shatter damage from moving arches + '8ABD': 'TODO', // Blowing Bubbles self-targeted cast that adds Airy Bubble Adds + '8ABE': 'TODO', // Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one + '8ABF': 'TODO', // Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after 8ABE Riptide + '8AC0': 'TODO', // Angry Seas self-targeted cast for 8AC1 red line knockback + '8AC1': 'TODO', // Angry Seas cast and knockback damage from red line + '8AC2': 'TODO', // Burst tower damage + '8AC3': 'TODO', // Big Burst tower failure damage + '8AC4': 'TODO', // Roar self-targeted cast that summons Zaratan adds + '8AC5': 'TODO', // Bubble Net self-targeted cast before Bubbles along with 8AC6 during Spring Crystals 2 + '8AC6': 'TODO', // Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 2 + '8AC7': 'TODO', // Updraft self-targeted cast to boost adds and players into the air + '8AC8': 'TODO', // Updraft ability on players for 8AC7 Updraft + '8AC9': 'TODO', // Hundred Lashings cast and damage for non-bubbled Zaratan 180 cleave (no damage on bubbled players) + '8ACA': 'TODO', // Hundred Lashings self-targeted cast for bubbled Zaratan adds + '8ACB': 'TODO', // Hundred Lashings cast and damage for bubbled Zaratan 180 cleave (no damage on non-bubbled players) + '8ACC': 'TODO', // Receding Twintides cast and damage for initial out during out->in + '8ACD': 'TODO', // Near Tide fast cast and damage for second out during in->out with 8ACE Encroaching Twintides + '8ACE': 'TODO', // Encroaching Twintides cast and damage for initial in during in->out + '8ACF': 'TODO', // Far Tide fast cast and damage for second in during out->in with 8ACC Receding Twintides + '8AD0': 'TODO', // Hydrobomb self-targeted cast for 8AD1 puddles + '8AD1': 'TODO', // Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles + '8AD4': 'TODO', // Tidal Roar self-targeted cast for raidwide aoe + '8AD5': 'TODO', // Tidal Roar damage from 8AD4 + '8BB8': 'TODO', // Tail Screw casted damage from Kiwakin baited circle + '8BB9': 'TODO', // Bubble Shower casted damage from Snipper front conal + '8BBA': 'TODO', // Crab Dribble fast casted damage from Snipper back conal after Bubble Shower 8BB9 + '8BBB': 'TODO', // Cross Attack casted damage from Monk tankbuster + '8BBD': 'TODO', // Hydrocannon casted damage from Ray front line + '8BBE': 'TODO', // Electric Whorl casted damage from Ray "get in" + '8BBF': 'TODO', // Expulsion casted damage from Ray "get out" + '8BC0': 'TODO', // --sync-- damage from Twister tornados + '8BC1': 'TODO', // Ovation cast and damage from Wood Golem front line aoe + '8BC5': 'TODO', // Gravity Force cast and stack damage from Islekeeper + '8C25': 'TODO', // Inferno Theorem cast and enrage damage + '8C2F': 'TODO', // Ancient Quaga cast and damage for Islekeeper raidwide enrage + '8C4C': 'TODO', // Ancient Aero III interruptable cast and damage for Wood Golem raidwide + '8C4D': 'TODO', // Tornado cast and damage from Wood Golem that binds the initial target and heavies all targets + '8C4E': 'TODO', // Ancient Quaga cast and damage for Islekeeper raidwide + '8C53': 'TODO', // Lead Hook damage from hit 3 + '8C62': 'TODO', // Lead Hook damage from hit 2 + '8C63': 'TODO', // Sharp Strike casted damage from Kiwakin tank buster with a concussion dot + '8C64': 'TODO', // Water III casted damage from Snipper stack marker + '8C65': 'TODO', // Hydroshot casted damage from Monk knockback line with a dot + '8C6D': 'TODO', // Hydrobullet ability on players to give "spread second" before Blowing Bubbles + '8C6E': 'TODO', // Lead Hook casted damage from Kiwakin 3x tankbuster + '8C6F': 'TODO', // Isle Drop cast and damage for Islekeeper front circle + '8CBD': 'TODO', // Dartboard of Dancing Explosives self-targeted cast for colored dartboard + '8CC2': 'TODO', // Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye + '8CDE': 'TODO', // Targeted Light self-targeted cast for weak spot boss tether + '8CDF': 'TODO', // Targeted Light cast and damage on players for 8CDE + '8D1A': 'TODO', // Trapshooting self-targeted cast after Trick Reload (first time) + '8D1F': 'TODO', // Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) + '8D2E': 'TODO', // Angular Addition self-targeted ability to give boss V + }, + }, ]; const processFile = (filename: string, zone: ZoneReplace, inputText: string): string => { From 973b9ea221b7b05042690d182ab739a0a8b1d8fb Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Thu, 23 Nov 2023 09:03:03 -0800 Subject: [PATCH 16/39] wording change --- ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 5b5f2759c3..7d8a3bd249 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -821,21 +821,20 @@ const triggerSet: TriggerSet = { const rotationFactor = rotation === 'clock' ? 1 : -1; const finalDir = (rotationFactor * times + 8) % 4; if (finalDir === 1) - return output.right!(); - if (finalDir === 3) return output.left!(); + if (finalDir === 3) + return output.right!(); }, run: (data) => { delete data.lalaPlayerRotation; delete data.lalaPlayerTimes; }, outputStrings: { - // This isn't confusing at all. left: { - en: 'Rotate Left (your right is forward)', + en: 'Leftward March', }, right: { - en: 'Rotate Right (your left is forward)', + en: 'Rightward March', }, }, }, From 70811519a75f1ca59ef8503924871fa2c555a853 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Mon, 4 Dec 2023 09:50:58 -0800 Subject: [PATCH 17/39] resources: add custom op lines --- resources/netlog_defs.ts | 40 ++++++++++++++++++++++++++++++++++++++++ util/gen_log_guide.ts | 10 ++++++++++ 2 files changed, 50 insertions(+) diff --git a/resources/netlog_defs.ts b/resources/netlog_defs.ts index 297db5a06e..7a77743d17 100644 --- a/resources/netlog_defs.ts +++ b/resources/netlog_defs.ts @@ -1178,6 +1178,46 @@ const latestLogDefinitions = { canAnonymize: true, firstOptionalField: 9, }, + SpawnNpcExtra: { + type: '265', + name: 'SpawnNpcExtra', + source: 'OverlayPlugin', + messageType: '265', + fields: { + type: 0, + timestamp: 1, + sourceId: 2, + parentActorId: 3, + tetherId: 4, + }, + playerIds: { + 2: null, + }, + canAnonymize: true, + firstOptionalField: undefined, + }, + ActorControlExtra: { + type: '266', + name: 'ActorControlExtra', + source: 'OverlayPlugin', + messageType: '266', + fields: { + type: 0, + timestamp: 1, + sourceId: 2, + category: 3, + param1: 4, + param2: 5, + param3: 6, + param4: 7, + }, + blankFields: [6], + playerIds: { + 2: null, + }, + canAnonymize: true, + firstOptionalField: undefined, + }, } as const; export const logDefinitionsVersions = { diff --git a/util/gen_log_guide.ts b/util/gen_log_guide.ts index 5563a6060b..33eba7f7f3 100644 --- a/util/gen_log_guide.ts +++ b/util/gen_log_guide.ts @@ -555,6 +555,16 @@ const lineDocs: LineDocs = { ], }, }, + SpawnNpcExtra: { + examples: { + 'en-US': [], + }, + }, + ActorControlExtra: { + examples: { + 'en-US': [], + }, + }, } as const; type LogGuideOptions = { From ad145ed2cff349b89185b31663444d9b6496c62c Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Mon, 4 Dec 2023 10:17:23 -0800 Subject: [PATCH 18/39] minor statice update --- .../06-ew/dungeon/another_aloalo_island.ts | 7 +++++++ .../06-ew/dungeon/another_aloalo_island.ts | 17 ++++++++++++++++ .../06-ew/dungeon/another_aloalo_island.txt | 20 +++++++++++++++---- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts index c192861a8f..1a6b3ae03b 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts @@ -12,6 +12,7 @@ import { playerDamageFields } from '../../../oopsy_common'; // TODO: taking extra 8893 Inferno Divide squares during Spatial Tactics // TODO: 01F7(success) and 01F8(fail) check and x markers? // TODO: players not in Trapshooting stack 895A +// TODO: players not in Present Box / Pinwheeling Dartboard two person stack export type Data = OopsyData; @@ -101,11 +102,15 @@ const triggerSet: OopsyTriggerSet = { 'AAI Trigger Happy': '894C', // limit cut dart board 'AAI Bomb Burst': '895D', // bomb explosion 'AAI Uncommon Ground': '8CC2', // people who are on the same dartboard color with Bull's-eye + 'AAI Faerie Ring': '8956', // donut rings during Present Box + 'AAI Fire Spread 1': '8982', // initial rotating fire (from Ball of Fire) + 'AAI Fire Spread 2': '89F9', // ongoing rotating fire damage (from Statice) }, damageFail: { 'AAI Big Burst': '8AC3', // tower failure damage 'AAI Massive Explosion 1': '889C', // failing to resolve Subractive Suppressor Alpha 'AAI Massive Explosion 2': '889D', // failing to resolve Subractive Suppressor Beta + 'AAI Burning Chains': '8CBE', // damage from not breaking chains }, gainsEffectFail: { // C03 = 9999 duration, ??? = 15s duration @@ -121,6 +126,7 @@ const triggerSet: OopsyTriggerSet = { 'AAI Powerful Light': '88A6', // spread marker during Symmetric Surge that turns squares blue 'AAI Explosive Theorem': '88A8', // large spreads with Telluric Theorem puddles 'AAI Trapshooting Spread': '895B', // spread damage from Trick Reload + 'AAI Firewords Spread': '8960', // spread damage during Present Box / Pinwheeling Dartboard }, soloWarn: { 'AAI Snipper Water III': '8C64', // Snipper stack marker @@ -130,6 +136,7 @@ const triggerSet: OopsyTriggerSet = { soloFail: { 'AAI Hydrofall': '8AB7', // partner stack debuffs 'AAI Symmetric Surge': '889E', // two person stack that gives magic vuln up + 'AAI Fireworks Stack': '895F', // two person stack damage during Present Box / Pinwheeling Dartboard }, triggers: [ pushedIntoWall('AAI Angry Seas', '8AC1'), diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 7d8a3bd249..fd3a71d833 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -40,6 +40,7 @@ export interface Data extends RaidbossData { staticeTriggerHappy?: number; staticeTrapshooting: ('stack' | 'spread')[]; staticeDart: NetMatches['GainsEffect'][]; + staticeIsPinwheelingDartboard?: boolean; } // Horizontal crystals have a heading of 0, vertical crystals are -pi/2. @@ -983,6 +984,10 @@ const triggerSet: TriggerSet = { if (!dartTargets.includes(data.me)) return { alertText: output.noDartOnYou!() }; + // TODO: better callout / separate trigger for this mechanic + if (data.staticeIsPinwheelingDartboard) + return { alertText: output.dartOnYou!() }; + const partyNames = data.party.partyNames; const flexers = partyNames.filter((x) => !dartTargets.includes(x)); @@ -1043,6 +1048,18 @@ const triggerSet: TriggerSet = { unknown: Outputs.unknown, }, }, + { + id: 'AAI Statice Shocking Abandon', + type: 'StartsUsing', + netRegex: { id: '8948', source: 'Statice' }, + response: Responses.tankBuster(), + }, + { + id: 'AAI Statice Pinwheeling Dartboard', + type: 'StartsUsing', + netRegex: { id: '8CBC', source: 'Statice', capture: false }, + run: (data) => data.staticeIsPinwheelingDartboard = true, + }, ], timelineReplace: [ { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index 3cfa478080..2f3c7e9e8d 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -265,7 +265,7 @@ hideall "--sync--" #~~~~~~~~~~~~~~~~~~~~# # -p 8949:3013.8 -# -ii 8947 8925 8926 895A 895B 894C 8987 8A6A 895F 8960 8CC2 +# -ii 8947 8925 8926 895A 895B 894C 8987 8A6A 895F 8960 8CC2 8982 8CBE 3000.0 "--sync--" sync / 00:0839::The Midnight Trial will be sealed off/ window 10000,0 3008.8 "--sync--" sync / 14:[^:]*:Statice:8949:/ window 20,20 @@ -303,16 +303,24 @@ hideall "--sync--" 3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ 3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ 3189.2 "Present Box" sync / 1[56]:[^:]*:Statice:8955:/ -3194.3 "Fireworks" sync / 1[56]:[^:]*:Statice:895E:/ +3194.3 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:895E:/ +3204.0 "Fireworks" sync / 1[56]:[^:]*:Statice:895F:/ 3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ 3204.3 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:8956:/ +3212.5 "Shocking Abandon" sync / 1[56]:[^:]*:Statice:8948:/ +3222.7 "Pinwheeling Dartboard" sync / 1[56]:[^:]*:Statice:8CBC:/ +3231.4 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:895E:/ +3233.4 "Fire Spread" sync / 1[56]:[^:]*:Statice:8952:/ +3241.3 "Fireworks" sync / 1[56]:[^:]*:Statice:895F:/ +3241.6 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:8954:/ # ALL ENCOUNTER ABILITIES # 8925 Locked and Loaded ability during 894A Trick Reload when a bullet is in the gun # 8926 Misload ability during 894A Trick Reload when a bullet missed the gun oops # 8927 --sync-- repositioning from Statice # 8947 --sync-- auto damage from Statice +# 8948 Shocking Abandon cast and tankbuster damage # 8949 Aero IV cast and raidwide damage # 894A Trick Reload self-targeted cast to load gun with 8925/8926 # 894B Trigger Happy self-targeted cast for limit cut dart board @@ -329,12 +337,16 @@ hideall "--sync--" # 895C Ring a Ring o' Explosions self-targeted cast for rotating bombs # 895D Burst cast and damage from bomb explosion # 895E Fireworks self-targeted cast -# 895F Fireworks ??? spread/stack damage during Present Box -# 8960 Fireworks ??? spread/stack damage during Present Box +# 895F Fireworks two person stack damage during Present Box +# 8960 Fireworks spread damage during Present Box # 8963 Beguiling Glitter self-targeted cast to give players Face debuffs +# 8982 Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) # 8987 Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) +# 89F9 Fire Spread ongoing rotating fire damage (from Statice) # 8A6A --sync-- ability on Bomb when rotating +# 8CBC Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire # 8CBD Dartboard of Dancing Explosives self-targeted cast for colored dartboard +# 8CBE Burning Chains damage from not breaking chains # 8CC2 Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye # 8D1A Trapshooting self-targeted cast after Trick Reload (first time) From 797972b61527c7dd5494676fbc929dde1aabe387 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Mon, 4 Dec 2023 10:33:32 -0800 Subject: [PATCH 19/39] missile claw calls --- .../dungeon/another_aloalo_island-savage.ts | 7 ++ .../dungeon/another_aloalo_island-savage.ts | 76 +++++++++++++++++-- .../dungeon/another_aloalo_island-savage.txt | 20 ++++- .../06-ew/dungeon/another_aloalo_island.ts | 50 +++++++++++- 4 files changed, 142 insertions(+), 11 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts index 1b4f5ad408..40e8e8392a 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -15,6 +15,7 @@ import { playerDamageFields } from '../../../oopsy_common'; // TODO: taking extra TODO Inferno Divide squares during Spatial Tactics // TODO: 01F7(success) and 01F8(fail) check and x markers? // TODO: players not in Trapshooting stack TODO +// TODO: players not in Present Box / Pinwheeling Dartboard two person stack export type Data = OopsyData; @@ -104,11 +105,15 @@ const triggerSet: OopsyTriggerSet = { 'AAIS Trigger Happy': 'TODO', // limit cut dart board 'AAIS Bomb Burst': 'TODO', // bomb explosion 'AAIS Uncommon Ground': 'TODO', // people who are on the same dartboard color with Bull's-eye + 'AAIS Faerie Ring': 'TODO', // donut rings during Present Box + 'AAIS Fire Spread 1': '8982', // initial rotating fire (from Ball of Fire) + 'AAIS Fire Spread 2': '89F9', // ongoing rotating fire damage (from Statice) }, damageFail: { 'AAIS Big Burst': 'TODO', // tower failure damage 'AAIS Massive Explosion 1': 'TODO', // failing to resolve Subractive Suppressor Alpha 'AAIS Massive Explosion 2': 'TODO', // failing to resolve Subractive Suppressor Beta + 'AAIS Burning Chains': '8CBE', // damage from not breaking chains }, gainsEffectFail: { // C03 = 9999 duration, ??? = 15s duration @@ -124,6 +129,7 @@ const triggerSet: OopsyTriggerSet = { 'AAIS Powerful Light': 'TODO', // spread marker during Symmetric Surge that turns squares blue 'AAIS Explosive Theorem': 'TODO', // large spreads with Telluric Theorem puddles 'AAIS Trapshooting Spread': 'TODO', // spread damage from Trick Reload + 'AAIS Firewords Spread': 'TODO', // spread damage during Present Box / Pinwheeling Dartboard }, soloWarn: { 'AAIS Snipper Water III': 'TODO', // Snipper stack marker @@ -133,6 +139,7 @@ const triggerSet: OopsyTriggerSet = { soloFail: { 'AAIS Hydrofall': 'TODO', // partner stack debuffs 'AAIS Symmetric Surge': 'TODO', // two person stack that gives magic vuln up + 'AAIS Fireworks Stack': 'TODO', // two person stack damage during Present Box / Pinwheeling Dartboard }, triggers: [ pushedIntoWall('AAIS Angry Seas', 'TODO'), diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index fc87a4f0b9..6ccd32cf72 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -43,6 +43,9 @@ export interface Data extends RaidbossData { staticeTriggerHappy?: number; staticeTrapshooting: ('stack' | 'spread')[]; staticeDart: NetMatches['GainsEffect'][]; + staticeMissileTether: NetMatches['Tether'][]; + staticeClawTether: NetMatches['Tether'][]; + staticeIsPinwheelingDartboard?: boolean; } // Horizontal crystals have a heading of 0, vertical crystals are -pi/2. @@ -66,6 +69,8 @@ const triggerSet: TriggerSet = { staticeBullet: [], staticeTrapshooting: [], staticeDart: [], + staticeMissileTether: [], + staticeClawTether: [], }; }, timelineTriggers: [ @@ -824,21 +829,20 @@ const triggerSet: TriggerSet = { const rotationFactor = rotation === 'clock' ? 1 : -1; const finalDir = (rotationFactor * times + 8) % 4; if (finalDir === 1) - return output.right!(); - if (finalDir === 3) return output.left!(); + if (finalDir === 3) + return output.right!(); }, run: (data) => { delete data.lalaPlayerRotation; delete data.lalaPlayerTimes; }, outputStrings: { - // This isn't confusing at all. left: { - en: 'Rotate Left (your right is forward)', + en: 'Leftward March', }, right: { - en: 'Rotate Right (your left is forward)', + en: 'Rightward March', }, }, }, @@ -972,7 +976,7 @@ const triggerSet: TriggerSet = { en: 'Dart on YOU', }, noDartOnYou: { - en: 'Flex', + en: 'No Dart', }, flexCall: { en: '(${player} flex)', @@ -987,6 +991,10 @@ const triggerSet: TriggerSet = { if (!dartTargets.includes(data.me)) return { alertText: output.noDartOnYou!() }; + // TODO: better callout / separate trigger for this mechanic + if (data.staticeIsPinwheelingDartboard) + return { alertText: output.dartOnYou!() }; + const partyNames = data.party.partyNames; const flexers = partyNames.filter((x) => !dartTargets.includes(x)); @@ -1047,6 +1055,62 @@ const triggerSet: TriggerSet = { unknown: Outputs.unknown, }, }, + { + id: 'AAIS Statice Present Box Missile', + type: 'Tether', + netRegex: { source: 'Surprising Missile', id: '0011' }, + delaySeconds: (data, matches) => { + data.staticeMissileTether.push(matches); + return data.staticeMissileTether.length === 2 ? 0 : 0.5; + }, + durationSeconds: 7, + alertText: (data, _matches, output) => { + if (data.staticeMissileTether.length !== 2) + return; + if (data.staticeMissileTether.map((x) => x.target).includes(data.me)) + return output.missileOnYou!(); + }, + run: (data) => data.staticeMissileTether = [], + outputStrings: { + missileOnYou: { + en: 'Bait Tethers => Missile Spread', + }, + }, + }, + { + id: 'AAIS Statice Present Box Claw', + type: 'Tether', + netRegex: { source: 'Surprising Claw', id: '0011' }, + delaySeconds: (data, matches) => { + data.staticeClawTether.push(matches); + return data.staticeClawTether.length === 2 ? 0 : 0.5; + }, + durationSeconds: 7, + alertText: (data, _matches, output) => { + if (data.staticeClawTether.length !== 2) + return; + if (data.staticeClawTether.map((x) => x.target).includes(data.me)) + return output.missileOnYou!(); + }, + run: (data) => data.staticeClawTether = [], + outputStrings: { + missileOnYou: { + en: 'Juke Claw => Stack', + }, + }, + }, + { + id: 'AAIS Statice Shocking Abandon', + type: 'StartsUsing', + netRegex: { id: '8948', source: 'Statice' }, + response: Responses.tankBuster(), + }, + { + id: 'AAIS Statice Pinwheeling Dartboard', + type: 'StartsUsing', + netRegex: { id: '8CBC', source: 'Statice', capture: false }, + run: (data) => data.staticeIsPinwheelingDartboard = true, + }, ], timelineReplace: [ { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index e58d71fa97..337f0b8b41 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -268,7 +268,7 @@ hideall "--sync--" #~~~~~~~~~~~~~~~~~~~~# # -p TODO:3013.8 -# -ii TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO +# -ii TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO 8982 8CBE 3000.0 "--sync--" sync / 00:0839::The Midnight Trial will be sealed off/ window 10000,0 3008.8 "--sync--" sync / 14:[^:]*:Statice:TODO:/ window 20,20 @@ -306,16 +306,24 @@ hideall "--sync--" 3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ 3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ 3189.2 "Present Box" sync / 1[56]:[^:]*:Statice:TODO:/ -3194.3 "Fireworks" sync / 1[56]:[^:]*:Statice:TODO:/ +3194.3 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:TODO:/ +3204.0 "Fireworks" sync / 1[56]:[^:]*:Statice:TODO:/ 3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ 3204.3 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:TODO:/ +3212.5 "Shocking Abandon" sync / 1[56]:[^:]*:Statice:8948:/ +3222.7 "Pinwheeling Dartboard" sync / 1[56]:[^:]*:Statice:8CBC:/ +3231.4 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:TODO:/ +3233.4 "Fire Spread" sync / 1[56]:[^:]*:Statice:8952:/ +3241.3 "Fireworks" sync / 1[56]:[^:]*:Statice:TODO:/ +3241.6 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:TODO:/ # ALL ENCOUNTER ABILITIES # TODO Locked and Loaded ability during TODO Trick Reload when a bullet is in the gun # TODO Misload ability during TODO Trick Reload when a bullet missed the gun oops # TODO --sync-- repositioning from Statice # TODO --sync-- auto damage from Statice +# 8948 Shocking Abandon cast and tankbuster damage # TODO Aero IV cast and raidwide damage # TODO Trick Reload self-targeted cast to load gun with TODO/TODO # TODO Trigger Happy self-targeted cast for limit cut dart board @@ -332,12 +340,16 @@ hideall "--sync--" # TODO Ring a Ring o' Explosions self-targeted cast for rotating bombs # TODO Burst cast and damage from bomb explosion # TODO Fireworks self-targeted cast -# TODO Fireworks ??? spread/stack damage during Present Box -# TODO Fireworks ??? spread/stack damage during Present Box +# TODO Fireworks two person stack damage during Present Box +# TODO Fireworks spread damage during Present Box # TODO Beguiling Glitter self-targeted cast to give players Face debuffs +# 8982 Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) # TODO Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) +# 89F9 Fire Spread ongoing rotating fire damage (from Statice) # TODO --sync-- ability on Bomb when rotating +# 8CBC Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire # TODO Dartboard of Dancing Explosives self-targeted cast for colored dartboard +# 8CBE Burning Chains damage from not breaking chains # TODO Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye # TODO Trapshooting self-targeted cast after Trick Reload (first time) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index fd3a71d833..0063b8e315 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -40,6 +40,8 @@ export interface Data extends RaidbossData { staticeTriggerHappy?: number; staticeTrapshooting: ('stack' | 'spread')[]; staticeDart: NetMatches['GainsEffect'][]; + staticeMissileTether: NetMatches['Tether'][]; + staticeClawTether: NetMatches['Tether'][]; staticeIsPinwheelingDartboard?: boolean; } @@ -64,6 +66,8 @@ const triggerSet: TriggerSet = { staticeBullet: [], staticeTrapshooting: [], staticeDart: [], + staticeMissileTether: [], + staticeClawTether: [], }; }, timelineTriggers: [ @@ -969,7 +973,7 @@ const triggerSet: TriggerSet = { en: 'Dart on YOU', }, noDartOnYou: { - en: 'Flex', + en: 'No Dart', }, flexCall: { en: '(${player} flex)', @@ -1048,6 +1052,50 @@ const triggerSet: TriggerSet = { unknown: Outputs.unknown, }, }, + { + id: 'AAI Statice Present Box Missile', + type: 'Tether', + netRegex: { source: 'Surprising Missile', id: '0011' }, + delaySeconds: (data, matches) => { + data.staticeMissileTether.push(matches); + return data.staticeMissileTether.length === 2 ? 0 : 0.5; + }, + durationSeconds: 7, + alertText: (data, _matches, output) => { + if (data.staticeMissileTether.length !== 2) + return; + if (data.staticeMissileTether.map((x) => x.target).includes(data.me)) + return output.missileOnYou!(); + }, + run: (data) => data.staticeMissileTether = [], + outputStrings: { + missileOnYou: { + en: 'Bait Tethers => Missile Spread', + }, + }, + }, + { + id: 'AAI Statice Present Box Claw', + type: 'Tether', + netRegex: { source: 'Surprising Claw', id: '0011' }, + delaySeconds: (data, matches) => { + data.staticeClawTether.push(matches); + return data.staticeClawTether.length === 2 ? 0 : 0.5; + }, + durationSeconds: 7, + alertText: (data, _matches, output) => { + if (data.staticeClawTether.length !== 2) + return; + if (data.staticeClawTether.map((x) => x.target).includes(data.me)) + return output.missileOnYou!(); + }, + run: (data) => data.staticeClawTether = [], + outputStrings: { + missileOnYou: { + en: 'Juke Claw => Stack', + }, + }, + }, { id: 'AAI Statice Shocking Abandon', type: 'StartsUsing', From 9fffc2bd2f2e6e5f560a5d05c8ef16fb8ffca5d2 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 5 Dec 2023 09:18:01 -0800 Subject: [PATCH 20/39] statice timeline --- .../06-ew/dungeon/another_aloalo_island.ts | 2 + .../06-ew/dungeon/another_aloalo_island.txt | 37 +++++++++++++++---- util/sync_files.ts | 25 +++++++++---- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts index 1a6b3ae03b..a59622b18a 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts @@ -111,6 +111,8 @@ const triggerSet: OopsyTriggerSet = { 'AAI Massive Explosion 1': '889C', // failing to resolve Subractive Suppressor Alpha 'AAI Massive Explosion 2': '889D', // failing to resolve Subractive Suppressor Beta 'AAI Burning Chains': '8CBE', // damage from not breaking chains + 'AAI Surprising Missile Burst': '8957', // running into Surprising Missile tethered add + 'AAI Surprising Claw Death by Claw': '8958', // running into Surprising Claw tethered add }, gainsEffectFail: { // C03 = 9999 duration, ??? = 15s duration diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index 2f3c7e9e8d..fa5e67bdd1 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -265,7 +265,7 @@ hideall "--sync--" #~~~~~~~~~~~~~~~~~~~~# # -p 8949:3013.8 -# -ii 8947 8925 8926 895A 895B 894C 8987 8A6A 895F 8960 8CC2 8982 8CBE +# -ii 8947 8925 8926 895A 895B 894C 8987 8A6A 895F 8960 8CC2 8982 8CBE 89F9 8C24 8957 8958 3000.0 "--sync--" sync / 00:0839::The Midnight Trial will be sealed off/ window 10000,0 3008.8 "--sync--" sync / 14:[^:]*:Statice:8949:/ window 20,20 @@ -302,7 +302,7 @@ hideall "--sync--" 3172.5 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ 3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ 3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ -3189.2 "Present Box" sync / 1[56]:[^:]*:Statice:8955:/ +3189.2 "Present Box 1" sync / 1[56]:[^:]*:Statice:8955:/ 3194.3 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:895E:/ 3204.0 "Fireworks" sync / 1[56]:[^:]*:Statice:895F:/ 3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ @@ -311,9 +311,28 @@ hideall "--sync--" 3222.7 "Pinwheeling Dartboard" sync / 1[56]:[^:]*:Statice:8CBC:/ 3231.4 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:895E:/ -3233.4 "Fire Spread" sync / 1[56]:[^:]*:Statice:8952:/ +3233.4 "Fire Spread" sync / 1[56]:[^:]*:Statice:8952:/ duration 11 3241.3 "Fireworks" sync / 1[56]:[^:]*:Statice:895F:/ 3241.6 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:8954:/ +3253.6 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ + +3260.8 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3266.5 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:8963:/ +3273.6 "Trick Reload" sync / 1[56]:[^:]*:Statice:894A:/ +3288.4 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8D1A:/ +3295.5 "Present Box 2" sync / 1[56]:[^:]*:Statice:8955:/ +3302.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ +3309.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:894B:/ +3310.2 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:8956:/ +3316.5 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8959:/ +3320.4 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ + +3327.6 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ +3335.7 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ + +3338.8 "--sync--" sync / 14:[^:]*:Statice:8C23:/ +3348.8 "Aero IV Enrage" sync / 1[56]:[^:]*:Statice:8C23:/ + # ALL ENCOUNTER ABILITIES # 8925 Locked and Loaded ability during 894A Trick Reload when a bullet is in the gun @@ -331,24 +350,28 @@ hideall "--sync--" # 8954 Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye # 8955 Present Box self-targeted cast for bombs/donuts/missiles/hands # 8956 Faerie Ring cast and damage for donut rings during Present Box -# 8959 Trapshooting self-targeted cast after Trick Reload (after the first time) +# 8957 Burst high damage from running into Surprising Missile tethered add +# 8958 Death by Claw high damage from running into Surprising Claw tethered add +# 8959 Trapshooting self-targeted cast after Trick Reload (some instances are 8D1A) # 895A Trapshooting stack damage from Trick Reload # 895B Trapshooting spread damage from Trick Reload # 895C Ring a Ring o' Explosions self-targeted cast for rotating bombs # 895D Burst cast and damage from bomb explosion # 895E Fireworks self-targeted cast -# 895F Fireworks two person stack damage during Present Box -# 8960 Fireworks spread damage during Present Box +# 895F Fireworks two person stack damage during Present Box / Pinwheeling Dartboard +# 8960 Fireworks spread damage during Present Box / Pinwheeling Dartboard # 8963 Beguiling Glitter self-targeted cast to give players Face debuffs # 8982 Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) # 8987 Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) # 89F9 Fire Spread ongoing rotating fire damage (from Statice) # 8A6A --sync-- ability on Bomb when rotating +# 8C23 Aero IV cast and enrage damage +# 8C24 Aero IV post-enrage follow-up damage just in case # 8CBC Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire # 8CBD Dartboard of Dancing Explosives self-targeted cast for colored dartboard # 8CBE Burning Chains damage from not breaking chains # 8CC2 Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye -# 8D1A Trapshooting self-targeted cast after Trick Reload (first time) +# 8D1A Trapshooting self-targeted cast after Trick Reload (some instances are 8959) #~~~~~~~~~# diff --git a/util/sync_files.ts b/util/sync_files.ts index ea886b0cdc..f37c964649 100644 --- a/util/sync_files.ts +++ b/util/sync_files.ts @@ -579,10 +579,10 @@ const zoneReplace: ZoneReplace[] = [ '7A58': 'TODO', // --sync-- various auto damage (trash 2) '8874': 'TODO', // --sync-- repositioning for Lala '8889': 'TODO', // Angular Addition self-targeted ability to give boss III - '888B': 'TODO1', // Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave - '888C': 'TODO2', // Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave - '888D': 'TODO3', // Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave - '888E': 'TODO4', // Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave + '888B': 'TODO', // Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave + '888C': 'TODO', // Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave + '888D': 'TODO', // Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave + '888E': 'TODO', // Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave '888F': 'TODO', // Arcane Blight cast and damage from 270 degree rotating cleave '8890': 'TODO', // Arcane Array self-targeted cast to summon moving blue squares (#1) '8891': 'TODO', // Bright Pulse cast and damage for initial blue square @@ -614,6 +614,7 @@ const zoneReplace: ZoneReplace[] = [ '8926': 'TODO', // Misload ability during 894A Trick Reload when a bullet missed the gun oops '8927': 'TODO', // --sync-- repositioning from Statice '8947': 'TODO', // --sync-- auto damage from Statice + '8948': 'TODO', // Shocking Abandon cast and tankbuster damage '8949': 'TODO', // Aero IV cast and raidwide damage '894A': 'TODO', // Trick Reload self-targeted cast to load gun with 8925/8926 '894B': 'TODO', // Trigger Happy self-targeted cast for limit cut dart board @@ -624,16 +625,20 @@ const zoneReplace: ZoneReplace[] = [ '8954': 'TODO', // Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye '8955': 'TODO', // Present Box self-targeted cast for bombs/donuts/missiles/hands '8956': 'TODO', // Faerie Ring cast and damage for donut rings during Present Box - '8959': 'TODO', // Trapshooting self-targeted cast after Trick Reload (after the first time) + '8957': 'TODO', // Burst high damage from running into Surprising Missile tethered add + '8958': 'TODO', // Death by Claw high damage from running into Surprising Claw tethered add + '8959': 'TODO', // Trapshooting self-targeted cast after Trick Reload (some instances are 8D1A) '895A': 'TODO', // Trapshooting stack damage from Trick Reload '895B': 'TODO', // Trapshooting spread damage from Trick Reload '895C': 'TODO', // Ring a Ring o' Explosions self-targeted cast for rotating bombs '895D': 'TODO', // Burst cast and damage from bomb explosion '895E': 'TODO', // Fireworks self-targeted cast - '895F': 'TODO', // Fireworks ??? spread/stack damage during Present Box - '8960': 'TODO', // Fireworks ??? spread/stack damage during Present Box + '895F': 'TODO', // Fireworks two person stack damage during Present Box / Pinwheeling Dartboard + '8960': 'TODO', // Fireworks spread damage during Present Box / Pinwheeling Dartboard '8963': 'TODO', // Beguiling Glitter self-targeted cast to give players Face debuffs + '8982': 'TODO', // Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) '8987': 'TODO', // Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) + '89F9': 'TODO', // Fire Spread ongoing rotating fire damage (from Statice) '8A6A': 'TODO', // --sync-- ability on Bomb when rotating '8A77': 'TODO', // --sync-- Ketuduke repositioning '8A82': 'TODO', // Riptide ability on players from Angry Seas Airy Bubble when you step in one @@ -693,6 +698,8 @@ const zoneReplace: ZoneReplace[] = [ '8BC0': 'TODO', // --sync-- damage from Twister tornados '8BC1': 'TODO', // Ovation cast and damage from Wood Golem front line aoe '8BC5': 'TODO', // Gravity Force cast and stack damage from Islekeeper + '8C23': 'TODO', // Aero IV cast and enrage damage + '8C24': 'TODO', // Aero IV post-enrage follow-up damage just in case '8C25': 'TODO', // Inferno Theorem cast and enrage damage '8C2F': 'TODO', // Ancient Quaga cast and damage for Islekeeper raidwide enrage '8C4C': 'TODO', // Ancient Aero III interruptable cast and damage for Wood Golem raidwide @@ -706,11 +713,13 @@ const zoneReplace: ZoneReplace[] = [ '8C6D': 'TODO', // Hydrobullet ability on players to give "spread second" before Blowing Bubbles '8C6E': 'TODO', // Lead Hook casted damage from Kiwakin 3x tankbuster '8C6F': 'TODO', // Isle Drop cast and damage for Islekeeper front circle + '8CBC': 'TODO', // Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire '8CBD': 'TODO', // Dartboard of Dancing Explosives self-targeted cast for colored dartboard + '8CBE': 'TODO', // Burning Chains damage from not breaking chains '8CC2': 'TODO', // Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye '8CDE': 'TODO', // Targeted Light self-targeted cast for weak spot boss tether '8CDF': 'TODO', // Targeted Light cast and damage on players for 8CDE - '8D1A': 'TODO', // Trapshooting self-targeted cast after Trick Reload (first time) + '8D1A': 'TODO', // Trapshooting self-targeted cast after Trick Reload (some instances are 8959) '8D1F': 'TODO', // Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) '8D2E': 'TODO', // Angular Addition self-targeted ability to give boss V }, From 97785abc47dfe3647f0fe91994a214f6c882cef1 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 5 Dec 2023 09:52:53 -0800 Subject: [PATCH 21/39] tornado rename --- .../06-ew/dungeon/another_aloalo_island.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts index a59622b18a..5a6d654c2f 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts @@ -2,6 +2,7 @@ import NetRegexes from '../../../../../resources/netregexes'; import ZoneId from '../../../../../resources/zone_id'; import { OopsyData } from '../../../../../types/data'; import { OopsyMistakeType, OopsyTrigger, OopsyTriggerSet } from '../../../../../types/oopsy'; +import { LocaleText } from '../../../../../types/trigger'; import { playerDamageFields } from '../../../oopsy_common'; // TODO: people who missed their 8AC2 Burst tower @@ -14,6 +15,28 @@ import { playerDamageFields } from '../../../oopsy_common'; // TODO: players not in Trapshooting stack 895A // TODO: players not in Present Box / Pinwheeling Dartboard two person stack +const renameMistake = ( + triggerId: string, + abilityId: string | string[], + type: OopsyMistakeType, + text: LocaleText, +): OopsyTrigger => { + return { + id: triggerId, + type: 'Ability', + netRegex: NetRegexes.ability({ id: abilityId, ...playerDamageFields }), + condition: (data, matches) => data.DamageFromMatches(matches) > 0, + mistake: (_data, matches) => { + return { + type: type, + blame: matches.target, + reportId: matches.targetId, + text: text, + }; + }, + }; +}; + export type Data = OopsyData; // TODO: we could probably move these helpers to some oopsy util. @@ -141,6 +164,10 @@ const triggerSet: OopsyTriggerSet = { 'AAI Fireworks Stack': '895F', // two person stack damage during Present Box / Pinwheeling Dartboard }, triggers: [ + renameMistake('AAI Tornado', '8BC0', 'fail', { + // running into a tornado in the initial trash section + en: 'Tornado', + }), pushedIntoWall('AAI Angry Seas', '8AC1'), pushedIntoWall('AAI Pop', '894E'), nonzeroDamageMistake('AAI Hundred Lashings', ['8AC9', '8ACB'], 'warn'), From 2e58b1444b28b275ab46f59cd9e9aabc7a652a35 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 5 Dec 2023 09:53:52 -0800 Subject: [PATCH 22/39] a couple of savage ids --- .../dungeon/another_aloalo_island-savage.ts | 79 +++-- .../dungeon/another_aloalo_island-savage.ts | 58 ++-- .../dungeon/another_aloalo_island-savage.txt | 319 ++++++++++-------- util/sync_files.ts | 136 ++++---- 4 files changed, 322 insertions(+), 270 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts index 40e8e8392a..cd1db7e2d2 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -5,9 +5,10 @@ import NetRegexes from '../../../../../resources/netregexes'; import ZoneId from '../../../../../resources/zone_id'; import { OopsyData } from '../../../../../types/data'; import { OopsyMistakeType, OopsyTrigger, OopsyTriggerSet } from '../../../../../types/oopsy'; +import { LocaleText } from '../../../../../types/trigger'; import { playerDamageFields } from '../../../oopsy_common'; -// TODO: people who missed their TODO Burst tower +// TODO: people who missed their 8AE2 Burst tower // TODO: failing TODO Radiance orb damage during Analysis // TODO: failing TODO Targeted Light during Analysis // TODO: people who failed Subtractive Suppressor Alpha + Beta @@ -17,6 +18,28 @@ import { playerDamageFields } from '../../../oopsy_common'; // TODO: players not in Trapshooting stack TODO // TODO: players not in Present Box / Pinwheeling Dartboard two person stack +const renameMistake = ( + triggerId: string, + abilityId: string | string[], + type: OopsyMistakeType, + text: LocaleText, +): OopsyTrigger => { + return { + id: triggerId, + type: 'Ability', + netRegex: NetRegexes.ability({ id: abilityId, ...playerDamageFields }), + condition: (data, matches) => data.DamageFromMatches(matches) > 0, + mistake: (_data, matches) => { + return { + type: type, + blame: matches.target, + reportId: matches.targetId, + text: text, + }; + }, + }; +}; + export type Data = OopsyData; // TODO: we could probably move these helpers to some oopsy util. @@ -71,23 +94,23 @@ const triggerSet: OopsyTriggerSet = { zoneId: ZoneId.AnotherAloaloIslandSavage, damageWarn: { // Trash 1 - 'AAIS Twister': 'TODO', // Twister tornados - 'AAIS Kiwakin Tail Screw': 'TODO', // baited circle - 'AAIS Snipper Bubble Shower': 'TODO', // front conal - 'AAIS Snipper Crab Dribble': 'TODO', // fast back conal after Bubble Shower - 'AAIS Ray Hydrocannon': 'TODO', // line aoe - 'AAIS Ray Expulsion': 'TODO', // "get out" - 'AAIS Ray Electric Whorl': 'TODO', // "get in" + 'AAIS Twister': '8BCF', // Twister tornados + 'AAIS Kiwakin Tail Screw': '8BC9', // baited circle + 'AAIS Snipper Bubble Shower': '8BCA', // front conal + 'AAIS Snipper Crab Dribble': '8BCB', // fast back conal after Bubble Shower + 'AAIS Ray Hydrocannon': '8C4B', // line aoe + 'AAIS Ray Expulsion': '8BCE', // "get out" + 'AAIS Ray Electric Whorl': '8BCD', // "get in" // Ketuduke - 'AAIS Spring Crystal Saturate 1': 'TODO', // orb circle - 'AAIS Spring Crystal Saturate 2': 'TODO', // rupee line laser - 'AAIS Sphere Shatter': 'TODO', // moving arches - 'AAIS Receding Twintides': 'TODO', // initial out during out->in - 'AAIS Near Tide': 'TODO', // second out during in->out with TODO Encroaching Twintides - 'AAIS Encroaching Twintides': 'TODO', // initial in during in->out - 'AAIS Far Tide': 'TODO', // second in during out->in with TODO Receding Twintides - 'AAIS Hydrobomb': 'TODO', // 3x puddles duruing TODO Blowing Bubbles + 'AAIS Spring Crystal Saturate 1': '8ADB', // orb circle + 'AAIS Spring Crystal Saturate 2': '8ADC', // rupee line laser + 'AAIS Sphere Shatter': '8AE0', // moving arches + 'AAIS Receding Twintides': '8AE7', // initial out during out->in + 'AAIS Near Tide': '8AE8', // second out during in->out with 8AE9 Encroaching Twintides + 'AAIS Encroaching Twintides': '8AE9', // initial in during in->out + 'AAIS Far Tide': '8AEA', // second in during out->in with 8AE7 Receding Twintides + 'AAIS Hydrobomb': '8AEB', // 3x puddles duruing 8ABD Blowing Bubbles // Trash 2 'AAIS Wood Golem Ovation': 'TODO', // front line aoe @@ -106,14 +129,16 @@ const triggerSet: OopsyTriggerSet = { 'AAIS Bomb Burst': 'TODO', // bomb explosion 'AAIS Uncommon Ground': 'TODO', // people who are on the same dartboard color with Bull's-eye 'AAIS Faerie Ring': 'TODO', // donut rings during Present Box - 'AAIS Fire Spread 1': '8982', // initial rotating fire (from Ball of Fire) - 'AAIS Fire Spread 2': '89F9', // ongoing rotating fire damage (from Statice) + 'AAIS Fire Spread 1': 'TODO', // initial rotating fire (from Ball of Fire) + 'AAIS Fire Spread 2': 'TODO', // ongoing rotating fire damage (from Statice) }, damageFail: { 'AAIS Big Burst': 'TODO', // tower failure damage 'AAIS Massive Explosion 1': 'TODO', // failing to resolve Subractive Suppressor Alpha 'AAIS Massive Explosion 2': 'TODO', // failing to resolve Subractive Suppressor Beta - 'AAIS Burning Chains': '8CBE', // damage from not breaking chains + 'AAIS Burning Chains': 'TODO', // damage from not breaking chains + 'AAIS Surprising Missile Burst': 'TODO', // running into Surprising Missile tethered add + 'AAIS Surprising Claw Death by Claw': 'TODO', // running into Surprising Claw tethered add }, gainsEffectFail: { // C03 = 9999 duration, ??? = 15s duration @@ -124,27 +149,31 @@ const triggerSet: OopsyTriggerSet = { 'AAIS Burns': 'BF9', // standing outside Lala }, shareWarn: { - 'AAIS Hydrobullet': 'TODO', // spread debuffs - 'AAIS Wood Golem Tornado': 'TODO', // headmarker -> bind and heavy aoe + 'AAIS Hydrobullet': '8ADF', // spread debuffs + 'AAIS Wood Golem Tornado': '8BD3', // headmarker -> bind and heavy aoe 'AAIS Powerful Light': 'TODO', // spread marker during Symmetric Surge that turns squares blue 'AAIS Explosive Theorem': 'TODO', // large spreads with Telluric Theorem puddles 'AAIS Trapshooting Spread': 'TODO', // spread damage from Trick Reload 'AAIS Firewords Spread': 'TODO', // spread damage during Present Box / Pinwheeling Dartboard }, soloWarn: { - 'AAIS Snipper Water III': 'TODO', // Snipper stack marker + 'AAIS Snipper Water III': '8BCC', // Snipper stack marker 'AAIS Islekeeper Gravity Force': 'TODO', // stack 'AAIS Trapshooting Stack': 'TODO', // stack damage from Trick Reload }, soloFail: { - 'AAIS Hydrofall': 'TODO', // partner stack debuffs + 'AAIS Hydrofall': '8ADE', // partner stack debuffs 'AAIS Symmetric Surge': 'TODO', // two person stack that gives magic vuln up 'AAIS Fireworks Stack': 'TODO', // two person stack damage during Present Box / Pinwheeling Dartboard }, triggers: [ - pushedIntoWall('AAIS Angry Seas', 'TODO'), + renameMistake('AAIS Tornado', '8BCF', 'fail', { + // running into a tornado in the initial trash section + en: 'Tornado', + }), + pushedIntoWall('AAIS Angry Seas', '8AE1'), pushedIntoWall('AAIS Pop', 'TODO'), - nonzeroDamageMistake('AAIS Hundred Lashings', ['TODO', 'TODO'], 'warn'), + nonzeroDamageMistake('AAIS Hundred Lashings', ['8AE5', '8AE6'], 'warn'), ], }; diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 6ccd32cf72..540d42540b 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -114,7 +114,7 @@ const triggerSet: TriggerSet = { { id: 'AAIS Kiwakin Lead Hook', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Kiwakin' }, + netRegex: { id: '8BC7', source: 'Aloalo Kiwakin' }, response: (data, matches, output) => { // cactbot-builtin-response output.responseOutputStrings = { @@ -135,78 +135,78 @@ const triggerSet: TriggerSet = { { id: 'AAIS Kiwakin Sharp Strike', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Kiwakin' }, + netRegex: { id: '8BC8', source: 'Aloalo Kiwakin' }, response: Responses.tankBuster(), }, { id: 'AAIS Kiwakin Tail Screw', type: 'StartsUsing', // This is a baited targeted circle. - netRegex: { id: 'TODO', source: 'Aloalo Kiwakin', capture: false }, + netRegex: { id: '8BC9', source: 'Aloalo Kiwakin', capture: false }, response: Responses.moveAway(), }, { id: 'AAIS Snipper Water III', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Snipper' }, + netRegex: { id: '8BCC', source: 'Aloalo Snipper' }, response: Responses.stackMarkerOn(), }, { id: 'AAIS Snipper Bubble Shower', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Snipper', capture: false }, + netRegex: { id: '8BCA', source: 'Aloalo Snipper', capture: false }, response: Responses.getBackThenFront(), }, { id: 'AAIS Snipper Crab Dribble', type: 'Ability', - // Crab Dribble TODO has a fast cast, so trigger on Bubble Shower ability - netRegex: { id: 'TODO', source: 'Aloalo Snipper', capture: false }, + // Crab Dribble 8BCB has a fast cast, so trigger on Bubble Shower ability + netRegex: { id: '8BCA', source: 'Aloalo Snipper', capture: false }, suppressSeconds: 5, response: Responses.goFront('info'), }, { id: 'AAIS Ray Hydrocannon', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Ray', capture: false }, + netRegex: { id: '8C4B', source: 'Aloalo Ray', capture: false }, response: Responses.getBehind(), }, { id: 'AAIS Ray Expulsion', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Ray', capture: false }, + netRegex: { id: '8BCE', source: 'Aloalo Ray', capture: false }, response: Responses.getOut(), }, { id: 'AAIS Ray Electric Whorl', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Ray', capture: false }, + netRegex: { id: '8BCD', source: 'Aloalo Ray', capture: false }, response: Responses.getUnder(), }, { id: 'AAIS Monk Hydroshot', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Monk' }, + netRegex: { id: '8BCD', source: 'Aloalo Monk' }, condition: Conditions.targetIsYou(), response: Responses.knockbackOn(), }, { id: 'AAIS Monk Cross Attack', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Monk' }, + netRegex: { id: '8C4F', source: 'Aloalo Monk' }, response: Responses.tankBuster(), }, // ---------------- Ketuduke ---------------- { id: 'AAIS Ketuduke Tidal Roar', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Ketuduke', capture: false }, + netRegex: { id: '8AD4', source: 'Ketuduke', capture: false }, response: Responses.bleedAoe(), }, { id: 'AAIS Ketuduke Spring Crystals', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Ketuduke', capture: false }, + netRegex: { id: '8AA8', source: 'Ketuduke', capture: false }, run: (data) => { data.ketuSpringCrystalCount++; data.ketuCrystalAdd = []; @@ -259,9 +259,9 @@ const triggerSet: TriggerSet = { { id: 'AAIS Ketuduke Hydro Buff Counter', type: 'StartsUsing', - // TODO = Hydrobullet (spread) - // TODO = Hydrofall (stack) - netRegex: { id: ['TODO', 'TODO'], source: 'Ketuduke', capture: false }, + // 8AB8 = Hydrobullet (spread) + // 8AB4 = Hydrofall (stack) + netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke', capture: false }, run: (data) => data.ketuHydroBuffCount++, }, { @@ -273,7 +273,7 @@ const triggerSet: TriggerSet = { The number in parentheses is the limit cut wind you should be on.`, }, type: 'StartsUsing', - netRegex: { id: ['TODO', 'TODO'], source: 'Ketuduke' }, + netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, condition: (data) => data.ketuHydroBuffCount === 1 || data.ketuHydroBuffCount === 6, durationSeconds: 8, alertText: (data, matches, output) => { @@ -329,7 +329,7 @@ const triggerSet: TriggerSet = { // + - - - - + + - - - - + // 2 2 - const isSpread = matches.id === 'TODO'; + const isSpread = matches.id === '8AB8'; const horizontal = data.ketuCrystalAdd.filter((x) => isHorizontalCrystal(x)); const vertical = data.ketuCrystalAdd.filter((x) => !isHorizontalCrystal(x)); @@ -346,7 +346,7 @@ const triggerSet: TriggerSet = { return isSplitLayout ? output.fettersStackSplit!() : output.fettersStackColumn!(); }, infoText: (_data, matches, output) => { - return matches.id === 'TODO' ? output.spread!() : output.stacks!(); + return matches.id === '8AB8' ? output.spread!() : output.stacks!(); }, outputStrings: { spread: Outputs.spread, @@ -373,10 +373,10 @@ const triggerSet: TriggerSet = { { id: 'AAIS Ketuduke Hydro Buff 2', type: 'StartsUsing', - netRegex: { id: ['TODO', 'TODO'], source: 'Ketuduke' }, + netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, condition: (data) => data.ketuHydroBuffCount === 2, alertText: (_data, matches, output) => { - return matches.id === 'TODO' ? output.spread!() : output.stacks!(); + return matches.id === '8AB8' ? output.spread!() : output.stacks!(); }, outputStrings: { spread: { @@ -390,13 +390,13 @@ const triggerSet: TriggerSet = { { id: 'AAIS Ketuduke Receding Twintides', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Ketuduke', capture: false }, + netRegex: { id: '8AE7', source: 'Ketuduke', capture: false }, response: Responses.getOutThenIn(), }, { id: 'AAIS Ketuduke Encroaching Twintides', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Ketuduke', capture: false }, + netRegex: { id: '8AE9', source: 'Ketuduke', capture: false }, response: Responses.getInThenOut(), }, { @@ -445,14 +445,14 @@ const triggerSet: TriggerSet = { { id: 'AAIS Wood Golem Ancient Aero III', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Wood Golem' }, + netRegex: { id: '8BD2', source: 'Aloalo Wood Golem' }, condition: (data) => data.CanSilence(), response: Responses.interrupt('alarm'), }, { id: 'AAIS Wood Golem Tornado', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Wood Golem' }, + netRegex: { id: '8BD3', source: 'Aloalo Wood Golem' }, response: (data, matches, output) => { // cactbot-builtin-response output.responseOutputStrings = { @@ -509,7 +509,7 @@ const triggerSet: TriggerSet = { { id: 'AAIS Islekeeper Ancient Quaga', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Islekeeper', capture: false }, + netRegex: { id: '8C39', source: 'Aloalo Islekeeper', capture: false }, response: Responses.aoe(), }, { @@ -1102,13 +1102,13 @@ const triggerSet: TriggerSet = { { id: 'AAIS Statice Shocking Abandon', type: 'StartsUsing', - netRegex: { id: '8948', source: 'Statice' }, + netRegex: { id: 'TODO', source: 'Statice' }, response: Responses.tankBuster(), }, { id: 'AAIS Statice Pinwheeling Dartboard', type: 'StartsUsing', - netRegex: { id: '8CBC', source: 'Statice', capture: false }, + netRegex: { id: 'TODO', source: 'Statice', capture: false }, run: (data) => data.staticeIsPinwheelingDartboard = true, }, ], diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index 337f0b8b41..aff787b3e8 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -13,129 +13,129 @@ hideall "--sync--" # KETUDUKE # #~~~~~~~~~~# -# -p TODO:1015.2 -# -ii TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO +# -p 8AD4:1015.2 +# -ii 8AA7 8AED 8ADD 8AB9 8AB6 8AEB TODO TODO 8AE5 8AE6 8AC0 8ADA 8AD9 8AE4 8AC8 TODO 8A82 8A83 1000.0 "--sync--" sync / 00:0839::The Dawn Trial will be sealed off/ window 10000,0 -1010.2 "--sync--" sync / 14:[^:]*:Ketuduke:TODO:/ window 20,20 -1015.2 "Tidal Roar" sync / 1[56]:[^:]*:Ketuduke:TODO:/ - -1022.0 "--middle--" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1027.0 "Spring Crystals 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1034.0 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1041.0 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1050.0 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1060.0 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1062.0 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1065.0 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:TODO:/ -1065.1 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ - -1074.0 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1077.1 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1084.3 "Blowing Bubbles" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1091.4 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1096.3 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1099.6 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1102.5 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ - -1113.6 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1118.9 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1130.3 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1130.9 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1133.4 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1134.0 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1134.0 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:TODO:/ - -1143.7 "Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1149.7 "Roar" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1154.6 "Spring Crystals 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1164.6 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1177.0 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1177.6 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:TODO:/ -1182.7 "Updraft" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1184.1 "Hundred Lashings" sync / 1[56]:[^:]*:Aloalo Zaratan:TODO:/ - -1190.7 "--middle--" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1199.4 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1202.4 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1210.4 "Angry Seas" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1211.6 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1212.2 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:[^:]*:(TODO|TODO):/ # this sometimes has the wrong source -1214.8 "Spring Crystals 3" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1216.8 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1221.8 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1227.8 "Fluke Typhoon (cast)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1233.8 "Fluke Typhoon" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1236.4 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:TODO:/ -1238.8 "Burst x4" sync / 1[56]:[^:]*:Ketuduke:TODO:/ - -1246.7 "Spring Crystals 4" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1253.7 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1260.7 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1269.8 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1279.9 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1281.9 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1284.9 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:TODO:/ -1285.0 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ - -1293.9 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1299.2 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1310.6 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1311.2 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1313.7 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(TODO|TODO):/ -1314.3 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:TODO:/ -1314.3 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:TODO:/ +1010.2 "--sync--" sync / 14:[^:]*:Ketuduke:8AD4:/ window 20,20 +1015.2 "Tidal Roar" sync / 1[56]:[^:]*:Ketuduke:8AD4:/ + +1022.0 "--middle--" sync / 1[56]:[^:]*:Ketuduke:8A77:/ +1027.0 "Spring Crystals 1" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ +1034.0 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ +1041.0 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB8|8AB4):/ +1050.0 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:8AB1:/ +1060.0 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:8AB2:/ +1062.0 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:8AB3:/ +1065.0 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8ADC:/ +1065.1 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(8ADF|8ADE):/ + +1074.0 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB4|8AB8):/ +1077.1 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|8AB5):/ +1084.3 "Blowing Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABD:/ +1091.4 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:8AD0:/ +1096.3 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8ADE|8ADF):/ +1099.6 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:8AD0:/ +1102.5 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8ADF|8ADE):/ + +1113.6 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ +1118.9 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABB:/ +1130.3 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(8AE7|8AE9):/ +1130.9 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:8AE0:/ +1133.4 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(8AEA|8AE8):/ +1134.0 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:8AE0:/ +1134.0 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8ADE:/ + +1143.7 "Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB8:/ +1149.7 "Roar" sync / 1[56]:[^:]*:Ketuduke:8AC4:/ +1154.6 "Spring Crystals 2" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ +1164.6 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AC5:/ +1177.0 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:8ADF:/ +1177.6 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8ADC:/ +1182.7 "Updraft" sync / 1[56]:[^:]*:Ketuduke:8AC7:/ +1184.1 "Hundred Lashings" sync / 1[56]:[^:]*:Aloalo Zaratan:8ACA:/ + +1190.7 "--middle--" sync / 1[56]:[^:]*:Ketuduke:8A77:/ +1199.4 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB4|8AB8):/ +1202.4 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|8AB5):/ +1210.4 "Angry Seas" sync / 1[56]:[^:]*:Ketuduke:8AE1:/ +1211.6 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8ADE|8ADF):/ +1212.2 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:[^:]*:(8ADF|8ADE):/ # this sometimes has the wrong source +1214.8 "Spring Crystals 3" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ +1216.8 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:8ADF:/ +1221.8 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ +1227.8 "Fluke Typhoon (cast)" sync / 1[56]:[^:]*:Ketuduke:8AAF:/ +1233.8 "Fluke Typhoon" sync / 1[56]:[^:]*:Ketuduke:8AB0:/ +1236.4 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8ADB:/ +1238.8 "Burst x4" sync / 1[56]:[^:]*:Ketuduke:8AE2:/ + +1246.7 "Spring Crystals 4" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ +1253.7 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ +1260.7 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB8|8AB4):/ +1269.8 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:8AB1:/ +1279.9 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:8AB2:/ +1281.9 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:8AB3:/ +1284.9 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8ADC:/ +1285.0 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(8ADF|8ADE):/ + +1293.9 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ +1299.2 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABB:/ +1310.6 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(8AE7|8AE9):/ +1311.2 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:8AE0:/ +1313.7 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(8AEA|8AE8):/ +1314.3 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:8AE0:/ +1314.3 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8ADE:/ # ??? # ALL ENCOUNTER ABILITIES -# TODO --sync-- Ketuduke repositioning -# TODO Riptide ability on players from Angry Seas Airy Bubble when you step in one -# TODO Fetters ability on players from Angry Seas Airy Bubble when you step in one after TODO Riptide -# TODO --sync-- auto damage from Ketuduke -# TODO Spring Crystals cast and ability to summon Spring Crystal adds (all flavors) -# TODO 衝撃 self-targeted ability from Spring Crystal orbs -# TODO 衝撃 self-targeted ability from Spring Crystal rupees -# TODO Saturate cast and damage from Spring Crystal orb circle -# TODO Saturate cast and damage from Spring Crystal rupee line laser -# TODO Bubble Net self-targeted cast before Bubbles along with TODO during Spring Crystals 1 -# TODO Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 1 -# TODO Fluke Typhoon self-targeted cast before TODO knockback during Spring Crystals 3 -# TODO Fluke Typhoon cast and knockback ability on Spring Crystal and players during Spring Crystals 3 -# TODO Fluke Gale self-targeted cast that adds limit cut winds -# TODO Fluke Gale cast and ability for limit cut 1 wind -# TODO Fluke Gale cast and ability for limit cut 2 wind -# TODO Hydrofall self-targeted cast that adds stack markers -# TODO Hydrofall ability on players to give "stack second" before Blowing Bubbles -# TODO Hydrofall ability on players that adds stack debuffs -# TODO Hydrofall damage from stack debuffs -# TODO Hydrobullet self-targeted cast that adds stack markers -# TODO Hydrobullet ability on players that adds spread debuffs -# TODO Hydrobullet damage from spread debuffs -# TODO Strewn Bubbles self-targeted cast before TODO Sphere Shatter moving arches -# TODO Sphere Shatter damage from moving arches -# TODO Blowing Bubbles self-targeted cast that adds Airy Bubble Adds +# 8A77 --sync-- Ketuduke repositioning +# 8A82 Riptide ability on players from Angry Seas Airy Bubble when you step in one +# 8A83 Fetters ability on players from Angry Seas Airy Bubble when you step in one after 8A82 Riptide +# 8AA7 --sync-- auto damage from Ketuduke +# 8AA8 Spring Crystals cast and ability to summon Spring Crystal adds (all flavors) +# 8AD9 衝撃 self-targeted ability from Spring Crystal orbs +# 8ADA 衝撃 self-targeted ability from Spring Crystal rupees +# 8ADB Saturate cast and damage from Spring Crystal orb circle +# 8ADC Saturate cast and damage from Spring Crystal rupee line laser +# 8AAD Bubble Net self-targeted cast before Bubbles along with 8ADD during Spring Crystals 1 +# 8ADD Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 1 +# 8AAF Fluke Typhoon self-targeted cast before 8AB0 knockback during Spring Crystals 3 +# 8AB0 Fluke Typhoon cast and knockback ability on Spring Crystal and players during Spring Crystals 3 +# 8AB1 Fluke Gale self-targeted cast that adds limit cut winds +# 8AB2 Fluke Gale cast and ability for limit cut 1 wind +# 8AB3 Fluke Gale cast and ability for limit cut 2 wind +# 8AB4 Hydrofall self-targeted cast that adds stack markers +# 8AB5 Hydrofall ability on players to give "stack second" before Blowing Bubbles +# 8AB6 Hydrofall ability on players that adds stack debuffs +# 8ADE Hydrofall damage from stack debuffs +# 8AB8 Hydrobullet self-targeted cast that adds stack markers +# 8AB9 Hydrobullet ability on players that adds spread debuffs +# 8ADF Hydrobullet damage from spread debuffs +# 8ABB Strewn Bubbles self-targeted cast before 8AE0 Sphere Shatter moving arches +# 8AE0 Sphere Shatter damage from moving arches +# 8ABD Blowing Bubbles self-targeted cast that adds Airy Bubble Adds # TODO Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one # TODO Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after TODO Riptide -# TODO Angry Seas self-targeted cast for TODO red line knockback -# TODO Angry Seas cast and knockback damage from red line -# TODO Burst tower damage +# 8AC0 Angry Seas self-targeted cast for 8AE1 red line knockback +# 8AE1 Angry Seas cast and knockback damage from red line +# 8AE2 Burst tower damage # TODO Big Burst tower failure damage -# TODO Roar self-targeted cast that summons Zaratan adds -# TODO Bubble Net self-targeted cast before Bubbles along with TODO during Spring Crystals 2 -# TODO Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 2 -# TODO Updraft self-targeted cast to boost adds and players into the air -# TODO Updraft ability on players for TODO Updraft -# TODO Hundred Lashings cast and damage for non-bubbled Zaratan 180 cleave (no damage on bubbled players) -# TODO Hundred Lashings self-targeted cast for bubbled Zaratan adds -# TODO Hundred Lashings cast and damage for bubbled Zaratan 180 cleave (no damage on non-bubbled players) -# TODO Receding Twintides cast and damage for initial out during out->in -# TODO Near Tide fast cast and damage for second out during in->out with TODO Encroaching Twintides -# TODO Encroaching Twintides cast and damage for initial in during in->out -# TODO Far Tide fast cast and damage for second in during out->in with TODO Receding Twintides -# TODO Hydrobomb self-targeted cast for TODO puddles -# TODO Hydrobomb cast and damage for 3x puddles duruing TODO Blowing Bubbles -# TODO Tidal Roar self-targeted cast for raidwide aoe -# TODO Tidal Roar damage from TODO +# 8AC4 Roar self-targeted cast that summons Zaratan adds +# 8AC5 Bubble Net self-targeted cast before Bubbles along with 8AE4 during Spring Crystals 2 +# 8AE4 Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 2 +# 8AC7 Updraft self-targeted cast to boost adds and players into the air +# 8AC8 Updraft ability on players for 8AC7 Updraft +# 8AE5 Hundred Lashings cast and damage for non-bubbled Zaratan 180 cleave (no damage on bubbled players) +# 8ACA Hundred Lashings self-targeted cast for bubbled Zaratan adds +# 8AE6 Hundred Lashings cast and damage for bubbled Zaratan 180 cleave (no damage on non-bubbled players) +# 8AE7 Receding Twintides cast and damage for initial out during out->in +# 8AE8 Near Tide fast cast and damage for second out during in->out with 8AE9 Encroaching Twintides +# 8AE9 Encroaching Twintides cast and damage for initial in during in->out +# 8AEA Far Tide fast cast and damage for second in during out->in with 8AE7 Receding Twintides +# 8AD0 Hydrobomb self-targeted cast for 8AEB puddles +# 8AEB Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles +# 8AD4 Tidal Roar self-targeted cast for raidwide aoe +# 8AED Tidal Roar damage from 8AD4 # TODO Hydrobullet ability on players to give "spread second" before Blowing Bubbles @@ -268,7 +268,7 @@ hideall "--sync--" #~~~~~~~~~~~~~~~~~~~~# # -p TODO:3013.8 -# -ii TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO 8982 8CBE +# -ii TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO 3000.0 "--sync--" sync / 00:0839::The Midnight Trial will be sealed off/ window 10000,0 3008.8 "--sync--" sync / 14:[^:]*:Statice:TODO:/ window 20,20 @@ -305,25 +305,44 @@ hideall "--sync--" 3172.5 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ 3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ 3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ -3189.2 "Present Box" sync / 1[56]:[^:]*:Statice:TODO:/ +3189.2 "Present Box 1" sync / 1[56]:[^:]*:Statice:TODO:/ 3194.3 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:TODO:/ 3204.0 "Fireworks" sync / 1[56]:[^:]*:Statice:TODO:/ 3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ 3204.3 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:TODO:/ -3212.5 "Shocking Abandon" sync / 1[56]:[^:]*:Statice:8948:/ +3212.5 "Shocking Abandon" sync / 1[56]:[^:]*:Statice:TODO:/ -3222.7 "Pinwheeling Dartboard" sync / 1[56]:[^:]*:Statice:8CBC:/ +3222.7 "Pinwheeling Dartboard" sync / 1[56]:[^:]*:Statice:TODO:/ 3231.4 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:TODO:/ -3233.4 "Fire Spread" sync / 1[56]:[^:]*:Statice:8952:/ +3233.4 "Fire Spread" sync / 1[56]:[^:]*:Statice:8952:/ duration 11 3241.3 "Fireworks" sync / 1[56]:[^:]*:Statice:TODO:/ 3241.6 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:TODO:/ +3253.6 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ + +3260.8 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ +3266.5 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:TODO:/ +3273.6 "Trick Reload" sync / 1[56]:[^:]*:Statice:TODO:/ +3288.4 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:TODO:/ +3295.5 "Present Box 2" sync / 1[56]:[^:]*:Statice:TODO:/ +3302.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ +3309.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:TODO:/ +3310.2 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:TODO:/ +3316.5 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:TODO:/ +3320.4 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ + +3327.6 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ +3335.7 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ + +3338.8 "--sync--" sync / 14:[^:]*:Statice:TODO:/ +3348.8 "Aero IV Enrage" sync / 1[56]:[^:]*:Statice:TODO:/ + # ALL ENCOUNTER ABILITIES # TODO Locked and Loaded ability during TODO Trick Reload when a bullet is in the gun # TODO Misload ability during TODO Trick Reload when a bullet missed the gun oops # TODO --sync-- repositioning from Statice # TODO --sync-- auto damage from Statice -# 8948 Shocking Abandon cast and tankbuster damage +# TODO Shocking Abandon cast and tankbuster damage # TODO Aero IV cast and raidwide damage # TODO Trick Reload self-targeted cast to load gun with TODO/TODO # TODO Trigger Happy self-targeted cast for limit cut dart board @@ -334,24 +353,28 @@ hideall "--sync--" # TODO Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye # TODO Present Box self-targeted cast for bombs/donuts/missiles/hands # TODO Faerie Ring cast and damage for donut rings during Present Box -# TODO Trapshooting self-targeted cast after Trick Reload (after the first time) +# TODO Burst high damage from running into Surprising Missile tethered add +# TODO Death by Claw high damage from running into Surprising Claw tethered add +# TODO Trapshooting self-targeted cast after Trick Reload (some instances are TODO) # TODO Trapshooting stack damage from Trick Reload # TODO Trapshooting spread damage from Trick Reload # TODO Ring a Ring o' Explosions self-targeted cast for rotating bombs # TODO Burst cast and damage from bomb explosion # TODO Fireworks self-targeted cast -# TODO Fireworks two person stack damage during Present Box -# TODO Fireworks spread damage during Present Box +# TODO Fireworks two person stack damage during Present Box / Pinwheeling Dartboard +# TODO Fireworks spread damage during Present Box / Pinwheeling Dartboard # TODO Beguiling Glitter self-targeted cast to give players Face debuffs -# 8982 Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) +# TODO Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) # TODO Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) -# 89F9 Fire Spread ongoing rotating fire damage (from Statice) +# TODO Fire Spread ongoing rotating fire damage (from Statice) # TODO --sync-- ability on Bomb when rotating -# 8CBC Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire +# TODO Aero IV cast and enrage damage +# TODO Aero IV post-enrage follow-up damage just in case +# TODO Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire # TODO Dartboard of Dancing Explosives self-targeted cast for colored dartboard -# 8CBE Burning Chains damage from not breaking chains +# TODO Burning Chains damage from not breaking chains # TODO Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye -# TODO Trapshooting self-targeted cast after Trick Reload (first time) +# TODO Trapshooting self-targeted cast after Trick Reload (some instances are TODO) #~~~~~~~~~# @@ -359,21 +382,21 @@ hideall "--sync--" #~~~~~~~~~# # ALL ENCOUNTER ABILITIES -# TODO --sync-- various auto damage (trash 1) -# TODO --sync-- damage from Twister tornados -# TODO Lead Hook casted damage from Kiwakin 3x tankbuster -# TODO Lead Hook damage from hit 2 -# TODO Lead Hook damage from hit 3 -# TODO Water III casted damage from Snipper stack marker -# TODO Sharp Strike casted damage from Kiwakin tank buster with a concussion dot -# TODO Tail Screw casted damage from Kiwakin baited circle -# TODO Bubble Shower casted damage from Snipper front conal -# TODO Crab Dribble fast casted damage from Snipper back conal after Bubble Shower TODO -# TODO Hydrocannon casted damage from Ray front line -# TODO Expulsion casted damage from Ray "get out" -# TODO Electric Whorl casted damage from Ray "get in" -# TODO Hydroshot casted damage from Monk knockback line with a dot -# TODO Cross Attack casted damage from Monk tankbuster +# 7A56 --sync-- various auto damage (trash 1) +# 8BCF --sync-- damage from Twister tornados +# 8BC7 Lead Hook casted damage from Kiwakin 3x tankbuster +# 8BC6 Lead Hook damage from hit 2 +# 8BC4 Lead Hook damage from hit 3 +# 8BCC Water III casted damage from Snipper stack marker +# 8BC8 Sharp Strike casted damage from Kiwakin tank buster with a concussion dot +# 8BC9 Tail Screw casted damage from Kiwakin baited circle +# 8BCA Bubble Shower casted damage from Snipper front conal +# 8BCB Crab Dribble fast casted damage from Snipper back conal after Bubble Shower 8BCA +# 8C4B Hydrocannon casted damage from Ray front line +# 8BCE Expulsion casted damage from Ray "get out" +# 8BCD Electric Whorl casted damage from Ray "get in" +# 8BD1 Hydroshot casted damage from Monk knockback line with a dot +# 8C4F Cross Attack casted damage from Monk tankbuster #~~~~~~~~~# # TRASH 2 # @@ -382,11 +405,11 @@ hideall "--sync--" # TODO: does Wood Golem have an enrage?? # ALL ENCOUNTER ABILITIES -# TODO --sync-- various auto damage (trash 2) +# 7A58 --sync-- various auto damage (trash 2) # TODO Ovation cast and damage from Wood Golem front line aoe # TODO Gravity Force cast and stack damage from Islekeeper # TODO Ancient Quaga cast and damage for Islekeeper raidwide enrage -# TODO Ancient Aero III interruptable cast and damage for Wood Golem raidwide -# TODO Tornado cast and damage from Wood Golem that binds the initial target and heavies all targets -# TODO Ancient Quaga cast and damage for Islekeeper raidwide +# 8BD2 Ancient Aero III interruptable cast and damage for Wood Golem raidwide +# 8BD3 Tornado cast and damage from Wood Golem that binds the initial target and heavies all targets +# 8C39 Ancient Quaga cast and damage for Islekeeper raidwide # TODO Isle Drop cast and damage for Islekeeper front circle diff --git a/util/sync_files.ts b/util/sync_files.ts index f37c964649..14e1e2c200 100644 --- a/util/sync_files.ts +++ b/util/sync_files.ts @@ -575,14 +575,14 @@ const zoneReplace: ZoneReplace[] = [ // eslint-disable-next-line max-len // grep "^# [A-F0-9]\{4\} " ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt | sort | sed "s/^..//" | sed "s/^\(....\) \(.*\)$/ '\1': 'TODO', \/\/ \2/" id: { - '7A56': 'TODO', // --sync-- various auto damage (trash 1) - '7A58': 'TODO', // --sync-- various auto damage (trash 2) + '7A56': '7A56', // --sync-- various auto damage (trash 1) + '7A58': '7A58', // --sync-- various auto damage (trash 2) '8874': 'TODO', // --sync-- repositioning for Lala '8889': 'TODO', // Angular Addition self-targeted ability to give boss III - '888B': 'TODO', // Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave - '888C': 'TODO', // Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave - '888D': 'TODO', // Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave - '888E': 'TODO', // Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave + '888B': 'TODO1', // Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave + '888C': 'TODO2', // Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave + '888D': 'TODO3', // Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave + '888E': 'TODO4', // Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave '888F': 'TODO', // Arcane Blight cast and damage from 270 degree rotating cleave '8890': 'TODO', // Arcane Array self-targeted cast to summon moving blue squares (#1) '8891': 'TODO', // Bright Pulse cast and damage for initial blue square @@ -640,78 +640,78 @@ const zoneReplace: ZoneReplace[] = [ '8987': 'TODO', // Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) '89F9': 'TODO', // Fire Spread ongoing rotating fire damage (from Statice) '8A6A': 'TODO', // --sync-- ability on Bomb when rotating - '8A77': 'TODO', // --sync-- Ketuduke repositioning - '8A82': 'TODO', // Riptide ability on players from Angry Seas Airy Bubble when you step in one - '8A83': 'TODO', // Fetters ability on players from Angry Seas Airy Bubble when you step in one after 8A82 Riptide - '8AA7': 'TODO', // --sync-- auto damage from Ketuduke - '8AA8': 'TODO', // Spring Crystals cast and ability to summon Spring Crystal adds (all flavors) - '8AA9': 'TODO', // 衝撃 self-targeted ability from Spring Crystal orbs - '8AAA': 'TODO', // 衝撃 self-targeted ability from Spring Crystal rupees - '8AAB': 'TODO', // Saturate cast and damage from Spring Crystal orb circle - '8AAC': 'TODO', // Saturate cast and damage from Spring Crystal rupee line laser - '8AAD': 'TODO', // Bubble Net self-targeted cast before Bubbles along with 8AAE during Spring Crystals 1 - '8AAE': 'TODO', // Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 1 - '8AAF': 'TODO', // Fluke Typhoon self-targeted cast before 8AB0 knockback during Spring Crystals 3 - '8AB0': 'TODO', // Fluke Typhoon cast and knockback ability on Spring Crystal and players during Spring Crystals 3 - '8AB1': 'TODO', // Fluke Gale self-targeted cast that adds limit cut winds - '8AB2': 'TODO', // Fluke Gale cast and ability for limit cut 1 wind - '8AB3': 'TODO', // Fluke Gale cast and ability for limit cut 2 wind - '8AB4': 'TODO', // Hydrofall self-targeted cast that adds stack markers - '8AB5': 'TODO', // Hydrofall ability on players to give "stack second" before Blowing Bubbles - '8AB6': 'TODO', // Hydrofall ability on players that adds stack debuffs - '8AB7': 'TODO', // Hydrofall damage from stack debuffs - '8AB8': 'TODO', // Hydrobullet self-targeted cast that adds stack markers - '8AB9': 'TODO', // Hydrobullet ability on players that adds spread debuffs - '8ABA': 'TODO', // Hydrobullet damage from spread debuffs - '8ABB': 'TODO', // Strewn Bubbles self-targeted cast before 8ABC Sphere Shatter moving arches - '8ABC': 'TODO', // Sphere Shatter damage from moving arches - '8ABD': 'TODO', // Blowing Bubbles self-targeted cast that adds Airy Bubble Adds + '8A77': '8A77', // --sync-- Ketuduke repositioning + '8A82': '8A82', // Riptide ability on players from Angry Seas Airy Bubble when you step in one + '8A83': '8A83', // Fetters ability on players from Angry Seas Airy Bubble when you step in one after 8A82 Riptide + '8AA7': '8AA7', // --sync-- auto damage from Ketuduke + '8AA8': '8AA8', // Spring Crystals cast and ability to summon Spring Crystal adds (all flavors) + '8AA9': '8AD9', // 衝撃 self-targeted ability from Spring Crystal orbs + '8AAA': '8ADA', // 衝撃 self-targeted ability from Spring Crystal rupees + '8AAB': '8ADB', // Saturate cast and damage from Spring Crystal orb circle + '8AAC': '8ADC', // Saturate cast and damage from Spring Crystal rupee line laser + '8AAD': '8AAD', // Bubble Net self-targeted cast before Bubbles along with 8AAE during Spring Crystals 1 + '8AAE': '8ADD', // Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 1 + '8AAF': '8AAF', // Fluke Typhoon self-targeted cast before 8AB0 knockback during Spring Crystals 3 + '8AB0': '8AB0', // Fluke Typhoon cast and knockback ability on Spring Crystal and players during Spring Crystals 3 + '8AB1': '8AB1', // Fluke Gale self-targeted cast that adds limit cut winds + '8AB2': '8AB2', // Fluke Gale cast and ability for limit cut 1 wind + '8AB3': '8AB3', // Fluke Gale cast and ability for limit cut 2 wind + '8AB4': '8AB4', // Hydrofall self-targeted cast that adds stack markers + '8AB5': '8AB5', // Hydrofall ability on players to give "stack second" before Blowing Bubbles + '8AB6': '8AB6', // Hydrofall ability on players that adds stack debuffs + '8AB7': '8ADE', // Hydrofall damage from stack debuffs + '8AB8': '8AB8', // Hydrobullet self-targeted cast that adds stack markers + '8AB9': '8AB9', // Hydrobullet ability on players that adds spread debuffs + '8ABA': '8ADF', // Hydrobullet damage from spread debuffs + '8ABB': '8ABB', // Strewn Bubbles self-targeted cast before 8ABC Sphere Shatter moving arches + '8ABC': '8AE0', // Sphere Shatter damage from moving arches + '8ABD': '8ABD', // Blowing Bubbles self-targeted cast that adds Airy Bubble Adds '8ABE': 'TODO', // Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one '8ABF': 'TODO', // Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after 8ABE Riptide - '8AC0': 'TODO', // Angry Seas self-targeted cast for 8AC1 red line knockback - '8AC1': 'TODO', // Angry Seas cast and knockback damage from red line - '8AC2': 'TODO', // Burst tower damage + '8AC0': '8AC0', // Angry Seas self-targeted cast for 8AC1 red line knockback + '8AC1': '8AE1', // Angry Seas cast and knockback damage from red line + '8AC2': '8AE2', // Burst tower damage '8AC3': 'TODO', // Big Burst tower failure damage - '8AC4': 'TODO', // Roar self-targeted cast that summons Zaratan adds - '8AC5': 'TODO', // Bubble Net self-targeted cast before Bubbles along with 8AC6 during Spring Crystals 2 - '8AC6': 'TODO', // Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 2 - '8AC7': 'TODO', // Updraft self-targeted cast to boost adds and players into the air - '8AC8': 'TODO', // Updraft ability on players for 8AC7 Updraft - '8AC9': 'TODO', // Hundred Lashings cast and damage for non-bubbled Zaratan 180 cleave (no damage on bubbled players) - '8ACA': 'TODO', // Hundred Lashings self-targeted cast for bubbled Zaratan adds - '8ACB': 'TODO', // Hundred Lashings cast and damage for bubbled Zaratan 180 cleave (no damage on non-bubbled players) - '8ACC': 'TODO', // Receding Twintides cast and damage for initial out during out->in - '8ACD': 'TODO', // Near Tide fast cast and damage for second out during in->out with 8ACE Encroaching Twintides - '8ACE': 'TODO', // Encroaching Twintides cast and damage for initial in during in->out - '8ACF': 'TODO', // Far Tide fast cast and damage for second in during out->in with 8ACC Receding Twintides - '8AD0': 'TODO', // Hydrobomb self-targeted cast for 8AD1 puddles - '8AD1': 'TODO', // Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles - '8AD4': 'TODO', // Tidal Roar self-targeted cast for raidwide aoe - '8AD5': 'TODO', // Tidal Roar damage from 8AD4 - '8BB8': 'TODO', // Tail Screw casted damage from Kiwakin baited circle - '8BB9': 'TODO', // Bubble Shower casted damage from Snipper front conal - '8BBA': 'TODO', // Crab Dribble fast casted damage from Snipper back conal after Bubble Shower 8BB9 - '8BBB': 'TODO', // Cross Attack casted damage from Monk tankbuster - '8BBD': 'TODO', // Hydrocannon casted damage from Ray front line - '8BBE': 'TODO', // Electric Whorl casted damage from Ray "get in" - '8BBF': 'TODO', // Expulsion casted damage from Ray "get out" - '8BC0': 'TODO', // --sync-- damage from Twister tornados + '8AC4': '8AC4', // Roar self-targeted cast that summons Zaratan adds + '8AC5': '8AC5', // Bubble Net self-targeted cast before Bubbles along with 8AC6 during Spring Crystals 2 + '8AC6': '8AE4', // Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 2 + '8AC7': '8AC7', // Updraft self-targeted cast to boost adds and players into the air + '8AC8': '8AC8', // Updraft ability on players for 8AC7 Updraft + '8AC9': '8AE5', // Hundred Lashings cast and damage for non-bubbled Zaratan 180 cleave (no damage on bubbled players) + '8ACA': '8ACA', // Hundred Lashings self-targeted cast for bubbled Zaratan adds + '8ACB': '8AE6', // Hundred Lashings cast and damage for bubbled Zaratan 180 cleave (no damage on non-bubbled players) + '8ACC': '8AE7', // Receding Twintides cast and damage for initial out during out->in + '8ACD': '8AE8', // Near Tide fast cast and damage for second out during in->out with 8ACE Encroaching Twintides + '8ACE': '8AE9', // Encroaching Twintides cast and damage for initial in during in->out + '8ACF': '8AEA', // Far Tide fast cast and damage for second in during out->in with 8ACC Receding Twintides + '8AD0': '8AD0', // Hydrobomb self-targeted cast for 8AD1 puddles + '8AD1': '8AEB', // Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles + '8AD4': '8AD4', // Tidal Roar self-targeted cast for raidwide aoe + '8AD5': '8AED', // Tidal Roar damage from 8AD4 + '8BB8': '8BC9', // Tail Screw casted damage from Kiwakin baited circle + '8BB9': '8BCA', // Bubble Shower casted damage from Snipper front conal + '8BBA': '8BCB', // Crab Dribble fast casted damage from Snipper back conal after Bubble Shower 8BB9 + '8BBB': '8C4F', // Cross Attack casted damage from Monk tankbuster + '8BBD': '8C4B', // Hydrocannon casted damage from Ray front line + '8BBE': '8BCD', // Electric Whorl casted damage from Ray "get in" + '8BBF': '8BCE', // Expulsion casted damage from Ray "get out" + '8BC0': '8BCF', // --sync-- damage from Twister tornados '8BC1': 'TODO', // Ovation cast and damage from Wood Golem front line aoe '8BC5': 'TODO', // Gravity Force cast and stack damage from Islekeeper '8C23': 'TODO', // Aero IV cast and enrage damage '8C24': 'TODO', // Aero IV post-enrage follow-up damage just in case '8C25': 'TODO', // Inferno Theorem cast and enrage damage '8C2F': 'TODO', // Ancient Quaga cast and damage for Islekeeper raidwide enrage - '8C4C': 'TODO', // Ancient Aero III interruptable cast and damage for Wood Golem raidwide - '8C4D': 'TODO', // Tornado cast and damage from Wood Golem that binds the initial target and heavies all targets - '8C4E': 'TODO', // Ancient Quaga cast and damage for Islekeeper raidwide - '8C53': 'TODO', // Lead Hook damage from hit 3 - '8C62': 'TODO', // Lead Hook damage from hit 2 - '8C63': 'TODO', // Sharp Strike casted damage from Kiwakin tank buster with a concussion dot - '8C64': 'TODO', // Water III casted damage from Snipper stack marker - '8C65': 'TODO', // Hydroshot casted damage from Monk knockback line with a dot + '8C4C': '8BD2', // Ancient Aero III interruptable cast and damage for Wood Golem raidwide + '8C4D': '8BD3', // Tornado cast and damage from Wood Golem that binds the initial target and heavies all targets + '8C4E': '8C39', // Ancient Quaga cast and damage for Islekeeper raidwide + '8C53': '8BC4', // Lead Hook damage from hit 3 + '8C62': '8BC6', // Lead Hook damage from hit 2 + '8C63': '8BC8', // Sharp Strike casted damage from Kiwakin tank buster with a concussion dot + '8C64': '8BCC', // Water III casted damage from Snipper stack marker + '8C65': '8BD1', // Hydroshot casted damage from Monk knockback line with a dot '8C6D': 'TODO', // Hydrobullet ability on players to give "spread second" before Blowing Bubbles - '8C6E': 'TODO', // Lead Hook casted damage from Kiwakin 3x tankbuster + '8C6E': '8BC7', // Lead Hook casted damage from Kiwakin 3x tankbuster '8C6F': 'TODO', // Isle Drop cast and damage for Islekeeper front circle '8CBC': 'TODO', // Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire '8CBD': 'TODO', // Dartboard of Dancing Explosives self-targeted cast for colored dartboard From f41dd07ac43535e8830d69e375b5c97c18a00a86 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 5 Dec 2023 12:17:09 -0800 Subject: [PATCH 23/39] guesses at lala savage ids --- .../dungeon/another_aloalo_island-savage.ts | 40 ++-- .../dungeon/another_aloalo_island-savage.ts | 28 ++- .../dungeon/another_aloalo_island-savage.txt | 226 +++++++++--------- util/sync_files.ts | 82 +++---- 4 files changed, 191 insertions(+), 185 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts index cd1db7e2d2..6ca2f7af44 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -1,5 +1,7 @@ // This file was autogenerated from running ts-node util/sync_files.ts. // DO NOT EDIT THIS FILE DIRECTLY. +// Edit the source file below and then run `npm run sync-files` +// Source: ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island.ts import NetRegexes from '../../../../../resources/netregexes'; import ZoneId from '../../../../../resources/zone_id'; @@ -9,11 +11,11 @@ import { LocaleText } from '../../../../../types/trigger'; import { playerDamageFields } from '../../../oopsy_common'; // TODO: people who missed their 8AE2 Burst tower -// TODO: failing TODO Radiance orb damage during Analysis -// TODO: failing TODO Targeted Light during Analysis +// TODO: failing 8BEB Radiance orb damage during Analysis +// TODO: failing 8CE1 Targeted Light during Analysis // TODO: people who failed Subtractive Suppressor Alpha + Beta -// TODO: walking over TODO Arcane Combustion when you don't have Suppressor -// TODO: taking extra TODO Inferno Divide squares during Spatial Tactics +// TODO: walking over 8BF2 Arcane Combustion when you don't have Suppressor +// TODO: taking extra 8BEA Inferno Divide squares during Spatial Tactics // TODO: 01F7(success) and 01F8(fail) check and x markers? // TODO: players not in Trapshooting stack TODO // TODO: players not in Present Box / Pinwheeling Dartboard two person stack @@ -113,16 +115,16 @@ const triggerSet: OopsyTriggerSet = { 'AAIS Hydrobomb': '8AEB', // 3x puddles duruing 8ABD Blowing Bubbles // Trash 2 - 'AAIS Wood Golem Ovation': 'TODO', // front line aoe - 'AAIS Islekeeper Isle Drop': 'TODO', // front circle + 'AAIS Wood Golem Ovation': '8BD4', // front line aoe + 'AAIS Islekeeper Isle Drop': '8C3C', // front circle // Lala - 'AAIS Arcane Blight': 'TODO', // 270 degree rotating cleave - 'AAIS Bright Pulse 1': 'TODO', // initial blue square - 'AAIS Bright Pulse 2': 'TODO', // moving blue square - 'AAIS Arcane Mine': 'TODO', // initial Arcane Mine squares - 'AAIS Golem Aero II': 'TODO', // line damage from Aloalo Golem during Symmetric Surge - 'AAIS Telluric Theorem': 'TODO', // puddles from Explosive Theorem spreads + 'AAIS Arcane Blight': '8BE6', // 270 degree rotating cleave + 'AAIS Bright Pulse 1': '8BE8', // initial blue square + 'AAIS Bright Pulse 2': '8BE9', // moving blue square + 'AAIS Arcane Mine': '8BF1', // initial Arcane Mine squares + 'AAIS Golem Aero II': '8BFB', // line damage from Aloalo Golem during Symmetric Surge + 'AAIS Telluric Theorem': '8C00', // puddles from Explosive Theorem spreads // Statice 'AAIS Trigger Happy': 'TODO', // limit cut dart board @@ -133,9 +135,9 @@ const triggerSet: OopsyTriggerSet = { 'AAIS Fire Spread 2': 'TODO', // ongoing rotating fire damage (from Statice) }, damageFail: { - 'AAIS Big Burst': 'TODO', // tower failure damage - 'AAIS Massive Explosion 1': 'TODO', // failing to resolve Subractive Suppressor Alpha - 'AAIS Massive Explosion 2': 'TODO', // failing to resolve Subractive Suppressor Beta + 'AAIS Big Burst': '8AE3', // tower failure damage + 'AAIS Massive Explosion 1': '8BF3', // failing to resolve Subractive Suppressor Alpha + 'AAIS Massive Explosion 2': '8BF4', // failing to resolve Subractive Suppressor Beta 'AAIS Burning Chains': 'TODO', // damage from not breaking chains 'AAIS Surprising Missile Burst': 'TODO', // running into Surprising Missile tethered add 'AAIS Surprising Claw Death by Claw': 'TODO', // running into Surprising Claw tethered add @@ -151,19 +153,19 @@ const triggerSet: OopsyTriggerSet = { shareWarn: { 'AAIS Hydrobullet': '8ADF', // spread debuffs 'AAIS Wood Golem Tornado': '8BD3', // headmarker -> bind and heavy aoe - 'AAIS Powerful Light': 'TODO', // spread marker during Symmetric Surge that turns squares blue - 'AAIS Explosive Theorem': 'TODO', // large spreads with Telluric Theorem puddles + 'AAIS Powerful Light': '8BFD', // spread marker during Symmetric Surge that turns squares blue + 'AAIS Explosive Theorem': '8BFF', // large spreads with Telluric Theorem puddles 'AAIS Trapshooting Spread': 'TODO', // spread damage from Trick Reload 'AAIS Firewords Spread': 'TODO', // spread damage during Present Box / Pinwheeling Dartboard }, soloWarn: { 'AAIS Snipper Water III': '8BCC', // Snipper stack marker - 'AAIS Islekeeper Gravity Force': 'TODO', // stack + 'AAIS Islekeeper Gravity Force': '8C3A', // stack 'AAIS Trapshooting Stack': 'TODO', // stack damage from Trick Reload }, soloFail: { 'AAIS Hydrofall': '8ADE', // partner stack debuffs - 'AAIS Symmetric Surge': 'TODO', // two person stack that gives magic vuln up + 'AAIS Symmetric Surge': '8BF5', // two person stack that gives magic vuln up 'AAIS Fireworks Stack': 'TODO', // two person stack damage during Present Box / Pinwheeling Dartboard }, triggers: [ diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 540d42540b..6d7899f8c2 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -1,5 +1,7 @@ // This file was autogenerated from running ts-node util/sync_files.ts. // DO NOT EDIT THIS FILE DIRECTLY. +// Edit the source file below and then run `npm run sync-files` +// Source: ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts import Conditions from '../../../../../resources/conditions'; import Outputs from '../../../../../resources/outputs'; @@ -491,19 +493,19 @@ const triggerSet: TriggerSet = { { id: 'AAIS Wood Golem Ovation', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Wood Golem', capture: false }, + netRegex: { id: '8BD4', source: 'Aloalo Wood Golem', capture: false }, response: Responses.getBehind('info'), }, { id: 'AAIS Islekeeper Gravity Force', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Islekeeper' }, + netRegex: { id: '8C3A', source: 'Aloalo Islekeeper' }, response: Responses.stackMarkerOn(), }, { id: 'AAIS Islekeeper Isle Drop', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Aloalo Islekeeper', capture: false }, + netRegex: { id: '8C3C', source: 'Aloalo Islekeeper', capture: false }, response: Responses.getBehind('info'), }, { @@ -527,7 +529,7 @@ const triggerSet: TriggerSet = { { id: 'AAIS Lala Inferno Theorem', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Lala', capture: false }, + netRegex: { id: '8C05', source: 'Lala', capture: false }, response: Responses.aoe(), }, { @@ -539,19 +541,19 @@ const triggerSet: TriggerSet = { { id: 'AAIS Lala Angular Addition Tracker', type: 'Ability', - netRegex: { id: ['TODO', 'TODO'], source: 'Lala' }, - run: (data, matches) => data.lalaBossTimes = matches.id === 'TODO' ? 3 : 5, + netRegex: { id: ['8BE0', '8D2F'], source: 'Lala' }, + run: (data, matches) => data.lalaBossTimes = matches.id === '8BE0' ? 3 : 5, }, { id: 'AAIS Lala Arcane Blight', type: 'StartsUsing', - netRegex: { id: ['TODO1', 'TODO2', 'TODO3', 'TODO4'], source: 'Lala' }, + netRegex: { id: ['8BE2', '8BE3', '8BE4', '8BE5'], source: 'Lala' }, alertText: (data, matches, output) => { const initialDir = { - 'TODO1': 2, // initial back safe - 'TODO2': 0, // initial front safe - 'TODO3': 1, // initial right safe - 'TODO4': 3, // initial left safe + '8BE2': 2, // initial back safe + '8BE3': 0, // initial front safe + '8BE4': 1, // initial right safe + '8BE5': 3, // initial left safe }[matches.id]; if (initialDir === undefined) return; @@ -647,7 +649,7 @@ const triggerSet: TriggerSet = { { id: 'AAIS Lala Targeted Light', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Lala', capture: false }, + netRegex: { id: '8CE0', source: 'Lala', capture: false }, alertText: (data, _matches, output) => { const initialUnseen = data.lalaUnseen; if (initialUnseen === undefined) @@ -700,7 +702,7 @@ const triggerSet: TriggerSet = { { id: 'AAIS Lala Strategic Strike', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Lala' }, + netRegex: { id: '8C04', source: 'Lala' }, response: Responses.tankBuster(), }, { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index aff787b3e8..60fd6eedc8 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -1,5 +1,7 @@ # This file was autogenerated from running ts-node util/sync_files.ts. # DO NOT EDIT THIS FILE DIRECTLY. +# Edit the source file below and then run `npm run sync-files` +# Source: ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt ### ANOTHER ALOALO ISLAND # ZoneId: 49B @@ -14,7 +16,7 @@ hideall "--sync--" #~~~~~~~~~~# # -p 8AD4:1015.2 -# -ii 8AA7 8AED 8ADD 8AB9 8AB6 8AEB TODO TODO 8AE5 8AE6 8AC0 8ADA 8AD9 8AE4 8AC8 TODO 8A82 8A83 +# -ii 8AA7 8AED 8ADD 8AB9 8AB6 8AEB TODO TODO 8AE5 8AE6 8AC0 8ADA 8AD9 8AE4 8AC8 8AE3 8A82 8A83 1000.0 "--sync--" sync / 00:0839::The Dawn Trial will be sealed off/ window 10000,0 1010.2 "--sync--" sync / 14:[^:]*:Ketuduke:8AD4:/ window 20,20 @@ -119,7 +121,7 @@ hideall "--sync--" # 8AC0 Angry Seas self-targeted cast for 8AE1 red line knockback # 8AE1 Angry Seas cast and knockback damage from red line # 8AE2 Burst tower damage -# TODO Big Burst tower failure damage +# 8AE3 Big Burst tower failure damage # 8AC4 Roar self-targeted cast that summons Zaratan adds # 8AC5 Bubble Net self-targeted cast before Bubbles along with 8AE4 during Spring Crystals 2 # 8AE4 Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 2 @@ -143,79 +145,79 @@ hideall "--sync--" # LALA # #~~~~~~# -# -p TODO:2011.1 -# -ii TODO TODO TODO TODO TODO TODO TODO TODO +# -p 8C05:2011.1 +# -ii 8BE6 8BE9 8CE1 8BF1 8BF2 8BFF 8BF3 8BF4 2000.0 "--sync--" sync / 00:0839::The Dusk Trial will be sealed off/ window 10000,0 -2006.1 "--sync--" sync / 14:[^:]*:Lala:TODO:/ window 20,20 -2011.1 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ - -2013.2 "--middle--" sync / 1[56]:[^:]*:Lala:TODO:/ -2018.3 "Angular Addition" sync / 1[56]:[^:]*:Lala:(TODO|TODO):/ -2026.4 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(TODO1|TODO2|TODO3|TODO4):/ - -2029.6 "--middle--" sync / 1[56]:[^:]*:Lala:TODO:/ -2034.7 "Analysis" sync / 1[56]:[^:]*:Lala:TODO:/ -2039.8 "Arcane Array 1" sync / 1[56]:[^:]*:Lala:TODO:/ -2044.9 "Angular Addition" sync / 1[56]:[^:]*:Lala:(TODO|TODO):/ -2045.6 "Bright Pulse" sync / 1[56]:[^:]*:Lala:TODO:/ -2046.9 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:TODO:/ -2053.0 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(TODO1|TODO2|TODO3|TODO4):/ +2006.1 "--sync--" sync / 14:[^:]*:Lala:8C05:/ window 20,20 +2011.1 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ + +2013.2 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ +2018.3 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8BE0|8D2F):/ +2026.4 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(8BE2|8BE3|8BE4|8BE5):/ + +2029.6 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ +2034.7 "Analysis" sync / 1[56]:[^:]*:Lala:8BEC:/ +2039.8 "Arcane Array 1" sync / 1[56]:[^:]*:Lala:8BE7:/ +2044.9 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8BE0|8D2F):/ +2045.6 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8BE8:/ +2046.9 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:8BEB:/ +2053.0 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(8BE2|8BE3|8BE4|8BE5):/ # This can be +1.2s if it's on the final square instead of penultimate. -2054.1 "Radiance 2" #sync / 1[56]:[^:]*:Arcane Globe:TODO:/ -2061.2 "Targeted Light" sync / 1[56]:[^:]*:Lala:TODO:/ - -2072.5 "Strategic Strike" sync / 1[56]:[^:]*:Lala:TODO:/ - -2085.6 "Planar Tactics" sync / 1[56]:[^:]*:Lala:TODO:/ -2100.7 "Arcane Mine" sync / 1[56]:[^:]*:Lala:TODO:/ -2108.6 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:TODO:/ - -2112.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ -2122.9 "Strategic Strike" sync / 1[56]:[^:]*:Lala:TODO:/ - -2131.1 "--middle--" sync / 1[56]:[^:]*:Lala:TODO:/ -2138.3 "Spatial Tactics" sync / 1[56]:[^:]*:Lala:TODO:/ -2143.4 "Arcane Array 2" sync / 1[56]:[^:]*:Lala:TODO:/ -2149.2 "Bright Pulse" sync / 1[56]:[^:]*:Lala:TODO:/ -2150.5 "Inferno Divide 1" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 -2150.5 "Radiance" sync / 1[56]:[^:]*:Arcane Globe:TODO:/ -2152.9 "Inferno Divide 2" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 -2156.6 "Inferno Divide 3" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 -2157.6 "Angular Addition" sync / 1[56]:[^:]*:Lala:(TODO|TODO):/ -2157.8 "Inferno Divide 4" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 -2160.2 "Inferno Divide 5" sync / 1[56]:[^:]*:Arcane Font:TODO:/ window 1,1 -2165.6 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(TODO1|TODO2|TODO3|TODO4):/ - -2173.7 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ -2184.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ - -2196.9 "Symmetric Surge" sync / 1[56]:[^:]*:Lala:TODO:/ -2202.0 "Constructive Figure" sync / 1[56]:[^:]*:Lala:TODO:/ -2207.1 "Arcane Plot" sync / 1[56]:[^:]*:Lala:TODO:/ -2212.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:TODO:/ -2221.2 "Arcane Point" sync / 1[56]:[^:]*:Lala:TODO:/ -2221.8 "Aero II" sync / 1[56]:[^:]*:Aloalo Golem:TODO:/ -2222.0 "Powerful Light" sync / 1[56]:[^:]*:Lala:TODO:/ -2230.3 "Explosive Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ -2234.7 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:TODO:/ -2235.4 "Telluric Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ - -2248.4 "Strategic Strike" sync / 1[56]:[^:]*:Lala:TODO:/ -2256.5 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ - -2263.6 "--middle--" sync / 1[56]:[^:]*:Lala:TODO:/ -2269.0 "Analysis" sync / 1[56]:[^:]*:Lala:TODO:/ -2274.1 "Arcane Array 3" sync / 1[56]:[^:]*:Lala:TODO:/ -2279.2 "Angular Addition" sync / 1[56]:[^:]*:Lala:(TODO|TODO):/ -2279.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:TODO:/ -2281.2 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:TODO:/ -2287.3 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(TODO1|TODO2|TODO3|TODO4):/ -2290.9 "Radiance 2" sync / 1[56]:[^:]*:Arcane Globe:TODO:/ -2295.6 "Targeted Light" sync / 1[56]:[^:]*:Lala:TODO:/ -2306.7 "Strategic Strike" sync / 1[56]:[^:]*:Lala:TODO:/ - -2316.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:TODO:/ +2054.1 "Radiance 2" #sync / 1[56]:[^:]*:Arcane Globe:8BEB:/ +2061.2 "Targeted Light" sync / 1[56]:[^:]*:Lala:8CE0:/ + +2072.5 "Strategic Strike" sync / 1[56]:[^:]*:Lala:8C04:/ + +2085.6 "Planar Tactics" sync / 1[56]:[^:]*:Lala:8BEF:/ +2100.7 "Arcane Mine" sync / 1[56]:[^:]*:Lala:8BF0:/ +2108.6 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:8BF5:/ + +2112.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ +2122.9 "Strategic Strike" sync / 1[56]:[^:]*:Lala:8C04:/ + +2131.1 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ +2138.3 "Spatial Tactics" sync / 1[56]:[^:]*:Lala:8BF7:/ +2143.4 "Arcane Array 2" sync / 1[56]:[^:]*:Lala:8BF6:/ +2149.2 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8BE8:/ +2150.5 "Inferno Divide 1" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 +2150.5 "Radiance" sync / 1[56]:[^:]*:Arcane Globe:8D20:/ +2152.9 "Inferno Divide 2" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 +2156.6 "Inferno Divide 3" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 +2157.6 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8BE0|8D2F):/ +2157.8 "Inferno Divide 4" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 +2160.2 "Inferno Divide 5" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 +2165.6 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(8BE2|8BE3|8BE4|8BE5):/ + +2173.7 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ +2184.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ + +2196.9 "Symmetric Surge" sync / 1[56]:[^:]*:Lala:8BF8:/ +2202.0 "Constructive Figure" sync / 1[56]:[^:]*:Lala:8BFA:/ +2207.1 "Arcane Plot" sync / 1[56]:[^:]*:Lala:8BF9:/ +2212.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8BE8:/ +2221.2 "Arcane Point" sync / 1[56]:[^:]*:Lala:8BFC:/ +2221.8 "Aero II" sync / 1[56]:[^:]*:Aloalo Golem:8BFB:/ +2222.0 "Powerful Light" sync / 1[56]:[^:]*:Lala:8BFD:/ +2230.3 "Explosive Theorem" sync / 1[56]:[^:]*:Lala:8BFE:/ +2234.7 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:8BF5:/ +2235.4 "Telluric Theorem" sync / 1[56]:[^:]*:Lala:8C00:/ + +2248.4 "Strategic Strike" sync / 1[56]:[^:]*:Lala:8C04:/ +2256.5 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ + +2263.6 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ +2269.0 "Analysis" sync / 1[56]:[^:]*:Lala:8BEC:/ +2274.1 "Arcane Array 3" sync / 1[56]:[^:]*:Lala:8BE7:/ +2279.2 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8BE0|8D2F):/ +2279.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8BE8:/ +2281.2 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:8BEB:/ +2287.3 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(8BE2|8BE3|8BE4|8BE5):/ +2290.9 "Radiance 2" sync / 1[56]:[^:]*:Arcane Globe:8BEB:/ +2295.6 "Targeted Light" sync / 1[56]:[^:]*:Lala:8CE0:/ +2306.7 "Strategic Strike" sync / 1[56]:[^:]*:Lala:8C04:/ + +2316.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ 2319.9 "--sync--" sync / 14:[^:]*:Lala:TODO:/ window 20,20 2329.9 "Inferno Theorem Enrage" sync / 1[56]:[^:]*:Lala:TODO:/ @@ -223,44 +225,44 @@ hideall "--sync--" # ALL ENCOUNTER ABILITIES # 368 attack auto damage from Lala -# TODO --sync-- repositioning for Lala -# TODO Angular Addition self-targeted ability to give boss III -# TODO1 Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave -# TODO2 Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave -# TODO3 Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave -# TODO4 Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave -# TODO Arcane Blight cast and damage from 270 degree rotating cleave -# TODO Arcane Array self-targeted cast to summon moving blue squares (#1) -# TODO Bright Pulse cast and damage for initial blue square -# TODO Bright Pulse damage from moving blue square -# TODO Inferno Divide orange square cross explosion damage during Spatial Tactics -# TODO Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #1, #3) -# TODO Analysis self-targeted cast before giving players -# TODO Planar Tactics self-targeted cast before Arcane Mines -# TODO Arcane Mine self-targeted cast to create 8 Arcane Mine squares -# TODO Arcane Mine cast and damage for initial Arcane Mine squares -# TODO Arcane Combustion damage from walking over an Arcane Mine -# TODO Massive Explosion damage from failing to resolve Subractive Suppressor Alpha -# TODO Massive Explosion damage from failing to resolve Subractive Suppressor Beta -# TODO Symmetric Surge damage from two person stack that gives magic vuln up -# TODO Arcane Array self-targeted cast to summon moving blue squares (#2) -# TODO Spatial Tactics self-targeted cast prior to Arcane Array 2 -# TODO Symmetric Surge self-targeted cast before this mechanic -# TODO Arcane Plot self-targeted cast to summon blue squares for Symmetric Surge -# TODO Constructive Figure self-targeted cast that summons Aloalo Golem on edge -# TODO Aero II cast and line damage from Aloalo Golem during Symmetric Surge -# TODO Arcane Point self-targeted cast that gives players TODO Powerful Light spreads -# TODO Powerful Light spread damage on players that turn the squares they are on blue -# TODO Explosive Theorem self-targeted cast for very large spreads -# TODO Explosive Theorem cast and damage on players for spreads with Telluric Theorem puddles -# TODO Telluric Theorem cast and damage for large puddles from Explosive Theorem -# TODO Strategic Strike cast and damage for non-cleaving 3x tankbuster -# TODO Inferno Theorem cast and raidwide damage +# 8874 --sync-- repositioning for Lala +# 8BE0 Angular Addition self-targeted ability to give boss III +# 8BE2 Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave +# 8BE3 Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave +# 8BE4 Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave +# 8BE5 Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave +# 8BE6 Arcane Blight cast and damage from 270 degree rotating cleave +# 8BE7 Arcane Array self-targeted cast to summon moving blue squares (#1) +# 8BE8 Bright Pulse cast and damage for initial blue square +# 8BE9 Bright Pulse damage from moving blue square +# 8BEA Inferno Divide orange square cross explosion damage during Spatial Tactics +# 8BEB Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #1, #3) +# 8BEC Analysis self-targeted cast before giving players +# 8BEF Planar Tactics self-targeted cast before Arcane Mines +# 8BF0 Arcane Mine self-targeted cast to create 8 Arcane Mine squares +# 8BF1 Arcane Mine cast and damage for initial Arcane Mine squares +# 8BF2 Arcane Combustion damage from walking over an Arcane Mine +# 8BF3 Massive Explosion damage from failing to resolve Subractive Suppressor Alpha +# 8BF4 Massive Explosion damage from failing to resolve Subractive Suppressor Beta +# 8BF5 Symmetric Surge damage from two person stack that gives magic vuln up +# 8BF6 Arcane Array self-targeted cast to summon moving blue squares (#2) +# 8BF7 Spatial Tactics self-targeted cast prior to Arcane Array 2 +# 8BF8 Symmetric Surge self-targeted cast before this mechanic +# 8BF9 Arcane Plot self-targeted cast to summon blue squares for Symmetric Surge +# 8BFA Constructive Figure self-targeted cast that summons Aloalo Golem on edge +# 8BFB Aero II cast and line damage from Aloalo Golem during Symmetric Surge +# 8BFC Arcane Point self-targeted cast that gives players 8BFD Powerful Light spreads +# 8BFD Powerful Light spread damage on players that turn the squares they are on blue +# 8BFE Explosive Theorem self-targeted cast for very large spreads +# 8BFF Explosive Theorem cast and damage on players for spreads with Telluric Theorem puddles +# 8C00 Telluric Theorem cast and damage for large puddles from Explosive Theorem +# 8C04 Strategic Strike cast and damage for non-cleaving 3x tankbuster +# 8C05 Inferno Theorem cast and raidwide damage # TODO Inferno Theorem cast and enrage damage -# TODO Targeted Light self-targeted cast for weak spot boss tether -# TODO Targeted Light cast and damage on players for TODO -# TODO Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) -# TODO Angular Addition self-targeted ability to give boss V +# 8CE0 Targeted Light self-targeted cast for weak spot boss tether +# 8CE1 Targeted Light cast and damage on players for 8CE0 +# 8D20 Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) +# 8D2F Angular Addition self-targeted ability to give boss V #~~~~~~~~~~~~~~~~~~~~# @@ -406,10 +408,10 @@ hideall "--sync--" # ALL ENCOUNTER ABILITIES # 7A58 --sync-- various auto damage (trash 2) -# TODO Ovation cast and damage from Wood Golem front line aoe -# TODO Gravity Force cast and stack damage from Islekeeper +# 8BD4 Ovation cast and damage from Wood Golem front line aoe +# 8C3A Gravity Force cast and stack damage from Islekeeper # TODO Ancient Quaga cast and damage for Islekeeper raidwide enrage # 8BD2 Ancient Aero III interruptable cast and damage for Wood Golem raidwide # 8BD3 Tornado cast and damage from Wood Golem that binds the initial target and heavies all targets # 8C39 Ancient Quaga cast and damage for Islekeeper raidwide -# TODO Isle Drop cast and damage for Islekeeper front circle +# 8C3C Isle Drop cast and damage for Islekeeper front circle diff --git a/util/sync_files.ts b/util/sync_files.ts index 14e1e2c200..65631c28cd 100644 --- a/util/sync_files.ts +++ b/util/sync_files.ts @@ -577,39 +577,39 @@ const zoneReplace: ZoneReplace[] = [ id: { '7A56': '7A56', // --sync-- various auto damage (trash 1) '7A58': '7A58', // --sync-- various auto damage (trash 2) - '8874': 'TODO', // --sync-- repositioning for Lala - '8889': 'TODO', // Angular Addition self-targeted ability to give boss III - '888B': 'TODO1', // Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave - '888C': 'TODO2', // Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave - '888D': 'TODO3', // Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave - '888E': 'TODO4', // Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave - '888F': 'TODO', // Arcane Blight cast and damage from 270 degree rotating cleave - '8890': 'TODO', // Arcane Array self-targeted cast to summon moving blue squares (#1) - '8891': 'TODO', // Bright Pulse cast and damage for initial blue square - '8892': 'TODO', // Bright Pulse damage from moving blue square - '8893': 'TODO', // Inferno Divide orange square cross explosion damage during Spatial Tactics - '8894': 'TODO', // Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #1, #3) - '8895': 'TODO', // Analysis self-targeted cast before giving players - '8898': 'TODO', // Planar Tactics self-targeted cast before Arcane Mines - '8899': 'TODO', // Arcane Mine self-targeted cast to create 8 Arcane Mine squares - '889A': 'TODO', // Arcane Mine cast and damage for initial Arcane Mine squares - '889B': 'TODO', // Arcane Combustion damage from walking over an Arcane Mine - '889C': 'TODO', // Massive Explosion damage from failing to resolve Subractive Suppressor Alpha - '889D': 'TODO', // Massive Explosion damage from failing to resolve Subractive Suppressor Beta - '889E': 'TODO', // Symmetric Surge damage from two person stack that gives magic vuln up - '889F': 'TODO', // Arcane Array self-targeted cast to summon moving blue squares (#2) - '88A0': 'TODO', // Spatial Tactics self-targeted cast prior to Arcane Array 2 - '88A1': 'TODO', // Symmetric Surge self-targeted cast before this mechanic - '88A2': 'TODO', // Arcane Plot self-targeted cast to summon blue squares for Symmetric Surge - '88A3': 'TODO', // Constructive Figure self-targeted cast that summons Aloalo Golem on edge - '88A4': 'TODO', // Aero II cast and line damage from Aloalo Golem during Symmetric Surge - '88A5': 'TODO', // Arcane Point self-targeted cast that gives players 88A6 Powerful Light spreads - '88A6': 'TODO', // Powerful Light spread damage on players that turn the squares they are on blue - '88A7': 'TODO', // Explosive Theorem self-targeted cast for very large spreads - '88A8': 'TODO', // Explosive Theorem cast and damage on players for spreads with Telluric Theorem puddles - '88A9': 'TODO', // Telluric Theorem cast and damage for large puddles from Explosive Theorem - '88AD': 'TODO', // Strategic Strike cast and damage for non-cleaving 3x tankbuster - '88AE': 'TODO', // Inferno Theorem cast and raidwide damage + '8874': '8874', // --sync-- repositioning for Lala + '8889': '8BE0', // ??? Angular Addition self-targeted ability to give boss III + '888B': '8BE2', // ??? Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave + '888C': '8BE3', // ??? Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave + '888D': '8BE4', // ??? Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave + '888E': '8BE5', // ??? Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave + '888F': '8BE6', // Arcane Blight cast and damage from 270 degree rotating cleave + '8890': '8BE7', // Arcane Array self-targeted cast to summon moving blue squares (#1) + '8891': '8BE8', // Bright Pulse cast and damage for initial blue square + '8892': '8BE9', // Bright Pulse damage from moving blue square + '8893': '8BEA', // Inferno Divide orange square cross explosion damage during Spatial Tactics + '8894': '8BEB', // Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #1, #3) + '8895': '8BEC', // Analysis self-targeted cast before giving players + '8898': '8BEF', // Planar Tactics self-targeted cast before Arcane Mines + '8899': '8BF0', // Arcane Mine self-targeted cast to create 8 Arcane Mine squares + '889A': '8BF1', // Arcane Mine cast and damage for initial Arcane Mine squares + '889B': '8BF2', // Arcane Combustion damage from walking over an Arcane Mine + '889C': '8BF3', // Massive Explosion damage from failing to resolve Subractive Suppressor Alpha + '889D': '8BF4', // Massive Explosion damage from failing to resolve Subractive Suppressor Beta + '889E': '8BF5', // Symmetric Surge damage from two person stack that gives magic vuln up + '889F': '8BF6', // Arcane Array self-targeted cast to summon moving blue squares (#2) + '88A0': '8BF7', // Spatial Tactics self-targeted cast prior to Arcane Array 2 + '88A1': '8BF8', // Symmetric Surge self-targeted cast before this mechanic + '88A2': '8BF9', // Arcane Plot self-targeted cast to summon blue squares for Symmetric Surge + '88A3': '8BFA', // Constructive Figure self-targeted cast that summons Aloalo Golem on edge + '88A4': '8BFB', // Aero II cast and line damage from Aloalo Golem during Symmetric Surge + '88A5': '8BFC', // Arcane Point self-targeted cast that gives players 88A6 Powerful Light spreads + '88A6': '8BFD', // Powerful Light spread damage on players that turn the squares they are on blue + '88A7': '8BFE', // Explosive Theorem self-targeted cast for very large spreads + '88A8': '8BFF', // Explosive Theorem cast and damage on players for spreads with Telluric Theorem puddles + '88A9': '8C00', // Telluric Theorem cast and damage for large puddles from Explosive Theorem + '88AD': '8C04', // Strategic Strike cast and damage for non-cleaving 3x tankbuster + '88AE': '8C05', // Inferno Theorem cast and raidwide damage '8925': 'TODO', // Locked and Loaded ability during 894A Trick Reload when a bullet is in the gun '8926': 'TODO', // Misload ability during 894A Trick Reload when a bullet missed the gun oops '8927': 'TODO', // --sync-- repositioning from Statice @@ -671,7 +671,7 @@ const zoneReplace: ZoneReplace[] = [ '8AC0': '8AC0', // Angry Seas self-targeted cast for 8AC1 red line knockback '8AC1': '8AE1', // Angry Seas cast and knockback damage from red line '8AC2': '8AE2', // Burst tower damage - '8AC3': 'TODO', // Big Burst tower failure damage + '8AC3': '8AE3', // Big Burst tower failure damage '8AC4': '8AC4', // Roar self-targeted cast that summons Zaratan adds '8AC5': '8AC5', // Bubble Net self-targeted cast before Bubbles along with 8AC6 during Spring Crystals 2 '8AC6': '8AE4', // Bubble Net cast and ability on players that adds Bubbles/Fetters debuffs during Spring Crystals 2 @@ -696,8 +696,8 @@ const zoneReplace: ZoneReplace[] = [ '8BBE': '8BCD', // Electric Whorl casted damage from Ray "get in" '8BBF': '8BCE', // Expulsion casted damage from Ray "get out" '8BC0': '8BCF', // --sync-- damage from Twister tornados - '8BC1': 'TODO', // Ovation cast and damage from Wood Golem front line aoe - '8BC5': 'TODO', // Gravity Force cast and stack damage from Islekeeper + '8BC1': '8BD4', // Ovation cast and damage from Wood Golem front line aoe + '8BC5': '8C3A', // Gravity Force cast and stack damage from Islekeeper '8C23': 'TODO', // Aero IV cast and enrage damage '8C24': 'TODO', // Aero IV post-enrage follow-up damage just in case '8C25': 'TODO', // Inferno Theorem cast and enrage damage @@ -712,16 +712,16 @@ const zoneReplace: ZoneReplace[] = [ '8C65': '8BD1', // Hydroshot casted damage from Monk knockback line with a dot '8C6D': 'TODO', // Hydrobullet ability on players to give "spread second" before Blowing Bubbles '8C6E': '8BC7', // Lead Hook casted damage from Kiwakin 3x tankbuster - '8C6F': 'TODO', // Isle Drop cast and damage for Islekeeper front circle + '8C6F': '8C3C', // Isle Drop cast and damage for Islekeeper front circle '8CBC': 'TODO', // Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire '8CBD': 'TODO', // Dartboard of Dancing Explosives self-targeted cast for colored dartboard '8CBE': 'TODO', // Burning Chains damage from not breaking chains '8CC2': 'TODO', // Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye - '8CDE': 'TODO', // Targeted Light self-targeted cast for weak spot boss tether - '8CDF': 'TODO', // Targeted Light cast and damage on players for 8CDE + '8CDE': '8CE0', // Targeted Light self-targeted cast for weak spot boss tether + '8CDF': '8CE1', // Targeted Light cast and damage on players for 8CDE '8D1A': 'TODO', // Trapshooting self-targeted cast after Trick Reload (some instances are 8959) - '8D1F': 'TODO', // Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) - '8D2E': 'TODO', // Angular Addition self-targeted ability to give boss V + '8D1F': '8D20', // Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) + '8D2E': '8D2F', // ??? Angular Addition self-targeted ability to give boss V }, }, ]; From 39a526583bb5b8dcd22578478ef4df6afc4c4e19 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 5 Dec 2023 12:56:47 -0800 Subject: [PATCH 24/39] guesses at statice savage ids --- .../dungeon/another_aloalo_island-savage.ts | 26 +-- .../dungeon/another_aloalo_island-savage.ts | 22 +- .../dungeon/another_aloalo_island-savage.txt | 188 +++++++++--------- util/sync_files.ts | 64 +++--- 4 files changed, 150 insertions(+), 150 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts index 6ca2f7af44..d52b514380 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -17,7 +17,7 @@ import { playerDamageFields } from '../../../oopsy_common'; // TODO: walking over 8BF2 Arcane Combustion when you don't have Suppressor // TODO: taking extra 8BEA Inferno Divide squares during Spatial Tactics // TODO: 01F7(success) and 01F8(fail) check and x markers? -// TODO: players not in Trapshooting stack TODO +// TODO: players not in Trapshooting stack 8977 // TODO: players not in Present Box / Pinwheeling Dartboard two person stack const renameMistake = ( @@ -127,20 +127,20 @@ const triggerSet: OopsyTriggerSet = { 'AAIS Telluric Theorem': '8C00', // puddles from Explosive Theorem spreads // Statice - 'AAIS Trigger Happy': 'TODO', // limit cut dart board - 'AAIS Bomb Burst': 'TODO', // bomb explosion + 'AAIS Trigger Happy': '8969', // limit cut dart board + 'AAIS Bomb Burst': '897A', // bomb explosion 'AAIS Uncommon Ground': 'TODO', // people who are on the same dartboard color with Bull's-eye - 'AAIS Faerie Ring': 'TODO', // donut rings during Present Box + 'AAIS Faerie Ring': '8973', // donut rings during Present Box 'AAIS Fire Spread 1': 'TODO', // initial rotating fire (from Ball of Fire) - 'AAIS Fire Spread 2': 'TODO', // ongoing rotating fire damage (from Statice) + 'AAIS Fire Spread 2': '89FB', // ongoing rotating fire damage (from Statice) }, damageFail: { 'AAIS Big Burst': '8AE3', // tower failure damage 'AAIS Massive Explosion 1': '8BF3', // failing to resolve Subractive Suppressor Alpha 'AAIS Massive Explosion 2': '8BF4', // failing to resolve Subractive Suppressor Beta - 'AAIS Burning Chains': 'TODO', // damage from not breaking chains - 'AAIS Surprising Missile Burst': 'TODO', // running into Surprising Missile tethered add - 'AAIS Surprising Claw Death by Claw': 'TODO', // running into Surprising Claw tethered add + 'AAIS Burning Chains': '8CC1', // damage from not breaking chains + 'AAIS Surprising Missile Burst': '8974', // running into Surprising Missile tethered add + 'AAIS Surprising Claw Death by Claw': '8975', // running into Surprising Claw tethered add }, gainsEffectFail: { // C03 = 9999 duration, ??? = 15s duration @@ -155,18 +155,18 @@ const triggerSet: OopsyTriggerSet = { 'AAIS Wood Golem Tornado': '8BD3', // headmarker -> bind and heavy aoe 'AAIS Powerful Light': '8BFD', // spread marker during Symmetric Surge that turns squares blue 'AAIS Explosive Theorem': '8BFF', // large spreads with Telluric Theorem puddles - 'AAIS Trapshooting Spread': 'TODO', // spread damage from Trick Reload - 'AAIS Firewords Spread': 'TODO', // spread damage during Present Box / Pinwheeling Dartboard + 'AAIS Trapshooting Spread': '8978', // spread damage from Trick Reload + 'AAIS Firewords Spread': '897D', // spread damage during Present Box / Pinwheeling Dartboard }, soloWarn: { 'AAIS Snipper Water III': '8BCC', // Snipper stack marker 'AAIS Islekeeper Gravity Force': '8C3A', // stack - 'AAIS Trapshooting Stack': 'TODO', // stack damage from Trick Reload + 'AAIS Trapshooting Stack': '8977', // stack damage from Trick Reload }, soloFail: { 'AAIS Hydrofall': '8ADE', // partner stack debuffs 'AAIS Symmetric Surge': '8BF5', // two person stack that gives magic vuln up - 'AAIS Fireworks Stack': 'TODO', // two person stack damage during Present Box / Pinwheeling Dartboard + 'AAIS Fireworks Stack': '897C', // two person stack damage during Present Box / Pinwheeling Dartboard }, triggers: [ renameMistake('AAIS Tornado', '8BCF', 'fail', { @@ -174,7 +174,7 @@ const triggerSet: OopsyTriggerSet = { en: 'Tornado', }), pushedIntoWall('AAIS Angry Seas', '8AE1'), - pushedIntoWall('AAIS Pop', 'TODO'), + pushedIntoWall('AAIS Pop', '896B'), nonzeroDamageMistake('AAIS Hundred Lashings', ['8AE5', '8AE6'], 'warn'), ], }; diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 6d7899f8c2..718be8a1d0 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -880,15 +880,15 @@ const triggerSet: TriggerSet = { { id: 'AAIS Statice Aero IV', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Statice', capture: false }, + netRegex: { id: '8966', source: 'Statice', capture: false }, response: Responses.aoe(), }, { id: 'AAIS Statice Trick Reload', type: 'Ability', - // TODO = Locked and Loaded - // TODO = Misload - netRegex: { id: ['TODO', 'TODO'], source: 'Statice' }, + // 8925 = Locked and Loaded + // 8926 = Misload + netRegex: { id: ['8925', '8926'], source: 'Statice' }, preRun: (data, matches) => data.staticeBullet.push(matches), alertText: (data, _matches, output) => { // Statice loads 8 bullets, two are duds. @@ -897,7 +897,7 @@ const triggerSet: TriggerSet = { const [bullet] = data.staticeBullet; if (data.staticeBullet.length !== 1 || bullet === undefined) return; - const isStack = bullet.id === 'TODO'; + const isStack = bullet.id === '8926'; data.staticeTrapshooting = isStack ? ['stack', 'spread'] : ['spread', 'stack']; return isStack ? output.stackThenSpread!() : output.spreadThenStack!(); }, @@ -905,7 +905,7 @@ const triggerSet: TriggerSet = { const lastBullet = data.staticeBullet[data.staticeBullet.length - 1]; if (data.staticeBullet.length < 2 || data.staticeBullet.length > 7) return; - if (lastBullet?.id !== 'TODO') + if (lastBullet?.id !== '8926') return; data.staticeTriggerHappy = data.staticeBullet.length - 1; return output.numSafeLater!({ num: output[`num${data.staticeTriggerHappy}`]!() }); @@ -931,7 +931,7 @@ const triggerSet: TriggerSet = { { id: 'AAIS Statice Trapshooting', type: 'StartsUsing', - netRegex: { id: ['TODO', 'TODO'], source: 'Statice', capture: false }, + netRegex: { id: ['8D1C', '8976'], source: 'Statice', capture: false }, alertText: (data, _matches, output) => { const mech = data.staticeTrapshooting.shift(); if (mech === undefined) @@ -946,7 +946,7 @@ const triggerSet: TriggerSet = { { id: 'AAIS Statice Trigger Happy', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Statice', capture: false }, + netRegex: { id: '8968', source: 'Statice', capture: false }, alertText: (data, _matches, output) => { const num = data.staticeTriggerHappy; if (num === undefined) @@ -1014,7 +1014,7 @@ const triggerSet: TriggerSet = { id: 'AAIS Statice Pop', type: 'StartsUsing', // TODO: this might need a slight delay - netRegex: { id: 'TODO', source: 'Statice', capture: false }, + netRegex: { id: '896B', source: 'Statice', capture: false }, suppressSeconds: 20, response: Responses.knockback(), }, @@ -1104,13 +1104,13 @@ const triggerSet: TriggerSet = { { id: 'AAIS Statice Shocking Abandon', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Statice' }, + netRegex: { id: '8965', source: 'Statice' }, response: Responses.tankBuster(), }, { id: 'AAIS Statice Pinwheeling Dartboard', type: 'StartsUsing', - netRegex: { id: 'TODO', source: 'Statice', capture: false }, + netRegex: { id: '8BCF', source: 'Statice', capture: false }, run: (data) => data.staticeIsPinwheelingDartboard = true, }, ], diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index 60fd6eedc8..ac0e9461b7 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -269,114 +269,114 @@ hideall "--sync--" # STATICE WITH A GUN # #~~~~~~~~~~~~~~~~~~~~# -# -p TODO:3013.8 -# -ii TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO +# -p 8966:3013.8 +# -ii TODO 8925 8926 8977 8978 8969 8988 8A6A 897C 897D TODO TODO 8CC1 89FB TODO 8974 8975 3000.0 "--sync--" sync / 00:0839::The Midnight Trial will be sealed off/ window 10000,0 -3008.8 "--sync--" sync / 14:[^:]*:Statice:TODO:/ window 20,20 -3013.8 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ - -3018.0 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ -3023.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:TODO:/ -3038.2 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:TODO:/ -3048.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:TODO:/ -3056.5 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ -3070.6 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:TODO:/ -3074.6 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ - -3081.8 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ -3087.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:TODO:/ -3101.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ -3106.3 "Dartboard of Dancing Explosives " sync / 1[56]:[^:]*:Statice:TODO:/ -3120.1 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:TODO:/ -3122.0 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ -3125.3 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:TODO:/ - -3132.3 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ -3137.7 "Surprise Balloon" sync / 1[56]:[^:]*:Statice:TODO:/ -3144.8 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:TODO:/ -3149.8 "Surprise Needle 1" #sync / 1[56]:[^:]*:Needle:TODO:/ -3150.7 "Pop 1" sync / 1[56]:[^:]*:Statice:TODO:/ -3151.5 "Surprise Needle 2" #sync / 1[56]:[^:]*:Needle:TODO:/ -3152.4 "Trigger Happy" sync / 1[56]:[^:]*:Statice:TODO:/ -3153.2 "Surprise Needle 3" #sync / 1[56]:[^:]*:Needle:TODO:/ -3154.9 "Surprise Needle 4" #sync / 1[56]:[^:]*:Needle:TODO:/ -3155.6 "Pop 2" sync / 1[56]:[^:]*:Statice:TODO:/ -3160.4 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:TODO:/ - -3172.5 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ -3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ -3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ -3189.2 "Present Box 1" sync / 1[56]:[^:]*:Statice:TODO:/ -3194.3 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:TODO:/ -3204.0 "Fireworks" sync / 1[56]:[^:]*:Statice:TODO:/ -3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ -3204.3 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:TODO:/ -3212.5 "Shocking Abandon" sync / 1[56]:[^:]*:Statice:TODO:/ - -3222.7 "Pinwheeling Dartboard" sync / 1[56]:[^:]*:Statice:TODO:/ -3231.4 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:TODO:/ +3008.8 "--sync--" sync / 14:[^:]*:Statice:8966:/ window 20,20 +3013.8 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ + +3018.0 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3023.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:8967:/ +3038.2 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8D1C:/ +3048.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:8968:/ +3056.5 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:8979:/ +3070.6 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8976:/ +3074.6 "Burst" sync / 1[56]:[^:]*:Bomb:897A:/ + +3081.8 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3087.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:8967:/ +3101.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:8979:/ +3106.3 "Dartboard of Dancing Explosives " sync / 1[56]:[^:]*:Statice:8CC0:/ +3120.1 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8976:/ +3122.0 "Burst" sync / 1[56]:[^:]*:Bomb:897A:/ +3125.3 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:8971:/ + +3132.3 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3137.7 "Surprise Balloon" sync / 1[56]:[^:]*:Statice:8927:/ +3144.8 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:8980:/ +3149.8 "Surprise Needle 1" #sync / 1[56]:[^:]*:Needle:896C:/ +3150.7 "Pop 1" sync / 1[56]:[^:]*:Statice:896B:/ +3151.5 "Surprise Needle 2" #sync / 1[56]:[^:]*:Needle:896C:/ +3152.4 "Trigger Happy" sync / 1[56]:[^:]*:Statice:8968:/ +3153.2 "Surprise Needle 3" #sync / 1[56]:[^:]*:Needle:896C:/ +3154.9 "Surprise Needle 4" #sync / 1[56]:[^:]*:Needle:896C:/ +3155.6 "Pop 2" sync / 1[56]:[^:]*:Statice:896B:/ +3160.4 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8976:/ + +3172.5 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ +3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:8979:/ +3189.2 "Present Box 1" sync / 1[56]:[^:]*:Statice:8972:/ +3194.3 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:897B:/ +3204.0 "Fireworks" sync / 1[56]:[^:]*:Statice:897C:/ +3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:897A:/ +3204.3 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:8973:/ +3212.5 "Shocking Abandon" sync / 1[56]:[^:]*:Statice:8965:/ + +3222.7 "Pinwheeling Dartboard" sync / 1[56]:[^:]*:Statice:8BCF:/ +3231.4 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:897B:/ 3233.4 "Fire Spread" sync / 1[56]:[^:]*:Statice:8952:/ duration 11 -3241.3 "Fireworks" sync / 1[56]:[^:]*:Statice:TODO:/ -3241.6 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:TODO:/ -3253.6 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ - -3260.8 "--middle--" sync / 1[56]:[^:]*:Statice:TODO:/ -3266.5 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:TODO:/ -3273.6 "Trick Reload" sync / 1[56]:[^:]*:Statice:TODO:/ -3288.4 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:TODO:/ -3295.5 "Present Box 2" sync / 1[56]:[^:]*:Statice:TODO:/ -3302.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:TODO:/ -3309.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:TODO:/ -3310.2 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:TODO:/ -3316.5 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:TODO:/ -3320.4 "Burst" sync / 1[56]:[^:]*:Bomb:TODO:/ - -3327.6 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ -3335.7 "Aero IV" sync / 1[56]:[^:]*:Statice:TODO:/ +3241.3 "Fireworks" sync / 1[56]:[^:]*:Statice:897C:/ +3241.6 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:8971:/ +3253.6 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ + +3260.8 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ +3266.5 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:8980:/ +3273.6 "Trick Reload" sync / 1[56]:[^:]*:Statice:8967:/ +3288.4 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8D1C:/ +3295.5 "Present Box 2" sync / 1[56]:[^:]*:Statice:8972:/ +3302.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:8979:/ +3309.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:8968:/ +3310.2 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:8973:/ +3316.5 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8976:/ +3320.4 "Burst" sync / 1[56]:[^:]*:Bomb:897A:/ + +3327.6 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ +3335.7 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ 3338.8 "--sync--" sync / 14:[^:]*:Statice:TODO:/ 3348.8 "Aero IV Enrage" sync / 1[56]:[^:]*:Statice:TODO:/ # ALL ENCOUNTER ABILITIES -# TODO Locked and Loaded ability during TODO Trick Reload when a bullet is in the gun -# TODO Misload ability during TODO Trick Reload when a bullet missed the gun oops -# TODO --sync-- repositioning from Statice +# 8925 Locked and Loaded ability during 8967 Trick Reload when a bullet is in the gun +# 8926 Misload ability during 8967 Trick Reload when a bullet missed the gun oops +# 8927 --sync-- repositioning from Statice # TODO --sync-- auto damage from Statice -# TODO Shocking Abandon cast and tankbuster damage -# TODO Aero IV cast and raidwide damage -# TODO Trick Reload self-targeted cast to load gun with TODO/TODO -# TODO Trigger Happy self-targeted cast for limit cut dart board -# TODO Trigger Happy cast and damage for limit cut dart board (filled pie slice) -# TODO Surprise Balloon self-targeted cast -# TODO Pop knockback from Surprise Balloon being popped -# TODO Surprise Needle short cast and ability blue line aoe from needle adds that pop balloons -# TODO Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye -# TODO Present Box self-targeted cast for bombs/donuts/missiles/hands -# TODO Faerie Ring cast and damage for donut rings during Present Box -# TODO Burst high damage from running into Surprising Missile tethered add -# TODO Death by Claw high damage from running into Surprising Claw tethered add -# TODO Trapshooting self-targeted cast after Trick Reload (some instances are TODO) -# TODO Trapshooting stack damage from Trick Reload -# TODO Trapshooting spread damage from Trick Reload -# TODO Ring a Ring o' Explosions self-targeted cast for rotating bombs -# TODO Burst cast and damage from bomb explosion -# TODO Fireworks self-targeted cast -# TODO Fireworks two person stack damage during Present Box / Pinwheeling Dartboard -# TODO Fireworks spread damage during Present Box / Pinwheeling Dartboard -# TODO Beguiling Glitter self-targeted cast to give players Face debuffs +# 8965 Shocking Abandon cast and tankbuster damage +# 8966 Aero IV cast and raidwide damage +# 8967 Trick Reload self-targeted cast to load gun with 8925/8926 +# 8968 Trigger Happy self-targeted cast for limit cut dart board +# 8969 Trigger Happy cast and damage for limit cut dart board (filled pie slice) +# 8927 Surprise Balloon self-targeted cast +# 896B Pop knockback from Surprise Balloon being popped +# 896C Surprise Needle short cast and ability blue line aoe from needle adds that pop balloons +# 8971 Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye +# 8972 Present Box self-targeted cast for bombs/donuts/missiles/hands +# 8973 Faerie Ring cast and damage for donut rings during Present Box +# 8974 Burst high damage from running into Surprising Missile tethered add +# 8975 Death by Claw high damage from running into Surprising Claw tethered add +# 8976 Trapshooting self-targeted cast after Trick Reload (some instances are 8D1C) +# 8977 Trapshooting stack damage from Trick Reload +# 8978 Trapshooting spread damage from Trick Reload +# 8979 Ring a Ring o' Explosions self-targeted cast for rotating bombs +# 897A Burst cast and damage from bomb explosion +# 897B Fireworks self-targeted cast +# 897C Fireworks two person stack damage during Present Box / Pinwheeling Dartboard +# 897D Fireworks spread damage during Present Box / Pinwheeling Dartboard +# 8980 Beguiling Glitter self-targeted cast to give players Face debuffs # TODO Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) -# TODO Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) -# TODO Fire Spread ongoing rotating fire damage (from Statice) -# TODO --sync-- ability on Bomb when rotating +# 8988 Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) +# 89FB Fire Spread ongoing rotating fire damage (from Statice) +# 8A6A --sync-- ability on Bomb when rotating # TODO Aero IV cast and enrage damage # TODO Aero IV post-enrage follow-up damage just in case -# TODO Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire -# TODO Dartboard of Dancing Explosives self-targeted cast for colored dartboard -# TODO Burning Chains damage from not breaking chains +# 8BCF Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire +# 8CC0 Dartboard of Dancing Explosives self-targeted cast for colored dartboard +# 8CC1 Burning Chains damage from not breaking chains # TODO Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye -# TODO Trapshooting self-targeted cast after Trick Reload (some instances are TODO) +# 8D1C Trapshooting self-targeted cast after Trick Reload (some instances are 8976) #~~~~~~~~~# diff --git a/util/sync_files.ts b/util/sync_files.ts index 65631c28cd..84ccacec20 100644 --- a/util/sync_files.ts +++ b/util/sync_files.ts @@ -610,36 +610,36 @@ const zoneReplace: ZoneReplace[] = [ '88A9': '8C00', // Telluric Theorem cast and damage for large puddles from Explosive Theorem '88AD': '8C04', // Strategic Strike cast and damage for non-cleaving 3x tankbuster '88AE': '8C05', // Inferno Theorem cast and raidwide damage - '8925': 'TODO', // Locked and Loaded ability during 894A Trick Reload when a bullet is in the gun - '8926': 'TODO', // Misload ability during 894A Trick Reload when a bullet missed the gun oops - '8927': 'TODO', // --sync-- repositioning from Statice + '8925': '8925', // Locked and Loaded ability during 894A Trick Reload when a bullet is in the gun + '8926': '8926', // Misload ability during 894A Trick Reload when a bullet missed the gun oops + '8927': '8927', // --sync-- repositioning from Statice '8947': 'TODO', // --sync-- auto damage from Statice - '8948': 'TODO', // Shocking Abandon cast and tankbuster damage - '8949': 'TODO', // Aero IV cast and raidwide damage - '894A': 'TODO', // Trick Reload self-targeted cast to load gun with 8925/8926 - '894B': 'TODO', // Trigger Happy self-targeted cast for limit cut dart board - '894C': 'TODO', // Trigger Happy cast and damage for limit cut dart board (filled pie slice) - '894D': 'TODO', // Surprise Balloon self-targeted cast - '894E': 'TODO', // Pop knockback from Surprise Balloon being popped - '894F': 'TODO', // Surprise Needle short cast and ability blue line aoe from needle adds that pop balloons - '8954': 'TODO', // Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye - '8955': 'TODO', // Present Box self-targeted cast for bombs/donuts/missiles/hands - '8956': 'TODO', // Faerie Ring cast and damage for donut rings during Present Box - '8957': 'TODO', // Burst high damage from running into Surprising Missile tethered add - '8958': 'TODO', // Death by Claw high damage from running into Surprising Claw tethered add - '8959': 'TODO', // Trapshooting self-targeted cast after Trick Reload (some instances are 8D1A) - '895A': 'TODO', // Trapshooting stack damage from Trick Reload - '895B': 'TODO', // Trapshooting spread damage from Trick Reload - '895C': 'TODO', // Ring a Ring o' Explosions self-targeted cast for rotating bombs - '895D': 'TODO', // Burst cast and damage from bomb explosion - '895E': 'TODO', // Fireworks self-targeted cast - '895F': 'TODO', // Fireworks two person stack damage during Present Box / Pinwheeling Dartboard - '8960': 'TODO', // Fireworks spread damage during Present Box / Pinwheeling Dartboard - '8963': 'TODO', // Beguiling Glitter self-targeted cast to give players Face debuffs + '8948': '8965', // Shocking Abandon cast and tankbuster damage + '8949': '8966', // Aero IV cast and raidwide damage + '894A': '8967', // Trick Reload self-targeted cast to load gun with 8925/8926 + '894B': '8968', // Trigger Happy self-targeted cast for limit cut dart board + '894C': '8969', // Trigger Happy cast and damage for limit cut dart board (filled pie slice) + '894D': '8927', // Surprise Balloon self-targeted cast + '894E': '896B', // ??? Pop knockback from Surprise Balloon being popped + '894F': '896C', // ??? Surprise Needle short cast and ability blue line aoe from needle adds that pop balloons + '8954': '8971', // Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye + '8955': '8972', // Present Box self-targeted cast for bombs/donuts/missiles/hands + '8956': '8973', // Faerie Ring cast and damage for donut rings during Present Box + '8957': '8974', // Burst high damage from running into Surprising Missile tethered add + '8958': '8975', // Death by Claw high damage from running into Surprising Claw tethered add + '8959': '8976', // Trapshooting self-targeted cast after Trick Reload (some instances are 8D1A) + '895A': '8977', // Trapshooting stack damage from Trick Reload + '895B': '8978', // Trapshooting spread damage from Trick Reload + '895C': '8979', // Ring a Ring o' Explosions self-targeted cast for rotating bombs + '895D': '897A', // Burst cast and damage from bomb explosion + '895E': '897B', // Fireworks self-targeted cast + '895F': '897C', // Fireworks two person stack damage during Present Box / Pinwheeling Dartboard + '8960': '897D', // Fireworks spread damage during Present Box / Pinwheeling Dartboard + '8963': '8980', // Beguiling Glitter self-targeted cast to give players Face debuffs '8982': 'TODO', // Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) - '8987': 'TODO', // Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) - '89F9': 'TODO', // Fire Spread ongoing rotating fire damage (from Statice) - '8A6A': 'TODO', // --sync-- ability on Bomb when rotating + '8987': '8988', // Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) + '89F9': '89FB', // Fire Spread ongoing rotating fire damage (from Statice) + '8A6A': '8A6A', // --sync-- ability on Bomb when rotating '8A77': '8A77', // --sync-- Ketuduke repositioning '8A82': '8A82', // Riptide ability on players from Angry Seas Airy Bubble when you step in one '8A83': '8A83', // Fetters ability on players from Angry Seas Airy Bubble when you step in one after 8A82 Riptide @@ -713,13 +713,13 @@ const zoneReplace: ZoneReplace[] = [ '8C6D': 'TODO', // Hydrobullet ability on players to give "spread second" before Blowing Bubbles '8C6E': '8BC7', // Lead Hook casted damage from Kiwakin 3x tankbuster '8C6F': '8C3C', // Isle Drop cast and damage for Islekeeper front circle - '8CBC': 'TODO', // Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire - '8CBD': 'TODO', // Dartboard of Dancing Explosives self-targeted cast for colored dartboard - '8CBE': 'TODO', // Burning Chains damage from not breaking chains + '8CBC': '8BCF', // Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire + '8CBD': '8CC0', // Dartboard of Dancing Explosives self-targeted cast for colored dartboard + '8CBE': '8CC1', // ??? Burning Chains damage from not breaking chains '8CC2': 'TODO', // Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye '8CDE': '8CE0', // Targeted Light self-targeted cast for weak spot boss tether '8CDF': '8CE1', // Targeted Light cast and damage on players for 8CDE - '8D1A': 'TODO', // Trapshooting self-targeted cast after Trick Reload (some instances are 8959) + '8D1A': '8D1C', // Trapshooting self-targeted cast after Trick Reload (some instances are 8959) '8D1F': '8D20', // Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) '8D2E': '8D2F', // ??? Angular Addition self-targeted ability to give boss V }, From aaf27c01f197d382202f6c79ef1a7df0e5f1168d Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 6 Dec 2023 11:31:42 -0800 Subject: [PATCH 25/39] statice trigger cleanup --- .../06-ew/dungeon/another_aloalo_island.ts | 175 ++++++++++++++++-- 1 file changed, 160 insertions(+), 15 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 0063b8e315..8f109bb1c2 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -12,13 +12,6 @@ import { TriggerSet } from '../../../../../types/trigger'; // TODO: figure out directions for Lala for Radiance orbs // TODO: map effects for Lala -/* -map effects -// initial edges after raidwide -[21:58:06.929] 257 101:8003908D:00020001:26:00:0000 - -*/ - export interface Data extends RaidbossData { readonly triggerSetConfig: { stackOrder: 'meleeRolesPartners' | 'rolesPartners'; @@ -43,6 +36,8 @@ export interface Data extends RaidbossData { staticeMissileTether: NetMatches['Tether'][]; staticeClawTether: NetMatches['Tether'][]; staticeIsPinwheelingDartboard?: boolean; + staticeHomingColor?: 'blue' | 'yellow' | 'red'; + staticeDartboardTether: NetMatches['HeadMarker'][]; } // Horizontal crystals have a heading of 0, vertical crystals are -pi/2. @@ -51,6 +46,11 @@ const isHorizontalCrystal = (line: NetMatches['AddedCombatant']) => { return Math.abs(parseFloat(line.heading)) < epsilon; }; +const headmarkerIds = { + tethers: '0061', + enumeration: '015B', +} as const; + const triggerSet: TriggerSet = { id: 'AnotherAloaloIsland', zoneId: ZoneId.AnotherAloaloIsland, @@ -68,6 +68,7 @@ const triggerSet: TriggerSet = { staticeDart: [], staticeMissileTether: [], staticeClawTether: [], + staticeDartboardTether: [], }; }, timelineTriggers: [ @@ -963,6 +964,7 @@ const triggerSet: TriggerSet = { type: 'GainsEffect', netRegex: { effectId: 'E9E' }, delaySeconds: (data, matches) => { + // Note: this collects for the pinwheeling dartboard version too. data.staticeDart.push(matches); return data.staticeDart.length === 3 ? 0 : 0.5; }, @@ -980,6 +982,9 @@ const triggerSet: TriggerSet = { }, }; + if (data.staticeIsPinwheelingDartboard) + return; + if (data.staticeDart.length === 0) return; @@ -988,10 +993,6 @@ const triggerSet: TriggerSet = { if (!dartTargets.includes(data.me)) return { alertText: output.noDartOnYou!() }; - // TODO: better callout / separate trigger for this mechanic - if (data.staticeIsPinwheelingDartboard) - return { alertText: output.dartOnYou!() }; - const partyNames = data.party.partyNames; const flexers = partyNames.filter((x) => !dartTargets.includes(x)); @@ -1011,7 +1012,27 @@ const triggerSet: TriggerSet = { // TODO: this might need a slight delay netRegex: { id: '894E', source: 'Statice', capture: false }, suppressSeconds: 20, - response: Responses.knockback(), + alertText: (data, _matches, output) => { + const num = data.staticeTriggerHappy; + if (num === undefined) + return output.knockback!(); + + const numStr = output[`num${num}`]!(); + return output.knockbackToNum!({ num: numStr }); + }, + run: (data) => delete data.staticeTriggerHappy, + outputStrings: { + knockbackToNum: { + en: 'Knockback => ${num}', + }, + knockback: Outputs.knockback, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, + }, }, { id: 'AAI Statice Face', @@ -1025,8 +1046,17 @@ const triggerSet: TriggerSet = { delaySeconds: (_data, matches) => parseFloat(matches.duration) - 7, durationSeconds: 5, alertText: (data, matches, output) => { - const mechName = data.staticeTrapshooting.shift(); - const mech = mechName === undefined ? output.unknown!() : output[mechName]!(); + let mech = output.unknown!(); + + const num = data.staticeTriggerHappy; + if (num !== undefined) { + mech = output[`num${num}`]!(); + delete data.staticeTriggerHappy; + } else { + const mechName = data.staticeTrapshooting.shift(); + mech = mechName === undefined ? output.unknown!() : output[mechName]!(); + } + return { 'DD2': output.forward!({ mech: mech }), 'DD3': output.backward!({ mech: mech }), @@ -1049,6 +1079,12 @@ const triggerSet: TriggerSet = { }, spread: Outputs.spread, stack: Outputs.stackMarker, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, unknown: Outputs.unknown, }, }, @@ -1096,6 +1132,15 @@ const triggerSet: TriggerSet = { }, }, }, + { + id: 'AAI Statice Burning Chains', + type: 'GainsEffect', + netRegex: { effectId: '301' }, + condition: Conditions.targetIsYou(), + // TODO: add a strategy for dart colors and say where to go here + // for the Pinwheeling Dartboard if you have a dart. + response: Responses.breakChains(), + }, { id: 'AAI Statice Shocking Abandon', type: 'StartsUsing', @@ -1103,11 +1148,111 @@ const triggerSet: TriggerSet = { response: Responses.tankBuster(), }, { - id: 'AAI Statice Pinwheeling Dartboard', + id: 'AAI Statice Pinwheeling Dartboard Tracker', type: 'StartsUsing', netRegex: { id: '8CBC', source: 'Statice', capture: false }, run: (data) => data.staticeIsPinwheelingDartboard = true, }, + { + id: 'AAI Statice Pinwheeling Dartboard Color', + type: 'AddedCombatant', + netRegex: { npcNameId: '12507' }, + response: (data, matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + dartOnYou: { + en: 'Dart (w/${player})', + }, + noDartOnYou: { + en: 'No Dart', + }, + blue: { + en: 'Avoid Blue', + }, + red: { + en: 'Avoid Red', + }, + yellow: { + en: 'Avoid Yellow', + }, + }; + + let infoText: string | undefined; + + const centerX = -200; + const centerY = 0; + const x = parseFloat(matches.x) - centerX; + const y = parseFloat(matches.y) - centerY; + + // 12 pie slices, the edge of the first one is directly north. + // It goes in B R Y order repeating 4 times. + // The 0.5 subtraction (12 - 0.5 = 11.5) is because the Homing Pattern + // lands directly in the middle of a slice. + const dir12 = Math.round(6 - 6 * Math.atan2(x, y) / Math.PI + 11.5) % 12; + + const colorOffset = dir12 % 3; + const colorMap: { [offset: number]: typeof data.staticeHomingColor } = { + 0: 'blue', + 1: 'red', + 2: 'yellow', + } as const; + + data.staticeHomingColor = colorMap[colorOffset]; + if (data.staticeHomingColor !== undefined) + infoText = output[data.staticeHomingColor]!(); + + if (data.staticeDart.length !== 2) + return { infoText }; + + const dartTargets = data.staticeDart.map((x) => x.target); + if (!dartTargets.includes(data.me)) + return { alertText: output.noDartOnYou!(), infoText: infoText }; + + const [target1, target2] = dartTargets; + if (target1 === undefined || target2 === undefined) + return { infoText }; + const otherTarget = data.party.member(target1 === data.me ? target2 : target1); + return { alertText: output.dartOnYou!({ player: otherTarget }), infoText: infoText }; + }, + }, + { + id: 'AAI Statice Pinwheeling Dartboard Mech', + type: 'HeadMarker', + netRegex: { id: headmarkerIds.tethers }, + condition: (data) => data.staticeIsPinwheelingDartboard, + delaySeconds: (data, matches) => { + data.staticeDartboardTether.push(matches); + return data.staticeDartboardTether.length === 2 ? 0 : 0.5; + }, + alertText: (data, _matches, output) => { + if (data.staticeDartboardTether.length !== 2) + return; + + const tethers = data.staticeDartboardTether.map((x) => x.target); + + if (tethers.includes(data.me)) { + const [tether1, tether2] = tethers; + const other = data.party.member(tether1 === data.me ? tether2 : tether1); + return output.tether!({ player: other }); + } + + const partyNames = data.party.partyNames; + const nonTethers = partyNames.filter((x) => !tethers.includes(x)); + const [stack1, stack2] = nonTethers; + const other = data.party.member(stack1 === data.me ? stack2 : stack1); + return output.stack!({ player: other }); + }, + run: (data) => data.staticeDartboardTether = [], + outputStrings: { + // TODO: maybe this should remind you of dart color + tether: { + en: 'Tether w/${player}', + }, + stack: { + en: 'Stack w/${player}', + }, + }, + }, ], timelineReplace: [ { From ab74e810c0e82f5e5abcc228a1510311a4b4fe79 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 6 Dec 2023 12:36:28 -0800 Subject: [PATCH 26/39] add role stacks warning --- .../dungeon/another_aloalo_island-savage.ts | 214 ++++++++++++++++-- .../06-ew/dungeon/another_aloalo_island.ts | 39 +++- 2 files changed, 236 insertions(+), 17 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 718be8a1d0..0ba98ccd6d 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -12,18 +12,10 @@ import { PluginCombatantState } from '../../../../../types/event'; import { NetMatches } from '../../../../../types/net_matches'; import { TriggerSet } from '../../../../../types/trigger'; -// TODO: use code from AMR to handle cases of "role stacks" when somebody is dead // TODO: sc3 should say which bubble to take to the other side (for everyone) // TODO: figure out directions for Lala for Radiance orbs // TODO: map effects for Lala -/* -map effects -// initial edges after raidwide -[21:58:06.929] 257 101:8003908D:00020001:26:00:0000 - -*/ - export interface Data extends RaidbossData { readonly triggerSetConfig: { stackOrder: 'meleeRolesPartners' | 'rolesPartners'; @@ -34,6 +26,7 @@ export interface Data extends RaidbossData { ketuHydroBuffCount: number; ketuBuff?: 'bubble' | 'fetters'; ketuBuffCollect: NetMatches['GainsEffect'][]; + ketuStackTargets: string[]; lalaBossRotation?: 'clock' | 'counter'; lalaBossTimes?: 3 | 5; lalaBossInitialSafe?: 'north' | 'east' | 'south' | 'west'; @@ -48,6 +41,8 @@ export interface Data extends RaidbossData { staticeMissileTether: NetMatches['Tether'][]; staticeClawTether: NetMatches['Tether'][]; staticeIsPinwheelingDartboard?: boolean; + staticeHomingColor?: 'blue' | 'yellow' | 'red'; + staticeDartboardTether: NetMatches['HeadMarker'][]; } // Horizontal crystals have a heading of 0, vertical crystals are -pi/2. @@ -56,6 +51,11 @@ const isHorizontalCrystal = (line: NetMatches['AddedCombatant']) => { return Math.abs(parseFloat(line.heading)) < epsilon; }; +const headmarkerIds = { + tethers: '0061', + enumeration: '015B', +} as const; + const triggerSet: TriggerSet = { id: 'AnotherAloaloIslandSavage', zoneId: ZoneId.AnotherAloaloIslandSavage, @@ -67,12 +67,14 @@ const triggerSet: TriggerSet = { ketuCrystalAdd: [], ketuHydroBuffCount: 0, ketuBuffCollect: [], + ketuStackTargets: [], lalaSubAlpha: [], staticeBullet: [], staticeTrapshooting: [], staticeDart: [], staticeMissileTether: [], staticeClawTether: [], + staticeDartboardTether: [], }; }, timelineTriggers: [ @@ -389,6 +391,42 @@ const triggerSet: TriggerSet = { }, }, }, + { + id: 'AAIS Ketuduke Hydrofall Role Stack Warning', + type: 'GainsEffect', + netRegex: { effectId: 'EA3' }, + delaySeconds: (data, matches) => { + data.ketuStackTargets.push(matches.target); + return data.ketuStackTargets.length === 2 ? 0 : 0.5; + }, + alarmText: (data, _matches, output) => { + const [stack1, stack2] = data.ketuStackTargets; + if (data.ketuStackTargets.length !== 2 || stack1 === undefined || stack2 === undefined) + return; + + // Sorry, non-standard light party comps. + const supports = [...data.party.healerNames, ...data.party.tankNames]; + const dps = data.party.dpsNames; + if (supports.length !== 2 && dps.length !== 2) + return; + + const isStack1DPS = data.party.isDPS(stack1); + const isStack2DPS = data.party.isDPS(stack2); + + // If both stacks are on dps or neither stack is on a dps, then you have + // standard "partner" stacks of one support and one dps. If one is on a dps + // and one is on a support (which can happen if somebody dies), then + // you (probably) need to have role stacks. + if (isStack1DPS !== isStack2DPS) + return output.roleStacks!(); + }, + run: (data) => data.ketuStackTargets = [], + outputStrings: { + roleStacks: { + en: 'Role Stacks', + }, + }, + }, { id: 'AAIS Ketuduke Receding Twintides', type: 'StartsUsing', @@ -968,6 +1006,7 @@ const triggerSet: TriggerSet = { type: 'GainsEffect', netRegex: { effectId: 'E9E' }, delaySeconds: (data, matches) => { + // Note: this collects for the pinwheeling dartboard version too. data.staticeDart.push(matches); return data.staticeDart.length === 3 ? 0 : 0.5; }, @@ -985,6 +1024,9 @@ const triggerSet: TriggerSet = { }, }; + if (data.staticeIsPinwheelingDartboard) + return; + if (data.staticeDart.length === 0) return; @@ -993,10 +1035,6 @@ const triggerSet: TriggerSet = { if (!dartTargets.includes(data.me)) return { alertText: output.noDartOnYou!() }; - // TODO: better callout / separate trigger for this mechanic - if (data.staticeIsPinwheelingDartboard) - return { alertText: output.dartOnYou!() }; - const partyNames = data.party.partyNames; const flexers = partyNames.filter((x) => !dartTargets.includes(x)); @@ -1016,7 +1054,27 @@ const triggerSet: TriggerSet = { // TODO: this might need a slight delay netRegex: { id: '896B', source: 'Statice', capture: false }, suppressSeconds: 20, - response: Responses.knockback(), + alertText: (data, _matches, output) => { + const num = data.staticeTriggerHappy; + if (num === undefined) + return output.knockback!(); + + const numStr = output[`num${num}`]!(); + return output.knockbackToNum!({ num: numStr }); + }, + run: (data) => delete data.staticeTriggerHappy, + outputStrings: { + knockbackToNum: { + en: 'Knockback => ${num}', + }, + knockback: Outputs.knockback, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, + }, }, { id: 'AAIS Statice Face', @@ -1030,8 +1088,17 @@ const triggerSet: TriggerSet = { delaySeconds: (_data, matches) => parseFloat(matches.duration) - 7, durationSeconds: 5, alertText: (data, matches, output) => { - const mechName = data.staticeTrapshooting.shift(); - const mech = mechName === undefined ? output.unknown!() : output[mechName]!(); + let mech = output.unknown!(); + + const num = data.staticeTriggerHappy; + if (num !== undefined) { + mech = output[`num${num}`]!(); + delete data.staticeTriggerHappy; + } else { + const mechName = data.staticeTrapshooting.shift(); + mech = mechName === undefined ? output.unknown!() : output[mechName]!(); + } + return { 'DD2': output.forward!({ mech: mech }), 'DD3': output.backward!({ mech: mech }), @@ -1054,6 +1121,12 @@ const triggerSet: TriggerSet = { }, spread: Outputs.spread, stack: Outputs.stackMarker, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, unknown: Outputs.unknown, }, }, @@ -1101,6 +1174,15 @@ const triggerSet: TriggerSet = { }, }, }, + { + id: 'AAIS Statice Burning Chains', + type: 'GainsEffect', + netRegex: { effectId: '301' }, + condition: Conditions.targetIsYou(), + // TODO: add a strategy for dart colors and say where to go here + // for the Pinwheeling Dartboard if you have a dart. + response: Responses.breakChains(), + }, { id: 'AAIS Statice Shocking Abandon', type: 'StartsUsing', @@ -1108,11 +1190,111 @@ const triggerSet: TriggerSet = { response: Responses.tankBuster(), }, { - id: 'AAIS Statice Pinwheeling Dartboard', + id: 'AAIS Statice Pinwheeling Dartboard Tracker', type: 'StartsUsing', netRegex: { id: '8BCF', source: 'Statice', capture: false }, run: (data) => data.staticeIsPinwheelingDartboard = true, }, + { + id: 'AAIS Statice Pinwheeling Dartboard Color', + type: 'AddedCombatant', + netRegex: { npcNameId: '12507' }, + response: (data, matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + dartOnYou: { + en: 'Dart (w/${player})', + }, + noDartOnYou: { + en: 'No Dart', + }, + blue: { + en: 'Avoid Blue', + }, + red: { + en: 'Avoid Red', + }, + yellow: { + en: 'Avoid Yellow', + }, + }; + + let infoText: string | undefined; + + const centerX = -200; + const centerY = 0; + const x = parseFloat(matches.x) - centerX; + const y = parseFloat(matches.y) - centerY; + + // 12 pie slices, the edge of the first one is directly north. + // It goes in B R Y order repeating 4 times. + // The 0.5 subtraction (12 - 0.5 = 11.5) is because the Homing Pattern + // lands directly in the middle of a slice. + const dir12 = Math.round(6 - 6 * Math.atan2(x, y) / Math.PI + 11.5) % 12; + + const colorOffset = dir12 % 3; + const colorMap: { [offset: number]: typeof data.staticeHomingColor } = { + 0: 'blue', + 1: 'red', + 2: 'yellow', + } as const; + + data.staticeHomingColor = colorMap[colorOffset]; + if (data.staticeHomingColor !== undefined) + infoText = output[data.staticeHomingColor]!(); + + if (data.staticeDart.length !== 2) + return { infoText }; + + const dartTargets = data.staticeDart.map((x) => x.target); + if (!dartTargets.includes(data.me)) + return { alertText: output.noDartOnYou!(), infoText: infoText }; + + const [target1, target2] = dartTargets; + if (target1 === undefined || target2 === undefined) + return { infoText }; + const otherTarget = data.party.member(target1 === data.me ? target2 : target1); + return { alertText: output.dartOnYou!({ player: otherTarget }), infoText: infoText }; + }, + }, + { + id: 'AAIS Statice Pinwheeling Dartboard Mech', + type: 'HeadMarker', + netRegex: { id: headmarkerIds.tethers }, + condition: (data) => data.staticeIsPinwheelingDartboard, + delaySeconds: (data, matches) => { + data.staticeDartboardTether.push(matches); + return data.staticeDartboardTether.length === 2 ? 0 : 0.5; + }, + alertText: (data, _matches, output) => { + if (data.staticeDartboardTether.length !== 2) + return; + + const tethers = data.staticeDartboardTether.map((x) => x.target); + + if (tethers.includes(data.me)) { + const [tether1, tether2] = tethers; + const other = data.party.member(tether1 === data.me ? tether2 : tether1); + return output.tether!({ player: other }); + } + + const partyNames = data.party.partyNames; + const nonTethers = partyNames.filter((x) => !tethers.includes(x)); + const [stack1, stack2] = nonTethers; + const other = data.party.member(stack1 === data.me ? stack2 : stack1); + return output.stack!({ player: other }); + }, + run: (data) => data.staticeDartboardTether = [], + outputStrings: { + // TODO: maybe this should remind you of dart color + tether: { + en: 'Tether w/${player}', + }, + stack: { + en: 'Stack w/${player}', + }, + }, + }, ], timelineReplace: [ { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 8f109bb1c2..8d62ed8276 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -7,7 +7,6 @@ import { PluginCombatantState } from '../../../../../types/event'; import { NetMatches } from '../../../../../types/net_matches'; import { TriggerSet } from '../../../../../types/trigger'; -// TODO: use code from AMR to handle cases of "role stacks" when somebody is dead // TODO: sc3 should say which bubble to take to the other side (for everyone) // TODO: figure out directions for Lala for Radiance orbs // TODO: map effects for Lala @@ -22,6 +21,7 @@ export interface Data extends RaidbossData { ketuHydroBuffCount: number; ketuBuff?: 'bubble' | 'fetters'; ketuBuffCollect: NetMatches['GainsEffect'][]; + ketuStackTargets: string[]; lalaBossRotation?: 'clock' | 'counter'; lalaBossTimes?: 3 | 5; lalaBossInitialSafe?: 'north' | 'east' | 'south' | 'west'; @@ -62,6 +62,7 @@ const triggerSet: TriggerSet = { ketuCrystalAdd: [], ketuHydroBuffCount: 0, ketuBuffCollect: [], + ketuStackTargets: [], lalaSubAlpha: [], staticeBullet: [], staticeTrapshooting: [], @@ -385,6 +386,42 @@ const triggerSet: TriggerSet = { }, }, }, + { + id: 'AAI Ketuduke Hydrofall Role Stack Warning', + type: 'GainsEffect', + netRegex: { effectId: 'EA3' }, + delaySeconds: (data, matches) => { + data.ketuStackTargets.push(matches.target); + return data.ketuStackTargets.length === 2 ? 0 : 0.5; + }, + alarmText: (data, _matches, output) => { + const [stack1, stack2] = data.ketuStackTargets; + if (data.ketuStackTargets.length !== 2 || stack1 === undefined || stack2 === undefined) + return; + + // Sorry, non-standard light party comps. + const supports = [...data.party.healerNames, ...data.party.tankNames]; + const dps = data.party.dpsNames; + if (supports.length !== 2 && dps.length !== 2) + return; + + const isStack1DPS = data.party.isDPS(stack1); + const isStack2DPS = data.party.isDPS(stack2); + + // If both stacks are on dps or neither stack is on a dps, then you have + // standard "partner" stacks of one support and one dps. If one is on a dps + // and one is on a support (which can happen if somebody dies), then + // you (probably) need to have role stacks. + if (isStack1DPS !== isStack2DPS) + return output.roleStacks!(); + }, + run: (data) => data.ketuStackTargets = [], + outputStrings: { + roleStacks: { + en: 'Role Stacks', + }, + }, + }, { id: 'AAI Ketuduke Receding Twintides', type: 'StartsUsing', From 0843e9517982419d12b3f2d45960578d0604ded7 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 12 Dec 2023 13:36:37 -0800 Subject: [PATCH 27/39] simplify Lala Arcane Blight call --- .../dungeon/another_aloalo_island-savage.ts | 30 ++++--------------- .../06-ew/dungeon/another_aloalo_island.ts | 30 ++++--------------- 2 files changed, 10 insertions(+), 50 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 0ba98ccd6d..029dcef53e 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -605,42 +605,22 @@ const triggerSet: TriggerSet = { const diff = (finalDir - initialDir + 4) % 4; if (diff !== 1 && diff !== 3) return; - const rotateStr = diff === 1 ? output.dirClock!() : output.dirCounter!(); - const dirStr = { + return { 0: output.front!(), 1: output.right!(), 2: output.back!(), 3: output.left!(), }[finalDir]; - - return output.text!({ rotate: rotateStr, dir: dirStr }); }, run: (data) => { delete data.lalaBossTimes; delete data.lalaBossRotation; }, outputStrings: { - text: { - en: '${rotate} (${dir})', - }, - front: { - en: 'in front', - }, - back: { - en: 'get behind', - }, - left: { - en: 'on left flank', - }, - right: { - en: 'on right flank', - }, - dirClock: { - en: 'Rotate Left', - }, - dirCounter: { - en: 'Rotate Right', - }, + front: Outputs.front, + back: Outputs.back, + left: Outputs.left, + right: Outputs.right, }, }, { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 8d62ed8276..18b833b879 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -600,42 +600,22 @@ const triggerSet: TriggerSet = { const diff = (finalDir - initialDir + 4) % 4; if (diff !== 1 && diff !== 3) return; - const rotateStr = diff === 1 ? output.dirClock!() : output.dirCounter!(); - const dirStr = { + return { 0: output.front!(), 1: output.right!(), 2: output.back!(), 3: output.left!(), }[finalDir]; - - return output.text!({ rotate: rotateStr, dir: dirStr }); }, run: (data) => { delete data.lalaBossTimes; delete data.lalaBossRotation; }, outputStrings: { - text: { - en: '${rotate} (${dir})', - }, - front: { - en: 'in front', - }, - back: { - en: 'get behind', - }, - left: { - en: 'on left flank', - }, - right: { - en: 'on right flank', - }, - dirClock: { - en: 'Rotate Left', - }, - dirCounter: { - en: 'Rotate Right', - }, + front: Outputs.front, + back: Outputs.back, + left: Outputs.left, + right: Outputs.right, }, }, { From add22d9154e159872c2930918a1cf3f855147258 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 12 Dec 2023 13:41:19 -0800 Subject: [PATCH 28/39] use new seal syncs --- .../06-ew/dungeon/another_aloalo_island-savage.txt | 12 ++++++++---- .../data/06-ew/dungeon/another_aloalo_island.txt | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index ac0e9461b7..e74040f996 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -9,7 +9,8 @@ hideall "--Reset--" hideall "--sync--" -0.0 "--Reset--" sync / 00:0839::.*is no longer sealed/ window 100000 jump 0 +# .*is no longer sealed +0.0 "--Reset--" sync / 29:[^:]*:7DE:/ window 100000 jump 0 #~~~~~~~~~~# # KETUDUKE # @@ -18,7 +19,8 @@ hideall "--sync--" # -p 8AD4:1015.2 # -ii 8AA7 8AED 8ADD 8AB9 8AB6 8AEB TODO TODO 8AE5 8AE6 8AC0 8ADA 8AD9 8AE4 8AC8 8AE3 8A82 8A83 -1000.0 "--sync--" sync / 00:0839::The Dawn Trial will be sealed off/ window 10000,0 +# The Dawn Trial will be sealed off +1000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1146:/ window 10000,0 1010.2 "--sync--" sync / 14:[^:]*:Ketuduke:8AD4:/ window 20,20 1015.2 "Tidal Roar" sync / 1[56]:[^:]*:Ketuduke:8AD4:/ @@ -148,7 +150,8 @@ hideall "--sync--" # -p 8C05:2011.1 # -ii 8BE6 8BE9 8CE1 8BF1 8BF2 8BFF 8BF3 8BF4 -2000.0 "--sync--" sync / 00:0839::The Dusk Trial will be sealed off/ window 10000,0 +# The Dusk Trial will be sealed off +2000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1147:/ window 10000,0 2006.1 "--sync--" sync / 14:[^:]*:Lala:8C05:/ window 20,20 2011.1 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ @@ -272,7 +275,8 @@ hideall "--sync--" # -p 8966:3013.8 # -ii TODO 8925 8926 8977 8978 8969 8988 8A6A 897C 897D TODO TODO 8CC1 89FB TODO 8974 8975 -3000.0 "--sync--" sync / 00:0839::The Midnight Trial will be sealed off/ window 10000,0 +# Midnight Trial will be sealed off +3000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1148:/ window 10000,0 3008.8 "--sync--" sync / 14:[^:]*:Statice:8966:/ window 20,20 3013.8 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index fa5e67bdd1..ac98b8029c 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -4,7 +4,8 @@ hideall "--Reset--" hideall "--sync--" -0.0 "--Reset--" sync / 00:0839::.*is no longer sealed/ window 100000 jump 0 +# .*is no longer sealed +0.0 "--Reset--" sync / 29:[^:]*:7DE:/ window 100000 jump 0 #~~~~~~~~~~# # KETUDUKE # @@ -13,7 +14,8 @@ hideall "--sync--" # -p 8AD4:1015.2 # -ii 8AA7 8AD5 8AAE 8AB9 8AB6 8AD1 8ABE 8ABF 8AC9 8ACB 8AC0 8AAA 8AA9 8AC6 8AC8 8AC3 8A82 8A83 -1000.0 "--sync--" sync / 00:0839::The Dawn Trial will be sealed off/ window 10000,0 +# The Dawn Trial will be sealed off +1000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1146:/ window 10000,0 1010.2 "--sync--" sync / 14:[^:]*:Ketuduke:8AD4:/ window 20,20 1015.2 "Tidal Roar" sync / 1[56]:[^:]*:Ketuduke:8AD4:/ @@ -143,7 +145,8 @@ hideall "--sync--" # -p 88AE:2011.1 # -ii 888F 8892 8CDF 889A 889B 88A8 889C 889D -2000.0 "--sync--" sync / 00:0839::The Dusk Trial will be sealed off/ window 10000,0 +# The Dusk Trial will be sealed off +2000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1147:/ window 10000,0 2006.1 "--sync--" sync / 14:[^:]*:Lala:88AE:/ window 20,20 2011.1 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ @@ -267,7 +270,8 @@ hideall "--sync--" # -p 8949:3013.8 # -ii 8947 8925 8926 895A 895B 894C 8987 8A6A 895F 8960 8CC2 8982 8CBE 89F9 8C24 8957 8958 -3000.0 "--sync--" sync / 00:0839::The Midnight Trial will be sealed off/ window 10000,0 +# Midnight Trial will be sealed off +3000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1148:/ window 10000,0 3008.8 "--sync--" sync / 14:[^:]*:Statice:8949:/ window 20,20 3013.8 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ From a8359f26fc3c19964fb2ed1f9ebd799db627ed4b Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 12 Dec 2023 13:44:58 -0800 Subject: [PATCH 29/39] use nettify script to convert timeline to new style --- .../dungeon/another_aloalo_island-savage.txt | 414 +++++++++--------- .../06-ew/dungeon/another_aloalo_island.txt | 414 +++++++++--------- 2 files changed, 414 insertions(+), 414 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index e74040f996..a0231f3277 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -10,7 +10,7 @@ hideall "--Reset--" hideall "--sync--" # .*is no longer sealed -0.0 "--Reset--" sync / 29:[^:]*:7DE:/ window 100000 jump 0 +0.0 "--Reset--" SystemLogMessage { id: "7DE" } window 100000 jump 0 #~~~~~~~~~~# # KETUDUKE # @@ -20,75 +20,75 @@ hideall "--sync--" # -ii 8AA7 8AED 8ADD 8AB9 8AB6 8AEB TODO TODO 8AE5 8AE6 8AC0 8ADA 8AD9 8AE4 8AC8 8AE3 8A82 8A83 # The Dawn Trial will be sealed off -1000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1146:/ window 10000,0 -1010.2 "--sync--" sync / 14:[^:]*:Ketuduke:8AD4:/ window 20,20 -1015.2 "Tidal Roar" sync / 1[56]:[^:]*:Ketuduke:8AD4:/ - -1022.0 "--middle--" sync / 1[56]:[^:]*:Ketuduke:8A77:/ -1027.0 "Spring Crystals 1" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ -1034.0 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ -1041.0 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB8|8AB4):/ -1050.0 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:8AB1:/ -1060.0 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:8AB2:/ -1062.0 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:8AB3:/ -1065.0 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8ADC:/ -1065.1 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(8ADF|8ADE):/ - -1074.0 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB4|8AB8):/ -1077.1 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|8AB5):/ -1084.3 "Blowing Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABD:/ -1091.4 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:8AD0:/ -1096.3 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8ADE|8ADF):/ -1099.6 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:8AD0:/ -1102.5 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8ADF|8ADE):/ - -1113.6 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ -1118.9 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABB:/ -1130.3 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(8AE7|8AE9):/ -1130.9 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:8AE0:/ -1133.4 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(8AEA|8AE8):/ -1134.0 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:8AE0:/ -1134.0 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8ADE:/ - -1143.7 "Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB8:/ -1149.7 "Roar" sync / 1[56]:[^:]*:Ketuduke:8AC4:/ -1154.6 "Spring Crystals 2" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ -1164.6 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AC5:/ -1177.0 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:8ADF:/ -1177.6 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8ADC:/ -1182.7 "Updraft" sync / 1[56]:[^:]*:Ketuduke:8AC7:/ -1184.1 "Hundred Lashings" sync / 1[56]:[^:]*:Aloalo Zaratan:8ACA:/ - -1190.7 "--middle--" sync / 1[56]:[^:]*:Ketuduke:8A77:/ -1199.4 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB4|8AB8):/ -1202.4 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(TODO|8AB5):/ -1210.4 "Angry Seas" sync / 1[56]:[^:]*:Ketuduke:8AE1:/ -1211.6 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8ADE|8ADF):/ -1212.2 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:[^:]*:(8ADF|8ADE):/ # this sometimes has the wrong source -1214.8 "Spring Crystals 3" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ -1216.8 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:8ADF:/ -1221.8 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ -1227.8 "Fluke Typhoon (cast)" sync / 1[56]:[^:]*:Ketuduke:8AAF:/ -1233.8 "Fluke Typhoon" sync / 1[56]:[^:]*:Ketuduke:8AB0:/ -1236.4 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8ADB:/ -1238.8 "Burst x4" sync / 1[56]:[^:]*:Ketuduke:8AE2:/ - -1246.7 "Spring Crystals 4" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ -1253.7 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ -1260.7 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB8|8AB4):/ -1269.8 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:8AB1:/ -1279.9 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:8AB2:/ -1281.9 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:8AB3:/ -1284.9 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8ADC:/ -1285.0 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(8ADF|8ADE):/ - -1293.9 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ -1299.2 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABB:/ -1310.6 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(8AE7|8AE9):/ -1311.2 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:8AE0:/ -1313.7 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(8AEA|8AE8):/ -1314.3 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:8AE0:/ -1314.3 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8ADE:/ +1000.0 "--sync--" SystemLogMessage { id: "7DC", param1: "1146" } window 10000,0 +1010.2 "--sync--" StartsUsing { id: "8AD4", source: "Ketuduke" } window 20,20 +1015.2 "Tidal Roar" Ability { id: "8AD4", source: "Ketuduke" } + +1022.0 "--middle--" Ability { id: "8A77", source: "Ketuduke" } +1027.0 "Spring Crystals 1" Ability { id: "8AA8", source: "Ketuduke" } +1034.0 "Bubble Net" Ability { id: "8AAD", source: "Ketuduke" } +1041.0 "Hydrobullet/Hydrofall (buff)" Ability { id: "(8AB8|8AB4)", source: "Ketuduke" } +1050.0 "Fluke Gale (cast)" Ability { id: "8AB1", source: "Ketuduke" } +1060.0 "Fluke Gale 1" Ability { id: "8AB2", source: "Ketuduke" } +1062.0 "Fluke Gale 2" Ability { id: "8AB3", source: "Ketuduke" } +1065.0 "Saturate" Ability { id: "8ADC", source: "Spring Crystal" } +1065.1 "Hydrobullet/Hydrofall" Ability { id: "(8ADF|8ADE)", source: "Ketuduke" } + +1074.0 "Hydrofall/Hydrobullet (buff)" Ability { id: "(8AB4|8AB8)", source: "Ketuduke" } +1077.1 "Hydrobullet/Hydrofall (buff)" Ability { id: "(TODO|8AB5)", source: "Ketuduke" } +1084.3 "Blowing Bubbles" Ability { id: "8ABD", source: "Ketuduke" } +1091.4 "Hydrobomb x3" Ability { id: "8AD0", source: "Ketuduke" } +1096.3 "Hydrofall/Hydrobullet" Ability { id: "(8ADE|8ADF)", source: "Ketuduke" } +1099.6 "Hydrobomb x3" Ability { id: "8AD0", source: "Ketuduke" } +1102.5 "Hydrobullet/Hydrobullet" Ability { id: "(8ADF|8ADE)", source: "Ketuduke" } + +1113.6 "Hydrofall (buff)" Ability { id: "8AB4", source: "Ketuduke" } +1118.9 "Strewn Bubbles" Ability { id: "8ABB", source: "Ketuduke" } +1130.3 "Receding Twintides/Encroaching Twintides" Ability { id: "(8AE7|8AE9)", source: "Ketuduke" } +1130.9 "Sphere Shatter 1" Ability { id: "8AE0", source: "Ketuduke" } +1133.4 "Far Tide/Near Tide" Ability { id: "(8AEA|8AE8)", source: "Ketuduke" } +1134.0 "Sphere Shatter 2" Ability { id: "8AE0", source: "Ketuduke" } +1134.0 "Hydrofall" Ability { id: "8ADE", source: "Ketuduke" } + +1143.7 "Hydrobullet (buff)" Ability { id: "8AB8", source: "Ketuduke" } +1149.7 "Roar" Ability { id: "8AC4", source: "Ketuduke" } +1154.6 "Spring Crystals 2" Ability { id: "8AA8", source: "Ketuduke" } +1164.6 "Bubble Net" Ability { id: "8AC5", source: "Ketuduke" } +1177.0 "Hydrobullet" Ability { id: "8ADF", source: "Ketuduke" } +1177.6 "Saturate" Ability { id: "8ADC", source: "Spring Crystal" } +1182.7 "Updraft" Ability { id: "8AC7", source: "Ketuduke" } +1184.1 "Hundred Lashings" Ability { id: "8ACA", source: "Aloalo Zaratan" } + +1190.7 "--middle--" Ability { id: "8A77", source: "Ketuduke" } +1199.4 "Hydrofall/Hydrobullet (buff)" Ability { id: "(8AB4|8AB8)", source: "Ketuduke" } +1202.4 "Hydrobullet/Hydrofall (buff)" Ability { id: "(TODO|8AB5)", source: "Ketuduke" } +1210.4 "Angry Seas" Ability { id: "8AE1", source: "Ketuduke" } +1211.6 "Hydrofall/Hydrobullet" Ability { id: "(8ADE|8ADF)", source: "Ketuduke" } +1212.2 "Hydrobullet/Hydrobullet" Ability { id: "(8ADF|8ADE)" } # this sometimes has the wrong source +1214.8 "Spring Crystals 3" Ability { id: "8AA8", source: "Ketuduke" } +1216.8 "Hydrobullet" Ability { id: "8ADF", source: "Ketuduke" } +1221.8 "Bubble Net" Ability { id: "8AAD", source: "Ketuduke" } +1227.8 "Fluke Typhoon (cast)" Ability { id: "8AAF", source: "Ketuduke" } +1233.8 "Fluke Typhoon" Ability { id: "8AB0", source: "Ketuduke" } +1236.4 "Saturate" Ability { id: "8ADB", source: "Spring Crystal" } +1238.8 "Burst x4" Ability { id: "8AE2", source: "Ketuduke" } + +1246.7 "Spring Crystals 4" Ability { id: "8AA8", source: "Ketuduke" } +1253.7 "Bubble Net" Ability { id: "8AAD", source: "Ketuduke" } +1260.7 "Hydrobullet/Hydrofall (buff)" Ability { id: "(8AB8|8AB4)", source: "Ketuduke" } +1269.8 "Fluke Gale (cast)" Ability { id: "8AB1", source: "Ketuduke" } +1279.9 "Fluke Gale 1" Ability { id: "8AB2", source: "Ketuduke" } +1281.9 "Fluke Gale 2" Ability { id: "8AB3", source: "Ketuduke" } +1284.9 "Saturate" Ability { id: "8ADC", source: "Spring Crystal" } +1285.0 "Hydrobullet/Hydrofall" Ability { id: "(8ADF|8ADE)", source: "Ketuduke" } + +1293.9 "Hydrofall (buff)" Ability { id: "8AB4", source: "Ketuduke" } +1299.2 "Strewn Bubbles" Ability { id: "8ABB", source: "Ketuduke" } +1310.6 "Receding Twintides/Encroaching Twintides" Ability { id: "(8AE7|8AE9)", source: "Ketuduke" } +1311.2 "Sphere Shatter 1" Ability { id: "8AE0", source: "Ketuduke" } +1313.7 "Far Tide/Near Tide" Ability { id: "(8AEA|8AE8)", source: "Ketuduke" } +1314.3 "Sphere Shatter 2" Ability { id: "8AE0", source: "Ketuduke" } +1314.3 "Hydrofall" Ability { id: "8ADE", source: "Ketuduke" } # ??? # ALL ENCOUNTER ABILITIES @@ -151,79 +151,79 @@ hideall "--sync--" # -ii 8BE6 8BE9 8CE1 8BF1 8BF2 8BFF 8BF3 8BF4 # The Dusk Trial will be sealed off -2000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1147:/ window 10000,0 -2006.1 "--sync--" sync / 14:[^:]*:Lala:8C05:/ window 20,20 -2011.1 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ - -2013.2 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ -2018.3 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8BE0|8D2F):/ -2026.4 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(8BE2|8BE3|8BE4|8BE5):/ - -2029.6 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ -2034.7 "Analysis" sync / 1[56]:[^:]*:Lala:8BEC:/ -2039.8 "Arcane Array 1" sync / 1[56]:[^:]*:Lala:8BE7:/ -2044.9 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8BE0|8D2F):/ -2045.6 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8BE8:/ -2046.9 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:8BEB:/ -2053.0 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(8BE2|8BE3|8BE4|8BE5):/ +2000.0 "--sync--" SystemLogMessage { id: "7DC", param1: "1147" } window 10000,0 +2006.1 "--sync--" StartsUsing { id: "8C05", source: "Lala" } window 20,20 +2011.1 "Inferno Theorem" Ability { id: "8C05", source: "Lala" } + +2013.2 "--middle--" Ability { id: "8874", source: "Lala" } +2018.3 "Angular Addition" Ability { id: "(8BE0|8D2F)", source: "Lala" } +2026.4 "Arcane Blight" Ability { id: "(8BE2|8BE3|8BE4|8BE5)", source: "Lala" } + +2029.6 "--middle--" Ability { id: "8874", source: "Lala" } +2034.7 "Analysis" Ability { id: "8BEC", source: "Lala" } +2039.8 "Arcane Array 1" Ability { id: "8BE7", source: "Lala" } +2044.9 "Angular Addition" Ability { id: "(8BE0|8D2F)", source: "Lala" } +2045.6 "Bright Pulse" Ability { id: "8BE8", source: "Lala" } +2046.9 "Radiance 1" Ability { id: "8BEB", source: "Arcane Globe" } +2053.0 "Arcane Blight" Ability { id: "(8BE2|8BE3|8BE4|8BE5)", source: "Lala" } # This can be +1.2s if it's on the final square instead of penultimate. -2054.1 "Radiance 2" #sync / 1[56]:[^:]*:Arcane Globe:8BEB:/ -2061.2 "Targeted Light" sync / 1[56]:[^:]*:Lala:8CE0:/ - -2072.5 "Strategic Strike" sync / 1[56]:[^:]*:Lala:8C04:/ - -2085.6 "Planar Tactics" sync / 1[56]:[^:]*:Lala:8BEF:/ -2100.7 "Arcane Mine" sync / 1[56]:[^:]*:Lala:8BF0:/ -2108.6 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:8BF5:/ - -2112.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ -2122.9 "Strategic Strike" sync / 1[56]:[^:]*:Lala:8C04:/ - -2131.1 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ -2138.3 "Spatial Tactics" sync / 1[56]:[^:]*:Lala:8BF7:/ -2143.4 "Arcane Array 2" sync / 1[56]:[^:]*:Lala:8BF6:/ -2149.2 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8BE8:/ -2150.5 "Inferno Divide 1" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 -2150.5 "Radiance" sync / 1[56]:[^:]*:Arcane Globe:8D20:/ -2152.9 "Inferno Divide 2" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 -2156.6 "Inferno Divide 3" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 -2157.6 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8BE0|8D2F):/ -2157.8 "Inferno Divide 4" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 -2160.2 "Inferno Divide 5" sync / 1[56]:[^:]*:Arcane Font:8BEA:/ window 1,1 -2165.6 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(8BE2|8BE3|8BE4|8BE5):/ - -2173.7 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ -2184.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ - -2196.9 "Symmetric Surge" sync / 1[56]:[^:]*:Lala:8BF8:/ -2202.0 "Constructive Figure" sync / 1[56]:[^:]*:Lala:8BFA:/ -2207.1 "Arcane Plot" sync / 1[56]:[^:]*:Lala:8BF9:/ -2212.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8BE8:/ -2221.2 "Arcane Point" sync / 1[56]:[^:]*:Lala:8BFC:/ -2221.8 "Aero II" sync / 1[56]:[^:]*:Aloalo Golem:8BFB:/ -2222.0 "Powerful Light" sync / 1[56]:[^:]*:Lala:8BFD:/ -2230.3 "Explosive Theorem" sync / 1[56]:[^:]*:Lala:8BFE:/ -2234.7 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:8BF5:/ -2235.4 "Telluric Theorem" sync / 1[56]:[^:]*:Lala:8C00:/ - -2248.4 "Strategic Strike" sync / 1[56]:[^:]*:Lala:8C04:/ -2256.5 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ - -2263.6 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ -2269.0 "Analysis" sync / 1[56]:[^:]*:Lala:8BEC:/ -2274.1 "Arcane Array 3" sync / 1[56]:[^:]*:Lala:8BE7:/ -2279.2 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8BE0|8D2F):/ -2279.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8BE8:/ -2281.2 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:8BEB:/ -2287.3 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(8BE2|8BE3|8BE4|8BE5):/ -2290.9 "Radiance 2" sync / 1[56]:[^:]*:Arcane Globe:8BEB:/ -2295.6 "Targeted Light" sync / 1[56]:[^:]*:Lala:8CE0:/ -2306.7 "Strategic Strike" sync / 1[56]:[^:]*:Lala:8C04:/ - -2316.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:8C05:/ - -2319.9 "--sync--" sync / 14:[^:]*:Lala:TODO:/ window 20,20 -2329.9 "Inferno Theorem Enrage" sync / 1[56]:[^:]*:Lala:TODO:/ +2054.1 "Radiance 2" #Ability { id: "8BEB", source: "Arcane Globe" } +2061.2 "Targeted Light" Ability { id: "8CE0", source: "Lala" } + +2072.5 "Strategic Strike" Ability { id: "8C04", source: "Lala" } + +2085.6 "Planar Tactics" Ability { id: "8BEF", source: "Lala" } +2100.7 "Arcane Mine" Ability { id: "8BF0", source: "Lala" } +2108.6 "Symmetric Surge x2" Ability { id: "8BF5", source: "Lala" } + +2112.8 "Inferno Theorem" Ability { id: "8C05", source: "Lala" } +2122.9 "Strategic Strike" Ability { id: "8C04", source: "Lala" } + +2131.1 "--middle--" Ability { id: "8874", source: "Lala" } +2138.3 "Spatial Tactics" Ability { id: "8BF7", source: "Lala" } +2143.4 "Arcane Array 2" Ability { id: "8BF6", source: "Lala" } +2149.2 "Bright Pulse" Ability { id: "8BE8", source: "Lala" } +2150.5 "Inferno Divide 1" Ability { id: "8BEA", source: "Arcane Font" } window 1,1 +2150.5 "Radiance" Ability { id: "8D20", source: "Arcane Globe" } +2152.9 "Inferno Divide 2" Ability { id: "8BEA", source: "Arcane Font" } window 1,1 +2156.6 "Inferno Divide 3" Ability { id: "8BEA", source: "Arcane Font" } window 1,1 +2157.6 "Angular Addition" Ability { id: "(8BE0|8D2F)", source: "Lala" } +2157.8 "Inferno Divide 4" Ability { id: "8BEA", source: "Arcane Font" } window 1,1 +2160.2 "Inferno Divide 5" Ability { id: "8BEA", source: "Arcane Font" } window 1,1 +2165.6 "Arcane Blight" Ability { id: "(8BE2|8BE3|8BE4|8BE5)", source: "Lala" } + +2173.7 "Inferno Theorem" Ability { id: "8C05", source: "Lala" } +2184.8 "Inferno Theorem" Ability { id: "8C05", source: "Lala" } + +2196.9 "Symmetric Surge" Ability { id: "8BF8", source: "Lala" } +2202.0 "Constructive Figure" Ability { id: "8BFA", source: "Lala" } +2207.1 "Arcane Plot" Ability { id: "8BF9", source: "Lala" } +2212.9 "Bright Pulse" Ability { id: "8BE8", source: "Lala" } +2221.2 "Arcane Point" Ability { id: "8BFC", source: "Lala" } +2221.8 "Aero II" Ability { id: "8BFB", source: "Aloalo Golem" } +2222.0 "Powerful Light" Ability { id: "8BFD", source: "Lala" } +2230.3 "Explosive Theorem" Ability { id: "8BFE", source: "Lala" } +2234.7 "Symmetric Surge x2" Ability { id: "8BF5", source: "Lala" } +2235.4 "Telluric Theorem" Ability { id: "8C00", source: "Lala" } + +2248.4 "Strategic Strike" Ability { id: "8C04", source: "Lala" } +2256.5 "Inferno Theorem" Ability { id: "8C05", source: "Lala" } + +2263.6 "--middle--" Ability { id: "8874", source: "Lala" } +2269.0 "Analysis" Ability { id: "8BEC", source: "Lala" } +2274.1 "Arcane Array 3" Ability { id: "8BE7", source: "Lala" } +2279.2 "Angular Addition" Ability { id: "(8BE0|8D2F)", source: "Lala" } +2279.9 "Bright Pulse" Ability { id: "8BE8", source: "Lala" } +2281.2 "Radiance 1" Ability { id: "8BEB", source: "Arcane Globe" } +2287.3 "Arcane Blight" Ability { id: "(8BE2|8BE3|8BE4|8BE5)", source: "Lala" } +2290.9 "Radiance 2" Ability { id: "8BEB", source: "Arcane Globe" } +2295.6 "Targeted Light" Ability { id: "8CE0", source: "Lala" } +2306.7 "Strategic Strike" Ability { id: "8C04", source: "Lala" } + +2316.8 "Inferno Theorem" Ability { id: "8C05", source: "Lala" } + +2319.9 "--sync--" StartsUsing { id: "TODO", source: "Lala" } window 20,20 +2329.9 "Inferno Theorem Enrage" Ability { id: "TODO", source: "Lala" } # ALL ENCOUNTER ABILITIES @@ -276,71 +276,71 @@ hideall "--sync--" # -ii TODO 8925 8926 8977 8978 8969 8988 8A6A 897C 897D TODO TODO 8CC1 89FB TODO 8974 8975 # Midnight Trial will be sealed off -3000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1148:/ window 10000,0 -3008.8 "--sync--" sync / 14:[^:]*:Statice:8966:/ window 20,20 -3013.8 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ - -3018.0 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3023.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:8967:/ -3038.2 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8D1C:/ -3048.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:8968:/ -3056.5 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:8979:/ -3070.6 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8976:/ -3074.6 "Burst" sync / 1[56]:[^:]*:Bomb:897A:/ - -3081.8 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3087.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:8967:/ -3101.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:8979:/ -3106.3 "Dartboard of Dancing Explosives " sync / 1[56]:[^:]*:Statice:8CC0:/ -3120.1 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8976:/ -3122.0 "Burst" sync / 1[56]:[^:]*:Bomb:897A:/ -3125.3 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:8971:/ - -3132.3 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3137.7 "Surprise Balloon" sync / 1[56]:[^:]*:Statice:8927:/ -3144.8 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:8980:/ -3149.8 "Surprise Needle 1" #sync / 1[56]:[^:]*:Needle:896C:/ -3150.7 "Pop 1" sync / 1[56]:[^:]*:Statice:896B:/ -3151.5 "Surprise Needle 2" #sync / 1[56]:[^:]*:Needle:896C:/ -3152.4 "Trigger Happy" sync / 1[56]:[^:]*:Statice:8968:/ -3153.2 "Surprise Needle 3" #sync / 1[56]:[^:]*:Needle:896C:/ -3154.9 "Surprise Needle 4" #sync / 1[56]:[^:]*:Needle:896C:/ -3155.6 "Pop 2" sync / 1[56]:[^:]*:Statice:896B:/ -3160.4 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8976:/ - -3172.5 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ -3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:8979:/ -3189.2 "Present Box 1" sync / 1[56]:[^:]*:Statice:8972:/ -3194.3 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:897B:/ -3204.0 "Fireworks" sync / 1[56]:[^:]*:Statice:897C:/ -3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:897A:/ -3204.3 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:8973:/ -3212.5 "Shocking Abandon" sync / 1[56]:[^:]*:Statice:8965:/ - -3222.7 "Pinwheeling Dartboard" sync / 1[56]:[^:]*:Statice:8BCF:/ -3231.4 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:897B:/ -3233.4 "Fire Spread" sync / 1[56]:[^:]*:Statice:8952:/ duration 11 -3241.3 "Fireworks" sync / 1[56]:[^:]*:Statice:897C:/ -3241.6 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:8971:/ -3253.6 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ - -3260.8 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3266.5 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:8980:/ -3273.6 "Trick Reload" sync / 1[56]:[^:]*:Statice:8967:/ -3288.4 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8D1C:/ -3295.5 "Present Box 2" sync / 1[56]:[^:]*:Statice:8972:/ -3302.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:8979:/ -3309.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:8968:/ -3310.2 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:8973:/ -3316.5 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8976:/ -3320.4 "Burst" sync / 1[56]:[^:]*:Bomb:897A:/ - -3327.6 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ -3335.7 "Aero IV" sync / 1[56]:[^:]*:Statice:8966:/ - -3338.8 "--sync--" sync / 14:[^:]*:Statice:TODO:/ -3348.8 "Aero IV Enrage" sync / 1[56]:[^:]*:Statice:TODO:/ +3000.0 "--sync--" SystemLogMessage { id: "7DC", param1: "1148" } window 10000,0 +3008.8 "--sync--" StartsUsing { id: "8966", source: "Statice" } window 20,20 +3013.8 "Aero IV" Ability { id: "8966", source: "Statice" } + +3018.0 "--middle--" Ability { id: "8927", source: "Statice" } +3023.4 "Trick Reload" Ability { id: "8967", source: "Statice" } +3038.2 "Trapshooting 1" Ability { id: "8D1C", source: "Statice" } +3048.6 "Trigger Happy" Ability { id: "8968", source: "Statice" } +3056.5 "Ring a Ring o' Explosions" Ability { id: "8979", source: "Statice" } +3070.6 "Trapshooting 2" Ability { id: "8976", source: "Statice" } +3074.6 "Burst" Ability { id: "897A", source: "Bomb" } + +3081.8 "--middle--" Ability { id: "8927", source: "Statice" } +3087.4 "Trick Reload" Ability { id: "8967", source: "Statice" } +3101.2 "Ring a Ring o' Explosions" Ability { id: "8979", source: "Statice" } +3106.3 "Dartboard of Dancing Explosives " Ability { id: "8CC0", source: "Statice" } +3120.1 "Trapshooting 1" Ability { id: "8976", source: "Statice" } +3122.0 "Burst" Ability { id: "897A", source: "Bomb" } +3125.3 "Uncommon Ground" Ability { id: "8971", source: "Statice" } + +3132.3 "--middle--" Ability { id: "8927", source: "Statice" } +3137.7 "Surprise Balloon" Ability { id: "8927", source: "Statice" } +3144.8 "Beguiling Glitter" Ability { id: "8980", source: "Statice" } +3149.8 "Surprise Needle 1" #Ability { id: "896C", source: "Needle" } +3150.7 "Pop 1" Ability { id: "896B", source: "Statice" } +3151.5 "Surprise Needle 2" #Ability { id: "896C", source: "Needle" } +3152.4 "Trigger Happy" Ability { id: "8968", source: "Statice" } +3153.2 "Surprise Needle 3" #Ability { id: "896C", source: "Needle" } +3154.9 "Surprise Needle 4" #Ability { id: "896C", source: "Needle" } +3155.6 "Pop 2" Ability { id: "896B", source: "Statice" } +3160.4 "Trapshooting 2" Ability { id: "8976", source: "Statice" } + +3172.5 "Aero IV" Ability { id: "8966", source: "Statice" } +3179.7 "--middle--" Ability { id: "8927", source: "Statice" } +3184.1 "Ring a Ring o' Explosions" Ability { id: "8979", source: "Statice" } +3189.2 "Present Box 1" Ability { id: "8972", source: "Statice" } +3194.3 "Fireworks (cast)" Ability { id: "897B", source: "Statice" } +3204.0 "Fireworks" Ability { id: "897C", source: "Statice" } +3204.2 "Burst" Ability { id: "897A", source: "Bomb" } +3204.3 "Faerie Ring" Ability { id: "8973", source: "Surprising Staff" } +3212.5 "Shocking Abandon" Ability { id: "8965", source: "Statice" } + +3222.7 "Pinwheeling Dartboard" Ability { id: "8BCF", source: "Statice" } +3231.4 "Fireworks (cast)" Ability { id: "897B", source: "Statice" } +3233.4 "Fire Spread" Ability { id: "8952", source: "Statice" } duration 11 +3241.3 "Fireworks" Ability { id: "897C", source: "Statice" } +3241.6 "Uncommon Ground" Ability { id: "8971", source: "Statice" } +3253.6 "Aero IV" Ability { id: "8966", source: "Statice" } + +3260.8 "--middle--" Ability { id: "8927", source: "Statice" } +3266.5 "Beguiling Glitter" Ability { id: "8980", source: "Statice" } +3273.6 "Trick Reload" Ability { id: "8967", source: "Statice" } +3288.4 "Trapshooting 1" Ability { id: "8D1C", source: "Statice" } +3295.5 "Present Box 2" Ability { id: "8972", source: "Statice" } +3302.2 "Ring a Ring o' Explosions" Ability { id: "8979", source: "Statice" } +3309.6 "Trigger Happy" Ability { id: "8968", source: "Statice" } +3310.2 "Faerie Ring" Ability { id: "8973", source: "Surprising Staff" } +3316.5 "Trapshooting 2" Ability { id: "8976", source: "Statice" } +3320.4 "Burst" Ability { id: "897A", source: "Bomb" } + +3327.6 "Aero IV" Ability { id: "8966", source: "Statice" } +3335.7 "Aero IV" Ability { id: "8966", source: "Statice" } + +3338.8 "--sync--" StartsUsing { id: "TODO", source: "Statice" } +3348.8 "Aero IV Enrage" Ability { id: "TODO", source: "Statice" } # ALL ENCOUNTER ABILITIES diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index ac98b8029c..917a54246d 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -5,7 +5,7 @@ hideall "--Reset--" hideall "--sync--" # .*is no longer sealed -0.0 "--Reset--" sync / 29:[^:]*:7DE:/ window 100000 jump 0 +0.0 "--Reset--" SystemLogMessage { id: "7DE" } window 100000 jump 0 #~~~~~~~~~~# # KETUDUKE # @@ -15,75 +15,75 @@ hideall "--sync--" # -ii 8AA7 8AD5 8AAE 8AB9 8AB6 8AD1 8ABE 8ABF 8AC9 8ACB 8AC0 8AAA 8AA9 8AC6 8AC8 8AC3 8A82 8A83 # The Dawn Trial will be sealed off -1000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1146:/ window 10000,0 -1010.2 "--sync--" sync / 14:[^:]*:Ketuduke:8AD4:/ window 20,20 -1015.2 "Tidal Roar" sync / 1[56]:[^:]*:Ketuduke:8AD4:/ - -1022.0 "--middle--" sync / 1[56]:[^:]*:Ketuduke:8A77:/ -1027.0 "Spring Crystals 1" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ -1034.0 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ -1041.0 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB8|8AB4):/ -1050.0 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:8AB1:/ -1060.0 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:8AB2:/ -1062.0 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:8AB3:/ -1065.0 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8AAC:/ -1065.1 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(8ABA|8AB7):/ - -1074.0 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB4|8AB8):/ -1077.1 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8C6D|8AB5):/ -1084.3 "Blowing Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABD:/ -1091.4 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:8AD0:/ -1096.3 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8AB7|8ABA):/ -1099.6 "Hydrobomb x3" sync / 1[56]:[^:]*:Ketuduke:8AD0:/ -1102.5 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8ABA|8AB7):/ - -1113.6 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ -1118.9 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABB:/ -1130.3 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(8ACC|8ACE):/ -1130.9 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:8ABC:/ -1133.4 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(8ACF|8ACD):/ -1134.0 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:8ABC:/ -1134.0 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8AB7:/ - -1143.7 "Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB8:/ -1149.7 "Roar" sync / 1[56]:[^:]*:Ketuduke:8AC4:/ -1154.6 "Spring Crystals 2" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ -1164.6 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AC5:/ -1177.0 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:8ABA:/ -1177.6 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8AAC:/ -1182.7 "Updraft" sync / 1[56]:[^:]*:Ketuduke:8AC7:/ -1184.1 "Hundred Lashings" sync / 1[56]:[^:]*:Aloalo Zaratan:8ACA:/ - -1190.7 "--middle--" sync / 1[56]:[^:]*:Ketuduke:8A77:/ -1199.4 "Hydrofall/Hydrobullet (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB4|8AB8):/ -1202.4 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8C6D|8AB5):/ -1210.4 "Angry Seas" sync / 1[56]:[^:]*:Ketuduke:8AC1:/ -1211.6 "Hydrofall/Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:(8AB7|8ABA):/ -1212.2 "Hydrobullet/Hydrobullet" sync / 1[56]:[^:]*:[^:]*:(8ABA|8AB7):/ # this sometimes has the wrong source -1214.8 "Spring Crystals 3" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ -1216.8 "Hydrobullet" sync / 1[56]:[^:]*:Ketuduke:8ABA:/ -1221.8 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ -1227.8 "Fluke Typhoon (cast)" sync / 1[56]:[^:]*:Ketuduke:8AAF:/ -1233.8 "Fluke Typhoon" sync / 1[56]:[^:]*:Ketuduke:8AB0:/ -1236.4 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8AAB:/ -1238.8 "Burst x4" sync / 1[56]:[^:]*:Ketuduke:8AC2:/ - -1246.7 "Spring Crystals 4" sync / 1[56]:[^:]*:Ketuduke:8AA8:/ -1253.7 "Bubble Net" sync / 1[56]:[^:]*:Ketuduke:8AAD:/ -1260.7 "Hydrobullet/Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:(8AB8|8AB4):/ -1269.8 "Fluke Gale (cast)" sync / 1[56]:[^:]*:Ketuduke:8AB1:/ -1279.9 "Fluke Gale 1" sync / 1[56]:[^:]*:Ketuduke:8AB2:/ -1281.9 "Fluke Gale 2" sync / 1[56]:[^:]*:Ketuduke:8AB3:/ -1284.9 "Saturate" sync / 1[56]:[^:]*:Spring Crystal:8AAC:/ -1285.0 "Hydrobullet/Hydrofall" sync / 1[56]:[^:]*:Ketuduke:(8ABA|8AB7):/ - -1293.9 "Hydrofall (buff)" sync / 1[56]:[^:]*:Ketuduke:8AB4:/ -1299.2 "Strewn Bubbles" sync / 1[56]:[^:]*:Ketuduke:8ABB:/ -1310.6 "Receding Twintides/Encroaching Twintides" sync / 1[56]:[^:]*:Ketuduke:(8ACC|8ACE):/ -1311.2 "Sphere Shatter 1" sync / 1[56]:[^:]*:Ketuduke:8ABC:/ -1313.7 "Far Tide/Near Tide" sync / 1[56]:[^:]*:Ketuduke:(8ACF|8ACD):/ -1314.3 "Sphere Shatter 2" sync / 1[56]:[^:]*:Ketuduke:8ABC:/ -1314.3 "Hydrofall" sync / 1[56]:[^:]*:Ketuduke:8AB7:/ +1000.0 "--sync--" SystemLogMessage { id: "7DC", param1: "1146" } window 10000,0 +1010.2 "--sync--" StartsUsing { id: "8AD4", source: "Ketuduke" } window 20,20 +1015.2 "Tidal Roar" Ability { id: "8AD4", source: "Ketuduke" } + +1022.0 "--middle--" Ability { id: "8A77", source: "Ketuduke" } +1027.0 "Spring Crystals 1" Ability { id: "8AA8", source: "Ketuduke" } +1034.0 "Bubble Net" Ability { id: "8AAD", source: "Ketuduke" } +1041.0 "Hydrobullet/Hydrofall (buff)" Ability { id: "(8AB8|8AB4)", source: "Ketuduke" } +1050.0 "Fluke Gale (cast)" Ability { id: "8AB1", source: "Ketuduke" } +1060.0 "Fluke Gale 1" Ability { id: "8AB2", source: "Ketuduke" } +1062.0 "Fluke Gale 2" Ability { id: "8AB3", source: "Ketuduke" } +1065.0 "Saturate" Ability { id: "8AAC", source: "Spring Crystal" } +1065.1 "Hydrobullet/Hydrofall" Ability { id: "(8ABA|8AB7)", source: "Ketuduke" } + +1074.0 "Hydrofall/Hydrobullet (buff)" Ability { id: "(8AB4|8AB8)", source: "Ketuduke" } +1077.1 "Hydrobullet/Hydrofall (buff)" Ability { id: "(8C6D|8AB5)", source: "Ketuduke" } +1084.3 "Blowing Bubbles" Ability { id: "8ABD", source: "Ketuduke" } +1091.4 "Hydrobomb x3" Ability { id: "8AD0", source: "Ketuduke" } +1096.3 "Hydrofall/Hydrobullet" Ability { id: "(8AB7|8ABA)", source: "Ketuduke" } +1099.6 "Hydrobomb x3" Ability { id: "8AD0", source: "Ketuduke" } +1102.5 "Hydrobullet/Hydrobullet" Ability { id: "(8ABA|8AB7)", source: "Ketuduke" } + +1113.6 "Hydrofall (buff)" Ability { id: "8AB4", source: "Ketuduke" } +1118.9 "Strewn Bubbles" Ability { id: "8ABB", source: "Ketuduke" } +1130.3 "Receding Twintides/Encroaching Twintides" Ability { id: "(8ACC|8ACE)", source: "Ketuduke" } +1130.9 "Sphere Shatter 1" Ability { id: "8ABC", source: "Ketuduke" } +1133.4 "Far Tide/Near Tide" Ability { id: "(8ACF|8ACD)", source: "Ketuduke" } +1134.0 "Sphere Shatter 2" Ability { id: "8ABC", source: "Ketuduke" } +1134.0 "Hydrofall" Ability { id: "8AB7", source: "Ketuduke" } + +1143.7 "Hydrobullet (buff)" Ability { id: "8AB8", source: "Ketuduke" } +1149.7 "Roar" Ability { id: "8AC4", source: "Ketuduke" } +1154.6 "Spring Crystals 2" Ability { id: "8AA8", source: "Ketuduke" } +1164.6 "Bubble Net" Ability { id: "8AC5", source: "Ketuduke" } +1177.0 "Hydrobullet" Ability { id: "8ABA", source: "Ketuduke" } +1177.6 "Saturate" Ability { id: "8AAC", source: "Spring Crystal" } +1182.7 "Updraft" Ability { id: "8AC7", source: "Ketuduke" } +1184.1 "Hundred Lashings" Ability { id: "8ACA", source: "Aloalo Zaratan" } + +1190.7 "--middle--" Ability { id: "8A77", source: "Ketuduke" } +1199.4 "Hydrofall/Hydrobullet (buff)" Ability { id: "(8AB4|8AB8)", source: "Ketuduke" } +1202.4 "Hydrobullet/Hydrofall (buff)" Ability { id: "(8C6D|8AB5)", source: "Ketuduke" } +1210.4 "Angry Seas" Ability { id: "8AC1", source: "Ketuduke" } +1211.6 "Hydrofall/Hydrobullet" Ability { id: "(8AB7|8ABA)", source: "Ketuduke" } +1212.2 "Hydrobullet/Hydrobullet" Ability { id: "(8ABA|8AB7)" } # this sometimes has the wrong source +1214.8 "Spring Crystals 3" Ability { id: "8AA8", source: "Ketuduke" } +1216.8 "Hydrobullet" Ability { id: "8ABA", source: "Ketuduke" } +1221.8 "Bubble Net" Ability { id: "8AAD", source: "Ketuduke" } +1227.8 "Fluke Typhoon (cast)" Ability { id: "8AAF", source: "Ketuduke" } +1233.8 "Fluke Typhoon" Ability { id: "8AB0", source: "Ketuduke" } +1236.4 "Saturate" Ability { id: "8AAB", source: "Spring Crystal" } +1238.8 "Burst x4" Ability { id: "8AC2", source: "Ketuduke" } + +1246.7 "Spring Crystals 4" Ability { id: "8AA8", source: "Ketuduke" } +1253.7 "Bubble Net" Ability { id: "8AAD", source: "Ketuduke" } +1260.7 "Hydrobullet/Hydrofall (buff)" Ability { id: "(8AB8|8AB4)", source: "Ketuduke" } +1269.8 "Fluke Gale (cast)" Ability { id: "8AB1", source: "Ketuduke" } +1279.9 "Fluke Gale 1" Ability { id: "8AB2", source: "Ketuduke" } +1281.9 "Fluke Gale 2" Ability { id: "8AB3", source: "Ketuduke" } +1284.9 "Saturate" Ability { id: "8AAC", source: "Spring Crystal" } +1285.0 "Hydrobullet/Hydrofall" Ability { id: "(8ABA|8AB7)", source: "Ketuduke" } + +1293.9 "Hydrofall (buff)" Ability { id: "8AB4", source: "Ketuduke" } +1299.2 "Strewn Bubbles" Ability { id: "8ABB", source: "Ketuduke" } +1310.6 "Receding Twintides/Encroaching Twintides" Ability { id: "(8ACC|8ACE)", source: "Ketuduke" } +1311.2 "Sphere Shatter 1" Ability { id: "8ABC", source: "Ketuduke" } +1313.7 "Far Tide/Near Tide" Ability { id: "(8ACF|8ACD)", source: "Ketuduke" } +1314.3 "Sphere Shatter 2" Ability { id: "8ABC", source: "Ketuduke" } +1314.3 "Hydrofall" Ability { id: "8AB7", source: "Ketuduke" } # ??? # ALL ENCOUNTER ABILITIES @@ -146,79 +146,79 @@ hideall "--sync--" # -ii 888F 8892 8CDF 889A 889B 88A8 889C 889D # The Dusk Trial will be sealed off -2000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1147:/ window 10000,0 -2006.1 "--sync--" sync / 14:[^:]*:Lala:88AE:/ window 20,20 -2011.1 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ - -2013.2 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ -2018.3 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8889|8D2E):/ -2026.4 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(888B|888C|888D|888E):/ - -2029.6 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ -2034.7 "Analysis" sync / 1[56]:[^:]*:Lala:8895:/ -2039.8 "Arcane Array 1" sync / 1[56]:[^:]*:Lala:8890:/ -2044.9 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8889|8D2E):/ -2045.6 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8891:/ -2046.9 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:8894:/ -2053.0 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(888B|888C|888D|888E):/ +2000.0 "--sync--" SystemLogMessage { id: "7DC", param1: "1147" } window 10000,0 +2006.1 "--sync--" StartsUsing { id: "88AE", source: "Lala" } window 20,20 +2011.1 "Inferno Theorem" Ability { id: "88AE", source: "Lala" } + +2013.2 "--middle--" Ability { id: "8874", source: "Lala" } +2018.3 "Angular Addition" Ability { id: "(8889|8D2E)", source: "Lala" } +2026.4 "Arcane Blight" Ability { id: "(888B|888C|888D|888E)", source: "Lala" } + +2029.6 "--middle--" Ability { id: "8874", source: "Lala" } +2034.7 "Analysis" Ability { id: "8895", source: "Lala" } +2039.8 "Arcane Array 1" Ability { id: "8890", source: "Lala" } +2044.9 "Angular Addition" Ability { id: "(8889|8D2E)", source: "Lala" } +2045.6 "Bright Pulse" Ability { id: "8891", source: "Lala" } +2046.9 "Radiance 1" Ability { id: "8894", source: "Arcane Globe" } +2053.0 "Arcane Blight" Ability { id: "(888B|888C|888D|888E)", source: "Lala" } # This can be +1.2s if it's on the final square instead of penultimate. -2054.1 "Radiance 2" #sync / 1[56]:[^:]*:Arcane Globe:8894:/ -2061.2 "Targeted Light" sync / 1[56]:[^:]*:Lala:8CDE:/ - -2072.5 "Strategic Strike" sync / 1[56]:[^:]*:Lala:88AD:/ - -2085.6 "Planar Tactics" sync / 1[56]:[^:]*:Lala:8898:/ -2100.7 "Arcane Mine" sync / 1[56]:[^:]*:Lala:8899:/ -2108.6 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:889E:/ - -2112.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ -2122.9 "Strategic Strike" sync / 1[56]:[^:]*:Lala:88AD:/ - -2131.1 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ -2138.3 "Spatial Tactics" sync / 1[56]:[^:]*:Lala:88A0:/ -2143.4 "Arcane Array 2" sync / 1[56]:[^:]*:Lala:889F:/ -2149.2 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8891:/ -2150.5 "Inferno Divide 1" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 -2150.5 "Radiance" sync / 1[56]:[^:]*:Arcane Globe:8D1F:/ -2152.9 "Inferno Divide 2" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 -2156.6 "Inferno Divide 3" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 -2157.6 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8889|8D2E):/ -2157.8 "Inferno Divide 4" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 -2160.2 "Inferno Divide 5" sync / 1[56]:[^:]*:Arcane Font:8893:/ window 1,1 -2165.6 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(888B|888C|888D|888E):/ - -2173.7 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ -2184.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ - -2196.9 "Symmetric Surge" sync / 1[56]:[^:]*:Lala:88A1:/ -2202.0 "Constructive Figure" sync / 1[56]:[^:]*:Lala:88A3:/ -2207.1 "Arcane Plot" sync / 1[56]:[^:]*:Lala:88A2:/ -2212.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8891:/ -2221.2 "Arcane Point" sync / 1[56]:[^:]*:Lala:88A5:/ -2221.8 "Aero II" sync / 1[56]:[^:]*:Aloalo Golem:88A4:/ -2222.0 "Powerful Light" sync / 1[56]:[^:]*:Lala:88A6:/ -2230.3 "Explosive Theorem" sync / 1[56]:[^:]*:Lala:88A7:/ -2234.7 "Symmetric Surge x2" sync / 1[56]:[^:]*:Lala:889E:/ -2235.4 "Telluric Theorem" sync / 1[56]:[^:]*:Lala:88A9:/ - -2248.4 "Strategic Strike" sync / 1[56]:[^:]*:Lala:88AD:/ -2256.5 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ - -2263.6 "--middle--" sync / 1[56]:[^:]*:Lala:8874:/ -2269.0 "Analysis" sync / 1[56]:[^:]*:Lala:8895:/ -2274.1 "Arcane Array 3" sync / 1[56]:[^:]*:Lala:8890:/ -2279.2 "Angular Addition" sync / 1[56]:[^:]*:Lala:(8889|8D2E):/ -2279.9 "Bright Pulse" sync / 1[56]:[^:]*:Lala:8891:/ -2281.2 "Radiance 1" sync / 1[56]:[^:]*:Arcane Globe:8894:/ -2287.3 "Arcane Blight" sync / 1[56]:[^:]*:Lala:(888B|888C|888D|888E):/ -2290.9 "Radiance 2" sync / 1[56]:[^:]*:Arcane Globe:8894:/ -2295.6 "Targeted Light" sync / 1[56]:[^:]*:Lala:8CDE:/ -2306.7 "Strategic Strike" sync / 1[56]:[^:]*:Lala:88AD:/ - -2316.8 "Inferno Theorem" sync / 1[56]:[^:]*:Lala:88AE:/ - -2319.9 "--sync--" sync / 14:[^:]*:Lala:8C25:/ window 20,20 -2329.9 "Inferno Theorem Enrage" sync / 1[56]:[^:]*:Lala:8C25:/ +2054.1 "Radiance 2" #Ability { id: "8894", source: "Arcane Globe" } +2061.2 "Targeted Light" Ability { id: "8CDE", source: "Lala" } + +2072.5 "Strategic Strike" Ability { id: "88AD", source: "Lala" } + +2085.6 "Planar Tactics" Ability { id: "8898", source: "Lala" } +2100.7 "Arcane Mine" Ability { id: "8899", source: "Lala" } +2108.6 "Symmetric Surge x2" Ability { id: "889E", source: "Lala" } + +2112.8 "Inferno Theorem" Ability { id: "88AE", source: "Lala" } +2122.9 "Strategic Strike" Ability { id: "88AD", source: "Lala" } + +2131.1 "--middle--" Ability { id: "8874", source: "Lala" } +2138.3 "Spatial Tactics" Ability { id: "88A0", source: "Lala" } +2143.4 "Arcane Array 2" Ability { id: "889F", source: "Lala" } +2149.2 "Bright Pulse" Ability { id: "8891", source: "Lala" } +2150.5 "Inferno Divide 1" Ability { id: "8893", source: "Arcane Font" } window 1,1 +2150.5 "Radiance" Ability { id: "8D1F", source: "Arcane Globe" } +2152.9 "Inferno Divide 2" Ability { id: "8893", source: "Arcane Font" } window 1,1 +2156.6 "Inferno Divide 3" Ability { id: "8893", source: "Arcane Font" } window 1,1 +2157.6 "Angular Addition" Ability { id: "(8889|8D2E)", source: "Lala" } +2157.8 "Inferno Divide 4" Ability { id: "8893", source: "Arcane Font" } window 1,1 +2160.2 "Inferno Divide 5" Ability { id: "8893", source: "Arcane Font" } window 1,1 +2165.6 "Arcane Blight" Ability { id: "(888B|888C|888D|888E)", source: "Lala" } + +2173.7 "Inferno Theorem" Ability { id: "88AE", source: "Lala" } +2184.8 "Inferno Theorem" Ability { id: "88AE", source: "Lala" } + +2196.9 "Symmetric Surge" Ability { id: "88A1", source: "Lala" } +2202.0 "Constructive Figure" Ability { id: "88A3", source: "Lala" } +2207.1 "Arcane Plot" Ability { id: "88A2", source: "Lala" } +2212.9 "Bright Pulse" Ability { id: "8891", source: "Lala" } +2221.2 "Arcane Point" Ability { id: "88A5", source: "Lala" } +2221.8 "Aero II" Ability { id: "88A4", source: "Aloalo Golem" } +2222.0 "Powerful Light" Ability { id: "88A6", source: "Lala" } +2230.3 "Explosive Theorem" Ability { id: "88A7", source: "Lala" } +2234.7 "Symmetric Surge x2" Ability { id: "889E", source: "Lala" } +2235.4 "Telluric Theorem" Ability { id: "88A9", source: "Lala" } + +2248.4 "Strategic Strike" Ability { id: "88AD", source: "Lala" } +2256.5 "Inferno Theorem" Ability { id: "88AE", source: "Lala" } + +2263.6 "--middle--" Ability { id: "8874", source: "Lala" } +2269.0 "Analysis" Ability { id: "8895", source: "Lala" } +2274.1 "Arcane Array 3" Ability { id: "8890", source: "Lala" } +2279.2 "Angular Addition" Ability { id: "(8889|8D2E)", source: "Lala" } +2279.9 "Bright Pulse" Ability { id: "8891", source: "Lala" } +2281.2 "Radiance 1" Ability { id: "8894", source: "Arcane Globe" } +2287.3 "Arcane Blight" Ability { id: "(888B|888C|888D|888E)", source: "Lala" } +2290.9 "Radiance 2" Ability { id: "8894", source: "Arcane Globe" } +2295.6 "Targeted Light" Ability { id: "8CDE", source: "Lala" } +2306.7 "Strategic Strike" Ability { id: "88AD", source: "Lala" } + +2316.8 "Inferno Theorem" Ability { id: "88AE", source: "Lala" } + +2319.9 "--sync--" StartsUsing { id: "8C25", source: "Lala" } window 20,20 +2329.9 "Inferno Theorem Enrage" Ability { id: "8C25", source: "Lala" } # ALL ENCOUNTER ABILITIES @@ -271,71 +271,71 @@ hideall "--sync--" # -ii 8947 8925 8926 895A 895B 894C 8987 8A6A 895F 8960 8CC2 8982 8CBE 89F9 8C24 8957 8958 # Midnight Trial will be sealed off -3000.0 "--sync--" sync / 29:[^:]*:7DC:[^:]*:1148:/ window 10000,0 -3008.8 "--sync--" sync / 14:[^:]*:Statice:8949:/ window 20,20 -3013.8 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ - -3018.0 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3023.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:894A:/ -3038.2 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8D1A:/ -3048.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:894B:/ -3056.5 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ -3070.6 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8959:/ -3074.6 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ - -3081.8 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3087.4 "Trick Reload" sync / 1[56]:[^:]*:Statice:894A:/ -3101.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ -3106.3 "Dartboard of Dancing Explosives " sync / 1[56]:[^:]*:Statice:8CBD:/ -3120.1 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8959:/ -3122.0 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ -3125.3 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:8954:/ - -3132.3 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3137.7 "Surprise Balloon" sync / 1[56]:[^:]*:Statice:894D:/ -3144.8 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:8963:/ -3149.8 "Surprise Needle 1" #sync / 1[56]:[^:]*:Needle:894F:/ -3150.7 "Pop 1" sync / 1[56]:[^:]*:Statice:894E:/ -3151.5 "Surprise Needle 2" #sync / 1[56]:[^:]*:Needle:894F:/ -3152.4 "Trigger Happy" sync / 1[56]:[^:]*:Statice:894B:/ -3153.2 "Surprise Needle 3" #sync / 1[56]:[^:]*:Needle:894F:/ -3154.9 "Surprise Needle 4" #sync / 1[56]:[^:]*:Needle:894F:/ -3155.6 "Pop 2" sync / 1[56]:[^:]*:Statice:894E:/ -3160.4 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8959:/ - -3172.5 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ -3179.7 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3184.1 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ -3189.2 "Present Box 1" sync / 1[56]:[^:]*:Statice:8955:/ -3194.3 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:895E:/ -3204.0 "Fireworks" sync / 1[56]:[^:]*:Statice:895F:/ -3204.2 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ -3204.3 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:8956:/ -3212.5 "Shocking Abandon" sync / 1[56]:[^:]*:Statice:8948:/ - -3222.7 "Pinwheeling Dartboard" sync / 1[56]:[^:]*:Statice:8CBC:/ -3231.4 "Fireworks (cast)" sync / 1[56]:[^:]*:Statice:895E:/ -3233.4 "Fire Spread" sync / 1[56]:[^:]*:Statice:8952:/ duration 11 -3241.3 "Fireworks" sync / 1[56]:[^:]*:Statice:895F:/ -3241.6 "Uncommon Ground" sync / 1[56]:[^:]*:Statice:8954:/ -3253.6 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ - -3260.8 "--middle--" sync / 1[56]:[^:]*:Statice:8927:/ -3266.5 "Beguiling Glitter" sync / 1[56]:[^:]*:Statice:8963:/ -3273.6 "Trick Reload" sync / 1[56]:[^:]*:Statice:894A:/ -3288.4 "Trapshooting 1" sync / 1[56]:[^:]*:Statice:8D1A:/ -3295.5 "Present Box 2" sync / 1[56]:[^:]*:Statice:8955:/ -3302.2 "Ring a Ring o' Explosions" sync / 1[56]:[^:]*:Statice:895C:/ -3309.6 "Trigger Happy" sync / 1[56]:[^:]*:Statice:894B:/ -3310.2 "Faerie Ring" sync / 1[56]:[^:]*:Surprising Staff:8956:/ -3316.5 "Trapshooting 2" sync / 1[56]:[^:]*:Statice:8959:/ -3320.4 "Burst" sync / 1[56]:[^:]*:Bomb:895D:/ - -3327.6 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ -3335.7 "Aero IV" sync / 1[56]:[^:]*:Statice:8949:/ - -3338.8 "--sync--" sync / 14:[^:]*:Statice:8C23:/ -3348.8 "Aero IV Enrage" sync / 1[56]:[^:]*:Statice:8C23:/ +3000.0 "--sync--" SystemLogMessage { id: "7DC", param1: "1148" } window 10000,0 +3008.8 "--sync--" StartsUsing { id: "8949", source: "Statice" } window 20,20 +3013.8 "Aero IV" Ability { id: "8949", source: "Statice" } + +3018.0 "--middle--" Ability { id: "8927", source: "Statice" } +3023.4 "Trick Reload" Ability { id: "894A", source: "Statice" } +3038.2 "Trapshooting 1" Ability { id: "8D1A", source: "Statice" } +3048.6 "Trigger Happy" Ability { id: "894B", source: "Statice" } +3056.5 "Ring a Ring o' Explosions" Ability { id: "895C", source: "Statice" } +3070.6 "Trapshooting 2" Ability { id: "8959", source: "Statice" } +3074.6 "Burst" Ability { id: "895D", source: "Bomb" } + +3081.8 "--middle--" Ability { id: "8927", source: "Statice" } +3087.4 "Trick Reload" Ability { id: "894A", source: "Statice" } +3101.2 "Ring a Ring o' Explosions" Ability { id: "895C", source: "Statice" } +3106.3 "Dartboard of Dancing Explosives " Ability { id: "8CBD", source: "Statice" } +3120.1 "Trapshooting 1" Ability { id: "8959", source: "Statice" } +3122.0 "Burst" Ability { id: "895D", source: "Bomb" } +3125.3 "Uncommon Ground" Ability { id: "8954", source: "Statice" } + +3132.3 "--middle--" Ability { id: "8927", source: "Statice" } +3137.7 "Surprise Balloon" Ability { id: "894D", source: "Statice" } +3144.8 "Beguiling Glitter" Ability { id: "8963", source: "Statice" } +3149.8 "Surprise Needle 1" #Ability { id: "894F", source: "Needle" } +3150.7 "Pop 1" Ability { id: "894E", source: "Statice" } +3151.5 "Surprise Needle 2" #Ability { id: "894F", source: "Needle" } +3152.4 "Trigger Happy" Ability { id: "894B", source: "Statice" } +3153.2 "Surprise Needle 3" #Ability { id: "894F", source: "Needle" } +3154.9 "Surprise Needle 4" #Ability { id: "894F", source: "Needle" } +3155.6 "Pop 2" Ability { id: "894E", source: "Statice" } +3160.4 "Trapshooting 2" Ability { id: "8959", source: "Statice" } + +3172.5 "Aero IV" Ability { id: "8949", source: "Statice" } +3179.7 "--middle--" Ability { id: "8927", source: "Statice" } +3184.1 "Ring a Ring o' Explosions" Ability { id: "895C", source: "Statice" } +3189.2 "Present Box 1" Ability { id: "8955", source: "Statice" } +3194.3 "Fireworks (cast)" Ability { id: "895E", source: "Statice" } +3204.0 "Fireworks" Ability { id: "895F", source: "Statice" } +3204.2 "Burst" Ability { id: "895D", source: "Bomb" } +3204.3 "Faerie Ring" Ability { id: "8956", source: "Surprising Staff" } +3212.5 "Shocking Abandon" Ability { id: "8948", source: "Statice" } + +3222.7 "Pinwheeling Dartboard" Ability { id: "8CBC", source: "Statice" } +3231.4 "Fireworks (cast)" Ability { id: "895E", source: "Statice" } +3233.4 "Fire Spread" Ability { id: "8952", source: "Statice" } duration 11 +3241.3 "Fireworks" Ability { id: "895F", source: "Statice" } +3241.6 "Uncommon Ground" Ability { id: "8954", source: "Statice" } +3253.6 "Aero IV" Ability { id: "8949", source: "Statice" } + +3260.8 "--middle--" Ability { id: "8927", source: "Statice" } +3266.5 "Beguiling Glitter" Ability { id: "8963", source: "Statice" } +3273.6 "Trick Reload" Ability { id: "894A", source: "Statice" } +3288.4 "Trapshooting 1" Ability { id: "8D1A", source: "Statice" } +3295.5 "Present Box 2" Ability { id: "8955", source: "Statice" } +3302.2 "Ring a Ring o' Explosions" Ability { id: "895C", source: "Statice" } +3309.6 "Trigger Happy" Ability { id: "894B", source: "Statice" } +3310.2 "Faerie Ring" Ability { id: "8956", source: "Surprising Staff" } +3316.5 "Trapshooting 2" Ability { id: "8959", source: "Statice" } +3320.4 "Burst" Ability { id: "895D", source: "Bomb" } + +3327.6 "Aero IV" Ability { id: "8949", source: "Statice" } +3335.7 "Aero IV" Ability { id: "8949", source: "Statice" } + +3338.8 "--sync--" StartsUsing { id: "8C23", source: "Statice" } +3348.8 "Aero IV Enrage" Ability { id: "8C23", source: "Statice" } # ALL ENCOUNTER ABILITIES From 97bb3f4b7307c6bf154a92b45582dacd6690e733 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Mon, 4 Dec 2023 11:28:23 -0800 Subject: [PATCH 30/39] test new op lines --- .../dungeon/another_aloalo_island-savage.ts | 415 +++++++++++++++++- .../06-ew/dungeon/another_aloalo_island.ts | 415 +++++++++++++++++- 2 files changed, 806 insertions(+), 24 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 029dcef53e..395581078a 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -36,8 +36,17 @@ export interface Data extends RaidbossData { lalaSubAlpha: NetMatches['GainsEffect'][]; staticeBullet: NetMatches['Ability'][]; staticeTriggerHappy?: number; - staticeTrapshooting: ('stack' | 'spread')[]; + staticeTrapshooting: ('stack' | 'spread' | undefined)[]; staticeDart: NetMatches['GainsEffect'][]; + staticeBombRotateCount: number; + staticeBomb: NetMatches['AddedCombatant'][]; + staticeBombTether: NetMatches['SpawnNpcExtra'][]; + staticeSafeBombIds: string[]; + staticePresentBoxCount: number; + staticePresentBox1StackSpot?: number; + staticePresentBox1TopOfTriangleDir?: number; + staticeMissileCollect: NetMatches['AddedCombatant'][]; + staticeMissileIdToDir: { [id: string]: number }; staticeMissileTether: NetMatches['Tether'][]; staticeClawTether: NetMatches['Tether'][]; staticeIsPinwheelingDartboard?: boolean; @@ -56,6 +65,19 @@ const headmarkerIds = { enumeration: '015B', } as const; +const xyTo5DirBombNum = (x: number, y: number): number => { + // Six bombs are in a pentagram with one in the middle. + // N = 0, NE = 1, SE = 2, SW = 3, NW = 4, Center = 5 + const centerX = -200; + const centerY = 0; + x = x - centerX; + y = y - centerY; + if (Math.abs(x) < 1 && Math.abs(y) < 1) + return 5; + // Find the closest spoke of the pentagram. + return Math.round(2.5 - 2.5 * Math.atan2(x, y) / Math.PI) % 5; +}; + const triggerSet: TriggerSet = { id: 'AnotherAloaloIslandSavage', zoneId: ZoneId.AnotherAloaloIslandSavage, @@ -72,6 +94,13 @@ const triggerSet: TriggerSet = { staticeBullet: [], staticeTrapshooting: [], staticeDart: [], + staticeBombRotateCount: 0, + staticeBomb: [], + staticeBombTether: [], + staticeSafeBombIds: [], + staticePresentBoxCount: 0, + staticeMissileCollect: [], + staticeMissileIdToDir: {}, staticeMissileTether: [], staticeClawTether: [], staticeDartboardTether: [], @@ -981,6 +1010,141 @@ const triggerSet: TriggerSet = { num6: Outputs.num6, }, }, + { + id: 'AAIS Statice Ring a Ring o\' Explosions Cleanup', + type: 'StartsUsing', + netRegex: { id: '8979', source: 'Statice', capture: false }, + run: (data) => { + data.staticeBomb = []; + data.staticeBombTether = []; + data.staticeSafeBombIds = []; + }, + }, + { + id: 'AAIS Statice Bomb Add', + type: 'AddedCombatant', + netRegex: { npcNameId: '12520' }, + run: (data, matches) => data.staticeBomb.push(matches), + }, + { + id: 'AAIS Statice Bomb Tether', + type: 'SpawnNpcExtra', + netRegex: {}, + run: (data, matches) => data.staticeBombTether.push(matches), + }, + { + id: 'AAIS Statice Bomb Activate', + type: 'ActorControlExtra', + netRegex: { param2: '00000001' }, + run: (data, matches) => { + const activeBombIds: string[] = []; + + const idToNpcSpawnExtra: { [id: string]: NetMatches['SpawnNpcExtra'] } = {}; + for (const npcSpawnExtra of data.staticeBombTether) + idToNpcSpawnExtra[npcSpawnExtra.sourceId] = npcSpawnExtra; + + let currentBomb = matches.sourceId; + for (let i = 0; i < 3; ++i) { + const npcSpawnExtra = idToNpcSpawnExtra[currentBomb]; + if (npcSpawnExtra === undefined) + break; + currentBomb = npcSpawnExtra?.parentActorId; + activeBombIds.push(currentBomb); + } + + // TODO: validate all bombs are in the add lines too. + if (activeBombIds.length !== 3 || !activeBombIds.includes(matches.sourceId)) { + console.error('Failed to find active bombs'); + console.error(JSON.stringify(data.staticeBomb)); + console.error(JSON.stringify(data.staticeBombTether)); + console.error(JSON.stringify(activeBombIds)); + } else { + const validBombIds = data.staticeBomb.map((x) => x.id); + data.staticeSafeBombIds = validBombIds.filter((id) => !activeBombIds.includes(id)); + } + }, + }, + { + id: 'AAIS Statice Bomb Count', + type: 'Ability', + netRegex: { id: '8A6A' }, + run: (data, matches) => { + const firstBomb = data.staticeSafeBombIds[0]; + if (matches.targetId === firstBomb) + data.staticeBombRotateCount++; + }, + }, + { + id: 'AAIS Statice Bomb Rotate Final', + type: 'Ability', + netRegex: { id: '8A6A', capture: false }, + delaySeconds: 4, + durationSeconds: 6, + suppressSeconds: 10, + alertText: (data, _matches, output) => { + if (data.staticeSafeBombIds.length !== 3) + return; + + const bombToDir: { [id: string]: number } = {}; + for (const id of data.staticeSafeBombIds) { + const addLine = data.staticeBomb.find((x) => x.id === id); + if (addLine === undefined) + break; + const x = parseFloat(addLine.x); + const y = parseFloat(addLine.y); + bombToDir[id] = xyTo5DirBombNum(x, y); + } + + // Sort bomb ids from original north and clockwise to be consistent in callout. + // This makes it possible to consistently go to the same place as a group. + const sortedIds = [...data.staticeSafeBombIds].sort((a, b) => { + return (bombToDir[a] ?? 0) - (bombToDir[b] ?? 0); + }); + + const safeSpots = sortedIds.map((id) => { + const dir = bombToDir[id]; + if (dir === undefined) + return output.unknown!(); + if (dir === 5) + return output.center!(); + return { + 0: output.dirN!(), + 1: output.dirNE!(), + 2: output.dirSE!(), + 3: output.dirSW!(), + 4: output.dirNW!(), + }[(dir + data.staticeBombRotateCount) % 5] ?? output.unknown!(); + }); + + const mech = output[data.staticeTrapshooting.shift() ?? 'unknown']!(); + // This is kinda hacky, but in order to suppress the next trapshooting call, + // replace the mech we just shifted off with an undefined. + data.staticeTrapshooting.unshift(undefined); + + if (sortedIds.find((id) => bombToDir[id] === 5) !== undefined) + return output.middleSafe!({ spots: safeSpots, mech: mech }); + return output.middleUnsafe!({ spots: safeSpots, mech: mech }); + }, + outputStrings: { + middleSafe: { + en: '${spots} => ${mech}', + }, + middleUnsafe: { + en: '${spots} (middle unsafe) => ${mech}', + }, + dirN: Outputs.dirN, + dirNE: Outputs.dirNE, + dirSE: Outputs.dirSE, + dirSW: Outputs.dirSW, + dirNW: Outputs.dirNW, + center: { + en: 'Center', + }, + spread: Outputs.spread, + stack: Outputs.stackMarker, + unknown: Outputs.unknown, + }, + }, { id: 'AAIS Statice Bull\'s-eye', type: 'GainsEffect', @@ -1110,6 +1274,176 @@ const triggerSet: TriggerSet = { unknown: Outputs.unknown, }, }, + { + id: 'AAIS Statice Present Box Counter', + // This happens ~1s prior to ActorControlExtra on bomb. + type: 'StartsUsing', + netRegex: { id: '8972', source: 'Statice', capture: false }, + run: (data) => data.staticePresentBoxCount++, + }, + { + id: 'AAIS Statice Present Box One Triangle', + type: 'ActorControlExtra', + // TODO: we could do this call even before the glow with the tethers by treating + // the middle bomb as glowing, but that'd be extra work for little benefit. + netRegex: { param2: '00000001', capture: false }, + condition: (data) => data.staticePresentBoxCount === 1, + infoText: (data, _matches, output) => { + if (data.staticeSafeBombIds.length !== 3) + return; + + const bombToDir: { [id: string]: number } = {}; + for (const id of data.staticeSafeBombIds) { + const addLine = data.staticeBomb.find((x) => x.id === id); + if (addLine === undefined) + break; + const x = parseFloat(addLine.x); + const y = parseFloat(addLine.y); + bombToDir[id] = xyTo5DirBombNum(x, y); + } + + const sortedBombDirs = data.staticeSafeBombIds.map((x) => bombToDir[x]).sort(); + + for (const start of [0, 1, 2]) { + const dir1 = sortedBombDirs[start]; + const dir2 = sortedBombDirs[(start + 1) % 3]; + const dir3 = sortedBombDirs[(start + 2) % 3]; + if (dir1 === undefined || dir2 === undefined || dir3 === undefined) + return; + + if ((dir1 + 1) % 5 !== dir2) + continue; + if ((dir2 + 1) % 5 !== dir3) { + // If we get here, then dir1 and dir2 are adjacent to each other, but not dir3. + // Save this work off for the missiles later. + data.staticePresentBox1TopOfTriangleDir = (dir2 + 2) % 5; + continue; + } + + data.staticePresentBox1TopOfTriangleDir = dir2; + data.staticePresentBox1StackSpot = dir2; + + // dir2 is in the middle + const outputDir = { + 0: output.dirN!(), + 1: output.dirNE!(), + 2: output.dirSE!(), + 3: output.dirSW!(), + 4: output.dirNW!(), + }[dir2]; + return output.text!({ dir: outputDir }); + } + }, + outputStrings: { + text: { + en: '(stack is at ${dir})', + }, + dirN: Outputs.dirN, + dirNE: Outputs.dirNE, + dirSE: Outputs.dirSE, + dirSW: Outputs.dirSW, + dirNW: Outputs.dirNW, + }, + }, + { + id: 'AAIS Statice Surprising Missile Collect', + type: 'AddedCombatant', + netRegex: { npcNameId: '12517' }, + run: (data, matches) => { + data.staticeMissileCollect.push(matches); + if (data.staticeMissileCollect.length !== 2) + return; + + // TODO: this is maybe duplicated too much, but it does extra work here? + const bombToDir: { [id: string]: number } = {}; + const bombToPos: { [id: string]: { x: number; y: number } } = {}; + let topBombPos: { x: number; y: number } | undefined; + for (const id of data.staticeSafeBombIds) { + const addLine = data.staticeBomb.find((x) => x.id === id); + if (addLine === undefined) + break; + const x = parseFloat(addLine.x); + const y = parseFloat(addLine.y); + const dir = xyTo5DirBombNum(x, y); + bombToDir[id] = dir; + bombToPos[id] = { x, y }; + if (dir === data.staticePresentBox1TopOfTriangleDir) + topBombPos = { x, y }; + } + + const topBombDir = data.staticePresentBox1TopOfTriangleDir; + if (topBombPos === undefined || topBombDir === undefined) + return; + + // If we already know the stack spot, eliminate it from the valid safe dirs to avoid any logic errors later. + const stackDir = data.staticePresentBox1StackSpot; + const nonStackBombIds = data.staticeSafeBombIds.filter((id) => bombToDir[id] !== stackDir); + + // For the intersecting triangle case, find the missile furthest from the top of the triangle + // and tell them to go there. It sure seems like missiles need to run north/south along + // the long direction of this safe triangle of bombs to break the tether, so even if the + // missiles are lateral (relatively) and the furthest two spots are the bottom of the triangle + // they need to still go N/S (relative). + const missileDirs: number[] = []; + if (stackDir === undefined) { + let furthestMissileId: string | undefined; + let furthestDistanceSqr: number | undefined; + for (const missile of data.staticeMissileCollect) { + const xDiff = parseFloat(missile.x) - topBombPos.x; + const yDiff = parseFloat(missile.y) - topBombPos.y; + const distSqr = xDiff * xDiff + yDiff * yDiff; + if (furthestDistanceSqr === undefined || distSqr > furthestDistanceSqr) { + furthestDistanceSqr = distSqr; + furthestMissileId = missile.id; + } + } + if (furthestMissileId === undefined) + return; + missileDirs.push(topBombDir); + data.staticeMissileIdToDir[furthestMissileId] = topBombDir; + } + + // Solve for remaining missiles. + // For the "disconnected triangle" case, this will solve for both, ignoring the middle stack spot. + // For the "intersecting triangle" case, this will solve the remaining missile ignoring the top of the triangle. + for (const missile of data.staticeMissileCollect) { + // if we already solved this one above, ignore it. + if (data.staticeMissileIdToDir[missile.id] !== undefined) + continue; + let furthestDir: number | undefined; + let furthestDistanceSqr: number | undefined; + for (const id of nonStackBombIds) { + const pos = bombToPos[id]; + if (pos === undefined) + return; + const xDiff = parseFloat(missile.x) - pos.x; + const yDiff = parseFloat(missile.y) - pos.y; + const distSqr = xDiff * xDiff + yDiff * yDiff; + if (furthestDistanceSqr === undefined || distSqr > furthestDistanceSqr) { + furthestDistanceSqr = distSqr; + furthestDir = bombToDir[id]; + } + } + + if (furthestDir !== undefined) { + data.staticeMissileIdToDir[missile.id] = furthestDir; + missileDirs.push(furthestDir); + } + } + + if (stackDir !== undefined) + return; + + const safeDirs = data.staticeSafeBombIds.map((id) => bombToDir[id]); + const maybeStackDirs = safeDirs.filter((dir) => + dir !== undefined && !missileDirs.includes(dir) + ); + const [finalStackDir] = maybeStackDirs; + + if (maybeStackDirs.length === 1 && finalStackDir !== undefined) + data.staticePresentBox1StackSpot = finalStackDir; + }, + }, { id: 'AAIS Statice Present Box Missile', type: 'Tether', @@ -1119,18 +1453,54 @@ const triggerSet: TriggerSet = { return data.staticeMissileTether.length === 2 ? 0 : 0.5; }, durationSeconds: 7, - alertText: (data, _matches, output) => { + response: (data, _matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + missileOnYou: { + en: 'Bait Tethers => Missile Spread', + }, + missileOnYouDir: { + en: 'Bait Tethers => Missile Spread ${dir}', + }, + stackAt: { + en: '(stack is at ${dir})', + }, + dirN: Outputs.dirN, + dirNE: Outputs.dirNE, + dirSE: Outputs.dirSE, + dirSW: Outputs.dirSW, + dirNW: Outputs.dirNW, + }; + if (data.staticeMissileTether.length !== 2) return; - if (data.staticeMissileTether.map((x) => x.target).includes(data.me)) - return output.missileOnYou!(); + + const missileTether = data.staticeMissileTether.find((x) => x.target === data.me); + if (missileTether === undefined) + return; + + const dirToStr: { [dir: number]: string } = { + 0: output.dirN!(), + 1: output.dirNE!(), + 2: output.dirSE!(), + 3: output.dirSW!(), + 4: output.dirNW!(), + } as const; + + let infoText: string | undefined; + const stackDir = data.staticePresentBox1StackSpot; + if (stackDir !== undefined) + infoText = output.stackAt!({ dir: dirToStr[stackDir] }); + + const missileDir = data.staticeMissileIdToDir[missileTether.sourceId]; + if (missileDir === undefined) + return { alertText: output.missileOnYou!(), infoText: infoText }; + return { + alertText: output.missileOnYouDir!({ dir: dirToStr[missileDir] }), + infoText: infoText, + }; }, run: (data) => data.staticeMissileTether = [], - outputStrings: { - missileOnYou: { - en: 'Bait Tethers => Missile Spread', - }, - }, }, { id: 'AAIS Statice Present Box Claw', @@ -1144,14 +1514,35 @@ const triggerSet: TriggerSet = { alertText: (data, _matches, output) => { if (data.staticeClawTether.length !== 2) return; - if (data.staticeClawTether.map((x) => x.target).includes(data.me)) - return output.missileOnYou!(); + if (!data.staticeClawTether.map((x) => x.target).includes(data.me)) + return; + + const dirToStr: { [dir: number]: string } = { + 0: output.dirN!(), + 1: output.dirNE!(), + 2: output.dirSE!(), + 3: output.dirSW!(), + 4: output.dirNW!(), + } as const; + + const stackDir = data.staticePresentBox1StackSpot; + if (stackDir !== undefined) + return output.stackAt!({ dir: dirToStr[stackDir] }); + return output.stack!(); }, run: (data) => data.staticeClawTether = [], outputStrings: { - missileOnYou: { + stack: { en: 'Juke Claw => Stack', }, + stackAt: { + en: 'Juke Claw => Stack ${dir}', + }, + dirN: Outputs.dirN, + dirNE: Outputs.dirNE, + dirSE: Outputs.dirSE, + dirSW: Outputs.dirSW, + dirNW: Outputs.dirNW, }, }, { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 18b833b879..d8881c485b 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -31,8 +31,17 @@ export interface Data extends RaidbossData { lalaSubAlpha: NetMatches['GainsEffect'][]; staticeBullet: NetMatches['Ability'][]; staticeTriggerHappy?: number; - staticeTrapshooting: ('stack' | 'spread')[]; + staticeTrapshooting: ('stack' | 'spread' | undefined)[]; staticeDart: NetMatches['GainsEffect'][]; + staticeBombRotateCount: number; + staticeBomb: NetMatches['AddedCombatant'][]; + staticeBombTether: NetMatches['SpawnNpcExtra'][]; + staticeSafeBombIds: string[]; + staticePresentBoxCount: number; + staticePresentBox1StackSpot?: number; + staticePresentBox1TopOfTriangleDir?: number; + staticeMissileCollect: NetMatches['AddedCombatant'][]; + staticeMissileIdToDir: { [id: string]: number }; staticeMissileTether: NetMatches['Tether'][]; staticeClawTether: NetMatches['Tether'][]; staticeIsPinwheelingDartboard?: boolean; @@ -51,6 +60,19 @@ const headmarkerIds = { enumeration: '015B', } as const; +const xyTo5DirBombNum = (x: number, y: number): number => { + // Six bombs are in a pentagram with one in the middle. + // N = 0, NE = 1, SE = 2, SW = 3, NW = 4, Center = 5 + const centerX = -200; + const centerY = 0; + x = x - centerX; + y = y - centerY; + if (Math.abs(x) < 1 && Math.abs(y) < 1) + return 5; + // Find the closest spoke of the pentagram. + return Math.round(2.5 - 2.5 * Math.atan2(x, y) / Math.PI) % 5; +}; + const triggerSet: TriggerSet = { id: 'AnotherAloaloIsland', zoneId: ZoneId.AnotherAloaloIsland, @@ -67,6 +89,13 @@ const triggerSet: TriggerSet = { staticeBullet: [], staticeTrapshooting: [], staticeDart: [], + staticeBombRotateCount: 0, + staticeBomb: [], + staticeBombTether: [], + staticeSafeBombIds: [], + staticePresentBoxCount: 0, + staticeMissileCollect: [], + staticeMissileIdToDir: {}, staticeMissileTether: [], staticeClawTether: [], staticeDartboardTether: [], @@ -976,6 +1005,141 @@ const triggerSet: TriggerSet = { num6: Outputs.num6, }, }, + { + id: 'AAI Statice Ring a Ring o\' Explosions Cleanup', + type: 'StartsUsing', + netRegex: { id: '895C', source: 'Statice', capture: false }, + run: (data) => { + data.staticeBomb = []; + data.staticeBombTether = []; + data.staticeSafeBombIds = []; + }, + }, + { + id: 'AAI Statice Bomb Add', + type: 'AddedCombatant', + netRegex: { npcNameId: '12520' }, + run: (data, matches) => data.staticeBomb.push(matches), + }, + { + id: 'AAI Statice Bomb Tether', + type: 'SpawnNpcExtra', + netRegex: {}, + run: (data, matches) => data.staticeBombTether.push(matches), + }, + { + id: 'AAI Statice Bomb Activate', + type: 'ActorControlExtra', + netRegex: { param2: '00000001' }, + run: (data, matches) => { + const activeBombIds: string[] = []; + + const idToNpcSpawnExtra: { [id: string]: NetMatches['SpawnNpcExtra'] } = {}; + for (const npcSpawnExtra of data.staticeBombTether) + idToNpcSpawnExtra[npcSpawnExtra.sourceId] = npcSpawnExtra; + + let currentBomb = matches.sourceId; + for (let i = 0; i < 3; ++i) { + const npcSpawnExtra = idToNpcSpawnExtra[currentBomb]; + if (npcSpawnExtra === undefined) + break; + currentBomb = npcSpawnExtra?.parentActorId; + activeBombIds.push(currentBomb); + } + + // TODO: validate all bombs are in the add lines too. + if (activeBombIds.length !== 3 || !activeBombIds.includes(matches.sourceId)) { + console.error('Failed to find active bombs'); + console.error(JSON.stringify(data.staticeBomb)); + console.error(JSON.stringify(data.staticeBombTether)); + console.error(JSON.stringify(activeBombIds)); + } else { + const validBombIds = data.staticeBomb.map((x) => x.id); + data.staticeSafeBombIds = validBombIds.filter((id) => !activeBombIds.includes(id)); + } + }, + }, + { + id: 'AAI Statice Bomb Count', + type: 'Ability', + netRegex: { id: '8A6A' }, + run: (data, matches) => { + const firstBomb = data.staticeSafeBombIds[0]; + if (matches.targetId === firstBomb) + data.staticeBombRotateCount++; + }, + }, + { + id: 'AAI Statice Bomb Rotate Final', + type: 'Ability', + netRegex: { id: '8A6A', capture: false }, + delaySeconds: 4, + durationSeconds: 6, + suppressSeconds: 10, + alertText: (data, _matches, output) => { + if (data.staticeSafeBombIds.length !== 3) + return; + + const bombToDir: { [id: string]: number } = {}; + for (const id of data.staticeSafeBombIds) { + const addLine = data.staticeBomb.find((x) => x.id === id); + if (addLine === undefined) + break; + const x = parseFloat(addLine.x); + const y = parseFloat(addLine.y); + bombToDir[id] = xyTo5DirBombNum(x, y); + } + + // Sort bomb ids from original north and clockwise to be consistent in callout. + // This makes it possible to consistently go to the same place as a group. + const sortedIds = [...data.staticeSafeBombIds].sort((a, b) => { + return (bombToDir[a] ?? 0) - (bombToDir[b] ?? 0); + }); + + const safeSpots = sortedIds.map((id) => { + const dir = bombToDir[id]; + if (dir === undefined) + return output.unknown!(); + if (dir === 5) + return output.center!(); + return { + 0: output.dirN!(), + 1: output.dirNE!(), + 2: output.dirSE!(), + 3: output.dirSW!(), + 4: output.dirNW!(), + }[(dir + data.staticeBombRotateCount) % 5] ?? output.unknown!(); + }); + + const mech = output[data.staticeTrapshooting.shift() ?? 'unknown']!(); + // This is kinda hacky, but in order to suppress the next trapshooting call, + // replace the mech we just shifted off with an undefined. + data.staticeTrapshooting.unshift(undefined); + + if (sortedIds.find((id) => bombToDir[id] === 5) !== undefined) + return output.middleSafe!({ spots: safeSpots, mech: mech }); + return output.middleUnsafe!({ spots: safeSpots, mech: mech }); + }, + outputStrings: { + middleSafe: { + en: '${spots} => ${mech}', + }, + middleUnsafe: { + en: '${spots} (middle unsafe) => ${mech}', + }, + dirN: Outputs.dirN, + dirNE: Outputs.dirNE, + dirSE: Outputs.dirSE, + dirSW: Outputs.dirSW, + dirNW: Outputs.dirNW, + center: { + en: 'Center', + }, + spread: Outputs.spread, + stack: Outputs.stackMarker, + unknown: Outputs.unknown, + }, + }, { id: 'AAI Statice Bull\'s-eye', type: 'GainsEffect', @@ -1105,6 +1269,176 @@ const triggerSet: TriggerSet = { unknown: Outputs.unknown, }, }, + { + id: 'AAI Statice Present Box Counter', + // This happens ~1s prior to ActorControlExtra on bomb. + type: 'StartsUsing', + netRegex: { id: '8955', source: 'Statice', capture: false }, + run: (data) => data.staticePresentBoxCount++, + }, + { + id: 'AAI Statice Present Box One Triangle', + type: 'ActorControlExtra', + // TODO: we could do this call even before the glow with the tethers by treating + // the middle bomb as glowing, but that'd be extra work for little benefit. + netRegex: { param2: '00000001', capture: false }, + condition: (data) => data.staticePresentBoxCount === 1, + infoText: (data, _matches, output) => { + if (data.staticeSafeBombIds.length !== 3) + return; + + const bombToDir: { [id: string]: number } = {}; + for (const id of data.staticeSafeBombIds) { + const addLine = data.staticeBomb.find((x) => x.id === id); + if (addLine === undefined) + break; + const x = parseFloat(addLine.x); + const y = parseFloat(addLine.y); + bombToDir[id] = xyTo5DirBombNum(x, y); + } + + const sortedBombDirs = data.staticeSafeBombIds.map((x) => bombToDir[x]).sort(); + + for (const start of [0, 1, 2]) { + const dir1 = sortedBombDirs[start]; + const dir2 = sortedBombDirs[(start + 1) % 3]; + const dir3 = sortedBombDirs[(start + 2) % 3]; + if (dir1 === undefined || dir2 === undefined || dir3 === undefined) + return; + + if ((dir1 + 1) % 5 !== dir2) + continue; + if ((dir2 + 1) % 5 !== dir3) { + // If we get here, then dir1 and dir2 are adjacent to each other, but not dir3. + // Save this work off for the missiles later. + data.staticePresentBox1TopOfTriangleDir = (dir2 + 2) % 5; + continue; + } + + data.staticePresentBox1TopOfTriangleDir = dir2; + data.staticePresentBox1StackSpot = dir2; + + // dir2 is in the middle + const outputDir = { + 0: output.dirN!(), + 1: output.dirNE!(), + 2: output.dirSE!(), + 3: output.dirSW!(), + 4: output.dirNW!(), + }[dir2]; + return output.text!({ dir: outputDir }); + } + }, + outputStrings: { + text: { + en: '(stack is at ${dir})', + }, + dirN: Outputs.dirN, + dirNE: Outputs.dirNE, + dirSE: Outputs.dirSE, + dirSW: Outputs.dirSW, + dirNW: Outputs.dirNW, + }, + }, + { + id: 'AAI Statice Surprising Missile Collect', + type: 'AddedCombatant', + netRegex: { npcNameId: '12517' }, + run: (data, matches) => { + data.staticeMissileCollect.push(matches); + if (data.staticeMissileCollect.length !== 2) + return; + + // TODO: this is maybe duplicated too much, but it does extra work here? + const bombToDir: { [id: string]: number } = {}; + const bombToPos: { [id: string]: { x: number; y: number } } = {}; + let topBombPos: { x: number; y: number } | undefined; + for (const id of data.staticeSafeBombIds) { + const addLine = data.staticeBomb.find((x) => x.id === id); + if (addLine === undefined) + break; + const x = parseFloat(addLine.x); + const y = parseFloat(addLine.y); + const dir = xyTo5DirBombNum(x, y); + bombToDir[id] = dir; + bombToPos[id] = { x, y }; + if (dir === data.staticePresentBox1TopOfTriangleDir) + topBombPos = { x, y }; + } + + const topBombDir = data.staticePresentBox1TopOfTriangleDir; + if (topBombPos === undefined || topBombDir === undefined) + return; + + // If we already know the stack spot, eliminate it from the valid safe dirs to avoid any logic errors later. + const stackDir = data.staticePresentBox1StackSpot; + const nonStackBombIds = data.staticeSafeBombIds.filter((id) => bombToDir[id] !== stackDir); + + // For the intersecting triangle case, find the missile furthest from the top of the triangle + // and tell them to go there. It sure seems like missiles need to run north/south along + // the long direction of this safe triangle of bombs to break the tether, so even if the + // missiles are lateral (relatively) and the furthest two spots are the bottom of the triangle + // they need to still go N/S (relative). + const missileDirs: number[] = []; + if (stackDir === undefined) { + let furthestMissileId: string | undefined; + let furthestDistanceSqr: number | undefined; + for (const missile of data.staticeMissileCollect) { + const xDiff = parseFloat(missile.x) - topBombPos.x; + const yDiff = parseFloat(missile.y) - topBombPos.y; + const distSqr = xDiff * xDiff + yDiff * yDiff; + if (furthestDistanceSqr === undefined || distSqr > furthestDistanceSqr) { + furthestDistanceSqr = distSqr; + furthestMissileId = missile.id; + } + } + if (furthestMissileId === undefined) + return; + missileDirs.push(topBombDir); + data.staticeMissileIdToDir[furthestMissileId] = topBombDir; + } + + // Solve for remaining missiles. + // For the "disconnected triangle" case, this will solve for both, ignoring the middle stack spot. + // For the "intersecting triangle" case, this will solve the remaining missile ignoring the top of the triangle. + for (const missile of data.staticeMissileCollect) { + // if we already solved this one above, ignore it. + if (data.staticeMissileIdToDir[missile.id] !== undefined) + continue; + let furthestDir: number | undefined; + let furthestDistanceSqr: number | undefined; + for (const id of nonStackBombIds) { + const pos = bombToPos[id]; + if (pos === undefined) + return; + const xDiff = parseFloat(missile.x) - pos.x; + const yDiff = parseFloat(missile.y) - pos.y; + const distSqr = xDiff * xDiff + yDiff * yDiff; + if (furthestDistanceSqr === undefined || distSqr > furthestDistanceSqr) { + furthestDistanceSqr = distSqr; + furthestDir = bombToDir[id]; + } + } + + if (furthestDir !== undefined) { + data.staticeMissileIdToDir[missile.id] = furthestDir; + missileDirs.push(furthestDir); + } + } + + if (stackDir !== undefined) + return; + + const safeDirs = data.staticeSafeBombIds.map((id) => bombToDir[id]); + const maybeStackDirs = safeDirs.filter((dir) => + dir !== undefined && !missileDirs.includes(dir) + ); + const [finalStackDir] = maybeStackDirs; + + if (maybeStackDirs.length === 1 && finalStackDir !== undefined) + data.staticePresentBox1StackSpot = finalStackDir; + }, + }, { id: 'AAI Statice Present Box Missile', type: 'Tether', @@ -1114,18 +1448,54 @@ const triggerSet: TriggerSet = { return data.staticeMissileTether.length === 2 ? 0 : 0.5; }, durationSeconds: 7, - alertText: (data, _matches, output) => { + response: (data, _matches, output) => { + // cactbot-builtin-response + output.responseOutputStrings = { + missileOnYou: { + en: 'Bait Tethers => Missile Spread', + }, + missileOnYouDir: { + en: 'Bait Tethers => Missile Spread ${dir}', + }, + stackAt: { + en: '(stack is at ${dir})', + }, + dirN: Outputs.dirN, + dirNE: Outputs.dirNE, + dirSE: Outputs.dirSE, + dirSW: Outputs.dirSW, + dirNW: Outputs.dirNW, + }; + if (data.staticeMissileTether.length !== 2) return; - if (data.staticeMissileTether.map((x) => x.target).includes(data.me)) - return output.missileOnYou!(); + + const missileTether = data.staticeMissileTether.find((x) => x.target === data.me); + if (missileTether === undefined) + return; + + const dirToStr: { [dir: number]: string } = { + 0: output.dirN!(), + 1: output.dirNE!(), + 2: output.dirSE!(), + 3: output.dirSW!(), + 4: output.dirNW!(), + } as const; + + let infoText: string | undefined; + const stackDir = data.staticePresentBox1StackSpot; + if (stackDir !== undefined) + infoText = output.stackAt!({ dir: dirToStr[stackDir] }); + + const missileDir = data.staticeMissileIdToDir[missileTether.sourceId]; + if (missileDir === undefined) + return { alertText: output.missileOnYou!(), infoText: infoText }; + return { + alertText: output.missileOnYouDir!({ dir: dirToStr[missileDir] }), + infoText: infoText, + }; }, run: (data) => data.staticeMissileTether = [], - outputStrings: { - missileOnYou: { - en: 'Bait Tethers => Missile Spread', - }, - }, }, { id: 'AAI Statice Present Box Claw', @@ -1139,14 +1509,35 @@ const triggerSet: TriggerSet = { alertText: (data, _matches, output) => { if (data.staticeClawTether.length !== 2) return; - if (data.staticeClawTether.map((x) => x.target).includes(data.me)) - return output.missileOnYou!(); + if (!data.staticeClawTether.map((x) => x.target).includes(data.me)) + return; + + const dirToStr: { [dir: number]: string } = { + 0: output.dirN!(), + 1: output.dirNE!(), + 2: output.dirSE!(), + 3: output.dirSW!(), + 4: output.dirNW!(), + } as const; + + const stackDir = data.staticePresentBox1StackSpot; + if (stackDir !== undefined) + return output.stackAt!({ dir: dirToStr[stackDir] }); + return output.stack!(); }, run: (data) => data.staticeClawTether = [], outputStrings: { - missileOnYou: { + stack: { en: 'Juke Claw => Stack', }, + stackAt: { + en: 'Juke Claw => Stack ${dir}', + }, + dirN: Outputs.dirN, + dirNE: Outputs.dirNE, + dirSE: Outputs.dirSE, + dirSW: Outputs.dirSW, + dirNW: Outputs.dirNW, }, }, { From 8ac3de94cd8f679233c28d8f41abd8a09c254e85 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Tue, 12 Dec 2023 16:45:11 -0800 Subject: [PATCH 31/39] improve knockback plus trigger happy --- .../dungeon/another_aloalo_island-savage.ts | 35 +++++++++++++++++-- .../06-ew/dungeon/another_aloalo_island.ts | 35 +++++++++++++++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 395581078a..ef0ebc1844 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -36,6 +36,7 @@ export interface Data extends RaidbossData { lalaSubAlpha: NetMatches['GainsEffect'][]; staticeBullet: NetMatches['Ability'][]; staticeTriggerHappy?: number; + staticePopTriggerHappyNum?: number; staticeTrapshooting: ('stack' | 'spread' | undefined)[]; staticeDart: NetMatches['GainsEffect'][]; staticeBombRotateCount: number; @@ -1192,6 +1193,35 @@ const triggerSet: TriggerSet = { }, run: (data) => data.staticeDart = [], }, + { + id: 'AAIS Statice Surprise Balloon Reminder', + // This is an early reminder for the following Trigger Happy with knockback. + // However, because there's a tight window to immuune both knockbacks, + // call this ~15s early (in case anybody forgot). + type: 'StartsUsing', + netRegex: { id: '8927', source: 'Statice', capture: false }, + infoText: (data, _matches, output) => { + const num = data.staticeTriggerHappy; + if (num === undefined) + return; + // We'll re-call this out with the knockback warning. + // However, also clear `data.staticeTriggerHappy` to avoid double callouts. + data.staticePopTriggerHappyNum = num; + return output.numSafeSoon!({ num: output[`num${num}`]!() }); + }, + run: (data) => delete data.staticeTriggerHappy, + outputStrings: { + numSafeSoon: { + en: '(${num} safe soon)', + }, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, + }, + }, { id: 'AAIS Statice Pop', type: 'StartsUsing', @@ -1199,14 +1229,14 @@ const triggerSet: TriggerSet = { netRegex: { id: '896B', source: 'Statice', capture: false }, suppressSeconds: 20, alertText: (data, _matches, output) => { - const num = data.staticeTriggerHappy; + const num = data.staticePopTriggerHappyNum; if (num === undefined) return output.knockback!(); const numStr = output[`num${num}`]!(); return output.knockbackToNum!({ num: numStr }); }, - run: (data) => delete data.staticeTriggerHappy, + run: (data) => delete data.staticePopTriggerHappyNum, outputStrings: { knockbackToNum: { en: 'Knockback => ${num}', @@ -1570,6 +1600,7 @@ const triggerSet: TriggerSet = { id: 'AAIS Statice Pinwheeling Dartboard Color', type: 'AddedCombatant', netRegex: { npcNameId: '12507' }, + durationSeconds: 6, response: (data, matches, output) => { // cactbot-builtin-response output.responseOutputStrings = { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index d8881c485b..d2dd04ced0 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -31,6 +31,7 @@ export interface Data extends RaidbossData { lalaSubAlpha: NetMatches['GainsEffect'][]; staticeBullet: NetMatches['Ability'][]; staticeTriggerHappy?: number; + staticePopTriggerHappyNum?: number; staticeTrapshooting: ('stack' | 'spread' | undefined)[]; staticeDart: NetMatches['GainsEffect'][]; staticeBombRotateCount: number; @@ -1187,6 +1188,35 @@ const triggerSet: TriggerSet = { }, run: (data) => data.staticeDart = [], }, + { + id: 'AAI Statice Surprise Balloon Reminder', + // This is an early reminder for the following Trigger Happy with knockback. + // However, because there's a tight window to immuune both knockbacks, + // call this ~15s early (in case anybody forgot). + type: 'StartsUsing', + netRegex: { id: '894D', source: 'Statice', capture: false }, + infoText: (data, _matches, output) => { + const num = data.staticeTriggerHappy; + if (num === undefined) + return; + // We'll re-call this out with the knockback warning. + // However, also clear `data.staticeTriggerHappy` to avoid double callouts. + data.staticePopTriggerHappyNum = num; + return output.numSafeSoon!({ num: output[`num${num}`]!() }); + }, + run: (data) => delete data.staticeTriggerHappy, + outputStrings: { + numSafeSoon: { + en: '(${num} safe soon)', + }, + num1: Outputs.num1, + num2: Outputs.num2, + num3: Outputs.num3, + num4: Outputs.num4, + num5: Outputs.num5, + num6: Outputs.num6, + }, + }, { id: 'AAI Statice Pop', type: 'StartsUsing', @@ -1194,14 +1224,14 @@ const triggerSet: TriggerSet = { netRegex: { id: '894E', source: 'Statice', capture: false }, suppressSeconds: 20, alertText: (data, _matches, output) => { - const num = data.staticeTriggerHappy; + const num = data.staticePopTriggerHappyNum; if (num === undefined) return output.knockback!(); const numStr = output[`num${num}`]!(); return output.knockbackToNum!({ num: numStr }); }, - run: (data) => delete data.staticeTriggerHappy, + run: (data) => delete data.staticePopTriggerHappyNum, outputStrings: { knockbackToNum: { en: 'Knockback => ${num}', @@ -1565,6 +1595,7 @@ const triggerSet: TriggerSet = { id: 'AAI Statice Pinwheeling Dartboard Color', type: 'AddedCombatant', netRegex: { npcNameId: '12507' }, + durationSeconds: 6, response: (data, matches, output) => { // cactbot-builtin-response output.responseOutputStrings = { From ef020c49744621b3611c1603a761373d6c9f5805 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 13 Dec 2023 10:59:09 -0800 Subject: [PATCH 32/39] minor trigger massaging --- .../dungeon/another_aloalo_island-savage.ts | 247 ++++++++++++++++-- .../06-ew/dungeon/another_aloalo_island.ts | 247 ++++++++++++++++-- 2 files changed, 436 insertions(+), 58 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index ef0ebc1844..f6a197516e 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -17,16 +17,17 @@ import { TriggerSet } from '../../../../../types/trigger'; // TODO: map effects for Lala export interface Data extends RaidbossData { - readonly triggerSetConfig: { - stackOrder: 'meleeRolesPartners' | 'rolesPartners'; - }; combatantData: PluginCombatantState[]; ketuSpringCrystalCount: number; ketuCrystalAdd: NetMatches['AddedCombatant'][]; ketuHydroBuffCount: number; + ketuHydroBuffIsSpreadFirst?: boolean; + ketuHydroBuffIsRoleStacks?: boolean; ketuBuff?: 'bubble' | 'fetters'; + ketuBuffPartner?: string; ketuBuffCollect: NetMatches['GainsEffect'][]; ketuStackTargets: string[]; + ketuTwintidesNext?: 'out' | 'in'; lalaBossRotation?: 'clock' | 'counter'; lalaBossTimes?: 3 | 5; lalaBossInitialSafe?: 'north' | 'east' | 'south' | 'west'; @@ -79,6 +80,13 @@ const xyTo5DirBombNum = (x: number, y: number): number => { return Math.round(2.5 - 2.5 * Math.atan2(x, y) / Math.PI) % 5; }; +// TODO: this maybe should be a method on party? +const isStandardLightParty = (data: Data): boolean => { + const supports = [...data.party.healerNames, ...data.party.tankNames]; + const dps = data.party.dpsNames; + return supports.length === 2 && dps.length === 2; +}; + const triggerSet: TriggerSet = { id: 'AnotherAloaloIslandSavage', zoneId: ZoneId.AnotherAloaloIslandSavage, @@ -252,6 +260,12 @@ const triggerSet: TriggerSet = { netRegex: { npcNameId: '12607' }, run: (data, matches) => data.ketuCrystalAdd.push(matches), }, + { + id: 'AAIS Ketuduke Bubble Net', + type: 'StartsUsing', + netRegex: { id: '8AAD', source: 'Ketuduke', capture: false }, + response: Responses.aoe(), + }, { id: 'AAIS Ketuduke Foamy Fetters Bubble Weave', type: 'GainsEffect', @@ -270,12 +284,16 @@ const triggerSet: TriggerSet = { if (myBuff === undefined) return; data.ketuBuff = myBuff === 'ECC' ? 'fetters' : 'bubble'; + data.ketuBuffPartner = data.ketuBuffCollect.find((x) => { + return x.target !== data.me && x.effectId === myBuff; + })?.target; + const player = data.party.member(data.ketuBuffPartner); + + // To avoid too many calls, we'll call this out later for the Fluke Gale + // versions of this. + if (data.ketuSpringCrystalCount === 1 || data.ketuSpringCrystalCount === 4) + return; - const player = data.party.member( - data.ketuBuffCollect.find((x) => { - return x.target !== data.me && x.effectId === myBuff; - })?.target, - ); if (data.ketuBuff === 'fetters') return output.fetters!({ player: player }); return output.bubble!({ player: player }); @@ -296,7 +314,11 @@ const triggerSet: TriggerSet = { // 8AB8 = Hydrobullet (spread) // 8AB4 = Hydrofall (stack) netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke', capture: false }, - run: (data) => data.ketuHydroBuffCount++, + run: (data) => { + data.ketuHydroBuffCount++; + delete data.ketuHydroBuffIsSpreadFirst; + delete data.ketuHydroBuffIsRoleStacks; + }, }, { id: 'AAIS Ketuduke Hydro Buff 1', @@ -304,24 +326,55 @@ const triggerSet: TriggerSet = { en: `These directions assume that you always pick a square in the same quadrant as the crystal specified. For brevity, "next to" always means horizontal east/west of something. - The number in parentheses is the limit cut wind you should be on.`, + The number in parentheses is the limit cut wind you should be on. + See trigger source for diagrams in comments.`, }, type: 'StartsUsing', netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, condition: (data) => data.ketuHydroBuffCount === 1 || data.ketuHydroBuffCount === 6, durationSeconds: 8, alertText: (data, matches, output) => { + if (data.ketuBuff === undefined) + return; + + const isPlayerDPS = data.party.isDPS(data.me); + const isPartnerDPS = data.ketuBuffPartner !== undefined + ? data.party.isDPS(data.ketuBuffPartner) + : undefined; + const isBubbleNetPartnerSameRole = isPlayerDPS === isPartnerDPS && + isStandardLightParty(data); + + // Simplify callout in vast majority of cases where there's a normal light party setup + // and you and the two dps and two supports get the same debuff, so no need to list + // your partner. + // + // Otherwise, if you're doing this nonstandard for some reason or somebody is dead + // you can know if you need to flex. + const isSpread = matches.id === '8AB8'; + const bubbleStr = data.ketuBuff === 'bubble' ? output.bubbleBuff!() : output.fettersBuff!(); + // We don't know about role stacks at this point, as this is just the initial cast bar. + const stackStr = isSpread ? output.spread!() : output.stacks!(); + if (isBubbleNetPartnerSameRole || data.ketuBuffPartner === undefined) + return output.bubbleNetMech!({ fettersBubble: bubbleStr, spreadStack: stackStr }); + return output.bubbleNetMechPartner!({ + fettersBubble: bubbleStr, + spreadStack: stackStr, + player: data.party.member(data.ketuBuffPartner), + }); + }, + infoText: (data, matches, output) => { // If somebody died and missed a debuff, good luck. if (data.ketuBuff === undefined) return; // Bubble always does the same thing. if (data.ketuBuff === 'bubble') - return output.bubble!(); + return output.bubbleAnything!(); // Two layouts, one with each crystal in its own column ("split") // and one with two columns that have an H and a V in that same column ("columns"). // Wind doesn't matter, as "1" will always be on the horizontal crystals. + // These can be flipped somewhat, but the solution is always the same. // // STACK FETTERS COLUMNS (kitty to horizontal) // 2 2 @@ -379,15 +432,24 @@ const triggerSet: TriggerSet = { return isSplitLayout ? output.fettersSpreadSplit!() : output.fettersSpreadColumn!(); return isSplitLayout ? output.fettersStackSplit!() : output.fettersStackColumn!(); }, - infoText: (_data, matches, output) => { - return matches.id === '8AB8' ? output.spread!() : output.stacks!(); - }, outputStrings: { + bubbleNetMech: { + en: '${fettersBubble} + ${spreadStack}', + }, + bubbleNetMechPartner: { + en: '${fettersBubble} + ${spreadStack} (w/${player})', + }, + bubbleBuff: { + en: 'Bubble', + }, + fettersBuff: { + en: 'Fetters', + }, spread: Outputs.spread, stacks: { en: 'Stacks', }, - bubble: { + bubbleAnything: { en: 'Next to Horizontal (1)', }, fettersSpreadSplit: { @@ -405,12 +467,13 @@ const triggerSet: TriggerSet = { }, }, { - id: 'AAIS Ketuduke Hydro Buff 2', + id: 'AAIS Ketuduke Hydro Buff Double', type: 'StartsUsing', netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, - condition: (data) => data.ketuHydroBuffCount === 2, - alertText: (_data, matches, output) => { - return matches.id === '8AB8' ? output.spread!() : output.stacks!(); + condition: (data) => data.ketuHydroBuffCount === 2 || data.ketuHydroBuffCount === 5, + alertText: (data, matches, output) => { + data.ketuHydroBuffIsSpreadFirst = matches.id === '8AB8'; + return data.ketuHydroBuffIsSpreadFirst ? output.spread!() : output.stacks!(); }, outputStrings: { spread: { @@ -421,6 +484,31 @@ const triggerSet: TriggerSet = { }, }, }, + { + id: 'AAIS Ketuduke Hydro Buff Double Followup', + type: 'Ability', + netRegex: { id: ['8ADF', '8ADE'], source: 'Ketuduke' }, + suppressSeconds: 10, + infoText: (data, matches, output) => { + const wasSpread = matches.id === '8ADF'; + if (wasSpread && data.ketuHydroBuffIsSpreadFirst === true) { + if (data.ketuHydroBuffIsRoleStacks) + return output.roleStacks!(); + return output.stacks!(); + } else if (!wasSpread && data.ketuHydroBuffIsSpreadFirst === false) { + return output.spread!(); + } + }, + outputStrings: { + spread: Outputs.spread, + stacks: { + en: 'Stacks', + }, + roleStacks: { + en: 'Role Stacks', + }, + }, + }, { id: 'AAIS Ketuduke Hydrofall Role Stack Warning', type: 'GainsEffect', @@ -435,9 +523,7 @@ const triggerSet: TriggerSet = { return; // Sorry, non-standard light party comps. - const supports = [...data.party.healerNames, ...data.party.tankNames]; - const dps = data.party.dpsNames; - if (supports.length !== 2 && dps.length !== 2) + if (!isStandardLightParty(data)) return; const isStack1DPS = data.party.isDPS(stack1); @@ -447,34 +533,109 @@ const triggerSet: TriggerSet = { // standard "partner" stacks of one support and one dps. If one is on a dps // and one is on a support (which can happen if somebody dies), then // you (probably) need to have role stacks. - if (isStack1DPS !== isStack2DPS) - return output.roleStacks!(); + if (isStack1DPS === isStack2DPS) + return; + + data.ketuHydroBuffIsRoleStacks = true; + + // Handle Blowing Bubbles/Angry Seas spread+stack combo. + if (data.ketuHydroBuffIsSpreadFirst === true) + return output.spreadThenRoleStacks!(); + else if (data.ketuHydroBuffIsSpreadFirst === false) + return output.roleStacksThenSpread!(); + return output.roleStacks!(); }, run: (data) => data.ketuStackTargets = [], outputStrings: { roleStacks: { en: 'Role Stacks', }, + spreadThenRoleStacks: { + en: 'Spread => Role Stacks', + }, + roleStacksThenSpread: { + en: 'Role Stacks => Spread', + }, }, }, { id: 'AAIS Ketuduke Receding Twintides', type: 'StartsUsing', netRegex: { id: '8AE7', source: 'Ketuduke', capture: false }, - response: Responses.getOutThenIn(), + alertText: (data, _matches, output) => { + if (data.ketuHydroBuffIsRoleStacks) + return output.outInRoleStacks!(); + return output.outInStacks!(); + }, + run: (data) => data.ketuTwintidesNext = 'in', + outputStrings: { + outInStacks: { + en: 'Out => In + Stacks', + }, + outInRoleStacks: { + en: 'Out => In + Role Stacks', + }, + }, }, { id: 'AAIS Ketuduke Encroaching Twintides', type: 'StartsUsing', netRegex: { id: '8AE9', source: 'Ketuduke', capture: false }, - response: Responses.getInThenOut(), + alertText: (data, _matches, output) => { + if (data.ketuHydroBuffIsRoleStacks) + return output.inOutRoleStacks!(); + return output.inOutStacks!(); + }, + run: (data) => data.ketuTwintidesNext = 'out', + outputStrings: { + inOutStacks: { + en: 'In => Out + Stacks', + }, + inOutRoleStacks: { + en: 'In => Out + Role Stacks', + }, + }, + }, + { + id: 'AAIS Ketuduke Twintides Followup', + type: 'Ability', + // 8AE0 = Sphere Shatter, which happens slightly after the Twintides hit. + // You can technically start moving along the safe Sphere Shatter side 0.5s earlier + // after the initial out/in, but this is hard to explain. + netRegex: { id: '8AE0', source: 'Ketuduke', capture: false }, + suppressSeconds: 5, + infoText: (data, _matches, output) => { + const mech = data.ketuTwintidesNext; + if (mech === undefined) + return; + const mechStr = output[mech]!(); + const stackStr = data.ketuHydroBuffIsRoleStacks ? output.roleStacks!() : output.stack!(); + return output.text!({ inOut: mechStr, stack: stackStr }); + }, + run: (data) => delete data.ketuTwintidesNext, + outputStrings: { + text: { + en: '${inOut} + ${stack}', + }, + in: Outputs.in, + out: Outputs.out, + stack: { + en: 'Stacks', + }, + roleStacks: { + en: 'Role Stacks', + }, + }, }, { id: 'AAIS Ketuduke Spring Crystals 2', type: 'AddedCombatant', - // This calls absurdly early. <_< netRegex: { npcNameId: '12607', capture: false }, condition: (data) => data.ketuSpringCrystalCount === 2 && data.ketuCrystalAdd.length === 4, + // We could call this absurdly early, but knowing this doesn't help with anything + // until you know what your debuff is, so move it later both so it is less absurd + // futuresight and so you don't have to remember it as long. + delaySeconds: 5, alertText: (data, _matches, output) => { const horizontal = data.ketuCrystalAdd.filter((x) => isHorizontalCrystal(x)); const vertical = data.ketuCrystalAdd.filter((x) => !isHorizontalCrystal(x)); @@ -511,6 +672,29 @@ const triggerSet: TriggerSet = { }, }, }, + { + id: 'AAIS Ketuduke Angry Seas', + type: 'StartsUsing', + netRegex: { id: '8AE1', source: 'Ketuduke', capture: false }, + alertText: (data, _matches, output) => { + if (data.ketuHydroBuffIsSpreadFirst) + return output.knockbackSpread!(); + if (data.ketuHydroBuffIsRoleStacks) + return output.knockbackRoleStacks!(); + return output.knockbackStacks!(); + }, + outputStrings: { + knockbackSpread: { + en: 'Knockback => Spread', + }, + knockbackStacks: { + en: 'Knockback => Stacks', + }, + knockbackRoleStacks: { + en: 'Knockback => Role Stacks', + }, + }, + }, // ---------------- second trash ---------------- { id: 'AAIS Wood Golem Ancient Aero III', @@ -574,13 +758,18 @@ const triggerSet: TriggerSet = { id: 'AAIS Islekeeper Isle Drop', type: 'StartsUsing', netRegex: { id: '8C3C', source: 'Aloalo Islekeeper', capture: false }, - response: Responses.getBehind('info'), + infoText: (_data, _matches, output) => output.text!(), + outputStrings: { + text: { + en: 'Get Behind + Out', + }, + }, }, { id: 'AAIS Islekeeper Ancient Quaga', type: 'StartsUsing', netRegex: { id: '8C39', source: 'Aloalo Islekeeper', capture: false }, - response: Responses.aoe(), + response: Responses.bleedAoe(), }, { id: 'AAIS Islekeeper Ancient Quaga Enrage', diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index d2dd04ced0..ee881105c1 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -12,16 +12,17 @@ import { TriggerSet } from '../../../../../types/trigger'; // TODO: map effects for Lala export interface Data extends RaidbossData { - readonly triggerSetConfig: { - stackOrder: 'meleeRolesPartners' | 'rolesPartners'; - }; combatantData: PluginCombatantState[]; ketuSpringCrystalCount: number; ketuCrystalAdd: NetMatches['AddedCombatant'][]; ketuHydroBuffCount: number; + ketuHydroBuffIsSpreadFirst?: boolean; + ketuHydroBuffIsRoleStacks?: boolean; ketuBuff?: 'bubble' | 'fetters'; + ketuBuffPartner?: string; ketuBuffCollect: NetMatches['GainsEffect'][]; ketuStackTargets: string[]; + ketuTwintidesNext?: 'out' | 'in'; lalaBossRotation?: 'clock' | 'counter'; lalaBossTimes?: 3 | 5; lalaBossInitialSafe?: 'north' | 'east' | 'south' | 'west'; @@ -74,6 +75,13 @@ const xyTo5DirBombNum = (x: number, y: number): number => { return Math.round(2.5 - 2.5 * Math.atan2(x, y) / Math.PI) % 5; }; +// TODO: this maybe should be a method on party? +const isStandardLightParty = (data: Data): boolean => { + const supports = [...data.party.healerNames, ...data.party.tankNames]; + const dps = data.party.dpsNames; + return supports.length === 2 && dps.length === 2; +}; + const triggerSet: TriggerSet = { id: 'AnotherAloaloIsland', zoneId: ZoneId.AnotherAloaloIsland, @@ -247,6 +255,12 @@ const triggerSet: TriggerSet = { netRegex: { npcNameId: '12607' }, run: (data, matches) => data.ketuCrystalAdd.push(matches), }, + { + id: 'AAI Ketuduke Bubble Net', + type: 'StartsUsing', + netRegex: { id: '8AAD', source: 'Ketuduke', capture: false }, + response: Responses.aoe(), + }, { id: 'AAI Ketuduke Foamy Fetters Bubble Weave', type: 'GainsEffect', @@ -265,12 +279,16 @@ const triggerSet: TriggerSet = { if (myBuff === undefined) return; data.ketuBuff = myBuff === 'ECC' ? 'fetters' : 'bubble'; + data.ketuBuffPartner = data.ketuBuffCollect.find((x) => { + return x.target !== data.me && x.effectId === myBuff; + })?.target; + const player = data.party.member(data.ketuBuffPartner); + + // To avoid too many calls, we'll call this out later for the Fluke Gale + // versions of this. + if (data.ketuSpringCrystalCount === 1 || data.ketuSpringCrystalCount === 4) + return; - const player = data.party.member( - data.ketuBuffCollect.find((x) => { - return x.target !== data.me && x.effectId === myBuff; - })?.target, - ); if (data.ketuBuff === 'fetters') return output.fetters!({ player: player }); return output.bubble!({ player: player }); @@ -291,7 +309,11 @@ const triggerSet: TriggerSet = { // 8AB8 = Hydrobullet (spread) // 8AB4 = Hydrofall (stack) netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke', capture: false }, - run: (data) => data.ketuHydroBuffCount++, + run: (data) => { + data.ketuHydroBuffCount++; + delete data.ketuHydroBuffIsSpreadFirst; + delete data.ketuHydroBuffIsRoleStacks; + }, }, { id: 'AAI Ketuduke Hydro Buff 1', @@ -299,24 +321,55 @@ const triggerSet: TriggerSet = { en: `These directions assume that you always pick a square in the same quadrant as the crystal specified. For brevity, "next to" always means horizontal east/west of something. - The number in parentheses is the limit cut wind you should be on.`, + The number in parentheses is the limit cut wind you should be on. + See trigger source for diagrams in comments.`, }, type: 'StartsUsing', netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, condition: (data) => data.ketuHydroBuffCount === 1 || data.ketuHydroBuffCount === 6, durationSeconds: 8, alertText: (data, matches, output) => { + if (data.ketuBuff === undefined) + return; + + const isPlayerDPS = data.party.isDPS(data.me); + const isPartnerDPS = data.ketuBuffPartner !== undefined + ? data.party.isDPS(data.ketuBuffPartner) + : undefined; + const isBubbleNetPartnerSameRole = isPlayerDPS === isPartnerDPS && + isStandardLightParty(data); + + // Simplify callout in vast majority of cases where there's a normal light party setup + // and you and the two dps and two supports get the same debuff, so no need to list + // your partner. + // + // Otherwise, if you're doing this nonstandard for some reason or somebody is dead + // you can know if you need to flex. + const isSpread = matches.id === '8AB8'; + const bubbleStr = data.ketuBuff === 'bubble' ? output.bubbleBuff!() : output.fettersBuff!(); + // We don't know about role stacks at this point, as this is just the initial cast bar. + const stackStr = isSpread ? output.spread!() : output.stacks!(); + if (isBubbleNetPartnerSameRole || data.ketuBuffPartner === undefined) + return output.bubbleNetMech!({ fettersBubble: bubbleStr, spreadStack: stackStr }); + return output.bubbleNetMechPartner!({ + fettersBubble: bubbleStr, + spreadStack: stackStr, + player: data.party.member(data.ketuBuffPartner), + }); + }, + infoText: (data, matches, output) => { // If somebody died and missed a debuff, good luck. if (data.ketuBuff === undefined) return; // Bubble always does the same thing. if (data.ketuBuff === 'bubble') - return output.bubble!(); + return output.bubbleAnything!(); // Two layouts, one with each crystal in its own column ("split") // and one with two columns that have an H and a V in that same column ("columns"). // Wind doesn't matter, as "1" will always be on the horizontal crystals. + // These can be flipped somewhat, but the solution is always the same. // // STACK FETTERS COLUMNS (kitty to horizontal) // 2 2 @@ -374,15 +427,24 @@ const triggerSet: TriggerSet = { return isSplitLayout ? output.fettersSpreadSplit!() : output.fettersSpreadColumn!(); return isSplitLayout ? output.fettersStackSplit!() : output.fettersStackColumn!(); }, - infoText: (_data, matches, output) => { - return matches.id === '8AB8' ? output.spread!() : output.stacks!(); - }, outputStrings: { + bubbleNetMech: { + en: '${fettersBubble} + ${spreadStack}', + }, + bubbleNetMechPartner: { + en: '${fettersBubble} + ${spreadStack} (w/${player})', + }, + bubbleBuff: { + en: 'Bubble', + }, + fettersBuff: { + en: 'Fetters', + }, spread: Outputs.spread, stacks: { en: 'Stacks', }, - bubble: { + bubbleAnything: { en: 'Next to Horizontal (1)', }, fettersSpreadSplit: { @@ -400,12 +462,13 @@ const triggerSet: TriggerSet = { }, }, { - id: 'AAI Ketuduke Hydro Buff 2', + id: 'AAI Ketuduke Hydro Buff Double', type: 'StartsUsing', netRegex: { id: ['8AB8', '8AB4'], source: 'Ketuduke' }, - condition: (data) => data.ketuHydroBuffCount === 2, - alertText: (_data, matches, output) => { - return matches.id === '8AB8' ? output.spread!() : output.stacks!(); + condition: (data) => data.ketuHydroBuffCount === 2 || data.ketuHydroBuffCount === 5, + alertText: (data, matches, output) => { + data.ketuHydroBuffIsSpreadFirst = matches.id === '8AB8'; + return data.ketuHydroBuffIsSpreadFirst ? output.spread!() : output.stacks!(); }, outputStrings: { spread: { @@ -416,6 +479,31 @@ const triggerSet: TriggerSet = { }, }, }, + { + id: 'AAI Ketuduke Hydro Buff Double Followup', + type: 'Ability', + netRegex: { id: ['8ABA', '8AB7'], source: 'Ketuduke' }, + suppressSeconds: 10, + infoText: (data, matches, output) => { + const wasSpread = matches.id === '8ABA'; + if (wasSpread && data.ketuHydroBuffIsSpreadFirst === true) { + if (data.ketuHydroBuffIsRoleStacks) + return output.roleStacks!(); + return output.stacks!(); + } else if (!wasSpread && data.ketuHydroBuffIsSpreadFirst === false) { + return output.spread!(); + } + }, + outputStrings: { + spread: Outputs.spread, + stacks: { + en: 'Stacks', + }, + roleStacks: { + en: 'Role Stacks', + }, + }, + }, { id: 'AAI Ketuduke Hydrofall Role Stack Warning', type: 'GainsEffect', @@ -430,9 +518,7 @@ const triggerSet: TriggerSet = { return; // Sorry, non-standard light party comps. - const supports = [...data.party.healerNames, ...data.party.tankNames]; - const dps = data.party.dpsNames; - if (supports.length !== 2 && dps.length !== 2) + if (!isStandardLightParty(data)) return; const isStack1DPS = data.party.isDPS(stack1); @@ -442,34 +528,109 @@ const triggerSet: TriggerSet = { // standard "partner" stacks of one support and one dps. If one is on a dps // and one is on a support (which can happen if somebody dies), then // you (probably) need to have role stacks. - if (isStack1DPS !== isStack2DPS) - return output.roleStacks!(); + if (isStack1DPS === isStack2DPS) + return; + + data.ketuHydroBuffIsRoleStacks = true; + + // Handle Blowing Bubbles/Angry Seas spread+stack combo. + if (data.ketuHydroBuffIsSpreadFirst === true) + return output.spreadThenRoleStacks!(); + else if (data.ketuHydroBuffIsSpreadFirst === false) + return output.roleStacksThenSpread!(); + return output.roleStacks!(); }, run: (data) => data.ketuStackTargets = [], outputStrings: { roleStacks: { en: 'Role Stacks', }, + spreadThenRoleStacks: { + en: 'Spread => Role Stacks', + }, + roleStacksThenSpread: { + en: 'Role Stacks => Spread', + }, }, }, { id: 'AAI Ketuduke Receding Twintides', type: 'StartsUsing', netRegex: { id: '8ACC', source: 'Ketuduke', capture: false }, - response: Responses.getOutThenIn(), + alertText: (data, _matches, output) => { + if (data.ketuHydroBuffIsRoleStacks) + return output.outInRoleStacks!(); + return output.outInStacks!(); + }, + run: (data) => data.ketuTwintidesNext = 'in', + outputStrings: { + outInStacks: { + en: 'Out => In + Stacks', + }, + outInRoleStacks: { + en: 'Out => In + Role Stacks', + }, + }, }, { id: 'AAI Ketuduke Encroaching Twintides', type: 'StartsUsing', netRegex: { id: '8ACE', source: 'Ketuduke', capture: false }, - response: Responses.getInThenOut(), + alertText: (data, _matches, output) => { + if (data.ketuHydroBuffIsRoleStacks) + return output.inOutRoleStacks!(); + return output.inOutStacks!(); + }, + run: (data) => data.ketuTwintidesNext = 'out', + outputStrings: { + inOutStacks: { + en: 'In => Out + Stacks', + }, + inOutRoleStacks: { + en: 'In => Out + Role Stacks', + }, + }, + }, + { + id: 'AAI Ketuduke Twintides Followup', + type: 'Ability', + // 8ABC = Sphere Shatter, which happens slightly after the Twintides hit. + // You can technically start moving along the safe Sphere Shatter side 0.5s earlier + // after the initial out/in, but this is hard to explain. + netRegex: { id: '8ABC', source: 'Ketuduke', capture: false }, + suppressSeconds: 5, + infoText: (data, _matches, output) => { + const mech = data.ketuTwintidesNext; + if (mech === undefined) + return; + const mechStr = output[mech]!(); + const stackStr = data.ketuHydroBuffIsRoleStacks ? output.roleStacks!() : output.stack!(); + return output.text!({ inOut: mechStr, stack: stackStr }); + }, + run: (data) => delete data.ketuTwintidesNext, + outputStrings: { + text: { + en: '${inOut} + ${stack}', + }, + in: Outputs.in, + out: Outputs.out, + stack: { + en: 'Stacks', + }, + roleStacks: { + en: 'Role Stacks', + }, + }, }, { id: 'AAI Ketuduke Spring Crystals 2', type: 'AddedCombatant', - // This calls absurdly early. <_< netRegex: { npcNameId: '12607', capture: false }, condition: (data) => data.ketuSpringCrystalCount === 2 && data.ketuCrystalAdd.length === 4, + // We could call this absurdly early, but knowing this doesn't help with anything + // until you know what your debuff is, so move it later both so it is less absurd + // futuresight and so you don't have to remember it as long. + delaySeconds: 5, alertText: (data, _matches, output) => { const horizontal = data.ketuCrystalAdd.filter((x) => isHorizontalCrystal(x)); const vertical = data.ketuCrystalAdd.filter((x) => !isHorizontalCrystal(x)); @@ -506,6 +667,29 @@ const triggerSet: TriggerSet = { }, }, }, + { + id: 'AAI Ketuduke Angry Seas', + type: 'StartsUsing', + netRegex: { id: '8AC1', source: 'Ketuduke', capture: false }, + alertText: (data, _matches, output) => { + if (data.ketuHydroBuffIsSpreadFirst) + return output.knockbackSpread!(); + if (data.ketuHydroBuffIsRoleStacks) + return output.knockbackRoleStacks!(); + return output.knockbackStacks!(); + }, + outputStrings: { + knockbackSpread: { + en: 'Knockback => Spread', + }, + knockbackStacks: { + en: 'Knockback => Stacks', + }, + knockbackRoleStacks: { + en: 'Knockback => Role Stacks', + }, + }, + }, // ---------------- second trash ---------------- { id: 'AAI Wood Golem Ancient Aero III', @@ -569,13 +753,18 @@ const triggerSet: TriggerSet = { id: 'AAI Islekeeper Isle Drop', type: 'StartsUsing', netRegex: { id: '8C6F', source: 'Aloalo Islekeeper', capture: false }, - response: Responses.getBehind('info'), + infoText: (_data, _matches, output) => output.text!(), + outputStrings: { + text: { + en: 'Get Behind + Out', + }, + }, }, { id: 'AAI Islekeeper Ancient Quaga', type: 'StartsUsing', netRegex: { id: '8C4E', source: 'Aloalo Islekeeper', capture: false }, - response: Responses.aoe(), + response: Responses.bleedAoe(), }, { id: 'AAI Islekeeper Ancient Quaga Enrage', From e54040eebffb38307ec78c988351d3d8804c7c0d Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 13 Dec 2023 11:06:13 -0800 Subject: [PATCH 33/39] untargetable lines --- .../data/06-ew/dungeon/another_aloalo_island-savage.txt | 6 +++++- ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index a0231f3277..4259ab19a5 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -274,6 +274,7 @@ hideall "--sync--" # -p 8966:3013.8 # -ii TODO 8925 8926 8977 8978 8969 8988 8A6A 897C 897D TODO TODO 8CC1 89FB TODO 8974 8975 +# -it Statice # Midnight Trial will be sealed off 3000.0 "--sync--" SystemLogMessage { id: "7DC", param1: "1148" } window 10000,0 @@ -307,8 +308,9 @@ hideall "--sync--" 3154.9 "Surprise Needle 4" #Ability { id: "896C", source: "Needle" } 3155.6 "Pop 2" Ability { id: "896B", source: "Statice" } 3160.4 "Trapshooting 2" Ability { id: "8976", source: "Statice" } - 3172.5 "Aero IV" Ability { id: "8966", source: "Statice" } + +3179.7 "--untargetable--" 3179.7 "--middle--" Ability { id: "8927", source: "Statice" } 3184.1 "Ring a Ring o' Explosions" Ability { id: "8979", source: "Statice" } 3189.2 "Present Box 1" Ability { id: "8972", source: "Statice" } @@ -316,6 +318,8 @@ hideall "--sync--" 3204.0 "Fireworks" Ability { id: "897C", source: "Statice" } 3204.2 "Burst" Ability { id: "897A", source: "Bomb" } 3204.3 "Faerie Ring" Ability { id: "8973", source: "Surprising Staff" } + +3206.3 "--targetable--" 3212.5 "Shocking Abandon" Ability { id: "8965", source: "Statice" } 3222.7 "Pinwheeling Dartboard" Ability { id: "8BCF", source: "Statice" } diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index 917a54246d..bcd79808a3 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -269,6 +269,7 @@ hideall "--sync--" # -p 8949:3013.8 # -ii 8947 8925 8926 895A 895B 894C 8987 8A6A 895F 8960 8CC2 8982 8CBE 89F9 8C24 8957 8958 +# -it Statice # Midnight Trial will be sealed off 3000.0 "--sync--" SystemLogMessage { id: "7DC", param1: "1148" } window 10000,0 @@ -302,8 +303,9 @@ hideall "--sync--" 3154.9 "Surprise Needle 4" #Ability { id: "894F", source: "Needle" } 3155.6 "Pop 2" Ability { id: "894E", source: "Statice" } 3160.4 "Trapshooting 2" Ability { id: "8959", source: "Statice" } - 3172.5 "Aero IV" Ability { id: "8949", source: "Statice" } + +3179.7 "--untargetable--" 3179.7 "--middle--" Ability { id: "8927", source: "Statice" } 3184.1 "Ring a Ring o' Explosions" Ability { id: "895C", source: "Statice" } 3189.2 "Present Box 1" Ability { id: "8955", source: "Statice" } @@ -311,6 +313,8 @@ hideall "--sync--" 3204.0 "Fireworks" Ability { id: "895F", source: "Statice" } 3204.2 "Burst" Ability { id: "895D", source: "Bomb" } 3204.3 "Faerie Ring" Ability { id: "8956", source: "Surprising Staff" } + +3206.3 "--targetable--" 3212.5 "Shocking Abandon" Ability { id: "8948", source: "Statice" } 3222.7 "Pinwheeling Dartboard" Ability { id: "8CBC", source: "Statice" } From f08b3dd1b6a3ffd573a7e1b4f01d492c178105db Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 13 Dec 2023 22:05:30 -0800 Subject: [PATCH 34/39] more savage ids --- .../dungeon/another_aloalo_island-savage.ts | 4 +-- .../dungeon/another_aloalo_island-savage.ts | 2 +- .../dungeon/another_aloalo_island-savage.txt | 22 ++++++------- .../06-ew/dungeon/another_aloalo_island.ts | 2 +- .../06-ew/dungeon/another_aloalo_island.txt | 4 +-- util/sync_files.ts | 33 ++++++++++--------- 6 files changed, 34 insertions(+), 33 deletions(-) diff --git a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts index d52b514380..a7aa13a2a1 100644 --- a/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/oopsyraidsy/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -129,9 +129,9 @@ const triggerSet: OopsyTriggerSet = { // Statice 'AAIS Trigger Happy': '8969', // limit cut dart board 'AAIS Bomb Burst': '897A', // bomb explosion - 'AAIS Uncommon Ground': 'TODO', // people who are on the same dartboard color with Bull's-eye + 'AAIS Uncommon Ground': '8CC3', // people who are on the same dartboard color with Bull's-eye 'AAIS Faerie Ring': '8973', // donut rings during Present Box - 'AAIS Fire Spread 1': 'TODO', // initial rotating fire (from Ball of Fire) + 'AAIS Fire Spread 1': '896F', // initial rotating fire (from Ball of Fire) 'AAIS Fire Spread 2': '89FB', // ongoing rotating fire damage (from Statice) }, damageFail: { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index f6a197516e..67844b0094 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -263,7 +263,7 @@ const triggerSet: TriggerSet = { { id: 'AAIS Ketuduke Bubble Net', type: 'StartsUsing', - netRegex: { id: '8AAD', source: 'Ketuduke', capture: false }, + netRegex: { id: ['8AC5', '8AAD'], source: 'Ketuduke', capture: false }, response: Responses.aoe(), }, { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index 4259ab19a5..771090ebf7 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -17,7 +17,7 @@ hideall "--sync--" #~~~~~~~~~~# # -p 8AD4:1015.2 -# -ii 8AA7 8AED 8ADD 8AB9 8AB6 8AEB TODO TODO 8AE5 8AE6 8AC0 8ADA 8AD9 8AE4 8AC8 8AE3 8A82 8A83 +# -ii 8AA7 8AED 8ADD 8AB9 8AB6 8AEB 8ABE 8ABF 8AE5 8AE6 8AC0 8ADA 8AD9 8AE4 8AC8 8AE3 8A82 8A83 # The Dawn Trial will be sealed off 1000.0 "--sync--" SystemLogMessage { id: "7DC", param1: "1146" } window 10000,0 @@ -35,7 +35,7 @@ hideall "--sync--" 1065.1 "Hydrobullet/Hydrofall" Ability { id: "(8ADF|8ADE)", source: "Ketuduke" } 1074.0 "Hydrofall/Hydrobullet (buff)" Ability { id: "(8AB4|8AB8)", source: "Ketuduke" } -1077.1 "Hydrobullet/Hydrofall (buff)" Ability { id: "(TODO|8AB5)", source: "Ketuduke" } +1077.1 "Hydrobullet/Hydrofall (buff)" Ability { id: "(8C6D|8AB5)", source: "Ketuduke" } 1084.3 "Blowing Bubbles" Ability { id: "8ABD", source: "Ketuduke" } 1091.4 "Hydrobomb x3" Ability { id: "8AD0", source: "Ketuduke" } 1096.3 "Hydrofall/Hydrobullet" Ability { id: "(8ADE|8ADF)", source: "Ketuduke" } @@ -61,7 +61,7 @@ hideall "--sync--" 1190.7 "--middle--" Ability { id: "8A77", source: "Ketuduke" } 1199.4 "Hydrofall/Hydrobullet (buff)" Ability { id: "(8AB4|8AB8)", source: "Ketuduke" } -1202.4 "Hydrobullet/Hydrofall (buff)" Ability { id: "(TODO|8AB5)", source: "Ketuduke" } +1202.4 "Hydrobullet/Hydrofall (buff)" Ability { id: "(8C6D|8AB5)", source: "Ketuduke" } 1210.4 "Angry Seas" Ability { id: "8AE1", source: "Ketuduke" } 1211.6 "Hydrofall/Hydrobullet" Ability { id: "(8ADE|8ADF)", source: "Ketuduke" } 1212.2 "Hydrobullet/Hydrobullet" Ability { id: "(8ADF|8ADE)" } # this sometimes has the wrong source @@ -109,7 +109,7 @@ hideall "--sync--" # 8AB2 Fluke Gale cast and ability for limit cut 1 wind # 8AB3 Fluke Gale cast and ability for limit cut 2 wind # 8AB4 Hydrofall self-targeted cast that adds stack markers -# 8AB5 Hydrofall ability on players to give "stack second" before Blowing Bubbles +# 8AB5 Hydrofall self-targeted "stack second" ability before Blowing Bubbles # 8AB6 Hydrofall ability on players that adds stack debuffs # 8ADE Hydrofall damage from stack debuffs # 8AB8 Hydrobullet self-targeted cast that adds stack markers @@ -118,8 +118,8 @@ hideall "--sync--" # 8ABB Strewn Bubbles self-targeted cast before 8AE0 Sphere Shatter moving arches # 8AE0 Sphere Shatter damage from moving arches # 8ABD Blowing Bubbles self-targeted cast that adds Airy Bubble Adds -# TODO Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one -# TODO Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after TODO Riptide +# 8ABE Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one +# 8ABF Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after 8ABE Riptide # 8AC0 Angry Seas self-targeted cast for 8AE1 red line knockback # 8AE1 Angry Seas cast and knockback damage from red line # 8AE2 Burst tower damage @@ -140,7 +140,7 @@ hideall "--sync--" # 8AEB Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles # 8AD4 Tidal Roar self-targeted cast for raidwide aoe # 8AED Tidal Roar damage from 8AD4 -# TODO Hydrobullet ability on players to give "spread second" before Blowing Bubbles +# 8C6D Hydrobullet self-targeted "spread second" ability before Blowing Bubbles #~~~~~~# @@ -273,7 +273,7 @@ hideall "--sync--" #~~~~~~~~~~~~~~~~~~~~# # -p 8966:3013.8 -# -ii TODO 8925 8926 8977 8978 8969 8988 8A6A 897C 897D TODO TODO 8CC1 89FB TODO 8974 8975 +# -ii 8964 8925 8926 8977 8978 8969 8988 8A6A 897C 897D 8CC3 896F 8CC1 89FB TODO 8974 8975 # -it Statice # Midnight Trial will be sealed off @@ -351,7 +351,7 @@ hideall "--sync--" # 8925 Locked and Loaded ability during 8967 Trick Reload when a bullet is in the gun # 8926 Misload ability during 8967 Trick Reload when a bullet missed the gun oops # 8927 --sync-- repositioning from Statice -# TODO --sync-- auto damage from Statice +# 8964 --sync-- auto damage from Statice # 8965 Shocking Abandon cast and tankbuster damage # 8966 Aero IV cast and raidwide damage # 8967 Trick Reload self-targeted cast to load gun with 8925/8926 @@ -374,7 +374,7 @@ hideall "--sync--" # 897C Fireworks two person stack damage during Present Box / Pinwheeling Dartboard # 897D Fireworks spread damage during Present Box / Pinwheeling Dartboard # 8980 Beguiling Glitter self-targeted cast to give players Face debuffs -# TODO Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) +# 896F Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) # 8988 Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) # 89FB Fire Spread ongoing rotating fire damage (from Statice) # 8A6A --sync-- ability on Bomb when rotating @@ -383,7 +383,7 @@ hideall "--sync--" # 8BCF Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire # 8CC0 Dartboard of Dancing Explosives self-targeted cast for colored dartboard # 8CC1 Burning Chains damage from not breaking chains -# TODO Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye +# 8CC3 Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye # 8D1C Trapshooting self-targeted cast after Trick Reload (some instances are 8976) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index ee881105c1..cd3db76b64 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -258,7 +258,7 @@ const triggerSet: TriggerSet = { { id: 'AAI Ketuduke Bubble Net', type: 'StartsUsing', - netRegex: { id: '8AAD', source: 'Ketuduke', capture: false }, + netRegex: { id: ['8AC5', '8AAD'], source: 'Ketuduke', capture: false }, response: Responses.aoe(), }, { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index bcd79808a3..506e79ffdf 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -104,7 +104,7 @@ hideall "--sync--" # 8AB2 Fluke Gale cast and ability for limit cut 1 wind # 8AB3 Fluke Gale cast and ability for limit cut 2 wind # 8AB4 Hydrofall self-targeted cast that adds stack markers -# 8AB5 Hydrofall ability on players to give "stack second" before Blowing Bubbles +# 8AB5 Hydrofall self-targeted "stack second" ability before Blowing Bubbles # 8AB6 Hydrofall ability on players that adds stack debuffs # 8AB7 Hydrofall damage from stack debuffs # 8AB8 Hydrobullet self-targeted cast that adds stack markers @@ -135,7 +135,7 @@ hideall "--sync--" # 8AD1 Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles # 8AD4 Tidal Roar self-targeted cast for raidwide aoe # 8AD5 Tidal Roar damage from 8AD4 -# 8C6D Hydrobullet ability on players to give "spread second" before Blowing Bubbles +# 8C6D Hydrobullet self-targeted "spread second" ability before Blowing Bubbles #~~~~~~# diff --git a/util/sync_files.ts b/util/sync_files.ts index 84ccacec20..45e8789d09 100644 --- a/util/sync_files.ts +++ b/util/sync_files.ts @@ -578,11 +578,11 @@ const zoneReplace: ZoneReplace[] = [ '7A56': '7A56', // --sync-- various auto damage (trash 1) '7A58': '7A58', // --sync-- various auto damage (trash 2) '8874': '8874', // --sync-- repositioning for Lala - '8889': '8BE0', // ??? Angular Addition self-targeted ability to give boss III - '888B': '8BE2', // ??? Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave - '888C': '8BE3', // ??? Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave - '888D': '8BE4', // ??? Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave - '888E': '8BE5', // ??? Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave + '8889': '8BE0', // Angular Addition self-targeted ability to give boss III + '888B': '8BE2', // Arcane Blight self-targeted cast for initial back-safe 270 degree rotating cleave + '888C': '8BE3', // Arcane Blight self-targeted cast for initial front-safe 270 degree rotating cleave + '888D': '8BE4', // Arcane Blight self-targeted cast for initial east-safe 270 degree rotating cleave + '888E': '8BE5', // Arcane Blight self-targeted cast for initial west-safe 270 degree rotating cleave '888F': '8BE6', // Arcane Blight cast and damage from 270 degree rotating cleave '8890': '8BE7', // Arcane Array self-targeted cast to summon moving blue squares (#1) '8891': '8BE8', // Bright Pulse cast and damage for initial blue square @@ -613,15 +613,15 @@ const zoneReplace: ZoneReplace[] = [ '8925': '8925', // Locked and Loaded ability during 894A Trick Reload when a bullet is in the gun '8926': '8926', // Misload ability during 894A Trick Reload when a bullet missed the gun oops '8927': '8927', // --sync-- repositioning from Statice - '8947': 'TODO', // --sync-- auto damage from Statice + '8947': '8964', // --sync-- auto damage from Statice '8948': '8965', // Shocking Abandon cast and tankbuster damage '8949': '8966', // Aero IV cast and raidwide damage '894A': '8967', // Trick Reload self-targeted cast to load gun with 8925/8926 '894B': '8968', // Trigger Happy self-targeted cast for limit cut dart board '894C': '8969', // Trigger Happy cast and damage for limit cut dart board (filled pie slice) '894D': '8927', // Surprise Balloon self-targeted cast - '894E': '896B', // ??? Pop knockback from Surprise Balloon being popped - '894F': '896C', // ??? Surprise Needle short cast and ability blue line aoe from needle adds that pop balloons + '894E': '896B', // Pop knockback from Surprise Balloon being popped + '894F': '896C', // Surprise Needle short cast and ability blue line aoe from needle adds that pop balloons '8954': '8971', // Uncommon Ground light damage on people who are not on a dartboard color with Bull's-eye '8955': '8972', // Present Box self-targeted cast for bombs/donuts/missiles/hands '8956': '8973', // Faerie Ring cast and damage for donut rings during Present Box @@ -636,7 +636,7 @@ const zoneReplace: ZoneReplace[] = [ '895F': '897C', // Fireworks two person stack damage during Present Box / Pinwheeling Dartboard '8960': '897D', // Fireworks spread damage during Present Box / Pinwheeling Dartboard '8963': '8980', // Beguiling Glitter self-targeted cast to give players Face debuffs - '8982': 'TODO', // Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) + '8982': '896F', // Fire Spread self-targeted damage for initial rotating fire (from Ball of Fire) '8987': '8988', // Trigger Happy cast and zero damage for limit cut dart board (empty pie slice) '89F9': '89FB', // Fire Spread ongoing rotating fire damage (from Statice) '8A6A': '8A6A', // --sync-- ability on Bomb when rotating @@ -657,7 +657,7 @@ const zoneReplace: ZoneReplace[] = [ '8AB2': '8AB2', // Fluke Gale cast and ability for limit cut 1 wind '8AB3': '8AB3', // Fluke Gale cast and ability for limit cut 2 wind '8AB4': '8AB4', // Hydrofall self-targeted cast that adds stack markers - '8AB5': '8AB5', // Hydrofall ability on players to give "stack second" before Blowing Bubbles + '8AB5': '8AB5', // Hydrofall self-targeted "stack second" ability before Blowing Bubbles '8AB6': '8AB6', // Hydrofall ability on players that adds stack debuffs '8AB7': '8ADE', // Hydrofall damage from stack debuffs '8AB8': '8AB8', // Hydrobullet self-targeted cast that adds stack markers @@ -666,8 +666,8 @@ const zoneReplace: ZoneReplace[] = [ '8ABB': '8ABB', // Strewn Bubbles self-targeted cast before 8ABC Sphere Shatter moving arches '8ABC': '8AE0', // Sphere Shatter damage from moving arches '8ABD': '8ABD', // Blowing Bubbles self-targeted cast that adds Airy Bubble Adds - '8ABE': 'TODO', // Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one - '8ABF': 'TODO', // Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after 8ABE Riptide + '8ABE': '8ABE', // Riptide ability on players from Blowing Bubbles Airy Bubble when you step in one + '8ABF': '8ABF', // Fetters ability on players from Blowing Bubbles Airy Bubble when you step in one after 8ABE Riptide '8AC0': '8AC0', // Angry Seas self-targeted cast for 8AC1 red line knockback '8AC1': '8AE1', // Angry Seas cast and knockback damage from red line '8AC2': '8AE2', // Burst tower damage @@ -698,6 +698,7 @@ const zoneReplace: ZoneReplace[] = [ '8BC0': '8BCF', // --sync-- damage from Twister tornados '8BC1': '8BD4', // Ovation cast and damage from Wood Golem front line aoe '8BC5': '8C3A', // Gravity Force cast and stack damage from Islekeeper + // TODO: I haven't seen any of these enrages. '8C23': 'TODO', // Aero IV cast and enrage damage '8C24': 'TODO', // Aero IV post-enrage follow-up damage just in case '8C25': 'TODO', // Inferno Theorem cast and enrage damage @@ -710,18 +711,18 @@ const zoneReplace: ZoneReplace[] = [ '8C63': '8BC8', // Sharp Strike casted damage from Kiwakin tank buster with a concussion dot '8C64': '8BCC', // Water III casted damage from Snipper stack marker '8C65': '8BD1', // Hydroshot casted damage from Monk knockback line with a dot - '8C6D': 'TODO', // Hydrobullet ability on players to give "spread second" before Blowing Bubbles + '8C6D': '8C6D', // Hydrobullet self-targeted "spread second" ability before Blowing Bubbles '8C6E': '8BC7', // Lead Hook casted damage from Kiwakin 3x tankbuster '8C6F': '8C3C', // Isle Drop cast and damage for Islekeeper front circle '8CBC': '8BCF', // Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire '8CBD': '8CC0', // Dartboard of Dancing Explosives self-targeted cast for colored dartboard - '8CBE': '8CC1', // ??? Burning Chains damage from not breaking chains - '8CC2': 'TODO', // Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye + '8CBE': '8CC1', // Burning Chains damage from not breaking chains + '8CC2': '8CC3', // Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye '8CDE': '8CE0', // Targeted Light self-targeted cast for weak spot boss tether '8CDF': '8CE1', // Targeted Light cast and damage on players for 8CDE '8D1A': '8D1C', // Trapshooting self-targeted cast after Trick Reload (some instances are 8959) '8D1F': '8D20', // Radiance damage from Arcane Globe being hit by a blue square (Arcane Array #2) - '8D2E': '8D2F', // ??? Angular Addition self-targeted ability to give boss V + '8D2E': '8D2F', // Angular Addition self-targeted ability to give boss V }, }, ]; From a6ddfbb090cd01370c6f5c00773400fc6a5d7254 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 13 Dec 2023 22:14:01 -0800 Subject: [PATCH 35/39] ketuduke enrage --- .../data/06-ew/dungeon/another_aloalo_island-savage.txt | 6 +++++- ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt | 6 +++++- util/sync_files.ts | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index 771090ebf7..501ec0d0b6 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -89,7 +89,10 @@ hideall "--sync--" 1313.7 "Far Tide/Near Tide" Ability { id: "(8AEA|8AE8)", source: "Ketuduke" } 1314.3 "Sphere Shatter 2" Ability { id: "8AE0", source: "Ketuduke" } 1314.3 "Hydrofall" Ability { id: "8ADE", source: "Ketuduke" } -# ??? +1325.0 "Tidal Roar" Ability { id: "8AD4", source: "Ketuduke" } + +1331.8 "--sync--" StartsUsing { id: "TODO", source: "Ketuduke" } +1341.8 "Tidal Roar Enrage" Ability { id: "TODO", source: "Ketuduke" } # ALL ENCOUNTER ABILITIES # 8A77 --sync-- Ketuduke repositioning @@ -140,6 +143,7 @@ hideall "--sync--" # 8AEB Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles # 8AD4 Tidal Roar self-targeted cast for raidwide aoe # 8AED Tidal Roar damage from 8AD4 +# TODO Tidal Roar cast and enrage damage # 8C6D Hydrobullet self-targeted "spread second" ability before Blowing Bubbles diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt index 506e79ffdf..fc7f6354d6 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt @@ -84,7 +84,10 @@ hideall "--sync--" 1313.7 "Far Tide/Near Tide" Ability { id: "(8ACF|8ACD)", source: "Ketuduke" } 1314.3 "Sphere Shatter 2" Ability { id: "8ABC", source: "Ketuduke" } 1314.3 "Hydrofall" Ability { id: "8AB7", source: "Ketuduke" } -# ??? +1325.0 "Tidal Roar" Ability { id: "8AD4", source: "Ketuduke" } + +1331.8 "--sync--" StartsUsing { id: "8AD6", source: "Ketuduke" } +1341.8 "Tidal Roar Enrage" Ability { id: "8AD6", source: "Ketuduke" } # ALL ENCOUNTER ABILITIES # 8A77 --sync-- Ketuduke repositioning @@ -135,6 +138,7 @@ hideall "--sync--" # 8AD1 Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles # 8AD4 Tidal Roar self-targeted cast for raidwide aoe # 8AD5 Tidal Roar damage from 8AD4 +# 8AD6 Tidal Roar cast and enrage damage # 8C6D Hydrobullet self-targeted "spread second" ability before Blowing Bubbles diff --git a/util/sync_files.ts b/util/sync_files.ts index 45e8789d09..1ab12fef19 100644 --- a/util/sync_files.ts +++ b/util/sync_files.ts @@ -574,6 +574,7 @@ const zoneReplace: ZoneReplace[] = [ }, // eslint-disable-next-line max-len // grep "^# [A-F0-9]\{4\} " ui/raidboss/data/06-ew/dungeon/another_aloalo_island.txt | sort | sed "s/^..//" | sed "s/^\(....\) \(.*\)$/ '\1': 'TODO', \/\/ \2/" + // TODO: missing various enrages (both listed and likely unlisted) id: { '7A56': '7A56', // --sync-- various auto damage (trash 1) '7A58': '7A58', // --sync-- various auto damage (trash 2) @@ -688,6 +689,7 @@ const zoneReplace: ZoneReplace[] = [ '8AD1': '8AEB', // Hydrobomb cast and damage for 3x puddles duruing 8ABD Blowing Bubbles '8AD4': '8AD4', // Tidal Roar self-targeted cast for raidwide aoe '8AD5': '8AED', // Tidal Roar damage from 8AD4 + '8AD6': 'TODO', // Tidal Roar cast and enrage damage '8BB8': '8BC9', // Tail Screw casted damage from Kiwakin baited circle '8BB9': '8BCA', // Bubble Shower casted damage from Snipper front conal '8BBA': '8BCB', // Crab Dribble fast casted damage from Snipper back conal after Bubble Shower 8BB9 @@ -698,7 +700,6 @@ const zoneReplace: ZoneReplace[] = [ '8BC0': '8BCF', // --sync-- damage from Twister tornados '8BC1': '8BD4', // Ovation cast and damage from Wood Golem front line aoe '8BC5': '8C3A', // Gravity Force cast and stack damage from Islekeeper - // TODO: I haven't seen any of these enrages. '8C23': 'TODO', // Aero IV cast and enrage damage '8C24': 'TODO', // Aero IV post-enrage follow-up damage just in case '8C25': 'TODO', // Inferno Theorem cast and enrage damage From 4ca683085fc69da599ed8ae2117fda3b4f74ea70 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 13 Dec 2023 22:23:07 -0800 Subject: [PATCH 36/39] xiashtra comments --- .../data/06-ew/dungeon/another_aloalo_island-savage.ts | 8 ++------ ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 67844b0094..5d6d29326c 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -12,6 +12,7 @@ import { PluginCombatantState } from '../../../../../types/event'; import { NetMatches } from '../../../../../types/net_matches'; import { TriggerSet } from '../../../../../types/trigger'; +// TODO: add callout for Monk Hydroshot target // TODO: sc3 should say which bubble to take to the other side (for everyone) // TODO: figure out directions for Lala for Radiance orbs // TODO: map effects for Lala @@ -733,12 +734,7 @@ const triggerSet: TriggerSet = { }, outputStrings: { text: { - en: 'Esuna ${player}', - de: 'Medica ${player}', - fr: 'Guérison sur ${player}', - ja: 'エスナ: ${player}', - cn: '解除死亡宣告: ${player}', - ko: '${player} 에스나', + en: 'Cleanse ${player}', }, }, }, diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index cd3db76b64..34b4ba0f06 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -7,6 +7,7 @@ import { PluginCombatantState } from '../../../../../types/event'; import { NetMatches } from '../../../../../types/net_matches'; import { TriggerSet } from '../../../../../types/trigger'; +// TODO: add callout for Monk Hydroshot target // TODO: sc3 should say which bubble to take to the other side (for everyone) // TODO: figure out directions for Lala for Radiance orbs // TODO: map effects for Lala @@ -728,12 +729,7 @@ const triggerSet: TriggerSet = { }, outputStrings: { text: { - en: 'Esuna ${player}', - de: 'Medica ${player}', - fr: 'Guérison sur ${player}', - ja: 'エスナ: ${player}', - cn: '解除死亡宣告: ${player}', - ko: '${player} 에스나', + en: 'Cleanse ${player}', }, }, }, From fae5d3b952aa88164a2d71e361dd36494cf8cbb8 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 13 Dec 2023 22:32:43 -0800 Subject: [PATCH 37/39] small fixes --- .../data/06-ew/dungeon/another_aloalo_island-savage.ts | 4 ++-- .../data/06-ew/dungeon/another_aloalo_island-savage.txt | 4 ++-- ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts | 2 +- util/sync_files.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 5d6d29326c..6d2b39806f 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -1350,7 +1350,7 @@ const triggerSet: TriggerSet = { en: 'No Dart', }, flexCall: { - en: '(${player} flex)', + en: '(${player} unmarked)', }, }; @@ -1778,7 +1778,7 @@ const triggerSet: TriggerSet = { { id: 'AAIS Statice Pinwheeling Dartboard Tracker', type: 'StartsUsing', - netRegex: { id: '8BCF', source: 'Statice', capture: false }, + netRegex: { id: '8CBF', source: 'Statice', capture: false }, run: (data) => data.staticeIsPinwheelingDartboard = true, }, { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt index 501ec0d0b6..dc01e052af 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.txt @@ -326,7 +326,7 @@ hideall "--sync--" 3206.3 "--targetable--" 3212.5 "Shocking Abandon" Ability { id: "8965", source: "Statice" } -3222.7 "Pinwheeling Dartboard" Ability { id: "8BCF", source: "Statice" } +3222.7 "Pinwheeling Dartboard" Ability { id: "8CBF", source: "Statice" } 3231.4 "Fireworks (cast)" Ability { id: "897B", source: "Statice" } 3233.4 "Fire Spread" Ability { id: "8952", source: "Statice" } duration 11 3241.3 "Fireworks" Ability { id: "897C", source: "Statice" } @@ -384,7 +384,7 @@ hideall "--sync--" # 8A6A --sync-- ability on Bomb when rotating # TODO Aero IV cast and enrage damage # TODO Aero IV post-enrage follow-up damage just in case -# 8BCF Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire +# 8CBF Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire # 8CC0 Dartboard of Dancing Explosives self-targeted cast for colored dartboard # 8CC1 Burning Chains damage from not breaking chains # 8CC3 Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 34b4ba0f06..bd050dea65 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -1345,7 +1345,7 @@ const triggerSet: TriggerSet = { en: 'No Dart', }, flexCall: { - en: '(${player} flex)', + en: '(${player} unmarked)', }, }; diff --git a/util/sync_files.ts b/util/sync_files.ts index 1ab12fef19..c2700fb073 100644 --- a/util/sync_files.ts +++ b/util/sync_files.ts @@ -715,7 +715,7 @@ const zoneReplace: ZoneReplace[] = [ '8C6D': '8C6D', // Hydrobullet self-targeted "spread second" ability before Blowing Bubbles '8C6E': '8BC7', // Lead Hook casted damage from Kiwakin 3x tankbuster '8C6F': '8C3C', // Isle Drop cast and damage for Islekeeper front circle - '8CBC': '8BCF', // Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire + '8CBC': '8CBF', // Pinwheeling Dartboard self-targeted cast to summon dartboard with rotating fire '8CBD': '8CC0', // Dartboard of Dancing Explosives self-targeted cast for colored dartboard '8CBE': '8CC1', // Burning Chains damage from not breaking chains '8CC2': '8CC3', // Uncommon Ground heavy damage on people who are on the same dartboard color with Bull's-eye From 139f36b3f247ba1af36b644635306f82a6069fd2 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Wed, 13 Dec 2023 22:38:40 -0800 Subject: [PATCH 38/39] undo extra op lines --- resources/netlog_defs.ts | 40 -- .../dungeon/another_aloalo_island-savage.ts | 373 +----------------- .../06-ew/dungeon/another_aloalo_island.ts | 373 +----------------- util/gen_log_guide.ts | 10 - 4 files changed, 2 insertions(+), 794 deletions(-) diff --git a/resources/netlog_defs.ts b/resources/netlog_defs.ts index 7a77743d17..297db5a06e 100644 --- a/resources/netlog_defs.ts +++ b/resources/netlog_defs.ts @@ -1178,46 +1178,6 @@ const latestLogDefinitions = { canAnonymize: true, firstOptionalField: 9, }, - SpawnNpcExtra: { - type: '265', - name: 'SpawnNpcExtra', - source: 'OverlayPlugin', - messageType: '265', - fields: { - type: 0, - timestamp: 1, - sourceId: 2, - parentActorId: 3, - tetherId: 4, - }, - playerIds: { - 2: null, - }, - canAnonymize: true, - firstOptionalField: undefined, - }, - ActorControlExtra: { - type: '266', - name: 'ActorControlExtra', - source: 'OverlayPlugin', - messageType: '266', - fields: { - type: 0, - timestamp: 1, - sourceId: 2, - category: 3, - param1: 4, - param2: 5, - param3: 6, - param4: 7, - }, - blankFields: [6], - playerIds: { - 2: null, - }, - canAnonymize: true, - firstOptionalField: undefined, - }, } as const; export const logDefinitionsVersions = { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 6d2b39806f..3ee663fe2e 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -41,13 +41,7 @@ export interface Data extends RaidbossData { staticePopTriggerHappyNum?: number; staticeTrapshooting: ('stack' | 'spread' | undefined)[]; staticeDart: NetMatches['GainsEffect'][]; - staticeBombRotateCount: number; - staticeBomb: NetMatches['AddedCombatant'][]; - staticeBombTether: NetMatches['SpawnNpcExtra'][]; - staticeSafeBombIds: string[]; staticePresentBoxCount: number; - staticePresentBox1StackSpot?: number; - staticePresentBox1TopOfTriangleDir?: number; staticeMissileCollect: NetMatches['AddedCombatant'][]; staticeMissileIdToDir: { [id: string]: number }; staticeMissileTether: NetMatches['Tether'][]; @@ -68,19 +62,6 @@ const headmarkerIds = { enumeration: '015B', } as const; -const xyTo5DirBombNum = (x: number, y: number): number => { - // Six bombs are in a pentagram with one in the middle. - // N = 0, NE = 1, SE = 2, SW = 3, NW = 4, Center = 5 - const centerX = -200; - const centerY = 0; - x = x - centerX; - y = y - centerY; - if (Math.abs(x) < 1 && Math.abs(y) < 1) - return 5; - // Find the closest spoke of the pentagram. - return Math.round(2.5 - 2.5 * Math.atan2(x, y) / Math.PI) % 5; -}; - // TODO: this maybe should be a method on party? const isStandardLightParty = (data: Data): boolean => { const supports = [...data.party.healerNames, ...data.party.tankNames]; @@ -104,10 +85,6 @@ const triggerSet: TriggerSet = { staticeBullet: [], staticeTrapshooting: [], staticeDart: [], - staticeBombRotateCount: 0, - staticeBomb: [], - staticeBombTether: [], - staticeSafeBombIds: [], staticePresentBoxCount: 0, staticeMissileCollect: [], staticeMissileIdToDir: {}, @@ -1196,141 +1173,6 @@ const triggerSet: TriggerSet = { num6: Outputs.num6, }, }, - { - id: 'AAIS Statice Ring a Ring o\' Explosions Cleanup', - type: 'StartsUsing', - netRegex: { id: '8979', source: 'Statice', capture: false }, - run: (data) => { - data.staticeBomb = []; - data.staticeBombTether = []; - data.staticeSafeBombIds = []; - }, - }, - { - id: 'AAIS Statice Bomb Add', - type: 'AddedCombatant', - netRegex: { npcNameId: '12520' }, - run: (data, matches) => data.staticeBomb.push(matches), - }, - { - id: 'AAIS Statice Bomb Tether', - type: 'SpawnNpcExtra', - netRegex: {}, - run: (data, matches) => data.staticeBombTether.push(matches), - }, - { - id: 'AAIS Statice Bomb Activate', - type: 'ActorControlExtra', - netRegex: { param2: '00000001' }, - run: (data, matches) => { - const activeBombIds: string[] = []; - - const idToNpcSpawnExtra: { [id: string]: NetMatches['SpawnNpcExtra'] } = {}; - for (const npcSpawnExtra of data.staticeBombTether) - idToNpcSpawnExtra[npcSpawnExtra.sourceId] = npcSpawnExtra; - - let currentBomb = matches.sourceId; - for (let i = 0; i < 3; ++i) { - const npcSpawnExtra = idToNpcSpawnExtra[currentBomb]; - if (npcSpawnExtra === undefined) - break; - currentBomb = npcSpawnExtra?.parentActorId; - activeBombIds.push(currentBomb); - } - - // TODO: validate all bombs are in the add lines too. - if (activeBombIds.length !== 3 || !activeBombIds.includes(matches.sourceId)) { - console.error('Failed to find active bombs'); - console.error(JSON.stringify(data.staticeBomb)); - console.error(JSON.stringify(data.staticeBombTether)); - console.error(JSON.stringify(activeBombIds)); - } else { - const validBombIds = data.staticeBomb.map((x) => x.id); - data.staticeSafeBombIds = validBombIds.filter((id) => !activeBombIds.includes(id)); - } - }, - }, - { - id: 'AAIS Statice Bomb Count', - type: 'Ability', - netRegex: { id: '8A6A' }, - run: (data, matches) => { - const firstBomb = data.staticeSafeBombIds[0]; - if (matches.targetId === firstBomb) - data.staticeBombRotateCount++; - }, - }, - { - id: 'AAIS Statice Bomb Rotate Final', - type: 'Ability', - netRegex: { id: '8A6A', capture: false }, - delaySeconds: 4, - durationSeconds: 6, - suppressSeconds: 10, - alertText: (data, _matches, output) => { - if (data.staticeSafeBombIds.length !== 3) - return; - - const bombToDir: { [id: string]: number } = {}; - for (const id of data.staticeSafeBombIds) { - const addLine = data.staticeBomb.find((x) => x.id === id); - if (addLine === undefined) - break; - const x = parseFloat(addLine.x); - const y = parseFloat(addLine.y); - bombToDir[id] = xyTo5DirBombNum(x, y); - } - - // Sort bomb ids from original north and clockwise to be consistent in callout. - // This makes it possible to consistently go to the same place as a group. - const sortedIds = [...data.staticeSafeBombIds].sort((a, b) => { - return (bombToDir[a] ?? 0) - (bombToDir[b] ?? 0); - }); - - const safeSpots = sortedIds.map((id) => { - const dir = bombToDir[id]; - if (dir === undefined) - return output.unknown!(); - if (dir === 5) - return output.center!(); - return { - 0: output.dirN!(), - 1: output.dirNE!(), - 2: output.dirSE!(), - 3: output.dirSW!(), - 4: output.dirNW!(), - }[(dir + data.staticeBombRotateCount) % 5] ?? output.unknown!(); - }); - - const mech = output[data.staticeTrapshooting.shift() ?? 'unknown']!(); - // This is kinda hacky, but in order to suppress the next trapshooting call, - // replace the mech we just shifted off with an undefined. - data.staticeTrapshooting.unshift(undefined); - - if (sortedIds.find((id) => bombToDir[id] === 5) !== undefined) - return output.middleSafe!({ spots: safeSpots, mech: mech }); - return output.middleUnsafe!({ spots: safeSpots, mech: mech }); - }, - outputStrings: { - middleSafe: { - en: '${spots} => ${mech}', - }, - middleUnsafe: { - en: '${spots} (middle unsafe) => ${mech}', - }, - dirN: Outputs.dirN, - dirNE: Outputs.dirNE, - dirSE: Outputs.dirSE, - dirSW: Outputs.dirSW, - dirNW: Outputs.dirNW, - center: { - en: 'Center', - }, - spread: Outputs.spread, - stack: Outputs.stackMarker, - unknown: Outputs.unknown, - }, - }, { id: 'AAIS Statice Bull\'s-eye', type: 'GainsEffect', @@ -1496,169 +1338,6 @@ const triggerSet: TriggerSet = { netRegex: { id: '8972', source: 'Statice', capture: false }, run: (data) => data.staticePresentBoxCount++, }, - { - id: 'AAIS Statice Present Box One Triangle', - type: 'ActorControlExtra', - // TODO: we could do this call even before the glow with the tethers by treating - // the middle bomb as glowing, but that'd be extra work for little benefit. - netRegex: { param2: '00000001', capture: false }, - condition: (data) => data.staticePresentBoxCount === 1, - infoText: (data, _matches, output) => { - if (data.staticeSafeBombIds.length !== 3) - return; - - const bombToDir: { [id: string]: number } = {}; - for (const id of data.staticeSafeBombIds) { - const addLine = data.staticeBomb.find((x) => x.id === id); - if (addLine === undefined) - break; - const x = parseFloat(addLine.x); - const y = parseFloat(addLine.y); - bombToDir[id] = xyTo5DirBombNum(x, y); - } - - const sortedBombDirs = data.staticeSafeBombIds.map((x) => bombToDir[x]).sort(); - - for (const start of [0, 1, 2]) { - const dir1 = sortedBombDirs[start]; - const dir2 = sortedBombDirs[(start + 1) % 3]; - const dir3 = sortedBombDirs[(start + 2) % 3]; - if (dir1 === undefined || dir2 === undefined || dir3 === undefined) - return; - - if ((dir1 + 1) % 5 !== dir2) - continue; - if ((dir2 + 1) % 5 !== dir3) { - // If we get here, then dir1 and dir2 are adjacent to each other, but not dir3. - // Save this work off for the missiles later. - data.staticePresentBox1TopOfTriangleDir = (dir2 + 2) % 5; - continue; - } - - data.staticePresentBox1TopOfTriangleDir = dir2; - data.staticePresentBox1StackSpot = dir2; - - // dir2 is in the middle - const outputDir = { - 0: output.dirN!(), - 1: output.dirNE!(), - 2: output.dirSE!(), - 3: output.dirSW!(), - 4: output.dirNW!(), - }[dir2]; - return output.text!({ dir: outputDir }); - } - }, - outputStrings: { - text: { - en: '(stack is at ${dir})', - }, - dirN: Outputs.dirN, - dirNE: Outputs.dirNE, - dirSE: Outputs.dirSE, - dirSW: Outputs.dirSW, - dirNW: Outputs.dirNW, - }, - }, - { - id: 'AAIS Statice Surprising Missile Collect', - type: 'AddedCombatant', - netRegex: { npcNameId: '12517' }, - run: (data, matches) => { - data.staticeMissileCollect.push(matches); - if (data.staticeMissileCollect.length !== 2) - return; - - // TODO: this is maybe duplicated too much, but it does extra work here? - const bombToDir: { [id: string]: number } = {}; - const bombToPos: { [id: string]: { x: number; y: number } } = {}; - let topBombPos: { x: number; y: number } | undefined; - for (const id of data.staticeSafeBombIds) { - const addLine = data.staticeBomb.find((x) => x.id === id); - if (addLine === undefined) - break; - const x = parseFloat(addLine.x); - const y = parseFloat(addLine.y); - const dir = xyTo5DirBombNum(x, y); - bombToDir[id] = dir; - bombToPos[id] = { x, y }; - if (dir === data.staticePresentBox1TopOfTriangleDir) - topBombPos = { x, y }; - } - - const topBombDir = data.staticePresentBox1TopOfTriangleDir; - if (topBombPos === undefined || topBombDir === undefined) - return; - - // If we already know the stack spot, eliminate it from the valid safe dirs to avoid any logic errors later. - const stackDir = data.staticePresentBox1StackSpot; - const nonStackBombIds = data.staticeSafeBombIds.filter((id) => bombToDir[id] !== stackDir); - - // For the intersecting triangle case, find the missile furthest from the top of the triangle - // and tell them to go there. It sure seems like missiles need to run north/south along - // the long direction of this safe triangle of bombs to break the tether, so even if the - // missiles are lateral (relatively) and the furthest two spots are the bottom of the triangle - // they need to still go N/S (relative). - const missileDirs: number[] = []; - if (stackDir === undefined) { - let furthestMissileId: string | undefined; - let furthestDistanceSqr: number | undefined; - for (const missile of data.staticeMissileCollect) { - const xDiff = parseFloat(missile.x) - topBombPos.x; - const yDiff = parseFloat(missile.y) - topBombPos.y; - const distSqr = xDiff * xDiff + yDiff * yDiff; - if (furthestDistanceSqr === undefined || distSqr > furthestDistanceSqr) { - furthestDistanceSqr = distSqr; - furthestMissileId = missile.id; - } - } - if (furthestMissileId === undefined) - return; - missileDirs.push(topBombDir); - data.staticeMissileIdToDir[furthestMissileId] = topBombDir; - } - - // Solve for remaining missiles. - // For the "disconnected triangle" case, this will solve for both, ignoring the middle stack spot. - // For the "intersecting triangle" case, this will solve the remaining missile ignoring the top of the triangle. - for (const missile of data.staticeMissileCollect) { - // if we already solved this one above, ignore it. - if (data.staticeMissileIdToDir[missile.id] !== undefined) - continue; - let furthestDir: number | undefined; - let furthestDistanceSqr: number | undefined; - for (const id of nonStackBombIds) { - const pos = bombToPos[id]; - if (pos === undefined) - return; - const xDiff = parseFloat(missile.x) - pos.x; - const yDiff = parseFloat(missile.y) - pos.y; - const distSqr = xDiff * xDiff + yDiff * yDiff; - if (furthestDistanceSqr === undefined || distSqr > furthestDistanceSqr) { - furthestDistanceSqr = distSqr; - furthestDir = bombToDir[id]; - } - } - - if (furthestDir !== undefined) { - data.staticeMissileIdToDir[missile.id] = furthestDir; - missileDirs.push(furthestDir); - } - } - - if (stackDir !== undefined) - return; - - const safeDirs = data.staticeSafeBombIds.map((id) => bombToDir[id]); - const maybeStackDirs = safeDirs.filter((dir) => - dir !== undefined && !missileDirs.includes(dir) - ); - const [finalStackDir] = maybeStackDirs; - - if (maybeStackDirs.length === 1 && finalStackDir !== undefined) - data.staticePresentBox1StackSpot = finalStackDir; - }, - }, { id: 'AAIS Statice Present Box Missile', type: 'Tether', @@ -1674,17 +1353,6 @@ const triggerSet: TriggerSet = { missileOnYou: { en: 'Bait Tethers => Missile Spread', }, - missileOnYouDir: { - en: 'Bait Tethers => Missile Spread ${dir}', - }, - stackAt: { - en: '(stack is at ${dir})', - }, - dirN: Outputs.dirN, - dirNE: Outputs.dirNE, - dirSE: Outputs.dirSE, - dirSW: Outputs.dirSW, - dirNW: Outputs.dirNW, }; if (data.staticeMissileTether.length !== 2) @@ -1694,26 +1362,7 @@ const triggerSet: TriggerSet = { if (missileTether === undefined) return; - const dirToStr: { [dir: number]: string } = { - 0: output.dirN!(), - 1: output.dirNE!(), - 2: output.dirSE!(), - 3: output.dirSW!(), - 4: output.dirNW!(), - } as const; - - let infoText: string | undefined; - const stackDir = data.staticePresentBox1StackSpot; - if (stackDir !== undefined) - infoText = output.stackAt!({ dir: dirToStr[stackDir] }); - - const missileDir = data.staticeMissileIdToDir[missileTether.sourceId]; - if (missileDir === undefined) - return { alertText: output.missileOnYou!(), infoText: infoText }; - return { - alertText: output.missileOnYouDir!({ dir: dirToStr[missileDir] }), - infoText: infoText, - }; + return { alertText: output.missileOnYou!() }; }, run: (data) => data.staticeMissileTether = [], }, @@ -1731,18 +1380,6 @@ const triggerSet: TriggerSet = { return; if (!data.staticeClawTether.map((x) => x.target).includes(data.me)) return; - - const dirToStr: { [dir: number]: string } = { - 0: output.dirN!(), - 1: output.dirNE!(), - 2: output.dirSE!(), - 3: output.dirSW!(), - 4: output.dirNW!(), - } as const; - - const stackDir = data.staticePresentBox1StackSpot; - if (stackDir !== undefined) - return output.stackAt!({ dir: dirToStr[stackDir] }); return output.stack!(); }, run: (data) => data.staticeClawTether = [], @@ -1750,14 +1387,6 @@ const triggerSet: TriggerSet = { stack: { en: 'Juke Claw => Stack', }, - stackAt: { - en: 'Juke Claw => Stack ${dir}', - }, - dirN: Outputs.dirN, - dirNE: Outputs.dirNE, - dirSE: Outputs.dirSE, - dirSW: Outputs.dirSW, - dirNW: Outputs.dirNW, }, }, { diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index bd050dea65..6cf41f40b3 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -36,13 +36,7 @@ export interface Data extends RaidbossData { staticePopTriggerHappyNum?: number; staticeTrapshooting: ('stack' | 'spread' | undefined)[]; staticeDart: NetMatches['GainsEffect'][]; - staticeBombRotateCount: number; - staticeBomb: NetMatches['AddedCombatant'][]; - staticeBombTether: NetMatches['SpawnNpcExtra'][]; - staticeSafeBombIds: string[]; staticePresentBoxCount: number; - staticePresentBox1StackSpot?: number; - staticePresentBox1TopOfTriangleDir?: number; staticeMissileCollect: NetMatches['AddedCombatant'][]; staticeMissileIdToDir: { [id: string]: number }; staticeMissileTether: NetMatches['Tether'][]; @@ -63,19 +57,6 @@ const headmarkerIds = { enumeration: '015B', } as const; -const xyTo5DirBombNum = (x: number, y: number): number => { - // Six bombs are in a pentagram with one in the middle. - // N = 0, NE = 1, SE = 2, SW = 3, NW = 4, Center = 5 - const centerX = -200; - const centerY = 0; - x = x - centerX; - y = y - centerY; - if (Math.abs(x) < 1 && Math.abs(y) < 1) - return 5; - // Find the closest spoke of the pentagram. - return Math.round(2.5 - 2.5 * Math.atan2(x, y) / Math.PI) % 5; -}; - // TODO: this maybe should be a method on party? const isStandardLightParty = (data: Data): boolean => { const supports = [...data.party.healerNames, ...data.party.tankNames]; @@ -99,10 +80,6 @@ const triggerSet: TriggerSet = { staticeBullet: [], staticeTrapshooting: [], staticeDart: [], - staticeBombRotateCount: 0, - staticeBomb: [], - staticeBombTether: [], - staticeSafeBombIds: [], staticePresentBoxCount: 0, staticeMissileCollect: [], staticeMissileIdToDir: {}, @@ -1191,141 +1168,6 @@ const triggerSet: TriggerSet = { num6: Outputs.num6, }, }, - { - id: 'AAI Statice Ring a Ring o\' Explosions Cleanup', - type: 'StartsUsing', - netRegex: { id: '895C', source: 'Statice', capture: false }, - run: (data) => { - data.staticeBomb = []; - data.staticeBombTether = []; - data.staticeSafeBombIds = []; - }, - }, - { - id: 'AAI Statice Bomb Add', - type: 'AddedCombatant', - netRegex: { npcNameId: '12520' }, - run: (data, matches) => data.staticeBomb.push(matches), - }, - { - id: 'AAI Statice Bomb Tether', - type: 'SpawnNpcExtra', - netRegex: {}, - run: (data, matches) => data.staticeBombTether.push(matches), - }, - { - id: 'AAI Statice Bomb Activate', - type: 'ActorControlExtra', - netRegex: { param2: '00000001' }, - run: (data, matches) => { - const activeBombIds: string[] = []; - - const idToNpcSpawnExtra: { [id: string]: NetMatches['SpawnNpcExtra'] } = {}; - for (const npcSpawnExtra of data.staticeBombTether) - idToNpcSpawnExtra[npcSpawnExtra.sourceId] = npcSpawnExtra; - - let currentBomb = matches.sourceId; - for (let i = 0; i < 3; ++i) { - const npcSpawnExtra = idToNpcSpawnExtra[currentBomb]; - if (npcSpawnExtra === undefined) - break; - currentBomb = npcSpawnExtra?.parentActorId; - activeBombIds.push(currentBomb); - } - - // TODO: validate all bombs are in the add lines too. - if (activeBombIds.length !== 3 || !activeBombIds.includes(matches.sourceId)) { - console.error('Failed to find active bombs'); - console.error(JSON.stringify(data.staticeBomb)); - console.error(JSON.stringify(data.staticeBombTether)); - console.error(JSON.stringify(activeBombIds)); - } else { - const validBombIds = data.staticeBomb.map((x) => x.id); - data.staticeSafeBombIds = validBombIds.filter((id) => !activeBombIds.includes(id)); - } - }, - }, - { - id: 'AAI Statice Bomb Count', - type: 'Ability', - netRegex: { id: '8A6A' }, - run: (data, matches) => { - const firstBomb = data.staticeSafeBombIds[0]; - if (matches.targetId === firstBomb) - data.staticeBombRotateCount++; - }, - }, - { - id: 'AAI Statice Bomb Rotate Final', - type: 'Ability', - netRegex: { id: '8A6A', capture: false }, - delaySeconds: 4, - durationSeconds: 6, - suppressSeconds: 10, - alertText: (data, _matches, output) => { - if (data.staticeSafeBombIds.length !== 3) - return; - - const bombToDir: { [id: string]: number } = {}; - for (const id of data.staticeSafeBombIds) { - const addLine = data.staticeBomb.find((x) => x.id === id); - if (addLine === undefined) - break; - const x = parseFloat(addLine.x); - const y = parseFloat(addLine.y); - bombToDir[id] = xyTo5DirBombNum(x, y); - } - - // Sort bomb ids from original north and clockwise to be consistent in callout. - // This makes it possible to consistently go to the same place as a group. - const sortedIds = [...data.staticeSafeBombIds].sort((a, b) => { - return (bombToDir[a] ?? 0) - (bombToDir[b] ?? 0); - }); - - const safeSpots = sortedIds.map((id) => { - const dir = bombToDir[id]; - if (dir === undefined) - return output.unknown!(); - if (dir === 5) - return output.center!(); - return { - 0: output.dirN!(), - 1: output.dirNE!(), - 2: output.dirSE!(), - 3: output.dirSW!(), - 4: output.dirNW!(), - }[(dir + data.staticeBombRotateCount) % 5] ?? output.unknown!(); - }); - - const mech = output[data.staticeTrapshooting.shift() ?? 'unknown']!(); - // This is kinda hacky, but in order to suppress the next trapshooting call, - // replace the mech we just shifted off with an undefined. - data.staticeTrapshooting.unshift(undefined); - - if (sortedIds.find((id) => bombToDir[id] === 5) !== undefined) - return output.middleSafe!({ spots: safeSpots, mech: mech }); - return output.middleUnsafe!({ spots: safeSpots, mech: mech }); - }, - outputStrings: { - middleSafe: { - en: '${spots} => ${mech}', - }, - middleUnsafe: { - en: '${spots} (middle unsafe) => ${mech}', - }, - dirN: Outputs.dirN, - dirNE: Outputs.dirNE, - dirSE: Outputs.dirSE, - dirSW: Outputs.dirSW, - dirNW: Outputs.dirNW, - center: { - en: 'Center', - }, - spread: Outputs.spread, - stack: Outputs.stackMarker, - unknown: Outputs.unknown, - }, - }, { id: 'AAI Statice Bull\'s-eye', type: 'GainsEffect', @@ -1491,169 +1333,6 @@ const triggerSet: TriggerSet = { netRegex: { id: '8955', source: 'Statice', capture: false }, run: (data) => data.staticePresentBoxCount++, }, - { - id: 'AAI Statice Present Box One Triangle', - type: 'ActorControlExtra', - // TODO: we could do this call even before the glow with the tethers by treating - // the middle bomb as glowing, but that'd be extra work for little benefit. - netRegex: { param2: '00000001', capture: false }, - condition: (data) => data.staticePresentBoxCount === 1, - infoText: (data, _matches, output) => { - if (data.staticeSafeBombIds.length !== 3) - return; - - const bombToDir: { [id: string]: number } = {}; - for (const id of data.staticeSafeBombIds) { - const addLine = data.staticeBomb.find((x) => x.id === id); - if (addLine === undefined) - break; - const x = parseFloat(addLine.x); - const y = parseFloat(addLine.y); - bombToDir[id] = xyTo5DirBombNum(x, y); - } - - const sortedBombDirs = data.staticeSafeBombIds.map((x) => bombToDir[x]).sort(); - - for (const start of [0, 1, 2]) { - const dir1 = sortedBombDirs[start]; - const dir2 = sortedBombDirs[(start + 1) % 3]; - const dir3 = sortedBombDirs[(start + 2) % 3]; - if (dir1 === undefined || dir2 === undefined || dir3 === undefined) - return; - - if ((dir1 + 1) % 5 !== dir2) - continue; - if ((dir2 + 1) % 5 !== dir3) { - // If we get here, then dir1 and dir2 are adjacent to each other, but not dir3. - // Save this work off for the missiles later. - data.staticePresentBox1TopOfTriangleDir = (dir2 + 2) % 5; - continue; - } - - data.staticePresentBox1TopOfTriangleDir = dir2; - data.staticePresentBox1StackSpot = dir2; - - // dir2 is in the middle - const outputDir = { - 0: output.dirN!(), - 1: output.dirNE!(), - 2: output.dirSE!(), - 3: output.dirSW!(), - 4: output.dirNW!(), - }[dir2]; - return output.text!({ dir: outputDir }); - } - }, - outputStrings: { - text: { - en: '(stack is at ${dir})', - }, - dirN: Outputs.dirN, - dirNE: Outputs.dirNE, - dirSE: Outputs.dirSE, - dirSW: Outputs.dirSW, - dirNW: Outputs.dirNW, - }, - }, - { - id: 'AAI Statice Surprising Missile Collect', - type: 'AddedCombatant', - netRegex: { npcNameId: '12517' }, - run: (data, matches) => { - data.staticeMissileCollect.push(matches); - if (data.staticeMissileCollect.length !== 2) - return; - - // TODO: this is maybe duplicated too much, but it does extra work here? - const bombToDir: { [id: string]: number } = {}; - const bombToPos: { [id: string]: { x: number; y: number } } = {}; - let topBombPos: { x: number; y: number } | undefined; - for (const id of data.staticeSafeBombIds) { - const addLine = data.staticeBomb.find((x) => x.id === id); - if (addLine === undefined) - break; - const x = parseFloat(addLine.x); - const y = parseFloat(addLine.y); - const dir = xyTo5DirBombNum(x, y); - bombToDir[id] = dir; - bombToPos[id] = { x, y }; - if (dir === data.staticePresentBox1TopOfTriangleDir) - topBombPos = { x, y }; - } - - const topBombDir = data.staticePresentBox1TopOfTriangleDir; - if (topBombPos === undefined || topBombDir === undefined) - return; - - // If we already know the stack spot, eliminate it from the valid safe dirs to avoid any logic errors later. - const stackDir = data.staticePresentBox1StackSpot; - const nonStackBombIds = data.staticeSafeBombIds.filter((id) => bombToDir[id] !== stackDir); - - // For the intersecting triangle case, find the missile furthest from the top of the triangle - // and tell them to go there. It sure seems like missiles need to run north/south along - // the long direction of this safe triangle of bombs to break the tether, so even if the - // missiles are lateral (relatively) and the furthest two spots are the bottom of the triangle - // they need to still go N/S (relative). - const missileDirs: number[] = []; - if (stackDir === undefined) { - let furthestMissileId: string | undefined; - let furthestDistanceSqr: number | undefined; - for (const missile of data.staticeMissileCollect) { - const xDiff = parseFloat(missile.x) - topBombPos.x; - const yDiff = parseFloat(missile.y) - topBombPos.y; - const distSqr = xDiff * xDiff + yDiff * yDiff; - if (furthestDistanceSqr === undefined || distSqr > furthestDistanceSqr) { - furthestDistanceSqr = distSqr; - furthestMissileId = missile.id; - } - } - if (furthestMissileId === undefined) - return; - missileDirs.push(topBombDir); - data.staticeMissileIdToDir[furthestMissileId] = topBombDir; - } - - // Solve for remaining missiles. - // For the "disconnected triangle" case, this will solve for both, ignoring the middle stack spot. - // For the "intersecting triangle" case, this will solve the remaining missile ignoring the top of the triangle. - for (const missile of data.staticeMissileCollect) { - // if we already solved this one above, ignore it. - if (data.staticeMissileIdToDir[missile.id] !== undefined) - continue; - let furthestDir: number | undefined; - let furthestDistanceSqr: number | undefined; - for (const id of nonStackBombIds) { - const pos = bombToPos[id]; - if (pos === undefined) - return; - const xDiff = parseFloat(missile.x) - pos.x; - const yDiff = parseFloat(missile.y) - pos.y; - const distSqr = xDiff * xDiff + yDiff * yDiff; - if (furthestDistanceSqr === undefined || distSqr > furthestDistanceSqr) { - furthestDistanceSqr = distSqr; - furthestDir = bombToDir[id]; - } - } - - if (furthestDir !== undefined) { - data.staticeMissileIdToDir[missile.id] = furthestDir; - missileDirs.push(furthestDir); - } - } - - if (stackDir !== undefined) - return; - - const safeDirs = data.staticeSafeBombIds.map((id) => bombToDir[id]); - const maybeStackDirs = safeDirs.filter((dir) => - dir !== undefined && !missileDirs.includes(dir) - ); - const [finalStackDir] = maybeStackDirs; - - if (maybeStackDirs.length === 1 && finalStackDir !== undefined) - data.staticePresentBox1StackSpot = finalStackDir; - }, - }, { id: 'AAI Statice Present Box Missile', type: 'Tether', @@ -1669,17 +1348,6 @@ const triggerSet: TriggerSet = { missileOnYou: { en: 'Bait Tethers => Missile Spread', }, - missileOnYouDir: { - en: 'Bait Tethers => Missile Spread ${dir}', - }, - stackAt: { - en: '(stack is at ${dir})', - }, - dirN: Outputs.dirN, - dirNE: Outputs.dirNE, - dirSE: Outputs.dirSE, - dirSW: Outputs.dirSW, - dirNW: Outputs.dirNW, }; if (data.staticeMissileTether.length !== 2) @@ -1689,26 +1357,7 @@ const triggerSet: TriggerSet = { if (missileTether === undefined) return; - const dirToStr: { [dir: number]: string } = { - 0: output.dirN!(), - 1: output.dirNE!(), - 2: output.dirSE!(), - 3: output.dirSW!(), - 4: output.dirNW!(), - } as const; - - let infoText: string | undefined; - const stackDir = data.staticePresentBox1StackSpot; - if (stackDir !== undefined) - infoText = output.stackAt!({ dir: dirToStr[stackDir] }); - - const missileDir = data.staticeMissileIdToDir[missileTether.sourceId]; - if (missileDir === undefined) - return { alertText: output.missileOnYou!(), infoText: infoText }; - return { - alertText: output.missileOnYouDir!({ dir: dirToStr[missileDir] }), - infoText: infoText, - }; + return { alertText: output.missileOnYou!() }; }, run: (data) => data.staticeMissileTether = [], }, @@ -1726,18 +1375,6 @@ const triggerSet: TriggerSet = { return; if (!data.staticeClawTether.map((x) => x.target).includes(data.me)) return; - - const dirToStr: { [dir: number]: string } = { - 0: output.dirN!(), - 1: output.dirNE!(), - 2: output.dirSE!(), - 3: output.dirSW!(), - 4: output.dirNW!(), - } as const; - - const stackDir = data.staticePresentBox1StackSpot; - if (stackDir !== undefined) - return output.stackAt!({ dir: dirToStr[stackDir] }); return output.stack!(); }, run: (data) => data.staticeClawTether = [], @@ -1745,14 +1382,6 @@ const triggerSet: TriggerSet = { stack: { en: 'Juke Claw => Stack', }, - stackAt: { - en: 'Juke Claw => Stack ${dir}', - }, - dirN: Outputs.dirN, - dirNE: Outputs.dirNE, - dirSE: Outputs.dirSE, - dirSW: Outputs.dirSW, - dirNW: Outputs.dirNW, }, }, { diff --git a/util/gen_log_guide.ts b/util/gen_log_guide.ts index 33eba7f7f3..5563a6060b 100644 --- a/util/gen_log_guide.ts +++ b/util/gen_log_guide.ts @@ -555,16 +555,6 @@ const lineDocs: LineDocs = { ], }, }, - SpawnNpcExtra: { - examples: { - 'en-US': [], - }, - }, - ActorControlExtra: { - examples: { - 'en-US': [], - }, - }, } as const; type LogGuideOptions = { From 119efb05f5ffd5e06cf18b3bba7ec37a4926f767 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Thu, 14 Dec 2023 00:13:28 -0800 Subject: [PATCH 39/39] rename planar tactics --- .../dungeon/another_aloalo_island-savage.ts | 41 ++++++++++--------- .../06-ew/dungeon/another_aloalo_island.ts | 41 ++++++++++--------- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts index 3ee663fe2e..722a4cd4be 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island-savage.ts @@ -16,6 +16,8 @@ import { TriggerSet } from '../../../../../types/trigger'; // TODO: sc3 should say which bubble to take to the other side (for everyone) // TODO: figure out directions for Lala for Radiance orbs // TODO: map effects for Lala +// TODO: Lala Planar Tactics could add config strats and tell you who to stack with +// TODO: Statice colors could add config strats for role-based colors + melee flex export interface Data extends RaidbossData { combatantData: PluginCombatantState[]; @@ -934,11 +936,11 @@ const triggerSet: TriggerSet = { one: { en: 'One', }, - closeTwo: { - en: 'Close Two', + bigTwo: { + en: 'Two (stack with three)', }, - farTwo: { - en: 'Far Two', + smallTwo: { + en: 'Two (stack with one)', }, eitherTwo: { en: 'Either Two (w/${player})', @@ -946,10 +948,10 @@ const triggerSet: TriggerSet = { three: { en: 'Three', }, - farTwoOn: { - en: '(far two on ${players})', + // This is just a raidcall so you can direct your friends. + smallTwoOn: { + en: '(Two with one: ${players})', }, - unknownNum: { en: '${num}', }, @@ -959,9 +961,8 @@ const triggerSet: TriggerSet = { num4: Outputs.num4, }; - // Assumptions: "close two" and "three" stack+run together, while "far two" and "one" - // run towards each other and meet for the stack. Stacks COULD be on both/neither twos, - // which makes which two you are ambiguous. + // For brevity, this code calls "small two" the two that stacks with one + // and the "big two" the two that stacks with three. const stacks = data.lalaSubAlpha.filter((x) => x.effectId === 'E8B').map((x) => x.target); const nums = data.lalaSubAlpha.filter((x) => x.effectId === 'E8C'); const myNumberStr = nums.find((x) => x.target === data.me)?.count; @@ -984,23 +985,23 @@ const triggerSet: TriggerSet = { const isOneStack = stacks.includes(one); const twos = nums.filter((x) => parseInt(x.count) === 2).map((x) => x.target); - const farTwos: string[] = []; + const smallTwos: string[] = []; for (const thisTwo of twos) { // can this two stack with the one? const isThisTwoStack = stacks.includes(thisTwo); if (isThisTwoStack && !isOneStack || !isThisTwoStack && isOneStack) - farTwos.push(thisTwo); + smallTwos.push(thisTwo); } - const [farTwo1, farTwo2] = farTwos; - if (farTwos.length === 0 || farTwo1 === undefined) + const [smallTwo1, smallTwo2] = smallTwos; + if (smallTwos.length === 0 || smallTwo1 === undefined) return defaultOutput; - const isPlayerFarTwo = farTwos.includes(data.me); + const isPlayerSmallTwo = smallTwos.includes(data.me); // Worst case adjust - if (isPlayerFarTwo && farTwo2 !== undefined) { - const otherPlayer = farTwo1 === data.me ? farTwo2 : farTwo1; + if (isPlayerSmallTwo && smallTwo2 !== undefined) { + const otherPlayer = smallTwo1 === data.me ? smallTwo2 : smallTwo1; return { alarmText: output.eitherTwo!({ player: data.party.member(otherPlayer) }) }; } @@ -1008,17 +1009,17 @@ const triggerSet: TriggerSet = { if (one === data.me) { playerRole = output.one!(); } else if (twos.includes(data.me)) { - playerRole = isPlayerFarTwo ? output.farTwo!() : output.closeTwo!(); + playerRole = isPlayerSmallTwo ? output.smallTwo!() : output.bigTwo!(); } else { playerRole = output.three!(); } - if (isPlayerFarTwo) + if (isPlayerSmallTwo) return { alertText: playerRole }; return { alertText: playerRole, - infoText: output.farTwoOn!({ players: farTwos.map((x) => data.party.member(x)) }), + infoText: output.smallTwoOn!({ players: smallTwos.map((x) => data.party.member(x)) }), }; }, }, diff --git a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts index 6cf41f40b3..2198ee6605 100644 --- a/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts +++ b/ui/raidboss/data/06-ew/dungeon/another_aloalo_island.ts @@ -11,6 +11,8 @@ import { TriggerSet } from '../../../../../types/trigger'; // TODO: sc3 should say which bubble to take to the other side (for everyone) // TODO: figure out directions for Lala for Radiance orbs // TODO: map effects for Lala +// TODO: Lala Planar Tactics could add config strats and tell you who to stack with +// TODO: Statice colors could add config strats for role-based colors + melee flex export interface Data extends RaidbossData { combatantData: PluginCombatantState[]; @@ -929,11 +931,11 @@ const triggerSet: TriggerSet = { one: { en: 'One', }, - closeTwo: { - en: 'Close Two', + bigTwo: { + en: 'Two (stack with three)', }, - farTwo: { - en: 'Far Two', + smallTwo: { + en: 'Two (stack with one)', }, eitherTwo: { en: 'Either Two (w/${player})', @@ -941,10 +943,10 @@ const triggerSet: TriggerSet = { three: { en: 'Three', }, - farTwoOn: { - en: '(far two on ${players})', + // This is just a raidcall so you can direct your friends. + smallTwoOn: { + en: '(Two with one: ${players})', }, - unknownNum: { en: '${num}', }, @@ -954,9 +956,8 @@ const triggerSet: TriggerSet = { num4: Outputs.num4, }; - // Assumptions: "close two" and "three" stack+run together, while "far two" and "one" - // run towards each other and meet for the stack. Stacks COULD be on both/neither twos, - // which makes which two you are ambiguous. + // For brevity, this code calls "small two" the two that stacks with one + // and the "big two" the two that stacks with three. const stacks = data.lalaSubAlpha.filter((x) => x.effectId === 'E8B').map((x) => x.target); const nums = data.lalaSubAlpha.filter((x) => x.effectId === 'E8C'); const myNumberStr = nums.find((x) => x.target === data.me)?.count; @@ -979,23 +980,23 @@ const triggerSet: TriggerSet = { const isOneStack = stacks.includes(one); const twos = nums.filter((x) => parseInt(x.count) === 2).map((x) => x.target); - const farTwos: string[] = []; + const smallTwos: string[] = []; for (const thisTwo of twos) { // can this two stack with the one? const isThisTwoStack = stacks.includes(thisTwo); if (isThisTwoStack && !isOneStack || !isThisTwoStack && isOneStack) - farTwos.push(thisTwo); + smallTwos.push(thisTwo); } - const [farTwo1, farTwo2] = farTwos; - if (farTwos.length === 0 || farTwo1 === undefined) + const [smallTwo1, smallTwo2] = smallTwos; + if (smallTwos.length === 0 || smallTwo1 === undefined) return defaultOutput; - const isPlayerFarTwo = farTwos.includes(data.me); + const isPlayerSmallTwo = smallTwos.includes(data.me); // Worst case adjust - if (isPlayerFarTwo && farTwo2 !== undefined) { - const otherPlayer = farTwo1 === data.me ? farTwo2 : farTwo1; + if (isPlayerSmallTwo && smallTwo2 !== undefined) { + const otherPlayer = smallTwo1 === data.me ? smallTwo2 : smallTwo1; return { alarmText: output.eitherTwo!({ player: data.party.member(otherPlayer) }) }; } @@ -1003,17 +1004,17 @@ const triggerSet: TriggerSet = { if (one === data.me) { playerRole = output.one!(); } else if (twos.includes(data.me)) { - playerRole = isPlayerFarTwo ? output.farTwo!() : output.closeTwo!(); + playerRole = isPlayerSmallTwo ? output.smallTwo!() : output.bigTwo!(); } else { playerRole = output.three!(); } - if (isPlayerFarTwo) + if (isPlayerSmallTwo) return { alertText: playerRole }; return { alertText: playerRole, - infoText: output.farTwoOn!({ players: farTwos.map((x) => data.party.member(x)) }), + infoText: output.smallTwoOn!({ players: smallTwos.map((x) => data.party.member(x)) }), }; }, },