JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
Educational Escape Game <h1>„Blackout im FH-Klinikum”</h1> <<if $teamName>> <h3><em>Willkommen im FH-Klinikum, <<= $teamName >>!</em></h3> <</if>> <strong><em>Spielanleitung:</em></strong> Ihr habt insgesamt 90 Minuten Zeit, um 10 Rätsel zu lösen.<br> Die Zeit startet erst, wenn ihr auf „START“ drückt. Solltet ihr nach einigen Minuten noch nicht zur richtigen Lösung gekommen sein,<br> erhaltet ihr automatisch einen Hinweis, der euch weiterhelfen kann. Habt ihr die Patientenakte griffbereit? Dann kann es losgehen! <<link "START">> <<run (function () { var a = document.getElementById('prime-voice'); if (a) { a.muted = true; var p = a.play(); if (p && p.then) p.then(function(){ a.pause(); a.currentTime = 0; a.muted = false; }); } })()>> <<set $timerStarted = true>> <<set $startTime = Date.now()>> <<run setup.log.startNow()>> <<goto "Rätsel1">> <</link>> <!-- in intro: gleiche Datei wie in Ende --> <audio id="prime-voice" preload="auto"> <source src="https://deine-domain.tld/audio/ende-text.m4a" type="audio/mp4"> </audio>
<h3>Willkommen im Spiel!</h3> <h1>Rätsel 1- Nährstoffe im Verborgenen</h1> <<set $solution = "Anamnese">> <!-- gewünschtes Lösungswort --> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="hint-box"></div> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { if (setup && setup.log && setup.log.markSolved) setup.log.markSolved(1); // <— hier SugarCube.Engine.play('Rätsel2'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 7 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> Am Ende entsteht ein einziges Wort:<br> das Fundament jeder Diagnostik, der Schlüssel zu jeder Einschätzung. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<div id="debug-box"> <strong>Debug-Info:</strong><br> 1) anamnese<br> 2) ernährungsplan<br> 3) eisen<br> 4) Flocki_Lieblingspfote31<br> 5) Stadium 2<br> 6) Ascorbinsäure<br> 7) Cyanocobalamin<br> 8) Folat<br> 9) Konjugase<br> 10) 5C63.1<br> <!--Score: $score<br> Health: $health<br> Name: $name--> </div>
<<run setup.log.finishAndStore()>> <h1 style="text-align: center;">⏰ Game over!</h1> <h1 style="text-align: center;"> Euer Abenteuer endet hier.</h1> <h2 style="text-align: center;">Ihr habt <<= setup.log.solved.reduce(function(acc, ms){ return acc + (ms != null ? 1 : 0); }, 0) >> von 10 Rätseln erfolgreich gelöst.</h2> Die Zeit ist abgelaufen! Der Oberarzt ist zurückgekehrt – doch ohne eure vollständige Lösung konnte er die entscheidende Diagnose nicht stellen. Das Rätsel bleibt ungelöst … vorerst. Doch gebt nicht auf: Jede Spur, jeder Hinweis bringt euch beim nächsten Versuch näher an die Lösung. Seid schneller, schärfer und noch aufmerksamer – nur so könnt ihr das Geheimnis lüften! <!-- Versteckter Game-Over-Sound --> <audio id="gameover-sound" preload="auto"> <source src="https://research-board.de/audio/happy-end.mp3" type="audio/mp3"> <!-- (optional) Fallbacks, falls du sie hast --> <!-- <source src="https://deine-domain.tld/audio/gong.mp3" type="audio/mpeg"> --> <!-- <source src="https://deine-domain.tld/audio/gong.wav" type="audio/wav"> --> </audio> <<script>> $(document).one(':passagedisplay', function () { const a = document.getElementById('gameover-sound'); const replay = document.getElementById('replay-go'); if (!a) return; // Andere Audios stoppen, damit nichts drüber dudelt document.querySelectorAll('audio').forEach(el => { if (el !== a) el.pause?.(); }); function tryPlay () { a.currentTime = 0; const p = a.play(); if (p && p.catch) p.catch(() => { // Autoplay evtl. blockiert – Nutzer kann über das Icon abspielen // (hier bewusst kein window.open) }); } // beim Betreten automatisch abspielen tryPlay(); // optionales Replay per Icon if (replay) replay.addEventListener('click', tryPlay); }); <</script>>
<div class="input-row"> <h2>Rätsel 2 - Auf Spurensuche im Anamnesegespräch</h2> <span id="zeitbox" style="display:none;"> ⏳ Restzeit: <<= formatTime(remainingTime())>> </span> </div> <<set $solution = "Ernährungsplan">> <!-- gewünschtes Lösungswort --> <!-- 1) Versteckter Audio-Player --> <audio id="voice-note" preload="none"> <!-- Für die Vorschau besser absolute URL benutzen --> <source src="https://research-board.de/audio/02_audio.m4a" type="audio/mp4"> Dein Browser unterstützt das Audio-Format nicht. </audio> <!-- Icon-Button --> <button id="play-voice" class="icon-btn emoji" type="button" aria-label="Sprachnotiz abspielen" title="Sprachnotiz abspielen">🔊</button> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-voice'); const audio = document.getElementById('voice-note'); if (!btn || !audio) return; function updateUI() { btn.textContent = audio.paused ? '🔊' : '⏸️'; } btn.addEventListener('click', () => { if (audio.paused) { audio.play().catch(() => { // Fallback: wenn Abspielen blockiert wird, öffne die Datei in neuem Tab window.open(audio.currentSrc || audio.src, '_blank'); }); } else { audio.pause(); } updateUI(); }); audio.addEventListener('ended', () => { audio.currentTime = 0; updateUI(); }); audio.addEventListener('play', updateUI); audio.addEventListener('pause', updateUI); updateUI(); }); <</script>> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="hint-box2"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 2 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 2000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { if (setup && setup.log && setup.log.markSolved) setup.log.markSolved(2); // <— hier SugarCube.Engine.play('Rätsel3'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-hint'); if (btn) btn.addEventListener('click', () => { SimpleAudio.tracks.sfxHint.play(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 10 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box2'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> Am Ende entsteht ein einziges Wort:<br> Hört der Patientin gut zu –<br>ihre Worte enthalten die entscheidenden Symptome.<br>Übersetzt sie in der richtigen Reihenfolge in Fachsprache, um die Zusammenhänge zu erkennen.<br>Im FH-Klinikum findet ihr im Raum eine Hilfe, die euch beim Übersetzen unterstützen kann. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hier der Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<<set $timeLimit = 90 * 60 * 1000>> /* 60 Minuten in ms */ <<set $timerStarted = false>> /* läuft noch nicht */ <<set $startTime = 0>> /* wird später gesetzt */ <<set $teamName = "">> /* hier der hinweis speech */ <<set $ttsOn = true>> /* bei Bedarf auf false setzen */ <<run setup.ttsVoiceName = "Stefan">> /* csv einmalig löschen - dann wieder entfernen */ /* <<run localStorage.removeItem("sc_csv_rows_v1")>> */
⏳ Zeit übrig: <span id="time-left">--:--</span> <<link "CSV speichern">><<run setup.csv.download("teams.csv")>><</link>>
<div class="input-row"> <h1>Rätsel 3 - Anamnese mit Nachgeschmack</h1> <span id="zeitbox" style="display:none;"> ⏳ Restzeit: <<= formatTime(remainingTime())>> </span> </div> <<set $solution = "Eisen">> <!-- gewünschtes Lösungswort --> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="zeitbox" style="display:none;"> <h2>⏳ nocht: <<= formatTime(remainingTime())>></h2> </div> <div id="hint-box3"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 2 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 2000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { if (setup && setup.log && setup.log.markSolved) setup.log.markSolved(3); // <— hier SugarCube.Engine.play('Rätsel4'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 6 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box3'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> Achtet genau auf die Abbildungen im Ernährungsplan – jedes Detail zählt! <br>Ordnet sie in der richtigen Reihenfolge, nur so entsteht das entscheidende Gesamtbild. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hier der Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<h1>Rätsel 2</h1> <<set $solution = "Ernährungsplan">> <!-- gewünschtes Lösungswort --> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="zeitbox" style="display:none;"> <h2>⏳ Restzeit: <<= formatTime(remainingTime())>></h2> </div> <div id="hint-box2"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 5 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 5000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { SugarCube.Engine.play('Rätsel3'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> setTimeout(function () { // nur wenn der Platzhalter noch in der aktuellen Passage existiert if (document.getElementById("hint-box2")) { document.getElementById("hint-box2").innerHTML = "<p><strong><em>Hinweis:</em></strong><br>Ihr befindet euch im FH-Klinikum – einem Lehrkrankenhaus.<br>Die Krankenschwestern haben im Raum einige Lernkarten versteckt.<br> Sie helfen euch dabei, umgangssprachliche Beschreibungen in die passende medizinische Fachsprache zu übersetzen.<br> Findet die Karten – sie geben euch wichtige Schlüsselbegriffe für die weitere Untersuchung! </p>"; } }, 0.2 * 60 * 1000); // 3 Minuten in Millisekunden <</script>>
<div class="input-row"> <h1>Rätsel 4 - Blutspur zur Diagnose</h1> <span id="zeitbox" style="display:none;"> ⏳ Restzeit: <<= formatTime(remainingTime())>> </span> </div> <<set $solution = "Flocki_Lieblingspfote31">> <!-- gewünschtes Lösungswort --> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="zeitbox" style="display:none;"> <h2>⏳ nocht: <<= formatTime(remainingTime())>></h2> </div> <div id="hint-box4"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 5 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 5000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { if (setup && setup.log && setup.log.markSolved) setup.log.markSolved(4); // <— hier SugarCube.Engine.play('Rätsel5'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 4 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box4'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> Schaut euch genau um: Vor euch liegen drei Blutbilder –<br>drei Geschichten, drei Spuren.<br>Jedes weist auf einen verborgenen Mangel hin, doch nur eines passt zu eurer Vermutung über Erna.<br>Vergleicht ihre Laborwerte mit den Bildern, kombiniert die Hinweise klug –<br>so findet ihr Ernas Blutbild und das Passwort der Patientenakte. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<h3>Willkommen im Spiel!</h3> <h1>Rätsel 1- Nährstoffe im Verborgenen</h1> <<set $solution = "Anamnese">> <!-- gewünschtes Lösungswort --> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="hint-box"></div> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { SugarCube.Engine.play('Rätsel2'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> setTimeout(function () { // nur wenn der Platzhalter noch in der aktuellen Passage existiert if (document.getElementById("hint-box")) { document.getElementById("hint-box").innerHTML = "<p><strong><em>Hinweis:</em></strong><br>Am Ende entsteht ein einziges Wort:<br>das Fundament jeder Diagnostik, der Schlüssel zu jeder Einschätzung.</p>"; } }, 0.1 * 60 * 1000); // 3 Minuten in Millisekunden <</script>>
<div class="input-row"> <h1>Rätsel 5 - Das verschleierte Bild</h1> <span id="zeitbox" style="display:none;"> ⏳ Restzeit: <<= formatTime(remainingTime())>> </span> </div> <<set $solution = "Stadium 2">> <!-- gewünschtes Lösungswort --> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="zeitbox" style="display:none;"> <h2>⏳ nocht: <<= formatTime(remainingTime())>></h2> </div> <div id="hint-box5"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 5 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 5000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { if (setup && setup.log && setup.log.markSolved) setup.log.markSolved(5); // <— hier SugarCube.Engine.play('Rätsel6'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 5 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box5'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> Der vollständige Laborbefund liegt endlich vor euch – sauber, klar, ohne die üblichen Kaffeeflecken.<br>Lest die Werte aufmerksam und gleicht sie mit den übrigen Unterlagen ab.<br>Die Werte verraten euch, in welchem Stadium des Eisenmangels sich Erna wirklich befindet. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<div class="input-row"> <h1>Rätsel 6 - Der verborgene Helfer</h1> <span id="zeitbox" style="display:none;"> ⏳ Restzeit: <<= formatTime(remainingTime())>> </span> </div> <<set $solution = "Ascorbinsäure">> <!-- gewünschtes Lösungswort --> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="zeitbox" style="display:none;"> <h2>⏳ nocht: <<= formatTime(remainingTime())>></h2> </div> <div id="hint-box6"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 5 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 5000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { if (setup && setup.log && setup.log.markSolved) setup.log.markSolved(6); // <— hier SugarCube.Engine.play('Rätsel7'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 4 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box6'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> In der Grafik seht ihr den Helfer schon,<br> vorn zu Beginn bei der Reduktion.<br> Ganz klein doch die Wirkung beschwingt,<br> wie es bei der Eisenaufnahme Wunder vollbringt.<br><br> Ob im Drink, in der Frucht oder nebenbei –<br> dieser Booster war mehrfach mit dabei.<br> Er trägt nicht nur einen Namen allein,<br> mal klingt er alltäglich, mal streng und fein. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<div class="input-row"> <h1>Rätsel 7 - Puzzle der Cobalamine</h1> <span id="zeitbox" style="display:none;"> ⏳ Restzeit: <<= formatTime(remainingTime())>> </span> </div> <<set $solution = "Cyanocobalamin">> <!-- gewünschtes Lösungswort --> <!-- 1) Versteckter Audio-Player --> <audio id="voice-note" preload="none"> <!-- Für die Vorschau besser absolute URL benutzen --> <source src="https://research-board.de/audio/07_audio.m4a" type="audio/mp4"> Dein Browser unterstützt das Audio-Format nicht. </audio> <!-- Icon-Button --> <button id="play-voice" class="icon-btn emoji" type="button" aria-label="Sprachnotiz abspielen" title="Sprachnotiz abspielen">🔊</button> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-voice'); const audio = document.getElementById('voice-note'); if (!btn || !audio) return; function updateUI() { btn.textContent = audio.paused ? '🔊' : '⏸️'; } btn.addEventListener('click', () => { if (audio.paused) { audio.play().catch(() => { // Fallback: wenn Abspielen blockiert wird, öffne die Datei in neuem Tab window.open(audio.currentSrc || audio.src, '_blank'); }); } else { audio.pause(); } updateUI(); }); audio.addEventListener('ended', () => { audio.currentTime = 0; updateUI(); }); audio.addEventListener('play', updateUI); audio.addEventListener('pause', updateUI); updateUI(); }); <</script>> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="hint-box7"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 5 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 5000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { if (setup && setup.log && setup.log.markSolved) setup.log.markSolved(7); // <— hier SugarCube.Engine.play('Rätsel8'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-hint'); if (btn) btn.addEventListener('click', () => { SimpleAudio.tracks.sfxHint.play(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 11 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box7'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> Ernas Instagram-Account birgt mehr, als auf den ersten Blick zu sehen ist. <br> Dort findet ihr den Schlüssel zur gesuchten Cobalamin-Form.<br>Achtet aufmerksam auf die chemischen Gruppen –<br> sie verraten euch, welche Variante ihr entschlüsseln müsst. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hier der Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<div class="input-row"> <h1>Rätsel 8 - Der verschlüsselte Zyklus</h1> <span id="zeitbox" style="display:none;"> ⏳ Restzeit: <<= formatTime(remainingTime())>> </span> </div> <<set $solution = "Folat">> <!-- gewünschtes Lösungswort --> <!-- 1) Versteckter Audio-Player --> <audio id="voice-note" preload="none"> <!-- Für die Vorschau besser absolute URL benutzen --> <source src="https://research-board.de/audio/08_audio.m4a" type="audio/mp4"> Dein Browser unterstützt das Audio-Format nicht. </audio> <!-- Icon-Button --> <button id="play-voice" class="icon-btn emoji" type="button" aria-label="Sprachnotiz abspielen" title="Sprachnotiz abspielen">🔊</button> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-voice'); const audio = document.getElementById('voice-note'); if (!btn || !audio) return; function updateUI() { btn.textContent = audio.paused ? '🔊' : '⏸️'; } btn.addEventListener('click', () => { if (audio.paused) { audio.play().catch(() => { // Fallback: wenn Abspielen blockiert wird, öffne die Datei in neuem Tab window.open(audio.currentSrc || audio.src, '_blank'); }); } else { audio.pause(); } updateUI(); }); audio.addEventListener('ended', () => { audio.currentTime = 0; updateUI(); }); audio.addEventListener('play', updateUI); audio.addEventListener('pause', updateUI); updateUI(); }); <</script>> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="hint-box8"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 5 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 5000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { if (setup && setup.log && setup.log.markSolved) setup.log.markSolved(8); // <— hier SugarCube.Engine.play('Rätsel9'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-hint'); if (btn) btn.addEventListener('click', () => { SimpleAudio.tracks.sfxHint.play(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 9 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box8'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> Achtet aufmerksam auf die Spielkarte!<br>Die Zahlen unter den Symbolen sind nicht zufällig –<br>sie zeigen euch eine entscheidende Position.<br>Legt alle Teile in die richtige Reihenfolge.<br>Nur dann offenbaren sich euch die Buchstaben des verborgenen Lösungswortes. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<div class="input-row"> <h1>Rätsel 9 - Der stille Hemmer</h1> <span id="zeitbox" style="display:none;"> ⏳ Restzeit: <<= formatTime(remainingTime())>> </span> </div> <<set $solution = "Konjugase">> <!-- gewünschtes Lösungswort --> <!-- 1) Versteckter Audio-Player --> <audio id="voice-note" preload="none"> <!-- Für die Vorschau besser absolute URL benutzen --> <source src="https://research-board.de/audio/09_audio.m4a" type="audio/mp4"> Dein Browser unterstützt das Audio-Format nicht. </audio> <!-- Icon-Button --> <button id="play-voice" class="icon-btn emoji" type="button" aria-label="Sprachnotiz abspielen" title="Sprachnotiz abspielen">🔊</button> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-voice'); const audio = document.getElementById('voice-note'); if (!btn || !audio) return; function updateUI() { btn.textContent = audio.paused ? '🔊' : '⏸️'; } btn.addEventListener('click', () => { if (audio.paused) { audio.play().catch(() => { // Fallback: wenn Abspielen blockiert wird, öffne die Datei in neuem Tab window.open(audio.currentSrc || audio.src, '_blank'); }); } else { audio.pause(); } updateUI(); }); audio.addEventListener('ended', () => { audio.currentTime = 0; updateUI(); }); audio.addEventListener('play', updateUI); audio.addEventListener('pause', updateUI); updateUI(); }); <</script>> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="hint-box9"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 5 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 5000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { if (setup && setup.log && setup.log.markSolved) setup.log.markSolved(9); // <— hier SugarCube.Engine.play('Rätsel10'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-hint'); if (btn) btn.addEventListener('click', () => { SimpleAudio.tracks.sfxHint.play(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 5 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box9'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> Der Blister ist mehr als nur eine Verpackung – er verbirgt das Lösungswort.<br>Manche Felder sind bereits leer, dort fehlt eine Pille.<br>Diese Positionen zeigen euch den Weg:<br>Übertragt die Zahlen ins Alphabet (1 = A, 2 = B, …, 26 = Z).<br>Setzt die Buchstaben in die richtige Reihenfolge –<br>so enthüllt sich der Name des Enzyms, das die Aufnahme von Folsäure blockiert. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<div class="input-row"> <h1>Rätsel 10 - Folatverluste</h1> <span id="zeitbox" style="display:none;"> ⏳ Restzeit: <<= formatTime(remainingTime())>> </span> </div> <<set $solution = "5C63.1">> <!-- gewünschtes Lösungswort --> <!-- 1) Versteckter Audio-Player --> <audio id="voice-note" preload="none"> <!-- Für die Vorschau besser absolute URL benutzen --> <source src="https://research-board.de/audio/10_audio.m4a" type="audio/mp4"> Dein Browser unterstützt das Audio-Format nicht. </audio> <!-- Icon-Button --> <button id="play-voice" class="icon-btn emoji" type="button" aria-label="Sprachnotiz abspielen" title="Sprachnotiz abspielen">🔊</button> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-voice'); const audio = document.getElementById('voice-note'); if (!btn || !audio) return; function updateUI() { btn.textContent = audio.paused ? '🔊' : '⏸️'; } btn.addEventListener('click', () => { if (audio.paused) { audio.play().catch(() => { // Fallback: wenn Abspielen blockiert wird, öffne die Datei in neuem Tab window.open(audio.currentSrc || audio.src, '_blank'); }); } else { audio.pause(); } updateUI(); }); audio.addEventListener('ended', () => { audio.currentTime = 0; updateUI(); }); audio.addEventListener('play', updateUI); audio.addEventListener('pause', updateUI); updateUI(); }); <</script>> <div class="input-row"> <input id="answer" type="text" placeholder="Lösungswort" autocomplete="off"> <button id="check" type="button">Prüfen</button> </div> <div id="msg"></div> <div id="hint-box10"></div> <<script>> $(document).one(':passagedisplay', function () { var box = document.getElementById("zeitbox"); if (!box) return; // Sofort sichtbar machen box.style.display = "block"; // Nach 2 Sekunden wieder verstecken setTimeout(function () { box.style.display = "none"; }, 2000); }); <</script>> <<script>> /* Warten, bis die Passage im DOM ist */ $(document).one(':passagedisplay', function () { var input = document.getElementById('answer'); var btn = document.getElementById('check'); var msg = document.getElementById('msg'); if (!input || !btn || !msg) return; function checkAnswer () { var val = input.value; var sol = State.variables.solution; // <- $solution if (norm(val) === norm(sol)) { setup.log.markSolved(10); setup.log.finishAndStore(); //<- SV-Zeile erzeugen if (setup && setup.log) { setup.log.markSolved(10); setup.log.finishAndStore(); } SugarCube.Engine.play('Ende'); // <- Zielpassage } else { msg.innerHTML = '<span class="error">Leider falsch. Versuch’s nochmal.</span>'; } } btn.addEventListener('click', checkAnswer); input.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') checkAnswer(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const btn = document.getElementById('play-hint'); if (btn) btn.addEventListener('click', () => { SimpleAudio.tracks.sfxHint.play(); }); }); <</script>> <<script>> $(document).one(':passagedisplay', function () { const delayMs = 8 * 60 * 1000; // zum Testen z.B. 4000 setTimeout(function () { const box = document.getElementById('hint-box10'); if (!box) return; // … hier baust du deinen Hinweis ins DOM … box.innerHTML = ` <p><strong><em>Hinweis:</em></strong><br> Nur wenn ihr den prozentualen Folatverlust der jeweiligen Zubereitungsmethode korrekt<br>in die Rechenformel einsetzt, gelangt ihr zur richtigen Lösung. </p> `; // TTS sagen lassen (Fallback optional) if (!window.speakDe || !speakDe("Hinweis.")) { const ding = document.getElementById('hint-ding'); // optionaler Fallback-Ton if (ding) { ding.currentTime = 0; ding.play().catch(()=>{}); } } }, delayMs); }); <</script>>
<<run (function(){ setup.log.entered = Array(10).fill(null); setup.log.solved = Array(10).fill(null); setup.log.started = null; setup.log.rowLogged = false; })()>> <h1>Team anmelden</h1> <form id="team-form" autocomplete="off"> <label for="team-in">Bitte gebt euren Teamnamen ein:</label><br> <input id="team-in" type="text" placeholder="Teamname"><br> <button type="submit">Weiter</button> </form> <div id="msg"></div> <<script>> $(document).one(':passagedisplay', function () { var form = document.getElementById('team-form'); var input = document.getElementById('team-in'); var msg = document.getElementById('msg'); if (!form || !input) return; function proceed () { var val = (input.value || '').trim(); if (!val) { if (msg) msg.innerHTML = '<span class="error">Bitte Teamnamen eingeben.</span>'; return; } State.variables.teamName = val; // $teamName setzen // Zielpassage exakt einsetzen (Groß/Klein beachten): SugarCube.Engine.play('Intro'); // falls deine Passage 'intro' heißt -> 'intro' } // Enter ODER Klick lösen dasselbe aus: form.addEventListener('submit', function (ev) { ev.preventDefault(); proceed(); }); // Komfort: Fokus direkt ins Feld setTimeout(function(){ input.focus(); }, 0); }); <</script>> <style> .error { color:#c0392b; font-weight:600; } </style>
<<set $timerStarted = false>> <!-- verhindert die 0:00-Aktion im Ticker --> <<run (function () { // optional: Intervall stoppen & „Zeit abgelaufen“-Flag setzen if (window.__timeInterval) { clearInterval(window.__timeInterval); window.__timeInterval = null; } window.__timeExpired = true; })()>> Educational Escape Game <h2>„Blackout im FH-Klinikum”</h2> <<if $teamName>> <h1><em><<= $teamName >></em>, Ihr habt das Rätsel gelöst!</h1> <</if>> <!-- 1) Versteckter Audio-Player auto-sofort none-auf knopfdruck--> <audio id="voice-note" preload="auto"> <!-- Für die Vorschau besser absolute URL benutzen --> <source src="https://research-board.de/audio/11_audio.mp3" type="audio/mp4"> Dein Browser unterstützt das Audio-Format nicht. </audio> <<script>> $(document).one(':passagedisplay', function () { // andere Audios stoppen (optional) document.querySelectorAll('audio').forEach(el => { if (el.id !== 'voice-note') el.pause?.(); }); const a = document.getElementById('voice-note'); if (!a) return; a.currentTime = 0; const p = a.play(); if (p && p.catch) p.catch(()=>{ /* falls doch blockiert: Icon anbieten */ }); }); <</script>> <div id="msg"></div> <!-- Versteckter Gewonnen --> <audio id="gameover-sound" preload="auto"> <source src="https://research-board.de/audio/applaus.mp3" type="audio/mp3"> </audio> <<script>> $(document).one(':passagedisplay', function () { const a = document.getElementById('gameover-sound'); const replay = document.getElementById('replay-go'); if (!a) return; // Andere Audios stoppen, damit nichts drüber dudelt // document.querySelectorAll('audio').forEach(el => { if (el !== a) el.pause?.(); }); function tryPlay () { a.currentTime = 0; const p = a.play(); if (p && p.catch) p.catch(() => { // Autoplay evtl. blockiert – Nutzer kann über das Icon abspielen // (hier bewusst kein window.open) }); } // beim Betreten automatisch abspielen tryPlay(); // optionales Replay per Icon if (replay) replay.addEventListener('click', tryPlay); }); <</script>>
<<run (function(){ setup.log.entered = Array(10).fill(null); setup.log.solved = Array(10).fill(null); setup.log.started = null; setup.log.rowLogged = false; })()>> <h3>Team anmelden</h3> <p>Bitte gebt euren Teamnamen ein:</p> <!-- Sicherheit: Variable existiert --> <<set $teamName = $teamName or "">> <!-- Textfeld: VAR + Default-Wert "" --> <<textbox "$teamName" "">> <br> <<button "Weiter">> <<set $teamName = ($teamName or "").trim()>> <<if $teamName == "">> <<replace "#msg">><span class="error">Bitte Teamnamen eingeben.</span><</replace>> <<else>> <<goto "Intro">> <</if>> <</button>> <div id="msg"></div>