eis-website/init_db.py

248 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
U18 Klick-Adventure "Einbruch im Octan-Tower" (The-Lego-Movie-Style)
=====================================================================
Legt die SQLite-Datenbank `adventure.db` an und befüllt sie mit einem
verzweigten Verlies:
- raeume : Räume/Gänge des Octan-Towers (mit Typ: start/gang/thema/
sackgasse/ziel)
- ausgaenge : welcher Weg (links/rechts/…) führt in welchen Raum inkl.
Story-Hinweis für die Entscheidung
- fragen : Fragen pro Raum
• Themen-Räume → thematische Fragen (der RICHTIGE Weg)
• Sackgassen → themenfremde Trivia (der FALSCHE Weg)
• Ziel-Raum → die finale Lord-Business-Frage
Spielprinzip
------------
Jede Etage ist ein Gang, der sich gabelt. Nach den Text-Hinweisen entscheidet
man sich für links oder rechts:
• RICHTIGER Weg → wenige thematische Fragen → direkt eine Etage höher.
• FALSCHER Weg → viele themenfremde Trivia → "Haha, Sackgasse!" → zurück
zum Gang, dann den richtigen Weg nehmen.
Ganz oben wartet der Kragle-Tresor mit der finalen Lord-Business-Frage.
Leitprinzip (wie in U17):
LOKAL schreiben & pushen auf dem SERVER einmalig ausführen:
python3 init_db.py
Danach entsteht adventure.db direkt neben diesem Skript.
"""
import os
import sqlite3
# adventure.db immer neben dieser Datei ablegen (unabhängig vom Arbeitsverzeichnis)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_PATH = os.path.join(BASE_DIR, "adventure.db")
db = sqlite3.connect(DB_PATH)
# Tabellen bei jedem Lauf sauber neu aufbauen (DROP statt DELETE, damit auch
# geänderte Spalten greifen).
db.executescript("""
DROP TABLE IF EXISTS raeume;
DROP TABLE IF EXISTS ausgaenge;
DROP TABLE IF EXISTS fragen;
CREATE TABLE raeume (
id INTEGER PRIMARY KEY,
name TEXT,
beschreibung TEXT,
typ TEXT, -- 'start' | 'gang' | 'thema' | 'sackgasse' | 'ziel'
etage INTEGER -- 0 = Lobby, 1..3 = Etagen, 4 = Dach
);
CREATE TABLE ausgaenge (
von_raum INTEGER,
richtung TEXT, -- kurzer Button-Text, z. B. "⬅️ Nach links"
nach_raum INTEGER,
hinweis TEXT -- Story-Hinweis unter dem Button
);
CREATE TABLE fragen (
id INTEGER PRIMARY KEY,
raum_id INTEGER,
frage TEXT,
antwort TEXT,
optionen TEXT -- Antwortmöglichkeiten, per | getrennt
);
""")
# ─── Räume ───────────────────────────────────────────────────────────────────
# IDs bewusst gruppiert: 1 = Lobby, 10er = Etage 1, 20er = Etage 2, 30er = Etage 3.
raeume = [
# ---- Start ----
(1, "Lobby des Octan-Towers",
"Die gläsernen Türen fallen hinter dir zu kein Zurück. Über dir ragt der "
"Wolkenkratzer von Präsident Business auf. Ganz oben, im Kragle-Tresor, "
"wartet der gefährlichste Kleber der Welt. Ein einzelner Aufzug führt nach "
"oben. Zeit, ihn zu stoppen.",
"start", 0),
# ---- Etage 1: Haie (richtiger Weg = LINKS → 11, Sackgasse = RECHTS → 12) ----
(10, "1. Etage Der Hai-Gang 🦈",
"Der Aufzug öffnet sich. Der Gang gabelt sich in zwei Richtungen. Von "
"LINKS weht feuchte, salzige Luft herüber dort muss das riesige "
"Haibecken sein, das du überqueren musst. Von RECHTS blinkt in kaltem Rot "
"ein Schild: „Nur Personal Abstellkammer“.",
"gang", 1),
(11, "Steg über dem Haibecken 🦈",
"Du folgst der salzigen Luft. Unter dem schmalen Steg schnappen hungrige "
"Haie. Das Sicherheitssystem summt: Beweise dein Hai-Wissen, sonst fährt "
"der Steg ein!",
"thema", 1),
(12, "Die Abstellkammer 🧹",
"Du drückst die Tür auf Besen, Eimer, ein flackernder Wartungs-Bot. "
"„HALT! Sicherheits-Quiz!“, quäkt er und stellt dir eine Frage nach der "
"anderen …",
"sackgasse", 1),
# ---- Etage 2: Laser (richtiger Weg = RECHTS → 21, Sackgasse = LINKS → 22) ----
(20, "2. Etage Der Laser-Gang 🔴",
"Rote Strahlen zerschneiden die Luft zu einem glühenden Gitter. LINKS "
"gähnt ein dunkler Wartungsschacht, aus dem es muffig nach Staub riecht. "
"RECHTS pulsiert Licht hinter einer Tür mit der Aufschrift "
"„Laser-Kontrollraum“.",
"gang", 2),
(21, "Der Laser-Kontrollraum 🔴",
"Im Kontrollraum flimmern hundert Regler. Wer die Laser abschalten will, "
"muss beweisen, dass er versteht, wie sie funktionieren.",
"thema", 2),
(22, "Der Wartungsschacht 🕳️",
"Eng, dunkel, staubig und natürlich eine Sackgasse. Bevor du das merkst, "
"erwacht ein alter Prüf-Automat und feuert Trivia auf dich ab …",
"sackgasse", 2),
# ---- Etage 3: Laserhaie (richtiger Weg = LINKS → 31, Sackgasse = RECHTS → 32) ----
(30, "3. Etage Der Laserhai-Gang 🦈⚡",
"Absurd, aber real: Haie. Mit Lasern. Auf dem Kopf. LINKS führt ein "
"schmaler Steg direkt über das Laserhai-Becken da musst du durch. RECHTS "
"lockt ein gemütlicher Pausenraum, aus dem Kaffeeduft strömt.",
"gang", 3),
(31, "Steg über dem Laserhai-Becken 🦈⚡",
"Unter dir kreisen die Laserhaie und zwinkern gefährlich. Das letzte "
"Sicherheitssystem vor dem Dach will dich prüfen bleib cool!",
"thema", 3),
(32, "Der Pausenraum ☕",
"Warm, gemütlich, verlockend … und eine glasklare Falle. Der Kaffeeautomat "
"entpuppt sich als Quiz-Maschine und lässt dich nicht mehr los …",
"sackgasse", 3),
# ---- Dach: Ziel ----
(40, "Das Dach Der Kragle-Tresor 🏆",
"Ganz oben. Vor dir schwebt das Kragle im offenen Tresor. Nur noch eine "
"letzte Sicherung von Präsident Business steht zwischen dir und der Rettung "
"der Welt.",
"ziel", 4),
]
db.executemany(
"INSERT INTO raeume (id, name, beschreibung, typ, etage) VALUES (?,?,?,?,?)",
raeume,
)
# ─── Ausgänge (mit Story-Hinweis) ────────────────────────────────────────────
# Gänge haben ZWEI Wege (richtig/falsch). Themen-Räume führen eine Etage höher,
# Sackgassen zurück zum jeweiligen Gang.
ausgaenge = [
# Lobby → Etage 1
(1, "🛗 Aufzug nach oben", 10, "Der einzige Weg führt nach oben."),
# Etage 1 (richtig = LINKS → 11, falsch = RECHTS → 12)
(10, "⬅️ Nach links", 11, "🌊 Der salzigen Meeresluft zum Haibecken folgen."),
(10, "➡️ Nach rechts", 12, "🚪 Durch die Tür „Abstellkammer“."),
(11, "🪜 Treppe zur 2. Etage", 20, "Der Steg hält schnell weiter nach oben!"),
(12, "↩️ Zurück in den Hai-Gang", 10, "Diese Kammer ist eine Sackgasse."),
# Etage 2 (richtig = RECHTS → 21, falsch = LINKS → 22)
(20, "⬅️ Nach links", 22, "🕳️ In den dunklen Wartungsschacht."),
(20, "➡️ Nach rechts", 21, "🔴 Zum „Laser-Kontrollraum“."),
(21, "🪜 Treppe zur 3. Etage", 30, "Die Laser erlöschen der Weg ist frei!"),
(22, "↩️ Zurück in den Laser-Gang", 20, "Der Schacht endet im Nichts."),
# Etage 3 (richtig = LINKS → 31, falsch = RECHTS → 32)
(30, "⬅️ Nach links", 31, "🌉 Über den Steg am Laserhai-Becken."),
(30, "➡️ Nach rechts", 32, "☕ In den gemütlichen Pausenraum."),
(31, "🏢 Aufs Dach zum Kragle-Tresor", 40, "Die Laserhaie tauchen ab nach oben!"),
(32, "↩️ Zurück in den Laserhai-Gang", 30, "Der Pausenraum war eine Falle."),
]
db.executemany(
"INSERT INTO ausgaenge (von_raum, richtung, nach_raum, hinweis) VALUES (?,?,?,?)",
ausgaenge,
)
# ─── Trivia-Fragen pro Etage ─────────────────────────────────────────────────
# Pro Etage 4 Fragen: 12 thematisch passend, danach Popkultur.
# "antwort" ist die korrekte Option, "optionen" alle Auswahlmöglichkeiten (|-getrennt).
fragen = [
# ── Etage 1 · RICHTIG: Hai-Fragen (Raum 11) ──────────────────
(11, "🦈 Welcher Hai ist der größte Fisch der Welt?",
"Walhai", "Weißer Hai|Walhai|Hammerhai"),
(11, "🦈 Wie heißt Steven Spielbergs berühmter Hai-Film von 1975?",
"Der weiße Hai", "Der weiße Hai|Free Willy|Findet Nemo"),
(11, "🦈 Womit atmen Haie unter Wasser?",
"Kiemen", "Lungen|Kiemen|Schwimmflossen"),
# ── Etage 1 · FALSCH: themenfremde Trivia (Raum 12) ──────────
(12, "🎮 Wie heißt Marios grün gekleideter Bruder?",
"Luigi", "Luigi|Wario|Yoshi"),
(12, "🎬 In welcher Weltraum-Saga kämpfen Jedi gegen Sith?",
"Star Wars", "Star Trek|Star Wars|Herr der Ringe"),
(12, "📱 Welches Unternehmen stellt das iPhone her?",
"Apple", "Microsoft|Apple|Samsung"),
(12, "⏰ Wie viele Minuten hat eine Stunde?",
"60", "24|60|100"),
# ── Etage 2 · RICHTIG: Laser-Fragen (Raum 21) ────────────────
(21, "🔴 Wofür steht das Akronym LASER?",
"Light Amplification by Stimulated Emission of Radiation",
"Light Amplification by Stimulated Emission of Radiation|"
"Large Automatic System for Energy Reflection|"
"Leuchtende Aktive Strahlen-Emissions-Röhre"),
(21, "⚔️ Welche leuchtende Laser-Waffe führt ein Jedi in Star Wars?",
"Lichtschwert", "Lichtschwert|Laserpistole|Zauberstab"),
(21, "🌈 Welche Farbe hat ein klassischer Laserpointer meistens?",
"Rot", "Rot|Lila|Schwarz"),
# ── Etage 2 · FALSCH: themenfremde Trivia (Raum 22) ──────────
(22, "🦸 Welcher Superheld trägt ein blaues Kostüm mit rotem Umhang und „S“?",
"Superman", "Batman|Superman|Spider-Man"),
(22, "🎮 In welchem Spiel fängt man Kreaturen in kleinen Bällen?",
"Pokémon", "Minecraft|Tetris|Pokémon"),
(22, "🗼 Wie heißt die Hauptstadt von Frankreich?",
"Paris", "Paris|Rom|Madrid"),
(22, "🐶 Welches Tier bellt?",
"Hund", "Katze|Hund|Kuh"),
# ── Etage 3 · RICHTIG: Laserhai-Fragen (Raum 31) ─────────────
(31, "🦈⚡ In welchem Film wünscht sich Dr. Evil „Haie mit Laserstrahlen auf dem Kopf“?",
"Austin Powers", "James Bond|Austin Powers|Men in Black"),
(31, "🧬 Woraus setzt sich ein „Laserhai“ zusammen?",
"Hai und Laser", "Hai und Laser|Katze und Hund|Auto und Boot"),
(31, "😉 Wenn ein Laserhai gefährlich zwinkert was schießt aus seinen Augen?",
"Laserstrahlen", "Wasser|Laserstrahlen|Konfetti"),
# ── Etage 3 · FALSCH: themenfremde Trivia (Raum 32) ──────────
(32, "🦖 In welchem Film-Franchise werden Dinosaurier in einem Park geklont?",
"Jurassic Park", "Jurassic Park|King Kong|Godzilla"),
(32, "🕷️ Wie viele Beine hat eine Spinne?",
"8", "6|8|10"),
(32, "🎨 Welche Farbe entsteht aus Blau und Gelb?",
"Grün", "Grün|Lila|Orange"),
(32, "🎮 Aus welchem Land kommt der Spielehersteller Nintendo?",
"Japan", "USA|Japan|Deutschland"),
# ── Dach · ZIEL: finale Lord-Business-Frage (Raum 40) ────────
(40, "🧱 FINALE: Wie heißt der Bösewicht, in dessen Turm du gerade eingebrochen bist?",
"Lord Business", "Lord Business|Lord Vader|Lord Farquaad"),
]
db.executemany(
"INSERT INTO fragen (raum_id, frage, antwort, optionen) VALUES (?,?,?,?)",
fragen,
)
db.commit()
db.close()
print("Datenbank adventure.db angelegt:", DB_PATH)
print(" Räume:", len(raeume),
"| Ausgänge:", len(ausgaenge),
"| Fragen:", len(fragen))