Ares: Modding
Grundlagen
Im Gegensatz zu anderen Spielen oder Programmen ist das Modden im Ares eine Grundvoraussetzung, um überhaupt das Simulationssystem in Betrieb nehmen zu können. Unter Modding versteht man ebenfalls hier das Hinzufügen oder Modifizieren von Inhalten. Da das Ares von Natur aus keine Daten mit sich bringt ist Modding nötig um überhaupt Inhalte bereitzustellen. Mods befinden sich im Ordner "data/mods/".
Struktur
Alle Inhalte einer Mod befinden sich in ihrem Stammverzeichnis, welches im mods-Ordner liegt. Der Name des Stammverzeichnisses ist zugleich der Namespace (später dazu mehr) der Mod und darf keine Leerzeichen enthalten. Ebenfalls sollten besondere Symbole oder Umlaute vermieden werden. Es sollte auf übliche Formate wie "beispiel_mod" oder "beispielMod" zurückgegriffen werden.
Jede Mod benötigt eine mod.info-Datei. Diese Datei enthält wichtige Metadaten zur Mod für den Ares-Betreiber. Enthalten sein müssen der Name (Anzeigename) der Mod eine Beschreibung, die Angabe des Autors und die Version. Formatiert wird die Datei als JSON. So könnte eine mod.info-Datei aussehen:
"description": "Hier könnte Ihre Werbung stehen.",
"author": "Biene antike",
"version": "1.0"
Daten und Skripte
Mods bestehen aus Daten und Skripten. Bei Daten handelt es sich um Inhalte, die in irgendeiner Weise hinzugefügt werden oder bestehende Inhalte ändern. Sie geben also neue Daten in den Fluss durch die Verarbeitung. Daten sind immer als JSON formatiert.
Skripte hingegen sind, wie der Name schon sagt, Skriptdateien, die in den bestehenden Datenfluss eingreifen und damit auch aktuelle Daten anpassen und modifizieren können. Unterstützt werden Skripte in Lua, Python und PHP. Wann ein Skript einsetzt und welche Daten es demnach erhält und zurückgeben muss, wird über eine Rahmendatei festgelegt.
Lokalisierung
Bei dem Entwurf von Texten für verschiedene Inhalte ist eine Lokalisierung erforderlich. Dabei muss mindestens eine Sprache addressiert werden. Lokalisierungen sind wiefolgt strukturiert:
"de-de": "Beispiel"
Hier werden sowohl Englisch (US), als auch Deutsch (Deutschland) implementiert. Die Codes der Sprachen orientieren sich nach dieser Liste.
Die Mod "std"
Einen besonderen Fall stellt die Mod "std" (Abkürzung für "Standard") dar. Hingegen zu allen anderen Mods ist sie im Quellcode des Ares fester Bestandteil und dementsprechend vorinstalliert. Da Ares selbst keine Datenverarbeitung übernimmt, muss diese von einer Mod übernommen werden, die hier als "std" bezeichnet wird. Sie legt auch vordefinierte Inhalte fest, wie eine mehrsprachige Namensliste für NPCs oder grundlegende Ressourcen und Mengenangaben. Die Mod "std" kann bearbeitet werden, jedoch sollte man vorsichtig dabei sein. Dateien oder Inhalte ganz zu entfernen wird nach gewisser Zeit das Ares unbrauchbar machen.
Inhalte der std-Mod
Die Inhalte der std-Mod sind hier abrufbar:
Inhalte
Wie in 1.2 Daten und Skripte bereits erwähnt, besteht ein wichtiger Teil der Mods aus Daten. Daten, die keine Metadaten bezeichnen oder als Rahmendatei fungieren, werden als Inhalte bezeichnet. Wie der Name bereits schließen lässt, bilden die Inhalte die eigentliche Neuerung einer Mod. Mit Inhalten kann sowohl das Ares, als auch die Mod selber arbeiten.
Allgemein: Namespaces
Namespaces (dt. "Namensräume") bezeichnen die Zugehörigkeit eines Inhalts zu einem gemeinsamen Kontext. So gehören alle Inhalte der std-Mod zum Namensraum "std". Damit wissen Ares und andere Mods, welcher Inhalt genau angesprochen werden soll. Hat z.B. die Mod "cooleMod" eine Ware mit der ID "iron", obwohl diese ID bereits durch die std-Mod vergeben wurde, so kann unterschieden werden zwischen "std:iron" und "cooleMod:iron". Man erkennt hieran zugleich, dass ein Namespace von seiner ID durch einen Doppelpunkt getrennt wird. Es ist daher unzulässig eine Mod, die einen Doppelpunkt enthält zu implementieren.
Namensets
Namensets unterstützen die Auswahl zufälliger Namen für NPCs. Namensets einer Mod sind in names.json gespeichert. Namensets teilen sich auf zwei Arten auf: Land und Geschlecht/Nachname. Das Land bestimmt die Herkunft eines Namens, d.h. für welches Land (oder welche Sprache) ein Name typisch ist bzw. verwendet werden soll. Wenn ein NPC mit entsprechender Herkunft generiert wird, dann wird ein zufälliger Name aus der jeweiligen Liste entnommen. Die Codes für die Länder werden dieser Liste entnommen. Diesen Listen untergeordnet ist die Einteilung nach Geschlecht bzw. Nachname: "male", "female", "nonBinary" und "surnames". Diese Listen übernehmen die Aufzählung von Vornamen nach Geschlecht ("male", "female", "nonBinary") und die Aufzählung von Nachnamen ("surnames"). Ein Beispiel für ein Namenset ist hier (Namenset der std-Mod) zu finden.Waren
Waren sind vor allem für wirtschaftliche Vorgänge wichtig und werden in commodities.json festgehalten. Eine Ware besteht aus einer ID, einem Namen, einer Basiseinheit und einem Typ. Außer "raw" und "replenishable" erfordern alle Typen eine Zusatzangabe. Beispiel für eine Ware wäre:
"unit": "x",
"type": "raw",
"nofraction": true
Hier wäre die ID der Ware "commodity" und der Name "Ware" (Deutsch) bzw. "commodity" (Englisch). Der Name ist immer eine Lokalisation. Die Einheit wäre "x" (mehr dazu unter "unit") und der Typ ein endlicher Rohstoff ("raw"). Außerdem ist die Ware nur ganzzahlig anzugeben.
"unit"
"unit" bezeichnet die Basiseinheit einer Ware. Sie wird vor allem zur Einordnung der Ware gebraucht (ob Volumen, Masse, etc.) und zur Referenz für andere Eigenschaft (siehe z.B. Typ "crafted"). Die Einheiten sind in der std-Mod festgelegt. Neben den üblichen Einheiten gibt es auch die Einheit "x". Sie wird verwendet für Stückangaben. (2x = "2-mal") Für die Basiseinheit wird nur die Einheit benutzt und nicht die Lokalisierung.
"type"
"type" bezeichnet den Typ einer Ware. Er bestimmt wie eine Ware gewonnen wird. Unterschieden wird zwischen fünf Typen. Wichtig hierbei ist, das ein Typ nicht festlegt, welche Voraussetzungen gegeben sein müssen, damit eine Ware gewonnen werden kann. (z.B., dass Pflanzen Wasser benötigen zum Wachsen) Das wird bei der Beschreibung der jeweiligen Produktionsstätten gemacht.
Typ "raw"
Der Typ "raw" bezeichnet eine endliche Ressource. Die Verteilung dieser Ressource obliegt dem Ares-Betreiber*.
* Geplant ist dennoch, dass Mods Kartendaten abrufen können um automatisierte Verteilungsalgorhithmen anzuwenden.
Typ "replenishable"
Der Typ "replenishable" bezeichnet eine quasi unendliche bzw. erneuerbare Ressource. Ebenfalls obliegt die Verteilung dieser Ressource dem Ares-Betreiber*.
* Geplant ist dennoch, dass Mods Kartendaten abrufen können um automatisierte Verteilungsalgorhithmen anzuwenden.
Typ "crafted"
Der Typ "crafted" bezeichnet eine Ressource, die aus anderen Ressourcen hergestellt wird. Dabei ist der Verbrauch der Ressourcen vom Verfahren abhängig. Es gibt zwei Herstellungsverfahren für den "crafted"-Typ:
- Merge-Verfahren: Mehrere Waren werden zu einer anderen Ware kombiniert. Dabei wird eine bestimmte Menge aller Waren beim Herstellungsverfahren verbraucht, um eine bestimmte Menge der anderen Ware anzufertigen.
- Ganzzahliges Merge-Verfahren: Das ganzzahlige Merge-Verfahren funktioniert wie das einfache Merge-Verfahren, jedoch kann die Menge der resultierenden Ware nur ganzzahlig sein. Dabei muss die Zielware die Eigenschaft "nofraction" auf true gesetzt haben.
- Split-Verfahren: Eine Ware kann hierbei ohne der Zugabe weiterer Waren mehrere verschiedene Waren herstellen. In der std-Mod wird das Verfahren z.B. bei der Schlachtung von Kühen genutzt, die sowohl Fleisch, als auch Leder geben.
"std:iron": 1.6
Es werden demnach 0,6kg Koks und 1,6kg Eisen für 1kg Stahl benötigt. Über Mods und Spezifikationen der Herstellungsanlagen können die Mengenangaben jedoch variiert werden.
Typ "gained"
Der Typ "gained" bezeichnet eine Ressource, die auf täglicher Basis durch eine andere Ware gewonnen wird, ohne dabei die andere Ware zu verbrauchen. Es handelt sich also um ein Nebenerzeugnis einer anderen Waren. Dafür wird die Basisware und die Menge dieser Ware für eine Menge der Basiseinheit der Zielware benötigt, also wie viel der Basisware benötigt wird um eine Menge der Basiseinheit der Zielware (z.B. 1 Kilogramm oder 1 Liter) herzustellen. Die std-Mod nutzt für Eier folgende Quelle:
Es werden also 1,25 Geflügeleinheiten gebraucht um am Tag ein Ei herzustellen. Die benötigte Menge kann hierbei durch Mods oder Spezifikationen der Herstellungsanlagen verändert werden.
Typ "parent"
Der Typ "parent" gruppiert verschiedene Gewinnungsverfahren für eine Ware. "parent" erfordert die Zusatzeigenschaft "children", die sich unterteilt in die einzelnen Gewinnungsverfahren, die allesamt eine eigene ID besitzen, sowie einen Typ und dessen Spezifikation. Die std-Mod unterscheidet so zwischen zwei Gewinnungsverfahren für Diamanten:
"artificial": {
"recipe": {
"nofraction"
"nofraction" bezeichnet die Eigenschaft einer Ware nur ganzzahlig dargestellt zu werden. Nützlich ist diese Eigenschaft vor allem bei allen Waren, die in Stückmengen angegeben werden. "nofraction" kann die Boolean-Werte true und false annehmen und ist standardmäßig auf false, ist daher nur sinnvoll zu nutzen, wenn der Wert auf true gesetzt werden soll.