New authoring surface (all serde-defaulted; old games load unchanged):
- RoomDoc: name + enter_text (announced on entry), exit_flags/exit_blocked
(per-direction flag gates with authored refusal lines, latched per attempt)
- ObjDef: points (once per room+name), consumes, kills, visible_flag,
hidden_by_flag; DlgChoice: points (latched on sets_flag flip), kills
(goto node's says = death text)
- GameManifest: max_score enables scoring; GUI shows the classic
'Score: X of Y' in the menu bar; score_changed + died on the bus
- Death restarts the day, keeping the cause at the top of the fresh transcript
Reviewed by an adversarial multi-agent pass; confirmed findings fixed:
corner push-back no longer slingshots through a perpendicular open exit
(and checks the landing pixel), blocked messages latch per attempt,
kill choices pay no points/flags, new_game re-zeroes the score on the bus,
AI-lane prompts respect object visibility. Deliberate behavior change:
drop/consumes now emit inventory_changed (was a silent client desync).
Built for MORPQUEST (games/… ssh://…/monster/mrpquest.git), which uses all
of it: 250-point budget, four gated exits, two deaths, vanishing Beckies.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The handover plan (docs/HANDOVER.md), P0-P6, in one pass. One insight
powers it: CLI/HTTP/MCP/Python is one feature, not four — a headless
core driven by Commands in, Events out, with every surface a thin
adapter.
- mrpgi-core: the whole sim as a library with zero macroquad (the
workspace boundary is the guardrail). GameState::apply/tick, fixed
1/20s cycles, deterministic replays, headless RGBA/PNG rendering.
- mrpgi-headless: JSONL stdio REPL, --script replay (AI lane off =
byte-identical), --render-room PNG, --serve HTTP (state/command/
events cursor/frame.png), --mcp JSON-RPC stdio server whose
render_frame returns a real PNG so a model sees its own moves.
- Games are folders: game.json manifest (all fields default — legacy
dirs still load), data-driven verb table feeding both the parser and
the AI whitelist, flags with requires_flag/sets_flag gating on
objects and dialogue choices, live UpsertRoom lore ingestion with
validation.
- mrpgi (GUI): now one consumer of the bus; editor commits through the
same commands MCP uses; audio became core events with per-game
sfx/ music/ file overrides beating the chiptune synth.
- Tests: parser goldens + a full win-path playthrough asserting
byte-identical transcripts across runs.
Deleted: the old fused src/ (root is now a virtual workspace), the
dead demo Scene/Assets path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Captures the 2026-07-05 design session: making MRPGI fully
programmatically controllable (MCP + CLI/stdio + HTTP/WebSocket) via a
headless mrpgi-core engine behind a typed command/event bus, with the
macroquad GUI as one optional front-end.
Includes: current-state analysis, the core refactor (GameState with
apply/tick), games-as-folders + JSON lore ingestion, an "always want
options" audio design (SynthSink / FileSink mp3-ogg-wav / StrudelSink,
all toggleable), a P0-P6 roadmap, quick wins, risks, and a source map.
Adds docs/architecture.svg (self-contained) plus an inline Mermaid
diagram in the handover.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>