phantom-grid / game /case_catalog.py
unity4ar's picture
Ship Phantom Grid Docker Space
d2e6f94 verified
Raw
History Blame Contribute Delete
10.6 kB
from __future__ import annotations
import random
import threading
from typing import Any
CASE_CATALOG: list[dict[str, Any]] = [
{
"case_id": "glass_finch",
"case_title": "The Glass Finch Affair",
"crime": "theft of the Beaumont glass automaton",
"stolen_item": "a crystal songbird automaton",
"victim": "the Beaumont Gallery",
"scene": "a private gallery viewing room",
"detail": "Only a scatter of glass feathers and a cut telephone wire remained.",
"culprit_alias": "The Glass Finch",
"description": "A sharp-featured woman in a cream trench coat and emerald scarf, carrying a slim black portfolio case.",
"image_url": "/static/assets/suspects/glass_finch.png",
},
{
"case_id": "copper_saint",
"case_title": "The Copper Saint Robbery",
"crime": "theft of the St. Aldwyn reliquary",
"stolen_item": "a copper-and-enamel reliquary",
"victim": "St. Aldwyn's Chapter House",
"scene": "a locked cathedral treasury",
"detail": "Wax from a false seal was found beside an open service hatch.",
"culprit_alias": "The Copper Saint",
"description": "A wary man in a rust overcoat and navy flat cap, wearing brass-rim spectacles and carrying a violin case.",
"image_url": "/static/assets/suspects/copper_saint.png",
},
{
"case_id": "violet_cipher",
"case_title": "The Violet Cipher",
"crime": "theft of a diplomatic code wheel",
"stolen_item": "the Foreign Office violet code wheel",
"victim": "the Crown Signals Bureau",
"scene": "a guarded decoding room",
"detail": "A copied key card and a silver cigarette ash were the only clues.",
"culprit_alias": "The Violet Cipher",
"description": "A poised woman in a charcoal suit and violet veiled cloche hat, carrying a silver cigarette case.",
"image_url": "/static/assets/suspects/violet_cipher.png",
},
{
"case_id": "ivory_rook",
"case_title": "The Ivory Rook Gambit",
"crime": "theft of an ancient ivory chess rook",
"stolen_item": "the lost rook from the Caliph's chess set",
"victim": "the Royal Antiquities Society",
"scene": "a guarded archive",
"detail": "A rolled museum plan had been exchanged for a flawless forgery.",
"culprit_alias": "The Ivory Rook",
"description": "An older man in a camel coat, burgundy bow tie, and black homburg, carrying a walking cane and rolled plans.",
"image_url": "/static/assets/suspects/ivory_rook.png",
},
{
"case_id": "saffron_pen",
"case_title": "The Saffron Pen Forgery",
"crime": "theft of the Prime Minister's sealed treaty",
"stolen_item": "a signed copy of the Calcutta Accord",
"victim": "the Cabinet Records Office",
"scene": "a document conservation room",
"detail": "The treaty was replaced by a copy whose ink was still warm.",
"culprit_alias": "The Saffron Pen",
"description": "A moustached man in a bottle-green rain cape and mustard scarf, carrying a leather document tube.",
"image_url": "/static/assets/suspects/saffron_pen.png",
},
{
"case_id": "blue_hour",
"case_title": "The Blue Hour Break-In",
"crime": "burglary of the Kingsley sapphire vault",
"stolen_item": "the uncut Kingsley sapphire",
"victim": "Harrow & Blythe Jewellers",
"scene": "an underground cutting vault",
"detail": "The safe dial was clean, but blue wool fibres clung to the hinge.",
"culprit_alias": "The Blue Hour",
"description": "A composed woman in a midnight-blue coat and pale headscarf, wearing pearl earrings and carrying a metal tool case.",
"image_url": "/static/assets/suspects/blue_hour.png",
},
{
"case_id": "brass_moth",
"case_title": "The Brass Moth Mystery",
"crime": "theft of an experimental clockwork navigator",
"stolen_item": "the Halden brass navigator",
"victim": "master clockmaker Elias Halden",
"scene": "a workshop above Bellmaker Lane",
"detail": "Every clock stopped at 11:47 as the workshop lights went dark.",
"culprit_alias": "The Brass Moth",
"description": "An observant man in an olive duffle coat, round spectacles, and burgundy scarf, carrying a mahogany clock box.",
"image_url": "/static/assets/suspects/brass_moth.png",
},
{
"case_id": "scarlet_lark",
"case_title": "The Scarlet Lark Reel",
"crime": "theft of a classified newsreel",
"stolen_item": "a film canister containing a secret weapons test",
"victim": "Crown News Pictures",
"scene": "a Soho film laboratory",
"detail": "A delivery motorcycle vanished seconds before the fire alarm sounded.",
"culprit_alias": "The Scarlet Lark",
"description": "A defiant woman in a black motoring coat, scarlet beret, and white gloves, carrying a cylindrical film canister.",
"image_url": "/static/assets/suspects/scarlet_lark.png",
},
{
"case_id": "thames_ghost",
"case_title": "The Thames Ghost Cargo",
"crime": "theft of a customs evidence pouch",
"stolen_item": "a pouch of confiscated black pearls",
"victim": "the Port of London Authority",
"scene": "a river-police evidence room",
"detail": "River mud marked the floor although every dock gate was locked.",
"culprit_alias": "The Thames Ghost",
"description": "A guarded man in a slate pea coat, cream fisherman's jumper, and dark knit cap, carrying a tarred canvas satchel.",
"image_url": "/static/assets/suspects/thames_ghost.png",
},
{
"case_id": "madame_mercury",
"case_title": "Madame Mercury's Deception",
"crime": "theft of the Marlowe ruby suite",
"stolen_item": "a lacquered box of Burmese rubies",
"victim": "Lady Marlowe",
"scene": "a Mayfair hotel strongroom",
"detail": "The night clerk remembered two identical guests leaving minutes apart.",
"culprit_alias": "Madame Mercury",
"description": "An imperious older woman in a silver-grey fur-collared coat and teal turban, carrying a lacquered red jewel box.",
"image_url": "/static/assets/suspects/madame_mercury.png",
},
{
"case_id": "green_signal",
"case_title": "The Green Signal Heist",
"crime": "theft of the Night Mail master key",
"stolen_item": "the master key to the Royal Night Mail",
"victim": "British Rail Postal Service",
"scene": "a station sorting office",
"detail": "A signal lantern flashed green on a line closed since midnight.",
"culprit_alias": "The Green Signal",
"description": "A restless young man in a dark green overcoat over a porter's jacket, carrying a timetable case and signal lantern.",
"image_url": "/static/assets/suspects/green_signal.png",
},
{
"case_id": "amber_quill",
"case_title": "The Amber Quill Manuscript",
"crime": "theft of an illuminated royal manuscript",
"stolen_item": "the gold-leaf Chronicle of Eleanor",
"victim": "the Kensington Manuscript Library",
"scene": "a climate-controlled reading room",
"detail": "Amber sealing wax was pressed with a ring no archivist recognised.",
"culprit_alias": "The Amber Quill",
"description": "A watchful woman in a chocolate-brown coat, amber headscarf, and cat-eye spectacles, carrying a wrapped manuscript.",
"image_url": "/static/assets/suspects/amber_quill.png",
},
{
"case_id": "velvet_mask",
"case_title": "The Velvet Mask Caper",
"crime": "theft of the Garrick death mask",
"stolen_item": "a priceless carved theatrical mask",
"victim": "the Royal Players' Archive",
"scene": "a locked West End prop room",
"detail": "A stage cue rang in an empty theatre just before the mask disappeared.",
"culprit_alias": "The Velvet Mask",
"description": "A theatrical man in a plum dinner jacket and black opera cloak, carrying a carved mask and compact attache case.",
"image_url": "/static/assets/suspects/velvet_mask.png",
},
{
"case_id": "rose_diamond",
"case_title": "The Rose Diamond Cut",
"crime": "theft of the uncut Rose Diamond",
"stolen_item": "the newly discovered Rose Diamond",
"victim": "the Hatton Garden Exchange",
"scene": "a gem examination chamber",
"detail": "Fine diamond dust traced a path to a service stair no guest should know.",
"culprit_alias": "The Rose Diamond",
"description": "An unsmiling woman in a dove-grey fitted coat, dusty rose scarf, and round sunglasses, carrying a padded sample case.",
"image_url": "/static/assets/suspects/rose_diamond.png",
},
{
"case_id": "white_raven",
"case_title": "The White Raven Dispatch",
"crime": "theft of a sealed diplomatic dispatch",
"stolen_item": "the ambassador's blue dispatch pouch",
"victim": "the Nordic Embassy",
"scene": "a guarded diplomatic reception",
"detail": "The embassy seal was intact, but the pouch inside contained blank paper.",
"culprit_alias": "The White Raven",
"description": "A silver-haired man in a white dinner jacket beneath a black overcoat, carrying a sealed blue dispatch pouch.",
"image_url": "/static/assets/suspects/white_raven.png",
},
]
_CASE_ROTATION: list[dict[str, Any]] = []
_LAST_CASE_ID: str | None = None
_CASE_ROTATION_LOCK = threading.Lock()
def choose_case() -> dict[str, Any]:
global _CASE_ROTATION, _LAST_CASE_ID
with _CASE_ROTATION_LOCK:
if not _CASE_ROTATION:
_CASE_ROTATION = list(CASE_CATALOG)
random.SystemRandom().shuffle(_CASE_ROTATION)
if len(_CASE_ROTATION) > 1 and _CASE_ROTATION[-1]["case_id"] == _LAST_CASE_ID:
_CASE_ROTATION[0], _CASE_ROTATION[-1] = _CASE_ROTATION[-1], _CASE_ROTATION[0]
selected = _CASE_ROTATION.pop()
_LAST_CASE_ID = selected["case_id"]
return dict(selected)