40 lines
1.9 KiB
Markdown
40 lines
1.9 KiB
Markdown
# 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.
|
|
|
|
## 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
|
|
|
|
```sh
|
|
node --version # Node 24 for the course tooling
|
|
npm run test:tools # tooling tests
|
|
npm run check # test names agree across Rust, TS and scenarios
|
|
node tools/start-module.mjs 01 path/to/your/workspace
|
|
```
|
|
|
|
`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).
|
|
|
|
## Licence
|
|
|
|
MIT, for both prose and code. See [LICENSE](LICENSE). The course is and stays free.
|
|
|
|
## Disclaimer
|
|
|
|
Not affiliated with Blizzard or Hempuli. See the [disclaimer](/disclaimer/).
|