Skip to content

engine: chained ChangeZone's ControllerRef::You misclassified as relative, blocking activation #6690

Description

@mike-theDude

Summary

When a chained ChangeZone names a zone belonging to the ability's controller ("from your graveyard") while a companion player target exists on the parent node, ability_utils::relative_controller_kind classifies that ControllerRef::You as a relative controller.

legal_targets_for_ability_filter then re-enumerates the slot against the companion player's candidates — the machinery behind "target player sacrifices a creature they control" — so it searches the opponent's graveyard, finds nothing, and activation fails with:

ActionNotAllowed("No legal targets available")

Reproduction

[[The Beamtown Bullies]] (#6496):

{T}: Target opponent whose turn it is puts target nonlegendary creature card from your graveyard onto the battlefield under their control. It gains haste. Goad it. At the beginning of the next end step, exile it.

Activate {T} on an opponent's turn with a nonlegendary creature card in your graveyard. The ability is not activatable.

Proven pre-existing

The identical Oracle text with the whose turn it is relative clause removed — which parses to the pre-#6496 Typed { controller: Opponent } shape — fails with the same error. So this is independent of the #6496 targeting work.

This is the actual root cause of the original "doesn't work at all" Discord report on #6496. Triage attributed the symptom to a controller inversion, but the card cannot be activated in the first place.

Pinned by

beamtown_activation_blocked_by_relative_your_graveyard_slot_known_gap in crates/engine/tests/integration/beamtown_bullies_active_opponent_target.rs (added in #6689).

Update that test when fixing — do not delete it. It carries three reach-guards proving the failure is the graveyard slot and not the player slot.

⚠️ Do not fix this in isolation

Beamtown's "under their control" binding is also unparsed (see the companion issue). Fixing only this gap makes the creature enter under the ability controller's control — you would goad a creature you now control, at yourself. That is a worse game state than the current "cannot activate".

Land both together. Also delete the Effect::unimplemented("enters_under_their_control", …) marker node in the same change, since inserting it currently makes the ChangeZone's immediate sub_link a ContinuationStep rather than a SequentialSibling.

Pointers

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions