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>
This commit is contained in:
2026-08-22 12:19:32 +02:00
parent 257b5e5099
commit b32097b617
2 changed files with 34 additions and 2 deletions
+1 -1
View File
@@ -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.",
+33 -1
View File
@@ -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