Atlas: Logistik-Gerüst + Heli-Fix + Waypoints-Regen + Level-Picker

- 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>
This commit is contained in:
2026-04-19 20:43:48 +02:00
parent 3931a701e1
commit 3885c83294
54 changed files with 5717 additions and 71 deletions
+8 -2
View File
@@ -31,7 +31,13 @@ $poisJs .= "]";
// game.html laden
$html = file_get_contents(__DIR__ . '/../sims/heli/game.html');
// Placeholder ersetzen
$html = str_replace('/*__DB_WAYPOINTS__*/', "var WP = $wpJs;\nvar wpLoaded = true;\nvar DB_POIS = $poisJs;", $html);
// Placeholder ersetzen — HELI_BASE aus BASE_PATH ableiten (funktioniert lokal + produktiv)
$base = BASE_PATH . '/sims/heli/';
$html = str_replace('/*__DB_WAYPOINTS__*/',
"window.HELI_BASE = '$base';\nvar WP = $wpJs;\nvar wpLoaded = true;\nvar DB_POIS = $poisJs;", $html);
// Head-Asset-Pfade auf BASE_PATH umbiegen (relative ../../ greift unter /heli-game-Route falsch)
$html = str_replace('href="../../favicon-96x96.png"', 'href="' . BASE_PATH . '/favicon-96x96.png"', $html);
$html = str_replace('href="../../assets/fonts/inter.css"', 'href="' . BASE_PATH . '/assets/fonts/inter.css"', $html);
echo $html;
+54
View File
@@ -0,0 +1,54 @@
<?php
/**
* Logistik Europa — Wrapper
* Lädt sims/logistik/game.html und injiziert Base-Path + Seed-Daten.
* URL: http://localhost/geograsim/App/logistik
*/
require_once __DIR__ . '/../php/config/app.php';
require_once __DIR__ . '/../php/config/db.php';
$db = getDB();
// Module-Info aus DB
$mi = $db->query("SELECT title FROM module_info WHERE module_id='logistik'")->fetch(PDO::FETCH_ASSOC);
$simName = $mi['title'] ?? 'Logistik Europa';
// Seed-Dateien aus App/assets/data/ einlesen (werden von Logistik-Instanz gefüllt)
$readSeed = function (string $file): string {
$path = __DIR__ . '/../assets/data/' . $file;
if (!is_file($path)) return '[]';
$raw = file_get_contents($path);
return $raw !== false && trim($raw) !== '' ? $raw : '[]';
};
$locations = $readSeed('lg-locations.json');
$vehicleTypes = $readSeed('lg-vehicle-types.json');
$cargoTypes = $readSeed('lg-cargo-types.json');
$railnet = $readSeed('lg-railnet.json');
$contractTemplates = $readSeed('lg-contract-templates.json');
// Level-Config aus game_levels (params = JSON). Schema: game_id, level_name, sort_order, params
$levels = $db->query("SELECT level_name, sort_order, params FROM game_levels WHERE game_id='logistik' ORDER BY sort_order")->fetchAll(PDO::FETCH_ASSOC);
$levelsJson = json_encode(array_map(
fn($r) => ['level' => (int)$r['sort_order'], 'name' => $r['level_name'], 'params' => json_decode($r['params'] ?? '{}', true)],
$levels
), JSON_UNESCAPED_UNICODE);
$html = file_get_contents(__DIR__ . '/../sims/logistik/game.html');
$base = BASE_PATH . '/sims/logistik/';
$injection = <<<JS
window.LOGISTIK_BASE = '{$base}';
window.LOGISTIK_SIM_NAME = '{$simName}';
window.LOGISTIK_SEEDS = {
locations: {$locations},
vehicleTypes: {$vehicleTypes},
cargoTypes: {$cargoTypes},
railnet: {$railnet},
contractTemplates: {$contractTemplates}
};
window.LOGISTIK_LEVELS = {$levelsJson};
JS;
$html = str_replace('/*__LOGISTIK_INJECTION__*/', $injection, $html);
echo $html;
+7
View File
@@ -0,0 +1,7 @@
<?php
/**
* Modul-Detailseite: Logistik Europa
* URL: http://localhost/geograsim/App/modul-logistik
*/
$MODULE_ID = 'logistik';
require __DIR__ . '/_partials/modul_detail.php';