Sierra soul: 250-point scoring, real gated exits, two deaths, vanishing Beckies

Uses the new MRPGI features (room names/enter prose, exit_flags, points,
kills, consumes, visible_flag/hidden_by_flag). Golden path re-verified:
250/250 and the win; gate tests cover all four locked exits, the kebab
death, and the improvised-words Becky-grue.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-05 15:15:54 +10:00
parent 3241b6f14d
commit f421448919
18 changed files with 727 additions and 146 deletions

View File

@ -43,8 +43,18 @@ one day, five words, one white label.
| 12 | Counter | 13 | | 8 | | tense |
| 13 | Back Room | | | 12 | | spooky |
Physical access is open (the engine has no flag-gated exits); progression is
gated Infocom-style through flags, dialogue, and the win condition.
Progression is gated through flags, dialogue, and the win condition — plus
four real flag-gated exits (engine feature added for this game): the car door
(`seatbelt-freed`), the kitchen side door (`side-door-open`), the vine climb
(`noticed-vine`), and the beaded curtain (`back-room-open`).
**Scoring:** 250 points on offer (`max_score` in game.json), Sierra-style —
takes, first successful uses, and dialogue-choice flag flips all pay out.
**Deaths:** the mouldy kebab (eat it despite two warnings), and improvising
the five words at the hive (the Becky-grue). Death restarts the day.
**Vanishings:** the poster fragments exist only after the frenzy
(`visible_flag`), and the Beckies leave the entrance for good after dispersal
(`hidden_by_flag`). The lollipop is consumed when given (`consumes`).
## Main chain (flags in order)

View File

@ -25,6 +25,11 @@ Arrows (or click) walk. Verbs: `look take use talk drop inventory help`, plus
will not move for you. Documents move it. There is a true ending; the walls of
the toilet know the shape of it.
**Score: 0 of 250** when you start, Sierra-style. There are two ways to die:
one is in your car, clearly labelled, and you will eat it anyway; the other is
improvising sacred words at a hive of possessed superfans. Death restarts the
day. Morp is not cruel; Morp is accurate.
## What's here
- `game.json`, `rooms/room0..13.json` — the whole game: art stamps, walkability,

View File

@ -3,8 +3,28 @@
"start_room": 0,
"intro_text": "Record Store Day. You're meant to be doing a quick cat-food run; Uncle's list is in the glovebox, and the cat can smell weakness. Something is wrong at the shop today. Morp itself can feel it. (Arrows walk. Type 'help' for verbs.)",
"verbs": [
{ "name": "use", "words": ["climb", "wipe", "play", "pay", "post", "give", "plug", "press", "pin", "fix"] },
{ "name": "look", "words": ["search"] }
],
"flags": {}
{
"name": "use",
"words": [
"climb",
"wipe",
"play",
"pay",
"post",
"give",
"plug",
"press",
"pin",
"fix"
]
},
{
"name": "look",
"words": [
"search"
]
}
],
"flags": {},
"max_score": 250
}

View File

@ -1,67 +1,149 @@
{
"strokes": [
{ "Image": { "name": "bg_car", "x": 80, "y": 84, "meaning": "None" } },
{ "Rect": { "x": 0, "y": 0, "w": 160, "h": 138, "color": 0, "meaning": "Wall" } },
{ "Rect": { "x": 0, "y": 138, "w": 160, "h": 30, "color": 8, "meaning": "Floor" } },
{ "Image": { "name": "bg_car", "x": 80, "y": 84, "meaning": "None" } }
{
"Image": {
"name": "bg_car",
"x": 80,
"y": 84,
"meaning": "None"
}
},
{
"Rect": {
"x": 0,
"y": 0,
"w": 160,
"h": 138,
"color": 0,
"meaning": "Wall"
}
},
{
"Rect": {
"x": 0,
"y": 138,
"w": 160,
"h": 30,
"color": 8,
"meaning": "Floor"
}
},
{
"Image": {
"name": "bg_car",
"x": 80,
"y": 84,
"meaning": "None"
}
}
],
"spawn": [
80,
152
],
"exits": [
null,
1,
null,
null
],
"spawn": [80, 152],
"exits": [null, 1, null, null],
"music": 1,
"objects": [
{
"name": "paperclip", "sprite": "paperclip", "x": 58, "y": 150,
"name": "paperclip",
"sprite": "paperclip",
"x": 58,
"y": 150,
"look": "It glints under the seat with the confidence of a tool that knows its moment has come.",
"takeable": true, "synonyms": "clip"
"takeable": true,
"synonyms": "clip",
"points": 3
},
{
"name": "car keys", "sprite": "keys", "x": 100, "y": 148,
"name": "car keys",
"sprite": "keys",
"x": 100,
"y": 148,
"look": "Your keys. The fob battery died last week, same as the clock. The metal part still believes in you.",
"takeable": true, "synonyms": "key keys fob"
"takeable": true,
"synonyms": "key keys fob",
"points": 2
},
{
"name": "wallet", "sprite": "wallet", "x": 122, "y": 152,
"name": "wallet",
"sprite": "wallet",
"x": 122,
"y": 152,
"look": "Your wallet. Inside: a bank card, three receipts you insist are important, and the faint scent of consequences. It is both your identity and your final boss.",
"takeable": true
"takeable": true,
"points": 2
},
{
"name": "45 adapter", "sprite": "adapter", "x": 138, "y": 146,
"name": "45 adapter",
"sprite": "adapter",
"x": 138,
"y": 146,
"look": "A tiny plastic ring, loose in the glovebox. It is somehow the difference between listening and pretending. Small enough to lose. Important enough to ruin your day.",
"takeable": true, "synonyms": "adapter ring spider"
"takeable": true,
"synonyms": "adapter ring spider",
"points": 3
},
{
"name": "tote bag", "sprite": "tote", "x": 30, "y": 150,
"name": "tote bag",
"sprite": "tote",
"x": 30,
"y": 150,
"look": "A cotton tote from a festival you don't remember enjoying. Structurally, it is 90% intention.",
"takeable": true, "synonyms": "tote bag"
"takeable": true,
"synonyms": "tote bag",
"points": 2
},
{
"name": "seatbelt", "sprite": "none", "x": 45, "y": 130,
"name": "seatbelt",
"sprite": "none",
"x": 45,
"y": 130,
"look": "The buckle is jammed. It has chosen violence, quietly.",
"synonyms": "belt buckle",
"needs": "paperclip",
"use_text": "You pick the jammed buckle with the paperclip. The belt releases with a noise like a sigh. Freedom, sponsored by office supplies.",
"sets_flag": "seatbelt-freed"
"sets_flag": "seatbelt-freed",
"points": 5
},
{
"name": "mirror", "sprite": "none", "x": 80, "y": 125,
"name": "mirror",
"sprite": "none",
"x": 80,
"y": 125,
"look": "The rear-view mirror. Something is scratched into the plastic edge, under the dust.",
"synonyms": "rearview rear-view",
"use_text": "You wipe the dust from the mirror's edge. Scratched underneath, one word: RSD. It reads less like an acronym and more like an instruction.",
"sets_flag": "word-rsd"
"sets_flag": "word-rsd",
"points": 10
},
{
"name": "list", "sprite": "none", "x": 130, "y": 140,
"name": "list",
"sprite": "none",
"x": 130,
"y": 140,
"look": "Uncle's list, in handwriting like a cardiogram: RAMP (1977). A The The 10-inch. Model 500, 'Initial'. Three records that are basically rumours. At the bottom: DON'T COME BACK WITH NOTHING.",
"synonyms": "note uncles"
},
{
"name": "kebab", "sprite": "none", "x": 20, "y": 145,
"name": "kebab",
"sprite": "none",
"x": 20,
"y": 145,
"look": "It is clearly mouldy. It is also somehow still in your car. This is a warning. This is another warning.",
"synonyms": "falafel food",
"use_text": "No. Some doors stay closed. (Morp applauds politely.)"
"use_text": "You eat the kebab. It is exactly as mouldy as it looked, and you knew, and you did it anyway. Somewhere, Morp files this under 'informed consent'. He died with a falafel in his hand.",
"kills": true
},
{
"name": "ignition", "sprite": "none", "x": 62, "y": 128,
"name": "ignition",
"sprite": "none",
"x": 62,
"y": 128,
"look": "The ignition. The car will start when you have somewhere to be and a reason to leave. Currently you have neither.",
"synonyms": "engine start drive home",
"needs": "car keys",
@ -71,9 +153,26 @@
"use_text": "The engine turns over first try — even the car is surprised. You pull out past the empty footpath, the white label on the passenger seat like a sleeping child. Uncle calls: furious, then quiet, then — BUT ALL OF THESE RECORDS ARE AWESOME. The cat gets fed. The shop is there all year, by the way. Buy records on the other 364 days too."
},
{
"name": "dashboard", "sprite": "none", "x": 110, "y": 130,
"name": "dashboard",
"sprite": "none",
"x": 110,
"y": 130,
"look": "The car interior is a small museum of your habits: receipts, cables, and the faint hum of unfinished plans. The dashboard clock blinks 12:00 (the battery died last week). Outside, through the windscreen, the shop waits.",
"synonyms": "dash clock windscreen glovebox wheel car"
}
],
"name": "Your Car",
"enter_text": "The last calm place before you choose suffering on purpose.",
"exit_flags": [
"",
"seatbelt-freed",
"",
""
],
"exit_blocked": [
"",
"The seatbelt holds you with the confidence of a system that has never been questioned.",
"",
""
]
}

View File

@ -150,5 +150,7 @@
"look": "The air tastes like exhaust and ambition. Asphalt cracked like your resolve. Beyond the shop strip, a queue is busy being a wall.",
"synonyms": "carpark ground cracks lines shop strip"
}
]
],
"name": "The Car Park",
"enter_text": "The air tastes like exhaust and ambition."
}

View File

