Mod-Dateien und IDs
Jeder Mod ist ein Ordner mit einer mod.json. Füge nur die weiteren Dateien hinzu, die dein Mod verwendet.
my_mod/
mod.json
data.json
lang/*.lang.txt
maps/
models/*.glb
main.gd
Hier ist eine vollständige mod.json. Nur id ist Pflicht. Wähle eine eindeutige ID und behalte sie bei Updates bei. Spielstände erkennen den Mod an dieser ID.
{
"id": "north_line_mail",
"name": "North Line Mail",
"version": "1.0",
"author": "Your name",
"description": "A diesel for overnight mail trains."
}
Öffne im Hauptmenü Mods und wähle Mod-Ordner öffnen. Lege den Ordner oder die ZIP-Datei dort ab, klicke auf Neu suchen und aktiviere den Mod. Arbeite beim Bearbeiten mit dem entpackten Ordner, damit du speichern und erneut suchen kannst. Änderungen gelten für das nächste Spiel, das du startest oder lädst.
Fahrzeuge
Trage jedes Fahrzeug in data.json unter vehicles mit einer eindeutigen Fahrzeug-ID ein. north_line_mail_diesel fügt zum Beispiel eine Lok hinzu, die wie die Diesellok des Grundspiels aussieht.
{
"vehicles": {
"north_line_mail_diesel": {
"name": "North Line Mail Diesel",
"kind": "rail",
"look": "diesel",
"cargos": ["mail", "pax"],
"max_wagons": 6,
"speed": 6.2,
"cost": 88000,
"run": 7600,
"year": 1962,
"desc": "A fast diesel for overnight mail."
}
}
}
| Feld | Wert |
|---|---|
name, desc | Anzeigename und optionale Shopbeschreibung. |
kind | rail, road, water oder air. |
look oder model | Verwende ein vorhandenes Modell desselben Typs oder gib den Pfad zu deinem eigenen Modell an. Beispiele aus dem Grundspiel sind steam, diesel, bus, truck, ferry, freighter, prop und jet. |
cargos | Liste mit mindestens einer vorhandenen Fracht-ID, etwa pax, mail, coal, wood, goods und food. |
max_wagons oder cap | Für Loks ist max_wagons Pflicht. Bei anderen Fahrzeugen gibt cap die Kapazität an. |
speed | Felder pro Spieltag. Mit 30 multipliziert ergibt das die Geschwindigkeit in km/h, die im Shop steht. |
cost, run | Kaufpreis und jährliche Betriebskosten in ganzen Dollar. Wagen erhöhen den Preis des Zuges. |
year | Erstes Verkaufsjahr. Lass das Feld weg, wenn das Fahrzeug von Anfang an verfügbar sein soll. |
rel | Optionale Anfangszuverlässigkeit zwischen 0 und 1. Der Standardwert hängt vom Jahr des Fahrzeugs ab. |
electric | Setze den Wert für Loks mit Oberleitungsbedarf auf true. |
Mods fügen neue Fahrzeug-IDs hinzu. Meldet Fourways eine doppelte ID, wähle eine, die nur dein Mod verwendet.
Eigene 3D-Modelle
Exportiere dein Modell als binäres glTF (.glb) und lege es in models/ ab. Verwende in der Fahrzeugdefinition "model": "models/mail.glb" anstelle von look. Gib unter length die Fahrzeuglänge in Feldern an.
- Modelliere mit einer Einheit pro Feld. Ein Bus ist etwa 0,46 Einheiten lang, ein Schiff etwa 0,9.
- Zentriere das Modell am Ursprung, setze seine Unterseite auf Y = 0 und richte es nach −Z aus.
- Eigene Modelle behalten ihre exportierten Materialien. Modelle, die du mit
lookübernimmst, nutzen die Firmenfarben. - Das Modell einer Lokomotive umfasst nur die Lok. Fourways stellt die Wagen bereit.
Frachttarife und Namen
Füge die gewünschten Abschnitte in data.json neben den Fahrzeugdefinitionen ein oder verwende sie einzeln.
{
"cargo": {
"mail": {"rate": 52, "days": 10}
},
"town_names": {
"prefixes": ["Vila", "Sant", "Mont"],
"suffixes": ["nova", "bella", "serrat"],
"replace": false
},
"company_names": ["Ferrocarrils del Nord", "Costa Brava Lines"]
}
- Verwende in
cargovorhandene Fracht-IDs.rateist der Tarif für eine Einheit über 25 Felder.daysgibt an, wie viele Tage der volle Tarif gilt. Beide Werte müssen positiv sein. Drücke Y, um das Ergebnis unter Frachttarife zu sehen. town_nameskombiniert eine Vorsilbe und eine Nachsilbe zu Ortsnamen. Ersetze mitreplace: truedie Namenslisten des Grundspiels durch deine eigenen.company_namesliefert Namen für Konkurrenzfirmen. Das Spiel verwendet diese Namen zuerst und greift danach auf seine eigene Liste zurück.
Höhenkarten und Voreinstellungen
Lege eine PNG- oder JPEG-Datei in Graustufen in maps/ ab. Schwarz markiert das tiefste Gelände, meist das Meer, und Weiß das höchste. Fourways passt das Bild an die Weltgröße an und führt es unter Karte in Neues Spiel auf.
Lege zu great_valley.png eine Datei namens great_valley.json an, um Name, Beschreibung und Startoptionen festzulegen.
{
"name": "Great Valley",
"description": "A wide valley between two ranges.",
"settings": {"w": 512, "h": 256, "towns": 1, "industries": 2, "year": 1970}
}
- Breite und Höhe können jeweils 64, 128, 256, 512 oder 1024 Felder betragen.
- Die Dichte von Orten und Industrien reicht von 0 (wenige) bis 3 (sehr dicht).
- Mögliche Startjahre sind 1950, 1960, 1970, 1980, 1990 und 2000. Spieler können die Voreinstellungen vor dem Start ändern.
Übersetzungen und neue Sprachen
Lege Textdateien mit der Endung .lang.txt in lang/ ab. Beginne jeden Block mit > und dem genauen englischen Wortlaut. Füge pro Sprachcode eine Zeile hinzu. Das funktioniert für Texte des Grundspiels und für Namen und Beschreibungen deiner Mod-Fahrzeuge.
> Cost %s
es: Coste %s
ca: Cost %s
fr: Coût %s
- Lass Platzhalter wie
%sund%din derselben Reihenfolge. Verwende\nfür Zeilenumbrüche und doppelte Anführungszeichen für Texte mit Leerzeichen am Anfang oder Ende. - Für eine neue Sprache hinterlegst du Übersetzungen unter ihrem Sprachcode. Übersetze auch den Schlüssel
English, damit die Sprache unter ihrem eigenen Namen in den Einstellungen erscheint. Schreibe etwanl: Nederlandsunter> English. - Schließe Texte in Skripten in
L.t("English text")ein, damit Spieler sie mit denselben Dateien übersetzen können.
Spielskripte
Lege main.gd im Mod-Ordner an und beginne mit extends Mod. Überschreibe die benötigten Funktionen. Dieses Beispiel zahlt dem Spieler jeden Monat 500 $ Zuschuss und veröffentlicht eine Meldung.
extends Mod
func _on_month(sim: Sim) -> void:
sim.company.earn(500)
news(sim, L.t("Monthly transport grant"), "good")
| Funktion | Wann Fourways sie aufruft |
|---|---|
_on_load() | Beim Anwenden der aktiven Mods, auch wenn du im Mod-Menü erneut suchst. Zu diesem Zeitpunkt läuft kein Spiel. |
_on_new_game(sim)_on_game_loaded(sim) | Wenn eine Welt erstellt oder ein Spielstand vollständig geladen wurde. |
_on_day(sim)_on_month(sim)_on_year(sim, year) | Jeden Tag, zum Monatsende und beim Jahreswechsel. year ist das gerade abgelaufene Jahr. |
_on_delivery(sim, vehicle, station, amount) | Nachdem ein Fahrzeug entladen und der Transport bezahlt wurde. |
_on_vehicle_bought(sim, vehicle)_on_station_built(sim, station) | Nach einem Kauf oder nachdem eine Station gebaut oder erweitert wurde. |
_on_news(sim, item) → bool | Vor dem Veröffentlichen einer Meldung. Das Dictionary enthält text, kind, pos und day. Gib false zurück, um sie auszublenden, oder true, um sie zuzulassen. |
_save(sim) → Dictionary_load(sim, data) | Gib aus _save ein Dictionary mit einfachen Daten zurück. Enthält der Spielstand Daten für diesen Mod, übergibt Fourways sie vor _on_game_loaded an _load. |
Das Objekt sim bietet Zugriff auf Firmen, Fahrzeuge, Orte, Industrien und Stationen. Nutze sim.rng für reproduzierbare Zufallsereignisse und Methoden wie sim.build_station() oder sim.buy_vehicle() für Spieleraktionen. Die Klasse Mod bietet news() für Meldungen, note() für Logeinträge und path() zum Auffinden von Dateien im Mod-Ordner.
Hilfsfunktionen für Mods
news(sim, text, kind = "info", at = Vector2(-1, -1))veröffentlicht eine Meldung. Verwendegood,info,warnoderbadfürkind. Gib inatein Feld an, zu dem ein Klick auf die Meldung springt.note(text)schreibt einen Logeintrag mit der Mod-ID. Du kannst die Funktion aus_on_load()aufrufen.path(file)gibt den Pfad zu einer Datei im Mod-Ordner zurück. Überinfokannst du Metadaten wieid,nameundversionabfragen.
Häufige Simulationsaktionen
Du kannst diese Methoden aus einer Funktion aufrufen, die sim erhält. Ohne who wird die Firma des Spielers verwendet. Prüfe bei einem zurückgegebenen Dictionary zuerst ok. Bei einem Fehlschlag steht der Grund in reason.
sim.build_line(kind, pts, who = null)baut eine Straße (road) oder ein Gleis (rail) über aufeinanderfolgende benachbarte Felder. Übergib ein typisiertesArray[Vector2i].sim.build_station(kind, pts, axis, who = null)baut oder erweitert eine Station vom Typroad,rail,dockoderair. Übergib die Felder alsArray[Vector2i]und bei Straße oder Schiene die Ausrichtung des Bahnsteigs. Bei Erfolg enthält das Ergebnisstation.sim.buy_vehicle(model_id, cargo, wagons, stops, full_load_first, who = null, consist = [], transfer_at = [])kauft ein Fahrzeug mit einer vorhandenen Modell-ID und einer Liste von Stationen.consistkann bei gemischten Zügen Fracht und Wagenzahl überschreiben.transfer_atenthält die Indizes der Halte, an denen Fracht für ein anderes Fahrzeug zurückgelassen wird. Bei Erfolg enthält das Ergebnisvehicle.sim.town_action(town, action, who = null)führtadvertise,treesoderfundaus und gibt die Kosten der Aktion incostzurück.sim.company.earn(amount)schreibt der Firma des Spielers Geld gut.sim.company.spend(cost, category)bucht eine Ausgabe und gibtfalsezurück, wenn das Geld nicht reicht. Kategorien sind zum Beispielconstructionundvehicles.town.rating(company_id)liest die Bewertung durch den Gemeinderat.town.change_rating(company_id, delta, why = "", day = -1)passt sie im Bereich von 0 bis 100 an. Übergib einen Grund undsim.day_int, um die Änderung im Ortsfenster zu protokollieren.
Hier sind alle von Mod definierten Funktionen aufgeführt. Skripte können weitere Methoden des Spiels und von Godot aufrufen. Diese findest du im Quellcode des Spiels und der Engine.
Skript-Mods laufen mit den Berechtigungen des Spiels. Aktiviere nur Skripte von vertrauenswürdigen Autoren.
Spielstände und Weitergabe
Packe den Mod-Ordner zum Weitergeben als ZIP-Datei. Fourways akzeptiert auch ZIP-Dateien mit mod.json auf der obersten Ebene. Behalte die Mod-ID und die Fahrzeug-IDs über mehrere Versionen hinweg bei, damit vorhandene Spielstände sie wiederfinden.
Ein Spielstand merkt sich aktive Mods und kann Skriptdaten speichern. Fehlt beim Laden ein Mod oder ist er ausgeschaltet, warnt Fourways und lässt Fahrzeuge mit fehlenden Modellen weg. Aktiviere die ursprünglichen Mods wieder, bevor du einen davon abhängigen Spielstand lädst.
Die eingebauten Formate decken die hier beschriebenen Inhalte ab. Neue Frachtarten, Industrien oder Stadtgebäude, einzelne Baukosten, der Austausch von Modellen oder Sounds des Grundspiels und Änderungen an der Oberfläche erfordern Arbeit am Spielcode.