Modding
(Achtung! Dieser Artikel ist nach bestem Wissen und Gewissen aus der englischen Version übersetzt.) (Noch nicht komplett --> siehe englische Version)
Dieser Artikel zeigt einen kurzer Überblick über die aktuelle Modding Situation (ab Version 0.11.x):
TL;DR
Für Benutzer: Um ein bereits komplett fertiges Mod zu installieren, muss es ganz einfach entweder als zip oder als entpackte Datei in den mods Ordner kopiert werden. Das Spiel erkennt das Mod automatisch und fügt es der internen Mod-Liste zu. Man hat die Möglichkeit diese Liste manuell zu editieren (mods/mod-list.json), entweder außerhalb des Spiels mit einem Text Editor, oder im Spiel unter dem Menü-Punkt "Modifikationen" im Hauptmenü.
Für Entwickler: Werfen Sie einen Blick auf das Basis-Mod ( __read_data__/Basis). Dies ist ein gutes Beispiel für den korrekten Aufbau eines Mod (vorallem die Dateien info.json, data.lua, locale, usw.). __read_data__ ist das Datenverzeichnis im Installationsordner von Factorio, Für __write_data__ siehe Mods Verzeichnis
Das Mod Verzeichnis
Jeder Mod hat eine einen eigenen vollständigen Ordner. Diese befinden alle im __write_data__/mods Verzeichnis. Wo sich das __write_data__ Verzeichnis befindet, hängt vom Betriebssystem ab. Unter Linux befinden sich die Mods im Verzeichnis ~/.factorio/mods, unter OSX im Verzeichnis ~/Library/Application\ Support/factorio/mods. Unter Windows 7 befinden sie sich im Verzeichnis C:\Users\<username>\AppData\Roaming\Factorio\mods , an dieser Stelle sei die Möglichkeit erwähnt, mit %appdata%\Factorio\mods kommt man schneller ans Ziel. Noch einfach ist die Verknüpfung im Installationsverzeichnis C:\Program Files\Factorio. Falls die 32bit Version von Factorio auf einem 64bit System installiert ist, lautet der Pfad: C:\Program Files (x86)\Factorio. Falls zip-Pakete verwendet werden befindet sich __write_data__ im Factorio Ordner.
Modliste
In der Datei mods/mod-list.json befindet sich die Übersicht über vorhandene Mods. Wichtig ist die Reihenfolge, der Zugriff von Mods auf andere Mods funktioniert von unten nach oben. Das gleiche gilt für das Ausführen von Scripts, sie werden von oben nach unten gestartet. Die hier getätigten Einstellungen werden erst beim Start des Spiels geladen, bedeutet nach Änderung muss das Spiel neu gestartet werden. Über das Flag "enable" ist es möglich einzelne Mods zu deaktivieren. Neue Mods (also komplette Mod-Verzeichnisse) erkennt das Spiel automatisch und fügt sie der Modliste am Listenende hinzu. Die Reihenfolge sowie die Aktivierung/Deaktivierung lässt sich auch über das Spiel Grafisch ändern, hierzu geht man über das Hauptmenü auf "Modifikationen". Auch hier gilt, Änderungen werden erst nach Neustart des Spiels übernommen.
Die Mod Struktur
Ein Mod besteht aus einem Verzeichnis mit festgelegtem Namen welches alle nötigen Dateien beinhaltet.
Der Verzeichnisname sieht so aus: <modname>_<modversion> z.B. test_0.1.1 Wichtig ist, dass dies exakt so (case sensitive!) in der info.json eingetragen wird (seit Version 0.10.7 siehe http://www.factorioforums.com/forum/viewtopic.php?f=14&t=5364).
Nach dem empfohlenen Format werden Mod-Namen in Kleinbuchstaben geschrieben, sowie mehrere Wörter durch Bindestriche getrennt. Falls mehrere verwandte Mods entwickelt werden, sollte das Format "group-of-mods_module" verwendet werden.
Beispiel für ein Mod:
test_0.1.1 |- info.json (in der Datei muss name=test und version=0.1.1 eingetragen werden) |- ... |- Weitere Datein... |- ...
Die Mods können auch als zip-Datei gespeichert werden(erlaubt ist nur das Kompressionsverfahren DEFLATE). Der zip-Dateiname muss den gleichen Regeln wie oben beschrieben entsprechen und die Erweiterung .zip in Kleinbuchstaben aufweisen. Innerhalb der zip-Datei befindet sich ein Ordner mit den Moddatein, der Name dieses Ordners ist nicht wichtig jedoch wird empfohlen ihn so zu benenen als wäre das Mod entpackt.
Beispiel für eine zip-Mod:
test_0.1.1.zip |- test_0.1.1 |- info.json |- ... |- Weitere Datein... |- ...
Mod Metainformationen
Jedes Mod muss gewisse Metadaten beinhalten. Diese Informationen werden im Mod-Verzeichnis in der info.json Datei gespeichert. Die Datei sollte folgende Felder enthalten: name*, author*, version*, title*, homepage, description, dependencies (ab 0.4). Die mit dem Stern gekennzeichneten Felder müssen enthalten sein. Das name Feld muss den exakten Namen des Mod-Verzeichnisses haben z.b "name": test (ohne dem Versionsanhang!). Das Versions Feld ist mit x.y.z formatiert, wobei x für die Hauptversion (major), y für die mittlere Version und z für die Nebenversion (minor) steht. (z gibt es seit Version 0.4). Das dependencies (Abhängigkeits) Feld des folgenden Beispiels bedeutet, dass das "base" Mod mit der Version 0.4.1 oder höher, sowie jede Version des "scenario-pack" erforderlich ist. Is zusätzlich das "bar" Mod aktiv muss es die Version 0.3 sein. Falls das dependencies Feld nicht angegeben wird, wird nur das "base" Mod jeglicher Version vorrausgesetzt.
Ein Beispiel der info.json Datei:
{ "name": "test", "version": "0.1.1", "title": "Test Mod", "author": "Factorio Team", "contact": "dev@factorio.com", "homepage": "http://factorio.com", "description": "Unser test Mod.", "dependencies": ["base >= 0.4.1", "scenario-pack", "? bar = 0.3"] }
Prototype Definition
Mods können neue Prototypen hinzufügen sowie bestehende aus den Dateien test/data.lua, data-updates.lua und data-final-fixes-lua verändern. Die data.lua Dateien verschiedener Mods werden nach der Reihenfolge in der Modliste ausgeführt, danach die data-updates.lua und zum Schluss die data-final-fixes-lua. Danach werden die Prototypdefinitionen aus der data.raw Tabelle abgerufen. Das Format der data.raw ist eine Map mit den Typen der Prototypen, deren Werte wiedrum Maps mit Werten welche Prototype Tabellen sind, gefüllt ist.
data.raw = { ammo = {...ammo prototypes...} item = {...item prototypes...} ... }
data.raw.ammo["piercing-bullet-magazine"] = { type="ammo", name="piercing-bullet-magazine", magazine_size = 10, ... }
Wie auch immer, bevorzugt zu benutzen ist eine vordefinierte erweiterte Methoden der data variable. Diese erledigt das automatisch.
Beispiel:
Hinzufügen neuer Definitionen:
Adding new definitions:
data:extend( { { type="ammo", name="piercing-bullet-magazine", magazine_size = 10, ... }, { type="ammo", name="flame-thrower-ammo", ... } })
Wechseln bestehender Definitionen:
data.raw.ammo["piercing-bullet-magazine"].magazine_size = 20
Grundsätzlich ist jeder Prototyp eine Lua-Tabelle mit Einträgen der Eigenschaften. Alle Prototypen werden in der globalen data.raw Tabelle gesammelt.
Mod Scripts
Jedes Mod darf ein control.lua Script beinhalten. Wenn das Spiel läuft, werden zuerst die Scenarioscript's und darauf folgend die control.lua Script's ausgeführt. Somit ist es Mods ermöglicht dem Spiel Verhalten hinzuzufügen, ohne das unterliegende scenario Script zu verändern.
Sprachen
Das Spiel lädt automatisch die richtige Sprache aus dem Mod Verzeichnis (mods/test_0.1.1/locale). Aufgebaut wird das Verzeichnis wie das normale auch (Zweibuchstabige Sprachverzeichnisse für die verschiedenen Sprachen und darin eine .cfg Datei. Die Dateien werden mit den des "Normalen Mods" verbunden. Sprachen für control-lua Script's werden im script-local Verzeichnis abgelegt (Dort sieht das Format eine .cfg Datei pro Sprache vor). Die .cfg Datei muss mit UTF-8 (ohen BOM) encoded werden können. Einfacher ist es etwas bestehendes zu kopieren.
Basis Mod
Alle aktuellen Spiel Informationen werden auch als Mod behandelt. Bezeichnet wird es als "base mod" und befindet sich nicht im __write_data__ Verzeichnis, sondern im __read_data__ Verzeichnis. Es besteht die Möglichkeit das Basis Mod zu deaktivieren, jedoch werden einige Elemente daraus für den Spielstart benötigt unter anderem Item's auf dem Boden und außerhalb der Map-Fläche. Man könnte theoretisch diese dinge in einem eigenen Mod einfügen, aber geteste ist das nicht :).