Act II, full colour EGA. Six rooms, 100 points, verified end-to-end headlessly at 100/100 with the win firing, plus two authored Sierra deaths. The mechanic: Drebin is fired, so he has no power to search anyone — but a home plate umpire can crouch beside a professional athlete, take his bat off him and inspect his equipment, and nobody in a stadium of sixty thousand thinks twice. So every frisk needs an umpire-legitimate pretext, in order: brush the plate, inspect the mitt, check the bat for pine tar, then Number 44. Announcing yourself as police is right there, and correct, and fatal. Matching inversion at the reception: tackling a head of state is correct procedure, it ends your career, and being fired is the only way to progress. Two authoring traps found and documented for future cases: - Object names must not be prefixes of each other — 'ludwigdesk' shadowed 'ludwig' in the loose parser match, so 'talk ludwig' addressed the furniture. - Flag-gated edge exits need walkable floor into the trigger zone (y<=21 for north); the upper deck sat behind a painted Wall band and was unreachable on foot. Walk every exit to verify — goto_room hides this. tools/sprites.py now retries farm 429/401 with backoff (that status is the guest concurrency cap, not auth) and honours MB_POOL. LoRA finding recorded in DESIGN.md §9: the farm's style LoRAs are FLUX.1-dev architecture and are a silent no-op on the only ungated model, and the pixel look comes from the nearest-neighbour downscale anyway, not the model. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
315 lines
7.5 KiB
JSON
315 lines
7.5 KiB
JSON
{
|
|
"name": "Ludwig Shipping — Executive Floor",
|
|
"enter_text": "Money. The kind of money that has carpet in the lift.",
|
|
"music": 3,
|
|
"strokes": [
|
|
{
|
|
"Rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"w": 160,
|
|
"h": 168,
|
|
"color": 4,
|
|
"meaning": "Floor"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"w": 160,
|
|
"h": 62,
|
|
"color": 6,
|
|
"meaning": "Wall"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 0,
|
|
"y": 30,
|
|
"w": 160,
|
|
"h": 2,
|
|
"color": 0,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 0,
|
|
"y": 60,
|
|
"w": 160,
|
|
"h": 4,
|
|
"color": 14,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 0,
|
|
"y": 64,
|
|
"w": 160,
|
|
"h": 104,
|
|
"color": 4,
|
|
"meaning": "Floor"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 96,
|
|
"y": 8,
|
|
"w": 52,
|
|
"h": 42,
|
|
"color": 9,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 96,
|
|
"y": 8,
|
|
"w": 52,
|
|
"h": 3,
|
|
"color": 14,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 120,
|
|
"y": 8,
|
|
"w": 2,
|
|
"h": 42,
|
|
"color": 14,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 100,
|
|
"y": 36,
|
|
"w": 44,
|
|
"h": 14,
|
|
"color": 8,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 12,
|
|
"y": 10,
|
|
"w": 34,
|
|
"h": 26,
|
|
"color": 14,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 16,
|
|
"y": 14,
|
|
"w": 26,
|
|
"h": 18,
|
|
"color": 1,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 20,
|
|
"y": 20,
|
|
"w": 18,
|
|
"h": 6,
|
|
"color": 15,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 18,
|
|
"y": 100,
|
|
"w": 124,
|
|
"h": 2,
|
|
"color": 12,
|
|
"meaning": "None"
|
|
}
|
|
},
|
|
{
|
|
"Rect": {
|
|
"x": 0,
|
|
"y": 164,
|
|
"w": 160,
|
|
"h": 4,
|
|
"color": 0,
|
|
"meaning": "Wall"
|
|
}
|
|
}
|
|
],
|
|
"spawn": [
|
|
22,
|
|
140
|
|
],
|
|
"exits": [
|
|
null,
|
|
2,
|
|
null,
|
|
0
|
|
],
|
|
"exit_flags": [
|
|
"",
|
|
"jane_helping",
|
|
"",
|
|
""
|
|
],
|
|
"exit_blocked": [
|
|
"",
|
|
"You haven't got what you came for. Whatever that was.",
|
|
"",
|
|
""
|
|
],
|
|
"objects": [
|
|
{
|
|
"name": "desk",
|
|
"sprite": "ludwigdesk",
|
|
"x": 96,
|
|
"y": 118,
|
|
"look": "A desk the size of a squash court, in black lacquer. There is nothing on it, which in your experience means everything is in it.",
|
|
"synonyms": "lacquer table drawers bureau",
|
|
"use_text": "Locked. Every drawer. A man with nothing to hide keeps a desk you can open, and a man with nothing in his desk keeps it locked."
|
|
},
|
|
{
|
|
"name": "ludwig",
|
|
"sprite": "ludwig",
|
|
"x": 108,
|
|
"y": 128,
|
|
"look": "Vincent Ludwig. Shipping, real estate, philanthropy, and a handshake like a warm towel. He is the most respected businessman in this city, which narrows it down.",
|
|
"synonyms": "vincent businessman villain",
|
|
"use_text": "You shake his hand. He holds it slightly too long, the way a man does when he is counting something.",
|
|
"dialogue": [
|
|
{
|
|
"says": "Ludwig: Detective Drebin. A terrible business, your officer. I read about it. Six bullets. Nobody survives six bullets.",
|
|
"choices": [
|
|
{
|
|
"text": "Nordberg did.",
|
|
"goto": 1,
|
|
"sets_flag": "slipped",
|
|
"points": 5
|
|
},
|
|
{
|
|
"text": "I'd like to ask you about a ship.",
|
|
"goto": 2
|
|
},
|
|
{
|
|
"text": "Nice office.",
|
|
"goto": 3
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"says": "Ludwig: ...He did. He smiles with the lower half of his face only. Ludwig: How wonderful. I must send something to the hospital.",
|
|
"choices": [
|
|
{
|
|
"text": "That's very generous.",
|
|
"goto": 2
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"says": "Ludwig: I own two hundred and six ships, Detective. I couldn't tell you the name of one of them.",
|
|
"choices": [
|
|
{
|
|
"text": "This one's called I LUV LUDWIG.",
|
|
"goto": 4
|
|
},
|
|
{
|
|
"text": "I understand.",
|
|
"goto": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"says": "Ludwig: Thank you. The desk was my father's. It was not his father's.",
|
|
"choices": [
|
|
{
|
|
"text": "Handsome piece.",
|
|
"goto": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"says": "Ludwig: ...Two hundred and six ships, Detective. One of them was bound to be. He presses a button on the desk. Somewhere a door opens. Ludwig: My assistant will see you out. Jane — Detective Drebin was just leaving, and he was just asking about ships.",
|
|
"choices": [
|
|
{
|
|
"text": "I'll be back, Mr. Ludwig.",
|
|
"goto": -1
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "jane",
|
|
"sprite": "jane",
|
|
"x": 44,
|
|
"y": 132,
|
|
"look": "Ludwig's executive assistant. She has the kind of face that stops a man mid-sentence, which is unfortunate, because you were mid-sentence.",
|
|
"synonyms": "spencer assistant woman blonde secretary",
|
|
"dialogue": [
|
|
{
|
|
"says": "Jane: Detective Drebin? I'm Jane Spencer. I'm to see you out.",
|
|
"choices": [
|
|
{
|
|
"text": "How long have you worked for Mr. Ludwig?",
|
|
"goto": 1
|
|
},
|
|
{
|
|
"text": "Do you know anything about a freighter?",
|
|
"goto": 2,
|
|
"requires_flag": "slipped"
|
|
},
|
|
{
|
|
"text": "Has anyone ever told you you have a beautiful skeletal structure?",
|
|
"goto": 3
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"says": "Jane: Six years. He's a wonderful man. He gives to the orphanage. She says it the way you say a thing you have said many times and never once tested.",
|
|
"choices": [
|
|
{
|
|
"text": "Everybody gives to the orphanage.",
|
|
"goto": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"says": "Jane: The manifests are all on my floor. If there were a ship that came in with more on it than it left with, I'd be the one who typed the number twice. She stops. She has just heard herself.",
|
|
"choices": [
|
|
{
|
|
"text": "Type it a third time, Miss Spencer.",
|
|
"goto": 4,
|
|
"sets_flag": "jane_helping",
|
|
"points": 10
|
|
},
|
|
{
|
|
"text": "I'm sure it's nothing.",
|
|
"goto": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"says": "Jane: ...No.",
|
|
"choices": [
|
|
{
|
|
"text": "Well. You do.",
|
|
"goto": 0
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"says": "Jane: The Queen's reception is on Thursday. Mr. Ludwig is presenting. Everyone who matters will be there and so will I, and if you happen to be there too, Detective, I might happen to have typed something. She holds the lift for you a half-second longer than the lift requires.",
|
|
"choices": []
|
|
}
|
|
]
|
|
}
|
|
]
|
|
} |