Klima: Aktuell-Linien gruen->rot (CO2/Temp/Geflutet/Budget/Bev.) + "Nochmal spielen" setzt wirklich zurueck

- teacher.html: LIVE_PRIMARY_FIELDS.klima Kennzahlen mit _liveBar-Ampel (absolute Skalen), _liveBar +Nachkomma-Param; tick-Spalte entfernt (redundant zu Jahr)
- game-2d/3d: beendete Laeufe (phase=end) werden beim Resume verworfen -> "Nochmal spielen"/erneutes Oeffnen startet frisch statt im Endbildschirm

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 17:17:33 +02:00
parent eb67cbc79f
commit 8cc48b1bc6
3 changed files with 16 additions and 9 deletions
+4 -1
View File
@@ -1009,7 +1009,7 @@
<div class="ggs-results-stats" id="end-stats"></div>
<div style="display:flex;gap:12px;justify-content:center">
<button class="ggs-btn ggs-btn-primary" onclick="location.reload()">Nochmal spielen</button>
<button class="ggs-btn ggs-btn-primary" onclick="for(var i=1;i<=3;i++)localStorage.removeItem('ggs-save-klima-'+i);location.reload()">Nochmal spielen</button>
<button class="ggs-btn ggs-btn-secondary" onclick="location.href='../../'">Zurück</button>
</div>
</div>
@@ -4148,6 +4148,9 @@ function tryResume() {
try {
const d = JSON.parse(raw);
if (!d || !d.tick || d.tick <= 0) continue;
// Beendete Läufe nie wieder aufnehmen — sonst landet „Nochmal spielen" /
// erneutes Öffnen direkt im Endbildschirm. Alten Stand verwerfen.
if (d.phase === 'end') { localStorage.removeItem(SAVE_KEY_BASE + '-' + lvl); continue; }
deserializeState(d);
hideOverlay('level-select-overlay');
state.phase = (d.phase === 'citizen' ? 'playing' : d.phase) || 'playing';
+3
View File
@@ -5641,6 +5641,9 @@ function tryResume() {
try {
const d = JSON.parse(raw);
if (!d || !d.tick || d.tick <= 0) continue;
// Beendete Läufe nie wieder aufnehmen — sonst landet erneutes Öffnen
// direkt im Endbildschirm. Alten Stand verwerfen.
if (d.phase === 'end') { localStorage.removeItem(SAVE_KEY_BASE + '-' + lvl); continue; }
deserializeState(d);
hideOverlay('level-select-overlay');
state.phase = (d.phase === 'citizen' ? 'playing' : d.phase) || 'playing';
+9 -8
View File
@@ -614,7 +614,7 @@ function _fmtSeconds(s) {
// goodWhen 'high' → grün ab >= 60% der Range, gelb ab >= 30%, sonst rot
// goodWhen 'low' → invers (z. B. Fehlerzahl, idleMs)
// goodWhen 'mid' → neutral grau (z. B. Progress)
function _liveBar(val, min, max, goodWhen) {
function _liveBar(val, min, max, goodWhen, dec) {
if (val == null || isNaN(val)) return '<span style="color:#9a9a9a"></span>';
var span = (max - min) || 1;
var pct = Math.max(0, Math.min(100, ((val - min) / span) * 100));
@@ -626,12 +626,13 @@ function _liveBar(val, min, max, goodWhen) {
} else {
c = pct >= 60 ? '#5a8a5e' : pct >= 30 ? '#c9913a' : '#c07a6b';
}
var disp = (dec != null) ? Number(val).toFixed(dec) : Math.round(val);
return ''
+ '<span style="display:inline-flex;align-items:center;gap:.35rem;font-variant-numeric:tabular-nums">'
+ '<span aria-hidden="true" style="display:inline-block;width:42px;height:7px;border-radius:99px;background:rgba(0,0,0,.08);overflow:hidden">'
+ '<span style="display:block;height:100%;width:'+pct.toFixed(0)+'%;background:'+c+'"></span>'
+ '</span>'
+ '<span style="color:'+c+';font-weight:700;font-size:.8rem;min-width:1.6em;text-align:right">'+Math.round(val)+'</span>'
+ '<span style="color:'+c+';font-weight:700;font-size:.8rem;min-width:1.6em;text-align:right">'+disp+'</span>'
+ '</span>';
}
@@ -732,13 +733,13 @@ var LIVE_PRIMARY_FIELDS = {
],
klima: [
{k:'level', label:'Stufe'},
{k:'tick', label:'Tick'},
{k:'year', label:'Jahr'},
{k:'budget', label:'Budget', unit:'Mio €'},
{k:'co2', label:'CO₂', unit:'ppm'},
{k:'temp', label:'Temp', unit:'°C'},
{k:'floodedPct', label:'Geflutet', fmt:function(v){ return _liveBar(v, 0, 100, 'low'); }},
{k:'population', label:'Bev.'},
// Kennzahlen mit Ampel-Linien (grün→rot), absolute Skalen wie im Spiel:
{k:'co2', label:'CO₂', unit:'ppm', fmt:function(v){ return _liveBar(v, 280, 700, 'low'); }},
{k:'temp', label:'Temp', unit:'°C', fmt:function(v){ return _liveBar(v, 14, 20, 'low', 1); }},
{k:'floodedPct', label:'Geflutet', unit:'%', fmt:function(v){ return _liveBar(v, 0, 100, 'low'); }},
{k:'budget', label:'Budget', unit:'Mio €', fmt:function(v){ return _liveBar(v, -500, 3000, 'high'); }},
{k:'population', label:'Bev.', fmt:function(v){ return _liveBar(v, 1500, 4500, 'high'); }},
{k:'measures', label:'Maßn.'},
{k:'speed', label:'Speed', unit:'×'},
],