Skip to content

raidboss: dmu p1 initial triggers#1069

Draft
Legends0 wants to merge 18 commits into
mainfrom
dmu-p1-initial-triggers
Draft

raidboss: dmu p1 initial triggers#1069
Legends0 wants to merge 18 commits into
mainfrom
dmu-p1-initial-triggers

Conversation

@Legends0
Copy link
Copy Markdown
Collaborator

@Legends0 Legends0 commented Jun 3, 2026

Addon to #1068.

Adds some triggers that I worked on today.

Still to be tested, but raidemulator seemed okay. Currently missing the Graven Image 2 tell, though it is tracked.

@Legends0
Copy link
Copy Markdown
Collaborator Author

Legends0 commented Jun 3, 2026

Also, I looked a bit at o8s to grab some of the outputs to match.

Comment thread ui/raidboss/data/07-dt/ultimate/dancing_mad.ts
Comment thread ui/raidboss/data/07-dt/ultimate/dancing_mad.ts
@Legends0
Copy link
Copy Markdown
Collaborator Author

Legends0 commented Jun 4, 2026

I'll probably work on the tethers tomorrow, then it should be ready?

Comment thread ui/raidboss/data/07-dt/ultimate/dancing_mad.ts
ssilve1989 added a commit to ssilve1989/cactbot that referenced this pull request Jun 4, 2026
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ssilve1989 added a commit to ssilve1989/cactbot that referenced this pull request Jun 4, 2026
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ssilve1989 added a commit to ssilve1989/cactbot that referenced this pull request Jun 4, 2026
…integration

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ssilve1989 added a commit to ssilve1989/cactbot that referenced this pull request Jun 4, 2026
…boolean model

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ssilve1989 added a commit to ssilve1989/cactbot that referenced this pull request Jun 4, 2026
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ssilve1989 added a commit to ssilve1989/cactbot that referenced this pull request Jun 4, 2026
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ssilve1989 added a commit to ssilve1989/cactbot that referenced this pull request Jun 4, 2026
…integration

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ssilve1989 added a commit to ssilve1989/cactbot that referenced this pull request Jun 4, 2026
…boolean model

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Collaborator

@wexxlee wexxlee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving some fast comments now; will hopefully be able to give a more complete review after I jump in later tonight.

Comment thread ui/raidboss/data/07-dt/ultimate/dancing_mad.ts
Comment on lines +115 to +143
const trapEarlyOutputStrings: OutputStrings = {
trapOnYou: {
en: 'Trap on YOU (later)',
},
trapOnYouPlayer: {
en: 'Traps on YOU, ${player} (later)',
},
trapOnPlayer: {
en: 'Trap on ${player} (later)',
},
trapOnPlayers: {
en: 'Traps on ${player1}, ${player2} (later)',
},
};

const trapOutputStrings: OutputStrings = {
trapOnYou: {
en: 'Trap on YOU ',
},
trapOnYouPlayer: {
en: 'Traps on YOU, ${player}',
},
trapOnPlayer: {
en: 'Trap on ${player}',
},
trapOnPlayers: {
en: 'Traps on ${player1}, ${player2}',
},
};
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this leads to an ordering problem in the triggers later, e.g. if the player themselves happens to be target[0], then the later triggers will say "Traps on YOU, {playername}" where playername is the same name as the current player.

think you could probably fix this by having a single output:
"Knockback from ${players)"
Then, in the triggers, use .map to map array elements thru data.party.member(), substituting any presence of data.me with "YOU", and join with (", ") to produce a single string for the output.

