OPTCG | | | |

Play the engine

Every move below comes from legalActions() in src/engine/actions.ts. Nothing here re-implements a rule. Cards the engine cannot fully execute are badged, and every skipped ability is written to the log.

Never played before?

Two ways in, and they are the same game either way. Nothing below changes a rule, hides an option or plays a card for you — the coach only explains what the board is already offering, and names the Comprehensive Rules clause it comes from.

Read how to play first

The guided game walks eight goals — keep a hand, reach your DON!!, play a Character, push power, attack, end a turn, then defend an attack and take a hit — each ticked off when the game can be seen to have reached it, whatever cards you drew. The last two need your opponent to attack you, so they are skipped rather than waited on. No step can ever stop you doing something else first.

Play a friend

Host a table and send the code. Your friend needs to be able to reach this server — it listens on 127.0.0.1 and stays there, so put a proxy in front rather than widening it: tailscale serve --bg --https 10004 http://127.0.0.1:8787. That is tailnet-only. Never funnel.

Benchmark — can it actually beat you?

A fixed, seeded sequence of mirror games: one decklist on both seats, so deck strength is not a variable and only play is. You take seat 0 and seat 1 alternately, because the first player skips a draw and a DON!! (CR 6-3-1 / 6-4-1). Each result is recorded as it finishes — closing this tab cannot lose one. Undos are recorded too, and games with an undo are excluded from the record.

Waiting for your friend

Send them this code. They open this page and put it in "Join a code".

A watch link shows the PUBLIC table — both boards, both trashes, hand and life as counts. No hand contents, for either seat. Anyone who can reach this server can use it, so close the doors from the board if you would rather play unobserved.

Log

Trash

Top of the stack first — the most recently trashed card.
CR 3-5-2 “The trash is an open area. Cards in this area are placed face-up in a stack, and either player can freely view the contents and order of these cards.” CR 3-5-1 K.O.’d Characters and activated Events go here.

Settings

saved on this machine

Playmats

The art is a background on a fixed 990×700 frame, so an image of any proportion is placed and never stretched. Zones are positioned at fractions measured off the official playsheet, so cards land inside your mat’s printed boxes.

Your mat
Opponent mat
Plain boardignore every earned cosmetic, yours and theirs. For screenshots, bug reports, and reading a card over a loud mat.
Placementfor a mat that is not 990×700

Sleeves & DON!!

The card back is what every face-down card wears: your deck, your Life cards, the pile in the trash. Each seat sleeves separately, the way two players at a table would.

Your sleeves
Opponent sleeves
DON!! card

Size

Every zone is a percentage of the mat, so one number resizes the whole table without moving a single card out of its printed box.

Playmat width
Hand & off-mat card size

Log

Automation

This page never decides whether something is legal — every control on it comes from the engine’s legalActions(). So the only thing that can be automated safely is a position where the engine offered exactly one action, which is not a choice at all.

Pause before it actsso you can see it happen

Table feel

Presentation only. None of these touches legalActions(), the engine, or what a click does — they are off by default so the plain board stays the one every bug report is against.

Match clockTournament Rules Manual, not the Comprehensive Rules — a time limit belongs to an EVENT, not to a game.
DON!! spreadhow much of each DON!! card shows past the one in front of it

All of it obeys your system’s prefers-reduced-motion: with that set, the fan and the lift still happen, they just do not animate.

Controls and coaching

Unlike Table feel, the coach is on by default — this board is most people’s first game of it. Neither setting changes what is legal: the coach explains the actions the engine is already offering and has no way to take one.

Control sizeEverything you press to act on the game: the action bar, the decision panel, the options on a dragged card, and the chooser you get by clicking one. Chrome — Trash, Settings, Undo, New game — is not scaled.

A guided first game — the same board with a track of goals in the coach panel — is started from the setup screen, not from here: it belongs to a game rather than to this machine. How the game is played is the written version.

Music

Point this at an audio file on your machine and it loops while you play. Nothing is shipped with the page and nothing is fetched: recordings are somebody’s copyright, so the track is yours to supply — the same way the mat and the sleeves already work. It stays on this machine and is never uploaded.

Trackmp3, ogg, m4a, wav — anything your browser plays
Volume

What is not a setting, and why

Three steps look automatable. Two already are — mandatorily — and one is a real decision.

CR 6-3-1 the Draw Phase draw and CR 6-4-1 the DON!! Phase draw are mandatory phase steps with no decision in them. They are not actions in this engine at all (src/engine/actions.ts), so there is nothing to switch on: they already happen by themselves, every turn, and you will only ever see them in the log.
CR 5-2-1-6 the mulligan is a choice, and CR 10-1-5-2 so is declining a [Trigger] (“You can also choose not to activate the [Trigger].”). Neither is ever answered for you.

Rules checking

Every action, yours and the CPU’s, is checked against the Comprehensive Rules by an independent registry that does not ask the engine anything. A finding pins a bar under the header naming the clause. It cannot be switched off — a board that has broken a rule is not a board worth playing on.