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:
@@ -217,7 +217,7 @@
|
|||||||
],
|
],
|
||||||
"N1": [
|
"N1": [
|
||||||
"Zu feucht ganzjährig — Hufkrankheiten, Parasiten, Pilzbefall im Fell. Die Tiere magern ab. Geringer Ertrag.",
|
"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": [
|
"N2": [
|
||||||
"Tropischer Regenwald: Permanente Feuchtigkeit, zu warm, falsches Futter. Die Tiere gehen ein.",
|
"Tropischer Regenwald: Permanente Feuchtigkeit, zu warm, falsches Futter. Die Tiere gehen ein.",
|
||||||
|
|||||||
@@ -368,6 +368,38 @@ window.FarmerEngine = (function () {
|
|||||||
return pool[idx];
|
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) {
|
function harvestYear(game) {
|
||||||
if (!CROPS_INDEX) return [];
|
if (!CROPS_INDEX) return [];
|
||||||
const reports = [];
|
const reports = [];
|
||||||
@@ -434,7 +466,7 @@ window.FarmerEngine = (function () {
|
|||||||
const specificPool = crop.narratives && crop.narratives[specificKey];
|
const specificPool = crop.narratives && crop.narratives[specificKey];
|
||||||
const classPool = crop.narratives && crop.narratives[sui];
|
const classPool = crop.narratives && crop.narratives[sui];
|
||||||
const pool = (specificPool && specificPool.length > 0) ? specificPool : classPool;
|
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
|
// Trade — Markt-Hub des Jahres, ggf. regional direkt zur Konsumcity
|
||||||
|
|||||||
Reference in New Issue
Block a user