---
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
