From 865c7a83a2570336ade1869372bd5adf57ff1ed3 Mon Sep 17 00:00:00 2001 From: type-two Date: Mon, 27 Jul 2026 13:39:20 +1000 Subject: [PATCH] =?UTF-8?q?Case=20Twelve:=20The=20Late=20Movie=20=E2=80=94?= =?UTF-8?q?=20the=20finale,=20and=20a=20reproducible=20win-path=20suite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sixteen cases. All lint clean, all win paths verified by tools/verify.sh. John's multiverse finale, with his own Stay Tuned correction folded in as the frame — which is what made it work. The television is not a neutral doorway, it is a subscription: a satellite dish on the property annex roof that is on no asset register, aimed down through the roof at a 1958 set with no plug, and a man in a maroon blazer at ten to midnight who does the one thing that has ever worked on a Drebin — hands over the paperwork and asks him to sign. Frank Jr reads the terms first. Nobody has read the terms in four hundred years, and that is what wins the case six rooms later via Clause 14. Five channels, each a genre with a rule the family breaks with a form: an iron-curtain spy picture where the unapproved encore becomes the only state-approved act of resistance in history; a carrier-deck melodrama where the unlandable jet lands because somebody finally read the manual, and the saxophone stops mid-phrase because you cannot underscore procedure; a 90s buddy-cop show that locks onto Sr the moment it reads DAYS TO RETIREMENT, and is beaten by a Form 14 reassignment, because a man who has been reassigned cannot be killed in the line of duty; a UK procedural whose silence technique loses to a man who simply has nothing he needs to say; and a cartoon, survivable twice, if you fill in the injury form afterwards. The Twilight Zone kid is the actual antagonist — not the salesman, who only sells the dish. A boy of nine on the crater set, lit from below by a television that isn't there, who can do anything and only wants nobody to leave. The win: they supply sixty-seven years of Drebin paperwork as the contractual replacement programme, in good order, and the instrument must broadcast it on all 666 channels — and none of it is entertainment. The boy watches eleven minutes, stops smiling because it is the first thing he has ever seen that was not made to hold him, says "Oh", and turns the television off from the inside. The three Drebins are one man for exactly one frame. Also: the win-path harness lived in a scratch dir and got wiped mid-session, which made every case look like it had broken. The games were fine; the harness was not reproducible. It now lives in the repo — tests/scripts/*.jsonl plus tools/verify.sh — so regression testing survives the machine. Co-Authored-By: Claude Fable 5 --- DESIGN.md | 56 +++- README.md | 4 +- cases/case-12-the-late-movie/game.json | 53 ++++ cases/case-12-the-late-movie/rooms/room0.json | 261 ++++++++++++++++++ cases/case-12-the-late-movie/rooms/room1.json | 169 ++++++++++++ cases/case-12-the-late-movie/rooms/room2.json | 177 ++++++++++++ cases/case-12-the-late-movie/rooms/room3.json | 159 +++++++++++ cases/case-12-the-late-movie/rooms/room4.json | 160 +++++++++++ cases/case-12-the-late-movie/rooms/room5.json | 148 ++++++++++ cases/case-12-the-late-movie/rooms/room6.json | 190 +++++++++++++ cases/case-12-the-late-movie/sprites.json | 91 ++++++ .../sprites/admiral.png | Bin 0 -> 1053 bytes .../case-12-the-late-movie/sprites/anvil.png | Bin 0 -> 357 bytes .../sprites/archivebox.png | Bin 0 -> 902 bytes .../sprites/buddycop.png | Bin 0 -> 884 bytes .../sprites/cardboardrocket.png | Bin 0 -> 1184 bytes .../sprites/cartoonmouse.png | Bin 0 -> 535 bytes .../sprites/checkpoint.png | Bin 0 -> 1160 bytes .../sprites/clerkdemon.png | Bin 0 -> 940 bytes .../sprites/composite.png | Bin 0 -> 900 bytes .../sprites/crooner.png | Bin 0 -> 885 bytes .../sprites/drebin58.png | Bin 0 -> 663 bytes .../sprites/drebin82.png | Bin 0 -> 894 bytes cases/case-12-the-late-movie/sprites/ego.png | Bin 0 -> 709 bytes .../sprites/gritdetective.png | Bin 0 -> 1013 bytes .../sprites/jetdeck.png | Bin 0 -> 3348 bytes .../sprites/moonaerial.png | Bin 0 -> 789 bytes .../sprites/moonqueen.png | Bin 0 -> 1100 bytes .../sprites/pantocow.png | Bin 0 -> 719 bytes .../sprites/plotdevice.png | Bin 0 -> 509 bytes .../sprites/precinctdesk.png | Bin 0 -> 778 bytes .../sprites/rainlamp.png | Bin 0 -> 1222 bytes .../sprites/salesman.png | Bin 0 -> 955 bytes .../sprites/satdish.png | Bin 0 -> 954 bytes .../case-12-the-late-movie/sprites/tvkid.png | Bin 0 -> 427 bytes .../case-12-the-late-movie/sprites/tvset.png | Bin 0 -> 575 bytes tests/scripts/case-00.jsonl | 23 ++ tests/scripts/case-00b.jsonl | 27 ++ tests/scripts/case-00c.jsonl | 22 ++ tests/scripts/case-01.jsonl | 33 +++ tests/scripts/case-02.jsonl | 32 +++ tests/scripts/case-03.jsonl | 16 ++ tests/scripts/case-04.jsonl | 15 + tests/scripts/case-05.jsonl | 15 + tests/scripts/case-06.jsonl | 29 ++ tests/scripts/case-07.jsonl | 35 +++ tests/scripts/case-08.jsonl | 30 ++ tests/scripts/case-08b.jsonl | 21 ++ tests/scripts/case-09.jsonl | 15 + tests/scripts/case-10.jsonl | 35 +++ tests/scripts/case-11.jsonl | 25 ++ tests/scripts/case-12.jsonl | 27 ++ tools/verify.sh | 33 +++ 53 files changed, 1898 insertions(+), 3 deletions(-) create mode 100644 cases/case-12-the-late-movie/game.json create mode 100644 cases/case-12-the-late-movie/rooms/room0.json create mode 100644 cases/case-12-the-late-movie/rooms/room1.json create mode 100644 cases/case-12-the-late-movie/rooms/room2.json create mode 100644 cases/case-12-the-late-movie/rooms/room3.json create mode 100644 cases/case-12-the-late-movie/rooms/room4.json create mode 100644 cases/case-12-the-late-movie/rooms/room5.json create mode 100644 cases/case-12-the-late-movie/rooms/room6.json create mode 100644 cases/case-12-the-late-movie/sprites.json create mode 100644 cases/case-12-the-late-movie/sprites/admiral.png create mode 100644 cases/case-12-the-late-movie/sprites/anvil.png create mode 100644 cases/case-12-the-late-movie/sprites/archivebox.png create mode 100644 cases/case-12-the-late-movie/sprites/buddycop.png create mode 100644 cases/case-12-the-late-movie/sprites/cardboardrocket.png create mode 100644 cases/case-12-the-late-movie/sprites/cartoonmouse.png create mode 100644 cases/case-12-the-late-movie/sprites/checkpoint.png create mode 100644 cases/case-12-the-late-movie/sprites/clerkdemon.png create mode 100644 cases/case-12-the-late-movie/sprites/composite.png create mode 100644 cases/case-12-the-late-movie/sprites/crooner.png create mode 100644 cases/case-12-the-late-movie/sprites/drebin58.png create mode 100644 cases/case-12-the-late-movie/sprites/drebin82.png create mode 100644 cases/case-12-the-late-movie/sprites/ego.png create mode 100644 cases/case-12-the-late-movie/sprites/gritdetective.png create mode 100644 cases/case-12-the-late-movie/sprites/jetdeck.png create mode 100644 cases/case-12-the-late-movie/sprites/moonaerial.png create mode 100644 cases/case-12-the-late-movie/sprites/moonqueen.png create mode 100644 cases/case-12-the-late-movie/sprites/pantocow.png create mode 100644 cases/case-12-the-late-movie/sprites/plotdevice.png create mode 100644 cases/case-12-the-late-movie/sprites/precinctdesk.png create mode 100644 cases/case-12-the-late-movie/sprites/rainlamp.png create mode 100644 cases/case-12-the-late-movie/sprites/salesman.png create mode 100644 cases/case-12-the-late-movie/sprites/satdish.png create mode 100644 cases/case-12-the-late-movie/sprites/tvkid.png create mode 100644 cases/case-12-the-late-movie/sprites/tvset.png create mode 100644 tests/scripts/case-00.jsonl create mode 100644 tests/scripts/case-00b.jsonl create mode 100644 tests/scripts/case-00c.jsonl create mode 100644 tests/scripts/case-01.jsonl create mode 100644 tests/scripts/case-02.jsonl create mode 100644 tests/scripts/case-03.jsonl create mode 100644 tests/scripts/case-04.jsonl create mode 100644 tests/scripts/case-05.jsonl create mode 100644 tests/scripts/case-06.jsonl create mode 100644 tests/scripts/case-07.jsonl create mode 100644 tests/scripts/case-08.jsonl create mode 100644 tests/scripts/case-08b.jsonl create mode 100644 tests/scripts/case-09.jsonl create mode 100644 tests/scripts/case-10.jsonl create mode 100644 tests/scripts/case-11.jsonl create mode 100644 tests/scripts/case-12.jsonl create mode 100755 tools/verify.sh diff --git a/DESIGN.md b/DESIGN.md index 041ed1d..405124a 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -578,7 +578,59 @@ watches all eleven minutes of it without a word because he can see Frank means i --- -## 11. The glitches are canon +## 11. Case Twelve — The Late Movie (the finale) + +**`cases/case-12-the-late-movie/`** — seven rooms, 100 points, four deaths. +All three Drebins, one case, one screen. + +**The frame is *Stay Tuned*, not a wormhole.** A satellite dish appears on the +property annex roof that is on no asset register and no invoice, aimed *down* +through the roof at a 1958 television with no plug. A man in a maroon blazer +turns up at ten to midnight with a clipboard and a complimentary upgrade, and +does the one thing that has ever worked on a Drebin: he asks him to sign. + +Frank Jr. reads the terms first. **In four hundred years, nobody has ever read +the terms** — and that single act is what wins the case six rooms later, +because Clause 14 (added 1611, never once invoked) lets the subscriber nominate +a REPLACEMENT PROGRAMME, *supplied in full and in good order.* Nobody has ever +supplied anything in good order. That is why it is still in there. + +**Each channel is a genre with a rule, and the family beats it with paperwork:** + +| Channel | The genre's rule | How a Drebin breaks it | +|---|---|---| +| **CH 3 — Curtain of Steel** | The resistance's encore is unapproved | He files Form 7 correctly, in the country's own language, so the encore becomes the only *state-approved* act of resistance in history | +| **CH 5 — Afterburn!** | The jet cannot be landed; brooding is the method | The flight manual's emergency checklist is printed in the wrong order (again). Read it backwards, land it, and the saxophone stops mid-phrase because you cannot underscore procedure | +| **CH 7 — Badge Heat** | Somebody one day from retirement *must* die | The channel locks onto Sr. So they file a Form 14 reassignment — a man who has been reassigned cannot be killed in the line of duty, because there is no line of duty, and the rain stops with nowhere to fall | +| **CH 9 — Northern Drizzle** | Silence extracts the confession | Sr simply has nothing he needs to say, which beats a man *performing* silence, and then he does the thing four series never did: reads it back and gets each page initialled | +| **A Cartoon** | Nothing can be survived | It can, twice, if you fill in the injury form afterwards | + +**The Twilight Zone kid is the real antagonist.** Not the salesman — he only +sells the dish. On the crater set there is a boy of nine who is not in the +script, lit from below by a television that isn't there, and he is the one +changing channels, and the audience in that house can do anything. `use tvkid` +is a death: *"You can stay and watch with me."* It is not a threat. It is a +channel change, and the next thing on is a cartoon, and it does not end. + +**The win:** they supply sixty-seven years of Drebin paperwork as the +replacement programme, in good order, and the instrument is bound by its own +clause to broadcast it on all 666 channels at once — and **none of it is +entertainment.** No loose cannon, no twist, no rain indoors. Just a man writing +down exactly what happened, for sixty-seven years, to an audience of nobody. +The boy watches eleven minutes and stops smiling, because it is the first thing +he has ever seen that was not made to hold him, and he says *"Oh"* — the same +"Oh" a boy said at a kitchen table in 1958 — and turns the television off from +the inside. + +**The merge lasts one frame.** Between channels, in the dark, the three of them +are one man: a fedora and a tan trench coat and a navy suit, half in colour and +half in black and white, holding a clipboard. Then the annex lights come up and +there is one chair occupied, because that is how it has always been, and the +other two were always only ever what was written down. + +--- + +## 12. The glitches are canon *Police Quest II* shipped with bugs that are, without alteration, Naked Gun jokes. A player who has never heard of Sierra reads them as Drebin being Drebin; @@ -610,7 +662,7 @@ the game is behaving exactly as documented. --- -## 12. Art pipeline +## 13. Art pipeline `tools/sprites.py ` reads that case's `sprites.json` and generates every missing sprite on the **MODELBEAST** farm (free, local, m3ultra): diff --git a/README.md b/README.md index 496d693..21e5c51 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ itself a reimplementation of AGI, the engine Sierra shipped *Police Quest* on. - **[DESIGN.md](DESIGN.md)** — the game bible: the joke engine, the two Drebins, the eleven-case campaign, and how it all maps onto MRPGI data. -**Fifteen cases, all playable, all verified end-to-end at 100/100** (Case One is +**Sixteen cases, all playable, all verified end-to-end at 100/100** (Case One is 95 + 5 optional). `python3 tools/lint.py` checks all thirteen clean. ## Play @@ -53,8 +53,10 @@ cargo run -p mrpgi --manifest-path ~/Documents/MRPGI/Cargo.toml -- --game cases/ | `cases/case-10-plot-device/` | **Case Ten — playable, 100 points.** Drebin Jr (Neeson), 2025, cold palette. Six rooms, the arena finale and the owl. | | `cases/case-08-smell-of-fear/` | **Case Eight — playable, 100 points.** Drebin (Nielsen), 1991, full colour. Five rooms, the memory test. | | `cases/case-11-what-he-wrote/` | **Case Eleven — playable, 100 points.** Drebin **Jr** reads his grandfather's files. Five rooms; the palette drifts from 2025 back to 1958. | +| `cases/case-12-the-late-movie/` | **Case Twelve — playable, 100 points.** The finale: all three Drebins pulled into a demonic cable multiverse. Seven channels. | | `tools/sprites.py` | Generates every sprite on the MODELBEAST farm (free, local). | | `tools/lint.py` | Checks every case for the authoring traps that have bitten us. Run it before playtesting. | +| `tools/verify.sh` | Replays every case's win path headlessly and checks it reaches max_score. Scripts in `tests/scripts/`. | | `RESEARCH.md` / `DESIGN.md` | Source research and the campaign bible. | ## Case One — A Substantial Gift diff --git a/cases/case-12-the-late-movie/game.json b/cases/case-12-the-late-movie/game.json new file mode 100644 index 0000000..1b2712f --- /dev/null +++ b/cases/case-12-the-late-movie/game.json @@ -0,0 +1,53 @@ +{ + "name": "Police Squad Quest — Case Twelve: The Late Movie", + "start_room": 0, + "max_score": 100, + "intro_text": "Property inventory, 11:40 PM. The 1958 evidence pallet includes one wooden television set, never claimed, and the active shelf includes one P.L.O.T. Device, and regulations do not say they cannot be inventoried on the same bench. In about four minutes that will turn out to be an oversight, and shortly after that a man in a maroon blazer is going to explain the terms. My name is Frank Drebin Jr. My father was a police officer. His father was a police officer. Tonight, all three of us are going to be on television, and only one of us is coming off it. Type 'help'.", + "death_text": "† OFFICER DOWN. The channel changes. The day restarts. †", + "verbs": [ + { + "name": "use", + "words": [ + "file", + "sign", + "check", + "read", + "tune", + "rig", + "merge", + "watch", + "inventory", + "halt", + "radio" + ] + }, + { + "name": "look", + "words": [ + "investigate", + "observe", + "examine" + ] + }, + { + "name": "talk", + "words": [ + "interrogate", + "question", + "brief", + "ask" + ] + } + ], + "flags": { + "device_on": false, + "tuned": false, + "encore_done": false, + "landed_it": false, + "partner_alive": false, + "confessed": false, + "signal_up": false, + "signed": false, + "read_terms": false + } +} \ No newline at end of file diff --git a/cases/case-12-the-late-movie/rooms/room0.json b/cases/case-12-the-late-movie/rooms/room0.json new file mode 100644 index 0000000..b759e97 --- /dev/null +++ b/cases/case-12-the-late-movie/rooms/room0.json @@ -0,0 +1,261 @@ +{ + "name": "Police Squad — Property Annex, 11:40 PM", + "enter_text": "One bench, one clipboard, sixty-seven years of evidence, and a television old enough to remember all of it.", + "music": 2, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 58, + "color": 0, + "meaning": "Wall" + } + }, + { + "Rect": { + "x": 0, + "y": 56, + "w": 160, + "h": 3, + "color": 1, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 59, + "w": 160, + "h": 109, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 8, + "y": 10, + "w": 34, + "h": 44, + "color": 8, + "meaning": "None" + } + }, + { + "Rect": { + "x": 8, + "y": 10, + "w": 34, + "h": 3, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 8, + "y": 26, + "w": 34, + "h": 3, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 8, + "y": 42, + "w": 34, + "h": 3, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 118, + "y": 10, + "w": 34, + "h": 44, + "color": 8, + "meaning": "None" + } + }, + { + "Rect": { + "x": 118, + "y": 10, + "w": 34, + "h": 3, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 118, + "y": 26, + "w": 34, + "h": 3, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 118, + "y": 42, + "w": 34, + "h": 3, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 24, + 148 + ], + "exits": [ + null, + 1, + null, + null + ], + "exit_flags": [ + "", + "tuned", + "", + "" + ], + "exit_blocked": [ + "", + "The east wall of the annex is a wall. It has been a wall all evening. Something about the television suggests this is negotiable.", + "", + "" + ], + "objects": [ + { + "name": "archivebox", + "sprite": "archivebox", + "x": 58, + "y": 118, + "look": "The 1958 pallet, back from the digitisation project, awaiting final disposal. Somebody has written on the top box, in fresh marker, in your own handwriting: DO NOT DISPOSE. You do not remember writing it. You agree with it completely.", + "synonyms": "pallet boxes evidence shelf archive", + "use_text": "You square the boxes to the pallet edge. Sixty-seven years of paper, and you are the only living person who has read any of it, and you square the boxes, because they are his." + }, + { + "name": "plotdevice", + "sprite": "plotdevice", + "x": 96, + "y": 122, + "look": "The P.L.O.T. Device, in property since New Year's, awaiting a trial that keeps being adjourned because no prosecutor can explain to a jury what it does. Tonight, on the bench, four feet from a 1958 television set, it is doing something it has never done before. It is humming the tune to something.", + "synonyms": "device orb primordial exhibit", + "points": 0, + "sets_flag": "device_on", + "use_text": "You inventory the device, as the clipboard requires. As you lift it, the hum finds the television's aerial, and the dead screen fills with static, and the static is not random. Static is never anything. This static is a channel guide. (+5)" + }, + { + "name": "satdish", + "sprite": "satdish", + "x": 26, + "y": 100, + "look": "Bolted to the annex roof, above a property store, is a satellite dish that is not on the building schedule, not on the asset register, and not on any invoice. It is aimed down, through the roof, at a television with no plug. There is a faint red glow at the receiver and it is the only warm-coloured thing in this building.", + "synonyms": "dish antenna receiver roof aerial", + "use_text": "You radio Facilities at midnight and ask when the annex acquired a satellite dish. Facilities says the annex has always had a satellite dish. You ask since when. Facilities says always. You ask them to check. There is a pause of eleven seconds, and then Facilities says, in a slightly different voice, that the annex has always had a satellite dish." + }, + { + "name": "salesman", + "sprite": "salesman", + "x": 76, + "y": 132, + "look": "There is a man in the property annex at ten to midnight in a maroon blazer and a bolo tie, holding a clipboard, standing between you and an exhibit. He is very pleased to see you. Nobody is ever pleased to see anybody in a property annex.", + "synonyms": "spike man blazer bolo salesman rep", + "points": 5, + "sets_flag": "signed", + "use_text": "You ask for identification and he produces it instantly, laminated, with a photograph that is definitely him and a company name that is definitely not a company. Then he does the only thing that has ever worked on a Drebin: he hands over the paperwork and asks you to sign. You read it first. All of it. You are the first customer in the instrument's history to read it first, and he watches you do it with the expression of a man watching weather come in. (+10)", + "dialogue": [ + { + "says": "Salesman: Detective! Congratulations. This property annex has been selected for a complimentary upgrade — six hundred and sixty-six channels, no monthly, no installation, already installed. He gestures at the roof. The gesture is slightly too accurate about where the dish is.", + "choices": [ + { + "text": "Who installed a dish on a police building?", + "goto": 1 + }, + { + "text": "What company are you with?", + "goto": 2 + }, + { + "text": "I'd like to read the terms.", + "goto": 3 + } + ] + }, + { + "says": "Salesman: We did! Wednesday. There's a work order. There is a work order. It is correctly numbered, correctly countersigned, and filed in a system that has no record of the countersignature belonging to anybody.", + "choices": [ + { + "text": "I'd like to read the terms.", + "goto": 3 + } + ] + }, + { + "says": "Salesman: Entertainment. He says it the way other men say a number they have agreed not to say out loud.", + "choices": [ + { + "text": "I'd like to read the terms.", + "goto": 3 + } + ] + }, + { + "says": "Salesman: ...You'd like to read the terms. Salesman: Nobody reads the terms, Detective. In four hundred years of this instrument, in every format it has ever taken — the deed, the wager, the fiddle contest, the standard-form end-user agreement — nobody has ever once read the terms. He hands them over. He is smiling. He is smiling slightly less than he was.", + "choices": [ + { + "text": "Then I'll be the first.", + "goto": -1, + "sets_flag": "read_terms", + "points": 0 + } + ] + } + ] + }, + { + "name": "tvset", + "sprite": "tvset", + "x": 132, + "y": 126, + "look": "EXHIBIT 1958-114: one wooden television set, seized from the Meridian Terrace boarding house in 1958, never claimed. It has no plug. It has never had a plug. The 1958 property log notes this, in your grandfather's hand, without comment, because the form asked what was seized and not what was possible. Tonight the screen is showing a channel guide: CH 3 — CURTAIN OF STEEL. CH 5 — AFTERBURN! CH 7 — BADGE HEAT. CH 9 — NORTHERN DRIZZLE. CH 13 — THE LATE MOVIE: CRATER WOMEN OF VENUS. In the corner of the screen, very small, a counter reads 24:00:00 and is not moving yet.", + "synonyms": "television screen set channel exhibit aerial", + "requires_flag": "signed", + "points": 5, + "sets_flag": "tuned", + "use_text": "You tune it, because it is on the clipboard and the clipboard says CONDITION: CHECK. The static folds inward. The annex acquires a horizontal hold problem. And somewhere in 1965 a retired detective sergeant feeding hens looks up at his porch light; and somewhere in 1982 a lieutenant reversing out of a parking space feels the car pass through something enormous and priceless without breaking it for once; and all three of you are pulled through the same six-inch screen into the eleven o'clock schedule, in order of seniority. (+10)" + } + ] +} \ No newline at end of file diff --git a/cases/case-12-the-late-movie/rooms/room1.json b/cases/case-12-the-late-movie/rooms/room1.json new file mode 100644 index 0000000..a5adb25 --- /dev/null +++ b/cases/case-12-the-late-movie/rooms/room1.json @@ -0,0 +1,169 @@ +{ + "name": "CH 3 — CURTAIN OF STEEL", + "enter_text": "A border town in black and white. A checkpoint, a tavern, and posters everywhere for tonight's State Concert, which the State is very excited about and the town is attending at gunpoint.", + "music": 2, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 56, + "color": 0, + "meaning": "Wall" + } + }, + { + "Rect": { + "x": 0, + "y": 54, + "w": 160, + "h": 3, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 57, + "w": 160, + "h": 111, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 10, + "y": 8, + "w": 30, + "h": 40, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 14, + "y": 12, + "w": 22, + "h": 32, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 120, + "y": 8, + "w": 30, + "h": 40, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 124, + "y": 12, + "w": 22, + "h": 32, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 20, + 146 + ], + "exits": [ + null, + 2, + null, + null + ], + "exit_flags": [ + "", + "encore_done", + "", + "" + ], + "exit_blocked": [ + "", + "The channel will not change until this channel's story is done. That is how channels have always worked and nobody has ever asked why.", + "", + "" + ], + "objects": [ + { + "name": "grandpa", + "sprite": "drebin58", + "x": 40, + "y": 122, + "look": "Your grandfather, seventy-nine years young in 1965 and somehow here, in a world that is finally in his palette. He looks around the monochrome town for a long moment, and then he says, flatly, with what you now recognise as deep contentment: 'Correct lighting.'", + "synonyms": "grandfather sergeant fedora old", + "use_text": "You confer. He has already surveyed the checkpoint, timed the guard rotation, and identified which two resistance members are inside the pantomime cow, from the boots, which are department issue, which raises questions he has written down." + }, + { + "name": "dad", + "sprite": "drebin82", + "x": 118, + "y": 130, + "look": "Your father, in full colour, in a black-and-white world. The tan trench coat glows like a signal flare. Everyone in the town square is staring at him. He has not noticed. He has never once noticed. That is his superpower and this channel has no defence against it.", + "synonyms": "father lieutenant trench colour", + "use_text": "The channel keeps trying to grade him monochrome, and the trench coat keeps coming back tan, and after four attempts the channel gives up and adjusts the rest of the town to match him slightly, which is why the tavern is now faintly beige." + }, + { + "name": "pantocow", + "sprite": "pantocow", + "x": 76, + "y": 128, + "look": "A pantomime cow, loitering by the tavern with tremendous nonchalance. It has two pairs of boots. Cows have hooves. The boots are police issue, which is either the resistance or a very poor sign for this town's police.", + "synonyms": "cow costume disguise boots", + "use_text": "You address the front half of the cow, quietly, in your capacity as a fellow professional. The cow replies, in two voices, that it is a cow. You note the time, and let the cow proceed, because a Drebin knows a colleague under cover when he sees one, and there is a way to behave." + }, + { + "name": "checkpoint", + "sprite": "checkpoint", + "x": 132, + "y": 116, + "look": "The checkpoint. A striped barrier, a guard in a greatcoat, and a sign listing what may not cross: WESTERN MUSIC, WESTERN LITERATURE, WESTERN OPTIMISM. The guard has been on this barrier for nineteen years and has never once been asked a question he could answer with yes.", + "synonyms": "barrier border guard booth", + "kills": true, + "use_text": "You approach the checkpoint at night, in a foreign uniform's world, without papers, and you explain, sincerely, that you are a police officer from the television. The guard has heard many things at this barrier. He has never heard the truth before. It goes very badly, the way the truth does here, which is the entire point of this channel." + }, + { + "name": "crooner", + "sprite": "crooner", + "x": 76, + "y": 108, + "look": "The State's captive headliner: an American rock-and-roll idol on a cultural exchange nobody agreed to, gold jacket, guitar, and a smile with state supervision. Between numbers he passes coded messages to the resistance through his set list. Tonight's encore is the signal for something. Everybody knows this. The State knows this. The problem is that the encore has not been approved.", + "synonyms": "singer idol star gold guitar", + "points": 10, + "sets_flag": "encore_done", + "use_text": "You solve it the way your family solves everything. You go to the checkpoint office, and you request Form 7 — APPLICATION FOR SUPPLEMENTARY PERFORMANCE (ONE SONG) — and you fill it in correctly, in triplicate, in the town's own language, which your grandfather turns out to read, because in 1961 he processed an extradition and 'the forms were educational'. The clerk stamps it. Nobody has ever filled it in correctly before. The encore is now the only state-approved act of resistance in the country's history, and it goes off at nine, legally, to weeping. The resistance escapes during the guitar solo, disguised as a cow, through the checkpoint, with a permit. (+10)" + } + ] +} \ No newline at end of file diff --git a/cases/case-12-the-late-movie/rooms/room2.json b/cases/case-12-the-late-movie/rooms/room2.json new file mode 100644 index 0000000..6c7b60d --- /dev/null +++ b/cases/case-12-the-late-movie/rooms/room2.json @@ -0,0 +1,177 @@ +{ + "name": "CH 5 — AFTERBURN!", + "enter_text": "A carrier deck at permanent sunset. Every surface is orange, every jaw is set, and somewhere a saxophone is playing for no one.", + "music": 4, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 6, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 50, + "color": 12, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 20, + "w": 160, + "h": 8, + "color": 14, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 48, + "w": 160, + "h": 3, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 51, + "w": 160, + "h": 117, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 90, + "w": 160, + "h": 2, + "color": 14, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 130, + "w": 160, + "h": 2, + "color": 14, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 18, + 146 + ], + "exits": [ + null, + 3, + null, + 1 + ], + "exit_flags": [ + "", + "landed_it", + "", + "" + ], + "exit_blocked": [ + "", + "There is a jet on this deck that the channel insists cannot be landed, and it will not move on until somebody lands it.", + "", + "" + ], + "objects": [ + { + "name": "admiral", + "sprite": "admiral", + "x": 36, + "y": 118, + "look": "The admiral. One eyepatch, forty ribbons, and a coffee mug he has been gripping since the seventies. He speaks entirely in barked fragments about the best he's ever seen and the biggest risk he's ever cleared.", + "synonyms": "eyepatch navy commander brass", + "use_text": "He assigns you all call signs, which the channel requires. You are PAPERWORK. Your father is SINCERE. Your grandfather declines a call sign, flatly, once — and the channel's horizontal hold shudders, because a man without a call sign cannot be in this genre, and he is anyway, and the genre has to just live with it.", + "dialogue": [ + { + "says": "Admiral: DREBIN! Three generations of the worst flying I have never seen! One of you is going up in that bird and I don't care which!", + "choices": [ + { + "text": "None of us can fly, Admiral.", + "goto": 1 + }, + { + "text": "Volunteer for the beach volleyball montage instead.", + "goto": 2, + "kills": true + } + ] + }, + { + "says": "Admiral: CAN'T FLY! He drinks the entire mug. Admiral: Son, NOBODY in this picture can fly! That's what the MUSIC is for!", + "choices": [ + { + "text": "Then we'll do it by the checklist.", + "goto": -1 + } + ] + }, + { + "says": "You volunteer for the montage. It is four minutes long. You are seventy-one years old. The channel provides slow motion, which helps nothing, and a saxophone, which helps less. The coroner's channel lists the cause as 'lifestyle'." + } + ] + }, + { + "name": "dad", + "sprite": "drebin82", + "x": 118, + "y": 124, + "look": "Your father, whom the channel has decided is haunted by the legendary crash that killed HIS father. His father is standing next to him, alive, holding a clipboard. The channel keeps cutting to flashbacks of the crash anyway. The flashbacks have no one in them. The channel does not know how to handle this and is beginning to sweat.", + "synonyms": "father lieutenant trench haunted", + "use_text": "The channel gives him a brooding close-up against the sunset. He uses it to check, sincerely, whether you have eaten today. The close-up holds. It is the most emotionally healthy shot in this genre's history and the saxophone does not know what to play under it." + }, + { + "name": "grandpa", + "sprite": "drebin58", + "x": 96, + "y": 132, + "look": "Your grandfather has obtained the aircraft's flight manual and is reading it, in monochrome, in a deck chair, at the exact centre of a genre that has never once opened it.", + "synonyms": "grandfather sergeant fedora manual", + "use_text": "He looks up from the manual. 'Page forty-one. The emergency landing checklist is printed in the wrong order. Trigger before feed.' He looks at you over the page, one beat, 1958 to 2025. 'They are always printed in the wrong order.'" + }, + { + "name": "jetdeck", + "sprite": "jetdeck", + "x": 76, + "y": 108, + "look": "The bird. The channel has established, in three separate barked briefings, that it cannot be landed: crosswind, night, no instruments, a storm the size of a country, and a saxophone. Nobody in this genre has ever consulted the manual, because the manual does not brood.", + "synonyms": "jet bird plane fighter aircraft deck", + "points": 10, + "sets_flag": "landed_it", + "use_text": "You land the unlandable jet as a family. Your grandfather reads the emergency checklist aloud in reverse order, which corrects it. Your father repeats each item back with total sincerity, which is what checklists are for. You do the things, in order, with your hands, because somebody in this family has to be the hands. The jet lands. Softly. In the storm. To silence — the saxophone stops, mid-phrase, for the first time in this channel's history, because there is nothing to underscore. It was procedure. You cannot underscore procedure. The admiral names a corridor after you and drinks to the manual, which he has decided he invented. (+15)" + } + ] +} \ No newline at end of file diff --git a/cases/case-12-the-late-movie/rooms/room3.json b/cases/case-12-the-late-movie/rooms/room3.json new file mode 100644 index 0000000..0297291 --- /dev/null +++ b/cases/case-12-the-late-movie/rooms/room3.json @@ -0,0 +1,159 @@ +{ + "name": "CH 7 — BADGE HEAT", + "enter_text": "A precinct in permanent teal. Everything is wet for no reason, everybody is shouting, and somewhere a captain is turning in his own badge about something.", + "music": 4, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 58, + "color": 3, + "meaning": "Wall" + } + }, + { + "Rect": { + "x": 0, + "y": 56, + "w": 160, + "h": 3, + "color": 11, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 59, + "w": 160, + "h": 109, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 10, + "y": 10, + "w": 44, + "h": 38, + "color": 1, + "meaning": "None" + } + }, + { + "Rect": { + "x": 14, + "y": 14, + "w": 36, + "h": 30, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 110, + "y": 10, + "w": 42, + "h": 38, + "color": 1, + "meaning": "None" + } + }, + { + "Rect": { + "x": 114, + "y": 14, + "w": 34, + "h": 30, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 18, + 146 + ], + "exits": [ + null, + 4, + null, + 2 + ], + "exit_flags": [ + "", + "partner_alive", + "", + "" + ], + "exit_blocked": [ + "", + "This channel has decided somebody in this room is going to die and it will not move on until it gets what it wants.", + "", + "" + ], + "objects": [ + { + "name": "precinctdesk", + "sprite": "precinctdesk", + "x": 44, + "y": 120, + "look": "A desk buried in case files, donuts, and two coffees. Taped to the monitor is the duty roster, and pinned above it a countdown: DAYS TO RETIREMENT: 1. Nobody in this channel is ever two days from retirement. It is always one. It has been one for eleven years.", + "synonyms": "desk files donuts coffee roster board", + "use_text": "You go through the case files. Every single one is the same case: a loose cannon, a captain who has had it up to here, and a partner who was one day from retirement and showed somebody a photograph of his family. There are forty-one of them. The channel has been running this story since 1984 and has never once noticed." + }, + { + "name": "buddycop", + "sprite": "buddycop", + "x": 118, + "y": 126, + "look": "The channel's own detective — mullet, leather over a Hawaiian shirt, badge on a chain — who has been assigned to you and is thrilled about it. He plays by his own rules. He has been suspended four times this season. He has never filled in a form.", + "synonyms": "cop mullet loose cannon partner detective", + "use_text": "He asks how you do it in your precinct. You tell him: forms, mostly. He laughs for a long time, and then stops, and asks whether that works, and you tell him it has a ninety-four per cent clearance rate over three generations, and he goes very quiet and writes 'FORMS?' on his hand." + }, + { + "name": "grandpa", + "sprite": "drebin58", + "x": 78, + "y": 132, + "look": "Your grandfather, in monochrome, in a teal precinct, two weeks from a retirement he took sixty years ago. The channel has scanned him, found DAYS TO RETIREMENT and a photograph of a family in his coat, and has begun to swing the lighting round onto him. Every genre convention this channel possesses is now pointing at your grandfather like a compass needle.", + "synonyms": "grandfather sergeant fedora old", + "points": 15, + "sets_flag": "partner_alive", + "use_text": "It comes for him in the parking structure, the way it always does, and it does it correctly: the rain, the slow walk to the car, the photograph, the line about his daughter's wedding on Saturday. He does not have a daughter. He says so. The channel provides one anyway. So you do the only thing available to a family of literalists: you take it away from the channel by doing the paperwork first. Your father files a REQUEST FOR REASSIGNMENT (FORM 14) removing the retiring officer from active duty effective immediately. You countersign as the ranking officer present. Your grandfather, being neither retiring nor active nor, strictly, alive in this decade, signs as the witness. A man who has been reassigned cannot be killed in the line of duty. There is no line of duty. The channel checks the roster twice, and the roster is correct, and the rain stops in the middle of the parking structure with nowhere to fall. The loose cannon watches all three of you file a form to defeat a genre, and takes his hand out of his jacket, and looks at the word he wrote on it. (+20)" + }, + { + "name": "dad", + "sprite": "drebin82", + "x": 138, + "y": 140, + "look": "Your father, who this channel has cast as the by-the-book superior who does not understand the streets. He understands the streets. He has been the streets since 1982. The channel simply cannot read a man whose subtext is identical to his text.", + "synonyms": "father lieutenant trench colour", + "use_text": "The channel gives him a scene where he must shout that he is getting too old for this. He declines, sincerely, on the grounds that he is not, and that a man who says he is too old for a thing while continuing to do it is lying twice." + } + ] +} \ No newline at end of file diff --git a/cases/case-12-the-late-movie/rooms/room4.json b/cases/case-12-the-late-movie/rooms/room4.json new file mode 100644 index 0000000..8b15935 --- /dev/null +++ b/cases/case-12-the-late-movie/rooms/room4.json @@ -0,0 +1,160 @@ +{ + "name": "CH 9 — NORTHERN DRIZZLE", + "enter_text": "Rain. Grey. A canal. Somebody has been staring at a wall for four minutes and the channel considers this the action sequence.", + "music": 2, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 60, + "color": 7, + "meaning": "Wall" + } + }, + { + "Rect": { + "x": 0, + "y": 58, + "w": 160, + "h": 3, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 61, + "w": 160, + "h": 107, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 12, + "y": 12, + "w": 38, + "h": 36, + "color": 8, + "meaning": "None" + } + }, + { + "Rect": { + "x": 16, + "y": 16, + "w": 30, + "h": 28, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 112, + "y": 12, + "w": 38, + "h": 36, + "color": 8, + "meaning": "None" + } + }, + { + "Rect": { + "x": 116, + "y": 16, + "w": 30, + "h": 28, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 18, + 148 + ], + "exits": [ + null, + 5, + null, + 3 + ], + "exit_flags": [ + "", + "confessed", + "", + "" + ], + "exit_blocked": [ + "", + "There is an interview running and this channel does not let anybody leave an interview.", + "", + "" + ], + "objects": [ + { + "name": "rainlamp", + "sprite": "rainlamp", + "x": 116, + "y": 118, + "look": "The interview room. One lamp, one table, two chairs, and rain falling steadily on all of it, indoors, which nobody has remarked on because in this channel weather is a feeling and feelings do not require a roof.", + "synonyms": "lamp table interview room rain puddle", + "use_text": "You look for the source of the indoor rain, as procedure requires. There isn't one. There is a puddle on the table that has been the same depth for eleven minutes, which means it is not accumulating, which means it is not rain, which means this entire channel is a mood with a police station in it." + }, + { + "name": "gritdetective", + "sprite": "gritdetective", + "x": 56, + "y": 124, + "look": "The channel's detective: unshaven, soaked, holding a whisky he is not drinking, staring at a wall of photographs connected by red string. The string does not connect anything. He put it up in episode one because it looked like the kind of thing a man in his condition would do, and it has been there ever since, and he has stopped seeing it.", + "synonyms": "detective haggard whisky british string wall", + "use_text": "You ask him about the string. He says nothing for a very long time, and then says: 'It's about my ex-wife.' You point out that it is a wall of a stranger's telephone records. He looks at it properly for the first time in four series." + }, + { + "name": "suspect", + "sprite": "buddycop", + "x": 96, + "y": 132, + "look": "The suspect, in the chair, who has been in this chair for two episodes. The channel's technique is silence: the detective says nothing, for minutes, and the suspect eventually confesses to fill the air. It has worked forty-one times. It is the channel's only move.", + "synonyms": "man chair interviewee accused", + "requires_flag": "read_terms", + "points": 15, + "sets_flag": "confessed", + "use_text": "Your grandfather takes the chair opposite and does not say anything either. What follows is nine minutes of two men not speaking, and it is the most one-sided contest in the history of the medium, because the channel's detective is performing silence and your grandfather simply has nothing he needs to say. At nine minutes the suspect confesses. At eleven he is still confessing. He confesses to the case, then to two others, then to a thing he did in 1994 that no one had ever connected to anybody, and finally, weeping, to the fact that he does not think this channel is very good. Your grandfather writes all of it down, in full, in his own hand, and reads it back, and asks him to initial each page, which nobody in four series has ever done, which is why nothing in four series has ever stood up. This one stands up. (+20)" + }, + { + "name": "dad", + "sprite": "drebin82", + "x": 24, + "y": 136, + "look": "Your father, in a tan trench coat, in the drizzle, being the only warm-coloured thing for four hundred miles. The channel keeps trying to grade him grey. He keeps coming back tan. Two of the extras have started standing near him for the warmth.", + "synonyms": "father lieutenant trench colour", + "use_text": "He asks the channel's detective whether he has eaten today. The channel's detective bursts into tears. It is the first question anybody has asked him in four series that was not about a corpse." + } + ] +} \ No newline at end of file diff --git a/cases/case-12-the-late-movie/rooms/room5.json b/cases/case-12-the-late-movie/rooms/room5.json new file mode 100644 index 0000000..4ce3f1c --- /dev/null +++ b/cases/case-12-the-late-movie/rooms/room5.json @@ -0,0 +1,148 @@ +{ + "name": "— A CARTOON —", + "enter_text": "The channel does not announce itself. There is a title card, a burst of orchestra, and the laws of physics resign.", + "music": 4, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 15, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 58, + "color": 15, + "meaning": "Wall" + } + }, + { + "Rect": { + "x": 0, + "y": 56, + "w": 160, + "h": 4, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 60, + "w": 160, + "h": 108, + "color": 7, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 28, + "y": 14, + "w": 26, + "h": 34, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 32, + "y": 18, + "w": 18, + "h": 26, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 106, + "y": 14, + "w": 26, + "h": 34, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 110, + "y": 18, + "w": 18, + "h": 26, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 20, + 148 + ], + "exits": [ + null, + 6, + null, + 4 + ], + "objects": [ + { + "name": "cartoonmouse", + "sprite": "cartoonmouse", + "x": 108, + "y": 128, + "look": "A mouse. White gloves, enormous eyes, and a mallet held behind its back that is larger than the mouse, the room, and in one direction the building. It is delighted to see you. It has been delighted to see everybody for ninety years.", + "synonyms": "mouse cartoon gloves rodent", + "use_text": "You attempt to advise the mouse of its rights. It listens to all of it with its head tilted, and then hands you a small sign reading OH DEAR, and steps politely to one side. The sign is the only piece of evidence in this case that will survive to the property annex, and it is logged, and it is initialled, and it is still in the box." + }, + { + "name": "anvil", + "sprite": "anvil", + "x": 62, + "y": 138, + "look": "An anvil. There is no reason for an anvil to be here and there is no reason for it to be above you and it is doing both, which in this channel is not a contradiction but a schedule.", + "synonyms": "weight iron block acme", + "kills": true, + "use_text": "You look up at the anvil, as procedure requires when assessing an overhead hazard. Looking up is the trigger. Looking up has always been the trigger. There are four hundred cartoons about this and you have seen none of them, because you have never once had time for television." + }, + { + "name": "grandpa", + "sprite": "drebin58", + "x": 40, + "y": 126, + "look": "Your grandfather in a cartoon, rendered in the same monochrome he has always been, which here reads as intentional and slightly classy. He has been hit by the anvil twice. He has folded flat twice. He has re-inflated twice, straightened his hat twice, and both times noted the time.", + "synonyms": "grandfather sergeant fedora old", + "points": 5, + "sets_flag": "cartoon_done", + "use_text": "He hands you his notebook. Under INJURIES SUSTAINED he has written: 'Compressed to a thickness of one-sixteenth of an inch by falling anvil, 12:41 AM. Recovered without treatment. Repeated 12:43 AM. Recovered without treatment.' Under CONCLUSION he has written one line, and it is the line that gets all three of you out of here, and eventually off the air: 'Nothing in this place can hurt a man who is willing to fill in the form afterwards.' (+10)" + }, + { + "name": "dad", + "sprite": "drebin82", + "x": 136, + "y": 142, + "look": "Your father, in a cartoon, in colour, being the only object in frame with a shadow. He is holding the mouse. The mouse is entirely content about this. Nobody in ninety years has simply picked up the mouse.", + "synonyms": "father lieutenant trench colour", + "use_text": "He puts the mouse down gently and asks it, sincerely, whether it has anybody looking after it. The orchestra, which has underscored ninety years of blunt-force trauma without hesitating, does not know what to play, and stops." + } + ] +} \ No newline at end of file diff --git a/cases/case-12-the-late-movie/rooms/room6.json b/cases/case-12-the-late-movie/rooms/room6.json new file mode 100644 index 0000000..84fe4eb --- /dev/null +++ b/cases/case-12-the-late-movie/rooms/room6.json @@ -0,0 +1,190 @@ +{ + "name": "CH 13 — THE LATE MOVIE: CRATER WOMEN OF VENUS", + "enter_text": "The cheapest set in the multiverse. Painted craters, a rocket held up with string, and a sky that is a bedsheet. The counter in the corner of everything reads 00:04:11.", + "music": 5, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 7, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 54, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 14, + "y": 10, + "w": 2, + "h": 2, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 54, + "y": 18, + "w": 2, + "h": 2, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 104, + "y": 8, + "w": 2, + "h": 2, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 140, + "y": 22, + "w": 2, + "h": 2, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 52, + "w": 160, + "h": 4, + "color": 8, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 56, + "w": 160, + "h": 112, + "color": 7, + "meaning": "Floor" + } + }, + { + "Ellipse": { + "x": 16, + "y": 92, + "w": 40, + "h": 16, + "color": 8, + "meaning": "None" + } + }, + { + "Ellipse": { + "x": 96, + "y": 104, + "w": 48, + "h": 18, + "color": 8, + "meaning": "None" + } + }, + { + "Ellipse": { + "x": 54, + "y": 130, + "w": 36, + "h": 14, + "color": 8, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 18, + 150 + ], + "exits": [ + null, + null, + null, + 5 + ], + "objects": [ + { + "name": "cardboardrocket", + "sprite": "cardboardrocket", + "x": 116, + "y": 108, + "look": "The rocket. Cardboard, taped at the seams, leaning about four degrees, with a visible string holding the nose cone up. It is the least convincing object any of you have ever stood next to, and all three of you love it immediately and without discussion, and none of you says so.", + "synonyms": "rocket ship cardboard spaceship prop", + "use_text": "You inspect the rocket, as procedure requires before boarding any vehicle. Structurally it is a cardboard tube. Aerodynamically it is a cardboard tube. It has, however, been built with real care by somebody with no money at all, and the tape has been applied in neat parallel strips by a person who wanted it to look right. Your grandfather runs a thumb along the seam and says, 'Somebody tried.' It is, from him, an enormous compliment." + }, + { + "name": "moonqueen", + "sprite": "moonqueen", + "x": 46, + "y": 122, + "look": "The Queen of the Crater Women, in silver lamé and a tall crown, holding a cardboard sceptre. She rules Venus. The set is a moon. The sky is a bedsheet. Nobody in eleven reels has raised any of this, and she watches you notice all three, one after another, and you can see her decide that she likes you.", + "synonyms": "queen crater silver crown venus women", + "use_text": "You ask, respectfully, whether this is Venus or the moon. She looks at the craters. She looks at the bedsheet. She looks at a boom microphone that has been visible in the top of frame since 1957. Queen: 'It is whatever the budget was.' It is the wisest thing anybody says on any channel tonight." + }, + { + "name": "tvkid", + "sprite": "tvkid", + "x": 84, + "y": 130, + "look": "There is a boy on the set who is not in the script. Nine years old, neat side parting, hands at his sides, smiling without blinking, lit from below by a television that is not there. He is the one who has been changing the channels. Not the salesman — the salesman only sells the dish. The boy is the audience, and in this house the audience can do anything, and what the audience wants is for nobody to ever leave.", + "synonyms": "boy child kid audience viewer", + "kills": true, + "use_text": "You tell the boy, kindly and clearly, that you are switching the television off now. The smile does not change. Nothing about his face changes at all. Boy: 'You can stay and watch with me.' It is not a threat and it is not a request. It is a channel change, and it takes you with it, and the next thing on is a cartoon, and it does not end." + }, + { + "name": "clerkdemon", + "sprite": "clerkdemon", + "x": 132, + "y": 138, + "look": "Standing at the edge of the crater set with a ring binder is a middle-aged man in a rumpled brown suit with two small horns and a lanyard. He is not the salesman. He is the salesman's line manager's line manager's problem: a demoted compliance clerk, four hundred years in the department, who processes the contracts nobody reads. He has your contract. He has been reading it since the cartoon. He looks unwell.", + "synonyms": "demon clerk binder compliance horns lanyard", + "points": 10, + "sets_flag": "signal_up", + "use_text": "You ask him, professionally, colleague to colleague, to walk you through the terms. He does. He is enormously relieved to be asked. Clause 9 gives the instrument twenty-four hours to hold the subscriber. Clause 11 releases the subscriber if the instrument fails to hold him. And Clause 14, added in 1611 and never once invoked, provides that the subscriber may nominate a REPLACEMENT PROGRAMME to occupy the schedule, subject to the replacement being SUPPLIED IN FULL AND IN GOOD ORDER BY THE SUBSCRIBER. Clerk: 'Nobody has ever supplied anything in good order. In four hundred years. That's why it's still in there.' He looks at the three of you. He looks at the boxes you are all, without discussing it, already carrying. Clerk: 'Oh.' (+15)" + }, + { + "name": "moonaerial", + "sprite": "moonaerial", + "x": 74, + "y": 96, + "look": "The transmitter: poles, wire, and guy ropes, standing on a crater made of painted plaster, broadcasting six hundred and sixty-six channels of other people's stories into a property annex in 2025. Everything this instrument has ever transmitted, it took from somebody.", + "synonyms": "aerial transmitter mast wire tower signal", + "requires_flag": "signal_up", + "wins": true, + "points": 25, + "use_text": "You invoke Clause 14, and you supply the replacement programme in full and in good order, and it is the only thing your family has ever had. Sixty-seven years of paperwork. The 1958 pallet goes up the mast first. Ardmore Street, with the latent lifted and logged and burned at 4:15 with a witness. Meridian Street, page nine, where a man sets out that he surveyed the building he emptied and signed the manifest at both ends. The liaison report with the shoe and the dome and the doorway. Form 22-B. Section 14 paragraph nine and the four sentences that prove it wrong. Eleven pages from a records terminal at 3:14 in the morning, submitted, and rated honestly, and never read. Every word of it true. Every page initialled. In good order. The instrument accepts delivery — it has to, the clause is its own — and then it has to broadcast it, on all six hundred and sixty-six channels, at once, in full. And nothing in it is entertainment. There is no loose cannon. There is no man one day from retirement. There is no twist, no reveal, no rain indoors. There is a man writing down exactly what happened, for sixty-seven years, in a hand that never once wavered, to an audience of nobody. The boy watches four minutes of it. Then eleven. He stops smiling somewhere in the property log, not because he is frightened, but because he is nine, and it is the first thing he has ever seen that was not made to hold him. Boy: 'Is this all of it?' Your grandfather says: 'That is all of it. It is what happened.' And the boy says, 'Oh,' — the same 'oh' a boy of eight said at a kitchen table in 1958, the same 'oh' your father never said because nobody ever told him — and he turns the television off from the inside. The set goes. The crater goes. The counter stops at 00:00:19 with the clerk stamping the release, twice, because he wants the second stamp for his file. And for one frame, in the dark between channels, the three of you are the same man: a fedora and a tan trench coat and a navy suit, half in colour and half in black and white, holding a clipboard. One frame. Then the annex lights, and the bench, and three chairs, and only one of them occupied — because that is how it has always been, and the other two were always only ever what was written down. On the bench: one wooden television set, unplugged, screen dead, tagged. One P.L.O.T. Device, cold. One satellite dish, on the roof, aimed at nothing, that Facilities has no record of and never will. You file it. Nine pages. Every sentence true. Captain Hocken Jr. signs it on Friday, and — because he is the only one who ever does — he reads it first, all of it, and then he comes and finds you and does not say anything at all, and puts a hand on your shoulder, and that is the review. ★ (+30)" + } + ] +} \ No newline at end of file diff --git a/cases/case-12-the-late-movie/sprites.json b/cases/case-12-the-late-movie/sprites.json new file mode 100644 index 0000000..3b01dbc --- /dev/null +++ b/cases/case-12-the-late-movie/sprites.json @@ -0,0 +1,91 @@ +{ + "_comment": "The finale. Each channel has its own palette baked into the prompts: mono spy picture, saturated flyboy orange, 90s action teal, UK drizzle grey, and B-movie silver. Jr's ego and the device come from case-10, the archive boxes from case-11.", + "tvset": { + "h": 20, + "prompt": "A 1950s wooden cabinet television set with a small rounded screen glowing bright static blue in a dark room, rabbit ear aerial on top, seen from the front, full colour" + }, + "drebin58": { + "h": 26, + "prompt": "A tall lean 1950s police detective in a dark heavy overcoat and snap brim fedora, hard unsmiling face, arms at his sides, facing the viewer, black and white monochrome grayscale only" + }, + "drebin82": { + "h": 26, + "prompt": "A 1980s police detective in a beige tan trench coat over a grey suit, silver grey hair, square jaw, completely deadpan expression, arms at his sides, facing the viewer, full colour" + }, + "composite": { + "h": 27, + "prompt": "One tall detective who is three detectives at once, wearing a 1950s fedora and a beige tan trench coat with a modern navy suit beneath, half the figure in black and white and half in colour, completely serious expression, facing the viewer" + }, + "crooner": { + "h": 26, + "prompt": "A 1960s rock and roll idol in a gold lame jacket with a pompadour haircut, holding a guitar mid windmill, mouth open in song, facing the viewer, black and white monochrome grayscale only" + }, + "checkpoint": { + "h": 26, + "prompt": "A grim border checkpoint booth with a striped barrier arm and a stern guard in a greatcoat and peaked cap standing beside it, black and white monochrome grayscale only" + }, + "pantocow": { + "h": 20, + "prompt": "A pantomime cow costume with two visible human boots showing beneath the hind legs, standing in a tavern, seen from the side, black and white monochrome grayscale only" + }, + "jetdeck": { + "h": 24, + "prompt": "A grey fighter jet parked on an aircraft carrier deck at sunset, canopy open, seen from the side, saturated orange and teal 1980s movie poster lighting, full colour" + }, + "admiral": { + "h": 26, + "prompt": "A weathered navy admiral in khaki with an eyepatch and a coffee mug, chest of ribbons, barking expression, facing the viewer, full colour" + }, + "buddycop": { + "h": 26, + "prompt": "A 1990s loose cannon action movie cop with a mullet, leather jacket over a hawaiian shirt, badge on a neck chain, grinning, facing the viewer, full colour" + }, + "precinctdesk": { + "h": 18, + "prompt": "A cluttered 1990s police precinct desk stacked with case files, a box of donuts and two coffee cups, seen from the front, full colour" + }, + "gritdetective": { + "h": 26, + "prompt": "A haggard British television detective in a rumpled overcoat, three day stubble, holding a whisky glass, soaked with rain, facing the viewer, desaturated cold grey lighting, full colour" + }, + "rainlamp": { + "h": 24, + "prompt": "A police interview room lamp and table with rain falling on it indoors, puddle on the table, desaturated cold grey lighting, full colour" + }, + "moonqueen": { + "h": 26, + "prompt": "A 1950s B movie space queen in a silver lame gown and tall crown holding a cardboard ray gun sceptre, regal pose, facing the viewer, silvery black and white with visible film grain, monochrome grayscale only" + }, + "cardboardrocket": { + "h": 28, + "prompt": "An obviously cardboard 1950s B movie rocket ship leaning slightly, visible tape seams and a string holding the nose up, on a fake crater set, black and white monochrome grayscale only" + }, + "moonaerial": { + "h": 22, + "prompt": "A rickety television transmitter aerial made of poles and wire guy ropes on a fake lunar crater set, black and white monochrome grayscale only" + }, + "salesman": { + "h": 26, + "prompt": "A shifty smiling 1990s door to door salesman in a loud maroon blazer and bolo tie holding a clipboard, one eyebrow raised, faintly sinister, facing the viewer, full colour" + }, + "clerkdemon": { + "h": 25, + "prompt": "A weary middle aged office demon in a rumpled brown suit and tie with small stubby horns and a lanyard badge, holding a ring binder, resigned expression, facing the viewer, full colour" + }, + "satdish": { + "h": 24, + "prompt": "A large black satellite dish on a domestic roof mount with a faint red glow at its receiver, seen at a slight angle, full colour" + }, + "tvkid": { + "h": 18, + "prompt": "A small boy of about nine in 1980s clothes standing facing the viewer, neat side parting, hands at his sides, wide unblinking smile, lit from below by television light, black and white monochrome grayscale only" + }, + "cartoonmouse": { + "h": 14, + "prompt": "A classic rubber hose style cartoon mouse with white gloves standing facing the viewer holding an oversized mallet behind its back, black and white monochrome grayscale only" + }, + "anvil": { + "h": 12, + "prompt": "A heavy black cartoon anvil with a highlight, sitting on the ground, single object, black and white monochrome grayscale only" + } +} \ No newline at end of file diff --git a/cases/case-12-the-late-movie/sprites/admiral.png b/cases/case-12-the-late-movie/sprites/admiral.png new file mode 100644 index 0000000000000000000000000000000000000000..8f5436a5cc4c1022329cfccf30588a98941f5da8 GIT binary patch literal 1053 zcmV+&1mgRNP)NAP-*<3MX*$V2>Pqi zfDaTZtsp|dN)cPBLQ5&wRtU9;qJ`QN*2IvSo1{(Mwx*liopWSnHmMGr-8*OI%y%B& zIYKFdkO05{g!%Pcm%?xyQcBb(8o0>h2y=rWpuYg2n2gG9f$8uMawU*Vt~UFb*({{v zAzqy}&qE48n`lE~1!BU`&>nhe=O9H_)aoN6v5Exk+Vz(HF6g^TDPvPcv`(rLxt`}0 zvhVId7*3GDs% zj&gm|Biz=xg@W2v3WA{gfXS*d;ED7Dhi;ZQWF0+9kZkMQydwDvxUmhLAobNK|ickF>LTrev*jzfkpx}bNrY#~Pq zgxOPA-4++OO1&loFBZcuU$=s8XR-dNe^9in!_?SuDfJ7UAH(AOBoe6}yt6HCPUmMX zfK&-}9q;4N;RtRQ7OC-7)pg48di0nbKTRB z;pBOoezOUczMKMFlu9-dCPMAX2bY+_!jahc@aECs-5Jz`-$8z|sT)GLm_IVKQaCX% z2nr=|v7njAW(i#~#^Jt(wOV;{|L$^k7#;%8_V?02e-F<5coATMidcZ_3wb=$cP}Eo zi|sFdDjnhct(2-Z3>4D#^|pZxroGm$ZNvVr&S7pLkIj8;Iz1>X7R()DsxA{?iSGi6 z3Z@jXK!O#^&%QXhX88Pssi}4mWJik`1h%QH?ECyQe!eh`e6a|Yj7T)N)Y*|XhF=~X zEw`05mCMtHfLEU1h_3b|eCd?E0Dd?-2EhW)4D>9c+0mmD1A%y5{I^qQE`gZw+-nDI z!T=olb_Ci{t^er2f!9qh5<}`9((A^2u5&|A14>0ZgYI-Ygyz0ri8lrZKU@k>X#a^A zjrDP=h`6Rh#=`4TqgYc$d#aYCbPS7rpPG{_$quU(F@Jd+mXsZpc5GT<=E%~y7Jc?F X6f_m5?FQ*200000NkvXXu0mjfH<0!T literal 0 HcmV?d00001 diff --git a/cases/case-12-the-late-movie/sprites/anvil.png b/cases/case-12-the-late-movie/sprites/anvil.png new file mode 100644 index 0000000000000000000000000000000000000000..694d6e94fff1e14892f1bd9a3b20eb24f924c81f GIT binary patch literal 357 zcmV-r0h<1aP)Z41M;_CL5?yCHF{!I6&YK2nrD5BG6EyNT7%o!382}jshJO2q_z7Y~=auP7s#f z*fZ<5&ohri1q$HwZfB^A|cGF@o9AUKAU_9Qxzq!7>A^>uJaTyw$ zW(enMc<!GSxEbd^OK(vais}Jgv%@dbUsN(1AdkPyhk%fp18o^!W zSPKzk`M8{mDku?A5lfgYsZmzwr%+Q96}C-SEW8S9*@cMm0;05U-e%k?_@HW z=K8OX(YwyU!oQs`PiC`&hwNp751B%(fGK7`#0!1_x~G*TKPWUf00000NkvXXu0mjf D-Eo-t literal 0 HcmV?d00001 diff --git a/cases/case-12-the-late-movie/sprites/archivebox.png b/cases/case-12-the-late-movie/sprites/archivebox.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc4312b3920ed164cc3d0824f674bbded91106e GIT binary patch literal 902 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 O0000a_;P8FWlLknRCB$zVCcz$f=-M z3Ic(N<*g$R0aU{)r_L|@x_II4Zh(&o%fA+^P<-&h!w@0lvX05SMs~vR81TOq=hSW7 zL{T6Nf)mSTc*S7@%!>dEm~)(sH!T@zZ&B}nRamQ3fA3l3X`AYUJFtHJ z96f&jC?*chX{Lhtcc1Yku~p_opz4sj4mx3i_CMc1+<&G&K7M1$a}4r!LE1Zm1bD>`4>+-I*w#;JNoNYJTlXwfCDcfGu3&^twW*+@LKCrFbkq;g3&D_ASSHm8BV{x z7n^Tt_-tEm*?f&}Y}CQX&|XcgpK3^fDx8BM`f_HEJ_gbpqqhx%Cm$Tcq2u#t_Qfz0 zKvFEPrQi@y1*VUF1R}-hum8ZGmoIyhcylbYX5cgjsn93iUc^gpe}?(lX|M($X5BUQ zW?=?Zt-CMY!B^*&3X3sme-a}Zz7s^=cWRK~2(lsTbTBw$+ zCp?g+87rIl*dS1#m7aqCsZfbyhz+ck8@*)>@nZ_e)|&_9`I$X(^2D^LYV*j!Jj!RX3EmdP25TtIE24dFJ%%=)=;yT0-}#9i|P>;o03 z4&3es)5gFTSEjPGl}c>+L`yKY^As;AWxAGT$^a7f{(<*ptl7y));2=R4n= zbD)&M3ri~ipb%i&l|QPJ&eJSm9?x4K%m1HRU|{K6DJ7ACB{>-oA%MRg52bTSX(_$x z>+3KxHI3HGznUzOiTPG;Bob=fo!;J<-|xrMxoIy{CRoX06S*5V@Zf>N{OTCEn!tPa z?~f0UO|t*dAeT4iRRVvW1zSD>g~x$)c@DpC0zY{#Tdf2Epod4t8J&ysQtQvn%LnHU zNlyIcaPnq=-+dmkU{t5scL|KoY+Ys+i_UB@K{md+>335qb{XJBbk;<`U%n80CA5KR zcAsIS=jU44P~Sknu?)BE*vS($wRC&#C8ca^YO*(nKYZq;Gw_pPFr*ET*0uccOqKek!d~-k=pLCn)F$u>EEy zPc?mN^$7&CEThH>aQ(|!3rnJ=?=`J(?do-A2VcSmC*DVW0xEcE5t~yWMWwc7rA= z%FFC8k+L!rZ@!JMFDKTX0!mrFadRW>w>oSIR8{ZeH!a_8HSeXR5tc^EnBhDUfYfk= z!$_nY)CwJ)9nvQxOCk|SDbar8#;S}K553&WckclN(cRTWvu6aR)(}FN^jFR7SriJ> zT!=VlL$R8>|pBOu3-iP&rm4@f{E3O!vtfgfkT?gdSaOAIH~=?*4Pu9oxC2sxvmwER z{6H)M#3;&)yBbxE$EHU;Q{7cl^kNcOCdAZ$cN^xIo67K;f=wf2Q zbd9{17ziLHFj&PfFU27Io|(*$VF(jTT-ZlgdC%DPCD(D_$dF!vDFL$cVkI%JQD7j7A|M3p?d^dbqqosRmW^^qAxFvt zf@3z1_4+MTt5s}mZCg@AiK=%c^Wpuw$2l3YlTv8(U0DJ9k=SLB{L9W64D~e1v={-E zN`mO*=nxlaiW@iUW*En@VbuhaBb*P15DMVa-+#`}hC?=dMlf#z^{D6F!G3KpIQSL$ z;LFdRJbkI`5X6|~9Ybcm`C{|A_kPKm!Z{Z@-HuV->F=P^?G(+0et$=8$ZEab>juSV zd%P5iu~)a&RRVn4?(eE%oJW=Hq5s<5lIMdoIdWD703YAHeszz@S<=1tX2X*_Pp2iF zE0>j#m3h*w8mvgjSo)hJ$(f2pNmUmWCL;Pa#idedHZ!DCZqwmXTLNU{)h5g{85o)9 xb?}oUk%h{F`0T=_(T0BHQK?j9wmfIX{{VjxLcCEB5b*#2002ovPDHLkV1lmRI8guq literal 0 HcmV?d00001 diff --git a/cases/case-12-the-late-movie/sprites/drebin82.png b/cases/case-12-the-late-movie/sprites/drebin82.png new file mode 100644 index 0000000000000000000000000000000000000000..778c777a4cc1bd962394402a42122dec3869a640 GIT binary patch literal 894 zcmV-^1A+XBP)x zMRcr+@swRm zP1S$5Bms^@1jGM^ICSwE&VT#P{Zo_6l9+J#<7cI*c`+^x3}M~7UjoFq@Iwdw&K3~O zqUFWCXsVxut=skzNr(ybq zr4KBe=WLu^dmmHVj&O343M=|6n#CNVD>=2 z^lTC$#mqznZe#+m3O)A1E+^w`&wG{=bE~5|G?Its`|yp1@Q6_~0;sWMx@F5|8XF&V zp0H8<`Hv6{Np<_&(%Oxs4U2K)L_b8?0wAh7KudDohZRyOhW|Xy?8<9!0c*5eCNPq|*N&DCPmGn0O~N+19>oX}fUd_nDs$ z-pFiVD84#)z-`ve+X^EFtDkzJVcMHkQ6#FXgRY(1-R*9CYkixV;u1Udn2;SGw?~x$ zHsY0)RV-gtK9^yV#O}^Z`Kwf%eq1*=i4>TB( Ujm#C1D*ylh07*qoM6N<$f{dZDZvX%Q literal 0 HcmV?d00001 diff --git a/cases/case-12-the-late-movie/sprites/ego.png b/cases/case-12-the-late-movie/sprites/ego.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e3f00681b6f8c082ac9445ecf7eaa1d1be69c6 GIT binary patch literal 709 zcmV;$0y_PPP)X&ns#TjnT0{i-H&nYKT7`c` zR3wrKAz0=(g=I$i?m2PpeUp#5b07DfbG~!F^PLA#fvAV=s)Ca*p2^t!0}&t38jJD& zQ4C+dEkpT!9IK4t@`q)Kr+|tg_3$BD_w1ZFurMG!r)I?a7|nZ+O!T4fU!0gm^Vc6} zJ5fPxX$fG33I)8(ff=x~wTY37v&a_;_}JA05nQwU}F_>cofK{O)~CC!J^QeI$TQ@gz}`Z6(Ph216XI(P;4~= z*azDgk$^TnrIj}UI?))PooFvVKi&X(TVEt_XMY#$lLbCRTjR31TUT`jKm#$s8`s-(H zD)61lHE3@rTtMaHg3^RYVzZ*wKH=f%&}Wlbm>KhO4Zet@kgc6QG7$jnC4xso;V@H? zLZ38%4{|ifNV2)4TC}rtPJ_aOq2C98|B||yC|od3`*kp`pp0oo8Xtq8A;;p?!&V5) rZ3QvWh+31=RMfLlJ6y+rm?ZuIc(-D)jb@6%00000NkvXXu0mjf_wGuK literal 0 HcmV?d00001 diff --git a/cases/case-12-the-late-movie/sprites/gritdetective.png b/cases/case-12-the-late-movie/sprites/gritdetective.png new file mode 100644 index 0000000000000000000000000000000000000000..cbc482779b0e6e5c420661ffd1d60626e6d3d268 GIT binary patch literal 1013 zcmVK?%q3R%$dC{#&hqvH#75n=bV{y z&IqjuRwPzrV`4KkuZ<(%1o6%1Mtdw;Fm=RADKk7sZo!2%j3H>PtqLAkA!9v0{oHP9*MA{c z7Qx`aIfU=sf-@(+myn`}u}8o$0@%KzmtK114Z4+?L$GTf-v8n^JoCX(l$D3zr~oy$ zwHK{Re)%J$u38lXL8Eo;J?QT{D3bdQinsSXi>Aia*u8fzdbajpZf1H7?@jPNwm-Ft zY8$GcT@4K*K!kG_T|D_n4B5pj(&;Jl_oa&%AG?BVHY*(tZ+d11HMJEGQX(7(;Pjax zj9$8c#m?8Tl=Dy%t34_T%hr{;BPKA!f_mwl!V}UghH->^u#n*2+30? zj?2`@B<7}W;>*wav43ZeX?^o6j9wXo_FNtd*nw{V^~shlZ=^wrC_f75!D-Vriew>^&Z zWZGJ8XsWdZ%i(rD*bRpX0>Bg7da)tVhN+oZNGVXrqe zQZ)by+C}>M4cijNs+~5*7?ejNAR?Up`WOV!tY6;-j&k5Q0_4{slNrcsY$Um37alv@ zXWP+|L=nbFaAsJQa@dV;(;%}jUyRAto?nH6L$V;V^4QlH7$O7%K}ab>e!KIe!LKKe zjcGFQ_%wyEeZxdD27y2cPW|{Dh)mwklYo%Gt;MD0hSna^`6ZB-$K?2Vsf3!ZZtT1> zQW0aaWaEB!{3jsoqN=U|kUTBmX&tF+Y{un32khNo(YNvcLcT(l?!uBTII zd#D#m39>|%V*hJ++N-a;tBe%ah%wIcy"@^FaZRJNM>b zVQOMah#hSa4T1xWlUl&URE-K0w5YJkLswWHyUTOm`+wYf&*_|V?|=XQ|L)q@Y0h%~ z|MS21oZtDK@9%vODpZu3t{4eB5+JE;W{Cu?;yLDhkxV=;uGi@JJ8H%8;JSF1h^_`1 z{Wi3Vt4cG96yskN>q{J0o}_$FEu?V5A*YGvYb~`>==iJxfm;qt=|CeckKV?>l$a|6 zrJSJ{yh`@UXiE`M9GnxsvA_;Ls2J(UWxP~?9RCtZ3lLf%P%7YC^BThOU%ZQcHzY`< zP(cChxg_6jK?u>Uw5l_E6e(G7BI%mHa!HApNgW*^mguln!C-ut3eZFuNJYlWXc-X8 zK#G7ULJ@&l1bPtSnEv3pqUIK9#a*G2?;m=9;+B_RU42L2TaRume43hC7oDs}rwS+% z1Wp051Oz zm7Yi74pNQwHYTWI6DtE|P(XHHnVU0zUg~e>UU>BC=345PFGQpyhyj!zkUDY}H!r!P z`@PqN>%=E2nW@zW%luIFrYOOfQDvBq7%KXd%GpJRL!@xDBcyVKtIW3)Qr-T|TmBU# z<9$l7XhXL`IK+Di%a@Qwb0Xl(x9yaTW56qAUc^wY*!rafhw9et!>KnGrmT?>282&< zCukat;|VrAv1#c@>xFg56=o3uq01a;NzEfhhdR3w(vIGH&y{-4{cEY}xQYCjuakK1 z6rxuUauwd1b-c0X;8#C)?VM+Ig(g)33O^W&gb^_AEU;9d%7obA%ngNYC(ed!j*EM~iV-l&cUTLP#_Gsoz zRaehLDoDycjvQ_N#>W9K)L-6(rDYnDGzE?_l>yqu zPGR8uNtkd8s(rg%S3PbKG}MyoIZSxYN9uqX_uYlxo8xbK-r}0-OKfTL3Y$-Qr;Z-j zJHv$E!9x%6DZ_IZZKhNU;q)xI;~tJq5YX+Tgd#LfTWhN^hGKpoi^x==ML>4LKlf^_ z>h$jir#x{R&WH(_CPYib^r!!2=7yF4xYPN-7A+h$N15 zcxLyTOrJB$QZ!kZBPF#}4!vDjKG?U9rPp0YAt5bgv} zrmnu{%<+>`g_J|GAU^w}e|-8rabowHU-hRrQL7LGn$R+=t+y!VO(N-`1DArIqmVsM zZsQi|$YQED9HJ2%a^+NELurWPB=lb|n6Af8n#{9)6YrmEW%=xxknlK{8(=~vLv1F7 zqeEQbSU?WxPNuo_B(-4{`u&hVhmqzbOHyD7hBp< zDUT~sn%Bl3!PmbZ>|5M1a4Hv@GkWPKI&wKY^{ zJQAKHFkA>MFv@^wB`%OcTC*_kLIj~OW+JQ_hrTA?-ivBJ%cPrUp+ZewhZKwl(=LVH zEL5ez6-YLe}q}%L{Fa zv3}No#MbS*xck;snEJy2Ds>#vLrt$!Ac@0?bwB27j?3GB`2eqW^>XO(%}9D^y7vz5 zo+SCxD}CyN0#%+%zaK!ZhSC3)HPMx6^$GG?p@oA|J`%@09FLg z0&DznSB^q+2mbhR)XuF&`ig9CXi5XT56+VBIF0J*Lic6~``bybx|5Zyud)5m;W#xN zlILixYxh6AxNBiU4;Q*7@|})ZNXNqw()tC*Fd!vQJ-d@{fAywV2Q@qP?4}Br>#kWq zRzcd4q+Ex*@j1YghfmNrVGL&vbx_#57mtf5`tbn|7f*VSPEmFJQp=WqCXW;eF8y5w zs$Cm32ZCf&8HAc^cBaUaCMyC$C)&p(oLWkhGFq;YT1I|SK;FtNL@CFDfn&=~bX5jf z2+{chPTs}q)pWh^Gij2|p^n}ajy#^pj3>L`%V=w-0k=(e$taV!nav_B!=U82+xjnY z^XIN3P=PhAjFGI;_=aI?4zOzGWVZjqkI9Uh2)C>zU)RWGTVIQ|)uGMYdJ9L${AV{| zm?IJP)2$AX`ZGb*n8}D_Vz8$2{Sg0RCyn2{8&Ocqomod#RTHWL4dj_zE&0JLiJM3= z|LHdRRDoaDcd~W!Z+I8Yo|U)TFdz~ht@1@${YmT?dl|=CPqS_34jgBL3bm5MQeSIU zN^|zi=_xCgFM0W$W38WZ%WC^_>6`~|a-ojzgc@ZVRp zFeT_>%+wylci$C1fAX0Z?z;1~o8qdzvSf~GbB&+Nr~3v5(vIVL4?Xbxl|Oxa{rb3y zPn3D>VgV3E=Ss#z=7(#w)6+@5pa}Cm%2y-o zv~bwAYd5{VM`q^bkPL8loI;&{lT2bN5*I;|Y~e$sQ%z@hn6a6~v3@&f1smq^w3SZY6^WTS0Y+kX`I+d_kbq%$~GL8)xt!E(&fM>Z=x(? zmO|*{cb-unt*H&KSp4U1-+h0dz2&2q4nOz&js=mYth`omg`*~?7g10HoC^-(|L9Zv zyzyRsdHN!grAw6?$@}d>i0~xG+k3chq#rlwBJH6aLgSVM_%c8S2}BSg`g-si8%Ulw zK}~Zf1|xGaTidFDz#i}-H{Je6-`(`s`p06fw7KXq;F*8MznV~}Oi3JR&TweNkovr& zEJNo;W;FkXW&4_6{@ucj-=3{EyzRB`+jC&zP-?}M4dMz_ld7fpr|l?bA-A5KO}*oh z6b_!$c%}w2tBiXR@Z{0+$S^R)Bw9pa-R^9!vf{CEsP@iBpj*x`?pOhtsOD71b5Rzj z%<-e4alW5K^ux^R|I-4c$u!JUqsN68+K(P?{5V}4m3BMRp;tFhdnNfBzkoJ1oXulY zRN}>X4WY?-jBg4oQpWF??;;?PzcY?gS?Ci5P2$L5_HSOdbjFqQ4rtfu|G)5Gx}u3c z4LE;@e!i!3u^|`V*z^sbqX)-faqNeQO^-cg)|~=!U?aWhD)wWlyvJp+@=E(Ct#!5X z{o2m+?e#Wvm+e#RHYbYvNbg7P`VXf$j*zPQTR$PxCs1#^!oYj)4!N7FY(o>Sq0a=O zsa7~GMw=3hvPt0pomRUna@XI6+tow(&VPiVHh6tp8_Amve^%}=iad-^RgH8E;ydP| z>?-A{0)>MlpUmOZrcE7&Hr}u7I3wN(pb>8>Kf=@LSKNk8zZOQtDuEF4oe#5nzQSWN<#vyixrF_}z83iv;5YKrJlH zUjy)`Iok9g2uiO@rEquT-liV)K7d~UsO$7Oy3l=oMbF!hwSSs>`QmogDX{;q_rQ5$ zQ=`<`XkblkSSqEWo{{5idXXO79~q9+*=u?p;B3pHB1Q@l(aNOsl0Ze_+8nU<<7@Qh zt)Z3g-+rQ@p&pq`2CkA^?*(UyaSWhhyL?ASUS9qXIncB^J2Q)|>^iJHA#aUs2gAzX zO6}^SM#7*pExhGus~4X(#hGyZV5$ThNJ-7gsmg0ESL(ieX+YP+b(EP6qndg7v)ma5 zeN*G{PAo0G;oIwEme`IpyD=~@?-N~Y&~=@BT}V$DoA#LQY}9xDaAp7uu21D%&qRIV>mS>zCEFkmI-({nsfLi{-DsG*jcZQH#ZERBt+k$o}x+mg8tDKko+5a=l|D>2#VHQ<$2{ z9ICbL<;`qXN6by}#y5&{9wO;tdU^&OCpwk~hX&E!){4WiBUHCHtiRS(#s4r>5y1rY z^<4oI9H~?aTiGnab}b_H_1NdS2nl8z1#Mbf{Wt`F69VnI*h3FTAD;={&1(7=93RiW TTR48$00000NkvXXu0mjfZ98}c literal 0 HcmV?d00001 diff --git a/cases/case-12-the-late-movie/sprites/moonqueen.png b/cases/case-12-the-late-movie/sprites/moonqueen.png new file mode 100644 index 0000000000000000000000000000000000000000..49dba02bb03c35f67bacc0fc9457f76cf18b5695 GIT binary patch literal 1100 zcmV-S1he~zP)dd{%P?_hoAZFZC`&wY$*RIpJ(@B@R zd#Lx`-SjmzF;rJ60hlqUq-{&5#H3`Jnwq4%yuFl?no4WZ!Rj&`pje8XFp=s>4S}ox9ynNs=;D_b ze=_z4E!I+06Xk(@#UUQt1(8yW(& z62={)wYHvT?;a?H$!vk_moYUtiQ&N!?9AMOtx3u7E-eSDDl8pcm-x8#$jQk?)~?s! znx28^TSi}BABswfk(Rm*R*MBDLC{iu4uk`E4wC3k@Oa$VykP_0D?5n4#zx`y`4JKE zg7%)w%{@kM@9#KKTf6G$Rkt|drNr^ku`%p>rv#k9!{wTWDEc5tK0JIl3yEYD6c!*g zIR(V?K{NQ!e2yPG1_mBiuKWnIV1eipv2oKTY)wf+Pfrg%I(if~vlZh`CtlCm9iYTi z5>RcEEG9EWzZi?8#01>`=RT}93p`IfSYGzx(d;9bOoDc%%m@~{9eKHXQCV3*Sy?aN zC0UCFtM!svJ{&mW00000Ole?JmF`^!a+1a**}o0nqWA%!cV9-V@wQpJb(ui zvIvnI2Um)n6F9Hju3_=K#IZHyDiL-udxmRb2%&p^1by9M@L7fPEKNaX4>=MEV%eQ*-CDU z=;!S09sG_W5HSV@&SLD!ST{<69JAAp#;a>1ps*wUS9@gvPbooac>at>h z>ksaa%-ovB=H>^87(|^2?YIN0A{m26%gfT=*Yg>y(Uj6s1}QVKAY%n2aIRb&9F(D< zOPCn1Qc%)h^@}XI#H7de$%6pTo<3o6$0RSC0x076#3ZWKt00##JGCWiU5ALkionD% zmX?-80l?}`E*RncySGrU9fZ|aTkHQCw#yJ-r=Ob{#nk2)4<(MfZi$X%B+t8~JyK0Ng-rikSA z&=#C2A@0NlCepnJ8|w|{f~RjS2kg~I6{R$;zf!5UTCKmBq+}Bj-q=_NX>k$I>BLxX zG;sL!&}G)+p6Thu%Hx&QBmQXx#u~&XL2Y4P?kz4#ws+zDIjsuWKm1Y^ zU9*ClQ&V#N#x*$!;x-M$8oYSfkY=+f9@uwPZg+P#F~;U|*F8YiJs*4nbz-rjMAnceO}vHAP6 zx4&m9T8Y%{nojO+Kz zwN|v&Y-<{D+`<_&Nx4ZGd)fznI)h3TEj_>Y_nZqNobN6}E#o*e9wb5ec2FYO9QE~U zh+|4|u7$jLZlCTyW9LxW8!G<6Q+WG|YNG*aq(O-7on745UF^jZ^xbPr7590Y>hU47 ztLssC31plky41gnA^4&YNs^!`>P!3bVSxAE#fqhQm$lBR1SS>=xar4COq>L0!C@#$ zVlxcCe+*gF7FN`0kWVAwcp2=<##JPp3_@7fF7(5cOaNlB>68?bQjCH?6B`|k=ybcW z*O;NEq*+sEPjJsg~&y{?=x(sJqhk#3@}u#*tzdOk@lcLsp2esn$?XHI8^+MARO zrn1DDdVw2#!}!=;fx+S)JZ-56o%c>rUV4~4zIK+`%)e~LKZ1@Y0lf7M-BMvfGA;FR3e~8lc#W->5IKKEt z4bGY53Rs`#C3<^%@NUS5{d;S1pt%7ZwQCRw3xL}&Ir<8-{t-4mHI0(e4fymmh`{MK zOmnX5!tNe*Q^*7c#t6kLY*?NKG&LUsuW4mh54zC)VA!HUe>YmsU6NHrE1@nyumNO3 zC`(9zwYhoZa=GHA_Ih5RU|pfQuVxbwp`;)ibEX3fOfsgbE8+2YA*A3o<(FSrfX!|< zm|B&9dy5;dhJ5(_>!N7qNf>+ymSQ-b0F{`KC8HFw>v1QFNEf|`j}C! zYxs#>uICxob6h1d6b|vkloM=a1^@s6 literal 0 HcmV?d00001 diff --git a/cases/case-12-the-late-movie/sprites/rainlamp.png b/cases/case-12-the-late-movie/sprites/rainlamp.png new file mode 100644 index 0000000000000000000000000000000000000000..77fb437499b77a12d443aa9b0650f4dfc1b6e38f GIT binary patch literal 1222 zcmV;%1UdVOP)6#mZK%d$X;HbT-yu!&+#mX?;#VED69gA|Pgsx>i^s86Q886Hg32NM-FJm`Z2 zHL+CFmj>vMN=0a0TYnM?1qvcAEU-WK&X_YZcdwXuH+S#MoHJ*>bIy0p zkW>;103-mxgK$iC%5sNxUsuO64yY&f#3xqZC4|gz@GYgcqtDG z9HP)zJ`^CJrZ$GcXv7Ev>66phoVEoh;t}BpAXCc?qICJ`|O^LJ4n*{=4ay)@Z zp=+1S`lX3+Gt%)i90=Z$XheUv6cu8Aac)yMG-BS!hIjAU3C|CbzzO6u3dX7=$CLzo zHpT2=RAjs&$3ZURg|2h*_><445U8uIHX%z#j4O9^a?*};Yxdun|h!e%P~si%x!VQvb){W5{8lb0~@{dtUy zo<%CTg!R=VG8-x6vKx@O45XIk;{2_|J^>sj}G(&pj-us*L&ZV zoN?hesA=!Q^3tCuFE2;5;vU?-y$sVAM;Nop=adNPzm`$xI@rEr2hI!)VJeZpzTJC! z1W}JvQqZC9ZYh-EESIOD6i}9nQh$$37_`ZV)vMP4e=E zbGZNEM|A?jy*6S>g=2lDDHLV}@8_4#PbQNX8$N3c@ZuZ2uk{fThgvG7NQH*v|GmEQ z;WI;&)ZezQ!}9Rc&q|*2t4q3ePwlsD9i2U=2TwpsrO2cm)phkc6y^=wV8mR|p=UhG zc{#X3XjTX#Rj7`|{wQ!w+b~9flV5!Hf^dZH3!aySmrWzPv4&h`L-TE5puZ#FIR9)L zv8l0@S5{WG@?Q>jJodypx&Ry(Ma3m3DZK@yTW>?@ty@uCvIR$uJbyB5l|gBkO4OCd zpJ;JWMu_lo2yTV7)GAyzf}h8K$on1JyH8rDHa`|^;Dz2Ggrk^d0Zjwr9IL=RLqao` zKKF&tjHyOOYkv9414ufKK^!_4ayaN~x~pkw1sx&0HMC)FRQ50(ikl1bk_G+oxaj{N zj;qtN^6#|_gv-ezJonYj{Amw(iHyJ1Y1z@ksjtF)}hL*-OI=0E1tj z@(Usbdeen#Q*wDNttE>$X0b3c6M9VwOY?JBym13{4fkSsWdrB0{0>2mu2|Or-iv?8 zM7CEGiEMLIlRjkst}4MdwNn_y=!sI9TuJHxI`&#yoS##7R#oBD@lSE=qodoVu3wK! kzPT09*w}m=gifa8KbW8SxOY+B$^ZZW07*qoM6N<$f@S7HqW}N^ literal 0 HcmV?d00001 diff --git a/cases/case-12-the-late-movie/sprites/salesman.png b/cases/case-12-the-late-movie/sprites/salesman.png new file mode 100644 index 0000000000000000000000000000000000000000..365ffec692e4a819b84cb3753006fc4eb4a51cea GIT binary patch literal 955 zcmV;s14R6ZP)jba@0*77RcxXVza@Z;=lJh6EVgT*_$ zk$v3=@)@f!nJoe%%-6N>untC0mzY4QF;ARoRY0{P@!>_P=wlMtvc!9s9vX=t`vvRbJEjxg>_kp6?uoMe0U zL#{=`4214XYsGebY;O8I83xNqm23lQ{V2wFZ-e>aW9Ou^$|T2j8X&eOn?rT}nJ3-C z&;Q#ww-6GJ9JfEYn?|@ zU)X8dcI4TYpSyPdXchC{ybZeZPvfEEYqwvB1R&C|42nc!oB17=gBlu|<;}(n4i+B3 z!uDGb$BPI~O)n}nS=wt1@;8O23uS!Jy5c!JJ-vuuuMc?s z)kWMw9BQzLzY8IeX4uA;Yf4}rEcmQFkNpo1z&IZ$9NzOt_u7)f#hSh*4Sd^}!wd1a z+oY1wxEUJEnPoZM{JSVD%PrFy?2G!A*ga8qa;ufBelMug7mYa_h{rpRf#pd1lH*l2 z=omz_APOi%g(cr#ohBs_S=XLEdHvX zO&%nU#G8?zjrSXlB)}#{c_z7oRHb->{KZf7Z}E&O5&UKD;OMFvNNFI@sgEM~{>i_v zOecsK?1&Ixs#PZ@fjCcJ&q_;Xjg;c>M#1Hz?z6t$oN*7I+;+<*D;UxH&5=N;g(L8F zF>a(y2%K0>ar^X~tDqa)RR@79b#yZgf&P|=0$hg=Y4fkM9 zWh*B`ZZ>7P+7$qs3PAQ>=k_u&@UrE9fcf%$>$zMRY}j6g~IO#2MNGsa=002&zEY5h)4^AyK2YY9vH9Z0Ld|2!VvyQ&hx)6@Q>o#XkTE z5yS?SRYeeCmnbNRMM0vfXKK4mY$vtHGxIKb@68)K*P8Lnn|IGW=YBj=q96(Y10HeW zmr7oxTm}(9AcSFvB*~b40`$HKBL)P3FZs*O&u*z|wF=MkKpFuC1#@$AcUF$wYZj0v6jY6y}v@B6sW*kj*3w>j-90oeswb}*CM7M_L zarWB6BK>`^kMos^VKfoBNVluDldQ*rUE7N&@6Y{RTzusc)-JC@loHFvGIHUwEHmqR zF$zPZ$>3$f#M$NbtLosd1Drc^2L0m`jN$>#ojprLoabX)!Ys?s>2#n(xBxNJNIYCx zexuaucJU}`q7*!X=~4+7suc_eF_;)hk|2yCJU!`WsZvwAPbkYQh?`80IDP+v4_UwL z{IP>9OVRK5@VMPVnx(S6eeczk)%AaDM)I^z%5iq%#(RpHY~Of{yLW#^JQ$$g@As6* zOwp7s-O6OmF1qspAZ%>BrFy+C^c3yx?V(&guPb3%!tBfsGHw1Osv}4c%+Jr;K@>q4 zHR1bHko-V0J560-z|4~2;#4WyL@uJ1rJd3=9Rp0t;T+^tOR-%k`s37066*k`x_GS0 zR!3X!$>F;`vm(Pl%wBuinb}D_Vg*&4SmQI+C6tNPM<0KJG)-`H)Wv8NV>lS#$O4RH1E1ry{cmw_Q~&?~07*qoM6N<$f^-7L1^@s6 literal 0 HcmV?d00001 diff --git a/cases/case-12-the-late-movie/sprites/tvkid.png b/cases/case-12-the-late-movie/sprites/tvkid.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1fd5e4bc5a06e42eefea56d0ec9db355c38c02 GIT binary patch literal 427 zcmV;c0aX5pP)nN)dN1qTr+f3O7(A%F~^36WalN zIOm;-W^I&RX=XGt@9pdxI45u_Xlys6**p{g;&aY{!HT_|U5RQ{s4DCaVqlTdtc3q%5tDWbz@_zVnu(g`0(&3MWI!4&Pfmi zkQLX-=TrT(`vK=?7ob_5OC=037z`jHL?De@G16g%Qj#S8?M|nI`TR`_rzT9b|LfRFF?SAXF!!Yz3{{w|% VJ%=P)Q1Z?p#srynAV$K9+0h7J)rgb})F|!{1M7FzZ|*h!`9EG=!X=FaI_<^aaJW5Tmd#?# zeBgz&i57W#JZ8nfSl>~D#0a>|GVG7Amw;oyTc8JggHZ=fNKbz5rdI0UQ9f5c?`G$;R~-&#tvY z!(zn*egc<)v%qWMSG?^Ln*&!Ljp#odgx4o(y}ZB4;A5=E5Kjx?MKpQ?=~0*fr|gWc z0@^{Ny0yf>^Db=0s8{fu2G&5P`04E&P177Pc}Lee)gILn;~I_BrD^@&eQe_rYhiV1 zj#3GCliX`PPpg1&ka>k0ga!>Kd3i-Sx-AqH!T}0}p@Yr>B-0F9^}T4^O@(m)LP%Jr z8C(~f0zOQ6=}%Ccl@G=@sx0*J!Tr0v_rC{6O4zTCP~?-nb1!|ImcPKX5agPwCTsuz N002ovPDHLkV1k*%0+Rp$ literal 0 HcmV?d00001 diff --git a/tests/scripts/case-00.jsonl b/tests/scripts/case-00.jsonl new file mode 100644 index 0000000..2d4d17c --- /dev/null +++ b/tests/scripts/case-00.jsonl @@ -0,0 +1,23 @@ +{"cmd":"parse","text":"use patternfile"} +{"cmd":"parse","text":"talk captain"} +{"cmd":"choose","n":3} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use outline"} +{"cmd":"parse","text":"dust strongbox"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use microscope"} +{"cmd":"parse","text":"use incinerator"} +{"cmd":"parse","text":"use typewriter"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use ledger1958"} +{"cmd":"parse","text":"use suspect"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use lockbox"} +{"cmd":"parse","text":"use son"} +{"cmd":"parse","text":"use mirror"} +{"cmd":"query"} diff --git a/tests/scripts/case-00b.jsonl b/tests/scripts/case-00b.jsonl new file mode 100644 index 0000000..0b0d408 --- /dev/null +++ b/tests/scripts/case-00b.jsonl @@ -0,0 +1,27 @@ +{"cmd":"parse","text":"use complaint"} +{"cmd":"parse","text":"talk captain"} +{"cmd":"choose","n":3} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk landlady"} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"parse","text":"use professor"} +{"cmd":"parse","text":"use insideman"} +{"cmd":"parse","text":"use wheelman"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use vaultdoor"} +{"cmd":"parse","text":"use manifest"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use van"} +{"cmd":"parse","text":"use gang"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use newspaper"} +{"cmd":"parse","text":"use typewriter"} +{"cmd":"query"} diff --git a/tests/scripts/case-00c.jsonl b/tests/scripts/case-00c.jsonl new file mode 100644 index 0000000..887dffa --- /dev/null +++ b/tests/scripts/case-00c.jsonl @@ -0,0 +1,22 @@ +{"cmd":"parse","text":"use patternfile"} +{"cmd":"parse","text":"talk captain"} +{"cmd":"choose","n":3} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use dome"} +{"cmd":"parse","text":"use patternmap"} +{"cmd":"parse","text":"use analyst"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"answer shoephone"} +{"cmd":"parse","text":"stand doorway"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use agent"} +{"cmd":"parse","text":"use analyst"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use son"} +{"cmd":"parse","text":"use papers"} +{"cmd":"query"} diff --git a/tests/scripts/case-01.jsonl b/tests/scripts/case-01.jsonl new file mode 100644 index 0000000..a60e3ff --- /dev/null +++ b/tests/scripts/case-01.jsonl @@ -0,0 +1,33 @@ +{"cmd":"parse","text":"take badge"} +{"cmd":"parse","text":"use locker"} +{"cmd":"parse","text":"take revolver"} +{"cmd":"parse","text":"take casefile"} +{"cmd":"parse","text":"look al"} +{"cmd":"parse","text":"talk hocken"} +{"cmd":"choose","n":5} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk johnny"} +{"cmd":"choose","n":3} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"parse","text":"use johnny"} +{"cmd":"parse","text":"use squadcar"} +{"cmd":"goto_room","n":2} +{"cmd":"parse","text":"use body"} +{"cmd":"parse","text":"dust counter"} +{"cmd":"parse","text":"take evidence"} +{"cmd":"goto_room","n":3} +{"cmd":"parse","text":"use microscope"} +{"cmd":"goto_room","n":4} +{"cmd":"parse","text":"use braces"} +{"cmd":"goto_room","n":2} +{"cmd":"parse","text":"talk sally"} +{"cmd":"choose","n":3} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"parse","text":"arrest sally"} +{"cmd":"query"} diff --git a/tests/scripts/case-02.jsonl b/tests/scripts/case-02.jsonl new file mode 100644 index 0000000..18ad8f1 --- /dev/null +++ b/tests/scripts/case-02.jsonl @@ -0,0 +1,32 @@ +{"cmd":"parse","text":"use form"} +{"cmd":"parse","text":"talk hocken"} +{"cmd":"choose","n":4} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use poster"} +{"cmd":"parse","text":"talk trainer"} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk boxer"} +{"cmd":"choose","n":2} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk promoter"} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"parse","text":"use safe"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use heavy"} +{"cmd":"parse","text":"use wife"} +{"cmd":"parse","text":"use promoter"} +{"cmd":"query"} diff --git a/tests/scripts/case-03.jsonl b/tests/scripts/case-03.jsonl new file mode 100644 index 0000000..2d1e108 --- /dev/null +++ b/tests/scripts/case-03.jsonl @@ -0,0 +1,16 @@ +{"cmd":"parse","text":"take casefile"} +{"cmd":"parse","text":"talk hocken"} +{"cmd":"choose","n":2} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use keycutter"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use grocer"} +{"cmd":"parse","text":"use ledger03"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use collector"} +{"cmd":"query"} diff --git a/tests/scripts/case-04.jsonl b/tests/scripts/case-04.jsonl new file mode 100644 index 0000000..c6c557a --- /dev/null +++ b/tests/scripts/case-04.jsonl @@ -0,0 +1,15 @@ +{"cmd":"parse","text":"take orders"} +{"cmd":"parse","text":"talk hocken"} +{"cmd":"choose","n":3} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use clockface"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use citymap"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use orders"} +{"cmd":"parse","text":"use bomb"} +{"cmd":"query"} diff --git a/tests/scripts/case-05.jsonl b/tests/scripts/case-05.jsonl new file mode 100644 index 0000000..ed9e413 --- /dev/null +++ b/tests/scripts/case-05.jsonl @@ -0,0 +1,15 @@ +{"cmd":"parse","text":"take casefile"} +{"cmd":"parse","text":"talk hocken"} +{"cmd":"choose","n":3} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use cake"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use dumbwaiter"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use daughter"} +{"cmd":"parse","text":"use butler"} +{"cmd":"query"} diff --git a/tests/scripts/case-06.jsonl b/tests/scripts/case-06.jsonl new file mode 100644 index 0000000..e8ac88f --- /dev/null +++ b/tests/scripts/case-06.jsonl @@ -0,0 +1,29 @@ +{"cmd":"parse","text":"use chicken"} +{"cmd":"parse","text":"use float"} +{"cmd":"parse","text":"talk hocken"} +{"cmd":"choose","n":4} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use microscope"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk barman"} +{"cmd":"choose","n":2} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"parse","text":"use shotglass"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use book"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk micstand"} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"parse","text":"use evidence"} +{"cmd":"parse","text":"use owner"} +{"cmd":"query"} diff --git a/tests/scripts/case-07.jsonl b/tests/scripts/case-07.jsonl new file mode 100644 index 0000000..ae6073d --- /dev/null +++ b/tests/scripts/case-07.jsonl @@ -0,0 +1,35 @@ +{"cmd":"parse","text":"use summittable"} +{"cmd":"parse","text":"use strongman"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk nordberg"} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"parse","text":"use nordberg"} +{"cmd":"parse","text":"take shipphoto"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk ludwig"} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"parse","text":"talk jane"} +{"cmd":"choose","n":2} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use musket"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use umpire"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use catcher"} +{"cmd":"parse","text":"use homeplate"} +{"cmd":"parse","text":"use catcher"} +{"cmd":"parse","text":"use batter"} +{"cmd":"parse","text":"use slugger"} +{"cmd":"walk_to","x":80,"y":18} +{"cmd":"tick","n":30} +{"cmd":"parse","text":"use ludwig"} +{"cmd":"query"} diff --git a/tests/scripts/case-08.jsonl b/tests/scripts/case-08.jsonl new file mode 100644 index 0000000..66891c5 --- /dev/null +++ b/tests/scripts/case-08.jsonl @@ -0,0 +1,30 @@ +{"cmd":"parse","text":"use piano"} +{"cmd":"parse","text":"talk jane"} +{"cmd":"choose","n":2} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use clockbomb"} +{"cmd":"parse","text":"use blueprint"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk hacker"} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use tank"} +{"cmd":"parse","text":"use meinheimer"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use mariachi"} +{"cmd":"parse","text":"use podium"} +{"cmd":"parse","text":"use hapsburg"} +{"cmd":"parse","text":"use nuke"} +{"cmd":"query"} diff --git a/tests/scripts/case-08b.jsonl b/tests/scripts/case-08b.jsonl new file mode 100644 index 0000000..6f4e428 --- /dev/null +++ b/tests/scripts/case-08b.jsonl @@ -0,0 +1,21 @@ +{"cmd":"parse","text":"use dossier"} +{"cmd":"parse","text":"talk hocken"} +{"cmd":"choose","n":3} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use emptydome"} +{"cmd":"parse","text":"use callingcard"} +{"cmd":"parse","text":"use outline"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use planeseat"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use rostrum"} +{"cmd":"parse","text":"use plinth"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use armour"} +{"cmd":"parse","text":"use fanshawe"} +{"cmd":"query"} diff --git a/tests/scripts/case-09.jsonl b/tests/scripts/case-09.jsonl new file mode 100644 index 0000000..d76be94 --- /dev/null +++ b/tests/scripts/case-09.jsonl @@ -0,0 +1,15 @@ +{"cmd":"parse","text":"talk counsellor"} +{"cmd":"choose","n":3} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use rocco"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use rocco"} +{"cmd":"parse","text":"use envelope"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use envelope"} +{"cmd":"query"} diff --git a/tests/scripts/case-10.jsonl b/tests/scripts/case-10.jsonl new file mode 100644 index 0000000..1016e2b --- /dev/null +++ b/tests/scripts/case-10.jsonl @@ -0,0 +1,35 @@ +{"cmd":"parse","text":"use wig"} +{"cmd":"parse","text":"use robbers"} +{"cmd":"parse","text":"use depositbox"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"talk davis"} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use morguetable"} +{"cmd":"parse","text":"talk beth"} +{"cmd":"choose","n":2} +{"cmd":"choose","n":2} +{"cmd":"choose","n":2} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use crashcar"} +{"cmd":"parse","text":"take matchbook"} +{"cmd":"parse","text":"use laptop"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use bouncer"} +{"cmd":"parse","text":"use cane"} +{"cmd":"parse","text":"use gustafson"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"take earpiece"} +{"cmd":"parse","text":"use ballglobe"} +{"cmd":"parse","text":"look owl"} +{"cmd":"parse","text":"use cane"} +{"cmd":"query"} diff --git a/tests/scripts/case-11.jsonl b/tests/scripts/case-11.jsonl new file mode 100644 index 0000000..00d673d --- /dev/null +++ b/tests/scripts/case-11.jsonl @@ -0,0 +1,25 @@ +{"cmd":"parse","text":"talk davis"} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use archivebox"} +{"cmd":"parse","text":"use oldfile"} +{"cmd":"parse","text":"use ardmore"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use photoframe"} +{"cmd":"parse","text":"use kowalczyk"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use oldhouse"} +{"cmd":"parse","text":"use coopruin"} +{"cmd":"parse","text":"use floorboard"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"look owl"} +{"cmd":"parse","text":"use owl"} +{"cmd":"parse","text":"use terminal"} +{"cmd":"query"} diff --git a/tests/scripts/case-12.jsonl b/tests/scripts/case-12.jsonl new file mode 100644 index 0000000..a9d829e --- /dev/null +++ b/tests/scripts/case-12.jsonl @@ -0,0 +1,27 @@ +{"cmd":"parse","text":"talk salesman"} +{"cmd":"choose","n":3} +{"cmd":"choose","n":1} +{"cmd":"end_dialogue"} +{"cmd":"parse","text":"use salesman"} +{"cmd":"parse","text":"use plotdevice"} +{"cmd":"parse","text":"use tvset"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use crooner"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use jetdeck"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use grandpa"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use suspect"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use grandpa"} +{"cmd":"walk_to","x":152,"y":140} +{"cmd":"tick","n":20} +{"cmd":"parse","text":"use clerkdemon"} +{"cmd":"parse","text":"use moonaerial"} +{"cmd":"query"} diff --git a/tools/verify.sh b/tools/verify.sh new file mode 100755 index 0000000..fdf0b39 --- /dev/null +++ b/tools/verify.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# Replay every case's win path through the headless engine and check it +# reaches max_score and fires `won`. Deterministic: --script disables the AI +# lane, so the same script always produces the same events. +# +# ./tools/verify.sh all cases +# ./tools/verify.sh 07 one +ENGINE="${MRPGI:-$HOME/Documents/MRPGI}" +cd "$(dirname "$0")/.." +MB="$ENGINE/target/debug/mrpgi-headless" +[ -x "$MB" ] || cargo build --manifest-path "$ENGINE/Cargo.toml" -p mrpgi-core --bin mrpgi-headless || exit 1 + +fail=0 +for f in tests/scripts/case-${1:-*}.jsonl; do + n=$(basename "$f" .jsonl | sed 's/^case-//') + dir=$(ls -d cases/case-"$n"-*/ 2>/dev/null | head -1) + [ -n "$dir" ] || { echo " $n NO CASE DIR"; fail=1; continue; } + printf ' %-4s ' "$n" + "$MB" --script "$f" --game "$dir" 2>&1 | python3 -c " +import sys, json +sc = mx = 0; won = False +for l in sys.stdin: + try: e = json.loads(l) + except Exception: continue + if e.get('event') == 'score_changed': mx = e['max'] + if e.get('event') == 'state': sc, won = e['state']['score'], e['state']['won'] +ok = won and sc >= mx +print(('%3d/%-3d won=%-5s %s' % (sc, mx, won, 'ok' if ok else 'FAIL'))) +sys.exit(0 if ok else 1) +" || fail=1 +done +[ $fail -eq 0 ] && echo "all win paths verified" || echo "SOME PATHS FAILED" +exit $fail