# 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 20–32, lon 100–123), US-Südost
  (lat 25–38, 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**: 23–32° → subtropisch_feucht,
  32–38° → mittelmeer (war 23–35), 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 10–20 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 (1–5 abhängig vom Score)
  - Score 0–100 (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 2250–12000 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 1–3 Hamburg · 4–6 New York · 7–9 Shanghai · 10–12 São Paulo · 13–15 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: 1–3 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.