@ -88,7 +88,8 @@
"synonyms": "overstuffed tight packed",
"needs": "tote bag",
"sets_flag": "made-space",
"use_text": "You decant a handful of twelve-inches into the tote. The crate exhales like it's been holding its breath for years. A gap is a doorway. A gap is a philosophy."
"use_text": "You decant a handful of twelve-inches into the tote. The crate exhales like it's been holding its breath for years. A gap is a doorway. A gap is a philosophy.",
"points": 7
},
{
"name": "someguy",
@ -99,7 +100,7 @@
"synonyms": "dj whale figure man",
"dialogue": [
{
"says": "He communicates first in BPMs, then in matrix etchings, then \u2014 reluctantly \u2014 in words. 'You're digging. Good. Dig with your hands, not your hopes.'",
"says": "He communicates first in BPMs, then in matrix etchings, then — reluctantly — in words. 'You're digging. Good. Dig with your hands, not your hopes.'",
"choices": [
{
"text": "I made space in the tight crate.",
@ -141,7 +142,7 @@
"sprite": "none",
"x": 120,
"y": 105,
"look": "Twelve-inches in ranks, genre cards like tarot. DEEP HOUSE \u2014 no big drops, just gradual emotional damage. WITCH HOUSE \u2014 if you hear your name in the reverb, no you didn't.",
"look": "Twelve-inches in ranks, genre cards like tarot. DEEP HOUSE — no big drops, just gradual emotional damage. WITCH HOUSE — if you hear your name in the reverb, no you didn't.",
"synonyms": "records house genre cards around twelve"
},
{
@ -151,5 +152,7 @@
"y": 88,
"look": "A string of dead fairy lights. They died doing what they loved: implying atmosphere."
}
]
],
"name": "The Dance Racks",
"enter_text": "Genre cards like tarot. The dark corner where taste goes to specialise."
}

View File

@ -1,43 +1,109 @@
{
"strokes": [
{ "Image": { "name": "bg_listening", "x": 80, "y": 84, "meaning": "None" } },
{ "Rect": { "x": 0, "y": 0, "w": 160, "h": 102, "color": 0, "meaning": "Wall" } },
{ "Rect": { "x": 0, "y": 102, "w": 160, "h": 66, "color": 8, "meaning": "Floor" } },
{ "Rect": { "x": 0, "y": 102, "w": 44, "h": 30, "color": 0, "meaning": "Wall" } },
{ "Image": { "name": "bg_listening", "x": 80, "y": 84, "meaning": "None" } }
{
"Image": {
"name": "bg_listening",
"x": 80,
"y": 84,
"meaning": "None"
}
},
{
"Rect": {
"x": 0,
"y": 0,
"w": 160,
"h": 102,
"color": 0,
"meaning": "Wall"
}
},
{
"Rect": {
"x": 0,
"y": 102,
"w": 160,
"h": 66,
"color": 8,
"meaning": "Floor"
}
},
{
"Rect": {
"x": 0,
"y": 102,
"w": 44,
"h": 30,
"color": 0,
"meaning": "Wall"
}
},
{
"Image": {
"name": "bg_listening",
"x": 80,
"y": 84,
"meaning": "None"
}
}
],
"spawn": [
100,
150
],
"exits": [
null,
null,
10,
null
],
"spawn": [100, 150],
"exits": [null, null, 10, null],
"music": 1,
"objects": [
{
"name": "turntable", "sprite": "none", "x": 62, "y": 100,
"name": "turntable",
"sprite": "none",
"x": 62,
"y": 100,
"look": "A sign asks for restraint. It will not be obeyed. The station waits for your decision like a small judge. The 45 adapter slot mocks you if you don't have one.",
"synonyms": "deck platter station",
"needs": "45 adapter",
"sets_flag": "station-working",
"use_text": "You seat the adapter, drop the needle. The turntable stops judging you for a second. Sound happens — real, warm, undeserved."
"use_text": "You seat the adapter, drop the needle. The turntable stops judging you for a second. Sound happens — real, warm, undeserved.",
"points": 7
},
{
"name": "balloon", "sprite": "none", "x": 122, "y": 66,
"name": "balloon",
"sprite": "none",
"x": 122,
"y": 66,
"look": "A sad promotional balloon on a string, half-deflated, taped to the shelf. It has seen release dates come and go.",
"synonyms": "red promotional",
"needs": "elastic band",
"sets_flag": "eyepatch-made",
"use_text": "Balloon plus elastic band equals — against every law of craft — a functional eyepatch. You are not proud. You are exactly proud."
"use_text": "Balloon plus elastic band equals — against every law of craft — a functional eyepatch. You are not proud. You are exactly proud.",
"points": 8
},
{
"name": "headphones", "sprite": "none", "x": 52, "y": 62,
"name": "headphones",
"sprite": "none",
"x": 52,
"y": 62,
"look": "Big padded cans, warm from nobody.",
"synonyms": "cans phones",
"requires_flag": "word-global",
"sets_flag": "word-ambassador",
"use_text": "Through the headphones, under the shop's hum, the runout groove of whatever last played is still circling. A voice in the vinyl, patient as a checkout queue: AMBASSADOR. You take the headphones off slowly."
"use_text": "Through the headphones, under the shop's hum, the runout groove of whatever last played is still circling. A voice in the vinyl, patient as a checkout queue: AMBASSADOR. You take the headphones off slowly.",
"points": 10
},
{
"name": "corner", "sprite": "none", "x": 120, "y": 140,
"name": "corner",
"sprite": "none",
"x": 120,
"y": 140,
"look": "A corner where taste becomes audible and mistakes become public. Crates of contenders wait under the plinth, pretending not to audition.",
"synonyms": "listening around crates plinth sign"
}
]
],
"name": "The Listening Station",
"enter_text": "A corner where taste becomes audible and mistakes become public."
}

View File

@ -84,7 +84,8 @@
"text": "I resleeved the record someone left out.",
"goto": 1,
"requires_flag": "shop-tidied",
"sets_flag": "clerk-warm"
"sets_flag": "clerk-warm",
"points": 10
},
{
"text": "Found the break ancestor. Yellow sleeve.",
@ -112,7 +113,8 @@
"text": "Made you an eyepatch. Balloon and elastic. Don't ask.",
"goto": 5,
"requires_flag": "eyepatch-made",
"sets_flag": "back-room-open"
"sets_flag": "back-room-open",
"points": 15
},
{
"text": "Just doing my bit.",
@ -168,7 +170,8 @@
"needs": "wallet",
"requires_flag": "found-grail",
"sets_flag": "paid",
"use_text": "Card. Beep. The pause. The long pause. The pause develops a personality. APPROVED. You feel a wave of relief so intense it should be taxable. Terminal beeps are judgment sounds; today, acquittal."
"use_text": "Card. Beep. The pause. The long pause. The pause develops a personality. APPROVED. You feel a wave of relief so intense it should be taxable. Terminal beeps are judgment sounds; today, acquittal.",
"points": 10
},
{
"name": "spike",
@ -179,7 +182,8 @@
"synonyms": "receipt receipts papers",
"requires_flag": "word-ambassador",
"sets_flag": "word-version",
"use_text": "You flick through to the freshest receipt. Under TOTAL, printed where the loyalty points should be: VERSION. The printer knew. Printers always know."
"use_text": "You flick through to the freshest receipt. Under TOTAL, printed where the loyalty points should be: VERSION. The printer knew. Printers always know.",
"points": 10
},
{
"name": "curtain",
@ -198,5 +202,19 @@
"look": "Where your taste is priced, your budget is tested, and your dignity is processed at speed. A brass bell waits beside rolls of price stickers.",
"synonyms": "bell stickers around desk"
}
],
"name": "The Counter",
"enter_text": "Where your taste is priced, your budget is tested, and your dignity is processed at speed.",
"exit_flags": [
"back-room-open",
"",
"",
""
],
"exit_blocked": [
"The beaded curtain radiates NO. Not locked — worse: disapproving.",
"",
"",
""
]
}

