Files
Doom-Matrix/doom_matrix/world/endings.py
T
fedora_openclaw 71d9ee99b8 Rename Morpheus Hayden/Trinity VEGA to Morpheus/Trinity, add wallpaper assets
Shortens character names throughout dialogue, save.py loop-twist lines,
and README. Adds three wallpaper images to Wallpaper/ and embeds
Doom_Slyer.png as the README screenshot.
2026-07-06 20:18:28 +02:00

135 lines
6.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Mehrere Enden je nach Corruption, Entscheidungen und Layer-0-Status."""
from doom_matrix.engine.ui import Colors, slow_print, dramatic_pause, clear_screen, menu
from doom_matrix.world.layers import layer_zero_unlocked
def determine_ending(player):
if layer_zero_unlocked(player) and player.flags.get("reached_layer_zero"):
return "wake_up"
if player.corruption >= 60:
return "dark_pact"
if player.flags.get("final_choice") == "3":
return "new_architect"
if player.flags.get("final_choice") == "4":
return "new_game_plus"
return "rip_and_tear"
def _stats_block(player):
slow_print(f"\n{Colors.CYAN}Statistiken:{Colors.END}")
print(f" Health übrig: {player.health}/{player.max_health}")
print(f" Corruption: {int(player.corruption)}%")
print(f" Glory Kills: {player.glory_kills}")
print(f" Hacks: {player.hacks}")
print(f" Klasse: {player.class_name}")
print(f" Waffen: {', '.join(w.name for w in player.weapons)}")
print(f" Crucible-Fragmente: {player.inventory.crucible_fragments}/3")
if player.flags.get("cheats_used"):
print(f" Benutzte Cheats: {', '.join(player.flags['cheats_used'])}")
def _banner(text, color=Colors.GREEN):
width = max(len(text) + 8, 55)
print(f"""
{color}{Colors.BOLD}
╔{'═' * (width - 4)}╗
║{text.center(width - 4)}║
╚{'═' * (width - 4)}╝
{Colors.END}
""")
def ending(player):
dramatic_pause(1)
clear_screen()
kind = determine_ending(player)
handlers = {
"wake_up": _ending_wake_up,
"dark_pact": _ending_dark_pact,
"new_architect": _ending_new_architect,
"new_game_plus": _ending_new_game_plus,
"rip_and_tear": _ending_rip_and_tear,
}
handlers[kind](player)
_stats_block(player)
dramatic_pause(1)
slow_print(f"\n{Colors.GREEN}Danke fürs Spielen! 🐇{Colors.END}")
slow_print(f"{Colors.DIM}Erstellt von LXC für Andy{Colors.END}")
return kind
def _ending_rip_and_tear(player):
_banner("SYSTEM FAILURE - CLEAR", Colors.GREEN)
slow_print(f"{Colors.YELLOW}Trinity:{Colors.END} {Colors.CYAN}'Wir haben es geschafft. Die Welt ist frei.'{Colors.END}")
slow_print(f"{Colors.YELLOW}Morpheus:{Colors.END} {Colors.CYAN}'Aber der Krieg... der Krieg ist nie vorbei.'{Colors.END}")
slow_print(f"{Colors.YELLOW}Du:{Colors.END} {Colors.CYAN}'Gut. Dann gibt's noch mehr zu rip and tear.'{Colors.END}")
dramatic_pause(1)
_banner("NEW GAME+ UNLOCKED", Colors.MAGENTA)
def _ending_new_architect(player):
_banner("DER NEUE ARCHITEKT", Colors.CYAN)
slow_print(f"{Colors.WHITE}Du setzt dich in den leeren Thron aus Code, den der Archi-Lord hinterlassen hat.{Colors.END}")
slow_print(f"{Colors.WHITE}Von hier aus siehst du jede Zeile der Matrix. Jede Entscheidung. Jeden Bug.{Colors.END}")
slow_print(f"{Colors.YELLOW}Morpheus:{Colors.END} {Colors.CYAN}'Und jetzt? Wirst du besser sein als er?'{Colors.END}")
slow_print(f"{Colors.WHITE}Du antwortest nicht sofort. Macht macht keine Antworten leichter.{Colors.END}")
slow_print(f"{Colors.GREEN}'Ich werde es zumindest versuchen.'{Colors.END}")
def _ending_dark_pact(player):
_banner("DER DUNKLE PAKT", Colors.RED)
slow_print(f"{Colors.RED}Die Corruption in dir hat laengst gewonnen, bevor der letzte Schuss fiel.{Colors.END}")
slow_print(f"{Colors.RED}Der Archi-Lord zerfaellt nicht in Nichts -- er zerfaellt in DICH.{Colors.END}")
slow_print(f"{Colors.RED}Seine Macht, sein Hunger, seine Krone aus Servern und Schwefel.{Colors.END}")
dramatic_pause(1)
slow_print(f"{Colors.YELLOW}Trinity weicht zurueck.{Colors.END} {Colors.CYAN}'...Slayer?'{Colors.END}")
slow_print(f"{Colors.RED}{Colors.BOLD}Du:{Colors.END} {Colors.RED}'Der Slayer ist tot. Es gibt nur noch den Dark Lord.'{Colors.END}")
slow_print(f"{Colors.DIM}[GEHEIMES ENDE FREIGESCHALTET: DARK LORD]{Colors.END}")
def _ending_new_game_plus(player):
_banner("...MIT CHEATS", Colors.YELLOW)
slow_print(f"{Colors.GREEN}Archi-Lord:{Colors.END} {Colors.WHITE}'Sie haben tatsaechlich um einen neuen Spielstand gebeten.'{Colors.END}")
slow_print(f"{Colors.WHITE}Die Welt um dich herum zerfaellt -- nicht in Chaos, sondern in ein Ladebildschirm.{Colors.END}")
slow_print(f"{Colors.YELLOW}Du:{Colors.END} {Colors.CYAN}'IDDQD. IDKFA. Und diesmal behalte ich beides.'{Colors.END}")
def _ending_wake_up(player):
_banner("WAKE UP", Colors.WHITE)
slow_print(f"{Colors.WHITE}Es gibt kein Morpheus, kein Orakel, keinen Archi-Lord mehr in diesem Raum.{Colors.END}")
slow_print(f"{Colors.WHITE}Nur ein Cursor, der blinkt. Und die Erinnerung an einen weissen Hasen.{Colors.END}")
slow_print(f"{Colors.WHITE}Du bist nicht aufgewacht IN der Matrix. Du bist aufgewacht AUS der Geschichte.{Colors.END}")
dramatic_pause(1.5)
slow_print(f"{Colors.DIM}[WAHRES ENDE FREIGESCHALTET: du folgtest dem Hasen UND fandest alle drei Fragmente]{Colors.END}")
slow_print(f"{Colors.GREEN}Und irgendwo, in einem Terminal, das wirklich existiert, endet der Text.{Colors.END}")
def game_over(player):
clear_screen()
_banner("GAME OVER", Colors.RED)
slow_print(f"\n{Colors.RED}Du bist gefallen...{Colors.END}")
slow_print(f"{Colors.DIM}Aber in der Matrix ist Tod nur ein Bug.{Colors.END}")
choice = menu([
("1", "Die blaue Pille schlucken (aufgeben)"),
("2", "Neu laden (Programm beenden)"),
], "Was tust du")
if choice == "1":
clear_screen()
_banner("BLUEPILL ENDING", Colors.CYAN)
slow_print(f"{Colors.WHITE}Du wachst in einem Buero auf. Fluoreszierendes Licht. Ein Kaffeebecher dampft.{Colors.END}")
slow_print(f"{Colors.WHITE}Ein Kollege fragt, ob du das Quartalsmeeting vorbereitet hast.{Colors.END}")
slow_print(f"{Colors.DIM}Irgendwo, ganz leise, hoerst du ein Kaninchen husten.{Colors.END}")
slow_print(f"\n{Colors.GREEN}Danke fürs Spielen! 🐇{Colors.END}")
return "bluepill_ending"
slow_print(f"\n{Colors.DIM}Ein Patch könnte helfen.{Colors.END}")
return "game_over_final"