Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 15 von 33

Thema: Kaels "Modders Guide to Civilization V"

  1. #1
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215

    Civ5 Allgemein Kaels "Modders Guide to Civilization V"

    Seit heute gibt es die Moddingtools - und passend dazu von einem der Profimodder bei den Civfanatics, Kael, eine Anleitung zum Modden, die man übrigens hier findet.
    Nun ist die natürlich auf Englisch und für den einen oder anderen mag es bequemer oder leichter sein, deutsche Texte zu lesen.

    Ich habe mal angefangen, die Anleitung zu übersetzen. Die Übersetzung ist sicher nicht perfekt (und bisher noch äußerst unvollständig), aber vielleicht besser als nichts und möglicherweise für irgendjemanden hilfreich.

    edit:Jakera hat diesen Thread in eine .pdf-Datei verwandelt. Ganz herzlichen Dank. Download:http://civforum.de/attachment.php?at...5&d=1295249735

    Viel Vergnügen damit:


    Die wichtigsten Konzepte

    Was ist Modden?
    „Modden“ ist ein umgangssprachlicher Ausdruck für das Abändern von Hardware oder Software, um etwas anderes zu tun als der Designer vorgesehen hatte. Firaxis hat Civilization V (und frühere Versionen) mit Gedanken an Modder entwickelt.
    Eine Mod(ifikation) könnte etwas so Einfaches sein wie das Anpassen der Kosten einiger Einheiten und Gebäude, ein Verändern der KI, sodass diese anders spielt, oder das Einfügen einer neuen Zivilisation in das Spiel. Oder sie könnte so komplex sein wie eine Mod, die ein neues Spiel auf der Civilization-Engine aufbaut.

    Dieses Dokument wurde geschrieben, um Moddern zu helfen, einen schnellen Start beim Modden von Civ V zu finden, indem es hilft, vorzustellen, was möglich ist, die technischen Angelegenheiten zu lernen, und Modder so schnell wie möglich von der Idee zum Veröffentlichen der eigenen Mod zu bringen. Auch wenn dieses Dokument eine große Breite von Mod-Konzepten abdeckt, zeigt es nicht alles, das mit Civ5 gemacht werden kann. Speziell zu Quellcode-Mods und 3D-Graphikveränderungen sagt es nichts.

    Was hat sich seit Civ IV geändert?
    Viele Spiele lassen sich modifizieren, aber Civ IV hat einen neun Standard gesetzt, indem das Spiel von Anfang an mit dem Gedanken an Modifizierbarkeit entwickelt wurde. Die Spieldatenbank (XML) konnte mit einem Texteditor verändert werden, eine Skriptsprache (Python) war enthalten, sodass Spieler ihre eigenen Ereignisse und Funktionen erzeugen konnten, und der Quellcode der DLL konnte mit einem C++-Compiler geändert werden. Das machte Civ IV zu mehr als einem Spiel, es ist eine Grundlage fürs Modden.
    So offen und kraftvoll diese Engine war, gab es bedeutende Einschränkungen:
    1. Mods waren für Spieler schwer zu finden, herunterzuladen und zu installieren.
    2. Mods ließen sich nicht kombinieren, wenn die Modder nicht eine Menge Arbeit dareinsteckten, sie zu integrieren.
    3. Wenn Python auch ein mächtiges Skript-Werkzeug war, beeinflusste es die Spielgeschwindigkeit doch sehr.
    Civ V verbessert die Modifizierbarkeit, die Civ IV angeboten hatte, und löst alle drei Probleme.
    Civ V weist den Mod-Browser auf, ein Mod-Menü innerhalb des Spiels, das es Spielern ermöglicht, Mods, die sie ausprobieren wollen, zu finden, herunterzuladen und zu installieren. Es ist jetzt leicht, Mods zu erstellen, die Spieler zusammen mit anderen Mods laufen lassen können, sodass sie die Wahl haben, welche Mod oder Gruppe von Mods sie in ihrem Spiel laufen lassen wollen. Und Python wurde durch Lua ersetzt, das besser mit dem C++-Kern zusammenarbeitet und weniger Einfluss auf die Performance hat als Python.

    Modulares Design
    Civ4-Modder werden daran gewöhnt sein, Dateien zu ersetzen, um etwas zu ändern. Wenn in einer Mod eine neue Datei „Civ4Civilizations.xml“ hinzugefügt wird, wird die ursprüngliche „Civ4Civilizations.xml“ nicht verwendet.
    Das ist in Civ V nicht der Fall. Anstatt Dateien zu ersetzen erben Mods die ursprünglichen Objekte und Modder müssen diejenigen darunter löschen, die in dieser Mod nicht benutzt werden sollen. (Diese Anleitung wird sich später damit befassen, wie das geht.) Ein Modder, der eine Mod zum amerikanischen Bürgerkrieg erstellt, kann eine „Union“ und eine „Confederacy“-Zivilisation erstellen, wird aber auch explizit die normalen Zivilisationen löschen müssen, so dass sie nicht verfügbar sind. (Sonst sind Frankreich, Russland usw. in der Mod verfügbar.)
    Der Vorteil davon ist, dass dies Mods modular macht. Das Spiel nimmt an, dass alles benutzt wird, solange eine Mod das nicht ausdrücklich verbietet. Auf diese Art mag eine Mod eine Kanadische Zivilisation hinzufügen, eine mag Deutschland entfernen und es durch eine neue Zivilisation ersetzen und wieder eine andere Mod die Zivilisation Atlantis ergänzen. Diese Mods können alle zusammen geladen werden, ohne dass ein Modder sich darum besonders kümmern müsste. Wenn genug Mods zur Verfügung stehen, kann die bevorzugte Mischung eines jeden Spielers einzigartig sein.

    XML
    XML ist ein Format, Daten näher zu bestimmen. Es ist keine Programmiersprache, sondern eine Sprache, um Informationen zu lagern. In Civ V wird XML benutzt, die Eigenschaften der verschiedenen Spielinhalte festzulegen: Einheitenkosten, Namen der Anführer, Starteinheiten der Zivilisation – sie alle werden in XML definiert.
    Der Vorteil von XML ist, dass es mit einem Texteditor verändert werden kann und Nutzer keine Programmiersprache lernen müssen, um es zu benutzen. Betrachte die folgende XML-Definition für einen Siedler:
    HTML-Code:
    <Row> 
      <Class>UNITCLASS_SETTLER</Class> 
      <Type>UNIT_SETTLER</Type> 
      <Moves>2</Moves> 
      <Capture>UNITCLASS_WORKER</Capture> 
      <HurryCostModifier>33</HurryCostModifier> 
      <Domain>DOMAIN_LAND</Domain> 
      <DefaultUnitAI>UNITAI_SETTLE</DefaultUnitAI> 
      <Description>TXT_KEY_UNIT_SETTLER</Description> 
      <Civilopedia>TXT_KEY_CIV5_ANTIQUITY_SETTLER_TEXT</Civilopedia> 
      <Strategy>TXT_KEY_UNIT_SETTLER_STRATEGY</Strategy> 
      <Help>TXT_KEY_UNIT_HELP_SETTLER</Help> 
      <Requirements>TXT_KEY_NO_ACTION_SETTLER_SIZE_LIMIT_HARDCODED</Requirements> 
      <Food>true</Food> 
      <Found>true</Found> 
      <CombatLimit>0</CombatLimit> 
      <UnitArtInfo>ART_DEF_UNIT__SETTLER</UnitArtInfo> 
      <UnitArtInfoCulturalVariation>true</UnitArtInfoCulturalVariation> 
      <PortraitIndex>0</PortraitIndex> 
      <IconAtlas>UNIT_ATLAS_1</IconAtlas> 
    </Row>
    In dieser Definition werden die Eigenschaften eines Siedlers festgelegt. Sie sind aufgeteilt in Elemente, wobei jedes eine Kennzeichnung am Anfang („Starttag“, in spitzen Klammern, wie <Moves>) und am Ende („Endtag“, in </ >, wie z.B. </Moves>) hat. Die Daten stehen zwischen Start- und Endtag (hier die 2, die angibt, dass der Siedler zwei Bewegungspunkte hat). Die Bewegungspunkte eines Siedlers auf 3 Felder pro Runde anzuheben, ist nichts weiter als diese 2 zu einer 3 zu machen.

    Beachte, dass auch <Row> und </Row> Tags sind. Die gesamte Siedlerdefinition ist also ein Element mit Unterelementen darin.

    Lass dich nicht verwirren, wenn die Elemente noch keinen Sinn ergeben. Wenn dies dein erster Blick auf XML ist, wirst du wahrscheinlich überrascht sein, wie viel davon du erraten kannst. Firaxis hat sehr gute Arbeit geleistet, was es angeht, die Tags einfach lesbar zu gestalten. <Domain>DOMAIN_LAND</Domain> heißt, dass der Siedler eine Landeinheit ist. <Capture>UNITCLASS_WORKER</Capture> bedeutet, dass der Siedler, wenn er gefangen genommen wird, zu einem Arbeiter wird usw.
    Elemente können andere Elemente enthalten. In dem Beispiel oben enthält das „Row“-Element (das den Starttag „<Row>“ und den Endtag „</Row>“ hat) all die Elemente für einen Siedler. Hier ist ein komplexeres Beispiel:


    In diesem Bild ist das GameData-Element der gesamte blaue Bereich. Das Specialists-Element der rote. Beachte, dass es zwei Row-Elemente innerhalb des Specialists-Element gibt (für zwei verschiedene Spezialisten), wie auch das Row-Element viele verschiedene Elemente für deren Eigenschaften enthält. Das erste Row-Element ist der grüne Bereich und die vollständige Definition für den Spezialisten Künstler und das violett Eingekreiste ist ein einzelnes Attribut des Künstlers.


    (Fortsetzung folgt)
    Angehängte Grafiken Angehängte Grafiken
    Geändert von Swoon (18. Januar 2011 um 18:19 Uhr)

  2. #2
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Danke. Ein bisschen Nachschub:


    Schema
    Schema ist die Definition für XML-Elemente. In Civ heißt das, dass Schema bestimmt, ob der <Moves>-Tag einen String (Zeichenkette), einen Boolean (Wahrheitswert) oder einen Integer (eine ganze Zahl) enthält (Moves ist ein Integer). Es legt auch die Standardeinstellungen eines Attributs fest; anders als in Civ4, wo Modder jede Eigenschaft festlegen mussten, werden in Civ5 in Schema Standardwerte definiert, sodass diese benutzt werden, wenn eine Eigenschaft nicht definiert ist.

    Vielleicht hast du festgestellt, dass es eine Menge Einheiteneigenschaften gibt, die im vorangegangenen Abschnitt nicht in der Siedlerdefinition auftauchten. Zum Beispiel sagt diese nicht, ob der Siedler Felder plündern kann oder nicht. Es gibt eine Eigenschaft „Pillage“, die in Schema wie folgt definiert ist:
    HTML-Code:
    <Column name="Pillage" type="boolean" default="false"/>
    Diese Schema-Definition zeigt, dass das Plündern-Attribut ein Wahrheitswert ist. Es kann entweder <Pillage>true</Pillage> oder <Pillage>false</Pillage> sein, aber nichts anderes. Wir stellen auch fest, dass der Standardwert „false“ ist. Demnach müssen wir in einer Einheitendefinition nichts davon schreiben, wenn sie nicht plündern können soll, denn das ist die Standardeinstellung. Und deshalb muss beim Siedler nichts davon stehen.

    Wenn du wissen willst, welche Attribute für ein Objekt verfügbar sind, solltest du auf die Schema-Definition für diesen Objekttyp schauen. Manchmal finden wir Eigenschaften, die nicht benutzt werden; Dinge, die in Mods benutzt werden können, auch wenn sie im Grundspiel nicht verwendet werden. Betrachte den folgenden Abschnitt aus der CIV5HurryInfos.xml:
    Code:
    <GameData> 
      <!-- Table definition --> 
      <Table name="HurryInfos"> 
        <Column name="ID" type="integer" primarykey="true" autoincrement="true"/> 
        <Column name="Type" type="text" notnull="true" unique="true"/> 
        <Column name="Description" type="text"/> 
        <Column name="PolicyPrereq" type="text" reference="Policies(Type)"/> 
        <Column name="GoldPerProduction" type="integer" default="0"/> 
        <Column name="ProductionPerPopulation" type="integer" default="0"/> 
        <Column name="GoldPerBeaker" type="integer" default="0"/> 
        <Column name="GoldPerCulture" type="integer" default="0"/> 
      </Table> 
      <!-- Table data --> 
      <HurryInfos> 
        <Row> 
          <ID>0</ID> 
          <Type>HURRY_POPULATION</Type> 
          <Description>TXT_KEY_HURRY_POPULATION</Description> 
          <PolicyPrereq>NULL</PolicyPrereq> 
          <ProductionPerPopulation>60</ProductionPerPopulation> 
        </Row> 
        <Row> 
          <Type>HURRY_GOLD</Type> 
          <Description>TXT_KEY_HURRY_GOLD</Description> 
          <PolicyPrereq>NULL</PolicyPrereq> 
          <GoldPerProduction>6</GoldPerProduction> 
        </Row> 
      </HurryInfos> 
    </GameData>
    Oben sehen wir die Schema-Definition zwischen <Table name=“HurryInfos“> und </Table> (rot hervorgehoben). Es gibt acht Attribute, die hier definiert werden: ID,Type,Description, PolicyPrereq,GoldPerProduction, ProductionPerPopulation, GoldPerBeaker und GoldPerCulture.

    Die tatsächlichen Eigenschaften werden zwischen <HurryInfos> und </HurryInfos> als Rows definiert (blau markiert). Es gibt zwei: HURRY_POPULATION (Bevölkerung opfern um die Produktion zu beschleunigen) und HURRY_GOLD (Geld bezahlen um die Produktion zu beschleunigen). Aber die Attribute PolicyPrereq, GoldPerBeaker und GoldPerCulture werden nirgends benutzt. Sie sind Eigenschaften, die Modder in ihren Mods benutzen können, auch wenn sie im Grundspiel nicht verwendet werden.

    Beachte auch, dass in obigem Beispiel das Schema am Anfang der Datei mit den Eigenschaften, die es kontrolliert, steht. Das ist anders als in Civ4, wo das Schema eine eigene Datei war.

    Verweise verstehen
    In Civilization hat fast jeder Spielinhalt mit jedem anderen zu tun. Die Einheitendefinition verweist vielleicht auf die Technologien, die erforderlich sind, um die Einheit auszubilden, eine Zivilisationsdefinition listet Einheiten auf, die für diese Zivilisation einzigartig sind, eine Anführerdefinition verweist auf eine Zivilisationseigenschaft. Das macht es komplexer, ein Objekt zu entfernen, weil alle Verweise auf dieses Objekt ebenfalls entfernt werden müssen.
    Wenn wir zum Beispiel eine Mod machen wollen, die die Ressource Öl aus dem Spiel entfernt, können wir nicht einfach den Eintrag zu Öl aus der Datei CIV5Resources.xml löschen. Täten wir das, erhielten wir eine Fehlermeldung, wenn das Spiel lüde, beim Laden der Feldverbesserungen (weil sie auf Öl verweisen als auf einen Rohstoff, der bestimmte Feldverbesserungen ermöglicht), beim Laden der Einheiten (denn manche verweisen auf Öl als Voraussetzung dafür, dass sie gebaut werden können) und beim Laden der Zivilisationseigenschaften (denn eine beeinflusst die Ölproduktion).

    Das Gleiche gilt für das Hinzufügen neuer Objekte zum Spiel. Wenn du eine neue Zivilisation einfügst und auf einen Anführer verweist, den du noch nicht hinzugefügt hast oder eine Spezialeinheit, die du noch nicht hinzugefügt hast, erhältst du beim Laden der Mod eine Fehlermeldung.

    Wenn du immer nur eine Sache gleichzeitig ergänzen willst und sicherstellen willst, dass sie funktioniert, möchtest du möglicherweise bereits vorhandene Verweise verwenden, bis du sie in die entsprechenden des neuen Objekts abänderst. Wenn du eine neue Zivilisation hinzufügst, also z.B. LEADER_WASHINGTON als Anführer und UNIT_AMERICAN_B17 als Spezialeinheit, sodass du das Spiel laden und deine Zivilisation testen kannst, bevor du zurückgehst und einen neuen Anführer und eine neue Spezialeinheit einfügst.



    XML Dateistruktur
    Die XML-Dateistruktur ist im Ordner <Installationsordner>\assets\Gameplay\XML\ enthalten. Anders als bei Civ IV ist die genaue Struktur nicht wichtig, weil wir keine Dateien ersetzen. Aber es ist wichtig zu wissen, wo es die Dateien gibt, sodass Modder die aktuellen Definitionen nachsehen können. Im Allgemeinen ist das Schema am Anfang der Datei für den jeweiligen Spielinhalt definiert; das ist also ein guter Ort, um nach verfügbaren Eigenschaften zu suchen.


    GlobalDefines.xml- Enthält die Standarddefinitionen für eine breite Palette von Spieleinstellungen wie Startjahr, anfängliche Stadtbevölkerung und Maximalanzahl von Gebäuden pro Stadt (Standard ist „unbegrenzt“). Hunderte von Spielregeländerungen können einfach durch Ändern der Werte in dieser Datei gemacht werden.

    AI – Dieser Ordner enthält viele KI-Konfigurationsdateien. So manches, was in Civ IV nur durch Veränderung des Quellcodes möglich war, kann hier einfach in XML geändert werden. Es gibt Dateien für Stadtstrategien, Wirtschaftsstrategien, Große Strategien (welche Siegart die KI anstrebt), Militärstrategien, Taktische Züge, Diplomatie und allgemeine KI-Festlegungen (für Dinge wie wie schnell die KI expandiert, wie sehr sie Gold schätzt usw.)

    BasicInfos- Dieser Ordner deckt die Definitionen aller eher profanen Spielinhalte ab. Einheitenkampftypen werden hier definiert, Arten der Unsichtbarkeit, Domains, usw.
    In der Regel sind es nur Deklarationen (einen Typ ohne irgendwelche Attribute einfach nur benennen), die meist von Moddern nicht verändert werden. Aber wenn du beispielsweise eine Art von Unsichtbarkeit für eine Einheit festsetzt, muss das Spiel einen Ort haben, an dem diese Unsichtbarkeit definiert ist. Das ist hier.

    Buildings- Wie man erwarten würde, werden hier die Gebäudedefinitionen verwaltet. Es gibt zwei Dateien, eine für die Gebäudeklassen und eine für die eigentlichen Gebäude.

    Gebäudeklassen (Building Classes) sind grundlegende Definitionen für Gebäude, zum Beispiel eine Kaserne. Aber es kann mehrere Gebäude für eine einzelne Gebäudeklasse geben. So hat die Kasernenklasse zwei zugehörige Gebäude: die Kaserne und den Krepost. Mehrere Gebäude von einer Gebäudeklasse vertreten zu lassen, ist die Art des Spiels, Gebäude für einzelne Zivilisationen zu ersetzen. So baut eine Zivilisation einen Krepost als Spezialgebäude anstelle der Kaserne. Aber weil beide, sowohl Kaserne als auch Krepost, zur Kasernengebäudeklasse gehören, kann das Spiel einfach als „Gebäudeklasse Kaserne“ auf sie verweisen und weiß, dass es erhalten wird, welche Form Kaserne auch immer dieser Spieler bauen kann.

    Zum Beispiel starten alle Zivilisationen mit einem freien BUILDINGCLASS_PALACE. Fügtest du nun eine neu Zivilisation hinzu, die als Spezialgebäude einen einzigartigen Palast hätte, wäre das neue Gebäude nicht ein BUILDING_PALACE, aber BUILDINGCLASS_PALACE zugehörig, sodass bei der Verteilung des freien Palasts deine neue Zivilisation ihren eigenen Palast erhielte statt des normalen.

    Civilizations- Zivilisationen, Stadtstaaten, Regionen, Zivilisationseigenschaften werden hier definiert. Zivilisationen werden wahrscheinlich eines der ersten Dinge sein, die Leute modden wollen und dieser Leitfaden wird später auch noch ein spezielles Beispiel abdecken.

    Diplomacy- Das ist der Ort, an dem all die Texte für Dinge wie die erste Begegnung, Kriegserklärung, Ablehnung eines Handels und so weiter alle verknüpft sind.

    GameInfo- Hierhin hat Firaxis alles gepackt, was nirgendwo anders hinpasste. Die folgenden Dateien und Eigenschaften werden hier definiert:
    • CIV5ArtStyleTypes.xml- Die Liste der verfügbaren ArtStyles für Städte. Die Referenz für die Zivilisationsdefinitionen. Hier gibt es wenig zu ergänzen, schließlich ist es bloß eine Kennzeichnung des Namens.
      CIV5Climates.xml- Die Definitionen der verschiedenen Klimatypen (heiß, kalt, tropisch, gemäßigt usw.) mit Variablen, die der Zufallskartengenerator verwendet, um die Welt zu erstellen. Wenn das auch nicht so flexibel sein wird wie ein eigenes Kartenskript zu schreiben, ist es ein einfacher Weg, es Spielern zu ermöglichen, Karten mit mehr oder weniger Dschungel, Wäldern, Bergen, Wüsten usw. auzuwählen.
      CIV5CultureLevels.xml – Diese Datei ist überflüssig und wird in Civ V nicht benutzt.
      CIV5Cursors.xml – Das ist ein Link zu den Mauszeigeranimationen, die vom Spiel verwendet werden. Ein neues Mauszeigerset zu erstellen ist nichts weiter als neue .ani-Dateien zu erstellen und diese Datei mit dem Link zu aktualisieren.
      CIV5EmphasizeInfos.xml- überflüssig und unbenutzt
      CIV5Eras.xml- Vereinfacht sind das die Einstellungen für die fortgeschrittenen Spielstarts (die festlegen, mit wie vielen Einheiten oder Gold man startet, ober Bonushütten verteilt werden sollten usw.). Aber diese Datei enthält auch ein paar Eigenschaften für Spiele, die diese Zeitalter erreichen, wie z.B. Modifikatoren für Bauzeiten von Geländeverbesserungen, freie Bevölkerung in neuen Städten und die Festlegung der Stadtgraphiken (sodass deine Städte in verschiedenen Zeitaltern unterschiedlich aussehen). Die Attribute „EventChancePerTurn“ und „SoundtrackSpace“ sind überflüssig.
      CIV5Flavors.xml- Eine Liste von Tags, die in anderen Dateien für Arten von Flavors (Vorlieben?) benutzt werden.
      CIV5ForceControllInfos.xml- überflüssig und unbenutzt
      CIV5GameOptions.xml-Die Tags für die Spieloptionen (Schneller Kampf, wütende Barbaren...)
      CIV5GameSpeeds.xml- Hier werden die Spielgeschwindigkeiten definiert. Sie beinhalten Modifikatoren für Baugeschwindigkeit, Bevölkerungswachstum und Fortschrittszuwachs.
      CIV5GoodyHuts.xml- Enthält alle möglichen Bonushüttenergebnisse. Die tatsächliche Wahrscheinlichkeit für jedes einzelne Ergebnis wird unter berücksichtigung des Schwierigkeitsgrades angegeben, der in der CIV5HandicapInfos.xml konfiguriert wird.
      CIV5HandicapInfos.xml – Hier werden die Schwierigkeitsgrade gesetzt. Es ist ein großartiger Ort, um zu sehen, was sich in den unterschiedlichen Schwierigkeitsgraden ändert. In dieser Datei können wir sehen, dass die früheste Runde, in der Barbaren erscheinen (EarliestBarbarianReleaseTurn), auf „Siedler“ Runde 10000 ist. Die meisten Modder werden diese Einstellungen nicht ändern, aber ein paar erhöhen den Vorteil der KI, um neue Möglichkeiten, die menschliche Spieler unterstützen, auszugleichen. Andere mögen den Vorteil der KI herabsetzen, wenn sie sie so weit verbessert haben, dass sie darauf nicht mehr angewiesen ist.
      CIV5HurryInfos.xml Hier werden die Arten der Produktionsbeschleunigung definiert. Wenn du die Menge an Produktion verändern willst, die es für Opfern der Bevölkerung gibt, oder die Menge Gold pro Hammer beim Gebäudekauf, ist das die richtige Datei.
      CIV5IconFontMapping.xml Die Datei, in der die Icons (wie ICON_BULLET) einem Bild aus dem Icon-Atlas zugeordnet werden.
      CIV5IconTextureAtlases.xml – Wo die Icon-Atlanten (wie TECH_ATLAS_1) bestimmten Dateien (wie TechnologyAtlas.dds) zugeordnet werden. Es ist nützlich zu sehen, auf welche dds-Dateien verwiesen wird, wenn Modder die Icons verändern oder einen neuen Icon-Atlas hinzufügen wollen.
      CIV5MultiplayerOptions.xml – Hier werden die Mehrspieleroptionen definiert. Es gibt keine anderen Attribute dazu als ihre Standardeinstellung und Texte. Alle wirkliche Definition wird im Quellcode vorgenommen. Deshalb würde ein Ergänzen einer neuen Option in dieser Datei zwar eine neue Option in der Auswahlliste erscheinen lassen – aber sonst nichts verändern.
      CIV5PlayerOptions.xml Hier werden alle Nicht-Mehrspieler-Optionen definiert. Wie bei den Mehrspieleroptionen gibt es hier keine wirklich Bedeutung tragenden Eigenschaften. Die tatsächliche Auswirkung, sie aktiviert oder deaktiviert zu haben, ist eine Sache des Quellcodes.
      CIV5Policies.xml – Hier werden alle Politiken definiert. Sie sind hier alle mit einem Politikzweig verbunden; alle Aspekte werden hier definiert, wenn du auch möglicherweise die verschiedenen Tabellen in dieser Datei alle durchsuchen musst, um die gesamte Information zu bekommen.
      CIV5PolicyBranchTypes.xml Hier werden die Politikzweige angewandt. Die einzige wirkliche Einstellung, die hierin gespeichert ist, ist, ob ein Zweig einen anderen verhindert. Abgesehen davon gibt es diese Datei für Modder, die Politikzweige hinzufügen oder entfernen möchten, die in der CIV5Policies.xml verwendet werden können.
      CIV5Processes.xml – Die Optionen der Bauaufträge „Wohlstand“ und „Forschung“ können hier eingestellt werden, falls ein Modder die Verhältnisse ändern möchte.
      CIV5Projects.xml Hier werden Projekte definiert. Beachte, dass in Schema eine Tabelle definiert ist, die nicht benutzt wird: Project_ResourceQuantityRequirements, die es Moddern erlauben könnte, ein paar interessante Projekte zu erstellen.
      CIV5SeaLevels- Diese Datei legt die erhöhte Wahrscheinlichkeit für Ozeanfelder in Abhängigkeit des gewählten Meeresspiegels fest.
      CIV5SmallAwards.xml Diese Datei wird in Civ5 nicht benutzt. Sie scheint in der Lage zu sein, Mitteilungen anzuzeigen, wenn bei Siegpunkten, Stadtanzahl und Bevölkerung Schwellen erreicht werden.
      CIV5Specialists.xml Hier werden die Spezialisten definiert. Du kannst diese Datei verwenden, die Erträge der verschiedenen Spezialisten zu ändern, Spezialisten hinzufügen oder aus dem Spiel entfernen oder den Beitrag, den sie zu Großen Persönlichkeiten leisten, modifizieren.
      CIV5Trades.xml – Diese Datei bestimmt die Gewichtung der KI für Handel (als wie wertvoll die KI Forschung, Kultur, Gold ansieht)
      CIV5TurnTimers.xml- Die definieren die Rundenzeitgeber, wenn automatisch zu beendende Runden in den Mehrspielereinstellungen aktiviert sind.
      CIV5Victories.xml- Hier werden die Siegbedingungen definiert. Eigentlich liegen die Siegbedingungen in Civ5 für Modder nicht sehr nahe. Der Vorherrschaftssieg zum Beispiel beinhaltet nur das auf „wahr“ gesetzte Element Eroberung (<Conquest>true</Conquest>). Was dieses Conquest-Element macht, ist im Quellcode angegeben, nicht in XML dargestellt. Aber wenn man genau auf das Schema dieser Datei schaut, sieht man, dass dort eine Tabelle definiert ist, die nicht benutzt wird: VictoryPointAwards. Firaxis hat ein unbenutztes Siegpunktesystem in Civ5 eingebaut. Ein Modder kann neue Siege ergänzen, für die WinsGame (gewinnt das Spiel) nicht auf wahr gestellt ist und ihnen dann Siegpunkte in der VictoryPointAwards-Tabelle zuweisen.
      CIV5Votes.xml-überflüssig, unbenutz
      CIV5VoteSource – überflüssig, unbenutzt
      CIV5Worlds.xml – Hier werden die Weltgrößen definiert. Breite und Höhe des Netzes werden hier eingestellt, genauso wie die übliche Spieleranzahl und ein paar Einstellungen. In dieser Datei ein paar Kartengrößen hinzuzufügen funktioniert nicht gut, weil die meisten Kartenskripte auf die Kartengrößen per Name zugreifen. Wenn die neue Kartengröße keine derer ist, mit deren Namen das Skript arbeitet, wird es nicht korrekt funktionieren.


    Interface – Die Definitionen für Inteface-Modi, Farben und Spielerfarben befinden sich hier. Spielerfarben werden wichtig, wenn du sehen willst, welche Spielerfarbe du einer Zivilisation zuweisen willst, die du erstellst. Eine Spielerfarbe ist die erste Farbe, die zweite Farbe und die Textfarbe für Spieler, die diese Spielerfarbe benutzen. Die Spielerfarbe red hat zum Beispiel eine erste Farbe rot, weiß als zweite Farbe und eine rote Textfarbe. In der colors-Datei werden die Farben definiert (z.B. was genau „COLOR_RED“ ist). Civ5 verwendet das um mehr als die traditionellen Farben zuzuweisen; es hat auch Farbdefinitionen für etwas wie COLOR_TECH_TEXT.

    Leaders- Dieser Ordner ist anders aufgebaut als die anderen. Anstatt eine gemeinsame Datei mit dem Schema und allen Inhalten zu haben, hat Firaxis das Schema in einer Datei und jeden Anführer in einer eigenen Datei. Das hat keinen Einfluss auf die Modifizierbarkeit, aber macht es leichter, sich all die für einen Anführer typischen Werte anzusehen, und ein bisschen schwerer, die Werte verschiedener Anführer zu vergleichen.

    Misc- Hier werden Mitteilungen und Routen (Straßen, Schienen) definiert. Modder sind vielleicht daran interessiert, die Erträge oder Bewegungspunktveränderungsraten von Straßen und Eisenbahnen anzupassen.

    NewText Dies ist der Ort, an dem alle Textwerte, die im Spiel verwendet werden, tatsächlichen Zeichenketten zugewiesen werden. Wo TXT_KEY_CIV_ARABIA_DESC so eingestellt wird, dass englische Spieler „Arabian Empire“ lesen. Es gibt einen eigenen Ordner für Deutsch (de_DE), Englisch (EN_US), Spanisch (es_ES), Französisch (fr_FR), Italienisch (it_IT) und Japanisch (JA_JP). Englische Modder, die herausfinden wollen, wozu ein bestimmter Textwert wird, werden in die Dateien im XML/NewText/EN_US/-Ordner schauen wollen.

    Technologies- Hier werden die Technologien definiert. Technologien haben GridX- und GridY-Elemente. Diese bestimmen, wo die Technologie im Technologiebaum angezeigt wird. Beim Hinzufügen einer neuen Technologie musst du vielleicht die GridX- und GridY-Werte anderer Technologien anpassen, um für die neue Technologie Platz zu schaffen.

    Terrain – Hier werden Features (auch einzigartige), Geländeverbesserungen, Rohstoffe, Geländearten und Erträge definiert.

    Units- Einheiten und alles, was damit zu tun hat, werden hier definiert, inklusive Beförderungen, Aufbau, Missionen, Formationen usw.
    Angehängte Grafiken Angehängte Grafiken

  3. #3
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Vielen Dank für den Zuspruch.

    @Lenina: Ich hatte vor, nach Fertigstellung der Übersetzung in jenem Thread Bescheid zu sagen. Aber du hast wohl Recht, dass es angemessener ist, nicht so lange zu warten. Ich habe mich also bei den Fanatics angemeldet und kann jetzt (anders als gestern) antworten: Ja, er weiß Bescheid.


    Das nächste Stückchen. (Ich bin noch nicht mit allem ganz zufrieden und muss insbesondere den genauen Menüaufbau Firefox/SQLiteManager überprüfen, aber schonmal als vorläufige Version.):




    SQL
    XML ist nur eine Zwischenstufen-Sprache, die in SQL übersetzt und dann in der Datenbank ausgeführt wird. Typischerweise wirst du alles einfach direkt aus den .db-Dateien laden, wenn du das Spiel einmal hast laufen lassen und die XML-Dateien sich nicht geändert haben. Das beschleunigt die Ausführung. Firaxis hat das XML-Format aus Gewohnheit beibehalten, es wird vom Spiel nicht direkt benutzt.

    Gewissermaßen werden die XML-Dateien in SQL-Anfragen übersetzt und in der Datenbank laufen gelassen. Direkte SQL-Dateien können auch ausgeführt werden. Sie haben ihre Vor- und Nachteile. Der Nachteil an SQL ist, dass der Modder sich mit dieser Sprache auskennen muss, wohingegen der Vorteil ist, dass er sehr komplexe Umformungen vornehmen kann, die sich in XML nicht ausdrücken lassen.



    Die Datenbank betrachten
    Der einfachste Weg, die Spieldatenbank zu betrachten, ist, Firefox mit der „SQLite Manager“-Erweiterung (https://addons.mozilla.org/en-US/firefox/addon/5817/) zu installieren.

    Sobald diese installiert ist, kannst du den SQLite Manager öffnen, indem du Firefox öffnest und auf Tools-->SQLiteManager gehst. Im Hauptmenü der Anwendung gehe auf Database-->Connect Database. Navigiere zu <EigeneDateien>/MyGames/Sid Meier's Civilization V/cache/. Nun achte darauf, dass in der Dateitypenauswahl „All Files“ eingestellt ist, und wähle CIV5CoreDatabase.db aus. Klicke auf OK und schon kannst du den Datenbankinhalt anschauen.



    Die Dateien in dem Cache-Ordner werden gelöscht und ersetzt, wenn das Spiel läuft. Wenn du also Werte verändern möchtest, tu das in den XML-Dateien und nicht direkt hier.


    SQL-Beispiele
    Die folgenden Beispiele können angewandt werden, indem du deiner Mod eine sql-Datei beifügst. Das ist oft ein schnellerer Weg, um viele Einstellungen zu verändern, als von Hand jede einzelne anzupassen.

    --Alle Gebäude und Einheiten außer Siedlern und Spähern nicht mehr baubar machen:
    Code:
    UPDATE Buildings SET 'PrereqTech' = 'TECH_FUTURE_TECH' WHERE Type <> 'BUILDING_PALACE';
    UPDATE Units SET 'PrereqTech' = 'TECH_FUTURE_TECH' WHERE Class <> 'UNITCLASS_SETTLER' and Class <> 'UNITCLASS_SCOUT';
    --Eine andere Art, die Erstellung bestimmter Einheiten zu verhindern:
    Code:
    UPDATE UnitClasses SET MaxPlayerInstances = 0 WHERE Type IN
    ("UNITCLASS_SETTLER","UNITCLASS_ARTIST","UNITCLASS_SCIENTIST","UNITCLASS_MERCHANT","UNITCLASS_ENGINEER");
    --Alle Zivilisationen anzeigen
    Code:
    for civ in DB.Query("select * from Civilizations") do
    	print(civ.Type);
    end
    --Alle Einheiten anzeigen, die mehr als 200 kosten:
    Code:
    for unit in DB.Query("select * from Units where cost > 200") do
    	print(unit.Type);
    end
    Die RGB-Farbwerte der ersten Farbe einer jeden Spielerfarbe anzeigen:
    Code:
    for color in DB.Query("select Colors.Red, Colors.Green, Colors.Blue from PlayerColors inner join Colors on PlayerColors.PrimaryColor
    = Color.Type") do
    	print(string.Format("R: %f, G: %f, B: %f", color.Red, Color.Green, Color.Blue);
    end
    Alle amerikanischen Anführer anzeigen:
    Code:
    local myCiv = "CIVLIZATION_AMERICA";
    for leader in DB.Query("select * from Leaders inner join Civilization_Leaders on Leaders.Type = Civilization_Leaders.LeaderheadType
    where Civilization_Leaders.CivilizationType = ?", myCiv) do
    	print(leader.Type);
    end
    Lua
    Das Verhältnis zwischen XML und Lua
    Benutzeroberflächen in Civ5 sind ein Paar aus XML und Lua. XML legt die Kontrollen und Rangordnung fest, Lua die Logik. XML baut die Oberfläche auf, legt fest, welche Knöpfe wo erscheinen, wie die Tabellen aussehen usw., während Lua die Programmiersprache ist, die kontrolliert, was passiert, wenn man einen Knopf drückt, oder wie eine Tabelle gefüllt wird.

    Befehlsreferenz
    Es gibt viele gute Lua-Programmieranleitungen. Viele davon können bei deinem örtlichen Buchhändler gekauft oder bei Amazon bestellt werden. Eine gute Online-Referenz ist die folgende:
    Lua 5.1 Reference Manual by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes:
    http://www.lua.org/manual/5.1/manual.html

    Ereignisse skripten
    Lua-Skripte können Funktionen in anderen Lua-Skripten nicht direkt aufrufen. Stattdessen gibt es eine Schnittstelle für Lua-Ereignisse, das LuaEvents-Interface, das es Luaskripten ermöglicht, Funktionen hinzuzufügen, die global verfügbar werden.

    Wenn du eine Funktion benötigst, die von einem anderen Luaskript aufgerufen werden kann, musst du eine LuaEvents-Funktion erzeugen, die das übernimmt, wie zum Beispiel:
    Code:
    LuaEvents.ToggleHideUnitIcon.Add(
    function()
    	if (bHideUnitIcon) then
    		bHideUnitIcon = false;
    	else
    		bHideUnitIcon = true;
    	end
    end);
    Obige Funktion ist in der LuaEvents-Engine registriert und kann von jedem Luaskript als
    Code:
    LuaEvents.ToggleHideUnitIcon();
    aufgerufen werden.
    Das wiederum würde die Funktion ToggleHideUnitIcon in dem ersten Skript aufrufen und den bHideUnitIcon-Wert für dieses Skript verändern.
    Angehängte Grafiken Angehängte Grafiken

  4. #4
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    wohooo, der Thread ist sticky

    @Zulan: Gute Idee eigentlich. Aber eher für den Arbeitsschritt „Überarbeiten und Formatieren“ bzw. „alles in ein pdf umwandeln“ - im Moment habe ich mit den Texten noch genug zu kämpfen.



    Eine Mod erstellen
    Folge diesen Schritten, um mit deiner eigenen Mod anzufangen. (Screenshots können ein wenig anders aussehen als in der Releaseversion, weil ich Betaversionen all der Werkzeuge verwende, um dieses Dokument zu erstellen.)

    1.Lade den ModBuddy (das Sid Meier's Civilization V SDK)

    2.Im Hauptmenü des ModBuddy wähle „Neue Mod“
    3.Wähle „Leere Mod“, gib unserer Mod einen Namen und klicke auf OK.
    4.In dem „Allgemeine Informationen“-Bildschirm trage Titel, Autor und Beschreibung der Mod ein. Beachte, dass Titel und Beschreibung mindestens acht Zeichen lang sein müssen. In diesem Beispiel habe ich „Legends of Civilization“ und den Titel gewählt, meinen Namen als den des Autors sowie eine kurze Beschreibung eingetragen.
    Sobald das getan ist, wähle „Weiter“. Das ist alles, was du brauchst, um eine neue Mod zu erstellen. Die Mod macht bisher noch nichts. Dazu kommen wir in späteren Kapiteln.


    Dein Projekt organisieren
    Es gibt im ModBuddy keine zwingend notwendige Ordnerstruktur für dein Modprojekt. Modder können ihre Dateien dort ablegen, wo es ihnen und ihrem Projekt passt. Viele fangen vielleicht an, indem sie Dateien im Hauptordner des Projekts erstellen, aber wenn das Projekt wächst, kann es frustrierend und Zeitverschwendung sein, alle Dateien an einer Stelle zu haben.

    Dateien umzubenennen, zu verschieben oder zu löschen geht ziemlich leicht, wenn du sie später anders anordnen willst (normalerweise wird auf Dateien nicht mit ihrem Pfad verwiesen).

    Ich würde empfehlen, aus deinem Projekt drei Ordner zu machen: Art, Lua, XML. Diese dienen als eine gute Grundlage dafür, die verschiedenen Dateitypen voneinander zu trennen, mit denen wir arbeiten werden. Innerhalb dieser Ordner neige ich dazu, derselben Ordnerstruktur zu folgen, die Firaxis bei Civ5 genutzt hat, weil die zum einen so gut ist wie jede andere auch und mir zum anderen hilft, mich daran zu erinnern, wo sich was befindet, wenn alles konsistent aufgebaut ist. Zum Beispiel habe ich im XML-Ordner einen „Zivilisationen“-Ordner angelegt, um darin neue Zivilisationen-XML-Dateien unterzubringen.

    Es gibt keinen Grund, Ordner anzulegen, wenn keine Dateien darin sind. Wenn deine Mod also keinerlei Graphiken enthält, kümmere dich nicht darum, einen „Art“-Ordner anzulegen. Wenn deine Mod keine XML-Anführerdateien beinhaltet, leg auch keinen Ordner XML/Leaders an.

    Anmerkung: Das ist eine Art, dein Projekt anzulegen. Es ist ebenso angemessen, das Projekt nach Inhalten statt nach Arten von Inhalten zu gliedern. Du könntest beispielsweise einen Ordner für jede Zivilisation haben, die du dem Spiel hinzufügst. Dieser Ordner würde all die Zivilisations-, Anführer-, Spezialeinheiten-XMLs, Graphiken, Töne und Lua-Dateien für diese Zivilisation enthalten.
    Angehängte Grafiken Angehängte Grafiken

  5. #5
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Wieder sind die Angaben, wie die Menüs und Optionen heißen, cum grano salis zu nehmen - ich habe an diesem Rechner nicht die Möglichkeit, zu überprüfen, wie sie tatsächlich benannt sind, werde das aber später noch nachholen.



    Mod-Einstellungen
    Rechtsklicke auf das Mod-Symbol im Solution-Explorer (?) und wähle „Eigenschaften“, um die Mod-Einstellungen anzuzeigen. Hier sind die Mod-Anweisungen eingestellt und Modder sollten sich mit den Optionen hier vertraut machen (besonders mit dem Actions-Tab), um die Dinge zu aktivieren und einzustellen, die ihre Mod braucht.


    Mod Info- Enthält all die Setup-Informationen, die du eingegeben hast, als du deine Mod erstellt hast. Sie kann aktualisiert werden, wenn du deinem Team neue Mitarbeiter hinzufügst, die Beschreibung abändern willst oder mehr Personen danken möchtest. Dies ist, was die Leute sehen, wenn sie nach Mods suchen.

    Kompatibilität- In der Standardeinstellung werden Mods als kompatibel mit dem Einzel- und mit dem Mehrspielermodus aufgelistet. Diese Optionen zu entmarkieren entfernt diese Kompatibilität. Den Haken zu setzen oder zu entfernen ändert die Mod nicht im geringsten (einfach den Haken bei „unterstützt Mehrspieler“ zu entfernen, ändert eine Mod nicht so, dass sie danach im Mehrspielermodus funktioniert), es bestimmt nur, welche Optionen den Nutzern bei dieser Mod zur Verfügung stehen.

    System- Das Graphiksystem wird vor den Mods geladen. Wenn deine Mod also Landmarken, Anführer oder Einheiten verändert, muss diese Option ausgewählt werden, damit das Spiel diese Graphiken neu laden kann. Zum Beispiel wird eine spätere Mod in diesem Dokument die Größe der Einheitenmodelle ändern. Diese Veränderung wird keine Auswirkungen haben, wenn wir nicht „Einheitensystem neuladen“ („Reload Unit System“) ausgewählt haben.

    Speicherstände- Wenn die Mod Auswirkungen auf Speicherstände hat, muss diese Einstellung ausgewählt werden. Das ist standardmäßig der Fall. Diese Einstellung nicht zu wählen, bedeutet, dass Speicherstände, die angelegt werden, wenn diese Mod läuft, auch von dem Spiel ohne die Mod geladen werden können. Das ist vielleicht nur bei Programmoberflächen- und Balance-Mods möglich, die keine Inhalte zu dem Spiel hinzufügen oder aus ihm entfernen. Wenn du etwas ergänzt, wie eine neue Zivilisation, wird deine Mod Speicherstände betreffen (weil das Grundspiel deine Zivilisation nicht beinhaltet und in dem Versuch, auf sie zu verweisen, abstürzen wird). Wie bei der Kompatibilität gilt auch hier: Diese Option zu wählen oder nicht verändert deine Mod nicht und macht deine Speicherstände demnach auch nicht verträglicher oder unverträglicher mit dem Grundspiel.

    Associations-Hier werden die Beziehungen zu anderen Mods spezifiziert. Es gibt drei Arten:
    Abhängigkeiten – Mods, die erforderlich sind, bevor deine Mod geladen werden kann.
    Referenzen – Optionale Mods, die geladen werden können, um mit deiner Mod zusammenzuarbeiten (wichtig, wenn du eine teilweise oder vollständig exklusive Mod benutzt)
    Blockaden – Mods, die hier aufgelistet werden, können nicht gemeinsam mit deiner Mod geladen werden.

    Actions – Aktionen sind nötig, um dem Spiel mitzuteilen, welche Dateien ausgeführt werden müssen, wenn deine Mod geladen wird. Normalerweise wird es nichts ändern, deiner Mod Dateien beizulegen, solange hier keine Aktion eingestellt ist, die Datenbank mit deiner Datei zu aktualisieren. Bedenke, dass XML nicht direkt vom Spiel benutzt wird; das Spiel benutzt die Datenbank, also muss deine Mod die Datenbank mit unseren XML-Dateien erneuern.
    Das üblichste „Set“, das du brauchen wirst, ist „OnModActivated“ (d.h. das, was dazu gedacht ist, beim Laden deiner Mod angewandt zu werden) und der gewöhnlichste Typ ist „UpdateDatabase“ (anzuwenden auf die festgelegte XML-Datei). Ein Beispiel einer Mod mit angewandten XML-Dateien ist im folgenden Bildschirmphoto zu sehen:

    Beachte, dass dies eine einfache Möglichkeit bietet, unserer Mod zwecks Fehlersuche XML-Dateien hinzuzufügen oder zu entfernen. Wenn ich glaube, ein Absturz liegt an meiner CIV5Specialists.xml-Datei, kann ich sie aus der Aktionenliste entfernen, sodass sie nicht angewandt wird, und ein wenig testen. Ich muss die Datei nicht wirklich aus der Mod entfernen.

    Inhalt- Der Inhaltsbildschirm legt bestimmte Dateiarten innerhalb der Mod fest, ähnlich wie der Aktionenbildschirm für Datenbankaktualisierungen verwendet wird. Die folgenden Inhaltsarten stehen zur Verfügung:
    CityViewUIAddin- Fügt die Benutzeroberfläche der Stadtansicht hinzu.
    Custom-Eine eigene Oberfläche, die zum „eigenes Spiel“-Menü hinzugefügt wird.
    DiplomacyUIAddin- Fügt die Benutzeroberfläche dem Diplomatie-Basisbildschirm hinzu.
    InGameUIAddin- Fügt die Oberfläche dem Haupt-Spielbildschirm hinzu.
    Map-Eine Worldbuilder-Karte (muss nicht definiert sein, damit diese Karte nutzbar ist, nur, damit sie veröffentlicht wird und Benutzeroberflächen von ihr wissen)
    MapScript- Ein Lua-Kartenskript (muss nicht definiert sein, damit diese Karte nutzbar ist, nur, damit sie veröffentlicht wird und Benutzeroberfläche von ihr wissen.)

    Ein Objekt erstellen
    Mit dem ModBuddy neue Inhalte zu erstellen ist sehr leicht. Dieses Dokument wird später einige detaillierte Anleitungen durchgehen. Aber das übergeordnete Vorgehen ist, dass im ModBuddy eine XML-Datei erstellt wird. In dieser XML-Datei muss sich ein GameData-Element befinden. In diesem GameData-Element (soll heißen, zwischen dem Starttag <GameData> und dem Endtag </GameData>) muss es ein Element geben, das die Art des Inhalts festlegt. In jenem Element wiederum muss ein Row-Element sein und darin gibt es all die objektspezifischen Attribute als Elemente.
    Das folgende ist ein Beispiel dafür, einen neuen Bonushütteneintrag hinzuzufügen. Die Zeilennummern stehen hier nur zu Verweiszwecken, in dem echten XML gäbe es die nicht.
    Code:
    1. <GameData>
    2.	 <GoodyHuts>
    3.		<Row>
    4.			<Type>GOODY_SKELETON</Type>
    			<Description>TXT_KEY_GOODY_SKELETON</Description>
    			<Sound>AS2D_GOODY_WARRIOR</Sound>
    			<UnitClass>UNITCLASS_SKELETON</UnitClass>
    5.		</Row>
    6. 	</GoodyHuts>
    7. </GameData>
    1.Die erste Zeile ist der Anfang des GameData-Elements. Das ist es, was dem Spiel mitteilt, dass wir vorhaben, ein bisschen neues XML zu übergeben.
    2.Als nächstes haben wir eine Eröffnung abhängig davon, welche Art Inhalt wir erstellen wollen. Wenn es eine Zivilisation ist, ist das <Civilizations>; wenn wir einen Anführer erstellen <Leaders>; bei einer Einheit <Unit>. Die einfachste Möglichkeit, herauszufinden, was das richtige Kennzeichen ist, ist es, nach einer vorhandenen Definition für etwas derselben Art zu schauen. In diesem Beispiel nutze ich die Definition für eine Bonushütte. Der Dateiname im ModBuddy ist unwichtig, der Ordner im ModBuddy ist unwichtig. Aus diesem Eintrag erfährt das Spiel, welche Art Inhalt wir hinzufügen.
    3.<Row> ist der XML-Tag, der dem System sagt, dass wir einen Eintrag des in der Zeile davor festgelegten Typs anfangen wollen.
    4.Dies ist der Anfang der objektspezifischen Eigenschaften. Die genauen Attribute sind je nach Objekttyp unterschiedlich. Sieh bei ähnlichen Inhalten nach, um Beispiele zu finden, oder in dem Schema am Anfang der XML-Dateien, um zu sehen, was es so alles gibt.
    5.Jedes Element, das wir in XML anfangen, müssen wir auch wieder abschließen. Wir müssen dem System sagen, dass wir mit dem Row-Element fertig sind. Um das <Row>-Element abzuschließen, ergänzen wir ein </Row>-Kennzeichen.
    6.Wie wir das <Row>-Element schließen mussten, müssen wir auch das <GoodyHuts>-Element zum Abschluss bringen. In diesem Fall mit einem </GoodyHuts>-Tag.
    7.Und schließlich schließen wir das <GameData>-Element mit </GameData>.

    Obiges Beispiel zeigt einen Inhalt, der nur eine Tabelle hat. Aber die meisten Inhalte in Civ V haben mehrere Tabellen. Betrachte folgendes für den Ingenieursspezialisten:
    Code:
    <GameData>
    	<Specialists>
    		<Row>
    			<Type>SPECIALIST_ENGINEER</Type>
    			<Description>TXT_KEY_SPECIALIST_ENGINEER</Description>
    			<Strategy>TXT_KEY_SPECIALIST_ENGINEER_STRATEGY</Strategy>
    	                <GreatPeopleTitle>TXT_KEY_SPECIALIST_ENGINEER_TITLE</GreatPeopleTitle>
    			<Visible>true</Visible>
    			<Cost>0</Cost>
    	    	        <GreatPeopleUnitClass>UNITCLASS_ENGINEER</GreatPeopleUnitClass>
    			<GreatPeopleRateChange>3</GreatPeopleRateChange>
    			<IconAtlas>CITIZEN_ATLAS</IconAtlas>
    			<PortraitIndex>1</PortraitIndex>
    		</Row>
    	</Specialists>
    	<SpecialistYields>
    		<Row>
    			<SpecialistType>SPECIALIST_ENGINEER</SpecialistType>
    			<YieldType>YIELD_PRODUCTION</YieldType>
    			<Yield>1</Yield>
    		</Row>
    	</SpecialistYields>
    </GameData>
    Hier haben wir es mit zwei Tabellen zu tun: Specialists und SpecialistYields. Wenn auch mit etwas komplexerem Format (und anders als dies in Civ IV gehandhabt wurde) werden diese Tabellen gemäß dem Schema am Anfang der Datei definiert. Der einzige wirkliche Nachteil dieses Vorgehens ist, dass es manchmal schwer ist, alle Eigenschaften zu sehen, die zu einem bestimmten Inhalt beitragen. Die Datei für Rohstoffe beispielsweise beinhaltet sieben Tabellen, die es etwas qualvoll machen, alle Attribute zu finden, die für eine bestimmte Eigenschaft gesetzt werden. Stell also sicher, dass du, wenn du die Informationen für einen Inhalt kopierst, auch alle Informationen darüber in der jeweiligen Datei findest. Auch wenn sie sich auf mehr als eine Tabelle verteilen.
    Angehängte Grafiken Angehängte Grafiken

  6. #6
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Wann es weitergeht? Jetzt endlich. Entschuldigt.


    Ein Objekt aktualisieren
    Manchmal möchtest du keinen neuen Inhalt hinzufügen, sondern nur einen Spielinhalt im Grundspiel verändern.
    Das ist leicht: Füg ein <Update>-Element zwischen den Inhalts-Tags hinzu (wo normalerweise das <Row>-Element steht).

    Ein Update-Element hat zwei Unterelemente: ein <Set>-Element und ein <Where>-Element.
    Set Dieses Element verwendet ein XML-Attribut, um zu bestimmen, welche Änderung erfolgen soll. Wie etwa <Set Combat=“20“/>
    Where- Dieses Element bestimmt unsere Übereinstimmungsbedingung. Wo wir die Veränderung stattfinden lassen wollen. Wie „<Where Type=“UNIT_JAPANESE_SAMURAI“/>.

    Beachte, dass es (aus XML-Sicht) keinen Unterschied zwischen <Set Combat=“20“></Set> und <Set Combat=“20“/> gibt. Den Schrägstrich als letztes Zeichen in den Tag einzuschließen ist eine andere Möglichkeit, das Element abzuschließen. Wir machen das meistens nicht, weil wir Daten zwischen Start- und Ende-Tag unterbringen müssen. Aber in Fällen wie diesem, da es keine Daten zwischen den Tags gibt, ist es ein bisschen sauberer, das Element im Starttag zu beenden.

    Lass uns das für eine Änderung zusammenstellen. In Civ 5 erhöhen Ingenieursspezialisten und Bürger die Produktion beide um 1. Aber in unserer Mod wollen wir, dass Ingenieure die Produktion um 2 anheben. Das ist die SpecialistsYields-Tabelle in Civ 5 (der Teil, der den Ertrag des Ingenieurs festsetzt, ist blau hervorgehoben):
    Code:
    <GameData>
    	<SpecialistYields>
    		<Row>
    		<SpecialistType>SPECIALIST_CITIZEN</SpecialistType>
    		<YieldType>YIELD_PRODUCTION</YieldType>
    		<Yield>1</Yield>
    		</Row>
    		<Row>
    			<SpecialistType>SPECIALIST_MERCHANT</SpecialistType>
    			<YieldType>YIELD_GOLD</YieldType>
    			<Yield>2</Yield>
    		</Row>
    		<Row>
    			<SpecialistType>SPECIALIST_SCIENTIST</SpecialistType>
    			<YieldType>YIELD_SCIENCE</YieldType>
    			<Yield>3</Yield>
    		</Row>
    		<Row>
    			<SpecialistType>SPECIALIST_ENGINEER</SpecialistType>
    			<YieldType>YIELD_PRODUCTION</YieldType>
    			<Yield>1</Yield>
    		</Row>
    	</SpecialistYields>
    </GameData>
    Um den Ertrag auf 2 anzuheben brauchen wir folgende Aktualisierung (die Zeilennummern dienen nur zu Verweiszwecken und sollten im tatsächlichen Code nicht existieren):
    Code:
    1. <GameData>
    2.	 <SpecialistYields>
    3.		<Update>
    4.			<Set Yield="2"/>
    5.			<Where SpecialistType="SPECIALIST_ENGINEER"/>
    6.		</Update>
    7. 	</SpecialistYields>
    8. </GameData>
    1.Das ist der Anfang des GameData-Elements. Es sagt dem Spiel, dass wir neues XML übergeben wollen.
    2.Als nächstes haben wir hier den Namen der Tabelle. Die Tabelle, die wir aktualisieren wollen, ist SpecialistYields, also ist das Startelement <SpecialistYields>.
    3.Beim Hinzufügen hatten wir an dieser Stelle <Row>, um anzuzeigen, dass wir einen neuen Eintrag anfangen wollten. Um aber einen Inhalt zu aktualisieren benutzen wir hier die <Update>-Kennzeichnung.
    4.Wie oben besprochen gibt es im <Update>-Eintrag zwei Elemente. Das erste ist Set. In diesem Beispiel setzen wir den Ertrag (Yield) mit <Set Yield=“2“/> auf 2.
    5.Das ist der Bedingungsanteil des Aktualisierungsausdrucks. Die Aktualisierung weiß schon, dass sie Yield auf 2 setzen muss, aber hier erzählen wir ihr, um welches Yield es sich handelt. In diesem Fall befiehlt ihr <Where SpecialistType=“SPECIALIST_ENGINEER“/>, die Erträge auf 2 zu setzen, wenn das SpecialistType-Element genau SPECIALIST_ENGINEER lautet, also bei Ingenieursspezialisten.
    6.Das ist das Ende des <Update>-Elements.
    7.Das ist das Ende des <SpecialistYields>-Elements.
    8.Und das schließt das <GameData>-Element ab.

    Mehrfache Bedingungen bei Aktualisierungen
    Manchmal werden wir es wollen, dass unsere Aktualisierung auf mehr als ein Element achtet, bevor sie etwas ändert. Angenommen, wir wollen den Nahrungsertrag von Walen von 1 auf 2 erhöhen. Betrachte den folgenden Auszug aus der Resource_YieldChanges-Tabelle:
    Code:
    <Resource_YieldChanges>
    	<Row>
    		<ResourceType>RESOURCE_BANANA</ResourceType>
    		<YieldType>YIELD_FOOD</YieldType>
    		<Yield>1</Yield>
    	</Row>
    	<Row>
    		<ResourceType>RESOURCE_WHALE</ResourceType>
    		<YieldType>YIELD_FOOD</YieldType>
    		<Yield>1</Yield>
    	</Row>
    	<Row>
    		<ResourceType>RESOURCE_WHALE</ResourceType>
    		<YieldType>YIELD_GOLD</YieldType>
    		<Yield>1</Yield>
    	</Row>
    </Resource_YieldChanges>
    Um unser Ziel zu erreichen, könnten wir folgendes ausprobieren:
    Code:
    <GameData>
    	<Resource_YieldChanges>
    		<Update>
    			<Set Yield="2"/>
    			<Where ResourceType="RESOURCE_WHALE"/>
    		</Update>
    	</Resource_YieldChanges>
    <GameData>
    Aber weil das sowohl zu den Zeilen mit Nahrung und Gold passt (grün und blau in dem Auszug), würden beide diese Erträge auf 2 erhöht.
    Wir könnten auch das versuchen:
    Code:
    <GameData>
    	<Resource_YieldChanges>
    		<Update>
    			<Set Yield="2"/>
    			<Where YieldType="YIELD_FOOD"/>
    		</Update>
    	</Resource_YieldChanges>
    <GameData>
    Aber in diesem Fall würden wir den Nahrungsertrag aller Rohstoffe auf 2 setzen, darunter in unserem Auszug Bananen (rot) und Wale (grün).
    Wir brauchen die Möglichkeit, ein von mehreren Bedingungen abhängiges Argument einzusetzen, was wir schaffen können, indem wir dem Where-Element mehrere Attribute hinzufügen, wie hier:
    Code:
    <GameData>
    	<Resource_YieldChanges>
    		<Update>
    			<Set Yield="2"/>
    			<Where ResourceType="RESOURCE_WHALE" YieldType="YIELD_FOOD"/>
    		</Update>
    	</Resource_YieldChanges>
    <GameData>
    Beachte, dass hier keine logische Verknüpfung zwischen den beiden Attributen steht. Attribute werden mit UND zusammengefügt; Elemente müssen alle Bedingungen erfüllen, bevor die Aktualisierung angewandt wird. Wenn du ODER benutzen willst (Änderung wird angewandt, wenn irgendeine Bedingung erfüllt wird), solltest du eigene Update-Elemente erstellen, die jeweils auf ein Kriterium ansprechen.

    Ein Objekt löschen
    Einen Inhalt zu entfernen erfordert es, das Delete-Element mit einer Eigenschaft, auf die es ansprechen soll, an Stelle des Row-Elements zu verwenden.
    Zum Beispiel würde der folgende Code die Zivilisation Amerika aus dem Spiel entfernen:
    Code:
    <GameData>
    	<Civilizations>
    		<Delete type="CIVILIZATION_AMERICA"/>
    	</Civilizations>
    </GameData>
    Nachdem du „Add“ und „Update“ kennen gelernt hast, sollte dir die Syntax vertraut vorkommen. Es ist egal, auf welche Eigenschaft das Delete reagiert (in dem Beispiel habe ich „type“ verwendet), aber sei vorsichtig, wenn du eine nicht eindeutige Eigenschaft benutzt. Wenn du alle Zivilisationen mit der ARTSTYLE_EUROPEAN-Graphik löschst (<Delete ArtStyleType=“ARTSTYLE_EUROPEAN“/>), werden sie alle gelöscht werden, das heißt: Wenn eine andere Mod, die der Spieler geladen hat, einen Graphiktyp auf ARTSTYLE_EUROPEAN setzt, wird auch diese Zivilisation gelöscht. Wenn eine andere Mod eine Zivilisation mit ARTSTYLE_EUROPEAN-Graphik hinzufügt, wird deine Mod auch sie entfernen.

    Das Wichtigste, an das man bei der Entfernung von Inhalten denken muss, ist, dass auch all die Verweise darauf aufgeräumt werden müssen, wenn deine Mod ohne Fehler laden soll. Verweise in Civ5 weisen immer in eine Richtung: Ein Inhalt verweist auf einen anderen, die Inhalte verweisen nicht aufeinander. Manchmal ist es nicht offensichtlich, welcher Inhalt auf welchen verweist. Zum Beispiel verweist die Zivilisations-Datei auf die Spezialeinheit (CIVILIZATION_AMERICA verweist auf UNIT_AMERICAN_B17), aber die Spezialeinheit nicht auf die Zivilisation, zu der sie gehört. Du könntest also CIVILIZATION_AMERICA ohne Fehler löschen. Wenn du aber UNIT_AMERICAN_B17 allein löschtest, erhieltest du an der Stelle, an der CIVILIZATION_AMERICA darauf zu verweisen suchte, eine Fehlermeldung.

    Diese Verweise sind der schwierigste Teil des Löschens, weil oft schwer zu sagen ist, welche Inhalte auf den, den wir entfernen wollen, verweisen. Besonders, wenn andere Mods auf den Inhalt verweisen, den wir löschen wollen, wenn zum Beispiel eine andere Mod eine Einheit hinzufügt, die auf die Technologie „Dampfmaschine“ angewiesen ist, aber du diese Technologie gelöscht hast. Daher ist es vielleicht am besten, wenn eine Mod, die Grundspielinhalte löscht, eine exklusive Mod ist. Du kannst keine Verträglichkeit mit anderen Mods annehmen, wenn du Standardinhalte aus dem Spiel entfernst.

    Eine andere Variante ist es, Inhalte zu deaktivieren ohne sie zu löschen. Ob das möglich ist, hängt von der Art des Inhalts ab. Beim Entfernen einer Zivilisation ist es vielleicht am besten, sie unspielbar zu machen:
    Code:
    <GameData>
    	<Civilizations>
    		<Update>
    			<Set Playable="0" />
    			<Where Type="CIVILIZATION_AMERICA" />
    		</Update>
    	</Civilizations>
    </GameData>
    Ein Delete-Eintrag ohne Bedingungen passt auf alles, löscht also auch alles. Folgendes löscht alle Zivilisationen aus dem Spiel:
    Code:
    <GameData>
    	<Civilizations>
    		<Delete />
    	</Civilizations>
    <GameData>
    Alle Inhalte zu entfernen, ist auch ein großer Schritt. Denke daran, dass die Reihenfolge in der Datei eine Rolle spielt. Wenn du also eine Zivilisation hinzufügen wolltest, nachdem du alle anderen mit obigem Code gelöscht hättest, wolltest du, dass das Hinzufügen nach der vollständigen Löschung stattfände. Wenn du deine Zivilisation vorher hinzufügst, wird sie auch gelöscht.
    Dies entfernt auch alle neu hinzugefügten Zivilisationen aus Mods, die vor deiner geladen wurden.

  7. #7
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Ich meine, irgendwo hätte etwas davon gestanden, dass man seiner Mod auch gleich eine .sql-Datei mit SQL-Befehlen hinzufügen könnte. (Von Kael empfohlen, um viele Änderungen auf einmal vorzunehmen; aber das heißt ja nicht, dass kleine, einzelne Änderungen damit nicht möglich wären.) Das müsste doch eine gute Möglichkeit für diejenigen sein, die diese in XML verpackte Variante nicht mögen, oder?

    Ein neuer Abschnitt; diesmal mit etwas konkreteren Anleitungen.



    Anleitung: Text hinzufügen
    Text ist ein Spielinhalt, ganz ähnlich Zivilisationen, Anführern und Einheiten. Der Inhaltstyp für englischen Text ist <Language_en_US>, genauso wie der Typ für Zivilisationen <Civilizations> ist. Das <Row>-Element wird benutzt, um neuen Text hinzuzufügen, aber mit dem Text müssen wir in dieses Row-Element ein Attribut einfügen, um das Kennzeichen zuzuweisen.



    In dem Bildschirmphoto haben wir im ModBuddy neue Textkennzeichen hinzugefügt. Das Kennzeichen legt fest, wie das Spiel auf die Text-Zeichenkette verweist, der Eintrag in <Text></Text> ist, was das Spiel in dieser Sprache anzeigt, wenn auf diesen Text verwiesen wird. Wenn in obigem Beispiel also auf TXT_KEY_CIV_CELT_DESC verwiesen wird (wie wir in dem Abschnitt „Anleitung: Eine Zivilisation hinzufügen“ in diesem Dokument sehen werden), wird das Spiel also „Celtic Empire“ anzeigen, wenn Englisch die eingestellte Sprache ist.

    Um Obiges hinzuzufügen, folge diesen Schritten:
    1.Erstelle einen XML-Ordner in deinem Projektordner, wenn du noch keinen hast. Das ist nicht zwingend notwendig, hilft uns aber, das Projekt zu organisieren.
    2.Erstelle einen „New Text“-Ordner in deinem XML-Ordner. Das ist auch nicht erforderlich, hilft aber auch, das Projekt zu organisieren. Ich habe „New Text“ als Ordnernamen gewählt, weil Firaxis das mit dem Textordner genauso gemacht hat. Das sollte aber unabhängig vom Ordnernamen funktionieren.
    3.Erstelle im NewText-Ordner eine XML-Datei und nenne sie GameText.xml. Wie oben ist der Name nicht erforderlich, hilft uns aber zu wissen, dass dies die XML-Datei ist, in der wir unsere Textdefinitionen ablegen werden. Es wäre genauso gut möglich, sie Legends_text.xml, Celt_Civ_text.xml, Cabbage.xml oder irgendwie anders zu nennen.
    4.Füll die Datei mit den Textdefinitionen aus dem Bildschirmphoto. Lass uns einen Blick auf einen der Werte werfen:
    Code:
    <GameData>
            <Language_en_US>
                    <Row Tag="TXT_KEY_CIV_CELT_DESC">
                            <Text>Celtic Empire</Text>
                    </Row>
            </Language_en_US>
    </GameData>
    In dem Abschnitt wird ein neuer Language_en_US-Inhalt (englischer Text) hinzugefügt. Der Text wird immer verwendet werden, wenn im XML TXT_KEY_CIV_CELT_DESC steht; er wird Spielern (mit englischer Spracheinstellung) dann als „Celtic Empire“ angezeigt werden.

    Text ändern
    Vielleicht wollen wir auch schon im Grundspiel vorhandenen Text ändern. Man überschreibt die alte Definition genau so, wie man ein Attribut verändert. Am Anfang möchtest du möglicherweise nach der alten Definition schauen. Du kannst die Grundspieltexte irgendwo in „<Installationsordner>\assets\Gameplay\XML\NewText\“ finden.

    Wenn wir diese Dateien durchsehen, können wir in der CIV5ModdingText.xml folgendes finden:
    Code:
    <Row Tag="TXT_KEY_MODDING_LIKE_IT">
    	<Text>Like it</Text>
    </Row>
    <Row Tag="TXT_KEY_MODDING_FLAG_MODERATION">
    	<Text>Report</Text>
    </Row>
    Wenn du dir einen Spaß machen willst (oder annimmst, dass deine Mod so anstößig ist, dass du mehr „Mod melden“-Klicks als „Mag ich“s bekommen wirst), kannst du diese Texte vertauschen, indem du folgendes in deine Mod einfügst:
    Code:
    <GameData>
    	<Language_en_US>
    		<Update>
    			<Where Tag=" TXT_KEY_MODDING_LIKE_IT "/>
    			<Set Text="Report"/>
    		</Update>
    		<Update>
    			<Where Tag=" TXT_KEY_MODDING_FLAG_MODERATION"/>
    			<Set Text="Like It"/>
    		</Update>
    	</Language_en_US>
    </GameData>
    Genau wie beim Ändern anderer Attribute können wir Update verwenden, um Texte zu ändern. Das Attribut, auf das wir dazu unsere Bedingung ansetzen müssen, ist „Tag“.

    Anleitung: Eine Zivilisation hinzufügen
    In diesem Abschnitt werden wir den gesamten Ablauf, dem Spiel eine Zivilisation hinzuzufügen, durchgehen. Schauen wir zuerst auf die Schema-Definition aus der Datei CIV5Civilizations.xml für eine Zivilisation:
    Code:
    <Table name="Civilizations">
    	<Column name="ID" type="integer" primarykey="true" autoincrement="true"/>
    	<Column name="Type" type="text" notnull="true" unique="true"/>
    	<Column name="Description" type="text"/>
    	<Column name="Civilopedia" type="text"/>
    	<Column name="CivilopediaTag" type="text"/>
    	<Column name="Strategy" type="text" default="Ask Paul"/>
    	<Column name="Playable" type="boolean" default="true"/>
    	<Column name="AIPlayable" type="boolean" default="true"/>
    	<Column name="ShortDescription" type="text" default="NULL"/>
    	<Column name="Adjective" type="text" default="NULL"/>
    	<Column name="DefaultPlayerColor" type="text" default="NULL"/>
    	<Column name="ArtDefineTag" type="text" default="NULL"/>
    	<Column name="ArtStyleType" type="text" default="NULL"/>
    	<Column name="ArtStyleSuffix" type="text" default="NULL"/>
    	<Column name="ArtStylePrefix" type="text" default="NULL"/>
    	<Column name="DerivativeCiv" type="text" default="NULL"/>
    	<Column name="PortraitIndex" type="integer" default="-1"/>
    	<Column name="IconAtlas" type="text" default="NULL" reference="IconTextureAtlases(Atlas)"/>
    	<Column name="AlphaIconAtlas" type="text" default="NULL" reference="IconTextureAatlases(Atlas)"/>
    	<Column name="MapImage" type="text" default="NULL"/>
    	<Column name="DawnOfManQuote" type="text" default="NULL"/>
    	<Column name="DawnOfManImage" type="text" default="NULL"/>
    	<Column name="DawnOfManAudio" type="text" default="NULL"/>
    </Table>
    <Table name="Civilization_BuildingClassOverrides">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="BuildingClassType" type="text" notnull="true" reference="BuildingClasses(Type)“/>
    	<Column name="BuildingType" type="text" reference="Buildings(Type)"/>
    </Table>
    <Table name="Civilization_CityNames">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="CityName" type="text" notnull="true"/>
    </Table>
    <Table name="Civilization_DisableTechs">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="TechType" type="text" reference="Technologies(Type)"/>
    </Table>
    <Table name="Civilization_FreeBuildingClasses">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="BuildingClassType" type="text" reference="BuildingClasses(Type)"/>
    </Table>
    <Table name="Civilization_FreeTechs">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="TechType" type="text" reference="Technologies(Type)"/>
    </Table>
    <Table name="Civilization_FreeUnits">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="UnitClassType" type="text" reference="UnitClasses(Type)"/>
    	<Column name="UnitAIType" type="text" reference="UnitAIInfos(Type)"/>
    	<Column name="Count" type="integer"/>
    </Table>
    <Table name="Civilization_Leaders">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="LeaderheadType" type="text" reference="Leaders(Type)"/>
    </Table>
    <Table name="Civilization_UnitClassOverrides">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="UnitClassType" type="text" notnull="true" reference="UnitClasses(Type)"/>
    	<Column name="UnitType" type="text" reference="Units(Type)"/>
    </Table>
    <Table name="Civilization_Start_Along_Ocean">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="StartAlongOcean" type="boolean" default="false"/>
    </Table>
    <Table name="Civilization_Start_Along_River">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="StartAlongRiver" type="boolean" default="false"/>
    </Table>
    <Table name="Civilization_Start_Region_Priority">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="RegionType" type="text" reference="Regions(Type)"/>
    </Table>
    <Table name="Civilization_Start_Region_Avoid">
    	<Column name="CivilizationType" type="text" reference="Civilizations(Type)"/>
    	<Column name="RegionType" type="text" reference="Regions(Type)"/>
    </Table>
    Werfen wir einen Blick auf diese Werte im Einzelnen:
    ID-Das ist die Zeile, die die Datenbank beginnt. Sie wird beim ersten Eintrag auf 0 gesetzt, sollte aber nicht verändert werden.
    Type Das ist der Schlüssel, den wir verwenden werden, um auf diese Zivilisation zu verweisen. In der Regel verwenden wir CIVILIZATION_<Name> (also CIVILIZATION_CANADA für Kanada). Wir behalten den Objekttyp als ersten Namensbestandteil, damit wir ihn nicht mit einem anderen Objekttypen desselben Namens verwechseln und er leicht zu lesen und zuzuordnen ist. Typen müssen einzigartig sein. (Du kannst keine zwei CIVILIZATION_CANADAs haben.) Wenn zwei Objekte gleichen Typs geladen werden, wird der zweite den ersten ersetzen.
    Description- Das ist der Beschreibungstext der Zivilisation, für Amerika ist das „Amerikanisches Reich“.
    Civilopedia- Wird in Civ5 nicht verwendet.
    CivilopediaTag- Der Starttext für den Zivilopädieeintrag.
    Strategy- Wird in Civ5 nicht verwendet. (Auch wenn die Leute von Firaxis an ihrer Standardeinstellung einigen Spaß hatten.)
    Playable- Wenn das „true“ ist, können Menschen diese Zivilisation auswählen. Ist der Wert „falso“, wird sie nicht verfügbar sein. Beachte, dass true die Standardeinstellung ist, Zivilisationen also spielbar sein werden, wenn der Mod-Ersteller das nicht ausdrücklich anders einstellt.
    AIPlayable- Ist dies „true“, kann die KI diese Zivilisation nehmen, wenn sie bei Spielstart zufällig eine Zivilisation auswählt. Ist es auf „false“ gesetzt, wird die KI sie niemals wählen. Wie bei „Playable“ ist die Standardeinstellung „true“, solange der Modder das nicht ändert. Sowohl Playable als auch AIPlayable auf false zu setzen, ist eine gute Möglichkeit, eine Zivilisation aus dem Spiel zu entfernen, ohne die Inhalte tatsächlich zu löschen (sodass du andere Mods, die darauf verweisen, nicht zerstörst).
    ShortDescription-Der Kurzbeschreibungstext für diese Zivilisation. Für Amerika ist das „Amerika“.
    Adjective- Der Text für die Beschreibung von Sachen, die zu dieser Zivilisation gehören. Für Amerika „amerikanisch“ wie beim „amerikanischen Speerkämpfer“.
    DefaultPlayerColor- Die Standardfarbe für die Grenzen usw. dieser Zivilisation. Dieser Eintrag muss in der Datei CIV5PlayerColors.xml erklärt werden. Es ist nur die „Standard“farbe, weil, falls dieselbe Zivilisation in einem Spiel zweimal vorkommt, der zweiten eine zufällige Farbe zugewiesen wird (damit Spieler sie auseinanderhalten können).
    ArtDefineTag- Wird in Civ5 nicht benutzt.
    ArtStyleType- Legt den Graphikstil für die Gebäude in den Städten dieser Zivilisation fest.
    ArtStyleSuffix- Wird verwendet, um verschiedene Varianten von Modernisierungs- und Wundergraphiken auszuwählen.
    ArtStylePrefix- Wird verwendet, um verschiedene Varianten von Modernisierungs- und Wundergraphiken auszuwählen.
    DervativeCiv- Wird in Civ5 nicht benutzt.
    PortraitIndex- Die Nummer des Symbols in dem Icon-Atlas, das für diese Zivilisation verwendet wird.
    IconAtlas- Der Icon-Atlas, der das Symbol der Zivilisation enthält.
    AlphaIconAtlas- Der Icon-Atlas, der den Alphakanal für dieses Symbol enthält.
    MapImage- Das Bild (eine dds-Datei), das angezeigt wird, wenn die Zivilisation in dem Zivilisationsauswahlmenü ausgewählt wird. Normalerweise handelt es sich dabei um eine Karte der Zivilisation.
    DawnOfManQuote- Der Text, der auf dem Ladebildschirm angezeigt wird.
    DawnOfManImage- Das Bild (als dds-Datei), das auf dem Ladebildschirm angezeigt wird.
    DawnOfManAudio- Die Audio-Datei, die während der Anzeige des Ladebildschirms abgespielt wird, in aller Regel der vorgelesene Text dieses Bildschirms.
    Civilization_BuildingClassOverrides- So werden Spezialgebäude eingebunden. Man kann das verwenden, um Zivilisationen daran zu hindern, ein Gebäude zu bauen, wie diese Änderung, die dafür sorgt, dass Stadtstaaten das Opernhaus von Sydney nicht bauen können:
    Code:
    <Row>
        <CivilizationType>CIVILIZATION_MINOR</CivilizationType>
        <BuildingClassType>BUILDINGCLASS_SYDNEY_OPERA_HOUSE</BuildingClassType>
        <BuildingType/>
    </Row>
    Oder wie diese Änderung, die das Schloss für Indien gegen ein Mughal-Fort austauscht:
    Code:
    <Row>
        <CivilizationType>CIVILIZATION_INDIA</CivilizationType>
        <BuildingClassType>BUILDINGCLASS_CASTLE</BuildingClassType>
        <BuildingType>BUILDING_MUGHAL_FORT</BuildingType>
    </Row>
    Civilization_CityNames- Hierbei handelt es sich um eine Liste der Stadtnamen, die dieser Zivilisation zur Verfügung stehen.
    Civilization_DisableTechs- Jede Technologie, die für eine bestimmte Zivilisation hier eingestellt wird, wird von dieser nicht erforscht werden können.
    Civilization_FreeBuildungClasses- Das sind die freien Gebäude, die eine Zivilisation bei Gründung der ersten Stadt erhält. Der Standardeinstellung zufolge erhält jede Zivilisation einen Palast.
    Civilization_FreeTechs- Die Technologien, mit denen eine Zivilisation das Spiel beginnt.
    Civilization_FreeUnits- Die Starteinheiten. Standard: Alle Zivilisationen bekommen einen freien Siedler.
    Civilization_Leaders- Hier werden die Anführer mit ihren Zivilisationen verknüpft. In Civ5 kann jede Zivilisation nur einen Anführer haben.
    Civilization_UnitClassOverrides- Sehr ähnlich dem Eintrag BuildingClassOverride ist dies die Stelle, an der Spezialeinheiten mit der Einheit eingestellt werden, die sie für diese Zivilisation ersetzen.
    Civilization_Start_Along_Ocean- Wenn für eine Zivilisation dies eingestellt ist, wird das Spiel versuchen, sie in der Nähe der Küste starten zu lassen. Die Standardeinstellung im Schema ist „false“, hier muss also nichts eingestellt werden, wenn der Modder nicht diese Eigenschaft haben will.
    Civilization_Start_Along_River Dasselbe wie bei Start_Along_Ocean.
    Civilization_Start_Region_Priority- Wenn das eingestellt ist, wird das Spiel sich bemühen, die Zivilisation in der angegebenen Region starten zu lassen. Zum Beispiel ist hier bei Arabien Wüste eingestellt.
    Civilization_Start_Region_Avoid- Wenn das eingestellt ist, wird das Spiel versuchen, diese Gegenden zu meiden, wenn es die Startstandorte bestimmt. Zum Beispiel ist Ägypten so eingestellt, dass es möglichst nicht im Dschungel startet.
    Leider gibt es keine vollständige Auflistung, wofür all die Attribute all der Objektarten in Civilization gut sind. Aber wie du aus obigem Schema erkennen kannst, lassen sich die meisten recht leicht herausfinden. Du kannst beispielsweise auch in den XML-Definitionen nachschauen, um Hinweise zu erhalten. Wenn du dich zum Beispiel fragtest, wofür Civilization_FreeUnits sorgt, ist es hilfreich zu sehen, dass jede Zivilisation einen solchen Eintrag für den Siedler hat.

    Jetzt, da wir die Attribute verstehen, die für eine Zivilisation nötig sind, sind wir bereit, dem Spiel eine neue Zivilisation hinzuzufügen.

    1.Erstelle die Ordnerstruktur. Dateiname und Ordnerstruktur spielen eigentlich keine Rolle, aber aus Konsistenzgründen ziehe ich es vor, Firaxis' Ordnerstruktur zu übernehmen. Erstelle einen XML-Ordner in dem Projektordner und darin einen Ordner Civilizations. In diesem Civilizations-Ordner erstelle eine neue Datei namens Civ_Celt.xml.
    Ich habe es am liebsten, wenn jede Zivilisation ihre eigene Datei hat, damit ich leichter die Daten finde und Änderungen vornehmen kann. Aber es ist genauso praktikabel, eine einzige Datei für Zivilisationen zu erstellen, wie Firaxis das gemacht hat, oder all deine XML-Objekte in eine Datei zu packen.
    2.Schreib in die Datei Civ_Celt.xml folgende Informationen:
    Code:
    <GameData>
        <Civilizations>
            <Row>
                <Type>CIVILIZATION_CELT</Type>
                <Description>TXT_KEY_CIV_CELT_DESC</Description>
                <ShortDescription>TXT_KEY_CIV_CELT_SHORT_DESC</ShortDescription>
                <Adjective>TXT_KEY_CIV_CELT_ADJECTIVE</Adjective>
                <Civilopedia>TXT_KEY_CIV_CELT_PEDIA</Civilopedia>
                <CivilopediaTag>TXT_KEY_CIV5_CELT</CivilopediaTag>
                   <DefaultPlayerColor>PLAYERCOLOR_DARK_GREEN</DefaultPlayerColor>
                <ArtDefineTag>ART_DEF_CIVILIZATION_ENGLAND</ArtDefineTag>
                <ArtStyleType>ARTSTYLE_EUROPEAN</ArtStyleType>
                <ArtStyleSuffix>_EURO</ArtStyleSuffix>
                <ArtStylePrefix>EUROPEAN </ArtStylePrefix>
                <PortraitIndex>6</PortraitIndex>
                <IconAtlas>CIV_COLOR_ATLAS</IconAtlas>
                <AlphaIconAtlas>CIV_ALPHA_ATLAS</AlphaIconAtlas>
                <MapImage>MapEngland512.dds</MapImage>
                <DawnOfManQuote>TXT_KEY_CIV5_CELT_TEXT_1</DawnOfManQuote>
                <DawnOfManImage>DOM_Elizabeth.dds</DawnOfManImage>
            </Row>
        </Civilizations>
        <Civilization_CityNames>
            <Row>
                <CivilizationType>CIVILIZATION_CELT</CivilizationType>
                <CityName>TXT_KEY_CITY_NAME_BIBRACTE</CityName>
            </Row>
            <Row>
                <CivilizationType>CIVILIZATION_CELT</CivilizationType>
                <CityName>TXT_KEY_CITY_NAME_VIENNE</CityName>
            </Row>
            <Row>
                <CivilizationType>CIVILIZATION_CELT</CivilizationType>
                <CityName>TXT_KEY_CITY_NAME_TOLOSA</CityName>
            </Row>
        </Civilization_CityNames>
        <Civilization_FreeBuildingClasses>
            <Row>
                <CivilizationType>CIVILIZATION_CELT</CivilizationType>
                <BuildingClassType>BUILDINGCLASS_PALACE</BuildingClassType>
            </Row>
        </Civilization_FreeBuildingClasses>
        <Civilization_FreeTechs>
            <Row>
                <CivilizationType>CIVILIZATION_CELT</CivilizationType>
                <TechType>TECH_AGRICULTURE</TechType>
            </Row>
        </Civilization_FreeTechs>
        <Civilization_FreeUnits>
            <Row>
                <CivilizationType>CIVILIZATION_CELT</CivilizationType>
                <UnitClassType>UNITCLASS_SETTLER</UnitClassType>
                <Count>1</Count>
                <UnitAIType>UNITAI_SETTLE</UnitAIType>
            </Row>
        </Civilization_FreeUnits>
        <Civilization_Leaders>
            <Row>
                <CivilizationType>CIVILIZATION_CELT</CivilizationType>
                <LeaderheadType>LEADER_ELIZABETH</LeaderheadType>
            </Row>
        </Civilization_Leaders>
        <Civilization_Start_Region_Priority>
            <Row>
                <CivilizationType>CIVILIZATION_CELT</CivilizationType>
                <RegionType>REGION_FOREST</RegionType>
            </Row>
        </Civilization_Start_Region_Priority>
    </GameData>
    Das ist die Definition unserer neuen keltischen Zivilisation. Weil wir noch keinen Anführer erstellt haben, verwende ich Elizabeth. Wir haben weder Spezialgebäude (Civilization_BuildingClassOverrides) noch Spezialeinheiten (Civilization_UnitClassOverrides) erstellt, also sind die nicht gesetzt. Ich habe eingestellt, dass die Kelten bevorzugt in bewaldeten Gegenden starten. Ich habe als Standardspielerfarbe der Zivilisation PLAYERCOLOR_DARK_GREEN ausgewählt; du kannst die vollständige Liste verfügbarer Spielerfarben in CIV5PlayerColors.xml finden (wo du auch neue ergänzen würdest).
    Ich habe in dem Beispiel nur drei Stadtnamen verwendet, um das Dokument etwas zu vereinfachen. Für eine echte Zivilisation hätten wir gerne mehr als drei Stadtnamen.
    2.Leg die Texte fest. Wir haben in der Zivilisationsdefinition viele Texte verwendet. Die müssen wir auch in XML definieren. Leg unter XML einen neuen Text-Ordner an und füge dem eine neue Datei hinzu. Ich habe meine GameText.xml genannt.

    Die Zivilopädieeinträge verwenden ein besonderes Format. Das Präfix für die Zivilopädieeinträge ist, was wir in das CivilopediaTag-Attribut geschrieben haben (TXT_KEY_CIV5_CELT). Aber die Zivilopädie ist aus zusammenpassenden Paaren von _HEADING_#- und _TEXT_#-Einträgen aufgebaut. Wenn wir einen Texteintrag für TXT_KEY_CIV5_CELT_HEADING_1 hinzufügen, wird das die Überschrift für den Zivilopädieeintrag und TXT_KEY_CIV5_CELT_TEXT_1 wird der Zivilopädieeintrag unter dieser Überschrift. So können Modder so viele Zivilopädieeinträge für eine Zivilisation hinzufügen, wie sie wollen (dasselbe System wird für Anführer verwendet).

    Aus Faulheit habe ich TXT_KEY_CIV5_CELT_TEXT_1 auch als Ladebildschirmtext verwendet.

    3.Füge der Textdatei das hinzu:
    Code:
    <GameData>
        <Language_en_US>
            <Row Tag="TXT_KEY_CITY_NAME_BIBRACTE">
                <Text>Bibracte</Text>
            </Row>
            <Row Tag="TXT_KEY_CITY_NAME_VIENNE">
                <Text>Vienne</Text>
            </Row>
            <Row Tag="TXT_KEY_CITY_NAME_TOLOSA">
                <Text>Tolosa</Text>
            </Row>
            <Row Tag="TXT_KEY_CIV_CELT_ADJECTIVE">
                <Text>Celtic</Text>
            </Row>
            <Row Tag="TXT_KEY_CIV_CELT_DESC">
                <Text>Celtic Empire</Text>
            </Row>
            <Row Tag="TXT_KEY_CIV_CELT_SHORT_DESC">
                <Text>Celtia</Text>
            </Row>
            <Row Tag="TXT_KEY_CIV5_CELT_HEADING_1">
                <Text>History</Text>
            </Row>
            <Row Tag="TXT_KEY_CIV5_CELT_TEXT_1">
                <Text>The Celts were a diverse group of tribal societies in Iron Age and Roman-era Europe who spoke Celtic
    languages.[NEWLINE][NEWLINE]The earliest archaeological culture commonly accepted as Celtic, or rather Proto-Celtic, was the central
    European Hallstatt culture (ca. 800-450 BC), named for the rich grave finds in Hallstatt, Austria. By the later La Tène period (ca. 450 BC up to the
    Roman conquest), this Celtic culture had expanded over a wide range of regions, whether by diffusion or migration: to the British Isles (Insular
    Celts), the Iberian Peninsula (Celtiberians, Celtici ), much of Central Europe, (Gauls) and following the Gallic invasion of the Balkans in 279 BC as
    far east as central Anatolia (Galatians).[NEWLINE][NEWLINE]The earliest directly attested examples of a Celtic language are the Lepontic
    inscriptions, beginning from the 6th century BC. Continental Celtic languages are attested only in inscriptions and place-names. Insular Celtic is
    attested from about the 4th century AD in ogham inscriptions, although it is clearly much earlier. Literary tradition begins with Old Irish from
    about the 8th century. Coherent texts of Early Irish literature, such as the Táin Bó Cúailnge (The Cattle Raid of Cooley), survive in 12th-century
    recensions. According to the theory of John T. Koch and others, the Tartessian language may have been the earliest directly attested Celtic
    language with the Tartessian written script used in the inscriptions based on a version of a Phoenician script in use around 825
    BC.[NEWLINE][NEWLINE]By the early 1st millennium AD, following the expansion of the Roman Empire and the Great Migrations (Migration
    Period) of Germanic peoples, Celtic culture had become restricted to the British Isles (Insular Celtic), and the Continental Celtic languages
    ceased to be widely used by the 6th century.</Text>
            </Row>
        </Language_en_US>
    </GameData>
    4.Schließlich müssen wir sicherstellen, dass unsere veränderten Dateien die Datenbank aktualisieren. In dem „Actions“-Abschnitt der Mod-Einstellungen müssen wir die folgenden Einträge hinzufügen, um das Spiel dazu zu bringen, unsere xml-Dateien in SQL umzuwandeln und sie beim Laden der Mod in die Spieldatenbank zu schreiben. Dies ist eine der wenigen Stellen, an denen es auf den Dateipfad ankommt; wenn wir unsere Ordner- oder Dateinamen ändern, müssen wir den Eintrag hier im „Actions“-Abschnitt anpassen.


    Danach haben wir eine neue Zivilisation im Spiel. Wir könnten ein paar künstlerische Inhalte gebrauchen, um sie besser aussehen zu lassen, einen neuen zugehörigen Anführer und Spezialeinheit und -gebäude. All das wird in späteren Abschnitten abgedeckt werden.
    Angehängte Grafiken Angehängte Grafiken

  8. #8
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Danke.
    Wieder ein kleines Stückchen Nachschub:


    Anleitung: Ein Symbol hinzufügen
    Jetzt brauchen wir ein Symbol für unsere Zivilisation.
    Firaxis hat uns durch Bereitstellung von Symbolschablonen im Ordner <SDK-Installationsordner>\Art\ als .psd-Dateien geholfen. Es gibt sieben Schablonen: eine für 32x32-Icons, eine für 45x45, 64x64,80x80,128x128,214x214 und 256x256.
    Firaxis hat auch eine Anleitung für Symbolgrößen beigelegt, die für die verschiedenen Inhalte benötigt werden:

    Beförderungen 256, 64, 45, 32
    Gebäude 256, 128, 64, 45
    Bürger 256, 128, 64, 45, 32
    Zivilisationen 256, 128, 80, 64, 45, 32
    Schwierigkeitsgrade 128, 64, 32
    Spielgeschwindigkeiten 128, 64, 32
    Anführer 256, 128, 64
    Naturwunder 256, 128, 80, 64, 45
    Politiken 256, 64
    Rohstoffe 256, 80, 64, 45
    Technologien 256, 214, 128, 80, 64, 45
    Terrain 256, 64
    Einheiten-Aktionen 64, 45
    Einheiten 256, 128, 80, 64, 45
    Einheiten-Fahnen 32
    Kartengrößen 128, 64, 32
    Kartentypen 128, 64, 32

    Das heißt, dass zum Beispiel Zivilisationen ein 256x256, ein 128x128, 80x80, 64x64, 45x45 und 32x32-Symbol brauchen. Wir müssen also sechs Icons verschiedener Größe für unsere Zivilisation erstellen. Wenn ich die Datei IconAtlas256.psd lade, kann ich Photoshop verwenden, um im ersten Feld ein Symbol zu erstellen.

    Ich ziehe Photoshop vor, aber viele Modder verwenden gerne Gimp, was den bedenkenswerten Vorteil hat, frei zu sein. Das Graphikwerkzeug ist nicht wichtig, solange es die .psd-Schablone lesen und die Datei im .dds-Format speichern kann.

    Ich erstelle am liebsten die größte Symbolgröße zuerst, weil wir diese Datei verkleinern werden, um die kleineren Versionen zu speichern. Es ist auch wichtig, dass unser Symbol deutlich und markant ist, nicht nur in der Größe 256x256, sondern auch in 32x32. Vermeide also zu komplexe Designs. (Der keltische Knoten, den ich entworfen habe, ist wahrscheinlich zu komplex, um in Größe 32x32 besonders gut auszusehen, aber reicht aus.)

    Es gibt in der psd-Datei auch einen Alphakanal, der im Normalfall dieselben Kreise bildet, die du in den restlichen Symbolatlanten oben siehst. Der Alphakanal legt fest, was angezeigt wird: Was im Alphakanal weiß ist, wird als Teil des Symbols angezeigt, was schwarz ist, nicht. So weiß das Spiel, was die Ecken des Symbols sind.
    Alle Zivilisationssymbole des Grundspiels sind einfache Kreise, aber meins ist ein wenig extravagant geworden und steht über den Kreis hinaus, deshalb musste ich den Alphakanal anpassen.

    Wenn du das Symbol in der Schablone erstellt hast, speicher es als eine dds-Datei. Vielleicht musst du für das Graphikwerkzeug deiner Wahl bestimmte Erweiterungen herunterladen, damit du dds-Dateien speichern kannst. Ich habe meine Datei CivSymbolsColorLegends256.dds genannt.

    Die 256x256-Schablone ist 2048x2048 Pixel groß (acht 256 Pixel breite Symbole nebeneinander und ebensoviele übereinander). Wenn wir das Bild von 2048x2048 auf 1024x1024 verkleinern, verkleinern wir unsere Symbole zu 128x128 und können die Datei als CivSymbolsColorLegends128.dds speichern. Verkleinern auf 640x640 (80x80) gibt CivSymbolsColorLegends80.dds, und so weiter, bis wir 64x64, 45x45 und 32x32-Symbole erzeugt haben.

    Wenn das erledigt ist, können wir die Dateien unserer Mod hinzufügen, indem wir einen Ordner „Art“ erstellen (auch wenn das nicht nötig ist, erstelle ich ihn, um das Projekt zu organisieren) und unsere Dateien darein verschieben.

    Sobald all unsere Bilddateien dem Projekt hinzugefügt sind, müssen wir auf sie verweisen können. Dazu fügen wir einen neuen Inhalt hinzu: IconTextureAtlases. Erstell in dem XML-Ordner einen „GameInfo“-Ordner und darin eine XML-Datei mit dem Namen CIV5IconTextureAtlases.xml, die folgendes enthält:
    Code:
    <GameData>
    	<IconTextureAtlases>
    		<Row>
    			<Atlas>CIV_COLOR_ATLAS_LEGENDS</Atlas>
    			<IconSize>256</IconSize>
    			<Filename>CivSymbolsColorLegends256.dds</Filename>
    			<IconsPerRow>8</IconsPerRow>
    			<IconsPerColumn>8</IconsPerColumn>
    		</Row>
    		<Row>
    			<Atlas>CIV_COLOR_ATLAS_LEGENDS</Atlas>
    			<IconSize>128</IconSize>
    			<Filename>CivSymbolsColorLegends128.dds</Filename>
    			<IconsPerRow>8</IconsPerRow>
    			<IconsPerColumn>8</IconsPerColumn>
    		</Row>
    		<Row>
    			<Atlas>CIV_COLOR_ATLAS_LEGENDS</Atlas>
    			<IconSize>80</IconSize>
    			<Filename>CivSymbolsColorLegends80.dds</Filename>
    			<IconsPerRow>8</IconsPerRow>
    			<IconsPerColumn>8</IconsPerColumn>
    		</Row>
    		<Row>
    			<Atlas>CIV_COLOR_ATLAS_LEGENDS</Atlas>
    			<IconSize>64</IconSize>
    			<Filename>CivSymbolsColorLegends64.dds</Filename>
    			<IconsPerRow>8</IconsPerRow>
    			<IconsPerColumn>8</IconsPerColumn>
    		</Row>
    		<Row>
    			<Atlas>CIV_COLOR_ATLAS_LEGENDS</Atlas>
    			<IconSize>45</IconSize>
    			<Filename>CivSymbolsColorLegends45.dds</Filename>
    			<IconsPerRow>8</IconsPerRow>
    			<IconsPerColumn>8</IconsPerColumn>
    		</Row>
    		<Row>
    			<Atlas>CIV_COLOR_ATLAS_LEGENDS</Atlas>
    			<IconSize>32</IconSize>
    			<Filename>CivSymbolsColorLegends32.dds</Filename>
    			<IconsPerRow>8</IconsPerRow>
    			<IconsPerColumn>8</IconsPerColumn>
    		</Row>
    	</IconTextureAtlases>
    </GameData>
    Das definiert die dds-Dateien fest, die wir hinzugefügt haben. Der wichtige Teil ist jeweils, dass IconSize festlegt, Symbole welcher Größe die Datei enthält, und IconsPerRow (Symbole pro Zeile) und IconsPerColumn (Symbole pro Spalte) angeben, wie sie angeordnet sind. Beachte auch, dass all die Atlanten denselben Namen haben; was sie unterscheidet, ist, welche Symbolgröße das Spiel braucht. Wenn wir das Spiel also auffordern, das zwölfte Symbol im CIV_COLOR_ATLAS_LEGENDS zu holen, wird es schon genau wissen, dass es das für eine 128x128-Anzeige benötigt und daher in CivSymbolsColorLegends128.dds nachsehen, und weil es weiß, dass die Symbole in einem 8x8-Muster angeordnet sind, weiß es, dass das zwölfte Symbol das dritte in der zweiten Zeile ist (es fängt bei Null an zu zählen).

    Schließlich müssen wir unsere Zivilisationsdefinition anpassen, um das neue Symbol zu verwenden. Wieder in unserer Celt.xml-Datei müssen wir also die blau markierten Änderungen vornehmen:
    Code:
    <GameData>
    	<Civilizations>
    		<Row>
    			<Type>CIVILIZATION_CELT</Type>
    			<Description>TXT_KEY_CIV_CELT_DESC</Description>
    			<ShortDescription>TXT_KEY_CIV_CELT_SHORT_DESC</ShortDescription>
    			<Adjective>TXT_KEY_CIV_CELT_ADJECTIVE</Adjective>
    			<Civilopedia>TXT_KEY_CIV_CELT_PEDIA</Civilopedia>
    			<CivilopediaTag>TXT_KEY_CIV5_CELT</CivilopediaTag>
    			<DefaultPlayerColor>PLAYERCOLOR_DARK_GREEN</DefaultPlayerColor>
    			<ArtDefineTag>ART_DEF_CIVILIZATION_ENGLAND</ArtDefineTag>
    			<ArtStyleType>ARTSTYLE_EUROPEAN</ArtStyleType>
    			<ArtStyleSuffix>_EURO</ArtStyleSuffix>
    			<ArtStylePrefix>EUROPEAN </ArtStylePrefix>
    			<PortraitIndex>0</PortraitIndex>
    			<IconAtlas>CIV_COLOR_ATLAS_LEGENDS</IconAtlas>
    			<AlphaIconAtlas>CIV_ALPHA_ATLAS</AlphaIconAtlas>
    			<MapImage>MapEngland512.dds</MapImage>
    			<DawnOfManQuote>TXT_KEY_CIV5_DAWN_CELT_TEXT</DawnOfManQuote>
    			<DawnOfManImage>DOM_Elizabeth.dds</DawnOfManImage>
    			<DawnOfManAudio/>
    		</Row>
    ...etc
    Das befiehlt der Zivilisation, den neuen Atlas zu verwenden, den wir definiert haben und Symbol 0(das erste Symbol im Atlas) als Zivilisationssymbol zu nutzen. Wenn wir die Mod laden, können wir einen Blick auf das neue Symbol werfen.
    Angehängte Grafiken Angehängte Grafiken

  9. #9
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Danke, es geht schon.
    Der neue Abschnitt ist etwas länger geworden:


    Anleitung: Einen Anführer hinzufügen
    Einen Anführer hinzuzufügen geht so ähnlich wie eine Zivilisation zu ergänzen. Um Boudica zu erstellen, habe ich alle Attribute von Alexander kopiert, weil ich wollte, dass sie so ähnlich handelt wie er. Dann habe ich ArtDefineTag (die Graphik des Anführer-Bildschirms) und PortraitIndex (das Symbol, das sie benutzt) auf die entsprechenden Einträge von Elizabeth abgeändert. Und schließlich habe ich ihre Anführereigenschaft auf Hiawathas Fähigkeit, in Wäldern Gelände zu ignorieren, umgestellt. In späteren Abschnitten werden wir uns anschauen, wie man eine neue Graphik und Eigenschaft für Boudica erstellen kann.

    Das ist Boudicas Anführerdefinition. Ich habe eine neue Datei namens XML/Leaders/CIV5Leader_Bouidica.xml erstellt und im Aktionenbildschirm der Modeigenschaften eingestellt, dass diese Datei die Datenbank aktualisiert.
    Code:
    <GameData>
    	<Leaders>
    		<Row>
    			<Type>LEADER_BOUDICA</Type>
    			<Description>TXT_KEY_LEADER_BOUDICA</Description>
    			<Civilopedia>TXT_KEY_LEADER_BOUDICA_PEDIA</Civilopedia>
    			<CivilopediaTag>TXT_KEY_CIVILOPEDIA_LEADERS_BOUDICA</CivilopediaTag>
    			<ArtDefineTag>Elizabeth_Scene.xml</ArtDefineTag>
    			<VictoryCompetitiveness>8</VictoryCompetitiveness>
    			<WonderCompetitiveness>7</WonderCompetitiveness>
    			<MinorCivCompetitiveness>3</MinorCivCompetitiveness>
    			<Boldness>8</Boldness>
    			<DiploBalance>3</DiploBalance>
    			<WarmongerHate>2</WarmongerHate>
    			<WorkAgainstWillingness>7</WorkAgainstWillingness>
    			<WorkWithWillingness>4</WorkWithWillingness>
    			<PortraitIndex>6</PortraitIndex>
    			<IconAtlas>LEADER_ATLAS</IconAtlas>
    		</Row>
    	</Leaders>
    	<Leader_MajorCivApproachBiases>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MajorCivApproachType>MAJOR_CIV_APPROACH_WAR</MajorCivApproachType>
    			<Bias>7</Bias>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MajorCivApproachType>MAJOR_CIV_APPROACH_HOSTILE</MajorCivApproachType>
    			<Bias>7</Bias>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MajorCivApproachType>MAJOR_CIV_APPROACH_DECEPTIVE</MajorCivApproachType>
    			<Bias>4</Bias>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MajorCivApproachType>MAJOR_CIV_APPROACH_GUARDED</MajorCivApproachType>
    			<Bias>5</Bias>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MajorCivApproachType>MAJOR_CIV_APPROACH_AFRAID</MajorCivApproachType>
    			<Bias>3</Bias>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MajorCivApproachType>MAJOR_CIV_APPROACH_FRIENDLY</MajorCivApproachType>
    			<Bias>5</Bias>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MajorCivApproachType>MAJOR_CIV_APPROACH_NEUTRAL</MajorCivApproachType>
    			<Bias>4</Bias>
    		</Row>
    	</Leader_MajorCivApproachBiases>
    	<Leader_MinorCivApproachBiases>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MinorCivApproachType>MINOR_CIV_APPROACH_IGNORE</MinorCivApproachType>
    			<Bias>4</Bias>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MinorCivApproachType>MINOR_CIV_APPROACH_FRIENDLY</MinorCivApproachType>
    			<Bias>5</Bias>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MinorCivApproachType>MINOR_CIV_APPROACH_PROTECTIVE</MinorCivApproachType>
    			<Bias>3</Bias>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<MinorCivApproachType>MINOR_CIV_APPROACH_CONQUEST</MinorCivApproachType>
    			<Bias>8</Bias>
    		</Row>
    			</Leader_MinorCivApproachBiases>
    			<Leader_Flavors>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_OFFENSE</FlavorType>
    			<Flavor>8</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_DEFENSE</FlavorType>
    			<Flavor>5</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_CITY_DEFENSE</FlavorType>
    			<Flavor>5</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_MILITARY_TRAINING</FlavorType>
    			<Flavor>5</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_RECON</FlavorType>
    			<Flavor>5</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_RANGED</FlavorType>
    			<Flavor>3</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_MOBILE</FlavorType>
    			<Flavor>8</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_NAVAL</FlavorType>
    			<Flavor>5</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_NAVAL_RECON</FlavorType>
    			<Flavor>5</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_NAVAL_GROWTH</FlavorType>
    			<Flavor>6</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_NAVAL_TILE_IMPROVEMENT</FlavorType>
    			<Flavor>6</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_AIR</FlavorType>
    			<Flavor>3</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_EXPANSION</FlavorType>
    			<Flavor>8</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_GROWTH</FlavorType>
    			<Flavor>4</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_TILE_IMPROVEMENT</FlavorType>
    			<Flavor>4</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_INFRASTRUCTURE</FlavorType>
    			<Flavor>4</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_PRODUCTION</FlavorType>
    			<Flavor>5</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_GOLD</FlavorType>
    			<Flavor>3</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_SCIENCE</FlavorType>
    			<Flavor>6</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_CULTURE</FlavorType>
    			<Flavor>7</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_HAPPINESS</FlavorType>
    			<Flavor>5</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_GREAT_PEOPLE</FlavorType>
    			<Flavor>6</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_WONDER</FlavorType>
    			<Flavor>7</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_RELIGION</FlavorType>
    			<Flavor>5</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_DIPLOMACY</FlavorType>
    			<Flavor>7</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_SPACESHIP</FlavorType>
    			<Flavor>8</Flavor>
    		</Row>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<FlavorType>FLAVOR_WATER_CONNECTION</FlavorType>
    			<Flavor>6</Flavor>
    		</Row>
    	</Leader_Flavors>
    	<Leader_Traits>
    		<Row>
    			<LeaderType>LEADER_BOUDICA</LeaderType>
    			<TraitType>TRAIT_IGNORE_TERRAIN_IN_FOREST</TraitType>
    		</Row>
    	</Leader_Traits>
    </GameData>
    Zwei weitere Dinge brauchen wir noch, bevor Boudica eine richtige Anführerin ist. Erstens müssen wir unseren Eintrag der Zivilisation „Kelten“ anpassen, um Boudica als Anführer einzusetzen. Um das zu tun, müssen wir den Eintrag in der Datei Celt.xml, den wir dort eingefügt hatten, von LEADER_ELIZABETH auf LEADER_BOUDICA umändern.
    Code:
    <Civilization_Leaders>
    	<Row>
    		<CivilizationType>CIVILIZATION_CELT</CivilizationType>
    		<LeaderheadType>LEADER_BOUDICA</LeaderheadType>
    	</Row>
    </Civilization_Leaders>
    Zweitens müssen wir die Texte, die unser neuer Anführer verwendet, zu unserer schon vorhandenen GameText.xml-Datei hinzufügen:
    Code:
    	<Row Tag="TXT_KEY_CIVILOPEDIA_LEADERS_BOUDICA_HEADING_1">
    		<Text>History</Text>
    	</Row>
    	<Row Tag="TXT_KEY_CIVILOPEDIA_LEADERS_BOUDICA_TEXT_1">
    		<Text>Boudica, formerly known as Boadicea and known in Welsh as "Buddug" was queen of a Celtic tribe who
    led an uprising against the occupying forces of the Roman Empire.[NEWLINE][NEWLINE]Boudica's husband Prasutagus, ruler of the Iceni tribe
    who had ruled as a nominally independent ally of Rome, left his kingdom jointly to his daughters and the Roman Emperor in his will. However,
    when he died his will was ignored. The kingdom was annexed as if conquered, Boudica was flogged and her daughters raped, and Roman
    financiers called in their loans.[NEWLINE][NEWLINE]In AD 60 or 61, while the Roman governor, Gaius Suetonius Paulinus, was leading a
    campaign on the island of Anglesey in north Wales, Boudica led the Iceni people, along with the Trinovantes and others, in revolt. They
    destroyed Camulodunum (modern Colchester), formerly the capital of the Trinovantes, but now a colonia (a settlement for discharged Roman
    soldiers) and the site of a temple to the former emperor Claudius, which was built and maintained at local expense. They also routed a Roman
    legion, the IX Hispana, sent to relieve the settlement.[NEWLINE][NEWLINE]On hearing the news of the revolt, Suetonius hurried to Londinium
    (London), the twenty-year-old commercial settlement that was the rebels' next target. Concluding he did not have the numbers to defend it,
    Suetonius evacuated and abandoned it. It was burnt to the ground, as was Verulamium (St Albans). An estimated 70,000–80,000 people were
    killed in the three cities. Suetonius, meanwhile, regrouped his forces in the West Midlands, and despite being heavily outnumbered, defeated
    the Britons in the Battle of Watling Street. The crisis caused the emperor Nero to consider withdrawing all Roman forces from the island, but
    Suetonius' eventual victory over Boudica secured Roman control of the province. Boudica then killed herself so she would not be captured, or
    fell ill and died; Tacitus and Dio differ.[NEWLINE][NEWLINE]The history of these events, as recorded by Tacitus and Cassius Dio, was
    rediscovered during the Renaissance and led to a resurgence of Boudica's legendary fame during the Victorian era, when Queen Victoria was
    portrayed as her 'namesake'. Boudica has since remained an important cultural symbol in the United Kingdom. The absence of native British
    literature during the early part of the first millennium means that Britain owes its knowledge of Boudica's rebellion to the writings of the
    Romans.</Text>
    	</Row>
    	<Row Tag="TXT_KEY_CIVILOPEDIA_LEADERS_BOUDICA_LIVED">
    		<Text>25 - 62 AD</Text>
    	</Row>
    	<Row Tag="TXT_KEY_CIVILOPEDIA_LEADERS_BOUDICA_NAME">
    		<Text>Boudica</Text>
    	</Row>
    	<Row Tag="TXT_KEY_CIVILOPEDIA_LEADERS_BOUDICA_SUBTITLE">
    		<Text>Leader of the Celts</Text>
    	</Row>
    	<Row Tag="TXT_KEY_LEADER_BOUDICA">
    		<Text>Boudica</Text>
    	</Row>
    Beachte, dass genau wie bei den Zivilisationen, das Attribut TXT_KEY_CIVILOPEDIA ein Präfix für mehrere Texte ist. _NAME und _SUBTITLE gibt es eigens für Anführer und sie werden oben auf der Zivilopädieseite angezeigt. Genau wie bei den Zivilisationen werden _HEADING_1 und _TEXT_1 verwendet, um Abschnitte auf der Seite zu erzeugen. Und es gibt ein spezielles Kennzeichen _LIVED, das die Lebensspanne des Anführers enthält.

    Schließlich würde ich gerne den Ladebildschirm für die keltische Zivilisation anpassen, sodass er mit einem Bild von Boudica statt von Elizabeth lädt. Weil ich beim Erstellen des Zivilisationssymbols schon meine künstlerischen Fähigkeiten bis an ihre Grenze ausgedehnt habe, muss ich nach einer anderen Quelle für ein Bild von Boudica suchen. Zum Glück gab es in der Civ IV Warlords-Erweiterung ein gutes und ich glaube nicht, dass es Firaxis stören würde, wenn ich mir das für eine Civ5-Mod ausborge.

    Ein Bild für den Ladebildschirm ist 1024x768 Pixel groß und muss eine .DDS-Datei sein. Abgesehen davon lässt sich jedes beliebige Bild verwenden. Ich habe Photoshop benutzt, um ein Bild von Boudica in dieser Größe und diesem Format als BoudicaDOM.dds zu speichern, das Bild meiner Mod hinzugefügt und die Zivilisationsdefinition der Kelten folgendermaßen geändert (Änderung in blau):
    Code:
    <Civilizations>
    	<Row>
    		<Type>CIVILIZATION_CELT</Type>
    		<Description>TXT_KEY_CIV_CELT_DESC</Description>
    		<ShortDescription>TXT_KEY_CIV_CELT_SHORT_DESC</ShortDescription>
    		<Adjective>TXT_KEY_CIV_CELT_ADJECTIVE</Adjective>
    		<Civilopedia>TXT_KEY_CIV_CELT_PEDIA</Civilopedia>
    		<CivilopediaTag>TXT_KEY_CIV5_CELT</CivilopediaTag>
    		<DefaultPlayerColor>PLAYERCOLOR_DARK_GREEN</DefaultPlayerColor>
    		<ArtDefineTag>ART_DEF_CIVILIZATION_ENGLAND</ArtDefineTag>
    		<ArtStyleType>ARTSTYLE_EUROPEAN</ArtStyleType>
    		<ArtStyleSuffix>_EURO</ArtStyleSuffix>
    		<ArtStylePrefix>EUROPEAN </ArtStylePrefix>
    		<PortraitIndex>0</PortraitIndex>
    		<IconAtlas>CIV_COLOR_ATLAS_LEGENDS</IconAtlas>
    		<AlphaIconAtlas>CIV_ALPHA_ATLAS</AlphaIconAtlas>
    		<MapImage>MapEngland512.dds</MapImage>
    		<DawnOfManQuote>TXT_KEY_CIV5_CELT_TEXT_1</DawnOfManQuote>
    		<DawnOfManImage>BoudicaDOM.dds</DawnOfManImage>
    		<DawnOfManAudio/>
    	</Row>
    </Civilizations>
    Und das ist alles, was wir brauchen, um einen neuen, funktionierenden Anführer zu haben. Im nächsten Abschnitt werden wir uns darum kümmern, Boudica eine neue Eigenschaft zu geben und es wird ein Bildschirmphoto des Ladebildschirms geben, wo wir das neue Bild sehen können.

    Anleitung: Eigenschaft hinzufügen
    Bislang haben wir uns für unsere Boudica Hiawathas Eigenschaft ausgeborgt. Das klappt ganz gut, aber unsere Zivilisation wäre interessanter, wenn sie eine einzigartige Eigenschaft hätte. Dieser Abschnitt wird die einfachen Schritte abarbeiten, die nötig sind, dem Spiel eine Anführereigenschaft hinzuzufügen.

    Zuerst müssen wir unserer Mod eine neue Datei hinzufügen: CIV5Traits.xml im Ordner /XML/Civilizations. Wir werden eine Eigenschaft „Battle Fury“ hinzufügen, die allen Fernkampf-, berittenen und Schießpulvereinheiten zwei Angriffe pro Runde statt einem geben wird. Dies ist die Definition, die wir brauchen, um das zu tun:
    Code:
    <GameData>
    	<Traits>
    		<Row>
    			<Type>TRAIT_BATTLE_FURY</Type>
    			<Description>TXT_KEY_TRAIT_BATTLE_FURY</Description>
    			<ShortDescription>TXT_KEY_TRAIT_BATTLE_FURY_SHORT</ShortDescription>
    		</Row>
    	</Traits>
    	<Trait_FreePromotionUnitCombats>
    		<Row>
    			<TraitType>TRAIT_BATTLE_FURY</TraitType>
    			<UnitCombatType>UNITCOMBAT_MELEE</UnitCombatType>
    			<PromotionType>PROMOTION_SECOND_ATTACK</PromotionType>
    		</Row>
    		<Row>
    			<TraitType>TRAIT_BATTLE_FURY</TraitType>
    			<UnitCombatType>UNITCOMBAT_MOUNTED</UnitCombatType>
    			<PromotionType>PROMOTION_SECOND_ATTACK</PromotionType>
    		</Row>
    		<Row>
    			<TraitType>TRAIT_BATTLE_FURY</TraitType>
    			<UnitCombatType>UNITCOMBAT_GUN</UnitCombatType>
    			<PromotionType>PROMOTION_SECOND_ATTACK</PromotionType>
    		</Row>
    	</Trait_FreePromotionUnitCombats>
    </GameData>
    Das fügt dem Spiel eine neue Anführereigenschaft hinzu. Es ist eine ziemlich einfache Definition, die allen Fernkampf-, berittenen und Schießpulvereinheiten die Zweitangriffsbeförderung gibt (das ist eine schon vorhandene Beförderung, die Einheiten jede Runde einen zusätzlichen Angriff gibt).

    Aber wir müssen unsere Mod-Einstellungen noch anpassen, um diese Datei der Liste der Dateien hinzuzufügen, die die Datenbank beim Laden der Mod aktualisieren, und wir brauchen Texte für die Textkennzeichen, die wir hier verwendet haben, und wir müssen Boudica diese Eigenschaft zuweisen.

    Du solltest dich inzwischen damit auskennen, Texte hinzuzufügen. Ergänze in der Datei GameText.xml folgendes:
    Code:
    	<Row Tag="TXT_KEY_TRAIT_BATTLE_FURY">
    		<Text>Melee, Mounted and Gun units can make 2 attacks per round.</Text>
    	</Row>
    	<Row Tag="TXT_KEY_TRAIT_BATTLE_FURY_SHORT">
    		<Text>Battle Fury</Text>
    	</Row>
    Um Boudica die neue Spezialeigenschaft zu geben, ändere ihre Anführerdefinition so ab:
    Code:
    <Leader_Traits>
    	<Row>
    		<LeaderType>LEADER_BOUDICA</LeaderType>
    		<TraitType>TRAIT_BATTLE_FURY</TraitType>
    	</Row>
    </Leader_Traits>
    So leicht ist es, eine neue Eigenschaft zu erstellen. Schau mal durch die Schema-Definition für Traits und die XML-Definitionen für all die schon vorhandenen Eigenschaften, um Ideen für neue Eigenschaften für deine Anführer zu bekommen.



    Anleitung: Eine Einheit hinzufügen
    Einheiten machen Spaß und sie hinzuzufügen ist leicht. Wie du in dem Bildschirmphoto oben vielleicht bemerkt hast, werden den Kelten dort zwei Spezialeinheit zugeschrieben und in diesem Abschnitt werden wir uns darum kümmern, eine davon zu erstellen.

    Dieses Dokument deckt die technischen Aspekte des Moddens ab, aber es ist es wert, kurz ein paar Designüberlegungen anzustellen, wenn man dem Spiel neue Spezialeinheiten hinzufügt. Wenn du über eine Spezialeinheit nachdenkst, überlege dir, wann das die Zivilisation stark macht (Spezialeinheiten sind üblicherweise stärker als die Einheit, die sie ersetzen). Bedenke, wie das zu ihrer Eigenschaft passt und wie es damit im Verhältnis zu anderen Spezialeinheiten aussieht.
    Für die Kelten habe ich eine Spezialeinheit hinzugefügt, die den Krieger ersetzt und eine anstelle des Schwertkämpfers.
    Beide sind frühe Einheiten und beide passen gut zu Boudicas Fähigkeit. Das macht die Kelten in der Frühphase des Spiels sehr stark. Sie haben keine Gebäude, die mit der Infrastruktur helfen und keine ihrer Fähigkeiten sind in der Verteidigung sonderlich hilfreich. Aber sie sind erstklassige frühe Angreifer.
    Der gälische Krieger ist von denselben Kosten und derselben Stärke wie ein normaler Krieger, ignoriert aber Geländekosten. Durch Wälder, Hügel, Dschungel oder über Flüsse zu laufen geschieht genau wie Fortbewegung auf offener Ebene. Das macht den gälischen Krieger zu einem sehr schnellen Angreifer, besonders mit Boudicas Spezialeigenschaft, zweimal pro Runde anzugreifen. Das hilft auch bei den bewaldeten Starts.

    Wir müssen vier Änderungen vornehmen, um eine neue Spezialeinheit in das Spiel einzufügen. Zuerst müssen wir eine neue Datei CIV5Units.xml zu unserer Mod hinzufügen. Ich habe sie im Ordner XML/Units/ angelegt. Diese Datei muss folgende Definition enthalten:
    Code:
    <GameData>
    	<Units>
    		<Row>
    			<Class>UNITCLASS_WARRIOR</Class>
    			<Type>UNIT_GAELIC_WARRIOR</Type>
    			<Combat>6</Combat>
    			<Cost>40</Cost>
    			<Moves>2</Moves>
    			<CombatClass>UNITCOMBAT_MELEE</CombatClass>
    			<Domain>DOMAIN_LAND</Domain>
    			<DefaultUnitAI>UNITAI_ATTACK</DefaultUnitAI>
    			<Description>TXT_KEY_UNIT_GAELIC_WARRIOR</Description>
    			<Civilopedia>TXT_KEY_CIV5_ANTIQUITY_WARRIOR_TEXT</Civilopedia>
    			<Strategy>TXT_KEY_UNIT_WARRIOR_STRATEGY</Strategy>
    			<Help>TXT_KEY_UNIT_HELP_GAELIC_WARRIOR</Help>
    			<MilitarySupport>true</MilitarySupport>
    			<MilitaryProduction>true</MilitaryProduction>
    			<Pillage>true</Pillage>
    			<ObsoleteTech>TECH_METAL_CASTING</ObsoleteTech>
    			<GoodyHutUpgradeUnitClass>UNITCLASS_SPEARMAN</GoodyHutUpgradeUnitClass>
    			<AdvancedStartCost>10</AdvancedStartCost>
    			<XPValueAttack>3</XPValueAttack>
    			<XPValueDefense>3</XPValueDefense>
    			<Conscription>1</Conscription>
    			<UnitArtInfo>ART_DEF_UNIT_GAELIC_WARRIOR</UnitArtInfo>
    			<UnitFlagIconOffset>3</UnitFlagIconOffset>
    			<IconAtlas>UNIT_ATLAS_1</IconAtlas>
    			<PortraitIndex>3</PortraitIndex>
    		</Row>
    	</Units>
    	<Unit_FreePromotions>
    		<Row>
    			<UnitType>UNIT_GAELIC_WARRIOR</UnitType>
    			<PromotionType>PROMOTION_IGNORE_TERRAIN_COST</PromotionType>
    		</Row>
    	</Unit_FreePromotions>
    	<Unit_AITypes>
    		<Row>
    			<UnitType>UNIT_GAELIC_WARRIOR</UnitType>
    			<UnitAIType>UNITAI_ATTACK</UnitAIType>
    		</Row>
    		<Row>
    			<UnitType>UNIT_GAELIC_WARRIOR</UnitType>
    			<UnitAIType>UNITAI_DEFENSE</UnitAIType>
    		</Row>
    		<Row>
    			<UnitType>UNIT_GAELIC_WARRIOR</UnitType>
    			<UnitAIType>UNITAI_EXPLORE</UnitAIType>
    		</Row>
    	</Unit_AITypes>
    	<Unit_ClassUpgrades>
    		<Row>
    			<UnitType>UNIT_GAELIC_WARRIOR</UnitType>
    			<UnitClassType>UNITCLASS_SWORDSMAN</UnitClassType>
    		</Row>
    	</Unit_ClassUpgrades>
    	<Unit_Flavors>
    		<Row>
    			<UnitType>UNIT_GAELIC_WARRIOR</UnitType>
    			<FlavorType>FLAVOR_RECON</FlavorType>
    			<Flavor>1</Flavor>
    		</Row>
    		<Row>
    			<UnitType>UNIT_GAELIC_WARRIOR</UnitType>
    			<FlavorType>FLAVOR_OFFENSE</FlavorType>
    			<Flavor>2</Flavor>
    		</Row>
    		<Row>
    			<UnitType>UNIT_GAELIC_WARRIOR</UnitType>
    			<FlavorType>FLAVOR_DEFENSE</FlavorType>
    			<Flavor>2</Flavor>
    		</Row>
    	</Unit_Flavors>
    </GameData>
    Beachte, dass es darin mehrere Tabellen gibt, die beim Hinzufügen einer Einheit auf den neuesten Stand gebracht werden müssen. Die wichtigste ist die Units-Tabelle, aber wir haben auch die Tabellen Unit_FreePromotions (um die Beförderung, die der Einheit erlaubt, die Fortbewegungskosten zu ignorieren, zu gewähren), Unit_AITypes (interessanterweise sucht das Spiel nach einer verfügbaren UNITAI_DEFENSE-Einheit, um den Spieler damit anfangen zu lassen; weil ich das ursprünglich nicht definiert hatte, fingen die Kelten mit einem freien Krieger an, bis ich den Fehler behob), Unit_ClassUpgrades (sodass unsere neue Einheit zum Schwertkämpfer modernisiert werden kann) und Unit_Flavors (dann können verschiedene KI-Anführer verschiedene Strategien bevorzugen).

    Obige Einheit verwendet die Einheitenklasse UNITCLASS_WARRIOR, wir müssen also keine neue Einheitenklasse definieren. Weil sie keine eigene Einheitenklasse hat, wissen wir, dass es sich um eine Spezialeinheit handelt (die irgendeiner Zivilisation den Krieger ersetzt).
    Alle Einheiteneigenschaften sollten wirklich leicht zu verstehen sein. Ich habe eine eigene Graphikdefinition eingefügt, wir werden uns im nächsten Abschnitt darum kümmern.

    Der zweite Schritt des Einheitenhinzufügens ist, dass wir die Modeinstellungen anpassen müssen und die neue Datei als eine einstellen müssen, die beim Aktivieren der Mod die Datenbank aktualisiert.

    Der dritte Schritt ist es, die Texte hinzuzufügen, die die Einheit erfordert. Ich habe es nicht gleich übertrieben und einen Zivilopädieeintrag ergänzt. Nur der Name und ein Hilfetext, damit der Spieler weiß, was die Einheit macht, sodass wir also zwei Einträge haben, die der Text-Datei hinzugefügt werden müssen:
    Code:
    	<Row Tag="TXT_KEY_UNIT_GAELIC_WARRIOR">
    		<Text>Gaelic Warrior</Text>
    	</Row>
    	<Row Tag="TXT_KEY_UNIT_HELP_GAELIC_WARRIOR">
    		<Text>This unit's ability to ignore terrain allows it to quickly rush into enemy lands.</Text>
    	</Row>
    Der letzte Schritt ist dann, diese Einheit zur Spezialeinheit der Kelten zu erklären:
    Code:
    <Civilization_UnitClassOverrides>
    	<Row>
    		<CivilizationType>CIVILIZATION_CELT</CivilizationType>
    		<UnitClassType>UNITCLASS_WARRIOR</UnitClassType>
    		<UnitType>UNIT_GAELIC_WARRIOR</UnitType>
    	</Row>
    </Civilization_UnitClassOverrides>
    Das ist schon alles, was es braucht, dem Spiel eine neue Einheit hinzuzufügen. Im nächsten Abschnitt schauen wir uns an, wie wir einer Einheit neue Graphiken zuweisen.

    Anleitung: Die Einheitengraphikfestlegung ändern
    Dieses Dokument wird sich nicht damit beschäftigen, wie man graphische Inhalte für Civ5 erstellt. Firaxis hat dafür ein SDK-Werkzeug namens Nexus, aber ich bin der Falsche, um darüber etwas zu sagen.

    Aber wir werden uns die Graphikdefinitionen vornehmen. Es gibt zwei Teile. Der erste, UnitArtInfo, ist für die Formation als ganzes. Die Einheitendefinition verweist auf diese Schicht, sie legt fest, wie viele Einheiten (und welche Art von Einheiten) die ganze Formation ausmachen. Die Datei ist zu lang, um sie hier einzubauen, aber das hier ist ein Auszug daraus:
    Code:
    <UnitArtInfos>
    	<UnitArtInfo>
    		<Type>ART_DEF_UNIT_BARBARIAN_EURO</Type>
    		<Formation>Barbarian</Formation>
    		<DamageStates>1</DamageStates>
    		<UnitMemberArt>
    		<MemberType>ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_ALPHA</MemberType>
    			<MemberCount>2</MemberCount>
    		</UnitMemberArt>
    		<UnitMemberArt>
    			<MemberType>ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_BRAVO</MemberType>
    		<MemberCount>4</MemberCount>
    		</UnitMemberArt>
    		<UnitMemberArt>
    			<MemberType>ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_CHARLIE</MemberType>
    			<MemberCount>4</MemberCount>
    		</UnitMemberArt>
    	</UnitArtInfo>
    </UnitArtInfos>
    Beachte, dass das die erste XML-Definition ist, die wir behandeln und die nicht mit dem <GameData>-Eintrag anfängt. Einheitengraphik ist nicht vollständig in die Datenbank integriert, deshalb ist der Umgang damit ein etwas anderer als mit den anderen XML-Inhalten.

    Obige Definition für ART_DEF_UNIT_BARBARIAN_EURO enthält zehn Einheiten in der Formation. Zwei EURO_ALPHA Einheitenmodelle, viel EURO_BRAVO-Modelle und vier EURO_CHARLIE-Modelle. Firaxis hat verschieden aussehende Modelle, damit die Einheitenverbände nicht wie Klonarmeen aussehen. Um mehr über diese Modelle zu erfahren, müssen wir die Definitionen in UnitMemberArtInfo betrachten:
    Code:
    <UnitMemberArtInfos>
    	<UnitMemberArtInfo>
    		<Type>ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_ALPHA</Type>
    		<fScale>0.14</fScale>
    		<Granny>Assets/Units/Barbarian/Barbarian_EURO/Barbarian_EURO_Alpha.fxsxml</Granny>
    		<Combat>
    			<Defaults>ART_DEF_TEMPLATE_SOLDIER</Defaults>
    			<Weapon>
    				<WeaponTypeTag>BLUNT</WeaponTypeTag>
    				<WeaponTypeSoundOverrideTag>BLUNT</WeaponTypeSoundOverrideTag>
    			</Weapon>
    			<Weapon>
    				<Usage>Vs_City ShortRange</Usage>
    				<fVisKillStrengthMin>10.0</fVisKillStrengthMin>
    				<fVisKillStrengthMax>20.0</fVisKillStrengthMax>
    				<WeaponTypeTag>FLAMING_ARROW</WeaponTypeTag>
    			</Weapon>
    		</Combat>
    		<MaterialTypeTag>CLOTH</MaterialTypeTag>
    		<MaterialTypeSoundOverrideTag>FLESH</MaterialTypeSoundOverrideTag>
    	</UnitMemberArtInfo>
    	<UnitMemberArtInfo>
    		<Type>ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_BRAVO</Type>
    		<fScale>0.14</fScale>
    		<Granny>Assets/Units/Barbarian/Barbarian_EURO/Barbarian_EURO_Bravo.fxsxml</Granny>
    		<Combat>
    			<Defaults>ART_DEF_TEMPLATE_SOLDIER</Defaults>
    			<Weapon>
    				<WeaponTypeTag>BLUNT</WeaponTypeTag>
    				<WeaponTypeSoundOverrideTag>BLUNT</WeaponTypeSoundOverrideTag>
    			</Weapon>
    			<Weapon>
    				<Usage>Vs_City ShortRange</Usage>
    				<fVisKillStrengthMin>10.0</fVisKillStrengthMin>
    				<fVisKillStrengthMax>20.0</fVisKillStrengthMax>
    				<WeaponTypeTag>FLAMING_ARROW</WeaponTypeTag>
    			</Weapon>
    		</Combat>
    		<MaterialTypeTag>CLOTH</MaterialTypeTag>
    		<MaterialTypeSoundOverrideTag>FLESH</MaterialTypeSoundOverrideTag>
    	</UnitMemberArtInfo>
    	<UnitMemberArtInfo>
    		<Type>ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_CHARLIE</Type>
    		<fScale>0.14</fScale>
    		<Granny>Assets/Units/Barbarian/Barbarian_EURO/Barbarian_EURO_Charlie.fxsxml</Granny>
    		<Combat>
    			<Defaults>ART_DEF_TEMPLATE_SOLDIER</Defaults>
    			<Weapon>
    				<WeaponTypeTag>BLUNT</WeaponTypeTag>
    				<WeaponTypeSoundOverrideTag>BLUNT</WeaponTypeSoundOverrideTag>
    			</Weapon>
    			<Weapon>
    				<Usage>Vs_City ShortRange</Usage>
    				<fVisKillStrengthMin>10.0</fVisKillStrengthMin>
    				<fVisKillStrengthMax>20.0</fVisKillStrengthMax>
    				<WeaponTypeTag>FLAMING_ARROW</WeaponTypeTag>
    			</Weapon>
    		</Combat>
    		<MaterialTypeTag>CLOTH</MaterialTypeTag>
    		<MaterialTypeSoundOverrideTag>FLESH</MaterialTypeSoundOverrideTag>
    	</UnitMemberArtInfo>
    </UnitMemberArtInfos>
    Darin gibt es drei UnitMemberArtInfo-Definitionen. Jede setzt fest ,wie groß fScale ist (wie groß das Einheitenmodell ist), verweist auf die eigentliche Graphikdatei (im Granny-Attribut) und enthält die Tags, die für Klang- und Animationseffekte verwendet werden.

    Ich persönlich bin kein großer Fan der großen Zehn-Einheiten-Formationen. Die Kämpfe sehen cool aus, aber es ist schwer, all die kleinen Einheiten auf der Karte zu unterscheiden. Wir werden also in dieser Mod von Formationen von zehn Einheiten zu einem einzigen großen Einheitenmodell wechseln.

    Eine der Besonderheiten der UnitArtInfo und UnitMemberArtInfo ist, dass wir, weil sie nicht in der Datenbank sind, die <Update>-Funktion nicht auf sie anwenden können. Wir müssen eine vollständige Kopie der geänderten Datei vorlegen. Auch weil das Einheitensystem vor der Mod geladen wird, müssen wir „Einheitensystem neu laden“ in den Modeinstellungen einstellen, damit unsere geänderten Einheitenmodelleinstellungen eine Auswirkung haben.

    Um das zu tun, müssen wir zuerst die UnitArtInfo für jede Einheit ändern, um sie auf ein Modell umzustellen. Wieder werde ich hier nicht die komplette Datei einfügen, sondern nur unser Barbarenkriegerbeispiel:
    Code:
    <UnitArtInfos>
    	<UnitArtInfo>
    		<Type>ART_DEF_UNIT_BARBARIAN_EURO</Type>
    		<Formation>Barbarian</Formation>
    		<DamageStates>1</DamageStates>
    		<UnitMemberArt>
    			<MemberType>ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_BRAVO</MemberType>
    			<MemberCount>1</MemberCount>
    		</UnitMemberArt>
    	</UnitArtInfo>
    </UnitArtInfos>
    Und zweitens müssen wir die Definition für unser ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_BRAVO ändern, um die Größe zu erhöhen:
    Code:
    <UnitMemberArtInfos>
    	<UnitMemberArtInfo>
    		<Type>ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_BRAVO</Type>
    		<fScale>0.32</fScale>
    		<Granny>Assets/Units/Barbarian/Barbarian_EURO/Barbarian_EURO_Bravo.fxsxml</Granny>
    		<Combat>
    			<Defaults>ART_DEF_TEMPLATE_SOLDIER</Defaults>
    			<Weapon>
    				<WeaponTypeTag>BLUNT</WeaponTypeTag>
    				<WeaponTypeSoundOverrideTag>BLUNT</WeaponTypeSoundOverrideTag>
    			</Weapon>
    			<Weapon>
    				<Usage>Vs_City ShortRange</Usage>
    				<fVisKillStrengthMin>10.0</fVisKillStrengthMin>
    				<fVisKillStrengthMax>20.0</fVisKillStrengthMax>
    				<WeaponTypeTag>FLAMING_ARROW</WeaponTypeTag>
    			</Weapon>
    		</Combat>
    		<MaterialTypeTag>CLOTH</MaterialTypeTag>
    		<Mater	ialTypeSoundOverrideTag>FLESH</MaterialTypeSoundOverrideTag>
    	</UnitMemberArtInfo>
    </UnitMemberArtInfos>
    Die einzige Veränderung ist die blau hervorgehobene. Der fScale-Wert der Einheit wurde von 0.12 auf 0.32 erhöht, sie ist also jetzt fast dreimal so groß wie normal.

    Einer der großen Vorteile des Wechsels von großen Formationen zu einzelnen großen Einheiten ist, dass uns das einige unbenutzte Einheitenmodelle übrig lässt. Vorher war die barbarische Einheitenformation aus drei Einheitenmodellen aufgebaut, Alpha, Bravo und Charlie. In unserer neuen Barbarenformation nutzen wir das Bravo-Modell. Uns steht also das Modell Alpha (das eine coole Hirschleder-Kopfbedeckung mit Geweih trägt, die perfekt zu unserer keltischen Kriegereinheit passt) zur Verfügung.

    Im vorangegangenen Abschnitt, als wir den Gälischen Krieger erstellt haben, haben wir die Graphikdefinition ART_DEF_UNIT_GAELIC_WARRIOR verwendet, jetzt müssen wir diese Definition in der UnitArtInfo hinzufügen.
    Code:
    <UnitArtInfos>
    	<UnitArtInfo>
    		<Type>ART_DEF_UNIT_GAELIC_WARRIOR</Type>
    		<Formation>LooseCivilian</Formation>
    		<DamageStates>1</DamageStates>
    		<UnitMemberArt>
    			<MemberType>ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_ALPHA</MemberType>
    			<MemberCount>1</MemberCount>
    		</UnitMemberArt>
    	</UnitArtInfo>
    </UnitArtInfos>
    Wir müssen die UnitMemberArtInfo nicht ändern, weil die Definition sich nicht verändert hat. Stattdessen befiehlt dies dem Spiel, das Modell ART_DEF_UNIT_MEMBER_BARBARIAN_EURO_ALPHA als eine Eine-Einheit-Formation zu verwenden, wenn die ART_DEF_UNIT_GAELIC_WARRIOR-Definition eingestellt ist.

    Anleitung: Ein Gebäude hinzufügen
    Gebäude lassen sich dem Spiel leicht hinzufügen. In diesem Beispiel werden wir eine Palisade als frühes Verteidigungsgebäude hinzufügen. Sie wird keine Technologien erfordern, sich also von der ersten Runde an bauen lassen und kann nur im Altertum gebaut werden (in späteren Zeitaltern sollten Spieler Mauern, Schlösser und andere mächtige Verteidigungsgebäude verwenden).



    Dazu müssen wir nur drei Tabellen aktualisieren. Die erste ist die Tabelle Buildings aus der Datei CIV5Buildings.xml. Folgendes fügt das Gebäude „Palisade“ zum Spiel hinzu:
    Code:
    <GameData>
    	<Buildings>
    		<Row>
    			<Type>BUILDING_PALISADE</Type>
    			<BuildingClass>BUILDINGCLASS_PALISADE</BuildingClass>
    			<Cost>60</Cost>
    			<GoldMaintenance>1</GoldMaintenance>
    			<Help>TXT_KEY_BUILDING_PALISADE_STRATEGY</Help>
    			<Description>TXT_KEY_BUILDING_PALISADE</Description>
    			<Civilopedia>TXT_KEY_CIV5_BUILDINGS_PALISADE_TEXT</Civilopedia>
    			<Strategy>TXT_KEY_BUILDING_PALISADE_STRATEGY</Strategy>
    			<ArtDefineTag>ART_DEF_BUILDING_WALLS</ArtDefineTag>
    			<MaxStartEra>ERA_ANCIENT</MaxStartEra>
    			<MinAreaSize>-1</MinAreaSize>
    			<AllowsRangeStrike>true</AllowsRangeStrike>
    			<Defense>250</Defense>
    			<CityWall>true</CityWall>
    			<HurryCostModifier>25</HurryCostModifier>
    			<IconAtlas>BW_ATLAS_1</IconAtlas>
    			<NeverCapture>true</NeverCapture>
    			<PortraitIndex>32</PortraitIndex>
    		</Row>
    	</Buildings>
    </GameData>
    Civ5 verwendet Gebäudeklassen zum Ersetzen von Gebäuden, die als Spezialgebäude verwendet werden, beispielsweise sind Markt und Basar beide BUILDINGCLASS_MARKET. Auf diese Weise kann die ganze KI und Logik unter Verwendung von BUILDINGCLASS_MARKET programmiert werden und das Spiel kann das dann als „Markt“ für die meisten Zivilisationen und als Basar für Araber übersetzen.

    Der nächste Eintrag ist die Tabelle BuildingClasses in der Datei CIV5BuildingClasses.xml:
    Code:
    <GameData>
    	<BuildingClasses>
    		<Row>
    			<Type>BUILDINGCLASS_PALISADE</Type>
    			<DefaultBuilding>BUILDING_PALISADE</DefaultBuilding>
    			<Description>TXT_KEY_BUILDING_PALISADE</Description>
    		</Row>
    	</BuildingClasses>
    </GameData>
    Und schließlich brauchen wir noch die Texte, um das Gebäude, das wir hinzugefügt haben, zu unterstützen. Es gibt drei neue Einträge, auf die wir gerade in der Definition verwiesen haben.
    Code:
    <GameData>
    	<Language_en_US>
    		<Row Tag="TXT_KEY_BUILDING_PALISADE">
    			<Text>Palisade</Text>
    		</Row>
    		<Row Tag="TXT_KEY_BUILDING_PALISADE_STRATEGY">
    			<Text>Palisade's provide an early defense against attackers. Though they are less expensive than walls, they
    provide only half the defense.</Text>
    		</Row>
    		<Row Tag="TXT_KEY_CIV5_BUILDINGS_PALISADE_TEXT">
    			<Text>Built of little more than mud and raw lumber palisades were as vulnerable to the weather as they were
    to enemy attack. Yet they remained popular in border cities if only because they made the people behind them feel more secure.</Text>
    		</Row>
    	</Language_en_US>
    </GameData>
    Das war's schon. Eine komplette Mod, die ein neues Gebäude zum Spiel hinzufügt, modular ist (mit anderen Mods ohne Kompatibilitätsprobleme benutzt werden kann) und innerhalb von fünf bis zehn Minuten erstellt und veröffentlicht werden kann.

    Anleitung: Ein Gebäude abändern
    Mal angenommen, wir wollen verändern, wie manche Gebäude im Spiel funktionieren. Derzeit fügt ein Nahrungslager der Stadt, in der es steht, Nahrung hinzu und ein Krankenhaus ermöglicht es einer Stadt, bei Bevölkerungswachstum 50% der Nahrung zu behalten.

    Folgendes ist der Grund-Definitionseintrag für ein Nahrungslager:
    Code:
    <Buildings>
    	<Row>
    		<Type>BUILDING_GRANARY</Type>
    		<BuildingClass>BUILDINGCLASS_GRANARY</BuildingClass>
    		<FreeStartEra>ERA_RENAISSANCE</FreeStartEra>
    		<Cost>100</Cost>
    		<GoldMaintenance>1</GoldMaintenance>
    		<PrereqTech>TECH_POTTERY</PrereqTech>
    		<Help>TXT_KEY_BUILDING_GRANARY_STRATEGY</Help>
    		<Description>TXT_KEY_BUILDING_GRANARY</Description>
    		<Civilopedia>TXT_KEY_CIV5_BUILDINGS_GRANARY_TEXT</Civilopedia>
    		<Strategy>TXT_KEY_BUILDING_GRANARY_STRATEGY</Strategy>
    		<ArtDefineTag>ART_DEF_BUILDING_GRANARY</ArtDefineTag>
    		<MinAreaSize>-1</MinAreaSize>
    		<ConquestProb>66</ConquestProb>
    		<HurryCostModifier>25</HurryCostModifier>
    		<IconAtlas>BW_ATLAS_1</IconAtlas>
    		<PortraitIndex>0</PortraitIndex>
    	</Row>
    </Buildings>
    <Building_YieldChanges>
    	<Row>
    		<BuildingType>BUILDING_GRANARY</BuildingType>
    		<YieldType>YIELD_FOOD</YieldType>
    		<Yield>2</Yield>
    	</Row>
    </Building_YieldChanges>
    Und folgendes ist die Definition für ein Krankenhaus:
    Code:
    <Buildings>
    	<Row>
    		<Type>BUILDING_HOSPITAL</Type>
    		<BuildingClass>BUILDINGCLASS_HOSPITAL</BuildingClass>
    		<Cost>400</Cost>
    		<GoldMaintenance>2</GoldMaintenance>
    		<PrereqTech>TECH_BIOLOGY</PrereqTech>
    		<Help>TXT_KEY_BUILDING_HOSPITAL_HELP</Help>
    		<Description>TXT_KEY_BUILDING_HOSPITAL</Description>
    		<Civilopedia>TXT_KEY_BUILDING_HOSPITAL_PEDIA</Civilopedia>
    		<Strategy>TXT_KEY_BUILDING_HOSPITAL_STRATEGY</Strategy>
    		<ArtDefineTag>ART_DEF_BUILDING_HOSPITAL</ArtDefineTag>
    		<FoodKept>50</FoodKept>
    		<MinAreaSize>-1</MinAreaSize>
    		<ConquestProb>66</ConquestProb>
    		<HurryCostModifier>0</HurryCostModifier>
    		<IconAtlas>BW_ATLAS_1</IconAtlas>
    		<PortraitIndex>45</PortraitIndex>
    	</Row>
    </Buildings>
    Das Schöne am <update>-Tag ist, dass du nur genau angeben musst, was du ändern willst. Um die Definitionen für diese Gebäude zu ändern, erstelle in der Mod eine neue Datei namens /XML/Buildungs/CIV5Buildings.xml und füge diese Datei der „Datenbank aktualisieren“-Liste in den Modeinstellungen hinzu, wie wir es mit all unseren anderen Änderungen auch gemacht haben. Wie bei den anderen sind Dateiname und Ordnerpfad nicht wichtig, abgesehen davon, dass sie uns helfen, unsere Mod zu organisieren.

    Wenn wir wollen, dass das Nahrungslager nach Bevölkerungswachstum 30% der Nahrung speichert, und wir diese Fähigkeit vom Krankenhaus entfernen und sie dort durch die Eigenschaft, jeder Einheit, die hier ausgebildet wird, die Heiler-Beförderung zu geben, ersetzen wollen, müssen wir folgenden XML-Code zu unserer CIV5Buildings.xml-Datei hinzufügen:
    Code:
    <GameData>
    	<Buildings>
    		<Update>
    			<Set FoodKept="30"/>
    			<Where Type="BUILDING_GRANARY"/>
    		</Update>
    		<Update>
    			<Set Help="TXT_KEY_BUILDING_GRANARY_HELP"/>
    			<Where Type="BUILDING_GRANARY"/>
    		</Update>
    		<Update>
    			<Set FoodKept="0"/>
    			<Where Type="BUILDING_HOSPITAL"/>
    		</Update>
    		<Update>
    			<Set TrainedFreePromotion="PROMOTION_MEDIC"/>
    			<Where Type="BUILDING_HOSPITAL"/>
    		</Update>
    	</Buildings>
    </GameData>
    Diese XML-Zeilen nehmen vier Änderungen vor. Die erste ist, das FoodKept-Attribut des Nahrungslagers auf 30 zu setzen (sodass bei Bevölkerungswachstum 30% der Nahrung erhalten bleiben). Die zweite ist, das Hilfe-Attribut des Nahrungslagers auf TXT_KEY_GRANARY_HELP zu stellen. Normalerweise haben Nahrungslager keine Hilfetexte, aber wir werden einen brauchen, damit Spieler von unserer neuen Funktionalität wissen. Der dritte entfernt die FoodKept-Eigenschaft von Krankenhäusern, indem sie sie auf 0 setzt. Und die vierte ist, das TrainedFreePromotion-Attribut des Krankenhauses auf PROMOTION_MEDIC zu setzen, sodass neue Einheiten, die in einer Stadt mit Krankenhaus ausgebildet werden, die Heiler-Beförderung erhalten.

    Das lässt sich nicht nur sehr leicht lesen und genau erkennen, was du geändert hast (in früheren Versionen hätte das gesamte xml ersetzt werden müssen, sodass du, um Änderungen aufzuspüren, ein Vergleichswerkzeug gebraucht hättest), es macht die Änderungen auch sehr modular. Eine Mod kann Nahrungslagern erlauben, nach Wachstum Nahrung zu speichern, eine andere könnte die Baukosten des Nahrungslagers anpassen und eine dritte könnte es zu einer anderen Technologie verschieben.

    Wir brauchen auch ein paar Texte, um das zu unterstützen. Wir müssen den neuen Text TXT_KEY_BUILDING_GRANARY_HELP hinzufügen und den schon vorhandenen Hilfetext TXT_KEY_BUILDING_HOSPITAL_HELP anpassen.
    Code:
    <GameData>
    	<Language_en_US>
    		<Row Tag="TXT_KEY_BUILDING_GRANARY_HELP">
    			<Text>30% of [ICON_FOOD] Food is carried over after a new [ICON_CITIZEN] Citizen is born.</Text>
    		</Row>
    		<Update>
    			<Where Tag="TXT_KEY_BUILDING_HOSPITAL_HELP"/>
    				<Set Text="All newly-trained Units in this City receive the [COLOR_POSITIVE_TEXT]Medic[ENDCOLOR]
    Promotion, increasing the heal rate of this unit and all adjacent units by 1 per turn."/>
    		</Update>
    	<Language_en_US>
    <GameData>
    Beachte, dass der Nahrungslager-Text ein neuer Text ist, wie wir für andere neue Inhalte schon welche hinzugefügt haben. Aber der Krankenhaustext ist ein Update-Operation, die wir benötigen, um den alten Text in den neuen umzuwandeln.

    Der in diesem Abschnitt abgedeckte Prozess funktioniert bei Anführern, Einheiten und anderen Inhalten genauso wie bei Gebäuden. Das <Update>-Element ist eine einfache Möglichkeit, vorhandene Spielinhalte auf modulare Weise zu ändern.
    Angehängte Grafiken Angehängte Grafiken

  10. #10
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Danke für die Geduld. Den heutigen Teil gibt es in mehreren Stücken, weil zu viele Bilder für einen Post dabei sind.



    Anleitung: Einen Rohstoff entfernen
    Einen Rohstoff zu entfernen ist ein gutes Beispiel für die Entfernung irgendeines beliebigen Inhaltes aus Civ5, auf den an anderer Stelle verwiesen wird. Bei Rohstoffen sind diese Stellen Einheiten, Gebäude, Feldverbesserungen und andere Quellen. Den Inhalt also einfach zu löschen wird demnach Fehler und einen Spielabsturz hervorrufen.

    Wenn wir Pferde aus dem Spiel entfernen wollten (und es solche Verweise nicht gäbe), würde die folgende Mod funktionieren:


    Aber wenn diese Mod geladen wird, stürzt das Spiel ab und wir erhalten in der Datei Database.log folgende Fehlermeldungen:
    Code:
    [66897.659] Invalid Reference on Building_LocalResourceAnds.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.659] Invalid Reference on Building_LocalResourceOrs.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.659] Invalid Reference on Trait_ResourceQuantityModifiers.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Improvement_ResourceTypes.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Improvement_ResourceType_Yields.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Resource_YieldChanges.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Resource_Flavors.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Resource_TerrainBooleans.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Resource_TerrainBooleans.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Resource_TerrainBooleans.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Resource_QuantityTypes.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Resource_QuantityTypes.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Invalid Reference on Unit_ResourceQuantityRequirements.ResourceType - "RESOURCE_HORSE" does not exist in Resources
    [66897.674] Failed Validation.
    Das Problem sind die vorhandenen Verweise auf die nicht vorhandenen Pferde. Obwohl die Database.log-Datei uns ein paar Hinweise darauf gibt, woher die Fehler stammen, ist der leichteste Weg herauszufinden, welche Dateien einen Verweis auf RESOURCE_HORSE enthalten, eine Dateisuche.

    Dazu fange ich im Ordner „<Installationsordner>\Assets\Gameplay\XML“ an und starte eine Suche nach RESOURCE_HORSE, wobei ich auswähle, dass Dateiinhalte durchsucht werden sollen. Das liefert folgendes:


    Wir müssen uns um die Text-Dateien nicht kümmern. Sie enthalten nur Klartexte für Zeichenketten, sie verweisen auf gar nichts. Das Vorkommen von RESOURCE_HORSE in ihnen beschränkt sich auf Auftreten als Teil eines längeren Textes.
    Das lässt uns: CIV5Units.xml, CIV5Buildings.xml, CIV5Resources.xml, CIV5Improvements.xml und Civ5Traits.xml.

    Mein nächster Schritt ist, xml-Dateien für jede dieser Dateien, für die ich Updates angeben muss, anzulegen. Wie bereits gesagt, könnten wir all diese Änderungen in einer einzigen Datei vornehmen und Ordner- und Dateiname spielen keine Rolle.Ich ziehe es vor, die Ordner- und Dateinamensstruktur von Civ5 zu erhalten, weil es für mich leichter ist, die im Kopf zu behalten, aber eine einzelne XML-Datei namens „PferdeEntfernen.xml“ tut's auch.


    Sobald wir die leeren Dateien haben, müssen wir die Originalversion durchgehen, um zu sehen, welche Verweise wir entfernen müssen. Wir fangen mit der Civ5Buildings.xml an.


    Eine Suche in Civ5Buildings.xml zeigt uns zwei Verweise auf RESOURCE_HORSE, nämlich in der Building_LocalResourceAnds-Tabelle für Ställe und in der Building_LocalResourceOrs-Tabelle des Circus. Beide Verweise muss unsere Mod entfernen, bevor sie geladen werden kann.

    Folgender XML-Code für die Civ5Buildings.xml-Datei unserer Mod wird beide Verweise entfernen:
    Code:
    <GameData>
    	<Building_LocalResourceAnds>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Building_LocalResourceAnds>
    	<Building_LocalResourceOrs>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Building_LocalResourceOrs>
    </GameData>
    Und wir müssen dasselbe für Eigenschaften, Einheiten, Geländeverbesserungen und Rohstoffe in den entsprechenden Dateien machen, womit folgendes zu tun bleibt:

    Civ5Traits.xml:
    Code:
    <GameData>
    	<Trait_ResourceQuantityModifiers>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Trait_ResourceQuantityModifiers>
    </GameData>
    Civ5Units.xml:
    Code:
    <GameData>
    	<Unit_ResourceQuantityRequirements>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Unit_ResourceQuantityRequirements>
    </GameData>
    Civ5Improvements.xml:
    Code:
    <GameData>
    	<Improvement_ResourceTypes>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Improvement_ResourceTypes>
    	<Improvement_ResourceType_Yields>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Improvement_ResourceType_Yields>
    </GameData>
    Civ5Resources.xml:
    Code:
    <GameData>
    	<Resources>
    		<Delete type="RESOURCE_HORSE"/>
    	</Resources>
    	<Resource_YieldChanges>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Resource_YieldChanges>
    	<Resource_Flavors>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Resource_Flavors>
    	<Resource_TerrainBooleans>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Resource_TerrainBooleans>
    	<Resource_QuantityTypes>
    		<Delete ResourceType="RESOURCE_HORSE"/>
    	</Resource_QuantityTypes>
    </GameData>
    Sobald diese Veränderungen durchgeführt sind, haben wir eine Mod, die Pferde und alle Verweise auf Pferde entfernt. Bedenke, dass diese Mod mit anderen Mods, die auf Pferde verweisen, nicht kompatibel sein wird. Wenn zum Beispiel eine Mod eine neue berittene Einheit hinzufügt, die auf den Rohstoff „Pferde“ angewiesen ist.
    Und das ist der Grund dafür, dass Mods, die Datenbankinhalte entfernen, auf „exklusiv“ gestellt werden sollten.

    Anleitung: Einheitensymbole mittels Lua deaktivieren
    In Civ5 schwebt über Einheiten ein Einheitensymbol.

    Wir haben vor, die Möglichkeit hinzuzufügen, dieses Symbol abzuschalten.
    Angehängte Grafiken Angehängte Grafiken

  11. #11
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Zuerst müssen wir herausfinden, welche Lua-Datei das Einheitensymbol kontrolliert. Es gibt keine einfache Nachschlagemöglichkeit dafür, es erfordert ein wenig Suchen. Zum Glück hat Firaxis ziemlich selbsterklärende Namen verwendet, das Einheitensymbol wird von den Dateien UnitFlagManager.lua und UnitFlagManager.xml bestimmt. Beide befinden sich im Ordner <Civ V>\assets\UI\InGame.

    Dann müssen wir zwei neue Dateien zu unserem Projekt hinzufügen. Anders als bei XML-Dateien ist es wichtig, dass wir bei Lua-Dateien den Namen beibehalten, nenne die neuen Dateien also UnitFlagManager.lua und UnitFlagManager.xml und entferne die Inhalte aus beiden. Es ist egal, in welchem Ordner diese Dateien platziert werden, aber um alles übersichtlich zu halten, habe ich einen Lua-Ordner angelegt und beide Dateien darin eingefügt.


    Jetzt kompiere die Inhalte der normalen UnitFlagManager.lua und UnitFlagManager.xml-Dateien in unsere leeren Projektkopien. Lua ist nicht so modular wie XML (InGameUIAddin erlaubt ein paar modulare Lua-Änderungen, ist aber beschränkt), also muss die gesamte Datei kopiert werden, damit Änderungen wirken.

    Es gibt mehr als eine Möglichkeit, das Einheitensymbol zu deaktivieren und verschiedene Programmierer werden verschiedene Methoden vorziehen. Aber hier ist eine. Die UpdateVisibility()-Funktion in UnitFlagManager.lua ist:
    Code:
    UpdateVisibility = function( self )
    	if InStrategicView() then
    		local bVisible = self.m_IsCurrentlyVisible and self.m_IsGarrisoned and g_GarrisonedUnitFlagsInStrategicView and not self.m_IsInvisible;
    		self.m_Instance.Anchor:SetHide(not bVisible);
    	else
    		self.m_Instance.Anchor:SetHide(not (self.m_IsCurrentlyVisible and not self.m_IsInvisible));
    	end
    end,
    Wenn wir uns den Code ansehen, können wir erkennen, dass, wenn das Spiel sich in der strategischen Ansicht befindet, das Einheitensymbol angezeigt wird, wenn die Einheit sichtbar, befestigt und die Einheit nicht unsichtbar ist. Wenn wir nicht in der strategischen Ansicht sind, wird das Einheitensymbol angezeigt, wenn die Einheit sichtbar und nicht unsichtbar ist.
    Der einfachste Weg, das Einheitensymbol abzustellen ist mit der folgenden Änderung:
    Code:
    UpdateVisibility = function( self )
    	if InStrategicView() then
    		local bVisible = self.m_IsCurrentlyVisible and self.m_IsGarrisoned and g_GarrisonedUnitFlagsInStrategicView and not self.m_IsInvisible;
    		self.m_Instance.Anchor:SetHide(not bVisible);
    	else
    -- Modified by Kael 07/17/2010 to disable the Unit Icon
    --		self.m_Instance.Anchor:SetHide(not (self.m_IsCurrentlyVisible and not self.m_IsInvisible));
    		self.m_Instance.Anchor:SetHide(true);
    -- End Modify
    
    	end
    end,
    In diesem Quelltext haben wir einfach eingestellt, dass das Einheitensymbol immer versteckt bleibt, wenn das Spiel nicht in der strategischen Ansicht ist. Iin der strategischen Ansicht werden dieselben Regeln für die Anzeige verwendet. Beachte auch, dass ich die Änderung kommentiert habe, um anzugeben, wer die Änderung vorgenommen hat, wann und warum. Außerdem habe ich eine Kopie der Originalzeile behalten, für den Fall, dass ich meine Änderung später rückgängig machen oder sehen will, was genau ich verändert habe (ohne mir die Originaldatei ansehen zu müssen).

    Ich könnte meine Mod jetzt veröffentlichen und es wäre eine Mod mit deaktivierten Einheitensymbolen. Aber so ist das keine elegante Lösung. Es wäre besser, wenn der Spieler die Möglichkeite hätte, das Symbol nach eigenem Gusto ein- und auszuschalten. Dazu lass uns eine neue Option an der Übersichtskarte hinzufügen, sodass der Spieler wählen kann, ob er das Symbol anzeigen möchte.

    Zuerst müssen wir unsere Änderung ausweiten, sodass wir eine Variable verwenden, anstatt den Anchor „Hide“ einfach auf wahr zu stellen.
    Code:
    UpdateVisibility = function( self )
    	if InStrategicView() then
    		local bVisible = self.m_IsCurrentlyVisible and self.m_IsGarrisoned and g_GarrisonedUnitFlagsInStrategicView and not self.m_IsInvisible;
    		self.m_Instance.Anchor:SetHide(not bVisible);
    	else
    -- Modified by Kael 07/17/2010 to disable the Unit Icon
    –		self.m_Instance.Anchor:SetHide(not (self.m_IsCurrentlyVisible and not self.m_IsInvisible));
    		self.m_Instance.Anchor:SetHide(not (self.m_IsCurrentlyVisible and not self.m_IsInvisible) or bHideUnitIcon);
    -- End Modify
    
    	end
    end,
    In dieser Version nutzen wir eine Variable, um das Einheitensymbol zu kontrollieren anstatt es einfach immer auf „versteckt“ zu stellen, wenn der Spieler nicht in der Strategieansicht ist. Wenn bHideUnitIcon wahr ist, verhält sich dieser Code genauso wie die vorherige Variante und versteckt das Symbol. Wenn bHideUnitIcon falsch ist, arbeitet er wie der Standardcode des Spiels.
    Wir müssen eine Voreinstellung für den Wert von bHideUnitIcon angeben, indem wir folgendes am Anfang der Datei UnitFlagManager.lua einfügen:
    Code:
    -- Added by Kael 07/17/2010 to disable the Unit Icon
    local bHideUnitIcon = true;
    -- End Add
    Beachte, dass ich wahr als Standardwert für bHideUnitIcon ausgewählt habe, sodass Einheitensymbole beim Start nicht angezeigt werden.

    Wir werden eine Beschriftung für unsere Menüoption brauchen. Erstelle einen neuen XML-Ordner und darin einen Ordner NewText. Und darin eine Datei namens GameText.xml. Die Ordnerstruktur ist nur für unsere Organisation, sie spiegelt die Dateistruktur der Civ5-XML-Dateien wider. Der Dateiname ist auch unwichtig (was zählt, ist das GameData-Tag). Es ginge auch, wenn die Datei Kram.xml hieße und direkt im Projektordner läge.

    Ersetze den voreingestellten Tex in der GameText.xml-Datei des Projekts durch folgendes:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    	<GameData>
    		<Language_en_US>
    			<Row Tag="TXT_KEY_MAP_OPTIONS_HIDE_UNIT_ICON">
    				<Text>Hide Unit Icons</Text>
    			</Row>
    	</Language_en_US>
    </GameData>
    Das ist eine einfache Textersetzung. Wann immer das Spiel auf Englisch gestellt ist und auf TXT_KEY_MAP_OPTIONS_HIDE_UNIT_ICON stößt, wird es das durch „Hide Unit Icons“ ersetzen.

    Um die Option, die Einheitensymbole ein- und auszuschalten, hinzuzufügen, müssen wir unser Projekt um zwei weitere Dateien erweitern: MiniMapPanel.lua und MiniMapPanel.xml. Genau wie bei den UnitFlagManager-Dateien erzeugen wir zwei neue leere Dateien, nennen sie MiniMapPanel.lua und MiniMapPanel.xml und kopieren die Inhalte der Originaldateien in unsere Kopien.

    Modifiziere die MiniMapPanel.xml-Datei, um die neue Option hinzuzufügen.
    Code:
    <Grid ID="OptionsPanel" Anchor="R,B" Size="300,300" Color="White.256" Style="Grid9DetailSix140" Padding="30,46" Hidden="true"
    ConsumeMouse="1" >
    	<Stack Anchor="C,C" Padding="0" Offset="0,5" StackGrowth="Bottom" ID="MainStack" >
    		<Stack Anchor="C,T" Offset="0,0" Padding="0" StackGrowth="Bottom" ID="StrategicStack" >
    			<Label Anchor="L,T" ColorSet="Beige_Black" Font="TwCenMT18" Offset="0,5" FontStyle="Shadow" ID="OverlayName" String="TXT_KEY_STRAT_OVERLAY"/>
    			<PullDown Style="GenericPullDown" ScrollThreshold="256" Offset="0,5" Size="210,27" SpaceForScroll="0" ID="OverlayDropDown"/>
    			<Label Anchor="L,T" ColorSet="Beige_Black" Font="TwCenMT18" Offset="0,5" FontStyle="Shadow" ID="IconName" String="TXT_KEY_STRAT_ICON_MODE"/>
    			<PullDown Style="GenericPullDown" ScrollThreshold="256" Offset="0,5" Size="210,27" SpaceForScroll="0" ID="IconDropDown"/>
    			<CheckBox Anchor="L,T" TextAnchorSide="Right" Offset="0,0" TextOffset="40,0" IsChecked="1" ID="ShowFeatures" String="TXT_KEY_STRAT_FEATURES" />
    			<CheckBox Anchor="L,T" TextAnchorSide="Right" Offset="0,0" TextOffset="40,0" IsChecked="1" ID="ShowFogOfWar" String="TXT_KEY_STRAT_FOW" />
    			<Box Anchor="C,T" Offset="0,5" Size="175,1" Color="Beige,120" />
    		</Stack>
    		<CheckBox Anchor="L,T" TextAnchorSide="Right" Offset="0,0" TextOffset="40,0" IsChecked="0" ID="ShowRecommendation" String="TXT_KEY_MAP_OPTIONS_RECOMMENDATIONS" />
    		<CheckBox Anchor="L,T" TextAnchorSide="Right" Offset="0,0" TextOffset="40,0" IsChecked="0" ID="ShowResources" String="TXT_KEY_MAP_OPTIONS_RESOURCE_ICONS" />
    		<CheckBox Anchor="L,T" TextAnchorSide="Right" Offset="0,0" TextOffset="40,0" IsChecked="0" ID="ShowYield" String="TXT_KEY_MAP_OPTIONS_YIELD_ICONS" />
    		<CheckBox Anchor="L,T" TextAnchorSide="Right" Offset="0,0" TextOffset="40,0" IsChecked="0" ID="ShowGrid" String="TXT_KEY_MAP_OPTIONS_HEX_GRID" />
    
    		<!-- Modified by Kael 07/15/2010-->
    		<CheckBox Anchor="L,T" TextAnchorSide="Right" Offset="0,0" TextOffset="40,0" IsChecked="1" ID="HideUnitIcon" String="TXT_KEY_MAP_OPTIONS_HIDE_UNIT_ICON" />
    		<!-- End Modify-->
    		<Box Anchor="C,T" Size="210,1" Color="0,0,0,0" />
    	</Stack>
    </Grid>
    Beachte, dass darin die Änderung wieder kommentiert ist, aber die Syntax für Kommentare in XML anders ist. Ein Kommentar beginnt mit „<!--“ und endet mit „-->“. Die wichtige Einstellung in der hinzugefügten Zeile ist IsChecked=“1“, was bedeutet, dass die Option zu Beginn ausgewählt ist. Die ID der Option ist „HideUnitIcon“ und der Text, der dazu angezeigt wird ist „TXT_KEY_MAP_OPTION_HIDE_UNIT_ICON“.



    Wir haben die Einheitensymbole standardmäßig deaktiviert und einen Menüeintrag ergänzt, der es Spielern erlaubt, die Einheitensymbole zu aktivieren bzw. zu deaktivieren. Aber dieser Menüeintrag macht noch nichts. Wenn ein Spieler ihn anklickt, sollte das die bHideUnitIcon-Variable, die wir in der UnitFlagManager.lua-Datei erstellt haben, umstellen.

    Lua-Skripte können Funktionen anderer Skripte nicht direkt aufrufen. Wenn wir wollen, dass ein Lua-Skript eine Funktion in einem anderen aufruft, müssen wir LuaEvents verwenden. Am Anfang von UnitFlagManager.lua müssen wir ein neues LuaEvent erstellen, wie folgt:
    Code:
    -- Added by Kael 07/16/2010
    local bHideUnitIcon = true;
    
    LuaEvents.ToggleHideUnitIcon.Add(
    function()
    	if (bHideUnitIcon) then
    		bHideUnitIcon = false;
    	else
    		bHideUnitIcon = true;
    	end
    end);
    -- End Add
    Die Funktion LuaEvents.ToggleHideUnitIcon() kann jetzt von anderen Skripten aus aufgerufen werden und den Wert in diesem Skript ändern.

    Wir müssen dafür sorgen, dass die von uns erstellte Menüoption LuaEvents.ToggleHideUnitIcon() aufruft. Dazu ergänzen wir in der MiniMapPanel.lua-Datei unseres Projekts folgendes:
    Code:
    -- Added by Kael 07/16/2010
    function OnHideUnitIconChecked( bIsChecked )
    	LuaEvents.ToggleHideUnitIcon();
    	Events.StrategicViewStateChanged();
    end
    Controls.HideUnitIcon:RegisterCheckHandler( OnHideUnitIconChecked );
    -- End Add
    Dieser Code legt einen Schalter zur HideUnitIcon-Einstellung an (das ist die ID der Option, die wir in der Datei MiniMapPanel.xml hinzugefügt haben). Wenn diese aktiviert wird, ruft sie die OnHideUnitIconChecked-Funktion auf. Diese löst das ToggleHideIcon()-Lua-Event aus und außerdem die Funktion Events.StrategicViewStateChanged(). StrategicViewStateChanged() sorgt dafür, dass die Flagge neu gezeichnet wird, sodass das Spiel nicht bis zur nächsten Aktualisierung der Einheit wartet, um das Symbol hinzuzufügen oder zu entfernen, sondern das geschieht, sobald der Spieler die Einstellung anklickt.

    Das ist es: Eine vollständige Mod, die Spielern die Möglichkeit gibt, die Einheitensymbole durch eine Menüoption im Übersichtskartenmenü ein- und auszuschalten. Dabei haben wir behandelt, wie man Texte hinzufügt, wie man Lua-Skripte in unserem Projekt verändert, wie man Lua-Funktionen an xml-Funktionen koppelt und wie man Funktionen in einem Lua-Skript aus einem anderen durch LuaEvents aufruft. Sobald man diese Grundlagen verstanden hat, wird das Schwierigste, herauszufinden, welches Skript und welche Funktion die Vorgänge verwaltet, die wir ändern wollen (woher wussten wir, dass die Einheitensymbole von UnitFlagManager.lua gesteuert wurden?) und welche Funktionen wir aufrufen müssen um zu tun, was wir brauchen (woher wussten wir, dass StrategicViewStateChanged() die Einheitenflaggen aktualisieren würde?)
    Für mich bedeutete das Experimentieren und viele Dateien durchlesen.

    Am Anfang mag es ein paar Stunden dauern, etwas wie das oben zu machen (es hat mich schon einige gekostet). Aber hoffentlich reduziert dieses Dokument diese Zeit deutlich. Und jetzt, da ich verstehe, was ich hier tun musste, wird meine nächste Änderung deutlich schneller vor sich gehen.

    Anleitung: InGameUIAddin verwenden, um modulare Benutzerschnittstellen-Veränderungen zu erstellen
    Es gibt eine Möglichkeit, modulare Lua-Veränderungen durch InGameUIAddin vorzunehmen.
    Diese Funktion ist beschränkt, sie kann neue Komponenten hinzufügen, kann aber schon vorhandene weder entfernen noch verändern. Um solche zu ändern oder entfernen, muss man die zugehörige Lua- und xml-Datei ersetzen wie wir das im letzten Abschnitt getan haben.

    In diesem Beispiel werden wir der Oberfläche eine Uhr hinzufügen. Wir fangen damit an, dass wir Dateien Clock.lua und Clock.xml zu unserem Projekt hinzufügen. Das sind keine Dateien, die andere ersetzen, also sind die Dateinamen egal. Wie bei allen Lua-Interface-Änderungen brauchen wir zusammengehörige XML- und Lua-Dateien. Die XML-Datei gibt Struktur und Einstellungen vor, die Lua-Datei stellt den Quelltext zur Verfügung.


    Zuerst füllen wir die Datei Clock.xml aus:
    Code:
    <Context ColorSet="Beige_Black" Font="TwCenMT20" FontStyle="Shadow" >
    	<Label Anchor="C,T" Offset="0,10" Font="TwCenMT20" ColorSet="Beige_Black_Alpha" FontStyle="Shadow" ID="ClockLabel"/>
    </Context>
    Das Definiert ein Schild mit der ID ClockLabel. Wir können die Schriftart (TwCenMT20), Farbe (Beige_Black_Alpha) und den Ort (in der Mitte oben auf dem Bildschirm, mit einem Abstand von 0 von links und 10 unten) des Schildes.

    Aber bis hierher ist es ein leeres Schild. Wir brauchen Clock.lua, um es mit der Zeit zu füllen. Für Clock.lua können wir folgendes nutzen:
    Code:
    ContextPtr:SetUpdate(function()
    	local t = os.date("%I:%M");
    	Controls.ClockLabel:SetString(t);
    end);
    ContextPtr:SetUpdate läuft bei jeder Bildschirmaktualisierung. Obige Funktion fügt diese Funktion zu diesem Prozess hinzu. Sie weist Stunde und Minute der Zeichenkette „t“ zu und setzt das ClockLabel in der XML-Definition auf diesen Wert.

    Unser nächster Schritt ist, dass wir unsere Benutzeroberfläche in der veränderten Version laden müssen, wenn die Mod lädt, so ähnlich, wie XML eine OnModActivated und UpdateDatabase-Funktion in den Aktionseinstellungen in den Modeinstellungen braucht. Für die InGameUIAddin-Änderungen müssen wir zum Inhalte-Menü der Modeinstellungen gehen und dort angeben, dass dies eine InGameUIAddin-Änderung ist und welche Lua-Datei wir aktivieren wollen (die zugehörige XML-Datei muss nicht angegeben werden).
    Angehängte Grafiken Angehängte Grafiken

  12. #12
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Im folgenden Bildschirmphoto können wir die Uhr sehen, die wir hinzugefügt haben (der rote Rahmen existiert nur, damit sie hier leichter zu finden ist, er wurde nicht von der Mod erstellt).


    Anleitung: Mit Lua einen neuen Bildschirm hinzufügen
    Es gibt während des Spielens keine Möglichkeit zu erfahren, welche Mods geladen sind.
    In diesem Abschnitt werden wir einen neuen Bildschirm im Menü „Zusätzliche Informationen“ einfügen, der alle geladenen Mods auflistet.

    Es gibt ein paar Hürden, die wir überwinden müssen, bevor wir dem Spiel einen neuen Bildschirm hinzufügen. Wir haben uns in einem früheren Abschnitt durch ein Beispiel für die Benutzung von InGameUIAddin gearbeitet. InGameUIAddin erlaubt uns, neue Benutzeroberflächenaspekte hinzuzufügen, ermöglicht es uns aber nicht, vorhandene Komponenten zu verändern. Dazu müssen wir die Dateien ersetzen. Das Problem mit dem Ersetzen von Lua-Dateien ist, dass das für Konflikte mit anderen Mods sorgt, die dieselben Dateien ersetzen.

    Für diese Mod müssen wir die folgenden Dateien ersetzen:
    DiploCorner.lua- Diese Lua-Datei steuert die Kontrolle in der oberen rechten Bildschirmecke. Wir werden sie verändern, um unsere neue Menüoption hinzuzufügen.
    DiploCorner.xml- Diese XML-Datei steuert die XML-Aspekte der UI-Diplomatie-Kontrolle.
    InGame.xml- Das ist der Hauptort, an dem Lua-Dateien registriert werden.
    NotificationLogPopup.lua- Diese Datei steuert das Benachrichtigungspopupmenü, wir haben vor, auf dieses Event zurückzugreifen , um unser neues hinzuzufügen.

    Und wir werden zwei neue Dateien hinzufügen, um den neuen Bildschirm zu steuern:
    ModList.lua- Die Lua-Datei für den neuen Bildschirm.
    ModList.xml- Die XML-Datei, die die Definitionen für den neuen Modlistenbildschirm steuert.


    1.Unser erster Schritt ist, die Dateien im Lua-Ordner unserer Mod anzulegen wie in dem Bildschirmphoto. Für DiploCorner.lua, DiploCorner.xml, InGame.xml und NotificationLogPopup.lua kopiere die eigentlichen Dateien aus dem Ordner „<Civ5Installationsordner>\Assets\UI\“ in die Entsprechung in unserer Mod.

    Die erste Änderung in InGame.xml ist, unsere neue Lua-Datei-Definition zu laden:
    Code:
    <LuaContext FileName="Assets/UI/InGame/Popups/SetCityName"
    <LuaContext FileName="Assets/UI/InGame/Popups/ProductionPopup"
    ID="SetCityName"
    ID="ProductionPopup"
    Hidden="True" />
    Hidden="True" />
    <!-- Added by Kael 09/17/2010 -->
    <LuaContext FileName="Lua/ModList"
    <!-- End Add -->
    ID="ModList"
    Hidden="True" />
    <LuaContext FileName="Assets/UI/InGame/TopPanel" ID="TopPanel" />
    Alles, was das macht, ist, unsere neue ModList.lua-Datei zu laden, wenn die Mod geladen wird. Mehr zu der Datei ModList.lua später.

    2.Als nächstes pass die Dateien DiploCorner.lua und DiploCorner.xml an, um die neue Option hinzuzufügen. Folgendes ist die Ergänzung in der Datei DiploCorner.lua:
    Code:
    local g_MultiPullInfo = {};
    g_MultiPullInfo[0] = { text="TXT_KEY_ADVISOR_SCREEN_TECH_TREE_DISPLAY",
    call=function()
    Events.SerialEventGameMessagePopup( { Type = ButtonPopupTypes.BUTTONPOPUP_TECH_TREE } ); end };
    g_MultiPullInfo[1] = { text="TXT_KEY_DIPLOMACY_OVERVIEW",
    call=function() Events.SerialEventGameMessagePopup( { Type =
    ButtonPopupTypes.BUTTONPOPUP_DIPLOMATIC_OVERVIEW } ); end };
    g_MultiPullInfo[2] = { text="TXT_KEY_MILITARY_OVERVIEW",
    call=function() Events.SerialEventGameMessagePopup( { Type =
    ButtonPopupTypes.BUTTONPOPUP_MILITARY_OVERVIEW } ); end };
    g_MultiPullInfo[3] = { text="TXT_KEY_ECONOMIC_OVERVIEW",
    call=function() Events.SerialEventGameMessagePopup( { Type =
    ButtonPopupTypes.BUTTONPOPUP_ECONOMIC_OVERVIEW } ); end };
    g_MultiPullInfo[4] = { text="TXT_KEY_VP_TT",
    call=function() Events.SerialEventGameMessagePopup( { Type =
    ButtonPopupTypes.BUTTONPOPUP_VICTORY_INFO} ); end };
    g_MultiPullInfo[5] = { text="TXT_KEY_DEMOGRAPHICS",
    call=function() Events.SerialEventGameMessagePopup( { Type =
    ButtonPopupTypes.BUTTONPOPUP_DEMOGRAPHICS} ); end };
    g_MultiPullInfo[6] = { text="TXT_KEY_POP_NOTIFICATION_LOG", call=function() Events.SerialEventGameMessagePopup( { Type =
    ButtonPopupTypes.BUTTONPOPUP_NOTIFICATION_LOG, Data1 = Game.GetActivePlayer() } ); end };
    -- Added by Kael 09/17/2010
    g_MultiPullInfo[7] = { text="TXT_KEY_MOD_LIST", call=function() Events.SerialEventGameMessagePopup( { Type =
    ButtonPopupTypes.BUTTONPOPUP_NOTIFICATION_LOG, Data1 = 999 } ); end };
    -- End Add


    Das fügt der Auswahlliste eine neue Option hinzu. Wenn die Option gewählt wird, übergibt sie BUTTONPOPUP_NOTIFICATION_LOG und 999 im Feld Data1. Später werden wir uns darum kümmern, wie man das Event auswertet und einstellt, dass sich dann das Menü öffnet.

    Das funktioniert gut, um einen neuen Menüeintrag zu dem Menü hinzuzufügen. Aber wir wollen auch die Größe der Liste anpassen, um genug Platz für die neue Option zu schaffen. XML steuert Größe und Format, wir müssen also DiploCorner.xml ändern, um die Größe anzupassen:
    Code:
    <!-- ==========================================================================================================-->
    <!-- Notification Log DropDownButtons -->
    <!-- ==========================================================================================================-->
    <PullDown ConsumeMouse="1" Offset="-6,0" Anchor="R,T" Size="45,45" AutoSizePopUp="0" SpaceForScroll="0" ScrollThreshold="900" ID="MultiPull" >
    	<ButtonData>
    		<Button Anchor="R,T" Size="45.45" Texture="assets\UI\Art\Notification\NotificationNotes.dds" ToolTip="TXT_KEY_DIPLO_ADDITIONAL" >
    			<ShowOnMouseOver>
    				<Image Anchor="R,T" Offset="0,0" Size="45.45" Texture="assets\UI\Art\Notification\NotificationNotes.dds" />
    				<AlphaAnim Anchor="R,T" Offset="0,0" Size="45.45" TextureOffset="0.0" Texture="assets\UI\Art\Notification\NotificationNotesHL.dds" Pause="0" Cycle="Bounce" Speed="2" AlphaStart="0.95" AlphaEnd="0.55"/>
    			</ShowOnMouseOver>
    		</Button>
    	</ButtonData>
    	<GridData Anchor="L,T" Offset="-24.-41" AnchorSide="O,I" Style="Grid9DetailTwo140" Padding="0,0" >
    <!-- Modified by Kael 09/17/2010
    		<Box Color="Black.0" Size="200.260" /> -->
    		<Box Color="Black.0" Size="200.280" />
    <!-- End Modify -->
    Das vergrößert die Liste von 260 auf 280.

    3.Wir haben mit unserer Änderung in DiploCorner.lua auf die BUTTONPOPUP_NOTIFICATION_LOG-Funktion zurückgegriffen. Wann immer wir also unsere neue Menüoption auswählen, tut sie so, als wäre das BUTTONPOPUP_NOTIFICATION_LOG-Popup aufgerufen worden. Hätten wir SDK-Zugang, würden wir für unsere Modliste eine neue BUTTONPOPUP-Definition erstellen. Ohne müssen wir kreativ werden. Wir rufen also BUTTONPOPUP_NOTIFICATION_LOG auf und übergeben einen Wert von 999 (normalerweise wird die Spielernummer übergeben, die niemals auch nur in die Nähe dieser Größenordnung käme).

    Weil wir auf die BUTTONPOPUP_NOTIFICATION_LOG-Funktion zurückgreifen, müssen wir dafür sorgen, dass der normale BUTTONPOPUP_NOTIFICATION_LOG-Dialog nicht startet. Weshalb wir NotificationLogPopup.lua zu unserem Projekt hinzugefügt haben.

    Erinnere dich daran, dass Lua-Funktionen Lua-Funktionen in anderen Dateien nicht direkt aufrufen können. Stattdessen registriert Lua Funktionen in einer zentralen Eventverwaltung und überwacht diese, um zu sehen, wann es handeln muss. In diesem Fall ist die normale OnPopup-Funktion aus NotificationLogPopup.lua:
    Code:
    function OnPopup( popupInfo )
    	if( popupInfo.Type ~= ButtonPopupTypes.BUTTONPOPUP_NOTIFICATION_LOG ) then
    		return;
    	end
    
    	CivIconHookup( Game.GetActivePlayer(), 64, Controls.CivIcon, Controls.CivIconBG, 	Controls.CivIconShadow, false, true );
    	m_PopupInfo = popupInfo;
    	g_NotificationInstanceManager:ResetInstances();
    	local player = Players[Game.GetActivePlayer()];
    	local numNotifications = player:GetNumNotifications();
    	for i = 0, numNotifications - 1
    	do
    		local str = player:GetNotificationStr((numNotifications - 1) - i);
    		local index = player:GetNotificationIndex((numNotifications - 1) - i);
    		local turn = player:GetNotificationTurn((numNotifications - 1) - i);
    		local dismissed = player:GetNotificationDismissed((numNotifications - 1) - i);
    		AddNotificationButton(index, str, turn, dismissed);
    	end
    	Controls.NotificationButtonStack:CalculateSize();
    	Controls.NotificationButtonStack:ReprocessAnchoring();
    	Controls.NotificationScrollPanel:CalculateInternalSize();
    	if( m_PopupInfo.Data1 == 1 ) then
    	if( ContextPtr:IsHidden() == false ) then
    		OnClose();
    	else
    	 UIManager:QueuePopup( ContextPtr, PopupPriority.eUtmost );
    	 end
    	 else
    	 UIManager:QueuePopup( ContextPtr, PopupPriority.NotificationLog );
    	 end
    end
    Events.SerialEventGameMessagePopup.Add( OnPopup );
    Darin wird die OnPopup-Funktion definiert und im SerialEventGameMessagePopup-Event registriert (in blau). Die erste Überprüfung der onPopup-Funktion ist, sicherzustellen, ob dieses Event, das durch SerialEventGameMessagePopup läuft, darauf anzuwenden ist. Sie überprüft also, ob der popupInfo.Type irgendetwas anderes als BUTTONPOPUP_NOTIFICATION_LOG ist (in rot). Wenn es etwas anderes ist, beendet sie die Funktion.

    Aber wir werden BUTTONPOPUP_NOTIFICATION_LOG für eine andere Funktion aufrufen und wir wollen nicht, dass dieses Popup erscheint, wenn wir das tun. Also ist folgende Änderung der NotificationLogPopup.lua-Datei nötig:
    Code:
    function OnPopup( popupInfo )
    	if( popupInfo.Type ~= ButtonPopupTypes.BUTTONPOPUP_NOTIFICATION_LOG ) then
    		return;
    	end
    -- Added by Kael 09/17/2010
    	if( popupInfo.Data1 == 999 ) then
    		return;
    	end
    -- End Add
    	CivIconHookup( Game.GetActivePlayer(), 64, Controls.CivIcon, Controls.CivIconBG, 	Controls.CivIconShadow, false, true );
    	m_PopupInfo = popupInfo;
    	g_NotificationInstanceManager:ResetInstances();
    	local player = Players[Game.GetActivePlayer()];
    	local numNotifications = player:GetNumNotifications();
    	for i = 0, numNotifications - 1
    	do
    		local str = player:GetNotificationStr((numNotifications - 1) - i);
    		local index = player:GetNotificationIndex((numNotifications - 1) - i);
    		local turn = player:GetNotificationTurn((numNotifications - 1) - i);
    		local dismissed = player:GetNotificationDismissed((numNotifications - 1) - i);
    		AddNotificationButton(index, str, turn, dismissed);
    	end
    	Controls.NotificationButtonStack:CalculateSize();
    	Controls.NotificationButtonStack:ReprocessAnchoring();
    	Controls.NotificationScrollPanel:CalculateInternalSize();
    	if( m_PopupInfo.Data1 == 1 ) then
    	if( ContextPtr:IsHidden() == false ) then
    	 OnClose();
    	else
    	 UIManager:QueuePopup( ContextPtr, PopupPriority.eUtmost );
    	 end
    	 else
    	 UIManager:QueuePopup( ContextPtr, PopupPriority.NotificationLog );
    	 end
    end
    Events.SerialEventGameMessagePopup.Add( OnPopup );
    Hier haben wir eine zusätzliche Überprüfung eingebaut. Genauso wie die Überprüfung, die die Funktion verlässt, wenn der Typ nicht BUTTONPOPUP_NOTIFICATION_LOG ist, verlässt diese Überprüfung die Funktion, wenn der Wert von Data1 999 ist. So können wir die BUTTONPOPUP_NOTIFICATION_LOG-Funktion teilen, ohne zu kollidieren.

    4. Schließlich kommen wir dazu, den Code für unseren neuen Bildschirm zu erstellen. Zuerst brauchen wir die XML-Definition für den Bildschirm. Folgendes war die Definition, die ich für ModList.xml verwendet habe:
    Code:
    <Context Font="TwCenMT14" FontStyle="Base" Color="Beige" Color1="Black" >
    	<Instance Offset="0,0" Name="NotificationButton" Size="890,60" >
    		<Button Size="890,60" Offset="0,0" StateOffsetIncrement="0" ID="Button">
    		<Button Anchor="L,C" Offset="0,0" Size="64.64" Texture="assets\UI\Art\WorldView\ActionItemsButton.dds" Hidden="1" ID="GenericButton" />
    		<Label Anchor="R,B" Offset="5,8" Font="TwCenMT24" ColorSet="Beige_Black_Alpha" FontStyle="Shadow" String="Turn" ID="NotificationTurnText" />
    		<Stack ID="TextStack" Anchor="L,T" Padding="10">
    			<Label Anchor="L,T" Offset="16,5" LeadingOffset="-8" WrapWidth="780" Font="TwCenMT18" ColorSet="Beige_Black_Alpha" FontStyle="Shadow" ID="NotificationText" String="Text" />
    			<Image Anchor="C,B" Offset="0,0" TextureOffset="0.0" Texture="bar900x2.dds" Size="900.1" />
    		</Stack>
    		<ShowOnMouseOver>
    			<AlphaAnim ID="TextAnim" Anchor="C,C" Offset="10,0" Size="890,64" Pause="0" Cycle="Bounce" Speed="1" AlphaStart="2" AlphaEnd="1">
    				<Grid ID="TextHL" Size="890,64" Offset="0,0" Padding="0,0" Style="Grid9FrameTurnsHL" />
    			</AlphaAnim>
    		</ShowOnMouseOver>
    	</Button>
    </Instance>
    <Box Style="BGBlock_ClearTopBar" />
    	<Instance Name="ListingButtonInstance">
    		<Button Anchor="L,T" Size="896,32" Offset="0,0" Color="Black.0" StateOffsetIncrement="0,0" ID="Button">
    			<ShowOnMouseOver>
    				<AlphaAnim Anchor="L,T" Size="896,72" Pause="0" Cycle="Bounce" Speed="1" AlphaStart="1.5" AlphaEnd="1" ID="SelectHighlight">
    					<Grid Size="896,36" Offset="0,0" Padding="0,0" Style="Grid9FrameTurnsHL" />
    			</AlphaAnim>
    		</ShowOnMouseOver>
    		<Stack StackGrowth="Right" Offset="0,0" Padding="0">
    			<Box Anchor="L,T" Offset="8,8" Size="175,24" Color="Black.0">
    				<Label Anchor="L,T" Offset="10,0" Font="TwCenMT18" ColorSet="Beige_Black_Alpha" FontStyle="Shadow" String="MOD TITLE" ID="Title" />
    			</Box>
    		</Stack>
    		<Image Anchor="L,B" Offset="0,0" TextureOffset="0.0" Texture="bar900x2.dds" Size="900.1" />
    	</Button>
    </Instance>
    <Grid Size="960,658" Anchor="C,C" Offset="0,36" Padding="0,0" Style="Grid9DetailFive140" ConsumeMouse="0">
    	<Image Anchor="L,T" Offset="17,90" Texture="HorizontalTrim.dds" Size="926.2" />
    	<ScrollPanel Anchor="L,T" ID="ListingScrollPanel" Vertical="1" Size="912,440" Offset="13,94" AutoScrollBar="1">
    		<ScrollBar Anchor="R,T" AnchorSide="O,I" Offset="0,18" Length="404" Style="VertSlider"/>
    		<UpButton Anchor="R,T" AnchorSide="O,I" Offset="0,0" Style="ScrollBarUp"/>
    		<DownButton Anchor="R,B" AnchorSide="O,I" Offset="0,0" Style="ScrollBarDown"/>
    		<Stack ID="ListingStack" StackGrowth="B" Offset="4,0" Padding="0" />
    	</ScrollPanel>
    	<Label String="TXT_KEY_POP_MOD_LIST" ID="Notifications Label" Anchor="C,T" Offset="0,19" Font="TwCenMT20" Color0="30.50.80.255" Color1="133.184.186.255" Color2="133.184.186.255" FontStyle="SoftShadow" />
    	<Box Anchor="C,B" AnchorSide="I.I" Offset="0,54" Size="910,56" Color="255,255,255,0" >
    		<GridButton Anchor="L,B" Style="SmallButton" Size="150,32" Offset="14,0" StateOffsetIncrement="0,0" ID="CloseButton" >
    			<Label Anchor="C,C" Offset="0,0" String="TXT_KEY_CLOSE" Font="TwCenMT18" ColorSet="Beige_Black_Alpha" FontStyle="Shadow" />
    		</GridButton>
    	</Box>
    	<Image Anchor="C,B" Offset="0,110" Texture="HorizontalTrim.dds" Size="926.5" />
    	</Grid>
    </Context>
    Auf den ersten Blick kann das erschreckend aussehen, wenn es aus dünner Luft erzeugt ist. Ich bin sicher, dass es Leute gibt, die das so auf dem Reißbrett erstellen können, aber ich gehöre nicht dazu. Stattdessen nehme ich die XML-Definition eines Bildschirms, der so ähnlich aussieht wie der, den ich erstellen will, und schneide, passe an und ergänze, bis er so aussieht, wie ich ihn haben will. Ich verwende den Benachrichtigungsbildschirm als Grundlage hierfür und habe dann VML aus dem ModBrowser (dem Ort, an dem du vom Hauptmenü aus Mods auswählst), um die Teile zu bekommen, die ich brauchte. Weil die gesamte Benutzeroberfläche von Civ5 in Lua vorliegt, steht alles zur Verfügung, um Teile davon für deine eigenen Bildschirme zu borgen.

    Das oben legt den Bildschirm fest, beinhaltet aber keinerlei Logik. Dafür brauchen wir Lua. Die Datei ModList.lua enthält folgendes:
    Code:
    include( "InstanceManager" );
    g_InstanceManager = InstanceManager:new( "ListingButtonInstance", "Button", Controls.ListingStack );
    
    function OnPopup( popupInfo )
    
    	if( popupInfo.Type ~= ButtonPopupTypes.BUTTONPOPUP_NOTIFICATION_LOG ) then
    		return;
    	end
    	if( popupInfo.Data1 ~= 999 ) then
    		return;
    	end
    
    	local unsortedInstalledMods = Modding.GetInstalledMods();
    	g_InstanceManager:ResetInstances();
    	for k, v in pairs(unsortedInstalledMods) do
    		local modinfo = v;
    		if(modinfo == nil) then
    			break;
    		end
    		if(modinfo.Enabled) then
    			local listing = g_InstanceManager:GetInstance();
    			local str = modinfo.Name;
    			if(modinfo.Version ~= "") then
    				local version = string.format("version %s (%s)", modinfo.Version or "", modinfo.Stability or "");
    				str = string.format("%s - %s", str, version)
    			end
    			listing.Title:SetText(str);
    		end
    	end
    	UIManager:QueuePopup( ContextPtr, PopupPriority.NotificationLog );
    end
    Events.SerialEventGameMessagePopup.Add( OnPopup );
    
    function OnClose ()
      UIManager:DequeuePopup( ContextPtr );
    end
    Controls.CloseButton:RegisterCallback( Mouse.eLClick, OnClose );
    Beachte, dass das so ähnlich ist wie der Code des Notification Log, den wir angepasst haben. Es meldet sich beim SerialEventGameMessagePopup (in blau), genau wie das das Notification-Log-Popup getan hat. Aber in diesem Fall erlauben wir der OnPopup-Funktion nur, weiterzumachen, wenn der Typ BUTTONPOPUP_NOTIFICATION_LOG ist und Data1 999 (in rot).

    Der Code ist recht leicht. Ich habe die ModBrowser-Lua-Dateien durchgelesen, um die Aufrufe und Funktionen zu finden, die ich brauchen würde (so habe ich von der Funktion Modding.GetInstalledMods() und den Rückgabewertattributen .Name und .Enabled erfahren). Im Wesentlichen fügt die OnPopup-Funktion der Bildschirmanzeige für jede installierte Mod, die in diesem speziellen Spiel aktiviert ist, neue Zeilen hinzu. Sie zeigt Namen, Version und Stabilität (experimentell, alpha, beta, final) einer jeden Mod an.

    Die einzige zusätzliche Funktion ist der Code, der den Schließen-Knopf steuert.
    Ein sehr einfaches Beispiel für das Hinzufügen eines neuen Bildschirms zum Spiel.

    WorldBuilder


    Der WorldBuilder ist ein Karteneditor und Szenarienersteller für Civ V. Mit ihm können Karten schnell erstellt werden und komplexe Szenarien mit startenden Teams entwickelt werden. Dieser Abschnitt wird die Optionen im Worldbuilder durchgehen, sodass Modder rasch anfangen können, ihre Szenarien zu erstellen.
    Angehängte Grafiken Angehängte Grafiken

  13. #13
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215


    Oben in der Datei-Leiste gibt es eine Beschreibungsoption (Description), die es dir erlaubt, Kartennamen und eine kurze Beschreibung für die Spieler einzugeben.

    Das nächste ist der Team-Editor. Er ermöglicht dem Szenarioersteller, die in diesem Szenario verfügbaren Zivilisationen ebenso wie ihre Starttechnologien, Politiken, Diplomatie, Gold usw. einzustellen.
    Bevor Städte oder nicht-barbarische Einheiten auf der Karte platziert werden können, müssen diese Teameinstellungen im Team-Editor vorgenommen sein.


    Der Karteneditor im WorldBuilder ist ziemlich selbsterklärend. Die MapEditorTools-Box enthält alle Werkzeuge, die man braucht, um eine interessante Karte zu erstellen, in den folgenden Menüs:

    Edit Plot- Macht es möglich, dass das ausgewählte Feld jede beliebige Geländeart, Feldeigenschaft, Feldverbesserung oder Rohstoffe erhält. Hier kann man auch Felder als Startpositionen für jeden eingestellten Spieler festlegen.
    Plopper- Hier können Feldeigenschaften, Rohstoffe, Modernisierungen, Naturwunder und Straßen schnell auf die Felder gemalt werden.
    Paint- Dieses Menü ermöglicht die Benutzung verschiedener Pinselgrößen, um Gelände, Eigenschaften, Kontinentdefinitionen, Kulturgrenzen und aufgedecktes Gelände zu bestimmen.
    Rivers- Wenn du dich mit dem Prozess des Flusserstellens im Civ4-Worldbuilder auskennst (ich bin ziemlich sicher, dass er das Opfern einer Ziege beinhaltete), wirst du bemerken, dass er in Civ5 stark verbessert wurde. Alle Hex-Grenzen, die ein Fluss entlangfließen könnte, können angeklickt werden, um einen Fluss, der dort entlangfließt, zu erstellen oder zu entfernen.
    Continents- Hier können Gebiete als Kontinente unterschieden werden (die Amerikas, Asien, Afrika und Europa).
    Units- Nur Barbareneinheiten können platziert werden, solange im Team-Editor keine Spieler eingestellt sind. Gibt es dort Spieler, erlaubt es dieses Menü, Einheiten auf die Karte zu setzen und ihren Zustand (Gesundheit, Befestigung, eingeschifft) festzulegen.
    Cities- Bevor dies benutzt werden kann, müssen im Team-Editor Spieler eingestellt sein. Ist das der Fall, können Städte auf der Karte platziert und dann Bevölkerungszahl und Gebäude in dieser Stadt eingestellt werden
    Misc- Hier kann man Einstellungen zur Kartenform und zufälliger Rohstoffverteilung vornehmen.

    Wenn deine Karte fertig ist, wähle im Menü „Datei“ „Speichern“, um sie zu speichern. Sie kann jederzeit wieder geladen werden, um weitere Veränderungen vorzunehmen. WorldBuilder-Karten werden im Ordner „..\<MyGames>\Sid Meier's Civilization V\Maps\“ gespeichert.

    Eine Karte aus Civ V speichern
    Wenn dir die Karte gefällt, auf der du gerade spielst, oder du glaubst, dass sie eine gute Grundlage für ein Szenario abgibt, kannst du sie direkt vom Spiel aus speichern.

    Dazu gehe in das Menü zum Spielspeichern; dort gibt es einen Knopf zum Kartenspeichern.


    Er öffnet das „Karte speichern“-Fenster, wo ein Name eingegeben werden kann. Klick auf Speichern, um die Karte zu speichern. Die Karte wird im Ordner „..\<MyGames>\Sid Meier's Civilization V\Maps\“ gespeichert werden (demselben Ordner, in dem auch der Worldbuilder seine Dateien speichert).


    Deiner Mod eine Karte hinzufügen
    Kopiere die Kartendatei im ModBuddy in deine Mod. Name und Ort der Datei sind egal. Ich empfehle, im Projektordner einen Ordner „Map“ anzulegen, um darin Karten zu speichern, aber das ist nicht erforderlich.
    Wenn die Mod geladen ist, kann deine Karte im Setup-Menü ausgewählt werden. Sie erscheint bei den normalen Karten des Spiels. In diesem Bildschirmphoto ist Ireland eine von der Mod bereitgestellte Karte.
    Angehängte Grafiken Angehängte Grafiken

  14. #14
    . Avatar von Swoon
    Registriert seit
    14.10.06
    Ort
    Bad Arolsen
    Beiträge
    215
    Wenn du im Team-Editor eigene Spieler erstellt hast, wird es auf dem Bildschirm eine „Szenario starten“-Option geben. Wenn diese nicht ausgewählt ist, wird deine Karte ohne eigene Spieler, Eineiten, Städte usw. geladen werden. Nur die Karte wird dann verwendet. Wenn „Szenario laden“ gewählt ist, können nur Zivilisationen/Anführer von der Karte gewählt werden.


    Deine Mod veröffentlichen
    Bevor du deine Mod testen kannst, musst du ModBuddy sie für dich erstellen lassen: „Build“. Das ist der Prozess, in dem alles, was du in deine Mod gepackt hast, zusammengenommen und in ein Format gebracht wird, das das Spiel erkennen kann.
    Du musst deine Mod erstellen, sooft du willst, dass die neuesten Änderungen Wirkung zeigen. Du solltest das oft machen und jede Änderung testen, sobald du sie hinzufügst (eher als viele Dateien auf einmal zu ändern und dann vor der schweren Aufgabe zu stehen, herauszufinden, welche Änderung das Spiel denn nun am Laden hindert).

    Sobald du bereit bist, deine Mod mit anderen zu teilen, kannst du sie auf zwei verschiedene Arten veröffentlichen.

    Die erste Möglichkeit ist, die Dateien außerhalb des Spiels zu verbreiten. Der ModBrowser ist eine tolle Sache, aber nicht nötig, um Mods zu teilen. Deine Mod wird in deinem „..\<My Games>\Sid Meier's Civilization V\MODS\“-Ordner sein. Du kannst den Modordner zippen und mit anderen teilen (die ihn dann in ihren „..\<My Games>\Sid Meier's Civilization V\MODS\“-Ordner entpacken müssen).

    Die zweite Möglichkeit ist durch den ModBuddy mit der „OnlineServices“-Option im Werkzeugmenü.

    Das lädt deine Mod in die Mod-Datenbank hoch, sodass andere sie im ModBrowser sehen werden.

    Um deine Mod hochzuladen, führe, nachdem du Online Services ausgewählt hast, folgende Schritte durch:

    1.Logge dich bei Gamespy an (falls nötig).
    2.Wähle im Online Services-Bildschirm „Upload“ aus. Beachte, dass dieser Bildschirm auch den Status von Mods anzeigen wird, die du schon hochgeladen hast, inklusive früherer Versionen.

    3.Klicke auf den ...-Schalter auf dem SelectModPackage-Bildschirm, um nach der Mod zum Hochladen zu suchen.
    4.Wähle das Modpaket aus. Es ist üblicherweise im Ordner ../My Documents/Firaxis/ModBuddy/<ModName>/Packages. Wenn du mehrere Versionen der Mod hast, werden sie alle hier erscheinen. Wähle die Version aus, die du hochladen willst (in der Regel die neueste).

    5.Warte, während die Mod hochgeladen wird.
    6.Wähle die Mod-Kategorien, die zu deiner Mod passen.

    Das ist es, deine Mod sollte hochgeladen sein und Spielern zum Herunterladen zur Verfügung stehen.

    Um eine Mod zu aktualisieren, ändere die Versionsnummer im Eigenschaften-Menü deiner Mod und lade sie wie beschrieben nochmal hoch.


    Exklusivität
    Es gibt für CivV-Mods drei Stufen der Exklusivität.
    Nonexclusive- Jede Mod kann gemeinsam mit deiner Mod geladen werden (Standard).
    Partially Exclusive- Jede Mod, auf die deine Mod verweist oder die auf deine Mod verweist, kann geladen werden.
    Totally Exclusive- Nur Mods, auf die deine Mod verweist, können geladen werden.

    Die meisten Mods werden non-exclusive sein. Das bedeutet, dass sie mit allen anderen nichtausschließlichen Mods (und teilweise oder ganz ausschließenden Mods, die sie auswählen) zusammenarbeiten. Wenn du eine Mod machst, die eine neue Zivilisation, neue Einheiten … hinzufügt, willst du sie wahrscheinlich zu einer nichtausschließlichen Mod machen.

    Partially Exclusive ist die für Mods, die alles ändern, angemessene Einstellung. Wenn du eine Mod zum Civil War machst, willst du wahrscheinlich nicht, dass Spieler sie mit einer spanischen Zivilisation oder einer Mod, die Firaxis als Weltwunder hinzufügt, spielen. Wenn deine Mod irgendwelche Inhalte des Grundspiels löscht (eine Ressource oder Technologie … entfernt), möchtest du wahrscheinlich, dass sie partially exclusive ist, weil diese Inhalte möglicherweise von anderen Mods verwendet werden. Wenn du oder andere Mod-Autoren einstellen, dass ihre Mod mit deiner läuft, werden sie zusammen geladen werden können.

    Totally Exclusive ist das Non-plus-ultra bei der Modkontrolle. Deine Mod kann in Kombination mit keiner anderen Mod verwendet werden, wenn du die nicht explizit angibst. Der einzige Unterschied zwischen dieser Einstellung und partially exclusive ist, dass dies andere Modder davon abhält, ihre Mods mit deiner lauffähig zu machen. Diese Einstellung sollte sehr selten sein; nur für Mod-Autoren, die Probleme damit hatten, dass andere Modautoren ihre Mods als kompatibel deklariert und dadurch Fehler hervorgerufen hatten.


    Fehlersuche
    Wenn du so ein blöder Kerl bist wie ich, verbringst du 10% deiner Zeit mit dem Erstellen und 90% der Zeit damit, herauszufinden, warum es nicht funktioniert. Von all den Dateien, die Firaxis uns zur Verfügung stellt, um beim Modden zu helfen, habe ich die meiste Zeit mit den Debuglogs verbracht.

    Sie befinden sich im Ordner „..\My Games\Sid Meier's Civilization 5\Logs\“. Da gibt es zahlreiche Dateien; ich finde es hilfreich, sie nach dem Datum zu sortieren, um zu sehen, welche zuletzt aktualisiert wurde. Ich werde nicht alle Dateien hier beschreiben, sondern nur die beiden, die ich am meisten verwende.

    Database.log
    Diese Datei enthält alle Fehlermeldung vom Laden der Datenbank. Das bedeutet üblicherweise XML-Verweisfehler. Wenn eine Zivilisation auf einen Anführer verweist, der nicht mehr existiert, oder eine Einheit auf einen Rohstoff, der entfernt wurde, ist Database.log ein guter Ort, um das herauszufinden.

    Das ist eine erstklassige Adresse, um Tippfehler zu entdecken. Wenn du LEADER_ELIZABETH falsch geschrieben hast und dein Spiel beim Laden abstürzt, wird dir diese Logdatei einen Hinweis geben, was falsch gelaufen ist. Hier ein paar Beispielfehler aus Database.log:
    Code:
    [207898.601] Invalid Reference on Civilizations.Civilopedia - "TXT_KEY_CIV_RUSSIA_PEDIA" does not exist in Language_en_US
    [207898.616] Invalid Reference on Feature_YieldChanges.FeatureType - "FEATURE_RIVER" does not exist in Features
    Lua.log
    So wie Database.log hilft, XML-Probleme ausfindig zu machen, hilft dir Lua.log, Lua-Fehler zu entdecken. Beachte, dass dir in den meisten Fällen (wie in dem Beispiel unten) die Lua.log-Datei angibt, welche Datei den Fehler hervorruft, und die zugehörige Zeilennummer. Sehr praktisch, um zu sehen, warum die Mod nicht läuft.
    Code:
    [202778.570] Syntax Error: [string "Lua/ModList.lua"]:165: 'end' expected (to close 'function' at line 14) near '<eof>'
    [202778.570] Runtime Error: Error loading Lua/ModList.lua.
    Designphilosophie
    Dieser Abschnitt beinhaltet ein paar Einsichten zu häufigen Design-Fallstricken und wie man sie vermeidet. Der Rest des Dokuments hat sich eher auf technische Aspekte des Moddens konzentriert, dieser Abschnitt ist dem Spieldesign geweiht.

    Es gibt keinen perfekten Weg, eine Mod zu machen. In dem Verständnis, dass ich unqualifiziert bin, diesen Abschnitt zu verfassen, habe ich die Hilfe meiner Modersteller-Kollegen (und meines Lieblingsdesigners) in Anspruch genommen, sodass Leser ein breites Meinungsspektrum erhalten können. Jeder der Gefahrenabschnitte wird von einer Frage zusammengefasst, die den Designern dazu gestellt wurde, wie sie mit den Herausforderungen des Entwickelns umgehen. Ihre Antworten bieten sehr praktische Ratschläge für alle Modautoren.

    Ich möchte mich bei folgenden Personen dafür bedanken, dass sie die Interviewfragen beantwortet und Material für diesen Abschnitt beigesteuert haben:
    Soren Johnson- Civilization IV Lead Designer.
    Jon Shafer- Civilization V Lead Designer.
    Sevo- Designer von Sevomod 3, Sevo's Civilopedia und Sevo's Faces of God.
    Rhye- Designer von Rhye's Catapult, Rhye's of Civilization und Rhye's and Fall of Civilazation.

    Erstelle das Spiel, das Du spielen willst
    Das ist die erste Regel: Du bist die einzige Person, die mögen muss, was du erstellt hast. Mache nicht die Mod, von der du glaubst, dass andere Leute sie haben wollen, ändere kein Design nur aufgrund von Rückmeldungen, wenn du nicht selbst damit übereinstimmst. Es ist besser, eine unbeliebte Mod zu haben, an der du dich erfreust, als eine beliebte, die du nicht magst. Das gilt für alle Ratschläge in diesem Abschnitt: Wenn du sie nicht magst, benutz sie nicht. Das ist der Vorteil des Moddens; Firaxis muss sich über Verkaufszahlen und den Massenmarkt Gedanken machen, wir nicht.
    Die Wahrheit ist, dass, wenn du dich an das hältst, was du magst, du im Laufe der Zeit andere finden wirst, die nach derselben Sache suchen, es wird gut laufen.

    Die Design-Fallstricke vermeiden
    Die Gefahr des „Mehr“
    „Perfektion ist nicht dann erreicht, wenn man nichts mehr hinzufügen kann, sondern wenn nichts mehr zu entfernen gibt.“ – Antoine de St. Exupery

    Jedes neue Objekt hat Kosten; nicht nur in Form dessen, was es braucht, um es zu erstellen, zu testen und zu verwalten, nein, der Spieler muss es auch im Auge behalten. Im Allgemeinen sollten wir neue Gegenstände nur hinzufügen, weil sie eine deutliche Verbesserung eines bestimmten Aspekts des Spiels darstellen, und nicht nur, um mehr Einheiten, Rohstoffe usw. zu haben.

    Es klingt gut, in der Lage zu sein, eine lange Liste neuer Objekte anzugeben. Das war ein großer Teil des Reizes der sehr beliebten Civ3 Double Your Pleasure Mod (DyP). Aber der Erfolg von DyP lag nicht an den neuen Objekten, sondern daran, dass jedes einen anderen funktionalen Zweck hatte. Gebäude hinzuzufügen ist leicht, sie wirklich lohnend zu machen ist der schwierige Teil.

    Ist es erforderlich? Würde man es vermissen, wenn es entfernt wird? Ist es von der Funktion her einzigartig? Wenn die Antwort darauf nein ist, sollte man darüber nachdenken, es zu entfernen.

    F: Es scheint immer noch ein Gebäude mehr zu geben oder eine Einheit, die im Spiel zu haben perfekt wäre. Wie entscheidest du, was aufzunehmen und was draußen zu lassen ist?
    [u]Soren Johnson[/b]
    Betrachte andere erfolgreiche Spiele als Beispiel für die Anzahl von Einheiten/Gebäuden/Auswahlmöglichkeiten, die aufgenommen werden. Blizzards RTSe zum Beispiel beschränken sich auf eine sehr steife Grenze von 12 bis 15 Einheiten je Fraktion. Das ist eine vernünftige Anzahl von Auswahlmöglichkeiten. Wir haben versucht, in Civ IV 8 bis 10 Einheitenauswahlmöglichkeiten pro Zeitalter zu haben, mit dem Verständnis, dass es eine gewisse Überschneidung geben würde. Das ist ein Bereich, in dem es vielleicht wirklich eine „magische Formel“ gibt, wie viele Möglichkeiten gerade richtig für den Spielspaß sind.

    Jon Shafer
    Als Designer musst du dich oft auf dein Bauchgefühl verlassen. Was „zu viel“ oder „zu wenig“ bedeutet, unterscheidet sich von Person zu Person. Ich denke, die meisten Designer neigen dazu, sich nach „womit würde ich gerne spielen“ zu richten. Zum Beispiel gibt es in Civ5 Fallschirmspringer, was bei Civ4 nicht der Fall war. Warum? Wirklich, nur weil ich dachte, sie wären cool. Es ist eine Möglichkeit, den Kampf in der Moderne zu würzen. Sobald du irgendetwas hinzugefügt oder verändert hast, ist es dennoch entscheidend, mit dem, was du getan hast, zu spielen, um sicherzustellen, dass es funktioniert. So viele der Ideen, von denen ich auf Papier gedacht hatte, sie wären cool, erwiesen sich im Spiel als Blindgänger. Wie erfahrene Designer gerne sagen: Beim Design geht es eher darum, etwas zum Laufen zu bringen, als darum, coole Ideen zu haben.

    Sevo
    Du musst vorsichtig damit sein, jede Einheit, die auftaucht oder die du dir ausdenken kannst, dazuzunehmen – an irgendeiner Stelle wirst du dich verzetteln. Ich ziehe eine langsamere Herangehensweise vor: ergänze eine Einheit oder zwei und spiel ein Spiel; schau dir an, wie die neue Einheit insgesamt betrachtet funktioniert. Das ist etwas, was ich früher schon hätte sagen sollen: Wenn du auf irgendeine Art verantwortlich für die Richtung und das Management einer Mod bist, solltest du sie während der Aktualisierung ziemlich regelmäßig spielen. Das ist der einzige beste Weg, zu lernen, wie deine Mod funktioniert und was die Probleme sind.

    Rhye
    Statistisch lehne ich 80% oder mehr der Vorschläge ab, die ich von Spielern erhalte, aus verschiedenen Gründen. Eine ist das Designschema: Oft passen sie nicht dazu. Ein anderer Grund ist das Fehlen von Graphiken: Ich füge nichts hinzu, das keine angemessene Darstellung hat. Ein weiterer Grund ist Komplexität/Umsetzbarkeit: Oft kann, was sie vorschlagen, nicht gemacht werden oder ist zu schwer: Aber in den meisten Fällen ist die Idee gut und eine einfachere Variante wäre perfekt.
    Und ein letzter Gesichtspunkt, nach dem man sich immer fragen muss: Wird die KI mit dieser Änderung umgehen können?

    Die Gefahr der Atmosphäre
    Warum scheinen Spiele, die auf Filmen, und Filme, die auf Büchern basieren, immer schlecht zu sein? Es gibt Ausnahmen, aber in der Regel sind wir von den Ergebnissen solcher Umwandlungen enttäuscht. Der Grund ist, dass das Design des neuen Spiels oder Films so stark auf der Atmosphäre seiner Quelle aufbaut, dass sein eigenes funktionales Design leidet.

    An einem gewissen Punkt solltest du deine Mod als einen bloßen funktionalen Prozess betrachten, als ein Brettspiel ohne irgendwelche modischen Komponenten, als eine Mathematik-Übung. Ein Spiel muss auf dieser Ebene gut sein, um Spaß zu machen. Manche Spiele sind so gut gemacht, dass sie nur auf dieser Ebene existieren und immer noch erstaunlich viel Spaß machen (Schach, Othello, Tetris usw.). Aber ein Spiel, das eine unglaubliche Atmosphäre, aber keine der Funktion nach bedeutungsvollen Elemente hat, wird immer ein schlechtes Spiel sein.

    Wenn du dich in ein Konzept verliebst, dass eine großartige Idee zu sein scheint, aber keinen funktionalen Wert hat, wird das Bedürfnis aufkommen, ein Erfordernis zu erfinden. Daran ist nichts falsch, manche Ideen entstammen der Atmosphäre, manche ihrer Funktionalität. Verschiedene Menschen sind unterschiedlich geneigt, vom einen oder dem anderen Ende her zu denken. Aber hüte dich vor der Gefahr, der Designen von der Atmosphäre her dich aussetzt. Wenn du nicht mit einer eleganten funktionellen Notwendigkeit aufwarten kannst, bist du am besser beraten, das atmosphärische Element zu entfernen oder zu ändern, als das funktionelle Design darunter leiden zu lassen.

    Diese Gefahr ist noch stärker vorhanden, wenn du deine Mod auf einer bekannten Quelle aufbaust. Es ist nett, schon all die Atmosphäre für dich entwickelt zu wissen, aber es kann ebenso hinderlich wie hilfreich sein. Du wirst entweder dein Design leiden lassen müssen (in welchem Grade liegt an deiner eigenen Fähigkeit, kreative elegante Lösungen zu finden) oder dich darauf einlassen, die Grenzen des Quellenmaterials zu verlassen und neue Elemente zu entwickeln oder Elemente trotz ihrer Existenz in der Quelle wegzulassen, wenn das Material nicht den Spielverlauf deiner Mod bereichert.

    F: Wie wägst du zwischen Funktion und Atmosphäre ab? Was machst du, wenn du eine funktionale Notwendigkeit für ein Element hast, aber nicht begeistert von den Gestaltungsideen bist, die du hast? Wie gehst du mit einem atmosphärisch guten Konzept um, für das es keine Notwendigkeit gibt?
    Soren Johnson
    Es ist leicht, anzunehmen, dass Funktion Atmosphäre schlagen sollte, aber in Wirklichkeit ist das Atmosphärische der ganze Grund dafür, dass Leute zuerst entscheiden, dass Spiel zu spielen. Sie kommen wegen der Atmosphäre; sie bleiben wegen der Funktion. Du musst beides haben; wenn du also ein nettes Stück Atmosphäre ohne zugehörige Funktion hast, arbeite entweder härter, um die Funktion zu finden, oder schmeiß es ganz raus.

    Jon Shafer
    Funktion und Atmosphäre müssen definitiv ausgewogen sein. Was genau dabei rauskommt, kann sich von Feature zu Feature schon ein bisschen unterscheiden. Ich denke, meistens ist es am besten, mit Atmosphäre anzufangen, weil das das ist, das deine Arbeit ins Gedächtnis ruft. Das ist einer der Gründe, warum Alpha Centauri so ein heiß geliebtes Spiel ist. Jedes Spiel beginnt mit einem „Aufhänger“, wenn du versuchst, Leute auf eine Idee anzusetzen. In einem weiten Sinne geht es bei Civilization darum, ein Reich am Laufen zu halten und Geschichte auf die Art zu gestalten, auf die DU sie gerne sehen würdest. Alles muss irgendwie wieder auf diese grundlegende Prämisse zurückweisen. Du musst dieselbe Denkweise auch auf einzelne Abläufe anwenden: „Was erwarte ich, soll ein Spieler denken oder fühlen, wenn er X spielt oder verwendet?“

    Nachdem das gesagt ist, es gibt auch Zeiten, wenn du als Designer eine Idee für ein System hast, von dem du wirklich begeistert bist, und du etwas Atmosphäre drumherum packen musst. Das ist so etwa die Art, auf die die Sozialpolitiken bei Civ5 ins Spiel gekommen sind. Ich hatte von Anfang an eine ziemlich gute Vorstellung davon, wie ich wollte, dass der Mechanismus funktioniert, aber viele der Namen und Details kamen später. Und er hat ein paar Varianten durchlaufen – das System tauchte nicht plötzlich fertig geformt in meinem Kopf auf oder so. Es brauchte einige Zeit und Liebe, bevor es an einem Ort endete, wo ich damit glücklich war.

    Sevo
    Das ist wahrscheinlich die wichtigste Frage, die bei der Moderstellung meiner Meinung nach beantwortet werden muss. Dieses Spiel ist für Erstellung und Modifikation so offen und es gibt so viele umherfliegende interessante Ideen, dass man dazu tendiert, sie ALLE zusammenzuwerfen und es ist so leicht, davongetragen zu werden. Ich denke, was du AUS einer Mod draußen lässt, ist ebenso wichtig wie was du reinsteckst.

    Dazu: Wenn ich an einer Mod arbeite, neige ich dazu, mich zuerst auf die Funktion und zweitens auf das Atmosphärische zu konzentrieren, denn wenn es schön und einzigartig, aber aufgrund von Unausgewogenheiten oder Gameplay-Angelegenheiten unspielbar ist, wird es niemand spielen. Das ist wirklich der Trick, glaube ich, eine großartige Mod zu machen: Die Atmosphäre und den Stil, die du dir entwirfst, zu schaffen, ohne die Funktionalität zu verlieren.

    Zu der Erfordernis eines funktionalen Elements ohne Atmosphäre und andersherum: Das ist die Stelle, an der der Einfallsreichtum und die Kreativität des Moddens ins Spiel kommen. Du wirst immer Dinge finden, die nicht ausbalanciert sind, oder Dinge, die angepasst werden müssen: Du als ein Modder kannst sie auf jede Art einbauen, die du dir vorstellen kannst, und dein Amt ist, das Gefühl deiner Mod zu erhalten, während du das tust. Andererseits hast du manchmal eine Geschmacksnote, eine Idee, die du wirklich liebst, aber die Funktion ist armselig. Du hast zwei Möglichkeiten: Finde einen Weg, sie zum Funktionieren zu BRINGEN, oder lass sie trotz ihrer Atmosphäre fallen.

    Die Siedlerreligionsmod zum Beispiel: Zu einem Zeitpunkt habe ich die in die Sevomod aufgenommen, aber sie hat das Spiel vollkommen unbalanciert gemacht, weil ALLE neuen Städte mit einer Religion anfingen. Ich mag die Idee wirklich, aber sie funktionierte in der Mod nicht, also musste ich sie sein lassen. Das schmerzt, aber wenn du keinen Weg finden kannst, sie funktionieren zu lassen, ist es besser, sie draußen zu lassen. Ich habe dutzende Ideen/Einheiten usw. ausprobiert und fallen gelassen, weil sie einfach nicht passten.

    Rhye
    Ich neige immer dazu, nur Dinge hinzuzufügen, die sowohl Funktion als auch Atmosphäre haben. Ich finde, dass wenn ich eine coole Einheit zum Hinzufügen habe, die jemand anders entworfen hat, aber keinen Ort, an den ich sie setzen kann, ohne die Spielbalance aus den Angeln zu heben, werde ich mich nicht darum bemühen. Und wenn ich fühle, dass eine Lücke von einer Einheit gefüllt werden sollte, aber ich keine angemessene graphische Darstellung habe, werde ich sie ebensowenig hinzufügen.

    Wenn wir von Karten reden, dann ist Funktion wichtiger als die Atmosphäre. Sieh dir an, wie viele riesige Karten entwickelt werden und worden sind; sie sind witzlos, weil niemand einen Computer hat, der stark genug wäre, sie zu spielen.

    Die Gefahr von Mustern
    Starcraft war für mich ein großer Augenöffner, ein RTS, das drei verschiedene Kräfte anbot, die ausbalanciert, aber komplett verschieden waren. Es ist so viel leichter, ein Spiel auszubalancieren, indem man einfach dafür sorgt, dass die Auswahlmöglichkeiten einander widerspiegeln, aber es ist unterhaltsamer für den Spieler, eine Vielfalt von Optionen zu haben, die verschieden sind.

    Wir könnten über jeden Spieinhalt reden. Zum Beispiel könnten wir eine Reihe von Civics haben, die +3 Forschung im ersten Level gäben, die man dann zu einem aktualisieren könnte, das +9 Forschung gäbe, sobald du die zugehörige Technologie erforscht hättest und schließlich bis zu +15 mit der abschließenden Technologie. Oder du könntest eine Reihe von Civics haben, von denen eines +3 Forschung, ein anderes +3 Gold und eines +3 Hämmer gäbe. In beiden Fällen mag das Ergebnis ausbalanciert sein, aber unkreativ und langweilig für den Spieler.

    Die offensichtliche Antwort darauf ist, dass wenn wir uns nicht an Muster halten, unvermeidbarerweise manche Optionen besser sein werden als andere. Bessere oder unbalancierte Optionen sind dasselbe wie keine Optionen. Aber ich denke, wir haben hier etwas Flexibilität. Das ist die Herausforderung von Design, dem Spieler mehrere Möglichkeiten mit verschiedenen Risiken und Belohnungen zu bieten und jede aus verschiedenen Gründen in verschiedenen Situationen praktikabel zu machen.

    Es scheint leichter zu sein, auf einem schon getesteten Design aufzubauen und neue Elemente vorhandenen funktionell ähnlich sein zu lassen, aber mit einer neuen Stufe oder anderen Reichweite der Auswirkung. Wie stellst du fest, wann das nicht innovativ genug ist? Oder ist das sogar für ein Strategiespiel eine Sorge?
    Soren Johnson
    Innovation sollte kein hochrangiges Ziel sein – Spielspaß sollte das Ziel sein. Innovation ist der Prozess, sowohl alte Systeme zu verbessern als auch neue aus dünner Luft zu erfinden. Jedenfalls ist es immer am besten, zu verstehen, was dein Spiel ausmacht, sodass deine neuen Systeme nicht unpassend werden. Zum Beispiel machen Felder, Runden und Boxen-die-sich-mit-Kram-füllen Civ aus.

    Jon Shafer
    Ich denke, das lässt sich darauf reduzieren, am Anfang klare Ziele zu haben. Kram an die Wand zu werfen, bis es funktioniert, ist eine Möglichkeit, ein Spiel oder eine Mod zu entwerfen, dauert aber grundsätzlich lange und kann teuer sein. Sobald ich ein grobes Ziel habe, habe ich die Neigung, immer die Extreme auszuprobieren und nötigenfalls die Dinge wieder zurückzudrehen. Wenn du etwas Verrücktes ausprobierst, könntest du auf Gold stoßen, oder auch nicht, aber dann wirst du wenigstens etwas gelernt haben und vielleicht gibt es dabei ein paar Ideen, die du auf andere Weise nutzen kannst. Wenn rein gar nichts funktioniert, kannst du dich immer noch auf das zurückziehen, was vorher gemacht wurde. Das Glück ist mit den Mutigen!

    Sevo
    Das ist eine schwierigere Frage, und ich glaube, sie fällt in den Bereich von „Was macht eine gute Mod aus?“ Es ist sicherlich leichter, einfach Kampfwerte oder Bewegungspunkte oder wasnichtalles zu ändern, wirklich ein gänzlich neues System zu erfinden ist schwer.
    Manchmal funktioniert ein neues System sehr gut: Zum Beispiel wurde die neue Zivilopädie, mit der ich angefangen habe, gut angenommen, weil sie, vermute ich, als eine Verbesserung gegenüber dem alten System wahrgenommen wurde. Andererseits habe ich in Faces of God ein neues Religionssystem ausprobiert und während ich Stunden über Stunden aufgewandt habe, um Einheiten, Python usw. für die Mod zusammenzustellen, gab das System hinterher nicht so tolles Spielgefühl her; zumindest nicht so, wie es war, und ich hatte keine Zeit, zurückzugehen und es nochmal zu untersuchen. Es ist also ein bisschen Versuch und Irrtum dabei, sicher, aber dabei eine erfolgreiche neue Idee zu treffen ist alle Verluste, die du erleiden wirst, wert.

    Rhye
    Ich glaube, dass das eine Sorge ist. Das macht den Unterschied zwischen einer Mod zum Hausgebrauch und zum Teilen. Wenn ich zum Beispiel nur ein paar Einheitenwerte verbessern will, werde ich das nicht posten. Iin der Regel würde ich wahrscheinlich eine bessere Mod als meine finden, die die Verbesserung vornimmt, die ich wollte, und noch etwas anderes.

    Ich werde die Mod teilen, wenn ich stattdessen eine einzigartige Idee habe, etwas, das vorher noch von niemandem umgesetzt wurde.

    Die Gefahr der Komplexität
    Der Fehler, den ein Designer am leichtesten begehen kann, ist der eines übertrieben komplexen Designs. Ein Designer sollte unterscheiden zwischen den Systemen, die zu entwerfen Spaß macht, und denen, die zu spielen Freude bereitet. Das sind kaum dieselben.

    Ich selbst kämpfe die ganze Zeit über gegen dieses Problem. Ich entwerfe das System, wie ich es mir vorstelle, setze es um und komme mit einem klaren Kopf darauf zurück, um einen Blick auf das zu werfen, was ich gemacht habe. Meistens kann ich einen großen Teil des Designs wieder streichen, ohne die Funktion oder Atmosphäre zu verlieren – oder stelle sogar fest, dass die Mod ganz ohne besser ist.

    Wie bei allem gibt es hier ein Gleichgewicht zu wahren. Jedes neue Feature bringt zusätzliche Komplexität mit, genauso, wie jedes neue Objekt etwas zu der Menge der Information beisteuert, die der Spieler im Blick behalten muss, wie wir in dem Abschnitt über die Gefahr des Mehr diskutiert haben. Die Idee zu haben ist nur der Anfang.

    Ich habe für eine Mod einen Herstellungsprozess in Betracht gezogen. Wenn du Zugriff auf Färbemittel und Baumwolle hast, kannst du eine Schneiderei bauen, die eine Kleidungsressource produziert. Wenn du Zugang zu Pelzen hast, kannst du eine Gerberei errichten, die eine Ressource Leder herstellt. Wenn du Kleidung und Leder in einer Stadt hast, erhalten alle Einheiten, die in dieser Stadt ausgebildet werden, Leder-Brustplatten, die ihre Kampfstärke verbessern. Und so ging das immer weiter; es hat Spaß gemacht, das zu entwerfen, große komplexe Systeme mit gegenseitigen Abhängigkeiten überall. Es wäre für die meisten Spieler eine Katastrophe gewesen, das zu spielen. Ich will nicht sagen, dass niemand Spaß daran gehabt hätte, mancher mag Komplexität. Denk aber immer daran, dass, was beim Entwerfen angemessen einfach klingt, nach dem Zusammenfügen mit all den anderen Dingen in den Händen eines Spielers, der nicht deine vielen Stunden des Entwerfens und Bastelns hinter sich hat, ein entscheidendes Hindernis sein kann

    F: Wie findest du einen Mittelweg zwischen komplexen Ideen, die dem Spiel neue Elemente hinzufügen und den Schwierigkeiten, die sie Gelegenheitsspielern bereiten?
    Soren Johnson
    Die beste Stelle für das Einfügen komplexer Ideen ist am Rand, an den Orten, an denen der Spieler die Komplexität nicht verstehen muss, wenn er nicht will. Zum Beispiel haben viele Civ4-Spieler wahrscheinlich nicht verstanden, wie die Wahrscheinlichkeiten für Große Personen berechnet wurden. Aber dass sie die Details nicht kannten, hat sie nicht unbedingt davon abgehalten, voranzuschreiten und sich der gelegentlichen Großen Person zu erfreuen, die sie auf natürliche Weise bekamen.

    Jon Shafer
    Ich denke, Systeme können so entworfen werden, dass sie einigermaßen zugänglich sind und trotzdem noch Tiefe haben. Das war bei den Sozialpolitiken mein Ziel. Sehr viele Entscheidungen, die man treffen muss, aber das System ist auch beim ersten Spiel nicht unmöglich zu verstehen. Auch hier unterscheidet sich der individuelle Geschmack, aber ich fühle, dass es möglich ist, beide Enden des Spektrums zu treffen, wenn das von Anfang an dein Ziel ist. Du wirst dennoch nicht zufällig darauf stoßen! Ich denke, du kannst Mechanismen haben, die sich an erfahrenere Spieler richten, aber sie können nicht das Herzstück der Spielerfahrung sein und neue Spieler sollten in der Lage sein, ein Feature gefahrlos zu ignorieren, wenn sie sich nicht mit seiner Benutzung wohlfühlen.

    Sevo
    Ich mache mir keine zu großen Sorgen darüber, dem Gameplay neue Ideen hinzuzufügen. Meine Mod ist in erster Linie eine Erweiterung des Gameplays, die meisten Nutzer folgen also ziemlich schnell. Auch wenn ich Sachen ändere, stelle ich fest, dass Spieler von Natur aus schnell darin sind, neue Funktionen auszuwählen, wenn sie nicht zu geheimnisvoll oder kompliziert sind.

    Rhye
    Ich baue auf Rückmeldungen. Wenn ich sehe, dass eine komplexe Änderung sowieso willkommen ist und verstanden wird, ist es okay. Dokumentation (eine Seite, FAQ, und schnelle Antworten im Forum) können wichtig sein. Aber noch wichtiger als das ist die Schwierigkeit, die es mir bereiten wird. Wenn ich etwas in meinen Plan aufnehme, habe ich mich bereits gefragt, ob es möglich ist, das zu machen, und wie.

    Zwei Beispiele dafür, was man NICHT machen sollte:
    Eine Liste von Features aufstellen und bekannt geben, ohne eine Ahnung zu haben, wie man das macht, und
    ohne einen Stichtag zu arbeiten, deine Arbeit über Monate zu verschleppen. Es stimmt, du arbeitest ohne Bezahlung, aber wenn du deine Arbeit nicht fertigstellst, wirst du deine Zeit wirklich verschwendet haben.


    Der Prozess der Moderstellung
    Das Designdokument schreiben
    Es macht keinen Spaß, jeder möchte sofort anfangen, Änderungen vorzunehmen und diese Änderungen im Spiel sehen. Aber dein erster Schritt ist es, ein Designdokument zu schreiben. Es kann ein Post im Forum sein, ein Worddokument oder einfach Notizen auf Papier. Ohne wird deine Modentwicklung aber keinen Schwerpunkt haben und es wird schwer werden, die Zeit gut zu nutzen, wenn du keine klare Vorstellung davon hast, was getan werden muss. Es wird auch schwer für Teammitglieder, zu helfen, wenn sie keinen Zugriff auf die komplette Designliste haben.

    Mir fällt es schwer, am Computer kreativ zu werden, also schnappe ich mir Notizbuch und Stift, wenn ich mich an richtige Designarbeit mache. Auf einem gemütlichen Stuhl sitzend bringe ich Ideen zu Papier und denke über Dinge nach, die ich verbessern möchte. Verschiedene Personen haben unterschiedliche Methoden, das Wichtige ist, eine zu finden, die für dich funktioniert.

    Wirtschaft = Auswahl in der Knappheit
    Ein Spiel ist eine Unterhaltungsaktivität, die uns Wahlmöglichkeiten gibt und uns dafür belohnt, unter diesen eine geschickte Auswahl zu treffen. Die Beschaffenheit dieser Wahlmöglichkeiten, die Menge des angemessenen Risikos und Gewinns, die wir jeweils erhalten, die Vielfalt der Optionen (ohne überfahrend zu sein) und das erfolgreiche Zusammenfügen von Funktion und passender Atmosphäre bestimmen, ob das Spiel ein gutes ist.

    Um Entscheidungen zu treffen, braucht es Kosten, etwas, das wir aufgeben, um den Vorteil zu erhalten, den die Entscheidung uns bietet. Das könnte in Form einer anderen Ressource bezahlt werden, wie Gold, Produktion oder Zeit oder durch etwas weniger festgelegtes.
    Eine der klassischen Entscheidungen zu Beginn des Spiels ist: Baust du die Infrastruktur deiner Städte aus oder Verteidiger? Wenn du Infrastruktur baust, wirst du ab Mitte des Spiels bessere Städte haben, wenn du bis dahin überlebst. Aber der Preis dafür ist ein vergrößertes Risiko eines Angriffs und das Verlieren des Spiels.

    Das ist ein elegantes Spieldesign (danke an Sid Meier). Um Optionen zu haben, müssen wir Grenzen haben, wir können nicht alles machen, also müssen manche Dinge geopfert werden, um andere zu erhalten. Das muss nicht heißen, dass alle Optionen einen direkten Nachteil haben müssen, es kann schon genug sein, dass du damit die Möglichkeit aufgibst, andere Wege einzuschlagen; das ist Wirtschaft.

    Ich bin besonders beeindruckt vom Design der Civics in Civ4. Ich selbst mag es, Staatsformen zu haben, die neben all ihren Vorteilen einen direkten Nachteil liefern, aber aus einer reinen Designperspektive hege ich eine große Bewunderung für Firaxis. Die Staatsformen brauchen keine Nachteile, ihr Nachteil ist, dass man, wenn man eine auswählt, keine andere aus derselben Kategorie mehr nehmen kann.

    Eine andere Wahrheit der Knappheit ist, dass wir gute und schlechte Elemente brauchen, damit es klappt. Aus der Sicht eines Spielers sind Wüstenfelder nutzlos, sie haben ein paar Funktionen, sind aber allgemein das nutzloseste Gelände. Du fragst dich also vielleicht, warum sie nicht entfernt und durch etwas besseres ersetzt werden können. Ihre Design-Funktion ist, dass sie nicht nützlich sind, und deshalb – im Vergleich – andere Geländearten es sind. Der Unterschied zwischen diesen beiden macht die strategischen Optionen des Spielers interessanter.

    Im Zweifel vertrau auf Firaxis
    Das alte Sprichwort sagt, dass wenn im Wald ein Zaun steht, du wissen solltest, wer ihn errichtet hat und wozu er aufgestellt wurde, bevor du ihn abreißt. Das war niemals wahrer als beim Modden. Iich gebe zu, ich mag es noch mehr, Dinge zu ändern, als daruber zu lesen, wie die Dinge funktionieren, deshalb verfange ich mich manchmal in der Falle, dass ich etwas entwerfe ohne gute Einschätzung, wie die zugehörigen Systeme funktionieren.

    Mein Rat ist: Bevor du eine größere Änderung vornimmst, schau dir im Detail an, wie etwas Ähnliches funktioniert. Wenn du einen neuen Kampf entwerfen willst, sieh dir die an, die schon entwickelt worden sind. Such in Python, XML und dem SDK nach Treffern für einen ähnlichen Kampf und schau dir an, wo er wofür benutzt wird. Wenn du verstehst, wie die Daten verwendet werden, wirst du besser darauf vorbereitet sein, deine eigenen zu erstellen.

    Dasselbe gilt für das Balancing. Firaxis hat länger daran gearbeitet und mehr Mannstunden in „Civ Vanilla“ investiert als wir für irgendeine Mod erhoffen können. Lass nicht all dieses Testen und Feedback Verschwendet gewesen sein. Schau dir die Erhöhungen von iCombat zwischen modernisierten Einheiten an, die Civ anwendet, wenn du deine eigene planst. Baue deine neuen Auswirkungen von Spezialisten auf den schon vorhandenen auf.

    Prioritäten setzen und Nein sagen
    Die traurige Wahrheit ist, dass wir alle nur beschränkt viel Zeit haben. So sehr wir unsere Mod auch lieben, es gibt nur soundsoviele Stunden am Tag und die meisten von uns haben Beruf und Familie, die auch unsere Zeit beanspruchen (an meine Frau: „Ich meine, mit denen wir Zeit verbringen wollen.“)

    Wir müssen mit unserem Ehrgeiz vorsichtig sein. Wenn dein einziges Ziel ist, zum Spaß zu modden, herumzuspielen, unser Spiel zu ändern und die Prozesse ein bisschen zu lernen, ist das keine große Sorge. Wenn wir mit anderen zusammenarbeiten und sie geholfen haben, indem sie ihre Zeit und Arbeitskraft der Mod zur Verfügung gestellt haben, wird das wichtiger. In diesen Fällen gibt es eine gewisse Verantwortung dafür, eine funktionierende Mod zu erstellen.

    Wir müssen also realistischerweise entscheiden, was getan werden wird und was nicht oder zumindest nicht in nächster Zeit. Wenn du dich mit Python oder C++ nicht auskennst, ist es vielleicht etwas viel, eine Mod anzufangen, die Änderungen der Programmierung erfordert. Aber du könntest dich auf reine XML-Mods konzentrieren.

    Sobald du deine Idee hast, musst du Schwerpunkte setzen. Ich halte immer Ausschau nach dem „Sabberfaktor“, nach den Dingen oder Ergänzungen, die die Leute dazu bringen, die Mod herunterzuladen und zu spielen. Niemand hat jemals eine Mod heruntergeladen, weil sie 17 verschiedene Arten Infanterie oder eine Eiswageneinheit beinhaltete, die beim Herumfahren Musik abspielte (nun, möglicherweise würde ich die Mod herunterladen, einfach um sie mal auszuprobieren), so interessant diese Ideen also sein mögen, sie haben keinen Sabberfaktor.

    Du hast zahllose Spieleankündigungen für das eine oder andere Spiel gelesen. Welche Features sind dir dabei untergekommen, die dich begeistert haben? Das ist die Art von Dingen, die an der Spitze deiner Prioritätenliste stehen sollten. Ich hasse es, Zeit mit der Arbeit an einem Feature zu verbringen, das die Spieler nicht begeistern wird.

    Und manche Änderungen sollten überhaupt nicht vorgenommen werden. Das ist schwieriger, wenn du mit einem begeisterten Team zusammenarbeitest, das ebensosehr an der Mod arbeitet wie du. Aber der Modbesitzer muss derjenige sein, der sagt, was dabei sein wird und was nicht. Denke daran, dass es lichter ist, nein zu sagen und die Meinung später zu ändern und es doch noch hinzuzufügen, als all die Arbeit auf sich zu nehmen, um etwas zu machen, nur um es später wieder zu entfernen.

    Ein Team aufbauen
    Es gibt keinen magischen Trick dafür, ein Team aufzubauen. Nimm am Anfang an, dass du alle Arbeit selbst machen musst, und fang dann an. Wenn unterwegs jemand dazustößt, um zu helfen, umso besser, aber erwarte das nicht.

    In den meisten Fällen macht eine Idee allein, egal wie ansprechend, noch kein Team. Stattdessen muss der Modautor seine Arbeit vorzeigen, um anzufangen, Hilfe zu bekommen. Der Grund ist, dass täglich neue Ideen für Mods gepostet werden, die um Hilfe bitten. Natürlich wollen Menschen keine Zeit mit der Arbeit an einer Modidee verbringen, die niemals veröffentlicht wird. Wenn sie sehen, dass du selbst schon eine Menge Mühe reingesteckt hast, ist das Risiko, dass ihre Arbeit verschwendet sein wird, geringer und sie sind geneigter, mitzumachen.

    Ich bin der Ansicht, dass der Modersteller einer umfangreichen Mod ein Programmierer sein sollte. Er muss nicht der beste Programmierer des Teams sein (das bin ich in meinem Team sicherlich nicht), aber er muss die Aspekte des Programmierens verstehen. Das liegt daran, dass er derjenige sein muss, der entscheidet, was in die Mod aufgenommen wird und was nicht; er wird diese Entscheidung nicht gut treffen können, wenn er kein anständiges Verständnis davon hat, was „unter der Oberfläche“ geschehen muss, damit das funktioniert. Und der Modersteller muss immer bereit sein, es alleine zu machen, wenn nötig. Wenn du den Programmierteil einem anderen überlässt ohne in der Lage zu sein, einzuspringen, falls sie gehen, riskierst du, deine Mod zu verlieren, wenn sie weiterziehen und zu anderen Dingen übergehen.

    Eines noch zu Teams. Das ist ein offener, Spaß machender Prozess der Zusammenarbeit. Erwarte nicht, dass Deadlines und beliebige Ziele erreicht werden, solange du dein Team nicht bezahlst. Es fällt in die Verantwortung des Moderstellers, die Arbeit, die getan werden muss, aufzulisten, und die Teammitglieder können an Verschiedenem arbeiten, wie es ihnen beliebt. Alles, was darüber hinausgeht, macht keinen Spaß mehr. Es ist unvermeidbar, dass du an einer Komponente arbeitest und etwas von einem anderen Teammitglied brauchst, um sie zu vollenden, oder dass Teammitglieder kommen und gehen, wie ihr Leben es ihnen vorschreibt, aber das ist das Wesen von Zusammenarbeit beim Modden.

    Wann veröffentlichen?
    Eine Mod ist nie perfekt, es gibt immer ein neues Feature, neue Graphiken oder Objekte, die du gern noch aufnehmen würdest, bevor du sie veröffentlichst. Die Gefahr daran ist, dass du sie dann nie herausbringst.

    Schwung ist wichtig für eine Mod, sowohl für dich (von den Spielern zu hören, die deine Mod genießen, wird dir die Energie geben, weiterzumachen) als auch insbesondere für dein Team (das seine Beiträge herausgebracht und verfügbar sehen will). Andere Modder mögen das anders halten, aber ich setze gerne feste Veröffentlichungsdaten und arbeite dann von denen aus rückwärts, anstatt von der Featureliste auszugehen. Wenn ich mich darauf festlege, am ersten Freitag jedes Monats eine neue Version zu veröffentlichen, wissen du und dein Team genau, wann die neuen Sachen fertig eingebaut sein müssen, damit sie dabei sind.

    Nach Fertigstellung bestimmter Features zu veröffentlichen erzeugt einen Druck, die Arbeit erledigt zu kriegen, der dein Team reizen kann, wenn es sich fühlt, als hielte es die Veröffentlichung auf.
    Besser den Mitarbeitern einfach die Daten sagen und sie ihren Teil verwalten lassen, wie sie das vorziehen.


    ---------------------------------------------------------------------
    Geschafft. Bis auf Überarbeitungen und Korrekturen (und die Stellen, für die ich noch etwas nachschauen wollte) war es das.
    Realistisch betrachtet kann es zwei oder vier Wochen dauern, bis ich die Zeit finde, mir diese letzten Überarbeitungen vorzunehmen und die Übersetzung damit ganz abzuschließen.
    Es wäre schön, wenn ihr mir hier bis dahin Hinweise (und am besten Verbesserungsvorschläge) zu allem schreiben könntet, was euch besonders an inhaltlichen, aber auch Rechtschreib-, Grammatik- und Zeichensetzungsfehlern und natürlich (Übersetzungs-)Stilblüten auffällt.
    Angehängte Grafiken Angehängte Grafiken

  15. #15
    Registrierter Benutzer
    Registriert seit
    17.02.09
    Beiträge
    17

    Kaels Guide als pdf

    Hi, wie versprochen lade ich das pdf des Guides hoch.
    Das pdf alleine war leider zu groß um es hochzuladen, drum hab ich es gezippt.
    Vielleicht kann das ja der Threadersteller - vielen Dank nochmal an ihn für die super Arbeit - oder ein Moderator auf der ersten Seite hinzufügen!?

    Habe das jetzt einfach mal quick and dirty zusammengeschustert. Sollten also Fehler drin sein bitte einfach melden und ich werde das dann korrigieren.

    Gruß
    Jakera
    Angehängte Dateien Angehängte Dateien
    Geändert von Jakera (14. Januar 2011 um 09:54 Uhr)

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •