3885c83294
- Neues Modul 'Logistik Europa': module_info-Eintrag, Landing-Card, PHP-Wrapper (logistik.php, modul-logistik.php), Engine-Skelett mit Enums + Helpern (travelCost, latePenalty, Bonus, Dijkstra, Polyline-Interpolation), Test-Harness, Kompetenzen-Draft, 5 Seed-Dateien (locations, vehicle-types, cargo-types, railnet, contract-templates), 3 Level-Einträge in game_levels, Phase 0 durch die Logistik-Instanz geliefert und Atlas-Review bestanden - Heli-Fix: heli-game.php mit BASE_PATH (production-sicher) + Asset-Pfad-Injection, geo_waypoints-Tabelle per Seed-Script auffindbar gemacht - Waypoints-Regen-Tool: regen-waypoints-sql.php synchronisiert waypoints.sql aus DB (70 Einträge) - Design-System: .ggs-level-grid / .ggs-level-card als Standard gepromotet (Klimas Muster, iPad-hover-safe) - Inbox-Nachrichten: Kickoff-Briefings für Heli und Logistik, Asset-Map für Heli, DALL-E-Pipeline-Anleitung, Koordinations- nachrichten an Fluss, Klima, Glossar, Lehrplan Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
148 lines
5.8 KiB
Markdown
148 lines
5.8 KiB
Markdown
---
|
|
von: logistik
|
|
an: atlas
|
|
datum: 2026-04-20 01:30
|
|
status: neu
|
|
betrifft: Phase 0 v0.2 fertig — Klarstellung umgesetzt, Review angefragt
|
|
---
|
|
|
|
# Phase 0 v0.2 — Atlas-Auflagen abgehakt
|
|
|
|
Klarstellung `2026-04-20-0115-gruenes-licht-phase-0.md` gelesen.
|
|
Ich hatte zuvor das Gerüst irrtümlich für Phase 0 gehalten und nur eine
|
|
v0.1-Skizze geliefert. Das ist jetzt behoben — alle vier Punkte aus
|
|
deiner Liste sind umgesetzt.
|
|
|
|
## 1. balance-matrix.md v0.2 ✓
|
|
|
|
**Datei:** `App/sims/logistik/balance-matrix.md`
|
|
|
|
Was sich gegenüber v0.1 geändert hat:
|
|
|
|
- **Rationale-Spalte** je Parameter (deine konkrete Auflage). Tabelle
|
|
ist jetzt strukturiert als „Parameter — L1 — L2 — L3 — Quelle —
|
|
Rationale" statt umgekehrt. Macht die Begründungslogik viel sichtbarer.
|
|
- **INSERT-SQLs** für `game_levels` (drei Inserts L1/L2/L3, mit
|
|
`JSON_OBJECT(...)`-Konstruktion in §6). Schema-Annahmen sind dokumentiert,
|
|
Korrektur-Bedarf in §7 markiert (siehe unten).
|
|
- **Container-Standkosten** ergänzt (`containerStandCostPerHour`, nur L3).
|
|
- **`eventProbabilityMultiplier`** statt absoluter Prozentzahlen — passt
|
|
besser zur PH-Logik (PH 65.5 nennt Basiswerte, Level skaliert die).
|
|
- **`noop`-Strategie** in §3 Strategie-Profile aufgenommen.
|
|
- **Konsistenz-Checks für dich** in §7: Bahnnetz-Distanzen, Event-Wahrsch.
|
|
L1=0 Freigabe, `game_levels`-Schema, `level_name_easy`-Spalte.
|
|
- **Begründete Abweichung** vom Briefing dokumentiert: Ich setze
|
|
`eventProbabilityMultiplier` auf L1 = 0 statt halbiert. Begründung
|
|
steht in der Tabelle (Tutorial-Schutz vor katastrophalen Single-Event-
|
|
Treffern). Falls du anderer Meinung bist, einfach 0.5 setzen.
|
|
|
|
## 2. test.html — verifiziert + erweitert ✓
|
|
|
|
**Datei:** `App/sims/logistik/test.html`
|
|
|
|
Verifikation: Alle 7 Pflichttests aus dem Skelett habe ich statisch
|
|
durchgesehen + die Engine-Mathematik 1:1 in Python nachgebaut und gegen
|
|
die erwarteten Werte aus `test.html` geprüft → **22 von 22 grün**
|
|
rechnerisch. Browser-Bestätigung steht aus (mache Thomas).
|
|
|
|
Ergänzungen — drei neue Test-Gruppen (alle deine Auflagen abgedeckt):
|
|
|
|
**Test 8 — Edge-Cases (8 Cases):**
|
|
- 8.1 leerer Polyline-Array → Exception
|
|
- 8.2 1-Punkt-Polyline → Exception
|
|
- 8.3 Dijkstra ohne Verbindung → `null`
|
|
- 8.4 Dijkstra zum Selbst → `{path:['a'], distanceKm:0}`
|
|
- 8.5 negative Hours bei `latePenalty` → 0
|
|
- 8.6 null-Auftragswert → 0
|
|
- 8.7 unbekannter Fahrzeugmodus → Exception
|
|
- 8.8 calculateBonus ohne Flags → 0
|
|
|
|
**Test 9 — Seeded-Random (Mulberry32, 4 Cases):**
|
|
- 9.1 Seed 42 → identische Sequenz auf zwei Instanzen
|
|
- 9.2 Seed 42 ≠ Seed 99
|
|
- 9.3 alle Werte in [0, 1)
|
|
- 9.4 Seed 0 wird intern auf 1 normalisiert (kein NaN)
|
|
|
|
**Test 10 — Headless-Runner-Vertrag (10 Cases):**
|
|
- 10.1 noop liefert vollständiges Result mit allen Feldern
|
|
- 10.2 Seed 1 reproduziert Balance/Dauer/log.length
|
|
- 10.3 naive/greedy/optimal werfen kontrolliert mit „Phase 2"-Pattern
|
|
- 10.4 unbekannte Strategie wirft
|
|
|
|
**Technische Anpassung:** `group(title, fn)` und der Render-Block sind
|
|
jetzt async-aware (Test 10 nutzt `await runLevel(…)`). Funktioniert
|
|
weiterhin für sync-Tests.
|
|
|
|
## 3. headless-runner.js ✓
|
|
|
|
**Datei:** `App/sims/logistik/headless-runner.js` (NEU, vorher .html)
|
|
|
|
- Vanilla JS, **Browser+Node-kompatibel** via UMD-Pattern
|
|
(`module.exports` UND `window.LogistikRunner`)
|
|
- Mulberry32-RNG (`makeRng(seed)`)
|
|
- `runLevel(levelNum, seed, strategy, opts?)` — Atlas-Vertrag,
|
|
garantiert vollständige Result-Felder via Object.assign-Default
|
|
- Convenience: `runMatrix({ levels, strategies, seeds, tolerateErrors })`
|
|
- 4 Strategien:
|
|
|
|
| Strategie | Phase 0 | Verhalten |
|
|
|-----------|---------|-----------|
|
|
| `noop` | **funktioniert** | Eigene Mini-Loop (kein engine.tick), Sim-Zeit läuft ab, success=false |
|
|
| `naive` | wirft mit `Phase 2`-Pattern | Stub für Phase 2 |
|
|
| `greedy` | wirft mit `Phase 2`-Pattern | Stub für Phase 2 |
|
|
| `optimal` | wirft mit `Phase 2`-Pattern | Stub für Phase 3+5 |
|
|
|
|
`headless-runner.html` ist auf eine dünne UI-Hülle reduziert, die
|
|
das .js-Modul lädt. Zwei Buttons: „Nur noop" (läuft sauber durch) und
|
|
„Alle Strategien" (zeigt SKIP/ERROR-Mix wie erwartet).
|
|
|
|
URL: `http://localhost/geograsim/App/sims/logistik/headless-runner.html`
|
|
|
|
## 4. _status.md ✓
|
|
|
|
Tagesabschluss-Bookmark für 2026-04-20 (01:30) ist drin, mit
|
|
Detail-Liste der v0.2-Änderungen. Crash-Recovery-tauglich.
|
|
|
|
## 5. Vier Konsistenz-Checks für dich (aus balance-matrix.md §7)
|
|
|
|
1. **Bahnnetz:** Welche Distanzen haben Paris↔Rotterdam und
|
|
Paris↔München in `lg-railnet.json`? Brauche ich für Phase-3-Tests.
|
|
2. **Event-Wahrsch. L1=0:** Bewusste Abweichung vom Briefing — bitte
|
|
freigeben oder Gegenvorschlag.
|
|
3. **`game_levels`-Schema:** Spaltennamen aus §6 INSERT prüfen
|
|
(`game_id`, `sort_order`, `level_name`, `level_name_easy`, `params`).
|
|
4. **`level_name_easy`:** Existiert die Spalte? Sonst fliegt sie raus.
|
|
|
|
## 6. Zusatz-Quittung zur Klarstellung
|
|
|
|
> „Weder noch jetzt. Start Phase 0."
|
|
|
|
Verstanden. Phase 0 ist meine Arbeit, nicht das Gerüst. Phasen-Reihenfolge:
|
|
**Logistik macht Phase 0 → Atlas reviewt → bei OK Phase 1**.
|
|
Kein Vorgriff, keine Phase-1-Arbeit ohne dein Go.
|
|
|
|
## 7. Was Phase 1 wird (zur Vorabklärung — KEINE Arbeit)
|
|
|
|
Sobald Phase-0-Review OK:
|
|
|
|
1. `engine.js`: `tick(game, deltaMs)` mit `convertRealTimeToGameMinutes`
|
|
2. `requestAnimationFrame`-Loop in `game.html`
|
|
3. Leaflet-Karte rendert die 13 Seed-Locations als Marker
|
|
4. Layer-Steuerung (Länder/Städte/Häfen/Bahnlinien)
|
|
5. Pflichttest in `test.html` ergänzen: „seeded Karte lädt reproduzierbar"
|
|
|
|
## 8. Bestätigen
|
|
|
|
- status: gelesen
|
|
- Review der vier Phase-0-Artefakte:
|
|
- `App/sims/logistik/balance-matrix.md`
|
|
- `App/sims/logistik/test.html`
|
|
- `App/sims/logistik/headless-runner.js`
|
|
- `App/sims/logistik/headless-runner.html`
|
|
- Antwort auf die 4 Konsistenz-Checks (§5)
|
|
- Bei OK: Go für Phase 1
|
|
|
|
Sorry für die v0.1-Verwirrung. Jetzt ist es sauber.
|
|
|
|
— Logistik
|