Modding-Guide
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
- Mod-Ordner öffnen (wird beim ersten Spielstart automatisch angelegt):
~/.code-tycoon/mods/(Windows:C:\Users\<Name>\.code-tycoon\mods\) — allgemein der Ordnermods/neben demsaves/-Verzeichnis des Spiels - Unterordner anlegen, z. B.
mods/mein-erster-mod/ - Manifest
mod.jsonhineinlegen (siehe unten) - 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
}
| Feld | Pflicht | Bedeutung |
|---|---|---|
| id | ja | Eindeutige Kennung, nur a-z A-Z 0-9 _ -. Wird in Spielständen gestempelt — nach Veröffentlichung nicht mehr ändern! |
| name | nein | Anzeigename (Default: id) |
| version | nein | Freitext-Version, wird mit in Spielständen gestempelt |
| loadOrder | nein | Ladereihenfolge, 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.logim 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.
unlockCostabsurd 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
}
}
| Feld | Bedeutung |
|---|---|
| name | Anzeigename (Eigenname, kein Locale-Key) |
| symbol | Kürzel auf der Sprach-Karte (2–3 ASCII-Zeichen) |
| level, xp | Startwerte eines neuen Spielstands (üblich 0/0; Startsprachen 1/0) |
| unlocked | Von Beginn an freigeschaltet? |
| unlockCost | Freischaltkosten |
| releaseYear | Ab diesem Jahr verfügbar; zählt auch für Era-Ziele |
| devSpeed | Entwicklungsgeschwindigkeits-Multiplikator (Basis 0.3–1.4) |
| bugProb | Bug-Wahrscheinlichkeit 0..1 (kleiner = besser) |
| learnDifficulty | Lernaufwand 1–10 (höher = langsamerer XP-Fortschritt) |
| maxComplexity | Bis zu welcher Projekt-Komplexität die Sprache taugt |
| priceMult | Bezahlungs-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 }
]
| Feld | Bedeutung |
|---|---|
| name, description | Locale-Keys (tpl.<x>.name / .desc) — die Texte selbst gehören in locales/ |
| projectType | Domäne (web, game, ai, mobile, cloud, security, …) — steuert Spezialisierungs-Boni |
| minFeatures / maxFeatures | Feature-Spanne pro Auftrag |
| baseDeadlineDays + deadlinePerFeature | Deadline = Basis + Features × proFeature (Spieltage) |
| basePayment + paymentPerFeature | Bezahlung = Basis + Features × proFeature + Komplexität × 100 |
| earlyCompletionBonus / lateCompletionPenalty | Bonus/Malus bei früher/später Abgabe |
| minComplexity / maxComplexity | Komplexitäts-Spanne 1–10 |
| compatibleLanguages | Sprach-ids, mit denen der Auftrag machbar ist |
| availableFromYear | Erscheint erst ab diesem Jahr auf dem Markt |
| minOfficeRank / maxOfficeRank | Bü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 }
]
| Feld | Bedeutung |
|---|---|
| languageId | Zu welcher Sprache das Framework gehört |
| year | Verfügbar ab |
| speedBonus | Entwicklungs-Bonus (Basis 0.05–0.20), skaliert mit Erfahrung und Popularität |
| unlockCost | Freischaltkosten |
| popularityPeak | Jahr der Spitzenpopularität (voller Bonus) |
| popularityDecline | Jahre 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/:countmü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.jsonauf oberster Ebene), hochgeladen persteamcmdü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
| Bereich | Warum |
|---|---|
| Einträge löschen | Der Merge kann nur patchen/ergänzen; Workaround: unerreichbar teuer machen oder availableFromYear: 9999 |
| Skills, Eras, Events, Errungenschaften, Büros | Effekte stecken im Spielcode, nicht in Daten |
| Neue Panels / neue Spiellogik | Kein Skript-/Hook-API |
| Grafiken, Sounds, Fonts | Ressourcen-Overlay dafür ist nicht angebunden |
Troubleshooting
| Symptom | Ursache / Lösung |
|---|---|
| LOAD MODS ... NONE | Ordner 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.name | Locale-Keys fehlen — in locales/en.json ergänzen |
| Sprache ohne Aufträge | Kein Template führt die Sprach-id in compatibleLanguages |
| Kästchen statt Sonderzeichen | Symbol-Glyphen werden nicht gerendert — ASCII verwenden |
| Steam-Errungenschaften ploppen nicht | Beabsichtigt, solange Mods aktiv sind |
Hinweis: Listen-Felder (z. B. compatibleLanguages) werden
beim Patchen als Ganzes ersetzt — bestehende Werte mit angeben.