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>
- 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>
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>
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>
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>
- 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>
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>
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>
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>
Kostenwahrheit als Lernmoment statt Fussnote: Nach dem Erst-Bau von
Lift/Gondel/Hotel/Beschneiung/Bushaltestelle erscheint (Event-Pacing)
je einmalig ein Kosten-Check: Info mit echtem AT-Beispiel + Schaetzfrage
(mehr/weniger). Richtig = +2.000 Euro Bank-Bonus, falsch = nur die
Aufloesung. Verifizierte Zahlen: Leppleskofel-6er 12 Mio. (Dolomiten-
stadt), Patscherkofelbahn 58 geplant -> 83,2 Mio. bezahlt (Stadt Ibk),
WKO-Hotelrichtwerte 220-270k/Zimmer, Schneekanone 27-35k + 1 Mio./
Pistenkm, Ski Arlberg Tageskarte 81,50. Erster Check traegt den
Modell-Hinweis (Preise verkleinert, Verhaeltnisse stimmen).
Antwortrichtungen gemischt (3x mehr, 2x weniger). Quiz-Karten sind
Entscheidungen -> immer modal, auch im Audio-Modus.
Schulbuch Seite 2: Daten-Box 'Was kostet das wirklich?' + Meta-Aufgabe D
(Modellkompetenz) + Quellen 8-12. Modulseite: Vereinfachungs-Hinweis
in long_desc (SQL lokal+prod).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Schulbuch-Quellenverzeichnis: interner Dateipfad (QUELLEN.md) entfernt -
gehoert nicht in ein Schuelerdokument.
- Tagesbericht: Malpunkt (Mittelpunkt) statt x als Multiplikationszeichen -
oesterreichische Schulschreibweise (neue Dauerregel: +, -, Malpunkt,
: fuer Division in allen schueler-sichtbaren Rechnungen).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
editor.html + js/editor.js aus der Quelle uebernommen. save_map.php
schreibt js/maps-custom.json (mit Auto-Backups) - jetzt abgesichert:
nur eingeloggte Lehrpersonen duerfen speichern. Das Spiel laedt die
Overrides beim Start (applyMapOverrides). Thomas fixt damit Routen-
Punkte und Bauplaetze; die Datei wird danach ins Repo uebernommen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Performance ohne Sichtverlust: Retina-Faktor auf 1.5 gecappt (~45 %
weniger GPU-Pixel), Framerate auf ~30 fps (Pause ohne Interaktion
~10 fps) - Simulation exakt, uebersprungene Zeit wird akkumuliert.
iPad sollte deutlich kuehler bleiben.
- Touch-Bauvorschau: erster Tipp heftet die volle Vorschau (gruen/rot,
Pisten-/Strecken-Korridor, Einflusskreise) an die Kachel, zweiter Tipp
auf DIESELBE Kachel baut. Maus behaelt Hover + Sofortbau.
- Info-Overlays breiter (680px statt 440px) - weniger Scrollen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Letzte Runde: Panoramaweg, Bikepark-Station, Hochseilgarten,
Fahrradverleih (+Mega), Aussichtsplattform, Spielplatz, Mega-Spielplatz
(verkleinert auf 90/20) + 36 Solar-/Muelleimer-Positionen pro Stufe
(inkl. Rodelbahn). Komplette Sprite-Justierung damit fest im Code.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Ein Weg hat kein Dach - der gepflegte Muelleimer am Wegrand (rechte
Ecke) erzaehlt sanften Tourismus besser. Position weiter ueber den
Editor-Solar-Modus justierbar (gleiches SOLAR_POS-System).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Justier-Werte bis Badesee: Personalhaus (47/17), Mega-Personalhaus
(101/32), Mega-Badesee (84/31) + 12 Solar-Positionen pro Stufe.
- Mega-Stufen-Skalierung waechst jetzt vom MOTIV-ZENTRUM aus statt vom
Boden-Anker (centerScale in _sprite) - die Mitte bleibt fix.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Thomas' Justier-Werte (2026-07-12) in SPRITE_DEFS + SOLAR_POS uebernommen:
Gasthaus/Rettungsstation/Bushaltestelle-Anker korrigiert, Mega-Hotel/
-Gasthaus/-Schneizentrale/-Spielplatz neu gesetzt, 40+ Solar-Positionen
pro Gebaeude UND Ausbaustufe (inkl. Lift/Gondel/Bus). Lift/Gondel-
Sprite-Werte bewusst ausgelassen (Vektor-Zeichnungen, wirkungslos).
Gilt jetzt fuer ALLE Geraete, nicht nur das Justier-iPad.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mega-Sprites skalieren jetzt je Stufe: I=90%, II=100%, III=112%,
IV=124% (vorher fix 100%). Gilt fuer alle Mega-Typen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Panoramaweg aus der Merge-Liste entfernt (Linien-Bauwerk). MERGEABLE
exportiert; Editor sperrt die Mega-Checkbox fuer alle nicht merge-
faehigen Typen (Bahnen, Bus, Bikepark, Rodelbahn, Panoramaweg,
Rettungsstation, Aufforsten, Plattform).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Editor: Zieh-Modi direkt auf der Karte (Gebaeude: horizontal=Breite,
vertikal=Boden-Anker; Solar: frei ziehen) + Pixel-Feinjustage per
Plus/Minus-Tasten, grosse Live-Wertanzeige, Footprint-Hilfslinien.
- Solar-Position wird PRO AUSBAUSTUFE gespeichert (<key>@L<stufe>,
Vererbung Stufe -> Sprite -> Default) - Renderer-Lookup erweitert.
- Bikepark zeigt beim Bauen die komplette Strecke talwaerts (5 Felder,
pro Kachel gruen/rot je nach Belegbarkeit) - wie die Lift-Piste.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bildschirm-Winkel bergab ist ~140 Grad - volle Rotation stellte die
Fahrer auf den Kopf bzw. aufs Vorderrad. Jetzt: Spiegelung nach
Fahrtrichtung + leichte Bergab-Neigung (Faktor 0.3).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Justier-Editor (editor.html): jedes Gebaeude in allen Stufen, 1x1 und
Mega-2x2, Oeko an/aus - Sprite-Breite, Boden-Anker und Solarpanel-
Position (dx/dy/s pro Sprite-Key) live auf echten Tiles tunen. Werte
wirken sofort via localStorage-Override, Export-JSON zum Einbacken.
- Bikepark umgebaut aufs Rodelbahn-Prinzip: 1x1-Station, Flowtrail-
Strecke 5 Felder talwaerts mit Schwuengen, Platz wird SCHON BEIM BAU
geprueft und reserviert (tile.bikeTrail blockiert Bebauung), fahrende
Raeder mit Kurvenneigung (mehr Biker je Ausbaustufe), Ziel-Bogen.
- Animationen: Spielplatz (Schaukel + Rutscher), Hochseilgarten
(Zipline-Gleiter), Aussichtsplattform (Foto-Blitz), Fahrradverleih
(drehendes Werkstatt-Rad), Gasthaus (Kamin-Dampf).
- Ambiente: Wolkenschatten ziehen uebers Tal; Schafe auf Almen und
Kuehe auf Talwiesen (grasen, deterministische Herdenplaetze, nicht
im Winter).
- Baumenue-Karten: oben Titel+Info links / Preis rechts, darunter
zweispaltig Icon und Beschreibung.
- Solar-Position pro Gebaeudetyp justierbar (SOLAR_POS).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Antwort auf die Design-Frage 'Naturwert zurueck ausser weniger bauen':
- Oeko-Umbau pro Gebaeude (Button im Gebaeude-Dialog): einmalig, 40 % des
Bauwerts, dafuer -20 % Betriebskosten, +2 Naturwert, Gebaeude belastet
die taegliche Natur-Regeneration nicht mehr. Sichtbar: Solardach-Overlay
(auch auf Megabauwerken, 1,6x). Didaktik: Investition vs. laufende
Kosten, nachhaltiges Wirtschaften (GW 4.10).
- Aufforsten als wiederholbare Aktion im Baumenue (1.500 Euro): pflanzt
Wald auf freie Wiese/Alm/Feld, +3 Naturwert, Werkzeug bleibt aktiv fuer
Serien-Pflanzung. Wissen: Renaturierung + Schutzwald (1/3 des
oesterreichischen Walds).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Grosse Gebaeude wurden von davorliegenden Kacheln uebermalt (Grasbueschel
ueber dem Hotelfuss). Jetzt zeichnet die VORDERSTE Footprint-Kachel das
Sprite, Terrain-Details entfallen auf bebauten Kacheln, Sprite-Mitte =
Mitte der 4 Kacheln, w/bottom so dass der Fuss die vordere Spitze deckt.
SQL-Migration audio_info MySQL-kompatibel (information_schema-Guard statt
MariaDB IF NOT EXISTS - Prod ist echtes MySQL).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Bau-Ablehnung erklaert jetzt immer auch die Bauregeln des Gebaeudes
(Toast: Grund + Beschreibung, 7 s).
- Lehrer-Schalter fuer den Vorlese-Modus: class_modules.audio_info
(Migration, Default AN) + modules-API set_audio_info + Toggle auf der
Modul-Karte im Cockpit (Vorlesen an/aus) + Wrapper injiziert
TT_FEATURES.audioInfo + Sim blendet den Umschalter aus und erzwingt
Lese-Modus, wenn gesperrt.
- Bus zeigt bei Rueckfahrt sein Heck: Heckscheibe + rote Ruecklichter,
Tuer/Spiegel richtungsabhaengig.
- Bikepark-Flowtrails: 3 Stufen hangAUFwaerts (gleiche Richtung wie
Lift-Pisten).
- Info-Button an jedem Bauwerk im Baumenue: erklaert Wirkung, Kosten,
Lage-Regeln und Lehrplan-Wissen VOR dem Bau.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Vorher drei verschraenkte Regeln (Hoehe >=6 + Talstation <=4 + Hochlagen)
-> fast nirgends baubar. Jetzt: Hoehe >=5 UND Naehe zu Tal- ODER
BERGstation (oberes Pistenende) einer Bahn - thematisch korrekt, die
Bahn bringt die Ausflugsgaeste ja hinauf. 52 baubare Felder um zwei
Bahnen statt Handvoll. Klare Fehlermeldungen je Bedingung.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>