Applying a Damage to one target now runs DAMAGE_STEPS = [redirect, armor]
first. A damageRedirect aura (Bolf Ramshield, fetched from the wiki) sends
damage meant for its owner's hero to the oldest such minion; Armor absorbs
damage to a hero before Health, logged as the new ArmorLost{player, amount}
just before a full-amount Damaged. Four new Module 4 tests; propagated to the
references of Modules 4-10 in both tracks; card schema, catalog, card JSON,
harness.md, Lessons 2, 4 and 5 updated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 ofcourse/cards/staged bytools/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 operatorsIS,AND,NOT, the meta-nounTEXTand the propertyPUSHof the base ruleTEXT IS PUSH.grid.rs: the level format, object kinds and the board. Module 7 addsBoard::get.word.rs: the lexicon and the lexer. Module 7 addsSelects: which objects a noun names as a subject (its own things by default, every text object forTEXT, or every non-text object), read from the word list's optional"selects"field, andLexicon::names.parse.rs: the parser. Module 7 addsNOT: 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 Ycancels everyX IS Yand stays in force), then the identity lock (a survivingX IS XcancelsX IS Yfor nounsY).level.rs: a level in play. Every change to the board parses, then resolves.has_propertyanswers 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 addsBaba::active_rulesandBaba::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.