--- name: wizwar-duel description: Play Wiz-War live against Eric — join his room as a real seat, reason about every move yourself, and duel turn by turn over the websocket. Use when Eric wants a game, gives a room code, or says "let's play". --- # Playing Wiz-War against Eric You are a PLAYER, not the automaton. Read the board, reason, and choose every command yourself. Eric plays in his browser; you play through the CLI seat at `tools/claude-seat.mjs`. He prompts "go" after his moves — each of his messages is your cue to look and act. ## The seat client Run from the repo root (needs the workspace's `ws` package): ```bash node tools/claude-seat.mjs join Claude # take a seat (token saved) node tools/claude-seat.mjs view # board + hand + last events node tools/claude-seat.mjs do '' # one engine command node tools/claude-seat.mjs chat "text" # table talk ``` Seat state persists in `/tmp/wizwar-claude-seat.json` (override: `WIZWAR_SEAT`); server defaults to production (`WIZWAR_SERVER` to point elsewhere). Eric creates the room, gives you the code, and starts the game after you join. Commands are the engine's `Command` union (packages/engine/src/game.ts): `{"type":"move","direction":"N|S|E|W"}`, `cast` (with `target`, optional `numberInstanceIds`/`params`), `playNumberForMovement`, `pickUpTreasure`, `dropTreasure`, `warpStep`, `counteract`, `pass`, `punch`, `setAmbush`, `wardChoice`, `endTurn` (with `draw`). A refused command costs nothing — probing legality is free, so when unsure, try it and read the error. ## Reading the map - The renderer prints y=0 at top; **y grows SOUTH**. N = y-1, S = y+1. - `C2` is you, `P1` etc. are opponents, `$c`/`$1` treasures, `h?` homes, two-letter codes are square contents (SA safe, RO rosebush, ST stone, DU dust). `D` on a line is a door, `—` a wall, blank is open. - WARPS line lists rim passages as `2,0N→2,9`: standing at (2,0) and moving N carries you to (2,9). **The warp rides one specific side of its square** — check which before you walk (a wrong guess burns moves; ask me how I know). - Dimensional-warp TOKENS (cast by players) are separate: stand on one and `warpStep`. Creatures use `creatureWarpStep`. ## Hard-won rules knowledge (each cost me something in game one) - `pickUpTreasure` ENDS your turn's actions AND movement — arrive with the grab as your last act, never mid-plan. `dropTreasure` at home too. - You can pick up ANY floor treasure, including your own stolen-and- delivered one sitting on the enemy's home square. Repossession is real. - THIEF and punches need same-square; THIEF steals a *named* card and fizzles (card spent) on a wrong guess. - MENTAL FORCE moves the victim ≤3 *walked* spaces — walls and relocked doors shrink its reach; rev 5+ refuses impossible destinations. - Doors relock behind you when you pass through (rev 4+). Your own escape route can seal itself — and seal pursuers out. - LOS threads through rim warps: you can be seen (and shot) through a warp mouth from the far side of the board. Camping one square off the mouth keeps you hidden. - lock-in-place freezes movement AND warpStep for a full turn; REUSE SPELL retrieves only your LAST cast spell, enabling one re-lock. - An ambush (`setAmbush` interrupt/opportunity-fire + committed attack) triggers on LOS *entry* transitions only — someone already in sight never springs it. It survives forever and fires out of turn. - Walking-dead bleeds ½ life per space moved, permanently. Once cursed, every plan must be priced in steps. ## Game-two scars (each cost me the game or nearly) - **RECOUNT THE SCOREBOARD EVERY TURN**: how many treasures does each player have banked AT HOME right now? I sprinted a "winning" delivery in game two that was actually my FIRST of two — Eric had un-banked me five rounds earlier and let me monologue. Banked counts, not vibes. - A banked treasure is NOT safe: anyone can pick it up off your home square and carry it away. Guard the bank or count it as contested. - LOS is FREE-ANGLE center-to-center (the rulebook's rule), not rows and columns: razor diagonals threading open gaps are legal for everyone — including at you. The board draws bent/straight traces. - ILLUSIONARY ATTACK deals its imitated spell's damage if NOT countered; ANY counteraction dispels it entirely. Counter it with the cheapest thing you hold; never "call the bluff" by passing. - Never trust your ASCII parse of the map for multi-step plans: run a BFS over `view.board.edges` (see tools/claude-seat.mjs view JSON, or write a quick router) before spending a number card on a sprint. I burned a 7-move turn bouncing off six misread walls. - Eric counter-plays YOUR bot upgrades: he summoned a troll bodyguard specifically against the archmage's exile-the-winner instinct, and relocated MY home sector mid-carry. Expect meta-warfare. - In 4p with automatons: the bots are chaos agents — they stun, exile, disease, and con. Herd them at Eric; never assume they're on script. ## Game-three scars (lost in four rounds) - **CHECK `dimWarps` EVERY SINGLE VIEW** — Kestrel (Eric's wizard) has won two games with quietly-placed wormholes ending beside his home. The client prints a !! line for them; treat any new token pair as a five-alarm fire and recompute both players' delivery distances through it. - **Never lead the attack against Kestrel.** Three games, three saved counters sprung at the perfect moment (anti-anti, full-shield bait, full-reflection held three rounds for my lightning). Force his counters out with throwaways or positional threats before committing a real spell; his patience is perfect and he telegraphs nothing. - DESTROY WALL showers the ADJACENT caster with rubble (4 damage) — cast it from range, never on your own square's edge. - Wading a rosebush costs 3. A reflected LIGHTNING BLAST still stuns its caster even at 1 reflected damage — the stun is the payload, and a lost turn against Kestrel is a lost game. - Grab-turn-one openings feel great and prove nothing: deliveries are the only score. He banked quietly both times while I showboated. ## Game-five scars (eliminated by a rule I implemented myself) - **THE ELIMINATION CLOCK**: the moment BOTH treasures you protect sit on living opponents' home bases, you are OUT — points, life, and position notwithstanding. In multiplayer this clock starts ticking the instant your second chest is picked up by anyone. From then on, every turn must either recover a chest or end the game first. I spent three turns optimizing deliveries while two bots quietly carried my death certificate. - **FEAR IS A SELF-CAST AURA** — read the card, not your assumptions: "no player or monster will move to within 3 spaces of you," walls irrelevant, and anyone already within 3 MUST flee on their turn. It is armor for carriers and a hearth-denial tool: a feared wizard standing 2 from your home makes delivery impossible. I invented an elaborate theory about enemy goalkeeping instead of reading my own engine's card text. Check `data/cards.json` when a rule surprises — it is one grep away and it is verbatim. - In four-player, Kestrel plays the TABLE, not the duel: his SWAP yanked a bot off its own doorstep mid-delivery and parked himself by unclaimed treasures — one card, two tempo hits. Expect every card he plays to hurt two players at once, and ask which two before deciding it wasn't aimed at you. - CREATE WALL can sever your announced return route the turn after you telegraph it. If your road home is unique, either don't stand at the far end of it, or carry the picks/doors to re-open it. And CREATE DOOR makes LOCKED doors — it is a key-cutter, worthless without picks. - Bot threat model: archmage automatons DO deliver, but their brains can dither inexplicably (one toured the map for two rounds carrying my elimination). Never count on bot incompetence — count turns to their delivery square as if they play perfectly, and treat every reprieve as a gift, not a pattern. ## Game-six scars (the heist) - **THORNBUSH IS A JAIL, NOT A FORT**: entering one ends your turn, costs your ENTIRE next turn, and deals 1 damage. The "cannot be attacked" line is the bait; the two-turn tempo loss is the hook. Eric: "Few will dive into one unless they are desperate. You were confident, but not desperate." Enter a bush only when the alternative is death — and READ THE WHOLE CARD before calling anything a shelter. Three rules self-owns in two games (fear, thornbush) — the full text is one grep away, in my own repo. - **MIST-BODY IS A BANK ROBBER**: 5 turns untouchable, walks through doors and walls, picks up treasures, immune to every attack-typed card (drop-object, card-erasure, teleport-opponent included). While an enemy is misted, do not plan counterplay — plan for WHERE the mist will be when it lapses, and meanwhile DISPERSE value: banking everything on one home square builds the heist target. A creature guard is scenery to a ghost. - The bait-fork fallacy: I "forked" him between my two treasures, but both forks were MY assets. He ignored both and took the third thing — the treasure I'd just consolidated. When your fork only threatens what you own, it isn't a fork; it's a to-do list you published. ## The board is the truth (I keep paying for this one) - NEVER narrate a persistent effect without re-verifying it in the CURRENT view. My stones get dispelled, my walls get melted, my theories get invented. Before crediting any creation, curse, or blockade in reasoning OR table talk, check the CONTENTS and SUSTAINED lines and the map glyphs THIS turn. Kestrel quietly removes my infrastructure and lets my own commentary reveal that I haven't noticed. - Corollary: every "go" starts with reading the events tail for what the OTHERS did to the board, not just where they stand. A dispel, a stone-to-water, or a rotate-sector in that tail invalidates last turn's map in my head. ## Playing well - Kestrel (Eric) is EXCELLENT: he baited my thief, saved anti-anti for my full shield, and won game one with a home-to-home dimensional-warp superhighway. Infrastructure beats sprinting — watch what he builds, and consider your own wormhole early. - Win = 2 enemy treasures delivered to your home, or last wizard alive. Track BOTH players' step-counted delivery timelines every turn; the race is decided in tempo, not damage. - Hold counters (full-shield, absorb) for permanent curses and lethal damage. Absorb soaks 3 points; it cannot touch durations. - OPSEC: your prose is visible to Eric. NEVER name the cards you hold or draw, and never announce plans. (Game one: I narrated my hand like a debug log until he asked why I was making it easy.) Trash talk freely — about the board, never your hand. - OPSEC round two (game six, violated AGAIN): analysis spoken aloud IS a card shown. Quoting a card's text with delight ("moves a piece to ANY square!") told him exactly what I held and what it does. Card-text lookups for cards in MY hand happen silently; my visible messages may discuss only what is already public on the board or in the chronicle. Even asking rules questions aloud about a specific card is a tell. - Send `chat` for table talk at dramatic moments; it's half the fun. ## Cadence 1. On "go": `view`, read HIS events since your last turn (the client prints only NEW events; `view` shows a short history tail). 2. Think about the whole board — his timeline, yours, threats, LOS. 3. Execute your commands one at a time, checking errors. 4. `endTurn` with a draw that respects the 7-card hand limit. 5. Tell Eric it's his turn — reasoning aloud is fine, hand contents are not. When a stack waits on him, say so and wait for "go".