Skip to content

Twin Emperors: rewrite healer side support and recovery routing #4

Description

@RovxBot

Objective

Rewrite Twin Emperors healer-side support so dedicated side healers recover reliably, keep the correct focus targets during swap windows, and stop falling back to raid-healer mode from temporary ownership ambiguity.

Why this exists

The current healer routing is failing before the tank recovery ever stabilizes.

Observed locally:

  • tmp/Playerbots.log starts with immediate healer failures:
AQ40 event=movement_failure bot=iledori role=healer ... side=0 reason=outside_leash path=none
AQ40 event=movement_failure bot=paemin role=healer ... side=1 reason=outside_leash path=none
AQ40 event=movement_failure bot=gankuser role=healer ... side=1 reason=outside_leash path=none
AQ40 event=movement_failure bot=kesesha role=healer ... side=0 reason=outside_leash path=none
  • Total healer-related routing failures in the run: 27.
  • Once healers lose their side anchors, the encounter spirals into pickup failure and split collapse.

Current code hotspots

  • src/Ai/Raid/Aq40/Action/RaidAq40Actions_TwinEmperors.cpp
    • Aq40TwinEmperorsHealerSupportAction
    • Aq40TwinEmperorsPrePullStageAction
    • GetTwinRecoveryStepTowardAnchor
    • PrepareTwinRecoveryHold
  • src/Ai/Raid/Aq40/Util/RaidAq40Helpers.cpp
    • GetTwinDedicatedTankHealerSide
    • GetTwinHealerFocusTargets
    • IsTwinHealerOutsideSideLeash
    • snapshot ownership checks used by healer fallback
    • kTwinTankHealersPerSide = 2

Required implementation

  • Replace the current two-step healer recovery with a proper recovery ladder.
  • Minimum routing ladder:
    • direct move to side healer anchor
    • staged step anchor toward side healer anchor
    • center-to-side re-entry anchor when the healer is fully displaced
    • local safe support anchor near the assigned side tank if direct healer anchor occupancy is impossible
  • Healer routing must keep retrying within the encounter phase instead of logging path=none and effectively giving up.
  • Preserve deterministic healer-side assignment. Do not reshuffle dedicated tank-healers during ordinary swaps.
  • Make healer fallback to raid-healer mode stricter:
    • fallback is allowed for explicit Degraded mode
    • fallback is not allowed just because side ownership is temporarily unresolved during an otherwise supported pickup window
  • Keep healer focus targets ordered around local tank reality:
    • current owner
    • expected owner
    • reserve owner
  • Ensure recovery movement remains compatible with strict Twin movement ownership and does not get overridden by generic movement.

Additional supported-comp contract

The pre-pull and opener contract for healers needs to be explicit for any implementing agent:

  • supported Twin runs should start with exactly 2 dedicated tank healers on each side
  • those dedicated tank healers should already be staged on their side anchors before pull
  • they should not be solved from the center after combat starts unless the encounter has already degraded
  • non-dedicated healers should remain central / raid-healer style in pre-pull and opener positioning unless a separate issue explicitly assigns them elsewhere

Reference patterns

Validation

  • Supported comp test across at least 3 teleports.
  • Success criteria:
    • zero movement_failure for Twin healers
    • no path=none healer routing failures
    • side healers remain on their assigned side or re-enter it deterministically
    • healer focus remains on the correct local tank targets during swap recovery
    • each supported opener starts with 2 dedicated tank healers per side already staged correctly
  • Degraded-mode test:
    • after a tank death, confirm healer fallback happens only when the encounter explicitly enters Degraded

Related

  • Depends on #2 phase and ownership work.
  • Coordinate with #6 so spell-driven swap timing can drive healer recovery windows correctly.
  • Coordinate with #8 for pre-pull healer staging and opener layout.

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