Anno 1800 und Modding

Anno 1800 und Modding

Einführung

Was ist Modding?


Little Boxes - Malvina Reynolds (1962)

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.

Nach oben

Sollte man Anno 1800 modden?

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?

Nach oben

Was ist Cheating?

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.

Nach oben

Mods verwenden

Wie kann man Mods in Anno 1800 nutzen?


Englische Anleitung als Video von Takarazuka

Dank findigen Usern wie meow ist das gar nicht schwer. Es sind nur wenige einfache Schritte nötig:

  1. Downloade den Mod Loader (in der aktuellsten Version) von github
  2. Downloade die Mods, die dich interessieren. Quellen sind u.a. Nexusmods oder Reddit.
    Du kannst auch Mods aus verschiedenen Quellen kombinieren.
  3. Entpacke den Modloader und kopiere die beiden Dateien im Installationsort von Anno 1800 in den Ordner Anno 1800\Bin\Win64\
    ➔ Bestätige Windows, das du die Dateien wirklich dahin kopieren möchtest.
  4. Erstelle im Anno 1800 Ordner einen Unterordner namens "mods" (Also quasi Anno 1800\mods\)
  5. Entpacke nun die heruntergeladenen Mods in den eben angelegten Ordner "mods".
    Achtung
    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\...
    Alle Mods in diesem Ordner, die kein "-" am Anfang des Ordnernamens haben werden nun automatisch in das Spiel eingefügt, sobald du es startest.
    Die anderen Mods, welche ein "-" am Anfang haben (Beispiel: -[Gameplay] Cargolimits) werden als deaktiviert gewertet und somit nicht geladen.
  6. Starte das Spiel, das war es nämlich schon :)

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:
Abbildung des Mod-Ordners

Nach oben

Was gibt es bereits an Mods?

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.

Nach oben

"Funzt Modding auch im Multiplayer?"

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.

Nach oben

Wie kann ich wieder zurück zu Anno ohne Mods?

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.

Nach oben

Troubleshooting

Fehler im Bereich des Moddings

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

Nach oben

Fehler von Anno 1800

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".

Nach oben

Selbst modden

Wie lerne ich Anno 1800 zu modden?

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.

Nach oben

Was braucht man, um für Anno 1800 Mods zu schreiben?

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:

Icons via batch umwandeln[ Codeblock kopieren ]
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.

Nach oben

Alles über GUIDs

Was sind GUIDs

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.

GUIDs in der assets.xml
Wer kennt es nicht, ihr sitzt im Flieger, unterhaltet euch gepflegt mit eurem Sitznachbarn über Anno, und habt gerade vergessen, wie man an das Item "Feras Alsarami, Meister der Hypnose" kommt. Schreckensszenario, keine Frage, aber wir wollen es uns ja auch nur theorethisch vorgestellen ;)
Einen AssetViewer hat man da natürlich gerade nicht zur Hand, aber der gute Modder hat ja immer seine Dateien dabei, und kann uns zeigen, wie man diese Informationen herausbekommen kann. Das ist gut, denn auf diese Weise findet man die meisten Zusammenhänge.
Doch bevor wir in die assets.xml tauchen, machen wir uns kurz die Füße in der texts_german.xml nass. Ihr findet die Date in den entpackten Spieldateien unter den Pfad data\config\gui\. Alles, was einen Namen hat, alle Texte die im Spiel gesprochen oder angezeigt werden sind in der jeweiligen Landessprache in dieser Datei zu finden, und dort suchen wir einfach nach dem Namen des Items, um seine GUID zu erfahren. Finden dürften wir dann dies hier:

Feras Alsamari in der text_german.xml[ Codeblock kopieren ]
<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üpungen, 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:

Die gesuchte GUID im Palast-Besucher-Pool[ Codeblock kopieren ]
<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.

Eigene GUIDs

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.

Safe GUID-Range

Angestoßen von Lady Meridonia folgt nun eine Liste von Moddern, und den von Ihnen genutzten GUID-Ranges. Die Liste ist selbst verständlich nie vollständig und wird stetig erweitert. Wer auf die Liste drauf will, einfach bei Lady Meridonia im Discord melden. Bei Bedarf leite ich es auch weiter.

