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:
@@ -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." }
|
||||
]
|
||||
}
|
||||
@@ -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." }
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user