- MANUAL.md brought up to the workspace era: game folders + manifest, flags & gated puzzles, hidden dialogue choices, audio file overrides, a Programmatic control section (CLI/HTTP/MCP/Python), and the new two-crate architecture map. - games/lost-fuse: three rooms that demonstrate every mechanic in one chain — item, needs-lock, object sets_flag, a dialogue choice hidden behind requires_flag, dialogue sets_flag, and a flag-locked wins finale. Verified winnable headlessly, gate included. - games/lost-fuse/expansion/roof.jsonl: a live lore drop that upserts a fourth room into a running game and rewires an exit — the "drop JSON lore in" workflow, runnable as a one-liner. - games/README.md: the guided tour — mechanic-to-JSON map, the live expansion demo, and how to prompt an LLM (or point Claude's MCP at the engine) to write valid lore. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
65 lines
2.5 KiB
JSON
65 lines
2.5 KiB
JSON
{
|
|
"strokes": [
|
|
{ "Rect": { "x": 0, "y": 0, "w": 160, "h": 168, "color": 1, "meaning": "None" } },
|
|
{ "Rect": { "x": 6, "y": 16, "w": 148, "h": 146, "color": 8, "meaning": "Floor" } },
|
|
{ "Rect": { "x": 0, "y": 0, "w": 160, "h": 16, "color": 0, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 0, "y": 160, "w": 160, "h": 8, "color": 0, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 0, "y": 0, "w": 6, "h": 168, "color": 0, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 154, "y": 0, "w": 6, "h": 70, "color": 0, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 154, "y": 100, "w": 6, "h": 68, "color": 0, "meaning": "Wall" } },
|
|
{ "Ellipse": { "x": 118, "y": 3, "w": 16, "h": 11, "color": 14, "meaning": "None" } },
|
|
{ "Ellipse": { "x": 22, "y": 104, "w": 34, "h": 18, "color": 6, "meaning": "None" } },
|
|
{ "Ellipse": { "x": 40, "y": 112, "w": 22, "h": 12, "color": 7, "meaning": "None" } },
|
|
{ "Rect": { "x": 130, "y": 72, "w": 24, "h": 4, "color": 10, "meaning": "None" } }
|
|
],
|
|
"spawn": [30, 140],
|
|
"exits": [null, 1, null, null],
|
|
"objects": [
|
|
{
|
|
"name": "fuse",
|
|
"sprite": "key",
|
|
"x": 52,
|
|
"y": 128,
|
|
"look": "A chunky glass fuse, pried from a dead washing machine. Miraculously intact.",
|
|
"takeable": true,
|
|
"synonyms": "glass part spare"
|
|
},
|
|
{
|
|
"name": "scrap-bot",
|
|
"sprite": "villager",
|
|
"x": 104,
|
|
"y": 122,
|
|
"look": "A retired greeter-bot, rusting politely among the junk. Its smile LED still works.",
|
|
"synonyms": "robot greeter bot",
|
|
"use_text": "You pat the scrap-bot. It emits a small, grateful beep.",
|
|
"dialogue": [
|
|
{
|
|
"says": "The club went quiet an hour ago. Bad scene. A party without bass is just... standing.",
|
|
"choices": [
|
|
{ "text": "What happened?", "goto": 1 },
|
|
{ "text": "Who are you?", "goto": 2 },
|
|
{ "text": "Later.", "goto": -1 }
|
|
]
|
|
},
|
|
{
|
|
"says": "The big amp blew its fuse mid-drop. The DJ is up there crying in binary. There are spare parts all over this yard, friend.",
|
|
"choices": [{ "text": "Say less.", "goto": -1 }]
|
|
},
|
|
{
|
|
"says": "Chassis No. 7. I greet, therefore I am.",
|
|
"choices": [{ "text": "Deep.", "goto": -1 }]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "sign",
|
|
"sprite": "sign",
|
|
"x": 78,
|
|
"y": 52,
|
|
"look": "Spray-painted: CLUB VOLTAGE ->-> (through the gap in the east fence).",
|
|
"synonyms": "graffiti notice"
|
|
}
|
|
],
|
|
"music": 2
|
|
}
|