# Test-Protokoll Session 2026-05-30 (Post-Compact) **Status:** Alle Änderungen LOKAL — KEIN Production-Deploy ohne Thomas-OK. **Regel:** Wir testen lokal gemeinsam. Erst bei explizitem „deployment to TEST"-Befehl von Thomas wird auf Production geschoben. Danach gehen wir dieses Protokoll als Test-Skript durch. --- ## 1) Modul Sonnensystem — observations.json + game.html ### 1.1 JSON-Bug behoben - **Was:** Kaputtes `"` (U+0022) statt deutsches `"` (U+201C) in observations.json Z.84 hat den simHint-String der Erdjahr-Aufgabe vorzeitig beendet → komplettes JSON-Parse-Fehler → „obs] load failed". - **Fix:** `Viertel-Tag"` → `Viertel-Tag"` - **Test:** Modul lädt, alle 19 Aufgaben sichtbar im Aufgaben-Tab. ### 1.2 Polish-Review (4 von 4 Aufgaben) - **#7 Vollmond:** Antwort #2 von „auf der sonnenabgewandten Seite (aber leicht über oder unter der Linie Sonne–Erde, sonst wäre es Mondfinsternis)" gekürzt auf „auf der sonnenabgewandten Seite der Erde steht". Klammer-Detail bleibt in der Erklärung. - **#11 Mondtilt-Aufgabe entfernt:** Aufgabe `obs-mondtilt` aus tasks-Array raus. Mondbahn-Tilt-Slider bleibt im UI als Sandbox. - **#13 Ohne Achsneigung:** Neue `phases`-Sequenz mit Wechsel 23,5° ↔ 0° am 21. Juni (Seitenansicht, je 6 s, pausiert). Polartag verschwindet sichtbar im What-If. Implementiert: neues `axisTilt`-Property in obsApplyState, Default-Reset auf 23,5°. - **#15 Sommer vs Winter:** war schon mit phases umgesetzt (21.6. ↔ 21.12., je 5 s). - **Achievement-Texte:** „20 Aufgaben" → „19 Aufgaben" in `half_done` und `all_done`. **Test #7:** - Öffne Aufgabe „Vollmond — wie entsteht er?", prüfe ob Antwort-Option 2 kurz lesbar ist. **Test #11 (entfernt):** - Aufgaben-Anzeige zeigt 19 statt 20. Mondtilt-Aufgabe nirgends mehr. Slider „Mondbahn-Tilt" funktioniert in Sandbox weiterhin. **Test #13:** - Aufgabe „Was wäre ohne Achsneigung?" → Schau-Phase startet → wechselt im Sekunden-Takt zwischen 23,5° und 0°. Bei 0° sind beide Halbkugeln gleichmäßig beleuchtet, kein Polartag. **Test #15:** - Aufgabe „Sommer vs. Winter in Wien" → Wechsel 21.6./21.12. funktioniert, Wien-Inset zeigt unterschiedliche Sonnenstände. ### 1.3 UI: Jetzt-Button + „Besondere Tage für heuer" - **Was:** Button-Reihenfolge `⏰ Jetzt | 🎆 Neujahr | 🐰 Ostern | 🎄 Weihn.` (Jetzt zuerst). - **Label:** „Feiertage / Schul-Termine (für 2026)" → „Besondere Tage für heuer". - **Ostern dynamisch:** via Gauss-Computus pro aktuelles Jahr berechnet, Tooltip zeigt echtes Datum. **Test:** - Datum-Bereich aufklappen. Button-Reihenfolge richtig. Label heißt „Besondere Tage für heuer". Klick auf „⏰ Jetzt" springt zur aktuellen Uhrzeit. Klick auf „🐰 Ostern" springt auf echten Ostersonntag. ### 1.4 Komplett dynamisches Jahr - **EPOCH:** Statt fix `new Date(2026, 0, 1)` jetzt `new Date(new Date().getFullYear(), 0, 1)`. Tag 0 = 1.1. heuer. - **Mondphasen-Anker:** Real-Vollmond 3.1.2026 als Referenz, `MOON_EPOCH_OFFSET_DAYS` rechnet Offset zum aktuellen Jahr. Phasen stimmen auch in Folgejahren. - **obsApplyState:** Ersetzt Jahr in observations-Daten (`"2026-06-21"` → `"-06-21"`) — JSON-Daten dürfen weiter mit fixen Jahren stehen. - **Datum-Inputs:** Default = `1.1. heuer 12:00` (statt fix 2026-01-01). - **Hilfetexte:** „Tag 0 = 1. Januar 2026" → „… des aktuellen Jahres". - **Date-Banner:** „📆 1. Jan 2026" → „📆 1. Jan" (Banner wird via formatDate dynamisch geschrieben). - **observations.json Erdjahr-intro:** „1.1.2026 00:00" → „1. Januar, kurz nach Mitternacht in Wien". **Test (Browser-Konsole):** ```js CURRENT_YEAR // muss 2026 zurückgeben (oder das jeweilige Jahr) EPOCH // 1.1. ``` - Datum-Buttons (Frühling, Sommer, Ostern, Jetzt) springen alle ins aktuelle Jahr. - Sonnensystem-Aufgaben mit fixen Datumstrings (z.B. „Polartag am 21. Juni") starten im aktuellen Jahr, nicht in 2026. ### 1.5 Photon-Reflexion physikalisch korrekt - **Was vorher:** Photon flog von Sonne durch den Mond-Mittelpunkt zur Erde — die zweite Phase startet von der NACHT-Seite des Mondes, was physikalisch falsch ist (Nacht-Seite reflektiert nichts). - **Was jetzt:** Reflexionspunkt = sonnen-zugewandte Mond-Oberfläche (`_photonMoonPos - normalize(_photonMoonPos) × MOON_RADIUS`). Zweite Phase startet dort, fliegt von der Tag-Seite zur Erde. - Gilt für beide Modi: statische Linien (Fast-Mode) + Pulse-Animation (Slow-Mode). **Test:** - Photon-Toggle einschalten. Bei langsamer Geschwindigkeit (🐢 1×): Photon trifft auf Mond-Tag-Seite (nahe Sonne), nicht durch den Mond hindurch. - Bei schneller Geschwindigkeit: die gelbe Linie Sonne-Mond endet an der sonnen-zugewandten Mond-Oberfläche. ### 1.6 Erdjahr-Aufgabe stopAtDay-Feature - **Was:** Neues Property `stopAtDay` in observations.json — Sim pausiert exakt bei `timeDays >= stopAtDay`, speed-unabhängig sim-genau. - **Erdjahr-Aufgabe:** `stopAtDay: 365.25` → Wien-Fahne genau 90° vom Startpunkt versetzt = der ¼-Tag-Drift didaktisch sauber visualisiert. - **TDZ-Fix:** animate() verwendet `window.__obsStopAtCheck` statt direkter obsState-Referenz (TDZ-Bug bei `const obsState`). **Test:** - Aufgabe „Erdjahr und Schaltjahr" starten → Sim läuft → stoppt automatisch nach ~31 s → Wien-Fahne steht ~90° vom Startpunkt (Ghost-Erde) versetzt = sichtbarer Vierteldrehung-Drift. --- ## 2) Glossar ### 2.1 Watt-Eintrag erweitert (PS + Historie) - **SQL-Migration:** `App/Don_t_Deploy/2026-05-30-watt-ps-erweiterung.sql` (idempotent, SET NAMES utf8mb4). - **Inhalt:** - Neuer Abschnitt „Pferdestärke (PS) — der historische Vergleich" - Umrechnung 1 PS = 735,5 W, 1 kW = 1,36 PS, 100 PS ≈ 73,5 kW, 1.000 PS ≈ 735 kW - James Watt selbst hat PS erfunden (für Dampfmaschinen-Verkauf an Brauereien/Bergwerke) - Heute in EU offiziell kW seit 1978, in USA HP (745,7 W) - Auch in `text_easy` (Leichte Sprache): kurze Erklärung „Bei Autos liest man oft PS …" - **Lokal:** angewendet. - **Production:** noch NICHT (steht zum „deployment to TEST"). **Test:** - Glossar öffnen, „Watt" anklicken. Im Detail-Modal muss der PS-Abschnitt sichtbar sein. Beide Varianten (Fachsprache + Leichte Sprache) prüfen. ### 2.2 Thumbnail-System für Glossar-Cards - **Problem vorher:** Cards luden die Originale (1–3 MB pro PNG, 134 Stück = 330 MB). Ewige Ladezeit. - **Lösung:** WebP-Thumbnails 480×270 unter `assets/img/glossar/thumbs/.webp`. - **Build-Skript:** `App/Don_t_Deploy/build-glossar-thumbs.ps1` (idempotent, nutzt ImageMagick `magick`). - **Ergebnis:** 132 Thumbs generiert, **329,7 MB → 2,6 MB (99,2 % Ersparnis)**. - **PHP-Code:** Neue `fmtThumb(path)`-Funktion in glossar.php. `renderCard` lädt jetzt thumb, mit `onerror`-Fallback auf Original wenn Thumb fehlt. Detail-View (`renderDetail`) zeigt weiterhin das Original. **Test:** - Glossar öffnen → Cards sollten messbar schneller laden (Network-Tab im Browser checken — Card-Bilder sind jetzt webp, ~20 KB statt 2,5 MB). - Auf eine Card klicken → Detail-Modal zeigt das große Original-Bild scharf. - Thumb-Fehler-Fallback: Lösche temporär einen Thumb → Card lädt automatisch das Original. ### 2.3 Korruptes Bild — Aufmerksamkeit - `residuallast.png` ist defekt (48 KB statt 1–3 MB, vorzeitiges EOF). - Thumb konnte nicht generiert werden. - **Aktion offen:** Bild neu generieren (DALL-E aktuell down, siehe 2.4). ### 2.4 Turbinen-Bild — Bild-Refresh BLOCKIERT - **Ziel:** Aktuelles `turbine.png` zeigt absurd übergroße Turbine (höher als Berge) → soll durch sinnvolle Querschnitts-/Person-für-Skala-Variante ersetzt werden. - **Status:** Bild-Refresh-Agent ist gelaufen, aber API blockiert: - DALL-E 3 ist im Anthropic OpenAI-Account NICHT mehr verfügbar (Modell entfernt). - Verfügbar wären: `gpt-image-1`, `gpt-image-1-mini`, `gpt-image-1.5`, `gpt-image-2` … - Aber: **Billing-Hard-Limit erreicht** — keine Generierung möglich. - **Aktion offen für Thomas:** - OpenAI-Billing-Hard-Limit anheben (Settings → Limits) - Entscheidung: Migrieren wir alle Bild-Generierungs-Skripte (`App/sims/logistik/scripts/generate-splash-images.sh` etc.) von `dall-e-3` auf `gpt-image-1`? Modelle haben unterschiedliche Parameter — das ist ein eigener Refactor. - Asset bleibt unverändert (Backup-Mechanismus hat das alte Bild zurückgestellt). --- ## 3) Vor dem nächsten Production-Deployment **Was muss noch passieren bevor wir auf Production gehen:** 1. Lokales Durchtesten aller Punkte oben (Thomas + Atlas gemeinsam). 2. Falls Bild-Refresh-Block durchbrochen: Turbine + residuallast neu generieren. 3. Online-Test-Plan: dieser File als Checkliste verwenden, jeden Punkt am Production-Server prüfen. **Beim Deployment to TEST mit Thomas zu beachten:** - SQL-Migration `2026-05-30-watt-ps-erweiterung.sql` auf Production-DB anwenden (mit `--default-character-set=utf8mb4`) - Build-Skript `build-glossar-thumbs.ps1` lokal laufen lassen, Thumbs via deploy.sh hochziehen - `sonnensystem/data/observations.json` + `sonnensystem/game.html` deployen - `App/pages/glossar.php` deployen - Apache-OPcache nach Deploy reset **Online-Test-Skript (post-deploy):** - [ ] geograsim.at/sonnensystem → Aufgabe „Erdjahr und Schaltjahr" — stoppt nach ~31 s, Wien 90° versetzt - [ ] Erdjahr: Ghost-Erde liegt EXAKT am Startpunkt (JAN), nicht irgendwo dazwischen - [ ] Aufgabe „Was wäre ohne Achsneigung?" — Phases-Wechsel 23,5°↔0° - [ ] Aufgabe „Vollmond — wie entsteht er?" — Antwort #2 kurz - [ ] Aufgaben-Liste zeigt 19 Stück (vorher 20) - [ ] Aufgabe „Erddrehung" (= erste): Kamera SEHR nah an der Erde, Wien-Fähnchen zeigt RICHTUNG SONNE (Mittag) - [ ] Datum-Buttons: ⏰ Jetzt zuerst, Label „Besondere Tage für heuer", Ostern auf echtem Datum - [ ] Photon-Toggle: reflektiert an Mond-Tag-Seite - [ ] Aufgaben-Modal Button „↻ Aufgaben abbrechen und neu starten" (statt nur „Neu starten") - [ ] Aufgaben-Modal Button „← Zurück zur letzten Übung" (bei Aufgabe 1 ausgegraut) - [ ] geograsim.at/glossar → „Watt" anklicken → PS-Abschnitt sichtbar - [ ] Glossar-Cards laden spürbar schneller (Network-Tab: kleine webp statt große png) - [ ] Detail-Modal zeigt großes Original-Bild - [ ] Glossar im Sonnensystem-Modul lädt Begriffe (kein 404 mehr) --- ## 4) Folge-Iteration nach erstem Test-Lauf (alle nach der ersten Antwort-Runde) ### 4.1 404 Glossar-API für Sonnensystem - **Was:** `sonnensystem.php` setzte `window.SONNENSYSTEM_API_BASE = '/geograsim/App/api'` — lokal existiert dieser Pfad nicht (richtig wäre `/geograsim/App/php/api`). Production hat Aliasing, lokal nicht. Klima nutzt schon den korrekten Pfad. - **Fix:** `sonnensystem.php` jetzt `BASE_PATH . '/php/api'` (Linie 116). - **Test:** Glossar-Klick in der Sim lädt Inhalte, keine 404-Fehler in der Konsole. ### 4.2 Buttons in den Aufgaben - „Neu starten" → „↻ Aufgaben abbrechen und neu starten" - Neuer Button „← Zurück zur letzten Übung" rechts daneben. Bei Aufgabe 1 ausgegraut (disabled). - **Test:** Bei mehreren Aufgaben durchklicken, „Zurück"-Button funktioniert. Bei der 1. Aufgabe ist er ausgegraut. ### 4.3 Erddrehung-Aufgabe (= erste Aufgabe) Setup neu - Neuer Camera-Mode `earth-very-close` (Distanz 1.8× Erdradius statt 3×). Erde füllt knapp halben Bildschirm. - StartState: `date: "2026-01-01T12:00:00"` (= Wien-Mittag, Fähnchen zeigt zur Sonne) — vorher 2026-03-21. - Intro-Text ergänzt: „Am Start ist in Wien Mittag — das rote Fähnchen zeigt direkt zur Sonne." - **Test:** Aufgabe „Erddrehung" → Kamera sehr nah an der Erde, Wien-Fähnchen rotiert Richtung Sonne sichtbar in/aus dem Tageslicht. ### 4.4 Ghost-Erde Race-Condition + Zeitzone-Bug - **Bug 1 (Matrix-Race):** `setTimeout(showGhostEarthAtCurrentPosition, 0)` las `earthPivot.getWorldPosition()`, bevor die animate-Loop die Matrix für das neue timeDays aktualisiert hatte → Ghost saß an der Position der LETZTEN Sequenz. - **Bug 2 (Zeitzone):** `new Date("2026-01-01")` parst ECMAScript-konform als UTC-Midnight. EPOCH = `new Date(2026,0,1)` = lokale Zeit. In CET = 1h Versatz → timeDays ≈ 0.042 statt 0 → Ghost-Erde 0.04° vom Startpunkt entfernt (klein, aber falsch). - **Fix:** - `showGhostEarthAtCurrentPosition` rotiert earthOrbit/earthTilt manuell + `updateMatrixWorld(true)` BEVOR getWorldPosition → garantiert frische Matrix. - In `obsApplyState`: Datums-String per Regex in Komponenten parsen (`Y, M, D, h, m, s`) und mit `new Date(y, m-1, d, h, m, s)` als lokale Zeit konstruieren → keine UTC-Falle. - **Test:** Aufgabe „Erdjahr und Schaltjahr" mehrfach starten — Ghost-Erde liegt jedes Mal an derselben Stelle (JAN-Marker). ### 4.5 Thumbnail-Build erfolgreich - 132 Thumbs in `assets/img/glossar/thumbs/` (WebP 480×270, ~20 KB jeweils). - 329,7 MB → 2,6 MB (99,2 % Ersparnis). - Build-Skript `App/Don_t_Deploy/build-glossar-thumbs.ps1` (idempotent). - Defekt erkannt: `residuallast.png` (48 KB, vorzeitiges EOF) — Thumb fehlt für diesen Eintrag, Card lädt via onerror-Fallback das defekte Original. --- ## 7) Busfahrt — Ereigniskarten + Glossar + Lehrplan + Submit-Hook ### 7.1 Ereigniskarten-System (10 Events, evidenzbasiert) - **Daten:** `App/sims/busfahrt/assets/data/events.json` — 10 Karten: 1. **ev-late-passenger** — Fahrgast nach Pause verspätet (Pauschalreisegesetz) 2. **ev-grenzkontrolle** — EU-Außengrenze, Quiz zu Zoll-Vorschriften + CITES 3. **ev-reifenpanne** — Reifenpanne (TÜV-Statistik: 35% aller Bus-Pannen) 4. **ev-heisse-bremsen** — Alpen-Bergabfahrt, Bremsfading-Risiko 5. **ev-lenkzeit** — EU-Verordnung 561/2006, Tachograph, max. 9h Lenkzeit/Tag 6. **ev-tunnelstau** — Brenner-Korridor-Stau, Umweg vs warten 7. **ev-vignette** — GO-Box vs Vignette, Maut-Systeme Europa 8. **ev-schneeketten** — Schneekettenpflicht-Schild, Winter-Trigger 9. **ev-diebstahl-raststaette** — Frankreich-spezifische Autobahn-Diebstahl-Statistik 10. **ev-notfall-bord** — Reisekrankheit/Kinetose, Erste Hilfe - **Engine:** `pickEventForOrder(game)` mit Realismus-Filter (Schengen-Außengrenze / Alpenpass-Länder / Winter / probability). Wird zwischen settleOrder und loadNextOrder gerufen. `applyEventChoice` bucht Geld + protokolliert in `game.eventLog`. - **UI:** neues Modal `event-overlay` mit SVG-Icon (im Stil) + Sachinfo-Box (ausklappbar) + Glossar-Klick-Links + Lehrplan-Hinweis. - **SVG-Icons:** 10 Inline-SVGs im offiziellen Bildstil (Forest-Green-Gradient-Hintergrund + weiße Linien-Icons). DALL-E ist aktuell blockiert — SVG hält die App visuell trotzdem stimmig. **Test (lokal):** - L3-Tour starten → öfter Ereigniskarten erleben (Wahrscheinlichkeiten höher als L1). - Beim Quiz „Grenzkontrolle" Antworten prüfen → korrekt = +50€, falsch = +45min. - Sachinfo-Box ausklappen → Lehrplan-Hinweis sichtbar, Glossar-Links anklickbar. ### 7.2 Glossar erweitert (20 neue Begriffe) - **Datei:** `App/Don_t_Deploy/2026-05-30-glossar-busfahrt-events.sql` (idempotent, SET NAMES utf8mb4) - **Begriffe:** zoll, schengen, cites, vignette, go-box, tachograph, lenkzeit, schneekettenpflicht, bremsfading, motorbremse, pauschalreise, kinetose, alpenpass, maut, asfinag, warndreieck, panne, beförderungsvertrag, eu-aussengrenze, brennerkorridor - **Lokal eingespielt.** Bei Production-Deployment: SQL erneut mit `mysql --default-character-set=utf8mb4` ausführen. ### 7.3 Lehrplan-Dokumentation - **Datei:** `App/sims/busfahrt/LEHRPLAN.md` — vollständiges Mapping nach österreichischem Lehrplan GW Sek I (Lehrplan 2023). - Themen: Geographie, Wirtschaft, Politische Bildung, Verkehrserziehung, Mathematik, Biologie, Physik, Sprachen. - Pro Event ein klares Themen-Mapping inkl. Glossar-Querverweise. ### 7.4 Submit-Hook für Busfahrt (Bug-Fix vom Atlas-Bericht 2026-05-05) - **Was vorher:** Busfahrt rief KEINEN Plattform-API-Endpoint — Schüler*innen-Ergebnisse verschwanden ins Nichts. - **Was jetzt:** `submitBusfahrtTour()` schickt am Tour-Ende ein `submit_assessment` an `/php/api/progress.php` mit: level, stars, score, duration_ms, results.budget/earnings/wonOrders/totalOrders/quizFirstTry/eventCount. - **Aktualisiert auch GGS_LIVE_STATE-Felder:** levelId/orderIndex/totalOrders/budget/wonOrders/lastCityTitle/lastMargin/quizFirstTry — passend zum neuen `LIVE_PRIMARY_FIELDS.busfahrt`-Schema in teacher.html. **Test:** - Tour zu Ende spielen → assessments-Tabelle in DB enthält neuen Eintrag mit sim_id='busfahrt'. - Lehrer-Cockpit → Tab „Ergebnisse" → Klasse → Busfahrt zeigt den Run als Karte. --- ## 8) Fluggesellschaft — Neues Modul V1 funktional ### 8.1 Daten + Pool - **Migration:** `App/sims/fluggesellschaft/scripts/migrate-from-busfahrt.py` — kopiert 53 L4-Aufträge aus Busfahrt + 16 Asien-Aufträge. - **Asien-Lücke gefüllt:** 7 neue Städte (Tokio, Peking, Delhi, Bangkok, Singapur, Seoul, Jakarta) inkl. infoText DE+Easy, Zeitzone, Kontinent. - **Hub:** Frankfurt (FRA) hinzugefügt als Heimat-Stadt. - **Quiz-Fragen:** Generator erweitert auf 2 Frage-Typen (Land + Kontinent), pro Auftrag alterniert deterministisch. - **Endstand:** 69 Aufträge (L1=18, L2=29, L3=22), 44 Städte. ### 8.2 Engine - `App/sims/fluggesellschaft/engine.js` — Großkreis-Routing (`greatCirclePoints`), Quiz mit 2 Typen, ECON pro Level (Tap-Toleranz 250/200/150 km, Nachtflug-Quote 15/30/60%, Quiz-Geld ±100/150/200 €), CO₂-Bilanz (0.18 kg/Pax/km × 180 Pax). - Submit-Hook + GGS_LIVE_STATE inline in `game.html`. ### 8.3 UI - `App/sims/fluggesellschaft/game.html` — Leaflet-Karte mit 3 Tile-Layern: - **ESRI World Imagery** (Satellite, Default) — empfohlen für Welt-Sicht - **OpenStreetMap** — bekannte Strukturen, Beschriftungen - **CARTO Dark** — Nachtflug-Atmosphäre - Toggle-Button 🛰️ in Topbar wechselt durch - Großkreis-Polyline orange-gestrichelt, Flugzeug-Animation (✈) entlang der Route - Buchhaltungs-Tabelle mit Quiz-Bonus/Strafe + CO₂-Zeile - Endscreen: Quiz-Stats + Gesamt-CO₂ in Tonnen + Hektar-Wald-Äquivalent ### 8.4 Plattform-Integration - **PHP-Wrapper:** `App/pages/fluggesellschaft.php` (analog busfahrt.php — Mode-Check, Locked-Page, Asset-Path-Rewrite, Cockpit-Link) - **module_info DB-Eintrag** angelegt (status='beta', icon='✈', page_url='fluggesellschaft') - **LIVE_PRIMARY_FIELDS.fluggesellschaft** in `teacher.html`: 8 Spalten (level, flug, budget, flüge ✓, CO₂, letztes Ziel, zeitzone, quiz auf anhieb) - **`renderFluggesellschaftRun`** in `teacher.html` für Lehrer-Drilldown - **`renderFluggesellschaftOwnRun`** in `schueler.html` für Schüler-eigene-Verlauf-Ansicht ### 8.5 Glossar + Lehrplan - **9 neue Glossar-Begriffe** (SQL: `App/Don_t_Deploy/2026-05-30-module-fluggesellschaft.sql`): großkreis · zeitzone · datumsgrenze · klimazone · co2-flugverkehr · kontinent · hub-flughafen · jetstream · cockpit-air-traffic - **Lehrplan-Mapping:** `App/sims/fluggesellschaft/LEHRPLAN.md` — Welt-Geographie, Mathematik (Großkreis), Physik (Jetstream, Atmosphäre), Politische Bildung (Zeitzonen, ICAO), Umwelt (CO₂) ### 8.6 Bekannte Lücken - **Asien-Stadtbilder fehlen** (DALL-E blockiert) — onerror-Fallback aktiv, Bild unsichtbar - **Splash-Image fehlt** (gleicher Grund) - **Keine Events-Karten** (analog Busfahrt) — für spätere Iteration vorgemerkt **Test lokal (gemeinsam mit Thomas):** - `localhost/geograsim/App/fluggesellschaft` aufrufen → Welcome → Quiz → Karten-Tap → Resolution mit Großkreis-Animation → InfoCard mit Zeitzone + CO₂ → Endscreen mit Bilanz. - Levelwechsel (Forced-Level über Lehrer-Cockpit) durchtesten. - Lehrer-Cockpit → Live-View → Flug-Schüler*in startet → Felder erscheinen mit korrekten Werten. **Online-Test-Skript (post-deployment to TEST):** - [ ] geograsim.at/fluggesellschaft lädt ohne 404 - [ ] L1 → 10 Flüge, L2 → 14, L3 → 18 Flüge in der Tour - [ ] Karten-Tile-Toggle 🛰️ wechselt Esri → OSM → Dark - [ ] Großkreis-Linie sichtbar zwischen Frankfurt und Ziel - [ ] Quiz wechselt zwischen „In welchem Land?" und „Auf welchem Kontinent?" - [ ] CO₂-Bilanz in InfoCard + Endscreen + Topbar - [ ] Zeitzone-Hinweis in InfoCard („Tokio ist 8h voraus") - [ ] Submit am Tour-Ende → assessments-Eintrag in DB - [ ] Lehrer-Cockpit Live-View zeigt Flug-Schüler*in mit allen Spalten - [ ] Detail-Drilldown zeigt Flug-Run-Karte mit CO₂-Stat --- --- ## 11) Iteration 2026-05-31 — Profil-Polish + Avatar-Generierung + Lehrer-Cockpit ### 11.1 Profil-Seite: Schüler-Navi + Lehrer-Navi + Hash-Routing - **Schüler-Tabs** in profil.html: Meine Module / Meine Erfolge / Profil — Klick führt zurück zu schueler.html mit Hash (`#achievements`, `#profile`). - **Lehrer-Tabs** in profil.html: Übersicht / Modulfreigabe / Klasse / Live / Ergebnisse / Lizenzen / Profil — analog mit Hash. - **Hash-Listener** in schueler.html UND teacher.html: liest `location.hash` beim Laden + `hashchange`-Event und schaltet `switchTab()` automatisch. - Sichtbarkeit der Tab-Bar wird per role (`student`/`teacher`) gesteuert. ### 11.2 Sonnensystem-Eigen-Verlauf umgebaut auf Sessions - **Problem:** task_solved-Submits (eine pro gelöster Aufgabe, Live-Heartbeat) wurden im Schüler-Eigen-Verlauf als 20+ einzelne Karten gezeigt. - **Fix:** `groupSonnensystemSessions()` clustert task_solved + set_complete zu Tour-Sessions (1h-Gap oder set_complete schließt ab). - **Orange linker Rand** = halbfertig (kein set_complete) - **Grün** = abgeschlossen - Aufklappbare Details: Zeitraum, gelöste Aufgaben, Mehrfachversuche, neue Achievements. - **Lehrer-Drilldown** in teacher.html bekommt dieselbe Logik (`groupSonnensystemSessionsTeacher` + `renderSonnensystemSessionTeacher`). ### 11.3 Energiemanager Onboarding + Netzfrequenz erweitert - **Onboarding** (4 Schritte) komplett umgeschrieben — von Stichpunkten zu erzählenden vollständigen Sätzen. - **Netzfrequenz-Glossar** (DB + Sim-Fallback) startet jetzt mit Wechselstrom-Grundlage: „In unseren Steckdosen fließt kein Gleichstrom wie aus einer Batterie, sondern Wechselstrom..." + Chor-Metapher + Pulsschlag + EU-weite Synchronisation Portugal–Polen. - **Scope-Bug** behoben: `setSummaryClose()` und `setSummaryNext()` waren im IIFE versteckt → ReferenceError beim Schließen-Klick. Beide nun `window.X = X`. ### 11.4 Avatar-System: 6 × 12 = 72 Avatare mit Namen + 3 neue Gruppen - **Datenstruktur** in profil.html: `AVATAR_GROUPS = [{name, color, items: [{slug, name, emoji}]}]` - **3 neue Gruppen:** - **Aliens erforschen die Welt** (12) — Zorblax/Aquana/Tempest/Urbanix/Faunor/Floranth/Magmara/Glacium/Solara/Veridia/Altimos/Marinus (im Comic-Stil) - **Berühmte Forschungsmaschinen** (12) — Trieste, Graf Zeppelin, Charlière, Fram, HMS Beagle, Halleysche Tauchglocke, Voyager 1, Vostok-Eisbohrer, Curiosity, Landsat, FS Meteor, Meteosat - **Berühmte Forscher*innen** (12) — Humboldt, Mercator, Cook, Marco Polo, Ibn Battuta, Nansen, Piccard, Amundsen, Earhart, Sylvia Earle, Anning, Carson - **3 bestehende Gruppen** je um 2 ergänzt: Ozeanographin/Tropenbiologe, Skaterin/DJ, Tundra-Wolf/Tiefsee-Krake. - **Emoji-Fallback** statt Initial-Buchstabe wenn PNG fehlt: stilkonformer farbiger Kreis mit passendem Emoji. ### 11.5 Avatar-Bilder via OpenRouter+Gemini-2.5-Flash-Image - **OpenAI-Org blockiert** wegen fehlender Org-Verification (`billing_hard_limit_reached` auf allen `gpt-image-*` Modellen, beide Accounts geprüft). - **Workaround:** OpenRouter mit Gemini 2.5 Flash Image — generiert PNG-Avatare im offiziellen Bildstil. - **Generator-Skript:** `App/assets/img/avatars/scripts/generate-via-openrouter.py` (Python, nutzt curl wegen Inkscape-Python-SSL-Cert-Issue). - **Ergebnis:** 42 neue PNGs erzeugt (Aliens im Comic-Stil mit großen Augen + warmem Lächeln + kindgerechten Proportionen, Maschinen + historische Persönlichkeiten als Portraits). - **Thumb-Build:** `App/Don_t_Deploy/build-avatar-thumbs.ps1` (ImageMagick `magick.exe`, fester Pfad bei Bedarf). 72 PNGs (71,6 MB) → 72 WebP-Thumbs 256×256 (589 KB, Faktor 120× kleiner). - **UI-Anpassung:** `profil.html`, `schueler.html`, `teacher.html` laden alle Avatare aus `assets/img/avatars/thumbs/avatar-X.webp`. Originale bleiben als hochauflösender Fallback. ### 11.6 Lehrer-Cockpit Avatar-Sichtbarkeit + Save-Bug - **Bug 1:** `GET /api/profile` für Lehrer hat das Feld `emoji_avatar` nie geliefert → Reload zeigte immer Default-👩‍🏫 → wirkte wie „nicht gespeichert". - **Fix:** [`profile.php:18`](App/php/api/profile.php#L18) SELECT erweitert um `emoji_avatar`. - **Bug 2:** `selectAvatar()` aktualisierte nur den Profil-Button, nicht die Topbar-Pille. - **Fix:** `selectAvatar()` in profil.html sucht jetzt drei Selektoren parallel (`#user-emoji`, `#user-pill .emoji`, `.user-pill .emoji`), nutzt Cache-Buster (`?v=Date.now()`) damit Browser frisches Image lädt. Funktioniert für Schüler*innen + Lehrkräfte. ### 11.7 Fleißmessung Toggle: Klasse-gesamt ↔ pro Schüler*in - **Backend** (`results.php` Endpoint `view=activity`): neuer Parameter `groupBy=module|student`. Pro-Student-Modus joined `student_sessions` → `students` (Verknüpfung über `class_id + display_name`, weil assessments nur `session_id` hat). - **Frontend:** Toggle-Button neben Tag/Woche/Monat/Jahr. Card-Überschrift wechselt mit. Tooltip in der Bar zeigt korrekten Namen. - **Bug-Fix dabei:** Mein erster Wurf hatte `a.user_id` — die Spalte gibt's nicht in assessments → HTML-PHP-Warning statt JSON → SyntaxError im Frontend. Korrekter Join über `student_sessions`. ### 11.8 Sonnensystem Lehrer-Drilldown — Detail-Verbesserung - In teacher.html `openStudentRuns()`: bei `_modDetail.moduleId === 'sonnensystem'` werden jetzt Sessions geclustert (analog Schüler-Eigen-Verlauf). - Jede Session als eigene Karte mit orange/grün-Border, aufklappbar. ### 11.9 Avatar-URL-Refactor (alle 4 HTML-Files) - `avatarUrl(slug)` → liefert Thumb-Pfad (`thumbs/avatar-X.webp`), `avatarFullUrl(slug)` → liefert Original-Pfad. - `schueler.html`, `teacher.html`, `profil.html`: hardcoded `assets/img/avatars/avatar-X.png` global ersetzt durch `assets/img/avatars/thumbs/avatar-X.webp`. - `.png` → `.webp` für 8 Stellen in teacher.html (Live-View, Drilldown, Ergebnisse-Tab, Lizenzen-Tab, Klassen-Tab). **Test-Skript Ergänzungen (post-deployment to TEST):** - [ ] geograsim.at/profil → 6 Gruppen × 12 Avatare sichtbar, mit Namen als Label. - [ ] Klick auf Avatar → Pille rechts oben aktualisiert sofort (auch beim Lehrer). - [ ] Reload nach Avatar-Wahl: Lehrer behält den gewählten Avatar. - [ ] Schüler → Profil-Tab → Sonnensystem-Karte: pro Session statt 20 Karten, orange/grün-Border, klick öffnet Details. - [ ] Lehrer → Ergebnisse-Tab → Schüler-Drilldown auf Sonnensystem: gleiche Session-Logik. - [ ] Lehrer → Ergebnisse → Fleißmessung: Toggle „Nach Modul" / „Nach Schüler*in" funktioniert. - [ ] Energiemanager → Onboarding: 4 erzählende Schritte, kein Stichpunkt-Stil. - [ ] Energiemanager → ⚡-Tachometer klick: Wechselstrom-Erklärung sichtbar. - [ ] Energiemanager → Set-Ende: Modal lässt sich mit „Schließen" UND „Weiter" klicken (war ReferenceError). - [ ] profil.html als Lehrer: Tab-Bar oben sichtbar mit 7 Cockpit-Tabs. --- ## 9) Folge-Fixes aus lokalem Test (Thomas-Reports) ### 9.1 Bug: Stadt wiederholt sich innerhalb einer Tour - **Beobachtung:** Lissabon zweimal kurz hintereinander in einer Tour. - **Ursache:** Im Pool gibt es pro Stadt mehrere Auftragstypen (A/B/C/D) mit derselben `cityId`. Der alte Filter blockierte nur DIREKTE Wiederholung — Lissabon → Porto → Lissabon war erlaubt. - **Fix (Bus + Flug Engine):** Dreistufiger Filter — bevorzugt Städte, die noch GAR NICHT in der Tour sind. Bei 16 Tour-Aufträgen aus 42+ unique Städten ist das problemlos erfüllbar. **Test:** - L1-Tour spielen → jede Stadt taucht maximal einmal als Ziel auf. - Mit kleinem Pool (z.B. wenn nur 1 Stadt übrig) greift Fallback auf alten Filter. ### 9.5 Glossar-Link 404 — falscher Pfad - **Beobachtung:** Glossar-Links in Event-Sachinfo zeigten auf `../../glossar.html?slug=X` → Browser löst von URL `/busfahrt` auf `/glossar.html` → 404. Plus: Parameter heißt `term`, nicht `slug`. - **Fix:** Neuer Helper `glossarHref(slug)` baut Pfad aus `window.BUSFAHRT_BASE`, nutzt extension-less Route + korrekten Parameter `?term=`. Funktioniert lokal (`/geograsim/App/glossar`) + production (`/glossar`). ### 9.6 Realismus-Bug: keine Fähren/Tunnel/Sondermaut - **Beobachtung:** München → Manchester ohne Eurotunnel-Kosten. Reykjavik → Amsterdam ohne Fähre. - **Fix:** Neue Funktion `computeCrossingFee(fromCountry, toCountry)` in der Engine deckt 7 typische europäische Übergänge ab: - **UK ↔ Festland** (Kanaltunnel / Fähre Calais-Dover, ~320 €) - **Italien ↔ Frankreich** (Mont-Blanc-Tunnel, ~280 €) - **Österreich ↔ Italien** (Brenner-Sondermaut, ~45 €) - **Schweden ↔ Dänemark** (Öresundbrücke, ~250 €) - **Frankreich ↔ Schweiz** (CH-Zoll-Stichprobe + LSVA, ~40 €) - **Island ↔ Festland** (Norröna-Fähre Hirtshals-Tórshavn-Seyðisfjörður, ~520 €) - **Irland ↔ UK / Festland** (Stena Line ~150 € / Direktfähre ~290 €) - **Norwegen ↔ Festland-EU** (EFTA-Stichprobe + Bompenger, ~35 €) - **Report-Felder erweitert:** `crossingFee`, `crossingLabel`, `crossingSachinfo`, `crossingGlossar`. In `settleOrder` direkt von der Marge abgezogen. - **UI:** Neue Crossing-Box in der InfoCard (`bf-crossing`, blau hervorgehoben, beim ersten Mal aufgeklappt) zeigt Label, Sachinfo-Text und Glossar-Link. In Buchhaltung als eigene Zeile mit −Betrag. - **Glossar:** 4 neue Einträge: `norroena-faehre`, `kanaltunnel`, `mont-blanc-tunnel`, `oeresundbruecke`. ### 9.7 UK-Hinweis im Quiz-Feedback - **Beobachtung:** Schüler*innen kennen „Großbritannien" — UK / „Vereinigtes Königreich" verwirrt. - **Fix:** Beim Quiz-Erfolg mit Antwort „Großbritannien" wird zusätzlich erklärt: „Das Land heißt offiziell auch ‚Vereinigtes Königreich' (UK = United Kingdom). ‚Großbritannien' ist eigentlich nur die Insel mit England, Schottland und Wales — Nordirland gehört auch zum UK, ist aber auf der anderen Insel." ### 9.2 Inhalts-Korrektur: „Vereinigtes Königreich" → „Großbritannien" - **Beobachtung:** Quiz „In welchem Land liegt Manchester?" → Antwort „Vereinigtes Königreich". Korrekt, aber für Sek I-Schüler*innen ungewohnt. - **Hintergrund:** „Vereinigtes Königreich" (UK = Großbritannien + Nordirland) ist politisch präzise. „Großbritannien" ist im Schulalltag vertrauter. - **Fix:** `country: "Vereinigtes Königreich"` → `"Großbritannien"` in cities.json (Bus 2 Städte: London + Manchester, Flug 0 Städte). Alle Quiz-Choices (auch Distraktoren in anderen Stadt-Fragen) wurden mit-gepatcht. - **Bewusste Ausnahme:** Glossar-Eintrag `eu-aussengrenze` behält „Vereinigtes Königreich (UK, seit Brexit 2021)" — dort ist der politische Kontext relevant. **Test:** - Quiz zu London/Manchester → Choices zeigen „Großbritannien" - Andere Fragen mit UK als Distraktor → ebenfalls „Großbritannien" --- --- ## 10) Folgeiteration 2026-05-31 (UI/Onboarding) ### 10.1 Profil-Seite: Schüler-Navigation - profil.html bekommt Tab-Bar (Module / Erfolge / Profil), nur sichtbar für Schüler*innen. - „Meine Erfolge"-Link → `schueler.html#achievements`; Hash-Listener in schueler.html aktiviert den Tab. ### 10.2 Sonnensystem-Eigen-Verlauf: Sessions statt 20 Karten - Bug: jeder gelöste Task war eine eigene Karte → 20+ Karten pro Tour. - Fix: `groupSonnensystemSessions(runs)` clustert task_solved + set_complete zu Tour-Sessions (1h-Gap oder set_complete schließt ab). - **Orange linke Seitenleiste** = Teil-Durchlauf (abgebrochen), **grün** = abgeschlossen. - Aufklappbare Details: Zeitraum, Liste gelöster Aufgaben + Mehrfachversuche, neue Achievements. - CSS: `.ownruns-card--complete` (grün), `.ownruns-card--partial` (orange). ### 10.3 Profil-Avatare: 72 Avatare (6 × 12) + Namen + 3 neue Gruppen - **Gruppen erweitert von 3×10 = 30 auf 6×12 = 72:** - Geo-Welt (12, internationale Nationen): + Ozeanographin (Linnea, NO), Tropenbiologe (Kwame, GH) - Cool & lustig (12): + Skaterin (Reni), DJ (Kofi) - Tier-Begleiter (12): + Tundra-Wolf (Yuki), Tiefsee-Krake (Otto) - **NEU Aliens erforschen die Welt** (12): Zorblax, Aquana, Tempest, Urbanix, Faunor, Floranth, Magmara, Glacium, Solara, Veridia, Altimos, Marinus - **NEU Berühmte Forschungsmaschinen** (12): Trieste (Piccard-Tauchboot), Graf Zeppelin, Charlière (1783), Fram, HMS Beagle, Halleysche Tauchglocke, Voyager 1, Vostok-Eisbohrer, Curiosity, Landsat, FS Meteor, Meteosat - **NEU Berühmte Forscher*innen** (12): Humboldt, Mercator, Cook, Marco Polo, Ibn Battuta, Nansen, Auguste Piccard, Amundsen, Earhart, Sylvia Earle, Mary Anning, Rachel Carson - **Datenmodell:** `AVATAR_GROUPS = [{name, color, items: [{slug, name}]}]`. - **Picker UI:** Bild + Name als Label darunter + Tooltip. Sektion-Header in Gruppen-Farbe. - **Fallback** bei fehlendem PNG: SVG-Initial-Kreis in Gruppen-Farbe (`makeAvatarFallback`). - **Memory:** [`reference_avatar_slugs.md`](file:///C:/Users/herr_/.claude/projects/c--xampp-htdocs-geograsim/memory/reference_avatar_slugs.md) komplett überarbeitet. **Wichtig:** 42 PNGs fehlen noch (DALL-E-Account-Limit). Bis dahin zeigt der Initial-Fallback. Sobald OpenAI wieder Generierung erlaubt → Skript-Stub anlegen mit den Prompts aus der Memory. ### 10.4 Energiemanager-Onboarding: Anwaltsbrief → erzählend - 4 Onboarding-Schritte komplett umgeschrieben — vollständige Sätze, vor allem Schritt 4 baut explizit auf dem Wechselstrom-Konzept auf. - Glossar-Links bleiben in den Texten verankert. ### 10.5 Energiemanager-Netzfrequenz-Info: Wechselstrom-Hintergrund - Glossar-Eintrag `netzfrequenz` (DB + lokales Fallback in game.html) komplett überarbeitet. - Erklärt: Wechselstrom + 50Hz + Chor-Metapher + Zusammenhang Erzeugung/Verbrauch + Toleranzbereich + automatische Schutzmaßnahmen + EU-weite Synchronisation Portugal–Polen. - Klick auf den Tachometer-Header öffnet jetzt diese ausführliche Erklärung statt des Drei-Satz-Stubs. **Test:** - Profil-Seite → Tab-Bar oben sichtbar, „Meine Erfolge" springt nach schueler.html zum richtigen Tab. - Profil → Avatar ändern → 6 Gruppen × 12 Avatare sichtbar, Namen als Label, fehlende PNGs zeigen Initial-Kreis (nicht kaputtes Bild). - Sonnensystem → Meine Erfolge → Karten pro Session statt pro Einzelaufgabe; orange für abgebrochene Tours, grün für abgeschlossene; Klick öffnet Details. - Energiemanager neu öffnen → Onboarding erzählerisch, ⚡-Tachometer klick öffnet Wechselstrom-Erklärung. --- ### 4.6 Bekannte Blocker (ALT, jetzt veraltet — siehe 7/8) - **Turbinen-Bild + residuallast-Bild Refresh:** DALL-E-3 weg, Account hat nur noch `gpt-image-*`-Familie + Billing-Hard-Limit erreicht. Erst lösbar nach OpenAI-Account-Anpassung durch Thomas. Beide Originale bleiben vorerst wie sie sind. --- ## 5) Modul Busfahrt — Zwischenfragen + Geld-Effekt + 2 Bugs ### 5.1 Zwischenfragen-Refactor: Frage bei JEDER Fahrt + Geld-Effekt - **Was vorher:** Nur Typ-B-Aufträge (~15 % der Tour) hatten eine Hauptstadt-Multiple-Choice — ohne Geld-Effekt, nur als „Filter" für den Karten-Tap. - **Was jetzt:** Bei JEDEM Auftrag ein Quiz VOR dem Karten-Tap. - Typ B unverändert (Hauptstadt-Frage, Stadtnamen als Choices). - Typ A/C/D: generierte Land-Frage „In welchem Land liegt X?" aus `cities.json`. - **Geld-Effekt** (neue ECON-Werte): - Richtig beim 1. Versuch → **+50 € Bonus** - Jede falsche Antwort → **−50 € Strafe** (endlos probierbar, wird teuer) - **Buchhaltung:** Quiz-Bonus / -Strafe wird in der InfoCard-Tabelle separat ausgewiesen, ist Teil der angezeigten Tour-Marge. - **Endscreen:** neue Zeilen „Quiz richtig auf 1. Versuch: X / N" und „Quiz-Bonus / -Strafe". Fahrtenbuch zeigt 🧠-Badge pro Tour. - **Daten:** Generator `App/sims/busfahrt/scripts/generate-city-questions.py` legt pro Stadt eine `question` an. Re-runnable, überschreibt nicht. - **Files:** `engine.js` (neue Funktion `evaluateQuestion`, erweiterte `nextOrder` + `settleOrder`), `game.html` (showChoiceModal generischer, neue Quiz-Logik), `cities.json` (+144 question-Einträge). **Test:** - Tour starten → erste Frage erscheint (egal welcher Auftragstyp). - Bei richtiger 1.-Antwort: Topbar-Budget +50 €, Feedback „+50 € Bonus". - Bei falscher Antwort: Topbar −50 €, Feedback „−50 € Strafe", weiter probieren. - Auftrag abschließen → InfoCard zeigt Quiz-Zeile in Buchhaltung. - Tour-Ende → Endscreen zeigt „Quiz richtig auf 1. Versuch: X / N" + Bonus/Strafe-Summe. ### 5.2 Salzburg-Text Korrektur - War: „im Westen Österreichs an der Salzach" - Jetzt: „in der Mitte Österreichs an der Salzach, nahe der deutschen Grenze und am Rand der Alpen" ### 5.3 Schüler-Link 404 Bug - War: `href="/schueler"` → lokal 404 (lokaler BASE_PATH ist `/geograsim/App`). - Jetzt: `href="../../schueler.html"` (relativer Pfad, funktioniert lokal + Production). - Zwei Stellen: Topbar-🏠-Button + End-Overlay-„Zur Übersicht"-Button. ### 5.4 Bekannte Schwäche (TODO F1 in busfahrt/TODO.md) - Generator-Distraktoren sind **zufällig** aus 98 Ländern gewählt → didaktisch oft zu leicht (z.B. „Wien: Japan / Malaysia / Österreich"). - Plan F1: plausiblere Distraktoren (Nachbar-/Kontinent-Logik). - Plan F2: für ~20–30 Sensationsstädte eine zusätzliche kuratierte Frage (Fluss, Berg, Wahrzeichen). - Plan F3: Easy-Sprache der Fragen separat formulieren. - Plan G1: Reykjavik / Island-Anreise didaktisch ausschmücken (Norröna-Fähre). **Online-Test-Skript Ergänzungen (post-deployment to TEST):** - [ ] geograsim.at/busfahrt → Tour starten → bei JEDEM Auftrag Quiz vor Karten-Tap - [ ] Quiz-Bonus / -Strafe in Topbar und Buchhaltung sichtbar - [ ] Endscreen zeigt Quiz-Summen + 🧠-Badges im Fahrtenbuch - [ ] 🏠 Schülerseiten-Button funktioniert (kein 404) - [ ] End-Screen Button „Zur Übersicht" landet auf schueler.html (kein 404) - [ ] Salzburg im InfoCard sagt „in der Mitte Österreichs" --- ## 6) Busfahrt 3-Level-Refactor + Fluggesellschaft-Skelett ### 6.1 L3-Aufträge umgelabelt auf L4 (53 Stück) - **Migrations-Skript:** `App/sims/busfahrt/scripts/relabel-l3-to-l4.py` (idempotent). - **Vor:** 53 außereuropäische Aufträge (USA 6, Brasilien 6, Kanada 5, Australien 4, Südafrika 5, Marokko 3, Ägypten 3, …) liefen als L3 im Bus-Pool. - **Nach:** Alle als `level: "l4"` markiert. Im Busfahrt-`filterPoolByLevel` explizit ausgeschlossen — L3 nutzt jetzt nur den kumulierten L1+L2-Pool (106 europäische Aufträge). - **Reservat-Zweck:** Daten bleiben in `busfahrt/orders.json` als Reservat für das neue Fluggesellschaft-Modul. ### 6.2 Busfahrt Engine: ECON pro Level - `tapToleranceKm`, `nightFirst`, `nightChanceAfter`, `quizBonusFirstTryEur`, `quizPenaltyPerWrongEur` sind jetzt pro-Level-Objekte `{l1, l2, l3}`. - Neue Helper-Funktion `econ(key, levelId)` löst auf, mit Fallback auf l1. - Werte: | | L1 | L2 | L3 | |---|---|---|---| | Tap-Toleranz | 10 km | 10 km | **5 km** | | Nachtfahrt-Start (0-basiert) | ab #6 | ab #4 | **ab #2** | | Nachtfahrt-Chance danach | 20 % | 30 % | **90 %** | | Quiz-Bonus richtig 1. Versuch | 50 € | 75 € | 100 € | | Quiz-Strafe pro Fehlversuch | 50 € | 75 € | 100 € | | Tour-Länge | 16 | 20 | 24 | | Tour-Ziel | 8.000 € | 20.000 € | 35.000 € | **Begründung L3 = „Erfahrene:r Buslenker*in":** 90 % Nacht (kein Navi) + halbe Tap-Toleranz + Quiz teuer. Pool bleibt L1+L2 — keine neuen Daten nötig, keine neue Mechanik. **Test:** - L1 starten: 16 Aufträge, mild, ab #6 Nacht. - L2 starten: 20 Aufträge, schon ab #4 Nacht, mehr Quiz-Geld. - L3 starten: 24 Aufträge, ab #2 fast nur Nacht, 5-km-Toleranz, 100-€-Quiz. ### 6.3 Fluggesellschaft-App — Skelett gegründet - **Pfad:** `App/sims/fluggesellschaft/` (README + leerer `assets/data/`) - **Inbox:** `App/sims/_inbox/fluggesellschaft/_status.md` - **Memory:** `project_fluggesellschaft_state.md` (Index in MEMORY.md ergänzt) - **Status:** Konzept-Phase. Kein Code, nur Doku. - **README enthält:** Begründung warum eigenes Modul, Mechanik-Tabelle (Bus vs. Flug), Wiederverwendungs-Liste aus Busfahrt, Asien-Lücke als TODO. **Hier ist nichts zu testen** — neuer Ordner, leer. **Folgeschritte (nächste Iteration):** 1. L4-Aufträge aus busfahrt/orders.json migrieren → fluggesellschaft/orders.json 2. Engine-Stub: Großkreis-Routing statt OSRM 3. UI-Stub: game.html minimal-Klon 4. Asien-Daten ergänzen (Tokio, Peking, Delhi, Bangkok, Singapur, Seoul, Jakarta) 5. Splash-Bild via DALL-E (BLOCKIERT durch OpenAI-Limit)