(Sidenote - entirely personal preference, but I think "Knockback from" is preferable to "Traps"; I haven't heard it referred to as traps yet, and something more outcome-oriented like "Knockback from" may be more useful.)

Comment thread ui/raidboss/data/07-dt/ultimate/dancing_mad.ts Outdated
Comment on lines +623 to +626
id: 'DMU P1 Double-trouble Trap 1',
type: 'GainsEffect',
netRegex: { effectId: '13D6', capture: true },
condition: (_data, matches) => parseFloat(matches.duration) < 6,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you could reduce Trap 1, Trap 2, and Trap 3 into a single trigger, using, e.g.:
delaySeconds: (_data, matches) => parseFloat(matches.duration) - 4,

@wexxlee
Copy link
Copy Markdown
Collaborator

wexxlee commented Jun 5, 2026

I'll probably work on the tethers tomorrow, then it should be ready?

In case it helps, for tethers, there's an ActorSetPos line that comes out with each tether, moving the invisible add that the player is tethered to to either:
126.0000|41.5000|7.0000| (side - will have meteor)
or
102.5000|27.0000|22.5000| (middle - will drop puddle)

@Legends0
Copy link
Copy Markdown
Collaborator Author

Legends0 commented Jun 5, 2026

I'll probably work on the tethers tomorrow, then it should be ready?

In case it helps, for tethers, there's an ActorSetPos line that comes out with each tether, moving the invisible add that the player is tethered to to either: 126.0000|41.5000|7.0000| (side - will have meteor) or 102.5000|27.0000|22.5000| (middle - will drop puddle)

Thanks. I am almost done with the tether triggers, I am just trying to fix tts collisions at this point before pushing.

EDIT: Here is my current draft. It conflicts with left/right call and the ice call (within 1s), the pulse call is within 2s but I shortened it to knockback.

    {
      id: 'DMU ActorSetPos Tracker',
      // Only in use for P1 Graven Image tethers
      type: 'ActorSetPos',
      netRegex: { id: '4[0-9A-Fa-f]{7}', capture: true },
      run: (data, matches) =>
        data.actorPositions[matches.id] = {
          x: parseFloat(matches.x),
          y: parseFloat(matches.y),
          heading: parseFloat(matches.heading),
        },
    },
    {
      id: 'DMU Graven Image Tether Collect',
      // 271 ActorSetPos lines indicate where the tether is coming from
      // 261 CombatantMemory lines may also indicate this
      // Graven Image 1:
      // (100, 56, 18.5) Center Tether, Will be target of BAA9 Pulse Wave (knockback)
      // Graven Image 2:
      // (102.5, 27, 22.5) Center Tether, Will be target of BAAC Gravitas (puddles)
      // (126, 41.5, 7) Right Tether, Will be target of BAB0 Vitrophyre (rocks)
      // Graven Image 3:
      // (95, 25, 27) Left Tether, Will be target of BAB5 Indulgent Will which causes 503 Confused
      // (107, 43, 8.5) Right tether, Will be target of BAB6 Idyllic Will which causes 131E Sleep
      type: 'Tether',
      netRegex: { id: headMarkerData['imageTether'], capture: true },
      condition: Conditions.targetIsYou(),
      delaySeconds: 0.1, // Actor position data can come after tether in log
      run: (data, matches) => {
        const actor = data.actorPositions[matches.sourceId];
        if (actor === undefined) {
          data.gravenImageTether = 'unknown';
          return;
        }

        const x = actor.x;
        // Graven Image 1: Pulse Wave target
        if (x < 101 && x > 99)
          data.gravenImageTether = 'pulse';
        else if (x < 103 && x > 101) // Graven Image 2: Gravitas target
          data.gravenImageTether = 'gravitas';
        else if (x > 125) // Graven Image 2: Vitrophyre target
          data.gravenImageTether = 'vitrophyre';
        else if (x < 100) // Graven Image 3: Indulgent Will target
          data.gravenImageTether = 'indulgent';
        else if (x < 108 && x > 106)  // Graven Image 3: Idyllic Will target
          data.gravenImageTether = 'idyllic';
        else
          data.gravenImageTether = 'unknown';
      },
    },
    {
      id: 'DMU Graven Image Tether',
      type: 'Tether',
      netRegex: { id: headMarkerData['imageTether'], capture: true },
      condition: Conditions.targetIsYou(),
      delaySeconds: 0.1, // Actor position data can come after tether in log
      infoText: (data, matches, output) => {
        const actor = data.actorPositions[matches.sourceId];
        if (actor === undefined)
          return output.tetherOnYou!();

        const x = actor.x;
        // Graven Image 1: Pulse Wave target
        if (x < 101 && x > 99)
          return output.pulse!();
        else if (x < 103 && x > 101) // Graven Image 2: Gravitas target
          return output.gravitas!();
        else if (x > 125) // Graven Image 2: Vitrophyre target
          return output.vitrophyre!();
        else if (x < 100) // Graven Image 3: Indulgent Will target
           return output.indulgent!();
        else if (x < 108 && x > 106)  // Graven Image 3: Idyllic Will target
          return output.idyllic!();
        else
          return output.tetherOnYou!();
      },
      outputStrings: {
        tetherOnYou: {
          en: 'Tether on YOU',
          de: 'Verbindung auf DIR',
          fr: 'Lien sur VOUS',
          ja: '線ついた',
          cn: '连线点名',
          ko: '선 대상자 지정됨',
          tc: '連線點名',
        },
        pulse: Outputs.knockback, // Cannot be immuned, happens within 6s of tether
        gravitas: {
          en: 'Puddle Tether on YOU',
        },
        vitrophyre: {
          en: 'Rock Tether on YOU',
        },
        indulgent: {
          en: 'Confuse Tether on YOU',
        },
        idyllic: {
          en: 'Sleep Tether on YOU',
        },
      },
    },
    {
      id: 'DMU P1 Graven Image Tether Cleanup',
      // Clear on Ability:
      // BAA9 Pulse Wave
      // BAAC Gravitas
      // BAB0 vitrophyre
      // BAB5 Indulgent Will
      // BAB6 Idyllic Will
      type: 'Ability',
      netRegex: {
        id: ['BAA9', 'BAAC', 'BAB0', 'BAB5', 'BAB6'],
        source: 'Graven Image',
        capture: true,
      },
      suppressSeconds: 1,
      run: (data, matches) => {
        // Player could die and this ability then not target them
        // Need intelligent way to remove once related ability has executed
        // Clear data if ability matches our tether
        const abilityMap = {
          'pulse': 'BAAC',
          'gravitas': 'BAA9',
          'vitrophyre': 'BAB0',
          'indulgent': 'BAB5',
          'idyllic': 'BAB6',
          'unknown': 'unknown',
        };
        const tether = data.gravenImageTether ?? 'unknown';
        const tetherAbilityId = abilityMap[tether as keyof typeof abilityMap];
        if (tetherAbilityId === matches.id || tether === 'unknown')
          delete data.gravenImageTether;
      },
    },

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants