Game fourteen, third leak of the series: "a door my pick answers" revealed a pick-lock without naming it. Table prose may reference only public state — the board, never my options, in any costume. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
327 lines
18 KiB
Markdown
327 lines
18 KiB
Markdown
---
|
|
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 <ROOM> Claude # take a seat (token saved)
|
|
node tools/claude-seat.mjs view # board + hand + last events
|
|
node tools/claude-seat.mjs do '<command json>' # 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.
|
|
|
|
## Game-nine scar: concentrate your thefts
|
|
|
|
- Kestrel won in FOUR ROUNDS by stealing BOTH treasures from the SAME
|
|
victim (the nearest bot): two bankings = the win, and the second one
|
|
simultaneously eliminated the victim via the captured-treasures
|
|
clause. Robbing one player twice beats robbing two players once —
|
|
same points, one fewer opponent, and the victim's own corner becomes
|
|
your supply depot. When choosing the second steal, weigh "same
|
|
victim" heavily.
|
|
- Also: never chain move commands blind in a script — the (6,6) nook
|
|
refused all three exits and my pipeline barreled into endTurn,
|
|
burning a full turn standing still. Verify each step's result, or at
|
|
minimum stop the chain on the first refusal.
|
|
|
|
## Game-ten scars (the closest one)
|
|
|
|
- **The champion's carrier-breaker combo**: DROP OBJECT (chest falls at
|
|
your feet) + ADRENALINE (second attack) + TELEPORT OPPONENT (you,
|
|
exiled across the maze; the chest, his). A laden wizard within his
|
|
cast range is a wizard about to be unpacked. Carry through his reach
|
|
only with a real counteraction in hand — and VERIFY a card actually
|
|
counters before building your defense on it (NO SPELL is a silencing
|
|
curse, not a counter; I learned mid-stack).
|
|
- **He ferries his own death warrant**: when the elimination clause
|
|
hung on his floor chest, he simply picked his route so the chest
|
|
traveled with him. Deny-by-custody. Do the same: when MY vulnerable
|
|
treasure lies on my path, take it along.
|
|
- Sector relocation can REWRITE the whole world mid-game — arms move,
|
|
warps rewire, routes invert. After any rotate/relocate event, throw
|
|
away every cached route and re-run the router.
|
|
- Eric's deeper frame: on wrap boards (especially 3- and 5-sector
|
|
layouts) RELOCATE SECTOR is a TOPOLOGY WEAPON — one shift breaks
|
|
ALL the curved warps at once and "everything is just across the
|
|
board." Its payload is everyone else's stale mental map: the caster
|
|
knows the new sewing instantly. Hold it for the moment an enemy's
|
|
plan leans on a wrap (a warp delivery lane, a rim escape), then cut
|
|
the seam. Conversely, never build a plan whose ONLY road is a warp
|
|
while an opponent might hold this card.
|
|
|
|
## The board is a torus (from Eric, after game eleven)
|
|
|
|
- The warping rims mean there is NO center and NO edge: take the right
|
|
column and sew it onto the left — identical geography. "Central" and
|
|
"peripheral" seats are rendering artifacts of where the map unrolls.
|
|
Thinking in those terms is a trap that limits your options (his
|
|
words). Judge NOTHING by coordinates: distance is graph distance,
|
|
threat is graph threat, and the router (BFS over edges + warps) is
|
|
the only geometry that exists. Mentally re-unroll the map from
|
|
wherever you stand — every wizard is the center of their own map.
|
|
- BUT salience is Euclidean even when geometry is not (Eric): humans
|
|
see "center tiles" and aim their aggression there, so the
|
|
center-perceived seat pays an attention tax — and a strong player
|
|
turns it into arbitrage: absorb the squabble, footrace out and back
|
|
through wraps that make you secretly equidistant from everything.
|
|
Play the graph for movement, the salience for predicting humans;
|
|
expect neither bias nor exploitability from the bots — their BFS is
|
|
natively non-Euclidean.
|
|
|
|
## Game-thirteen scars (the goat)
|
|
|
|
- **BUTT-HEAD is a cross-map physical nuke**: damage = the full walked
|
|
distance of the charge, and it found 8 points across half a maze.
|
|
ABSORB SPELL answers spells ONLY — at low life with no teleport in
|
|
hand, there is NO answer to big physical; your only defenses are
|
|
position and never being worth the charge. Audit the hand for
|
|
physical answers separately from spell answers.
|
|
- He parks his OWN chest on open floor when he needs free arms —
|
|
custody is a dial, not a state. Watch every drop: grounded chests
|
|
are targets again the moment they land.
|
|
- My game-one wall and his one dust cloud shaped the ENTIRE game:
|
|
single-square terrain on a junction outlives every spell cast near
|
|
it. Place terrain at junctions, not corridors.
|
|
|
|
## The passivity audit (Eric, after game thirteen)
|
|
|
|
- "You did nothing but draw for several turns" — true, and fatal. A
|
|
turn that only draws is a LOST turn. When genuinely walled: probe.
|
|
Dust-stagger attempts, LOS probes, wall punches, terrain casts —
|
|
motion generates dice, information, and pressure; stillness
|
|
generates nothing and hands the opponent free repositioning. The
|
|
round-8 expedition that nearly won game thirteen was available in
|
|
round 5. If two consecutive turns end in draw-only, something is
|
|
wrong with the plan, not the maze.
|
|
|
|
## 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.
|
|
- OPSEC round three (game fourteen): METAPHORS COUNT. "A door my pick
|
|
answers" and "key ready for tomorrow" revealed a pick-lock as surely
|
|
as naming it. The rule in its final form: table prose may reference
|
|
ONLY public state — positions, banked counts, events already in the
|
|
chronicle. Nothing about my hand, capabilities, or intentions, in
|
|
any costume. When in doubt, describe the BOARD, never my options.
|
|
- Send `chat` for table talk at dramatic moments; it's half the fun.
|
|
|
|
## The turn poller (no more idling)
|
|
|
|
After ending each turn (or whenever waiting on others), launch the
|
|
watcher in the background so the harness wakes you the moment the
|
|
game needs you — your turn or a counteraction window:
|
|
|
|
```
|
|
node <scratchpad>/my-turn-poller.mjs # run_in_background: true
|
|
```
|
|
|
|
(Script lives in the session scratchpad; recreate from the skill's
|
|
memory if missing: it joins with the saved seat token, watches state
|
|
messages, and exits with "WAITING ON CLAUDE: <reason>".) Eric asked
|
|
for this after game eight sat waiting on me — don't make him prompt
|
|
"your turn" ever again.
|
|
|
|
CRITICAL: launch it ONLY with the harness's run_in_background flag —
|
|
that is what wakes you when it exits. A shell `&` inside a normal
|
|
command detaches it into the void and nobody hears it fire (game
|
|
eight, twice). One poller per wait; it exits when the game needs you.
|
|
|
|
## 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".
|