Einheitliche Leistungs-Skala (%) + Farbcodes ueberall vereinheitlicht
- Schwellen NEU (Thomas): >=90 Dunkelgruen / >=80 Hellgruen / >=60 Gelb / >=50 Orange / <50 Rot. Sterne entfallen. - teacher.html: _pctColor (kanonisch) — _tagTraffic + _liveBar + _liveBarColor delegieren jetzt alle daran (EINE Skala; 'niedrig-ist-gut' invertiert). Neu: _leistungPct(simId,state) = das eine 0-100-% je Sim (eigener Score oder abgeleitet), _pctBar (kompakt, schmal). Neue Spalte 'Leistung' in 'Aktuell'. _liveMood aus _leistungPct (>=80 gut / >=50 mittel / <50) — deckungsgleich mit Triage Foerdern/Begleiten/Laeuft gut (50/80). - admin-styleguide.html: neue Sektion 'Leistungs-Skala' (5 Stufen, %+Balken, Triage, CSS-Variablen). - admin-lehrer-view.html: Schwellen/Triage/Preview auf neue Werte, Balken kompakt, Sterne-Hinweis raus. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+12
-10
@@ -97,7 +97,7 @@
|
||||
<p><b>Der Zeilen-Prozentwert</b> in „Ergebnisse/Aktuell" entsteht in <code>live.php · extractScore</code>: liefert die Sim einen eigenen <b>0–100-Score</b>, wird der genommen; sonst aus den Sternen: <code>% = Sterne / 5 × 100</code>.</p>
|
||||
<p><b>Die Sterne</b> berechnet jede App am Ende selbst — aus unterschiedlichen Kennzahlen und Schwellen (je Sim unten dokumentiert). Deshalb bedeuten 4★ heute nicht überall dasselbe.</p>
|
||||
<p><b>Uneinheitlichkeiten:</b> Busfahrt · Fluggesellschaft · Kofferdetektiv liefern nur <b>0–3 Sterne</b> statt 0–5. Busfahrt/Fluggesellschaft senden als <code>score</code> rohe Punkte (nicht 0–100 → Zeilen-% verzerrt). Weltküche wertet <b>pro Gericht</b> statt pro Durchgang. <b>Logistik überträgt weder Sterne noch Score</b>. Ein echter 0–100-Live-Score existiert nur bei Klima, Fluss, Heli, Kofferdetektiv, Tourismusregion (abgeleitet Tourismustal).</p>
|
||||
<div class="rec"><b>Vorschlag (ein System):</b> Jede App liefert genau <b>eine Funktion → Leistungs-% (0–100)</b> als Wahrheit (grün→rot-Balken). Sterne werden daraus mit <b>denselben globalen Schwellen für alle</b> abgeleitet (z. B. ≥90→5★ · ≥75→4 · ≥55→3 · ≥35→2 · sonst 1). Dann bedeuten Sterne überall dasselbe und % ↔ Sterne sind konsistent.</div>
|
||||
<div class="rec"><b>Beschlossen:</b> <b>Sterne entfallen.</b> Jede App liefert genau <b>eine Funktion → Leistungs-% (0–100)</b> als Wahrheit, überall gezeigt als Prozent + Balken in der 5-stufigen Farbskala. Auch Fördern/Begleiten/Läuft gut leiten sich aus diesem % ab.</div>
|
||||
</div>
|
||||
|
||||
<div id="preview"></div>
|
||||
@@ -539,21 +539,23 @@ var PROPOSED_PCT = {
|
||||
};
|
||||
|
||||
// 5-stufige Farbskala (= _tagTraffic).
|
||||
function pctColor(v){ v=Math.max(0,Math.min(100,v||0)); return v>=80?'#1f7a3d':v>=65?'#7cb342':v>=50?'#f9c33b':v>=35?'#ef8b2c':'#d8453a'; }
|
||||
// Standard-Anzeige überall: Prozent in Ampelfarbe + dünner Balken darunter.
|
||||
// ≥90 Dunkelgrün · ≥80 Hellgrün · ≥60 Gelb · ≥50 Orange · <50 Rot
|
||||
function pctColor(v){ v=Math.max(0,Math.min(100,v||0)); return v>=90?'#1f7a3d':v>=80?'#7cb342':v>=60?'#f9c33b':v>=50?'#ef8b2c':'#d8453a'; }
|
||||
// Standard-Anzeige überall: Prozent in Ampelfarbe + schmaler Balken darunter (kompakt).
|
||||
function pctBar(pct){
|
||||
if (pct==null) return '<span style="color:#9a9a9a">—</span>';
|
||||
var c=pctColor(pct);
|
||||
return '<div style="min-width:72px">'
|
||||
+ '<div style="font-weight:800;color:'+c+';font-size:.86rem;font-variant-numeric:tabular-nums">'+pct+' %</div>'
|
||||
+ '<div style="margin-top:2px;height:6px;border-radius:99px;background:rgba(0,0,0,.07);overflow:hidden"><div style="height:100%;width:'+pct+'%;background:'+c+'"></div></div>'
|
||||
return '<div style="width:40px">'
|
||||
+ '<div style="font-weight:800;color:'+c+';font-size:.78rem;font-variant-numeric:tabular-nums;line-height:1">'+pct+'<span style="font-size:.6rem"> %</span></div>'
|
||||
+ '<div style="margin-top:2px;height:4px;border-radius:99px;background:rgba(0,0,0,.07);overflow:hidden"><div style="height:100%;width:'+pct+'%;background:'+c+'"></div></div>'
|
||||
+ '</div>';
|
||||
}
|
||||
// Triage aus Leistungs-% × Aktivität — Grenzen = Farbgrenzen, damit Feld ↔ Farbe stimmen.
|
||||
// <50 (Rot) → Fördern · 50–79 (Orange+Gelb) → Begleiten · ≥80 (Grün) → Läuft gut.
|
||||
function triage(pct, active){
|
||||
if (pct==null || !active) return {lab:'inaktiv', col:'#8a8a8a', bg:'#efeee8'};
|
||||
if (pct<50) return {lab:'Fördern', col:'#b04a3e', bg:'#f7e2dc'};
|
||||
if (pct<65) return {lab:'Begleiten', col:'#9a6a12', bg:'#f7edd6'};
|
||||
if (pct<80) return {lab:'Begleiten', col:'#9a6a12', bg:'#f7edd6'};
|
||||
return {lab:'Läuft gut', col:'#3a6b3e', bg:'#dceadd'};
|
||||
}
|
||||
function triageChip(pct, active){ var t=triage(pct,active); return '<span style="display:inline-block;font-size:.62rem;font-weight:700;color:'+t.col+';background:'+t.bg+';padding:1px 7px;border-radius:10px">'+t.lab+'</span>'; }
|
||||
@@ -780,20 +782,20 @@ function renderSim(meta){
|
||||
|
||||
// Vorschau-Karte: neues Bewertungssystem (Skala · %+Balken · Triage)
|
||||
function renderPreviewCard(){
|
||||
var samples=[92,71,55,40,22];
|
||||
var samples=[95,84,68,54,30];
|
||||
var h='<div class="gbox" style="border-left-color:#5a8a5e">';
|
||||
h+='<h2>🎯 Neues Bewertungssystem — Vorschau zum Abnehmen</h2>';
|
||||
h+='<p><b>Standard überall:</b> ein Leistungs-% (0–100) in der Ampelfarbe + dünner Balken darunter — Sterne fallen weg. Beispiele:</p>';
|
||||
h+='<div style="display:flex;gap:1.4rem;flex-wrap:wrap;margin:.4rem 0 .9rem">'+samples.map(function(v){return pctBar(v);}).join('')+'</div>';
|
||||
h+='<p><b>5-stufige Farbskala</b> (= bestehende Tag-Skala):</p>';
|
||||
h+='<div style="display:flex;gap:.5rem;flex-wrap:wrap;margin:.3rem 0 .9rem;font-size:.72rem">'
|
||||
+[['≥ 80','sehr gut',92],['65–79','gut',71],['50–64','solide',55],['35–49','wackelig',40],['< 35','kritisch',22]]
|
||||
+[['≥ 90','sehr gut',95],['80–89','gut',84],['60–79','solide',68],['50–59','wackelig',54],['< 50','kritisch',30]]
|
||||
.map(function(b){var c=pctColor(b[2]);return '<span style="display:inline-flex;align-items:center;gap:.35rem;background:#fff;border:1px solid rgba(0,0,0,.08);border-radius:20px;padding:.2rem .6rem"><span style="width:14px;height:14px;border-radius:4px;background:'+c+'"></span><b>'+b[0]+' %</b> · '+b[1]+'</span>';}).join('')+'</div>';
|
||||
h+='<p><b>Triage-Felder aus %×Fleiß</b> — die Grenzen sind die Farbgrenzen, damit Balkenfarbe und Feld immer übereinstimmen:</p>';
|
||||
h+='<div style="display:flex;gap:1.2rem;flex-wrap:wrap;margin:.3rem 0 .6rem">'
|
||||
+[22,55,80].map(function(v){return '<div style="text-align:center">'+pctBar(v)+'<div style="margin-top:3px">'+triageChip(v,true)+'</div></div>';}).join('')
|
||||
+'<div style="text-align:center">'+pctBar(null)+'<div style="margin-top:3px">'+triageChip(null,false)+'</div></div>'+'</div>';
|
||||
h+='<div class="rec"><b>< 50 % → Fördern</b> · <b>50–64 % → Begleiten</b> · <b>≥ 65 % → Läuft gut</b> — jeweils nur, wenn aktiv gearbeitet wurde; sonst „inaktiv".</div>';
|
||||
h+='<div class="rec"><b>< 50 % → Fördern</b> · <b>50–79 % → Begleiten</b> · <b>≥ 80 % → Läuft gut</b> — jeweils nur, wenn aktiv gearbeitet wurde; sonst „inaktiv".</div>';
|
||||
h+='<p style="font-size:.72rem;color:#8a8a8a;margin-top:.6rem">Unten hat jede Tabelle die neue Spalte <b>🎯 Leistung</b> — die Vorschlags-Formel je Sim, auf die Testdaten gerechnet. Bei Busfahrt · Fluggesellschaft · Sonnensystem ist der Wert eine Näherung (Topo-/Erstversuch-Rohwerte fehlen in den Testdaten).</p>';
|
||||
h+='</div>';
|
||||
return h;
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
<a href="#bildstil">🎨 Bildstil</a>
|
||||
<a href="#farben-bild">🌿 Bild-Farbpalette</a>
|
||||
<a href="#farben-ui">🧩 UI-Farbtokens</a>
|
||||
<a href="#leistung">📊 Leistungs-Skala</a>
|
||||
<a href="#layout">📐 Layout & Spacing</a>
|
||||
<a href="#typo">🔤 Typografie</a>
|
||||
<a href="#bilder">🖼️ Bildformate</a>
|
||||
@@ -195,6 +196,50 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<div class="card" id="leistung">
|
||||
<div class="card-h">Leistungs-Skala — 5 Stufen (Standard für ALLE Sims)</div>
|
||||
<p class="lead">EINE Skala für Schülerleistung überall im Programm: Prozentwert (0–100) + dünner Balken in der Ampelfarbe. <strong>Sterne entfallen.</strong> Die Grenzen 50 / 65 sind zugleich die Triage-Grenzen, damit Balkenfarbe und Feld (Fördern/Begleiten/Läuft gut) immer übereinstimmen. Quelle in Code: <code>pctColor()</code> = <code>_tagTraffic()</code>.</p>
|
||||
<div class="swatches">
|
||||
<div class="sw" data-copy-text="#1f7a3d"><div class="sw-color" style="background:#1f7a3d"></div><div class="sw-meta"><strong>≥ 90 % · sehr gut</strong><span>#1f7a3d</span></div></div>
|
||||
<div class="sw" data-copy-text="#7cb342"><div class="sw-color" style="background:#7cb342"></div><div class="sw-meta"><strong>80–89 % · gut</strong><span>#7cb342</span></div></div>
|
||||
<div class="sw" data-copy-text="#f9c33b"><div class="sw-color" style="background:#f9c33b"></div><div class="sw-meta"><strong>60–79 % · solide</strong><span>#f9c33b</span></div></div>
|
||||
<div class="sw" data-copy-text="#ef8b2c"><div class="sw-color" style="background:#ef8b2c"></div><div class="sw-meta"><strong>50–59 % · wackelig</strong><span>#ef8b2c</span></div></div>
|
||||
<div class="sw" data-copy-text="#d8453a"><div class="sw-color" style="background:#d8453a"></div><div class="sw-meta"><strong>< 50 % · kritisch</strong><span>#d8453a</span></div></div>
|
||||
</div>
|
||||
|
||||
<h3>Standard-Anzeige: Prozent + Balken</h3>
|
||||
<div style="display:flex;gap:1.6rem;flex-wrap:wrap;margin:.5rem 0 1.2rem">
|
||||
<div style="min-width:74px"><div style="font-weight:800;color:#1f7a3d;font-size:.95rem">95 %</div><div style="margin-top:3px;height:6px;border-radius:99px;background:rgba(0,0,0,.07);overflow:hidden"><div style="height:100%;width:95%;background:#1f7a3d"></div></div></div>
|
||||
<div style="min-width:74px"><div style="font-weight:800;color:#7cb342;font-size:.95rem">84 %</div><div style="margin-top:3px;height:6px;border-radius:99px;background:rgba(0,0,0,.07);overflow:hidden"><div style="height:100%;width:84%;background:#7cb342"></div></div></div>
|
||||
<div style="min-width:74px"><div style="font-weight:800;color:#f9c33b;font-size:.95rem">68 %</div><div style="margin-top:3px;height:6px;border-radius:99px;background:rgba(0,0,0,.07);overflow:hidden"><div style="height:100%;width:68%;background:#f9c33b"></div></div></div>
|
||||
<div style="min-width:74px"><div style="font-weight:800;color:#ef8b2c;font-size:.95rem">54 %</div><div style="margin-top:3px;height:6px;border-radius:99px;background:rgba(0,0,0,.07);overflow:hidden"><div style="height:100%;width:54%;background:#ef8b2c"></div></div></div>
|
||||
<div style="min-width:74px"><div style="font-weight:800;color:#d8453a;font-size:.95rem">30 %</div><div style="margin-top:3px;height:6px;border-radius:99px;background:rgba(0,0,0,.07);overflow:hidden"><div style="height:100%;width:30%;background:#d8453a"></div></div></div>
|
||||
</div>
|
||||
|
||||
<h3>Triage-Felder (aus % × Fleiß)</h3>
|
||||
<p><strong>< 50 % → Fördern</strong> · <strong>50–79 % → Begleiten</strong> · <strong>≥ 80 % → Läuft gut</strong> — jeweils nur, wenn aktiv gearbeitet wurde, sonst „inaktiv".</p>
|
||||
<div style="display:flex;gap:.6rem;flex-wrap:wrap;margin:.4rem 0 1rem">
|
||||
<span style="font-size:.8rem;font-weight:700;color:#b04a3e;background:#f7e2dc;padding:.25rem .7rem;border-radius:12px">Fördern</span>
|
||||
<span style="font-size:.8rem;font-weight:700;color:#9a6a12;background:#f7edd6;padding:.25rem .7rem;border-radius:12px">Begleiten</span>
|
||||
<span style="font-size:.8rem;font-weight:700;color:#3a6b3e;background:#dceadd;padding:.25rem .7rem;border-radius:12px">Läuft gut</span>
|
||||
<span style="font-size:.8rem;font-weight:700;color:#8a8a8a;background:#efeee8;padding:.25rem .7rem;border-radius:12px">inaktiv</span>
|
||||
</div>
|
||||
|
||||
<h3>CSS-Variablen</h3>
|
||||
<div style="background:#1f2733;border-radius:8px;padding:1rem;overflow:auto"><pre style="margin:0;color:#e8eef4;font-size:.78rem;font-family:'Courier New',monospace">--ggs-perf-5: #1f7a3d; /* ≥ 90 % sehr gut */
|
||||
--ggs-perf-4: #7cb342; /* 80–89 % gut */
|
||||
--ggs-perf-3: #f9c33b; /* 60–79 % solide */
|
||||
--ggs-perf-2: #ef8b2c; /* 50–59 % wackelig */
|
||||
--ggs-perf-1: #d8453a; /* < 50 % kritisch */
|
||||
/* Triage */
|
||||
--ggs-triage-foerdern: #b04a3e;
|
||||
--ggs-triage-begleiten: #9a6a12;
|
||||
--ggs-triage-gut: #3a6b3e;
|
||||
--ggs-triage-inaktiv: #8a8a8a;</pre></div>
|
||||
<p style="font-size:.78rem;color:#8a8a8a;margin-top:.6rem">Vorschau der Zuordnung je Sim: <a href="admin-lehrer-view.html">Lehrer-View Parameter-Überblick</a>.</p>
|
||||
</div>
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<div class="card" id="layout">
|
||||
<div class="card-h">Layout & Spacing</div>
|
||||
|
||||
+62
-14
@@ -624,14 +624,7 @@ 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));
|
||||
var c;
|
||||
if (goodWhen === 'low') {
|
||||
c = pct <= 33 ? '#5a8a5e' : pct <= 66 ? '#c9913a' : '#c07a6b';
|
||||
} else if (goodWhen === 'mid') {
|
||||
c = '#7a7a7a';
|
||||
} else {
|
||||
c = pct >= 60 ? '#5a8a5e' : pct >= 30 ? '#c9913a' : '#c07a6b';
|
||||
}
|
||||
var c = _liveBarColor(pct, goodWhen);
|
||||
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">'
|
||||
@@ -645,9 +638,9 @@ function _liveBar(val, min, max, goodWhen, dec) {
|
||||
// Farbwahl nach „gut wenn" (aus _liveBar extrahiert) — für die Mini-Balken.
|
||||
function _liveBarColor(pct, goodWhen) {
|
||||
pct = Math.max(0, Math.min(100, pct||0));
|
||||
if (goodWhen === 'low') return pct <= 33 ? '#5a8a5e' : pct <= 66 ? '#c9913a' : '#c07a6b';
|
||||
if (goodWhen === 'mid') return '#9a9a9a';
|
||||
return pct >= 60 ? '#5a8a5e' : pct >= 30 ? '#c9913a' : '#c07a6b';
|
||||
// EINE Skala (_pctColor). „Niedrig ist gut" invertiert, damit Grün weiter „gut" heißt.
|
||||
return _pctColor(goodWhen === 'low' ? 100 - pct : pct);
|
||||
}
|
||||
// Mini-Balken UNTER der Zahl (Cockpit „Aktuell"). pct 0 – 100.
|
||||
function _liveMiniBar(pct, color) {
|
||||
@@ -656,6 +649,58 @@ function _liveMiniBar(pct, color) {
|
||||
+ '<div style="height:100%;width:'+pct.toFixed(0)+'%;background:'+color+'"></div></div>';
|
||||
}
|
||||
|
||||
// ===== EINHEITLICHE LEISTUNGS-SKALA (Styleguide „Leistungs-Skala", 5 Stufen) =====
|
||||
// EINE Farbfunktion für Schülerleistung überall. Grenzen 50/65 = Triage-Grenzen.
|
||||
function _pctColor(v) {
|
||||
v = Math.max(0, Math.min(100, v || 0));
|
||||
// ≥90 Dunkelgrün · ≥80 Hellgrün · ≥60 Gelb · ≥50 Orange · <50 Rot
|
||||
return v >= 90 ? '#1f7a3d' : v >= 80 ? '#7cb342' : v >= 60 ? '#f9c33b' : v >= 50 ? '#ef8b2c' : '#d8453a';
|
||||
}
|
||||
// Standard-Anzeige: Prozent in Ampelfarbe + dünner Balken darunter.
|
||||
function _pctBar(pct) {
|
||||
if (pct == null || isNaN(pct)) return '<span style="color:#9a9a9a">—</span>';
|
||||
pct = Math.max(0, Math.min(100, Math.round(pct)));
|
||||
var c = _pctColor(pct);
|
||||
// Kompakt: schmaler Balken (max ~34px), damit die Spalte wenig Platz braucht.
|
||||
return '<div style="width:34px">'
|
||||
+ '<div style="font-weight:800;color:'+c+';font-size:.72rem;font-variant-numeric:tabular-nums;line-height:1">'+pct+'<span style="font-size:.58rem"> %</span></div>'
|
||||
+ '<div style="margin-top:2px;height:4px;border-radius:99px;background:rgba(0,0,0,.07);overflow:hidden"><div style="height:100%;width:'+pct+'%;background:'+c+'"></div></div>'
|
||||
+ '</div>';
|
||||
}
|
||||
// Das EINE Leistungs-% (0–100) je Sim aus dem Live-State. Sims mit eigenem
|
||||
// 0–100-Score nutzen ihn direkt; sonst aus den vorhandenen Kennzahlen abgeleitet.
|
||||
function _leistungPct(simId, s) {
|
||||
if (!s || typeof s !== 'object') return null;
|
||||
var cl = function(v,a,b){ return Math.max(a, Math.min(b, v)); };
|
||||
// Sims mit echtem 0–100-Live-Score (klima, fluss, kofferdetektiv, heli) direkt:
|
||||
if (typeof s.score === 'number' && simId !== 'weltkueche' && simId !== 'busfahrt' && simId !== 'fluggesellschaft')
|
||||
return cl(Math.round(s.score), 0, 100);
|
||||
switch (simId) {
|
||||
case 'klima': case 'klima-3d': {
|
||||
var sp = (s.level >= 3) ? 7000 : 6000;
|
||||
return Math.round(cl(35-((s.temp||16)-15.5)*20,0,35) + Math.max(0,25*(1-(s.floodedPct||0)/50)) + cl((s.budget||0)/10,0,20) + cl((s.population||0)/sp*20,0,20));
|
||||
}
|
||||
case 'fluss': return (s.biodiv!=null) ? cl(Math.round((s.biodiv+s.economy+s.flood)/3) - (s.settlementsLost||0)*5, 0, 100) : null;
|
||||
case 'heli': return (s.totalStars!=null) ? Math.round(s.totalStars/5*100) : (s.planTotal ? Math.round((s.planCorrect||0)/s.planTotal*100) : null);
|
||||
case 'farmer': {
|
||||
if (s.hit_rate==null && s.cash==null) return null;
|
||||
var money=cl(50+(s.cash||0)/300,0,100), co2=cl(100-(s.co2_kg||0)/80,0,100), dis=cl(100-(s.diseases||0)*20,0,100), crop=cl((s.crops_used||0)/10*100,0,100), country=cl((s.countries||0)/6*100,0,100);
|
||||
return Math.round(0.25*money + 0.20*(s.hit_rate||0) + 0.15*co2 + 0.10*dis + 0.10*crop + 0.10*country + 0.10*70);
|
||||
}
|
||||
case 'energiemanager': { var d=(s.day||1)*(s.blockTotal||8); return cl(Math.round((s.setBlocksBalanced||0)/d*100) - 15*(s.blackouts||0), 0, 100); }
|
||||
case 'eu-werkstatt': return s.stepsTotal ? cl(Math.round((s.firstTryHits||0)/s.stepsTotal*100) - 5*(s.muelleimerCount||0), 0, 100) : null;
|
||||
case 'weltkueche': { var t=(s.correctClicks||0)+(s.wrongClicks||0); return t ? Math.round((s.correctClicks||0)/t*100) : null; }
|
||||
case 'busfahrt': case 'fluggesellschaft':
|
||||
return s.topoMax ? cl(Math.round((s.topoPoints||0)/s.topoMax*100),0,100)
|
||||
: (s.totalOrders ? Math.round((s.wonOrders||0)/s.totalOrders*100) : null);
|
||||
case 'sonnensystem': return (s.progressPct!=null) ? cl(Math.round(s.progressPct),0,100) : (s.taskTotal ? Math.round((s.completed||0)/s.taskTotal*100) : null);
|
||||
case 'tourismustal': return s.goalsTotal ? Math.round(0.5*((s.goalsDone||0)/s.goalsTotal*100) + 0.3*(s.satisfaction||0) + 0.2*(s.nature||0)) : null;
|
||||
case 'tourismusregion': return (s.avgStars!=null) ? Math.round(0.6*(s.avgStars/5*100) + 0.4*(s.env||0)) : null;
|
||||
case 'logistik': return (s.balance!=null) ? cl(Math.round(s.balance/16000*100),0,100) : null;
|
||||
}
|
||||
return (typeof s.score === 'number') ? cl(Math.round(s.score),0,100) : null;
|
||||
}
|
||||
|
||||
var LIVE_PRIMARY_FIELDS = {
|
||||
farmer: [
|
||||
{k:'year', label:'Jahr', bar:{kind:'abs',max:10,good:'mid'}, fmt:function(v){ return (v||0) + '<span style="color:#8a8a8a"> / 10</span>'; }},
|
||||
@@ -1314,6 +1359,10 @@ function _liveProgressPct(simId, s) {
|
||||
}
|
||||
function _liveMood(simId, s) {
|
||||
if (!s) return null;
|
||||
// Einheitliche Skala: Leistungs-% steuert die Stimmung (≥80 gut · ≥50 mittel · <50 schlecht),
|
||||
// deckungsgleich mit Farbe + Triage (Läuft gut / Begleiten / Fördern).
|
||||
var _p = _leistungPct(simId, s);
|
||||
if (_p != null) return _p >= 80 ? 'good' : _p >= 50 ? 'mid' : 'bad';
|
||||
if (s.health) return ({good:'good',ok:'good',warning:'mid',bad:'bad',critical:'bad'})[s.health] || 'mid';
|
||||
if (_liveNeedsHelp(simId, s)) return 'bad';
|
||||
switch (simId) {
|
||||
@@ -1548,6 +1597,7 @@ async function renderLive() {
|
||||
html += '<thead><tr style="background:#f7f6f3;border-bottom:2px solid rgba(0,0,0,.08)">';
|
||||
html += '<th style="text-align:left;padding:.4rem .5rem;white-space:nowrap">Schüler*in</th>';
|
||||
html += '<th style="text-align:left;padding:.4rem .5rem;white-space:nowrap;color:#8a8a8a;font-weight:500" title="oben: aktuelle Mission/Lektion · unten: gesamte Sim-Session">Seit</th>';
|
||||
html += '<th style="text-align:center;padding:.4rem .3rem;white-space:nowrap;background:#eef7f0;font-size:.68rem" title="Einheitliches Leistungs-% (0–100) — grün = läuft gut, orange/rot = Hilfe nötig">🎯 Leistung</th>';
|
||||
fields.forEach(function(f) {
|
||||
var align = f.align || 'right';
|
||||
html += '<th style="text-align:'+align+';padding:.4rem .5rem;white-space:nowrap">'+esc(f.label)+(f.unit?' <span style="color:#8a8a8a;font-weight:400;font-size:.66rem">'+f.unit+'</span>':'')+'</th>';
|
||||
@@ -1596,6 +1646,7 @@ async function renderLive() {
|
||||
html += '<tr style="border-bottom:1px solid rgba(0,0,0,.04);cursor:pointer;background:'+restBg+';'+(paused?'color:#9a9a9a;':'')+'box-shadow:'+accent+'" onclick="openLiveSpectator('+ls.student_id+',\''+ls.module_id+'\')" onmouseover="this.style.background=\''+hoverBg+'\'" onmouseout="this.style.background=\''+restBg+'\'">';
|
||||
html += '<td style="padding:.4rem .5rem;white-space:nowrap"><span style="display:inline-flex;align-items:center;gap:.4rem">'+(help?'<span title="stockt · braucht evtl. Hilfe">🆘</span>':(paused?'<span title="pausiert — kann später weitermachen">⏸</span>':''))+avatarHtml+'<strong>'+esc(ls.displayName)+'</strong></span></td>';
|
||||
html += '<td style="padding:.4rem .5rem;white-space:nowrap;line-height:1.15" title="Aktuelle Mission/Lektion · Gesamte Sim-Session"><div style="font-size:.78rem;color:#3a3a3a;font-weight:600">'+missionStr+'</div><div style="font-size:.62rem;color:#8a8a8a">'+simStr+' ges.</div></td>';
|
||||
html += '<td style="padding:.4rem .3rem;vertical-align:top">'+_pctBar(_leistungPct(ls.module_id, s))+'</td>';
|
||||
fields.forEach(function(f) {
|
||||
var align = f.align || 'right';
|
||||
var cell = _liveFmt(s[f.k], f.unit, f, ls);
|
||||
@@ -1705,10 +1756,7 @@ function _liveSuccessColor(success) {
|
||||
})[success] || '#7a8a9c';
|
||||
}
|
||||
// Ampelfarbe für den Tages-Erfolg (0–100): grün → hellgrün → gelb → orange → rot.
|
||||
function _tagTraffic(v) {
|
||||
v = Math.max(0, Math.min(100, v || 0));
|
||||
return v >= 80 ? '#1f7a3d' : v >= 65 ? '#7cb342' : v >= 50 ? '#f9c33b' : v >= 35 ? '#ef8b2c' : '#d8453a';
|
||||
}
|
||||
function _tagTraffic(v) { return _pctColor(v); } // EINE Skala (siehe _pctColor)
|
||||
function _liveSuccessIcon(stars, success) {
|
||||
if (success === 'aborted') return '✗';
|
||||
if (success === 'running') return '⏳';
|
||||
|
||||
Reference in New Issue
Block a user