Skip to content

Instantly share code, notes, and snippets.

@Nithanim
Last active September 9, 2017 19:49
Show Gist options
  • Save Nithanim/78703a01d4d9a1d2874fb28b7b7684d4 to your computer and use it in GitHub Desktop.
Save Nithanim/78703a01d4d9a1d2874fb28b7b7684d4 to your computer and use it in GitHub Desktop.
Cultures Modloader

ModLoader

Beschreibung

Da es schwer ist, alle Wünsche in ein einziges Modpack zu verpacken, hätte ich es etwas in die Richtung versucht, einen ModLoader zur Verwaltung der Mods zu erstellen. Ziel ist es, nicht für jedes Pack (oder Karte mit Spieländerungen) einen eigenen Installer mitzubringen. Vielmehr wäre es sinnvoller, nur die Informationen über die Änderungen mit zuliefern und die Verwaltung von einem eigenen Programm übernehmen zu lassen.

Dies hat den Vorteil, dass nur ein einziges Programm die Veränderungen des Spieles kontrolliert und so Problemen und Konflikten verschiedener Änderungen entgegenwirkt. Der Installer einer Map muss ebenfalls nicht viel mehr mitliefern, außer eventuell den ModLoader, der aber separat oder on-demand heruntergeladen werden sollte, um nicht mehr Traffic und Speicherplatz als nötig zu verbrauchen.

Der ModLoader wäre in der Lage, das ganze Spiel mit einem (oder mehreren) Modpacks generell zu verändern. Ich persönlich glaube weniger daran, dass große Modpacks entstehen, da die Karten dafür ausgerichtet sein müssten. Realistischer sehen ich aber die Entstehung von Einzelkarten mit ein paar wenigen, überschaubaren Änderungen (ModKarten).

Dieses Dokument gibt nur meine Grundüberlegungen wieder, also ohne Details und genauen Lösungsmöglichkeiten. Vorgestellt hatte ich mir folgende Funktionen:

  • Starten vom gewohnten Standardspiel (ohne Mods). Standardkarten sind sichtbar, ModKarten nicht.
  • Auswahl einer bestimmten Karte zum Spielen, die Änderungen enthält. Nur diese eine Karte ist sichtbar.
  • Auswahl eines Modpacks. Alle Karten sind sichtbar (?) oder Karten, die dieses Pack referenzieren.

Technische Realisierung

Laden der Modifikationen

In der game.ini gibt es die Einträge use_data_file_?, wobei das ? von 0 bis 9 durchprobiert wird. Als einziges Argument wird ein String erwartet, der den relativen Pfad zu einer .lib im $gameroot$ anzeigt. Wenn die Angegeben Datei nicht gefunden wird, dann wird der Standardwert DataX\Libs\data000?.lib benutzt (wobei ?+1 genommen wird).

Bei einem Standardstart würde der ModLoader use_data_file_0 auf dem Standardwert belassen.

Bei einer Karte, die Mods mitliefert und so die anderen Karten nicht anzeigt, müssen weitere Vorkehrungen getroffen werden. Für "Userkarten" (int und ext) müsste nur der data\maps und usermaps umbenannt werden und beim Beenden wieder rückgängig gemacht werden. Für die Karten, die schon enthalten sind, würde der ModLoader beim ersten Start die einige .lib laden und eine Version ohne Karten nutzen (also use_data_file_0 darauf umschreiben). Für zusätzliche Inhalten könnten die anderen 1-9 Zahlen verwendet werden, nur ist mir das Verhalten bei Duplikaten nicht bekannt.

Da das Spiel sowieso unkomprimierte Daten aus data einliest, würde sich dort die Karte normal unterbringen lassen. Da aber dies das Management mit den vorher verschobenen anderen Karten potentiell erschwert, würde es sich anbieten, eine Mod-Karte als .lib zu verpacken und einfach nur in der game.ini use_data_file_1 umzuschreiben. So könnte auch zwischen mehreren Maps schnell hin- und hergewechselt werden.

Um nicht komplette Spieldateien mit nur kleinen Änderungen mitliefern zu müssen, würde es sich anbieten, die Änderungen im unified-diff-format in die Karte zu verpacken, die dann vom ModLoader zusammen mit den Originalinhalten zum Mod zusammengebaut werden. So wie es aktuell ist, wären die dann als .ini im data Verzeichnis, was aber auch jedes Mal für jeden Kartenwechsel wieder geändert werden müsste.

Im Idealfall könnte dies dann auch zusammen in die oben erwähnte use_data_file_1 geschrieben werden, um die Dateien von use_data_file_0 zu ersetzen. Dazu müsste aber das Verhalten bei Duplikaten bekannt sein.

Direktes Laden einer Karte

Die game.ini stellt auch noch start_map und start_campaign_3_screen bereit. Mit start_map ist es möglich, direkt eine spezielle Karte zu starten, ohne durch das Hauptmenü klicken zu müssen. Als Argument der Pfad zu einer Karte erwartet. Dieser kann sowohl relativ ("data\maps\PoC") als auch absolut ("E:\Spiele\Weltwunder\data\maps\PoC"). Es sieht aber so aus, als wäre nur eine Verzeichnisangabe (enpackte Karte; oder intEdi) möglich und keine Datei (extEdi). Dies ist aber leicht zu umgehen, indem diese einfach ausgepackt wird. Die Karte wird im Standardschwierigkeitsgrad (Normal) geladen.

Automatisches generieren eines Modpaketes

Um die Änderungen der Spieldateien einfach verpacken zu können, könnte der ModLoader direkt mit den geänderten Spieldateien arbeiten und auf Basis der Originaldateien die Diffs erstellen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment