Atlas: Deploy-Buendel vor Staustufen-Sprint

- Logistik: Musik-Player Playlist-Modus (5 Gruppen, 20 Tracks)
- Heli: End-Screen auf .ggs-endscreen, Mission-Bilder, Voice-Lines, Briefing-Audio
- Logistik: Layout-Tausch Auftraege+Fahrzeuge links, Karte rechts
- Logistik: Tier-1-Staedte ausgebaut, Auto-Timescale-Badge
- Logistik: Roadnet/Railnet Dijkstra-Routing, Balance-Updates
- Atlas: 5 Atlas-Inbox-Nachrichten (Cards-Pattern, DALL-E-Key, Musik-Playlists)
- Status-Updates Heli + Logistik

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-26 01:05:13 +02:00
parent f811437a35
commit 79ac9dad84
773 changed files with 17482 additions and 541 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 987 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 892 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 923 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1011 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

+386
View File
@@ -0,0 +1,386 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GeoGraSim — Erfolgsparameter & Wirkungsklammer</title>
<link rel="stylesheet" href="../../assets/fonts/inter.css">
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',sans-serif;background:#f7f6f3;color:#1a1a1a;line-height:1.6;padding:2rem}
.wrap{max-width:1100px;margin:0 auto}
h1{font-size:1.5rem;font-weight:900;color:#1f4e5a;margin-bottom:.3rem}
h2{font-size:1.1rem;font-weight:800;color:#1f4e5a;margin:2rem 0 .5rem;padding-top:1rem;border-top:2px solid #dae8ec}
h3{font-size:.9rem;font-weight:700;color:#4a7c8a;margin:1.2rem 0 .3rem}
p{font-size:.85rem;color:#333;margin-bottom:.8rem}
table{width:100%;border-collapse:collapse;font-size:.78rem;margin-bottom:1.5rem}
th{background:#1f4e5a;color:#fff;padding:.5rem .6rem;text-align:left;font-weight:700;font-size:.7rem}
td{padding:.45rem .6rem;border-bottom:1px solid rgba(0,0,0,.05);vertical-align:top}
tr:nth-child(even){background:rgba(0,0,0,.015)}
.sim-icon{font-size:1.3rem;text-align:center}
.cat{font-size:.6rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:2px 6px;border-radius:3px;display:inline-block;margin-bottom:2px}
.cat-verstehen{background:#dceadd;color:#3a6b3e}
.cat-handeln{background:#dae8ec;color:#4a7c8a}
.cat-geschick{background:#f2eacc;color:#8a7020}
.cat-orient{background:#f2ddd8;color:#8a3a2a}
.q{background:#fff;border-radius:8px;padding:.8rem;margin-bottom:.6rem;border:1px solid rgba(0,0,0,.04)}
.q-title{font-size:.78rem;font-weight:700;color:#1f4e5a;margin-bottom:.3rem}
.q-opts{display:flex;flex-direction:column;gap:.2rem;margin-top:.3rem}
.q-opt{font-size:.72rem;padding:.3rem .5rem;border-radius:5px;background:#f7f6f3;border:1px solid rgba(0,0,0,.06)}
.q-opt.correct{background:#dceadd;border-color:#5a8a5e;font-weight:600}
.pre-post{display:grid;grid-template-columns:1fr 1fr;gap:1rem}
.pre-post>div{background:#fff;border-radius:10px;padding:1rem;border:1px solid rgba(0,0,0,.04)}
.pre-post h4{font-size:.75rem;font-weight:700;color:#4a7c8a;margin-bottom:.5rem}
</style>
</head>
<body>
<div class="wrap">
<h1>📊 Erfolgsparameter & Wirkungsklammer</h1>
<p>Übersicht aller Simulationen: Was wird gemessen, wie wird bewertet, welche Fragen werden vor und nach der Simulation gestellt.</p>
<!-- ============================================================ -->
<h2>1. Erfolgsparameter pro Simulation</h2>
<p>Diese Parameter werden während des Spiels erfasst und der Lehrperson + Schüler*innen angezeigt.</p>
<table>
<tr><th></th><th>Simulation</th><th>Verstehen (Kompetenz)</th><th>Handeln (Entscheidungen)</th><th>Geschicklichkeit</th></tr>
<tr>
<td class="sim-icon">🌡️</td>
<td><strong>Klimawächter 2D/3D</strong></td>
<td>
<span class="cat cat-verstehen">Verstehen</span><br>
• Temperaturanstieg vs. CO₂-Ausstoß (Zusammenhang erkannt?)<br>
• Meeresspiegel-Prognose vs. tatsächlicher Anstieg<br>
• Kipppunkte erkannt (wann wird es kritisch?)
</td>
<td>
<span class="cat cat-handeln">Handeln</span><br>
• Maßnahmen-Mix (einseitig vs. vielfältig?)<br>
• Budget-Effizienz (€ pro verhinderte °C)<br>
• Timing (früh investiert vs. Panik am Ende)<br>
• Balance Wirtschaft ↔ Umwelt
</td>
<td>
<span class="cat cat-geschick">Geschick</span><br>
• Endtemperatur (< 17°C = Klimaziel)<br>
• Bevölkerung überlebt (%)<br>
• Budget nicht negativ
</td>
</tr>
<tr>
<td class="sim-icon">🏞️</td>
<td><strong>Flussmanagement</strong></td>
<td>
<span class="cat cat-verstehen">Verstehen</span><br>
• Zusammenhang Begradigung ↔ Hochwasser<br>
• Renaturierung ↔ Biodiversität<br>
• Deiche = kurzfristiger Schutz, langfristiges Risiko
</td>
<td>
<span class="cat cat-handeln">Handeln</span><br>
• Maßnahmen-Balance (Schutz ↔ Ökologie ↔ Wirtschaft)<br>
• Reaktion auf Hochwasser-Events<br>
• Langfristplanung vs. Kurzfrist-Reaktion
</td>
<td>
<span class="cat cat-geschick">Geschick</span><br>
• Hochwasserschäden minimiert<br>
• Biodiversitäts-Index<br>
• Bevölkerungswachstum
</td>
</tr>
<tr>
<td class="sim-icon">🏗️</td>
<td><strong>Stadt & Raumplanung</strong></td>
<td>
<span class="cat cat-verstehen">Verstehen</span><br>
• Nutzungskonflikte erkannt (Wohnen neben Industrie)<br>
• Infrastruktur-Bedarf (Schule, Krankenhaus, Feuerwehr)<br>
• Versorgungslogik (Supermarkt-Erreichbarkeit)
</td>
<td>
<span class="cat cat-handeln">Handeln</span><br>
• Zoning-Qualität (sinnvolle Anordnung?)<br>
• Verkehrsanbindung<br>
• Grünflächen-Anteil<br>
• Budget-Nutzung
</td>
<td>
<span class="cat cat-geschick">Geschick</span><br>
• Zufriedenheits-Index<br>
• Wirtschafts-Index<br>
• Umwelt-Index<br>
• Erreichbarkeit
</td>
</tr>
<tr>
<td class="sim-icon">🌋</td>
<td><strong>Erdbeben</strong></td>
<td>
<span class="cat cat-verstehen">Verstehen</span><br>
• Naturgefahr ≠ Naturkatastrophe<br>
• Bauqualität entscheidet über Schäden<br>
• Vorsorge vs. Reaktion
</td>
<td>
<span class="cat cat-handeln">Handeln</span><br>
• Investition in Bauqualität vs. Quantität<br>
• Frühwarnsystem gebaut?<br>
• Notfallplan vorhanden?
</td>
<td>
<span class="cat cat-geschick">Geschick</span><br>
• Überlebensrate bei Erdbeben<br>
• Wirtschaftlicher Schaden<br>
• Wiederaufbauzeit
</td>
</tr>
<tr>
<td class="sim-icon"></td>
<td><strong>Energiemix</strong></td>
<td>
<span class="cat cat-verstehen">Verstehen</span><br>
• Erneuerbare vs. fossile Energieträger<br>
• Grundlast vs. Spitzenlast<br>
• CO₂-Bilanz verschiedener Quellen
</td>
<td>
<span class="cat cat-handeln">Handeln</span><br>
• Erneuerbaren-Anteil am Ende<br>
• Blackout vermieden?<br>
• CO₂-Reduktion erreicht?
</td>
<td>
<span class="cat cat-geschick">Geschick</span><br>
• Stromversorgung stabil (%)<br>
• CO₂-Emission gesunken<br>
• Budget im Rahmen
</td>
</tr>
<tr>
<td class="sim-icon">👕</td>
<td><strong>Lieferketten</strong></td>
<td>
<span class="cat cat-verstehen">Verstehen</span><br>
• Wahre Kosten eines Produkts<br>
• Zusammenhang Preis ↔ Arbeitsbedingungen ↔ CO₂<br>
• Globale Verflechtungen
</td>
<td>
<span class="cat cat-handeln">Handeln</span><br>
• Balance Preis ↔ Fairness ↔ CO₂<br>
• Lieferanten-Diversifikation<br>
• Transparenz-Entscheidungen
</td>
<td>
<span class="cat cat-geschick">Geschick</span><br>
• Produkt fertig produziert<br>
• Fairness-Score<br>
• CO₂-Fußabdruck
</td>
</tr>
<tr>
<td class="sim-icon">🌴</td>
<td><strong>Regenwald</strong></td>
<td>
<span class="cat cat-verstehen">Verstehen</span><br>
• Stockwerke des Regenwalds<br>
• Artenvielfalt und Abhängigkeiten<br>
• Bedrohung durch Rodung
</td>
<td>
<span class="cat cat-handeln">Handeln</span><br>
• Entdeckungen gemacht (Tiere, Pflanzen)<br>
• Wissen über Zusammenhänge
</td>
<td>
<span class="cat cat-geschick">Geschick</span><br>
• Arten entdeckt (%)<br>
• Expedition abgeschlossen
</td>
</tr>
<tr>
<td class="sim-icon">🚁</td>
<td><strong>Helikopter-Navigation</strong></td>
<td>
<span class="cat cat-orient">Orientierung</span><br>
• Himmelsrichtungen korrekt?<br>
• Entfernungen auf der Karte einschätzen<br>
• Topografie: Täler, Pässe, Flüsse als Orientierung<br>
• Ortskenntnisse (Städte, Berge)
</td>
<td>
<span class="cat cat-handeln">Handeln</span><br>
• Routenplanung-Genauigkeit (%)<br>
• H/V-Diagramm verstanden (Startverhalten)<br>
• Spritmanagement
</td>
<td>
<span class="cat cat-geschick">Geschick</span><br>
• Start-Sterne (15)<br>
• Landung-Sterne (15)<br>
• G-Kraft-Durchschnitt<br>
• Berührungen
</td>
</tr>
</table>
<!-- ============================================================ -->
<h2>2. Wirkungsklammer — Pre/Post-Fragen</h2>
<p>5 Fragen vor und 5 Fragen nach der Simulation. Gleiche Kompetenzen, leicht veränderte Formulierung.</p>
<!-- KLIMAWÄCHTER -->
<h3>🌡️ Klimawächter</h3>
<div class="pre-post">
<div>
<h4>VOR der Simulation</h4>
<div class="q">
<div class="q-title">1. Was passiert, wenn der CO₂-Gehalt in der Atmosphäre steigt?</div>
<div class="q-opts">
<div class="q-opt">a) Es wird kälter</div>
<div class="q-opt correct">b) Die Durchschnittstemperatur steigt</div>
<div class="q-opt">c) Es regnet weniger</div>
<div class="q-opt">d) Es passiert nichts Besonderes</div>
</div>
</div>
<div class="q">
<div class="q-title">2. Warum steigt der Meeresspiegel?</div>
<div class="q-opts">
<div class="q-opt">a) Weil mehr Regen fällt</div>
<div class="q-opt correct">b) Weil Gletscher schmelzen und Wasser sich bei Wärme ausdehnt</div>
<div class="q-opt">c) Weil Flüsse schneller fließen</div>
<div class="q-opt">d) Weil der Mond die Gezeiten verändert</div>
</div>
</div>
<div class="q">
<div class="q-title">3. Was ist ein Treibhausgas?</div>
<div class="q-opts">
<div class="q-opt">a) Ein Gas, das nur in Gewächshäusern vorkommt</div>
<div class="q-opt">b) Ein Gas, das die Luft reinigt</div>
<div class="q-opt correct">c) Ein Gas, das Wärme in der Atmosphäre zurückhält</div>
<div class="q-opt">d) Ein Gas, das nur bei Hitze entsteht</div>
</div>
</div>
<div class="q">
<div class="q-title">4. Welche Maßnahme hilft gegen den Klimawandel?</div>
<div class="q-opts">
<div class="q-opt">a) Mehr Straßen bauen</div>
<div class="q-opt">b) Mehr Kohle verbrennen</div>
<div class="q-opt correct">c) Erneuerbare Energie nutzen</div>
<div class="q-opt">d) Mehr Autos produzieren</div>
</div>
</div>
<div class="q">
<div class="q-title">5. Was bedeutet „Klimaziel 1,5°C"?</div>
<div class="q-opts">
<div class="q-opt">a) Die Temperatur soll auf 1,5°C sinken</div>
<div class="q-opt correct">b) Die Erderwärmung soll maximal 1,5°C über dem vorindustriellen Niveau bleiben</div>
<div class="q-opt">c) Es darf nur 1,5°C warm sein</div>
<div class="q-opt">d) Die Temperatur soll jedes Jahr um 1,5°C steigen</div>
</div>
</div>
</div>
<div>
<h4>NACH der Simulation</h4>
<div class="q">
<div class="q-title">1. In der Simulation: Was ist passiert, als du den CO₂-Ausstoß nicht gesenkt hast?</div>
<div class="q-opts">
<div class="q-opt">a) Nichts hat sich verändert</div>
<div class="q-opt correct">b) Die Temperatur ist gestiegen und der Meeresspiegel auch</div>
<div class="q-opt">c) Es wurde kälter</div>
<div class="q-opt">d) Die Bevölkerung ist gewachsen</div>
</div>
</div>
<div class="q">
<div class="q-title">2. Was war die wirksamste Maßnahme gegen den Meeresspiegelanstieg in der Simulation?</div>
<div class="q-opts">
<div class="q-opt">a) Deiche bauen</div>
<div class="q-opt correct">b) CO₂-Ausstoß senken (Ursache bekämpfen)</div>
<div class="q-opt">c) Mehr Häuser bauen</div>
<div class="q-opt">d) Nichts tun und abwarten</div>
</div>
</div>
<div class="q">
<div class="q-title">3. Welcher Zusammenhang wurde in der Simulation sichtbar?</div>
<div class="q-opts">
<div class="q-opt correct">a) Mehr CO₂ → höhere Temperatur → steigender Meeresspiegel</div>
<div class="q-opt">b) Mehr CO₂ → niedrigere Temperatur</div>
<div class="q-opt">c) Weniger CO₂ → mehr Regen</div>
<div class="q-opt">d) Temperatur und Meeresspiegel haben nichts miteinander zu tun</div>
</div>
</div>
<div class="q">
<div class="q-title">4. Warum war es in der Simulation schwierig, die Temperatur unter 17°C zu halten?</div>
<div class="q-opts">
<div class="q-opt">a) Die Maßnahmen waren zu billig</div>
<div class="q-opt">b) Die Simulation war fehlerhaft</div>
<div class="q-opt correct">c) CO₂ bleibt lange in der Atmosphäre — Maßnahmen wirken verzögert</div>
<div class="q-opt">d) Man konnte nichts dagegen tun</div>
</div>
</div>
<div class="q">
<div class="q-title">5. Was hast du über die Balance zwischen Wirtschaft und Klimaschutz gelernt?</div>
<div class="q-opts">
<div class="q-opt">a) Man muss sich immer für eines entscheiden</div>
<div class="q-opt">b) Wirtschaft ist wichtiger als Klimaschutz</div>
<div class="q-opt correct">c) Man muss beides gleichzeitig berücksichtigen — es gibt Zielkonflikte</div>
<div class="q-opt">d) Klimaschutz schadet immer der Wirtschaft</div>
</div>
</div>
</div>
</div>
<!-- FLUSSMANAGEMENT -->
<h3>🏞️ Flussmanagement</h3>
<div class="pre-post">
<div>
<h4>VOR der Simulation</h4>
<div class="q"><div class="q-title">1. Was passiert, wenn man einen Fluss begradigt?</div><div class="q-opts"><div class="q-opt">a) Das Hochwasserrisiko sinkt</div><div class="q-opt correct">b) Das Wasser fließt schneller und das Hochwasserrisiko flussabwärts steigt</div><div class="q-opt">c) Der Fluss trocknet aus</div><div class="q-opt">d) Fische vermehren sich</div></div></div>
<div class="q"><div class="q-title">2. Was bedeutet „Renaturierung"?</div><div class="q-opts"><div class="q-opt">a) Einen Fluss mit Beton auskleiden</div><div class="q-opt correct">b) Einen Fluss in seinen natürlichen Zustand zurückversetzen</div><div class="q-opt">c) Einen Fluss umleiten</div><div class="q-opt">d) Einen Damm bauen</div></div></div>
<div class="q"><div class="q-title">3. Warum sind Auen wichtig?</div><div class="q-opts"><div class="q-opt correct">a) Sie speichern Hochwasser und sind Lebensraum für viele Arten</div><div class="q-opt">b) Sie sind gutes Bauland</div><div class="q-opt">c) Sie verhindern Regen</div><div class="q-opt">d) Sie sind nur Sumpf ohne Nutzen</div></div></div>
<div class="q"><div class="q-title">4. Was schützt am besten vor Hochwasser?</div><div class="q-opts"><div class="q-opt">a) Nur Deiche bauen</div><div class="q-opt">b) Flüsse begradigen</div><div class="q-opt correct">c) Kombination aus Deichen, Rückhaltebecken und natürlichen Überschwemmungsflächen</div><div class="q-opt">d) Gar nichts tun</div></div></div>
<div class="q"><div class="q-title">5. Was ist der Unterschied zwischen Hochwasserschutz und Hochwasservorsorge?</div><div class="q-opts"><div class="q-opt correct">a) Schutz = technische Bauten, Vorsorge = Planung und Raumordnung</div><div class="q-opt">b) Es gibt keinen Unterschied</div><div class="q-opt">c) Vorsorge ist teurer</div><div class="q-opt">d) Schutz funktioniert nicht</div></div></div>
</div>
<div>
<h4>NACH der Simulation</h4>
<div class="q"><div class="q-title">1. Was ist in der Simulation passiert, als du den Fluss begradigt hast?</div><div class="q-opts"><div class="q-opt">a) Alles wurde besser</div><div class="q-opt correct">b) Das Hochwasserrisiko ist langfristig gestiegen</div><div class="q-opt">c) Die Fische wurden mehr</div><div class="q-opt">d) Nichts hat sich verändert</div></div></div>
<div class="q"><div class="q-title">2. Welche Maßnahme hat in der Simulation die Biodiversität am meisten verbessert?</div><div class="q-opts"><div class="q-opt">a) Deiche bauen</div><div class="q-opt correct">b) Renaturierung und Aufforstung</div><div class="q-opt">c) Felder anlegen</div><div class="q-opt">d) Den Fluss begradigen</div></div></div>
<div class="q"><div class="q-title">3. Warum war es schwierig, gleichzeitig Hochwasserschutz UND Biodiversität zu haben?</div><div class="q-opts"><div class="q-opt correct">a) Weil technische Schutzbauten oft die natürlichen Lebensräume zerstören</div><div class="q-opt">b) Weil Biodiversität Hochwasser verursacht</div><div class="q-opt">c) Weil beides zu teuer ist</div><div class="q-opt">d) Es war gar nicht schwierig</div></div></div>
<div class="q"><div class="q-title">4. Was hast du über die Rolle von Siedlungen am Fluss gelernt?</div><div class="q-opts"><div class="q-opt">a) Siedlungen am Fluss sind immer sicher</div><div class="q-opt correct">b) Siedlungen in Überschwemmungsgebieten erhöhen das Schadensrisiko</div><div class="q-opt">c) Flüsse fließen um Siedlungen herum</div><div class="q-opt">d) Siedlungen haben keinen Einfluss</div></div></div>
<div class="q"><div class="q-title">5. Was war die wichtigste Erkenntnis der Simulation?</div><div class="q-opts"><div class="q-opt">a) Man soll nur Deiche bauen</div><div class="q-opt">b) Natur ist nicht wichtig</div><div class="q-opt correct">c) Hochwasserschutz braucht eine Kombination aus technischen und natürlichen Maßnahmen</div><div class="q-opt">d) Der Mensch kann Hochwasser komplett verhindern</div></div></div>
</div>
</div>
<!-- HELIKOPTER -->
<h3>🚁 Helikopter-Navigation</h3>
<div class="pre-post">
<div>
<h4>VOR der Simulation</h4>
<div class="q"><div class="q-title">1. Wo liegt Innsbruck?</div><div class="q-opts"><div class="q-opt">a) An der Donau</div><div class="q-opt correct">b) Im Inntal, umgeben von Bergen</div><div class="q-opt">c) Am Bodensee</div><div class="q-opt">d) In Kärnten</div></div></div>
<div class="q"><div class="q-title">2. In welche Himmelsrichtung fliegt man von Bregenz nach Innsbruck?</div><div class="q-opts"><div class="q-opt">a) Nach Westen</div><div class="q-opt">b) Nach Norden</div><div class="q-opt correct">c) Nach Osten</div><div class="q-opt">d) Nach Süden</div></div></div>
<div class="q"><div class="q-title">3. Was ist ein Tal in den Alpen?</div><div class="q-opts"><div class="q-opt correct">a) Eine Vertiefung zwischen zwei Bergen, oft mit einem Fluss</div><div class="q-opt">b) Ein Berggipfel</div><div class="q-opt">c) Ein See</div><div class="q-opt">d) Eine Ebene ohne Berge</div></div></div>
<div class="q"><div class="q-title">4. Wie schätzt man Entfernungen auf einer Karte?</div><div class="q-opts"><div class="q-opt">a) Man zählt die Häuser</div><div class="q-opt correct">b) Man verwendet den Maßstab der Karte</div><div class="q-opt">c) Man fragt jemanden</div><div class="q-opt">d) Das geht nicht</div></div></div>
<div class="q"><div class="q-title">5. Warum startet ein Hubschrauber schräg und nicht senkrecht?</div><div class="q-opts"><div class="q-opt">a) Weil der Motor zu schwach ist</div><div class="q-opt">b) Weil es so schneller geht</div><div class="q-opt correct">c) Weil Vorwärtsgeschwindigkeit im Notfall eine sichere Landung ermöglicht</div><div class="q-opt">d) Weil der Pilot es so gelernt hat</div></div></div>
</div>
<div>
<h4>NACH der Simulation</h4>
<div class="q"><div class="q-title">1. Durch welches Tal bist du geflogen, um von Nenzing nach Damüls zu kommen?</div><div class="q-opts"><div class="q-opt">a) Inntal</div><div class="q-opt correct">b) Laternsertal / Großes Walsertal</div><div class="q-opt">c) Zillertal</div><div class="q-opt">d) Montafon</div></div></div>
<div class="q"><div class="q-title">2. Warum konnte man nicht direkt über die Berge zum Einsatzort fliegen?</div><div class="q-opts"><div class="q-opt">a) Weil der Hubschrauber nicht hoch genug fliegen kann</div><div class="q-opt correct">b) Weil Wetter, Wind und Sicherheit einen Umweg über Talrouten erfordern</div><div class="q-opt">c) Weil es verboten ist</div><div class="q-opt">d) Weil Berge nicht existieren</div></div></div>
<div class="q"><div class="q-title">3. Was hast du über die Orientierung mit Hilfe von Flüssen und Tälern gelernt?</div><div class="q-opts"><div class="q-opt correct">a) Flüsse und Täler sind wichtige Orientierungslinien in den Alpen</div><div class="q-opt">b) Flüsse sind Hindernisse, die man vermeiden soll</div><div class="q-opt">c) Täler sind gefährlich zum Fliegen</div><div class="q-opt">d) Orientierung braucht man nicht</div></div></div>
<div class="q"><div class="q-title">4. Warum braucht ein Hubschrauber in großer Höhe mehr Treibstoff?</div><div class="q-opts"><div class="q-opt correct">a) Weil die Luft dünner ist und der Rotor mehr Leistung braucht</div><div class="q-opt">b) Weil es kälter ist</div><div class="q-opt">c) Weil der Wind stärker ist</div><div class="q-opt">d) Das stimmt nicht, der Verbrauch ist gleich</div></div></div>
<div class="q"><div class="q-title">5. Was war die wichtigste geografische Erkenntnis aus der Simulation?</div><div class="q-opts"><div class="q-opt">a) Österreich ist flach</div><div class="q-opt">b) Hubschrauber können überall hinfliegen</div><div class="q-opt correct">c) Die Topografie (Berge, Täler, Gewässer) bestimmt die möglichen Flugrouten</div><div class="q-opt">d) Wetter spielt keine Rolle</div></div></div>
</div>
</div>
</div>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,74 @@
#!/usr/bin/env bash
# Generisches Audio-Batch-Script — nimmt JSON-Textbuch mit Struktur
# { "lines": [ {"id": "...", "text": "..."} ] }
# und generiert MP3s via ElevenLabs in sounds/radio/<id>.mp3
#
# Aufruf:
# set -a; source App/.env.local; set +a
# App/sims/heli/scripts/generate-audio-batch.sh tower-geo-lines.json
# App/sims/heli/scripts/generate-audio-batch.sh tower-start-lines.json
# FORCE=1 … überschreibt bestehende Files
set -e
: "${ELEVENLABS_API_KEY:?ELEVENLABS_API_KEY muss gesetzt sein}"
VOICE_ID="${ELEVENLABS_VOICE_ID:-EXAVITQu4vr4xnSDxMaL}"
MODEL_ID="${ELEVENLABS_MODEL_ID:-eleven_multilingual_v2}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
OUT_DIR="$SCRIPT_DIR/../sounds/radio"
mkdir -p "$OUT_DIR"
JSON_INPUT="$1"
if [ -z "$JSON_INPUT" ]; then
echo "Usage: $0 <tower-geo-lines.json | tower-start-lines.json | ...>"
exit 2
fi
JSON_FILE="$SCRIPT_DIR/$JSON_INPUT"
if [ ! -f "$JSON_FILE" ]; then
echo "✗ Datei nicht gefunden: $JSON_FILE"; exit 2
fi
generate() {
local id="$1"
local text="$2"
local out="$OUT_DIR/${id}.mp3"
if [ -f "$out" ] && [ -z "$FORCE" ]; then
echo "${id}.mp3 schon da"; return 0
fi
echo "${id}"
local payload
payload=$(TEXT="$text" MODEL="$MODEL_ID" python -c '
import json, os
print(json.dumps({
"text": os.environ["TEXT"],
"model_id": os.environ["MODEL"],
"voice_settings": {"stability": 0.58, "similarity_boost": 0.78, "style": 0.30, "use_speaker_boost": True}
}))')
curl -sS -X POST "https://api.elevenlabs.io/v1/text-to-speech/$VOICE_ID" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-H "accept: audio/mpeg" \
-H "content-type: application/json" \
-d "$payload" \
--output "$out"
local size; size=$(wc -c <"$out")
if [ "$size" -lt 1500 ]; then
echo "${id}: Fehler — Datei zu klein ($size B). Inhalt:"
cat "$out"; rm -f "$out"; return 1
fi
echo "${id}.mp3 ($size B)"
sleep 0.4
}
ok=0; fail=0
python -c "
import json, sys
d = json.load(sys.stdin)
for line in d['lines']: print(line['id'] + '\t' + line['text'])
" < "$JSON_FILE" | while IFS=$'\t' read -r id text; do
[ -z "$id" ] && continue
if generate "$id" "$text"; then ok=$((ok+1)); else fail=$((fail+1)); echo "STOP bei Fehler"; break; fi
done
echo
echo "Ablage: $OUT_DIR"
ls -1 "$OUT_DIR"/*.mp3 2>/dev/null | wc -l | xargs printf "Dateien insgesamt: %s\n"
@@ -0,0 +1,97 @@
#!/usr/bin/env bash
# Generisches Audio-Batch-Script via OpenAI TTS.
# Nimmt JSON-Textbuch mit Struktur:
# { "lines": [ {"id": "...", "text": "..."} ] }
# und generiert MP3s in sounds/radio/<id>.mp3
#
# Voraussetzung: OPENAI_API_KEY (aus App/.env.local)
#
# Aufruf:
# set -a; source App/.env.local; set +a
# App/sims/heli/scripts/generate-audio-openai.sh tower-geo-lines.json
# App/sims/heli/scripts/generate-audio-openai.sh tower-start-lines.json
# FORCE=1 … überschreibt bestehende
# OPENAI_VOICE=shimmer … andere Stimme
set -e
: "${OPENAI_API_KEY:?OPENAI_API_KEY muss gesetzt sein}"
VOICE="${OPENAI_VOICE:-nova}"
MODEL="${OPENAI_MODEL:-gpt-4o-mini-tts}"
# Stil-Instruktion nur bei gpt-4o-mini-tts wirksam. Warmherzige Fluglotsin,
# ruhig, klare deutsche Aussprache, als ob sie Schuelerinnen begleitet.
INSTRUCTIONS="${OPENAI_TTS_INSTRUCTIONS:-Speak warmly and patiently like an encouraging female flight controller guiding a young student co-pilot. Unhurried, clear, friendly German pronunciation. Gentle reassuring tone, never robotic.}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
OUT_DIR="$SCRIPT_DIR/../sounds/radio"
mkdir -p "$OUT_DIR"
JSON_INPUT="$1"
if [ -z "$JSON_INPUT" ]; then
echo "Usage: $0 <json-file>"
exit 2
fi
JSON_FILE="$SCRIPT_DIR/$JSON_INPUT"
if [ ! -f "$JSON_FILE" ]; then
echo "Datei nicht gefunden: $JSON_FILE"; exit 2
fi
echo "Modell: $MODEL · Stimme: $VOICE"
echo "Quelle: $JSON_INPUT"
echo
generate() {
local id="$1"
local text="$2"
local out="$OUT_DIR/${id}.mp3"
if [ -f "$out" ] && [ -z "$FORCE" ]; then
echo "ok ${id}.mp3 schon da"
return 0
fi
echo "gen ${id}"
local payload
payload=$(TEXT="$text" MODEL="$MODEL" VOICE="$VOICE" INSTR="$INSTRUCTIONS" python -c '
import json, os
body = {
"model": os.environ["MODEL"],
"voice": os.environ["VOICE"],
"input": os.environ["TEXT"],
"response_format": "mp3"
}
# instructions nur bei gpt-4o-mini-tts unterstuetzt
if "mini-tts" in os.environ["MODEL"]:
body["instructions"] = os.environ["INSTR"]
print(json.dumps(body, ensure_ascii=False))')
local http
http=$(curl -sS -w "%{http_code}" -o "$out" \
-X POST https://api.openai.com/v1/audio/speech \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json; charset=utf-8" \
-d "$payload")
if [ "$http" != "200" ]; then
echo "FEHLER ${id}: HTTP $http"
cat "$out"; echo; rm -f "$out"
return 1
fi
local size; size=$(wc -c <"$out")
if [ "$size" -lt 1500 ]; then
echo "FEHLER ${id}: Datei zu klein ($size B)"
cat "$out"; rm -f "$out"
return 1
fi
echo "ok ${id}.mp3 (${size} B)"
sleep 0.2
}
ok=0; fail=0
while IFS=$'\t' read -r id text; do
[ -z "$id" ] && continue
if generate "$id" "$text"; then ok=$((ok+1)); else fail=$((fail+1)); fi
done < <(python -c "
import json, sys
d = json.load(sys.stdin)
for line in d['lines']: print(line['id'] + '\t' + line['text'])
" < "$JSON_FILE")
echo
echo "Zusammenfassung: ok=$ok, fail=$fail"
ls -1 "$OUT_DIR"/*.mp3 2>/dev/null | wc -l | xargs printf "Dateien im Ordner: %s\n"
@@ -0,0 +1,87 @@
#!/usr/bin/env bash
# Generiert die 9 Mission-Card-Bilder via DALL-E 3.
# Stil: Flat Scandinavian Alpine, 1792x1024 landscape (später auf 1024x576 verkleinern).
#
# Voraussetzung:
# - OPENAI_API_KEY als Env-Variable (aus App/.env.local)
# - curl + python (für JSON-Handling; jq nicht verfügbar auf Git Bash / Windows)
#
# Aufruf:
# set -a; source App/.env.local; set +a
# App/sims/heli/scripts/generate-mission-images.sh # alle
# App/sims/heli/scripts/generate-mission-images.sh m1 m5 m7 # Auswahl
# FORCE=1 … # überschreibt bestehende
set -e
: "${OPENAI_API_KEY:?Env-Variable OPENAI_API_KEY muss gesetzt sein}"
cd "$(dirname "$0")/../assets/missions"
PROMPT_BASE="Flat Scandinavian alpine illustration, wide panoramic landscape filling the entire 16:9 frame edge-to-edge, NOT a circular composition, painted style with clean vector shapes, dark forest green (#1f4b37) and sage green (#4a7c4e) mountains, yellow-mustard (#e8c547) sun accents, beige (#e8e4d8) valley, white snow highlights. Medium-sized rescue helicopter with orange and red markings clearly visible in the sky, recognizable shape with rotor. Recognizable geographic landmarks in the scene. No text, no watermark, no logos, no borders, no frame."
declare -A PROMPTS=(
[m1]="$PROMPT_BASE Scene: ski area at Damuels in Bregenzerwald, Vorarlberg — Damuels-Mittagsspitze mountain ridge in background, Uga ski lift towers, snowy slopes with ski tracks, small Alpine village in foreground valley."
[m2]="$PROMPT_BASE Scene: A14 Rheintal motorway near Rankweil, Vorarlberg — wide valley floor with straight highway cutting through, small cars, Rhaetikon mountains in background, Feldkirch visible in distance."
[m3]="$PROMPT_BASE Scene: Brandnertal with the Zimba peak (pyramid-shaped mountain) in Raetikon range, Vorarlberg — steep rocky cliff, alpine meadow at base, small climber figure, narrow valley road."
[m4]="$PROMPT_BASE Scene: Rettenbachferner glacier ski area above Soelden in Otztal, Tyrol — high-altitude snow, ski lift towers, cable car station, vast glacier with mountain ridges."
[m5]="$PROMPT_BASE Scene: Lake Constance (Bodensee) at Bregenz harbour — calm turquoise water, Pfander mountain silhouette on the right, Seebühne floating stage visible on the water, shoreline with town roofs."
[m6]="$PROMPT_BASE Scene: Rappenloch canyon or Kanisfluh gorge near Mellau in Bregenzerwald, Vorarlberg — deep V-shaped valley with rushing river, green moss-covered cliffs on both sides, small waterfall."
[m7]="$PROMPT_BASE Scene: Wilder Kaiser mountain range with Kufstein fortress on a rocky hill in the foreground valley, Tyrol — recognizable jagged Kaiser peaks in background, Inn river, hiking trails with small hiker figures."
[m8]="$PROMPT_BASE Scene: Gaschurn village in hinteres Montafon valley, Vorarlberg — narrow valley with steep mountains on both sides (Silvretta range), village rooftops with church tower, alpine meadow, landing pad."
[m9]="$PROMPT_BASE Scene: Zillertal near Mayrhofen, Tyrol — Penken mountain in background, fresh avalanche debris on steep slope, snow-covered forest, alpine village in valley."
[m10]="$PROMPT_BASE Scene: A2 Suedautobahn motorway bridge near Baden south of Vienna — wide curved highway cutting through low wooded hills (Wienerwald), kurpark spa town rooftops in the middle distance, small cars on the road."
[m11]="$PROMPT_BASE Scene: Donauinsel and Neue Donau in Vienna — long narrow island park between two river arms, reed and willow shoreline, city skyline with St. Stephens cathedral tower in background, calm blue water."
[m12]="$PROMPT_BASE Scene: Schneeberg mountain north face in Lower Austria — pale limestone cliffs with snow patches, the Schneebergbahn cog railway visible on a ridge, forested foothills below, easternmost 2000er alpine summit."
[m13]="$PROMPT_BASE Scene: Rax high plateau in Lower Austria — broad grassy karst plateau with limestone outcrops, hiking trail winding through, pine mountain scrub, deep valley Hoellental dropping off to one side."
[m14]="$PROMPT_BASE Scene: Neusiedler See at Podersdorf in Burgenland — shallow steppe lake with tall reed belt, a windsurfer figure bent over in strong wind, horizon almost flat, pannonian plain stretching east."
[m15]="$PROMPT_BASE Scene: A1 Westautobahn motorway intersection at Sattledt in Upper Austria — flat agricultural landscape, two highways crossing on overpasses, small cars, distant Alps on the southern horizon."
[m16]="$PROMPT_BASE Scene: Traunsee lake at Gmunden in Salzkammergut — deep blue alpine lake, steep pyramid-shaped Traunstein peak rising directly from the shore, small sailing boat on the water, Gmunden town with castle Schloss Ort in foreground."
[m17]="$PROMPT_BASE Scene: A10 Tauern motorway approaching Tauerntunnel north portal near Flachau-Zederhaus — highway curving into mountainside tunnel entrance, steep wooded Tauern mountains, snow on highest peaks, alpine valley."
[m18]="$PROMPT_BASE Scene: Wolfgangsee at St. Wolfgang im Salzkammergut — alpine lake with the iconic St. Wolfgang pilgrimage church by the shore, Schafberg mountain in background with cog railway, traditional village houses."
[m19]="$PROMPT_BASE Scene: Grossglockner summit pyramid from the north (Kaiser-Franz-Josefs-Hoehe viewpoint) — sharp snow-ice pyramid peak (highest mountain of Austria 3798m), Pasterze glacier tongue below, moraine ridges, thin cloud wisps."
[m20]="$PROMPT_BASE Scene: Dachstein massif southern face in Styria — massive limestone cliff wall dropping 800 meters vertically, glacier plateau on top, mountaineer figures roped up, hanging valley in foreground with alpine meadow."
[m21]="$PROMPT_BASE Scene: Hochschwab karst plateau in Styria — undulating limestone plateau with dwarf pine (Latschen), rocky outcrops, wild chamois grazing, distant view into Mariazell valley, source of Vienna spring water aqueduct."
[m22]="$PROMPT_BASE Scene: A9 Pyhrn motorway near Bosrucktunnel south portal — highway emerging from tunnel into Ennstal valley, steep forested Bosruck mountain, traditional Styrian farmhouses with wooden shingle roofs."
[m23]="$PROMPT_BASE Scene: Woerthersee at Poertschach in Carinthia — turquoise warm bathing lake with sailing boats and swimmers near the promenade, Karawanken mountain range in background, Mediterranean-style villas along the shore."
[m24]="$PROMPT_BASE Scene: Grossglockner southern face from Heiligenblut side in Carinthia — view up to the glockner pyramid across the Pasterze glacier, historical Heiligenblut pilgrimage church with tall needle spire in foreground, Grossglockner panoramic road visible."
[m25]="$PROMPT_BASE Scene: A2 Suedautobahn motorway near Klagenfurt with the Karawanken mountain range in background — wide valley with highway curving south toward the Slovenian border Karawanken tunnel, Woerthersee visible to the west."
)
TARGETS=("$@")
if [ ${#TARGETS[@]} -eq 0 ]; then
TARGETS=(m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12 m13 m14 m15 m16 m17 m18 m19 m20 m21 m22 m23 m24 m25)
fi
for id in "${TARGETS[@]}"; do
prompt="${PROMPTS[$id]}"
if [ -z "$prompt" ]; then
echo "$id: kein Prompt definiert, überspringe"
continue
fi
if [ -f "${id}.png" ] && [ -z "$FORCE" ]; then
echo "${id}.png schon vorhanden (FORCE=1 zum Überschreiben)"
continue
fi
echo "${id}: generiere …"
payload=$(PROMPT="$prompt" python -c 'import json,os; print(json.dumps({"model":"dall-e-3","prompt":os.environ["PROMPT"],"n":1,"size":"1792x1024","quality":"standard"}))')
resp=$(curl -s https://api.openai.com/v1/images/generations \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d "$payload")
url=$(echo "$resp" | python -c 'import sys,json
d=json.load(sys.stdin)
print(d.get("data",[{}])[0].get("url",""))' 2>/dev/null)
if [ -z "$url" ]; then
err=$(echo "$resp" | python -c 'import sys,json
try: print(json.load(sys.stdin).get("error",{}).get("message","?"))
except: print("unparseable response")' 2>/dev/null)
echo "${id}: Fehler — $err"
continue
fi
curl -s "$url" -o "${id}.png"
echo "${id}.png gespeichert ($(du -h "${id}.png" | cut -f1))"
sleep 2
done
echo
echo "Fertig. Optional auf 1024x576 verkleinern:"
echo " for f in *.png; do magick \"\$f\" -resize 1024x576 -strip \"\$f\"; done"
@@ -0,0 +1,67 @@
#!/usr/bin/env bash
# Generiert Tower-Funkansagen pro Hubschrauber via ElevenLabs.
# Liest tower-lines.json, speichert MP3s in App/sims/heli/sounds/radio/
#
# Voraussetzung: ELEVENLABS_API_KEY + curl + python
#
# Aufruf:
# set -a; source App/.env.local; set +a
# App/sims/heli/scripts/generate-tower-lines.sh
# FORCE=1 … überschreibt bestehende
set -e
: "${ELEVENLABS_API_KEY:?Env-Variable ELEVENLABS_API_KEY muss gesetzt sein}"
# Default-Voice: 'Sarah' — klar, weiblich, multilingual-fähig.
# Eigene Stimme: ELEVENLABS_VOICE_ID=xxx vor dem Aufruf.
VOICE_ID="${ELEVENLABS_VOICE_ID:-EXAVITQu4vr4xnSDxMaL}"
MODEL_ID="${ELEVENLABS_MODEL_ID:-eleven_multilingual_v2}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
OUT_DIR="$SCRIPT_DIR/../sounds/radio"
JSON_FILE="$SCRIPT_DIR/tower-lines.json"
mkdir -p "$OUT_DIR"
generate() {
local id="$1"
local text="$2"
local out="$OUT_DIR/${id}.mp3"
if [ -f "$out" ] && [ -z "$FORCE" ]; then
echo "${id}.mp3 schon da"; return
fi
echo "${id}: generiere …"
local payload
payload=$(TEXT="$text" MODEL="$MODEL_ID" python -c '
import json, os
print(json.dumps({
"text": os.environ["TEXT"],
"model_id": os.environ["MODEL"],
"voice_settings": {"stability": 0.55, "similarity_boost": 0.78, "style": 0.25, "use_speaker_boost": True}
}))')
curl -sS -X POST "https://api.elevenlabs.io/v1/text-to-speech/$VOICE_ID" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-H "accept: audio/mpeg" \
-H "content-type: application/json" \
-d "$payload" \
--output "$out"
local size; size=$(wc -c <"$out")
if [ "$size" -lt 1500 ]; then
echo "${id}: Fehler — Datei zu klein ($size B), Inhalt:"
cat "$out"; rm -f "$out"; return 1
fi
echo "${id}.mp3 ($size B)"
sleep 0.4
}
# Liste laden und pro Zeile generieren (via stdin — umgeht Windows-Pfad-Probleme)
python -c "
import json, sys
d = json.load(sys.stdin)
for line in d['lines']: print(line['id'] + '\t' + line['text'])
" < "$JSON_FILE" | while IFS=$'\t' read -r id text; do
[ -z "$id" ] && continue
generate "$id" "$text"
done
echo
echo "Fertig. Ablage: $OUT_DIR"
ls -1 "$OUT_DIR"/r_tower_*.mp3 2>/dev/null | wc -l | xargs printf "Tower-Dateien vorhanden: %s\n"
@@ -0,0 +1,32 @@
{
"_note": "Audio-Kommentare fuer Routenplanung, Kartenflug und Landung. Gesprochen von Tower-Lehrmeisterin (Nova, Speed 1.12) bzw. Pilot/Retter fuer Landing-Dialog. Funk-Filter wird live ueber den Bandpass gelegt.",
"lines": [
{ "id": "r_nav_plan_start", "text": "Routenplanung beginnt. Der Pilot wartet auf deine Eingabe — klicke die Wegpunkte der Reihe nach ab." },
{ "id": "r_nav_plan_correct", "text": "Wegpunkt erreicht. Weiter zum naechsten." },
{ "id": "r_nav_plan_wrong_near", "text": "Fast — du bist in der richtigen Gegend, aber nicht exakt am Wegpunkt. Schau nochmal auf die Karte." },
{ "id": "r_nav_plan_wrong_far", "text": "Das ist nicht der richtige Wegpunkt. Orientier dich an der Himmelsrichtung und der Distanz." },
{ "id": "r_nav_plan_done", "text": "Route vollstaendig. Briefing beendet, Freigabe zum Start." },
{ "id": "r_nav_route_check", "text": "Route wird geprueft." },
{ "id": "r_nav_departure_ok", "text": "Abflug freigegeben. Kurs stimmt, Treibstoff voll." },
{ "id": "r_nav_departure_takeover","text": "Chefpilot hat uebernommen. Wir bringen dich sicher zum Einsatzort." },
{ "id": "r_nav_seg_start", "text": "Neuer Streckenabschnitt. Kurs gesetzt, Geschwindigkeit konstant." },
{ "id": "r_nav_seg_arrive", "text": "Wegpunkt passiert — ich uebergebe ans Navigationsmodul." },
{ "id": "r_nav_fuel_half", "text": "Treibstoff halbvoll. Alles im gruenen Bereich." },
{ "id": "r_nav_fuel_quarter", "text": "Treibstoff auf einem Viertel. Direktkurs halten." },
{ "id": "r_nav_weather_enter", "text": "Wir durchfliegen eine Schlechtwetterzone — leichte Turbulenzen sind moeglich." },
{ "id": "r_nav_weather_exit", "text": "Schlechtwetter hinter uns, klare Sicht voraus." },
{ "id": "r_nav_altitude_mountain","text": "Ueberflughoehe Bergkette — der Rotor arbeitet in duenner Luft, mehr Leistung noetig." },
{ "id": "r_nav_altitude_valley", "text": "Wir bleiben auf Talhoehe — der Wind ist hier ruhiger." },
{ "id": "r_land_approach", "text": "Zielanflug laeuft. Schwebeflug halten und Abstand zum Patient." },
{ "id": "r_land_winch_down", "text": "Seil laeuft, Flugretter wird abgesetzt." },
{ "id": "r_land_rescuer_down", "text": "Retter ist am Boden, Versorgung laeuft. Kreise in der Warteschleife." },
{ "id": "r_land_rescuer_ready", "text": "Patient stabilisiert, bereit zur Aufnahme. Ich brauche dich wieder ueber mir." },
{ "id": "r_land_hook_connected", "text": "Haken eingeklinkt, Seil wird eingezogen. Schwebeflug halten!" },
{ "id": "r_land_lift_success", "text": "Patient an Bord — Kurs Klinik." },
{ "id": "r_land_clinic_ahead", "text": "Klinik voraus. Sanft aufsetzen, Sinkrate unter zehn." },
{ "id": "r_land_disembark", "text": "Saubere Landung. Patient steigt aus, Einsatz abgeschlossen." }
]
}
@@ -0,0 +1,19 @@
{
"_note": "Pilot-Situationsmeldungen im Start-Minispiel, die bisher nur als Textblase erschienen. Werden zusaetzlich zum Text abgespielt. Sarah/Nova-Stimme, Funk-Filter live ueber den Bandpass.",
"lines": [
{ "id": "r_pilot_wind_turn", "text": "Wind dreht! Gegenhalten!" },
{ "id": "r_pilot_bird_ahead", "text": "Vogelschwarm voraus!" },
{ "id": "r_pilot_plane_ahead", "text": "Verkehrsflugzeug im Anflug!" },
{ "id": "r_pilot_sportplane_level", "text": "Sportflieger auf gleicher Höhe!" },
{ "id": "r_pilot_storm_detour", "text": "Gewitter voraus, umfliegen!" },
{ "id": "r_pilot_fog_thickens", "text": "Nebel wird dichter, vorsichtig!" },
{ "id": "r_pilot_time_up", "text": "Zeit abgelaufen. Ich übernehme — Einsatzfenster verpasst." },
{ "id": "r_pilot_too_high", "text": "Nicht so hoch, das braucht zu viel Sprit!" },
{ "id": "r_pilot_three_strikes", "text": "Drei Berührungen. Ich übernehme — Absturzgefahr!" },
{ "id": "r_pilot_strike_1", "text": "Vorsicht! Das war knapp." },
{ "id": "r_pilot_strike_2", "text": "Aufpassen, Co-Pilot." },
{ "id": "r_pilot_strike_3", "text": "Zu nah dran!" },
{ "id": "r_pilot_strike_4", "text": "Konzentriert bleiben." },
{ "id": "r_pilot_strike_5", "text": "Ruhig, ich bin daneben." }
]
}
@@ -0,0 +1,48 @@
{
"_note": "Pilot-Anruf + Tower-Antwort im Zielanflug. Standard-Funkprotokoll Adressat-Rufzeichen-Anliegen. Tower antwortet gespiegelt mit Roger und einem Geografie-Lernhinweis. Freundlicher Ton.",
"_voice_pilot": "Pilot-Calls sind knapp; Tower-Antworten warm und lehrreich. Beide mit Sarah (ElevenLabs, multilingual).",
"lines": [
{ "id": "r_pilot_call_c1", "text": "Innsbruck Tower, Christophorus eins, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c2", "text": "Wien Tower, Christophorus zwei, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c3", "text": "Wien Tower, Christophorus drei, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c4", "text": "Innsbruck Tower, Christophorus vier, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c5", "text": "Innsbruck Tower, Christophorus fünf, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c6", "text": "Salzburg Tower, Christophorus sechs, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c7", "text": "Klagenfurt Tower, Christophorus sieben, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c8", "text": "Bregenz Tower, Christophorus acht, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c9", "text": "Wien Tower, Christophorus neun, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c10", "text": "Linz Tower, Christophorus zehn, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c11", "text": "Klagenfurt Tower, Christophorus elf, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c12", "text": "Graz Tower, Christophorus zwölf, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c14", "text": "Graz Tower, Christophorus vierzehn, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_c16", "text": "Wien Tower, Christophorus sechzehn, Einsatzort erreicht, im Endanflug." },
{ "id": "r_pilot_call_ara", "text": "Bregenz Tower, ARA Rettungsflug eins, Einsatzort erreicht, im Endanflug." },
{ "id": "r_tower_geo_m1", "text": "Christophorus acht, Bregenz Tower, Roger. Damüls ist der schneereichste Ort der Alpen — Stauregen vom Bodensee trifft hier auf die erste Kette des Bregenzerwalds, elf Meter Neuschnee im Jahresmittel. Bergung freigegeben, viel Erfolg." },
{ "id": "r_tower_geo_m2", "text": "ARA Rettungsflug eins, Bregenz Tower, Roger. Die A vierzehn ist die Lebensader des Rheintals — sie verbindet Vorarlberg mit Deutschland und der Schweiz. Wir haben die Strecke für dich freigegeben." },
{ "id": "r_tower_geo_m3", "text": "Christophorus acht, Bregenz Tower, Roger. Das Brandnertal liegt in der Rätikon-Kalkzone — die hellen Felswände sind Wettersteinkalk aus der Trias, zweihundert Millionen Jahre alt. Bergung freigegeben, wir sind bei dir." },
{ "id": "r_tower_geo_m4", "text": "Christophorus eins, Innsbruck Tower, Roger. Sölden liegt im Ötztal, einem klassischen Trogtal — U-förmig ausgeschliffen von einem Eiszeit-Gletscher. Bergung freigegeben, viel Erfolg." },
{ "id": "r_tower_geo_m5", "text": "ARA Rettungsflug eins, Bregenz Tower, Roger. Der Bodensee ist der drittgrößte See Mitteleuropas — und Trinkwasserspeicher für fünf Millionen Menschen. Bergung freigegeben, wir begleiten dich." },
{ "id": "r_tower_geo_m6", "text": "ARA Rettungsflug eins, Bregenz Tower, Roger. Der Bregenzerwald ist ein Flysch-Gebirge — weiche Schichtgesteine, deshalb viele enge Schluchten durch Erosion. Bergung freigegeben, sei vorsichtig im Kessel." },
{ "id": "r_tower_geo_m7", "text": "Christophorus eins, Innsbruck Tower, Roger. Das Kaisergebirge ist eine isolierte Kalkstock-Gruppe in den Nordalpen — schroffe Wände aus Wettersteinkalk, ein Paradies für Kletterer. Bergung freigegeben, wir sind bei dir." },
{ "id": "r_tower_geo_m8", "text": "Christophorus acht, Bregenz Tower, Roger. Das Montafon ist ein langes Trogtal — nach hinten immer enger, deshalb nur ein Zugang. Gaschurn liegt auf neunhundertsechzig Metern, höchstes ganzjährig besiedeltes Dorf im Tal. Bergung freigegeben." },
{ "id": "r_tower_geo_m9", "text": "Christophorus eins, Innsbruck Tower, Roger. Das Zillertal ist ein glaziales Trogtal — die Seitentäler hängen etwa dreihundert Meter höher, sogenannte Hängetäler. Achtung lawinenanfälliger Nordhang. Bergung freigegeben, viel Erfolg." },
{ "id": "r_tower_geo_m10", "text": "Christophorus neun, Wien Tower, Roger. Die A zwei ist Österreichs wichtigste Süd-Ost-Achse — Wien, Graz, Klagenfurt, Grenze Slowenien. Der Wiener Speckgürtel mit den meisten Pendlern liegt genau hier. Strecke ist frei für dich." },
{ "id": "r_tower_geo_m11", "text": "Christophorus neun, Wien Tower, Roger. Die Neue Donau ist ein Hochwasserentlastungsarm — eigens ausgebaggert, um Wien vor Schmelzwasserfluten aus den Alpen zu schützen. Bergung freigegeben, wir sind bei dir." },
{ "id": "r_tower_geo_m12", "text": "Christophorus drei, Wien Tower, Roger. Der Schneeberg ist der östlichste Zweitausender der Alpen — dahinter beginnt das Pannonische Tiefland. Deshalb der harte Wetterwechsel hier. Bergung freigegeben, viel Erfolg." },
{ "id": "r_tower_geo_m13", "text": "Christophorus drei, Wien Tower, Roger. Die Rax ist ein großes Karstplateau — Regen versickert sofort im Kalk und tritt erst an der Höllentalklamm wieder aus. Deshalb ist oben kein Wasser zu finden. Bergung freigegeben." },
{ "id": "r_tower_geo_m14", "text": "Christophorus sechzehn, Wien Tower, Roger. Der Neusiedler See ist der westlichste Steppensee Europas — durchschnittlich nur eineinhalb Meter tief, deshalb kippt die Temperatur schnell. Teile des Sees trockneten in der Geschichte mehrfach komplett aus. Bergung freigegeben." },
{ "id": "r_tower_geo_m15", "text": "Christophorus zehn, Linz Tower, Roger. Sattledt ist der zentrale Autobahnknoten Oberösterreichs — A eins West und A acht Richtung Deutschland kreuzen sich. Vierzigtausend Durchfahrten am Tag. Strecke ist für dich frei." },
{ "id": "r_tower_geo_m16", "text": "Christophorus zehn, Linz Tower, Roger. Der Traunsee ist ein glazialer Zungenbeckensee — einhundertneunzig Meter tief. Der Traunstein dahinter ist eine Kalkklippe, typisch für den Nordrand der Alpen. Bergung freigegeben, wir sind bei dir." },
{ "id": "r_tower_geo_m17", "text": "Christophorus sechs, Salzburg Tower, Roger. Der Tauerntunnel durchsticht die Hauptkette der Alpen — sechs Komma vier Kilometer lang, verkürzt Salzburg und Kärnten um eine ganze Stunde. Strecke ist für dich frei." },
{ "id": "r_tower_geo_m18", "text": "Christophorus sechs, Salzburg Tower, Roger. Der Wolfgangsee liegt im Salzkammergut — seinen Namen verdankt er dem Salzhandel. Sole wurde über den See von Hallstatt nach Ebensee transportiert. Bergung freigegeben, viel Erfolg." },
{ "id": "r_tower_geo_m19", "text": "Christophorus sechs, Salzburg Tower, Roger. Der Großglockner liegt auf der Hauptkette der Hohen Tauern, Grenze zwischen Salzburg und Kärnten. Die Pasterze darunter ist Österreichs längster Gletscher — sie verliert jedes Jahr etwa zehn Meter. Bergung freigegeben." },
{ "id": "r_tower_geo_m20", "text": "Christophorus vierzehn, Graz Tower, Roger. Der Dachstein ist ein Kalkstock mit Gletscher obenauf — eine echte Seltenheit. Die Südwand fällt achthundert Meter senkrecht ab, die Nordseite ist ein Hochplateau. Bergung freigegeben, sei vorsichtig." },
{ "id": "r_tower_geo_m21", "text": "Christophorus zwölf, Graz Tower, Roger. Der Hochschwab versorgt Wien mit Trinkwasser — die Wiener Hochquellenleitung beginnt hier, einhundertfünfzig Kilometer Gefälletransport ohne Pumpen. Bergung freigegeben, wir sind bei dir." },
{ "id": "r_tower_geo_m22", "text": "Christophorus zwölf, Graz Tower, Roger. Der Bosrucktunnel verbindet das Ennstal mit dem Pyhrnpass — ältester Alpenübergang zwischen Salzkammergut und Obersteiermark, schon die Römer nutzten die Route. Strecke ist frei." },
{ "id": "r_tower_geo_m23", "text": "Christophorus elf, Klagenfurt Tower, Roger. Der Wörthersee ist Österreichs wärmster Badesee — bis achtundzwanzig Grad. Grund ist die geschützte Föhnlage südlich der Gurktaler Alpen, kaum kalter Abwind. Bergung freigegeben." },
{ "id": "r_tower_geo_m24", "text": "Christophorus elf, Klagenfurt Tower, Roger. Du fliegst zur Südseite des Großglockners — Heiligenblut liegt am Fuß der Pasterze. Der Gipfel ist vereist, Wolken können schnell heraufziehen. Bergung freigegeben, viel Erfolg." },
{ "id": "r_tower_geo_m25", "text": "Christophorus elf, Klagenfurt Tower, Roger. Die A zwei ist hier die Zufahrt zum Karawankentunnel — Grenze zu Slowenien, einziger Ganzjahres-Autobahnübergang Kärnten-Slowenien, achtkommacht Kilometer lang. Strecke ist frei für dich." }
]
}
@@ -0,0 +1,20 @@
{
"_note": "Pro Hubschrauber ein Flug-Intro mit Geografie-Lernstoff des Einsatzraums. Wird einmal am Beginn des Kartenflugs abgespielt — statt generischer Segment-Floskeln.",
"lines": [
{ "id": "r_nav_heli_intro_c1", "text": "Christophorus eins aus Innsbruck, Einsatzraum Nord- und Zentral-Tirol. Unter uns das Inntal — der Inn entwässert das gesamte Tiroler Zentralalpenland und mündet bei Passau in die Donau." },
{ "id": "r_nav_heli_intro_c2", "text": "Christophorus zwei aus Krems an der Donau, Einsatzraum Wachau und Waldviertel. Die Wachau ist UNESCO-Welterbe — Weinbau an den sonnigen Terrassen seit der Römerzeit." },
{ "id": "r_nav_heli_intro_c3", "text": "Christophorus drei aus Wiener Neustadt, Einsatzraum Industrieviertel und Wiener Alpen. Hier geht das Wiener Becken in die letzten Ausläufer der Nordalpen über." },
{ "id": "r_nav_heli_intro_c4", "text": "Christophorus vier aus Reith bei Kitzbühel, Einsatzraum Kitzbüheler Alpen und Pinzgau. Die Kitzbüheler Alpen liegen in der Grauwackenzone — weichere Gesteine als die nördlichen Kalkalpen, daher sanftere Formen." },
{ "id": "r_nav_heli_intro_c5", "text": "Christophorus fünf aus Zams im Oberinntal, Einsatzraum westliches Tirol. Der Inn zieht unter uns nach Osten, bis er bei Innsbruck ins Unterinntal dreht." },
{ "id": "r_nav_heli_intro_c6", "text": "Christophorus sechs vom Flughafen Salzburg, Einsatzraum Flachgau und Salzkammergut. Die Salzach unter uns ist Namensgeberin der Stadt und des Landes — einst Transportweg fürs Hallein-Salz." },
{ "id": "r_nav_heli_intro_c7", "text": "Christophorus sieben aus Lienz in Osttirol, Einsatzraum Osttirol und Oberkärnten. Die Drau hier fließt nach Süden — einer der wenigen Flüsse Österreichs, der nicht zur Donau entwässert, sondern zur Adria." },
{ "id": "r_nav_heli_intro_c8", "text": "Christophorus acht aus Nenzing im Walgau, Einsatzraum Vorarlberg. Der Walgau trennt den Rätikon im Süden vom Lechquellengebirge im Norden — der Ill-Fluss hat ihn ausgehobelt." },
{ "id": "r_nav_heli_intro_c9", "text": "Christophorus neun aus Wien-Aspern, Einsatzraum Wiener Becken. Das Becken ist ein tektonisches Senkungsgebiet zwischen Alpen und Karpaten — mit Pannonischer Tiefebene nach Osten." },
{ "id": "r_nav_heli_intro_c10", "text": "Christophorus zehn vom Flughafen Linz-Hörsching, Einsatzraum Oberösterreich. Unter uns das Alpenvorland — eine ehemalige Meeresbucht der Paratethys, heute fruchtbares Ackerland." },
{ "id": "r_nav_heli_intro_c11", "text": "Christophorus elf vom Flughafen Klagenfurt, Einsatzraum Kärnten. Das Klagenfurter Becken ist im Süden von den Karawanken begrenzt — zugleich die Staatsgrenze zu Slowenien." },
{ "id": "r_nav_heli_intro_c12", "text": "Christophorus zwölf vom Flughafen Graz-Thalerhof, Einsatzraum Steiermark. Das Grazer Becken öffnet sich nach Osten zur Pannonischen Tiefebene — wärmere und trockenere Klimazone." },
{ "id": "r_nav_heli_intro_c14", "text": "Christophorus vierzehn vom Flugplatz Niederöblarn im Ennstal, Einsatzraum obere Steiermark. Die Enns trennt die Kalkalpen im Norden von den Tauern im Süden." },
{ "id": "r_nav_heli_intro_c16", "text": "Christophorus sechzehn vom Flugplatz Pinkafeld, Einsatzraum Burgenland und Südoststeiermark. Die Ebene hier ist Pannonisches Tiefland — geologisch schon nicht mehr Alpen." },
{ "id": "r_nav_heli_intro_ara", "text": "ARA Rettungsflug eins aus Hohenems, Einsatzraum Vorarlberg und Bodensee. Der Bodensee ist ein Zungenbeckensee — ausgehobelt vom Rheingletscher der letzten Eiszeit." }
]
}
+63
View File
@@ -0,0 +1,63 @@
{
"_note": "Tower-Ansagen pro Hubschrauber und Phase. Wird von generate-tower-lines.sh an ElevenLabs geschickt.",
"_voice": "empfohlen: freundliche junge weibliche deutsche Stimme (ElevenLabs: z. B. 'Sarah' EXAVITQu4vr4xnSDxMaL). Voice-ID über ELEVENLABS_VOICE_ID env.",
"lines": [
{ "id": "r_tower_approach_c1", "text": "Tower an ÖAMTC Christophorus eins — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c2", "text": "Tower an ÖAMTC Christophorus zwei — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c3", "text": "Tower an ÖAMTC Christophorus drei — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c4", "text": "Tower an ÖAMTC Christophorus vier — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c5", "text": "Tower an ÖAMTC Christophorus fünf — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c6", "text": "Tower an ÖAMTC Christophorus sechs — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c7", "text": "Tower an ÖAMTC Christophorus sieben — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c8", "text": "Tower an ÖAMTC Christophorus acht — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c9", "text": "Tower an ÖAMTC Christophorus neun — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c10", "text": "Tower an ÖAMTC Christophorus zehn — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c11", "text": "Tower an ÖAMTC Christophorus elf — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c12", "text": "Tower an ÖAMTC Christophorus zwölf — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c14", "text": "Tower an ÖAMTC Christophorus vierzehn — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_c16", "text": "Tower an ÖAMTC Christophorus sechzehn — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_approach_ara", "text": "Tower an ARA Rettungsflug eins — Einsatzort erreicht. Zielanflug freigegeben, viel Erfolg." },
{ "id": "r_tower_extract_c1", "text": "ÖAMTC Christophorus eins, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c2", "text": "ÖAMTC Christophorus zwei, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c3", "text": "ÖAMTC Christophorus drei, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c4", "text": "ÖAMTC Christophorus vier, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c5", "text": "ÖAMTC Christophorus fünf, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c6", "text": "ÖAMTC Christophorus sechs, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c7", "text": "ÖAMTC Christophorus sieben, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c8", "text": "ÖAMTC Christophorus acht, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c9", "text": "ÖAMTC Christophorus neun, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c10", "text": "ÖAMTC Christophorus zehn, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c11", "text": "ÖAMTC Christophorus elf, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c12", "text": "ÖAMTC Christophorus zwölf, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c14", "text": "ÖAMTC Christophorus vierzehn, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_c16", "text": "ÖAMTC Christophorus sechzehn, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_extract_ara", "text": "ARA Rettungsflug eins, Direktfreigabe zur Klinik. Patient hat oberste Priorität." },
{ "id": "r_tower_hw_approach_ara", "text": "Tower an ARA Rettungsflug eins — Sperrzone auf der A vierzehn erreicht. Landezone ist markiert, Fahrbahn frei." },
{ "id": "r_tower_hw_extract_ara", "text": "ARA Rettungsflug eins, Strecke frei — Ausflug zur Klinik Feldkirch freigegeben." },
{ "id": "r_tower_hw_approach_c6", "text": "Tower an ÖAMTC Christophorus sechs — Sperrzone auf der A zehn erreicht. Landezone markiert, Fahrbahn frei." },
{ "id": "r_tower_hw_extract_c6", "text": "ÖAMTC Christophorus sechs, Tauernstrecke frei — Ausflug zur Klinik Salzburg freigegeben." },
{ "id": "r_tower_hw_approach_c9", "text": "Tower an ÖAMTC Christophorus neun — Sperrzone auf der A zwei erreicht. Landezone markiert, Fahrbahn frei." },
{ "id": "r_tower_hw_extract_c9", "text": "ÖAMTC Christophorus neun, Strecke frei — Ausflug zur Klinik Wien freigegeben." },
{ "id": "r_tower_hw_approach_c10","text": "Tower an ÖAMTC Christophorus zehn — Sperrzone auf der A eins erreicht. Landezone markiert, Fahrbahn frei." },
{ "id": "r_tower_hw_extract_c10","text": "ÖAMTC Christophorus zehn, Westautobahn frei — Ausflug zur Klinik Linz freigegeben." },
{ "id": "r_tower_hw_approach_c11","text": "Tower an ÖAMTC Christophorus elf — Sperrzone auf der A zwei erreicht. Landezone markiert, Fahrbahn frei." },
{ "id": "r_tower_hw_extract_c11","text": "ÖAMTC Christophorus elf, Südautobahn frei — Ausflug zur Klinik Klagenfurt freigegeben." },
{ "id": "r_tower_hw_approach_c12","text": "Tower an ÖAMTC Christophorus zwölf — Sperrzone auf der A neun erreicht. Landezone markiert, Fahrbahn frei." },
{ "id": "r_tower_hw_extract_c12","text": "ÖAMTC Christophorus zwölf, Pyhrnstrecke frei — Ausflug zur Klinik Graz freigegeben." },
{ "id": "r_tower_sea_approach_ara", "text": "Tower an ARA Rettungsflug eins — Seenotlage im Blick. Schwebeflug auf dreißig Meter, Rotorabwind beachten." },
{ "id": "r_tower_sea_extract_ara", "text": "ARA Rettungsflug eins, Patient an Bord — Anflug auf die Uferklinik freigegeben." },
{ "id": "r_tower_sea_approach_c6", "text": "Tower an ÖAMTC Christophorus sechs — Seenotlage Wolfgangsee im Blick. Schwebeflug auf dreißig Meter." },
{ "id": "r_tower_sea_extract_c6", "text": "ÖAMTC Christophorus sechs, Patient an Bord — Anflug auf die Klinik Salzburg freigegeben." },
{ "id": "r_tower_sea_approach_c9", "text": "Tower an ÖAMTC Christophorus neun — Einsatzlage Neue Donau im Blick. Schwebeflug, Strömung beachten." },
{ "id": "r_tower_sea_extract_c9", "text": "ÖAMTC Christophorus neun, Patient an Bord — Anflug auf die Klinik Wien freigegeben." },
{ "id": "r_tower_sea_approach_c10","text": "Tower an ÖAMTC Christophorus zehn — Seenotlage Traunsee im Blick. Schwebeflug auf dreißig Meter." },
{ "id": "r_tower_sea_extract_c10","text": "ÖAMTC Christophorus zehn, Patient an Bord — Anflug auf die Klinik Gmunden freigegeben." },
{ "id": "r_tower_sea_approach_c11","text": "Tower an ÖAMTC Christophorus elf — Seenotlage Wörthersee im Blick. Schwebeflug auf dreißig Meter." },
{ "id": "r_tower_sea_extract_c11","text": "ÖAMTC Christophorus elf, Patient an Bord — Anflug auf die Klinik Klagenfurt freigegeben." },
{ "id": "r_tower_sea_approach_c16","text": "Tower an ÖAMTC Christophorus sechzehn — Seenotlage Neusiedler See im Blick. Achtung starker Seewind." },
{ "id": "r_tower_sea_extract_c16","text": "ÖAMTC Christophorus sechzehn, Patient an Bord — Anflug auf die Klinik Eisenstadt freigegeben." }
]
}
@@ -0,0 +1,15 @@
{
"_note": "Seerettung-Tower-Audios fuer c6/c9/c10/c11/c16. Ergaenzt die bestehenden ARA-Sea-Audios. Muster analog zu tower_sea_approach_ara bzw. tower_sea_extract_ara.",
"lines": [
{ "id": "r_tower_sea_approach_c6", "text": "Christophorus sechs, Salzburg Tower, Roger. Wasserlage im Blick — Schwebeflug auf dreißig Meter, Rotorabwind beachten." },
{ "id": "r_tower_sea_extract_c6", "text": "Christophorus sechs, Salzburg Tower, Patient an Bord — Anflug auf die Klinik Salzburg freigegeben." },
{ "id": "r_tower_sea_approach_c9", "text": "Christophorus neun, Wien Tower, Roger. Einsatzlage Neue Donau im Blick — Schwebeflug, Stroemung und Sog beachten." },
{ "id": "r_tower_sea_extract_c9", "text": "Christophorus neun, Wien Tower, Patient an Bord — Anflug auf die Klinik Wien freigegeben." },
{ "id": "r_tower_sea_approach_c10", "text": "Christophorus zehn, Linz Tower, Roger. Seenotlage Traunsee im Blick — Schwebeflug auf dreißig Meter, Rotorabwind beachten." },
{ "id": "r_tower_sea_extract_c10", "text": "Christophorus zehn, Linz Tower, Patient an Bord — Anflug auf die Klinik Gmunden freigegeben." },
{ "id": "r_tower_sea_approach_c11", "text": "Christophorus elf, Klagenfurt Tower, Roger. Seenotlage im Blick — Schwebeflug auf dreißig Meter, Rotorabwind beachten." },
{ "id": "r_tower_sea_extract_c11", "text": "Christophorus elf, Klagenfurt Tower, Patient an Bord — Anflug auf die Klinik Klagenfurt freigegeben." },
{ "id": "r_tower_sea_approach_c16", "text": "Christophorus sechzehn, Eisenstadt Tower, Roger. Seenotlage Neusiedler See im Blick — Achtung starker Seewind." },
{ "id": "r_tower_sea_extract_c16", "text": "Christophorus sechzehn, Eisenstadt Tower, Patient an Bord — Anflug auf die Klinik Eisenstadt freigegeben." }
]
}
@@ -0,0 +1,78 @@
{
"_note": "Tower-Lehrmeisterin fuer das Start-Minispiel. Ebene A = pro Heli personalisierte Funksprueche (Startfreigabe, nach Beruehrung, Chefpilot-Uebernahme). Ebene B = kontextuelle Lehrinhalte, generisch ohne Helinamen.",
"_voice": "Sarah (ElevenLabs multilingual v2), freundlich, warme Stimme. Pilot-Calls kommen als Textblase, Tower antwortet mit Audio.",
"lines": [
{ "id": "r_tower_start_c1", "text": "Christophorus eins, Stützpunkt Innsbruck-Flughafen, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c2", "text": "Christophorus zwei, Stützpunkt Krems-Gneixendorf, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c3", "text": "Christophorus drei, Flugplatz Wiener Neustadt Ost, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c4", "text": "Christophorus vier, Stützpunkt Reith bei Kitzbühel, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c5", "text": "Christophorus fünf, Stützpunkt Zams, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c6", "text": "Christophorus sechs, Flughafen Salzburg, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c7", "text": "Christophorus sieben, Stützpunkt Lienz, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c8", "text": "Christophorus acht, Stützpunkt Nenzing, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c9", "text": "Christophorus neun, Stützpunkt Wien-Aspern, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c10", "text": "Christophorus zehn, Flughafen Linz-Hörsching, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c11", "text": "Christophorus elf, Flughafen Klagenfurt, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c12", "text": "Christophorus zwölf, Flughafen Graz-Thalerhof, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c14", "text": "Christophorus vierzehn, Flugplatz Niederöblarn, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_c16", "text": "Christophorus sechzehn, Flugplatz Pinkafeld, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_start_ara", "text": "ARA Rettungsflug eins, Flugplatz Hohenems, Roger. Startplatz frei, Wind im Rahmen — Startfreigabe erteilt. Guter Flug." },
{ "id": "r_tower_strike_c1", "text": "Christophorus eins, Innsbruck Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c2", "text": "Christophorus zwei, Wien Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c3", "text": "Christophorus drei, Wien Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c4", "text": "Christophorus vier, Innsbruck Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c5", "text": "Christophorus fünf, Innsbruck Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c6", "text": "Christophorus sechs, Salzburg Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c7", "text": "Christophorus sieben, Klagenfurt Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c8", "text": "Christophorus acht, Bregenz Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c9", "text": "Christophorus neun, Wien Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c10", "text": "Christophorus zehn, Linz Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c11", "text": "Christophorus elf, Klagenfurt Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c12", "text": "Christophorus zwölf, Graz Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c14", "text": "Christophorus vierzehn, Graz Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_c16", "text": "Christophorus sechzehn, Wien Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_strike_ara", "text": "ARA Rettungsflug eins, Bregenz Tower. Kein Drama, das passiert — noch zwei Versuche, du kriegst das hin." },
{ "id": "r_tower_handover_c1", "text": "Christophorus eins, Innsbruck Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c2", "text": "Christophorus zwei, Wien Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c3", "text": "Christophorus drei, Wien Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c4", "text": "Christophorus vier, Innsbruck Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c5", "text": "Christophorus fünf, Innsbruck Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c6", "text": "Christophorus sechs, Salzburg Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c7", "text": "Christophorus sieben, Klagenfurt Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c8", "text": "Christophorus acht, Bregenz Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c9", "text": "Christophorus neun, Wien Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c10", "text": "Christophorus zehn, Linz Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c11", "text": "Christophorus elf, Klagenfurt Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c12", "text": "Christophorus zwölf, Graz Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c14", "text": "Christophorus vierzehn, Graz Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_c16", "text": "Christophorus sechzehn, Wien Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_handover_ara", "text": "ARA Rettungsflug eins, Bregenz Tower. Heute übernimmt der Chefpilot — wir üben das nächste Mal wieder. Alles gut, du lernst dazu." },
{ "id": "r_tower_lesson_wind", "text": "Achtung, Seitenwind über zwanzig Knoten — der Heck-Rotor schiebt weg, leichter Pedal-Gegendruck genügt. Du machst das gut." },
{ "id": "r_tower_lesson_foehn", "text": "Föhn ist ein warmer Fallwind über einem Gebirgskamm — die Luft wird beim Absteigen komprimiert und erwärmt, kann zwanzig Grad Unterschied bringen. Bei Föhn Turbulenzen erwarten." },
{ "id": "r_tower_lesson_fog", "text": "Advektionsnebel entsteht, wenn warme feuchte Luft über kalten Boden zieht. Die Sicht kann in Sekunden zusammenbrechen — Abstand zu Hindernissen halten." },
{ "id": "r_tower_lesson_thermic", "text": "Thermik steigt über dunklen Flächen auf — Asphalt, Felsen, Dächern. Über Wasser und Wald dagegen kaum. Deshalb werden Flüge am Nachmittag unruhiger." },
{ "id": "r_tower_lesson_temperature","text": "Pro hundert Meter Höhe sinkt die Temperatur um rund zwei Drittel Grad. Auf dreitausend Metern ist es zwanzig Grad kälter als im Tal — denk dran im Einsatzgebiet." },
{ "id": "r_tower_lesson_powerline","text": "Freileitungen sieht man von oben kaum — die Masten verraten sie. Zwischen zwei Masten immer Mindestabstand siebzig Meter zur Leitung." },
{ "id": "r_tower_lesson_antenna", "text": "Sendemasten stehen oft auf Kuppen — höchster Punkt der Umgebung, Blitzableiter. Kommt dir eine Spitze entgegen, beim Steigflug lieber einen Bogen fliegen." },
{ "id": "r_tower_lesson_crane", "text": "Baukräne haben bis achtzig Meter Radius und sind oft kaum markiert. Vor dem Bauland lieber großzügig ausweichen, Wind kann sie drehen." },
{ "id": "r_tower_lesson_chimney", "text": "Fabrikschlote ragen teils über einhundert Meter auf — der Rauch verrät die Windrichtung am Boden. Lehrstück ohne Kosten." },
{ "id": "r_tower_lesson_cable", "text": "Seilbahnen verlaufen oft quer zu Tälern und sind dünn, aber tödlich. Immer über der obersten Station bleiben, niemals quer zur Trasse durchs Tal." },
{ "id": "r_tower_lesson_hover", "text": "Im Schwebeflug verbraucht der Heli sechs Liter pro Minute — fast doppelt so viel wie im Vorwärtsflug. Jede Minute über dem Patienten kostet Reichweite." },
{ "id": "r_tower_lesson_vortex", "text": "Achtung Vortex-Ring: wenn die Sinkrate den Rotorabwind überholt, verliert der Heli Auftrieb. Immer leicht schräg sinken, nicht senkrecht." },
{ "id": "r_tower_lesson_torque", "text": "Der Hauptrotor erzeugt ein Drehmoment, das den Heli in die Gegenrichtung drehen will. Dafür ist der Heck-Rotor da — fällt er aus, dreht sich die ganze Maschine." },
{ "id": "r_tower_lesson_downwash", "text": "Der Rotorabwind drückt mit sechzig Stundenkilometern nach unten. Über Wasser sofort Wellen, über Schnee Blizzard, über Geröll Steinschlag. Abstand halten." },
{ "id": "r_tower_lesson_density", "text": "In großer Höhe ist die Luft dünn — weniger Auftrieb, mehr Leistung nötig. Über dreitausend Meter wird die Luft so dünn, dass manche Helis gar nicht mehr steigen können." },
{ "id": "r_tower_lesson_crows", "text": "Krähenschwärme starten bei Lärm schlagartig auf — vor dem Schwarm runter oder weit ausweichen. Vogelschlag ist die häufigste Absturzursache zivil." },
{ "id": "r_tower_lesson_gulls", "text": "Möwen fliegen in Wellenbewegung dicht über der Wasseroberfläche — bei Rotorabwind irritieren sie. Erst in mittlerer Höhe anfliegen." },
{ "id": "r_tower_lesson_banking", "text": "Ab dreißig Grad Schräglage wird der Rotor ineffizient — nie aggressiv kurven, vor allem nicht talseitig. Sanfte Bögen sind schneller als harte Kurven." },
{ "id": "r_tower_lesson_pilot", "text": "Pilot und Co-Pilot wechseln sich in der Führung ab — immer einer fliegt, einer beobachtet Instrumente und Umgebung. Niemals beide gleichzeitig navigieren." },
{ "id": "r_tower_lesson_autorot", "text": "Bei Triebwerksausfall fällt der Heli nicht wie ein Stein — der Rotor dreht weiter, das nennt man Autorotation. Geradeaus gleiten, am Boden kurz vor Bodenberührung nochmal ziehen." }
]
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
Binary file not shown.
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
Binary file not shown.
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
+8
View File
@@ -0,0 +1,8 @@
{
"error": {
"message": "400: There was an error parsing the body",
"type": "server_error",
"param": null,
"code": null
}
}
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More