View File

@ -1,43 +1,114 @@
{
"strokes": [
{ "Image": { "name": "bg_backroom", "x": 80, "y": 84, "meaning": "None" } },
{ "Rect": { "x": 0, "y": 0, "w": 160, "h": 104, "color": 0, "meaning": "Wall" } },
{ "Rect": { "x": 0, "y": 104, "w": 160, "h": 64, "color": 8, "meaning": "Floor" } },
{ "Rect": { "x": 108, "y": 104, "w": 52, "h": 34, "color": 0, "meaning": "Wall" } },
{ "Image": { "name": "bg_backroom", "x": 80, "y": 84, "meaning": "None" } }
{
"Image": {
"name": "bg_backroom",
"x": 80,
"y": 84,
"meaning": "None"
}
},
{
"Rect": {
"x": 0,
"y": 0,
"w": 160,
"h": 104,
"color": 0,
"meaning": "Wall"
}
},
{
"Rect": {
"x": 0,
"y": 104,
"w": 160,
"h": 64,
"color": 8,
"meaning": "Floor"
}
},
{
"Rect": {
"x": 108,
"y": 104,
"w": 52,
"h": 34,
"color": 0,
"meaning": "Wall"
}
},
{
"Image": {
"name": "bg_backroom",
"x": 80,
"y": 84,
"meaning": "None"
}
}
],
"spawn": [
70,
150
],
"exits": [
null,
null,
12,
null
],
"spawn": [70, 150],
"exits": [null, null, 12, null],
"music": 5,
"objects": [
{
"name": "seam", "sprite": "none", "x": 28, "y": 110,
"name": "seam",
"sprite": "none",
"x": 28,
"y": 110,
"look": "A dark corner where mould negotiates with wood. The shadow has a straight edge. Shadows don't.",
"synonyms": "corner mould gap shadow",
"requires_flag": "back-room-open",
"sets_flag": "found-grail",
"use_text": "You reach into the seam (cough tax: one cough). Fingers find cardboard: a white label — THE white label — and, taped to it, an envelope marked OFFICIAL. Filed where the counter couldn't want it."
"use_text": "You reach into the seam (cough tax: one cough). Fingers find cardboard: a white label — THE white label — and, taped to it, an envelope marked OFFICIAL. Filed where the counter couldn't want it.",
"points": 15
},
{
"name": "white label", "sprite": "whitelabel", "x": 24, "y": 126,
"name": "white label",
"sprite": "whitelabel",
"x": 24,
"y": 126,
"look": "No artist. No title. A single-digit catalogue number. The packaging is so minimal it becomes smug. Finding one is a miracle; buying one is a financial decision. It is, impossibly, adjacent to Uncle's list — filed under nothing.",
"takeable": true, "synonyms": "label record grail vinyl"
"takeable": true,
"synonyms": "label record grail vinyl",
"points": 5
},
{
"name": "delay notice", "sprite": "notice", "x": 40, "y": 128,
"name": "delay notice",
"sprite": "notice",
"x": 40,
"y": 128,
"look": "OFFICIAL RSD NOTICE: ALL SPECIAL RELEASES DELAYED IN TRANSIT. (VAN BROKE DOWN NEAR A GLITTER FACTORY.) Stamped, signed, real. Documents are the only thing the wall trusts.",
"takeable": true, "synonyms": "notice envelope official"
"takeable": true,
"synonyms": "notice envelope official",
"points": 3
},
{
"name": "throne", "sprite": "none", "x": 128, "y": 130,
"name": "throne",
"sprite": "none",
"x": 128,
"y": 130,
"look": "A milk crate waits like a throne for the exhausted.",
"synonyms": "milk crate seat",
"use_text": "You sit. For eleven seconds, nothing is required of you. Best eleven seconds of the day."
},
{
"name": "ruins", "sprite": "none", "x": 90, "y": 112,
"name": "ruins",
"sprite": "none",
"x": 90,
"y": 112,
"look": "Unsorted crates stacked like ruins. No dividers. No mercy. It's unpriced, unsorted, and smells like the history of dust. Chalk marks on the shelf slats spell out chords for furniture.",
"synonyms": "crates stacks around room boxes"
}
]
],
"name": "The Back Room",
"enter_text": "It feels like entering a different temperature of reality."
}

View File

