diff --git a/App/teacher.html b/App/teacher.html
index 9956861..3e6f9e0 100644
--- a/App/teacher.html
+++ b/App/teacher.html
@@ -574,7 +574,7 @@ function _liveToggleHtml() {
+ '
'
+ ' '
+ ' '
- + ' '
+ + ' '
+ ' '
+ '
'
+ (_liveMode==='uebersicht' ?
@@ -1284,6 +1284,7 @@ function _liveMood(simId, s) {
if (_liveNeedsHelp(simId, s)) return 'bad';
switch (simId) {
case 'weltkueche': return (s.mistakesInDish||0) <= 2 ? 'good' : (s.mistakesInDish >= 8 ? 'bad' : 'mid');
+ case 'farmer': return (s.hit_rate==null) ? 'mid' : (s.hit_rate >= 60 ? 'good' : s.hit_rate >= 30 ? 'mid' : 'bad');
case 'klima': case 'klima-3d': return ((s.floodedPct==null?100:s.floodedPct) < 20 && (s.budget||0) >= 0) ? 'good' : 'mid';
case 'busfahrt': case 'fluggesellschaft': return (s.budget==null?0:s.budget) >= 5000 ? 'good' : (s.budget < 0 ? 'bad' : 'mid');
case 'tourismustal': return (s.money==null?0:s.money) >= 4000 ? 'good' : (s.money < 0 ? 'bad' : 'mid');
@@ -1433,14 +1434,13 @@ async function renderLive() {
html += ' | ';
html += '';
- // Spalten-Maxima für relative Mini-Balken (über alle Zeilen dieser Sim).
+ // Spalten-Maxima für relative Mini-Balken (über alle Zeilen dieser Sim) —
+ // für ALLE Zahlenspalten, damit jede Zahl einen kleinen Vergleichs-Balken bekommt.
var colMax = {};
fields.forEach(function(f) {
- if (f.bar && f.bar.kind === 'rel') {
- var mx = 0;
- grp.rows.forEach(function(r) { var val = (r.state||{})[f.k]; if (typeof val === 'number' && !isNaN(val)) mx = Math.max(mx, Math.abs(val)); });
- colMax[f.k] = mx;
- }
+ var mx = 0;
+ grp.rows.forEach(function(r) { var val = (r.state||{})[f.k]; if (typeof val === 'number' && !isNaN(val)) mx = Math.max(mx, Math.abs(val)); });
+ colMax[f.k] = mx;
});
grp.rows.forEach(function(ls) {
@@ -1489,6 +1489,10 @@ async function renderLive() {
}
cell = ''+cell+'
' + _liveMiniBar(pct, bcol);
}
+ } else if (typeof s[f.k] === 'number' && !isNaN(s[f.k]) && (colMax[f.k]||0) > 0 && cell.indexOf('border-radius:99px') < 0) {
+ // Mini-Balken auch für alle übrigen Zahlenspalten: relativ zum Spalten-Max (neutral grau).
+ var apct = (Math.abs(s[f.k]) / colMax[f.k]) * 100;
+ cell = ''+cell+'
' + _liveMiniBar(apct, '#9aa7b0');
}
html += ''+cell+' | ';
});
@@ -1928,6 +1932,8 @@ function _renderGenericCompareBody(rows, simId) {
if (typeof s.planCorrect === 'number' && s.planTotal) return Math.min(100, s.planCorrect / s.planTotal * 100);
// Busfahrt: quizFirstTry / orderIndex
if (typeof s.quizFirstTry === 'number' && s.orderIndex) return Math.min(100, s.quizFirstTry / s.orderIndex * 100);
+ // Farmer: Trefferquote = Anteil gut geeigneter Anbau-Versuche
+ if (typeof s.hit_rate === 'number') return s.hit_rate;
return null;
}
var data = rows.map(function(ls, idx){
@@ -1948,7 +1954,7 @@ function _renderGenericCompareBody(rows, simId) {
if (b.progress !== a.progress) return b.progress - a.progress;
return (a.displayName||'').localeCompare(b.displayName||'');
});
- var html = ''+esc(_compareGroupLabel(simId))+' · Vergleich
';
+ var html = '
'+esc(_compareGroupLabel(simId))+' · Fortschritt & Qualität
';
html += '
'+data.length+' aktiv · Klick auf Zeile öffnet Detail.
';
html += '