- obs-open-btn (Aufgaben, Klemmbrett-Icon) + obs-help-btn (Onboarding,
Info-i-Icon) in den Header vor die Musik verschoben; obs-launcher weg.
- Redundantes help-toggle (moonTilt-?) aus dem Header entfernt, Handler
null-sicher (moonTilt weiter ueber Inline-? in der Mondbahn-Sektion).
- obs-Pill-CSS neutralisiert (Header-Stil greift).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Komponente: Tempo-Steuerung an erste Aktions-Position (ganz links),
Rest ans Ende.
- Region: 🔔/🐢/🎯 durch eigene SVG-Icons ersetzt (logBadge erhalten).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ursache 2x: Busfahrt zeigte sein eigenes #welcome-overlay UND das
GgsQuickIntro-Onboarding. Jetzt ist GgsQuickIntro das einzige Start-Gate:
- ggs-quick-intro: onStart-Callback (feuert einmal beim Schliessen bzw.
sofort wenn schon gesehen), isSeen exportiert.
- Busfahrt: welcome-overlay wird nicht mehr gezeigt; onStart -> startGame;
startGame wartet per Retry auf boot() (kein Timing-Problem).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ggs-quick-intro: open() entfernt vorab alle vorhandenen Overlays (nie 2x).
- Busfahrt: Neustart-Button (btn-reset, location.reload mit Rueckfrage).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ggs-quick-intro.js: optionale zweite Seite (config.page2 {title, html})
mit Weiter/Zurueck-Navigation. Rueckwaertskompatibel (ohne page2 = 1 Seite).
- Busfahrt: EN-Button entfernt; die "Warum Englisch?"-Erklaerung liegt jetzt
auf Onboarding-Seite 2 + Satz zur mehrsprachigen Hintergrundmusik.
- Onboarding-Schritte ohne lange "-" ausformuliert.
- Auftrags-Card (.bf-order) 20px tiefer (top 84).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
unten, eigenes Kartennamen-Icon
- Header wieder Vollbreite: Pille+Home links, Steuerung rechts.
- Auftrags-Card (.bf-order) + Info-Card (.bf-info) top 8 -> 64 (unter den
rechten Buttons, keine Ueberlappung).
- Beschriftung-ein/aus (black-map-toggle): eigenes Tag-SVG statt Emoji
(an = Tag, aus = Tag durchgestrichen), auch in applyTileVariant.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Header kompakt links (nicht mehr Vollbreite) -> keine Ueberlappung mit
der Auftrags-Karte oben rechts.
- Budget aus Header raus (widersprach dem Graph); Graph-Budget-Wert wird
jetzt live in updateTopbar aktualisiert. updateTopbar null-sicher.
- Auftrag-Nr ins Stats-Panel (links bei den Graphen).
- Leaflet-Zoom nach unten links.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ggs-topbar -> ggs-header (Vollbreite, klick-durchlaessig), Titel ohne
Emoji, Logo-Fallback, KPIs (Budget/Auftrag/Nacht) bleiben als Pillen,
eigener Musik-Player in #ggs-music gewrappt (Popup), Sim-Buttons
(Beschriftung/EN-Info) + Ton/Hilfe/Home + Plattform-Glossar. Keine
Elemente entfernt (alle IDs/onclicks erhalten).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ROOT CAUSE: #money-display aus Header entfernt, aber updateMoneyDisplay()
las es beim Boot ungeschuetzt -> null.textContent wirft -> Boot bricht ab
-> map.on('click') wird nie gebunden -> Sim unbedienbar. Jetzt null-safe.
Konsolidierung (Thomas-Wunsch): Jahr/Markt/Erntejahr-starten in die
Anbau-Versuch-Box (farmer-side-status) statt separater Jahr-Leiste;
Jahr-Badge aus der Pille raus. Anbau-Box wieder hoeher (top 64).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ursache: die transparente ggs-header ueber der Vollbild-Leaflet-Karte
fing alle Klicks ab -> Pflanzen unmoeglich. Fix zentral: Container
pointer-events:none, nur Bedienelemente pointer-events:auto (Karte
darunter bleibt bedienbar). Gilt fuer alle Karten/Canvas-Sims.
Farmer: Pille nach links (Vollbreite-Header, Steuerung rechts),
Leaflet-Zoom nach unten links verschoben.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Header nach oben RECHTS (raus aus dem Leaflet-Zoom oben links),
Geld-Anzeige entfernt (steht in linker Sidebar), Emoji aus Titel,
Jahr als Badge in die Pille (Konsistenz mit Batch 1), Inter-Font.
- Jahr-Leiste + Anbau-Versuch-Spalte nach unten geschoben (unter Header).
- Komponente: wiederverwendbarer Default-Musikplayer (data-ggs-music,
Klima-Tracks als Plattform-Standard) + Musik-Widget-Styling fuer Sims
ohne design-system.css.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#stage jetzt inset:0 (Canvas bis ganz oben), Header position:absolute
transparent darueber. Obere HUD-Pillen + Minimap + Karten-Button unter
die Kopfzeile geschoben (top 14->64, btn-map 166->216).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Jede Sim liefert jetzt selbst leistung_pct in GGS_LIVE_STATE UND im Submit
(Fundament fuer das einheitliche %-System) — kein Rueckrechnen aus Sternen
mehr, keine 0-3-Sonderfaelle. Formeln je Sim wie vereinbart:
- klima/fluss/kofferdetektiv/heli: = vorhandener 0-100-score
- weltkueche: richtige/(richtige+falsche)*100 (Fehler in %)
- busfahrt/fluggesellschaft: topoPunkte/(Auftraege*3)*100
- farmer: gewichteter totalScore; energiemanager: ausgegl./gesamt -15/Blackout
- eu-werkstatt: firstTry/Schritte -5/Muelleimer; sonnensystem: Erstversuch-Quote
- tourismustal: Ziele+Zufriedenheit+Natur gewichtet; tourismusregion: gewichteter score
- logistik: Kontostand->% (sendet erstmals eine Kennzahl, auch an /api/assessment)
Teacher _leistungPct + live.php extractScore bevorzugen bereits diesen Wert.
Additive Aenderungen, bestehende Logik/Sterne unveraendert; alle 15 Dateien
syntaktisch geprueft.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Nur auf Touch-Geraeten (Desktop unveraendert):
- Render-Aufloesung auf dpr 1.3 gedeckelt (dprCap-Helper) statt bis 2 —
dpr 2 = 4x Pixel war der teuerste Posten.
- antialias aus (MSAA teuer auf Mobile), Retina-Dichte kaschiert Kanten.
- powerPreference:'high-performance' fuer die staerkere GPU-Pipeline.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Statt schwebendem Links-Joystick + Rechts-Wisch jetzt zwei feste,
halbtransparente Joysticks:
- links = Umsehen (Auge 👁), ratenbasiertes Drehen/Neigen in update()
- rechts = Bewegen (Fuß 🦶)
Touch wird dem naeheren Joystick im Fangradius zugewiesen (assign/stickVec).
Interaktions-Button (🧳) nach unten-mittig verschoben (kollidierte sonst
mit dem rechten Bewegungs-Joystick). Joysticks nur auf Touch sichtbar
(body.kd-touch).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bisher konnte man Karten in Slots einsetzen und wieder herausziehen, bis
alle voll waren — erst dann wurde ausgewertet. Dieses Herumprobieren war
unsichtbar und senkte die Sterne nicht (5 Sterne trotz Trial-and-Error).
- game.html: reshufflesByStep/totalReshuffles; manuelles Herausziehen einer
platzierten Karte zaehlt als Probierzug. Ein Schritt gilt nur ohne
Probierzuege als 'sauber auf Anhieb' -> Sterne (firstTryHits/steps) und
Treffsicher-Achievement spiegeln Trial-and-Error jetzt. Endbild zeigt
'🔄 N Probierzuege'; Live-State + Submit tragen die Zahlen.
- teacher.html: needsHelp eu-werkstatt auch bei vielen Probierzuegen;
'🔄 Probier'-Spalte in Aktuell; Run-Karte: Gesamt-Probierzuege +
pro Schritt ('🔄 nach Probieren' statt 'auf Anhieb').
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- game.html: bei Blackout sofort action:'blackout' an /progress feuern
(setId/Tag/Block/Frequenz/Ursache, score:0) — Fehlversuch bleibt auch
bei Set-Abbruch sichtbar, kein player_progress/Sterne.
- progress.php: neuer action:'blackout' -> eigene assessments-Zeile,
KEIN XP/plays/best_stars.
- live.php: Blackout-Flag (event:'blackout') durch die Tag-Summary reichen
(blackout/blackoutCount pro Session).
- teacher.html: needsHelp energiemanager (>=2 Blackouts oder Tag <4/8);
Blackout-Spalte + '🔌 neu planen'-Status in Aktuell; Tag-Balken als
🔌 Blackout kennzeichnen; Run-Karte: eigenes Blackout-Kaertchen +
'🔌 N Blackouts'-Badge im fertigen Set.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pro Wegpunkt: 2=Treffer VOR der roten Einblendung (Bonus) · 1=waehrend der 10 s · 0=danach.
computePlanStars() aus Ø-Timing (5/4/3/2/1); Fehlklick-Abbruch bleibt 0. wpRevealAt merkt
Reveal-Zeitpunkt, onPlanClick klassifiziert. Bonus im Endbildschirm + Assessment (planBeforeRed).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
game.html: bei Mission-Ende Snapshot game.lastResult (Start/Landung/Gesamt); GGS_LIVE_STATE
zeigt in mission/briefing den letzten Einsatz statt leerer Spalten. teacher.html Status:
"✓/⚠ letzter Einsatz" wenn Werte aus dem letzten Lauf stammen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Onboarding: "Zurueck"-Button (ab Schritt 2, prevHeliOnboarding)
- Routenplanung: planInstruction-Card erscheint garantiert auch ohne Ton / bei
Audio-Ladefehler (Fallback + Timeout-Netz); bleibt bis zum Wegpunkt-Fund stehen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
floodedPct = sea*0.45 + max(0,sea-prot)*1.1. Vorher deckelte der Strand-Anteil bei
12%, sobald Schutz das Inland trocken hielt -> alle Spieler zeigten 12% egal wie das
Klima stand. Die Karte zeichnet die Flut aber aus seaLevelCm -> Zahl und Bild liefen
auseinander. Jetzt steigt die Zahl stetig mit dem Meeresspiegel (Klimafolge), Schutz
daempft nur den Zusatzschaden. Node-validiert: gutes Klima=niedrige Flut, hohe Temp=
hohe Flut, gleiche-Tick-Spreizung statt Plateau.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- engine.js: floodedPct steigt jetzt stetig mit dem schutzbereinigten Meeresspiegel statt bei 15% zu plateauen. Guter Schutz haelt das Inland lange trocken (effRise = sea - prot*0.85), Strand-Verlust gedeckelt bei 12%. Downstream mitrebalanciert: Pop-Verlust-Multiplikator 5->3, Wachstums-Schwellen 15/35, Flut-Events 8-20/40, Ende bei >60. Node-validiert: guter Spieler gewinnt + Bevoelkerung waechst (statt Kollaps), Flut diskriminiert gut/mittel/schlecht.
- teacher.html: iv-prow/iv-cols Grid flexibel (Name minmax(0,1fr) + Ellipsis, Datenspalten auto) -> "Nicht aktiv"-Liste laeuft nicht mehr aus der Karte.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- klima game-2d/3d: GGS_LIVE_STATE liefert laufenden Punktestand (score, gleiche Formel wie Endbewertung)
- live.php summary: laufende Sessions jeder Sim bekommen Ampel-Score (nicht mehr nur Farmer) -> Tag-Ansicht faerbt laufende Balken statt grau
- teacher.html _renderInactiveToday: zeigt jetzt ALLE heute abgeschlossenen Laeufe (auch von gerade aktiven Schueler:innen); nur das laufende Spiel bleibt oben. Titel -> "Heute bereits erledigt"
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- teacher.html: LIVE_PRIMARY_FIELDS.klima Kennzahlen mit _liveBar-Ampel (absolute Skalen), _liveBar +Nachkomma-Param; tick-Spalte entfernt (redundant zu Jahr)
- game-2d/3d: beendete Laeufe (phase=end) werden beim Resume verworfen -> "Nochmal spielen"/erneutes Oeffnen startet frisch statt im Endbildschirm
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
562 Ersetzungen in 50 Dateien: Halbgeviertstrich zwischen zwei Ziffern (=
"bis"-Bereich) bekommt Leerzeichen davor/danach (3–4 -> 3 – 4). Regex
/([0-9])\s*–\s*(?=[0-9])/ auf Rohtext (format-erhaltend, CRLF/Einrueckung
unveraendert), Bindestriche in Woertern und Minuszeichen unangetastet, alle
JSON weiter gueltig. Energiemanager-Zeitbloecke sind Display-Labels (kein
Logik-Key) -> safe.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- defaultZoneByLatitude: bei 32-38 Grad nicht mehr pauschal "mittelmeer" (das
gab kontinentalem Innerasien wie Westchina faelschlich Mittelmeerklima ->
"Mediterraner Reisanbau" in Xinjiang). Jetzt nur in echten Mittelmeer-
Laengenfenstern (Mittelmeerbecken/Kalifornien/Chile/Kap/SW-Australien),
sonst "wueste". lon wird jetzt an die Funktion uebergeben.
- crops.json: Weizen-Fachbegriff "Vernalisation" durch "kuehle Winter, die der
Winterweizen fuer die spaetere Kornbildung braucht" ersetzt (Thomas: gehoert
nicht ins Lehrwerk).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bug: Kamel in tropischem Brasilien zeigte "Polargebiet/Permafrost", weil der
generische N2-Pool tropisch+polar mischt und pickFromPool zufaellig zog. Ebenso
"Kamele in Nordeuropa" auf einem Feld in Suedamerika (fester Regionsname).
- engine.js: pickZoneAware() waehlt per Klima-Stichwoertern (ZONE_KEYWORDS) den
zur Zone passenden Grund-Text statt zufaellig; Fallback = alt.
- crops.json: Kamel-N1-Text regions-neutral ("viel zu feucht" statt "Nordeuropa").
S1-Erfolgstexte mit Regions-Beispielen (Reis/Kaffee/Datteln) bewusst belassen
(Vergleich auf passendem Feld, didaktisch ok).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
"Ertraege verkaufen, in Geraete und Sorten investieren" -> "Ernten und
verkaufen - mit den Jahren werden neue Sorten freigeschaltet". Es gibt keine
Geraete-Mechanik, und Sorten werden automatisch (nach 3 Jahren) freigeschaltet,
nicht gekauft.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
"Du bewirtschaftest einen Hof" -> "In dieser Simulation bewirtschaftest du
Hoefe auf der ganzen Welt" (die Sim spielt weltweit, nicht auf einem Hof).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>