Skip to content

parser: "Tap another ..." in a TapCreatures cost drops the self-exclusion — 8 cards can pay with the source itself #7522

Description

@cuinhellcat

Card(s): Spire Mechcycle (hit in play); also Kumena, Tyrant of Orazca · Meanders Guide · Radiant, Serra Archangel · Shadow Stinger · Sure-Footed Infiltrator · Tyvar, the Pummeler · Veteran Warleader

Game mode: AI

Actual behavior

Spire Mechcycle's exhaust cost reads "Tap another untapped Mount or Vehicle you control", but the parsed cost carries no self-exclusion, so the Mechcycle itself is an eligible payment for its own ability.

Parsed cost, taken from a live game state (object 39):

{"type":"TapCreatures","requirement":{"requirement":"count","count":1},
 "filter":{"type":"Or","filters":[
   {"type":"Typed","type_filters":[{"Subtype":"Mount"}],"controller":"You","properties":[]},
   {"type":"Typed","type_filters":[{"Subtype":"Vehicle"}],"controller":"You","properties":[]}]}}

properties is empty on both branches, and Spire Mechcycle is a Vehicle you control, so it matches its own cost filter.

Expected behavior

"Another" should reach the cost filter, so the source is not an eligible payment.

The runtime is not the bug. has_enough_tap_creatures (crates/engine/src/game/cost_payability.rs:752) skips the source only when exclude_source is set, and cost_payability.rs:1112 documents that deliberately — "CR 601.2b: Standalone TapCreatures (no {T}) includes the source itself". That is correct for a plain "Tap N untapped creatures you control" cost. FilterProp::Another already exists for exactly this exclusion (3200 occurrences in card-data.json).

Class measured

Over all 35,795 cards in card-data.json: 150 cards carry a TapCreatures ability cost; 8 of them say "another"/"other" in the oracle text; 0 of the 8 carry FilterProp::Another in the parsed cost filter.

Card abilities affected
Kumena, Tyrant of Orazca 3
Meanders Guide 1 (triggered)
Radiant, Serra Archangel 1
Shadow Stinger 1
Spire Mechcycle 1
Sure-Footed Infiltrator 1
Tyvar, the Pummeler 1
Veteran Warleader 1

Each one matches its own cost filter (Kumena is a Merfolk, Radiant has flying, Spire Mechcycle is a Vehicle, and so on), so all 8 can pay with the source.

Crew and Saddle use the same "other" wording, but they are keywords with their own handling — this report is only about the parsed TapCreatures ability cost.

Not verified

I confirmed the parsed data and read the payability code; I did not play out all 8 cards to watch the picker offer the source. Spire Mechcycle is the one I hit in an actual game. The measurement ran on a local card-data.json dated 2026-08-12; the Spire Mechcycle cost in a live 2026-08-17 game state is identical.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions