MRPCI/games/neon-precinct/rooms/room0.json
m3ultra c83c90711d MRPCI v0.1 — the SCI-generation Monster Robot Party engine
Headless core (mrpci-core) + macroquad GUI (mrpci), inheriting MRPGI's
Command/Event bus architecture and jumping a Sierra generation:

- 256-color palettes with live median-cut quantization + palette cycling
- four screens: visual / priority / control / hotspot
- A* pathfinding with LOS-verified edges and line-exact path following
- perspective scale tables (actors shrink toward the horizon)
- point-and-click verb bar AND a text parser, one shared verb pipeline
- rhai room scripts (on_enter/on_verb/on_trigger + after() tick timers)
- deterministic 30Hz cycles, seeded RNG — byte-identical script replays
- checkpoint at room entry; death rewinds instead of restarting
- save-anywhere slots; multi-voice chip synth; JSONL/HTTP/MCP surfaces
- demo game: Neon Precinct (3 rooms, 25 points, one merciful fusebox)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 22:52:39 +10:00

1149 lines
19 KiB
JSON

{
"name": "Neon Row",
"enter_text": "Neon Row at 2 AM. The EAT sign crawls. The precinct door glows across the street.",
"background": "",
"ops": [
{
"VGradient": {
"x": 0,
"y": 0,
"w": 320,
"h": 84,
"ramp": [
33,
34,
70,
77
],
"ink": {
"color": 0,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 0,
"y": 30,
"w": 90,
"h": 78,
"ink": {
"color": 76,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 90,
"y": 44,
"w": 70,
"h": 64,
"ink": {
"color": 112,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 160,
"y": 24,
"w": 100,
"h": 84,
"ink": {
"color": 77,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 260,
"y": 50,
"w": 60,
"h": 58,
"ink": {
"color": 119,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 6,
"y": 38,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 32,
"y": 38,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 45,
"y": 38,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 71,
"y": 38,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 6,
"y": 52,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 32,
"y": 52,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 45,
"y": 52,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 71,
"y": 52,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 6,
"y": 66,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 32,
"y": 66,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 45,
"y": 66,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 71,
"y": 66,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 6,
"y": 80,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 32,
"y": 80,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 45,
"y": 80,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 71,
"y": 80,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 96,
"y": 52,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 122,
"y": 52,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 135,
"y": 52,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 96,
"y": 66,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 109,
"y": 66,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 135,
"y": 66,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 148,
"y": 66,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 109,
"y": 80,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 122,
"y": 80,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 148,
"y": 80,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 268,
"y": 58,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 294,
"y": 58,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 307,
"y": 58,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 281,
"y": 72,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 294,
"y": 72,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 268,
"y": 86,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 281,
"y": 86,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 307,
"y": 86,
"w": 6,
"h": 8,
"ink": {
"color": 195,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 204,
"y": 60,
"w": 38,
"h": 48,
"ink": {
"color": 120,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 210,
"y": 68,
"w": 26,
"h": 40,
"ink": {
"color": 76,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 214,
"y": 56,
"w": 18,
"h": 8,
"ink": {
"color": 244,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 96,
"y": 22,
"w": 4,
"h": 18,
"ink": {
"color": 248,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 100,
"y": 22,
"w": 8,
"h": 4,
"ink": {
"color": 249,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 100,
"y": 30,
"w": 6,
"h": 4,
"ink": {
"color": 250,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 114,
"y": 22,
"w": 12,
"h": 4,
"ink": {
"color": 251,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 114,
"y": 30,
"w": 4,
"h": 10,
"ink": {
"color": 252,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 124,
"y": 30,
"w": 4,
"h": 10,
"ink": {
"color": 253,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 116,
"y": 34,
"w": 8,
"h": 4,
"ink": {
"color": 254,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 134,
"y": 22,
"w": 12,
"h": 4,
"ink": {
"color": 255,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 138,
"y": 26,
"w": 4,
"h": 14,
"ink": {
"color": 248,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"VGradient": {
"x": 0,
"y": 108,
"w": 320,
"h": 42,
"ramp": [
22,
21,
20
],
"ink": {
"color": 0,
"pri": "Band",
"ctl": {
"Set": 0
},
"hot": null
}
}
},
{
"Rect": {
"x": 0,
"y": 150,
"w": 320,
"h": 3,
"ink": {
"color": 24,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"VGradient": {
"x": 0,
"y": 153,
"w": 320,
"h": 37,
"ramp": [
19,
18
],
"ink": {
"color": 0,
"pri": "Band",
"ctl": {
"Set": 0
},
"hot": null
}
}
},
{
"Ellipse": {
"cx": 60,
"cy": 166,
"rx": 26,
"ry": 6,
"ink": {
"color": 77,
"pri": "Keep",
"ctl": {
"Set": 2
},
"hot": null
}
}
},
{
"Rect": {
"x": 74,
"y": 92,
"w": 4,
"h": 54,
"ink": {
"color": 26,
"pri": {
"Set": 12
},
"ctl": "Keep",
"hot": null
}
}
},
{
"Rect": {
"x": 68,
"y": 86,
"w": 16,
"h": 6,
"ink": {
"color": 245,
"pri": {
"Set": 12
},
"ctl": "Keep",
"hot": null
}
}
},
{
"Rect": {
"x": 74,
"y": 143,
"w": 4,
"h": 3,
"ink": {
"color": null,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
}
],
"palette": null,
"cycles": [
{
"start": 248,
"len": 8,
"period": 3,
"reverse": false,
"active": true
}
],
"scale": {
"horizon_y": 100,
"min_scale": 0.55,
"full_y": 185
},
"spawn": [
104,
168
],
"exits": [
null,
2,
null,
null
],
"exit_flags": [
"",
"",
"",
""
],
"exit_blocked": [
"",
"",
"",
""
],
"hotspots": [
{
"name": "precinct door",
"rect": [
206,
104,
34,
12
],
"poly": [],
"msgs": {
"look": "The 41st Precinct. Your house."
},
"exit_to": 1,
"arrive": [
160,
176
],
"requires_flag": "",
"blocked_text": "",
"trigger": false,
"blocks": false
},
{
"name": "neon sign",
"rect": [
92,
18,
54,
34
],
"poly": [],
"msgs": {
"do": "It's four stories up. Even your warrant doesn't reach.",
"look": "EAT, insists the neon, in colors that never sit still."
},
"exit_to": null,
"arrive": null,
"requires_flag": "",
"blocked_text": "",
"trigger": false,
"blocks": false
},
{
"name": "puddle",
"rect": [
34,
160,
52,
13
],
"poly": [],
"msgs": {
"do": "You are 900 pounds of municipal robot. The puddle wins.",
"look": "Neon drowns in the puddle. Your chassis manual is very clear about puddles."
},
"exit_to": null,
"arrive": null,
"requires_flag": "",
"blocked_text": "",
"trigger": false,
"blocks": false
},
{
"name": "tripwire",
"rect": [
120,
108,
24,
82
],
"poly": [],
"msgs": {},
"exit_to": null,
"arrive": null,
"requires_flag": "",
"blocked_text": "",
"trigger": true,
"blocks": false
}
],
"props": [
{
"name": "dumpster",
"sprite": "dumpster",
"x": 288,
"y": 148,
"msgs": {
"look": "A city dumpster. Something inside is composting on a geological timescale.",
"smell": "Your olfactory sensor files a grievance.",
"do": "You rummage. Old circuit boards, a single roller skate, regret."
},
"takeable": false,
"synonyms": "",
"use_text": "",
"needs": "",
"wins": false,
"requires_flag": "",
"sets_flag": "",
"dialogue": [],
"points": 0,
"consumes": false,
"kills": false,
"visible_flag": "",
"hidden_by_flag": "",
"solid": true,
"fixed_priority": null,
"fixed_scale": null
}
],
"npcs": [
{
"name": "vend-bot",
"sprite": "vendbot",
"x": 150,
"y": 132,
"msgs": {
"look": "A vending robot on tired treads, hawking hot oil."
},
"dialogue": [
{
"says": "Hot oil! Fresh volts! You look like a cop with questions.",
"choices": [
{
"text": "Seen anything shady tonight?",
"goto": 1,
"requires_flag": "",
"sets_flag": "",
"points": 0,
"kills": false
},
{
"text": "Just passing through.",
"goto": -1,
"requires_flag": "",
"sets_flag": "",
"points": 0,
"kills": false
}
]
},
{
"says": "Somebody ditched a keycard in the alley east of here. Behind the crates. Didn't touch it — bad for business.",
"choices": [
{
"text": "Appreciated, citizen.",
"goto": -1,
"requires_flag": "",
"sets_flag": "",
"points": 0,
"kills": false
}
]
}
],
"wander": 34,
"visible_flag": "",
"hidden_by_flag": "",
"fixed_scale": null
}
],
"music": 6,
"defaults": {},
"script": "room0.rhai"
}