Per-Sim leistung_pct: alle 14 Sims senden das eine Leistungs-% (0-100)

Jede Sim liefert jetzt selbst leistung_pct in GGS_LIVE_STATE UND im Submit
(Fundament fuer das einheitliche %-System) — kein Rueckrechnen aus Sternen
mehr, keine 0-3-Sonderfaelle. Formeln je Sim wie vereinbart:
- klima/fluss/kofferdetektiv/heli: = vorhandener 0-100-score
- weltkueche: richtige/(richtige+falsche)*100 (Fehler in %)
- busfahrt/fluggesellschaft: topoPunkte/(Auftraege*3)*100
- farmer: gewichteter totalScore; energiemanager: ausgegl./gesamt -15/Blackout
- eu-werkstatt: firstTry/Schritte -5/Muelleimer; sonnensystem: Erstversuch-Quote
- tourismustal: Ziele+Zufriedenheit+Natur gewichtet; tourismusregion: gewichteter score
- logistik: Kontostand->% (sendet erstmals eine Kennzahl, auch an /api/assessment)
Teacher _leistungPct + live.php extractScore bevorzugen bereits diesen Wert.
Additive Aenderungen, bestehende Logik/Sterne unveraendert; alle 15 Dateien
syntaktisch geprueft.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-25 12:35:56 +02:00
parent 539f6b012e
commit 88e3c09e5c
15 changed files with 116 additions and 0 deletions
+13
View File
@@ -1544,6 +1544,8 @@ async function submitAssessment(stars, score, breakdown) {
countries_used: breakdown.countries.value,
climates_used: breakdown.climates.value,
year_reached: game.year,
// Einheitliche Leistungskennzahl (0100): gewichtete Gesamtwertung (totalScore).
leistung_pct: Math.max(0, Math.min(100, Math.round(score))),
},
action_log,
},
@@ -1859,6 +1861,16 @@ window.GGS_LIVE_STATE = function () {
// (siehe END_REPORT_TRIGGER_YEAR = 11). Skala bezogen auf 10 Jahre, gekappt.
const targetYear = (typeof END_REPORT_TRIGGER_YEAR === 'number') ? (END_REPORT_TRIGGER_YEAR - 1) : 10;
const yearProgress = Math.max(0, Math.min(100, Math.round((game.year / targetYear) * 100)));
// Einheitliche Leistungskennzahl (0100): dieselbe gewichtete Gesamtwertung wie
// im Endbericht/Submit, live aus dem aktuellen Stand berechnet. Bricht die
// Berechnung wider Erwarten, fällt sie sicher auf die Trefferquote (hit_rate) als
// dokumentierten Proxy zurück, damit die Live-Telemetrie nie ausfällt.
let leistungPct = hitRate; // Proxy: Trefferquote
try {
leistungPct = Math.max(0, Math.min(100, Math.round(computeFinalScore().score)));
} catch (e) {
leistungPct = hitRate; // Proxy: Trefferquote
}
return {
simId: 'farmer',
phase: 'Jahr ' + game.year + ' von ' + targetYear,
@@ -1872,6 +1884,7 @@ window.GGS_LIVE_STATE = function () {
hit_rate: hitRate,
co2_kg: totalCo2,
diseases: diseases,
leistung_pct: leistungPct,
crops_used: new Set(reports.map(r => r.cropId)).size,
countries: new Set(reports.filter(r => r.countryName).map(r => r.countryName)).size,
timestamp: Date.now(),