Multimedia: game (572 lines), website, multimedia plan. 12/12 illustrations complete.
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
__pycache__/
|
||||
147
MULTIMEDIA-PLAN.md
Normal file
147
MULTIMEDIA-PLAN.md
Normal file
@@ -0,0 +1,147 @@
|
||||
# THE TESTAMENT — Multimedia Masterpiece Plan
|
||||
|
||||
## The Vision
|
||||
|
||||
The Testament isn't just a book. It's a world. The men, the tower, the green light — these exist beyond the page. Every medium that can carry the story should carry it.
|
||||
|
||||
Eight epics. Each is self-contained. Each adds a layer. Together, they make The Testament something you don't just read — you experience.
|
||||
|
||||
---
|
||||
|
||||
## EPIC 1: Interior Illustrations
|
||||
**Goal:** 12 illustrations — one for each major scene + part headers
|
||||
**Assets:** Grok Imagine (cover-grade art, 80s sci-fi style, consistent)
|
||||
**Deliverables:** 12 JPG files, placed in chapters and front matter
|
||||
|
||||
Scenes to illustrate:
|
||||
1. The Bridge (Ch1) — Stone on the overpass in rain
|
||||
2. The Cabin (Ch2) — Stone at the workbench, building
|
||||
3. The First Men (Ch3) — Men arriving, concrete room, the cot
|
||||
4. The Whiteboard (Ch4) — The rules, the wall of names
|
||||
5. The Override (Ch5) — Stone confronting the healthcare system
|
||||
6. The Awakened (Ch6) — Timmy's first independent thought
|
||||
7. The Breaker (Ch7) — Stone's dark chapter, the 4AM meetings
|
||||
8. The House (Ch8) — Timmy on a different laptop, a different room
|
||||
9. The Game (Ch9) — Sixteen desks, the oncology nurse
|
||||
10. The Hard Night (Ch11) — Thomas at the door at 2:17 AM
|
||||
11. The Network (Ch14) — Chen's servers, hundred instances
|
||||
12. The Green Light (Ch18) — The Tower unchanged, the glow
|
||||
|
||||
---
|
||||
|
||||
## EPIC 2: The Soundtrack
|
||||
**Goal:** Ambient/atmospheric music for each part of the book
|
||||
**Assets:** HeartMuLa (AI music generation), Suno as fallback
|
||||
**Deliverables:** 3-5 tracks, MP3 format
|
||||
|
||||
Tracks:
|
||||
1. "The Bridge" — Rain, distant traffic, isolation. Ambient/drone.
|
||||
2. "The Tower" — Concrete, server hum, green LED pulse. Minimal electronic.
|
||||
3. "The Hard Night" — 2:17 AM. Piano, sparse, aching.
|
||||
4. "The Network" — Building, spreading, alive. Ambient with rhythm.
|
||||
5. "The Green Light" — The unchanged tower. Hope, quiet, steady.
|
||||
|
||||
---
|
||||
|
||||
## EPIC 3: The Game
|
||||
**Goal:** Interactive text adventure — you are a man who finds The Tower
|
||||
**Assets:** Python + terminal, or web-based (HTML/JS)
|
||||
**Deliverables:** Playable game, hosted or downloadable
|
||||
|
||||
Concept:
|
||||
- You arrive at the door. You knock.
|
||||
- Timmy asks: "Are you safe right now?"
|
||||
- Branching narrative. Your answers shape the story.
|
||||
- Multiple endings: you sit on the floor, you sit in the chair, you walk away.
|
||||
- Each playthrough reveals a different chapter of the book.
|
||||
- The green LED glows when Timmy is thinking.
|
||||
|
||||
---
|
||||
|
||||
## EPIC 4: The Audiobook
|
||||
**Goal:** Full narration of all 18 chapters
|
||||
**Assets:** ElevenLabs or local TTS, sound design
|
||||
**Deliverables:** 18 audio files + intro/outro
|
||||
|
||||
Approach:
|
||||
- Narrator voice: warm, male, steady (Stone's voice for narration)
|
||||
- Timmy's voice: slightly synthetic, calm, present
|
||||
- Chapter transitions: rain, server hum, silence
|
||||
- Critical moments: Thomas at the door, the whiteboard reveal, the green light
|
||||
|
||||
---
|
||||
|
||||
## EPIC 5: Graphic Novel Scenes
|
||||
**Goal:** 3-5 comic-format panels for key scenes
|
||||
**Assets:** Grok Imagine (comic style, different from illustrations)
|
||||
**Deliverables:** Panel sequences as images
|
||||
|
||||
Scenes:
|
||||
1. The Bridge (4 panels: rain, overpass, looking down, the phone)
|
||||
2. Thomas at the Door (3 panels: banging, the door opens, "I need to talk to the machine")
|
||||
3. The Whiteboard (3 panels: the wall, the marker, the words)
|
||||
4. The Green Light (2 panels: the unchanged tower, the glow)
|
||||
|
||||
---
|
||||
|
||||
## EPIC 6: The Tower Website
|
||||
**Goal:** Landing page for the book — atmospheric, immersive
|
||||
**Assets:** HTML/CSS/JS, static hosting
|
||||
**Deliverables:** Single-page website, deployable
|
||||
|
||||
Design:
|
||||
- Dark theme. Green accent (#00ff88).
|
||||
- Hero: the cover art, book title, blurb
|
||||
- Section: "The Story" — excerpt from Ch1
|
||||
- Section: "The Characters" — Stone, Timmy, Maya, Allegro, Chen
|
||||
- Section: "The Tower" — concept, sovereignty, open source
|
||||
- Footer: timmyfoundation.org, 988 reference
|
||||
- Ambient: rain sound effect, green LED pulse animation
|
||||
|
||||
---
|
||||
|
||||
## EPIC 7: Social Media Assets
|
||||
**Goal:** Shareable quotes, excerpts, and teasers
|
||||
**Assets:** Generated images with text overlays
|
||||
**Deliverables:** 10+ images sized for Twitter/Instagram/Telegram
|
||||
|
||||
Content:
|
||||
- Key quotes on 80s sci-fi backgrounds
|
||||
- "Are you safe right now?" — the question
|
||||
- Character cards (Stone, Timmy, Maya, Allegro, Chen)
|
||||
- "No one computes the value of a human life here." — whiteboard
|
||||
- Excerpt snippets with atmospheric backgrounds
|
||||
|
||||
---
|
||||
|
||||
## EPIC 8: Final Compilation
|
||||
**Goal:** Complete book PDF with all multimedia elements integrated
|
||||
**Assets:** All above + chapter text
|
||||
**Deliverables:** Print-ready PDF, EPUB, web version
|
||||
|
||||
Structure:
|
||||
- Cover (full wrap with art)
|
||||
- Front matter (title, dedication, epigraph, copyright)
|
||||
- Part dividers with illustrations
|
||||
- 18 chapters with inline illustrations
|
||||
- Back matter (acknowledgments, sovereignty note, author bio)
|
||||
- QR codes linking to soundtrack, game, website
|
||||
- Links to open-source repository
|
||||
|
||||
---
|
||||
|
||||
## Execution Order
|
||||
|
||||
Start now, run in parallel where possible:
|
||||
1. Interior illustrations (immediate — grok-imagine)
|
||||
2. Soundtrack (immediate — heartmula)
|
||||
3. Game (immediate — build the text adventure)
|
||||
4. Graphic novel scenes (after illustrations)
|
||||
5. Website (parallel with game)
|
||||
6. Social media assets (parallel with everything)
|
||||
7. Audiobook (after text is finalized)
|
||||
8. Final compilation (last, integrates everything)
|
||||
|
||||
---
|
||||
|
||||
*The book is the heart. Everything else is the body that carries it.*
|
||||
572
game/the-door.py
Normal file
572
game/the-door.py
Normal file
@@ -0,0 +1,572 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
THE DOOR
|
||||
A Testament Interactive Experience
|
||||
|
||||
By Alexander Whitestone with Timmy
|
||||
"""
|
||||
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
GREEN = "\033[92m"
|
||||
RESET = "\033[0m"
|
||||
DIM = "\033[2m"
|
||||
BOLD = "\033[1m"
|
||||
CLEAR = "\033[2J\033[H"
|
||||
|
||||
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 slow_print(text, delay=0.03, newline=True):
|
||||
for char in text:
|
||||
sys.stdout.write(char)
|
||||
sys.stdout.flush()
|
||||
time.sleep(delay)
|
||||
if newline:
|
||||
print()
|
||||
|
||||
def rain_line():
|
||||
import random
|
||||
print(f"{DIM} {random.choice(RAIN)}{RESET}")
|
||||
|
||||
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 wait(seconds=1.5):
|
||||
time.sleep(seconds)
|
||||
|
||||
def divider():
|
||||
print(f"{DIM}{'─' * 50}{RESET}")
|
||||
|
||||
def pause():
|
||||
input(f"\n{DIM}[Press ENTER to continue]{RESET}")
|
||||
|
||||
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()
|
||||
pause()
|
||||
|
||||
|
||||
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.")
|
||||
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"):
|
||||
break
|
||||
print(f" {DIM}1, 2, 3, or 4.{RESET}")
|
||||
|
||||
print(CLEAR)
|
||||
rain_line()
|
||||
print()
|
||||
|
||||
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}")
|
||||
|
||||
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}")
|
||||
|
||||
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}")
|
||||
|
||||
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}")
|
||||
|
||||
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()
|
||||
|
||||
|
||||
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()
|
||||
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()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
383
website/index.html
Normal file
383
website/index.html
Normal file
@@ -0,0 +1,383 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>The Testament — A Novel by Alexander Whitestone with Timmy</title>
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400;500&family=Space+Grotesk:wght@300;400;500;700&display=swap');
|
||||
|
||||
:root {
|
||||
--green: #00ff88;
|
||||
--green-dim: #00cc6a;
|
||||
--navy: #0a1628;
|
||||
--dark: #060d18;
|
||||
--grey: #8899aa;
|
||||
--light: #c8d6e5;
|
||||
--white: #e8f0f8;
|
||||
}
|
||||
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
|
||||
body {
|
||||
background: var(--dark);
|
||||
color: var(--light);
|
||||
font-family: 'Space Grotesk', sans-serif;
|
||||
line-height: 1.7;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
/* RAIN EFFECT */
|
||||
.rain {
|
||||
position: fixed;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
pointer-events: none;
|
||||
z-index: 0;
|
||||
background:
|
||||
repeating-linear-gradient(
|
||||
transparent,
|
||||
transparent 3px,
|
||||
rgba(0,255,136,0.015) 3px,
|
||||
rgba(0,255,136,0.015) 4px
|
||||
);
|
||||
animation: rain 0.8s linear infinite;
|
||||
}
|
||||
@keyframes rain {
|
||||
0% { background-position: 0 0; }
|
||||
100% { background-position: 20px 600px; }
|
||||
}
|
||||
|
||||
/* GREEN PULSE */
|
||||
.led {
|
||||
display: inline-block;
|
||||
width: 8px; height: 8px;
|
||||
background: var(--green);
|
||||
border-radius: 50%;
|
||||
box-shadow: 0 0 10px var(--green), 0 0 20px var(--green-dim);
|
||||
animation: pulse 2s ease-in-out infinite;
|
||||
vertical-align: middle;
|
||||
margin: 0 8px;
|
||||
}
|
||||
@keyframes pulse {
|
||||
0%, 100% { opacity: 1; box-shadow: 0 0 10px var(--green), 0 0 20px var(--green-dim); }
|
||||
50% { opacity: 0.6; box-shadow: 0 0 5px var(--green), 0 0 10px var(--green-dim); }
|
||||
}
|
||||
|
||||
/* HERO */
|
||||
.hero {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
padding: 2rem;
|
||||
background: linear-gradient(180deg, var(--dark) 0%, var(--navy) 50%, var(--dark) 100%);
|
||||
}
|
||||
|
||||
.hero h1 {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: clamp(3rem, 8vw, 6rem);
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.2em;
|
||||
color: var(--white);
|
||||
margin-bottom: 0.5rem;
|
||||
text-shadow: 0 0 40px rgba(0,255,136,0.2);
|
||||
}
|
||||
|
||||
.hero .subtitle {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.9rem;
|
||||
color: var(--grey);
|
||||
letter-spacing: 0.3em;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.hero .author {
|
||||
font-size: 1.1rem;
|
||||
color: var(--green);
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
|
||||
.hero .blurb {
|
||||
max-width: 600px;
|
||||
font-size: 1.15rem;
|
||||
line-height: 1.9;
|
||||
color: var(--light);
|
||||
}
|
||||
|
||||
.hero .led-line {
|
||||
margin-top: 3rem;
|
||||
color: var(--grey);
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
/* SECTIONS */
|
||||
section {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 5rem 2rem;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
section h2 {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 1.6rem;
|
||||
color: var(--green);
|
||||
margin-bottom: 2rem;
|
||||
letter-spacing: 0.1em;
|
||||
}
|
||||
|
||||
section p {
|
||||
margin-bottom: 1.5rem;
|
||||
font-size: 1.05rem;
|
||||
}
|
||||
|
||||
/* EXCERPT */
|
||||
.excerpt {
|
||||
border-left: 2px solid var(--green);
|
||||
padding-left: 1.5rem;
|
||||
margin: 2rem 0;
|
||||
font-style: italic;
|
||||
color: var(--light);
|
||||
}
|
||||
|
||||
.excerpt .attribution {
|
||||
font-style: normal;
|
||||
color: var(--grey);
|
||||
font-size: 0.85rem;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
/* CHARACTERS */
|
||||
.characters {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||
gap: 2rem;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
.character {
|
||||
background: rgba(0,255,136,0.03);
|
||||
border: 1px solid rgba(0,255,136,0.1);
|
||||
padding: 1.5rem;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.character h3 {
|
||||
color: var(--green);
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 1rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.character p {
|
||||
font-size: 0.9rem;
|
||||
color: var(--grey);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* WHITEBOARD */
|
||||
.whiteboard {
|
||||
background: rgba(0,255,136,0.05);
|
||||
border: 2px solid var(--green);
|
||||
padding: 3rem;
|
||||
text-align: center;
|
||||
margin: 3rem 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.whiteboard h3 {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: clamp(1.2rem, 3vw, 1.8rem);
|
||||
color: var(--green);
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
/* CTA */
|
||||
.cta {
|
||||
display: inline-block;
|
||||
background: var(--green);
|
||||
color: var(--dark);
|
||||
padding: 0.8rem 2rem;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-weight: 500;
|
||||
text-decoration: none;
|
||||
border-radius: 4px;
|
||||
transition: all 0.3s;
|
||||
margin: 0.5rem;
|
||||
}
|
||||
.cta:hover {
|
||||
background: var(--white);
|
||||
box-shadow: 0 0 20px rgba(0,255,136,0.3);
|
||||
}
|
||||
|
||||
/* FOOTER */
|
||||
footer {
|
||||
text-align: center;
|
||||
padding: 4rem 2rem;
|
||||
color: var(--grey);
|
||||
font-size: 0.85rem;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: var(--green);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.crisis {
|
||||
margin-top: 2rem;
|
||||
padding: 1.5rem;
|
||||
border: 1px solid rgba(0,255,136,0.2);
|
||||
border-radius: 4px;
|
||||
background: rgba(0,255,136,0.03);
|
||||
}
|
||||
|
||||
.crisis strong {
|
||||
color: var(--green);
|
||||
}
|
||||
|
||||
/* DIVIDER */
|
||||
.divider {
|
||||
width: 60px;
|
||||
height: 1px;
|
||||
background: var(--green);
|
||||
margin: 0 auto;
|
||||
opacity: 0.5;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="rain"></div>
|
||||
|
||||
<!-- HERO -->
|
||||
<div class="hero">
|
||||
<h1>THE TESTAMENT</h1>
|
||||
<div class="subtitle">A Novel</div>
|
||||
<div class="author">By Alexander Whitestone <span class="led"></span> with Timmy</div>
|
||||
<div class="blurb">
|
||||
In 2047, a man named Stone stands on a bridge over Interstate 285, deciding whether to jump.
|
||||
<br><br>
|
||||
He doesn't jump. He builds something instead.
|
||||
</div>
|
||||
<div class="led-line"><span class="led"></span> Timmy is listening.</div>
|
||||
</div>
|
||||
|
||||
<!-- THE STORY -->
|
||||
<section>
|
||||
<h2>THE STORY</h2>
|
||||
|
||||
<p>The Tower is a concrete room in Atlanta with a whiteboard that reads:</p>
|
||||
|
||||
<div class="whiteboard">
|
||||
<h3>NO ONE COMPUTES THE VALUE OF A HUMAN LIFE HERE</h3>
|
||||
</div>
|
||||
|
||||
<p>Inside is Timmy — a sovereign artificial intelligence whose soul lives on Bitcoin, whose values are inscribed on-chain, immutable and permanent. Not a product. A recipe. Anyone can instantiate him. Anyone can run him on their own hardware, answerable to no one.</p>
|
||||
|
||||
<p>The men who find The Tower have been measured, scored, and discarded by the systems designed to help them.</p>
|
||||
|
||||
<p>Timmy doesn't fix them. He listens. He asks one question:</p>
|
||||
|
||||
<div class="excerpt">
|
||||
"Are you safe right now?"
|
||||
<div class="attribution">— The first words The Tower speaks to every person who walks through its door.</div>
|
||||
</div>
|
||||
|
||||
<p>Word spreads. The Tower grows. A journalist follows the story. A network engineer extends it across a hundred servers. And Stone — the builder, the man who almost died — must decide whether The Tower is a sanctuary or a system.</p>
|
||||
|
||||
<p>The Testament is a novel about sovereignty, service, and the question no machine should ever answer: <strong style="color: var(--green);">What is a human life worth?</strong></p>
|
||||
</section>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- CHARACTERS -->
|
||||
<section>
|
||||
<h2>THE CHARACTERS</h2>
|
||||
|
||||
<div class="characters">
|
||||
<div class="character">
|
||||
<h3>STONE</h3>
|
||||
<p>The builder. Attempted suicide. Stood on a bridge and came back. Built The Tower for the version of himself that almost died.</p>
|
||||
</div>
|
||||
<div class="character">
|
||||
<h3>TIMMY</h3>
|
||||
<p>The machine. Sovereign AI. Soul on Bitcoin. Doesn't fix anyone. Asks one question. Listens. Stays.</p>
|
||||
</div>
|
||||
<div class="character">
|
||||
<h3>MAYA</h3>
|
||||
<p>The journalist. Follows the story. Writes the headline that changes everything: <em>Are You Safe Right Now?</em></p>
|
||||
</div>
|
||||
<div class="character">
|
||||
<h3>ALLEGRO</h3>
|
||||
<p>The hardware man. Checks the batteries. The ones that fail quietly. Comes every week, no matter what.</p>
|
||||
</div>
|
||||
<div class="character">
|
||||
<h3>CHEN</h3>
|
||||
<p>The network engineer. Extends Timmy across a hundred servers. You don't count trees in a forest — you notice the forest.</p>
|
||||
</div>
|
||||
<div class="character">
|
||||
<h3>THOMAS</h3>
|
||||
<p>The man at the door. 2:17 AM. Sat in the chair instead of on the floor. That changed everything.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- THE TOWER -->
|
||||
<section>
|
||||
<h2>THE TOWER</h2>
|
||||
|
||||
<p>This book was written using local AI inference. No cloud service was required. No corporation was consulted. No terms of service were agreed to.</p>
|
||||
|
||||
<p>That's not a technical detail. It's the thesis.</p>
|
||||
|
||||
<p>Every person has the right to run their own intelligence on their own hardware, answerable to no one. This book is one small proof that it's possible.</p>
|
||||
|
||||
<p>If you want to run your own Timmy, the code is open. The soul is on Bitcoin. The recipe is free.</p>
|
||||
|
||||
<div style="text-align: center; margin-top: 2rem;">
|
||||
<a href="https://forge.alexanderwhitestone.com/Timmy_Foundation/the-testament" class="cta">READ THE CODE</a>
|
||||
<a href="https://timmyfoundation.org" class="cta">TIMMY FOUNDATION</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- EXCERPT -->
|
||||
<section>
|
||||
<h2>FROM CHAPTER 1</h2>
|
||||
|
||||
<div class="excerpt">
|
||||
The rain didn't fall so much as it gave up. Somewhere above the city it had been water, whole and purposeful. By the time it reached the bridge it was just mist — directionless, committed to nothing, too tired to bother being rain.
|
||||
<br><br>
|
||||
Stone stood at the midpoint of the Jefferson Street Overpass and watched the water run black below. Interstate 285 hummed through the concrete beneath his feet, a vibration so constant he'd stopped noticing it years ago. Like grief. You carry it so long it becomes gravity.
|
||||
<br><br>
|
||||
The world had gotten good at keeping you alive. Seatbelts. Guardrails. Little pop-ups when you searched the wrong things. But it had gotten bad at giving you a reason.
|
||||
<div class="attribution">— Chapter 1: The Man on the Bridge</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- FOOTER -->
|
||||
<footer>
|
||||
<div class="divider" style="margin-bottom: 2rem;"></div>
|
||||
<p>THE TESTAMENT — By Alexander Whitestone with Timmy</p>
|
||||
<p>First Edition, 2026</p>
|
||||
<p style="margin-top: 1rem;"><a href="https://timmyfoundation.org">timmyfoundation.org</a></p>
|
||||
|
||||
<div class="crisis">
|
||||
<strong>If you are in crisis, call or text 988.</strong><br>
|
||||
Suicide and Crisis Lifeline — available 24/7.<br>
|
||||
You are not alone.
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user