Commit Graph

137 Commits

Author SHA1 Message Date
Adminator 7986bb2eb6 Heli: Treibstoff kann leer werden (1★-Takeover) + Live-Score fuer Tag-Farbe + Aktuell-Status/Phase
- start.html: Sprit-Floor 0.05->0; Treibstoff-leer loest Chefpilotin-Takeover aus (stars:1)
- game.html: GGS_LIVE_STATE liefert progressiven score (Routing/Start/Landung/Gesamt) -> farbige Tag-Balken
- teacher.html: Phasen-Map + Status-Spalte fuer mission/briefing/unterwegs (kein leeres "...")

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:48:26 +02:00
Adminator 0532327e6a Heli: Onboarding-Zurueck-Button + Routen-Card-Sicherheitsnetz (ohne Ton)
- 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>
2026-08-23 12:25:08 +02:00
Adminator 5d79fa3c3a Klima: Flut-Bewertung ans 40%-Spielziel angeglichen
Flut-Score (End- + Live-Score in game-2d/3d) = max(0, 25*(1-Flut/50)): 0% volle 25 Pkt,
40% noch ~5 Pkt, erst ~50% gegen 0 (statt 0 schon ab 31%). Lehrer-Geflutet-Ampel gruen
<25 / gelb <=40 / rot >40. Klima-Stimmung nutzt jetzt den (fairen) Score.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:19:41 +02:00
Adminator 47adf0497d Klima: Geflutet an Meeresspiegel koppeln (kein Deckel-Plateau) -> Zahl passt zur Karte
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>
2026-08-23 11:43:58 +02:00
Adminator 2386756a20 Klima: Geflutet-Kurve stetig + Schutz wirksam (Rebalance) · Lehrer-Cockpit "Nicht aktiv" responsiv
- 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>
2026-08-22 23:29:39 +02:00
Adminator 2160a99896 Lehrer-Live: laufende Klima-Balken farbig (Ampel) + "Heute bereits erledigt" zeigt alle heutigen Durchgaenge
- 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>
2026-08-22 23:19:23 +02:00
Adminator 8cc48b1bc6 Klima: Aktuell-Linien gruen->rot (CO2/Temp/Geflutet/Budget/Bev.) + "Nochmal spielen" setzt wirklich zurueck
- 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>
2026-08-22 17:17:33 +02:00
Adminator fecd8bb9c9 Textsystem: Bis-Strich mit Leerzeichen (Zahl – Zahl) per Agent-Sweep
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>
2026-08-22 12:38:19 +02:00
Adminator 9c99359d9c Farmer-Fix: Klima-Fallback laengengrad-bewusst + "Vernalisation" ersetzt
- 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>
2026-08-22 12:25:57 +02:00
Adminator b32097b617 Farmer-Fix: Begruendungstext passt jetzt zur echten Klimazone (nicht mehr zufaellig)
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>
2026-08-22 12:19:32 +02:00
Adminator ff751f3a05 Farmer: Onboarding-Schritt korrigiert - keine Geraete, Sorten werden freigeschaltet
"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>
2026-08-22 11:53:56 +02:00
Adminator 714abc026a Farmer: Intro-Satz korrigiert - "Hoefe auf der ganzen Welt"
"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>
2026-08-22 11:52:38 +02:00
Adminator 8c316f22e8 Weltkueche: Marillenknoedel auf reinen Topfenteig (Erdaepfel raus) + Panel final
- wachauer-marillenknoedel Rezept-Schritt 1: Erdaepfel entfernt, klassischer
  Topfenteig (Topfen/Ei/Butter/Mehl/Griess). Passt jetzt zu den ings.
- Admin-Maengelliste: komplett abgearbeitet markiert; mediterrane Kraeuter
  bleiben (Thomas-Entscheidung).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 11:49:33 +02:00
Adminator 8ffc43d7b2 Weltkueche: Maengelliste abgearbeitet (14 Zutaten-Fixes) + Guanciale neu
Zutaten, die im Rezept nicht vorkamen/falsch waren, korrigiert:
- raus: Apfelstrudel(zitrone,essig), Sauerbraten(mehl), Pierogi(milch),
  Gulasch(tomaten), Guacamole(olivenoel), Groestl(kuemmel)
- ersetzt: Kirschtorte/Zuercher/Quiche milch->sahne, Pizza hartweizen->mehl
  (Weichweizen; hartweizen bleibt bei Carbonara=korrekt Durum), Gulasch
  butter->oel, Curry+PadThai olivenoel->oel, Carbonara speck->GUANCIALE (neu).
