Files
systemic-game-design-course/course/05-assemble/reference/rust/README.md
T
Lucas WintherandClaude Opus 5.5 e04dc1a11f feat: module 05 assemble
Cards become JSON data in course/cards (one file per card, validated
against card.schema.json and the catalog); the M5 references load them
via registerCards and interpret effects, replacing content closures.
Adds assemble(base, donor, half), the assemble/buffHand effects with an
injected chooser, Fleshshape as the data-only Expansion Drop, and stages
course/cards in verify-references and start-module.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 03:17:21 +01:00

17 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Module 5 reference engine (Rust)
The course's own engine as of the end of Module 5. Every card is now data: a JSON file in the course's card format (`course/schema/card.schema.json`), and the Rust functions that were card effects in Modules 2–4 are gone. One interpreter turns effects into actions. Assemble builds a new card by replacing half of one card's text with the same half of another's. Module 4's reference was the starting point, so a diff between the two shows what this module adds.
- `cards/` (at the crate root; not in this directory): the card data. It is a copy of `course/cards/`, the single source: `tools/verify-references.mjs` stages it next to the crate, and `tools/start-module.mjs` copies it into a learner's workspace.
- `src/engine/`: generic machinery. Names no cards.
- `card.rs`: the card format as Rust types (`CardDef`, `Clause`, `Effect`, `Target`, `Aura`, read with `serde`), and the library. Registering a definition compiles its clauses into triggers, auras and a spell's effects, and marks whether Assemble may offer it (minions with text that were not themselves assembled). `TriggerOn` gains `EndOfTurn`, which card data may name (Drakkari Enchanter's aura does); the course has no turns, so nothing fires it.
- `effect.rs`: the interpreter: one effect plus its context in, actions out. The only code that knows what `dealDamage`, `draw`, `summon`, `assemble`, `buffHand`, ... mean.
- `assemble.rs`: `assemble(base, donor, half)` (list surgery on `text` at `split`; fails with `AssembleError` if the text is unchanged), and the `assemble` effect, which asks the chooser for a base from the filtered pool, a donor and a half.
- `queue.rs`: as in Module 4, plus two actions (`Assemble`, `Buff`). An ability's effects are interpreted and performed one at a time, in printed order.
- `world.rs`: as in Module 4, plus card registration, cost, the chooser, and `buff`.
- `aura.rs`, `death.rs`, `event.rs`: unchanged from Module 4.
- `src/content/mod.rs`: reads every `.json` file in `cards/`. No card is named in Rust any more.
- `src/harness.rs`: the adapter the course tests call. Module 5 adds `register_cards`, `assemble`, `cost` and `set_chooser`.
Run it with the module's tests: `node tools/verify-references.mjs 05` from the course repository. `cargo test` in this directory alone fails: there is no `cards/` here.