Expand the board to the full sketch (~107 spaces, three forks)
shared/board.js now transcribes every distinct space label from the hand-drawn sketch (assets/game_board.png) rather than Phase 1's small subset. The sketch's arrows get genuinely ambiguous in a few places (it reads as a mockup, not an engineered spec) and reuses several space names across zones (Start A Business, Family Reunion, Market Crash, ...) — that repetition is kept as intentional flavor rather than deduplicated, and the ambiguous bits are resolved into a clean DAG with the same shape Phase 1 proved out: a fork, a chain() per branch, a convergence — repeated three times (Career/Education/Gap Year, then Relationship/Investment, then High Risk/Safe), into a long shared retirement tail. Branches are built with a small chain() helper that auto-wires each entry's `next` to the following one, since hand-wiring ~107 ids was too error-prone. The reducer, SQLite schema, and rooms/WS layer needed zero changes — the whole point of the pure-reducer/graph-data design from Phase 1. Two things did need generalizing: - public/boardRender.js's lane offset was hardcoded to a 2-way fork; the new "Which Path?" fork is 3-way (Career/Education/Gap Year), so the offset formula is now symmetric for any number of branches. - shared/game.test.js hardcoded Phase 1's specific space ids. Rewritten to be board-structure-agnostic: it always resolves the first offered choice and otherwise rolls the max die value, which reliably makes progress regardless of board shape (walkForward always stops early at the next choice/finish), plus a graph-well-formedness check. Verified: unit tests green; a full two-player game played headlessly end-to-end through all three forks to Finish in 38 turns with zero console/page errors; the rendered board visually confirmed at full scale (5-row snake layout, 3-way fork fans out correctly, all labels legible).
This commit is contained in:
@@ -45,15 +45,19 @@ Open two browser tabs at `http://localhost:3000`. Create a game in one tab,
|
||||
copy the invite link, open it in the other tab, join, and start the game once
|
||||
both players are in the lobby.
|
||||
|
||||
## The board (Phase 1 subset)
|
||||
## The board
|
||||
|
||||
The full hand-drawn board (`assets/game_board.png`) has ~150 spaces across two
|
||||
thematic passes (Career, Education, Gap Year, Relationship/Family,
|
||||
Investment, High Risk). Phase 1 encodes a small subset with the same shape —
|
||||
a Career-vs-Education fork, a Relationship-vs-Investment fork, a
|
||||
High-Risk-vs-Safe fork, converging to Finish — enough to prove the reducer,
|
||||
persistence, and rooms all work end to end. More spaces can be inserted into
|
||||
any branch later without touching the reducer or database schema.
|
||||
`shared/board.js` (~107 spaces) is transcribed from the hand-drawn sketch at
|
||||
`assets/game_board.png`, organized into three fork points with the same
|
||||
shape the sketch uses: **Career / Education / Gap Year** at the start,
|
||||
**Relationship / Investment** after a shared "quarter-life crisis" chain,
|
||||
then **High Risk / Safe** before a long shared retirement tail to Finish.
|
||||
The sketch reuses several space names across its zones (Start A Business,
|
||||
Family Reunion, Market Crash, ...) — that's kept as intentional recurring
|
||||
flavor rather than deduplicated. More spaces can be inserted into any
|
||||
branch's `chain([...])` array in `board.js` without touching the reducer,
|
||||
the SVG renderer, or the database schema — none of them know or care how
|
||||
many spaces exist.
|
||||
|
||||
## Deploying on the homelab
|
||||
|
||||
|
||||
Reference in New Issue
Block a user