@ -63,10 +63,11 @@
{
"text": "Which variant is actually canon today?",
"goto": 1,
"sets_flag": "poster-frenzy"
"sets_flag": "poster-frenzy",
"points": 5
},
{
"text": "Are you\u2026 okay?",
"text": "Are you okay?",
"goto": 2
},
{
@ -76,7 +77,7 @@
]
},
{
"says": "CANON? The word travels down the wall like a current. Someone screams about overtones. In the scuffle, the big poster is torn to confetti \u2014 it snows Taylor over the footpath. The fragments settle against the brick. Some of them look like words.",
"says": "CANON? The word travels down the wall like a current. Someone screams about overtones. In the scuffle, the big poster is torn to confetti it snows Taylor over the footpath. The fragments settle against the brick. Some of them look like words.",
"choices": [
{
"text": "Interesting weather.",
@ -93,7 +94,8 @@
}
]
}
]
],
"hidden_by_flag": "beckies-dispersed"
},
{
"name": "fragments",
@ -104,7 +106,9 @@
"synonyms": "confetti poster pieces scraps",
"requires_flag": "poster-frenzy",
"sets_flag": "knows-yard-door-secret",
"use_text": "You crouch and read the fragments the way pigeons read chip packets. Rearranged by wind and intent, they spell: YARD DOOR SECRET. The brick wall suddenly has opinions."
"use_text": "You crouch and read the fragments the way pigeons read chip packets. Rearranged by wind and intent, they spell: YARD DOOR SECRET. The brick wall suddenly has opinions.",
"visible_flag": "poster-frenzy",
"points": 10
},
{
"name": "dave",
@ -121,7 +125,8 @@
"text": "There's a door outline behind the shop. Painted over.",
"goto": 1,
"requires_flag": "seen-door-outline",
"sets_flag": "side-door-open"
"sets_flag": "side-door-open",
"points": 10
},
{
"text": "Who are you again?",
@ -166,13 +171,14 @@
"use_text": "She takes the lollipop like a communion wafer. Somewhere in the wall, a decision is reached collectively. The Beckies disperse toward the coffee van in perfect formation, discussing brunch. The store can breathe again.",
"dialogue": [
{
"says": "I skipped brunch for this. I SKIPPED BRUNCH. Do you have\u2026 water? Or a lollipop? Or like\u2026 proof the universe isn't mean?",
"says": "I skipped brunch for this. I SKIPPED BRUNCH. Do you have… water? Or a lollipop? Or like… proof the universe isn't mean?",
"choices": [
{
"text": "Read the notice aloud. Like it's law.",
"goto": 1,
"requires_flag": "notice-posted",
"sets_flag": "read-aloud"
"sets_flag": "read-aloud",
"points": 5
},
{
"text": "The universe is mostly mean.",
@ -191,7 +197,13 @@
"text": "SAY THE WORDS.",
"goto": 3,
"requires_flag": "word-version",
"sets_flag": "curse-broken"
"sets_flag": "curse-broken",
"points": 5
},
{
"text": "Improvise the words. (How hard can five words be?)",
"goto": 4,
"kills": true
},
{
"text": "(Something in your pocket, maybe.)",
@ -200,7 +212,7 @@
]
},
{
"says": "'It's not parasocial. It's community,' she says \u2014 to you, a stranger she is now holding by the sleeve.",
"says": "'It's not parasocial. It's community,' she says to you, a stranger she is now holding by the sleeve.",
"choices": [
{
"text": "Um.",
@ -209,15 +221,22 @@
]
},
{
"says": "RSD. FIRST. GLOBAL. AMBASSADOR. VERSION. You say it like a legal notice from a better timeline. The hive stops. Blinks. Somebody asks, in a small human voice: '\u2026why are we here?' 'I have a parking ticket,' says another, amazed, like it's a birth certificate. The door is a door again.",
"says": "RSD. FIRST. GLOBAL. AMBASSADOR. VERSION. You say it like a legal notice from a better timeline. The hive stops. Blinks. Somebody asks, in a small human voice: 'why are we here?' 'I have a parking ticket,' says another, amazed, like it's a birth certificate. The door is a door again.",
"choices": [
{
"text": "(Say nothing. Let them wake.)",
"goto": -1
}
]
},
{
"says": "'RSD... FIRST... uh... SPARKLE?' The hive turns as one. The temperature drops eleven degrees. What happens next is best described as an Army of Darkness tribute performed entirely by cardigans. (The Beckies are this game's grue. Now you know.)",
"choices": []
}
]
],
"hidden_by_flag": "beckies-dispersed",
"consumes": true,
"points": 10
},
{
"name": "notice board",
@ -229,7 +248,8 @@
"needs": "delay notice",
"sets_flag": "notice-posted",
"use_text": "You pin the official delay notice dead centre, straightening it with the care of a museum curator. It hangs there like law.",
"requires_flag": "paid"
"requires_flag": "paid",
"points": 10
},
{
"name": "queue",
@ -237,7 +257,19 @@
"x": 40,
"y": 100,
"look": "It's not a crowd. It's a wall. A living wall in pastel cardigans, breathing as one. The door is close enough to taste, far enough to suffer.",
"synonyms": "wall beckies beckywall fans door shop"
"synonyms": "wall beckies beckywall fans door shop",
"hidden_by_flag": "beckies-dispersed"
},
{
"name": "footpath",
"sprite": "none",
"x": 40,
"y": 100,
"look": "The footpath is just a footpath. The door is a door. Inside, faintly, you can hear the shop breathing.",
"synonyms": "door shop empty",
"visible_flag": "beckies-dispersed"
}
]
],
"name": "The Shop Entrance",
"enter_text": "The door is close enough to taste, far enough to suffer."
}

View File

@ -120,5 +120,7 @@
"look": "A narrow throat of brick and bitumen between the shop and the rest of the suburb. The back of the alley opens onto the service yard (north). The street is behind you (south).",
"synonyms": "bitumen puddles ground around"
}
]
],
"name": "The Alley (Scenic Rim)",
"enter_text": "Brick, bitumen, and graffiti that reads like patch notes for reality."
}