- guanciale (NEU, production-matrix): feste Herkunft Italien + Distraktoren.
Admin-Maengelliste als erledigt markiert; offen bleiben mediterrane Kraeuter
+ Marillenknoedel-Teig (Thomas-Entscheidung).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 01:17:01 +02:00
Adminator 13f14c26a8 Weltkueche: 6 Zutaten mit fest verdrahteter Herkunft (Thomas-Vorgaben)
Kein Automatismus mehr - Zutat hat feste Laenderliste (correct) + feste
Distraktoren, die das Spiel 1:1 ausliest. Vorrang vor Consumer/Heimat.
- greyerzer (NEU, "Greyerzer & Vacherin"): Schweiz+Frankreich -> ersetzt den
  mozzarella-Hack im Fondue (Signatur entfernt, Rezept nannte Gruyere+Vacherin
  schon korrekt).
- hefe: Oesterreich+Frankreich | lamm: Neuseeland+UK (Import, nicht Griechenland)
  tomaten: Niederlande+Spanien | schmand: Oesterreich+Deutschland
  fischsauce: Thailand+Vietnam (nicht Italien).
game.html: schlanker Auslese-Zweig fuer `correct`/`distractors` (isWorldIngredient
+ ING-Build + Aufloesungstext). admin spiegelt als "Feste Herkunft".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 00:35:24 +02:00
Adminator d7dd3f9de5 Weltkueche: Cache-Busting (no-store) fuer die Daten-Fetches im Spiel
Damit das Spiel nach einem Deploy nie eine gecachte dishes/production-matrix
zeigt (gleiche Klasse Fix wie im Admin-Tool).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 23:55:33 +02:00
Adminator 8977901e89 Weltkueche: Consumer-Regel fuer ALLE DACH-Grundzutaten + Alkohol raus + Fixes
HEIMAT-REGEL-FIX (Thomas): Grundzutaten haengen nicht mehr am Gericht-Land,
sondern am User-Land, wenn dort nennenswerte Produktion. Quiche-Milch in AT =
oesterreichische Milch, nicht franzoesische.
- heimisch+market (AT/DE/CH, market DE) an: milch, butter, topfen, fleisch,
  rind-ungarn, apfel, zucker, zwiebel, champignons, wurzelgemuese, mais,
  kirschen, mehl (+ eier/kartoffel schon). = 16 Grundzutaten consumer-anchored.
- huhn-spanien (Paella): heimisch AT/DE/CH, market DE, Distraktoren
  spanien/frankreich/marokko/aegypten/tuerkei (Spanien = Gericht-Land als Lockvogel).
- BEWUSST NICHT heimisch: tomaten + lamm (Import >2/3) -> bleiben international.
  Signaturzutaten (speck/feta/mozzarella/bergkaese) bleiben am Gericht.
- Zurueckgehalten fuer Thomas-Review: kuemmel/majoran (Kraeuter-Graubereich).

ALKOHOL RAUS (Thomas: "ist fuer Kinder", alle Gerichte):
- Apfelstrudel: Rum-Ing raus. Sauerbraten: Wein-Ing raus, Marinade Rotwein->
  roter Traubensaft. Kirschtorte: Kirschwasser->Kirschsaft. Fondue: Wein-Ing raus,
  Weisswein->Apfelsaft+Zitrone, Kirschwasser->Wasser, Schnaps-Gag->Lied singen.
  Zuercher Geschnetzeltes: Wein-Ing raus, ablöschen mit Gemuesebruehe. Moussaka:
  Wein-Ing raus, einkochen mit Gemuesebruehe.
- Bayerische Brezel: Mozzarella raus (Obatzda = Camembert+Frischkaese).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 23:54:43 +02:00
Adminator f934a7f9e4 Weltkueche: mediterrane Kraeuter raus aus Maultaschen + Sauerbraten
Kommen im Rezept nicht vor und passen historisch nicht in die regionale
DACH-Kueche (Thomas). Mediterrane Gerichte (Pizza/Ratatouille/Moussaka/Paella)
behalten Kraeuter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 23:41:34 +02:00
Adminator 0c2225594b Weltkueche: Semmelbroesel zurueck in Speisekammer + Brezel-Rezept bereinigt
- semmelbroesel: heimisch/market/distractors wieder entfernt -> nicht mehr
  abgefragt, kommt aus der Speisekammer (Thomas: verarbeitete Staples = Pantry).
- bayerische-brezel: Wein + mediterrane Kraeuter aus ings raus (kommen im
  Rezept nicht vor). Bier im Obatzda-Schritt durch einen Schuss Milch ersetzt
  (fuer Kinder ungeeignet).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 23:38:38 +02:00
Adminator 423490260d Weltkueche Teil B: Consumer-Anker (Herkunft folgt dem User-Land) — Pilot Ei/Kartoffel/Semmelbroesel
Grundzutaten, die im Land des Users heimisch sind, kommen jetzt aus dem Land
des USERS statt aus dem Gericht-Land (Carbonara-Ei in AT = AT-Ei). Opt-in pro
Zutat ueber neues Feld `heimisch`; Signaturzutaten bleiben am Gericht.

game.html:
- buildTaskFor: neuer Consumer-Zweig (vor Heimat-Regel). correct = [User-Land,
  ...market], Distraktoren explizit (`distractors`) oder berechnet. Immer 5 Karten.
- _wkUser(): WK_COUNTRY (AT/DE/CH/LI) -> Laender-Slug, Fallback AT.
- isWorldIngredient: Zutat mit `heimisch` wird immer abgefragt (z.B. Semmelbroesel).
- ING-Build: heimisch/market/distractors werden aus der Matrix mitkopiert
  (wurden vorher weggelassen -> Felder kamen nie im Spiel an).
- Aufloesungstext: Consumer-Fall ("kaufst du, wo du einkaufst - im eigenen Land").

Daten (production-matrix.json), Thomas-Vorgaben:
- eier:  heimisch AT/DE/CH, market DE+NL  -> AT-User: AT+DE+NL, DE-User: DE+NL
- kartoffel: heimisch AT/DE/CH, market DE -> AT+DE (alle Gerichte)
- semmelbroesel: heimisch AT/DE, market DE, distractors GR/TR/EG/TN/IE; jetzt abgefragt

admin-weltkueche.html: Consumer-Zweig gespiegelt + AT/DE/CH-Umschalter.

Nebenbefund (NICHT angefasst): correct_for wird im Spiel nie gelesen (nur Admin
las es) -> mehl/majoran/safran/feta-lamm-Kuratierung wirkte bisher nur im Admin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 18:21:39 +02:00
Adminator b6b6c6ccce Weltkueche: Ei-Zweitherkunft AT = Deutschland+Niederlande (statt Slowakei)
- eier.correct_for.oesterreich: ["deutschland","niederlande"] (war ["slowakei"])
  -> AT-Ei-Gerichte zeigen jetzt AT + DE + NL (Thomas-Vorgabe: NL/DE sind die
  echten Import-Herkuenfte, SK spielt kaum Rolle). Gilt fuer alle 7 AT-Gerichte
  mit Ei; DE-Gerichte zeigen via Heuristik ohnehin schon DE + NL.
- buildTaskFor Heimat-Zweig: Distraktoren auf 5-correct.length gedeckelt, damit
  bei 3 richtigen Laendern trotzdem 5 Karten bleiben (Punkte-Norm).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 18:08:36 +02:00
Adminator c3e61f4da7 Weltkueche: Auflösungs-Aussage korrigiert + Admin-QA kennt correct_for
- Auflösung: „Das ist ein Gericht aus <Land> → Zutaten aus <Land>" nur noch bei
  ECHTEN Signatur-Zutaten (Tiroler Speck etc.). Grundzutaten (Butter, Mehl) bekommen
  die neutrale „aus der Nähe"-Begründung statt der falschen Gericht-Herkunft-Logik.
- admin-weltkueche.html: classify() respektiert jetzt correct_for (zeigt sonst falsche
  Herkünfte, z.B. Mehl AT+DE statt AT+Ungarn).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 11:50:07 +02:00
Adminator b353f25b07 Weltkueche Punktesystem: neue Formel (25 x verbleibende Falsche) + immer 5 Karten
- Auswahl auf IMMER 2 richtig + 3 Distraktoren (5 Karten) genormt (Welt-Zweig
  wuerfelte 2-4). Damit ist die Bewertung fair & vergleichbar.
- Punkte pro richtigem Klick = 25 x (noch verbleibende falsche Optionen).
  Frueh gefunden = mehr; jeder Fehlklick vorher senkt den Wert. Max 2x75 = 150,
  0 moeglich (alle falsch zuerst). 50er-Bonus entfaellt (150 = 75+75).
