Case Eight — The Smell of Fear (1991). Act II, full colour. Five rooms, 100 points, verified at 100/100 with two verified deaths. The puzzle is identification: Meinheimer has an eidetic memory, so the double cannot be caught out on a fact — he can be caught out on a manner. Ask him two questions and he answers "about four hundred", "roughly", "give or take", and a man who remembers everything never says roughly. The catch is gated on having heard the approximations, so the player has to earn it. Accusing him without that is a death. Also in: the Blue Note, the SWAT tank through the wall into the zoo (which arms the lion that kills Hapsburg two rooms later), the mariachi infiltration, and a nuclear device disarmed by tripping over its power cable. tools/lint.py: three of the four bugs that cost real time here were the same class, and I walked into sets_flag-on-a-takeable twice — once in Case Ten, then again in Case Eight after documenting it. So the rules are a linter now, not a paragraph. It caught two live instances of that trap (case-08 blueprint, case-10 wig) and a scoring mismatch on the first run. All five cases lint clean and all five still win. play.sh is now a case picker: bare invocation lists the cases and asks, or pass a number. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
100 lines
4.4 KiB
Markdown
100 lines
4.4 KiB
Markdown
# Police Squad Quest
|
|
|
|
A Sierra-style adventure game set in the *Police Squad!* / *Naked Gun* universe,
|
|
built on the [MRPGI](https://github.com/) engine (`~/Documents/MRPGI`) — which is
|
|
itself a reimplementation of AGI, the engine Sierra shipped *Police Quest* on.
|
|
|
|
> The game grades you on correct police procedure with a completely straight
|
|
> face. The reward for perfect procedure is catastrophe anyway.
|
|
|
|
- **[RESEARCH.md](RESEARCH.md)** — the source material: all six *Police Squad!*
|
|
episodes, all four films, the recurring cast, and the ZAZ comedy grammar.
|
|
- **[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.
|
|
|
|
## Play
|
|
|
|
```bash
|
|
./play.sh
|
|
```
|
|
|
|
That lists the cases and asks which one. `./play.sh 07` jumps straight to one.
|
|
|
|
Or directly:
|
|
|
|
```bash
|
|
cargo run -p mrpgi --manifest-path ~/Documents/MRPGI/Cargo.toml -- --game cases/case-01-substantial-gift
|
|
```
|
|
|
|
`Tab` switches between play and the room editor. Type `help` in play.
|
|
|
|
## What's here
|
|
|
|
| | |
|
|
|---|---|
|
|
| `cases/case-01-substantial-gift/` | **Case One — playable, 100 points.** Drebin Sr, 1982, monochrome. Five rooms. |
|
|
| `cases/case-07-from-the-files/` | **Case Seven — playable, 100 points.** Drebin Sr, 1988, full colour. Six rooms, the Anaheim Stadium finale. |
|
|
| `cases/case-02-ring-of-fear/` | **Case Two — playable, 100 points.** Drebin Sr, 1982, monochrome. Five rooms, undercover, three deaths. |
|
|
| `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 Sr, 1991, full colour. Five rooms, the memory test. |
|
|
| `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. |
|
|
| `RESEARCH.md` / `DESIGN.md` | Source research and the campaign bible. |
|
|
|
|
## Case One — A Substantial Gift
|
|
|
|
*Police Squad!* episode 1. A credit union manager is dead, the wrong man is in a
|
|
cell, and the teller has new braces.
|
|
|
|
Sign out your badge and sidearm (the door will not let you leave without them),
|
|
get briefed, tip Johnny, dust the counter, match the print, find the bill, and
|
|
Mirandize the suspect **in the correct order**. Get the order wrong and the
|
|
statement is suppressed, which is a Sierra death card, which is the joke.
|
|
|
|
## Case Seven — From the Files
|
|
|
|
*The Naked Gun* (1988). Nordberg is shot on Ludwig's freighter, you tackle a head
|
|
of state at a state reception, and you get fired — which is the only way forward,
|
|
because a private citizen can't walk onto a baseball field but **an umpire can
|
|
walk anywhere**.
|
|
|
|
The climax: you are the home plate umpire at Anaheim Stadium with no power to
|
|
search anyone, so every frisk needs an umpire-legitimate pretext — brush the
|
|
plate, inspect the mitt, check the bat for pine tar — until you reach Number 44.
|
|
Announce yourself as police instead and sixty thousand people come over the
|
|
railings.
|
|
|
|
## Case Ten — The P.L.O.T. Device
|
|
|
|
*The Naked Gun* (2025). Liam Neeson's Frank Drebin Jr. — played **sincere** where
|
|
his father was oblivious. He means everything he says, all the time, and that is
|
|
both the joke and, eventually, the thing that saves the city.
|
|
|
|
Bank cold open (you are the distraction and don't know it) → a suicide that
|
|
isn't → Richard Cane → a New Year's ball drop, a pair of lost trousers, and a
|
|
barn owl in a 1950s hat who is lit by a different decade than everything around
|
|
him.
|
|
|
|
## Regenerating art
|
|
|
|
Sprites are generated locally on MODELBEAST (`flux_local` → `bg_remove_local` →
|
|
downscale). Prompts live in each case's `sprites.json`.
|
|
|
|
```bash
|
|
python3 tools/sprites.py cases/case-01-substantial-gift # fill gaps
|
|
python3 tools/sprites.py cases/case-01-substantial-gift --force # redo all
|
|
MB_POOL=1 python3 tools/sprites.py cases/... # if the farm 401s
|
|
```
|
|
|
|
Seeds derive from the sprite name, so reruns reproduce the same art.
|
|
|
|
## Engine changes
|
|
|
|
Two small, general-purpose additions were made upstream in MRPGI for this
|
|
project — both benefit any game:
|
|
|
|
- `sprites/ego.png` in a game folder replaces the default party robot as the
|
|
player avatar (`ego1.png` optional second walk cel).
|
|
- `death_text` in `game.json` overrides the death banner, which was previously
|
|
hardcoded to another game's flavour text.
|