from flask import Flask, request, session, redirect
import html
import sqlite3
from pathlib import Path
app = Flask(__name__)
app.secret_key = "hier-eigenen-geheimen-text" # für session nötig
DB_PATH = Path(__file__).with_name("adventure.db")
def get_db():
db = sqlite3.connect(DB_PATH)
db.row_factory = sqlite3.Row
return db
BASE_CSS = """... (unverändert, deine bestehende CSS bleibt) ..."""
BASE_JS = """... (unverändert) ..."""
def render_page(title, body_html):
return f"""
{html.escape(title)}
"""
@app.route("/", methods=["GET", "POST"])
@app.route("/app", methods=["GET", "POST"])
@app.route("/app/", methods=["GET", "POST"])
def start():
if request.method == "POST":
name = request.form.get("name", "").strip()
if name != "":
session["spieler"] = name
db = get_db()
db.execute(
"INSERT OR IGNORE INTO spielstand (spieler, raum_id) VALUES (?, 1)",
(name,)
)
db.commit()
db.close()
return redirect("/app/raum/1")
db = get_db()
anzahl = db.execute("SELECT COUNT(*) AS n FROM spielstand").fetchone()
weiterspielen_html = ""
if "spieler" in session:
s = db.execute(
"SELECT raum_id FROM spielstand WHERE spieler=?",
(session["spieler"],)
).fetchone()
if s:
weiterspielen_html = f"""
Willkommen zurück, {html.escape(session['spieler'])}!
"""
db.close()
body = f"""
Verlassenes Raumschiff
Du bist der einzige Überlebende an Bord. Erkunde das Schiff und aktiviere das Notsignal.
{weiterspielen_html}
{anzahl['n']} Abenteurer waren schon hier.
"""
return render_page("Verlassenes Raumschiff", body)
@app.route("/raum/", methods=["GET", "POST"])
@app.route("/app/raum/", methods=["GET", "POST"])
def raum(id):
db = get_db()
# Spielstand fortschreiben, sobald jemand angemeldet ist
if "spieler" in session:
db.execute(
"UPDATE spielstand SET raum_id=? WHERE spieler=?",
(id, session["spieler"])
)
db.commit()
r = db.execute("SELECT * FROM raeume WHERE id=?", (id,)).fetchone()
if not r:
db.close()
return render_page(
"Raum nicht gefunden",
'Raum nicht gefunden
Der angeforderte Raum existiert nicht.
'
''
)
unterwegs_html = ""
if "spieler" in session:
unterwegs_html = f'Unterwegs als: {html.escape(session["spieler"])}
'
if r["raetsel_frage"]:
if request.method == "POST":
if request.form.get("antwort", "").strip() == r["raetsel_antwort"]:
db.close()
return render_page(
"Notsignal aktiviert",
'Notsignal erfolgreich aktiviert
Rettung ist unterwegs.
'
''
)
db.close()
return render_page(
"Falscher Code",
'Falscher Code
Der KI-Kern reagiert nicht.
'
''
)
db.close()
body = f"""
{html.escape(r['name'])}
{html.escape(r['beschreibung'])}
{unterwegs_html}
"""
return render_page(html.escape(r["name"]), body)
ausgaenge = db.execute(
"SELECT richtung, nach_raum FROM ausgaenge WHERE von_raum=?", (id,)
).fetchall()
db.close()
body = f"""
{html.escape(r['name'])}
{html.escape(r['beschreibung'])}
{unterwegs_html}
"
return render_page(html.escape(r["name"]), body)
@app.route("/reset")
@app.route("/app/reset")
def reset():
session.pop("spieler", None) # Session vergessen (DB bleibt!)
return redirect("/app/")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=9004)