- Neue Datei: App/sims/klima/plane-test.html
Three.js-Sandbox mit dem makePlane-Mesh, Slidern für rotation.x/y/z,
Achsen-Helper (X rot, Y grün, Z blau), großem roten Pfeil als
Bewegungsrichtung (+X), "Flug simulieren"-Button und "Werte kopieren".
Thomas kann damit die korrekte Flug-Rotation finden und zurückmelden.
- Airport-Ausrichtung: finalizeBuy überschreibt die zufällige
placementRotation bei id='airport' mit atan2(-dz, dx) zum Vulkan —
Runway (lokales +X) zeigt nun IMMER vom Vulkan weg, Start und
Landung über Ozean statt Bergflanke.
- airportLocalToWorld: Vorzeichen an Three.js-Konvention angeglichen
(x_w += lz·sinR, z_w -= lx·sinR), damit rotierte Airports ihre
internen Offsets korrekt in Welt-Koordinaten übertragen.
- Plane-Zyklus: +60 s Grund-Offset entfernt, Flugzeug ist bei
Airport-Bau sofort sichtbar (Phase 0 = parken auf der Runway).
Test-URL: http://localhost/geograsim/App/sims/klima/plane-test.html
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- ggsMusicResetToDefault: neuer Helper springt auf den ersten Track im
Dropdown. Wird in startGame aufgerufen, damit Drama-Musik aus dem
Endscreen eines vorherigen Durchgangs nicht ins neue Level hinüber-
läuft (erklärt, warum 'Drama im laufenden Spiel' lief).
- camera.lookAt: von (0, 0.5, 0) auf (0, 2.8, 0) angehoben → Insel
rutscht im Bild ~10 % nach unten, oben mehr Himmel/Dunst-Wolken.
- Drohnen-Toggle 🚁 im Header: neuer droneEnabled-Flag. Aus =
Auto-Orbit ist dauerhaft gestoppt (nur Maus-Drag bewegt Kamera).
Ein = Idle-Timeout resumed wie bisher. Button zeigt aktiven
Zustand über opacity + .active-Klasse.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Airport-Fahrzeuge: pro Flughafen eigener Heli + Flugzeug, in
airportVehicles-Map verwaltet, über syncMeasureMeshes mit-synchronisiert.
Phasen-Offsets per Airport-Index, damit mehrere Flughäfen nicht
synchron laufen.
- Heli: landet jetzt korrekt auf dem H (padLocal aus userData statt
hardcoded, inkl. LIFT-Korrektur). Alle ~3 Zyklen (deterministisch)
Vulkan-Runde statt Airport-Kreis — Radius 9 um VOLCANO_X/Z.
- Flugzeug (makePlane, low-poly Cessna): 110-s-Zyklus — parkt am
Runway-Anfang, Takeoff-Roll, Climb-Out nach -X, 50 s unsichtbar
(Reise), Approach, Landing-Roll, Taxi. Propeller dreht.
- Wolken: Höhe auf ~7 abgesenkt (Vulkan-Gletscher-Höhe), fühlen sich
jetzt wie Dunst um den Kegel an statt Himmels-Schleier.
- Flut-Tönung: applyFloodTintAll lerpt Material-Farben aller Mesh-
Füße, die unter ocean.position.y liegen, Richtung Dunkelgrau und
kippt sie bis 0.12 rad. Wirkt auf Maßnahmen + Dorf + Citizen-Strand.
- Graph-Top = verloren: neu endLevel(false, 'co2-top' | 'temp-top')
wenn state.co2Ppm ≥ 700 oder state.currentTemp ≥ 19. Endscreen
bekommt passende Icons (🌫 / 🌡) und Titel.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Blackout fällt Bäume jetzt sichtbar: Baum kippt um (easeOut), Totenkopf
erscheint nach 1.8 s darüber, nach 3.2 s fadet alles weg. Animation
hängt an state.animMs → Pause friert ein. Totenkopf als Canvas-Texture
auf einem Billboard-Plane.
- simulateTick vergleicht Forest-Count vor/nach engine.tick; orphaned
Meshes werden aus placedMeshes gepullt und an fallenTrees übergeben,
damit syncMeasureMeshes sie nicht voreilig entfernt.
- Toast-Card pro Tick mit Holz-Fäll-Meldung (🪓 'Bewohner:innen fällen N
Bäume zum Heizen'), klickbar auf INFO_TOPICS.blackout.
- Solaranlage-Kauf: Toast mit Strom-Leistung (+1 MW) und Wartung
(2 Mio €/Jahr), analog zum Gründach-Hinweis.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Wolken am Himmel: 4 Dunst-Gruppen (je 3-5 Kugeln, transluzent), ziehen
vom +X Rand über die Insel Richtung Vulkan (−X, −Z-Drift). Eigene
Phase, Höhe, Zyklusdauer pro Wolke. updateClouds in updateAmbient.
- Airport-Plateau: von 3.4×1.55 auf 2.55×1.25 geschrumpft, nach +Z
versetzt (0.28). Endet knapp innerhalb der Runway, deckt aber
Terminal + Heli-Pad weiter ab.
- Pause-Zentrum: neue Card mit ▶-Symbol in der Mitte der Szene, sichtbar
bei state.speed === 0. Klick startet 1×-Speed. Glas-Optik, animation
bei Einblendung. Sync via updatePauseCenter in renderUI und bei jedem
Speed-Klick.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Jede Maßnahme hebt engine-seitig die Population-Obergrenze um 5 % der
Start-Bevölkerung (computePopulationGrowth.capBonus). Beim Gründach
machen wir das didaktisch explizit sichtbar: Toast-Card beim Kauf weist
auf neue Wohnungen, zuziehende Einwohner:innen und Touristen + höhere
Steuer-Einnahmen hin. infoKey=green_roof_info macht die Karte klickbar.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Radwege: snappen an bestehende Pfade an (Distanz 2.2, Spacing 92 %,
leicht überlappend). Rotation am NEUEN Mittelpunkt via coastRotation,
Kette folgt so der Küstenbiegung statt starre Linie.
- Start-Wald: 3 Bäume bei startGame pre-seeded (forest.instances mit
starter-Flag). Engine-Blackout-Logik fällt sie bei Stromausfall.
Toast 'Du startest mit 3 Bäumen ...' am Level-Start, klickbar auf
INFO_TOPICS.blackout.
- updateCrisisMusic: Edge-Detection pro Kriterium (Budget/Temp/Flood),
jeweils Toast-Card beim Übergang ins Kritische. Merker in startGame
zurückgesetzt.
- Airport: Plateau-Sockel (3.4×0.20×1.55 + dünne helle Oberkante), alle
Bauten um LIFT=0.24 angehoben. Hebt Airport sichtbar aus dem Terrain,
kein Versinken am Hang mehr. Heli-Pad-Offset folgt nach.
- Sand-Aufschüttung (Bau-Maßnahme): zurück zum reinen Lathe-Kegel
(Plattform + Gras raus). Kleiner, zurückhaltender Sand-Hügel wie
ursprünglich V1.
- Citizen-Event 'Strand aufschütten' (citizen-tourism): neuer
syncCitizenBeach → breiter flacher Sand-Streifen vorne am Ufer,
parallel zur Küste. Nur sichtbar wenn state.hasSandBeach gesetzt.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- engine.js als headless Single Source of Truth (KlimaEngine)
- game-2d.html nutzt engine (-515 Zeilen Duplikation)
- rising-pressure.mp3 als Drama-Slot, Auto-Switch bei kritischem State
- state.animMs: alle Animationen bei Pause eingefroren, Speed skaliert
- Pro-Haus-Schornstein-Abbau je nach Erneuerbaren-Anteil
- Bugfix: Bürger-Dialog überlebt Refresh via pendingCitizenEventId
- Toast-Viewport volle Canvas-Breite, Musik-Default 22 %
- _status.md Konvention eingeführt, Inbox-Nachrichten erhalten