MRPCI/games/neon-precinct/rooms/room0.json
m3ultra 0191b4680d v0.3 — AI parser lane + dialogue talker portraits
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>
2026-07-26 00:26:03 +10:00

1187 lines
20 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": [
{
"FbmFill": {
"x": 0,
"y": 0,
"w": 320,
"h": 84,
"ramp": [
33,
33,
34,
70,
77
],
"scale": 46.0,
"octaves": 4,
"seed": 7,
"ink": {
"color": 0,
"pri": "Keep",
"ctl": {
"Set": 1
},
"hot": null
}
}
},
{
"Scatter": {
"x": 0,
"y": 0,
"w": 320,
"h": 34,
"colors": [
26,
23,
15
],
"density": 5,
"seed": 8,
"ink": {
"color": 0,
"pri": "Keep",
"ctl": "Keep",
"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
}
}
},
{
"VoronoiFill": {
"x": 0,
"y": 108,
"w": 320,
"h": 42,
"cell": 26,
"colors": [
22,
22,
21,
22
],
"edge_color": 20,
"edge": 1.1,
"seed": 11,
"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
}
}
},
{
"FbmFill": {
"x": 0,
"y": 153,
"w": 320,
"h": 37,
"ramp": [
18,
19,
18,
20
],
"scale": 9.0,
"octaves": 3,
"seed": 12,
"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": {
"smell": "Your olfactory sensor files a grievance.",
"look": "A city dumpster. Something inside is composting on a geological timescale.",
"do": "You rummage. Old circuit boards, a single roller skate, regret."
},
"takeable": false,
"synonyms": "",
"use_text": "",
"needs": "",
"wins": false,
"requires_flag": "",
"sets_flag": "",
"dialogue": [],
"portrait": "",
"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
}
]
}
],
"portrait": "vendbot-face",
"wander": 34,
"visible_flag": "",
"hidden_by_flag": "",
"fixed_scale": null
}
],
"music": 6,
"weather": 1,
"defaults": {},
"script": "room0.rhai"
}