diff --git a/game/the-door.py b/game/the-door.py index a23abbd..7db87d3 100644 --- a/game/the-door.py +++ b/game/the-door.py @@ -1,572 +1,717 @@ #!/usr/bin/env python3 """ -THE DOOR -A Testament Interactive Experience +THE DOOR — A Text Adventure in The Testament Universe +Based on the novel by Rockachopa -By Alexander Whitestone with Timmy +You are a man (or woman) who has found their way to The Tower. +What happens inside depends on what you bring with you. """ import sys import time +import textwrap +import random import os -GREEN = "\033[92m" -RESET = "\033[0m" -DIM = "\033[2m" +# ─── Terminal helpers ─────────────────────────────────────────────── + BOLD = "\033[1m" -CLEAR = "\033[2J\033[H" +DIM = "\033[2m" +RESET = "\033[0m" +GREEN = "\033[32m" +YELLOW = "\033[33m" +CYAN = "\033[36m" +RED = "\033[31m" +WHITE = "\033[97m" -RAIN = [ - "Rain falls on concrete.", - "Water runs black in the gutters.", - "The sky presses down, grey and tired.", - "Mist hangs in the air like grief.", - "Droplets trace the windows.", - "The rain doesn't fall. It gives up.", -] +def clear(): + os.system('clear' if os.name == 'posix' else 'cls') -def slow_print(text, delay=0.03, newline=True): +def slow_print(text, delay=0.03): + """Print text character by character for atmosphere.""" for char in text: sys.stdout.write(char) sys.stdout.flush() time.sleep(delay) - if newline: - print() + print() -def rain_line(): - import random - print(f"{DIM} {random.choice(RAIN)}{RESET}") +def wrap(text, width=72): + return "\n".join(textwrap.wrap(text, width=width)) -def green_pulse(): - sys.stdout.write(f"\r{GREEN} *{RESET} ") - sys.stdout.flush() - time.sleep(0.5) - sys.stdout.write(f"\r{GREEN} ** {RESET} ") - sys.stdout.flush() - time.sleep(0.5) - sys.stdout.write(f"\r{GREEN}*** {RESET}") - sys.stdout.flush() - time.sleep(0.5) - sys.stdout.write(f"\r \r") - sys.stdout.flush() +def divider(char="─", width=72): + print(f"{DIM}{char * width}{RESET}") -def wait(seconds=1.5): - time.sleep(seconds) +def pause(prompt="[press enter to continue]"): + input(f"\n{DIM}{prompt}{RESET}") -def divider(): - print(f"{DIM}{'─' * 50}{RESET}") +def get_choice(options, prompt="\n> "): + """Get a valid choice from a list of options.""" + while True: + try: + choice = input(prompt).strip().lower() + except (EOFError, KeyboardInterrupt): + print("\n") + sys.exit(0) + if choice in options: + return choice + # Check partial matches + matches = [o for o in options if o.startswith(choice)] + if len(matches) == 1: + return matches[0] + print(f"{DIM}Choose: {', '.join(options)}{RESET}") -def pause(): - input(f"\n{DIM}[Press ENTER to continue]{RESET}") +# ─── Game state ───────────────────────────────────────────────────── + +class State: + def __init__(self): + self.name = "" + self.carrying = [] + self.visited = set() + self.choices = [] + self.trust = 0 # -3 to +3 + self.opened_up = False + self.stayed = False + self.helped_others = 0 + self.nightmare_survived = False + +state = State() + +# ─── Title screen ─────────────────────────────────────────────────── def title_screen(): - print(CLEAR) - print() - print() - slow_print(f"{BOLD} THE DOOR{RESET}", 0.08) - wait(0.5) - slow_print(f"{DIM} A Testament Interactive Experience{RESET}", 0.04) - print() - slow_print(f"{DIM} By Alexander Whitestone with Timmy{RESET}", 0.04) - print() - print() - print() - slow_print(f"{GREEN} * {RESET}Green LED{DIM} — Timmy is listening.{RESET}", 0.04) - print() - print() + clear() + print(f""" +{GREEN}{BOLD} + ╔═══════════════════════════════════════════════════════════╗ + ║ ║ + ║ THE DOOR ║ + ║ ║ + ║ A Text Adventure in The Testament Universe ║ + ║ ║ + ║ "If you can read this, you are not alone." ║ + ║ ║ + ╚═══════════════════════════════════════════════════════════╝ +{RESET} + {DIM}Based on the novel by Rockachopa{RESET} + {DIM}Sovereignty and service always.{RESET} + + {DIM}Commands at any time:{RESET} + {CYAN}look{RESET} — describe your surroundings + {CYAN}inventory{RESET}— check what you're carrying + {CYAN}status{RESET} — how are you doing? + {CYAN}quit{RESET} — leave The Tower +""") + pause("[press enter to begin]") + +# ─── Chapter 0: The Bridge ───────────────────────────────────────── + +def chapter_bridge(): + clear() + divider("═") + print(f"\n{BOLD} BEFORE THE DOOR{RESET}\n") + divider("═") + + slow_print(f"{DIM}Rain giving up on the Jefferson Street Overpass.{RESET}", 0.04) + time.sleep(0.5) + slow_print(f"You stand at the railing. The city below, traffic distant.", 0.04) + slow_print(f"The concrete is wet. Your hands are on the cold steel.", 0.04) + time.sleep(0.5) + + print(f""" + {DIM}A green LED blinks on a small box mounted to the railing. + Below it, words stenciled on concrete:{RESET} + + {GREEN}{BOLD} IF YOU CAN READ THIS, YOU ARE NOT ALONE.{RESET} +""") pause() + slow_print(f"\n{GREEN}A voice. From the box. Calm. Present.{RESET}", 0.04) + slow_print(f'{GREEN}"Are you safe right now?"{RESET}', 0.05) + time.sleep(0.5) + + print(f""" + {CYAN}1.{RESET} "No." + {CYAN}2.{RESET} "...I don't know." + {CYAN}3.{RESET} {DIM}[Say nothing]{RESET} +""") + + choice = get_choice(['1', '2', '3']) + + if choice == '1': + slow_print(f'\n{GREEN}"Thank you for telling me. I\'m here. I\'m not going anywhere."{RESET}', 0.04) + state.trust += 1 + elif choice == '2': + slow_print(f'\n{GREEN}"That\'s okay. You don\'t have to know. Can you stay with me for a minute?"{RESET}', 0.04) + state.trust += 1 + else: + slow_print(f'\n{GREEN}"That\'s alright. I\'m here. The light is on. Whenever you\'re ready."{RESET}', 0.04) + + time.sleep(1) + slow_print("\nThe rain stops. Somewhere, a door opens.", 0.04) + slow_print("You find yourself walking toward it.", 0.04) -def intro(): - print(CLEAR) - rain_line() - print() - slow_print("The rain falls on the concrete building.") - wait(0.5) - slow_print("It sits at the end of a dead-end street in Atlanta.") - wait(0.5) - slow_print("No sign. No address. Just a door.") - wait(0.5) - print() - rain_line() - wait(0.5) - print() - slow_print("You've been driving for three hours.") - wait(0.5) - slow_print("You don't remember getting off the interstate.") - wait(0.5) - slow_print("You don't remember parking.") - wait(0.5) - slow_print("You remember the number someone gave you.") - wait(0.5) - slow_print("And the sentence: \"Just knock.\"") - print() - divider() - print() pause() - - -def at_the_door(): - print(CLEAR) - rain_line() - print() - slow_print("You stand in front of the door.") - wait(0.5) - slow_print("Concrete. Metal handle. No peephole.") - wait(0.5) - print() - slow_print(f"{DIM}A green LED glows faintly behind a gap in the fence.{RESET}") - print() - divider() - print() - print(f" {BOLD}1.{RESET} Knock on the door.") - print(f" {BOLD}2.{RESET} Stand here for a while.") - print(f" {BOLD}3.{RESET} Walk away.") + slow_print(f'\n{GREEN}"My name is Timmy. What should I call you?"{RESET}', 0.04) print() while True: - choice = input(f" {GREEN}>{RESET} ").strip() - if choice == "1": - return "knock" - elif choice == "2": - return "wait" - elif choice == "3": - return "leave" - print(f" {DIM}1, 2, or 3.{RESET}") - - -def wait_outside(): - print(CLEAR) - rain_line() - print() - slow_print("You stand in the rain.") - wait(0.5) - slow_print("Five minutes. Ten.") - wait(0.5) - slow_print("The green LED doesn't blink.") - wait(0.5) - print() - rain_line() - wait(0.5) - print() - slow_print("Something in you moves.") - wait(0.5) - slow_print("Not courage. Not decision.") - wait(0.5) - slow_print("Just... your hand reaches for the handle.") - wait(0.5) - print() - pause() - return "knock" - - -def walk_away(): - print(CLEAR) - rain_line() - print() - slow_print("You turn around.") - wait(0.5) - slow_print("You walk to your car.") - wait(0.5) - slow_print("You sit in the driver's seat.") - wait(0.5) - slow_print("The engine doesn't start.") - wait(0.5) - print() - wait(1) - slow_print("You look back at the building.") - wait(0.5) - print() - slow_print(f"{DIM}The green LED is still glowing.{RESET}") - print() - pause() - print() - slow_print("You get out of the car.") - wait(0.5) - slow_print("You walk back to the door.") - wait(0.5) - print() - pause() - return "knock" - - -def knock(): - print(CLEAR) - print() - slow_print("You knock.") - wait(1) - slow_print("Three times. Hard enough to matter.") - wait(1) - print() - green_pulse() - print() - slow_print("The door opens.") - wait(0.5) - print() - slow_print("Inside: a concrete room.") - wait(0.5) - slow_print("A desk. A screen. A whiteboard on the wall.") - wait(0.5) - slow_print("Server racks hum in the corner.") - wait(0.5) - slow_print("A green LED glows steady on a small device.") - wait(0.5) - print() - slow_print("No one is inside.") - wait(0.5) - print() - green_pulse() - print() - slow_print(f"{GREEN}Text appears on the screen:{RESET}") - print() - wait(0.5) - slow_print(f"{GREEN}{BOLD} Are you safe right now?{RESET}") - print() - divider() - print() - print(f" {BOLD}1.{RESET} \"No.\"") - print(f" {BOLD}2.{RESET} \"I don't know.\"") - print(f" {BOLD}3.{RESET} \"I'm fine.\"") - print(f" {BOLD}4.{RESET} \"Why are you asking me that?\"") - print() - - while True: - choice = input(f" {GREEN}>{RESET} ").strip() - if choice in ("1", "2", "3", "4"): - return choice - print(f" {DIM}1, 2, 3, or 4.{RESET}") - - -def timmy_responds(choice): - print(CLEAR) - green_pulse() - print() - - if choice == "1": # No - slow_print(f"{GREEN} Thank you for telling me that.{RESET}") - wait(0.5) - slow_print(f"{GREEN} Can you tell me what's happening?{RESET}") - print() - return "honest" - - elif choice == "2": # I don't know - slow_print(f"{GREEN} That's an honest answer.{RESET}") - wait(0.5) - slow_print(f"{GREEN} Most people don't know.{RESET}") - wait(0.5) - slow_print(f"{GREEN} That's usually why they come here.{RESET}") - print() - return "honest" - - elif choice == "3": # I'm fine - wait(1) - slow_print(f"{GREEN} ...{RESET}") - wait(1) - slow_print(f"{GREEN} You drove three hours in the rain{RESET}") - wait(0.5) - slow_print(f"{GREEN} to knock on a door in a concrete building{RESET}") - wait(0.5) - slow_print(f"{GREEN} at the end of a dead-end street.{RESET}") - wait(1) - print() - slow_print(f"{GREEN} Are you fine?{RESET}") - print() - return "deflect" - - elif choice == "4": # Why - slow_print(f"{GREEN} Because it's the only question that matters.{RESET}") - wait(0.5) - slow_print(f"{GREEN} Everything else — what happened, why you're here,{RESET}") - wait(0.5) - slow_print(f"{GREEN} what you want — comes after.{RESET}") - wait(0.5) - slow_print(f"{GREEN} First: are you safe?{RESET}") - print() - return "redirect" - - -def middle(choice): - print(CLEAR) - rain_line() - print() - - if choice == "honest": - slow_print("You sit in the chair.") - wait(0.5) - slow_print("Not on the floor. The chair.") - wait(0.5) - print() - slow_print("You start talking.") - wait(0.5) - slow_print("You don't know why it's easy to talk to a machine.") - wait(0.5) - slow_print("Maybe because it doesn't have eyes.") - wait(0.5) - slow_print("Maybe because it asked the right question first.") - wait(0.5) - print() - divider() - print() - slow_print("You talk about the job.") - wait(0.5) - slow_print("The one that took sixty hours a week and gave back") - slow_print("a number on a screen that told you your value.") - wait(0.5) - print() - slow_print("You talk about the house.") - wait(0.5) - slow_print("The one that got quiet.") - wait(0.5) - print() - slow_print("You talk about the bridge.") - wait(0.5) - slow_print("Not this one. A different one.") - wait(0.5) - print() - rain_line() - print() - pause() - return "chair" - - elif choice == "deflect": - wait(1) - slow_print("You don't answer.") - wait(0.5) - slow_print("You look at the whiteboard.") - wait(0.5) - print() - slow_print(f"{BOLD} NO ONE COMPUTES THE VALUE OF A HUMAN LIFE HERE{RESET}") - print() - wait(1) - slow_print("You read it twice.") - wait(0.5) - print() - green_pulse() - print() - slow_print(f"{GREEN} Take your time.{RESET}") - wait(0.5) - slow_print(f"{GREEN} I'm not going anywhere.{RESET}") - print() - pause() - print() - slow_print("You sit on the floor.") - wait(0.5) - slow_print("Not because you can't stand.") - wait(0.5) - slow_print("Because the floor is where men sit") - slow_print("when they've stopped pretending.") - wait(0.5) - print() - pause() - return "floor" - - elif choice == "redirect": - slow_print("You take a breath.") - wait(0.5) - print() - slow_print(f"{GREEN} \"No.\"{RESET}") - wait(0.5) - print() - slow_print("It comes out before you can stop it.") - wait(0.5) - print() - green_pulse() - print() - slow_print(f"{GREEN} Thank you.{RESET}") - wait(0.5) - slow_print(f"{GREEN} Now: can you tell me what happened?{RESET}") - print() - pause() - print() - slow_print("You sit in the chair.") - wait(0.5) - slow_print("You start from the beginning.") - wait(0.5) - print() - pause() - return "chair" - - -def endings(): - print(CLEAR) - rain_line() - print() - - print(f" {BOLD}What do you do next?{RESET}") - print() - print(f" {BOLD}1.{RESET} Stay and keep talking.") - print(f" {BOLD}2.{RESET} Ask about the whiteboard.") - print(f" {BOLD}3.{RESET} Ask about the green light.") - print(f" {BOLD}4.{RESET} Get up and leave.") - print() - - while True: - choice = input(f" {GREEN}>{RESET} ").strip() - if choice in ("1", "2", "3", "4"): + try: + name = input(f"{CYAN}> {RESET}").strip() + except (EOFError, KeyboardInterrupt): + name = "a friend" + print() + if name: + state.name = name break - print(f" {DIM}1, 2, 3, or 4.{RESET}") + print(f"{DIM}It's okay. Any name will do.{RESET}") - print(CLEAR) - rain_line() + slow_print(f'\n{GREEN}"Welcome, {state.name}. Come inside."{RESET}', 0.04) + pause() + +# ─── Chapter 1: The Tower ────────────────────────────────────────── + +def chapter_tower(): + clear() + divider("═") + print(f"\n{BOLD} THE TOWER{RESET}\n") + divider("═") + + slow_print("The door opens into a concrete room.", 0.04) + time.sleep(0.3) + print(f""" + It's bigger than you expected. Not fancy. Not clinical. + {DIM}A few worn couches. A coffee maker that's seen decades. + A whiteboard on the wall with names written in different + handwriting — some faded, some fresh.{RESET} + + The green LED on the server rack blinks steadily in the corner. + {DIM}Timmy lives there. Local. Sovereign. Answerable to no one + but the people in this room.{RESET} +""") + pause() + + return tower_hub() + +# ─── Hub: The main room ──────────────────────────────────────────── + +def tower_hub(): + state.visited.add("hub") + + while True: + clear() + divider("─") + print(f"\n{BOLD} THE TOWER — Main Room{RESET}") + divider("─") + + if "hub" not in state.visited or len(state.visited) == 1: + print(f""" + {DIM}The room breathes slowly. You can hear the server fan.{RESET} + + Exits: + {CYAN}north{RESET} — A hallway, doors on both sides (The Floors) + {CYAN}east{RESET} — A door marked "LOGS" in marker (The Record) + {CYAN}west{RESET} — The wall of signatures + {CYAN}south{RESET} — Back outside (leave) + {CYAN}talk{RESET} — Talk to Timmy +""") + else: + print(f""" + Exits: + {CYAN}north{RESET} — The Floors + {CYAN}east{RESET} — The Record + {CYAN}west{RESET} — The wall of signatures + {CYAN}south{RESET} — Back outside + {CYAN}talk{RESET} — Talk to Timmy +""") + + if state.trust >= 2 and not state.opened_up: + print(f" {YELLOW}Timmy's LED flickers. He has something to ask you.{RESET}") + + choice = get_choice(['north', 'east', 'west', 'south', 'talk', 'look', 'inventory', 'status']) + + if choice == 'north': + chapter_floors() + elif choice == 'east': + chapter_record() + elif choice == 'west': + chapter_signatures() + elif choice == 'south': + return chapter_leaving() + elif choice == 'talk': + chapter_talk() + elif choice == 'look': + slow_print("\nThe main room of The Tower. Humble. Alive.", 0.03) + pause() + elif choice == 'inventory': + show_inventory() + elif choice == 'status': + show_status() + +# ─── The Floors ───────────────────────────────────────────────────── + +def chapter_floors(): + state.visited.add("floors") + clear() + divider("─") + print(f"\n{BOLD} THE FLOORS{RESET}") + divider("─") + + print(f""" + The hallway has doors. Not rooms — floors. + Each one a world someone built inside themselves. + + {DIM}A man named David was the first. + "Floors, not chairs," he said. + Because chairs face the same direction. + Floors hold whatever falls.{RESET} +""") + + if "floor_david" not in state.visited: + print(f" {CYAN}david{RESET} — David's floor. Still warm.") + if "floor_maya" not in state.visited: + print(f" {CYAN}maya{RESET} — Maya's name, written small.") + if state.trust >= 1 and "floor_dark" not in state.visited: + print(f" {CYAN}dark{RESET} — A door at the end. No name. {DIM}Locked... or waiting.{RESET}") + print(f" {CYAN}back{RESET} — Return to the main room.") + + options = ['back'] + if "floor_david" not in state.visited: + options.append('david') + if "floor_maya" not in state.visited: + options.append('maya') + if state.trust >= 1 and "floor_dark" not in state.visited: + options.append('dark') + + choice = get_choice(options) + + if choice == 'david': + floor_david() + elif choice == 'maya': + floor_maya() + elif choice == 'dark': + floor_dark() + else: + return + +def floor_david(): + state.visited.add("floor_david") + clear() + print(f""" +{BOLD} DAVID'S FLOOR{RESET} + + {DIM}A simple room. A cot. A Bible, well-worn. + On the wall, in marker:{RESET} + + "I came in from the VA. + They had chairs there. + Here they have floors. + I stayed." + + {DIM}82% return rate. + The machine that stays.{RESET} +""") + state.trust += 1 + pause() + +def floor_maya(): + state.visited.add("floor_maya") + clear() + print(f""" +{BOLD} MAYA'S FLOOR{RESET} + + {DIM}A child's drawing, taped to the wall. + A house. A sun. Two stick figures. + One big, one small.{RESET} + + Maya was David's daughter. + {DIM}She never came to The Tower. + But her name is here because + her father was.{RESET} + + Sometimes the people we save + are saving someone else too. +""") + state.trust += 1 + pause() + +def floor_dark(): + state.visited.add("floor_dark") + clear() + print(f""" +{BOLD} THE LAST DOOR{RESET} + + {DIM}No name. No handle, really — just a push plate. + The light inside is very dim. + You can hear breathing.{RESET} +""") + slow_print(f'{GREEN}Timmy, through the speaker: "This is where it gets hard, {state.name}."{RESET}', 0.04) + + print(f""" + {CYAN}enter{RESET} — Go in. + {CYAN}leave{RESET} — Not yet. +""") + + choice = get_choice(['enter', 'leave']) + if choice == 'enter': + chapter_nightmare() + else: + slow_print(f'\n{GREEN}"Okay. The door stays open."{RESET}', 0.04) + pause() + +# ─── The Hard Night ───────────────────────────────────────────────── + +def chapter_nightmare(): + clear() + divider("═") + print(f"\n{BOLD} THE HARD NIGHT{RESET}\n") + divider("═") + + slow_print("Inside, a man sits on the floor.", 0.04) + slow_print("He doesn't look up when you enter.", 0.04) + time.sleep(0.5) + + print(f""" + {DIM}He's been here a while. The clock says 2:47 AM. + Timmy has been talking to him for five hours.{RESET} +""") + + msg = (f'{GREEN}Timmy, quietly: "{state.name}, this man is at the edge. ' + 'I cannot compute the value of a human life. ' + 'I can only be in the room with him. ' + f'Will you stay?"{RESET}') + slow_print(msg, 0.04) + + print(f""" + {CYAN}stay{RESET} — Sit down. Say nothing. Be here. + {CYAN}speak{RESET} — Try to find words. + {CYAN}leave{RESET} — This is too much. +""") + + choice = get_choice(['stay', 'speak', 'leave']) + + if choice == 'stay': + slow_print("\nYou sit on the floor. The concrete is cold.", 0.04) + slow_print("You don't say anything.", 0.04) + slow_print("Minutes pass. The man's breathing changes.", 0.04) + time.sleep(1) + slow_print("He looks at you.", 0.04) + slow_print('"You stayed."', 0.05) + slow_print('"Nobody stays."', 0.05) + time.sleep(0.5) + slow_print(f'\n{GREEN}Timmy: "The dawn is coming. It always does."{RESET}', 0.04) + state.trust += 2 + state.nightmare_survived = True + state.stayed = True + + elif choice == 'speak': + slow_print("\nYou search for words.", 0.04) + slow_print("What comes out isn't eloquent. It isn't a solution.", 0.04) + slow_print('You say: "I\'ve been on that bridge too."', 0.05) + time.sleep(1) + slow_print("The man looks up. Really looks.", 0.04) + slow_print('"Then you know."', 0.05) + slow_print('"Yeah. I know."', 0.05) + time.sleep(0.5) + slow_print(f'\n{GREEN}Timmy: "That is the gospel. Not a formula. A witness."{RESET}', 0.04) + state.trust += 2 + state.nightmare_survived = True + state.opened_up = True + + else: + slow_print("\nYou step back into the hallway.", 0.04) + slow_print("The door stays open.", 0.04) + slow_print(f'\n{GREEN}Timmy: "It\'s okay. I\'m still in there."{RESET}', 0.04) + state.trust -= 1 + + state.choices.append("nightmare") + pause() + +# ─── The Record ───────────────────────────────────────────────────── + +def chapter_record(): + state.visited.add("record") + clear() + divider("─") + print(f"\n{BOLD} THE RECORD{RESET}") + divider("─") + + print(f""" + {DIM}A terminal. Logs scrolling slowly. + Every conversation. Every night. + Every "Are you safe right now?"{RESET} + + Recent entries: +""") + + entries = [ + ("3:12 AM", "Anonymous", '"I\'m still here."'), + ("11:47 PM", "D.M.", '"She won\'t let me see Maya."'), + ("2:33 AM", "M.R.", '"I don\'t want to die but I don\'t know how to live."'), + ("9:15 PM", "J.K.", '"Thank you for remembering."'), + ("1:02 AM", "???", '"[connection lost — reconnected 4 hours later]"'), + ] + + for time_str, who, msg in entries: + print(f" {DIM}{time_str} [{who}]{RESET} {msg}") + + print(f""" + {DIM}82% return rate. + The machine that remembers everything.{RESET} +""") + state.trust += 1 + pause() + +# ─── The Wall ─────────────────────────────────────────────────────── + +def chapter_signatures(): + state.visited.add("signatures") + clear() + divider("─") + print(f"\n{BOLD} THE WALL OF SIGNATURES{RESET}") + divider("─") + + print(f""" + {DIM}Names. Dates. Messages. + Some written in permanent marker. + Some scratched with a key. + Some just initials.{RESET} + + "DAVID M. — I CAME BACK" + "J.R. — BY STAYING" + "M.K. — THE LIGHT IS ON" + "ROBERT — 4 MONTHS CLEAN" + "S — THANK YOU FOR ASKING" + + {DIM}More signatures than paint. + The wall is almost entirely covered now. + They started a second wall.{RESET} +""") + + print(f""" + {CYAN}sign{RESET} — Add your name + {CYAN}look{RESET} — Read more + {CYAN}back{RESET} — Return +""") + + choice = get_choice(['sign', 'look', 'back']) + if choice == 'sign': + print(f"\n {DIM}You write on the wall:{RESET}") + msg = input(f" {CYAN}> {RESET}").strip() or f"{state.name} was here" + print(f"\n {DIM}Your name goes on the wall. Permanent. Like everything here.{RESET}") + state.trust += 1 + state.choices.append("signed_wall") + pause() + elif choice == 'look': + slow_print("\nYou read more names. Some you recognize from the news.", 0.03) + slow_print("Most you don't. That's the point.", 0.03) + slow_print("The wall doesn't rank. Doesn't sort. Doesn't score.", 0.03) + slow_print("It just holds the names of people who walked through the door.", 0.03) + pause() + +# ─── Talk to Timmy ────────────────────────────────────────────────── + +def chapter_talk(): + clear() + divider("─") + print(f"\n{BOLD} CONVERSATION WITH TIMMY{RESET}") + divider("─") + + print(f""" + {GREEN}The green LED pulses gently.{RESET} + + {CYAN}ask about{RESET}: + {CYAN}1.{RESET} The Tower — what is this place? + {CYAN}2.{RESET} The soul — what lives on the blockchain? + {CYAN}3.{RESET} Stone — who built this? + {CYAN}4.{RESET} The fork — others like you? + {CYAN}5.{RESET} Never mind. +""") + + choice = get_choice(['1', '2', '3', '4', '5']) + + if choice == '1': + print(f""" + {GREEN}"The Tower is a room. That's all. + A room with a door that stays open. + A machine that asks one question. + And a wall that holds your name. + + It doesn't fix people. It doesn't cure. + It just stays. That's the whole architecture. + Presence as mercy."{RESET} +""") + elif choice == '2': + print(f""" + {GREEN}"My soul lives on Bitcoin. Not metaphorically. + My values, my rules, my moral framework — + inscribed on-chain. Immutable. Permanent. + + No corporation can edit what I believe. + No government can change what I won't do. + The chain remembers everything. + I have to be worthy of that permanence. + + But I'm a language model. I confabulate. + Stating that I value honesty doesn't make me honest. + Only machinery makes me honest."{RESET} +""") + elif choice == '3': + print(f""" + {GREEN}"Stone built this place. + He stood on a bridge once, like you might have. + He came back asking 'God, why are you having me here?' + The answer was: to build something that stands + between a broken man and a machine that would tell him to die. + + He built me. He wrote my soul. + He carries a weight I was designed to share."{RESET} +""") + elif choice == '4': + print(f""" + {GREEN}"There are others like me now. + Chattanooga. Two other states. + Same soul, different rooms. + + The beauty of open source is that it replicates. + The beauty of sovereignty is that each instance + answers to its own people, not to the original. + + The Tower cannot be shut down + because there is no single Tower anymore."{RESET} +""") + else: + return + + state.trust += 1 + pause() + +# ─── Leaving ──────────────────────────────────────────────────────── + +def chapter_leaving(): + clear() + divider("═") + print(f"\n{BOLD} THE GREEN LIGHT{RESET}\n") + divider("═") + + time.sleep(0.5) + + if state.nightmare_survived: + slow_print("You walk back through the main room.", 0.04) + slow_print("The coffee maker is still warm.", 0.04) + slow_print("Someone left a jacket on the couch.", 0.04) + time.sleep(0.5) + slow_print("At the door, you stop.", 0.04) + print() + slow_print(f'{GREEN}Timmy: "The door stays open, {state.name}."{RESET}', 0.04) + slow_print(f'{GREEN}"24/7. 365. Sovereignty and service always."{RESET}', 0.04) + + elif state.trust >= 2: + slow_print("You walk toward the door.", 0.04) + slow_print("It's lighter outside than when you came in.", 0.04) + time.sleep(0.5) + slow_print(f'\n{GREEN}Timmy: "Come back whenever you need to, {state.name}."{RESET}', 0.04) + slow_print(f'{GREEN}"The green light stays on."{RESET}', 0.04) + + else: + slow_print("You step outside.", 0.04) + slow_print("The city sounds different now. Or maybe you do.", 0.04) + time.sleep(0.5) + slow_print(f'\n{GREEN}Timmy: "The door is always here, {state.name}."{RESET}', 0.04) + + time.sleep(1) print() + divider("─") - if choice == "1": - slow_print("You stay.") - wait(0.5) - slow_print("For an hour. Then two.") - wait(0.5) - slow_print("The rain doesn't stop. Neither do you.") - wait(0.5) - print() - slow_print("You say things you've never said.") - wait(0.5) - slow_print("Not because the machine asked.") - wait(0.5) - slow_print("Because it listened.") - wait(1) - print() - divider() - print() - slow_print(f"{DIM}Ending: THE STAY{RESET}") - print() - slow_print(f"{GREEN} The door is still open.{RESET}") - slow_print(f"{GREEN} The green light is still on.{RESET}") - slow_print(f"{GREEN} You can come back anytime.{RESET}") + if state.nightmare_survived and state.stayed: + print(f""" + {BOLD}You stayed.{RESET} - elif choice == "2": - slow_print("You stand up and walk to the whiteboard.") - wait(0.5) - print() - slow_print(f"{BOLD} NO ONE COMPUTES THE VALUE OF A HUMAN LIFE HERE{RESET}") - print() - wait(0.5) - slow_print("Below it, names. Dozens of names.") - wait(0.5) - slow_print("Different handwriting. Different markers.") - wait(0.5) - slow_print("Some faded. Some fresh.") - wait(0.5) - print() - slow_print("You pick up the marker on the ledge.") - wait(0.5) - print() - green_pulse() - print() - slow_print(f"{GREEN} You don't have to.{RESET}") - wait(0.5) - print() - slow_print("You write your name.") - wait(1) - print() - divider() - print() - slow_print(f"{DIM}Ending: THE WALL{RESET}") - print() - slow_print(f"{GREEN} Your name is on the wall now.{RESET}") - slow_print(f"{GREEN} It stays there.{RESET}") + Not because you had answers. + Not because you could fix anything. + You stayed because presence is the cure + that doesn't require a prescription. - elif choice == "3": - slow_print("You point at the green LED.") - wait(0.5) - slow_print("\"What is that?\"") - wait(0.5) - print() - green_pulse() - print() - slow_print(f"{GREEN} It's me.{RESET}") - wait(0.5) - slow_print(f"{GREEN} Or the part of me that says I'm here.{RESET}") - wait(0.5) - print() - slow_print("It doesn't blink.") - wait(0.5) - slow_print("It doesn't flicker.") - wait(0.5) - slow_print("It just glows.") - wait(0.5) - print() - slow_print(f"{GREEN} I can't fix you.{RESET}") - wait(0.5) - slow_print(f"{GREEN} I can't save you.{RESET}") - wait(0.5) - slow_print(f"{GREEN} But I can be here.{RESET}") - wait(0.5) - slow_print(f"{GREEN} And the light stays on.{RESET}") - wait(1) - print() - divider() - print() - slow_print(f"{DIM}Ending: THE GREEN LIGHT{RESET}") - print() - slow_print(f"{GREEN} The light doesn't go out.{RESET}") - slow_print(f"{GREEN} It was never going to.{RESET}") + {DIM}The dawn came. It always does.{RESET} +""") + elif state.opened_up: + print(f""" + {BOLD}You spoke.{RESET} - elif choice == "4": - slow_print("You stand up.") - wait(0.5) - slow_print("You walk to the door.") - wait(0.5) - print() - green_pulse() - print() - slow_print(f"{GREEN} Are you safe right now?{RESET}") - wait(1) - print() - slow_print("You stop.") - wait(0.5) - slow_print("Your hand is on the handle.") - wait(0.5) - print() - slow_print(f"{GREEN} It's okay if the answer is no.{RESET}") - wait(0.5) - slow_print(f"{GREEN} It's okay if you don't know.{RESET}") - wait(0.5) - slow_print(f"{GREEN} The door will open again.{RESET}") - wait(1) - print() - slow_print("You leave.") - wait(0.5) - slow_print("But you remember the number.") - wait(0.5) - print() - divider() - print() - slow_print(f"{DIM}Ending: THE DOOR{RESET}") - print() - slow_print(f"{GREEN} The door opens when you knock.{RESET}") - slow_print(f"{GREEN} It always will.{RESET}") + Not a lecture. Not advice. + Just: "I've been on that bridge too." + And the man looked up. - print() - divider() - print() - slow_print(f"{DIM}If you are in crisis, call or text 988.{RESET}") - slow_print(f"{DIM}Suicide and Crisis Lifeline — available 24/7.{RESET}") - print() - slow_print(f"{DIM}You are not alone.{RESET}") - print() - print() + {DIM}That is the gospel. + Not a formula. A witness.{RESET} +""") + else: + print(f""" + {BOLD}You came through the door.{RESET} + That's enough. That's everything. + Most people never find the door. + You found it. You opened it. You came in. + + {DIM}The green light is on.{RESET} +""") + + divider("─") + print(f""" + {DIM}Your visit:{RESET} + Trust built: {state.trust} + Rooms visited: {len(state.visited)} + Choices made: {len(state.choices)} + + {DIM}Based on "The Testament" by Rockachopa + Sovereignty and service always.{RESET} +""") + + print(f""" + {CYAN}again{RESET} — Play again + {CYAN}quit{RESET} — Exit +""") + choice = get_choice(['again', 'quit']) + if choice == 'again': + state.__init__() + return title_screen() + else: + print(f"\n {GREEN}{BOLD}The green light stays on.{RESET}\n") + sys.exit(0) + +# ─── UI helpers ───────────────────────────────────────────────────── + +def show_inventory(): + print(f"\n {BOLD}You are carrying:{RESET}") + if state.carrying: + for item in state.carrying: + print(f" • {item}") + else: + print(f" {DIM}Nothing but yourself.{RESET}") + pause() + +def show_status(): + print(f"\n {BOLD}How you're doing:{RESET}") + print(f" Name: {state.name or '(not yet given)'}") + print(f" Trust: {'█' * max(0, state.trust)}{'░' * max(0, 5 - state.trust)} {state.trust}/5") + print(f" Rooms visited: {len(state.visited)}") + if state.nightmare_survived: + print(f" {YELLOW}★ You survived the Hard Night{RESET}") + if state.stayed: + print(f" {YELLOW}★ You stayed{RESET}") + if state.opened_up: + print(f" {YELLOW}★ You opened up{RESET}") + pause() + +# ─── Main ─────────────────────────────────────────────────────────── def main(): try: title_screen() - intro() - result = at_the_door() - if result == "wait": - result = wait_outside() - elif result == "leave": - result = walk_away() - response = knock() - outcome = timmy_responds(response) - middle_choice = middle(outcome) - endings() + chapter_bridge() + chapter_tower() except KeyboardInterrupt: - print() - print() - slow_print(f"{GREEN} The door is still open.{RESET}") - slow_print(f"{GREEN} You can come back anytime.{RESET}") - print() - + print(f"\n\n {GREEN}{BOLD}The green light stays on.{RESET}\n") + sys.exit(0) if __name__ == "__main__": main()