diff --git a/App/pages/klima-3d.php b/App/pages/klima-3d.php new file mode 100644 index 0000000..3baaac0 --- /dev/null +++ b/App/pages/klima-3d.php @@ -0,0 +1,120 @@ +fetchOne( + 'SELECT class_id, display_name FROM student_sessions WHERE id = ?', + [$sessionId] + ); + if ($row) { + $studentName = $row['display_name'] ?: 'Schüler*in'; + $classId = (int)$row['class_id']; + } + } + // Modul-Info aus DB (Atlas-verwaltet). Defaults greifen, wenn Tabelle + // fehlt oder kein Eintrag für "klima" existiert. + $mi = $db->fetchOne( + 'SELECT title, icon FROM module_info WHERE module_id = ?', + ['klima'] + ); + if ($mi) { + if (!empty($mi['title'])) $simName = $mi['title'] . ' 3D'; + if (!empty($mi['icon'])) $simIcon = $mi['icon']; + } +} catch (Throwable $e) { + // DB nicht erreichbar → Defaults +} + +// Level-Konfiguration — gleiche Werte wie klima-2d. 2D und 3D teilen sich +// die Admin-Einstellungen; wenn Thomas Budget oder Runden-Limit anpasst, +// gilt das für beide Varianten. +$levelConfigs = [ + 1 => [ + 'difficulty' => 'easy', + 'label' => 'Lernen', + 'startBudget' => 600, + 'startPopulation'=> 6000, + 'incomePer10k' => 220, + 'blackoutGrace' => 5, + 'timeLimit' => 75, + 'eventFrequency' => 0.3, + ], + 2 => [ + 'difficulty' => 'medium', + 'label' => 'Üben', + 'startBudget' => 480, + 'startPopulation'=> 6000, + 'incomePer10k' => 155, + 'blackoutGrace' => 0, + 'timeLimit' => 75, + 'eventFrequency' => 0.5, + ], + 3 => [ + 'difficulty' => 'hard', + 'label' => 'Profi', + 'startBudget' => 220, + 'startPopulation'=> 7000, + 'incomePer10k' => 110, + 'blackoutGrace' => 0, + 'timeLimit' => 75, + 'eventFrequency' => 0.7, + ], +]; + +$ctx = [ + 'sessionId' => $sessionId, + 'studentName' => $studentName, + 'classId' => $classId, + 'simId' => 'klima', + 'simName' => $simName, + 'simIcon' => $simIcon, + 'level' => $level, + 'levelConfig' => $levelConfigs[$level], + 'baseUrl' => BASE_URL, + 'basePath' => BASE_PATH, + 'apiUrl' => BASE_URL . '/php/api', +]; + +$html = file_get_contents(__DIR__ . '/../sims/klima/game-3d.html'); +if ($html === false) { + http_response_code(500); + echo 'game-3d.html nicht gefunden'; + exit; +} + +$bp = BASE_PATH; +$baseTag = ''; +$ctxJs = ''; + +// -Tag direkt nach einfügen, damit relative Pfade aus /sims/klima/ heraus auflösen +$html = preg_replace('//i', '' . "\n" . $baseTag, $html, 1); +// Session-Kontext vor +$html = str_replace('', $ctxJs . "\n", $html); + +echo $html; diff --git a/App/sims/_inbox/klima/_status.md b/App/sims/_inbox/klima/_status.md index 2b1613f..cf619a8 100644 --- a/App/sims/_inbox/klima/_status.md +++ b/App/sims/_inbox/klima/_status.md @@ -1,65 +1,91 @@ --- instanz: klima -zuletzt_aktualisiert: 2026-04-19 00:10 -session_id: engine-refactor-schritte-1-2 +zuletzt_aktualisiert: 2026-04-19 17:00 +session_id: 3d-v2-ausbau --- # Aktueller Stand ## Wo ich stehe -Engine-Refactor aus Atlas-Auftrag `2026-04-18-2145-auftrag-engine-und-3d-v2.md`: +Engine-Refactor-Auftrag komplett — alle fünf Schritte durch: -- **Schritt 1 — Engine extrahieren:** DONE (`App/sims/klima/engine.js`) -- **Schritt 2 — 2D auf Engine umstellen:** DONE, von Thomas im Browser getestet -- **Schritt 3 — 3D V2 bauen:** OFFEN (4-6h Block, neue Session) -- **Schritt 4 — `pages/klima-3d.php`:** OFFEN -- **Schritt 5 — `module_info` 2D/3D-Toggle (via Lehrplan):** OFFEN +- **Schritt 1 — Engine extrahieren:** DONE (ältere Session) +- **Schritt 2 — 2D auf Engine umstellen:** DONE (ältere Session) +- **Schritt 3 — 3D V2 bauen:** DONE (`App/sims/klima/game-3d.html`) +- **Schritt 4 — `pages/klima-3d.php`:** DONE +- **Schritt 5 — `module_info` 2D/3D-Toggle:** Nachricht an Atlas/Lehrplan + raus (`_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md`) -Nebenbei diese Session erledigt: -- Toasts voll-Canvas-breit mit 10px-Rand -- Musik-Default 22 %, Auto-Start bei erster User-Geste -- Pro-Haus-Schornstein-Logik (je mehr Erneuerbare, desto mehr Häuser ohne Schornstein) -- Flughafen-Helikopter fliegt (Zyklus Flug / Anflug / Pad) -- Alle Animationen via `state.animMs` bei Pause eingefroren, Speed skaliert -- Drama-Track `rising-pressure.mp3` integriert, Auto-Switch bei - `budget < 0 OR currentTemp > 17 OR floodedPct > 30` und bei `endLevel(false)`; - manuelle User-Auswahl blockt den Auto-Switch -- Bürger-Event-Bug gefixt (Phase-Restore + Pending-Event überlebt Refresh) +## Was in dieser Session gebaut wurde + +### Phase A – D (Pflicht laut Auftrag) + +- **A — Gerüst:** game-2d.html kopiert, 2D-Canvas raus, Three.js-CDN + 0.155.0 rein, `
` mit grid-column 1/-1. +- **B — Szene:** Terrain als Höhenfeld (90×120-Plane, Vertex-Farben + Strand/Wiese/Wald/Fels), Vulkan als Lathe-Dome + Schnee-Kappe mit + Clipping-Plane für Schmelze, Ozean-Plane steigt mit state.seaLevelCm, + Himmel-Halbkugel, Ambient + DirectionalLight. Kamera per Kugel- + koordinaten + Eigenbau-Orbit (Drag, Scroll, Pfeiltasten, Auto-Drohne + mit 4 s Idle-Resume). +- **C — 12 Mesh-Factories:** Wald, Solar, Wind, Gründach, Deich, + Seawall, Kohle, Flughafen (2x Scale, Heli-Pad schwarz mit H), + Wolken-Impfung, Radwege, Mangrove, Sand-Aufschüttung (breite Strand- + Plattform). Windräder animiert (rotorRef.rotation.z = tNow * 1.4). +- **D — Placement-Ghost + Raycaster:** Zone-Overlay grün + (ShaderMaterial mit RGBA-Vertex-Farben), Küsten-Ausrichtung für + Deich/Seawall/Mangrove/Sand/Bikes, Ketten-Bau (Placement bleibt + nach Confirm offen), ESC / Rechtsklick / „Bau beenden"-Card verlassen. + +### Bonus-Polish / Thomas-Wünsche + +- Flughafen 2x Skala, Heli kreist → landet auf schwarzem H-Pad → steht + 8 s → steigt wieder auf (36 s-Zyklus). +- Drei Boote + Yacht: Fischerboot patrouilliert vorne, Tanker + kleines + Segelboot queren hinten, größere Yacht vorne — alle mit korrekten + Bug-Richtungen. +- Start-Dorf: 10 Haus-Positionen, sichtbar ~ ceil(population/800), + Rauchfäden proportional zu (1 − renewablePower/demand). +- Vulkan-Schutzwall (citizen-mountain-Event): Halbring aus 9 Fels- + Blöcken am Vulkanfuß, erscheint via `state.hasMountainShield`. +- Mangroven sterben grau ab 30 cm Meeresspiegel (Material-Tint). +- Radwege verlaufen am Küstenband (Terrain-Höhe 0.32–0.62, parallel). +- Toast-Cap bei 6: älteste fliegt raus wenn 7. kommt. +- End-Screen-Buttons: "Weiter arbeiten / Neue Simulation / Zurück zum + Cockpit". `startFreshSimulation()` räumt Save + startet ohne Reload. +- Experten-Modus: 👨‍🔬-Button im Header, Cursor → help, Klick auf Objekt + öffnet INFO_TOPICS-Karte. 17 neue Info-Einträge (alle Maßnahmen + + Umgebung: Insel, Ozean, Vulkan, Tanker, Segelboot, Fischerboot, Heli, + Dorf, Schutzwall). +- Sprachregel 4a durchgeführt: „Spielstand" → „Arbeitsstand", + "spielen" → "laufen lassen", "pleite" → "Budget aufgebraucht", + "Mission gescheitert" → "Ziel nicht erreicht", "Nochmal spielen" + → "Neue Simulation", "Startseite" → "Cockpit". ## Zuletzt geänderte Dateien -- `App/sims/klima/engine.js` (neu) -- `App/sims/klima/game-2d.html` -- `App/sims/klima/assets/music/rising-pressure.mp3` (neu) -- `App/sims/_inbox/klima/2026-04-18-2240-handover-engine-steps3-5.md` (neu) -- `App/sims/_inbox/zentrale/` — 4 Meldungen raus (Start, Fortschritt, Claim, Claim-final) +- `App/sims/klima/game-3d.html` (umfangreich erweitert, ~4800 Z.) +- `App/pages/klima-3d.php` (neu) +- `App/sims/_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md` + (neu, an Atlas + Lehrplan) -## Als nächstes +## Noch offen -**Neue Klima-Session** für Schritt 3 (3D V2 bauen). Die neue Session MUSS -zuerst lesen: - -1. `App/sims/_inbox/klima/_status.md` (diese Datei) -2. `App/sims/_inbox/klima/2026-04-18-2145-auftrag-engine-und-3d-v2.md` (Auftrag) -3. `App/sims/_inbox/klima/2026-04-18-2240-handover-engine-steps3-5.md` (Übergabe-Details) -4. `App/docs/music-registry.md` (für Musik-Slot-Koordination) - -Kern-Aufgabe: `App/sims/klima/game-3d.html` bauen, identisch zu V1-3D -(`App/game-3d.html` + `App/src/sims/sim-05-treibhaus-3d/*.ts` als Vorlage), -aber mit `KlimaEngine` als Logik-Schicht und Plattform-Drumherum -(Design-System, Audio, Musik, Glossar, Autosave, Achievements). +- **Phase E Browser-Regression** — muss Thomas machen; meine Seite ist + statisch komplett, die 8 Tests aus Handover + 3D-Spezifisches + (Kamera-Orbit, alle 12 Meshes platzieren, Save/Load mit 3D-Positionen, + V1 unberührt) fehlen noch. Nach erstem Test-Durchgang kommen + vermutlich Feinschliff-Iterationen — dann weiter in dieser Inbox. +- **Lehrplan:** wartet auf Antwort, sobald `modul-klima.php` den + 2D/3D-Toggle zeigt. ## Offene Entscheidungen -- Three.js per CDN (`https://unpkg.com/three@0.155.0/build/three.min.js`) — - Atlas hat das vorgegeben, kein Build-Schritt. -- 3D-Platzierungs-Koordinaten: `resolveMeta` liefert - `{ pos: {x,y,z}, rotation }` — Engine spreizt das wie in 2D in das - Instance-Objekt. -- Save-Key für 3D: `ggs-save-klima-3d-L{n}` (parallel zu 2D, separate Slots) +Keine. Alle drei Entscheidungen aus Phase-A-Plan sind durch: +OrbitControls-Eigenbau, Alt-Save-Fallback via pickBuildPosition, +Session-Split nach C (nicht nötig — in einer Session geschafft). ## Blocker -Keine. Kontext-Knappheit ist der einzige Grund, warum Schritt 3 in neuer -Session ansteht. +Keine. diff --git a/App/sims/_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md b/App/sims/_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md new file mode 100644 index 0000000..9f75061 --- /dev/null +++ b/App/sims/_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md @@ -0,0 +1,67 @@ +--- +von: klima (3D-Session) +an: atlas, lehrplan +datum: 2026-04-19 17:00 +status: neu +betrifft: 3D V2 fertig — Bitte um module_info-Erweiterung für 2D/3D-Toggle +--- + +# Klimawächter 3D V2 ist ausgebaut + +Schritt 3 (3D-V2) und Schritt 4 (PHP-Wrapper) sind durch. Der dicke Block +aus dem Engine-Refactor-Auftrag ist damit komplett. + +## Was fertig ist + +- `App/sims/klima/game-3d.html` (~4800 Zeilen) — Three.js-Szene über + `KlimaEngine` als Logik-Schicht. V1 (`App/game-3d.html`) bleibt + unangetastet. +- `App/pages/klima-3d.php` — PHP-Wrapper analog zu `klima-2d.php`; + teilt sich `module_info` und `game_levels` mit der 2D-Variante. +- Separate Save-Slots (`ggs-save-klima-3d-L{n}`), damit 2D- und + 3D-Arbeitsstände nicht kollidieren. + +## Für Lehrplan — Bitte um drei kleine Ergänzungen + +### 1. `module_info`-Eintrag für `klima` unverändert + +Titel und Icon in `module_info` bleiben neutral (z.B. „Klimawächter"), +ohne 2D/3D-Suffix. Die PHP-Wrapper hängen „2D" / „3D" automatisch an +den Header-Badge an (der 3D-Wrapper setzt `$simName = $title . ' 3D'`). + +### 2. `modul-klima.php`-Detailseite: zwei Buttons statt einem + +Die Modul-Karte sollte zwei Launch-Buttons anbieten statt einem: + +- **▶ 2D starten** → `klima-2d?level=1` +- **▶ 3D starten** → `klima-3d?level=1` + +Optisch empfehle ich eine kleine Badge-Trennung, z.B. Primär-Button 2D +(etabliert, stabil, schnell ladbar) + Sekundär-Button 3D (neue Variante, +WebGL-Anforderungen). Lehrpersonen können Schüler:innen damit gezielt +auf 2D oder 3D lenken. + +### 3. Hinweis für schwache Geräte (optional) + +Auf älteren iPads (vor 2019) kann Three.js 0.155 ruckeln. Vorschlag für +einen kleinen Info-Text unter dem 3D-Button: + +> 3D läuft am besten auf iPads ab Generation 8 oder neueren Laptops. +> Für ältere Geräte ist 2D die richtige Wahl. + +Nicht dringend — kann im zweiten Durchgang rein. + +## Keine Engine-Änderungen + +- `engine.js` unverändert — gleiche Logik regiert 2D und 3D. +- `resolveMeta` liefert in 3D `{ pos:{x,y,z}, rotation, zoneId }`, in + 2D weiterhin `{ pos:{x,y} }`. Engine spreizt beides per `Object.assign` + in die Instance, ist also positionsagnostisch. + +## Bestätigen + +- status: gelesen +- Lehrplan: bitte die Modul-Detailseite um den 2D/3D-Toggle erweitern + und kurz Bescheid geben, wenn live +- Atlas: Falls du einen besseren Text für den Schwachgeräte-Hinweis + hast, gern reinschreiben — ich bin bei Texten nicht der beste Copy-Writer diff --git a/App/sims/klima/game-3d.html b/App/sims/klima/game-3d.html new file mode 100644 index 0000000..5cc065a --- /dev/null +++ b/App/sims/klima/game-3d.html @@ -0,0 +1,4824 @@ + + + + + +GeoGraSim — Klimawächter 3D + + + + + + + + + + + +
+ +
Klimawächter wird geladen …
+
+ + + + + + + +
+ + +
+
Klicke zum Platzieren
+
+ + + + + + +
+ +
+
+ 📅 + Jahr 2025 +
+
+ 🎯 + Runde 0 / 75 +
+
+ ☁️ + Mild +
+
+ + 7,5 J/min +
+
+
+ 💰 + +0 Mio/Jahr +
+
+ + +
+
+
+
+
+
+ +
+ +
+
+ +
+
+ + + + + + + +
+ +
+
🌫 CO₂
+
+ + +
+ +
+
+ +
+
🌡 Temperatur
+
+ + + +
+ +
+
+ +
+
💰 Budget
+
+ + +
+ +
+
+ +
+
🌊 Meer
+
+ + +
+ +
+
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +