--- titel: Tech-Spec — Autobahn-Abfahrt-Minispiel als Modul zielgruppe: Externer Entwickler*in (oder Atlas-Instanz), die das Spiel in passender Technologie neu baut host: Logistik Europa (App/sims/logistik/game.html) stand: 2026-04-25 --- # Spec — Autobahn-Abfahrt-Minispiel Das Spiel wird in der Logistik-Simulation als **Overlay** geöffnet, sobald ein LKW an einem ausgewählten Knotenpunkt die Autobahn verlässt. Während das Spiel läuft, **steht die Logistik-Sim still**. Ergebnis (Bonus / Strafe / Unfall) wird zurück an die Logistik gemeldet. Das Spiel ist ein **eigenständiges Modul** ohne Abhängigkeit zur Logistik-Engine. Logistik ruft nur eine Init-Funktion auf und bekommt einen Callback. ## 1. Schnittstelle ### Eintritt: ein einziger globaler Init-Funktions-Aufruf ```js window.lgAutobahnGame.start({ container: HTMLElement, // Logistik liefert ein leeres div, exklusiv für das Spiel scenario: 'bregenz' | 'salzburg' | 'innsbruck' | 'muenchen' | 'leipzig' | 'verona', driverName: 'Anna', // optional, für Anzeige truckLabel: 'Mittlerer LKW', // optional, für Anzeige easyMode: false, // optional, vereinfachte Sprache/Hilfen onEnd: (result) => { ... }, // Callback, EXAKT EINMAL aufgerufen }); ``` ### Austritt: Callback `onEnd(result)` — Pflichtfeld ```js result = { outcome: 'success' | 'late' | 'crash', scenario: 'bregenz', // success: korrekte Abfahrt erkannt + keine Kollision // late: Abfahrt verpasst oder falsche Spur (Strafzeit zu addieren) // crash: Auffahren oder in Baustelle gekracht (Vehicle-Ausfall) // Optional: für späteres Tuning decisionTimeMs: 12500, // wie lange war der Spieler im Spiel laneChanges: 3, brakeUsed: true, }; ``` Logistik mappt das auf: - **success** → Bonus-Pill (45 min Ladezeit) + positive Voice-Line - **late** → +30 min auf Restfahrt-Dauer + neutrale Voice - **crash** → Vehicle ausgefallen für 24 Sim-Stunden + Reparaturkosten + Crash-Sound Logistik kümmert sich selbst darum, das `container`-DOM-Element zu entfernen, sobald `onEnd` gefeuert hat. ## 2. Lifecycle 1. Logistik erstellt ein leeres `
` über der Karte (z.B. Modal-Overlay), füllt es als `container` an `start()`. 2. Modul rendert sein Spielfeld komplett **innerhalb dieses Divs**. 3. Spieler interagiert. Sim-Zeit in Logistik steht still (das ist Logistik-Sache). 4. Nach Spiel-Ende: Modul ruft `onEnd(result)` auf, **genau einmal**. 5. Modul macht keinen `container.innerHTML = ''` — das macht Logistik nach Callback-Empfang. **Wichtig**: `onEnd` darf nur **einmal** feuern, auch bei Fehler/Abbruch. ## 3. Technische Vorgaben ### Was MUSS gehen - **Vanilla JavaScript**. Kein Framework-Bundle. - **Kein globales DOM** anfassen außerhalb des `container`. Kein `document.body.appendChild`, kein `position: fixed` direkt aufs Body. - **CSS-Prefix `lg-aut-`** auf allen Klassen. Keine generischen Selektoren wie `button { ... }`. - Asset-Loading **relativ** zum Modul-Pfad oder per Daten-URL. Kein CDN zur Laufzeit (DSGVO + Schul-Offline-Tauglichkeit). - **Tastatur + Touch + Maus** als Eingabe (Logistik wird primär auf iPad Landscape genutzt, 1180 × 820, Touch-Ziele ≥ 36 px). - **Pausierbar bei `visibility: hidden` des Containers** — wenn der Tab in den Hintergrund geht oder Logistik den Container verbirgt, soll der RAF-Loop sich selbst stoppen und bei `visible` weiterlaufen. ### Was darf gehen - **Three.js erlaubt**, wenn nötig — Logistik nutzt Leaflet (kein WebGL). Bitte lokal hosten unter `App/sims/logistik/assets/vendor/three/` (kein CDN). - **Web Audio API** für Sounds (Motorgeräusch, Bremsen, Crash). Volumes niedriger als 0.4 default, damit es nicht über die Logistik-Sprachausgabe brüllt. Logistik wird selbst die eigene Musik dücken während Modul aktiv. - **CanvasRenderingContext2D** auch erlaubt, wenn Three nicht nötig. - **Eigene Schriftarten** als `@font-face` im Modul-eigenen `