rhai's default feature set is ["std", "ahash/runtime-rng"]. The second half
seeds hash maps from OS entropy, which is a run-to-run variation source
living under a crate whose whole promise is byte-identical replays — and it
pulls getrandom, which has no backend on wasm32-unknown-unknown, so the
browser build could not compile at all.
Dropping it leaves ahash on its compile-time seed. The canonical Neon
Precinct playthrough produces byte-identical events before and after, and
the suite is green.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Save slots aren't always files. The MRP3GI browser build hands a SaveData
straight to localStorage instead of saves/<slot>.json, so the two halves of
the checkpoint machinery need to be reachable from outside the crate.
Native behavior is unchanged — SaveGame/RestoreGame still go through the
same two functions.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
F8 toggles edit mode. Tools: brush/line/rect/ellipse/flood/gradient/picker; ink meanings write LOOK/FLOOR/WALL/WATER/DEPTH across the four screens; V overlays priority/control/hotspot; hotspot rects, prop placement, spawn, and a :colon command line (save/name/enter/music/weather/exit/room/hotmsg). Every editor action is a bus Command (paint_op, undo_op, clear_ops, set_spawn/exit/music/weather/room_name/enter_text, upsert/delete hotspot+prop) so MCP clients wield identical powers. PicOp::Brush added; docs/EDITOR.md. Verified: 5 suites green, playthrough events byte-identical to pre-editor build, GUI boots.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
AI lane (ported from MRPGI): unknown typed sentences go to a local LLM (MRPCI_AI: ollama default / openrouter / off) that maps them onto already-legal commands; one in flight, polled per tick, hard-off under --script so replays stay byte-identical. Portraits: NPCs/props gain a portrait sprite drawn beside the dialogue window in the GUI (6x) and annotated frames (2x); sergeant + vend-bot faces in the demo. Also: --script + --render-room renders the frame a replay ends on. Verified: 5 test suites green, deterministic 25/25 playthrough, GUI boots.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adaptations from the software-rendering playbook, at MRPCI's level of the
stack:
- pic.rs: fBm noise fill, jittered Voronoi fill (with mortar edges) and
scatter — seeded, deterministic, Bayer-dithered through palette ramps
- particles.rs: rain/snow/embers layer on its own RNG stream; RoomDoc
gains `weather`; visuals can never perturb gameplay replays
- font.rs: built-in 5x7 font stamped in index space; headless frames are
now annotated (room chip, score, dialogue windows, transcript strip) so
MCP render_frame shows what a player actually reads (--raw to skip)
- render.rs: compose split into index-space compositing + palette blit;
effective_palette() exports the cycle-LUT-applied strip
- GUI: frame ships to the GPU as indices + a 256x1 palette texture; a
fragment shader does the lookup plus CRT curvature/scanlines/vignette
and room-change fades
- Neon Precinct: fBm night sky + stars, Voronoi sidewalk & wet cobbles,
fBm asphalt, rain in Neon Row and Rain Alley
Verified: replay determinism (byte-identical events x2), 25/25 win path,
GUI boots with the shader.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>