diff --git a/app.py b/app.py index 7e06734..7d3ffe1 100644 --- a/app.py +++ b/app.py @@ -201,7 +201,8 @@ def adventure_seite(inhalt, akzent="#f59e0b"): def start(): # Fortschritt für einen frischen Durchlauf zurücksetzen for key in [k for k in list(session.keys()) - if k.startswith("raum_") or k.startswith("chal_")]: + if k.startswith("raum_") or k.startswith("chal_") + or k.startswith("fs40")]: session.pop(key, None) inhalt = """
@@ -408,6 +409,212 @@ def challenge_raum(db, r): return adventure_seite(html, akzent="#f87171") +# ─── Polizei-Führerschein-Kontrolle vor dem Lord-Business-Finale (U18) ──────── +# Die drei Aufgaben stammen aus der deutschen Führerschein-Theorieprüfung. +# "richtig" = Menge der (1-basierten) anzukreuzenden Optionen. Mehrfachauswahl! +FS_FRAGEN = [ + { + "frage": "Welches Verhalten ist richtig?", + "bild": "/fs_frage1.png", + "optionen": ["erst nach dem Bus abbiegen", + "vor dem Motorrad abbiegen", + "als Erster abbiegen"], + "richtig": {3}, + }, + { + "frage": "Wann kann es hier zu einer gefährlichen Situation kommen?", + "bild": "/fs_frage2.png", + "optionen": ["Wenn der Radfahrer am Ende des Radweges anhält", + "Wenn ich unvermindert weiterfahre", + "Wenn der Radfahrer auf meine Fahrbahn wechselt"], + "richtig": {2, 3}, + }, + { + "frage": "Warum ist man nach dem Konsum der Droge „Crystal Meth“ fahruntauglich?", + "bild": None, + "optionen": ["Weil plötzliche Erschöpfung eintreten kann", + "Weil Wahnvorstellungen auftreten können", + "Weil die eigene Leistungsfähigkeit überschätzt werden kann"], + "richtig": {1, 2, 3}, + }, +] + +FS_IDX_KEY = "fs40_idx" +FS_DONE_KEY = "fs40_done" + + +def _blaulicht_intro(): + """Grelles deutsches Blaulicht + Polizei-Ansage vor der Kontrolle.""" + inhalt = """ + +
+
+
🚨
+ 🚔 POLIZEI · VERKEHRSKONTROLLE +

Anhalten – Fahrzeugkontrolle!

+

Kurz vor dem Kragle-Tresor stoppt dich eine Streife. + Die Beamten mustern deinen Führerschein misstrauisch: + „Diesen Lappen haben Sie doch nie im Leben ehrlich bestanden! + Wenn er echt ist, beweisen Sie es: Lösen Sie diese drei Aufgaben + aus der Theorieprüfung – dann dürfen Sie weiter.“

+

🚦 Achtung: Bei manchen Fragen ist + mehr als eine Antwort richtig. Kreuze alle + zutreffenden an – ein falsches Kreuz und du fällst durch.

+ Führerschein beweisen 📝 +
""" + return adventure_seite(inhalt, akzent="#1e50ff") + + +def _fs_frage_screen(idx, feedback=""): + """Eine Führerschein-Frage im (bewusst hässlichen) grünen Prüfungs-Stil.""" + f = FS_FRAGEN[idx] + bild_html = "" + if f["bild"]: + bild_html = ('
Verkehrssituation
' + % f["bild"]) + checks = "" + for i, opt in enumerate(f["optionen"], start=1): + checks += (""" + """ % (i, esc(opt))) + fb = "" + if feedback: + fb = '
%s
' % esc(feedback) + inhalt = """ + +
+
+
+ 🚔 THEORIEPRÜFUNG · POLIZEIKONTROLLE + Frage __NR__ / __GES__ +
+
+ __FB__ +

__FRAGE__

+ __BILD__ +
+
__CHECKS__
+ +
+

Mehrfachauswahl möglich – kreuze alle richtigen Antworten an.

+
+
+
""" + html = (inhalt + .replace("__NR__", str(idx + 1)) + .replace("__GES__", str(len(FS_FRAGEN))) + .replace("__FB__", fb) + .replace("__FRAGE__", esc(f["frage"])) + .replace("__BILD__", bild_html) + .replace("__CHECKS__", checks)) + return adventure_seite(html, akzent="#6b8e23") + + +def fuehrerschein_kontrolle(): + """Steuert die dreiteilige Polizei-Führerschein-Kontrolle vor dem Finale.""" + # Noch nicht gestartet → Blaulicht-Intro (oder Start per ?fs=1) + if FS_IDX_KEY not in session: + if request.args.get("fs") == "1": + session[FS_IDX_KEY] = 0 + session.modified = True + return redirect("/app/raum/40") + return _blaulicht_intro() + + idx = session.get(FS_IDX_KEY, 0) + feedback = "" + if request.method == "POST" and idx < len(FS_FRAGEN): + gewaehlt = set() + for i in range(1, len(FS_FRAGEN[idx]["optionen"]) + 1): + if request.form.get("opt%d" % i): + gewaehlt.add(i) + if gewaehlt == FS_FRAGEN[idx]["richtig"]: + idx += 1 + session[FS_IDX_KEY] = idx + session.modified = True + elif not gewaehlt: + feedback = ("🚨 Kein Kreuz gesetzt! „So kommen Sie hier nicht durch.“ " + "Kreuze alle richtigen Antworten an.") + else: + feedback = ("🚨 Durchgefallen bei dieser Aufgabe! Die Beamten schütteln " + "den Kopf: „Nochmal – und diesmal richtig.“") + + if idx >= len(FS_FRAGEN): + session[FS_DONE_KEY] = True + session.modified = True + return redirect("/app/raum/40") + + return _fs_frage_screen(idx, feedback) + + @app.route("/raum/", methods=["GET", "POST"]) def raum(id): db = get_db() @@ -428,6 +635,10 @@ def raum(id): # ═══ Räume mit Fragen: thema (Prüf-Weg) · ziel (Finale) ═══ if typ in ("thema", "ziel"): + # ── Polizei-Führerschein-Kontrolle vor dem Lord-Business-Finale ── + if typ == "ziel" and id == 40 and not session.get(FS_DONE_KEY): + db.close() + return fuehrerschein_kontrolle() fragen = db.execute( "SELECT * FROM fragen WHERE raum_id=? ORDER BY id", (id,) ).fetchall() diff --git a/fs_frage1.png b/fs_frage1.png new file mode 100644 index 0000000..fd25ff3 Binary files /dev/null and b/fs_frage1.png differ diff --git a/fs_frage2.png b/fs_frage2.png new file mode 100644 index 0000000..5bdd8bf Binary files /dev/null and b/fs_frage2.png differ diff --git a/fuhrerschein1 3.png b/fuhrerschein1 3.png new file mode 100644 index 0000000..e99d75d Binary files /dev/null and b/fuhrerschein1 3.png differ diff --git a/führerschein1 frame.png b/führerschein1 frame.png new file mode 100644 index 0000000..fd25ff3 Binary files /dev/null and b/führerschein1 frame.png differ diff --git a/führerschein2 23.png b/führerschein2 23.png new file mode 100644 index 0000000..021bdb0 Binary files /dev/null and b/führerschein2 23.png differ diff --git a/führerschein2 frame.png b/führerschein2 frame.png new file mode 100644 index 0000000..5bdd8bf Binary files /dev/null and b/führerschein2 frame.png differ diff --git a/führerschein3 123.png b/führerschein3 123.png new file mode 100644 index 0000000..bd65d00 Binary files /dev/null and b/führerschein3 123.png differ