- 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.6 KiB
JSON
65 lines
2.6 KiB
JSON
{
|
|
"strokes": [
|
|
{ "Rect": { "x": 0, "y": 0, "w": 160, "h": 168, "color": 0, "meaning": "None" } },
|
|
{ "Rect": { "x": 6, "y": 16, "w": 148, "h": 146, "color": 7, "meaning": "Floor" } },
|
|
{ "Rect": { "x": 0, "y": 0, "w": 65, "h": 16, "color": 8, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 95, "y": 0, "w": 65, "h": 16, "color": 8, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 0, "y": 160, "w": 160, "h": 8, "color": 8, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 0, "y": 0, "w": 6, "h": 70, "color": 8, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 0, "y": 100, "w": 6, "h": 68, "color": 8, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 154, "y": 0, "w": 6, "h": 168, "color": 8, "meaning": "Wall" } },
|
|
{ "Rect": { "x": 66, "y": 4, "w": 28, "h": 12, "color": 5, "meaning": "None" } },
|
|
{ "Rect": { "x": 14, "y": 24, "w": 34, "h": 8, "color": 13, "meaning": "None" } },
|
|
{ "Rect": { "x": 112, "y": 22, "w": 34, "h": 8, "color": 11, "meaning": "None" } },
|
|
{ "Rect": { "x": 60, "y": 30, "w": 40, "h": 6, "color": 14, "meaning": "None" } }
|
|
],
|
|
"spawn": [80, 140],
|
|
"exits": [2, null, null, 0],
|
|
"objects": [
|
|
{
|
|
"name": "amp",
|
|
"sprite": "chest",
|
|
"x": 122,
|
|
"y": 132,
|
|
"look": "The club's outdoor amp, tall as a fridge. Its fuse slot gapes empty and scorched.",
|
|
"synonyms": "amplifier speaker stack",
|
|
"use_text": "You slot the fuse home. The amp THUMPS alive - bass rolls down the street like weather.",
|
|
"needs": "fuse",
|
|
"sets_flag": "music_on"
|
|
},
|
|
{
|
|
"name": "bouncer",
|
|
"sprite": "orc",
|
|
"x": 80,
|
|
"y": 108,
|
|
"look": "A slab of security chrome parked in front of the club door. Its arms are crossed so hard they have fused.",
|
|
"synonyms": "guard security doorbot",
|
|
"use_text": "You push the bouncer. The bouncer does not notice.",
|
|
"dialogue": [
|
|
{
|
|
"says": "List. Name. No name, no party.",
|
|
"choices": [
|
|
{ "text": "C'mon, one dance?", "goto": 1 },
|
|
{
|
|
"text": "Hear that bass? I fixed your amp. I'm with the band.",
|
|
"goto": 2,
|
|
"requires_flag": "music_on",
|
|
"sets_flag": "on_the_list"
|
|
},
|
|
{ "text": "Fine.", "goto": -1 }
|
|
]
|
|
},
|
|
{
|
|
"says": "No list, no dance. The list is life.",
|
|
"choices": [{ "text": "Harsh.", "goto": -1 }]
|
|
},
|
|
{
|
|
"says": "...That WAS you? Respect, fixer. You're on the list. The booth is upstairs, north door.",
|
|
"choices": [{ "text": "Let's go.", "goto": -1 }]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"music": 3
|
|
}
|