From b32097b617574e80f1234663e4c5db6232ec3eee Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 22 Aug 2026 12:19:32 +0200 Subject: [PATCH] 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 --- App/sims/farmer/assets/data/crops.json | 2 +- App/sims/farmer/engine.js | 34 +++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/App/sims/farmer/assets/data/crops.json b/App/sims/farmer/assets/data/crops.json index 5a3c46c..81b7821 100644 --- a/App/sims/farmer/assets/data/crops.json +++ b/App/sims/farmer/assets/data/crops.json @@ -217,7 +217,7 @@ ], "N1": [ "Zu feucht ganzjährig — Hufkrankheiten, Parasiten, Pilzbefall im Fell. Die Tiere magern ab. Geringer Ertrag.", - "Kamele in Nordeuropa? Sie überleben kurz, aber die Feuchtigkeit zerstört ihr Wesen. Keine Wirtschaftsbasis." + "Für Kamele viel zu feucht: Sie überleben kurz, aber die ständige Feuchtigkeit zerstört Fell und Hufe. Keine Wirtschaftsbasis." ], "N2": [ "Tropischer Regenwald: Permanente Feuchtigkeit, zu warm, falsches Futter. Die Tiere gehen ein.", diff --git a/App/sims/farmer/engine.js b/App/sims/farmer/engine.js index 48ee0ad..de092bd 100644 --- a/App/sims/farmer/engine.js +++ b/App/sims/farmer/engine.js @@ -368,6 +368,38 @@ window.FarmerEngine = (function () { return pool[idx]; } + // Zone-charakteristische Stichwörter: wählt bei mehrdeutigen Pools den + // KLIMAPASSENDEN Grund-Text statt zufällig einen klimafremden (Bug: Polar-Text + // auf tropischem Feld). Greift zusätzlich zu den spezifischen + // narratives[sui+'_'+zoneId]-Keys. + const ZONE_KEYWORDS = { + tropisch_feucht: ['tropisch', 'regenwald', 'schwül', 'permanente feucht', 'ganzjährig feucht'], + tropisch_trocken: ['savanne', 'tropisch trocken', 'regenzeit', 'trockenzeit'], + wueste: ['wüste', 'aride', 'dürre', 'extrem trocken', 'sand'], + mittelmeer: ['mittelmeer', 'mediterran'], + subtropisch_feucht: ['subtropisch', 'schwül'], + gemaessigt_feucht: ['gemäßigt', 'mitteleurop', 'feuchtes klima'], + kontinental: ['kontinental', 'steppe', 'binnenland'], + boreal: ['boreal', 'taiga', 'kurze sommer', 'frost'], + polar: ['polar', 'permafrost', 'arktis', 'ewiger schnee', 'tundra', 'schnee-tier'], + }; + function pickZoneAware(pool, zoneId, rng) { + if (!pool || pool.length === 0) return '(kein Bericht)'; + if (pool.length === 1) return pool[0]; + const kws = ZONE_KEYWORDS[zoneId]; + if (kws) { + let best = null, bestScore = 0; + for (const t of pool) { + const s = (typeof t === 'string' ? t : (t && t.de) || '').toLowerCase(); + let score = 0; + for (const kw of kws) if (s.indexOf(kw) >= 0) score++; + if (score > bestScore) { bestScore = score; best = t; } + } + if (best) return best; // klar passender Text gefunden + } + return pickFromPool(pool, rng); // sonst wie bisher + } + function harvestYear(game) { if (!CROPS_INDEX) return []; const reports = []; @@ -434,7 +466,7 @@ window.FarmerEngine = (function () { const specificPool = crop.narratives && crop.narratives[specificKey]; const classPool = crop.narratives && crop.narratives[sui]; const pool = (specificPool && specificPool.length > 0) ? specificPool : classPool; - narrative = pickFromPool(pool, rng); + narrative = pickZoneAware(pool, field.zoneId, rng); } // Trade — Markt-Hub des Jahres, ggf. regional direkt zur Konsumcity