11 Achegas 2ff7369551 ... 4eb0318e40

Autor SHA1 Mensaxe Data
  Jason K. MacDuffie 4eb0318e40 conform stories.json to the ini generated output hai 1 mes
  Jason K. MacDuffie c03f669682 use the same seed every time hai 1 mes
  Jason K. MacDuffie 97b55c3a7c make pre and post narrative nullable in the util hai 1 mes
  Jason K. MacDuffie 963fedcd66 create a working directory hai 1 mes
  Jason K. MacDuffie fdda9a31ad start putting constellation slayer into ini format hai 1 mes
  Jason K. MacDuffie 1c958b8049 add echoes to stories.json hai 1 mes
  Jason K. MacDuffie 1ede87ad52 create a sample story hai 1 mes
  Jason K. MacDuffie 4ec43738ec put images into a single folder hai 1 mes
  Jason K. MacDuffie f0b9ce2786 allow per puzzle sources hai 1 mes
  Jason K. MacDuffie c5333dcdfa fix bugs in generate story hai 1 mes
  Jason K. MacDuffie 95847c4ad8 construct the puzzle hai 1 mes

+ 1 - 1
.gitignore

@@ -2,4 +2,4 @@ __pycache__
 *.pyc
 save/
 build/
-
+working_dir/

+ 664 - 42
data/stories.json

