## Kapitel 21 – Unendliche Weiten – die Abenteuer der USS Sequel


# Seite 304 – SQL und Datenbanken
import sqlite3
import random

# --- Datenbankverbindung ---
conn = sqlite3.connect('uss_sequel.db')
cursor = conn.cursor()

# --- Tabellen erzeugen ---
cursor.executescript('''
CREATE TABLE IF NOT EXISTS crew (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL UNIQUE,
    rang TEXT,
    pilot INTEGER DEFAULT 5,
    kampf INTEGER DEFAULT 5,
    wissenschaft INTEGER DEFAULT 5,
    gesundheit INTEGER DEFAULT 100
);

CREATE TABLE IF NOT EXISTS einsaetze (
    id INTEGER PRIMARY KEY,
    crew_id INTEGER,
    mission_name TEXT,
    datum TEXT DEFAULT (date('now')),
    erfolg BOOLEAN DEFAULT 0,
    FOREIGN KEY (crew_id) REFERENCES crew(id)
);
''')

# --- Crew einfügen ---
sql = """
INSERT INTO crew (name, rang, pilot, kampf, wissenschaft)
VALUES
    ('Captain Kira Voss', 'Captain', 8, 7, 9),
    ('Lt. Raj Patel', 'Lieutenant', 15, 6, 5),
    ('Dr. Lena Moreau', 'Lieutenant', 4, 3, 14),
    ('Chief T.Vrek', 'Engineer', 5, 8, 10),
    ('Sgt. Marcus Kane', 'Sergeant', 6, 15, 4),
    ('Ensign Aiko Tanaka', 'Ensign', 12, 5, 7),
    ('Dr. Elias Moreau', 'Lieutenant', 3, 4, 13),
    ('Lt. Cmdr. Zara Korr', 'Lt Commander', 5, 6, 15),
    ('PO Finn O Riley', 'PO', 6, 7, 6),
    ('Lt. Jorak Thul', 'Lieutenant', 7, 14, 5);
"""

cursor.execute(sql)
conn.commit()

print("Die USS Sequel Datenbank wurde erzeugt!")


# Seite 313 Das Spielsystem, der Code am Stück

import sqlite3
import random

# --- Datenbankverbindung ---
conn = sqlite3.connect('uss_sequel.db')
cursor = conn.cursor()

def uss_sequel_spiel():
    print("Willkommen an Bord der USS Sequel, Captain!")

    while True:
        print("=" * 55)
        print("1. Crew anzeigen")
        print("2. Neue Mission starten")
        print("3. Einsätze eines Crewmitglieds ansehen")
        print("4. Rangliste (meiste Einsätze)")
        print("5. Beenden")

        wahl = input("\nDein Befehl, Captain: ")

        if wahl == "1":
            crew_anzeigen()

        elif wahl == "2":
            mission_durchfuehren()

        elif wahl == "3":
            crew_anzeigen()
            cid = int(input("\nID des Crewmitglieds: "))
            einsaetze_von_crew(cid)

        elif wahl == "4":
            rangliste()

        elif wahl == "5":
            print("Bis zum nächsten Einsatz, Captain! o7")
            conn.close()
            break


def crew_anzeigen():
    print("\n=== Crew der USS Sequel ===")

    cursor.execute("""
        SELECT id, name, rang, pilot, kampf, wissenschaft, gesundheit
        FROM crew
        ORDER BY rang, name
    """)

    for row in cursor.fetchall():
        print(f"{row[0]:2d} | {row[1]:25} | {row[2]:12} | "
              f"P:{row[3]:2d} K:{row[4]:2d} W:{row[5]:2d} | HP:{row[6]}")


def einsaetze_von_crew(crew_id):
    cursor.execute("""
        SELECT mission_name, datum, erfolg
        FROM einsaetze
        WHERE crew_id = ?
        ORDER BY datum DESC
    """, (crew_id,))

    einsaetze = cursor.fetchall()

    print("\nEinsätze:")

    for e in einsaetze:
        status = "Erfolg" if e[2] else "Fehlschlag"
        print(f"• {e[0]}  ({e[1]}) → {status}")


def rangliste():
    cursor.execute("""
        SELECT crew.name, COUNT(einsaetze.id) AS anzahl
        FROM crew
        LEFT JOIN einsaetze ON crew.id = einsaetze.crew_id
        GROUP BY crew.id
        ORDER BY anzahl DESC
    """)

    print("\nRangliste Einsätze:")
    for row in cursor.fetchall():
        print(f"{row[0]:25} → {row[1]} Einsätze")


def mission_durchfuehren():
    mission_typen = [
        ("Nebelerkundung", 18, 10, 22),
        ("Piratenabwehr", 12, 25, 8),
        ("Wrackbergung", 22, 15, 12),
        ("Anomalie-Untersuchung", 15, 12, 25),
        ("Notfallrettung", 20, 18, 15),
        ("Feindliches Gebiet", 10, 22, 10),
    ]

    name_basis, req_pilot, req_kampf, req_wissenschaft = random.choice(mission_typen)

    sektor = chr(random.randint(65, 90)) + str(random.randint(1, 999))
    mission_name = f"{name_basis} Sektor {sektor}"

    print(f"\nNeue Mission: {mission_name}")
    print(f"Anforderungen → Pilot: {req_pilot} | Kampf: {req_kampf} | Wissenschaft: {req_wissenschaft}\n")

    # Crew anzeigen
    cursor.execute("SELECT id, name, rang FROM crew WHERE gesundheit > 30")
    crew_list = cursor.fetchall()

    print("Verfügbare Crew:")
    for c in crew_list:
        print(f"{c[0]}: {c[1]} ({c[2]})")

    auswahl = input("\nWelche Crewmitglieder sollen mit? (IDs durch Komma getrennt): ")
    ids = [int(x.strip()) for x in auswahl.split(",") if x.strip().isdigit()]

    if not ids:
        print("Keine Crew ausgewählt. Mission abgebrochen.")
        return

    # Skills summieren
    total_pilot = total_kampf = total_wissenschaft = 0

    for cid in ids:
        cursor.execute("""
            SELECT pilot, kampf, wissenschaft
            FROM crew
            WHERE id = ?
        """, (cid,))
        skills = cursor.fetchone()

        total_pilot += skills[0]
        total_kampf += skills[1]
        total_wissenschaft += skills[2]

        cursor.execute("""
            INSERT INTO einsaetze (crew_id, mission_name, erfolg)
            VALUES (?, ?, ?)
        """, (cid, mission_name, 0))

    erfolg = (
        total_pilot >= req_pilot and
        total_kampf >= req_kampf and
        total_wissenschaft >= req_wissenschaft
    )

    cursor.execute("""
        UPDATE einsaetze
        SET erfolg = ?
        WHERE mission_name = ?
    """, (erfolg, mission_name))

    if not erfolg:
        for cid in ids:
            cursor.execute("""
                UPDATE crew
                SET gesundheit = gesundheit - 20
                WHERE id = ?
            """, (cid,))

    conn.commit()

    if erfolg:
        print("Mission erfolgreich! Gut gemacht, Captain!")
    else:
        print("Mission gescheitert. Die Crew wurde verletzt.")


# --- Start ---
if __name__ == "__main__":
    uss_sequel_spiel()
