diff --git a/DESIGN.md b/DESIGN.md index efb0437..feaff63 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -101,8 +101,28 @@ He is the origin of everything downstream: 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.** That's where Act III eventually goes, and why the owl at - the end of Case Ten is Nielsen and not Sr. +- **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, + 1939–1958, 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 diff --git a/README.md b/README.md index 4d146d5..10ea9de 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ cargo run -p mrpgi --manifest-path ~/Documents/MRPGI/Cargo.toml -- --game cases/ | `cases/case-02-ring-of-fear/` | **Case Two — playable, 100 points.** Drebin (Nielsen), 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 (Nielsen), 1991, full colour. Five rooms, the memory test. | +| `cases/case-11-what-he-wrote/` | **Case Eleven — playable, 100 points.** Drebin **Jr** reads his grandfather's files. Five rooms; the palette drifts from 2025 back to 1958. | | `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. | diff --git a/cases/case-11-what-he-wrote/game.json b/cases/case-11-what-he-wrote/game.json new file mode 100644 index 0000000..7f9b1b4 --- /dev/null +++ b/cases/case-11-what-he-wrote/game.json @@ -0,0 +1,20 @@ +{ + "name": "Police Squad Quest — Case Eleven: What He Wrote", + "start_room": 0, + "max_score": 100, + "intro_text": "They are digitising the paper. Sixty-seven years of it, out of a basement, through a scanner, into a system, and after that the basement becomes a wellness suite. My name is Frank Drebin Jr. My father was a police officer. His father was a police officer. I have a very particular set of skills, and this week they have me holding pages flat. Type 'help'.", + "death_text": "† OFFICER DOWN. The file goes back in the box. The day restarts. †", + "verbs": [ + { "name": "use", "words": ["scan", "read", "file", "type", "log", "search", "check", "radio", "open", "lift", "seal", "submit"] }, + { "name": "look", "words": ["investigate", "observe", "detect", "examine"] }, + { "name": "talk", "words": ["interrogate", "question", "brief", "ask"] } + ], + "flags": { + "assigned": false, + "found_file": false, + "read_survey": false, + "met_witness": false, + "found_box": false, + "told_owl": false + } +} diff --git a/cases/case-11-what-he-wrote/rooms/room0.json b/cases/case-11-what-he-wrote/rooms/room0.json new file mode 100644 index 0000000..c66bde6 --- /dev/null +++ b/cases/case-11-what-he-wrote/rooms/room0.json @@ -0,0 +1,123 @@ +{ + "name": "Police Squad — Records Modernisation Suite", + "enter_text": "Sixty-seven years of paper on pallets, and a man from a vendor explaining a workflow.", + "music": 1, + "strokes": [ + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 168, "color": 7, "meaning": "Floor" } }, + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 58, "color": 9, "meaning": "Wall" } }, + { "Rect": { "x": 0, "y": 56, "w": 160, "h": 3, "color": 1, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 59, "w": 160, "h": 109, "color": 7, "meaning": "Floor" } }, + { "Rect": { "x": 10, "y": 10, "w": 44, "h": 34, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 14, "y": 14, "w": 36, "h": 5, "color": 3, "meaning": "None" } }, + { "Rect": { "x": 14, "y": 23, "w": 26, "h": 3, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 14, "y": 30, "w": 30, "h": 3, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 66, "y": 14, "w": 32, "h": 24, "color": 11, "meaning": "None" } }, + { "Rect": { "x": 72, "y": 20, "w": 20, "h": 10, "color": 1, "meaning": "None" } }, + { "Rect": { "x": 112, "y": 10, "w": 40, "h": 40, "color": 3, "meaning": "None" } }, + { "Rect": { "x": 116, "y": 14, "w": 32, "h": 32, "color": 1, "meaning": "None" } }, + { "Rect": { "x": 122, "y": 22, "w": 20, "h": 4, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 122, "y": 32, "w": 14, "h": 4, "color": 11, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 164, "w": 160, "h": 4, "color": 0, "meaning": "Wall" } } + ], + "spawn": [24, 148], + "exits": [null, 1, null, null], + "exit_flags": ["", "assigned", "", ""], + "exit_blocked": ["", "You have not been given the basement yet. Ask for the basement.", "", ""], + "objects": [ + { + "name": "scanner", + "sprite": "scanner", + "x": 58, + "y": 120, + "look": "A document scanner rated at ninety pages a minute. Beside it, a laminated card: HOLD PAGES FLAT. DO NOT READ. READING SLOWS THE LINE.", + "synonyms": "machine feeder line workflow card", + "use_text": "You hold pages flat. You do it for two days. You are extremely good at it, because you are extremely good at everything you are told to do, and because nobody has ever once given you a job you could not do sincerely." + }, + { + "name": "archivebox", + "sprite": "archivebox", + "x": 108, + "y": 116, + "look": "Pallets of banker's boxes out of the basement. The labels are handwritten and the handwriting changes about every eleven years. The 1958 pallet is going through on Thursday. After Thursday the paper is pulped, because the paper has been scanned, and a scan is a record.", + "synonyms": "boxes pallet paper files archive", + "use_text": "You look at the label on the top box of the 1958 pallet. It is not a hand you have seen before, and it is a hand you know immediately, because you have seen it on the back of a photograph on your father's desk for fifty years. F. DREBIN." + }, + { + "name": "hockenjr", + "sprite": "hockenjr", + "x": 34, + "y": 132, + "look": "Captain Ed Hocken Jr., on the line beside you, holding pages flat, because he would not ask anybody to do a thing he would not do.", + "synonyms": "hocken ed captain", + "use_text": "He tells you his own grandfather's reports are on the 1961 pallet and that he has read every one of them and that they are, in his professional opinion, terrible. He says it with enormous love.", + "dialogue": [ + { + "says": "Hocken Jr.: Frank! Two days on the scanner and you haven't complained once. My dad said your dad never complained either. Hocken Jr.: Did yours ever talk about his dad? Mine never talked about his.", + "choices": [ + { "text": "My father talked about him constantly.", "goto": 1 }, + { "text": "No. Never once.", "goto": 1 }, + { "text": "There's a box with his name on it, Ed.", "goto": 2 } + ] + }, + { + "says": "Hocken Jr.: What was he like? You tell him what you were told: nineteen years, best clearance rate the division ever had, never once had a file come back, and a commendation in '58 for the Meridian Street thing that they still taught at the academy into the seventies. You have said those four sentences your whole life. You have never once been asked to say a fifth.", + "choices": [{ "text": "There's a box with his name on it, Ed.", "goto": 2 }] + }, + { + "says": "Hocken Jr.: Then read it! Frank, it's going in the pulper Thursday. Hocken Jr.: That's your grandfather. Nobody's read a word of that man since he wrote it and on Friday there's nothing to read.", + "choices": [ + { "text": "The card says not to read.", "goto": 3 }, + { "text": "I'll ask the Chief for the basement.", "goto": 4 } + ] + }, + { + "says": "Hocken Jr.: The card says reading slows the line, Frank. The card is about the line. He is, without knowing it, the second person in this story to be completely right about a piece of paper and completely ignored.", + "choices": [{ "text": "I'll ask the Chief.", "goto": 4 }] + }, + { + "says": "Hocken Jr.: Ask her. She'll say yes. She says yes to you about eleven per cent of the time and this is one of them.", + "choices": [{ "text": "Eleven per cent.", "goto": -1 }] + } + ] + }, + { + "name": "davis", + "sprite": "davis", + "x": 128, + "y": 130, + "look": "Chief Davis, signing off a vendor invoice with the expression of a woman signing off a vendor invoice.", + "synonyms": "chief boss commander", + "dialogue": [ + { + "says": "Davis: Drebin. Two days on a scanner and no incidents. I want you to know I've noticed and I want you to know I don't trust it.", + "choices": [ + { "text": "Chief, I'd like the basement.", "goto": 1 }, + { "text": "Chief, my grandfather's case files are on Thursday's pallet.", "goto": 1 }, + { "text": "I have been holding pages flat, Chief. Sincerely.", "goto": 2 } + ] + }, + { + "says": "Davis: The basement. She puts the pen down. Davis: Drebin, the last time you asked me for something, Police Squad was dissolved by a budget amendment and you lost your trousers on international television.", + "choices": [ + { "text": "That's true, Chief.", "goto": 3 }, + { "text": "It's four boxes and two days, Chief.", "goto": 3 } + ] + }, + { + "says": "Davis: I know you have. That's what's unsettling.", + "choices": [{ "text": "Chief, I'd like the basement.", "goto": 1 }] + }, + { + "says": "Davis: Take the basement. Davis: Frank — you understand what a records project is? It is the first time in sixty-seven years anybody has looked at any of it. Not the first time in a while. The first time. Davis: Whatever is down there has been down there the whole time, and the only reason nobody knows is that nobody has ever gone and looked.", + "choices": [ + { "text": "Understood, Chief.", "goto": 4, "sets_flag": "assigned", "points": 10 } + ] + }, + { + "says": "Davis: Thursday, Drebin. Then it's a wellness suite.", + "choices": [] + } + ] + } + ] +} diff --git a/cases/case-11-what-he-wrote/rooms/room1.json b/cases/case-11-what-he-wrote/rooms/room1.json new file mode 100644 index 0000000..1de59e9 --- /dev/null +++ b/cases/case-11-what-he-wrote/rooms/room1.json @@ -0,0 +1,60 @@ +{ + "name": "Sub-Basement Three — Records, 1951–1962", + "enter_text": "One strip light, four boxes, and sixty-seven years of nobody.", + "music": 2, + "strokes": [ + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 168, "color": 8, "meaning": "Floor" } }, + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 60, "color": 0, "meaning": "Wall" } }, + { "Rect": { "x": 0, "y": 58, "w": 160, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 61, "w": 160, "h": 107, "color": 8, "meaning": "Floor" } }, + { "Rect": { "x": 60, "y": 2, "w": 40, "h": 5, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 6, "y": 14, "w": 34, "h": 44, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 6, "y": 14, "w": 34, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 6, "y": 28, "w": 34, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 6, "y": 42, "w": 34, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 120, "y": 14, "w": 34, "h": 44, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 120, "y": 14, "w": 34, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 120, "y": 28, "w": 34, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 120, "y": 42, "w": 34, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 164, "w": 160, "h": 4, "color": 0, "meaning": "Wall" } } + ], + "spawn": [20, 148], + "exits": [null, 2, null, 0], + "exit_flags": ["", "read_survey", "", ""], + "exit_blocked": ["", "You have not finished reading. You are the first person to start.", "", ""], + "objects": [ + { + "name": "archivebox", + "sprite": "archivebox", + "x": 46, + "y": 118, + "look": "Four boxes. 1958. The rope handles have perished and the lids have taken the shape of the lids above them. On the side of the first, in grease pencil, in a hand you have seen on the back of one photograph your whole life: F. DREBIN — CLOSED.", + "synonyms": "boxes box pallet archive lids", + "points": 10, + "sets_flag": "found_file", + "use_text": "You get the lid off. Every file in this box is closed. Every one of them was closed by the same man, and the folders are squared to the box, and the tabs are aligned, and there is not one loose sheet anywhere in it. On top, because it is the biggest, is MERIDIAN STREET — 1958." + }, + { + "name": "oldfile", + "sprite": "oldfile", + "x": 84, + "y": 126, + "look": "MERIDIAN STREET BONDED DEPOSITORY — CONSPIRACY / ATTEMPTED BURGLARY, NOV 1958. Eleven pages, typed, and behind them a survey in the same hand and a transfer manifest with a signature at both ends of it. Nobody has untied this ribbon since 1958. You can tell, because the knot is a police knot and the dust on it is unbroken.", + "synonyms": "file meridian folder ribbon report pages", + "requires_flag": "found_file", + "points": 25, + "sets_flag": "read_survey", + "use_text": "You read all eleven pages standing up, under a strip light, in a basement, and you are the first person to do it. It is the best police report you have ever read in your life. It is better than anything you have written. The noise complaint is in it. The bus fare is in it. The parrot is in it. And on page nine, under PREMISES — PRIOR KNOWLEDGE, in the same flat careful voice as everything else, your grandfather sets out that he wrote the security survey on that building, that he recommended the transfer, that the company took his recommendation, that four million dollars left the building five weeks before the tunnel reached it, and that he personally signed the manifest at both ends. He put it in. He put all of it in. You turn to page ten expecting an explanation and page ten is the property schedule, because there was never going to be an explanation, because to the man who typed this there was nothing there to explain. (+25)" + }, + { + "name": "ardmore", + "sprite": "oldfile", + "x": 118, + "y": 136, + "look": "Underneath Meridian Street, in the same box: ARDMORE ST PAYROLL — ROBBERY / HOMICIDE, OCT 1958. Closed. A conviction. Nine to fifteen, served eleven.", + "synonyms": "ardmore payroll second cassidy prosky", + "requires_flag": "read_survey", + "use_text": "Four pages. Immaculate. And in the middle of page two, in a sentence that is doing no work at all and is there because the form has a field for it: 'Latent lifted from strongbox interior lip; no match against elimination set; note that sworn officers of this department are not printed and no elimination set exists for us. Card destroyed under s.9 (moisture), 4:15 PM, witnessed Ofcr. Kowalczyk.' And at the back, behind everything, three handwritten pages by a nine-months rookie which the typed report superseded, in which that rookie wrote down a dark sedan pulling out of the lot at 12:09 and was sick about not getting the plate. Both documents have been in this box, touching, for sixty-seven years." + } + ] +} diff --git a/cases/case-11-what-he-wrote/rooms/room2.json b/cases/case-11-what-he-wrote/rooms/room2.json new file mode 100644 index 0000000..b074cfc --- /dev/null +++ b/cases/case-11-what-he-wrote/rooms/room2.json @@ -0,0 +1,90 @@ +{ + "name": "Sunset Manor — Room 12", + "enter_text": "A care home in Fullerton. A window, a chair, and the last man alive who was there.", + "music": 1, + "strokes": [ + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 168, "color": 7, "meaning": "Floor" } }, + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 60, "color": 15, "meaning": "Wall" } }, + { "Rect": { "x": 0, "y": 58, "w": 160, "h": 3, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 61, "w": 160, "h": 107, "color": 7, "meaning": "Floor" } }, + { "Rect": { "x": 96, "y": 8, "w": 52, "h": 42, "color": 9, "meaning": "None" } }, + { "Rect": { "x": 120, "y": 8, "w": 3, "h": 42, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 96, "y": 27, "w": 52, "h": 3, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 14, "y": 14, "w": 30, "h": 24, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 18, "y": 18, "w": 22, "h": 16, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 54, "y": 16, "w": 24, "h": 20, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 58, "y": 20, "w": 16, "h": 12, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 100, "w": 160, "h": 1, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 164, "w": 160, "h": 4, "color": 0, "meaning": "Wall" } } + ], + "spawn": [20, 146], + "exits": [null, 3, null, 1], + "exit_flags": ["", "met_witness", "", ""], + "exit_blocked": ["", "He has been waiting sixty-seven years for somebody to come and ask. Let him finish.", "", ""], + "objects": [ + { + "name": "photoframe", + "sprite": "photoframe", + "x": 40, + "y": 108, + "look": "On the wall above the chair, framed, behind glass: a Central Division commendation dated 1958, made out to Officer S. Kowalczyk for observation and initiative in the Meridian Street matter. Beside it, in the same frame, a scrap of paper in a different hand: 'Sat 22nd — you are to be at your sister's in Fullerton and NOT in this building under any circumstances. F.D.' He kept it. He has had it on a wall for sixty-seven years.", + "synonyms": "frame commendation certificate photo wall note", + "use_text": "You look at the note for a long time. Your grandfather wrote it out, and made a night clerk read it back to him, so that a man he had never spoken to before would not be in a building on a Saturday. He was not protecting a witness. There was nothing in that vault to protect. He simply did not want the man in the building." + }, + { + "name": "carechair", + "sprite": "carechair", + "x": 132, + "y": 122, + "look": "A second chair, pulled up to the first, which is where the staff sit when they have five minutes, because everybody here likes him.", + "synonyms": "chair seat second visitor", + "use_text": "You sit down. It is the correct thing to do and you do it without thinking, and the old man notices that you did it without thinking, and something in his face settles." + }, + { + "name": "kowalczyk", + "sprite": "kowalczyk", + "x": 84, + "y": 128, + "look": "Stanley Kowalczyk. Ninety-one. Nine months out of the academy in 1958, first on scene at Ardmore Street, thirty-eight years on the job after that and detective by 1962. He has been told a police officer is coming. He has put his tie on.", + "synonyms": "stanley officer old detective witness man", + "points": 25, + "sets_flag": "met_witness", + "use_text": "You sit with him for two hours. He tells you about the rain, and the three pages of notes he wrote at two in the morning, and the fact that the finest homicide detective this city ever had read them and told him they were good notes, and that he has dined out on that sentence for sixty-seven years. He tells you the dark sedan at 12:09 that he never got the plate of, and how your grandfather told him nobody gets the plate at that distance in that rain, and that a man who invents one to look useful is worth less than a man who says he didn't. He tells you he watched him burn the evidence card in the basement at 4:15 and countersigned the log, and that it was the most careful piece of property work he ever saw, and that he did it that way for thirty-eight years after, and taught it, and that there are men still on this job doing it because of that afternoon. (+25)", + "dialogue": [ + { + "says": "Kowalczyk: You're a Drebin. God almighty. You've got the whole face. Kowalczyk: I worked with your grandfather. Nineteen fifty-eight. I was nine months out of the academy and he was the best police officer in this state.", + "choices": [ + { "text": "Tell me about him.", "goto": 1 }, + { "text": "Did you ever have cause to doubt him?", "goto": 2 }, + { "text": "I've read the Ardmore Street file, Mr. Kowalczyk.", "goto": 3 } + ] + }, + { + "says": "Kowalczyk: He never raised his voice. He never took a drink. He never once made a young officer feel like a fool for asking. Kowalczyk: And he wrote everything down. Everything. I never met a man who wrote so much down.", + "choices": [ + { "text": "Did anybody read it?", "goto": 4 }, + { "text": "Did you ever have cause to doubt him?", "goto": 2 } + ] + }, + { + "says": "Kowalczyk: Doubt him? He laughs, and it turns into a cough, and he waves the water away. Kowalczyk: Son, in thirty-eight years I never heard one man say one word against that man, and I'll tell you why. Because there was never anything to say. Everything he ever did is in the files and the files are clean.", + "choices": [{ "text": "The files are clean.", "goto": 5 }] + }, + { + "says": "Kowalczyk: Ardmore. Kowalczyk: Prosky. He got nine to fifteen, served eleven, died in Bakersfield. He always said he lent the key out. Kowalczyk: Your grandfather put that in the report, you know. What Prosky said. Word for word. Didn't have to. Put it in anyway.", + "choices": [{ "text": "He put everything in.", "goto": 5 }] + }, + { + "says": "Kowalczyk: Read it? He looks genuinely puzzled, the way you look when somebody asks you something that has never been a question. Kowalczyk: Son, the Captain signed them. That's what signing is.", + "choices": [{ "text": "Nobody read them.", "goto": 5 }] + }, + { + "says": "Kowalczyk: You've got something to tell me. You look at him. Ninety-one years old, tie on, a commendation on the wall, and the single best thing that ever happened to him is that a man told him his notes were good. Kowalczyk: ...Or you haven't. He pats your hand. Kowalczyk: You're a Drebin. You'll do it right, whatever it is. You people always do it right.", + "choices": [ + { "text": "Thank you for your time, Mr. Kowalczyk.", "goto": -1 } + ] + } + ] + } + ] +} diff --git a/cases/case-11-what-he-wrote/rooms/room3.json b/cases/case-11-what-he-wrote/rooms/room3.json new file mode 100644 index 0000000..801468f --- /dev/null +++ b/cases/case-11-what-he-wrote/rooms/room3.json @@ -0,0 +1,179 @@ +{ + "name": "1114 Delaware Avenue", + "enter_text": "The house is still there. It sold in 1974 and again in 1991 and it is empty now with a board on the door.", + "music": 2, + "strokes": [ + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 168, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 0, + "y": 0, + "w": 160, + "h": 44, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 44, + "w": 160, + "h": 3, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 47, + "w": 160, + "h": 121, + "color": 8, + "meaning": "Floor" + } + }, + { + "Rect": { + "x": 10, + "y": 8, + "w": 2, + "h": 2, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 42, + "y": 14, + "w": 2, + "h": 2, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 96, + "y": 6, + "w": 2, + "h": 2, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 134, + "y": 18, + "w": 2, + "h": 2, + "color": 15, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 96, + "w": 160, + "h": 2, + "color": 0, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 130, + "w": 160, + "h": 1, + "color": 7, + "meaning": "None" + } + }, + { + "Rect": { + "x": 0, + "y": 164, + "w": 160, + "h": 4, + "color": 0, + "meaning": "Wall" + } + } + ], + "spawn": [ + 20, + 150 + ], + "exits": [ + null, + 4, + null, + 2 + ], + "exit_flags": [ + "", + "found_box", + "", + "" + ], + "exit_blocked": [ + "", + "Third board from the wall. He told a boy at a kitchen table and the boy did not understand what he was being told.", + "", + "" + ], + "objects": [ + { + "name": "oldhouse", + "sprite": "oldhouse", + "x": 78, + "y": 92, + "look": "1114 Delaware Avenue. Single storey, porch, small yard. Your father grew up in this house and never brought you to it once. There is a lockbox on the door with a realtor's code and the realtor gave you the code on the telephone in under a minute because you said you were with Police Squad, which is true, and because you sounded like a man who meant it, which you were.", + "synonyms": "house home building door realtor", + "use_text": "You let yourself in. It is empty and it smells of nothing and the light through the boards falls in bars across a floor your father learned to walk on." + }, + { + "name": "porchlight", + "sprite": "porchlight", + "x": 42, + "y": 100, + "look": "The porch light. Somebody has kept the power on at this address for fifty-one years — a standing order at the utility, paid quarterly, out of an account that has been in credit since 1974. Your father set it up the week his father died. He never mentioned it. He paid it every quarter of his life and it is still paid, because it came out of the estate, and the estate is you.", + "synonyms": "light lamp porch bulb", + "use_text": "You have been paying for this light for fourteen years without knowing what it was for. It is on. It has been on the whole time." + }, + { + "name": "coopruin", + "sprite": "coopruin", + "x": 132, + "y": 138, + "look": "In the yard, collapsed into the weeds, the frame of a homemade chicken coop. Somebody built it well. It has been down for forty years and the joints are still square.", + "synonyms": "coop chickens yard frame wreck weeds", + "use_text": "You crouch in the weeds and look at the joinery. He built this in 1951 and he carried a hen on a bus to a police station every few weeks for seven years and put it on a Captain's desk, and in seven years not one police officer in that building ever asked him why, and so he never had occasion to say, and so nobody ever knew, and the only crime of his career that anybody ever noticed was never once called a crime. There is no file. There was never a file." + }, + { + "name": "floorboard", + "sprite": "floorboard", + "x": 76, + "y": 142, + "look": "The front room. Third board from the wall. It comes up without a tool, because it has been coming up without a tool since 1939, because a man lifted it every Friday of his working life.", + "synonyms": "board floor plank third", + "points": 20, + "sets_flag": "found_box", + "use_text": "You lift the third board. There are nineteen tins under this house. Nineteen, in rows, the oldest at the back, the dates scratched into the lids with a nail, 1939 to 1958. Every one of them is full. Not one of them has been opened since it was closed. He never spent it. He never spent any of it. There is nineteen years of the best and most patient criminal work this city ever had under a floorboard in an empty house, and it has been sitting here for sixty-seven years being worth precisely nothing to anybody, because it was never for anything. On top of the nineteenth tin, folded once, is a sheet of departmental paper. It is an inventory. It lists all nineteen tins, with dates and amounts, in a flat careful hand, correct to the dollar, headed: PROPERTY — NOT YET SUBMITTED. (+20)" + } + ] +} \ No newline at end of file diff --git a/cases/case-11-what-he-wrote/rooms/room4.json b/cases/case-11-what-he-wrote/rooms/room4.json new file mode 100644 index 0000000..b02e889 --- /dev/null +++ b/cases/case-11-what-he-wrote/rooms/room4.json @@ -0,0 +1,74 @@ +{ + "name": "Records Modernisation Suite — Wednesday, 11:40 PM", + "enter_text": "Everybody has gone home. The pallet goes into the pulper at eight.", + "music": 2, + "strokes": [ + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 168, "color": 8, "meaning": "Floor" } }, + { "Rect": { "x": 0, "y": 0, "w": 160, "h": 58, "color": 0, "meaning": "Wall" } }, + { "Rect": { "x": 0, "y": 56, "w": 160, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 59, "w": 160, "h": 109, "color": 8, "meaning": "Floor" } }, + { "Rect": { "x": 100, "y": 8, "w": 52, "h": 44, "color": 1, "meaning": "None" } }, + { "Rect": { "x": 104, "y": 12, "w": 44, "h": 36, "color": 0, "meaning": "None" } }, + { "Rect": { "x": 126, "y": 12, "w": 2, "h": 36, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 104, "y": 29, "w": 44, "h": 2, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 12, "y": 12, "w": 40, "h": 34, "color": 8, "meaning": "None" } }, + { "Rect": { "x": 16, "y": 16, "w": 32, "h": 4, "color": 15, "meaning": "None" } }, + { "Rect": { "x": 16, "y": 25, "w": 24, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 16, "y": 33, "w": 28, "h": 3, "color": 7, "meaning": "None" } }, + { "Rect": { "x": 0, "y": 164, "w": 160, "h": 4, "color": 0, "meaning": "Wall" } } + ], + "spawn": [24, 148], + "exits": [null, null, null, 3], + "objects": [ + { + "name": "evidencebag", + "sprite": "evidencebag", + "x": 52, + "y": 130, + "look": "Nineteen tins, bagged, sealed, labelled and initialled, on a bench in an empty office at twenty to midnight. Chain of custody begins with you.", + "synonyms": "bag tins property sealed exhibit", + "use_text": "You check the seals. You have done this ten thousand times and you do it the same way every time, because that is how it is done, and because somebody told your father and your father told you." + }, + { + "name": "oldfile", + "sprite": "oldfile", + "x": 78, + "y": 136, + "look": "The 1958 box, off the pallet, on your desk. It goes into the pulper at eight in the morning. Nobody would ever know. That is not a temptation you are having. It is simply a true statement about the world that is sitting in the room with you.", + "synonyms": "file box meridian ardmore pages", + "use_text": "You square the folders and align the tabs, the way they were when you found them, because that is how he left them and you are not going to be the one who leaves them worse." + }, + { + "name": "owl", + "sprite": "owl", + "x": 124, + "y": 96, + "look": "There is a barn owl on the ledge outside the window. It is wearing a hat. It is grey — not grey the way this office is grey, but grey the way a photograph is grey. It is not the 1950s grey. You have seen the 1950s this week, in a basement, in a hand you now know as well as your own, and this is not that. This is 1988. This is a man who wore a tan trench coat and never once in his life did a dishonest thing and never once in his life found out. He is looking at you the way he always looked at you: like you are about to be told something and he has decided to let you get there yourself.", + "synonyms": "bird barn hat father dad", + "points": 5, + "sets_flag": "told_owl", + "use_text": "You go to the window and you tell him. You tell him all of it: the survey, the manifest signed at both ends, the latent that was lifted and logged and burned at 4:15 with a witness who thanked him for it, the nineteen tins under the third board, the inventory headed PROPERTY — NOT YET SUBMITTED. You tell him his father wrote every word of it down and filed it and nobody ever read a line, and that the only reason you know is that somebody bought a scanner. The owl listens to the whole thing without moving. Then it looks at you for a moment, and it does not say anything, because it is an owl. But it does not leave, either. It stays on the ledge the entire time you are typing. (+5)" + }, + { + "name": "terminal", + "sprite": "terminal", + "x": 108, + "y": 132, + "look": "The records terminal. A blank supplementary report, and a cursor in the first field. There is nobody in this building. The box goes in the pulper at eight. You are a Drebin, and there has only ever been one thing a Drebin does with a true fact, and it has never once worked.", + "synonyms": "computer screen workstation form report keyboard", + "requires_flag": "told_owl", + "wins": true, + "points": 5, + "use_text": "You write it up. You write all of it. Every page reference, every date, the survey and the recommendation and the transfer and both signatures. The latent, the section 9 destruction, the witness's name. Prosky, nine to fifteen, served eleven, died in Bakersfield, who always said he lent the key out, and who your grandfather quoted word for word in a report because the form has a field for what the man said. The nineteen tins. The inventory. The chickens. You do not editorialise, because there is nothing to editorialise. You do what he did. You put down what happened. Eleven pages. Every sentence in it is true. You attach the exhibits, and you sign it, and at 3:14 in the morning you submit it into a records system that went live in March, and the screen goes white, and a box appears in the middle of it: THANK YOU. YOUR SUBMISSION HAS BEEN RECEIVED. HOW WOULD YOU RATE YOUR EXPERIENCE WITH THE RECORDS MODERNISATION PORTAL TODAY? You rate it. You rate it honestly, because you are constitutionally incapable of doing anything else, and you leave a comment, and the comment is four hundred words long and it is the truest thing anybody has written in this building in sixty-seven years. Nobody reads it. Outside, the ledge is empty. Somewhere under a house on Delaware Avenue a porch light you have been paying for without knowing it goes on doing what it has done every night since 1974. ★" + }, + { + "name": "hockenjr", + "sprite": "hockenjr", + "x": 30, + "y": 140, + "look": "Ed has left you a paper bag on the desk with a sandwich in it and a note reading GO HOME FRANK. He went home at six and came back at nine to leave it.", + "synonyms": "hocken ed captain sandwich note bag", + "use_text": "You eat the sandwich. It is a very good sandwich. Ed Hocken Jr. will read your report. He will be the only one, and it will take him four days, and he will never once mention it to you, and on the following Tuesday he will ask you, out of nowhere, whether you want to come to his kid's thing on Sunday. You will go." + } + ] +} diff --git a/cases/case-11-what-he-wrote/sprites.json b/cases/case-11-what-he-wrote/sprites.json new file mode 100644 index 0000000..0c8fe1b --- /dev/null +++ b/cases/case-11-what-he-wrote/sprites.json @@ -0,0 +1,51 @@ +{ + "_comment": "2025, but the palette drifts back to 1958 room by room. Modern props are cold blue; anything from 1958 is generated monochrome so it reads as lit by a different decade, same trick as the owl in case-10. Shared sprites copied from case-10 and case-00.", + "archivebox": { + "h": 18, + "prompt": "A stack of three old cardboard banker's archive boxes with handwritten labels and rope handles, lids askew, seen at a slight angle, dusty, black and white monochrome grayscale only" + }, + "scanner": { + "h": 16, + "prompt": "A modern flatbed document scanner with a lid raised and a glowing cyan strip of light inside, seen at a slight angle, cold blue lighting" + }, + "oldfile": { + "h": 12, + "prompt": "A very old manila cardboard case file tied with faded ribbon, edges foxed and brown, lying flat, single object, black and white monochrome grayscale only" + }, + "kowalczyk": { + "h": 22, + "prompt": "A very old man of ninety in a high backed care home armchair, cardigan and blanket over his knees, thin white hair, alert bright eyes, one hand raised slightly as if making a point, seen from the front" + }, + "carechair": { + "h": 20, + "prompt": "An empty high backed care home armchair beside a small table with a glass of water and a folded newspaper, seen from the side" + }, + "oldhouse": { + "h": 30, + "prompt": "A small plain 1950s American single storey house seen from the front, porch and porch light, slightly run down, overgrown yard, cold blue dusk lighting" + }, + "floorboard": { + "h": 10, + "prompt": "A short length of old floorboard lifted and set aside revealing a dark cavity beneath, seen from above at an angle, black and white monochrome grayscale only" + }, + "photoframe": { + "h": 14, + "prompt": "An old framed commendation certificate behind glass with a small photograph mounted beside it, hanging on a wall, seen straight on, black and white monochrome grayscale only" + }, + "terminal": { + "h": 15, + "prompt": "A modern police records workstation, flat monitor with a glowing cyan form on screen and a keyboard, seen from the front, cold blue lighting" + }, + "coopruin": { + "h": 16, + "prompt": "A collapsed derelict wooden chicken coop overgrown with weeds, wire mesh rusted through, seen from the side, black and white monochrome grayscale only" + }, + "evidencebag": { + "h": 12, + "prompt": "A modern clear plastic evidence bag with a red seal and a printed label, containing an old tin box, standing upright, cold blue lighting" + }, + "porchlight": { + "h": 12, + "prompt": "A small round porch light fixture mounted beside a door, switched on and glowing, seen straight on, black and white monochrome grayscale only" + } +} diff --git a/cases/case-11-what-he-wrote/sprites/archivebox.png b/cases/case-11-what-he-wrote/sprites/archivebox.png new file mode 100644 index 0000000..5fc4312 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/archivebox.png differ diff --git a/cases/case-11-what-he-wrote/sprites/beth.png b/cases/case-11-what-he-wrote/sprites/beth.png new file mode 100644 index 0000000..df9986c Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/beth.png differ diff --git a/cases/case-11-what-he-wrote/sprites/captain.png b/cases/case-11-what-he-wrote/sprites/captain.png new file mode 100644 index 0000000..cc40046 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/captain.png differ diff --git a/cases/case-11-what-he-wrote/sprites/carechair.png b/cases/case-11-what-he-wrote/sprites/carechair.png new file mode 100644 index 0000000..fef8c63 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/carechair.png differ diff --git a/cases/case-11-what-he-wrote/sprites/coop.png b/cases/case-11-what-he-wrote/sprites/coop.png new file mode 100644 index 0000000..90f8fcf Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/coop.png differ diff --git a/cases/case-11-what-he-wrote/sprites/coopruin.png b/cases/case-11-what-he-wrote/sprites/coopruin.png new file mode 100644 index 0000000..59927da Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/coopruin.png differ diff --git a/cases/case-11-what-he-wrote/sprites/davis.png b/cases/case-11-what-he-wrote/sprites/davis.png new file mode 100644 index 0000000..9e61aee Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/davis.png differ diff --git a/cases/case-11-what-he-wrote/sprites/earpiece.png b/cases/case-11-what-he-wrote/sprites/earpiece.png new file mode 100644 index 0000000..504b09f Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/earpiece.png differ diff --git a/cases/case-11-what-he-wrote/sprites/ego.png b/cases/case-11-what-he-wrote/sprites/ego.png new file mode 100644 index 0000000..e3e3f00 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/ego.png differ diff --git a/cases/case-11-what-he-wrote/sprites/evidencebag.png b/cases/case-11-what-he-wrote/sprites/evidencebag.png new file mode 100644 index 0000000..1e6f500 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/evidencebag.png differ diff --git a/cases/case-11-what-he-wrote/sprites/floorboard.png b/cases/case-11-what-he-wrote/sprites/floorboard.png new file mode 100644 index 0000000..60e1727 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/floorboard.png differ diff --git a/cases/case-11-what-he-wrote/sprites/hockenjr.png b/cases/case-11-what-he-wrote/sprites/hockenjr.png new file mode 100644 index 0000000..dd06698 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/hockenjr.png differ diff --git a/cases/case-11-what-he-wrote/sprites/kowalczyk.png b/cases/case-11-what-he-wrote/sprites/kowalczyk.png new file mode 100644 index 0000000..358cc6b Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/kowalczyk.png differ diff --git a/cases/case-11-what-he-wrote/sprites/laptop.png b/cases/case-11-what-he-wrote/sprites/laptop.png new file mode 100644 index 0000000..fc66422 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/laptop.png differ diff --git a/cases/case-11-what-he-wrote/sprites/lockbox.png b/cases/case-11-what-he-wrote/sprites/lockbox.png new file mode 100644 index 0000000..7035741 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/lockbox.png differ diff --git a/cases/case-11-what-he-wrote/sprites/oldfile.png b/cases/case-11-what-he-wrote/sprites/oldfile.png new file mode 100644 index 0000000..f261cf3 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/oldfile.png differ diff --git a/cases/case-11-what-he-wrote/sprites/oldhouse.png b/cases/case-11-what-he-wrote/sprites/oldhouse.png new file mode 100644 index 0000000..cebe8da Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/oldhouse.png differ diff --git a/cases/case-11-what-he-wrote/sprites/owl.png b/cases/case-11-what-he-wrote/sprites/owl.png new file mode 100644 index 0000000..421ac86 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/owl.png differ diff --git a/cases/case-11-what-he-wrote/sprites/partner.png b/cases/case-11-what-he-wrote/sprites/partner.png new file mode 100644 index 0000000..211e1f9 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/partner.png differ diff --git a/cases/case-11-what-he-wrote/sprites/photoframe.png b/cases/case-11-what-he-wrote/sprites/photoframe.png new file mode 100644 index 0000000..ad634d3 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/photoframe.png differ diff --git a/cases/case-11-what-he-wrote/sprites/porchlight.png b/cases/case-11-what-he-wrote/sprites/porchlight.png new file mode 100644 index 0000000..93d62eb Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/porchlight.png differ diff --git a/cases/case-11-what-he-wrote/sprites/scanner.png b/cases/case-11-what-he-wrote/sprites/scanner.png new file mode 100644 index 0000000..701516a Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/scanner.png differ diff --git a/cases/case-11-what-he-wrote/sprites/son.png b/cases/case-11-what-he-wrote/sprites/son.png new file mode 100644 index 0000000..df63e73 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/son.png differ diff --git a/cases/case-11-what-he-wrote/sprites/terminal.png b/cases/case-11-what-he-wrote/sprites/terminal.png new file mode 100644 index 0000000..93759dc Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/terminal.png differ diff --git a/cases/case-11-what-he-wrote/sprites/typewriter.png b/cases/case-11-what-he-wrote/sprites/typewriter.png new file mode 100644 index 0000000..be967f0 Binary files /dev/null and b/cases/case-11-what-he-wrote/sprites/typewriter.png differ