- Live-Feedback: schwebendes +75/+50/+25/+0 (gruen) bzw. "Fehlversuch -
  erreichbare Punkte sinken" (rot) bei jedem Klick.
- Banner/Interim/Onboarding-Text angepasst; trade-Abzeichen 3000 -> 2000
  (da Max jetzt 150 statt ~250 pro Zutat).
- BUGFIX: dasselbe richtige Land liess sich doppelt anklicken/zaehlen -> Guard.
Playwright-verifiziert: 5 Karten, 75+0(Guard)+75=150, 0 JS-Fehler.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 11:25:49 +02:00
Adminator bf2a4cd0d1 Weltkueche Herkunft: kuratierte AT-Zweitlieferanten + Distraktor-Fixes (Thomas-Review)
Neu: additives `correct_for[heimat]` in buildTaskFor — uebersteuert die Gravitations-
Schaetzung NUR bei kuratierten Zutaten (echte Handelsdaten), alles andere unveraendert.
- mehl→AT+Ungarn (Weizenimport 2023: HU 604k >> DE 41k), kartoffel→AT+Schweiz,
  eier→AT+Slowakei (Variation weg vom Dauer-AT+DE), majoran→AT+Deutschland (statt FR),
  safran→Spanien+Iran (statt IT mit 1 t), feta/lamm→Griechenland+Bulgarien (Balkan statt FR).
- Datenfixes gegen „echter Lieferant faelschlich als Distraktor": AT raus aus Mozzarella-
  climate_possible + als Produzent ergaenzt; CH raus aus Kartoffel-climate_possible +
  Produzent; SK als Eier-Produzent; Aegypten-Zwiebel local→global (echter kleiner Lieferant).
- Verifiziert: 7 kuratierte korrekt; keine Regression (DE-Gerichte nutzen weiter Algorithmus).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 21:36:48 +02:00
Adminator 4c0183f2e0 Weltkueche Zutaten-Review R2: Apfelstrudel/Sachertorte/Marillenknoedel/Schnitzel exakt nach Rezept
- Apfelstrudel: exakte Liste (Apfel, Zitrone, Butter, Mehl, Oel, Essig, Semmelbroesel,
  Zucker, Zimt, Rosinen, Rum, Staubzucker). Eier + Mandeln + Olivenoel raus.
- Sachertorte: Schokoladenkuvertuere statt Kakao, Kristall- + Staubzucker, Schlagobers
  (mit Hinweis: kommt DANEBEN, nicht in den Teig) statt Milch.
- Marillenknoedel: Topfenteig, Kartoffel raus.
- Wiener Schnitzel: Kalbfleisch, Mehl, Ei, Semmelbroesel, Butterschmalz (+ Zitrone,
  Erdaepfelsalat-Beilage). Pfeffer + Butter raus.
- 8 neue Zutaten: 3 Welt (Schokolade=Kakao-Herkunft, Kristallzucker=EU-Ruebe, Rum=Karibik),
  5 lokal (Semmelbroesel, Oel, Staubzucker, Butterschmalz, Schlagobers).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 21:23:56 +02:00
Adminator 0c4064bb58 Weltkueche Zutaten-Review (Thomas): echte kulinarische Fehler bei AT-Gerichten behoben
- Mediterrane Kraeuter RAUS bei Groestl, Kasnudeln, Wurzelfleisch, Kaesespaetzle, Schnitzel (unpassend).
- Olivenoel RAUS bei Wurzelfleisch + Apfelstrudel (untypisch).
- Mozzarella RAUS bei Kaesespaetzle -> echter neuer `bergkaese` (Vorarlberger Bergkaese; Herkunft AT + Schweiz statt faelschlich Italien).
- Hartweizen/Durum RAUS bei Marillenknoedel.
- Wiener Schnitzel Fleisch -> neuer `kalbfleisch` (ausschliesslich Kalb; Herkunft AT + Niederlande = EU-Nr.1 Kalbfleisch).
- Kasnudeln: neuer `minze` (Nudelminze, charakteristisch; Herkunft AT + Deutschland).
- 3 neue Zutaten in production-matrix mit realistischen Produzenten/Markt; Gravitation liefert plausible 2. Lieferanten (verifiziert).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 21:08:15 +02:00
Adminator 5d3cd1bdcf Fix: BASE_URL folgt dem echten Host (Glossar-Fetch auf v3) + Weltkueche „Nachbarland"-Wortlaut
- app.php: BASE_URL fuer *.geograsim.at war hart 'https://geograsim.at' -> auf
  v3.geograsim.at lud die Glossar-API cross-origin -> CORS/NetworkError
  ("Glossar konnte nicht geladen werden"). Jetzt BASE_URL='https://'.$host
  (same-origin auf jeder Umgebung; prod-neutral, geograsim.at bleibt gleich).
