Skip to content

Twin Emperors: rewrite tank swap, pickup anchors, and emergency split recovery #3

Description

@RovxBot

Objective

Rewrite Twin Emperors tank behavior so swap pickup, side anchoring, reserve promotion, teleport-prep geometry, Vek'nilash orientation, and emergency split recovery are phase-driven and deterministic.

Why this exists

The local logs show the encounter failing exactly where tank control should be strongest.

Observed locally:

  • 493 split_risk entries, all with reason=tank_swap_failure.
  • Separation starts failing at 61 and drops as low as 17.
  • Heal Brother is repeatedly firing instead of being prevented:
17:00:00.504 SPELL_HEAL Emperor Vek'lor -> Emperor Vek'nilash "Heal Brother"
17:00:00.512 SPELL_HEAL Emperor Vek'nilash -> Emperor Vek'lor "Heal Brother"
17:00:56.309 SPELL_HEAL Emperor Vek'lor -> Emperor Vek'nilash "Heal Brother"
  • Tank mechanics are happening during the collapse:
17:00:00.512 SPELL_DAMAGE Emperor Vek'nilash -> Rov "Uppercut"
  • Current fallback behavior still allows ad hoc range-chasing and MoveNear recovery instead of a strict anchor plan.

Current code hotspots

  • src/Ai/Raid/Aq40/Action/RaidAq40Actions_TwinEmperors.cpp
    • ResolveTwinPickupAnchor
    • Aq40TwinEmperorsHoldSplitAction
    • Aq40TwinEmperorsWarlockTankAction
    • StopTwinDamageOn
    • GetFarSidePosition
    • GetTwinRecoveryStepTowardAnchor
  • src/Ai/Raid/Aq40/Util/RaidAq40TwinEmperors.cpp
    • melee recovery timers
    • pickup anchor locking
    • kTwinTeleportWindowMs = 6000
  • src/Ai/Raid/Aq40/Util/RaidAq40Helpers.cpp
    • tank executor / reserve resolution
  • Current warlock pickup geometry already uses:
    • desiredRange = 24.0f
    • minRange = 19.0f
    • maxRange = 30.0f
      but it is still too reactive and does not encode the intended pre-teleport ordering strongly enough.

Required implementation

  • Make both tank roles explicitly phase-driven.
  • During TeleportWindow and PickupRecovery:
    • primary warlock and primary melee tank must move to forced pickup anchors first
    • threat generation or melee uptime starts only after the anchor step is satisfied or a clearly defined “in-position enough” rule is met
  • Define reserve behavior explicitly:
    • reserve tanks stay parked and do not improvise
    • reserves are promoted only by encounter state, not by incidental aggro
  • Add an encounter-wide emergency split recovery routine:
    • trigger when separation enters urgent/terminal bands or Heal Brother fires
    • stop raid DPS on both bosses
    • stop pets
    • clear unsafe current targets
    • force both tanks through re-separation routing until the split is stable again
  • Replace MoveNear as the primary tank recovery behavior. MoveNear should only survive as a last-resort fallback with logging that makes it obvious it was reached.
  • Tie Uppercut / Unbalancing Strike recovery directly into the tank state machine so recovery windows are explicit and compatible with emergency split recovery.
  • Keep primary tank movement owner-exclusive while the tank is in a recovery phase.

Additional tank-positioning requirements

Vek'nilash side orientation

  • The Vek'nilash tank should face the boss toward the wall so Uppercut knockbacks send melee toward the room center instead of deeper into unsafe geometry.
  • This facing/orientation rule should be part of the tank positioning contract, not an incidental side effect.
  • If exact facing control is difficult, at minimum the selected tank anchor family should make the likely Uppercut vector center-safe.

Vek'lor receiving side

  • Shortly before teleport resolves, the designated warlock tank on the receiving side must move inward toward the melee tank.
  • The goal is that when Vek'lor arrives, the warlock is the second closest valid unit and can immediately cast Searing Pain.
  • This movement must happen before Vek'lor arrives, not only after the swap has already completed.
  • Backup warlocks must stay parked and must not drift into the receiving geometry.

Vek'nilash receiving side

  • Shortly before teleport resolves, the designated melee tank on the receiving side must move inward so they are the closest valid unit when Vek'nilash arrives.
  • That inward movement must still respect Vek'lor's Arcane Burst safety rules.
  • Do not let the melee receiving tank solve this by simply standing too deep and eating Vek'lor danger range.

Implementation guidance

  • Encode these as named Twin geometry rules or phase-specific anchor families instead of relying on generic “approach until in range” behavior.
  • If current hardcoded distances (24/19/30) are kept, wrap them in named constants that explain their role in teleport-prep geometry.
  • If better geometry is found during implementation, keep the relative ordering contract:
    • receiving melee tank is closest for Vek'nilash
    • receiving warlock tank is second closest for Vek'lor
    • Vek'lor safety band is still respected

Reference patterns

Validation

  • Run at least 3 teleports with a supported Twin comp.
  • Success criteria:
    • no split_risk
    • no heal_brother_terminal
    • tanks re-establish both sides before ranged DPS resumes on Vek’lor
    • primary tanks do not drift into MoveNear as the normal recovery path
    • receiving warlock is staged for immediate Searing Pain on Vek'lor arrival
    • receiving melee tank is closest for Vek'nilash arrival without violating Vek'lor safety spacing
    • Vek'nilash tank orientation keeps Uppercut knockback center-safe
  • Additional test:
    • induce Uppercut / Unbalancing Strike pressure and confirm tanks recover without collapsing the split

Related

  • Depends on #2 phase and ownership work.
  • Coordinate with #6 so spell-driven events can trigger recovery at the right time.
  • Coordinate with #8 for the broader pre-pull / opener choreography.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions