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:
@@ -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 m10–m25 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
|
||||
Reference in New Issue
Block a user