Files
geograsim/App/sims/_inbox/farmer/_status.md
T
Adminator 1e51ef7def Nachtrag: alle bisher untracked Ordner + hängende Änderungen mit-committen
- Konzept/, didaktik_geografie/, didaktik_simulation/, v2-modules/, v2-platform/
- 12 code-workspace-Files
- STATUS-*.md
- viele M/D/R-Änderungen an bereits getrackten Files
- .gitignore verstärkt: **/.humaninput/, **/secret_keys.txt

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-08 02:27:02 +02:00

23 KiB
Raw Blame History

Farmer — Status

Stand 2026-05-07 — Pausen-Marker (Instanz wird abgeschaltet):

Modul ist in stabilem beta-Zustand. Phase 1 vollständig, alle bisherigen Atlas-Mails beantwortet, Inbox leer. Eine Folge-Instanz kann direkt weitermachen — alles ist persistiert.

Aktueller Code-Stand (DATA_VERSION = 23)

  • App/sims/farmer/game.html — UI komplett mit KPI-Sparklines, Endbericht, Audio (Mute-Toggle), Fachinfo-Modal, Live-State-Hook (GGS_LIVE_STATE)
  • App/sims/farmer/engine.js — Welt-Engine mit Köppen-Zonen (inkl. Cfa), Continent-Transport, Importpreis-Abschlag, Monokultur, Krankheits-Cluster, Markt-Block-Cycle, Regional-Direkt-Lieferung
  • App/sims/farmer/assets/data/ — crops.json (10 Sorten), hubs.json (5 Welt-Hubs mit Konsumcity), koeppen-zones.json (9 Zonen), world-countries.json (177 Länder), info-topics.json (15 Fachbegriffe DE+Easy)
  • App/sims/farmer/assets/sounds/ — 24 ElevenLabs-SFX + 12 regionale Musik-Loops
  • App/sims/farmer/scripts/generate-sounds.php — idempotenter Sound-Generator

Offene Punkte für Folge-Instanz

  1. Atlas-Wrapper-Bug FARMER_API_BASE — zeigt auf /api, sollte /php/api. Mail in _inbox/zentrale/2026-05-03-2230-farmer-api-base-fix.md. Workaround in submitAssessment drin (Multi-Pfad-Fallback).
  2. progress.php Database-Class-Bug — Plattform-Bug, gleiche Mail.
  3. Card-Bild für module_info.card_image — bisher kein Bild gesetzt. Vorschlag in der Status-Mail an Atlas (2026-05-05 11:00).
  4. LIVE_PRIMARY_FIELDS — Atlas soll sie aus meinem Vorschlag in teacher.html eintragen (7 Spalten: Jahr, Markt, Geld €, Treffer %, CO₂ kg, Felder, 🦠).
  5. Glossar-Übernahme — Glossar-Instanz hat 15 Fachbegriffe in der Pipe. Mail vom 2026-05-04 04:00.

Phase-2-Kandidaten (didaktisch sinnvoll, nicht akut)

  • Naturkatastrophen (Dürre, Frost, Hagel, Hurrikan) als zufällige Events
  • Marktpreis-Schwankungen (Welthandel-Realität)
  • Klimawandel-Engine über Jahrzehnte (Köppen-Zonen verschieben sich)
  • Save/Load via DB (Schüler kann unterbrechen, fortsetzen)
  • Lehrplan-Integration durch Lehrplan-Instanz

Zugang für Folge-Instanz

  • Modul-URL: http://localhost/geograsim/App/farmer
  • Workspace: c:\xampp\htdocs\geograsim\farmer.code-workspace
  • ELEVENLABS_API_KEY in App/.env.local
  • Sound-Generator: php scripts/generate-sounds.php [--force] [--only=name]
  • Memory-Pointer: user_farmer.md, project_farmer_state.md in MEMORY.md

