Case Twelve: The Late Movie — the finale, and a reproducible win-path suite

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 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-27 13:39:20 +10:00
parent a9e53ccc49
commit 865c7a83a2
53 changed files with 1898 additions and 3 deletions

View File

@ -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 <case>` reads that case's `sprites.json` and generates every
missing sprite on the **MODELBEAST** farm (free, local, m3ultra):

View File

@ -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

View File

@ -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
}
}

View File

@ -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)"
}
]
}

View File

@ -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)"
}
]
}

View File

@ -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)"
}
]
}

View File

@ -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."
}
]
}

View File

@ -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."
}
]
}

View File

@ -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."
}
]
}

View File

@ -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)"
}
]
}

View File

@ -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"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 884 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 900 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 885 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 709 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1013 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 575 B

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

View File

@ -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"}

33
tools/verify.sh Executable file
View File

@ -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