policesquadquest/DESIGN.md
type-two 865c7a83a2 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>
2026-07-27 13:39:20 +10:00

717 lines
43 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Police Squad Quest — design bible
A Sierra-style adventure game in the *Police Squad!* / *Naked Gun* universe,
built on [MRPGI](../MRPGI). Source research: [RESEARCH.md](RESEARCH.md).
---
## 1. The joke engine
The premise isn't "a funny adventure game". It's a specific collision:
> **Sierra's *Police Quest* (1987) × ZAZ's *Police Squad!* (1982).**
*Police Quest* was designed by Jim Walls, a real ex-cop, and was famously
**pedantic**: you had to walk around your car and check the tyres, radio in
correctly, draw your weapon *before* firing (or you shot yourself in the leg),
and read the Miranda rights in the right order. Get the procedure wrong → you
die. It is the single most self-serious game Sierra ever shipped.
*Police Squad!* is the same subject matter played as total farce.
**So the game grades you on procedure with a completely straight face, and the
reward for perfect procedure is catastrophe anyway.** That's the machine. It's
mechanical, not just written — the player *performs* the joke rather than
watching it.
Three rules fall out of that:
1. **The game never winks.** All system text is flat police-procedural prose.
Score readouts, death cards, refusals — deadpan. The comedy is what the flat
text is describing. (See RESEARCH.md §4.)
2. **Correct procedure is mandatory and useless.** You *must* do it. It never
helps.
3. **The parser is Frank's brain.** A text parser is a literal-minded machine,
and literalism is ZAZ's core joke. `look` answers take things at face value.
### Worked example — the opening of Case One
```
> take badge
Taken. (+2)
> east
You have not signed for a sidearm. Regulations are regulations.
> take revolver
Taken. (+2)
> east
```
Two points for procedure. Then you get to the crime scene and the body is gone
because Nordberg filed it.
---
## 2. The three Drebins, and the four eras
### Who's who (this is confusing on purpose)
Canon gives us two: Leslie Nielsen's character is plain **Frank Drebin**, and
the 2025 film introduces **Frank Drebin Jr.** (Liam Neeson) as his son — which
retroactively makes Nielsen the father without ever calling him "Sr."
We add a third, one generation further back: **Frank Drebin Sr.**, Nielsen's
father, a homicide detective in 1958. He is ours — no canon to violate — and he
is where the whole thing turns over.
| | Who | When | Register | Palette |
|---|---|---|---|---|
| **Act 0** | **Frank Drebin Sr.** *(ours)* | 1958 | Played entirely straight. No jokes. *M Squad*. | Hard noir mono: **0 / 8 / 15**, minimal grey |
| **Act I** | Frank Drebin (Nielsen) | 1982 TV | Oblivious | Soft mono: **0 / 7 / 8 / 15** |
| **Act II** | Frank Drebin (Nielsen) | 198894 films | Oblivious, blockbuster scale | Full 16-colour EGA |
| **Act III** | Frank Drebin **Jr.** (Neeson) | 2025 | Sincere | Full EGA, cold blues/cyans |
Three men called Frank Drebin, inconsistent suffixes, and if Sr. is the
grandfather then the middle one has no suffix at all, which makes no sense.
Nobody in the family has ever addressed this. It is never explained.
**The palette does the era switch for free.** MRPGI is EGA anyway; each act
simply declines to use colours the next one gets.
### Frank Drebin Sr. — the twist
> **He is the most prolific criminal in the city's history. He is also a
> decorated police detective. He has never once lied about any of it.**
He is not a hypocrite and he is not corrupt in the ordinary way — corruption
requires you to notice. He is a **Drebin**: totally literal, totally sincere,
and entirely without a theory of mind. He robs the payroll. He then investigates
the robbery, diligently, by the book, and files an immaculate report which
states what he did, because the form asks what happened and he answers the form.
Nobody has ever caught him because **nobody reads the reports.** His clearance
rate is the best in the department.
He is the origin of everything downstream:
- **The Gremlin** (from *Police Quest 1*, already running through Case Six) is
him. The chickens on the Captain's desk come from his back yard. Forty years
of low-grade pranks in a police station, never identified, no file ever
opened — the only crime of his that anyone ever noticed, and the one thing he
genuinely did not do on purpose.
- **The paperwork** — Case Two's Form 22-B, the thing that saves his grandson's
life — is a family trait that started as a cover.
- **Nielsen's Drebin never found out.** That's the tragedy under the joke: the
honest one in the middle.
- **Jr. finds out.** Case Eleven, `cases/case-11-what-he-wrote/`**BUILT**.
A records-digitisation project puts sixty-seven years of paper through a
scanner, and Frank Drebin Jr. becomes the first person ever to read one of
his grandfather's reports. They say everything. Sr. never lied; nobody had
looked.
**The palette drifts backwards through the case.** Room 0 is Act III's cold
blue; the basement is nearly all grey; the last rooms are Sr's 1958
monochrome, and 1958 props are generated mono so they read as lit by a
different decade. Ninety-one-year-old Stanley Kowalczyk — the rookie from
Act Zero, who has had his commendation on a wall for sixty-seven years — is
the only warm thing in the case, because he is the last living link.
Under the third floorboard at 1114 Delaware there are **nineteen tins,
19391958, every one full, not one ever opened**, with an inventory on top
headed `PROPERTY — NOT YET SUBMITTED`. He never spent any of it. It was never
for anything.
And Jr. does the only thing a Drebin can do with a true fact: he writes it all
up, eleven pages, every sentence true, and submits it — and the portal thanks
him and asks him to rate his experience. He rates it honestly, at length.
Nobody reads it.
### The mechanic: the score is the cover-up
Act 0 is played completely straight — real hardboiled prose, no gags in the
system text at all. You investigate a payroll robbery and a killing.
Every correct-procedure action quietly destroys the evidence against you, and
**the game awards you points for each one**, because each one is genuinely
correct procedure. Log the prints and the log replaces the prints. Incinerate
the contaminated samples per regulation. Type the report that supersedes the
first responder's notes.
You finish **100/100 for flawless police work.** The score is the confession.
Police Quest's own scoring system, turned over.
### The crossover — why the idiots matter
**Frank Drebin Sr. looks like a genius because the visible criminals are
idiots.** That's his whole career, and he does not arrange it — it just keeps
happening, because incompetent crime is loud and his own is silent.
For the era, Clouseau is the wrong shape twice over: *The Pink Panther* is 1963,
and Clouseau is a bumbling **detective**, not a criminal. The right seam is the
**Ealing comedies*****The Ladykillers*** (1955), five criminals of escalating
incompetence posing as a string quintet in a boarding house, picked off by their
own stupidity while the landlady never notices anything is happening; and ***The
Lavender Hill Mob*** (1951), a meek clerk masterminding a bullion job.
**Archetype parody, never character import** — which is exactly what ZAZ did to
*M Squad*: they took the form, not the people. It's also the better joke, since
the gang can be tuned precisely to make Sr's twist land.
**`cases/case-00b-the-quartet/`** — five rooms, 100 points. A "barbershop
quartet" of five lodgers, none of whom has raised the arithmetic:
| | |
|---|---|
| **The Professor** | Plans are magnificent, forty pages, and have never once worked. Eleven operations, nought for eleven. Blames personnel every time. |
| **The Muscle** | Eighteen stone, gentle, brought for the violence. Nobody has established whether he understands this. Offers you an aniseed ball. |
| **The Wheelman** | Cannot drive. Has never held a licence. Came with the goggles and the goggles were very convincing. |
| **The Safecracker** | The finest hand with a combination lock in the state. Profoundly deaf since 1943. Has been asking about this since August. |
| **The Inside Man** | Genuinely a clerk, genuinely has keys — to the Meridian Street bonded *Warehouse*, a different company on a different street. Has raised it four times. |
**And the twist, which is the whole point:** they tunnel eleven feet through
Victorian brick for eleven weeks to reach a vault Drebin emptied five weeks
earlier — legitimately, on his own written recommendation, signing the transfer
manifest at both ends. They are arrested inside an empty room. The paper calls
it the finest detective work in the city in twenty years, and *every word of it
is true*.
The case is cracked by **Mrs. Enid Pargiter, seventy-nine**, who came into a
police station on a bus to complain about the noise. She never learns what she
did.
### The second crossover — the spy spoof (1965)
**`cases/case-00c-the-liaison/`** — Act Zero closes with the *other* half of that
TV era: the sixties spy spoof, done the same way as the Ealing case — **archetype
parody, never character import**. The shapes of the jokes, all original lines: a
federal bureau whose initials expand differently every time they are asked (and
finally "it doesn't stand for anything"); a shadow organisation that has never
once been photographed, recorded or arrested, *which the Bureau takes as proof of
how good they are*; a secure-conversation dome that is inaudible only to the
people inside it; a telephone in a shoe, which rings at 2 AM in a doorway, and
which Sr answers and takes a message on, in block capitals, with the time; and an
agent who bargains his own conclusions downward under oath — *there is a
mastermind in this city; there is a criminal in this city; there is a city.*
**The plot the timeline hands us for free:** the tins under the floorboard stop
at 1958, so by 1965 the pattern has been silent seven years — and a federal
analyst has finally assembled it. Twenty-four pins on a map (it was twenty-six;
two jobs nobody ever noticed, and Sr does not correct her). The Bureau concludes
saboteurs. The city assigns its best detective as liaison. The pattern is him,
and the case is played entirely straight from inside that fact.
**Margaret Vale is the point of the case.** The Agent-99 archetype turned into
the only person in the whole saga who beats the family trait: she works it out —
attendance, surveys, signatures, one name across nineteen years of paperwork —
and she **writes nothing down.** The Drebins write everything and are never
read; she reads everything, knows, and chooses not to write. Her price is the
truth stays hers. The scene of the case is a shared four-hour watch in the
doorway her model predicted, at the end of which she asks, not looking at him:
"If you had been him, Sergeant. Would you have come tonight?" And he says yes,
because he has never once told anybody anything else.
It also quietly answers Case Eleven's open question: *why did he stop?* The last
tin is dated the month Walter Prosky drew nine to fifteen for the Ardmore job.
Nobody has ever asked him why he stopped, so he has never had to find out.
### The third crossover — the French inspector (1992)
**`cases/case-08b-the-heron/`** — Act II, full colour, slotted between *2½* and
*33⅓*. In §2 above, Clouseau was ruled out of the 1958 era for being a bumbling
*detective* rather than a criminal — which is exactly why the archetype is
perfect for **Nielsen's Drebin**: two detectives on one case, one
oblivious-competent, one confident-catastrophic, each convinced the other is a
genius. Same rule as always: **archetype parody, never character import** — all
original names and lines.
**Inspecteur Gustave Fouchard, Sûreté** — twenty years on one thief, methods
that "continue to be discussed". Introduced disguised as a chalk outline at the
crime scene, drawn around himself, from inside ("ze only way to know what ze
floor knows"). Drebin is the first policeman in eleven countries to notice the
outline breathing, which is how the partnership is founded. The accent runs
through the parser's natural literalism: *ze joules* (Drebin notes the units
are wrong), *ze wetness* (Drebin checks the weather), and every correction is
received with enormous respect: "Zis is what I said."
**Hugo**, his driver, holds standing instructions to attack him without warning
at irregular intervals to maintain readiness, pays his own airfare, and crosses
the Atlantic in an overhead bin. Asking to observe the programme is a Sierra
death.
**The Heron** — a gentleman jewel thief, forty-one jobs in eleven countries,
photographed eleven times, bowing in every photograph, who leaves an engraved
card with nothing on it (he is not telling you who he is; he is telling you he
has a stationer). He is **R. Fanshawe-Root** — cousin of the Quartet's
Professor, the family that plans versus the family that does. The scheme: the
LA theft happened four days before anyone noticed (the velvet's fade ring), and
a paste copy was consigned to Harrogate's *before the Rose left Antwerp* — the
real stone to be swapped in at the moment of sale, laundering it through the
auction house's own catalogue, with the house as unwitting fence.
**The catch is pure Drebin:** no signal, no weapon, mid-bidding on Lot 45 —
"Routine inspection, sir. Would you mind turning out your pockets." And he
does, because in twenty years, through forty-one operations involving a
submarine and a trained cormorant, **nobody has ever simply asked.**
### Drebin Jr's homage (John's original ask)
Neeson's register is *sincerity* where Nielsen's was obliviousness. Jr. isn't
stupid — he's earnest, gravel-voiced, and completely committed to a plan that
makes no sense. Write Jr's `look` text as genuinely moving. Then have it be
about a vending machine. (Built: §8.)
---
## 3. Structure — one folder per case
MRPGI loads any directory with `--game DIR`, so **each mission is a standalone
game folder** under `cases/`. No global room numbering, no hub-state plumbing,
cases can be built in any order and in parallel.
```
cases/case-01-substantial-gift/
game.json manifest: name, start_room, intro, extra verbs, flags, max_score
sprites.json MODELBEAST prompts (input to tools/sprites.py — not read by the engine)
sprites/*.png generated art; ego.png is the player
rooms/room*.json the case
```
`./play.sh` lists cases and runs one. Skipped: a hub world and cross-case save —
add when there are enough cases to want them.
---
## 4. Mechanics — all of it is pure JSON
MRPGI already has every field this design needs. **No engine work.**
| Want | Field | Use |
|------|-------|-----|
| Procedure gate on a doorway | `exit_flags` + `exit_blocked` | "You have not signed for a sidearm." |
| Sierra death | `kills` on object or dialogue choice | The `use_text` is the death card |
| Police Quest scoring | `points` + manifest `max_score` | Points for *procedure*, not progress |
| Evidence that appears once found | `visible_flag` | Dusting reveals the print |
| Things that vanish | `hidden_by_flag` | The body Nordberg files |
| Item locks | `needs`, `consumes` | Warrant, evidence bag |
| Interrogation | `dialogue` + `requires_flag` / `sets_flag` | Miranda rights in order |
Two small engine changes were made upstream in MRPGI, both general-purpose and
useful to any game: a folder can supply **`sprites/ego.png`** to replace the
default party robot (plus optional `ego1.png` for the walk bob), and
**`death_text`** in `game.json` overrides the death banner, which was previously
hardcoded to another game's flavour text. Nothing else was added — every
mechanic below already existed.
### Custom verbs
`game.json` merges extra synonyms into the verb table, and the AI-parser
whitelist is generated from the same table so they can't drift:
```json
"verbs": [
{ "name": "use", "words": ["dust", "cuff", "book", "frisk", "radio", "mirandize", "arrest"] },
{ "name": "look", "words": ["investigate", "detect"] },
{ "name": "talk", "words": ["interrogate", "question"] }
]
```
---
## 5. The campaign
### Act I — Frank Drebin (Nielsen), *Police Squad!* (monochrome)
Six cases, one per episode. **Act I cases share a sprite set** — copy the common
PNGs (ego, hocken, nordberg, al, johnny, olson, badge, revolver, casefile, desk,
phone, coffeepot, filecabinet, squadcar, evidence, shoeshine, body, counter) from
an existing case, then run `tools/sprites.py`, which skips anything already
present and generates only the new props. Each opens with a **special guest star being murdered
in the title card** — a real object in the room whose only purpose is to die.
| # | Case | From | Hook | Procedure gag |
|---|------|------|------|---------------|
| 01 | **A Substantial Gift** | Ep 1 | Credit union manager shot; teller Sally Decker did it for orthodontist money and framed a customer | Sign out badge + sidearm; dust for prints; Mirandize in order — **built, see §6** |
| 02 | **Ring of Fear** | Ep 2 | **BUILT.** Undercover as fight manager Frank Deacon; Buddy Kessler's wife taken to force a dive in the fourth | **The paperwork is what keeps you alive.** File Form 22-B in Act 1 and a clerk in Sacramento makes Frank Deacon real. Skip it and the promoter's licence check leaves you exactly one dialogue option, which is fatal. Three ways to blow the cover, all deaths. |
| 03 | **Rendezvous at Big Gulch** | Ep 3 | **BUILT.** Protection racket on Gulch Street; Police Squad buys a locksmith's as a front | **The racket only shakes down businesses that are doing well** — so to get extorted you must run a genuinely excellent locksmith shop. Frank reads MODERN LOCKSMITHING cover to cover, retains all of it and understands none of it, which turns out to be the correct ratio. |
| 04 | **Revenge and Remorse** | Ep 4 | **BUILT.** Courthouse bombing; Eddie Casales in a cell for standing on the steps | **The manual is wrong and you can prove it in four sentences.** Section 14 ¶9 was written in 1949 for a 1949 timer; this maker files his timing stub twice, which shortens the contact throw and energises the trigger first. Disarm it backwards. Also carries PQ1's Captain-loop (go and see the coroner) and an explicit refusal of PQ3's centre-pixel map bug. |
| 05 | **The Butler Did It** | Ep 5 | **BUILT.** A twelve-year-old vanishes from her own party between the cake and the candles | **Chain of custody on a birthday cake** — weigh it, seal all forty forks, and it comes up eleven pounds light in the tier nobody cuts. And Frank refuses to suspect the butler *because the literature says it is always the butler*, so suspecting him would be quoting rather than investigating. It is the butler. |
| 06 | **Testimony of Evil** | Ep 6 | **BUILT.** Danny Cavanaugh dies mid-act at the Blue Grotto; poison on the rim of his own glass | **The PQ1 whiskey exploit is the intended solution** (see below). Then undercover as a stand-up: six memorised jokes, in order, and improvising is fatal. |
### Act II — Frank Drebin (Nielsen), the films (full colour)
| # | Case | From | Hook |
|---|------|------|------|
| 07 | **From the Files** | *Naked Gun* (1988) | **BUILT — see §7. 140 points, seven rooms.** Opens on the Beirut cold open: four days standing at the back of a summit of the six least popular men on earth with a glass of water, which is where he hears a Los Angeles shipping company named out loud. Nordberg shot on Ludwig's freighter; the Queen's reception; then Anaheim Stadium, where you **umpire a baseball game in order to legally frisk the players**. |
| 08 | **The Smell of Fear** | *Naked Gun 2½* (1991) | **BUILT.** The double gives himself away by being *approximately* right — a man with an eidetic memory never says "roughly". Blue Note, SWAT tank into the zoo, mariachi infiltration, and a nuclear device disarmed by tripping over its power cable. |
| 09 | **The Final Insult** | *33⅓* (1994) | **BUILT.** Retired, bored, in couples counselling. Undercover in Statesville as Nick McGurk; a device in the Best Picture envelope. **The marriage is a gate, not a subplot** — the finale is locked behind actually answering the counsellor's question, and the winning move is to swap the envelope and write in a winner by hand. He picks the one he liked, which Jane calls the most honest thing he has ever done. |
### Act III — Frank Drebin Jr, 2025 (full colour, cold palette)
| # | Case | From | Hook |
|---|------|------|------|
| 10 | **The P.L.O.T. Device** | *Naked Gun* (2025) | **BUILT — see §8.** The whole film in one case: the bank cold open, Simon Davenport's "suicide", Richard Cane, and the New Year's ball drop where **Frank Drebin arrives as an owl**. |
*(Originally planned as two cases; merged into one folder — same film, same cast,
no duplicated sprite set, and the owl payoff lands in the same case as its setup.)*
### Act 0 — 1958 (**BUILT**)
**`cases/case-00-1958/`** — five rooms, 100 points, hard noir mono.
Written completely straight: real hardboiled prose, no gags in the system text
at all. A payroll robbery, a dead night watchman, a widow on a bench.
**The score is the confession.** Every scoring action is correct procedure that
happens to destroy the evidence against you:
| Action | Points | What it actually does |
|---|---|---|
| Dust and lift the latent off the strongbox | +20 | Lifting *removes* the print from the metal. What survives is a card and a log entry, both in your handwriting. |
| Run it against the elimination set | +10 | No match — sworn officers weren't printed until 1961. You write down *why* there's no match, in full. |
| Incinerate the spoiled samples under section 9 | +20 | Witnessed by the rookie, who thanks you for showing him how it's done properly. |
| Type the report | +15 | Four pages, every sentence true, superseding the rookie's handwritten notes. The Captain signs it unread, as he has for eleven years. |
| Arrest the man with the key | +20 | He says he lent it out fifty times. You write that down too. |
**You hit 100/100 in room three.** The final room — the house, the boy, the
chickens, the tin box under the third floorboard — is worth nothing, because
you have already been paid in full for the cover-up.
The boy asks whose print it was. You tell him. He says "Oh," and goes back to
his spellings, because his father has never once lied to him and so there is
nothing here that needs looking at twice.
---
## 6. Case One — as built
**`cases/case-01-substantial-gift/`** — the vertical slice, playable now.
Five rooms, 100 points.
| Room | Place | Contains |
|------|-------|----------|
| 0 | Police Squad HQ, squad room | Hocken (briefing), Nordberg (injured), **Al** (74px — his head leaves the top of the screen and no one comments), your desk, badge, sidearm, case file |
| 1 | The street | Johnny the Snitch's shoeshine stand, the squad car |
| 2 | The credit union | The body, the vault, the teller counter, **Sally Decker** |
| 3 | The crime lab | Ted Olson and the microscope |
| 4 | The orthodontist's | The dental chair, the braces cast, the arrest |
**The chain:** sign out badge + revolver (procedure gate on the HQ exit) → read
the case file → crime scene → dust the counter for prints → take the evidence bag
→ lab: Olson matches the print → the orthodontist's bill names Sally → return and
Mirandize her **in the correct order** (wrong order = she walks and you get a
Sierra death card from Hocken, which is not a real death, which is the joke) →
arrest.
**Running gags wired in as mechanics:**
- **Al** — a 74px sprite in a 168px room. Placed so his head is above the frame.
His `look` text describes only his shoes.
- **Johnny** — `talk johnny` costs a dollar and will answer *anything*. His
dialogue tree has more nodes about orthodontics and macroeconomics than the case.
- **Nordberg** — appears in every room in worse condition. Never mentioned.
- **The guest star** — dies in the title card. `look guest` in room 0 before he
dies, and he's already dead.
- **The freeze-frame ending** — the win text describes the cast holding still
while things audibly keep going wrong.
---
## 7. Case Seven — the umpire problem
**`cases/case-07-from-the-files/`** — Act II, full-colour EGA. Six rooms, 100 points.
Hospital → Ludwig Shipping → the Queen's reception → the officials' room →
home plate → the upper deck.
**The central mechanic: the strike zone is the puzzle.** Drebin has been fired,
so he has no power to search anyone. But a home plate umpire can crouch six
inches from a professional athlete, take his bat off him, and inspect his
equipment — and nobody in a stadium of sixty thousand thinks twice, because
that is simply what umpires do. **So every frisk needs an umpire-legitimate
pretext, in order:**
1. `use homeplate` — brush the plate. The only reason a masked man on his knees
beside an athlete is acceptable. Sets `at_plate`.
2. `use catcher` — inspect the mitt for a foreign substance. Clean.
3. `use batter` — check the bat for pine tar above the legal limit. Clean.
4. `use slugger` — Number 44, who has been staring at the owner's box since the
second inning. A pager taped inside the batting glove.
Skip the pretext and the object simply refuses (`requires_flag`). Announce
yourself as police — a dialogue choice that is right there, and correct, and
what a police officer would do — and sixty thousand people come over the
railings. Sierra death.
**The other inversion:** at the Queen's reception, Ludwig hands a two-hundred-
year-old firearm to the person you are there to protect, and you tackle a head
of state. That is *correct procedure*, it ends your career, and **being fired is
the only way to progress** — a private citizen can't walk onto that field, but
an umpire can walk anywhere.
Also in: Nordberg conducting an entire briefing through a wired jaw; Ludwig
owning two hundred and six ships and one of them being called I LUV LUDWIG;
the anthem lyric sheet; the steamroller, established in Room 5 as scenery an
hour before it is needed.
**Two authoring traps this case caught, worth knowing before writing Case 08:**
- **Object names must not be prefixes of each other.** `ludwigdesk` shadowed
`ludwig`, so `talk ludwig` addressed the furniture. The parser matches
loosely; renaming it to `desk` fixed it.
- **Flag-gated edge exits need walkable floor into the trigger zone.** The north
exit fires at `y ≤ 21`, which was inside the painted stands (a `Wall` band) —
the upper deck was unreachable on foot until a tunnel was carved through it.
Verify every exit by *walking* it, not with `goto_room`.
---
## 8. Case Ten — Drebin Jr, and the owl
**`cases/case-10-plot-device/`** — Act III, cold-palette EGA. Six rooms, 100 points.
Bank → Police Squad → the morgue → Mulholland → Cane's club → the arena.
**The Neeson homage is a register, not a costume.** Nielsen played Drebin
*oblivious* — the joke was that he never noticed. Neeson plays Drebin Jr
**sincere** — he notices everything and means all of it, completely, at all
times. So Jr's text is written straight and often genuinely moving, and the
comedy is the collision with what it's about:
- He gives a *Taken* speech about his particular set of skills. Chief among
them is paperwork.
- He takes four armed robbers in eleven seconds without drawing his weapon,
which is the finest work of his career, and he does it dressed as a
schoolgirl, with his back to the actual crime.
- He tells Beth he's sorry for her loss and **means it**, and that turns out to
be the only useful thing in the room.
- The villain gets the same sincerity back at him from the wrong face:
*"I'm not going to hurt anybody. I'm going to make it quiet."*
**The three-era payoff.** Act I is monochrome, Act III is cold blue. The owl
sprite is generated **monochrome** and placed in a full-colour room, so Frank
Drebin is visibly lit by a different decade than everything around him —
the palette rule from §2 doing the emotional work at the climax. `look owl`
before the finale is the quietest text in the game. `use owl` is two words.
**Also in:** the hot dog cart that has always been in the bank and which he has
never once asked about; the animated paperclip assistant; the trousers, which
he retrieves with enormous dignity because standards are not a thing you keep
only when they are being counted.
**Third authoring trap:** `sets_flag` fires on **use**,
never on **take**`points` does both. A takeable item that was supposed to
set a flag silently didn't, and the gate it fed never opened. Gate on `needs`
(which checks inventory) instead of inventing a flag for "is carrying it".
---
## 9. `tools/lint.py` — the traps, encoded
Three of the four bugs that cost real debugging time in this project were the
same *class* of mistake, and I walked into the `sets_flag`-on-a-takeable one
twice — once in Case Ten, then again in Case Eight after writing it down. So the
rules are now a linter rather than a paragraph:
```bash
python3 tools/lint.py # every case
python3 tools/lint.py cases/... # one
```
It checks, per case:
| Rule | Why it exists |
|---|---|
| Two different objects awarding points for setting the same flag | Points fire on a flag's false→true flip, so whichever runs second silently pays nothing and `max_score` becomes unreachable. Cost 10 points in the crossover before it was caught. (Same object paying via `use` *or* its own dialogue is fine — those are deliberate alternatives.) |
| An object name unreachable because an earlier object shadows it | MRPGI's `obj_matches` is a **bidirectional substring** test over name *and* synonyms, and `match_obj` takes the first hit in array order. `clubbar`'s synonym "bar" swallowed `barman`; `bouncer`'s "door" swallowed `bunkerdoor` (shipped broken in Case Ten until the linter found it). `--warn` also lists benign shared synonyms like "man"/"player". |
| `takeable` + `sets_flag` | `sets_flag` fires on **use**, never on **take** (`points` does both). The flag silently never sets and the gate it feeds never opens. |
| One object name a prefix of another | The parser matches loosely — `ludwigdesk` shadowed `ludwig`, so `talk ludwig` addressed the furniture. |
| Flag required but never set | Catches a typo'd `requires_flag` / `exit_flags` before it becomes an unwinnable case. |
| Exit points at a room that doesn't exist | |
| `exit_flags` set on an edge with no exit | |
| Dialogue `goto` out of range | |
| Sprite referenced but missing from `sprites/` | Otherwise it's a silent magenta box. |
| Authored points **below** `max_score` | The target would be unreachable. (Above is fine — alternative dialogue branches awarding the same latched flag inflate the naive sum.) |
It does **not** check that every exit is walkable — that one still needs a real
playthrough, because it depends on painted `Wall` bands (§7). Walk your exits.
---
## 10. ZAZ's own back catalogue
*Police Squad!* was ZAZ's third thing. The first two are fair game and are
already the same comedy engine, so they go in as texture rather than as cases —
the way a film quotes itself.
**From *Airplane!* (1980)** — Leslie Nielsen's breakout as Dr. Rumack, and the
direct ancestor of Drebin's whole register:
- **"Surely you can't be serious."** Case Five: Mrs. Vane-Ashcombe of the
Pasadena Vane-Ashcombes asks whether Frank really intends to interview all
forty guests. *"Surely I can, madam."* — *"...I don't think you can, and don't
call me Shirley."* He had not called her Shirley. He did not know her name was
Shirley. He writes it down, because it is now the only thing he knows about
her, and it goes in the file.
- **"I picked the wrong week to quit ___"** — Case Eight, escalating one room at
a time across the whole case: drinking (the Blue Note), smoking (the bombed
institute), amphetamines (the warehouse), sniffing glue (the Press Club, in a
mariachi costume, nine minutes from a nuclear device).
- **The drink in the face.** Also Case Eight. Four times over one evening. The
bartender holds out a towel at the exact moment, without looking, because he
has been doing it for nine hours.
**From *Kentucky Fried Movie* (1977)** — ZAZ's first:
- **The news anchor who doesn't know he's on air.** In Case Seven (1988) he is
telling the floor manager what he thinks of his shirt, live to eleven million
homes. In Case Ten (2025) it is the same joke on a bank lobby screen, and
nobody in the gallery tells him, because everybody in the gallery has decided
somebody else will.
- **Feel-A-Round.** Case Nine: the Academy Awards is trialling an immersive
presentation system in which ushers positioned around the auditorium
physically reproduce for the live crowd what is happening on screen. Frank
asks one to move. He cannot — in ninety seconds there is a scene in the Best
Documentary montage involving a horse, and he is the horse.
**And *Airplane!*'s Otto** turns up in Act III, which is where he belongs: after
the cuts, Police Squad partners are supplied by a vendor, and Drebin Jr's is
inflatable, at forty per cent, with nobody able to find the pump. Frank tops him
up by mouth, because you do not leave a partner at forty per cent, and Hocken Jr.
watches all eleven minutes of it without a word because he can see Frank means it.
---
## 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;
a player who has reads them as a love letter. **So we ship them deliberately.**
**Case Six is built entirely out of these.** The 8-bit underflow *is* its
central puzzle, and the Gremlin runs through it and is never resolved.
| Real Police Quest bug | In Police Squad Quest |
|---|---|
| **PQ1's 8-bit underflow** — buy 132 whiskeys until the wallet goes negative, the unsigned counter wraps to 255, and the UI appends a cents `0` to read **$2,550** | **Case Six's central puzzle.** Frank signs for a $40 operational float clipped to a note reading DO NOT EXCEED YOUR FLOAT. The back room costs $2,500. Exceeding the float by one dollar wraps the department ledger's eight-bit field, and Police Squad's accounting system authorises $2,550.00. Played entirely straight; Accounts raise it in March and it goes to a hearing. |
| **PQ1's Gremlin** — a precinct prankster leaving live chickens and mace-soaked paperwork on the Captain's desk, never explained, never resolved | Chickens in the squad room, on Al's shoulder, on the murdered guest star. Nobody in eleven years has said the word "chicken" out loud. The winning freeze-frame includes one. **THE GREMLIN was never identified. No file was ever opened.** |
| **PQ1** — instant death for forgetting your nightstick or running one red light | Every case's optional traps: the sidearm indoors, touching the monarch, the lion. |
| **PQ2's doorframe sight trap** — a silent misalignment that kills you an hour later | Case Six's glass: put on the stool before you go on, and fatal six minutes later if you are thirsty. |
| Keys locked in the car, station doors lock behind you → **softlocked in the parking lot on screen one** | The squad car in Case One: *"The keys are locked inside, on the seat, in plain view, behind your own reflection."* Non-fatal. Nobody mentions it. |
| **Keith**, your partner, slacks off and smokes; driving back to the station makes him go do "paperwork" | **Nordberg.** Casts, traction, cigarette, assigned as your partner, has not stood up. His paperwork is a magazine. |
| Firing without raising the weapon → **you shoot yourself in the foot** | Hocken dialogue: *"Permission to test-fire my sidearm indoors, Captain."**"Granted."* → Sierra death. An optional trap, exactly as Sierra used it. |
| Holding a direction while drawing → **hands and gun detach and float above your head** | Act II gag: a `raise` verb that reports the weapon is now above the ceiling, and stays there for the rest of the case. |
| **"Headless chicken" pathfinding** — NPCs spiral endlessly around obstacles | Al, in Case One, *"continues walking in a tight, rapid circle around the water cooler, as he has all morning."* |
| **Metal detector only checks if you're facing up** — walk diagonally past it | Act III airport screen. The detector is correct and the regulation is correct and you go through diagonally. |
| **Waving a drawn gun at airport security** with no reaction until you cross a specific vector | Same screen. The guard reacts to geometry, not to guns. |
| **Air-walking** — keep the swimming animation on dry land | Act II, after the zoo. Frank swims across the car park. |
| **Levitating into the sky** off a transition | Act III finale — but it's the owl. |
| Typing **`halt`** resets the enemy's shot counter → infinite standoff | `halt` is already a verb in Case One's manifest. In the Act II standoff it works, forever, and the game never acknowledges why. |
| **Infinite score** by re-dusting the ashtray / re-questioning the amnesiac witness | Case One, dusting the counter: *"The department pays out on a lifted print once. You may dust this counter as many times as you like. It has been looked into."* |
The rule: **play the bug straight.** Never nudge the player. The comedy is that
the game is behaving exactly as documented.
---
## 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):
```
flux_local (text→image, 512²) → bg_remove_local (RMBG-2.0 cutout) → Pillow
nearest-neighbour trim+downscale to the sprite's target height
```
Trimming to the alpha bounding box before scaling is what puts the subject's feet
on the bottom edge, which is how MRPGI positions and depth-sorts sprites. The
engine quantizes to EGA itself on load, so the script only owes it a small
transparent PNG.
A shared `STYLE` constant in the script enforces the Sierra look; per-sprite
prompts stay short. Act I prompts end in *"black and white monochrome grayscale
only"* — that one phrase is the whole 1950s era treatment.
```bash
python3 tools/sprites.py cases/case-01-substantial-gift # fill gaps
python3 tools/sprites.py cases/case-01-substantial-gift --force # redo all
python3 tools/sprites.py cases/case-01-substantial-gift --only ego,al
```
Seeds are derived from the sprite name, so a rerun reproduces the same art.
### On LoRAs (tested, negative result)
The farm has ~40 LoRAs, but **none of them currently apply to this pipeline**, and
it's worth writing down why so nobody burns an afternoon on it twice:
- The style LoRAs worth wanting (`style_retro-flux`, `old_timey_v4`) live in
`vendor/comfyui/models/loras/`, which is **not** in `MB_LORA_DIRS` — a bare
name 404s. A full path loads them.
- Loaded that way they are still a **no-op**. They're FLUX.1-dev LoRAs and the
only ungated model is `flux2-klein-4b`, a different architecture. An A/B at a
fixed seed gives three visually identical images (checksums differ by a
hair; nothing you can see). `Iso-Pixel-05` is SD-architecture — same result.
- Using them for real needs either the HF-gated `dev` model, or routing
SD/SDXL LoRAs through the `comfyui_sd` operator instead.
**And it wouldn't help much anyway.** The pixel-art look comes from the
nearest-neighbour crush to ~24px, not from the model — a style LoRA at 512px
is thrown away by the downscale. Plain `flux2-klein-4b` is the right tool here.
Where the farm's bulk capacity *does* pay off is quantity: 48 sprites across two
cases, free, in a few minutes.
**Farm gotcha:** the guest token caps concurrent jobs, and going over returns
`429`/`401` — which reads like an auth failure and isn't. `tools/sprites.py`
retries with backoff; if a whole batch fails, something else of yours is using
the farm. Don't run two clients at once.