- verify-references --expansion overlays expansion/solution on each reference and runs the cumulative tests plus the drop test; refuses a solution that touches src/engine/ - CI job verify-expansions - README: workspace-template + git init step, tool list, repo disclaimer link - Cargo.lock for every Rust reference (staged with the reference, pins serde for rustc 1.85.1) Co-Authored-By: Claude Opus 5.5 <[email protected]>
Systemic Design Course
A free, hands-on course on systemic game design. You learn by rebuilding the rules machinery of two games, then extending it:
- Part I: Hearthstone (cards, zones, triggers, death phases, auras, text assembly)
- Part II: Baba Is You (rules as pushable text, parsing, movement, win/lose)
- Part III: SpellGrid, a small original game that combines both systems
Every module follows the same beats: Observe, Predict, Spec, Build, Name it, Expansion Drop, Further reading. The Expansion Drop is the test of your design: you add new content without touching the engine.
Two paths
- Designer path: read the lessons and scenarios, predict outcomes, and reason about the design.
- Builder path: also make the tests pass in your own engine.
Mentor path
Prefer a Socratic partner? Install the mentor skill and let your AI agent guide you without writing your code.
Two tracks
Builder path exercises exist in Rust and TypeScript. Both tracks have identical test names, matching the scenarios in each module's scenarios.md.
Quick start
From the course repository:
node --version # Node 22 or later for the course tooling (CI uses 24)
npm run test:tools # tooling tests
npm run check # test names agree across Rust, TS and scenarios
Create your workspace from the template for your track (Module 00, "Before Module 1: choose your track", has the details). Copy the whole directory with cp -r so the hidden .course.json comes along:
cp -r workspace-template/rust ~/my-engine # or workspace-template/ts
cd ~/my-engine && git init && git add -A && git commit -m "start from template" && cd -
node tools/start-module.mjs 01 ~/my-engine
start-module copies a module's tests for your track (from your workspace's .course.json) and refuses to start a module if you have not yet taken the previous one. Module 00 uses the naive-engine/ project and is not started this way.
Other tools: tools/coupling-audit.mjs <workspace> (engine code must not name specific cards or nouns), tools/expansion-check.mjs <workspace> <baseRef> (an Expansion Drop must change content only), tools/verify-references.mjs [NN] (reference solutions pass the tests; --expansion also checks every Expansion Drop solution), tools/play-spellgrid.mjs <rust|ts> [l1|l2|l3] (play the Module 10 capstone, SpellGrid, on the command line with the reference engine).
Licence
MIT, for both prose and code. See LICENSE. The course is and stays free.
Disclaimer
Not affiliated with Blizzard or Hempuli. See the disclaimer (also the Disclaimer page of the course website).