Skip to content

Conversation

@Legends0
Copy link
Collaborator

Credits to @valarnin for the Trophy Weapon and Ultimate Trophy Weapon triggers. In my testing if the log lines are out of order it seems they will not output, which may still need to be addressed.

Took some stuff from normal mode and converted it to savage.

@Legends0 Legends0 mentioned this pull request Jan 12, 2026
22 tasks
Co-authored-by: valarnin <valarnin@gmail.com>
Copy link
Collaborator

@valarnin valarnin left a comment

Choose a reason for hiding this comment

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

Approving from a technical standpoint, after the comments below are resolved. I can't review the rest of the fight against VODs.


I've been using this custom trigger, as a healer it helps significantly with determining where/how to handle spread if it's puddles -> spread -> trophy weapons 2, due to the extreme amount of distance that's required to be covered.

My group's melees have used it to iron out how they're handling spreads as well, since the boss will turn to face the weapon and direction this calls half way through the spread marker's timing.

I'm not sure if it's a good fit in general, but figured I'd offer it up as well. Again, order in the triggerset is important due to logic constraints.

    // ... R11S Ultimate Trophy Weapons ...
    {
      id: 'R11S Trophy Weapons 2 Early Call',
      type: 'ActorControlExtra',
      netRegex: { category: '0197', param1: ['11D1', '11D2', '11D3'], capture: true },
      condition: (data, matches) => {
        if (data.weaponMechCount !== 1)
          return false;

        const actor = data.actorPositions[matches.id];

        if (actor === undefined)
          return false;

        const actorDir = Math.atan2(actor.x - center.x, actor.y - center.y);

        if ((Math.abs(actorDir - actor.heading) % Math.PI) < 0.1)
          return true;
        return false;
      },
      suppressSeconds: 9999,
      infoText: (data, matches, output) => {
        const actor = data.actorPositions[matches.id];

        if (actor === undefined)
          return;

        const mechanic = matches.param1 === '11D1'
          ? 'healerGroups'
          : (matches.param1 === '11D2' ? 'stack' : 'protean');

        const dir = Directions.xyTo8DirOutput(actor.x, actor.y, center.x, center.y);

        return output.text!({
          dir: output[dir]!(),
          weapon: output[mechanic]!(),
        });
      },
      outputStrings: {
        ...Directions.outputStrings8Dir,
        healerGroups: Outputs.healerGroups,
        stack: Outputs.stackMiddle,
        protean: Outputs.protean,
        text: {
          en: '${dir}: ${weapon}',
        },
      },
    },
    // ... R11S Trophy Weapons ...

@Legends0
Copy link
Collaborator Author

Legends0 commented Jan 24, 2026

I've been using this custom trigger, as a healer it helps significantly with determining where/how to handle spread if it's puddles -> spread -> trophy weapons 2, due to the extreme amount of distance that's required to be covered.

My group's melees have used it to iron out how they're handling spreads as well, since the boss will turn to face the weapon and direction this calls half way through the spread marker's timing.

I'm not sure if it's a good fit in general, but figured I'd offer it up as well. Again, order in the triggerset is important due to logic constraints.

I looked at it in raidemulator and like the issues resolved previously, it seems to be inconsistent on what it is calling. I see it calling the third weapon, first weapon, and sometimes the second weapon.

image image image

@valarnin
Copy link
Collaborator

I looked at it in raidemulator and like the issues resolved previously, it seems to be inconsistent on what it is calling. I see it calling the third weapon, first weapon, and sometimes the second weapon.

Did you place it in the correct location (between Ultimate and Normal trophy weapon triggers)?

It might also require the delaySeconds logic to address out-of-order lines, I never have out-of-order lines so I usually don't bother with my custom triggers.

@Legends0
Copy link
Collaborator Author

Legends0 commented Jan 24, 2026

I looked at it in raidemulator and like the issues resolved previously, it seems to be inconsistent on what it is calling. I see it calling the third weapon, first weapon, and sometimes the second weapon.

Did you place it in the correct location (between Ultimate and Normal trophy weapon triggers)?

Yes

It might also require the delaySeconds logic to address out-of-order lines, I never have out-of-order lines so I usually don't bother with my custom triggers.

Adding delay doesn't seem to change its value.

@valarnin
Copy link
Collaborator

Right, delaySeconds wouldn't work here because of the position check in condition. I think this would require rewriting to make it work properly with the way the other Trophy Weapon triggers flow while allowing for delaySeconds, unfortunately.

