> Code Tycoon
Modding Impressum Datenschutz DE | EN

Modding-Guide

Verfügbarkeit: Mod-Support erscheint mit einem kommenden Code-Tycoon-Update. Dieser Guide dokumentiert das Format vorab — die beschriebene Struktur ist final, ihr könnt Mods also schon vorbereiten.

Code Tycoon lädt beim Start Mods aus einem lokalen Ordner und aus abonnierten Steam-Workshop-Items. Ein Mod kann Spielinhalte ändern oder ergänzen (Programmiersprachen, Auftrags-Templates, Frameworks), Übersetzungen überschreiben und ganze UI-Panels ersetzen — alles datengetrieben über JSON-Dateien, ganz ohne Code.

Schnellstart

  1. Mod-Ordner öffnen (wird beim ersten Spielstart automatisch angelegt): ~/.code-tycoon/mods/ (Windows: C:\Users\<Name>\.code-tycoon\mods\) — allgemein der Ordner mods/ neben dem saves/-Verzeichnis des Spiels
  2. Unterordner anlegen, z. B. mods/mein-erster-mod/
  3. Manifest mod.json hineinlegen (siehe unten)
  4. Inhalte daneben legen, Spiel starten — der Boot-Screen zeigt LOAD MODS ... 1
mein-erster-mod/
mod.json          Pflicht: Manifest
data/             optional: Balancing-Content (key-weise gemergt)
  languages.json
  project_templates.json
  frameworks.json
locales/          optional: Uebersetzungen (key-weise gemergt)
  en.json
  de.json
ui/               optional: Panel-Layouts (ersetzen das Original komplett)
  desktop.ui.json

mod.json

{
  "id": "mein-erster-mod",
  "name": "Mein erster Mod",
  "version": "1.0",
  "loadOrder": 0
}
FeldPflichtBedeutung
idjaEindeutige Kennung, nur a-z A-Z 0-9 _ -. Wird in Spielständen gestempelt — nach Veröffentlichung nicht mehr ändern!
nameneinAnzeigename (Default: id)
versionneinFreitext-Version, wird mit in Spielständen gestempelt
loadOrderneinLadereihenfolge, kleinere Zahl = früher (Default: 0)

Regeln: Ladereihenfolge, Konflikte, Fehler

  • Reihenfolge: Lokale Mods laden zuerst (sortiert nach loadOrder, dann Ordnername), danach Workshop-Mods. Späteres überschreibt Früheres.
  • Doppelte ids: Der zuerst geladene Mod gewinnt — lokale Mods schlagen gleichnamige Workshop-Mods.
  • Kaputte Mods killen nie den Spielstart. Ungültige Dateien werden übersprungen, im Log (game.log im Spielverzeichnis) protokolliert und in-game als Warnung angezeigt.
  • Spielstände speichern die aktive Mod-Liste. Wird ein Save ohne diese Mods geladen, warnt das Spiel.
  • Steam: Solange Mods aktiv sind, sind Steam-Errungenschaften und Steam-Bestenlisten (Leaderboards) deaktiviert. Spielinterne Errungenschaften funktionieren normal weiter.

Content modden: data/

Die drei Dateien in data/ werden key-weise über die Basisdaten gemergt (die Originale liegen in resources/data/ der Spielinstallation — dort stehen alle Standard-Werte zum Nachschlagen):

  • Bekannte id patchen: nur die geänderten Felder angeben, der Rest bleibt.
  • Neue id anhängen: Eintrag muss vollständig sein (alle Felder).
  • Löschen ist nicht möglich — nur umbalancieren (z. B. unlockCost absurd hoch setzen).

languages.json — Programmiersprachen

