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]>
17 lines
2.3 KiB
Markdown
17 lines
2.3 KiB
Markdown
# 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.
|