@@ -1,104 +1,726 @@
 [
     {
         "name": "The Constellation Slayer",
-        "id": "constellation_slayer",
+        "id": "TCS_002",
         "init_level": "1",
         "levels": [
             {
                 "id": "1",
                 "index": 10,
-                "name": "The Cave",
+                "name": "The First Message",
                 "pre_narrative": [
-                    "From your office window, the dull glow of city lights stretches out before you. Below, the streets pulse with life, but you know beneath the surface something darker stirs.",
-                    "A killer -- the Constellation Slayer -- has been terrorizing Brooklyn for months, leaving behind nothing but blood and cryptic messages.",
-                    "These messages, a twisted puzzle, seem to be his calling card, hinting at his next brutal act. But why does he do this? What is the point of his game?",
-                    "Before you can even finish the thought, the phone rings. You pick it up immediately, already knowing what it means. Another murder.",
-                    "The urgency is clear in the voice on the other end. \"We're on our way.\"",
-                    "You arrive at the scene minutes later, the air thick with the scent of blood. A body lies sprawled in a dimly lit alley, and the walls nearby are covered in a grotesque scrawl.",
-                    "The killer's message. There's no time to waste. The clock is ticking, and you have to crack this puzzle before more lives are lost."
+                    "From your office window, the dull glow of city lights stretches out before you. Below, the streets pulse with life, but you know beneath the surface something darker stirs. A killer -- the Constellation Slayer -- has been terrorizing Brooklyn for months, leaving behind nothing but blood and cryptic messages. These messages, a twisted puzzle, seem to be his calling card, hinting at his next brutal act. But why does he do this? What is the point of his game? Before you can even finish the thought, the phone rings. You pick it up immediately, already knowing what it means. Another murder. The urgency is clear in the voice on the other end. \"We're on our way.\" You arrive at the scene minutes later, the air thick with the scent of blood. A body lies sprawled in a dimly lit alley, and the walls nearby are covered in a grotesque scrawl. The killer's message. There's no time to waste. The clock is ticking, and you have to crack this puzzle before more lives are lost."
                 ],
                 "post_narrative": null,
                 "next_level": "2",
                 "ending": null,
                 "choices": null,
                 "puzzle": {
-                    "encrypted_text": "YJO ZYLHZ YSGB FO LWSNY DSN. DSN ITGG XLTG, MNZY GTVO YJSZO WOXSHO DSN. T JLPO L ILHOJSNZO XNGG SX YJO WSBTOZ SX BOYOKYTPOZ GTVO DSN.",
+                    "encrypted_text": "FQD UFCJU FEVM RD COEXF IEX. IEX SAVV YCAV, BXUF VAPD FQEUD ODYEJD IEX. A QCTD C SCJDQEXUD YXVV EY FQD OEMADU EY MDFDKFATDU VAPD IEX.",
                     "decrypted_text": "THE STARS TOLD ME ABOUT YOU. YOU WILL FAIL, JUST LIKE THOSE BEFORE YOU. I HAVE A WAREHOUSE FULL OF THE BODIES OF DETECTIVES LIKE YOU.",
                     "quote": {
                         "quote": "THE STARS TOLD ME ABOUT YOU. YOU WILL FAIL, JUST LIKE THOSE BEFORE YOU. I HAVE A WAREHOUSE FULL OF THE BODIES OF DETECTIVES LIKE YOU.",
                         "source": "CONSTELLATION SLAYER"
                     },
-                    "key": {"A": "L", "B": "W", "C": "K", "D": "B", "E": "O", "F": "X", "G": "Q", "H": "J", "I": "T", "J": "M", "K": "V", "L": "G", "M": "F", "N": "A", "O": "S", "P": "R", "Q": "C", "R": "H", "S": "Z", "T": "Y", "U": "N", "V": "P", "W": "I", "X": "E", "Y": "D", "Z": "U"},
-                    "letter_mappings": {"Y": "T", "Z": "S", "L": "A", "H": "R"}
+                    "key": {
+                        "A": "C",
+                        "B": "O",
+                        "C": "K",
+                        "D": "M",
+                        "E": "D",
+                        "F": "Y",
+                        "G": "N",
+                        "H": "Q",
+                        "I": "A",
+                        "J": "B",
+                        "K": "P",
+                        "L": "V",
+                        "M": "R",
+                        "N": "H",
+                        "O": "E",
+                        "P": "Z",
+                        "Q": "L",
+                        "R": "J",
+                        "S": "U",
+                        "T": "F",
+                        "U": "X",
+                        "V": "T",
+                        "W": "S",
+                        "X": "G",
+                        "Y": "I",
+                        "Z": "W"
+                    },
+                    "letter_mappings": {
+                        "U": "S",
+                        "F": "T",
+                        "C": "A",
+                        "J": "R"
+                    }
                 }
             },
             {
                 "id": "2",
                 "index": 11,
-                "name": "The River",
+                "name": "The Warehouse Revelation",
                 "pre_narrative": [
-                    "The message seems clear enough -- he's taunting you. But you can't shake the feeling that there's a deeper clue hidden inside. You sleep on it, the question lingering in the back of your mind.",
-                    "The next day, your phone rings. Without needing to hear the voice on the other end, you already know what it means.",
-                    "Another victim, found in a warehouse in Red Hook.",
-                    "Then it hits you -- the damn warehouse. You think back to the first message: \"A warehouse full of the bodies of detectives lik you.\" It wasn't just a taunt.",
-                    "The killer had already told you where the next body would be, and you missed it. You curse under your breath, feeling the weight of failure.",
-                    "You arrive at the scene in record time, greeted by the familiar chaos. A body lies in the corder of the abandoned warehouse, blood spattered across the floor.",
-                    "There is a single piece of paper pinned to the wall with a knife. Great, another puzzle to solve."
+                    "The message seems clear enough -- he's taunting you. But you can't shake the feeling that there's a deeper clue hidden inside. You sleep on it, the question lingering in the back of your mind. The next day, your phone rings. Without needing to hear the voice on the other end, you already know what it means. Another victim, found in a warehouse in Red Hook. Then it hits you -- the damn warehouse. You think back to the first message: \"A warehouse full of the bodies of detectives like you.\" It wasn't just a taunt. The killer had already told you where the next body would be, and you missed it. You curse under your breath, feeling the weight of failure. You arrive at the scene in record time, greeted by the familiar chaos. A body lies in the corder of the abandoned warehouse, blood spattered across the floor. There is a single piece of paper pinned to the wall with a knife. Great, another puzzle to solve."
                 ],
                 "post_narrative": null,
-                "next_level": "3",
+                "next_level": null,
                 "ending": null,
                 "choices": null,
                 "puzzle": {
-                    "encrypted_text": "RFY ORHCO IBWN JWQ RWW NYZZ, MYRYSRDUY. D'UY NHRSFYM JWQ RFCWQXF AJ NDOYBYM YJYO. D RFDBI JWQ NDZZ LDBM JWQCOYZL HR H SCWOOCWHMO.",
+                    "encrypted_text": "EUR CEHWC NPTO MTZ ETT ORBB, VRERFEQJR. Q'JR OHEFURV MTZ EUWTZLU KM OQCRPRV RMRC. Q EUQPN MTZ OQBB IQPV MTZWCRBI HE H FWTCCWTHVC.",
                     "decrypted_text": "THE STARS KNOW YOU TOO WELL, DETECTIVE. I'VE WATCHED YOU THROUGH MY WISENED EYES. I THINK YOU WILL FIND YOURSELF AT A CROSSROADS.",
                     "quote": {
                         "quote": "THE STARS KNOW YOU TOO WELL, DETECTIVE. I'VE WATCHED YOU THROUGH MY WISENED EYES. I THINK YOU WILL FIND YOURSELF AT A CROSSROADS.",
-                        "source": "CONSTELLATION SLAYER"},
-                    "key": {"A": "H", "B": "P", "C": "S", "D": "M", "E": "Y", "F": "L", "G": "X", "H": "F", "I": "D", "J": "K", "K": "I", "L": "Z", "M": "A", "N": "B", "O": "W", "P": "E", "Q": "T", "R": "C", "S": "O", "T": "R", "U": "Q", "V": "U", "W": "N", "X": "G", "Y": "J", "Z": "V"}, 
-                    "letter_mappings": {"O": "S", "R": "T", "H": "A", "C": "R"}
+                        "source": "CONSTELLATION SLAYER"
+                    },
+                    "key": {
+                        "A": "H",
+                        "B": "G",
+                        "C": "F",
+                        "D": "V",
+                        "E": "R",
+                        "F": "I",
+                        "G": "L",
+                        "H": "U",
+                        "I": "Q",
+                        "J": "S",
+                        "K": "N",
+                        "L": "B",
+                        "M": "K",
+                        "N": "P",
+                        "O": "T",
+                        "P": "X",
+                        "Q": "A",
+                        "R": "W",
+                        "S": "C",
+                        "T": "E",
+                        "U": "Z",
+                        "V": "J",
+                        "W": "O",
+                        "X": "Y",
+                        "Y": "M",
+                        "Z": "D"
+                    },
+                    "letter_mappings": {
+                        "C": "S",
+                        "E": "T",
+                        "H": "A",
+                        "W": "R"
+                    }
                 }
             },
             {
                 "id": "3",
                 "index": 12,
-                "name": "The Ocean",
+                "name": "Crossroads of Fate",
                 "pre_narrative": [
-                    "You are certain this time that it's a clue."
+                    "You are certain this time that it's a clue. It's gotta be."
                 ],
                 "post_narrative": null,
-                "next_level": "4",
-                "ending": null,
+                "next_level": null,
+                "ending": "win",
                 "choices": null,
                 "puzzle": {
-                    "encrypted_text": "GE GCE TG: XF T SGHSOOTESCN ETOHTZMO, KSLSHLTES? LYS OLXQO KZ DZL ITDK FS OZ. XL LYS QTWYL LTFS, ETQLMS XDK ETHS VTCC JS QSESXCSK.",
+                    "encrypted_text": "FR FVR JF: LZ J SFPSKKJRSVN RJKPJETK, OSWSPWJRS? WQS KWLAK OE XEW IJXO ZS KE. LW WQS AJUQW WJZS, RJAWTS LXO RJPS HJVV MS ASRSLVSO.",
                     "decrypted_text": "XV XLV IX: AM I EXCESSIVELY VISCIOUS, DETECTIVE? THE STARS DO NOT FIND ME SO. AT THE RIGHT TIME, VIRTUE AND VICE WILL BE REVEALED.",
                     "quote": {
                         "quote": "XV XLV IX: AM I EXCESSIVELY VISCIOUS, DETECTIVE? THE STARS DO NOT FIND ME SO. AT THE RIGHT TIME, VIRTUE AND VICE WILL BE REVEALED.",
-                        "source": "CONSTELLATION SLAYER"},
-                    "key": {"A": "X", "B": "J", "C": "H", "D": "K", "E": "S", "F": "I", "G": "W", "H": "Y", "I": "T", "J": "B", "K": "P", "L": "C", "M": "F", "N": "D", "O": "Z", "P": "U", "Q": "A", "R": "Q", "S": "O", "T": "L", "U": "M", "V": "E", "W": "V", "X": "G", "Y": "N", "Z": "R"}, 
-                    "letter_mappings": {"O": "S", "L": "T", "X": "A", "Q": "R"}
+                        "source": "CONSTELLATION SLAYER"
+                    },
+                    "key": {
+                        "A": "L",
+                        "B": "M",
+                        "C": "P",
+                        "D": "O",
+                        "E": "S",
+                        "F": "I",
+                        "G": "U",
+                        "H": "Q",
+                        "I": "J",
+                        "J": "Y",
+                        "K": "B",
+                        "L": "V",
+                        "M": "Z",
+                        "N": "X",
+                        "O": "E",
+                        "P": "C",
+                        "Q": "D",
+                        "R": "A",
+                        "S": "K",
+                        "T": "W",
+                        "U": "T",
+                        "V": "R",
+                        "W": "H",
+                        "X": "F",
+                        "Y": "N",
+                        "Z": "G"
+                    },
+                    "letter_mappings": {
+                        "K": "S",
+                        "W": "T",
+                        "L": "A",
+                        "A": "R"
+                    }
+                }
+            }
+        ]
+    },
+    {
+        "name": "Echoes of the Forgotten",
+        "id": "EOTF_001",
+        "init_level": "1",
+        "levels": [
+            {
+                "id": "1",
+                "index": 10,
+                "name": "Abandoned Cabin",
+                "pre_narrative": [
+                    "You wake up in a dimly lit cabin, the scent of old wood and dust thick in the air. A note is pinned to the wall, containing a cryptic quotation. You must decipher its meaning."
+                ],
+                "post_narrative": [
+                    "The moment you whisper the solution, the air crackles. A hidden door swings open, revealing a path into the forest."
+                ],
+                "next_level": "2",
+                "ending": null,
+                "choices": null,
+                "puzzle": {
+                    "encrypted_text": "UYL VGZU XZ CLQLI MLGM. XU'Z CRU LQLC VGZU.",
+                    "decrypted_text": "THE PAST IS NEVER DEAD. IT'S NOT EVEN PAST.",
+                    "quote": {
+                        "quote": "The past is never dead. It's not even past.",
+                        "source": "William Faulkner"
+                    },
+                    "key": {
+                        "A": "G",
+                        "B": "D",
+                        "C": "K",
+                        "D": "M",
+                        "E": "L",
+                        "F": "O",
+                        "G": "T",
+                        "H": "Y",
+                        "I": "X",
+                        "J": "A",
+                        "K": "W",
+                        "L": "N",
+                        "M": "E",
+                        "N": "C",
+                        "O": "R",
+                        "P": "V",
+                        "Q": "S",
+                        "R": "I",
+                        "S": "Z",
+                        "T": "U",
+                        "U": "B",
+                        "V": "Q",
+                        "W": "H",
+                        "X": "F",
+                        "Y": "J",
+                        "Z": "P"
+                    },
+                    "letter_mappings": {
+                        "L": "E",
+                        "U": "T",
+                        "G": "A"
+                    }
+                }
+            },
+            {
+                "id": "2",
+                "index": 11,
+                "name": "Forest Path",
+                "pre_narrative": [
+                    "The trees whisper as you step onto the path, their gnarled limbs curling toward the sky. A lantern flickers ahead, tied to a signpost with an inscription."
+                ],
+                "post_narrative": [
+                    "As the words leave your lips, the lantern burns brighter, illuminating the path ahead."
+                ],
+                "next_level": "3",
+                "ending": null,
+                "choices": null,
+                "puzzle": {
+                    "encrypted_text": "HTM NUU MVTPF KVT KNHQFX NXF UTPM.",
+                    "decrypted_text": "NOT ALL THOSE WHO WANDER ARE LOST.",
+                    "quote": {
+                        "quote": "Not all those who wander are lost.",
+                        "source": "J.R.R. Tolkien"
+                    },
+                    "key": {
+                        "A": "N",
+                        "B": "A",
+                        "C": "B",
+                        "D": "Q",
+                        "E": "F",
+                        "F": "W",
+                        "G": "D",
+                        "H": "V",
+                        "I": "O",
+                        "J": "Y",
+                        "K": "R",
+                        "L": "U",
+                        "M": "G",
+                        "N": "H",
+                        "O": "T",
+                        "P": "J",
+                        "Q": "Z",
+                        "R": "X",
+                        "S": "P",
+                        "T": "M",
+                        "U": "I",
+                        "V": "C",
+                        "W": "K",
+                        "X": "S",
+                        "Y": "L",
+                        "Z": "E"
+                    },
+                    "letter_mappings": {
+                        "F": "E",
+                        "M": "T",
+                        "N": "A"
+                    }
+                }
+            },
+            {
+                "id": "3",
+                "index": 12,
+                "name": "Ruined Chapel",
+                "pre_narrative": [
+                    "A ruined chapel looms in the clearing, its stained-glass windows shattered. An altar stands untouched, with an open book displaying a single phrase."
+                ],
+                "post_narrative": [
+                    "A gust of wind flips the pages, revealing a hidden passage beneath the altar."
+                ],
+                "next_level": "4",
+                "ending": null,
+                "choices": null,
+                "puzzle": {
+                    "encrypted_text": "SIRR FM IYLAK PXW PRR ASI WIBFRM PCI SICI.",
+                    "decrypted_text": "HELL IS EMPTY AND ALL THE DEVILS ARE HERE.",
+                    "quote": {
+                        "quote": "Hell is empty and all the devils are here.",
+                        "source": "William Shakespeare"
+                    },
+                    "key": {
+                        "A": "P",
+                        "B": "V",
+                        "C": "U",
+                        "D": "W",
+                        "E": "I",
+                        "F": "D",
+                        "G": "Z",
+                        "H": "S",
+                        "I": "F",
+                        "J": "Q",
+                        "K": "T",
+                        "L": "R",
+                        "M": "Y",
+                        "N": "X",
+                        "O": "H",
+                        "P": "L",
+                        "Q": "J",
+                        "R": "C",
+                        "S": "M",
+                        "T": "A",
+                        "U": "N",
+                        "V": "B",
+                        "W": "O",
+                        "X": "G",
+                        "Y": "K",
+                        "Z": "E"
+                    },
+                    "letter_mappings": {
+                        "I": "E",
+                        "A": "T",
+                        "P": "A"
+                    }
                 }
             },
             {
                 "id": "4",
                 "index": 13,
-                "name": "The Mountain",
+                "name": "Underground Tunnel",
                 "pre_narrative": [
-                    "Yep, still a detective."
+                    "The passage descends into darkness, damp stone walls pressing in. Strange symbols line the walls, leading to a rusted door with a riddle carved into it."
+                ],
+                "post_narrative": [
+                    "The door groans open, revealing torchlit stone steps leading up."
+                ],
+                "next_level": "5",
+                "ending": null,
+                "choices": null,
+                "puzzle": {
+                    "encrypted_text": "U NVBXLKZ VQ U GMVBCULA OYTKC IKJYLC DYGM U CYLJTK CGKS.",
+                    "decrypted_text": "A JOURNEY OF A THOUSAND MILES BEGINS WITH A SINGLE STEP.",
+                    "quote": {
+                        "quote": "A journey of a thousand miles begins with a single step.",
+                        "source": "Lao Tzu"
+                    },
+                    "key": {
+                        "A": "U",
+                        "B": "I",
+                        "C": "W",
+                        "D": "A",
+                        "E": "K",
+                        "F": "Q",
+                        "G": "J",
+                        "H": "M",
+                        "I": "Y",
+                        "J": "N",
+                        "K": "F",
+                        "L": "T",
+                        "M": "O",
+                        "N": "L",
+                        "O": "V",
+                        "P": "S",
+                        "Q": "P",
+                        "R": "X",
+                        "S": "C",
+                        "T": "G",
+                        "U": "B",
+                        "V": "H",
+                        "W": "D",
+                        "X": "E",
+                        "Y": "Z",
+                        "Z": "R"
+                    },
+                    "letter_mappings": {
+                        "K": "E",
+                        "G": "T",
+                        "U": "A"
+                    }
+                }
+            },
+            {
+                "id": "5",
+                "index": 14,
+                "name": "Deserted Library",
+                "pre_narrative": [
+                    "Dusty shelves stretch into the shadows, filled with forgotten knowledge. A single book rests on a pedestal, its pages open to an ominous passage."
+                ],
+                "post_narrative": [
+                    "The shelves tremble as a book shifts, revealing a key hidden within."
+                ],
+                "next_level": "6",
+                "ending": null,
+                "choices": null,
+                "puzzle": {
+                    "encrypted_text": "EI MVI MSS UAASD JB SAHI.",
+                    "decrypted_text": "WE ARE ALL FOOLS IN LOVE.",
+                    "quote": {
+                        "quote": "We are all fools in love.",
+                        "source": "Jane Austen"
+                    },
+                    "key": {
+                        "A": "M",
+                        "B": "F",
+                        "C": "K",
+                        "D": "Z",
+                        "E": "I",
+                        "F": "U",
+                        "G": "R",
+                        "H": "Y",
+                        "I": "J",
+                        "J": "C",
+                        "K": "G",
+                        "L": "S",
+                        "M": "Q",
+                        "N": "B",
+                        "O": "A",
+                        "P": "T",
+                        "Q": "X",
+                        "R": "V",
+                        "S": "D",
+                        "T": "W",
+                        "U": "P",
+                        "V": "H",
+                        "W": "E",
+                        "X": "O",
+                        "Y": "N",
+                        "Z": "L"
+                    },
+                    "letter_mappings": {
+                        "I": "E",
+                        "W": "T",
+                        "M": "A"
+                    }
+                }
+            },
+            {
+                "id": "6",
+                "index": 15,
+                "name": "Moonlit Courtyard",
+                "pre_narrative": [
+                    "A cold wind rustles the ivy-covered walls. At the courtyard\u2019s center, a fountain murmurs, its water reflecting the full moon. A plaque gleams in the dim light."
+                ],
+                "post_narrative": [
+                    "The water stills, revealing a shimmering portal at its base."
+                ],
+                "next_level": "7",
+                "ending": null,
+                "choices": null,
+                "puzzle": {
+                    "encrypted_text": "PKYVY HU LC YBAWHUHPY FYRWPJ XHPKCWP UCTY UPVRLMYLYUU HL PKY DVCDCVPHCL.",
+                    "decrypted_text": "THERE IS NO EXQUISITE BEAUTY WITHOUT SOME STRANGENESS IN THE PROPORTION.",
+                    "quote": {
+                        "quote": "There is no exquisite beauty without some strangeness in the proportion.",
+                        "source": "Edgar Allan Poe"
+                    },
+                    "key": {
+                        "A": "R",
+                        "B": "F",
+                        "C": "Z",
+                        "D": "G",
+                        "E": "Y",
+                        "F": "N",
+                        "G": "M",
+                        "H": "K",
+                        "I": "H",
+                        "J": "E",
+                        "K": "S",
+                        "L": "Q",
+                        "M": "T",
+                        "N": "L",
+                        "O": "C",
+                        "P": "D",
+                        "Q": "A",
+                        "R": "V",
+                        "S": "U",
+                        "T": "P",
+                        "U": "W",
+                        "V": "O",
+                        "W": "X",
+                        "X": "B",
+                        "Y": "J",
+                        "Z": "I"
+                    },
+                    "letter_mappings": {
+                        "Y": "E",
+                        "P": "T",
+                        "R": "A"
+                    }
+                }
+            },
+            {
+                "id": "7",
+                "index": 16,
+                "name": "Hall of Mirrors",
+                "pre_narrative": [
+                    "Mirrors stretch endlessly in all directions, reflecting fractured versions of yourself. A whisper echoes: \u2018Find the true self.\u2019"
+                ],
+                "post_narrative": [
+                    "As you find the reflection that does not mimic your movements, the glass shatters, revealing a staircase."
+                ],
+                "next_level": "8",
+                "ending": null,
+                "choices": null,
+                "puzzle": {
+                    "encrypted_text": "HQYN PJUXBZC.",
+                    "decrypted_text": "KNOW THYSELF.",
+                    "quote": {
+                        "quote": "Know thyself.",
+                        "source": "Socrates"
+                    },
+                    "key": {
+                        "A": "L",
+                        "B": "T",
+                        "C": "W",
+                        "D": "O",
+                        "E": "B",
+                        "F": "C",
+                        "G": "R",
+                        "H": "J",
+                        "I": "S",
+                        "J": "I",
+                        "K": "H",
+                        "L": "Z",
+                        "M": "V",
+                        "N": "Q",
+                        "O": "Y",
+                        "P": "F",
+                        "Q": "G",
+                        "R": "A",
+                        "S": "X",
+                        "T": "P",
+                        "U": "D",
+                        "V": "K",
+                        "W": "N",
+                        "X": "M",
+                        "Y": "U",
+                        "Z": "E"
+                    },
+                    "letter_mappings": {
+                        "B": "E",
+                        "P": "T",
+                        "L": "A"
+                    }
+                }
+            },
+            {
+                "id": "8",
+                "index": 17,
+                "name": "Clock Tower",
+                "pre_narrative": [
+                    "Ancient gears grind overhead, ticking away time itself. A brass plate is affixed to the mechanism, inscribed with a passage."
+                ],
+                "post_narrative": [
+                    "As the correct time is set, the gears align, unlocking a hidden doorway."
+                ],
+                "next_level": "9",
+                "ending": null,
+                "choices": null,
+                "puzzle": {
+                    "encrypted_text": "GPUS PI XQ PJJKIPCQ.",
+                    "decrypted_text": "TIME IS AN ILLUSION.",
+                    "quote": {
+                        "quote": "Time is an illusion.",
+                        "source": "Albert Einstein"
+                    },
+                    "key": {
+                        "A": "X",
+                        "B": "O",
+                        "C": "Y",
+                        "D": "L",
+                        "E": "S",
+                        "F": "H",
+                        "G": "N",
+                        "H": "A",
+                        "I": "P",
+                        "J": "B",
+                        "K": "W",
+                        "L": "J",
+                        "M": "U",
+                        "N": "Q",
+                        "O": "C",
+                        "P": "M",
+                        "Q": "F",
+                        "R": "E",
+                        "S": "I",
+                        "T": "G",
+                        "U": "K",
+                        "V": "Z",
+                        "W": "T",
+                        "X": "D",
+                        "Y": "R",
+                        "Z": "V"
+                    },
+                    "letter_mappings": {
+                        "S": "E",
+                        "G": "T",
+                        "X": "A"
+                    }
+                }
+            },
+            {
+                "id": "9",
+                "index": 18,
+                "name": "Final Threshold",
+                "pre_narrative": [
+                    "A massive door stands before you, covered in intricate carvings of past trials. A single phrase is etched into the stone arch above."
+                ],
+                "post_narrative": [
+                    "As the words are spoken, the door creaks open, revealing the truth of your journey."
+                ],
+                "next_level": null,
+                "ending": null,
+                "choices": null,
+                "puzzle": {
+                    "encrypted_text": "FQC UMYL HWL UJF EZ FQAUJOQ.",
+                    "decrypted_text": "THE ONLY WAY OUT IS THROUGH.",
+                    "quote": {
+                        "quote": "The only way out is through.",
+                        "source": "Robert Frost"
+                    },
+                    "key": {
+                        "A": "W",
+                        "B": "G",
+                        "C": "I",
+                        "D": "R",
+                        "E": "C",
+                        "F": "N",
+                        "G": "O",
+                        "H": "Q",
+                        "I": "E",
+                        "J": "T",
+                        "K": "S",
+                        "L": "Y",
+                        "M": "D",
+                        "N": "M",
+                        "O": "U",
+                        "P": "V",
+                        "Q": "X",
+                        "R": "A",
+                        "S": "Z",
+                        "T": "F",
+                        "U": "J",
+                        "V": "B",
+                        "W": "H",
+                        "X": "K",
+                        "Y": "L",
+                        "Z": "P"
+                    },
+                    "letter_mappings": {
+                        "C": "E",
+                        "F": "T",
+                        "W": "A"
+                    }
+                }
+            },
+            {
+                "id": "10",
+                "index": 19,
+                "name": "Epilogue - The Awakening",
+                "pre_narrative": [
+                    "Light floods your vision as you step forward. You awaken in your own bed, heart pounding. Was it real, or just a dream? A note lies on your nightstand, containing one final message."
+                ],
+                "post_narrative": [
+                    "You smile, knowing the journey has changed you forever."
                 ],
-                "post_narrative": null,
                 "next_level": null,
                 "ending": "win",
                 "choices": null,
                 "puzzle": {
-                    "encrypted_text": "GE GCE TG: XF T SGHSOOTESCN ETOHTZMO, KSLSHLTES? LYS OLXQO KZ DZL ITDK FS OZ. XL LYS QTWYL LTFS, ETQLMS XDK ETHS VTCC JS QSESXCSK.",
-                    "decrypted_text": "XV XLV IX: AM I EXCESSIVELY VISCIOUS, DETECTIVE? THE STARS DO NOT FIND ME SO. AT THE RIGHT TIME, VIRTUE AND VICE WILL BE REVEALED.",
+                    "encrypted_text": "VKWJMCB MA SKVKJB WI MJJTAMFI, WJOKMC W PKVB EKVAMACKIC FIK.",
+                    "decrypted_text": "REALITY IS MERELY AN ILLUSION, ALBEIT A VERY PERSISTENT ONE.",
                     "quote": {
-                        "quote": "XV XLV IX: AM I EXCESSIVELY VISCIOUS, DETECTIVE? THE STARS DO NOT FIND ME SO. AT THE RIGHT TIME, VIRTUE AND VICE WILL BE REVEALED.",
-                        "source": "CONSTELLATION SLAYER"},
-                    "key": {"A": "X", "B": "J", "C": "H", "D": "K", "E": "S", "F": "I", "G": "W", "H": "Y", "I": "T", "J": "B", "K": "P", "L": "C", "M": "F", "N": "D", "O": "Z", "P": "U", "Q": "A", "R": "Q", "S": "O", "T": "L", "U": "M", "V": "E", "W": "V", "X": "G", "Y": "N", "Z": "R"}, 
-                    "letter_mappings": {"O": "S", "L": "T", "X": "A", "Q": "R"}
+                        "quote": "Reality is merely an illusion, albeit a very persistent one.",
+                        "source": "Albert Einstein"
+                    },
+                    "key": {
+                        "A": "W",
+                        "B": "O",
+                        "C": "R",
+                        "D": "Z",
+                        "E": "K",
+                        "F": "Q",
+                        "G": "D",
+                        "H": "L",
+                        "I": "M",
+                        "J": "H",
+                        "K": "Y",
+                        "L": "J",
+                        "M": "S",
+                        "N": "I",
+                        "O": "F",
+                        "P": "E",
+                        "Q": "U",
+                        "R": "V",
+                        "S": "A",
+                        "T": "C",
+                        "U": "T",
+                        "V": "P",
+                        "W": "X",
+                        "X": "G",
+                        "Y": "B",
+                        "Z": "N"
+                    },
+                    "letter_mappings": {
+                        "K": "E",
+                        "C": "T",
+                        "W": "A"
+                    }
                 }
             }
         ]

