Files
systemic-game-design-course/course/07-rule-resolution/reference/rust/README.md
T
Lucas WintherandClaude Opus 5.5 d993457772 feat: module 07 rule resolution
Adds IS NOT to the Part II parser and a resolution pass (negation, then
identity lock) that turns parsed rules into the rules in force; harness
gains activeRules() and hasProperty(). A leading NOT now breaks the
sentence instead of being ignored (carried from M6 review). Nouns say
which objects they name ("selects"), so the ALL Expansion Drop is one
line of data. Corrects lesson 06's NOT wording; harness.md M7 details.

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

18 lines
2.1 KiB
Markdown

# Module 7 reference engine (Rust)
The course's own engine as of the end of Module 7. Part I's card engine is unchanged, and all of its tests still pass. The Part II engine in `src/engine/puzzle/` now reads `IS NOT` and resolves the parsed rules into the rules in force. Module 6'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): Part I's card data, a copy of `course/cards/` staged by `tools/verify-references.mjs`. Part II doesn't read it.
- `src/engine/puzzle/`: the Part II engine. It names no noun: the engine's own words are the operators `IS`, `AND`, `NOT`, the meta-noun `TEXT` and the property `PUSH` of the base rule `TEXT IS PUSH`.
- `grid.rs`: the level format, object kinds and the board. Module 7 adds `Board::get`.
- `word.rs`: the lexicon and the lexer. Module 7 adds `Selects`: which objects a noun names as a subject (its own things by default, every text object for `TEXT`, or every non-text object), read from the word list's optional `"selects"` field, and `Lexicon::names`.
- `parse.rs`: the parser. Module 7 adds `NOT`: before a complement it negates that complement (`Rule::negated`); before a subject it ends the run of subjects without that subject. Each rule also records its complement's role, so a conversion (`X IS <noun>`) can be told apart.
- `resolve.rs` (new): the resolution pass. Negation first (`X IS NOT Y` cancels every `X IS Y` and stays in force), then the identity lock (a surviving `X IS X` cancels `X IS Y` for nouns `Y`).
- `level.rs`: a level in play. Every change to the board parses, then resolves. `has_property` answers for one object from the rules in force.
- `mod.rs`: the module's exports.
- The rest of `src/engine/`: Part I, unchanged.
- `src/content/words.json`: unchanged from Module 6.
- `src/harness.rs`: the adapter the course tests call. Module 7 adds `Baba::active_rules` and `Baba::has_property`; `rules()` now lists negated rules too (`"BABA IS NOT YOU"`).
Run it with the module's tests: `node tools/verify-references.mjs 07` from the course repository.