First Part II module. The cumulative reference adds a second engine (src/engine/puzzle: grid, lexer, parser) beside Part I's; nouns and properties are data in src/content/words.json, and the engine names only IS/AND/NOT/TEXT and the base rule TEXT IS PUSH. Rules are recompiled from the board on every change; rules() is a sorted set. Adds the M6 scenarios and tests (rows, columns, shared IS, AND distribution, stacked text, base rule), the HOT word as a data-only Expansion Drop, the lesson with the Part II bridge, and the Rust LevelDef shape in harness.md. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Module 6 reference engine (TypeScript)
The course's own engine as of the end of Module 6, the first module of Part II. Part I's card engine is unchanged, and all of its tests still pass. Beside it, in src/engine/puzzle/, is a second engine for Baba Is You: a grid of objects and text, a lexer and a parser. Module 5's reference was the starting point, so a diff between the two shows what this module adds.
cards/(at the package 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.ts: the level format (LevelDef,course/schema/level.schema.json), object kinds ("<noun>"or"text:<WORD>") and the board: objects on tiles, several per tile allowed.word.ts: the lexicon (every word the parser can read, with its role: noun, property or operator) and the lexer, which turns the text on the board into words by tile. Text whose word isn't in the lexicon spells nothing.parse.ts: the parser. From everyIS, in a row and in a column, it collects the AND-joined subjects before it and the AND-joined complements after it, and emits one rule per pair. Stacked words each count. Base rules come first.level.ts: a level in play. Every change to the board recompiles the rules from scratch.index.ts: the module's exports.
- The rest of
src/engine/: Part I, unchanged from Module 5 except for the export that addspuzzle. src/content/words.json: the nouns and properties the parser knows, as data ({ "name", "role" }).src/content/index.tsreads it with a JSON import aswords()(tsconfig.jsongainsresolveJsonModulesotscaccepts the import; Vitest needs nothing). A new word is a new entry here.src/harness.ts: the adapter the course tests call. Module 6 addsnewBaba, andplaceandrulesonBaba.rules()sorts the rules' normalised strings and keeps each distinct rule once; the engine itself keeps a rule spelled twice twice.
Run it with the module's tests: node tools/verify-references.mjs 06 from the course repository.