Capabilities

Everything DeckCraft can express, with an honest status. Switching a capability on makes it authorable; only implemented ones can actually be run by the simulator. Nothing here is per-game — these are platform-wide.

18 implemented 1 partial 8 planned 4 ceiling

Primitives

The only operations that change state. Implemented in PHP; never authorable.

Move cards between zones move_cards
Selector vocabulary: top N, all, spare-Permanents, specific card. Player-chosen filters land with smarter bots.
Implemented
Shuffle or reorder a zone reorder_zone
Shuffle via seeded RNG, incl. the discard-recycle.
Implemented
Change a tracker value adjust_tracker
With authored min/max clamping.
Implemented
Flip a card's own state set_card_state
face up/down exists on CardInstance. exhausted/ready and attached-to have no field yet — needed before 'tap for effect' can work.
Planned
Create or destroy a card instance create_destroy_card
Tokens and summons: instances with no deck of origin.
Planned
Advance phase or turn advance_flow
End phase, automatic phases, turn rollover, per-turn tracker regeneration.
Implemented
Add or remove a temporary modifier modifier
'+2 attack until end of turn'. CardInstance and Player have carried a modifiers[] slot since 3.8 that nothing can write. Dynamic scope ('all your units') is deliberately out — see ceiling.
Planned

Composites

Named bundles of primitives. Pure data — new ones need no engine work.

Play a card from hand play_card
uses: adjust_tracker · move_cards
Implemented
Buy a card buy_card
Generalises buy_from_market: any from-zone, any currency.
uses: adjust_tracker · move_cards
Implemented
Draw cards draw_cards
uses: move_cards
Implemented
Discard cards discard_cards
uses: move_cards
Implemented
Empty a zone into another move_zone
uses: move_cards
Implemented
Attack attack
uses: adjust_tracker
Implemented
Pass pass
uses: advance_flow
Implemented
End the phase end_phase
uses: advance_flow
Implemented
Use a card already in play use_ability
Blocked: card types have no abilities[] field, and set_card_state has no exhausted flag. The old activate_ability entry claimed to work and did not.
uses: adjust_tracker · set_card_state
Planned
Recycle a discard pile into a deck shuffle_back
Deck-builder staple: when the draw pile empties, shuffle the discard back in.
uses: move_cards · reorder_zone
Implemented

Features

Capabilities of the platform as a whole.

Effects fire on a trigger (on_play, per turn, on destroy) effect_triggers
Shipped 3.4; every generated card carries a trigger.
Implemented
Structured win conditions win_conditions
JSON Logic + evaluator, 38 tests.
Implemented
Unified trackers unified_trackers
Implemented
Structured zones with scope, visibility, refill structured_zones
Implemented
Deterministic replay from a seed seeded_replay
Proven: same seed reproduces a full game bit-identically.
Implemented
Cards with activated abilities card_abilities
Needs abilities[] on card types plus a use-limit counter.
Planned
Teams / per-team trackers teams
Tracker scope per_team exists in the schema; nothing consumes it.
Partial
Tokens and summoned cards tokens
Depends on create_destroy_card.
Planned
Custom legality conditions (e.g. follow suit) custom_legality
Q3: the evaluator can already express these; the authoring UI is unbuilt. Required for trick-taking.
Planned
Per-player redacted views hidden_information
Zone visibility is authored; viewFor() lands with the engine.
Planned
Resolution stack with priority windows resolution_stack
Interrupts and responses (MTG-style). Deliberately out of scope.
Ceiling
Continuous effects with dynamic scope continuous_effects
'All your units get +1 while this is in play' — requires a layer system re-evaluated on every read.
Ceiling
Effects that rewrite another card's text card_text_rewriting
Ceiling
Simultaneous play (drafting, commit-then-reveal) simultaneous_phases
7 Wonders-style. Needs a commit/reveal sub-protocol.
Ceiling
Overrides are stored per server; the shipped registry stays the default.