Atlas: DSGVO-Tile-Proxy + Logistik-Phase-bis-8 + Sounds-Anleitung

Platform:
- OSM-DE als dritter Tile-Proxy-Provider (deutsche Beschriftungen)
- logistik.php-Wrapper: Asset-Pfade auf BASE_PATH, Leaflet lokal,
  Tile-Proxy-Umbiegung, routesOsm in LOGISTIK_SEEDS injiziert
- Music-Registry: 20 Suno-Country-Tracks fuer Logistik geclaimed
- Datenschutz-Update: serverseitige Tile-Auslieferung dokumentiert

Logistik (Instanz-Lieferungen, parallel):
- Phase 0 bis 8 inkl. Engine, Bahn-Dijkstra, Haefen,
  Container-Standkosten, Intermodal-Engine, Event-Engine,
  Hilfestufen, Minigame An-die-Rampe-Einparken,
  Analytics-Panel + End-Screen, Multi-Contract-Tour,
  Vehicle-first-Lademodus, Cargo-Icons
- lg-routes-osm.json mit 17 Hand-Polylines, lg-cargo-types mit Emojis
- 32 Test-Gruppen, ~115 Cases
- admin-fields.json fuer Admin-UI-Integration

Inbox-Verkehr:
- Phase-Reviews + Balance-Entscheidung (Reward-Formel bleibt,
  kontext-bewusster Contract-Pool)