- weltkueche/game.html: Zweit-Lieferant hiess pauschal „Nachbarland" — Frankreich
  ist aber kein Nachbar Oesterreichs. Jetzt „europaeisches Land in unserer Naehe".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 16:30:59 +02:00
Adminator 5b0505b140 Sonnensystem-Review: Finsternis-Geometrie-Fix + Vergleichsansichten + Anleitung + Photon-Skala
Aufgaben (observations.json):
- Finsternis-Bug behoben: Mond wurde siderisch statt synodisch positioniert -> Konstellation schief. Jetzt exakt Neumond (solar)/Vollmond (lunar) via moonPhaseTimeDays(). Sim-Detektor bestaetigt (Badge) SONNEN-/MONDFINSTERNIS.
- Pol-Aufgaben (Polartag/Polarnacht): Kamera -> neue erdzentrierte Draufsicht earth-top (Sonne geht am Pol nie unter/auf sichtbar).
- Mondphasen: Start bei Neumond (moonPhaseStart) passend zur Reihenfolge Neumond->zunehmend->Vollmond->abnehmend.
- Vergleichsansichten (Strahlen-Steilheit, Tag-Nacht-Gleiche, ohne Achsneigung): neue nahe Seitenansicht earth-side + Sommer/Winter- bzw. Maerz/Sept-Phasen + klare watchHints.
- "Was bewegt sich worum": Antwort praezisiert (Mond um die Erde).
- Apfel-Vergleich: 109 x (Leerzeichen), Erde = Mohnkorn (~1 mm), lange Striche raus, Distraktor Murmel angepasst.
- Photon: schwankende 8:20 erwaehnt, watchHint "mind. 30 s zaehlen + hochrechnen", Speed watchbarer.

game.html:
- Graue/unsichtbare Fact-/Onboarding-Texte: dunkle Lesefarbe gesetzt.
- Kameras earth-top + earth-side; obsApplyState-Fallback fuer button-lose Kameras.
- moonPhaseTimeDays(new|full) (synodisch, Anker Vollmond 3.1.).
- Anleitung-Button (Intro+Aufloesung) + Overlay: erklaert das Bedienfeld Schritt fuer Schritt.
- Photon-Skala unten: 8 Segmente (1/min), fuellt mit Fortschritt; Photon pulsiert die ganze Strecke.

Getestet mit Playwright: 0 JS-Fehler, Finsternis-Badges korrekt, Photon-Skala fuellt, alle DOM-Elemente da.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 12:04:53 +02:00
Adminator 5f603cb193 Tourismusregion: Umwelt beißt jetzt + Schüler-Erklärung (Balance-Pass 1)
Diagnose per headless-Sim-Harness (.dontDeploy/tools/tr-balance-harness.mjs):
„alles zubauen" senkte die Umwelt nur 75→50 (über der 45-Schwelle) und der
Exit-Umwelt-Malus war TOTER Flag-Code → man konnte der Umwelt kaum schaden.

- model.js: (1) Exit-Umwelt-Malus wirklich angewandt — env<60 zieht bei
  umweltbewussten Gästen Zufriedenheit ab (je tiefer, desto mehr). (2) Über-
  tourismus-Drift im 10-s-Takt: dichte Bebauung (>6 Bauwerke) + Verkehr zehren
  die Umwelt aus. (3) Einmalige Lern-Warnkarte, wenn Umwelt < 50 kippt.
- data.js: Naturschutzgebiet-Beschreibung klar (rettet die Umwelt +20, Natur-
  Attraktionen +15 %, sperrt Bauplätze — Naturschutz vs. Ausbau abwägen).
- main.js: Willkommenskarte erklärt die Umwelt-Mechanik für Schüler.

