{
  "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." }
      ]
    }
  ]
}
