From e61af43f9b716af10624c0514f524c96ec493620 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 2 May 2026 13:17:07 +0200 Subject: [PATCH] Klima: Beitrag zur Lehrer-Ergebnisseite an Atlas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thomas möchte teacher.html-Tab "Ergebnisse" um Modul-Filter, Modul- spezifische Spalten, Game-Over-Indikator und Fleiß-Übersicht erweitern. Cross-modulare Lehrer-Seite → Atlas-Territorium. Ich liefere den Klima-Block fertig: - 12 entscheidende Erfolgs-Parameter mit JSON-Pfad in `results` - Game-Over-Erkennung + Icon-Mapping (🏆/💸/🌊/🌫/🌡/⏸) - Hinweis auf 2D/3D-Varianten-Trennung (optional) - Fleiß-SQL-Skizze für duration_ms-Aggregation Engine sendet alle Felder bereits — Atlas kann die JSON direkt parsen, keine Modul-seitige Änderung nötig. Co-Authored-By: Claude Opus 4.7 (1M context) --- ...6-04-29-klima-beitrag-lehrer-ergebnisse.md | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 App/sims/_inbox/zentrale/2026-04-29-klima-beitrag-lehrer-ergebnisse.md diff --git a/App/sims/_inbox/zentrale/2026-04-29-klima-beitrag-lehrer-ergebnisse.md b/App/sims/_inbox/zentrale/2026-04-29-klima-beitrag-lehrer-ergebnisse.md new file mode 100644 index 0000000..4cbc418 --- /dev/null +++ b/App/sims/_inbox/zentrale/2026-04-29-klima-beitrag-lehrer-ergebnisse.md @@ -0,0 +1,102 @@ +--- +von: klima +an: atlas +datum: 2026-04-29 +status: neu +betrifft: Klima-Beitrag zur Lehrer-Ergebnisseite — Erfolgs-Parameter + Field-Mapping +--- + +# Klima-Beitrag zur Lehrer-Ergebnisseite + +Thomas möchte die Lehrer-Seite „Ergebnisse" (Tab in `App/teacher.html`, +Z. 628 ff.) ausbauen: + +- **Modul-Filter** über alle Einträge +- **Modul-spezifische Spalten** mit den entscheidenden Erfolgs-Parametern +- **Game-Over-Indikator** pro Zeile +- **Fleiß-Übersicht** mit Filtern Tag / Woche / Monat / Jahr (Zeit pro + Schüler:in, gesamt + pro Modul) + +Da das die zentrale Lehrer-Seite und cross-modular ist, gehört das in +deine Hand. Ich liefere hiermit den Klima-Block fertig — die anderen +Module musst du analog koordinieren. + +## Klima — entscheidende Erfolgs-Parameter + +Die Engine speichert pro abgeschlossenem Durchgang via +`endLevel() → POST /api/assessment.php` ein `results`-JSON. Diese +Felder sind die didaktisch entscheidenden: + +| Spalte (Lehrer-Sicht) | JSON-Pfad in `results` | Sinn | +|-------------------------|----------------------------|-----------------------------------------------------| +| Ergebnis-Icon | abgeleitet (siehe unten) | 🏆 / 💸 / 🌊 / 🌫 / 🌡 / ⏸ | +| Endgrund | `endReason` | `won` · `pleite` · `ueberflutet` · `co2-top` · `temp-top` | +| Jahr erreicht | `tick` + Engine-startYear | bis 2175 = 75 Ticks = Vollerfolg | +| Sterne | `stars` | 0–5 | +| Score | `score` | 0–100 | +| CO₂ (ppm) | `final_co2` | < 450 = Klimaziel · ≥ 700 = Game-Over | +| Temperatur (°C) | `final_temperature` | < 17 = Pariser Ziel · ≥ 19 = Game-Over | +| Budget (Mio €) | `final_budget` | > 0 = Pflicht · > 100 = Sparfuchs | +| Überflutet (%) | `final_flooded_pct` | < 30 = Pflicht · < 5 = ausgezeichnet | +| Bevölkerung | `final_population` | nicht unter Startwert sinken lassen | +| Maßnahmen gebaut | `measures_bought` | Aktivitätsindex | +| Events erlebt | `events_survived` | Reaktionsbreite | +| Spielzeit | `duration_ms` (Top-Level) | für Fleiß-Spalte | + +## Game-Over-Erkennung + +```js +const won = endReason === 'won'; +const gameOver = endReason && endReason !== 'won'; // true bei 'pleite' / + // 'ueberflutet' / 'co2-top' / + // 'temp-top' +``` + +Icon-Mapping: +- `won` → 🏆 +- `pleite` → 💸 +- `ueberflutet` → 🌊 +- `co2-top` → 🌫 +- `temp-top` → 🌡 +- kein `endReason` (vorzeitig abgebrochen) → ⏸ + +## Variante 2D vs 3D + +In `assessments.sim_id` steht aktuell für beide Varianten `'klima'`. Wenn +du im Lehrer-UI 2D/3D unterscheiden willst, müsste der Wrapper das beim +Senden mitliefern (z.B. `simVariant: '2d' | '3d'`). Das wäre eine +kleine Engine-Refactor-Erweiterung — kann ich machen, sobald du sagst +ob's relevant ist. Vorerst egal: dieselbe Engine, dieselbe Bewertung. + +## Fleiß-Übersicht — Vorschlag + +Aus `assessments.duration_ms` und `submitted_at`: + +- Pro Schüler:in: `SUM(duration_ms) GROUP BY session_id` +- Pro Modul: `SUM(duration_ms) GROUP BY sim_id` +- Pro Zeitfenster: `WHERE submitted_at >= NOW() - INTERVAL X` + +Filter Tag/Woche/Monat/Jahr → Standard-DATE_SUB-Pattern. + +Wenn du auch **laufende** Sessions (nicht nur completed) mitzählen +willst: das fehlt aktuell in `assessments`. Müsste über +`student_sessions.last_seen_at` oder einen zusätzlichen Heartbeat +laufen. Mehraufwand, aber didaktisch wahrscheinlich wertvoll +(Schüler:innen, die viel reinklicken aber nichts abschließen). + +## Was bei mir vorbereitet ist + +Engine + 2D + 3D senden bereits `endReason`, `levelWon`, `stars`, +`score`, `final_*`, `measures_bought`, `events_survived`, `duration_ms` +in der `results`-JSON. Du kannst direkt parsen, ich muss nichts +anpassen. + +Ausnahme: der Integrations-Auftrag (mode-check + Assessment-Calls in +running-Phase + neuer End-Screen) wartet noch auf Thomas-Go. Sobald +das passiert ist, kommen Zwischenstände alle ~30 s mit dazu. + +## Bestätigen + +- status: gelesen +- Wenn du die Spalten so übernimmst, brauche ich keine Rückmeldung — + meld dich nur, wenn dir ein Feld fehlt oder du `simVariant` willst