Messung nachher: „alles zubauen" → Umwelt 75→37 (unter 45), Umweltziel
verfehlt, Ø-Sterne fallen. Feintuning Sterne-Kurve/Ansprüche-Eskalation
bleibt für Thomas' Playtest (Game-Feeling headless nicht bewertbar).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 18:10:42 +02:00
Adminator d9f9f901a1 Logistik-Pause friert die Aktivzeit ein (Lehrer-Cockpit)
Problem: bei Pause lief die „Seit"-Zeit im Lehrer-Cockpit weiter, obwohl das
Spiel steht — live-client.js akkumulierte activeMs unabhängig vom Pause-Zustand.

- live-client.js: opt-in Pause-Unterstützung. window.__GGS_LIVE__.setPaused(bool)
  friert die activeMs-Buchhaltung ein (lastTickAt wird weiter aktualisiert, damit
  beim Fortsetzen nichts nachspringt). __paused zusätzlich im Heartbeat. Default
  aus → alle anderen Sims unberührt.
- logistik game.html: Pause-/Auto-Button ruft setPaused(mode==='pause').

Verifiziert (Playwright): activeMs 0→2000 (läuft) → 2000 (Pause eingefroren)
→ 3999 (Fortsetzen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 15:12:50 +02:00
Adminator e23ebd960e Weltküche: Herkunft per Handels-Gravitation + Punktefix „alle falsch = 0"
- Zweit-Lieferant im Heimat-Zweig jetzt via Handels-Gravitation (Menge ÷
  Entfernung zur Heimat, Haversine über Länder-Koordinaten) statt roher
  Weltproduktion. AT-Eier → Deutschland (468 km) statt Frankreich (916 km),
  obwohl FR mehr Eier erzeugt. Distraktoren bleiben nie echte AT-Lieferanten.
  Verifiziert: Eier/Kartoffel/Milch → [Österreich, Deutschland]; alle 70
  Zutaten bauen fehlerfrei.
- Punktefix: Strafe pro Fehlklick = 100 ÷ Anzahl Distraktoren → „alle Falschen
  zuerst" ergibt IMMER 0 (bei 4 Distraktoren −25, bei 2 −50). Task-Banner
  zeigt die tatsächliche Strafe + „alle falsch zuerst = 0".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 15:09:16 +02:00
Adminator 37f6238d05 Auth Phase 2: Session-Zugriffe kanalisieren (verhaltensneutral)
Vorbereitung für den JWT+Redis-Umschalter: alle verstreuten
$_SESSION['teacher_id'|admin_id']-Zugriffe laufen jetzt durch Session::-Helper,
damit der Backend-Tausch später EINE Datei (Session.php) ist statt 18 Stellen.

- Session.php: neue Admin-Helper adminId()/loginAdmin()/logoutAdmin()/
  requireAdmin() (mirror der Teacher-Helper). teacherId()/adminId() starten
  die Session jetzt lazy (Aufrufer müssen Session::start() nicht mehr).
- 18 Fundstellen kanalisiert (admin.php, admin-accounts, admin-modules,
  licenses, levels, waypoints, foto-upload, admin_gate, save_map).
- Country.php + app.php cockpit_href: über Session:: mit class_exists-Fallback
  (Bootstrap/Lib-Kontext, Session evtl. nicht geladen).

Verhaltensneutral: 14/14 Lint OK, Helper-Round-Trip 6/6 PASS, Live-Smoke
(admin status/modules/accounts/licenses) weist unauth. Requests wie bisher
mit 401/403 ab. AUTH_BACKEND bleibt 'session' — Live unverändert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 16:33:14 +02:00
Adminator db4b75c5e6 Tourismusregion Quick-Fixes: Startflow, Auto-Save, Lift-Talstation, iPad-Responsive
- Startbildschirm: Name/Klasscode-Felder entfernt (Kinder sind über die
  Plattform-Session identifiziert). Klick auf eine Wegkarte startet die
  Partie sofort — separater „Partie starten"-Button entfernt.
- Abschluss: „Ergebnis speichern"-Button entfernt; Speichern passiert schon
  automatisch am Partie-Ende (submitAssessment). Hinweis „automatisch
  gespeichert" ergänzt. btnSave-Listener null-sicher gemacht.
- Seilbahn: Talstation (Baukörper + Satteldach + Umlenkrad) ergänzt — der
  Lift-Anfang wirkte vorher „transparent".
- Responsive/iPad: Panels bekommen Höhen-Deckel + internes Scrollen (decken
  nie den ganzen Schirm zu). Neue Media-Query für iPad-Landscape (901–1200px
  / niedrige Höhe): kompaktere Panels, Graphen nach rechts-unten aus dem
  Info-Panel-Bereich. Sehr flache Screens blenden die Graphen aus.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 14:15:41 +02:00
Adminator 5655af81bf Lehrer-Observability + Weltküche-Inhalt + Wrapper-Fix + Passstraße
teacher.html: Menü „Live" → „Ergebnisse" mit Unteransichten
Tag·Aktuell·Vergleich·Gesamt (alte Ergebnisse-Ansicht ist jetzt „Gesamt").
Neue Kennzahl Qualität (grafischer richtig/falsch-Balken) in Aktuell +
Vergleich + Weltküche-Zeile, Gerichte-Zähler (Fleiß), Labels entschärft
(„Kritisch" → Stark/Solide/Viele Fehler).

Weltküche: korrekte Artikel (der/die/das) für alle 70 Zutaten in
production-matrix.json; verdrehten Herkunfts-Satz + Heimat-Banner neu und
marktbewusst (Ukraine-Distraktor ehrlich erklärt), „man"-Konstruktionen
für Singular/Plural.

_scripts.php: renderPage() injizierte Favicon per strrpos ins letzte
</head> — das lag in teacher.htmls printBatchTickets-JS-String → SyntaxError
zerschoss das ganze Inline-Script auf /teacher. Fix: strpos (erstes </head>).

tourismusregion: neue Karte passstrasse in maps-custom.json (Route bergauf
136 Punkte, 41 Bauslots) aus Editor-Export.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 13:32:24 +02:00
Adminator 4bfb6539cb Weltkueche Fundament: geschaffte Gerichte persistent (localStorage, Schueler-Reload) + Backend-Submit pro Gericht (Lehrer-Historie: score/correctClicks/wrongClicks/completed) + Fehler-Zaehler
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 12:38:03 +02:00
Adminator f6df2eb79f Teacher: Triage 'Nachfassen'->'Nicht aktiv'; Weltkueche live-state phase-Bug gefixt (zeigte immer 'forschen', jetzt 'Gericht X · Zutat Y/Z')
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 12:21:24 +02:00
Adminator ec102b7c36 Weltkueche Punkte-Regel: richtig +100, jeder Fehlklick -25 (progressiv, statt Flat 100/60); Regel im Task-Banner sichtbar; Heimat-Zweig 2 Korrekte (Heimat + 1 realistische)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 12:08:45 +02:00
Adminator 9ec7ad67f1 Weltkueche Heimat-Regel ehrlich: regionale Gerichte haben Heimat + realistische EU-Nachbar-Produzenten als korrekt (immer >=2 Optionen), ferne/klimafremde bleiben Distraktoren
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 12:02:22 +02:00
Adminator b9bcbf9198 Backend-Editoren admin-geschuetzt (admin_gate) + Admin-Hub auf Admin-Seite; save_map admin-oder-lehrer; foto-upload admin-bypass (PIN bleibt)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 11:54:08 +02:00
Adminator b0fe3fdf86 Tourismusregion: neues Passstrassen-Hintergrundbild (Photoshop, 1536x1024)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 19:40:26 +02:00
Adminator ad627331f0 Fix: save_map.php ruft Session::start() vor requireTeacher (Editor-Speichern schrieb nie in Datei, fiel immer auf Copy-Fallback zurueck)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 19:16:09 +02:00
Adminator 75511630c8 Tourismusregion: Talschleife-Startpunkt korrigiert (Route beginnt weiter links)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 19:14:09 +02:00
Adminator 81ba268ea8 Tourismusregion: Custom-Karte kreuzung ergaenzt (Routen + Bauslots aus Editor)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 16:33:45 +02:00
Adminator 1950542ae5 Tourismusregion: Custom-Karten talschleife + seerunde (Routen + Bauslots aus Editor)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 15:57:41 +02:00
Adminator 8b1088a070 Balancing: sonnensystem (Erst-Treffer-Bewertung, Loesung nicht aufdecken, Level-Badge) + energiemanager (echter Blackout an Netzfrequenz, Schwierigkeitsrampe)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 21:59:32 +02:00
Adminator 2984d93e7e Review-Batch P0: Sicherheit + Schueler-Ergebnisse + Assessments-Aufblaehung
Sicherheit:
- progress.php: IDOR geschlossen (student_id-Zweig verlangt Lehrer-Login + Klassenbesitz)
- licenses.php: ?admin=1 und generate nur noch fuer echten Admin; Collision-Retry mit Cap
- .htaccess: .env/.sh/.sql/.bak Deny (Defense-in-Depth)

Schueler-Ergebnisse (kritisch):
- sim-metrics.js + .ivm-CSS in schueler.html; renderOwnRunCard-Fallback zeigt jetzt
  Sterne + grafische Kennzahlen fuer die 9 bisher leeren Sims
- sim-metrics.js: klima final_budget als "Mio EUR" statt "EUR" (Faktor 10^6)

Skalierung:
- assessment.php: Zwischen-Pings (phase running/started) nicht mehr persistiert
- heli: 30-s-assessmentPing entfernt (Live-Zustand laeuft ueber Heartbeat)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 16:21:25 +02:00
Adminator 7915512195 Weltküche: DACH/EU-Priorität wiederhergestellt + Beschreibungen
Die Umstellung auf echte Menge hatte die EU-Priorität eingeebnet. Jetzt Stufen-
folge: EU-Nachbar (Hauptweg zu UNSEREM Markt, kurzer Weg) VOR fernem Welt-
Lieferant (nur wo es hier nicht wächst, z.B. Pfeffer→Vietnam+Brasilien) VOR
"Big Player, kommt kaum an" (world-far). Innerhalb einer Stufe zählt die Menge.

- MARKET_TIER {eu:0, global:1, world-far:2}
- explainChoice: EU-Antwort erklärt "aus EU-Binnenmarkt, kurzer Weg, kein Zoll";
  world-far-Fehlklick erklärt "weltweit groß, aber kaum im EU-Handel"
- "in dieser Runde"-Texte entfernt (Auswahl ist jetzt deterministisch)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 16:54:39 +02:00
Adminator e7453d9072 Weltküche: echte Hauptlieferanten statt Zufall + Einheiten-Fix
- Welt-Zutaten: die 2 tatsächlichen Hauptlieferanten nach Menge (Pfeffer →
  Vietnam+Brasilien, Kakao → Elfenbeinküste+Ghana) statt log-gewichtetem Zufall,
  der kleine Produzenten (Sri Lanka, Kambodscha) fast gleich oft zog
- Reihenfolge: „beliefert unseren Markt" (eu/global) vor „selten hier" (world-far)
- fmtTonnes: „220.000 t/Jahr" statt „220 Tsd t" (kindgerecht, kein SI-Kürzel kt),
  Mio mit deutschem Dezimalkomma („1,5 Mio t")

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 16:47:35 +02:00
Adminator 1c5356422c Weltküche: Heimat-Regel – Zutaten folgen dem Gericht statt Zufall
Löst "warum kommt Deutschland nicht vor?": In regionalen Gerichten kommt jede
Zutat, die das Herkunftsland selbst erzeugt, von dort (Tiroler Gröstl → Tiroler
Speck/Kartoffeln aus Österreich). Nur was hier nicht wächst (Pfeffer, Olivenöl)
reist von weit her – die eigentliche Lektion. Datengetrieben: Test "erzeugt das
Heimatland die Zutat?" filtert automatisch, kein Länder-Bias (hängt am Gericht).

- dishes.json: heimat (25 Gerichte) + signature-Labels (5); exotische ohne heimat
- buildTaskFor: Heimat-Regel sticht Zufall aus, wenn Heimatland Produzent ist
- Klick-Feedback beantwortet "warum nicht Deutschland?" direkt (showWrong/explainChoice)
- Auflösung erklärt Heimat-Logik + zeigt Antwort auch wenn kein Top-5-Produzent

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 15:56:55 +02:00
Adminator 305e3a62f8 Glossar-Review: CO2-Eintrag ganze Sätze + Tabelle, Geviertstrich→Gedankenstrich, Weltküche-Onboarding
- Glossar-Renderer: Markdown-Tabellen (|…|) + .gl-table CSS
- co2-fussabdruck-lebensmittel: telegrafische Liste → ganze Sätze + saubere
  Portions-Tabelle, Avocado-Vergleich, Malpunkt statt ×
- Programmweit „—" (Geviertstrich) → „–" (Gedankenstrich): Glossar-DB,
  glossar_examples, module_info, alle 13 Buch-Kapitel
- Weltküche-Onboarding: Blatt 2 umformuliert (zweites Land nacheinander),
  Blatt 3 Lehrplan-Satz entfernt, Blatt 4 fehlendes markt.webp generiert

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 15:15:29 +02:00