{
  "assembler": { "unlockCost": 250 },

  "zig": {
      "name": "Zig", "symbol": "Zg", "level": 0, "xp": 0,
      "unlocked": false, "unlockCost": 9000,
      "releaseYear": 2016, "devSpeed": 1.0, "bugProb": 0.1,
      "learnDifficulty": 7, "maxComplexity": 90, "priceMult": 1.9
  }
}
FeldBedeutung
nameAnzeigename (Eigenname, kein Locale-Key)
symbolKürzel auf der Sprach-Karte (2–3 ASCII-Zeichen)
level, xpStartwerte eines neuen Spielstands (üblich 0/0; Startsprachen 1/0)
unlockedVon Beginn an freigeschaltet?
unlockCostFreischaltkosten
releaseYearAb diesem Jahr verfügbar; zählt auch für Era-Ziele
devSpeedEntwicklungsgeschwindigkeits-Multiplikator (Basis 0.3–1.4)
bugProbBug-Wahrscheinlichkeit 0..1 (kleiner = besser)
learnDifficultyLernaufwand 1–10 (höher = langsamerer XP-Fortschritt)
maxComplexityBis zu welcher Projekt-Komplexität die Sprache taugt
priceMultBezahlungs-Multiplikator für Aufträge in dieser Sprache

Neue Sprachen erscheinen automatisch im Sprachen-Panel. Damit Aufträge sie nutzen, muss mindestens ein Template sie in compatibleLanguages führen.

project_templates.json — Auftrags-Templates

JSON-Liste, gematcht über id. Feldnamen müssen exakt stimmen — eine Zeile mit unbekanntem Feldnamen oder fehlenden Pflichtfeldern wird übersprungen und in-game als Warnung gemeldet.

[
  { "id": "tpl_website", "basePayment": 2000 },

  { "id": "tpl_gamedev_studio",
    "name": "tpl.gamedev_studio.name", "description": "tpl.gamedev_studio.desc",
    "projectType": "game",
    "minFeatures": 4, "maxFeatures": 8,
    "baseDeadlineDays": 40, "deadlinePerFeature": 4,
    "basePayment": 8000, "paymentPerFeature": 900,
    "earlyCompletionBonus": 500, "lateCompletionPenalty": 400,
    "minComplexity": 5, "maxComplexity": 9,
    "possibleFeatures": [],
    "compatibleLanguages": ["cpp", "csharp", "rust"],
    "availableFromYear": 2000,
    "minOfficeRank": 2, "maxOfficeRank": 4 }
]
FeldBedeutung
name, descriptionLocale-Keys (tpl.<x>.name / .desc) — die Texte selbst gehören in locales/
projectTypeDomäne (web, game, ai, mobile, cloud, security, …) — steuert Spezialisierungs-Boni
minFeatures / maxFeaturesFeature-Spanne pro Auftrag
baseDeadlineDays + deadlinePerFeatureDeadline = Basis + Features × proFeature (Spieltage)
basePayment + paymentPerFeatureBezahlung = Basis + Features × proFeature + Komplexität × 100
earlyCompletionBonus / lateCompletionPenaltyBonus/Malus bei früher/später Abgabe
minComplexity / maxComplexityKomplexitäts-Spanne 1–10
compatibleLanguagesSprach-ids, mit denen der Auftrag machbar ist
availableFromYearErscheint erst ab diesem Jahr auf dem Markt
minOfficeRank / maxOfficeRankBüro-Stufen 0–4 (Garage → Headquarters)

frameworks.json — Frameworks

[
  { "id": "react", "speedBonus": 0.2 },

  { "id": "phpolygon", "languageId": "php", "name": "PHPolygon",
    "year": 2025, "speedBonus": 0.2, "unlockCost": 5000,
    "popularityPeak": 2030, "popularityDecline": 10 }
]
FeldBedeutung
languageIdZu welcher Sprache das Framework gehört
yearVerfügbar ab
speedBonusEntwicklungs-Bonus (Basis 0.05–0.20), skaliert mit Erfahrung und Popularität
unlockCostFreischaltkosten
popularityPeakJahr der Spitzenpopularität (voller Bonus)
popularityDeclineJahre nach dem Peak, ab denen der Bonus jährlich ~5 % verfällt (Boden: 30 %)

Übersetzungen modden: locales/