Modder/TeamProjektStartEnde
Fishboss850 000859 999
Spice it up900 000930 000
Spice it up976 000976 999
New Horizons1 337 0001 447 999
Spice it up8 855 0008 857 999
WalGier8 877 2008 877 500
New Horizons13 370 00015 522 999
Barthi8219 820 00019 829 999
Spice it up 2.899 334 10099 334 199
New Horizons133 700 000133 700 999
muggenstuermer1 337 500 0001 337 510 000
Mod_Taro1 357 900 0001 357 999 999
New Horizons1 414 000 0001 414 999 999
Spice it up 3.01 440 133 0001 440 133 039
SerpSerp's Mods1 500 000 0001 500 010 000
Fam1 660 010 0001 660 019 999
Lady Meridonia1 777 650 0001 777 659 999
DonnyBrasko1 800 000 1001 800 002 099
Incipium1 998 000 0001 998 999 999
Ghostbuster2 000 000 0002 000 099 999
Nach oben

Durchsuche die Locas

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.

Nach oben

Die Assets-Bibliothek

Wie moddet man Anno?

Gastbeitrag von: Taubenangriff

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.

(Vielleicht ein kleines Update) Was sollte man können, um loszulegen?

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.

Nach oben

Die Assets-Bibliothek verstehen

Gastbeitrag von: Taubenangriff

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:

  • Assets sind Objekte im Spiel – Ein Gebäude, ein Schiff, oder das Handwerker-Baumenü
  • Templates sind Blaupausen für Assets, die Standardwerte für jedes Asset mit dieser Template festlegen. Außerdem gibt die Template an, welche Properties geladen werden sollen.
  • Properties sind Container, die direkt in einem Asset enthalten sind, Properties können Container enthalten, aber nicht umgekehrt!
  • Container sind Sammlungen an Values, Vectors oder anderen Containern.
  • Vectors sind Listen aus Variablen oder Containern
  • Dictionaries sind wie Vectors, nur dass jedes Element einen einzigartigen Namen bekommt, die vom Spiel vordefiniert sind. Deswegen ist die Größe eines Dictionaries limitiert auf die Anzahl vordefinierter Hardcodes.
  • Values sind simple Variablen oder Arrays
Im folgenden werden Values als Variablen bezeichnet, um Verwirrung zwischen Variablenname und dem Wert zu vermeiden.
Nach oben

Properties

Gastbeitrag von: Taubenangriff

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.
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.
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“

Beispiel: Property IrrigationConfig[ Codeblock kopieren ]
<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

Beispiel: Container in Container[ Codeblock kopieren ]
<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:

Beispiel: IrrigationConfig Komplett[ Codeblock kopieren ]
<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

Nach oben

Datentypen

Gastbeitrag von: Taubenangriff

Die folgenden Datentypen werden für Variablen benutzt:

  • int → meist signed 16 oder 32 bit integers
  • float → amerikanische schreibart 0.1305
  • boolean → notiert als 0 oder 1
  • String → ohne Anführungszeichen
  • Hardcode → benutzt wie String, nur vorgegebene Namen werden akzeptiert.
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.

Nach oben

Templates

Gastbeitrag von: Taubenangriff

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:

Simple Asset[ Codeblock kopieren ]
<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.

Nach oben

Vererbung

Gastbeitrag von: Taubenangriff

Dies ist meine eigens erstellte Template „CustomIrrigationConfig“.

CustomIrrigationConfig Base[ Codeblock kopieren ]
<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.

CustomIrrigationConfig Changed Variable[ Codeblock kopieren ]
<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.

CustomIrrigationConfig Changed FadingSpeed[ Codeblock kopieren ]
<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

Nach oben

Assets

Gastbeitrag von: Taubenangriff

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.

Template[ Codeblock kopieren ]
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.

Werte zuweisen[ Codeblock kopieren ]
<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.

Grafiken zuweisen[ Codeblock kopieren ]
<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.

Nach oben

Trigger

Einleitung

Gastbeitrag von: Taubenangriff
Grundgerüst[ Codeblock kopieren ]
<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.

Nach oben

Registrierung von Triggern

Gastbeitrag von: Taubenangriff

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:

Nach oben

Ein paar Handgriffe für die Trigger

Gastbeitrag von: Taubenangriff

Einen Trigger nicht automatisch registrieren: unter TriggerSetup kann man das Automatische Registrieren des Triggers abschalten

Trigger Setup[ Codeblock kopieren ]
<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.

ActionRegisterTrigger[ Codeblock kopieren ]
<Template>ActionRegisterTrigger</Template> <Values> <Action /> <ActionRegisterTrigger> <TriggerAsset>1443041</TriggerAsset> </ActionRegisterTrigger> </Values>

Einen Trigger sich selbst zurücksetzen lassen: Über die ActionResetTrigger

ActionResetTrigger[ Codeblock kopieren ]
<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.

SubTrigger[ Codeblock kopieren ]
<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.

Nach oben

Substance Painter

Eigene Modelle aus Blender & Substance Painter für Anno 1800/2205 exportieren

Gastbeitrag von: Taubenangriff
Vorwort

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.

Benötigte Programme

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

Grundlagen

Ein Modell in Anno ist folgendermaßen aufgebaut:

  • Ordner "maps" (von jeder Map gibt es drei Variationen, diff_0 ist doppelt so groß wie diff_1, diff_1 ist doppelt so groß wie diff_2.
    • diffuse maps - Farbinformationen in RGB, Transparenzinfo in Alpha.
    • normal maps - Normalmap in RG, Glowmap in B, Glossiness in Alpha.
    • metallic maps - RGB Metallic, einfärben möglich. Klassisch weiß bedeutet, dass die Farbinformation der diffuse übernommen wird. Alphakanal speichert eine Ambient Occlusion Map.
    Außerdem noch optional:
    • mask maps - RGB, Leuchtende Stellen bei Nacht. Weiß bedeutet, dass dieser Teil bei Nacht beleuchtet wird.
    • dye maps - RGB, Weiß bedeutet, dass dieser Teil mit der Spielerfarbe eingefärbt wird (Achtung: diffuse und dye werden vermittelt!)
    • height maps: Graustufen, damit lässt sich Höhenunterschied ganz gut faken. Eignet sich daher gut für Bodentexturen.
  • Ordner "rdm" (hierbei steht das lod_0 für das lodlevel der Grafik (0-4, je nach Distanz, sind weniger vorhanden wird automatisch das letzte bis zum Ende genommen, man kann also auch nur eine lod0 ablegen)
    • Alle benötigten Modelle im .rdm Format
  • Ordner "anim" (Für uns nicht benötigt, da kein bisher geschriebener Konverter diese unterstützt)
    • Alle benötigten Animationen im .rdm Format
  • <model>.fc (Zuständig für die Loops des visuellen Feedbacks. Eine Art xml-Dokument, die allerdings einige Teile in Binary hat, die entweder im Hexeditor bearbeitet oder erst konvertiert werden müssen, siehe Maug-Forum ).
  • <model>.cfg (Setzt Modelle zusammen, eine Art xml-Dokument, kann mit einem xml-Formatter wesentlich einfacher lesbarer gemacht werden.)
  • <model>.ifo (Legt Blocking der Grafik fest, eine Art xml-Dokument, kann ebenso mit xml-Formatter lesbarer gemacht werden.)
  • <model>.bfg (Global Illumination, der Unterschied, wenn diese Datei fehlt, ist marginal, daher braucht man diese nicht. Man könnte sie auch eh nicht selbst schreiben.)

Nach oben

Aufsetzen eines Projektes mit Substance

Gastbeitrag von: Taubenangriff

In Substance Painter lassen sich die Eigenschaften der Anno-Engine relativ einfach reproduzieren. Euer Projekt benötigt folgende Kanäle:

  • Base Color
  • Metallic
  • Normal
  • Glossiness
  • Opacity
  • Reflection (Weiß in diesem Kanal bedeutet, dass dieser Teil der Textur bei Nacht leuchtet.)
Dazu benötigt ihr zumindest die Ambient Occlusion Mesh Map, die unter Edit -> Bake Mesh Maps aus dem Modell gebaket werden muss.
Mithilfe von Templates können in Substance Painter Projekte direkt mit diesen Kanälen erstellt werden. Dafür kann beim Erstellen eines Projektes die entsprechende Template ausgewählt werden:

Nach oben

Anno 1800-spezifischer Shader

Gastbeitrag von: Taubenangriff

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.

Nach oben

Export der Texturen aus Substance

Gastbeitrag von: Taubenangriff

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.

Downloads

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.

Nach oben

Der letzte Schritt: Texturen nach dds konvertieren

Gastbeitrag von: Taubenangriff

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.

Texturen in DDS konvertieren[ Codeblock kopieren ]
-f BC7_UNORM -ft DDS -sepalpha *.png

Damit hat man dann alles was man an Texturen benötigt.

Nach oben

Tipps zum schreiben der cfg und ifo

Gastbeitrag von: Taubenangriff

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.

Nach oben