Mods zu Anno 1800 sind in immer mehr Munde, aber umso häufiger liest man auch von Fehlern, Problemen, Änderungswünschen und Missverständnis. Hingegen sind Aufklärung und Infos zu potentiellen Fehlerquellen und Updates weit gestreut und teils kaum findbar.
Ich möchte euch an dieser Stelle eine Art erste Anlaufstelle geben, wenn ihr mit dem Thema noch nicht viel anfangen könnt, aber mehr darüber wissen wollt. Es soll euch helfen abzuwägen, ob ihr diesen Schritt gehen, und Mods nutzen wollt, oder falls ihr Probleme bei der Nutzung habt. Es soll aber auch helfen, wenn ihr Mods und Modder besser verstehen möchtet, weil ihr vlt. selbst Ideen habt.
Modding kommt von modifizieren (bzw. im englischen: to modify) und bezeichnet in unserem Fall das Verändern der Spieldateien von Anno 1800.
Mods sind einzelne Moddingprojekte.
In den wohl meisten Fällen wird Modding von den Entwicklerstudios nicht (aktiv) unterstützt; so auch bei Anno. Modding wird von Ubisoft nicht unterstützt, es wird aber geduldet. User werden deswegen nicht gesperrt. Im Ubisoft-Forum kann man sogar einen Beitrag zum Thema Mods/UGC finden, sowie eine eigene Kategorie für Fan-Stuff, auch wenn da nicht sooo viel los ist leider.
Mod-User haben es allerdings bei Problemen schwerer, da der Fehler auch durch Mods verursacht sein kann (siehe im Bereich Troubleshooting).
Deshalb ganz dick zum abschreiben:
Wer moddet hat mit seinen gemoddeten Spielständen keinen Anspruch auf Support und handelt auf eigene Gefahr!
Bei Problemen muss man selbst schauen, wo das Problem liegt, ob der Modder ein Update bringt oder ob man das Problem anderweitig los wird. Modder garantieren keinen Support für Ihre Mods, leisten erfahrungsgemäß bei vorhandener Eigeninitiative aber bereitwillig Hilfestellung.
Nun, da gibt es kontroverse Ansichten zu dem Thema. Würde man die Support-Abteilung fragen, würde man wohl ein klares Nein bekommen, alleine schon aus rechtlichen Gründen.
Die Devs im Hintergrund jedoch mögen die Kreativität der Modder und schätzen ihr Engagement in der Community.
Auch die Community selbst ist sich da nicht ganz so einig. Modding wird in der Regel von den Usern akzeptiert, auch wenn ModUser gerne mal belächelt werden mögen. Doch gibt es auch manche, die meinen das Modding grundsätzlich verwerfliches cheaten sei, und auf Facebook bei Posts das Modding gefälligst klar deklariert wissen wollen. Doch besonders seit Anno 1800 gibt es auch das andere Extrem mit Kommentaren wie "Ohne modding ist 1800 gar nicht spielbar".
Mit Mods kann man das Spiel personalisieren. Man kann sich neue Gebäude hinzufügen und ein Deko-Paradies erschaffen; man kann es sich einfacher machen. Man kann es sich aber auch schwerer machen (ok, von einer solchen Mod habe auch ich leider noch nichts gelesen ^^).
Die meisten Modder haben Anstand und versuchen trotz ihres Eingreifens in das Spiel ein gewisses Balancing zu halten. Dadurch kann man durchaus massive Bereicherungen für das Spielerlebnis erlangen. Doch auch die so verpöhnten CheatMods, welche das Balancing bewusst aushebeln, scheinen ja eine Daseinsberechtigung zu haben, immerhin gibt es User, die sie benutzen.
Und ist am Ende nicht genau dies wichtig: Das möglichst viele Menschen mit Freude Anno spielen, damit ein Folgeteil umso garantierter ist?
Cheating kommt von to cheat im Englischen und heißt Betrug, oder auch betrügen, mogeln.
In früheren Annos hat man zum cheaten u.a. den Inseln bestimmte Namen gegeben. Als Beispiel: Hat man in 1701 seine Insel in "BonanzaCreek" umbenannt, so hat man 100.000 Münzen bekommen. Entstanden sind Cheats im Ursprung zur Entwicklung von Videospielen, damit die Devs zeitsparender testen konnten. Über verschiedenste Wege sind solche Cheats dann in die Userschaft gekommen, haben sich nach und nach verbreitet (Seit dem Internet ein klein wenig schneller und weiter) und stehen heute bei jedem guten Gamingmagazin zum Abruf bereit.
Um nur mal einen Weg als Beispiel zu nennen.
Bei Anno 1800 läuft cheating für User zumeist über Mods.
Sogenannte Cheat-Mods (Gerne seicht 'Trainer' genannt) helfen den Spielern gewisse Hürden zu nehmen, unter anderem indem sie den Spieler mit Geld, Waren oder Items versorgen, bzw. den Zugang dazu deutlich erleichtern. Manche Spielmechaniken werden sogar ganz deaktiviert.
Während Modding an sich weitestgehend akzeptiert ist, so wird cheaten jedoch zumeist eher verpöhnt; selbst bei vielen Moddern. Die Grenze wo cheaten anfängt ist allerdings sehr schwammig. Das hinzufügen von Dekoobjekten gehört zum Beispiel definitiv nicht dazu; zumindest meines Erachtens nach. Anders sieht es aber vmtl. aus, wenn man durch Modding beim Bau eines Schiffes hunderte Items ins Kontor bekommt, um mal ein vergangenes Beispiel aufzugreifen.
Wer beim Programmieren und Testen von Spielen und Mods, aber auch beim vorbereiten eines Settings für Videos und Streams cheatet, rein um Zeit zu sparen oder um ganz bestimmte Situationen herzustellen, käme wohl nie auf die Idee sich oder solch einen als Cheater zu bezeichnen. Macht man das aber in einem Wettkampf gegen andere, ich denke so sind wir uns schon eher einig das 'gecheatet' wird.
Ob jemand ein 'böser Cheater' ist hängt also rein vom Kontext ab, denn selbst Benutzer von CheatMods nutzen sie nicht immer um zu cheaten.
Dank findigen Usern wie meow ist das gar nicht schwer. Es sind nur wenige einfache Schritte nötig:
AchtungAlle Mods in diesem Ordner, die kein "-" am Anfang des Ordnernamens haben werden nun automatisch in das Spiel eingefügt, sobald du es startest.
Ein paar wenige Mods brauchen andere Mods um zu funktionieren, darauf wird man auf der Seite des Downloads aber meist hingewiesen. Auch gibt es einige wenige Mod-Projekte, welche die Mod in mehreren Versionen in den Download packen, von denen ihr dann eine auswählen müsst. Am Ende muss immer folgende Struktur vorhanden sein: Anno 1800\mods\MODPROJEKT\data\...
Beim ersten Start nach Änderungen am Mod-Ordner dauert der Start von Anno entsprechend länger, da die Mods neu eingelesen werden müssen.
Auch, weise ich ausdrücklich daraufhin, das mit modding die Systemanforderungen steigen können, der PC also ein wenig mehr Power brauchen könnte. Wer auf Komfort steht, sollte sich nach einem Mod Manager umschauen, die können bei der Collection und beim De-/Aktivieren von Mods hilfreich sein.
Abschließend noch einmal zur Verdeutlichung, wie der Mod-Ordner ausschauen muss:
Die Auswahl ist sehr vielfältig. Bereits ein Jahr nach Erscheinen des Spieles waren es schon über 100 einzelne Mods.
Es gibt Cheat-Mods (manchmal auch Trainer genannt), Sandbox-Modi, Deko und Ornamente ohne Ende. Sogar neue Bedürfnisse, Gebäude etc. gibt es, und gearbeitet wird an noch mehr. Der wohl größte Batzen entfällt dabei auf die Mod-Sammlung "Spice it up", welche alleine etwa 70 einzelne kleinere Mods beinhaltet, sowie die Mod "New Horizons", welche für Anfang 2021 geplant ist.
Am besten nimmt man sich mal Zeit um sich einen Überblick zu verschaffen, oder man sucht ganz dediziert nach Funktionen die einem wichtig sind. Die meisten Mods werden auf Nexusmods und/oder Reddit veröffentlicht. Aber auch die alteingesessenen Communitys, wie die Annozone, das Maug-Projekt und sicher noch ein paar andere, bieten Auswahl.
Jo!
Aber: Alle teilnehmenden Spieler (bei Koop im Zweifel alle 16 Mitspieler) müssen exakt dieselben Mods in den selben Versionen verwenden.
Falls ihr mal Probleme habt, schickt im Zweifel einfach ein Spieler allen anderen Mitspielern seinen Mod-Ordner, dann sollte es wirklich exakt gleich sein ;)
Zudem können fehlerhafte Mods Probleme im MP verursachen, auch wenn derzeit keine bekannt ist, welche im MP Probleme macht.
Um es auszuschließen kann man die aktivierten Mods eine nach der anderen deaktivieren, bis das Spiel wieder fehlerfrei startet. Danach die ersteren nach und nach wieder zuschalten und den troublemaker weglassen. Aber das nur, falls sonst wirklich kein Fehler gefunden werden kann, und dann bitte auch mit Meldung an den Ersteller, damit dieser den Fehler beseitigen kann.
Wenn ihr nur kurzzeitig ohne Mods spielen wollt, dann reicht es aus, den Ordner mods umzubenennen. Der Mod Loader wird in dem Fall beim starten einfach keine Mods finden, und das Spiel startet entsprechend dann ohne Mods.
Wer sein Spiel dauerhaft vom Modding befreien will, muss die beiden python35 vom Mod Loader löschen, und durch ein Backup des Originals ersetzen. Man kann dies aber auch von Uplay erledigen lassen. Die Funktion findet man unter Spiele => Anno 1800 => Eigenschaften und sie nennt sich Dateien überprüfen. Den Ordner "mods" wird man jedoch selbst löschen müssen.
Probleme mit Mods treten meistens gleich zu Beginn auf, wenn sie falsch installiert wurden (siehe oben), oder aber wenn Anno selbst ein Update bekommen hat. Sollten doch mal Probleme auftreten, muss man sich auch mal selbst auf die Suche machen, oder wendet sichen direkt an den Ersteller der Mod. Kontakt findet ihr meist dort, wo ihr die Mod heruntergeladen habt. Zuweilen haben sie sich auch in einer readme.txt o.ä. in den Mod-Dateien verewigt.
Wenn ihr Probleme habt, und gar nicht wisst, woher sie kommen, hier ein bisschen generelles troubleshooting:
Versuche andere Spielstände. Auch ein Savegame kann mal kaputt gehen.
Wenn die Mod-Collection neu ist, schaue ob sich Mods beissen. Manche Mods brauchen auch andere Mods als Basisgrundlage (Steht meist auf der Seite mit dem Download).
Deaktiviere alle Mods (Einfach den Ordner "mods" umbenennen) und schaue ob das Problem weiter besteht
Falls nein, versuche einzugrenzen welche Mod es auslöst indem du nach und nach alle mal deaktivierst
Falls ja, installiere einfach mal den Mod Loader neu, vlt. gab es ein Update, und/oder teste, ob es auch besteht wenn du ein neues Game erstellst um zu schauen, ob es von Anno selbst kommt. (Bedenke: Gemoddete Savegames = kein Support)
Sollte der Mod Loader gar nicht erst laufen wollen, kann es helfen, Visual C++ neu zu installieren (auf die benötigte Version achten), aber das ist eher unwahrscheinlich, nur ein letzter Notnagel, und auch Anno hat dann meist ein Problem. Den Download findet ihr hier.
Eher wahrscheinlich sind dann als Ursache Steam (dort muss man offline gehen) oder Epic. Bei letzterem muss man den Epic-Client deinstallieren, und Anno dann "normal" über Uplay installieren/starten (Keine Gewähr).
Bei generellem Wissensdrang, dem Bedürfnis sich auszutauschen, etc. haben einige Modder auch einen Discord-Server, welchem ihr beitreten könnt: https://discord.gg/4XQTznE
Die meisten Probleme mit Anno 1800 selbst treten nach Game Updates auf. Häufig hilft es, wenn man Uplay die Spieldateien überprüfen lässt, zuweilen auch 2-3 Mal. Modder: Macht ein Backup vom Mod Loader ;)
Die Funktion findet man in Uplay unter Spiele => Anno 1800 => Eigenschaften =>Dateien überprüfen.
Bei neuen Spielversionen muss manchmal aber leider auch der Mod Loader ein Update bekommen. Infos in diese Richtung findet ihr auf der github page, oder aber im Channel #modloadersupport am modder discord.
Bei Abstürzen oder Fehlfunktionen der UI hilft es auch gerne mal, zwischen DirectX 11 und DirectX 12 zu wechseln. Manche haben dafür eine Option in den Spieleeinstellungen in Anno 1800, die anderen müssen dafür etwas in die Dateien eintauchen:
Im Ordner C:\Users\XXX\Documents\Anno 1800\config befindet sich die Datei engine.ini. Diese Datei mit einem Text-Editor (nicht Word!) öffnen (meist reicht Rechtsklick => Bearbeiten) und ziemlich oben bei "DeviceType": den Wert ändern zu "DX11" oder aber "DX12".
Die häufigste und beste Antwort ist wohl: Schaue dir die Dokumentation vom Mod-Loader an und lerne von anderen Mods wie die Befehle des Mod Loaders genutzt werden können.
Es gibt kein großes Tutorial, walkthrough, helloworld oder sonst was. Hat einfach noch keiner gemacht. Es haben aber auch nur eine handvoll Modder genügend Wissen, um umfassende Tutorials schreiben zu können.
Deshalb: Schau dir bei anderen Mods an, wie die Dateistruktur aufgebaut ist; welche files wofür benötigt werden. Bei Textdateien => reinschauen. Analysiere, was der Ersteller dieser Mod auf welche Weise macht, und welches Resultat dabei herauskommt.
Und wenn es dich packt, dann ändere einfach bei einer bestehenden Mod mal irgendwelche Werte und schaue, ob ingame das rauskommt, was du erwartest, oder bastel dir deine eigene kleine Mod indem du einzelne Sachen anderer Mods nachbaust. Aber: Wenn du von anderen abguckst und das Resultat dann teilst, sei fair und schreibe dazu, wer dich inspiriert und das Original davon geschrieben hat.
Als erstes: Du brauchst ein Begehr. Wenn du nicht weißt, was du anders haben willst, kannst du es auch nicht ändern ;)
Aus diesem Grund habe ich mich bisher vorwiegend passiv mit Modding befasst und das aufgeschnappte Wissen kaum verwendet. Vanilla langt mir momentan noch.
Ein Grundverständnis im Programmieren hilft ungemein (egal welche Richtung), ist aber nicht zwingend notwendig.
Die nötige Ausrüstung hängt stark davon ab, was du machen willst. Willst du an zB Grafiken ran, so brauchst du natürlich dafür Programme. Ich halte mich an dieser Stelle etwas kürzer und beschränke mich auf grundsätzliches.
Es empfiehlt sich meines Erachtens nach zuerst einmal dafür zu sorgen, das man selbst in die Spieldateien reingucken kann. Die Spieldateien von Anno stecken in mehreren Archiven und sind unter Anno 1800/maindata/ zu finden (Beispiel: data0.rda). Der RDAExplorer öffnet euch die Archive und entpackt sie dann dorthin, wo ihr die Dateien benötigt. Selbst hier schadet es nicht ein Backup zu machen.
Runterladen => Starten => File => Open (Read Only) => Archiv auswählen => Öffnen => Tools => Extract all => Speicherort auswählen.
Je nach größe des Archives (wenige MB bis hin zu 12GB) kann das Entpacken ein paar Minuten dauern.
Achtung: Anno startet bei data0.rda und geht numerisch hoch. Bei Updates werden veraltete Dateien durch neue Versionen aus einer späteren rda ersetzt.
Es empfiehlt sich daher, von data0.rda an alle ein Mal der Reihe nach zu entpacken. So hat man von allem die aktuellste Version und bei künftigen Updates und DLCs muss man dann nur noch schauen, welche .rda neu/geändert sind und nur diese dann entpacken
Die meisten Mods arbeiten, indem quasi in den Einstellungen von Anno Werte ersetzt, gelöscht oder neue hinzugefügt werden.
Die meisten dieser Einstellungen findet man in der Datei assets.xml, welche in den entpackten Spieldateien unter data\config\export\main\asset zu finden ist. Seid vorsichtig mit dieser Datei. Bedenkt vor dem Öffnen, das die Datei über 100MB reiner Text sind, in über 2 Millionen Zeilen. So große Dateien kann nicht jedes Programm verarbeiten. Standard-Programme wie Notepad (Editor) oder Notepad++ stürzen spätestens beim bearbeiten dieser Dateien ab, und können u.U. sogar in einem bootloop enden, wenn die zuletzt geöffneten Dateien, wiedergeöffnet werden sollen. Und auch Monster wie Dreamweaver haben sich damit schon bei mir abgeschossen.
Ich empfehle Microsoft Visual Studio Code mit XML Tools als Extension.
Und wenn man auf xml in Baumstruktur steht, ist XML Tree Editor in der Lage mit der Assets umzugehen, ohne dabei abzustürzen.
Die meisten Grafiken für UI etc. sind als .dds-Datei in den Spieldateien zu finden. Damit kann kaum jemand etwas anfangen, doch das Umwandeln ist recht einfach.
Der von mir beschriebene Weg ist nur für den Anfang gedacht, wo man die Bilder umgewandelt haben will, um sie zuordnen zu können. Wer es professioneller mag, oder wer mit den Grafiken arbeiten will, der kann das Umwandeln auch via xn Convert oder Gimp automatisieren. Will man die Bilder weiterverwenden müssen beim Umwandeln zudem noch ein paar Dinge beachten werden. Da aber ist mein Wissen eher lückenhaft, um es mal nett zu formulieren. Weiterführende Infos könnt ihr zB beim Maug-Projekt finden.
Deshalb gibt es bei mir jetzt nur die Kellerkind-Variante zum Umwandeln der Icons in .png, rein für die Puristen und blutigen Anfänger.
Lade dir "texconv" von mircosoft herunter und speicher die Datei in den vorhin entpackten Spieldateien im Ordner "data" ab. Als nächstes öffne den Texteditor deines Vertrauens (Erneut: Nicht Word!) und schreibe folgendes hinein:
FOR /R %%i IN (*.dds) DO (
texconv -ft png -o "%%i\.." "%%i"
)
Die Datei speichert ihr dann ebenfalls im Ordner "data" unter dem Namen umwandler.bat (wobei alles vor dem ".bat" auch frei gewählt werden kann).
Wenn ihr diese Datei jetzt ausführt, öffnet sich das Windows Command Fenster und in rasender Geschwindigkeit rauschen dann die Zeilen nur so durch.
Eine .bat, eine sogenannte Batch, ist ein kleines eigenes Programm kann man fast schon sagen (da von euch selbst erstellt: Euer eigenes kleines Programm ^^).
Die Batch geht jetzt daher, und schaut in dem Ordner, in dem sie gespeichet ist (sowie in darin befindlichen Unterordnern) nach Dateien mit der Endung .dds. Hat es eine solche Datei gefunden, nimmt die Batch mit der anderen Hand die texconv.exe und stopft die dds-Datei darein, damit am Ende ein für jeden erkennbares png herauskommt. Die Bedeutung der Parameter könnt ihr bei Bedarf googlen.
Mehr braucht es dann eigentlich auch nicht um für die ersten Geh- und Verständnisversuche eine solide Grundausrüstung zu haben, bevor ihr euch weiterer Schritte annehmt.
Eine GUID (Globally Unique Identifier) ist eine eindeutige, nur einmal vorkommende Erkennungsmarke. Bei Anno ist es eine Zahlenfolge von bis zu 11 Zahlen länge, die meisten dürften 7 Zeichen lang sein. Mithilfe dieser GUIDs kann einfach alles in den Spieldateien eindeutig benannt und vom Spiel selbst entsprechend klar zugeordnet werden. Kann ja nicht jeder Thomas heißen ;)
Für Modder sind diese GUIDs aus dem selben Grund wichtig: Anhand dieser GUIDs weiß auch der ModLoader wo er welche Änderungen vornehmen soll. Und anhand dieser GUIDs findet der Modder auch jedweden Zusammenhang in den Spieldateien, indem er sich einfach von GUID zu GUID hangelt.
<Text>
<GUID>192450</GUID>
<Text>Feras Alsarami, Meister der Hypnose</Text>
</Text>
Mit dieser GUID tauchen wir jetzt in die assets.xml.
Vorsicht:
Die assets.xml ist das Kernstück der Spieleinstellungen und auch wenn wir nach dem entpacken der dataX.rda nur eine Kopie davon haben: Seid vorsichtig. In der assets.xml mag zwar nur reiner simpler Text drin stehen, aber dafür sind es weit über 2 Millionen Zeilen Text.
Da kann nicht jedes Programm mit umgehen. Ich empfehle Visual Studio Code von Microsoft mit der Extension XML Tools, aber da gibt es verschiedene.
Wenn wir die GUID des Items (192450) suchen, finden wir einerseits die Itemdeklaration selbst, sowie sämtliche Verknüpfungen, zumeist AssetPools. Und nun kommt das Fiese: Um herauszufinden, auf welchen Wegen man Feras bekomen kann, müssen wir nun bei jedem erwähnen des Items checken, ob es ein Weg ist oder sein könnte, auf dem man das Item bekommen kann.
Das geschieht dann wiederum auf dem selben Weg wie beim Item: Wir nehmen die GUID des Pools, und schauen, wo dieser Pool in der assets.xml verlinkt ist. Wenn man Pech hat, muss man sich erst durch mehrere Asset-Pools hangeln, um dann am Ende zu sehen, das man das Item bei Eli kaufen kann. Wenn man Glück hat, ist der Weg auch mal schneller, wie beim Feras zum Beispiel mit dieser Möglichkeit an das Item zu kommen:
<Asset>
<Template>RewardPool</Template>
<Values>
<Standard>
<GUID>193870</GUID>
<Name>Palace Replacement Specialists Pool</Name>
<IconFilename>data/ui/2kimages/main/3dicons/specialists/systemic/icon_well_dressed_106.png</IconFilename>
</Standard>
<RewardPool>
<ItemsPool>
<Item>
<ItemLink>192440</ItemLink>
</Item>
<Item>
<ItemLink>192450</ItemLink> <= Die GUID kennen wir doch ^^
</Item>
<Item>
<ItemLink>190719</ItemLink>
</Item>
<Item>
<ItemLink>190668</ItemLink>
</Item>
<Item>
<ItemLink>190684</ItemLink>
</Item>
<Item>
<ItemLink>191377</ItemLink>
</Item>Code ausklappen
Hier kann man wunderschön sehen, das die Suche manchmal recht schnell beendet sein kann. Feras ist direkt in diesem Pool verlinkt und der Pool ist ziemlich eindeutig benannt. Wobei die Namen hier in der assets.xml keinen großen Wert haben, und wohl nur für Übersicht sorgen sollen.
Will man beim Modden so richtig durchstarten, wird man irgendwann an den Punkt kommen, an dem man eigene GUIDs vergeben muss. Sei es für Gebäude die man neu ins Spiel bringt, oder ein existierendes klont. Für neue Zivstufen oder neue Texte. Man braucht ja für alles eine GUID. Was aber, wenn du eine GUID vergibst, die es dann doch schon gibt?
Selbstredend ist das nicht gut ;)
Die tatsächlichen Auswirkungen können von gar nix bis zum CTD (Crash to Desktop) reichen. Das war bis Mitte 2020 manchmal ein Problem für die Modder. Untereinander haben sich viele noch abgesprochen, aber hier und dort hat es dann doch mal gekracht. Ende Juni dann hat Ubisoft verkündet:
Für unsere Modder - ein sicherer GUID-Bereich
Wie ihr wisst sind wir stets beeindruckt von der Arbeit und Leidenschaft die einige Community-Mitglieder in die Erstellung von Mods für Anno 1800 stecken. Um es euch ein bisschen einfacher zu machen, wenn es um die Anpassung eurer Mods an neue Game Updates geht, haben wir für euch nun den GUID Bereich von 1337471142 bis 2147483647 reserviert. Dieser Bereich wird von uns beziehungsweise unseren Tools nicht verwendet.
Auch wenn ich die Kirche mal im Dorf lassen will, da es wirklich eher selten Probleme gab, dennoch: Im Namen aller Modder dafür noch mal lieben Dank nach Mainz.
Angestoßen von Lady Meridonia und weiterentwickelt von Taubenangriff ist auf Github eine Liste entstanden, in der sich jeder Modder seinen GUID Bereich sichern kann. Die Liste wird nie vollständig sein, trägt aber sehr dazu bei, das sich die Modder nicht gegenseitig in die Quere kommen.
Die Liste kannst du hier finden: GitHub.
Die Liste ist selbstverwaltend, jeder kann sich selbst eintragen. Wie das geht, steht unter der Tabelle ;)
Wie eben im Bereich zu den GUIDs schon angekündigt habt ihr hier jetzt die Möglichkeit, Text aus dem Spiel in eurer Sprache zu suchen, um daran die GUID ablesen zu können.
Anders herum könnt ihr natürlich aber auch die GUID eingeben und schauen, was in anderen Sprachen ausgegeben wird.
Hier kannst du dir die Standard Values jedes Assets anzeigen lassen. Bedenke, das auch Werte aus den templates vererbt werden.
Du kannst nach GUIDs suchen, oder nach Zeichen, die im Namen des Assets oder im Namen des templates (sofern keines im zweiten Feld gewählt) vorkommen. Die Suchphrase muss min. 3 Zeichen lang sein.
Thx an Jakob für das aufarbeiten der assets.xml.
Stell Dir dein Spiel am besten so vor (sehr vereinfacht):
Assets + Grafiken → Binary (Anno1800.exe) → Anzeige auf dem Bildschirm
An der Binary können wir nichts verändern. Was wir allerdings tun können, ist der Binary veränderte oder neue Assets und Grafiken zu füttern, die das Spiel interpretieren kann.
Das bedeutet, wir müssen uns an dessen Regeln halten – Nur wenn man Code schreibt, den Anno versteht, wird es auch tun, was man will.
Zuerst, nein, man muss nicht unbedingt programmieren können, obwohl das immer ein Pluspunkt ist.
Wenn Du nicht programmieren kannst, solltest du dich aber auf jeden Fall mit den Konzepten Datentyp, Variable, Arrays, Vererbung und (generischen) Dictionaries und Vectors vertraut machen.
Code musst du damit nicht schreiben, aber diese Konzepte zu verstehen ist eine große Hilfe beim Modding.
Die meisten Dateien in Anno benutzen die XML-Scriptsprache. Dessen Syntax werde ich nicht erklären, und ein Basisverständnis wird vorausgesetzt.
Wenn Du noch nie XML gesehen hast, solltest Du dich zuerst dort etwas einarbeiten. Du solltest ebenfalls ein bisschen Xpath können, da dies für den Modloader gebraucht wird.
Zuerst, entschuldigt bitte den trockenen Start, es wird leider ein wenig theoretisch, aber für die interessanten Teile wird es später sehr wertvoll sein, besonders,
wenn Du neue Funktionen in das Spiel einbauen möchtest.
Für die Assets-Bibliothek verwendet Anno ein paar Konzepte:
Im folgenden werden Values als Variablen bezeichnet, um Verwirrung zwischen Variablenname und dem Wert zu vermeiden.
Die Properties.xml ist wahrscheinlich am schwersten zu verstehen, aber sobald man diese versteht, wird man wenige Probleme haben, sich in jeder Template und jedem Asset zurechtzufinden.
Die Datei besteht aus zwei Teilen: DefaultContainerValues und DefaultValues. Für bessere Übersicht in den Entwicklertools sind sie gruppiert, aber generell könnte man es auf die beiden runterbrechen.
DefaultContainerValues gibt an, welche Container eine Property besitzt und definiert Standardwerte für Variablen in diesen Containern. Im Fall, dass der Container einen Vector oder ein Dictionary enthält,
ist der Datentyp des Inhalts angegeben.
DefaultValues definiert Standardwerte für Variablen, die direkt in der Property selbst enthalten sind, und erbt die Container aus DefaultContainerValues.
Die Standardwerte der Variablen können geändert werden, aber wir können dem Spiel nicht sagen, dass es andere Container oder Variablen laden soll. Die Properties ist ein direkter Export, was das Spiel von uns erwartet.Wenn Du Informationen brauchst, was man in einer Property so alles eintragen kann, solltest Du hier als erstes gucken. Das folgende Beispiel zeigt die Property „IrrigationConfig“
In seltenen Fällen ist dieser Export nicht komplett, in diesem Fall ist die Information aber auf jeden Fall in der assets.xml zu finden.
<Properties>
<DefaultContainerValues>
<Building>
<IrrigationConfig>
<IrrigationSpreading>
<!-- Variable in Container in Property: Standardwert für Variable am selben Ort definiert -->
<IrrigationSpreadRule>MaxAbsDist</IrrigationSpreadRule>
</IrrigationSpreading>
<!-- IrrigationIslandSeeds ist ein Container, der einen Vector enthält -->
<IrrigationIslandSeeds>
<!-- Island ist der ContentType dieses Vectors-->
<Island>0</Island>
</IrrigationIslandSeeds>
</IrrigationConfig>
</Building>
</DefaultContainerValues>
<DefaultValues>
<IrrigationConfig>
<!-- Container werden vererbt -->
<IrrigationSpreading />
<IrrigationIslandSeeds />
<!-- Variable direkt in der Property: Standardwert für Variable wird in DefaultValues definiert-->
<StaticIrrigationRandomizerFrequency>2</StaticIrrigationRandomizerFrequency>
</IrrigationConfig>
</DefaultValues>
</Properties>Code ausklappen
Im Fall, dass Container A einen anderen Container B enthält, wird B in „ContainerValues“ definiert und dann an A vererbt. Wenn B Variablen enthält, werden diese an derselben Stelle definiert.
Das folgende Beispiel zeigt einen anderen Teil der „IrrigationConfig“ Property
<Properties>
<DefaultContainerValues>
<IrrigationConfig>
<VisualsAndEffects>
<!-- Vegetation-Container wird definiert-->
<ContainerValues>
<Vegetation>
<!-- Variablen in Container in Container in Property: Standartwerte für Variablen werden am selben Ort definiert -->
<FadingSpeed>0.05</FadingSpeed>
<BlurRadius>1</BlurRadius>
</Vegetation>
</ContainerValues>
<!-- Der Vegetation Container wird an VisualsAndEffects vererbt. -->
<!-- Wichtig: In unserem Fall ist Vegetation nur ein einfacher Container -->
<!-- es könnte aber auch der ContentType eines Vectors oder Dictionaries sein. -->
<Vegetation />
</VisualsAndEffects>
</IrrigationConfig>
</DefaultContainerValues>
<DefaultValues>
<IrrigationConfig />
</DefaultValues>
</Properties>Code ausklappen
Die volle Definition der Property „IrrigationConfig“ sieht dann ungefähr so aus:
<Properties>
<DefaultContainerValues>
<Building>
<IrrigationConfig>
<IrrigationSpreading>
<IrrigationSpreadRule>MaxAbsDist</IrrigationSpreadRule>
</IrrigationSpreading>
<IrrigationIslandSeeds>
<Island>0</Island>
</IrrigationIslandSeeds>
<VisualsAndEffects>
<ContainerValues>
<Vegetation>
<FadingSpeed>0.05</FadingSpeed>
<BlurRadius>1</BlurRadius>
</Vegetation>
</ContainerValues>
<Vegetation />
</VisualsAndEffects>
</IrrigationConfig>
</Building>
</DefaultContainerValues>
<DefaultValues>
<IrrigationConfig>
<IrrigationSpreading />
<IrrigationIslandSeeds />
<VisualsAndEffects />
<StaticIrrigationRandomizerFrequency>2</StaticIrrigationRandomizerFrequency>
</IrrigationConfig>
</DefaultValues>
</Properties>Code ausklappen
Die folgenden Datentypen werden für Variablen benutzt:
Der Datentyp jeder Variable kann leider nur mit Datamining und Probieren herausgefunden werden. Es gibt leider keine Liste davon. Vorherige Spiele wie 2205 hatten dafür eine datasets.xml, die diese Information enthielt, in 1800 fehlt sie aber, und es wäre toll, wenn das von Ubisoft veröffentlicht werden könnte.
Eine Template besteht aus einem einzigartigen Namen sowie einer Reihe an Properties die Objekte mit dieser Template haben.
Wie mit der Properties.xml auch, sind Gruppen nur für Übersicht in den Devtools zuständig.
Sehen wir uns nun die Template „UnlockableAsset“ an:
<Templates>
<Template>
<Name>UnlockableAsset</Name>
<Properties>
<Standard />
<Locked />
</Properties>
</Template>
</Templates>
Diese hat die Properties „Standard“ und „Locked“.
Templates können Standardwerte für jede Variable in einer Property geben, die dann für alle Assets, die diese Template benutzen, geladen werden, und das ist auch eigentlich schon alles.
Wie können wir die Werte aber überschreiben? An dem Punkt sollten wir uns der Vererbung zuwenden.
Dies ist meine eigens erstellte Template „CustomIrrigationConfig“.
<Templates>
<Template>
<Name>CustomIrrigationConfig</Name>
<Properties>
<Standard />
<IrrigationConfig />
</Properties>
</Template>
</Templates>
In der Property „IrrigationConfig“ von oben, wurde StaticIrrigationRandomizerFrequency mit einem Standardwert von 2 versehen.
Wir wollen das jetzt auf 5 ändern, aber den Rest so lassen, wie er in der Property ist.
Nein, wir müssen nicht die ganze Property nochmal abschreiben, wir können einfach nur diese eine Variable abändern, und den Rest weglassen.
In der templates.xml und assets.xml werden Container automatisch vererbt, Für properties gilt das hingegen nicht.
Wir können Container auch manuell vererben, aber müssen das nicht und können sie weglassen, solange wir nichts darin ändern wollen.
<Templates>
<Template>
<Name>CustomIrrigationConfig</Name>
<Properties>
<Standard />
<IrrigationConfig>
<StaticIrrigationRandomizerFrequency>5</StaticIrrigationRandomizerFrequency>
</IrrigationConfig>
</Properties>
</Template>
</Templates>
Wir wollen jetzt noch den FadingSpeed in VisualsAndEffects ändern. Dafür vererben wir zuerst VisualsAndEffects manuell, darin dann Vegetation, wieder manuell, und darin überschreiben wir den FadingSpeed.
<Templates>
<Template>
<Name>CustomIrrigationConfig</Name>
<Properties>
<Standard />
<IrrigationConfig>
<VisualsAndEffects>
<Vegetation>
<FadingSpeed>0.05</FadingSpeed>
</Vegetation>
</VisualsAndEffects>
<StaticIrrigationRandomizerFrequency>5</StaticIrrigationRandomizerFrequency>
</IrrigationConfig>
</Properties>
</Template>
</Templates>
Für Dictionaries werden die einzigartigen Namen wie Container behandelt. Für Vectors muss man manuell vererben, was so nervig ist, dass das ganze ein ausgelagertes Tutorial ergibt. Dieses findet ihr im Maug-Forum
Okay, genug Trockenfleisch für heute, wir erstellen jetzt eine Fabrik.
Ein Asset besteht aus Template und Values. Unser Asset beginnen wir mit der Template, in unserem Fall „FactoryBuilding7“. Für die Values, schreiben wir die Properties auf, die diese Template besitzt, erstmal ohne Variablen oder Container zu ändern.
<Asset>
<Template>FactoryBuilding</Template>
<Values>
<Standard />
<Building />
<Blocking />
<Cost />
<Object />
<Mesh />
<Selection />
<Text />
<Constructable />
<Locked />
<SoundEmitter />
<FeedbackController />
<Infolayer />
<UpgradeList />
<Factory7 />
<FactoryBase />
<LogisticNode />
<AmbientMoodProvider />
<Maintenance />
<Attackable />
<Pausable />
<IncidentInfectable />
<Industrializable />
<Culture />
<QuestObject />
<Electrifiable />
</Values>
</Asset>Code ausklappen
Dann machen wir die Values.
Ich habe für die Fabrik die GUID 1337733142 ausgesucht. Die wird in der „Standard“-Property als Variable angegeben.
Außerden können wir einen Namen (Name) vergeben, der aber nur für unsere Übersicht ist, das Spiel macht damit nichts.
Weitere Informationen zu GUIDs findet ihr hier.
Theoretisch haben wir damit ein valides Asset auf Basis der Template FactoryBuilding7.
Praktisch produziert es nichts aus nichts, kostet keine Arbeitskraft oder Credits, und Baumaterial braucht es auch nicht.
Also rein damit.
Wir machen eine Fabrik, die Dosenfutter aus Zink und Kartoffeln herstellt, und nur weil wir können, lassen wir in der Neuen Welt Obreros dafür arbeiten.
<Asset>
<Template>FactoryBuilding</Template>
<Values>
<Standard>
<GUID>1337733142</GUID>
<Name>Canned Food Factory 02 - Variant uses Potatoes and Zinc</Name>
</Standard>
<Building>
<!-- Gebäude für Colony01 (Südamerika) -->
<AssociatedRegions>Colony01</AssociatedRegions>
<!-- Zufällige Rotation beim bauen -->
<BuildModeRandomRotation>90</BuildModeRandomRotation>
</Building>
<Blocking>
<!-- Radius in Feldern, in dem Gras versteckt wird, wenn das Gebäude gebaut wird-->
<HidePropsRadius>0</HidePropsRadius>
<DeletePropsRadius>0</DeletePropsRadius>
</Blocking>
<Cost>
<Costs>
<Item>
<!-- Referenziert Geld -->
<Ingredient>1010017</Ingredient>
<Amount>10000</Amount>
</Item>
<Item>
<!-- Referenziert Holz -->
<Ingredient>1010196</Ingredient>
<Amount>50</Amount>
</Item>
<Item>
<!-- Referenziert Ziegel -->
<Ingredient>1010205</Ingredient>
<Amount>30</Amount>
</Item>
<Item>
<Ingredient>1010218</Ingredient>
</Item>
<Item>
<Ingredient>1010207</Ingredient>
</Item>
<Item>
<Ingredient>1010202</Ingredient>
</Item>
</Costs>
</Cost>
<Object />
<Mesh />
<Selection>
<!-- Hardcode, der den Participant (Charakter) im Gebäudemenü angibt. -->
<!-- in unserem Fall ist es die Obrera -->
<ParticipantMessageArcheType>SA_Resident_tier02_atWork</ParticipantMessageArcheType>
</Selection>
<Text />
<Constructable />
<Locked />
<SoundEmitter />
<FeedbackController />
<Infolayer />
<UpgradeList />
<Factory7 />
<FactoryBase>
<FactoryInputs>
<Item>
<!-- Product referenziert die GUID von Kartoffeln -->
<Product>1010195</Product>
<Amount>1</Amount>
<!-- Internes Kartoffel-Lager -->
<StorageAmount>6</StorageAmount>
</Item>
<Item>
<!-- Product referenziert die GUID von Zink-->
<Product>1010229</Product>
<Amount>1</Amount>
<!-- Internes Zink-Lager -->
<StorageAmount>3</StorageAmount>
</Item>
</FactoryInputs>
<FactoryOutputs>
<Item>
<!-- Product referenziert GUID von Dosenfutter-->
<Product>1010217</Product>
<Amount>1</Amount>
<!-- Internes Dosenfutter-Lager -->
<StorageAmount>4</StorageAmount>
</Item>
</FactoryOutputs>
<!-- Zeit in sekunden, in der 1t produziert wird -->
<CycleTime>45</CycleTime>
</FactoryBase>
<LogisticNode />
<AmbientMoodProvider />
<Maintenance>
<!-- Unterhaltskosten -->
<Maintenances>
<Item>
<!-- Geld -->
<Product>1010017</Product>
<Amount>40</Amount>
<InactiveAmount>20</InactiveAmount>
</Item>
<Item>
<!-- Obrero Arbeitskraft -->
<Product>1010367</Product>
<Amount>25</Amount>
</Item>
</Maintenances>
</Maintenance>
<Attackable />
<Pausable />
<IncidentInfectable />
<Industrializable>
<!-- Boost durch Strom unmöglich machen, da es in der neuen Welt keine Kraftwerke gibt. -->
<BoostedByIndustrialization>0</BoostedByIndustrialization>
</Industrializable>
<Culture />
<QuestObject />
<Electrifiable />
</Values>
</Asset>Code ausklappen
Nur eines fehlt noch – das visuelle. Anno trennt mehr oder weniger Grafik von Logik. Alles mit Grafiken wird separat gebastelt, wir geben nur den Dateipfad vom Ordner „data“ zur .cfg an (Der Hauptdatei einer Grafik, die alles zusammensetzt), bzw. zum Icon.
<Asset>
<Template>FactoryBuilding7</Template>
<Values>
<Standard>
<GUID>1337733142</GUID>
<Name>Canned Food Factory 02 - Variant uses Potatoes and Zinc</Name>
<IconFilename>data/ui/2kimages/main/3dicons/icon_canned_goulash.png</IconFilename>
</Standard>
<Building>
<AssociatedRegions>Colony01</AssociatedRegions>
<BuildModeRandomRotation>90</BuildModeRandomRotation>
</Building>
<Blocking>
<HidePropsRadius>0</HidePropsRadius>
<DeletePropsRadius>0</DeletePropsRadius>
</Blocking>
<Cost>
<Costs>
<Item>
<Ingredient>1010017</Ingredient>
<Amount>10000</Amount>
</Item>
<Item>
<Ingredient>1010196</Ingredient>
<Amount>50</Amount>
</Item>
<Item>
<Ingredient>1010205</Ingredient>
<Amount>30</Amount>
</Item>
<Item>
<Ingredient>1010218</Ingredient>
</Item>
<Item>
<Ingredient>1010207</Ingredient>
</Item>
<Item>
<Ingredient>1010202</Ingredient>
</Item>
</Costs>
</Cost>
<Object>
<Variations>
<!-- Mehrere .cfg bedeuten, dass man mit Shift+V durchschalten kann -->
<Item>
<Filename>data/graphics/buildings/production/workshop_colony01_01/workshop_colony01_01.cfg</Filename>
</Item>
</Variations>
</Object>
<Mesh />
<Selection>
<ParticipantMessageArcheType>SA_Resident_tier02_atWork</ParticipantMessageArcheType>
</Selection>
<Text />
<Constructable />
<Locked />
<SoundEmitter />
<FeedbackController />
<Infolayer />
<UpgradeList />
<Factory7 />
<FactoryBase>
<FactoryInputs>
<Item>
<Product>1010195</Product>
<Amount>1</Amount>
<StorageAmount>6</StorageAmount>
</Item>
<Item>
<Product>1010229</Product>
<Amount>1</Amount>
<StorageAmount>3</StorageAmount>
</Item>
</FactoryInputs>
<FactoryOutputs>
<Item>
<Product>1010217</Product>
<Amount>1</Amount>
<StorageAmount>4</StorageAmount>
</Item>
</FactoryOutputs>
<CycleTime>45</CycleTime>
</FactoryBase>
<LogisticNode />
<AmbientMoodProvider />
<Maintenance>
<Maintenances>
<Item>
<Product>1010017</Product>
<Amount>40</Amount>
<InactiveAmount>20</InactiveAmount>
</Item>
<Item>
<Product>1010367</Product>
<Amount>25</Amount>
</Item>
</Maintenances>
</Maintenance>
<Attackable />
<Pausable />
<IncidentInfectable />
<Industrializable>
<BoostedByIndustrialization>0</BoostedByIndustrialization>
</Industrializable>
<Culture />
<QuestObject />
<Electrifiable />
</Values>
</Asset>Code ausklappen
Schau dir die letzten beiden Beispiele nochmal genau an. Besonders achten solltest du auf Building, Maintenance, Object und FactoryBase, diese Container wirst du oft brauchen.
Jetzt haben wir auch ein voll funktionstüchtiges Asset, das Anno korrekt interpretieren und darstellen kann.
Beim nächsten Mal basteln wir unser Asset in das Baumenü, setzen dafür einen Text und schalten es frei.
<Asset>
<Template>Trigger</Template>
<Values>
<Standard />
<Trigger>
<TriggerCondition>
//hier wird eine condition erwartet
</TriggerCondition>
<TriggerActions>
<Item>
//hier wird eine Action erwartet
</Item>
</TriggerAction>
</Trigger>
<TriggerSetup />
</Values>
</Asset>
Ein sehr simples, aber mächtiges Konzept, was seit Anno 2205 existiert, sind die Trigger.
Von Fishboss im Sommer 2019 entdeckt, basiert das Unlocksystem auf Triggern, basiert auf Triggern, die ausgelöst werden, sobald ihre Bedingung erfüllt ist. Werden sie einmal ausgelöst, dann schalten sie alles frei was sie freischalten sollen und bleiben dann ausgelöst.
Ein Trigger implementiert also folgendes Konzept: Wenn Vorraussetzung (Condition) erfüllt - ein oder mehrere Aktionen (Action) ausführen.
Dabei gibt es in der templates.xml eine Reihe vordefinierter Conditions und Actions. Auf diese ist man zwar beschränkt (gibt auch noch Codemüll aus Anno 2205) - aber sie können extrem viel und sind vielseitig einsetzbar. Diese Conditions und Actions können beliebig miteinander kombiniert werden. So kann man bspw die Freischaltung der schweren KI in der KI-Schiffswerft an den Bau eines Gebäudes (z.B. einer Botschaft) anstatt einer erreichten Bevölkerungszahl knüpfen. Die Actions eines Triggers werden in ihrer Reihenfolge ausgelöst.
Folgendes Problem: Ich habe einen Trigger zum freischalten der Bank bei einem Ingeneur geschrieben und ihn ausgelöst, Bank freigeschaltet und Bewohner happy. Im Nachhinein fällt mir dann aber auf, dass ich doch auch das Clubhaus gerne ab einem Ingeneur haben will, also füge ich es in meinen Trigger ein. Lade ich meinen Spielstand erneut, fällt mir aber auf, dass es gar nicht freigeschaltet ist, obwohl ich doch einen Ingeneur habe?
Warum ist das so?
Anno verwaltet die Trigger in einer internen Eventliste, in der ein Trigger erst registriert werden muss. Beim Registrieren des Triggers wird das Asset geparst und auf dessen Basis für Anno ein Event erstellt. In unserem Fall: 1 Ingeneur erreicht -> Bank freischalten. Dieses Event erhält die GUID des Triggers als ID. Befindet sich Event 42 bereits in der Eventliste, werden keine Änderungen an diesem Event mehr vorgenommen, egal, ob wir den Trigger ändern. Wird Event 42 in der Eventliste ausgelöst, merkt sich das Spiel das. Egal, was wir jetzt am Asset mit GUID = 42 ändern, das Spiel wird es nicht von selbst neu registrieren.
Im Normalfall werden Assets mit der Template Trigger beim ersten Mal automatisch registriert, außer, wir stellen das ab. (siehe unten)Danach müssen wir manuell neu registrieren. Zum Testen ist es meistens ganz hilfreich, einfach die GUID des Assets zu ändern, weil Anno den Trigger dann als neues Event sieht und entsprechend neu einliest. Zur manuellen Registrierung kommen jetzt ein paar Handgriffe:
Einen Trigger nicht automatisch registrieren: unter TriggerSetup kann man das Automatische Registrieren des Triggers abschalten
<TriggerSetup>
<AutoRegisterTrigger>0</AutoRegisterTrigger>
</TriggerSetup>
Einen Trigger durch einen anderen Trigger registrieren lassen: Über die ActionRegisterTrigger - Das geht auch, wenn der Trigger bereits ausgelöst wurde! Nach der Neuregistrierung kann der dann wieder ausgelöst werden.
<Template>ActionRegisterTrigger</Template>
<Values>
<Action />
<ActionRegisterTrigger>
<TriggerAsset>1443041</TriggerAsset>
</ActionRegisterTrigger>
</Values>
Einen Trigger sich selbst zurücksetzen lassen: Über die ActionResetTrigger
<Template>ActionResetTrigger</Template>
<Values>
<Action/>
<ActionResetTrigger/>
</Values>
Einen Trigger erst bei Erfüllung einer bestimmten Bedingung registrieren lassen: Das ganze geht über einen SubTrigger im SubTriggers Container. Dieser muss unter Values/Trigger.
<SubTriggers>
<Item>
<SubTrigger>
<Template>AutoCreateTrigger</Template>
<Values>
<Trigger>
<TriggerCondition>
//Hier wird eine Condition erwartet
</TriggerCondition>
</Trigger>
</Values>
</SubTrigger>
</Item>
</SubTriggers>
<SubTriggers>
<Item>
<SubTrigger>
<Template>AutoCreateTrigger</Template>
<Values>
<Trigger>
<TriggerCondition>
//Hier wird eine Condition erwartet
</TriggerCondition>
</Trigger>
</Values>
</SubTrigger>
</Item>
</SubTriggers>
<SubTriggers>
<Item>
<SubTrigger>
<Template>AutoCreateTrigger</Template>
<Values>
<Trigger>
<TriggerCondition>
//Hier wird eine Condition erwartet
</TriggerCondition>
</Trigger>
</Values>
</SubTrigger>
</Item>
</SubTriggers>
<SubTriggers>
<Item>
<SubTrigger>
<Template>AutoCreateTrigger</Template>
<Values>
<Trigger>
<TriggerCondition>
//Hier wird eine Condition erwartet
</TriggerCondition>
</Trigger>
</Values>
</SubTrigger>
</Item>
</SubTriggers>
Code ausklappen
Einem SubTrigger können auch weitere SubTrigger hinzugefügt werden, wer Lust hat, kann sich mal die uPlay-Club Herausforderung "Silocon Valley" anschauen, da ist es aufs Extremste getrieben worden.
Zuersteinmal Danke an Judekw der sich komplett auf sich allein gestellt die Grafikengine der 3D-Annos erschlossen hat, und an kskudlik und Cyborg für die RDM-OBJ Conversion. Ohne diese Arbeit wäre das hier gar nicht möglich.
Ich gehe jetzt davon aus, dass ich mein Modell bereits erstellt, UV Unwrapped ( beides mit Blender) habe, es in Substance Painter texturieren möchte, und es dann nach Anno bringen will. Zum Modellieren, UV-Unwrappen und Texturieren gibt es auf Youtube bessere Tutorials, als ich das geben könnte. Außerdem setzt diese Anleitung ein höheres Level an Modding-Erfahrung mit Anno 1800 voraus, wie man ein Gebäude in der .cfg richtig zusammensetzt, in der .ifo Blocker schreibt oder wie man aus einer Grafik ein baubares Gebäude macht sollten bereits bekannt sein. Darauf wird hier nicht weiter eingegangen, es geht nur darum, wie man sein Gebäude aus Blender und Substance Painter in Anno reinbekommt.
Ich benutze für die Erstellung des Modells und das UV Unwrapping Blender, für die Texturierung Substance Painter und für die rdm conversion den rdm-obj converter von kskudlik: https://github.com/kskudlik/Anno-1800-Model-Converter/releases
Ein Modell in Anno ist folgendermaßen aufgebaut:
In Substance Painter lassen sich die Eigenschaften der Anno-Engine relativ einfach reproduzieren. Euer Projekt benötigt folgende Kanäle:
Anno 1800 ist ein wenig besonders in der Hinsicht, dass es PBR mit Metal/Gloss anstatt Metal/Rough umsetzt. Der Unterschied ist nicht allzu groß, es gibt in Substance Painter aber keinen Shader, der das von Haus aus unterstützt. Insofern hier eine kleine Bearbeitung des Pbr-metal-rough-with-alpha-blending Shaders, die statt Roughness eben Glossiness benutzt. Das sollte ausreichend sein, um nicht jedes Mal erst das Spiel zu starten, um zu schauen, ob die Texturen, die in Substance perfekt wirken, denn in 1800 auch gut aussehen. Der Unterschied ist hauptsächlich das Lighting, die Materials sind aber im wesentlichen identisch.
Hier ein Vergleich:
Den Shader könnt ihr rechts einstellen, ein mit der Template aufgesetztes Projekt wird diesen automatisch verwenden.
Substance ermöglicht nicht nur das Aufsetzen von Projekten mit den Eigenschaften wie Anno 1800, sondern auch das exportieren. Anno 1800 fasst dabei mehrere Informationen in eine Textur zusammen, im Alphakanal der Diffuse Textur steckt bspw. die Opacity Map. Für Anno 1800 sieht das ganze dann so aus:
So und jetzt zum exportieren hier die Template einstellen:
Mein Projekt ist ein ganz normales Gebäude, was keine Heightmap benötigt, daher ist dies im Export abgestellt.
Jetzt exportieren und mit der Template Medium und halber Auflösung sowie der Template Low in Viertel-Auflösung wiederholen.
Project-Template, Export-Templates und Shader können hier heruntergeladen werden: Google Drive
Alle drei Ordner müssen unter Documents/Allegorithmic/Substance Painter/shelf abgelegt werden und suchen sich ihren Ort dann selbst.
Die Texturen müssen für Anno in .dds, BC7_UNORM Format vorliegen. Substance Painter unterstützt jedoch kein dds, weshalb man die Texturen noch konvertieren muss. Dazu kann man sie zwar einfach alle in GIMP öffnen und nach dds exportieren, am besten mit automatisiertem Texture Tool, nach dieser Anleitung.
Schneller geht manuelles Konvertieren mit texconv.exe mit folgenden Argumenten, dann wird direkt der ganze Ordner konvertiert.
-f BC7_UNORM -ft DDS -sepalpha *.png
Damit hat man dann alles was man an Texturen benötigt.
Damit sind die Maps erstellt, bleiben die .cfg und die .ifo. Diese müssen vielleicht nicht von Grund auf neu erstellt werden, aber Partikel und Props, etc. müssen von Hand hinzugefügt werden.
Dabei besonders hilfreich ist, dass man für ORIENTATION_TRANSFORMS auch einfach Blender benutzen kann um bspw Props und Particles dort zu positionieren wo man das möchte. Beachtet dabei allerdings bitte, dass Blender ein Z-Up Koordinatensystem benutzt, während Anno Y-Up arbeitet. Daher müssen sämtliche y- und z- Positionswerte immer vertauscht werden beim copy+pasten.
Rotationen lassen sich sogar aus Blender direkt ablesen (Anno speichert diese im Quaternion-Format, dieses kann man in Blender auch zur Anzeige auswählen. Beachtet dabei aber, dass Y und Z getauscht werden müssen.), oder aber mit der Seite quaternions.online easy aus Euler errechnen lassen.
Für Partikel oder ähnliches lässt sich das genauso machen, einfach einen kleinen Cube an die gewünschte Position ziehen und dort die Position rauskopieren.