locales/<sprache>.json wird key-weise über die Spiel-Übersetzung gemergt — gleiche Struktur wie resources/locales/*.json im Spiel. Damit lassen sich Texte für eigene Inhalte ergänzen (ein neues Template braucht seine tpl.*-Keys) oder beliebige bestehende Spieltexte überschreiben.

{
  "tpl": {
      "gamedev_studio": {
          "name": "Spielestudio-Auftrag",
          "desc": "Ein AAA-Studio braucht Verstaerkung."
      }
  }
}
  • Platzhalter im Format :name / :count müssen erhalten bleiben.
  • Nicht übersetzte Keys fallen auf Englisch zurück — für kleine Mods reicht eine en.json.
  • Unterstützt sind die 31 Spiel-Locales (en, de, fr, …, zh-CN, zh-TW).
  • Nur ASCII-taugliche Symbole in UI-Texten — die Engine rendert keine Symbol-Glyphen (★ ✓ ⚠ werden zu leeren Kästchen).

UI modden: ui/

ui/<panel>.ui.json ersetzt das gleichnamige Layout aus resources/ui/ der Spielinstallation komplett (kein Merge; bei mehreren Mods gewinnt der letzte). Am besten die Originaldatei kopieren und anpassen. Die Layouts sind deklarative Widget-Bäume mit {"$bind": "..."}-Datenbindungen und {"$on": {...}}-Events — Bindings und Event-Namen müssen erhalten bleiben, Layout, Größen, Farben und statische Texte sind frei. Designraum ist 1280×720. Geeignet für Umbauten/Reskins bestehender Panels; neue Panels mit neuer Logik sind nicht möglich.

Steam Workshop

  • Abonnieren (Spieler): Item im Workshop abonnieren → Steam lädt es nach steamapps/workshop/content/4347780/<publishedfileid>/ herunter → beim nächsten Spielstart lädt es wie ein lokaler Mod. Über „Abo beenden" wird es wieder entfernt.
  • Veröffentlichen (Modder): Ein Workshop-Item ist exakt der Mod-Ordner (mit mod.json auf oberster Ebene), hochgeladen per steamcmd über eine VDF-Build-Konfiguration:
// workshop_item.vdf
"workshopitem"
{
  "appid"           "4347780"
  "publishedfileid" "0"              // 0 = neues Item, sonst die vergebene ID zum Aktualisieren
  "contentfolder"   "C:\\pfad\\zu\\mein-erster-mod"
  "previewfile"     "C:\\pfad\\zu\\preview.png"   // JPG/PNG/GIF, max. 1 MB
  "visibility"      "0"              // 0 oeffentlich, 1 nur Freunde, 2 privat, 3 nicht gelistet
  "title"           "Mein erster Mod"
  "description"     "Fuegt Zig hinzu."
  "changenote"      "Erste Version"
}

steamcmd +login <account> <passwort> +workshop_build_item C:\pfad\zu\workshop_item.vdf +quit

Feldnamen und Reihenfolge folgen der Steam-Build-Konfiguration; der VDF-Pfad beim Aufruf muss absolut sein. Beim ersten Upload gibt Steam eine publishedfileid aus — diese in die VDF eintragen, um dasselbe Item später zu aktualisieren (nicht neu hochladen).

Was (noch) nicht moddbar ist

BereichWarum
Einträge löschenDer Merge kann nur patchen/ergänzen; Workaround: unerreichbar teuer machen oder availableFromYear: 9999
Skills, Eras, Events, Errungenschaften, BürosEffekte stecken im Spielcode, nicht in Daten
Neue Panels / neue SpiellogikKein Skript-/Hook-API
Grafiken, Sounds, FontsRessourcen-Overlay dafür ist nicht angebunden

Troubleshooting

SymptomUrsache / Lösung
LOAD MODS ... NONEOrdner liegt falsch (muss mods/<mod>/mod.json sein) oder Manifest ungültig
„Mod konnte nicht geladen werden"mod.json fehlt / kein gültiges JSON / id ungültig oder doppelt — Details in game.log
„Ungültige Datendatei ignoriert"JSON-Fehler (Kommas, Anführungszeichen — JSON kennt keine Kommentare) oder Tippfehler im Feldnamen
Template zeigt tpl.x.nameLocale-Keys fehlen — in locales/en.json ergänzen
Sprache ohne AufträgeKein Template führt die Sprach-id in compatibleLanguages
Kästchen statt SonderzeichenSymbol-Glyphen werden nicht gerendert — ASCII verwenden
Steam-Errungenschaften ploppen nichtBeabsichtigt, solange Mods aktiv sind

Hinweis: Listen-Felder (z. B. compatibleLanguages) werden beim Patchen als Ganzes ersetzt — bestehende Werte mit angeben.

> Code Tycoon
Modding Impressum Datenschutz

© 2026 Code Tycoon