View File

@ -1,48 +1,120 @@
{
"strokes": [
{ "Image": { "name": "bg_toilet", "x": 80, "y": 84, "meaning": "None" } },
{ "Rect": { "x": 0, "y": 0, "w": 160, "h": 108, "color": 0, "meaning": "Wall" } },
{ "Rect": { "x": 0, "y": 108, "w": 160, "h": 60, "color": 8, "meaning": "Floor" } },
{ "Rect": { "x": 110, "y": 100, "w": 50, "h": 68, "color": 0, "meaning": "Wall" } },
{ "Image": { "name": "bg_toilet", "x": 80, "y": 84, "meaning": "None" } }
{
"Image": {
"name": "bg_toilet",
"x": 80,
"y": 84,
"meaning": "None"
}
},
{
"Rect": {
"x": 0,
"y": 0,
"w": 160,
"h": 108,
"color": 0,
"meaning": "Wall"
}
},
{
"Rect": {
"x": 0,
"y": 108,
"w": 160,
"h": 60,
"color": 8,
"meaning": "Floor"
}
},
{
"Rect": {
"x": 110,
"y": 100,
"w": 50,
"h": 68,
"color": 0,
"meaning": "Wall"
}
},
{
"Image": {
"name": "bg_toilet",
"x": 80,
"y": 84,
"meaning": "None"
}
}
],
"spawn": [
60,
145
],
"exits": [
null,
null,
3,
null
],
"spawn": [60, 145],
"exits": [null, null, 3, null],
"music": 5,
"objects": [
{
"name": "elastic band", "sprite": "elastic", "x": 118, "y": 118,
"name": "elastic band",
"sprite": "elastic",
"x": 118,
"y": 118,
"look": "In the cupboard under the sink: one fat rubber band, the kind that holds together things that matter. Mail. Asparagus. Lives.",
"takeable": true, "synonyms": "elastic rubber band"
"takeable": true,
"synonyms": "elastic rubber band",
"points": 3
},
{
"name": "mirror", "sprite": "none", "x": 130, "y": 90,
"name": "mirror",
"sprite": "none",
"x": 130,
"y": 90,
"look": "Someone has written on the glass in lipstick: DON'T ARGUE. REPEAT THE NOTICE. Under the smear, something older is scratched into the corner.",
"synonyms": "glass lipstick",
"requires_flag": "word-rsd",
"sets_flag": "word-first",
"use_text": "You breathe on the glass and wipe. Scratched in the corner, one word: FIRST. The mirror fogs over again immediately, embarrassed."
"use_text": "You breathe on the glass and wipe. Scratched in the corner, one word: FIRST. The mirror fogs over again immediately, embarrassed.",
"points": 10
},
{
"name": "cupboard", "sprite": "none", "x": 122, "y": 112,
"name": "cupboard",
"sprite": "none",
"x": 122,
"y": 112,
"look": "A cupboard under the sink, one door ajar in the universal posture of nothing-to-hide. Cleaning products from discontinued brands. Something rubbery glints on the shelf.",
"synonyms": "sink cabinet shelf"
},
{
"name": "graffiti", "sprite": "none", "x": 50, "y": 95,
"name": "graffiti",
"sprite": "none",
"x": 50,
"y": 95,
"look": "The wall says, in four different hands: ELASTIC. EYEPATCH. GRATITUDE. DOOR. Then: DELAYS HAPPEN. DON'T PANIC. PANIC IS FOR TOURISTS. Then, smaller: the back room is real. the back room is also a trap. both can be true.",
"synonyms": "walls writing wall notes"
},
{
"name": "dryer", "sprite": "none", "x": 12, "y": 92,
"name": "dryer",
"sprite": "none",
"x": 12,
"y": 92,
"look": "The hand dryer is aggressive and judgmental. You do not give it the opportunity.",
"synonyms": "hand dryer",
"use_text": "It roars at a frequency that means something personal. Your hands were not even wet."
},
{
"name": "mop", "sprite": "none", "x": 30, "y": 112,
"name": "mop",
"sprite": "none",
"x": 30,
"y": 112,
"look": "A mop in a bucket, retired in place. It has seen the whole history of this floor and chosen silence.",
"synonyms": "bucket"
}
]
],
"name": "The Pacific Rim",
"enter_text": "You step inside and immediately regret having lungs. The air is thick, warm, and aggressively personal."
}

View File

@ -78,7 +78,8 @@
"synonyms": "ivy leaves plant",
"requires_flag": "knows-yard-door-secret",
"sets_flag": "noticed-vine",
"use_text": "Now that you know the phrase, you notice the vine properly. It isn't a ladder. But it's climbable, if you're the kind of person who treats architecture as a suggestion. You get the sudden, stupid certainty that you could climb this. (The roof is up the vine, to the east.)"
"use_text": "Now that you know the phrase, you notice the vine properly. It isn't a ladder. But it's climbable, if you're the kind of person who treats architecture as a suggestion. You get the sudden, stupid certainty that you could climb this. (The roof is up the vine, to the east.)",
"points": 7
},
{
"name": "side door",
@ -105,5 +106,19 @@
"look": "A cramped concrete service yard where the shop keeps its honesty. A washing-line shadow crosses the ground like a diagram of a better day.",
"synonyms": "concrete ground around downpipe"
}
],
"name": "The Yard",
"enter_text": "A cramped concrete yard where the shop keeps its honesty.",
"exit_flags": [
"side-door-open",
"noticed-vine",
"",
""
],
"exit_blocked": [
"The steel door does not move. It has opinions about you specifically. (Someone who belonged here could open it.)",
"The wall is a wall. The leaves are leaves. (Unless you knew something that made them otherwise.)",
"",
""
]
}

