Alles was ich geändert habe, oder einfach meine Meinung dazu schreibe bekommt die Farbe Orange
-----------------------------------------------------------------
Einleitung
Wir alle kennen die InGame-Kommandomenüs der Schiffe. Navigation, Kampf, Handeln und Spezial. Egosoft hat X² extrem erweiterbar gemacht, inklusive dieser Menüs. Viele von uns haben sich Scripte aus dem Web geholt die die Funktionalität von X² erweitern. Und wenn es auch nur BurnIt's neue Trade Command Extension MK3 mit seinem "Start Sector Trader" Kommando ist. Hier werde ich nun eine (vom Original leicht erweiterte) Schritt-für-Schritt Anleitung schreiben, wie man seine eigenen Scripte in die vorhandenen Menüs von X² einhängt.
In diesem Tutorial wird ein Script von Reven als Beispiel verwendet, das er selber geschrieben hat, und das ins Trademenü eingehängt wird. Dieses Script versucht die Anzahl der Produkte einer Fabrik auf einem vorgegebenen Füllstand zu halten. Das ist dann von Vorteil wenn man eine Fabrik hat, die nur eine minimale Anzahle ihrer Produkte bereit halten kann und man nicht ständig von Hand die Produkte in einen Frachter transferieren will. Eine detaillierte Beschreibung des Script und dem Grund hinter diesem Script findet man hier (in Englisch)
Anforderungen
- Eine Kopie der Beispielscripte von Frag-Warez.org
- Ein XML-Editor wäre praktisch, ist aber kein muss. Reven empfiehlt da den simplen Peter's XML Editor
- Ich selber habe den XMLMind XML Editor, habe aber meine ersten Gehversuche mit X²-Scripting und diesem Tutorial mit dem in X² eingebauten Editor gemacht.
Es sind hauptsächlich 3 Schritte notwendig um ein Script in die Menüs einzuhängen. Als erstes benötigt man natürlich das Script welches man einhängen will. Zweitens braucht man eine XML-Sprachdatei die den Text enthält, den man zum Spiel hinzufügt. Und als drittes und letztes braucht man ein Script welches automatisch von X² aufgerufen wird und das eigentliche Script in den Menübaum einhängt.
1. Schritt
Das eigentliche Script. Da dies kein Tutorial über Scripting allgemein ist werde ich hier nicht wirklich in die Tiefe gehen. Soviel sei aber über Scripting gesagt, das der beste Weg es zu lernen ist, wenn man sich einfach vorhandene Scripte anschaut. Als Anregung wären da die original Egosoft-Scripte. Dazu braucht man den X2Modder von OlisJ um die Egosoft-Scripte auszupacken. Alternativ dazu kann man auch den X² Archiver benutzen. Der kommt nämlich auch ohne das .NET Frameset 1.1 aus. Egosoft war so nett uns ein hübsches XSL-Stylesheet zu überlassen, mit dem man die Scripte einfach per Doppelklick zB. im Internet-Explorer anschauen kann, sobald sie einmal entpackt sind.
2. Schritt
Hier kommen wir zum eigentlichen Kern der Sache. Die meisten Spieltexte für so ziemlich alles, angefangen von Gütern bis zu den Schiffsbeschreibungen und Menükommandos sind in externen XML-Sprachsdateien abgelegt. Diese Dateien sind an 2 Orten anzutreffen: Entweder im "X2\t" Verzeichniss oder innerhalb der Kontainerdateien (die Zip-Dateien entsprechen aber keine Zips sind). Das meiste der bisherigen Spieltexte sind ind den XML-Sprachdateien innerhalb der *.CAT/*.DAT Dateipaare im eigentlichen X² Verzeichniss. Jede Datei innerhalb dieser Kontainer wird wie eine Datei in den "normalen" Unterverzeichnissen von X² behandelt. Man kann mit X2Modder eben diese Kontainer entpacken und schauen was sie so alles enthalten. Wenn X² auf die Version 1.2 gepatcht ist enthält das 03.CAT/03.DAT Dateipaar die aktuellsten XML-Sprachdateien des Spieltextes. Das wären dann die Dateien 440001.XML und 440002.XML. Wenn BurnIt's Trade Command Sofware MK3 installiert wurde dann kann man in "X2\t" die 440003.XML finden. Diese Datei enthält die Texte für dieses neue Script.
Vielleicht hat der aufmerksame Leser bemerkt das ein Muster in den Dateinamen steckt. Die ersten zwei Stellen bezeichnen den Sprachcode; 44 ist Englisch. BurnIt's Erweiterung hat zusätzlich noch eine Datei mit '49' installiert, welche die deutschen Texte enthält. Wenn das neu eingehängte Script in mehreren Sprachen funktionieren soll muss man die XML-Sprachateien für jede Sprache mitliefern. Das mag keine dumme Idee sein, selbst wenn der Text in den anderen Sprachdateien der gleiche ist. Englisch ist da natürlich bevorzugt, da das die meisten Spieler verstehen
Nach dem Sprachcode enthält der Dateiname einfach eine Nummer um die Datei für alle Scripte, die die Datei benötigen, zu identifizieren. Diese Nummer wird benötigt um die den Text einer Sprachdatei von einem Script aus zu laden.
Wenn der Sprachcode und die ID-Nummer zusammengesetzt werden erhalten wir den ganzen Dateinamen "440003.XML".
Viele Leute schreiben Scripte mit Install-Routinen die die eigentliche 440003.XML modifizieren um ihre Texte zu speichern. Das ist der falsche Weg um das zu erreichen. Ich gehe mal davon aus das Sie diesen Weg gewählt haben, weil sie den korrekten Weg wie man Dateien zu X² hinzufügt, nicht kennen. Der ganze Sinn hinter der Möglichkeit mehrere Sprachdateien zu haben ist, das man sich nicht mit anderen (evtl. von anderen Scriptern) angelegten Sprachdateien rumschlagen muss. Man fügt einfach ein neue Datei ein.
Für eine neue Datei muss man sich eine ID raussuchen. Wichtig ist dabei, das die ID nicht in Konflikt mit anderen IDs kommt, die unter Umständen von einem anderen Script oder Mod benutzt werden. Es wird zwar bisher die Anstrengung unternommen dafür eine zentrale Stelle einzurichten, die einem diese IDs zuweist, allerdings ist das bisher noch nicht umgsetzt worden. Bis dahin empfehle Ich die folgende Richtlinie einzuhalten:
- Am besten keine niedrigen IDs verwenden. 440001.XML bis 440003.XML wurden schon von Egosoft belegt. Und man kann ziemlich sicher davon ausgehen das offizielle Egosoft-Erweiterungen, die noch erscheinen werden, noch mehr dieser LowIDs belegen werden.
- Wenn mehrere Scripts von einer Person geschrieben und veröffentlicht werden sollte man dafür nur eine Sprachdatei verwenden. Auf den Punkt gebracht bedeutet das: Man hat nur eine XML-Sprachdatei für ALLE seine Scripte. Wenn man die Scripte veröffentlicht, dann am Besten in 2 Teilen -> die Scripte getrennt von der Sprachdatei. Nach dieser Methode bekommt jeder immer die aktuellste Sprachdatei, die mit all euren veröffentlichen Scripten funktioniert. Obwohl das bedeuten kann, dass in der Sprachdatei ein Text für ein Script vorhanden ist, das diese Person gar nicht nutzt. Obwohl mehr IDs zur Verfügung stehen als in den XML-Sprachdateien benutzt werden wird es über kurz oder lang Konflikte zwischen verschiedenen Scripten geben, die die gleiche ID benutzen. Und genau deshalb wird eine zentrale Verwaltung benötigt.
[ external image ]
In diesem Beispiel verwende Ich "Maintain Product Quantity" für den langen Namen und "MaintainQuant" für den kurzen.
Die Sprachdateien verwenden einen XML "PAGE" Tag um den Text für die verschiedenen Verwendungsmöglichkeiten zu identifizieren. Ein "PAGE" Tag mit einem ID Attribut von 2010 identifiziert den Text für einen langen Namen eines Kommandos, wohingegen 2011 den kurzen Namen des Kommandos identifiziert. Man sollte auch beachten das der "t" Text Tag, mit dem wir den Text bezeichnen ein ID Attribut von 421 (213) hat. Und das es bei beiden die gleiche ID ist, langer Name wir kurzer. Das wird in Schritt 3 wichtig.
Um nur ein Kommando einzuhängen ist das alles was man in der XML-Sprachdatei haben muss.
3. Schritt
Wir haben das Script, das wir für unser neues Kommando benutzen woll, und wir haben die zugehörige XML-Sprachdatei, die für den Text in den Menüs benötigt wird. Jetzt brauchen wir blos noch ein kleines Script, das diese 2 später im Spiel miteinander verknüpft. Und genau dafür benutzt man dann init-Scripte.
Jedes Script das im Dateinamen mit "init" beginnt ist automatisch ein init-Script und wird automatisch bei jedem Start von X² ausgeführt. Es ist absolut wichtig das man damit sehr vorsichtig umgeht. Ein Bug in einem der init-Scripte kann später beträchtliche Konsequenzen haben. Das Beispielscript hierzu hat den Namen "init.cmd.maintprod.xml".
Unser init-Script hat 3 Aufgaben: Es muss die XML-Sprachdatei laden, dem Spiel sagen welcher der Güter mit unserem Script verknüpft ist (Optional -> siehe mein Codebeispiel, wenn das Script immer verfügbar sein soll) und es muss unser Script noch mit einem Kommando verknüft werden und dem Spiel erklären welche Schiffe dieses Kommando verwenden können.
Als erstes wird die XML-Sprachdatei geladen. Der erste Ausdruck im Bespiel dafür ist:
Reven Code:
Code: Select all
load text: id=21
Code: Select all
load text: id=69
Jetzt müssen wir noch unser Script (Beispielscript: "ship.cmd.maintprod") mit einem Kommando vom Spiel verknüpfen. Ein X² "Kommando" ist einfach ein InGame Aktion die man durch die Menüsysteme erreichen kann. Es gibt (offensichtlich) eine ganze Menge vordefinierte InGame-Kommandos in X² -> und alle sind mit Scripten verbunden durch die im Spiel mitgelieferten init-Scripte. Es ist zwar möglich eigene Kommandos zu erstellen, aber das bringt auch wieder einen haufen Aufwand in die ganze Prozedur. Glücklicherweise müssen wir das aber nicht, denn Egosoft war so nett und hat uns 32 Extrakommandos für jeden Typ bereitgestellt. Das sind Kommandos, die noch mit keinem Script verknüpft sind -> der einzige Sinn dahinter ist, das sie von Leuten wie uns benutzt werden um unsere Scripte einzuhängen.
Um einen dieser Kommandos zu benutzen müssen wir dem Spiel erst erklären welches der Güter unser Kommando "enthält". Das bedeutet, was eine Person für ein Upgrade kaufen muss um das Kommando benutzen zu können. In diesem Fall wird die "Trade Command Software MK1" benötigt. So machen wir dem Spiel klar das jedes Schiff, das die "Trade Command Software MK1" eingebaut hat unser neues Kommando benutzen kann. Wie das geht? Nun, die nächtste Codezeile im init-Script will das verdeutlichen:
Reven Code:
Code: Select all
set ship command upgrade: command=COMMAND_TYPE_TRADE_21 upgrade=Trade Command Software MK1
Code: Select all
set ship command upgrade: command=COMMAND_TYPE_NAV_13 upgrade=[TRUE]
Erinnert ihr euch daran wie wir gesagt haben, das der Text ID Tag (412) (213) in der Sprachdatei später wichtig wird? Das ist er nämlich jetzt. ID #421 gehört zum Kommando COMMAND_TYPE_TRADE_21. Die "4" bezieht sich auf die Tradekommandos, die 21 auf die Nummer 21 (von 0 bis 31) aus der Kommandoliste.
ID #213 gehört zum Kommando COMMAND_TYPE_NAV_13. Die "2" bezieht sich auf die Navigationskommandos, die 13 auf die Nummer 13 (von 0 bis 31) aus der Kommandoliste.
Wenn wir zum Beispiel ein Commando zum Spezialmenü hinzufügen wollen, anstatt dem Handelsmenü, müssten wir im ID Tag der Sprachdatei "521" und das Kommando COMMAND_TYPE_SPECIAL_21 verwenden.
- Nav hat ID "2"
- Combat hat ID "3"
- Trade hat ID "4"
- Special hat ID "5"
Reven Code:
Code: Select all
global ship map: set: key=COMMAND_TYPE_TRADE_21, class=Ship, race=Player, script='ship.cmd.maintprod', prio=0
global ship map: ignore: key=COMMAND_TYPE_TRADE_21, class=Big Ship, race=Player
Code: Select all
global ship map: set: key=COMMAND_TYPE_NAV_13, class=Ship, race=Player, script='ship.cmd.maintprod', prio=0
global ship map: ignore: key=COMMAND_TYPE_NAV_13, class=Fight Drone, race=Player
Da dieses Kommando aber recht Nutzlos für ein Schiff der Klasse M6 oder grösser ist (da diese Schiffe sowieso nicht an Fabriken docken können), sagen wir in der zweiten Zeile dass der Verknüpfungsbefehl zwar für alle Schiffe gilt, aber eben nicht bei denen die der Klasse "Big Ships" angehören.
Wir hätten die auch anders machen können, indem wir einfach für jedes Schiff (M5, M4, M3, TS, TL, Goner) einzeln den Befehl ausgeführt hätten. Unsere Variante ist einfach ein wenig kürzer. ber man kann selber völlig frei entscheiden wierum man das ganze macht und was am besten für das eigene Script passt.
Installation
Jetzt haben wir ein Script, eine Sprachdatei für das zugehörige Kommando und haben das Kommando mit dem Script verknüpft. Alles was wir jetzt noch tun müssen ist unser neues Kommando an die passenden Orte kopieren. Die Scripte gehören nach "X2/scripts", die Sprachdatei nach "X2/t". Das wars schon. Wenn alles richtig gemacht wurde sollte man ein Menü wie das Folgende bekommen:
[ external image ]
Anmerkung
Ich habe die Nummer 21 hier zweimal benutzt. Einmal um die ID für die Sprachdatei festzulegen, und einmal um zu bezeichnen um welches Extra Trade Kommando es sich handelt. Das war möglicherweise eine schlechte Wahl und wird wohl bei so manchem etwas Verwirrung stiften. Wer mit dem Unterschied der zwei IDs nicht so ganz klar kommt sollte nochmal ganz sorgfältig den text durchgehen.
Und genau wegen dieser möglichen Fehlerquelle habe ich meine Orangefarbigen IDs noch hinzugefügt. Wer sich mit denen ein bisschen ausseinandersetzt sollte recht schnell auf den Trichter kommen.
Wer Fehler findet solls mir per PM oder hier im Topic mitteilen. Ich märze die dann nach Möglichkeit aus.
Und jetzt wünsche ich allen viel Spass beim ausprobieren ;]
Nemesi$
/edit 23.03.'04 -> Links gefixt.