MRPCI/games/neon-precinct/rooms/room2.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

684 lines
11 KiB
JSON

{
"name": "Rain Alley",
"enter_text": "The alley smells like rust and secrets. Crates wall off the far corner. Something glints behind them.",
"background": "",
"ops": [
{
"VGradient": {
"x": 0,
"y": 0,
"w": 320,
"h": 100,
"ramp": [
33,
76
],
"ink": {
"color": 0,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Polygon": {
"pts": [
[
0,
0
],
[
110,
0
],
[
86,
100
],
[
0,
100
]
],
"ink": {
"color": 75,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Polygon": {
"pts": [
[
210,
0
],
[
320,
0
],
[
320,
100
],
[
234,
100
]
],
"ink": {
"color": 111,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Line": {
"pts": [
[
0,
10
],
[
101,
10
]
],
"ink": {
"color": 33,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
217,
10
],
[
320,
10
]
],
"ink": {
"color": 68,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
0,
24
],
[
98,
24
]
],
"ink": {
"color": 33,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
220,
24
],
[
320,
24
]
],
"ink": {
"color": 68,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
0,
38
],
[
96,
38
]
],
"ink": {
"color": 33,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
222,
38
],
[
320,
38
]
],
"ink": {
"color": 68,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
0,
52
],
[
94,
52
]
],
"ink": {
"color": 33,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
224,
52
],
[
320,
52
]
],
"ink": {
"color": 68,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
0,
66
],
[
91,
66
]
],
"ink": {
"color": 33,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
227,
66
],
[
320,
66
]
],
"ink": {
"color": 68,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
0,
80
],
[
89,
80
]
],
"ink": {
"color": 33,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
229,
80
],
[
320,
80
]
],
"ink": {
"color": 68,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
0,
94
],
[
87,
94
]
],
"ink": {
"color": 33,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Line": {
"pts": [
[
231,
94
],
[
320,
94
]
],
"ink": {
"color": 68,
"pri": "Keep",
"ctl": "Keep",
"hot": null
}
}
},
{
"Rect": {
"x": 250,
"y": 30,
"w": 4,
"h": 16,
"ink": {
"color": 248,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 254,
"y": 30,
"w": 6,
"h": 4,
"ink": {
"color": 250,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 254,
"y": 36,
"w": 6,
"h": 4,
"ink": {
"color": 252,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 254,
"y": 42,
"w": 6,
"h": 4,
"ink": {
"color": 254,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"VGradient": {
"x": 0,
"y": 100,
"w": 320,
"h": 90,
"ramp": [
21,
19,
18
],
"ink": {
"color": 0,
"pri": "Band",
"ctl": {
"Set": 0
},
"hot": null
}
}
},
{
"Ellipse": {
"cx": 150,
"cy": 152,
"rx": 44,
"ry": 8,
"ink": {
"color": 77,
"pri": "Keep",
"ctl": {
"Set": 2
},
"hot": null
}
}
},
{
"Rect": {
"x": 60,
"y": 20,
"w": 6,
"h": 66,
"ink": {
"color": 24,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Rect": {
"x": 60,
"y": 86,
"w": 6,
"h": 4,
"ink": {
"color": 26,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
}
],
"palette": null,
"cycles": [
{
"start": 248,
"len": 8,
"period": 4,
"reverse": true,
"active": true
}
],
"scale": {
"horizon_y": 95,
"min_scale": 0.6,
"full_y": 185
},
"spawn": [
24,
160
],
"exits": [
null,
null,
null,
0
],
"exit_flags": [
"",
"",
"",
""
],
"exit_blocked": [
"",
"",
"",
""
],
"hotspots": [
{
"name": "pipe",
"rect": [
58,
18,
10,
74
],
"poly": [],
"msgs": {
"listen": "Drip. Drip. Drip. It's in 7/8 time, somehow.",
"look": "A drainage pipe keeping its own beat."
},
"exit_to": null,
"arrive": null,
"requires_flag": "",
"blocked_text": "",
"trigger": false,
"blocks": false
},
{
"name": "bar sign",
"rect": [
246,
26,
20,
24
],
"poly": [],
"msgs": {
"look": "BAR, says the little neon, economically."
},
"exit_to": null,
"arrive": null,
"requires_flag": "",
"blocked_text": "",
"trigger": false,
"blocks": false
}
],
"props": [
{
"name": "crate stack",
"sprite": "crate",
"x": 226,
"y": 138,
"msgs": {
"look": "Shipping crates. Stenciled: PROPERTY OF NOBODY, HONEST."
},
"takeable": false,
"synonyms": "crates boxes",
"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
},
{
"name": "more crates",
"sprite": "crate",
"x": 258,
"y": 130,
"msgs": {
"look": "More crates. The alley is basically municipal Tetris."
},
"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
},
{
"name": "keycard",
"sprite": "keycard",
"x": 268,
"y": 112,
"msgs": {
"look": "A precinct keycard, dropped in a hurry. Evidence locker 47, if you had to guess."
},
"takeable": true,
"synonyms": "",
"use_text": "",
"needs": "",
"wins": false,
"requires_flag": "",
"sets_flag": "",
"dialogue": [],
"points": 5,
"consumes": false,
"kills": false,
"visible_flag": "",
"hidden_by_flag": "",
"solid": false,
"fixed_priority": null,
"fixed_scale": null
},
{
"name": "fusebox",
"sprite": "fusebox",
"x": 96,
"y": 96,
"msgs": {
"look": "A junction box, sparking gently. Every instinct you have files a hazard report."
},
"takeable": false,
"synonyms": "",
"use_text": "You touch the sparking fusebox. For 0.4 glorious seconds you are the brightest thing on Neon Row.",
"needs": "",
"wins": false,
"requires_flag": "",
"sets_flag": "",
"dialogue": [],
"points": 0,
"consumes": false,
"kills": true,
"visible_flag": "",
"hidden_by_flag": "",
"solid": false,
"fixed_priority": 15,
"fixed_scale": null
}
],
"npcs": [],
"music": 2,
"defaults": {},
"script": "room2.rhai"
}