- commit
- 6a82b24b3ee43995378f9d6e390da12e0f1fd9ad
- parent
- 0d006837d17e4c5be5af9ccf96af05ea1b44cba6
- author
- Dami <dami.etoile@gmail.com>
| A | README.md | 36 | ++++++++++++++++++++ |
| A | docs/ | 53 | ++++++++++++++++++++++++++++++ |
@@ -0,0 +1,36 @@
1+# Miau Is True2+3+A small browser puzzle engine for moving words, changing rules, and solving grid puzzles. The first playable release uses emoji objects, pushable sentence tiles, three teaching levels, and local CommonJS level packs.4+5+## Run it6+7+```sh8+npm install9+npm run dev10+```11+12+Open the local URL printed by Vite. Run `npm test` for the engine and content fixtures, and `npm run build` to produce `dist/`.13+14+## Play15+16+- Arrow keys or WASD: move one cell.17+- Z: undo a successful move.18+- R: restart the current level.19+- F: toggle fullscreen.20+- Touch controls, Undo, Restart, and Continue are available on screen.21+22+Each word is a pushable object. Straight sentences read left to right or top to bottom. `MIAU IS YOU` makes the cat controllable; moving `STOP` out of `ROCK IS STOP` makes rocks passable. `AND` can join subjects or predicates. Words can also turn one noun into another, such as `MIAU IS ROCK`.23+24+The first property set is `YOU`, `PUSH`, `STOP`, `WIN`, `SINK`, and `DEFEAT`. This engine has its own MIAU levels and presentation; it does not attempt full compatibility with Baba Is You.25+26+## Make a mod27+28+Use the **Import module** control to select a trusted local `.cjs` or `.js` file. A mod exports a CommonJS object with a manifest, level data, and optional noun palette. See [the example mod](mods/example.cjs) and [modding guide](docs/modding.md). Local modules execute JavaScript in the browser, so load files you trust.29+30+## Design and workflow31+32+- [Design backbone](docs/design-backbone.md): vocabulary, turn order, puzzle design research, and extension boundaries.33+- [Roadmap](docs/roadmap.md): the next OpenSpec changes and decisions to settle.34+- `openspec/`: behavioral specs and the history of proposed changes. Start a new feature with `openspec new change <name>`, read `openspec instructions` for each artifact, validate before implementation, then archive after verification.35+36+Pretext sizes variable-length hint copy. Grid coordinates are fixed integers, so emoji and text metrics never change collision geometry. UI sounds come from the supplied Kenney UI Pack (CC0; license in `public/audio/LICENSE.txt`).@@ -0,0 +1,53 @@
1+# Roadmap2+3+This is a planning queue, not a claim that the later vocabulary already works. Each milestone should become an OpenSpec change with scenarios and engine fixtures before implementation.4+5+## 0. Playable foundation — `build-dynamic-rule-engine`6+7+Three MIAU puzzles establish the turn contract: stacked occupancy, cardinal movement, atomic push chains, `IS` and `AND`, six properties, transformations, undo, a CommonJS content format, and a fixed emoji grid. The active OpenSpec change records these as behavioral requirements.8+9+## 1. Make the rule language composable10+11+Proposed changes: `add-negation-and-conditions`, then `add-paired-interactions`.12+13+- Add `NOT` with explicit contradiction and transformation precedence.14+- Add `ON`, `NEAR`, and `LONELY` only after the parser can report *why* a rule is active for each object.15+- Add paired effects (`OPEN`/`SHUT`, `HOT`/`MELT`) with conflict examples in fixtures.16+- Keep `ALL`, `EMPTY`, `TEXT`, and `LEVEL` out of this milestone because they change selection and meta rules more broadly.17+18+**Gate:** every new word has a small teaching level, a rule display explanation, a conflict test, and an undo/replay fixture.19+20+## 2. Let mods define behavior21+22+Proposed change: `add-deterministic-mod-systems`.23+24+The current CommonJS contract adds nouns, emoji, and levels. A later contract should register named properties and pure effect handlers against explicit turn phases. The host should pass read-only state queries and queue mutations; hooks should never directly edit the rule table or renderer. Decide save serialization and load order before freezing the API. For untrusted shared mods, move execution into an isolated worker or iframe with a versioned message protocol.25+26+**Gate:** a sample mod adds one genuinely new property, reproduces the same result from a recorded intent sequence, and fails cleanly when its handler errors.27+28+## 3. Author and test puzzles29+30+Proposed change: `add-level-editor-and-replay`.31+32+- Add a grid editor with a palette derived from the vocabulary registry.33+- Show active sentences and source word coordinates while editing.34+- Export/import CommonJS level packs and compact replay traces.35+- Check bounds, initial `YOU` control, reachable rule words, and common Sokoban dead squares. Treat solver output as a hint for authors rather than proof of puzzle quality.36+37+**Gate:** a designer can build, play, undo, export, reload, and replay a puzzle without changing source files.38+39+## 4. Campaign and sharing40+41+Proposed change: `add-campaign-progression`.42+43+Group levels by the word they introduce, mark challenges separately, and preserve multiple paths through hard sections. Test for unintended shortcuts as well as intended solutions. Add persistent progress only after the level and mod IDs are stable.44+45+## Current decisions to preserve or revisit deliberately46+47+1. Multiple `YOU` objects resolve in a stable direction-aware order. Future simultaneous movement would need a new rule-engine spec and replay fixtures.48+2. `STOP` takes precedence over `PUSH` on the same object. A blocked intent does not consume a move.49+3. Contacts resolve `SINK`, then `DEFEAT`, then `WIN`, so a defeated controlled object cannot win in the same cell.50+4. Stacked words generate sentence combinations in stable object order; the UI offsets occupants and shows a stack count.51+5. No `YOU` state is recoverable with undo or restart. A later loss screen should be designed only if puzzles need it.52+53+The [design backbone](design-backbone.md) explains the research behind these priorities. The first release documents its actual behavior in `openspec/specs/` after its active change is archived.