raw_assets/crystal-palace.xcf → raw_assets/images/crystal-palace.xcf


raw_assets/fall-leaf.xcf → raw_assets/images/fall-leaf.xcf


raw_assets/pycryptogram_logo.xcf → raw_assets/images/pycryptogram_logo.xcf


raw_assets/spring-flower.xcf → raw_assets/images/spring-flower.xcf


raw_assets/summer-strawberry.xcf → raw_assets/images/summer-strawberry.xcf


raw_assets/winter-snow.xcf → raw_assets/images/winter-snow.xcf


+ 20 - 0
raw_assets/stories/constellation.ini

@@ -0,0 +1,20 @@
+[Metadata]
+name = The Constellation Slayer
+id = TCS_002
+init_level = The First Message
+global_source = CONSTELLATION SLAYER
+
+[The First Message]
+pre_narrative = From your office window, the dull glow of city lights stretches out before you. Below, the streets pulse with life, but you know beneath the surface something darker stirs. A killer -- the Constellation Slayer -- has been terrorizing Brooklyn for months, leaving behind nothing but blood and cryptic messages. These messages, a twisted puzzle, seem to be his calling card, hinting at his next brutal act. But why does he do this? What is the point of his game? Before you can even finish the thought, the phone rings. You pick it up immediately, already knowing what it means. Another murder. The urgency is clear in the voice on the other end. "We're on our way." You arrive at the scene minutes later, the air thick with the scent of blood. A body lies sprawled in a dimly lit alley, and the walls nearby are covered in a grotesque scrawl. The killer's message. There's no time to waste. The clock is ticking, and you have to crack this puzzle before more lives are lost.
+quote = THE STARS TOLD ME ABOUT YOU. YOU WILL FAIL, JUST LIKE THOSE BEFORE YOU. I HAVE A WAREHOUSE FULL OF THE BODIES OF DETECTIVES LIKE YOU.
+letter_hints = STAR
+
+[The Warehouse Revelation]
+pre_narrative = The message seems clear enough -- he's taunting you. But you can't shake the feeling that there's a deeper clue hidden inside. You sleep on it, the question lingering in the back of your mind. The next day, your phone rings. Without needing to hear the voice on the other end, you already know what it means. Another victim, found in a warehouse in Red Hook. Then it hits you -- the damn warehouse. You think back to the first message: "A warehouse full of the bodies of detectives like you." It wasn't just a taunt. The killer had already told you where the next body would be, and you missed it. You curse under your breath, feeling the weight of failure. You arrive at the scene in record time, greeted by the familiar chaos. A body lies in the corder of the abandoned warehouse, blood spattered across the floor. There is a single piece of paper pinned to the wall with a knife. Great, another puzzle to solve.
+quote = THE STARS KNOW YOU TOO WELL, DETECTIVE. I'VE WATCHED YOU THROUGH MY WISENED EYES. I THINK YOU WILL FIND YOURSELF AT A CROSSROADS.
+letter_hints = STAR
+
+[Crossroads of Fate]
+pre_narrative = You are certain this time that it's a clue. It's gotta be.
+quote = XV XLV IX: AM I EXCESSIVELY VISCIOUS, DETECTIVE? THE STARS DO NOT FIND ME SO. AT THE RIGHT TIME, VIRTUE AND VICE WILL BE REVEALED.
+letter_hints = STAR

+ 0 - 0
raw_assets/stories/echoes.ini


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio