Private
Public Access
1
0
Files
EscapeFromTeacher/cmd/client/web/index.html
2026-04-22 20:28:16 +02:00

493 lines
34 KiB
HTML
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.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
<title>Escape From Teacher</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<button id="mute-btn" onclick="toggleAudio()">🔊</button>
<button id="fullscreen-btn" onclick="toggleFullscreen()" title="Vollbild"></button>
<div id="rotate-overlay">
<div class="icon">📱↻</div>
<p>Bitte Gerät drehen!</p>
<small>Querformat benötigt</small>
</div>
<div id="game-container">
<!-- MAIN MENU -->
<div id="menu" class="overlay-screen">
<div id="startScreen">
<div class="start-left">
<h1>ESCAPE FROM<br>TEACHER</h1>
<p style="font-size: 12px; color: #aaa;">Dein Rekord: <span id="localHighscore" style="color:yellow">0</span></p>
<input type="text" id="playerName" placeholder="NAME (4 ZEICHEN)" maxlength="15" style="text-transform:uppercase;">
<button id="startBtn" onclick="startSoloGame()" disabled style="opacity: 0.5; cursor: not-allowed;">SOLO STARTEN</button>
<button id="coopBtn" onclick="showCoopMenu()" disabled style="opacity: 0.5; cursor: not-allowed;">CO-OP SPIELEN</button>
<div class="info-box">
<div class="info-title">SCHUL-NEWS</div>
<p>
• Der Lehrer ist hinter dir her!<br>
• Spring über Hindernisse.<br>
• Sammle Power-Ups für Vorteile!
</p>
</div>
<div class="info-box">
<div class="info-title">STEUERUNG</div>
<p>
PC: <strong>Leertaste</strong> (Springen), <strong>WASD/Pfeile</strong> (Bewegen)<br>
Handy: <strong>Bildschirm-Buttons</strong>
</p>
</div>
<div class="legal-bar">
<button class="legal-btn" onclick="showLeaderboard()">🏆 TOP 10</button>
<button class="legal-btn" onclick="showMyCodes()">🔑 MEINE CODES</button>
<button class="legal-btn" onclick="showSettings()">⚙️ EINSTELLUNGEN</button>
</div>
<div class="legal-bar" style="margin-top: 10px;">
<button class="legal-btn" onclick="showImpressum()">📄 IMPRESSUM</button>
<button class="legal-btn" onclick="showDatenschutz()">🔒 DATENSCHUTZ</button>
<button class="legal-btn" onclick="showSprueche()">💬 SPRÜCHE</button>
</div>
</div>
<div class="start-right">
<div class="hall-of-fame-box">
<h3>🏆 TOP SCHÜLER</h3>
<div id="startLeaderboardList">Lade...</div>
</div>
</div>
</div>
</div>
<!-- CO-OP MENU -->
<div id="coopMenu" class="overlay-screen hidden">
<div class="center-box">
<h1>CO-OP MODUS</h1>
<button id="createRoomBtn" class="big-btn" onclick="createRoom()" disabled style="opacity: 0.5; cursor: not-allowed;">RAUM ERSTELLEN</button>
<div style="margin: 20px 0;">- ODER -</div>
<input type="text" id="joinRoomCode" placeholder="RAUM-CODE" maxlength="6" style="text-transform:uppercase;">
<input type="text" id="teamNameJoin" placeholder="TEAM-NAME" maxlength="15">
<button id="joinRoomBtn" onclick="joinRoom()" disabled style="opacity: 0.5; cursor: not-allowed;">RAUM BEITRETEN</button>
<button class="back-btn" onclick="showMainMenu()">← ZURÜCK</button>
</div>
</div>
<!-- SETTINGS MENU -->
<div id="settingsMenu" class="overlay-screen hidden">
<div class="center-box">
<h1>EINSTELLUNGEN</h1>
<div class="settings-group">
<div class="setting-item">
<label>MUSIK LAUTSTÄRKE:</label>
<input type="range" id="musicVolume" min="0" max="100" value="80">
<span id="musicValue">80%</span>
</div>
<div class="setting-item">
<label>SFX LAUTSTÄRKE:</label>
<input type="range" id="sfxVolume" min="0" max="100" value="40">
<span id="sfxValue">40%</span>
</div>
</div>
<button class="back-btn" onclick="showMainMenu()">← ZURÜCK</button>
</div>
</div>
<!-- LEADERBOARD MENU -->
<div id="leaderboardMenu" class="overlay-screen hidden">
<div class="center-box">
<h1>🏆 TOP 10 LEADERBOARD</h1>
<div id="leaderboardList" class="leaderboard-box">
Lade Leaderboard...
</div>
<button class="back-btn" onclick="showMainMenu()">← ZURÜCK</button>
</div>
</div>
<!-- MY CODES MENU -->
<div id="myCodesMenu" class="overlay-screen hidden">
<div class="center-box">
<h1>🔑 MEINE HIGHSCORE-CODES</h1>
<div id="myCodesList" class="leaderboard-box" style="max-height: 500px;">
Keine Codes gespeichert.
</div>
<button class="back-btn" onclick="showMainMenu()">← ZURÜCK</button>
</div>
</div>
<!-- IMPRESSUM MENU -->
<div id="impressumMenu" class="overlay-screen hidden">
<div class="center-box" style="max-width: 800px;">
<h1>📄 IMPRESSUM & CREDITS</h1>
<div class="leaderboard-box" style="max-height: 500px; overflow-y: auto; text-align: left; font-family: sans-serif; font-size: 13px; line-height: 1.6; background: #333; color: #fff;">
<h3 style="color: #fc0; margin-top: 0;">Projektleitung & Code:</h3>
<p>Sebastian Unterschütz<br>
Göltzschtalblick 16<br>
08236 Ellefeld<br>
<strong>Kontakt:</strong> sebastian@unterschuetz.de</p>
<h3 style="color: #fc0; margin-top: 20px;">🎵 Musik & Sound Design:</h3>
<p>Max Eisel</p>
<h3 style="color: #fc0; margin-top: 20px;">💻 Quellcode:</h3>
<p><a href="https://git.zb-server.de/ZB-Server/EscapeFromTeacher" target="_blank" style="color: #fc0;">git.zb-server.de/ZB-Server/EscapeFromTeacher</a></p>
<h3 style="color: #fc0; margin-top: 20px;">⚖️ Lizenzhinweis:</h3>
<p style="background: rgba(255,204,0,0.1); padding: 10px; border-left: 3px solid #fc0;">
Dies ist ein <strong>Schulprojekt</strong>.<br>
Kommerzielle Nutzung und Veränderung des Quellcodes sind ausdrücklich untersagt.<br>
Alle Rechte liegen bei den Urhebern.
</p>
</div>
<button class="back-btn" onclick="showMainMenu()">← ZURÜCK</button>
</div>
</div>
<!-- DATENSCHUTZ MENU -->
<div id="datenschutzMenu" class="overlay-screen hidden">
<div class="center-box" style="max-width: 800px;">
<h1>🔒 DATENSCHUTZERKLÄRUNG</h1>
<div class="leaderboard-box" style="max-height: 500px; overflow-y: auto; text-align: left; font-family: sans-serif; font-size: 13px; line-height: 1.6; background: #333; color: #fff;">
<h3 style="color: #fc0; margin-top: 0;">1. Datenschutz auf einen Blick</h3>
<p><strong>Allgemeine Hinweise:</strong> Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen.</p>
<h3 style="color: #fc0; margin-top: 20px;">2. Verantwortlicher</h3>
<p>Verantwortlich für die Datenverarbeitung auf dieser Website ist:<br>
<strong>Sebastian Unterschütz</strong><br>
Göltzschtalblick 16, 08236 Ellefeld<br>
E-Mail: sebastian@unterschuetz.de<br>
(Schulprojekt im Rahmen der IT232)</p>
<h3 style="color: #fc0; margin-top: 20px;">3. Hosting (Hetzner)</h3>
<p>Wir hosten die Inhalte unserer Website bei folgendem Anbieter:<br>
<strong>Hetzner Online GmbH</strong><br>
Industriestr. 25, 91710 Gunzenhausen, Deutschland</p>
<p><strong>Serverstandort:</strong> Deutschland (ausschließlich).<br>
Wir haben mit dem Anbieter einen Vertrag zur Auftragsverarbeitung (AVV) geschlossen, der die Einhaltung der DSGVO gewährleistet.</p>
<h3 style="color: #fc0; margin-top: 20px;">4. Datenerfassung auf dieser Website</h3>
<h4 style="color: #fc0; margin-top: 15px;">Server-Log-Dateien</h4>
<p>Der Provider der Seiten (Hetzner) erhebt und speichert automatisch Informationen in so genannten Server-Log-Dateien (Browser, OS, Referrer, Hostname, Uhrzeit, IP-Adresse).<br>
<strong>Rechtsgrundlage:</strong> Art. 6 Abs. 1 lit. f DSGVO (Berechtigtes Interesse an technischer Fehlerfreiheit und Sicherheit). Die Daten werden nach spätestens 14 Tagen gelöscht.</p>
<h4 style="color: #fc0; margin-top: 15px;">Spielstände & Highscores</h4>
<p>Wenn Sie einen Highscore eintragen, speichern wir:</p>
<ul style="margin-left: 20px;">
<li>Gewählter Name (Pseudonym empfohlen!)</li>
<li>Punktestand und Zeitstempel</li>
<li>Eindeutiger Player-Code (generiert)</li>
<li>Proof-Code (kryptografischer Hash zur Verifizierung des Scores)</li>
</ul>
<p>Diese Daten dienen der Darstellung der Bestenliste und der Verifikation Ihrer Highscores.</p>
<h4 style="color: #fc0; margin-top: 15px;">Lokale Speicherung (LocalStorage)</h4>
<p>Das Spiel speichert folgende Daten lokal in Ihrem Browser:</p>
<ul style="margin-left: 20px;">
<li>Einstellungen (Audio-Lautstärke)</li>
<li>Ihr Spielername</li>
<li>Ihr Player-Code</li>
<li>Ihre erreichten Highscore-Codes mit Proof-Codes</li>
<li>Lokaler Highscore-Rekord</li>
</ul>
<p>Diese Daten verbleiben <strong>ausschließlich auf Ihrem Gerät</strong> und werden nicht an uns übertragen. Sie können diese Daten jederzeit über die Browser-Einstellungen löschen.</p>
<p style="background: rgba(255,204,0,0.1); padding: 10px; border-left: 3px solid #fc0; margin-top: 15px;">
<strong>Wichtig:</strong> Wir setzen <strong>keine Tracking-Cookies</strong> oder Analyse-Tools ein. Es erfolgt keine Weitergabe Ihrer Daten an Dritte (außer technisch notwendig über Hetzner als Hosting-Provider).
</p>
<h3 style="color: #fc0; margin-top: 20px;">5. Ihre Rechte</h3>
<p>Sie haben jederzeit das Recht auf Auskunft, Berichtigung und Löschung Ihrer Daten. Wenden Sie sich dazu an den Verantwortlichen im Impressum.<br>
Um Ihre lokal gespeicherten Highscore-Codes zu löschen, nutzen Sie die Funktion im Menü <strong>"🔑 MEINE CODES"</strong> oder löschen Sie den Browser-LocalStorage.</p>
</div>
<button class="back-btn" onclick="showMainMenu()">← ZURÜCK</button>
</div>
</div>
<!-- SPRÜCHE MENU -->
<div id="spruecheMenu" class="overlay-screen hidden">
<div class="center-box" style="max-width: 900px; width: 95%;">
<h1>💬 LEGENDÄRE SPRÜCHE</h1>
<p style="font-size: 12px; color: #888; margin: -10px 0 15px;">Aus dem Schulalltag gesammelt von Schülern</p>
<div id="spruecheList" class="leaderboard-box" style="max-height: 60vh; overflow-y: auto; text-align: left; padding: 10px;"></div>
<button class="back-btn" onclick="showMainMenu()">← ZURÜCK</button>
</div>
</div>
<!-- LOBBY SCREEN (CO-OP WAITING ROOM) -->
<div id="lobbyScreen" class="overlay-screen hidden">
<div class="center-box">
<h1>LOBBY</h1>
<div id="lobbyContent" style="display: flex; gap: 20px; width: 100%; justify-content: center; align-items: flex-start;">
<div style="flex: 1; max-width: 400px;">
<p style="font-size: 14px; color: #aaa; margin-bottom: 10px;">Spieler im Raum:</p>
<div id="lobbyPlayerList" style="background: rgba(0,0,0,0.5); border: 2px solid #666; padding: 15px; min-height: 100px; font-family: sans-serif; font-size: 14px;">
<div style="color: #888;">Warte auf Spieler...</div>
</div>
</div>
<div style="flex: 1; max-width: 300px;">
<p style="font-size: 14px; color: #aaa; margin-bottom: 10px;">Raum-Code:</p>
<div style="background: rgba(0,0,0,0.6); border: 4px solid #ffcc00; padding: 20px; font-size: 32px; color: #ffcc00; letter-spacing: 4px; text-align: center;">
<span id="lobbyRoomCode">XXXXX</span>
</div>
</div>
</div>
<div id="lobbyTeamNameBox" class="hidden" style="margin: 20px 0; width: 100%; max-width: 400px;">
<p style="font-size: 14px; color: #aaa; margin-bottom: 10px;">Team-Name (nur Host):</p>
<input type="text" id="lobbyTeamName" placeholder="TEAM-NAME EINGEBEN" maxlength="15" style="text-transform:uppercase; width: 100%; padding: 10px; font-size: 16px;">
<p id="currentTeamName" style="font-size: 12px; color: #ffcc00; margin-top: 5px;">Aktuell: <span id="teamNameDisplay">Nicht gesetzt</span></p>
</div>
<div id="lobbyHostControls" class="hidden" style="margin: 20px 0;">
<button class="big-btn" onclick="startGameFromLobby()" style="background: #00cc00;">SPIEL STARTEN</button>
</div>
<p id="lobbyStatus" style="font-size: 12px; color: #ffcc00; margin: 20px 0;">Warte auf Host...</p>
<button class="back-btn" onclick="leaveLobby()">← LOBBY VERLASSEN</button>
</div>
</div>
<!-- GAME OVER SCREEN -->
<div id="gameOverScreen" class="overlay-screen hidden">
<div class="center-box">
<h1>ERWISCHT!</h1>
<p style="font-size: 18px; margin: 20px 0;">
Dein Score: <span id="finalScore" style="color:yellow; font-size: 24px;">0</span>
</p>
<div id="gameOverLeaderboardList" class="leaderboard-box" style="margin: 20px 0;">
Lade Leaderboard...
</div>
<button class="big-btn" onclick="restartGame()" style="background: #ff4444; margin-top: 20px;">ERNEUT VERSUCHEN</button>
</div>
</div>
<!-- PRESENTATION SCREEN -->
<div id="presentationScreen" class="overlay-screen hidden presentation-mode">
<div class="presi-background"></div>
<div class="presi-scanlines"></div>
<div class="presi-header">
<h1>PRESENTATION MODE</h1>
<div id="presiRoomInfo">
<span id="presiRoomCode">XXXXX</span>
</div>
</div>
<div class="presi-content">
<div id="presiQuoteBox">
<p id="presiQuoteText">"Lade legendäre Sprüche..."</p>
<p id="presiQuoteAuthor">- Unbekannt</p>
</div>
</div>
<div class="presi-qr-container">
<div id="presiQRCode"></div>
<p>SCANNEN ZUM MITMACHEN!</p>
</div>
<div class="presi-assets-track"></div>
<div class="presi-players-layer"></div>
<div class="presi-footer">
DRÜCKE [F1] ZUM BEENDEN
</div>
</div>
<!-- LOADING SCREEN -->
<div id="loading" class="loading-screen">
<div class="spinner"></div>
<p>Lade Escape From Teacher...</p>
<div id="loadingQuote" style="max-width:500px;margin-top:30px;padding:0 20px;text-align:center;"></div>
</div>
</div>
<!-- Sprüche Logic -->
<script>
const SPRUECHE = [
{ text: "Mobbing ist besser als gar keine sozialen Kontakte.", author: "Ein Lehrer" },
{ text: "Ein Lehrer kauft sich ein Auto, weil ihm die Farbe gefallen hat.", author: "Schulflur-Legende" },
{ text: "Was heißt Strafe auf Englisch? „Richard“?", author: "Ein Lehrer", ctx: "Während er versucht, einem Schüler etwas auf Englisch zu erklären" },
{ text: "Heute ist [alles in der Anwesenheitsliste] richtig eingetragen.", author: "Eine Lehrerin", ctx: "Am Montagmorgen. Ein paar Stunden später fehlte trotzdem jemand in der Liste." },
{ text: "Verstehen Sie überhaupt die Prüfungsfragen? Neh, ach …", author: "Ein Lehrer", ctx: "An einen Schüler" },
{ text: "Tut mir leid, dass ich Sie damit nerve, aber … [erzählt 10 Minuten über seine Weiterbildung zu Courage und Rechtsextremismus]. Ein Schüler meldet sich. Ist das eine rechtsextreme Handlung?!", author: "Ein Lehrer" },
{ text: "Können wir nochmal eine LK über Straßennamen schreiben? Ja klar, wenn du das willst.", author: "Schüler & Lehrerin", ctx: "Richard zur Deutschlehrerin im 3. Lehrjahr" },
{ text: "Mitten im WiKu-Unterricht betritt eine Lehrerin den Raum, schaut sich kurz um, schnappt sich den versteckten Wasserkocher vom Fensterstock und geht wieder. Ist das gerade wirklich passiert?", author: "Augenzeugen" },
{ text: "Neues Lieblingswort: „Hanebüchen“", author: "Ein Lehrer" },
{ text: "Einem Lehrer fällt die Kinnlade runter, als Reda chinesisch mit den chinesischen Lehrkräften spricht und diese es verstehen.", author: "Augenzeugen" },
{ text: "Ich bin mit dem Staat verheiratet. … Ich hab das nur wegen der Pension gemacht.", author: "Ein Lehrer (Lehrer aus Überzeugung)" },
{ text: "Ich hab 'nen Freund, [Schüler]! Das ist egal.", author: "Eine Lehrerin & Schüler" },
{ text: "Beschreibungen im Unterricht u.a.: Slavenhandel, Mafia, Kopfgeld, Knebelverträge, Voodoo-Zauber (bei Physik und Frontend), Menschen quälen mit Aufgaben, goldene Balkone bauen, geklauter Code … und ein Ast als Zeigestock, mit dem er auf die Tastatur haut.", author: "Ein Lehrer" },
{ text: "Ein Kollege hat vorgeschlagen, bei der Hitze schon um 6:40 Uhr anzufangen. Ich meinte, um diese Zeit ist noch niemand da, nicht einmal ich selber. Dann meinte ich, wir sollten lieber 5:40 Uhr anfangen. Dann kommen noch welche von ihrem Heimweg vorbei.", author: "Ein Lehrer" },
{ text: "Nachdem wir in ihrem Kreuzworträtsel etwa 10 Fehler gefunden haben, gibt sie zu, dass sie es bei einem Gläschen Wein erstellt hat. 1A Unterrichtsvorbereitung.", author: "Eine Lehrerin" },
{ text: "Die „Katastrophenprüfung“ im Sommer 2023 und die „Entschuldigungsprüfung“ im Sommer 2024.", author: "Ein Lehrer" },
{ text: "Das „Pippi“-Diagramm: das UML-Sequenzdiagramm.", author: "Ein Lehrer" },
{ text: "Und wo ist euer Klassenbuch? Mit wem hattet ihr gestern zuletzt Unterricht? Mit [dem Lehrer]. Ah ja. Der hat das gegessen.", author: "Eine Lehrerin" },
{ text: "Cool! Ich hab einen Klassensatz Bücher bestellt bekommen!", author: "Eine Lehrerin", ctx: "Freut sich wie ein Kind" },
{ text: "Ich hör viel zu viel Deutsch… Das ist nicht rassistisch gemeint. … Äh … Redet gefälligst in Englisch!", author: "Eine Lehrerin", ctx: "Im Englischunterricht" },
{ text: "Itze! Äh, äh, nowe! … Yes, this is good so.", author: "Eine Lehrerin" },
{ text: "Die anderen listen carefully, bitte.", author: "Eine Lehrerin" },
{ text: "Was mit Beschiss? Mit Beschiss kann ich. […] Ich hab den König gekrönt vom Bescheissen.", author: "Ein Lehrer" },
{ text: "Ein Lehrer erzählt die Geschichte von dem Huhn, das aggro wurde, als es einen Waschbären traf das jetzt so viel wert ist wie seine neue Brille.", author: "Schulflur-Legende" },
{ text: "BPMN ist EPK auf Steroiden.", author: "Ein Lehrer" },
{ text: "Richard ist heute nicht da. Was!? Dann wird das ja heute richtig still im Raum. Geil. Das hab ich jetzt nicht gesagt.", author: "Schüler & Lehrerin" },
{ text: "Zu Hausmeistern habe ich immer noch das beste Verhältnis im Gegensatz zu manchen anderen.", author: "Ein Lehrer" },
{ text: "Ein Kollege hat das bestimmt entspannter gemacht. Ich mag Menschen quälen.", author: "Ein Lehrer", ctx: "Zu LF 3" },
{ text: "Morgen sind Schüler unserer polnischen Partnerschule mit in unserem Unterricht. Die wollen von dem Besten lernen also von mir.", author: "Ein Lehrer" },
{ text: "Zwei Lehrer haben sich beim Kaffeetrinken über die Notengebung geeinigt. „[Der Kollege] ist da sehr entspannt, weil er Richard nur noch zwei Stunden die Woche hat.“", author: "Schulflur-Legende" },
{ text: "Ich bräuchte jetzt wirklich einen Kaffee oder ein Bier. Aber bietet mir bloß nicht was aus eurem Kofferraum an! Nur weil manche Schüler das schon gemacht haben…", author: "Eine Lehrerin", ctx: "Nach ausführlicher Diskussion über Englisch-Noten in der 9. Stunde" },
{ text: "Unterrichtsvorbereitung: „Ich werde es Ihnen beweisen. Hoffentlich habe ich keine zu große Klappe…“", author: "Ein Lehrer" },
{ text: "Ein Facharzt? Das ist ne echt gute Ausrede. Verdammte Scheiße…", author: "Ein Lehrer", ctx: "Zum Schüler, der früher gehen musste" },
{ text: "Scheiße, darauf kann ich nicht rumschreiben!", author: "Ein Lehrer", ctx: "Als er mit dem Tablet-Stift auf den Fernseher zugeht" },
{ text: "Can you read number 4? Which number? Please pay a little bit more attension to the lesson!", author: "Richard", ctx: "Während er versucht, die Klasse auf Englisch zu unterrichten, weil die Lehrerin noch nicht da war. Gelächter, weil er selbst sonst nur zu selten aufpasst." },
{ text: "Warum muss ich jetzt wieder Scheiße erklären, die ich net verzapft hab. Lasst mich doch in Ruhe.", author: "Ein Lehrer", ctx: "Als die Klasse mal wieder abschweift" },
{ text: "Dann können Rollstuhlfahrer gleich mit in den Krieg ziehen.", author: "Ein Lehrer" },
{ text: "Mobbing ist 3 Monate durchgängig. Ich kann sie also nicht gar nicht mobben, weil sie immer weg sind.", author: "Ein Lehrer" },
{ text: "Ich spiele kein Schach mehr, seit ich gegen ein (Klein-)Kind verloren hab.", author: "Ein Lehrer" },
{ text: "Sind denn alle schon da? Es sind so wenig gerade. Es sind ja auch nur die A- und C-Klasse da. Vermisst du etwa Richard?", author: "Samuel & Mitschüler" },
{ text: "Spielen Sie „God of War“? So sehen sie auch aus.", author: "Ein Lehrer", ctx: "Zu einem Schüler in der ersten Reihe" },
{ text: "Ich hab gesehen, dass jetzt sogar Spiele aus dem Microsoft Store hier funktionieren. Kaum zu glauben.", author: "Ein Lehrer", ctx: "Über die Schultechnik" },
{ text: "Die Antwort soll „ja“ sein. Mit genug Reden kann man auch das Gegenteil argumentieren. Mit viel Liebe, ja.", author: "Ein Lehrer", ctx: "Beim Auflösen einer Aufgabe" },
{ text: "Hallo, [Herr Lehrer]! Was macht ihr denn jetzt? Wir gehen auf's Klo. Was macht [Richard] jetzt? Sich ein Loch graben?", author: "Richard, David & ein Lehrer" },
{ text: "Offiziell gibt's das Notenbuch gar nicht. Der könnte von mir sein.", author: "Sebastian & ein Lehrer", ctx: "Über eigenmächtige Eintragungen" },
{ text: "Nicht richtig, aber auch nicht zielführend. Richard: In der Prüfung… Aber wenn das nicht die Antwort ist, kann ich doch die IHK verklagen?", author: "Eine Lehrerin & Richard" },
{ text: "Wollen Sie jetzt damit sagen, dass Stuttgart keinen Bahnhof braucht? Nein, aber net so ein Ding. Hätten sie mal lieber die halbe Stadt weggesprengt und einen richtigen Bahnhof hingebaut.", author: "Ein Lehrer" },
{ text: "Es geht darum, Sie drei Jahre hinzuhalten und dann sind Sie eh weg.", author: "Ein Lehrer", ctx: "Zum Prinzip Berufsschule" },
{ text: "Diesen Workaround gibt es hier nicht. Es gibt hier gar kein Problem. Am Tag darauf: Es gibt *** nochmal keine Probleme!", author: "Ein Lehrer", ctx: "Zu den „Problematica“ der IT-Infrastruktur" },
{ text: "Wenn man seine Kommentare aus dem Kontext reißt: „Ich denke immer, ich bin doof. Aber das ist so.“", author: "Ein Lehrer" },
{ text: "Wollen Sie etwas Lustiges hören? Nein? Dann eben etwas Trauriges…", author: "Ein Lehrer", ctx: "Freitagmorgen" },
{ text: "Ein Lehrer schickt einen Schüler, ein Messer aus dem Lehrerzimmer zu holen Tür extra offengelassen. Der Schüler kommt mit Messer heraus, begegnet zwei verdutzt schauenden Lehrern, grüßt freundlichst und geht weiter, als ob er das jeden Tag machen würde.", author: "Schulflur-Legende" },
{ text: "Warum wollen Sie die Schule versichern? Die können Sie sowieso nicht verklagen.", author: "Ein Lehrer" },
{ text: "Das ist das Beste, das uns passieren kann. Dann können wir von null anfangen.", author: "Ein Lehrer", ctx: "Falls der einzige IT-Administrator-Lehrer mal nicht mehr da sein sollte" },
{ text: "Haltet euch sklavisch an die Notation!", author: "Ein Lehrer" },
{ text: "Nur die Paranoiden werden überleben.", author: "Ein Lehrer" },
{ text: "Ein Lehrer wünscht sich, dass die Schüler mehr Angst haben. Aber nicht, dass den Schülern Angst gemacht wird.", author: "Schulflur-Legende" },
{ text: "Ich bin gerade im Größenwahn und es wird immer verrückter.", author: "Ein Lehrer", ctx: "Mitten im Unterricht" },
{ text: "Und was haben Sie heute gemacht? Nichts. Und was soll ich jetzt darauf antworten? Wenn Sie einmal einen Yachthafen haben, …", author: "Ein Lehrer", ctx: "Am Ende des Unterrichts" },
{ text: "Die Schüler haben mich genötigt durchzumachen (damit sie eher gehen können).", author: "Ein Lehrer", ctx: "Nach der Mittagspause" },
{ text: "Programmieren kann so ekelhaft sein, wenn man sich wirklich damit beschäftigt.", author: "Ein Lehrer" },
{ text: "Vorsicht, sauer. Hab ich meinen Kindern geklaut.", author: "Ein Lehrer", ctx: "Beim Austeilen von sauren Gummischlangen" },
{ text: "[Herr Lehrer], Sie sind mein absoluter Lieblingslehrer, … Mit was habe ich Ihre Anwesenheit verdient?", author: "Richard & ein Lehrer" },
{ text: "Die Beitragsätze der Sozialversicherungen haben sich geändert. Und ich muss nur kurz mein Auto aufsperren.", author: "Eine Lehrerin", ctx: "Im neuen Kalenderjahr" },
{ text: "Es gibt eine große Zeitspanne, in der quasi keine Lehrer ausgebildet wurden. Und dann gibt es noch solche von der Resterampe wie mich.", author: "Ein Lehrer" },
{ text: "Ja. So viel Pech im Denken kann man gar nicht haben.", author: "Ein Lehrer", ctx: "Als ihn ein Schüler fragte, mit wem er Spaß bei Sinusfunktionen hatte" },
{ text: "Richard; bei dir, das hab ich gleich gelassen und gar keine Note drunter geschrieben.", author: "Eine Lehrerin", ctx: "Beim Zurückgeben freiwilliger Aufgaben" },
{ text: "Die Noten der letzten LK konnten nicht eingetragen werden, weil die Notenbücher verschwunden sind. Reaktion: „Die tauchen irgendwann schon wieder auf.“", author: "Eine Lehrerin" },
{ text: "Ein Lehrer kommt random in der Mittagspause ins Zimmer und erzählt von seinen kulinarischen Abenteuern u.a. Gammelfisch am Wochenende.", author: "Zeugen" },
{ text: "Samuel: Ich hab für den Weg zum Netto länger gebraucht als die WiKu-LK gerade.", author: "Samuel" },
{ text: "[Schüler], waren Sie gestern da? Nein, ich war krank. Warum? Weil ein Kollege drauf gewettet hat, dass Sie nicht da sind. Ich hab die Wette verloren.", author: "Ein Lehrer" },
{ text: "[Herr Lehrer], wie heißen Sie eigentlich mit Vornamen? „Unwichtig.“ Aha, „Unwichtig [Nachname].“ Wie würden Sie sich nennen, wenn Sie sich einen Namen aussuchen könnten? „Ich-hab-zu-tun,-Geh-weg.“", author: "Richard & ein Lehrer" },
{ text: "Der Assi = der Assistenzarzt. „Hat der Assi Sie gut behandelt?“", author: "Ein Lehrer" },
{ text: "Dass ihr mal wisst, wie eine Prüfung physisch aussieht hier die vom Sommer '26. Die nehmen wir gerne! Nein! Die vom Sommer '25.", author: "Ein Lehrer & Schüler" },
{ text: "Ich kenn einen Autor vom Westermann; der schimpft eigentlich nur.", author: "Ein Lehrer" },
{ text: "[Herr Lehrer], haben Sie ein Messer dabei? Nein, leider nicht.", author: "Schüler & ein Lehrer" },
{ text: "Sag mal, die Amok-Läufer; das sind doch immer Schüler, oder?", author: "Ein Lehrer", ctx: "Zu einem Kollegen" },
{ text: "Das werdet ihr nicht mehr erleben mit den elektronischen Tafeln…", author: "Eine Lehrerin" },
{ text: "Ich darf mich doch, während ich die Aufgabe mache, umentscheiden. Ich muss Sie aber verstehen. Denken Sie doch mal an mich!", author: "Schüler & ein Lehrer" },
{ text: "Wir schauen uns eine Aufgabe aus der Prüfung der Systemintegratoren an. Wir haben ja einen Experten hier sitzen. Richard: So einfach?! Mehr trauen sie Euch nicht zu.", author: "Ein Lehrer & Richard", ctx: "Richard hatte sich in seiner Freistunde in den Unterricht gesetzt" },
{ text: "[Schüler], du hast leider eine 2 in der Arbeit… Haben wir uns trotzdem noch lieb?", author: "Ein Lehrer" },
{ text: "Kann ich Sie ihrem elendigem Schicksal überlassen? (= Bitte gehen Sie.)", author: "Ein Lehrer", ctx: "Zum Stundenbeginn" },
{ text: "Ich war leider zu spät. Zu spät zum Unterricht, oder für was? Zu spät zum Gaffen.", author: "Ein Lehrer", ctx: "Am Tag nach einem Unfall auf der Reichenbacher Straße" },
{ text: "Da wäre ich fast ausm Schlüpper geflogen!", author: "Eine Lehrerin" },
{ text: "Was stört sich die Eiche, wenn sich ein Schwein daran wälzt.", author: "Ein Lehrer" },
{ text: "Ich habe nichts verstanden. Hättest du auch nicht, wenn Ton da gewesen wäre.", author: "Leon & ein Lehrer", ctx: "Bei einem Video mit Tonproblemen" },
{ text: "Ein Lehrer greift an eine gerissene Achillessehne (einer anderen Person), nur um zu wissen, wie sich das anfühlt: „Wie Matsch.“", author: "Augenzeugen" },
{ text: "Wo ist Sebastian? Krank. Wo ist euer Klassenbuch? Krank.", author: "Reda" },
{ text: "„W“-Fragen sind verpönt! Das geht gar nicht!", author: "Ein Lehrer" },
{ text: "Wenn Richard im Unterricht keine Zeit hat, mit Mitschülern zu reden dann muss eine Lehrerin daran glauben…", author: "Schulflur-Legende" },
{ text: "Jetzt muss ich mir schon die Musterlösung schönsaufen.", author: "Ein Lehrer" },
{ text: "Ich muss die Prüfung nicht schreiben!", author: "Ein Lehrer", ctx: "Bei der Prüfungsvorbereitung" },
{ text: "Werd ich echt alt?", author: "Ein Lehrer", ctx: "Nachdem er die Anfänge von Wörtern nicht mehr gut verstand" },
{ text: "Bei euch hab ich ein gutes Gefühl. Apropos wo ist denn Leon?", author: "Ein Lehrer", ctx: "Als die Prüfung näher rückte" },
{ text: "Ein Lehrer kennt leider alle Bibi & Tina-Filme und erkennt für die Hälfte der Folgen den Titel am Titelbild.", author: "Schulflur-Legende" },
{ text: "Die Geißel Gottes. Ich freue mich, Sie zu sehen…!", author: "Ein Lehrer", ctx: "Zu Richard" },
{ text: "Ja, wir haben ein Kind. Meine Frau war da mehr beteiligt als ich.", author: "Ein Lehrer" },
{ text: "Kind kriegen ist glaub ich schon geiler als auf'm Mount Everest zu steigen.", author: "Ein Lehrer" },
{ text: "Ein Lehrer setzt Richard nach einem unruhigen Stundenstart nach vorne und fordert ihn zur Mitarbeit auf. Danach hat er im Unterricht niemanden mehr, den er rügen konnte.", author: "Augenzeugen" },
{ text: "„Mach nicht den Reda!“ = In einen Raum gehen, vor dem Schüler warten, und ihnen noch zurufen, dass da eine andere Klasse drin ist in dem Moment hat er die Tür schon aufgemacht und blickt in die verwirrten Gesichter der fremden Klasse.", author: "Schulflur-Legende" },
];
function showLoadingQuote() {
const el = document.getElementById('loadingQuote');
if (!el || !SPRUECHE.length) return;
const q = SPRUECHE[Math.floor(Math.random() * SPRUECHE.length)];
const txt = q.text.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
const ctx = q.ctx ? q.ctx.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;') : '';
const auth = q.author.replace(/&/g,'&amp;');
el.innerHTML = '<p style="font-family:sans-serif;font-size:13px;color:#ddd;line-height:1.6;font-style:italic;">\u201E' + txt + '\u201C</p>'
+ (ctx ? '<p style="font-size:11px;color:#ccc;margin-top:4px;font-style:italic;">' + ctx + '</p>' : '')
+ '<p style="font-size:12px;color:#fc0;margin-top:6px;">\u2014 ' + auth + '</p>';
}
showLoadingQuote();
// Wechsle Spruch alle 4 Sekunden während des Ladens
const _loadingQuoteInterval = setInterval(function() {
if (document.getElementById('loading') && !document.getElementById('loading').classList.contains('hidden')) {
showLoadingQuote();
} else {
clearInterval(_loadingQuoteInterval);
}
}, 10000);
function showSprueche() {
document.querySelectorAll('.overlay-screen').forEach(el => el.classList.add('hidden'));
document.getElementById('spruecheMenu').classList.remove('hidden');
const shuffled = [...SPRUECHE].sort(() => Math.random() - 0.5);
const container = document.getElementById('spruecheList');
container.innerHTML = shuffled.map(q => {
const txt = q.text.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
const ctx = q.ctx ? q.ctx.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;') : '';
const auth = q.author.replace(/&/g,'&amp;');
return '<div style="background:rgba(255,255,255,0.92);border-left:4px solid #fc0;margin:8px 0;padding:12px 15px;border-radius:3px;">'
+ '<p style="margin:0 0 6px;font-family:sans-serif;font-size:14px;color:#111;line-height:1.5;">' + txt + '</p>'
+ (ctx ? '<p style="margin:0 0 4px;font-size:11px;color:#555;font-style:italic;">' + ctx + '</p>' : '')
+ '<p style="margin:0;font-size:12px;color:#996600;font-weight:bold;">— ' + auth + '</p>'
+ '</div>';
}).join('');
}
</script>
<!-- WASM Execution -->
<script>
// Cache-Busting für JavaScript-Dateien (wird beim Build aktualisiert)
const BUILD_VERSION = 1767643088942;
document.write('<script src="wasm_exec.js?v=' + BUILD_VERSION + '"><\/script>');
document.write('<script src="game.js?v=' + BUILD_VERSION + '"><\/script>');
</script>
</body>
</html>