From 58471b6a8e74ddd0e2c1cd45f92a09d9b9af5e44 Mon Sep 17 00:00:00 2001 From: type-two Date: Sat, 25 Jul 2026 23:30:26 +1000 Subject: [PATCH] =?UTF-8?q?Act=20Zero=20crossover:=20The=20Quartet=20?= =?UTF-8?q?=E2=80=94=20Drebin=20Sr=20vs.=20the=20Ealing=20incompetents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eight cases playable, all lint clean, all verified end-to-end. John asked what 1950s bumbling criminals Drebin Sr could look good against. Clouseau is the wrong shape twice — 1963, and a bumbling detective rather than a criminal. The right seam is the Ealing comedies: The Ladykillers (1955) and The Lavender Hill Mob (1951). Done as archetype parody, never character import, which is exactly what ZAZ did to M Squad — take the form, not the people — and which lets the gang be tuned to make Sr's twist land. Five lodgers calling themselves a barbershop quartet, and in eleven weeks nobody in that house has raised the arithmetic. A mastermind who is nought for eleven and blames personnel every time. Muscle brought for the violence who offers you an aniseed ball. A driver who cannot drive and came with the goggles. A safecracker who is the best in the state and has been deaf since 1943, and has been asking about that since August. An inside man who works at a different company on a different street and has raised it four times. The twist: they tunnel eleven feet through Victorian brick for eleven weeks to reach a vault Frank Drebin Sr emptied five weeks earlier — legitimately, on his own written recommendation, signing the transfer manifest at both ends. 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. This is why he has never been caught: the visible criminals are loud and his own crimes are silent. The case is actually cracked by a seventy-nine-year-old landlady who took a bus to the police station to complain about the noise, and she never learns it. New lint rule, from a real 10-point loss here: two DIFFERENT objects awarding points for setting the same flag — points fire on the false->true flip, so whichever runs second silently pays nothing and max_score goes unreachable. Same object paying via `use` or its own dialogue is fine; those are alternatives. Co-Authored-By: Claude Opus 5 --- DESIGN.md | 40 ++ README.md | 1 + cases/case-00b-the-quartet/game.json | 20 + cases/case-00b-the-quartet/rooms/room0.json | 280 +++++++++++++ cases/case-00b-the-quartet/rooms/room1.json | 373 ++++++++++++++++++ cases/case-00b-the-quartet/rooms/room2.json | 67 ++++ cases/case-00b-the-quartet/rooms/room3.json | 69 ++++ cases/case-00b-the-quartet/rooms/room4.json | 80 ++++ cases/case-00b-the-quartet/sprites.json | 51 +++ cases/case-00b-the-quartet/sprites/banjo.png | Bin 0 -> 527 bytes .../case-00b-the-quartet/sprites/captain.png | Bin 0 -> 1063 bytes .../case-00b-the-quartet/sprites/casefile.png | Bin 0 -> 310 bytes .../case-00b-the-quartet/sprites/cracker.png | Bin 0 -> 974 bytes cases/case-00b-the-quartet/sprites/crates.png | Bin 0 -> 932 bytes cases/case-00b-the-quartet/sprites/desk.png | Bin 0 -> 686 bytes cases/case-00b-the-quartet/sprites/ego.png | Bin 0 -> 653 bytes .../sprites/insideman.png | Bin 0 -> 663 bytes .../case-00b-the-quartet/sprites/landlady.png | Bin 0 -> 666 bytes .../sprites/ledger1958.png | Bin 0 -> 328 bytes .../case-00b-the-quartet/sprites/lockbox.png | Bin 0 -> 374 bytes cases/case-00b-the-quartet/sprites/muscle.png | Bin 0 -> 1242 bytes cases/case-00b-the-quartet/sprites/parrot.png | Bin 0 -> 359 bytes .../case-00b-the-quartet/sprites/partner.png | Bin 0 -> 651 bytes cases/case-00b-the-quartet/sprites/phone.png | Bin 0 -> 332 bytes cases/case-00b-the-quartet/sprites/plans.png | Bin 0 -> 1162 bytes .../sprites/professor.png | Bin 0 -> 949 bytes .../sprites/streetlamp.png | Bin 0 -> 356 bytes .../sprites/strongbox.png | Bin 0 -> 700 bytes cases/case-00b-the-quartet/sprites/teapot.png | Bin 0 -> 399 bytes .../sprites/typewriter.png | Bin 0 -> 483 bytes cases/case-00b-the-quartet/sprites/van.png | Bin 0 -> 1518 bytes .../sprites/vaultdoor.png | Bin 0 -> 1772 bytes .../case-00b-the-quartet/sprites/wheelman.png | Bin 0 -> 872 bytes cases/case-00b-the-quartet/sprites/widow.png | Bin 0 -> 381 bytes tools/lint.py | 17 + 35 files changed, 998 insertions(+) create mode 100644 cases/case-00b-the-quartet/game.json create mode 100644 cases/case-00b-the-quartet/rooms/room0.json create mode 100644 cases/case-00b-the-quartet/rooms/room1.json create mode 100644 cases/case-00b-the-quartet/rooms/room2.json create mode 100644 cases/case-00b-the-quartet/rooms/room3.json create mode 100644 cases/case-00b-the-quartet/rooms/room4.json create mode 100644 cases/case-00b-the-quartet/sprites.json create mode 100644 cases/case-00b-the-quartet/sprites/banjo.png create mode 100644 cases/case-00b-the-quartet/sprites/captain.png create mode 100644 cases/case-00b-the-quartet/sprites/casefile.png create mode 100644 cases/case-00b-the-quartet/sprites/cracker.png create mode 100644 cases/case-00b-the-quartet/sprites/crates.png create mode 100644 cases/case-00b-the-quartet/sprites/desk.png create mode 100644 cases/case-00b-the-quartet/sprites/ego.png create mode 100644 cases/case-00b-the-quartet/sprites/insideman.png create mode 100644 cases/case-00b-the-quartet/sprites/landlady.png create mode 100644 cases/case-00b-the-quartet/sprites/ledger1958.png create mode 100644 cases/case-00b-the-quartet/sprites/lockbox.png create mode 100644 cases/case-00b-the-quartet/sprites/muscle.png create mode 100644 cases/case-00b-the-quartet/sprites/parrot.png create mode 100644 cases/case-00b-the-quartet/sprites/partner.png create mode 100644 cases/case-00b-the-quartet/sprites/phone.png create mode 100644 cases/case-00b-the-quartet/sprites/plans.png create mode 100644 cases/case-00b-the-quartet/sprites/professor.png create mode 100644 cases/case-00b-the-quartet/sprites/streetlamp.png create mode 100644 cases/case-00b-the-quartet/sprites/strongbox.png create mode 100644 cases/case-00b-the-quartet/sprites/teapot.png create mode 100644 cases/case-00b-the-quartet/sprites/typewriter.png create mode 100644 cases/case-00b-the-quartet/sprites/van.png create mode 100644 cases/case-00b-the-quartet/sprites/vaultdoor.png create mode 100644 cases/case-00b-the-quartet/sprites/wheelman.png create mode 100644 cases/case-00b-the-quartet/sprites/widow.png diff --git a/DESIGN.md b/DESIGN.md index 03ffbe1..efb0437 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -118,6 +118,45 @@ 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. + ### Drebin Jr's homage (John's original ask) Neeson's register is *sincerity* where Nielsen's was obliviousness. Jr. isn't @@ -385,6 +424,7 @@ 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. | diff --git a/README.md b/README.md index 884d8e6..4d146d5 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ cargo run -p mrpgi --manifest-path ~/Documents/MRPGI/Cargo.toml -- --game cases/ | | | |---|---| | `cases/case-00-1958/` | **Act Zero — playable, 100 points.** Frank Drebin **Sr**, 1958, hard noir mono. Five rooms. Played completely straight; the score is the cover-up. | +| `cases/case-00b-the-quartet/` | **Act Zero crossover — playable, 100 points.** Drebin **Sr** vs. five Ealing-comedy incompetents. Five rooms. | | `cases/case-01-substantial-gift/` | **Case One — playable, 100 points.** Drebin (Nielsen), 1982, monochrome. Five rooms. | | `cases/case-06-testimony-of-evil/` | **Case Six — playable, 100 points.** Drebin (Nielsen), 1982, monochrome. Five rooms, the whiskey exploit, four deaths. | | `cases/case-07-from-the-files/` | **Case Seven — playable, 100 points.** Drebin (Nielsen), 1988, full colour. Six rooms, the Anaheim Stadium finale. | diff --git a/cases/case-00b-the-quartet/game.json b/cases/case-00b-the-quartet/game.json new file mode 100644 index 0000000..4f2f022 --- /dev/null +++ b/cases/case-00b-the-quartet/game.json @@ -0,0 +1,20 @@ +{ + "name": "Police Squad Quest — Act Zero: The Quartet", + "start_room": 0, + "max_score": 100, + "intro_text": "November. Somebody is going to rob the Meridian Street Bonded Depository on Saturday night. I know this because five men have been telling everybody in the neighbourhood about it for eleven weeks. My name is Drebin. Detective Sergeant Frank Drebin, Homicide, and this is not a homicide, and I have asked for it anyway. Type 'help'.", + "death_text": "† OFFICER DOWN. The Saturday job goes ahead. The day restarts. †", + "verbs": [ + { "name": "use", "words": ["dust", "log", "book", "file", "type", "process", "seal", "cuff", "arrest", "search", "check", "radio", "inspect", "survey"] }, + { "name": "look", "words": ["investigate", "observe", "examine", "read"] }, + { "name": "talk", "words": ["interrogate", "question", "brief"] } + ], + "flags": { + "tipped_off": false, + "met_gang": false, + "knows_plan": false, + "surveyed": false, + "staked_out": false, + "arrests_made": false + } +} diff --git a/cases/case-00b-the-quartet/rooms/room0.json b/cases/case-00b-the-quartet/rooms/room0.json new file mode 100644 index 0000000..70a729c --- /dev/null +++ b/cases/case-00b-the-quartet/rooms/room0.json @@ -0,0 +1,280 @@ +{ + "name": "Central Division — Detective Bureau", + "enter_text": "November. The radiator has been making the noise since 1955.", + "music": 2, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 8, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 58, + "color": 0, + "meaning": "Wall" + } + }, + { + "Rect": { + "x": 0, + "y": 58, + "w": 160, + "h": 110, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 56, + "w": 160, + "h": 3, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 96, + "y": 10, + "w": 50, + "h": 36, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 100, + "y": 14, + "w": 42, + "h": 28, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 120, + "y": 14, + "w": 2, + "h": 28, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 100, + "y": 27, + "w": 42, + "h": 2, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 12, + "y": 12, + "w": 40, + "h": 32, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 16, + "y": 16, + "w": 32, + "h": 3, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 16, + "y": 23, + "w": 22, + "h": 3, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 16, + "y": 30, + "w": 28, + "h": 3, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 4, + "h": 168, + "color": 0, + "meaning": "Wall" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 30, + 146 + ], + "exits": [ + null, + 1, + null, + null + ], + "exit_flags": [ + "", + "tipped_off", + "", + "" + ], + "exit_blocked": [ + "", + "You have not taken the complaint. Somebody walked in off the street and you take the complaint.", + "", + "" + ], + "objects": [ + { + "name": "desk", + "sprite": "desk", + "x": 52, + "y": 140, + "look": "Your desk. Everything on it has a place and everything on it is in it.", + "synonyms": "table drawer blotter", + "use_text": "You square the blotter and set the lamp straight." + }, + { + "name": "complaint", + "sprite": "casefile", + "x": 66, + "y": 130, + "look": "A complaint sheet, filled in this morning by a Mrs. Enid Pargiter of 14 Meridian Terrace, who came in on the bus. COMPLAINT: Excessive noise from lodgers. Musical. ADDITIONAL: 'They are very nice boys but they are not a barbershop quartet.'", + "synonyms": "sheet form paper report pargiter", + "takeable": false, + "points": 5, + "sets_flag": "read_complaint", + "use_text": "You take the complaint properly: name, address, time, and what she actually said, in her words, in your hand. Then you read it again." + }, + { + "name": "partner", + "sprite": "partner", + "x": 38, + "y": 120, + "look": "Officer Kowalczyk. He has read the complaint four times and he has that look young officers get when they think they have found something and are afraid of being laughed at.", + "synonyms": "kowalczyk officer kid rookie young", + "use_text": "You tell him to say it. He says it.", + "dialogue": [ + { + "says": "Kowalczyk: Sergeant — it's a noise complaint. Vice sent it up to us by mistake. But sir, I read it twice and I want to say something and I don't want you to laugh.", + "choices": [ + { + "text": "I don't laugh, son. Say it.", + "goto": 1 + }, + { + "text": "Say it.", + "goto": 1 + } + ] + }, + { + "says": "Kowalczyk: A barbershop quartet is four men. She's got five lodgers and she calls them the quartet. And she says they rehearse every night and it's the same eleven bars over and over and it isn't music, sir, it's a recording. She can hear the needle. Kowalczyk: Sergeant, that boarding house backs onto the Meridian Street Bonded Depository. The yard wall is the depository's east wall.", + "choices": [ + { + "text": "Five men and a gramophone.", + "goto": 2 + } + ] + }, + { + "says": "Kowalczyk: Yes, sir. Five men, a gramophone, and eleven weeks of digging noises with music over the top of them. Kowalczyk: I'd never have looked at it twice if you hadn't told me the notes were the job.", + "choices": [ + { + "text": "They are the job. Get your coat.", + "goto": -1 + } + ] + } + ] + }, + { + "name": "captain", + "sprite": "captain", + "x": 110, + "y": 128, + "look": "Captain Sturges, reading the noise complaint with the expression of a man who has been handed a noise complaint.", + "synonyms": "sturges boss skipper", + "dialogue": [ + { + "says": "Sturges: Frank, this is a noise complaint. You are a homicide detective. There is no body.", + "choices": [ + { + "text": "There will be a body on Saturday, Captain.", + "goto": 1 + }, + { + "text": "The boarding house backs onto the depository.", + "goto": 1 + }, + { + "text": "I'd like to take it anyway.", + "goto": 2, + "sets_flag": "tipped_off", + "points": 10, + "requires_flag": "read_complaint" + } + ] + }, + { + "says": "Sturges: ...The Meridian Street depository. He puts the sheet down. Sturges: Eleven weeks of digging and a gramophone. Frank, if you're right, that's the third biggest bonded house in the state and there is four million dollars of other people's property in it.", + "choices": [ + { + "text": "I'd like to take it, Captain.", + "goto": 2, + "sets_flag": "tipped_off", + "points": 10, + "requires_flag": "read_complaint" + } + ] + }, + { + "says": "Sturges: Take it. Take whatever you want. Sturges: And Frank — go carefully. Five men who dig for eleven weeks are five men who have thought about being interrupted. You tell him you will go and knock on the door and ask them about the noise. He looks at you for a moment, and then he laughs, because in nineteen years he has never once been able to tell whether you are joking, and he has decided, on balance, that you must be.", + "choices": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/cases/case-00b-the-quartet/rooms/room1.json b/cases/case-00b-the-quartet/rooms/room1.json new file mode 100644 index 0000000..7442dfc --- /dev/null +++ b/cases/case-00b-the-quartet/rooms/room1.json @@ -0,0 +1,373 @@ +{ + "name": "14 Meridian Terrace — The Front Parlour", + "enter_text": "Doilies, a parrot, and five criminals in matching waistcoats who have stopped mid-note.", + "music": 4, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 62, + "color": 15, + "meaning": "Wall" + } + }, + { + "Rect": { + "x": 0, + "y": 14, + "w": 160, + "h": 2, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 60, + "w": 160, + "h": 3, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 63, + "w": 160, + "h": 105, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 10, + "y": 22, + "w": 26, + "h": 30, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 14, + "y": 26, + "w": 18, + "h": 22, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 44, + "y": 24, + "w": 22, + "h": 26, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 48, + "y": 28, + "w": 14, + "h": 18, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 108, + "y": 20, + "w": 44, + "h": 34, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 112, + "y": 24, + "w": 36, + "h": 26, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 128, + "y": 24, + "w": 2, + "h": 26, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 100, + "w": 160, + "h": 1, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 16, + 148 + ], + "exits": [ + null, + 2, + null, + 0 + ], + "exit_flags": [ + "", + "knows_plan", + "", + "" + ], + "exit_blocked": [ + "", + "They have not finished telling you. They are nowhere near finished telling you.", + "", + "" + ], + "objects": [ + { + "name": "teapot", + "sprite": "teapot", + "x": 34, + "y": 112, + "look": "A large flowered teapot under a knitted cosy, on a tray, with six cups. Six. There are five lodgers and one landlady, and a police officer has just arrived, and she has already got the seventh out of the dresser.", + "synonyms": "tea tray cups pot cosy", + "use_text": "You accept a cup, because a man who refuses tea in a front parlour learns nothing and a man who accepts one learns everything." + }, + { + "name": "parrot", + "sprite": "parrot", + "x": 138, + "y": 108, + "look": "A grey parrot in a domed cage by the window. Mrs. Pargiter has had it since her husband died. It says one thing, over and over, in a voice that is clearly the Professor's: 'ELEVEN WEEKS AND NOT ONE STRAIGHT ANSWER.'", + "synonyms": "bird cage polly", + "use_text": "You listen to the parrot for a while. It has learned eleven weeks of that front parlour by heart, and it delivers all of it, at length, in five different voices, and you take out your notebook and write down every word." + }, + { + "name": "banjo", + "sprite": "banjo", + "x": 62, + "y": 116, + "look": "A banjo, a music stand, and four sheets of the same eleven bars. Nobody in this room can read music. Nobody in this room has tuned anything. Behind the stand, badly hidden by the stand, is a gramophone with the lid up.", + "synonyms": "music stand instrument gramophone sheet", + "use_text": "You put the needle down. Eleven bars of a barbershop quartet, recorded in 1949, with a jump in it where the record is worn. It has been playing every evening from seven until ten for eleven weeks, and Mrs. Pargiter has complained about it to the police, in person, on the bus." + }, + { + "name": "landlady", + "sprite": "landlady", + "x": 96, + "y": 118, + "look": "Mrs. Enid Pargiter, four feet eleven, seventy-nine years old, who came into a police station on a bus this morning to complain about the noise and has no idea whatsoever that she is the only reason any of this is going to come out.", + "synonyms": "enid pargiter old lady mrs woman", + "use_text": "You thank her for coming in. She says it was no trouble and that the boys are very nice and that she does wish they would learn a second one.", + "dialogue": [ + { + "says": "Mrs. Pargiter: You'll be the officer about the noise. Sit down, I've made a pot. Mrs. Pargiter: They're lovely boys. Very quiet. Except for the music, which is the same, and the digging, which is constant.", + "choices": [ + { + "text": "The digging, Mrs. Pargiter?", + "goto": 1 + }, + { + "text": "How long have they been here?", + "goto": 2 + }, + { + "text": "How many of them are there?", + "goto": 3 + } + ] + }, + { + "says": "Mrs. Pargiter: In the cellar. Since August. I said, boys, whatever are you doing down there, and the Professor said 'ACOUSTICS', and I said oh, and that was that. Mrs. Pargiter: They've taken out an awful lot of the cellar. I do hope they're putting it back.", + "choices": [ + { + "text": "Where does the cellar go, Mrs. Pargiter?", + "goto": 4 + } + ] + }, + { + "says": "Mrs. Pargiter: Eleven weeks on Thursday. They paid the whole eleven weeks in advance, in coins, in a sack. Mrs. Pargiter: I did think it was a lot of coins.", + "choices": [ + { + "text": "It is a lot of coins.", + "goto": 0 + } + ] + }, + { + "says": "Mrs. Pargiter: Five. Mrs. Pargiter: It's a barbershop quartet. She says it without a flicker. In eleven weeks it has not once come up, in that house, that a quartet is four.", + "choices": [ + { + "text": "Five is a lot for a quartet.", + "goto": 5 + } + ] + }, + { + "says": "Mrs. Pargiter: Well, east, dear. My cellar goes east. East is the wall of the Meridian Street Bonded Depository. It is eleven feet of Victorian brick and behind it is four million dollars of other people's property, and she has just told a homicide detective about it over a cup of tea because he asked.", + "choices": [ + { + "text": "East.", + "goto": 5 + } + ] + }, + { + "says": "Mrs. Pargiter: You'll speak to them about the noise, won't you? Only Thursdays I like the wireless. You tell her you will speak to them.", + "choices": [ + { + "text": "I'll speak to them.", + "goto": -1 + } + ] + } + ] + }, + { + "name": "professor", + "sprite": "professor", + "x": 66, + "y": 138, + "look": "The one they call the Professor. Threadbare tweed, a scarf that reaches the floor, and the specific radiance of a man whose plans are magnificent, elaborate, forty pages long, and have never once worked.", + "synonyms": "prof mastermind scarf tweed", + "points": 20, + "sets_flag": "knows_plan", + "use_text": "You ask the Professor what he does. He tells you. He tells you for nineteen minutes without being asked a second question. He tells you about the cellar, the eleven feet of Victorian brick, the gramophone, the eleven bars, the Saturday night when the depository runs a skeleton watch, the van, the route, the fence in Steelton, and the split — which is five ways, evenly, because he is not a thief, he is an *artist*, and artists share. He draws you a diagram. He gives you the diagram. He asks whether you would like him to go over the timings again. You say you would. He does. (+20)", + "dialogue": [ + { + "says": "The Professor: A policeman! Splendid. Absolutely splendid. We are a barbershop quartet.", + "choices": [ + { + "text": "There are five of you.", + "goto": 1 + }, + { + "text": "Tell me about the cellar.", + "goto": 2 + }, + { + "text": "What do you do, Mr. — ?", + "goto": 3 + } + ] + }, + { + "says": "The Professor: ... He looks along the row. He counts. He counts again. The Professor: Well now.", + "choices": [ + { + "text": "Tell me about the cellar.", + "goto": 2 + } + ] + }, + { + "says": "The Professor: ACOUSTICS. He says it exactly the way the parrot says it. The Professor: We have been improving the acoustics since August. Eastward. Considerably eastward.", + "choices": [ + { + "text": "How far eastward?", + "goto": 4 + } + ] + }, + { + "says": "The Professor: Fanshawe-Root. Cecil. And what I do, officer, is I *plan*. The Professor: I have planned eleven operations in this city and not one of them has come off, and do you know why? Personnel. Every single time. Never the plan. The plan is always immaculate.", + "choices": [ + { + "text": "Tell me about this one.", + "goto": 4 + } + ] + }, + { + "says": "The Professor: Eleven feet, three inches, and we are through the last course tonight. The Professor: Would you like to see the diagram? I've done a diagram. He has done a diagram. It is four feet across, it is pinned to the wall of a rented front parlour, and it is titled in ink: THE MERIDIAN STREET OPERATION — SATURDAY.", + "choices": [ + { + "text": "I would like to see the diagram.", + "goto": -1 + } + ] + } + ] + }, + { + "name": "muscle", + "sprite": "muscle", + "x": 122, + "y": 142, + "look": "Eighteen stone of him in a bowler hat two sizes too small, holding a paper bag of aniseed balls and offering them round. He is the one they brought for the violence. In eleven weeks nobody has established whether he understands this.", + "synonyms": "big heavy bowler large giant", + "use_text": "You ask him what he is here for. He thinks about it for a while, and then he says: 'They said there'd be a van.' He offers you an aniseed ball. You take one. It would have been rude." + }, + { + "name": "cracker", + "sprite": "cracker", + "x": 40, + "y": 132, + "look": "The safecracker. Seventy-one, waistcoat, spectacles, and a brass ear trumpet. He is, by a distance, the finest hand with a combination lock in the state. He has been profoundly deaf since 1943.", + "synonyms": "safecracker old deaf trumpet peterman", + "use_text": "You ask him how he intends to hear the tumblers. He says: 'WHAT?' You say it again, louder. He says 'WHAT?' again, and then, without any change of expression: 'I've been asking them that since August, son. Nobody's answered me yet.'" + }, + { + "name": "wheelman", + "sprite": "wheelman", + "x": 20, + "y": 124, + "look": "The driver. Checked jacket, pencil moustache, goggles pushed up on his forehead, which he has worn indoors for eleven weeks.", + "synonyms": "driver spiv goggles checked", + "use_text": "You ask him where he learned to drive. There is a pause of about four seconds, which is three and a half seconds too long. He says he is 'more of a natural'. He has never held a licence. He has never sat behind a wheel. Nobody has ever asked him, because he came with the goggles and the goggles were very convincing." + }, + { + "name": "insideman", + "sprite": "insideman", + "x": 88, + "y": 148, + "look": "The inside man. Celluloid collar, round spectacles, briefcase held against his chest like a shield. He is genuinely a clerk, and he genuinely has keys.", + "synonyms": "clerk inside briefcase spectacles", + "use_text": "You ask him which floor he works on at the depository. He says, apologetically, that he does not work at the depository. He works at the Meridian Street Bonded *Warehouse*, which is a different company, on a different street, and has been trying to raise this since September. He has raised it four times. Each time the Professor has said 'ACOUSTICS' and moved on." + } + ] +} \ No newline at end of file diff --git a/cases/case-00b-the-quartet/rooms/room2.json b/cases/case-00b-the-quartet/rooms/room2.json new file mode 100644 index 0000000..bb2dc98 --- /dev/null +++ b/cases/case-00b-the-quartet/rooms/room2.json @@ -0,0 +1,67 @@ +{ + "name": "Meridian Street Bonded Depository — Vault Floor", + "enter_text": "Eleven feet of Victorian brick on the east wall, and on the other side of it, five men and a gramophone.", + "music": 2, + "strokes": [ + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 168, "color": 8, "meaning": "Floor" } }, + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 66, "color": 0, "meaning": "Wall" } }, + { "Rect": { "x": 0, "y": 64, "w": 160, "h": 3, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 67, "w": 160, "h": 101, "color": 8, "meaning": "Floor" } }, + { "Rect": { "x": 6, "y": 10, "w": 46, "h": 52, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 10, "y": 14, "w": 38, "h": 44, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 10, "y": 24, "w": 38, "h": 2, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 10, "y": 36, "w": 38, "h": 2, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 10, "y": 48, "w": 38, "h": 2, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 118, "y": 10, "w": 36, "h": 54, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 122, "y": 14, "w": 28, "h": 46, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 104, "w": 160, "h": 1, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 164, "w": 160, "h": 4, "color": 0, "meaning": "Wall" } } + ], + "spawn": [18, 148], + "exits": [null, 3, null, 1], + "exit_flags": ["", "surveyed", "", ""], + "exit_blocked": ["", "You do not set a trap in a building you have not surveyed.", "", ""], + "objects": [ + { + "name": "eastwall", + "sprite": "crates", + "x": 118, + "y": 122, + "look": "The east wall. Eleven feet three inches of Victorian brick, laid in 1888, and behind it the cellar of 14 Meridian Terrace. If you put your hand flat on the third course from the floor you can feel it going, very faintly, all evening, under eleven bars of barbershop.", + "synonyms": "wall brick east bricks course", + "use_text": "You put your hand on the brick and stand there for a minute and a half without moving. It is going. It has been going since August. On the other side of eleven inches of it, an elderly deaf man who cannot hear a tumbler is being handed a chisel by a man in driving goggles who cannot drive." + }, + { + "name": "vaultdoor", + "sprite": "vaultdoor", + "x": 60, + "y": 112, + "look": "The vault. Eighteen inches of hardened steel, a time lock, and a combination held by two officers of the company. You surveyed this building in September at the company's request, wrote nine pages on it, and made one recommendation.", + "synonyms": "vault safe steel door wheel", + "points": 15, + "sets_flag": "vault_checked", + "use_text": "You check the vault against your own survey, item by item, because a survey is worth nothing if the man who wrote it will not stand behind it. Your recommendation in September was that the east wall was the weak face of this building, that eleven feet of 1888 brick is not a wall, and that the bonded contents should be transferred to the Steelton facility pending remedial work. The company accepted it on the 3rd of October. The transfer went out on the 9th, under escort, and you signed the manifest as attending officer, because a bonded transfer requires a sworn officer to attend and you were the officer who wrote the survey. This vault has been empty for five weeks. (+15)" + }, + { + "name": "manifest", + "sprite": "ledger1958", + "x": 100, + "y": 130, + "look": "The transfer manifest, in the vault office, where it has been since the 9th of October. Four million dollars of bonded property, itemised, checked out of this building and into the Steelton facility, countersigned by two company officers and one attending police officer.", + "synonyms": "transfer paper document record countersign", + "requires_flag": "vault_checked", + "points": 15, + "sets_flag": "surveyed", + "use_text": "You read it through. Everything on it is correct. Every item is where the manifest says it is, and the manifest says Steelton, and the Steelton facility's receiving log agrees with it to the item. You were the attending officer. You wrote the survey that caused the transfer, you recommended the date, and you signed for it at both ends, and all of that is on the paper in your own hand, and every word of it is true. Somebody looking at this in thirty years would need to hold the survey, the manifest, the Steelton log and your movements in the same head at the same time, and nobody has ever held two of your documents at once, because there has never been a reason. (+15)" + }, + { + "name": "clerk", + "sprite": "insideman", + "x": 34, + "y": 126, + "look": "The night clerk, who has worked this floor for six years and who is on his own from ten o'clock on a Saturday because the company reduced the watch after the contents went to Steelton.", + "synonyms": "night watch employee staff", + "use_text": "You tell him that on Saturday night he is to be at his sister's in Fullerton and not in this building under any circumstances, and you write it down and give it to him and make him read it back. He is going to be very glad of that piece of paper on Sunday, and he will keep it for forty years, and he will show it to people." + } + ] +} diff --git a/cases/case-00b-the-quartet/rooms/room3.json b/cases/case-00b-the-quartet/rooms/room3.json new file mode 100644 index 0000000..94b07a8 --- /dev/null +++ b/cases/case-00b-the-quartet/rooms/room3.json @@ -0,0 +1,69 @@ +{ + "name": "Meridian Street — Saturday, 11:40 PM", + "enter_text": "Rain. A van at the kerb with its engine running and nobody at the wheel.", + "music": 3, + "strokes": [ + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 168, "color": 8, "meaning": "Floor" } }, + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 52, "color": 0, "meaning": "Wall" } }, + { "Rect": { "x": 8, "y": 6, "w": 40, "h": 44, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 14, "y": 12, "w": 12, "h": 10, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 32, "y": 26, "w": 12, "h": 10, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 112, "y": 6, "w": 42, "h": 44, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 118, "y": 14, "w": 12, "h": 10, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 136, "y": 30, "w": 12, "h": 10, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 50, "w": 160, "h": 3, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 53, "w": 160, "h": 115, "color": 8, "meaning": "Floor" } }, + { "Rect": { "x": 0, "y": 118, "w": 160, "h": 2, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 20, "y": 128, "w": 16, "h": 3, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 60, "y": 128, "w": 16, "h": 3, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 100, "y": 128, "w": 16, "h": 3, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 164, "w": 160, "h": 4, "color": 0, "meaning": "Wall" } } + ], + "spawn": [16, 152], + "exits": [null, 4, null, 2], + "exit_flags": ["", "arrests_made", "", ""], + "exit_blocked": ["", "There are five men in a hole in the ground behind you.", "", ""], + "objects": [ + { + "name": "van", + "sprite": "van", + "x": 122, + "y": 148, + "look": "The van, at the kerb, engine running, nearside door tied shut with rope. It has been there since nine o'clock. Nobody is in it. Nobody has been in it. The driver is in the cellar with the others, because he could not think of a way to say that he could not drive that would not come up later.", + "synonyms": "vehicle lorry truck motor", + "points": 15, + "sets_flag": "van_secured", + "use_text": "You reach in and switch off the engine and take the key, which is in the ignition, which it has been for two and a half hours on a public street in the rain. In the back: five canvas sacks, folded; a crowbar; a Thermos; and a hand-lettered card reading ORDER OF EXIT — 1. PROF 2. THE BOY 3. ARTHUR 4. ME 5. THE BIG FELLA (LAST, WIDTH). (+15)" + }, + { + "name": "streetlamp", + "sprite": "streetlamp", + "x": 76, + "y": 112, + "look": "The corner lamp, and beneath it, from eleven forty until eleven fifty-one, nothing at all happens on Meridian Street. Then a sound comes up through the pavement grating like a wall coming down, which is what it is.", + "synonyms": "lamp light post corner grating", + "use_text": "You stand out of the light, which is where you have stood on every stakeout you have ever run, and you wait, and at eleven fifty-one the east wall of the Meridian Street Bonded Depository comes down into the vault floor with five men behind it." + }, + { + "name": "partner", + "sprite": "partner", + "x": 40, + "y": 140, + "look": "Kowalczyk, in the doorway opposite, soaked through, on his first stakeout, taking notes in the rain.", + "synonyms": "kowalczyk officer kid rookie young", + "use_text": "You tell him: nobody goes in until all five are through the wall and inside, because a man arrested in a hole climbs back down the hole. He writes it down. He will still be doing it that way in 1974, and he will tell people where he got it." + }, + { + "name": "gang", + "sprite": "professor", + "x": 92, + "y": 138, + "look": "Through the grating you can hear them coming through the last course. You can hear all of it. They have not stopped talking since August.", + "synonyms": "quartet men five crew professor prof", + "requires_flag": "van_secured", + "points": 20, + "sets_flag": "arrests_made", + "use_text": "At eleven fifty-one the wall comes down and five men climb through it into an empty vault. You give them four minutes. It takes them all four to accept it. You can hear the Professor going round the walls twice, saying that it is not possible, that the plan is immaculate, that this has never been the plan's fault. At eleven fifty-five you come down the vault stairs on your own with your hat on and you say good evening. Nobody runs. The big fellow offers you an aniseed ball. The old man says 'WHAT?' The driver says he was only there to hold the van, which is true, and which is the most damaging thing anybody says all night. The clerk with the briefcase says, to nobody, that he did try to tell them about the street. You advise all five of their rights in the correct order and in full, twice for the gentleman with the ear trumpet, and you write down the time. (+20)" + } + ] +} diff --git a/cases/case-00b-the-quartet/rooms/room4.json b/cases/case-00b-the-quartet/rooms/room4.json new file mode 100644 index 0000000..fa7d58e --- /dev/null +++ b/cases/case-00b-the-quartet/rooms/room4.json @@ -0,0 +1,80 @@ +{ + "name": "Central Division — Monday Morning", + "enter_text": "Monday. Somebody has put the newspaper on your desk with the front page folded outward, which is not something anybody has ever done before.", + "music": 1, + "strokes": [ + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 168, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 58, "color": 0, "meaning": "Wall" } }, + { "Rect": { "x": 0, "y": 58, "w": 160, "h": 110, "color": 8, "meaning": "Floor" } }, + { "Rect": { "x": 0, "y": 56, "w": 160, "h": 3, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 96, "y": 10, "w": 50, "h": 36, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 100, "y": 14, "w": 42, "h": 28, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 120, "y": 14, "w": 2, "h": 28, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 100, "y": 27, "w": 42, "h": 2, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 12, "y": 12, "w": 44, "h": 34, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 16, "y": 16, "w": 36, "h": 5, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 16, "y": 25, "w": 26, "h": 3, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 16, "y": 32, "w": 32, "h": 3, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 16, "y": 39, "w": 20, "h": 3, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 0, "w": 4, "h": 168, "color": 0, "meaning": "Wall" } }, + { "Rect": { "x": 0, "y": 164, "w": 160, "h": 4, "color": 0, "meaning": "Wall" } } + ], + "spawn": [24, 148], + "exits": [null, null, null, 3], + "objects": [ + { + "name": "newspaper", + "sprite": "casefile", + "x": 60, + "y": 132, + "look": "FIVE HELD IN MERIDIAN ST TUNNEL PLOT — 'FINEST PIECE OF DETECTIVE WORK IN THIS CITY IN TWENTY YEARS,' SAYS CAPTAIN. Column four carries a photograph of the hole. Column five carries the sentence that will follow you for the rest of your career: *Detectives had the premises under survey since September.*", + "synonyms": "paper press news front page headline", + "use_text": "You read it twice. Everything in it is accurate. You had the premises under survey since September. You wrote nine pages. You made one recommendation and the company took it, and four million dollars went to Steelton on the 9th of October under escort, and you signed for it at both ends. There is not one word in this newspaper that is not true." + }, + { + "name": "captain", + "sprite": "captain", + "x": 108, + "y": 126, + "look": "Captain Sturges, holding a commendation form he has already signed, waiting for you to finish reading the paper so he can make a speech he has been working on since Sunday.", + "synonyms": "sturges boss skipper", + "use_text": "He tells you it is the best week's work he has seen in eleven years and that he is putting you up for the commendation and that he has already signed it. He asks whether you would like to read what he wrote. You say no. He laughs, because you always say no.", + "dialogue": [ + { + "says": "Sturges: Frank. Eleven weeks they were in that cellar and nobody in this city looked at it but you. Sturges: A noise complaint. A noise complaint off a seventy-nine-year-old woman on a bus, and you took it, and you took it seriously.", + "choices": [ + { "text": "Mrs. Pargiter did the work, Captain.", "goto": 1 }, + { "text": "It was the rookie's, Captain. He saw it first.", "goto": 2 }, + { "text": "Anybody would have taken it.", "goto": 3 } + ] + }, + { + "says": "Sturges: I'll see she gets a letter. She does get a letter. She frames it. She dies in 1971 with it on the wall, and it is, by a distance, the truest thing anybody says about this case.", + "choices": [{ "text": "She'd like that.", "goto": 4 }] + }, + { + "says": "Sturges: Kowalczyk? Sturges: Frank, he's nine months out of the academy. You tell him the boy read a noise complaint twice and found four million dollars in it, and that it goes in the boy's file in the boy's name. It does. Kowalczyk makes detective in 1962 and never once works out why he was so fast.", + "choices": [{ "text": "Put it in his file, Captain.", "goto": 4 }] + }, + { + "says": "Sturges: No, Frank. They would not. Sturges: Nineteen years I've had you and I have never once had to check your work. Not once. Do you know what that is worth?", + "choices": [{ "text": "It's the job, Captain.", "goto": 4 }] + }, + { + "says": "Sturges: Get out of here. Go home to your boy. On the way out you pass the noticeboard, where somebody has pinned the front page next to the duty roster, and somebody else has drawn a small arrow to column five.", + "choices": [] + } + ] + }, + { + "name": "typewriter", + "sprite": "typewriter", + "x": 34, + "y": 128, + "look": "The bureau typewriter. The Meridian Street report has been in it since eight o'clock. Eleven pages. It is the longest report you have ever filed.", + "synonyms": "machine report paper keys", + "wins": true, + "use_text": "You finish the report. You put in the noise complaint and the bus fare. You put in the gramophone and the eleven bars and the worn place in the record. You put in the parrot. You put in the diagram the Professor gave you and the nineteen minutes he spent explaining it, in full, unprompted, to a police officer he had known for four minutes. And on page nine, under PREMISES — PRIOR KNOWLEDGE, you put in the survey. You put in that you wrote it. You put in the recommendation, and the date the company accepted it, and the transfer on the 9th of October, and that you attended it, and that you signed the manifest at Meridian Street and again at Steelton, and that the vault those five men came through eleven feet of Victorian brick to reach had been empty for five weeks and you were the reason it was empty. Eleven pages. Every sentence in it is true. You sign it and you put it on the Captain's desk. He signs it on Tuesday without reading it. In eleven years there has never been a reason to read one. Five men go to Chino for a robbery in which nothing whatsoever was taken, and one of them keeps saying, all the way through the trial, that the plan was immaculate and that it has never once been the plan. He is right. It never was. You go home. The porch light is on. Your boy is at the kitchen table with his exercise book, and he asks you what you did today, and you tell him all of it, plainly, because you have never in your life told anybody anything else." + } + ] +} diff --git a/cases/case-00b-the-quartet/sprites.json b/cases/case-00b-the-quartet/sprites.json new file mode 100644 index 0000000..070aab1 --- /dev/null +++ b/cases/case-00b-the-quartet/sprites.json @@ -0,0 +1,51 @@ +{ + "_comment": "Act 0 crossover, 1958. Ealing-comedy register: the criminals are shabby, genteel and hopeless, in contrast to the hard noir of case-00. Shared sprites copied from case-00.", + "professor": { + "h": 26, + "prompt": "A shabby genteel 1950s criminal mastermind facing the viewer, threadbare tweed overcoat and a long trailing scarf, wild hair, prominent buck teeth, unhinged delighted smile, black and white monochrome grayscale only" + }, + "muscle": { + "h": 28, + "prompt": "An enormous gentle slow witted 1950s heavyweight facing the viewer, tiny bowler hat on a huge head, straining jacket, holding a small paper bag, kind vacant expression, black and white monochrome grayscale only" + }, + "wheelman": { + "h": 22, + "prompt": "A small anxious 1950s spiv facing the viewer, pencil moustache, loud checked jacket, driving gloves and goggles pushed up on his forehead, black and white monochrome grayscale only" + }, + "cracker": { + "h": 24, + "prompt": "An elderly 1950s safecracker facing the viewer, waistcoat and shirtsleeves, thick spectacles, a large brass ear trumpet held to one ear, black and white monochrome grayscale only" + }, + "insideman": { + "h": 24, + "prompt": "A meek 1950s clerk facing the viewer, ill fitting suit, celluloid collar, round spectacles, clutching a briefcase to his chest, apologetic expression, black and white monochrome grayscale only" + }, + "landlady": { + "h": 22, + "prompt": "A tiny sweet elderly 1950s landlady facing the viewer, floral pinafore over a cardigan, white bun, spectacles on a chain, holding a tea tray, beaming, black and white monochrome grayscale only" + }, + "banjo": { + "h": 16, + "prompt": "A banjo and a music stand with sheet music on it, side by side, seen from the front, black and white monochrome grayscale only" + }, + "plans": { + "h": 24, + "prompt": "A wall covered with an enormous elaborate hand drawn heist diagram, string and pins between pinned notes and photographs, seen straight on, black and white monochrome grayscale only" + }, + "van": { + "h": 22, + "prompt": "A small battered 1950s British delivery van seen from the side, rounded roof, one door tied shut with rope, black and white monochrome grayscale only" + }, + "teapot": { + "h": 11, + "prompt": "A large flowered china teapot with a knitted cosy half on it, single object, black and white monochrome grayscale only" + }, + "vaultdoor": { + "h": 30, + "prompt": "A heavy round steel bank vault door with a spoked handle wheel set in a wall, standing slightly ajar, seen straight on, black and white monochrome grayscale only" + }, + "parrot": { + "h": 13, + "prompt": "A parrot in a domed wire birdcage on a stand, seen from the side, black and white monochrome grayscale only" + } +} diff --git a/cases/case-00b-the-quartet/sprites/banjo.png b/cases/case-00b-the-quartet/sprites/banjo.png new file mode 100644 index 0000000000000000000000000000000000000000..47ee3c82603ae996df5f912a9c15c3713b902c52 GIT binary patch literal 527 zcmV+q0`UEbP)_5dY2WD|u?D_5(DvkPqO+L!n+hc+O$PpNSd9Ina#e0A}&03-tNro@6RrxMnn}5;di&&l^7#p6r}lTJpUL15P)|d z-gi|MBKEg96#p7z)x;_J*3D%Z4$nEYQv7eQ_mq_MWV?g9h-W9~+1KZBkrSb%0mbzWU6Iof!I{_{v14pD1k{a z6~Pi0-XH`@;$$xCYqw=E7&wZ_c)b4W`1mM_?Gu{KCPr0-IE@%hMj-RhEn#3~c|}go zhD@xmWrvo@$W>KMQ3lFJLt1MsguqE-CT}*^GUfT2H4_!wfACNa5BpMeyA1Hz$|Clc?Cvhnh1Sh+<_wkP5JvjJjqDvMyBmfu5CnvBsf4yeZAjiv^8W`>#sPyFgnbqS)HJ0ARApVU?nU*y zefzHd=3t0Ldtey6xqynv{!ua=HUX?B3kQ{#IDcKS-skg6}a=9E$OQHjyren zAd_B1wNk<5E8oHMJRQ5G0x z7cwAh1T`FJeSC)^(I%H{b_wZB8Xb`igb##qxUU}{j-JO)KaOh#mM{W-{P>G+3L%h6 z{;LwIDEeQ0^EFPLepvy@LcxVs@GvuT1F5-rIWv6&=?4q<9A^NwZDC@3oZ+pv&z{d_ zGj#Qb3F?2MpB%>_#~Gr*L5GH(9HNfSc9oXw?K>=ohlh2URc9#Q=NB(hEvRw+?U$Ec zU0TW`p6EiQS_POIe7V_263FLVIWRaVl`tFC4Oph7hiP{9mOOFtBn$`=MQ`=Qz<`rX zChs8{jl%Z>HE3Xr>7&(WTwhl0&J{00F!J0nL(*pZ?^y+^^!jD6OnO7#x;mf@H(itOHRKr!JIAnnj`DA)C!Xm7`Kw zL#0vy1A{QP6sWiQy)b@t;sag4t&`3?>{fn*F=`EmcKmt`_>WkRbwU2dMy<*2t?C%l h6m;Rj$7i?w{{cO6c4nzJAP@im002ovPDHLkV1fls=HdVV literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/casefile.png b/cases/case-00b-the-quartet/sprites/casefile.png new file mode 100644 index 0000000000000000000000000000000000000000..ab82e892d474c80314acce1b6c7b3faf453b3cd4 GIT binary patch literal 310 zcmV-60m=S}P))U3>&E7E38LEs01$;)}SN=o3)FJ`28qp~Tn`I(rOu#J^BTF!9cqSwb;) zZqA&XIde#E9BVkddWjBLN`|>10c4`K*=+dP?GS{;VnMUnVle2xi@SGMtJkH7AgTiH z0+i(qr)Mp+s;cGP{cXr1IP>|Fe0^`}U-s#ocTjVu*Slc)FeRB&meHslEXw*UYD07*qo IM6N<$f*MkZO8@`> literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/cracker.png b/cases/case-00b-the-quartet/sprites/cracker.png new file mode 100644 index 0000000000000000000000000000000000000000..00eb26921f50817a5c3c32e2b708427c407284ed GIT binary patch literal 974 zcmV;<12O!GP)xo*;FxeeOMn>t;FDG~$g9ZsFn1O}KJ-3TMAMi~0F~u>QgIa3GGx z2}kwe625+N3Gcn;iKn~wALni9`wJJZ<#!d))L4%lPdtuvI)!XYR!cXaqPPr(bAPs2 zM;mg6-hSs@vQ~;JIDfcsks2F(+IL_-d24*CTDOYX5u``}7OW+*)>1VLsi&uh&VBtQ z-PhFM6yW&0SSV0+C1j^AF-~z3zx@1b12>-gmx6)T3VV9{V3bDa2zz_?LK}^d&rX9J zIqosYF(n+jwr!C_jWT%uU|#+ zvIB*&&qqE<)k@Em&R`kwVb$gmj5n`ecS`$ezCHv& z%MHPtq%A@Y`FtKW3^6f2j@^absQ1=L)!W+J&u20|HgtBz1*0e;8zsUi^4i(66Srq) zV-yO{kh8g=nRv2HYCk(>Af!#!SgI6ORjfd5A~h(9|qJ%!UryJVNn z2X-ZC`XM(pGJAPCqP<-g0CnaIlj0r76!?wz;-NB{r;07*qoM6N<$f-PakB>(^b literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/crates.png b/cases/case-00b-the-quartet/sprites/crates.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9304de9d92e31111aa7ba60f1c70b5808ac081 GIT binary patch literal 932 zcmV;V16%xwP)!^=5sK7aDn;oz?J3tvx%E(b>>trnl|wGg zHOUPrt&K}*b4gS6mqPFlq7d5{C)i%^%tSNZm`bJeNwYh<^S$rA_syGu5CW%-x%qi{ z`_?z>|A%AxaguS)-38kw&J>>PlrS|lh0XjA%oT#2gr|T1Vwih(UNXkW3Iw1)n4Z=o zdDz*@D!05WIp^|JBF=dyl}^b-EQVYz2O^IB=lkHqkzLBd=i?}DZo;;0jg>^l?t{{< ze|BB|@%x|9i$Tjmu~>wi&6+Y^Jl|Kt$t0lq*nGYKB8J59Fvi9*xcT{wZwHi_vt#QI zAO3=g%s7N_v1r?jDWFg&U^Ja#M8q7&F(lfgRH)bLc>L%QzWnOzPx0RS%QCmTBqQOl zu6r=9eR55OLSePCvZ7Y6Tu}ht46{BxGb6_*#?3sF$w*%$9D$Gf5spT2X<-4yLLN@f zWp}>2V+N;h&Ttmb^bhR^#+8H z_<3s!Zm)-}?JWc7xh|LofBJOCh&nMjiEt>0Ue8tJ1yNdT-L<315%cl!)vMSn77+DQ&R6w`eg`b;VQOS`}U5eV(CqHrd$j(=&DCHqghV{n7kGDPuxqLGS#VC+EtN?KLFSaqjyylZF@0+;h+SoM+D0y>MN|z9RJ^xO)8>hjt$W*LD99 zj&uw3b`}Nzo_IXP1aJdZ_9F_&d>MN*$(@HgnO(7@5yl0nviBkYQnv#zdLnyr$Y^>d z_-1zb8`^^`T8*b*kx!(~su?xVIb+P(|GP<~T5t6g#MF6a<|%J&Z6W`#fJE{%z>JB> zDL9UU*RNjU#K|P?+`fhOjt=Zpckr=T#IxrwkUD>XdwYBF;oW;fgO@X(2KxK1B$KDm zKRAH4)=s3;X$;>S!tl@yw6?WleQgbZi_Ohn7|Gtp^z;*uR)+-;!RJz`ObE z?5y3FzAlC2F)*-Gt=hV1{@;JB<9PQmR4S{+=ECqgh&m#IJLz}R@+{;|{zr?FJxT?MU;ZE^5DBxs!Q+MlYAue0mTO{G%m63Td? z5IqyYo8!L#^|(M3Yj1xhljh)7>ntsl%Ubxx3vKHqAY;&fsgI3u?4W8?rG+o%FR72E U9y{P^z5oCK07*qoM6N<$f+rtOlmGw# literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/ego.png b/cases/case-00b-the-quartet/sprites/ego.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c7ee66a97223d39847951ff85defd9069871e3 GIT binary patch literal 653 zcmV;80&@L{P)5hl0POAU z5m^h}bvT>PVTP!jxIEgLc+ocW<>-j4b!)LT$6CVi@mIQW{U&Lv|DU+EIsK+4imbE# zFq?x{Z=NmVo}-$S6vq*W2tQ9xA*4i{#K^{DG*yj@ww0c2lE$nOahzcGeTI7v?xVY_D>B2x#k|rdjBhEwwh_pSO2+nHL8mK*EdkJgt>n4@3^e8N_i6@(dlquots5pU89>jbyJdO;dk) zhvpgct>#7>vUvOY;2|do(W_mWM?5>5%OD7RXTvi4>;gKfel>U5UoF|{;!d}`N`C+N z;r-LgHS#{6!5024rIebj)g2-xqm%?d+IU|?J(U5XpEi&cxqq?-0-W({^ABRVxj{lm nUaD0E=iHqew{H2`u5PoL&4XsI96fv(JYzqOYTA?01C{gLbA|^FW@#al>wSU3>h5P{z1&{R$JQZu9 z_y??tv?!saA0Sd{)3j-_GcxlgRTpMIW@dM0o_Usn1b|^<!3?2FMYF#V!mD4R)-eZ|MSTZf>F8 zXkfBDiFa=o@cGL(2z9L*CIlSp?~ZAJc02IT?F|domKM*>K4Z13*kmHMa`U*!#Y&Nb z1ZD|P`Rk|$3CL!$`hrO>e7&nzAE#M*@?0!VaN$k?*=!2VIgC9RPglwn_T;S+D`tHB z9y}2;=?rS$H_@mcA(Kvnh%i}xXw|rh`^Asmdk6$C=jU-YK95t`9=v+<8aq2%01-%W z?9HZcwvH8GL206d$Qvdol}e`5E?pWP<|q{rn#}-5guT7r7`;Ao8mgDE1iXkES0# xv7f5bxm=FpIH%TM3X|$Yq$iGJj&nI<`X6GbaIWNpK6n5C002ovPDHLkV1ihKCx8F| literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/landlady.png b/cases/case-00b-the-quartet/sprites/landlady.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca449118d09faeb8c8e4d272b7ae9ff2893022b GIT binary patch literal 666 zcmV;L0%iS)P)q$;#?##L8p6};^B*95x2_i}Kz12E1{M|{8{UDMc zrrsDdU0ai|7yrbdm;qG#wt+YEuTZZwFgyE* zwaZCN&Kq zi90T_+0ZpF&c`M}MCkPd+U-43ZYO4>fBiDA|_5v0Jdg*1v%#oqoX6Zb>}u3jXG9W*Oc`5So(lUxeOZi zr2^DiFg6gt(rvMj9bG5l1bis z$&6SyXbORdq@?ec7!Cs-Hure{_*7xN5cU4H_pvFN0F$c1VsV4ja^=CRx~_dbzlIhC zR8@#(A+k}0a!@8u+ed^4+#Kc(&n_N8018o@5Ka_NFd^M&5iG>v`wLoC6Rz7DG)c`6x(;thGf|SH-0SzbecI;H=!wEG zr1_=AM{BFPEz99w1#lc2d(9@EUtSSK5#HZEu)9;=#LDWjsGAti7}g~ z{OkfsDJUqGZz4u1z;#{N@i+z(fdw+)l&~^gu*Y!>Yc2~+Et>{QAnUJ1WKV9Gxhua@ z>SlyyQl965nH^#>?VZl0t<8 literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/muscle.png b/cases/case-00b-the-quartet/sprites/muscle.png new file mode 100644 index 0000000000000000000000000000000000000000..28615c5738b8b70f95b80c704488ea90a46cb774 GIT binary patch literal 1242 zcmV<01SR{4P)gjll*_1a|=}LUUz+ZfaiHtj^oT7=}U4;v9f|Ko%zVqCv-21y5($)+m7^vamC5Oh{&0x9M#nbJCv4}!PAU`2VWQOiYseh0WQ+aA;%82hI!Nm6q<47 zOh4W|aa=%5>+9=7q^cU5Hr0>;V%E^cUykBcW~WZYg_*}WghC|-Re(>NIFA0)XD~fI zC1Bm%@ikV+=X2=o?L|BhH|_`JwMI`o!RCfpsB1WiL>qIO@#xg#B$~HAE-YXc?4tg6 zX$j$ANX8$YJ9|sHL@eT%GRXB<|IY4q2;>ZtjGqHIm6BCvPUrjb`iX8>BMC6AAMgm>lBv_Lq%V+;#FK z$Gf|^t}e>$`(KjkVWj@~#tqpkZ*yd1g!B14?o3RyU%qtd+nP-^#@XU>*Ksj9HHqfO znpgEP&4}&>T-=-b6~jMWH*3m&=!Gh{DBC)-oDo)Llup@;0kE{<4FZr#rLc3?GwRBfE4vzEF=fh;59ZempJ6Z%6tI=b zE|;&lOqgjq9|{E}zT>ryUsk9TrD>U^)2U|9^YGyB2P+lY$0XdndlxegW{}S_ve|4Q zDYL5N>r@b55zV!>wME$TkjXCNkNdyF^K@VZZ)|K76_pj(zHPhcrAQfjtV*SdDD{$CKcopY9(N;)m&;`{Wd)<-_S?fe?(eeLwp&HFaQ7m07*qoM6N<$ Ef?>vAzW@LL literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/parrot.png b/cases/case-00b-the-quartet/sprites/parrot.png new file mode 100644 index 0000000000000000000000000000000000000000..21cdf45e3ebd1b95f031a033a00fbf8df1e1c790 GIT binary patch literal 359 zcmV-t0hs=YP)sMf5SYfdDJkQz1R&nbv18==vpR<$B>zXYd9%pZ@qm;ou$-=lA z`EFr!&d->wXi6@+U5Aq%00GPhf`Cu646Sw>tJM!~@1{m^wRat;o&Mf*$*)H@$cql;)VnXsr#@+(tfBL5W3pXSw`HhnxE|L@GXwb*hU z)eP-$pu<>E0vQ5nwJJMoHaUu87^Njb(rBPul-n?5{{Vuj#*4wMV)p<5002ovPDHLk FV1nOvnuh=Y literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/partner.png b/cases/case-00b-the-quartet/sprites/partner.png new file mode 100644 index 0000000000000000000000000000000000000000..211e1f9e3d61712e7526e4d62ac14a3ea7b2c124 GIT binary patch literal 651 zcmV;60(AX}P)X1^@s62ynlM0006~NkljiW%xvsQPj_{H{Z)0<*YLvNq91p@Z>_G@m;h$)hwIv%7Y_#qZOiwTIjoS` z-R>#6Kf9Fg08pT^##dsFqA?~1b^u4w2w$C;;F8gP3V!|S#mhl|z@H93bEk96V^PH3 zGqjs)Ll-T}go6;~nj9&B$~~J%`7u{ZTR~EQge33kJhA7pMHa5AQB*P3mSYIy~^ZmSp4Cqb6ATTpY z61@+~rn4MK01*wV-fp)6Hx!N$kt)R`Hc%IW%yR|6xgFBdKrBWop8>O1qfiyk2zv{s zlwH9u8l>G;V-w&qpXc&3A?KkwwAyWuQkFiP!@}Y`965+e*b?f^#W2Ce^DsN}dBW|@ l1ddF{|G$w!<#xgg(?7y^aDCS0S0?}f002ovPDHLkV1hbXEh7K` literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/phone.png b/cases/case-00b-the-quartet/sprites/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..793903edbdf26a14fd628d474e3e1023632db521 GIT binary patch literal 332 zcmV-S0ki&zP)l2RnoOHR+1q~Bo^6hHt# zL=-LZ-1F0gZC&GVJc@{b1{;)R8A#$|vlfHeAj&*fkofxfh8UL?xQ zC>`qOb_-R->~`km2BW(piF7`H*1MwA#mhn;pB`4tX|L_*134J<2O7r_s%pu4v*v5H z#Le~i9;VfrK%1a))lbwU#*+zpy_iDr@gRditG9P|ak$J2H9?oNq?>06iTz;@`oBI~b!u?{0000HiOjG)wXHfgd(SyLGv9nWJ3Fh4 zApi_3TKVrX1qG%3X$6(1l$tcmj;{~w7ZU5Epfwa6$07Rxb*iDEkt*)KYe)dn+>HA7ClXX#R({hkA$^b?3|XOJW9PTyD%2G$Eh1qCXnDH6-q+2p zhVbUTNGAsv=zaUG(_5Z;;(B&|&aVncaJXFKFV`9YWSHpEJn>3*w`HR;Gh(5`{sa4W`MFGI#iSLy^qe#Eigd=ze9xNNYU+EZ-^0;?Bdy6q z;sF4+LL=E$N@KgL>qT1ExSmQ%i>alhg$ASN)(a~MPIG~miM_3j04NZJ+WV@f2QNi8 zlA$vhuEX25JQ~pa(BR zzXfo{aWp!1cJP(qt4J9Gml=^r1VcX$p|Bv|LTIJO#YZbWBcK*gIWronKs!o%dHMO| zrDndfoHZT<`KR%AJb}+XK4R6N_rl3Bxa^OIf=sHKqO)}Butb9J9j>c!h%A$I)gnj82#-=vxdrx zPfgVkbD7}pY;Rwxi77`4G?~1O_xlb$lAW8c*%mEh`}XJLxDWZq*O$u56-XHm%F*m< zS6H54VEXJgXIJ~7B_BF$8I029<-?C{Y2D0V$-85>KmpIUx5Lp69M^@`8p}({pctsB zS!?@--FgC=nm2w>U3dQ%(epn%WAhJSRc!QTb5Hk6A8M$PaLLk~_P)Mvgo&UOz@8Tt z4vu|!^7OifhC|{_OyyDn^4qjw(?hYb$v4JFh7ZHd${zdl=s-Py5vh*!hLcRC0zPv` zJe4RkX7&VzLv&AX-Acb)jz(~6ES4jM&CHo|foF|(>}a=uoiB7!Rn@&Td!*;vhx2+# z>9RP3#~7T{L1UjUN~&Xtq`jhI<==fe=*SCL2mL;MVj)9FTD;Vs0$5*PZxiw_cZe1D zKlD}v#MO@7M78*`=E(oDVyO(R(A#^^vY!pNfNd}q1?DtI+vNxt8;u1W&;ORaO@|ks zFrAAtPII!yAh7J|*`4O)-`E@sKUhF%{uN__K5MTrs;{e)QkxOIbUB%8sIMb?!~A2A cefn5`0W%sQ^k3!8R{#J207*qoM6N<$g3$gkUH||9 literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/professor.png b/cases/case-00b-the-quartet/sprites/professor.png new file mode 100644 index 0000000000000000000000000000000000000000..de2e91bb599b18e3627664e8c3d7f570faba5e33 GIT binary patch literal 949 zcmV;m14{gfP)?YO6LjLYaX$%?%CU%GqlbSPI7PVo!M)zz1Lp* z!We_PiwOYijhgOC6p0DOP+g3$x8*~C%%-zpB&y(f3gv4hG&VJ1e0*G@_S9yG2(i$X zZKs8WMbcqNl}bq2OqL?br&=~un_%tw4e_a|2~1s`MnmilOke#Cm!~fyoz6f2;M+09 zV-57px8IRwCT1evQ?&J|t**b?xOx#xRfKEhc^Vn{ftHq*9Dr^Sq7I;$(eu{ZRH@vc zKx={kz1iJEpB+B@Ol?n26(I%o?(Ly;DoOEJ4AJOn96fp*$BrGxrcIAy?DXl8FNTK+ z(sqU_$R2|bJ9g~Es%Qiq9UWr#u2)4Sof5IwYUFY`?B4Y{h}fa3Ob~b9)7*k1pC3UO z8gcf_8N?$V4h{@i&4f*Kp#LCz&vQ+?;SPN|M3oyAOiWB7bALv7LgCV{zu>1I$1pl} z3iEUGT==u#2EJ!cUOJ|^@^u(uNFh-Adlrz4a;b#g4|*|Io`dbPP$+_(#RTN{Cr)$= z3H0~%ftk_L(#(-nQA|$$j<3G{67$y=VA$Zo#h;AU7ekW67d9jKk9=ag7Ou@ zAV6DtJMwRIbPz!3kbEIXD^JmfeftrO_%LK}YIIc0mP_b*aVLAehj;evvmhyiFmm&gPYer} zA9(-0cOeAedkT?glwW@3HI7CUe5IUO!%(BS`OaB+>DPj(Y1z>}#x!IZe77*N|?QpGCZ17*j0+jL`*aD^U{tvC) zr-nq_EuC9DCfkd9er)4LvaY!8H)8#U`>O0_5k_8;g+s5L+}Ux{V34nwbX z?K=C{3RCcJ#kHACrs&z{I#1TGI~%mNCMmftNwJ2+Xb@;ut`#NF8WMt1$&@WIZsY$0 XvTrpBncPI500000NkvXXu0mjff4{@7 literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/streetlamp.png b/cases/case-00b-the-quartet/sprites/streetlamp.png new file mode 100644 index 0000000000000000000000000000000000000000..41550746f24523f78b2b1b0fc4b9924923b0ae2c GIT binary patch literal 356 zcmV-q0h|7bP)0003iNkl$A{2m4ODC(yyBIwD}`U$P{DhM9eB$BjKi-GB6 z-sI)IX{c>m5D|{%bN#3r1`KRwxL)5pnh5r%GpGUh`u;owplQ9nJzqj(2N6>-)uwJ# zOh9U0;8g^Q#F!n~zHfa)RaJ2Tue^V_yHzplOd-y6(ARNsqA3r$2b-i6xeK`AVzCT4 zx5>~@N5)wI#LnvUf_YP)5r0007mNkllP(ty-4DZhhA(6LEWAM{{d@*&G5}aQwi!J(riI3aEp~JiKy4oq#x`b zU=UHhrMrp>YEp=lK4fZ&_iA@0=Ip8uoqNwcch1b2`R1EB6a)-A4E6^Dj$=0N-s?H^ zr2ojX3WU+xdX1|pE8+V-e9uEBGmgQ57hn-ooUXvc z!T2>^BfpD>L z$zfv*2mA(Y4+$1ycEiPXEdid`9mKDqb5{=?(` zer#@TVf4$WqLKC0-*8=5IS^Z&y^~p90MbUvb*~6keyv#L%*?t~vamR!G1OQOljTF} zH2-zp?im$|N=k;ew|C%qTSz7!KzUPTwkJd#*}$6j((*E%J%7rnRLZ~*Xji#A95T~w zZMVwRN#DahbadQCI-Q2&<{{)dc&T^5CZ8>=Ys-`q^cx6=cW>l{==qZ$K7N|hOYr*5 ikRjHF*KoP60PqjpEmy*W9Nx760000Nq|*bq&qtH^?5ik=_vB_mN1<;p+Mt zwc00LoS$hdHiPMzX>@mokV&ty6IdBwyX4p z!?L!X0WpEukcg^h3<`xk6%}K@<#x8HHyZ3*6i`)VCJ@`NwS*2>8vQu6-(A<1M?wsZN8h96cHwl^=)@=O2#002ovPDHLkV1l`^t@{7~ literal 0 HcmV?d00001 diff --git a/cases/case-00b-the-quartet/sprites/typewriter.png b/cases/case-00b-the-quartet/sprites/typewriter.png new file mode 100644 index 0000000000000000000000000000000000000000..be967f04cf92f4968866e9d3c62c3da9e53df382 GIT binary patch literal 483 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 blD>Zdn+KwxM%9tK00000NkvXXu0mjfaQ>h3 literal 0 HcmV?d00001 diff --git a/tools/lint.py b/tools/lint.py index ad7b215..2cf6517 100644 --- a/tools/lint.py +++ b/tools/lint.py @@ -29,6 +29,7 @@ def check(case, warn=False): set_flags, need_flags, total = set(man.get("flags", {})), set(), 0 # A manifest flag is only "set" if something later flips it true. set_flags = set() + paying = {} # flag -> what already awards points for setting it for n, doc in rooms.items(): objs = doc.get("objects", []) @@ -66,6 +67,15 @@ def check(case, warn=False): f"taking it will NOT set the flag. Make it non-takeable, " f"or gate on `needs` (which checks inventory).") if o.get("sets_flag"): + # Points are awarded when a flag flips false->true. If two + # scoring things set the SAME flag, whichever fires second + # silently pays nothing and max_score becomes unreachable. + if o.get("points") and paying.get(o["sets_flag"], where) != where: + say(f"{where}: awards points for setting '{o['sets_flag']}', " + f"which {paying[o['sets_flag']]} already pays for — " + f"whichever fires second pays nothing.") + elif o.get("points"): + paying[o["sets_flag"]] = where set_flags.add(o["sets_flag"]) for f in ("requires_flag", "visible_flag", "hidden_by_flag"): if o.get(f): @@ -74,6 +84,13 @@ def check(case, warn=False): for i, node in enumerate(o.get("dialogue", [])): for c in node.get("choices", []): if c.get("sets_flag"): + if c.get("points") and paying.get(c["sets_flag"], where) != where: + say(f"{where} dialogue: awards points for setting " + f"'{c['sets_flag']}', which " + f"{paying[c['sets_flag']]} already pays for — " + f"whichever fires second pays nothing.") + elif c.get("points"): + paying[c["sets_flag"]] = where set_flags.add(c["sets_flag"]) if c.get("requires_flag"): need_flags.add(c["requires_flag"])