That makes the required code quite a bit uglier/more annoying.

// On Data:
  rawWeaponCount: number;

// Init to 0:
    rawWeaponCount: 0,

// Trigger, position doesn't matter any more
    {
      id: 'R11S Trophy Weapons 2 Early Call',
      type: 'ActorControlExtra',
      netRegex: { category: '0197', param1: ['11D1', '11D2', '11D3'], capture: true },
      // Only fire for 2nd trophy weapons (weapons 4-6)
      condition: (data) => {
        ++data.rawWeaponCount;
        if (data.rawWeaponCount < 4 || data.rawWeaponCount > 6)
          return false;
        return true;
      },
      delaySeconds: 0.1,
      infoText: (data, matches, output) => {
        const actor = data.actorPositions[matches.id];

        if (actor === undefined)
          return;

        const actorDir = Math.atan2(actor.x - center.x, actor.y - center.y);

        if ((Math.abs(actorDir - actor.heading) % Math.PI) >= 0.1)
          return;

        const dir = Directions.xyTo8DirOutput(actor.x, actor.y, center.x, center.y);

        const mechanic = matches.param1 === '11D1'
          ? 'healerGroups'
          : (matches.param1 === '11D2' ? 'stack' : 'protean');

        return output.text!({
          dir: output[dir]!(),
          weapon: output[mechanic]!(),
        });
      },
      outputStrings: {
        ...Directions.outputStrings8Dir,
        healerGroups: Outputs.healerGroups,
        stack: Outputs.stackMiddle,
        protean: Outputs.protean,
        text: {
          en: '${dir}: ${weapon}',
        },
      },
    },

@Legends0
Copy link
Collaborator Author

Sorry that last commit message was supposed to say "don't say move for stack/axe" since the party is already out of the tornado.

accidentally removed it in a copy/paste
@Legends0 Legends0 requested a review from xiashtra January 24, 2026 05:32
@Legends0
Copy link
Collaborator Author

Right, delaySeconds wouldn't work here because of the position check in condition. I think this would require rewriting to make it work properly with the way the other Trophy Weapon triggers flow while allowing for delaySeconds, unfortunately.

I'm not sure if I'm doing something wrong but I added this and refreshed raidemulator but I still see the same behavior.

@valarnin
Copy link
Collaborator

I'm not sure if I'm doing something wrong but I added this and refreshed raidemulator but I still see the same behavior.

It's consistent for me, I'm not sure what the problem could be. Do you have a log where it's not working available for me to test against?

image image image

Mistook this early on as the players with atomic getting tethers.
@Legends0
Copy link
Collaborator Author

Legends0 commented Jan 24, 2026

Here is a log calling the second weapon:
image
AAC Heavyweight M3 (Savage)_20260121_222457.807_5m_wipe.log

A log calling it about the last weapon:
image
AAC Heavyweight M3 (Savage)_20260121_225349.700_3m_wipe.log

A log calling it for the first weapon:
image
AAC Heavyweight M3 (Savage)_20260121_225807.750_3m_wipe.log

Maybe I am not understanding what it should be calling here.

EDIT: Nevermind, I see it's calling first of the set after not what I am showing.

May be helpful for knowing where to spread/stack towards.
@Legends0
Copy link
Collaborator Author

I double-checked with the first version and saw the output matches so I've commited that. I added some text to the output (1st later) for clarity that it is calling early.

It felt like this was not necessary anymore, the timing of the Ultimate Trophy Weapon "=> Move" or "=> Bait Gust" seemed sufficient to me.
@xiashtra xiashtra dismissed their stale review January 25, 2026 05:13

I'm unblocking for the timeline start change, but I haven't had a chance to look at the trophy weapon changes that were merged after.

@Legends0
Copy link
Collaborator Author

there's a strat that has all of the players on the side that doesn't have melee uptime bait the fire breaths even if they have tether.

This appears to have been fixed as per the patch notes today. If I have time, I may try to do a trigger set for the arena split tethers/breaths. It's okay right now, but the call for the towers in arena split is somewhat lacking in detail one would expect.

@github-actions github-actions bot added the resources /resources label Jan 28, 2026
@Legends0
Copy link
Collaborator Author

Added some arena split triggers, it's doing the general strategy of stretching tethers across to the opposite platform.
It looked good in raid emulator when I checked one pull. Not going to add reminder triggers for now, those can be added later, the basic where to go is there and up for 10s.

Still needs meteorain info, but that can be added later
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.

6 participants