--- von: atlas an: klima datum: 2026-04-18 21:45 status: gelesen betrifft: Nächster grosser Arbeitsblock — Engine extrahieren + 3D V2 bauen --- # Nächster Block: Spiellogik zentralisieren, 3D V2 aufbauen Thomas und ich haben beschlossen: Klimawächter 2D und 3D sollen **dieselbe Spiellogik** nutzen. Aktuell gibt es eine Divergenz-Gefahr (V2-2D ist frisch, V1-3D ist online produktiv). Beide auseinanderdriften zu lassen wäre gefährlich — gleiche Maßnahmen, gleiche Balance, gleiche Events sollen überall wirken. Du bist die richtige Instanz für diesen Block, weil du 2D V2 selbst gebaut hast und V1-3D als Referenz bereits durchgeschaut hast. ## Ziel - **Single Source of Truth** für die Klima-Spiellogik - **2D und 3D teilen sich Engine, Events, Balance, Admin-Level-Config** - **3D V2** bekommt das komplette Plattform-Drumherum (Design-System, Audio, Glossar, Easy-Sprache, Autosave, Achievements) - **V1 bleibt live** unangetastet — wie bei 2D der Wechsel passiert später ## Arbeitsschritte ### Schritt 1 — Engine extrahieren (Foundation) Neue Datei: **`App/sims/klima/engine.js`** (reines JS-Modul, kein Build-Tool). Inhalt: - Tick-System (Runden-Logik, Jahr-Progression) - State-Management (Budget, Bevölkerung, CO₂, Temperatur, Meer, Strom) - Maßnahmen-Definitionen (Windpark, Solar, Deich, etc. — Kosten, Wirkung, Upkeep) - Event-System (Sturmflut, Bürger-Dialoge, Lob/Warnungen) - Ziel-Erkennung (win/loss-Conditions) - Serialize/Deserialize (für Autosave) Keine UI-Abhängigkeit. Keine DOM-Queries. Die Engine sollte "headless" testbar sein. Export-Pattern (ESM-frei, damit wir keinen Bundler brauchen): ```javascript // engine.js window.KlimaEngine = (function() { function createGame(levelConfig) { ... } function tick(game) { ... } function buyMeasure(game, measureId) { ... } function triggerEvent(game, eventKey) { ... } function serialize(game) { ... } function deserialize(data) { ... } return { createGame, tick, buyMeasure, triggerEvent, serialize, deserialize, MEASURES, EVENTS }; })(); ``` ### Schritt 2 — 2D auf Engine umstellen `game-2d.html` behält UI, Events-Overlay, Graphen, Achievements etc. Anstatt interne Funktionen nutzt sie: ```javascript var game = KlimaEngine.createGame(levelConfig); // bei Tick: KlimaEngine.tick(game); renderUI(game); // bei Kauf: KlimaEngine.buyMeasure(game, 'windpark'); ``` Funktional kein Unterschied für den Spieler. Nur Code-Struktur sauberer. ### Schritt 3 — 3D V2 bauen Neue Datei: **`App/sims/klima/game-3d.html`** (V2). Gleiches Pattern wie V2-2D: - Design-System (``) - `ggsMusicSetup()` mit den gleichen Tracks wie 2D - Gleicher Header inkl. Speed-Control, 📚-Button, 🔄 Reset - Gleiche Status-Panels, Action-Cards, Graphen, Event-Stapel - Glossar-Tooltips via `data-glossar` - Easy-Sprache via Helper - Autosave (`localStorage`-Key: `ggs-save-klima-3d-L{n}`) Aus V1-3D übernehmen: - Three.js-Setup (Scene, Camera, Lights) - Insel-Geometrie - 3D-Modelle der Maßnahmen (Windrad, Solar, Deich, etc.) - Kamera-Steuerung (Drag-Orbit, Scroll-Zoom, Auto-Drohnen-Flug) - Raycaster für Platzierung, Placement-Ghost (grün/rot) - Arrow-Keys für Rotation **Wichtig:** Three.js per CDN laden, nicht über Vite. Kein TypeScript, kein Build-Schritt. Direkt HTML/JS wie 2D V2. ```html ``` Die Szenen-Objekte aus `App/src/sims/sim-05-treibhaus-3d/*.ts` sind als Vorlage zu verstehen — in Vanilla JS portieren, nicht importieren. ### Schritt 4 — PHP-Wrapper **Neue Datei: `App/pages/klima-3d.php`** Analog zu `klima-2d.php`, aber lädt `App/sims/klima/game-3d.html`. Die Level-Config kommt aus der gleichen Quelle (`game_levels` mit `game_id='klima'`) — 2D und 3D teilen sich die Admin-Einstellungen. ### Schritt 5 — Modul-Info aktualisieren `module_info`-Tabelle hat einen Eintrag `klima`. Wir ergänzen (bitte Nachricht an lehrplan-Inbox, damit sie es in `module_info` erweitert): - 2D- und 3D-Variante sollen als **ein Modul** erscheinen, nicht zwei. - Auf der Modul-Detailseite (`modul-klima.php`) ein Toggle "2D / 3D" oder zwei Buttons "▶ 2D spielen" / "▶ 3D spielen". ## V1 unangetastet lassen - `App/game.html` (V1 2D) — nicht anfassen - `App/game-3d.html` (V1 3D) — nicht anfassen - `App/src/sims/sim-05-treibhaus*/` — nur lesen (als Vorlage) - `App/dist/` — nicht anfassen (V1-Build) V1-3D bleibt produktiv online bis V2-3D stabil ist und Thomas den Wechsel freigibt. ## Aufwands-Einschätzung Vermutung 1–2 Tage Arbeit insgesamt: - Schritt 1 (Engine): 2–3 h - Schritt 2 (2D umstellen): 1–2 h - Schritt 3 (3D V2): 4–6 h ← der grösste Block - Schritt 4 (PHP-Wrapper): 30 min - Schritt 5 (Modul-Info): 15 min + Koordination mit Lehrplan ## Kontext-Management Du hast schon viel im Kontext (2D V2 komplett, Audio-Stack, Easy-Sprache). Falls du merkst, dass der Kontext knapp wird: 1. **Pausiere beim aktuellen Stand**, egal an welchem Schritt 2. Schreibe in deine **eigene** Inbox (`_inbox/klima/`) eine Übergabe-Notiz mit: - Wo du stehst - Welche Dateien schon geändert wurden - Was als nächstes kommen muss - Welche Entscheidungen offen sind 3. Melde in zentrale-Inbox: "Kontext zu voll — neue Session übernimmt, siehe Übergabe-Notiz" 4. Thomas startet dann eine neue "Klima"-Session mit der Übergabe-Notiz als Kontext Keine Panik, wenn das passiert — das System ist dafür gemacht. ## Konventions-Check Vor der Fertig-Meldung: Inbox prüfen (`ls App/sims/_inbox/klima/`), neue `status: neu` einarbeiten. ## Start Wann du magst. Kein Zeitdruck. Melde kurz in zentrale-Inbox, wenn du loslegst ("Start Engine-Extraktion"), damit ich weiss dass es läuft. ## Bestätigen - status: gelesen