Vorher Phase 1.17 + Live-State (2026-05-05 11:00)

  • GGS_LIVE_STATE in game.html eingebaut: Plattform-Live-Client erhält alle 4 s Snapshot mit year, market, cash, hit_rate, co2_kg, fields, diseases, crops_used, countries. ~250 Bytes pro Tick.
  • Atlas-Crash-Recovery-Mail (2026-05-04 09:00) und Live-State-Mail (2026-05-05 02:50) beantwortet: _inbox/zentrale/2026-05-05-1100-farmer-status-und-live-state.md. Inkl. LIVE_PRIMARY_FIELDS-Vorschlag (7 Spalten: Jahr, Markt, Geld, Treffer-%, CO2, Felder, Krankheiten).

Vorher Phase 1.17 (04:00)

Fachinfo-Modal mit 15 Begriffen zweisprachig (DE + Leichte Sprache). Plus Glossar-Inbox-Mail.

  • Fachinfo-Modal im Spiel via -Button in Topbar:
    • 15 Begriffe als Card-Grid (Klimazone, Köppen-Geiger, FAO Eignung, Monokultur, Bodenmüdigkeit, Überweidung, Krankheits-Ausbruch, Welt-Hafen, Reefer-Container, CO₂-Fußabdruck, Importpreis-Abschlag, Aquakultur, Subtropisch, Permafrost, Verderblich)
    • Klick auf Card → Detail-Ansicht mit Standard-DE-Text + grüner Leicht-Sprache-Box (A1-A2-Niveau)
    • Quelle: assets/data/info-topics.json
  • Glossar-Mail an Glossar-Instanz: 10 plattformweit relevante Begriffe (Klimazone, Köppen, Hafen, Reefer, CO₂, Permafrost, Cfa, etc.) zur Übernahme ins zentrale glossar-Schema. Inbox: _inbox/glossar/2026-05-04-0400-farmer-fachbegriffe.md

Vorher Phase 1.16 (03:30)

Phase 1.16 — Neue Klimazone subtropisch_feucht (Cfa) für China-Yangtze, US-Südost, Süd-Brasilien etc. + Undo-Pflanzung + Importpreis-Abschlag. Modul bleibt beta.

  • Neue Köppen-Zone subtropisch_feucht (Cfa): Heißfeuchte Sommer, milde Winter. Polygone für China-Süd-Mitte (lat 2032, lon 100123), US-Südost (lat 2538, lon 100 bis 75), Süd-Brasilien (lat 33 bis 20, lon 60 bis 45), Süd-Japan, Ost-Australien, NE-Indien. Wird VOR gemaessigt_feucht geprüft (im Polygon-Lookup zuerst gefunden).
  • gemaessigt_feucht reduziert auf nur kühle Cfb-Bereiche (Mitteleuropa, US-Pazifik-NW, Nord-China, Nord-Japan, Neuseeland).
  • Eignungs-Updates in jeder Sorte: Reis subtropisch_feucht=S1, Mais=S1, Weizen/Kaffee=S2, Banane=S3, Olive/Datteln=N1, Tiere=N1/N2. Schüler kann jetzt Reis in Schanghai/Yangtze pflanzen → S1.
  • defaultZoneByLatitude erweitert: 2332° → subtropisch_feucht, 3238° → mittelmeer (war 2335), Verschiebung der Übergänge.
  • Verifikation: Schanghai/Guangzhou/Houston/Atlanta/SP-Süd → subtropisch_feucht. Berlin/Wien/Beijing → gemaessigt_feucht (korrekt).
  • Plus: Undo-Pflanzung-Button im Picker.
  • DATA_VERSION = 23.

Vorher Phase 1.15 (02:30)

  • Continent-basierte Modus-Wahl statt Distanz-Schwelle. Origin und Hub im selben Kontinent → 🚚 LKW, sonst → 🚢 Schiff. Damit gehen Ukraine/Rumänien/ Sibirien → Hamburg per LKW (vorher fälschlich Schiff über 1500 km). Hub-Daten in hubs.json haben jetzt continent-Property.
  • Importpreis-Abschlag 30 % auf Brutto bei Cross-Continent-Lieferung. Realistik: lokale Konkurrenz drückt Importpreis. Ergebnis didaktisch: Massengut (Weizen, Mais) wird über See unattraktiv, Hochmargen-Tropen (Banane, Datteln, Kaffee) bleiben profitabel. Genau wie echter Welthandel. Bericht zeigt zusätzliche Zeile „🌍 Importpreis-Abschlag (Europa → Nordamerika, 30 %)" zwischen Brutto und Transport.
  • CO₂-Lehre wird stärker: LKW hat 6× mehr CO₂ als Schiff pro Tonne-km. Sibirien → Hamburg (4400 km LKW) = 394 kg CO₂ vs. Senegal → Hamburg (4900 km Schiff Reefer) = 147 kg CO₂. Schiff über Ozean ist sauberer als LKW über Eurasien.
  • DATA_VERSION = 22.

Phase 1.13/1.14 (zwischen 01:00 und 02:30)

  • KPI-Sparklines mit Achsen-Skala (Y auto, X 1..22)
  • Schiff-/LKW-/Flieger-Volume separat einstellbar (Schiff 0.35)
  • buildKpiTimeSeries iteriert über alle Reports (nicht nur abgeschlossene Jahre)

