Act I, monochrome. Five rooms, 100 points, verified end-to-end at 100/100 on the first pass, plus three verified Sierra deaths. Frank goes under as fight manager "Frank Deacon" to break a fight-fixing racket. The procedure gag from the bible finally has teeth: Form 22-B, the four-page application for an authorised cover identity, is filed in Act 1 by a clerk in Sacramento who never learns anything about it — and that form is the only thing standing between Frank and a very short career. At the promoter's licence check the "I'm licensed" reply is gated on having filed it; skip the form and the single visible option is the fatal one. Bureaucracy as the thing that saves you is the exact inversion the campaign is built on. Act I cases now share a sprite set: 18 PNGs copied from case-01, 14 new ones generated. tools/sprites.py skips keys beginning with "_" so sprites.json can carry a note about which sprites are shared. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
96 lines
4.1 KiB
Markdown
96 lines
4.1 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
|
|
```
|
|
|
|
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. |
|
|
| `tools/sprites.py` | Generates every sprite on the MODELBEAST farm (free, local). |
|
|
| `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.
|