fc8996f064
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>
227 lines
8.1 KiB
JSON
227 lines
8.1 KiB
JSON
{
|
||
"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." }
|
||
]
|
||
}
|
||
]
|
||
}
|