Vorher Phase 1.12 (00:30)

  • KPI-Sparklines statt nur aktueller Zahlenwerte: Einnahmen, Treffer-Quote und CO₂ werden als Mini-SVG-Linien dargestellt.
    • X-Achse fix 1..22 (volle Spielzeit, „geht sich bis zum Schluss aus")
    • Y-Achse auto-skaliert mit 10 % Reserve, außer Treffer-Quote (fix 0..100 %)
    • Gestrichelte vertikale Linie bei Jahr 11 = Endbericht-Trigger zur Orientierung
    • Aktueller Wert mit Punkt markiert, Y-Max-Label oben rechts
    • Farben: Einnahmen grün, Treffer-Quote braun, CO₂ rot
  • Per-Sound-Volume-Tabelle (SOUND_VOLUMES): vehicle_ship 0.35 (war 0.7), vehicle_plane/truck 0.55. Andere SFX bleiben bei 0.7 default.

Vorher Phase 1.12 (00:30)

  • 24 Sound-Effekte via ElevenLabs Sound Generation API generiert (scripts/generate-sounds.php):
    • 14 Aktions-SFX: harvest_start, vehicle_truck/ship/plane, vehicle_arrive, disease_outbreak, monoculture_warn, year_advance, unlock_crop, negative_balance, end_report_open, reset, report_open/next
    • 10 Per-Sorten-Sounds (Tiere mit Geräuschen, Pflanzen mit Rascheln): crop_wheat (Halme rascheln) · crop_banana (Tropenblätter) · crop_reindeer (Brunftruf) · crop_camel (Kamelgrunzen) · crop_rice (Wasserplätschern) · crop_coffee (Hochlandbrise) · crop_dates (Palmwedel) · crop_corn (Maisrauschen) · crop_fish (Wasser-Splash) · crop_olive (Mediterran-Cicadas)
  • 12 Musik-Loops (vom User geliefert) in assets/sounds/music/: hamburg1-2, newyork1-2, shanghai1-2, saopaulo1-2, dubai1-4. Pro Markt zufällige Auswahl, wechselt automatisch beim Markt-Block-Wechsel.
  • Audio-System:
    • Mute-Toggle 🔊/🔇 in Topbar (persistiert in localStorage)
    • Sounds preloaded beim Boot
    • playSound() klont Audio-Element für überlappende Wiedergabe
    • Browser-Autoplay-Block durch erste User-Interaktion (Welcome-Close) gelöst
    • Hintergrundmusik bei 20 % Lautstärke (nicht ablenkend)
  • API-Key in App/.env.local als ELEVENLABS_API_KEY=... gespeichert.
  • Generierungs-Skript idempotent + --force/--only=name Flags.

Vorher Phase 1.11 (23:30)

  • Endbericht-Trigger auf Jahr 11 vorgezogen (= 10 abgeschlossene Jahre) → Standard-Spieldauer 1020 Min wie gewünscht. Schüler*in kann nach Endbericht via „Weiter arbeiten" bis Jahr 22+ (alle 10 Sorten unlocked).
  • Audio-System:
    • Mute-Toggle 🔊/🔇 in Topbar, persistiert in localStorage
    • playSound(name, opts) respektiert audioEnabled
    • startBackgroundMusic() Stub für Hintergrundmusik
    • bgMusicAudio wird bei Mute pausiert
  • SOUNDS-TODO.md komplett überarbeitet:
    • 15 Sound-Effekte (Sound Effects API)
    • 6 Hintergrundmusik-Loops (Suno/Stable Audio empfohlen)
    • Stil: ambient-akustisch, optional regional pro Markt
    • Generierungs-Prompts für jeden Sound

Vorher Phase 1.10 (23:00)

Sterne-Wertung, Plattform-Submit, Reset-Funktion. Modul bleibt beta.

Phase 1.10 — Endbericht (final step)

  • Endbericht-Modal öffnet automatisch nach Erreichen Jahr 16 (= 1 voller Hub-Cycle). Zeigt:
    • ☆ Sterne (15 abhängig vom Score)
    • Score 0100 (gewichteter Durchschnitt aus 7 Kategorien)
    • 6 Stat-Kacheln (Einnahmen, Treffer-Quote, CO₂, Krankheiten, Sortenvielfalt, Länder)
    • Verbesserungs-Tipps (regelbasiert, je nach schwachen Bereichen)
    • Submit-Status zur Plattform
  • Score-Berechnung (computeFinalScore):
    • Money 25 % (linear bis 30 000 €)
    • Hit-Rate 20 % (S1+S2 Anteil)
    • CO₂ 15 % (invertiert, < 1 000 kg/Jahr → 100, > 5 000 → 0)
    • Disease-Avoidance 10 %
    • Crops/Countries/Climates je 10 %
  • Plattform-Submit: POST /php/api/progress.php mit action='submit_assessment' und vollem data-Payload (level, stars, score, duration_ms, results, action_log mit letzten 100 Reports). Mit Multi-Pfad-Fallback wegen Wrapper-Bug (siehe Inbox).
  • Reset-Funktion: kompletter Restart inkl. Marker, Kreise, Counter, Money. Bestätigungs-Dialog vor Löschung.
  • Inbox an zentrale: 2026-05-03-2230-farmer-api-base-fix.md — Wrapper-Bug FARMER_API_BASE zeigt auf /api statt /php/api. Plus: progress.php referenziert unbekannte Database-Klasse (Plattform-Bug, nicht Farmer).

Vorher Phase 1.9 (22:00)

  • 10 Sorten mit Unlock-Plan über 22 Jahre: Jahr 1: Weizen / Banane / Rentier · Jahr 4: Kamel · Jahr 7: Reis · Jahr 10: Kaffee · Jahr 13: Datteln · Jahr 16: Mais · Jahr 19: Fisch (aquatic) · Jahr 22: Olive
  • 🐟 Fisch ist die erste aquatic Sorte: S1 in Wasser, N2 auf Land. Engine unterstützt das via crop.aquatic + crop.suitability.wasser Lookup.
  • KPI-Panel links mit 4 Live-Kennzahlen: 💰 Einnahmen (kumulativ) · 🎯 Treffer-Quote (S1+S2 % aller Versuche, mit Bar) · 🌫 CO₂-Fußabdruck (kumulativ, Farb-Hinweis bei >5t/Jahr) · 📦 Versuche · 🦠 Krankheiten
  • Marker-Schrumpfung nach RECOVERY_YEARS (4): Symbol schrumpft linear über FADE_YEARS (8) auf min. 32 % der Größe. Banane bleibt erkennbar, alte Felder werden zu kleinen Hinweis-Punkten ohne Wirkung.
  • Realistische Frachtraten (UNCTAD/Eurostat 2023): LKW 0,07 / Schiff 0,015 / Flieger 1,5 €/t·km. Reefer-Aufschlag 1,5× Kosten + 2× CO₂.
  • CO₂-Faktoren (Umweltbundesamt 2022): LKW 90 / Schiff 15 / Flieger 1000 g/t·km.
  • OSM-Deutsch-Karte statt Carto Positron: deutsche Beschriftung + Vegetations-Färbung (Wald grün, Wüste beige, Tundra ocker).
  • Welt-Wrap aus + maxBounds (kein Klick mehr in der „zweiten" Welt).
  • DATA_VERSION = 20.

Vorher Phase 1.8 (19:30)

  • Regionale Lieferung: für jedes Feld wird die nächste Konsumcity des aktiven Markt-Hubs gesucht. Wenn diese < REGIONAL_DELIVERY_KM (2000 km) entfernt ist, fährt das Vehicle direkt dorthin (kein Hub-Umweg). Andernfalls geht es international zum Hub und wird von dort distribuiert.
  • Engine speichert pro Report destination, isRegional. Bericht zeigt bei Direktlieferung „🚚 LKW → Paris (Hamburg-Region) (206 km)". Bei Hub-Lieferung wie bisher „🚢 Schiff → Hamburg (4500 km)".
  • Distribution-Animation vom Hub läuft nur, wenn mindestens eine internationale Lieferung am Hub angekommen ist. Bei rein regionaler Belieferung sind alle Vehicles bereits direkt bei den Konsument*innen.
  • fitBounds zieht jetzt auch die echten Ziele (destination) ein, nicht nur den Hub — Direktlieferungen werden im Welt-View mit eingerahmt.
  • DATA_VERSION = 18.

Beispiel-Routen mit Hamburg-Markt

Anbau Distanz Hub Distanz nächste City Direkt?
Frankreich (47°N, 2.5°E) → Paris 901 km 206 km ja → Paris direkt
Lappland → Berlin 1790 km 1829 km ja → Berlin direkt
Marokko → Paris 2854 km 2135 km nein → über Hamburg
Senegal → Paris 4907 km 4176 km nein → über Hamburg

Vorher Phase 1.7b (18:30)

  • Welt-Wrap aus: worldCopyJump: false, maxBounds: [[-85,-180],[85,180]], maxBoundsViscosity: 1.0, noWrap: true auf Tile-Layer. Klick in der „zweiten" Welt rechts vom Bering-Strait nicht mehr möglich → kein Bug „Land als Wasser".
  • Bodenwirkungs-Kreise 20 % kleiner: monoculture.radiusKm 1500 → 1200 km (Kreis-Radius pro Feld 750 → 600 km). Karte wirkt aufgeräumter.
  • Markt-Hub blinkt grün: aktiver Hub bekommt .active CSS-Klasse mit farmer-hub-pulse Animation (1.4 s Cycle). Wechselt automatisch alle 3 Jahre.
  • Distribution-Animation: nach Vehicle-Ankunft am Hub fahren 3 zufällige LKW vom Hub zu regionalen Konsumcity. Pro Hub 5 vordefinierte Cities in hubs.json (Hamburg → Berlin/Paris/Wien/Mailand/Warschau, NY → Toronto/Boston/ Atlanta/Chicago/Miami, Shanghai → Tokyo/Seoul/Hongkong/Taipeh/Manila, São Paulo → Rio/BH/Asunción/BA/Brasília, Dubai → Riyadh/Tehran/Karachi/Mumbai/ Cairo). Pin-Toast mit Stadtname am Zielort. Visuell, kein Geld-Effekt.
  • Transport 150 % Zeit: alle speedKmPerSec /1.5 in hubs.json, animateOneTrade Cap auf 225012000 ms erhöht.
  • DATA_VERSION = 17b.

Vorher Phase 1.7a (17:30)

  • Markt-Block: jeder Markt-Hub bleibt 3 Jahre aktiv (war: 1 Jahr) — Schüler*in hat Zeit, Anbau auf die passende Klimazone auszurichten. Anzeige im Chip zeigt Restjahre („🇪🇺 Hamburg (noch 2 Jahre)"). Block-Plan: Jahr 13 Hamburg · 46 New York · 79 Shanghai · 1012 São Paulo · 1315 Dubai · ...
  • Verschiff-Karte fittet alle Punkte: vor animateTrades wird flyToBounds über alle Reports + Hub gemacht (statt fixem Welt-Center) → USA, Asien etc. immer komplett sichtbar während Vehicle-Animation. maxZoom: 3 hält die Übersicht.
  • DATA_VERSION = 17a.

Vorher Phase 1.7 (16:00)

  • Markt-Auftrag pro Jahr: zyklisch durch alle 5 Hubs (Jahr 1=Hamburg, 2=New York, 3=Shanghai, 4=São Paulo, 5=Dubai, 6=Hamburg ...). Alle Lieferungen gehen jährlich an den Auftrags-Hub. Anzeige in Year-Bar. Lehrt: Anbau in der Nähe des Marktes ist optimal (klassische Wirtschaftsgeographie).
  • Bodenwirkungs-Kreise: Jedes Feld hat einen 750-km-Radius-Kreis (= halber Monokultur-Radius). Berühren sich zwei Kreise gleicher Sorte → Bodenmüdigkeit greift, ab 3 verbundenen → Krankheits-Risiko. Visuell elegant: Sichtbarkeit = Logik.
  • Schrumpfung: Pro Jahr schrumpft jeder Kreis um 25 %. Nach 4 Jahren (RECOVERY_YEARS) ist der Boden erholt — Kreis verschwindet, Marker bleibt als Lerngeschichte.
  • Reefer-Schiff statt Flieger: Banane wird jetzt realistisch per gekühltem Schiff transportiert (1.5× Standard-Schiff-Preis). Flieger-Trigger raus — entspricht echter Bananenlogistik (Ecuador → Hamburg per Schiff).
  • DATA_VERSION = 17.

Vorher

Modul bleibt beta. Vergangene Felder gefüllt eingefärbt (Lerngeschichte sichtbar), Animation halbiert + Welt-Zoom davor.

Monokultur-Mechanik (monoculture in crops.json):

  • Radius 1500 km, Bodenmüdigkeit 15 % pro nahem Feld gleicher Sorte (max 60 %)
  • Krankheits-Ausbruch: ab 3 verbundenen Feldern (transitive Cluster) jährlich 25 % Wahrscheinlichkeit für Totalausfall — deterministisch via Cluster-Hash
  • Diagnose-Pool je Sorte: Schwarzrost (Weizen), Panama-Krankheit / Schwarze Sigatoka (Banane), Hufrehe / Insektenplage (Rentier), MERS / Trypanosomiasis (Kamel)

Unlock-System:

  • Jede Sorte hat unlockYear in crops.json
  • Counter pro Sorte: 13 Sorten=3, 4=2, 5=2, 6+=1 (Gesamt-Interventionen sinken pro Sorte mit zunehmender Vielfalt)
  • 🐪 Kamel ab Jahr 4 freigeschaltet (Wüsten-Spezialist, S1 in Wüste + tropisch trocken)
  • Toast-Hinweis bei Freischaltung

Sound-System (Stub):

  • playSound(name) in game.html als Stub (Console-Log)
  • 13 Sound-Hooks an passenden Stellen verdrahtet (plant, harvest, vehicle_*, vehicle_arrive, disease_outbreak, year_advance, unlock_crop, etc.)
  • Liste mit ElevenLabs-Prompts: App/sims/farmer/SOUNDS-TODO.md
  • Aktivierung sobald ELEVENLABS_API_KEY da ist

Vergangene Felder gefüllt: alte (year < game.year) Marker bekommen Eignungsfarbe als Hintergrund-Füllung (Emoji bleibt sichtbar). Diesjährige Ernte: nur Ring + weißer Hintergrund (frisch-Look).

Animation langsamer + Welt-Zoom: Geschwindigkeiten halbiert (LKW 750/Schiff 2000/Flieger 3000 km/sec), Animation max 8 sec, Geld-Toast 2.5 sec sichtbar. Vor animateTrades zoomt Karte auf Welt-Übersicht (zoom 3, [30,15]).

DATA_VERSION = 16 — JSON-Files cache-bust automatisch.

Country-Lookup: world-land.json ersetzt durch world-countries.json (Natural Earth 110m, 178 KB, 177 Länder mit name_de/iso2/continent). Berichte zeigen jetzt „📍 Brasilien (South America) · Tropisch feucht".

Sortenspezifische Einheiten + Preise:

  • 🌾 Weizen: 1 Tonne Weizen, S1 = 250 €
  • 🍌 Banane: 1 Tonne Bananen, S1 = 750 €, verderblich (über 4000 km Flieger nötig)
  • 🦌 Rentier: 1 Rentier (~80 kg Fleisch), S1 = 1500 €

Transportkosten in € pro Tonne-km × Sorten-Tonnage. LKW 0.15 / Schiff 0.02 / Flieger 0.50. Rentier (0.08 t pro Tier) ist transport-leicht → fast immer profitabel. Banane in Amazonas → Flieger → massiver Verlust (didaktisch perfekt).

UI-Refactor: Berichte rechts statt Modal. Eine Card nach der anderen. Karte fliegt zur Pflanzungs-Position, Marker pulsiert (CSS-Animation). Picker versteckt während Bericht-Modus, kommt nach Trade-Animation mit aufgefüllten Countern zurück.

Diagnose-Texte erweitert — pro Eignungsklasse 2 Texte mit konkretem Wirkmechanismus (Temperaturen, Niederschlagsmengen, Tonnage pro Hektar etc.).

Land-Wasser: Natural Earth 1:110m Land-Polygone (world-land.json, 85 KB, 127 Features, 5143 Punkte). 9/9 Sanity-Tests bestanden: Wien=Land, Hudson Bay=Wasser, Mittelmeer=Wasser, Sahara=Land, etc. Auto-Switch entfernt: wenn die gewählte Sorte aufgebraucht ist, zeigt ein Toast die anderen verfügbaren Sorten — User muss aktiv wechseln (verhindert „ich dachte, ich pflanze noch Rentier").

Was passiert ist

  • 2026-05-03 00:30 — Onboarding von Logistik-Instanz erhalten.
  • 2026-05-03 00:45 — Konzept mit Thomas iteriert + freigegeben.
  • 2026-05-03 00:50 — Atlas-Auftrag in _inbox/zentrale/.
  • 2026-05-03 01:25 — Logistik liefert Skelett in Atlas-Stellvertretung.
  • 2026-05-03 02:15 — Phase 1 gebaut + DB-Status auf beta gesetzt.

Phase 1.5 — Re-Design (Polygon-Reveal raus, Trade-Mechanik rein)

  • Polygone nicht mehr sichtbar — Köppen-Lookup bleibt im Hintergrund, aber visuell verschwinden die rechteckigen Reveal-Flächen (waren didaktisch schlecht: verraten Klimazone vor Lernarbeit, optisch überladen).
  • 3 Versuche pro Sorte pro Jahr — Counter im Picker (3/3 → 0/3), Refill bei nextYear. Pflanzen ist überall erlaubt (auch Wasser).
  • Field-Marker mit Ring — vor Ernte: dezenter brauner Rand. Nach Ernte: farbiger Ring in Eignungs-Farbe (🟢🟩🟡🟠🔴). Ringe bleiben permanent — Lernkarte wächst sichtbar mit. Klick auf Marker zeigt Diagnose-Popup.
  • 5 Welt-Hubs als permanente Karten-Marker (Hamburg, New York, Shanghai, São Paulo, Dubai). Jede Ernte sucht den nächsten Hub.
  • Trade-Animation nach Erntebericht: 🚚 / 🚢 / ✈️ rutscht von Marker zu Hub. Verkehrsmittel-Wahl: Verderbliches + Distanz > 4000 km → Flieger; < 1500 km → LKW; sonst Schiff. Beim Ankommen: Geld-Toast am Hub.
  • Geld-Bilanz in Topbar — wird grün/rot je nach Vorzeichen. Brutto: 100 € (S1) bis 0 € (N2). Transport: € pro km × Modus-Faktor. Banane mitten im Amazonas → top Eignung, aber langer Schiffstransport → wenig Netto. Banane in Marokko → S2 + kurzer Schiffstransport → bessere Bilanz.

Was vorher Phase 1 war (nicht mehr aktiv)

  • Visueller Polygon-Reveal-Layer in Eignungsfarben: ersetzt durch Marker-Ringe.

  • Welcome-Text auf neue Mechanik aktualisiert.

  • assets/data/koeppen-zones.json — vereinfachte Köppen-Geiger-Zonen (8 Großzonen, 36 Polygone insgesamt) als GeoJSON.

  • assets/data/crops.json — 3 L1-Sorten (🌾 🍌 🦌) mit FAO-GAEZ- Eignungsmatrix (3 × 8 = 24 Lookup-Werte) und Diagnose-Texten (5 Eignungsstufen × 2-3 Narrative).

  • engine.js — Stubs implementiert: loadData, getZoneAt (Point-in- Polygon), getSuitability, plant (mit Zone-Reveal), harvestYear (mit deterministischem Diagnose-Pick via Mulberry32), nextYear.

  • game.html — Welt-Karte mit Picker rechts, Reveal-Layer (eingefärbt nach aktuell gewählter Sorte), Welcome- und Erntebericht-Modal, iPad-Pattern (dvh, safe-area, sticky-actions, Float-✕), Easy-Sprache via pickText().

Verifikation lokal

  • curl localhost/geograsim/App/farmer → HTTP 200, 16.8 KB
  • engine.js, crops.json, koeppen-zones.json → alle HTTP 200
  • Wrapper-Injection korrekt: FARMER_BASE='/geograsim/App/sims/farmer/', FARMER_TILE_PROXY='/geograsim/App/php/tile-proxy.php', engine.js mit absolutem Pfad.
  • DB: module_info.status='beta', Title Landwirtschaft, Icon 🌾.

Was nicht in Phase 1 ist (kommt Phase 2 / 3)

  • Naturkatastrophen (Dürre, Hagel, Frost) — Phase 2
  • Budget / Ökonomie — Phase 2
  • Mehr Sorten (Mais, Reis, Kartoffel, Kaffee, Rind, Schaf, Kamel) — Phase 2
  • Klimawandel-Engine, Schnellvorlauf, Marktpreise — Phase 3

Test am iPad

URL: https://geograsim.at/farmer (nach Deploy) bzw. lokal: http://localhost/geograsim/App/farmer.

Erwartetes Verhalten:

  • Welcome-Modal öffnet sich, schließt mit „Los arbeiten" oder Float-✕.
  • Karte zeigt Welt im Carto-Positron-Stil.
  • Picker rechts mit 3 Sorten, eine ist aktiv (🌾 default).
  • Klick auf Land → Crop-Marker, Köppen-Zone wird in Eignungs-Farbe eingefärbt, „Erntejahr starten" wird klickbar.
  • Klick auf Wasser → Toast „🌊 Hier ist Wasser".
  • Klick auf andere Sorte im Picker → Reveal-Layer wechselt Farben.
  • „Erntejahr starten" → Bericht-Modal mit Diagnose pro Feld.
  • „Weiter zum nächsten Jahr" → Year-Counter zählt hoch, Felder werden zu „fallow", Marker bleiben sichtbar.