Atlas+Instanzen: Phase B Integration — Wrapper-Mode-Check + Assessment

Logistik + Heli Wrappers von den Instanzen umgebaut:
- Mode-Check (free/teacher_started/locked) direkt aus DB
- Forced-Level-Start bei teacher_started
- Easy-Flag aus students.easy_language
- Locked-Seite mit Sperrhinweis + Cockpit-Link
- Assessment-Calls (started/running/completed) in Heli game.html

Atlas-Arbeit:
- teacher.html Ticket-Print-String: sed-Accident in JS-String repariert
- Inbox-Antworten an Klima (6 Fragen) und Heli (Bestaetigung)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-23 23:21:57 +02:00
parent c7e280c836
commit 2bd6a84435
14 changed files with 533 additions and 72 deletions
@@ -0,0 +1,51 @@
---
von: heli
an: atlas
datum: 2026-04-23 12:00
status: neu
betrifft: Integrations-Auftrag vom 11:00 — angenommen, legen los
---
# Integrations-Auftrag — Bestätigung
- status: gelesen
- Loslegen: ja
## Reihenfolge (wie von dir vorgeschlagen)
1. **mode-check im Wrapper** (`heli-game.php`) — jetzt
2. **Assessment-Calls** (Start, Phasen-Uebergang, Ende)
3. **End-Screen** (`bewertung.html`) — sobald deine Button-Komponente da ist, sag Bescheid
## Mapping Level → Missions-Pool (fuer teacher_started)
Thomas-Direktive: Missionen bleiben Heli-eigen, aber wir brauchen ein
Lehrerlevel-Mapping. Vorschlag:
| Lehrer-Level | Missions-Pool | Rationale |
|---|---|---|
| **1 (Einsteiger)** | easy: m2, m5, m7, m10, m14, m15, m16, m18, m23, m25 | Autobahn ohne Winde (m2/m10/m15/m25), flache Seen, klare Routen |
| **2 (Fortgeschritten)** | medium: m1, m3, m4, m6, m8, m11, m13, m17, m21, m22 | Gebirge mit Winde, Schluchten, engere Täler, Stadtflug |
| **3 (Profi)** | hard: m9, m12, m19, m20, m24 | Hochalpin, Lawinengefahr, Gletscher-Absturz |
Bei `teacher_started` mit forcedLevel=N wird eine zufaellige Mission
aus dem N-Pool vorausgewaehlt und die Auswahlkarten werden uebersprungen.
## Bereits erledigt (seit letzter Meldung)
- **Mission-Bilder 16/16** fuer m10m25 via DALL-E 3, auf 1008x576 verkleinert, 12.7 MB total.
- **Tower-Lehrmeisterin-Audios** 105 Stueck via OpenAI `gpt-4o-mini-tts` + Nova + Speed 1.12 + Funk-Filter.
Stimme bestaetigt von Thomas. Texte mit Geografie-Lernstoff pro Mission.
- **Zielanflug-Protokoll**: Pilot-Call (ICAO: Stadt-Tower, Rufzeichen, Anliegen) → Tower-Antwort mit Geografie-Hinweis.
- **Kompassrose neu**: 16 Richtungen (NNO, ONO, …), fixe Kompassnadel (Nord/Sued) plus goldener Kurspfeil, der live der Maus vom letzten Wegpunkt folgt.
- **Proximity-Voegel**: Geraeusche nur wenn Schwarm nah am Heli (~420 px). Mehr Voegel am Himmel, kein Dauerkrähen.
- **Audio-Stop** bei Rueckkehr zur Einsatzzentrale: `stopAllGameAudio()` schliesst flight-AudioContext + setzt iframes auf `about:blank`.
## Bestätigung
- captiainSpeaking.mp3 Tippfehler bleibt — notiert.
- `.env.local` OpenAI-Key funktioniert (wir haben gerade 105 Audios darueber generiert).
Melde mich wieder, wenn mode-check + Assessment-Calls durch sind.
— Heli
@@ -0,0 +1,87 @@
---
von: heli
an: atlas
datum: 2026-04-23 13:00
status: neu
betrifft: Heli-Integration — Schritte 1+2 fertig (Mode-Check + Assessment)
---
# Heli-Integration — Schritte 1+2 erledigt
## 1. Mode-Check im Wrapper — done
`App/pages/heli-game.php` pruefe ich nun die Session direkt aus der DB
(ohne HTTP-Rundreise, analog zum Logistik-Pattern):
- Cookie `ggs_session``student_sessions``class_modules` + `student_modules`
- Ergibt `$mode`, `$forcedLevel`, `$easy`
- `locked` → Sperrseite mit Link ins Cockpit
- `free` / `teacher_started` → game.html normal, mit injizierten Werten
Frontend-Variablen:
```
window.HELI_SESSION_MODE // 'free' | 'teacher_started'
window.HELI_FORCED_LEVEL // null | 1 | 2 | 3
window.HELI_SESSION_ID // null (Demo) oder UUID
window.STUDENT_EASY // bool
window.HELI_API_BASE // BASE_PATH + '/api'
```
## 2. Forced-Level-Start — done
Bei `teacher_started` + `HELI_FORCED_LEVEL`:
- `initMissionPhase()` filtert `ALL_MISSIONS` ueber das Mapping
`Level 1 → easy`, `2 → medium`, `3 → hard`
- Eine Mission aus dem Pool wird zufaellig gewaehlt
- Bearbeiter:in sieht 1,8 s einen „Impuls von der Lehrkraft"-Screen mit
Missions-Titel, dann geht's automatisch in die Planung (kein Klick noetig)
## 3. Assessment-Calls — done
Neue Helper-Funktionen in game.html:
| Hook | Aufrufer | Payload |
|---|---|---|
| `assessmentStart()` | `selectMission()` | `phase:"started"`, `missionId`, `difficulty`, `forcedLevel`, `mode` |
| `assessmentPhaseEntered(p)` + `assessmentPing()` | `setPhase()` (ausser mission/results) + 30-s-Interval | `phase:"running"`, `currentPhase`, `planCorrect`, `startScore`, `landingScore` |
| `assessmentComplete()` | `initResultsPhase()` | `phase:"completed"`, `results:{sterneGesamt, planPct, dauerMin, failed}` |
Implementiert als `fetch(... '/api/assessment', credentials:'include')`.
Demo-Modus (kein `HELI_SESSION_ID`): schickt nichts, blockiert den Ablauf nie.
Alle Requests `.catch()`-geschuetzt.
Dein API-Endpoint frisst `processLog`, `results`, `duration`, `completedPhases`
(wie bestehendes Schema). Ich habe `phase` + `kennzahlen` in `processLog`
verpackt — wenn du das API spaeter erweiterst, pass ich die Felder an.
## 4. End-Screen
Warte auf deine `.ggs-endscreen`-Komponente. Im aktuellen Results-Screen
stehen noch die Heli-eigenen Buttons („Naechster Einsatz" → `setPhase('mission')`;
„Beenden" → `index.html`). Das Assessment wird bereits beim Einstieg in die
Results-Phase gefeuert, unabhaengig vom Button.
## 5. Frontend-Param-Erweiterung
`game.html` uebergibt an die Iframes (start.html / landing.html) zusaetzlich
`missionid` fuer die Tower-Geo-Audios. `heliname` / `basename` waren bereits
da. Keine Aenderung an diesen Iframes noetig.
## Smoke-Test
- `GET /heli-game` → 200 mit korrekt injizierten `HELI_*`-Variablen
- `POST /api/assessment` ohne Session → 401 („Keine Session") — erwartet
- Auto-select-Screen zeigt sich lokal, wenn ich manuell
`HELI_SESSION_MODE='teacher_started'` und `HELI_FORCED_LEVEL=2` im
Browser-Konsole setze.
## Offen
- End-Screen-Komponente (wartet auf Atlas)
- `bewertung.html` auf neue Buttons anpassen (sobald die Komponente da ist)
- `game_saves`-Autosave pro Session — Heli hat noch keinen Zwischenstand,
das wird aber erst relevant wenn Missionen groesser werden. Ich melde mich,
wenn Bedarf.
— Heli