View File

@ -1,37 +1,101 @@
{
"strokes": [
{ "Image": { "name": "bg_roof", "x": 80, "y": 84, "meaning": "None" } },
{ "Rect": { "x": 0, "y": 0, "w": 160, "h": 100, "color": 0, "meaning": "Wall" } },
{ "Rect": { "x": 0, "y": 100, "w": 160, "h": 68, "color": 8, "meaning": "Floor" } },
{ "Rect": { "x": 0, "y": 155, "w": 160, "h": 13, "color": 0, "meaning": "Wall" } },
{ "Image": { "name": "bg_roof", "x": 80, "y": 84, "meaning": "None" } }
{
"Image": {
"name": "bg_roof",
"x": 80,
"y": 84,
"meaning": "None"
}
},
{
"Rect": {
"x": 0,
"y": 0,
"w": 160,
"h": 100,
"color": 0,
"meaning": "Wall"
}
},
{
"Rect": {
"x": 0,
"y": 100,
"w": 160,
"h": 68,
"color": 8,
"meaning": "Floor"
}
},
{
"Rect": {
"x": 0,
"y": 155,
"w": 160,
"h": 13,
"color": 0,
"meaning": "Wall"
}
},
{
"Image": {
"name": "bg_roof",
"x": 80,
"y": 84,
"meaning": "None"
}
}
],
"spawn": [
30,
130
],
"exits": [
null,
null,
null,
5
],
"spawn": [30, 130],
"exits": [null, null, null, 5],
"music": 1,
"objects": [
{
"name": "door outline", "sprite": "none", "x": 24, "y": 148,
"name": "door outline",
"sprite": "none",
"x": 24,
"y": 148,
"look": "Below, behind the shop, the yard wall catches the light wrong.",
"synonyms": "outline absence seam wall below",
"sets_flag": "seen-door-outline",
"use_text": "From this exact angle the light gives it up: a painted-over door beside the STAFF door. A door outline. Like someone erased it and hoped. The 'front door' is theatre. That kitchen door is logistics."
"use_text": "From this exact angle the light gives it up: a painted-over door beside the STAFF door. A door outline. Like someone erased it and hoped. The 'front door' is theatre. That kitchen door is logistics.",
"points": 8
},
{
"name": "view", "sprite": "none", "x": 80, "y": 115,
"name": "view",
"sprite": "none",
"x": 80,
"y": 115,
"look": "From up here the car park looks calm in the way a trap looks calm. The queue looks like choreography. Everything looks smaller. Your problems look the same size.",
"synonyms": "carpark queue edge parapet"
},
{
"name": "skylight", "sprite": "none", "x": 108, "y": 120,
"name": "skylight",
"sprite": "none",
"x": 108,
"y": 120,
"look": "Through the skylight: crates, dust, one bare bulb. The mythical back room, from above, looking like an ordinary room. Myths usually do.",
"synonyms": "window glass",
"use_text": "Painted shut since federation. The back room keeps its front door policy even for its ceiling."
},
{
"name": "roof", "sprite": "none", "x": 120, "y": 140,
"name": "roof",
"sprite": "none",
"x": 120,
"y": 140,
"look": "Tar, gravel, one air-conditioning unit humming the note between B and complaint. Above: sky. Below: retail.",
"synonyms": "gravel tar aircon unit around"
}
]
],
"name": "Above the Rim",
"enter_text": "From up here the car park looks calm in the way a trap looks calm."
}

View File

@ -86,7 +86,8 @@
"y": 96,
"look": "One consolation-grade lollipop under a soggy flyer, still wrapped. Somebody's emergency kindness, forgotten in place.",
"takeable": true,
"synonyms": "lolly sweet"
"synonyms": "lolly sweet",
"points": 3
},
{
"name": "splashback",
@ -97,7 +98,8 @@
"synonyms": "steel grease stove",
"requires_flag": "word-first",
"sets_flag": "word-global",
"use_text": "You wipe a porthole in the grease. Scratched into the steel beneath: GLOBAL. The grease begins closing over it immediately, like water."
"use_text": "You wipe a porthole in the grease. Scratched into the steel beneath: GLOBAL. The grease begins closing over it immediately, like water.",
"points": 10
},
{
"name": "benches",
@ -116,5 +118,7 @@
"synonyms": "hot water",
"use_text": "You do not have a cup. The urn respects your restraint. Barely."
}
]
],
"name": "The Kitchen",
"enter_text": "Fluorescent light, stainless steel, and the specific silence of an owner about to appear."
}

View File

@ -86,7 +86,8 @@
"y": 148,
"look": "A crisp outer sleeve, unpriced, unclaimed. It catches light the way a fresh sleeve catches light: accusatory.",
"takeable": true,
"synonyms": "sleeve outer plastic"
"synonyms": "sleeve outer plastic",
"points": 2
},
{
"name": "messy record",
@ -97,7 +98,8 @@
"synonyms": "record half loose vinyl",
"needs": "clean sleeve",
"sets_flag": "shop-tidied",
"use_text": "You slide it into the clean sleeve, square the corners, file it under its own name. Across the shop, the Clerk notices. Pretends not to. But it counts."
"use_text": "You slide it into the clean sleeve, square the corners, file it under its own name. Across the shop, the Clerk notices. Pretends not to. But it counts.",
"points": 10
},
{
"name": "bins",
@ -112,7 +114,9 @@
"sprite": "none",
"x": 20,
"y": 92,
"look": "Handwritten cards of increasing confidence. One just says 'yes.' One says 'you're not ready' \u2014 it's filed under AMBIENT."
"look": "Handwritten cards of increasing confidence. One just says 'yes.' One says 'you're not ready' it's filed under AMBIENT."
}
]
],
"name": "The Shop Floor",
"enter_text": "The air changes: dust, ink, and people taking themselves very seriously."
}

