EU-Werkstatt: Probierzuege (Karten rausziehen) erfassen + Sterne ehrlicher

Bisher konnte man Karten in Slots einsetzen und wieder herausziehen, bis
alle voll waren — erst dann wurde ausgewertet. Dieses Herumprobieren war
unsichtbar und senkte die Sterne nicht (5 Sterne trotz Trial-and-Error).

- game.html: reshufflesByStep/totalReshuffles; manuelles Herausziehen einer
  platzierten Karte zaehlt als Probierzug. Ein Schritt gilt nur ohne
  Probierzuege als 'sauber auf Anhieb' -> Sterne (firstTryHits/steps) und
  Treffsicher-Achievement spiegeln Trial-and-Error jetzt. Endbild zeigt
  '🔄 N Probierzuege'; Live-State + Submit tragen die Zahlen.
- teacher.html: needsHelp eu-werkstatt auch bei vielen Probierzuegen;
  '🔄 Probier'-Spalte in Aktuell; Run-Karte: Gesamt-Probierzuege +
  pro Schritt ('🔄 nach Probieren' statt 'auf Anhieb').

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-24 13:33:44 +02:00
parent 7de71b0e83
commit 8ec005f889
2 changed files with 40 additions and 9 deletions
+15 -4
View File
@@ -810,6 +810,11 @@ var LIVE_PRIMARY_FIELDS = {
var color = v === 0 ? '#5a8a5e' : v >= 3 ? '#c07a6b' : '#c9913a';
return '<span style="color:'+color+';font-weight:700">'+v+'</span>';
}},
{k:'reshuffles', label:'🔄 Probier', align:'center', fmt:function(v){
if (!v) return '<span style="color:#8a8a8a"></span>';
var color = v >= 5 ? '#c07a6b' : v >= 2 ? '#c9913a' : '#5a8a5e';
return '<span style="color:'+color+';font-weight:700">'+v+'</span>';
}},
{k:'secondsElapsed', label:'Dauer', fmt:function(v){ return v ? _fmtSeconds(v) : '—'; }},
{k:'achievementsUnlocked', label:'Erfolge', fmt:function(v, row){
var s = row.state || {};
@@ -1281,7 +1286,7 @@ function _liveNeedsHelp(simId, s) {
case 'weltkueche': return (s.mistakesInDish||0) >= 12;
case 'farmer': return (s.cash==null?1000:s.cash) < 0 || ((s.attempts||0) >= 6 && s.hit_rate != null && s.hit_rate < 30);
case 'logistik': return (s.balance==null?1000:s.balance) < 0;
case 'eu-werkstatt': return (s.attemptsThisStep||0) >= 6;
case 'eu-werkstatt': return (s.attemptsThisStep||0) >= 6 || (s.reshufflesThisStep||0) >= 5;
case 'energiemanager': return (s.blackouts||0) >= 2 || (s.phase === 'done' && (s.balanced||0) < 4);
case 'tourismustal': return (s.money==null?1:s.money) < 0 || (s.lossStreak||0) >= 8;
case 'tourismusregion': return (s.budget==null?1:s.budget) < -400 || (s.env==null?100:s.env) < 30;
@@ -5192,18 +5197,23 @@ function renderEuWerkstattRun(dt, dur, r, d) {
var stepsTotal = d.stepsTotal || 0;
var attempts = d.attemptsByStep || [];
var detours = d.detoursByStep || [];
var reshuffles = d.reshufflesByStep || [];
// Schritt-für-Schritt-Tabelle
var stepRows = '';
for (var i = 0; i < stepsTotal; i++) {
var n = attempts[i] || 1;
var firstTry = (n === 1);
var rs = reshuffles[i] || 0;
var clean = (n === 1 && !rs); // sauber = ein Zug, kein Herumprobieren
var stepDet = (detours[i] || []).map(function(x){
var ic = x.kind === 'muelleimer' ? '🗑️' : '🔁';
return '<span class="run-detour '+(x.kind === 'muelleimer'?'kind-muelleimer':'kind-soft')+'">'+ic+' '+esc(x.label||'')+'</span>';
}).join('');
var tag = firstTry
if (rs > 0) stepDet += '<span class="run-detour kind-soft">🔄 '+rs+' Probierzug'+(rs===1?'':'e')+'</span>';
var tag = clean
? '<span style="color:#5a8a5e;font-weight:700">✓ auf Anhieb</span>'
: '<span style="color:#c9913a;font-weight:700">'+n+'. Versuch</span>';
: (n > 1
? '<span style="color:#c9913a;font-weight:700">'+n+'. Versuch</span>'
: '<span style="color:#c9913a;font-weight:700">🔄 nach Probieren</span>');
stepRows += '<tr><td style="width:2em;color:#8a8a8a">'+(i+1)+'.</td><td>'+tag+'</td><td>'+(stepDet||'—')+'</td></tr>';
}
return ''
@@ -5217,6 +5227,7 @@ function renderEuWerkstattRun(dt, dur, r, d) {
+ '<div class="run-stats">'
+ '<span><b>'+(d.firstTryHits||0)+'</b>/'+stepsTotal+' auf Anhieb</span>'
+ '<span><b>'+(d.totalAttempts||0)+'</b> Versuche</span>'
+ ((d.totalReshuffles||0)>0 ? '<span>🔄 <b>'+d.totalReshuffles+'</b> Probierzüge</span>' : '')
+ '<span><b>'+(d.muelleimerCount||0)+'</b> Mülleimer</span>'
+ '</div>'
+ (stepRows