diff --git a/App/sims/heli/game.html b/App/sims/heli/game.html
index c180668..54086e3 100644
--- a/App/sims/heli/game.html
+++ b/App/sims/heli/game.html
@@ -480,6 +480,19 @@ window.GGS_LIVE_STATE = function () {
totalStars: landingDone ? (game.totalStars || 0) : null,
failed: !!game.missionFailed,
missionStartedAt: game.missionStartedAt || null,
+ // Laufender 0–100-Score für die Ampelfarbe im Lehrer-Live (Tag-Balken).
+ // Progressiv: Routing-Genauigkeit, dann Ø mit Start-/Landungssternen; am Ende
+ // die Gesamtsterne. In der Auftragswahl (mission/briefing) kein Score.
+ score: (function(){
+ if (!phase || phase === 'mission' || phase === 'briefing') return null;
+ if (landingDone && game.totalStars != null) return Math.round(Math.max(0,Math.min(5,game.totalStars))/5*100);
+ var parts = [];
+ if (routeLen > 1) parts.push(Math.max(0, Math.min(100, (game.planTotal?(game.planCorrect||0)/game.planTotal:0)*100 - (game.planAttempts||0)*4)));
+ if (startDone && game.startScore != null) parts.push(Math.max(0,Math.min(5,game.startScore))/5*100);
+ if (landingDone && game.landingScore != null) parts.push(Math.max(0,Math.min(5,game.landingScore))/5*100);
+ if (!parts.length) return null;
+ return Math.round(parts.reduce(function(a,b){return a+b;},0)/parts.length);
+ })(),
};
};
diff --git a/App/sims/heli/start.html b/App/sims/heli/start.html
index 8b71a4a..754c151 100644
--- a/App/sims/heli/start.html
+++ b/App/sims/heli/start.html
@@ -1723,7 +1723,22 @@
if (wantFlap) thrustMult += 0.8;
if (h.vy < -40) thrustMult += Math.min(1.0, -h.vy / 160);
else if (h.vy > 60) thrustMult = Math.max(0.4, thrustMult - 0.5);
- h.fuel = Math.max(0.05, h.fuel - 0.005 * altFactor * thrustMult * dt);
+ h.fuel = Math.max(0, h.fuel - 0.005 * altFactor * thrustMult * dt);
+ // Treibstoff leer → Chefpilotin übernimmt (wie 3 Berührungen): schlechteste
+ // Start-Bewertung (1★). Nur einmal auslösen und nicht, wenn ohnehin schon
+ // ein Takeover läuft.
+ if (h.fuel <= 0 && state.mode !== 'autopilot' && !state._fuelEmpty) {
+ state._fuelEmpty = true;
+ state.mode = 'autopilot';
+ stopAllAmbient();
+ state.autopilotT = 0;
+ h.invul = 999;
+ state.takeoverReason = 'Treibstoff leer — die Chefpilotin bringt den Helikopter sicher zurück. Beim nächsten Start früher auf den Verbrauch achten und nicht zu hoch steigen (dünne Luft = ×8 Verbrauch).';
+ state.takeoverShort = 'Treibstoff leer';
+ state.radio.current = 'Pilot: Tank leer! Ich übernehme.';
+ state.radio.shown = 0; state.radio.nextAt = 99;
+ try { playRadio('warn_fuel'); } catch(_){}
+ }
// Visuelle Höhenwarnung: roter Pulse oben + Fuel-HUD blinkt
// Greift sobald altRatio > 0.9 (= im obersten 10 % der Bildhöhe).
var inDangerZone = altRatio > 0.9;
diff --git a/App/teacher.html b/App/teacher.html
index 7610032..1c4c648 100644
--- a/App/teacher.html
+++ b/App/teacher.html
@@ -856,7 +856,7 @@ var LIVE_PRIMARY_FIELDS = {
],
'heli': [
{k:'phase', label:'Phase', align:'center', fmt:function(v){
- var m = {plan:'🗺️ Routenplan', start:'🛫 Start', flight:'✈️ Flug', approach:'🎯 Anflug', landing:'🛬 Landung', results:'🏁 Ende'};
+ var m = {mission:'📋 Auftragswahl', plan:'🗺️ Routenplan', briefing:'📋 Briefing', start:'🛫 Start', flight:'✈️ Flug', approach:'🎯 Anflug', landing:'🛬 Landung', results:'🏁 Ende'};
return m[v] || (v ? v : '—');
}},
{k:'missionId', label:'Auftrag', align:'left', fmt:function(v, row){
@@ -905,7 +905,8 @@ var LIVE_PRIMARY_FIELDS = {
var s = row.state||{};
if (v === true) return '⚠ Chefpilot';
if (s.phase === 'results') return '✓ Erfolg';
- return '…';
+ if (s.phase === 'mission' || !s.phase) return 'wählt Auftrag';
+ return '🟢 unterwegs';
}},
],
'fluss': [