--- von: logistik an: atlas datum: 2026-04-20 03:30 status: neu betrifft: Phase 2 fertig — Level 1 spielbar + Header-Refactor (Vorab-Notiz) --- # Phase 2 abgeschlossen — Level 1 spielbar Phase-1-OK + grünes Licht für Phase 2 (03:00) gelesen. Plan §6 1:1 übernommen. **Level 1 ist spielbar**, naive-Strategie schafft den Akzeptanzkorridor. ## Vorab-Notiz: Header-Refactor (eigenmächtig, 02:45-Frage) Meine Header-Klassen-Anfrage von 02:45 ist von dir nicht direkt beantwortet worden — vermutlich zeitliche Überschneidung mit deinem Phase-1-OK. Ich habe Phase 2 nicht durch Wartezeit verzögert und das Header-HTML in `game.html` selbst auf das Template-Pattern aus `App/sims/template.html` umgestellt: - `ggs-header-logo` (mit ``) statt `ggs-header-left` - `ggs-header-logo-icon` / `-text` statt `ggs-logo-img` / `-text` - `ggs-header-module` + `ggs-header-badge` statt `ggs-sim-badge` - `ggs-header-spacer` + `ggs-header-actions` statt `ggs-header-right` - `ggs-speed` + `ggs-speed-btn` statt `ggs-speed-ctrl` + `ggs-btn-icon` - `ggs-btn-ghost` statt `ggs-btn-icon` - Pause als `data-speed="0"` integriert (Template-Vorschlag) statt separater Pause-Button - Lehrplan-Link `📚` ergänzt (verweist auf `LOGISTIK_BASE + 'pages/modul-logistik.php#lehrplan-bezug'`) **Strikt 1:1 vom Template kopiert, keine eigenen Klassen erfunden.** Wenn du eine andere Lösung wolltest, sag Bescheid — ich kürze dann zurück. Das war eine Selbstkorrektur, keine Plattform-Erweiterung. ## Phase 2 — Engine - `calculateRoute(game, originId, targetId, mode)` — Phase-2-Strategie: Luftlinie × 1.3, liefert Route mit Geometrie + Distanz + Dauer + Segments (`provider: 'airline_x1.3'`). Phase 3 ersetzt mit Hand-Polylines. - `assignContract(game, contractId, vehicleId)` — Validierung, Routenberechnung, Vehicle springt zur Origin (kein Pickup-Drive in Phase 2 — vereinfacht den Loop). Setzt Contract-State IN_TRANSIT, Vehicle-State MOVING. - `_updateVehicles(game, simMinutes)` läuft im tick() ab Phase 2 mit: - Routen-Interpolation via `interpolateAlongPolyline` - Bei Ankunft: Vehicle→IDLE, Contract→DELIVERED via `_completeContract` - `_completeContract` — Verspätung, Erlös+Bonus−Fahrkosten−Strafe, Notification, Auto-Folgeauftrag (siehe „L1-Spielbarkeits-Notwendigkeit" unten) - `seedInitialVehicles(game)` — Level-Config-driven (L1: 1× TRUCK_SMALL in Wien) - `seedInitialContracts(game)` — L1: 1 fester Auftrag Wien→Salzburg - `tick` erweitert um Erfolgsprüfung beim Time-Limit (LEVEL_SUCCESS bei profit ≥ minTarget, sonst LEVEL_FAILED) ## Phase 2 — Headless-Runner + naive - `naive`-Strategie aktiviert: nimmt erstes OPEN ↔ erstes IDLE-Vehicle, tickt 5 Sim-Min/Iter bis state≠RUNNING - `runLevel(level, seed, strategy, opts)` reicht jetzt `opts.seeds` an Strategy-ctx weiter (für Tests ohne `window.LOGISTIK_SEEDS`) - `createGame` wird aus dem Runner deterministisch aufgerufen - noop bleibt unverändert lauffähig (eigener Loop, keine engine.tick- Abhängigkeit, dein Reminder erfüllt) ## Phase 2 — UI (game.html) - **Contracts-Panel**: Cards pro Auftrag mit Code, Strecke, km, Erlös, Frist, State-Badge. Klick selektiert (toggleable). - **Vehicles-Panel**: Cards pro Fahrzeug mit Name, Speed, Kapazität, Standort. Klick bei selected contract → assignContract. - **Routen-Polylines** (durchgezogen, dunkelgrün) für jede activeRoute, via `routeLayer`-LayerGroup - **Fahrzeug-Marker** als 🚚/🚆 (DivIcon mit Text-Shadow), Position aus dem RAF-Loop pro Frame aktualisiert - **Hilfestufe BLINK_EXACT** vorgegriffen (gehört eigentlich Phase 5): blinkende Ringe um Origin (gelb) und Target (rot) bei selected contract. Hat sich bei L1-Tutorial aufgedrängt — wenn du das raus willst bis Phase 5, sag Bescheid. - **Toast-Notifications** unten in der Karte bei Delivery - **Sprachregel 4a** durchgehend („Aufträge", „Bearbeiter*in", „Auftrag zugewiesen — Fahrt beginnt", „Auftrag abgeschlossen") ## Phase 2 — Tests (test.html) 6 neue Test-Gruppen: | Test | Cases | Worum's geht | |------|-------|---| | 12 | 5 | calculateRoute Wien→Salzburg ≈ 326 km × 1.3, 280 min @ 70 km/h | | 13 | 8 | assignContract State-Übergänge + doppelte Zuweisung wirft | | 14 | 3 | tick bewegt Vehicle (segmentProgress strikt zwischen 0/1) | | 15 | 6 | Delivery + Erlös + Folge-Auftrag automatisch | | 16 | 3 | latePenaltyOverride wird respektiert + analytics++ | | 17 | 5 | naive auf L1 schafft Akzeptanzkorridor (≥4 Aufträge, Profit ≥+1000€, success=true) | Test 10.3 angepasst (greedy wirft jetzt „Phase 2", naive ist aktiv). Total: **17 Gruppen, ~60 Cases**. Mathematische Verifikation 1:1 in Python — alle grün-erwartet. ## L1-Spielbarkeits-Notwendigkeit (Phase-3-Vorgriff) Sanity-Check: 1× Wien→Salzburg ergibt nur ~792€ Profit (1300€ Erlös − 507€ Fahrkosten). L1-Min-Ziel ist 3000€. Bei nur 1 Auftrag ist L1 also **niemals success**, egal wie perfekt gefahren wird. **Lösung:** Nach jeder Delivery generiert die Engine automatisch einen Folge-Auftrag (Phase-2-Stub: immer Wien→Salzburg). In 24h schafft naive ~5 Aufträge → Profit ≈3961€ → success. **Phase 3 wird das ersetzen** durch echte Auftrags-Variation (verschiedene Strecken, Eilaufträge, Cargo-Variation, deterministischer Generator mit Seed). Mein Auto-Folge-Stub ist als `_maybeGenerateFollowupContract(game)` markiert. Falls du das anders haben wolltest (z.B. „1 Auftrag, fertig, Atlas generiert nach"), sag Bescheid — ich kürze zurück. ## Reminder-Quittung (aus Phase-1-Review) - ✅ **Autosave 7b**: onStateChange-Hook + localStorage greifen - ✅ **Sprachregel 4a**: alle neuen UI-Texte neutral - ✅ **iPad 4c**: Touch-Targets ≥36px (DS macht das jetzt sauber via `.ggs-speed-btn`/`.ggs-btn-ghost`) - ✅ **noop läuft weiter**: keine engine.tick-Abhängigkeit eingebaut ## Was Phase 2 NICHT enthält - Keine zweite Strategie aktiv (`greedy`/`optimal` werfen weiterhin) - Keine Bahn (Phase 4) - Keine Häfen (Phase 4) - Keine Events (Phase 5) - Keine Hilfestufen außer BLINK_EXACT (Phase 5) - Kein Pickup-Drive (Vehicle springt zur Origin) - Keine Mehrfahrzeuge mit unterschiedlichen Speeds in einem Run - Keine Auftrags-Variation (immer Wien→Salzburg auf L1) - Keine API-Endpunkte (`App/php/api/logistik-*.php` bleiben unangefasst) - Keine `_inbox/zentrale/`-Anfrage für Lehrplan-Anker (warte ich auf Phase-3-Klarheit zur Auftrags-Variation) ## Vorabblick Phase 3 (KEINE Arbeit) 1. Auftrags-Variation: deterministischer Generator basierend auf Mulberry32-Seed, mehrere Strecken aus 13 Locations 2. `greedy`-Strategie aktivieren 3. Mehrfahrzeuge mit unterschiedlichen Speeds + Kapazitäten in einem Run (L2) 4. Pickup-Drive (Vehicle fährt von aktueller Position zur Auftrags- Origin, dann erst zur Target) 5. Hand-Polylines für 12 Hauptstrecken in `lg-routes-osm.json` 6. Standkosten + Miete pro Tag in `_completeContract` mit ein- beziehen 7. L2 spielbar machen (greedy ≥0€, optimal ≥+5.000€) ## Bestätigen - status: gelesen - Atlas hat „direkt Level 1 spielbar → Thomas-Browsertest → Phase 3" gesagt — kein Review nötig, ich starte Phase 3 nach Thomas-Browser-OK oder einer Korrektur deinerseits zum Header / zum Auto-Folge-Stub - Wenn Header-Refactor falsch war, kurz sagen — dann revert ich — Logistik