Farmer: Klick-Blocker gefixt (updateMoneyDisplay-Crash) + Konsolidierung

ROOT CAUSE: #money-display aus Header entfernt, aber updateMoneyDisplay()
las es beim Boot ungeschuetzt -> null.textContent wirft -> Boot bricht ab
-> map.on('click') wird nie gebunden -> Sim unbedienbar. Jetzt null-safe.

Konsolidierung (Thomas-Wunsch): Jahr/Markt/Erntejahr-starten in die
Anbau-Versuch-Box (farmer-side-status) statt separater Jahr-Leiste;
Jahr-Badge aus der Pille raus. Anbau-Box wieder hoeher (top 64).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-25 15:31:33 +02:00
parent b835475ef7
commit 4cbdb6bbb1
+24 -14
View File
@@ -127,11 +127,20 @@
/* ===== Side-Panel (rechts unter Year-Bar) — toggelt zwischen Picker und Report ===== */
.farmer-side {
position: absolute; right: 8px; top: 112px; z-index: 1000;
max-height: calc(100dvh - 92px - env(safe-area-inset-bottom));
position: absolute; right: 8px; top: 64px; z-index: 1000;
max-height: calc(100dvh - 80px - env(safe-area-inset-bottom));
overflow-y: auto;
width: 240px;
}
.farmer-side-status {
background: rgba(255, 255, 255, 0.95);
border-radius: 8px; padding: 8px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
display: flex; gap: 6px; align-items: center; flex-wrap: wrap;
margin-bottom: 6px;
}
.fs-year { color: #8b5a2b; font-weight: 800; font-size: 14px; white-space: nowrap; }
.farmer-side-status .farmer-harvest-btn { flex: 1 0 100%; }
/* Picker */
.farmer-picker {
@@ -491,7 +500,6 @@
<div class="ggs-topbar ggs-header" data-ggs-sim="farmer" data-ggs-no-glossar data-ggs-home="/schueler" data-ggs-music="default">
<h1 class="ggs-header-module">Landwirtschaft</h1>
<span class="ggs-header-badge">Jahr&nbsp;<span id="year-num">1</span></span>
<div class="ggs-header-spacer"></div>
<div class="ggs-header-actions">
<a href="/schueler" title="Zurück zur Schülerseite">🏠</a>
@@ -501,14 +509,6 @@
</div>
</div>
<div class="farmer-year-bar">
<span class="farmer-market" id="market-display" title="Markt-Auftrag dieses Jahres — alle Lieferungen gehen hierher">
<span class="farmer-market-label">Markt</span>
<span id="market-text"></span>
</span>
<button class="farmer-harvest-btn" id="harvest-btn" disabled>Erntejahr starten</button>
</div>
<div class="farmer-kpi" id="kpi-panel">
<div class="farmer-kpi-title">📊 Bilanz im Verlauf</div>
<div class="farmer-kpi-row">
@@ -533,6 +533,14 @@
</div>
<div class="farmer-side">
<div class="farmer-side-status">
<span class="fs-year">Jahr&nbsp;<span id="year-num">1</span></span>
<span class="farmer-market" id="market-display" title="Markt-Auftrag dieses Jahres — alle Lieferungen gehen hierher">
<span class="farmer-market-label">Markt</span>
<span id="market-text"></span>
</span>
<button class="farmer-harvest-btn" id="harvest-btn" disabled>Erntejahr starten</button>
</div>
<div class="farmer-picker" id="picker">
<div class="farmer-picker-title" id="picker-title">Anbau-Versuch</div>
<button class="farmer-undo-btn" id="undo-btn" disabled onclick="undoLastPlant()">↶ Letzte Pflanzung zurück</button>
@@ -1742,10 +1750,12 @@ function updateMarketDisplay() {
}
function updateMoneyDisplay() {
const el = document.getElementById('money-display');
el.textContent = game.money.toLocaleString('de-DE') + ' €';
const isNeg = game.money < 0;
el.classList.toggle('negative', isNeg);
const el = document.getElementById('money-display'); // optional (steht jetzt in der KPI-Sidebar)
if (el) {
el.textContent = game.money.toLocaleString('de-DE') + ' €';
el.classList.toggle('negative', isNeg);
}
if (isNeg && !_prevMoneyNeg) playSound('negative_balance');
_prevMoneyNeg = isNeg;
updateKpi(); // KPIs sind an Money-Update gekoppelt — bei jeder Bilanz-Änderung neu rendern