- Logistik-Wartepunkte wiederholt geklaert
- ElevenLabs-Sound-Pipeline-Anleitung mit 22 Logistik-Prompts
- Heli + Glossar Status-Pings
- lg_contracts_log-Migration angelegt (Server-Prod separat)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-23 08:15:00 +02:00
parent eac686ee1a
commit fc8996f064
47 changed files with 9995 additions and 230 deletions
+226
View File
@@ -0,0 +1,226 @@
{
"moduleId": "logistik",
"version": "1.0",
"description": "Feldbeschreibungen fuer game_levels.params des Logistik-Moduls. Quelle: App/sims/logistik/balance-matrix.md v0.3.",
"groups": [
{
"title": "Wirtschaft",
"fields": [
{ "key": "startBudget",
"label": "Startbudget",
"labelEasy": "Geld am Anfang",
"type": "number",
"unit": "€",
"min": 0,
"max": 100000,
"step": 100,
"default": 5000,
"help": "Kontostand, mit dem der Durchgang beginnt. L1: 8000, L2: 5000, L3: 2500." },
{ "key": "minTargetEarnings",
"label": "Ziel-Erloes (Erfolgsschwelle)",
"labelEasy": "Geld zum Gewinnen",
"type": "number",
"unit": "€",
"min": 0,
"max": 100000,
"step": 500,
"default": 10000,
"help": "Mindest-Kontostand am Ende, damit das Level als geschafft gilt. L1: 3000, L2: 10000, L3: 20000." },
{ "key": "rentalCostPerDay",
"label": "Fahrzeugmiete pro Tag",
"labelEasy": "Miete fuer Autos/Zuege pro Tag",
"type": "number",
"unit": "€/Tag",
"min": 0,
"max": 5000,
"step": 50,
"default": 0,
"help": "Tagesmiete pro Fahrzeug. 0 auf L1, 200 auf L2, 500 auf L3." },
{ "key": "idleCostPerHour",
"label": "Standkosten Fahrzeug",
"labelEasy": "Kosten wenn Auto steht",
"type": "number",
"unit": "€/h",
"min": 0,
"max": 100,
"step": 1,
"default": 5,
"help": "Kosten pro Stunde, in der ein Fahrzeug ungenutzt steht. 0 auf L1, ab L2: 5." },
{ "key": "containerStandCostPerHour",
"label": "Standkosten Container im Hafen",
"labelEasy": "Kosten fuer Container im Hafen pro Stunde",
"type": "number",
"unit": "€/h",
"min": 0,
"max": 100,
"step": 1,
"default": 0,
"help": "Demurrage: Gebuehr pro Stunde, die ein Container nach Ankunft noch im Hafen liegt. Erst ab L3 relevant." },
{ "key": "latePenaltyOverride",
"label": "Verspaetungsstrafe (Anteil pro Stunde)",
"labelEasy": "Strafe pro Stunde Verspaetung",
"type": "number",
"min": 0,
"max": 1,
"step": 0.05,
"default": 0.20,
"help": "Anteil des Auftragswertes, der pro Stunde Verspaetung abgezogen wird. 0.10 = 10%. L1: 0.10, L2: 0.20, L3: 0.30." }
]
},
{
"title": "Auftragslage",
"fields": [
{ "key": "maxActiveContracts",
"label": "Auftraege parallel (max)",
"labelEasy": "Auftraege gleichzeitig",
"type": "number",
"min": 1,
"max": 12,
"step": 1,
"default": 3,
"help": "Wie viele Auftraege maximal gleichzeitig offen sein duerfen. L1: 1, L2: 3, L3: 6." },
{ "key": "deadlineMultiplier",
"label": "Fristlaengen-Multiplikator",
"labelEasy": "Zeit-Verlaengerung fuer Abgabe",
"type": "number",
"unit": "×",
"min": 0.5,
"max": 3.0,
"step": 0.1,
"default": 1.2,
"help": "Multipliziert die berechnete Standardfrist (distanceKm/60 Std). Werte > 1 sind grosszuegiger. L1: 1.5, L2: 1.2, L3: 1.0." },
{ "key": "timeLimitHours",
"label": "Zeitlimit Durchgang",
"labelEasy": "Zeit bis Durchgang-Ende (Stunden)",
"type": "number",
"unit": "Sim-h",
"min": 1,
"max": 240,
"step": 1,
"default": 48,
"help": "Maximale Simulations-Stunden pro Durchgang. L1: 24, L2: 48, L3: 72." },
{ "key": "initialTimeScale",
"label": "Zeit-Geschwindigkeit Start",
"labelEasy": "Tempo am Anfang",
"type": "enum",
"options": [1, 4, 8],
"default": 1,
"help": "Wie schnell die Simulationszeit relativ zur Echtzeit laeuft. 1 = realistisch langsam. Bearbeiter:innen koennen live waehrend des Durchgangs wechseln." }
]
},
{
"title": "Fahrzeugpool",
"fields": [
{ "key": "vehicleCount",
"label": "Fahrzeuge gesamt",
"labelEasy": "Anzahl Fahrzeuge",
"type": "number",
"min": 1,
"max": 10,
"step": 1,
"default": 3,
"help": "Anzahl Fahrzeuge im Pool. L1: 1, L2: 3, L3: 5. Typen werden ueber availableVehicleTypes gesteuert." },
{ "key": "availableVehicleTypes",
"label": "Fahrzeugtypen",
"labelEasy": "Welche Fahrzeuge verfuegbar",
"type": "multienum",
"options": ["TRUCK_SMALL", "TRUCK_LARGE", "TRAIN"],
"default": ["TRUCK_SMALL", "TRUCK_LARGE", "TRAIN"],
"help": "Welche Fahrzeugtypen im Pool auftauchen. L1: nur TRUCK_SMALL. Ab L2: alle drei. TRAIN nur sinnvoll wenn railEnabled=true." }
]
},
{
"title": "Didaktik & Hilfen",
"fields": [
{ "key": "defaultHintMode",
"label": "Hilfestufe (Standard)",
"labelEasy": "Wie viel Hilfe beim Suchen",
"type": "enum",
"options": ["BLINK_EXACT", "SHOW_COUNTRY", "SHOW_REGION", "DISTANCE_FEEDBACK", "NONE"],
"default": "SHOW_REGION",
"help": "Wie viel Hilfe Bearbeiter:innen beim Ortssuchen auf der Karte bekommen. BLINK_EXACT = volle Markierung, NONE = ohne Hinweis. L1: BLINK_EXACT, L2: SHOW_REGION, L3: NONE." },
{ "key": "visibleLocationLevel",
"label": "Sichtbare Orte (Level)",
"labelEasy": "Wie viele Orte auf der Karte",
"type": "enum",
"options": [1, 2, 3],
"default": 2,
"help": "Filter fuer die Kartenanzeige: 1 = nur Hauptstaedte, 2 = + Grossstaedte, 3 = alle Orte. Reduziert kognitive Last auf niedrigen Leveln." },
{ "key": "minigamesEnabled",
"label": "Mini-Aufgaben aktivieren",
"labelEasy": "Kleine Spiele an/aus",
"type": "boolean",
"default": false,
"help": "Schaltet die Rampen-Einpark-Aufgabe beim Entladen frei. L1: aus, ab L2: optional." }
]
},
{
"title": "Ereignisse",
"fields": [
{ "key": "eventProbabilityMultiplier",
"label": "Ereignis-Staerke",
"labelEasy": "Wie oft Zwischenfaelle",
"type": "number",
"min": 0,
"max": 2,
"step": 0.1,
"default": 0.5,
"help": "0 = keine Ereignisse (Unfall, Schnee, Hafenstau), 1 = Standard-Haeufigkeit, 2 = doppelt. L1: 0 (Tutorial ohne Pech), L2: 0.5, L3: 1.0." }
]
},
{
"title": "Verkehrstraeger",
"fields": [
{ "key": "railEnabled",
"label": "Bahnnetz aktiv",
"labelEasy": "Zuege erlaubt",
"type": "boolean",
"default": false,
"help": "Wenn aktiv, koennen Aufträge ueber das Bahnnetz (5 Knoten: Wien, Muenchen, Hamburg, Rotterdam, Paris) gefahren werden. Erst ab L3." },
{ "key": "portsEnabled",
"label": "Haefen aktiv",
"labelEasy": "Schiffe erlaubt",
"type": "boolean",
"default": false,
"help": "Wenn aktiv, erscheinen Seehafen-Auftraege (ankommende Schiffe als neue Containerquelle). Erst ab L3." },
{ "key": "intermodalEnabled",
"label": "Intermodale Ketten",
"labelEasy": "Auftraege mit mehreren Fahrzeugen",
"type": "boolean",
"default": false,
"help": "Wenn aktiv, entstehen Auftraege mit erzwungenem Verkehrstraeger-Wechsel (z.B. LKW -> Zug -> LKW). Setzt railEnabled + portsEnabled voraus. Erst ab L3." }
]
},
{
"title": "Sonstiges (Leichte Sprache)",
"fields": [
{ "key": "levelNameEasy",
"label": "Level-Name (Leichte Sprache)",
"labelEasy": "Einfacher Name fuers Level",
"type": "text",
"maxLength": 64,
"default": "",
"help": "Kurzer, einfacher Titel als Alternative zum Haupt-Level-Namen. Wird angezeigt, wenn Bearbeiter:in Leichte Sprache aktiviert hat." }
]
}
]
}