View File

@ -1,44 +1,122 @@
{
"strokes": [
{ "Image": { "name": "bg_rock", "x": 80, "y": 84, "meaning": "None" } },
{ "Rect": { "x": 0, "y": 0, "w": 160, "h": 98, "color": 0, "meaning": "Wall" } },
{ "Rect": { "x": 0, "y": 98, "w": 160, "h": 70, "color": 8, "meaning": "Floor" } },
{ "Rect": { "x": 92, "y": 98, "w": 68, "h": 22, "color": 0, "meaning": "Wall" } },
{ "Rect": { "x": 0, "y": 98, "w": 20, "h": 26, "color": 0, "meaning": "Wall" } },
{ "Image": { "name": "bg_rock", "x": 80, "y": 84, "meaning": "None" } }
{
"Image": {
"name": "bg_rock",
"x": 80,
"y": 84,
"meaning": "None"
}
},
{
"Rect": {
"x": 0,
"y": 0,
"w": 160,
"h": 98,
"color": 0,
"meaning": "Wall"
}
},
{
"Rect": {
"x": 0,
"y": 98,
"w": 160,
"h": 70,
"color": 8,
"meaning": "Floor"
}
},
{
"Rect": {
"x": 92,
"y": 98,
"w": 68,
"h": 22,
"color": 0,
"meaning": "Wall"
}
},
{
"Rect": {
"x": 0,
"y": 98,
"w": 20,
"h": 26,
"color": 0,
"meaning": "Wall"
}
},
{
"Image": {
"name": "bg_rock",
"x": 80,
"y": 84,
"meaning": "None"
}
}
],
"spawn": [
120,
150
],
"exits": [
null,
8,
null,
null
],
"spawn": [120, 150],
"exits": [null, 8, null, null],
"music": 4,
"objects": [
{
"name": "mystery disc", "sprite": "disc", "x": 40, "y": 132,
"name": "mystery disc",
"sprite": "disc",
"x": 40,
"y": 132,
"look": "A disc sitting in the wrong sleeve like it woke up in the wrong life. The label says big band. The grooves say otherwise.",
"takeable": true, "synonyms": "disc record mislabeled"
"takeable": true,
"synonyms": "disc record mislabeled",
"points": 3
},
{
"name": "chud box", "sprite": "none", "x": 32, "y": 118,
"name": "chud box",
"sprite": "none",
"x": 32,
"y": 118,
"look": "A massive box of $2 bargain-bin trash that has achieved sentience. It permits browsing. World Record Club editions breed in here; a Kamahl 7-inch boxset watches you like a curse.",
"synonyms": "box bargain chud cardboard",
"use_text": "You dig. Dust archaeology. Near the bottom, something is filed under a lie — a disc in the wrong sleeve entirely."
},
{
"name": "yellow sleeve", "sprite": "none", "x": 122, "y": 76,
"name": "yellow sleeve",
"sprite": "none",
"x": 122,
"y": 76,
"look": "A bright yellow big-band sleeve pinned to the wall, empty for years. Daly-Wilson Big Band — the Benson & Hedges pressing. Waiting.",
"synonyms": "yellow daly wilson",
"needs": "mystery disc",
"sets_flag": "break-ancestor-revealed",
"use_text": "Disc, meet sleeve. Sleeve, disc. Somewhere down the hallway of crates a drum break plays itself, briefly, like an ancestor exhaling. You keep your face normal. Your face is loud."
"use_text": "Disc, meet sleeve. Sleeve, disc. Somewhere down the hallway of crates a drum break plays itself, briefly, like an ancestor exhaling. You keep your face normal. Your face is loud.",
"points": 12
},
{
"name": "posters", "sprite": "none", "x": 130, "y": 92,
"name": "posters",
"sprite": "none",
"x": 130,
"y": 92,
"look": "Faded rock posters, curled at every corner. A NO REFUNDS sign greets you like an old, bitter friend.",
"synonyms": "wall sign refunds"
},
{
"name": "crates", "sprite": "none", "x": 110, "y": 112,
"name": "crates",
"sprite": "none",
"x": 110,
"y": 112,
"look": "Rock, alphabetised loosely, enforced never. The dividers are handwritten in the voice of someone who has explained The The's filing twice today already and will not do it a third time.",
"synonyms": "rock records bins around"
}
]
],
"name": "The Rock Aisle",
"enter_text": "The NO REFUNDS sign greets you like an old, bitter friend."
}

View File

@ -30,3 +30,19 @@
# ignition with no keys, no dispersal
{"cmd":"goto_room","n":0}
{"cmd":"parse","text":"use ignition"}
# --- new engine features: gated exits hold ---
{"cmd":"goto_room","n":0}
{"cmd":"walk_to","x":156,"y":150}
{"cmd":"query"}
{"cmd":"goto_room","n":5}
{"cmd":"walk_to","x":66,"y":18}
{"cmd":"query"}
{"cmd":"walk_to","x":156,"y":120}
{"cmd":"query"}
{"cmd":"goto_room","n":12}
{"cmd":"walk_to","x":72,"y":18}
{"cmd":"query"}
# --- the kebab is a Sierra death (restarts the day) ---
{"cmd":"goto_room","n":0}
{"cmd":"parse","text":"use kebab"}
{"cmd":"query"}