I. BurnIt-Aktivierung des Scripteditors
Der Scripteditor oder auch das "Manuelle Schiffscomputer Interface" (M.S.C.I.) ist ein Werkzeug innerhalb des Spieles, mit dem Regeln für das Verhalten der KI im Spiel erzeugt oder verändert werden können. Es ermöglicht es außerdem Objekte innerhalb des Spieluniversums zu beeinflußen oder einzufügen.
Das bedeutet jedoch, dass es extrem einflussreich ist und durch unachtsamen Gebrauch erheblicher Schaden am Spieluniversum bewirkt werden kann.
Eine Warnung: Seid euch darüber im Klaren, dass die Benutzung des Scripteditors den Spielspaß vollkommen verderben kann!
Da die Freigabe des Editors auf ausdrücklichen Wunsch vieler Spieler früher als vorgesehen erfolgt, sollte jedem Nutzer dieses mächtigen Werkzeuges bewußt sein, dass, solange die Arbeiten an der Dokumentation noch andauern, es
durch Egosoft und die Betatester keinerlei Unterstützung gibt und im Problemfall auch nicht geholfen werden kann. Bis zur Freigabe der offiziellen Dokumentation seid Ihr also auf Euch allein gestellt.
Die Arbeiten an der Dokumentation sollen bis Ende Januar 2004 abgeschlossen werden.
Wenn Ihr Euch sicher seid, dass Ihr auch ohne Unterstützung mit diesem Feature experimentieren wollt, gebt während Ihr im All fliegt
Thereshallbewings (beachtet das große "T") ein. Das aktiviert den Menüpunkt "Script Editor" in der Kommandokonsole. Die korrekte Aktivierung wird durch einen Beep bestätigt.
Denkt daran, dass der Scripteditor ein
optionales und sehr fortgeschrittenes Werkzeug ist; es ist nicht nötig ihn zu benutzen um X² zu spielen.
Wenn Ihr noch keinerlei Erfahrung mit der Programmierung von Scripts habt, ist es wahrscheinlich besser, wenn Ihr den Editor einfach ignoriert.
II. Scripts ins Spiel einhängen
II.1 GothicK's Tutorial No1: Scripts in's Spiel einbinden.
Wegen der regen Nachfrage gibts hier mal ne Anleitung zum Einbinden der Scripts in's Spiel.
Erst mal Grundsätzliches:
1. Legt euch einen Ordner an, in den ihr die neuen Scripts downloadet.
2. Entpackt jedes Scriptpaket in einen _extra_ Ordner. (
WinRAR ist sehr empfehlenswert. Einfach mit Rechtsklick auf die .zip/.rar-Datei und 'entpacken in "Ordner" ' auswählen.
3. Legt je einen Testordner für Scripts und Textdateien an, in die ihr die neuen Dateien kopiert.
Wenn dann Scripts den selben Dateinamen benutzen merkt ihr das sofort.
3.a Im Test"t"-Ordner könnt ihr dann die Textdateien bearbeiten. Dazu später mehr.
3.b In den Test"scripts"-Ordner kopiert ihr noch die
x2script.xsl aus dem X²/scripts-Ordner.
Die benötigt ihr um die Scripts im I-Explorer anzuzeigen.
Hier nochmal, für alle die's noch nicht wissen, die Grundlagen:
Aus allen Dateien
44xxxx.xml(english) und
49xxxx.xml(deutsch) lädt X² den Text, der im Spiel angezeigt wird.
Diese Dateien sind im X²/t-Ordner und neue Dateien dieses Typs gehören dann auch in diesen Ordner.
Alle anderen .xml-Dateien gehören in den X²/scripts-Ordner.
Und nun zu den Texten.
Hier liegen die grössten Probleme, wenn es um englishe Scripts geht.
Aber auch generell, weil immer wieder gleiche Dateinamen verwendet werden. Benennt erst einmal (beim deutschen Spiel) die mit
44 beginnenden Dateien um.
Die deutsche Version benötigt Dateien, die mit
49 anfangen.
Wenn ihr ein neues Script entpackt habt und die Dateien in euren Testordner kopieren wollt:
Überschreibt nicht die schon vorhandenen Dateien!
In diesem Fall schaut nach, welche Datei überschrieben werden soll.
Öffnet beide Dateien und schaut erstmal, ob die Einträge, die die neue Datei setzen will, schon in der alten enthalten sind. oder andersherum.
Es gibt inzwischen einige Scripts, die die Texte anderer Scripts mitliefern.
Ist das der Fall, dann benutzt das File mit allen Einträgen.
Wenn nicht, gibt es zwei Möglichkeiten:
Jetzt ist es eine Frage, ob ihr die Möglichkeit behalten wollt, Scripts schnell wieder zu entfernen.
Wenn ja, dann müsst ihr den Dateinamen ändern.
z.B.: von
440013 in
440014.
Anschliessend müsst ihr aber auch das Script selbst noch etwas umschreiben. Dazu komme ich später.
Is das nicht so wichtig, könnt ihr auch die Einträge des neuen Scripts in die schon vorhandene Datei einfügen.
Alle Textdateien lassen sich einfach mit einem Texteditor öffnen und bearbeiten. Ich nutze das Windows-Notepad.
Rechtsklick auf die Datei -> bearbeiten.
Fügt alle neuen Einträge an den etsprechenden Position ein.
Wie erkläre ich im nächsten Post.
Jetzt müsst ihr noch schauen, ob das script den Text auch wirklich lädt.
Öffnet dafür die entsprechende Scriptdatei, die mit "
init." anfängt.
Wie weiter oben schon geschrieben braucht ihr dafür die
x2script.xsl-Datei im selben Ordner.
Jetzt sucht ihr nach dem Eintrag "
load text: id=xxxx"
Dort wird festgehalten, welche Textdatei das Spiel lädt.
Wenn das Script mit der Datei 49
0012.xml arbeitet muss im
init.-Script der Eintrag: "
load text: id=12" stehen. (die vorn anstehenden Nullen werden ausgeblendet)
Ist das nicht der Fall, oder fehlt dieser Eintrag muss das Script im Editor angepasst werden.
Dazu später mehr.
Wenn alles passt könnt ihr die fertigen Dateien in die entsprechenden Ordner des Spieles kopieren.
II.1.2 Bearbeiten der Textdateien
Ich nehme als Beispiel hier den "Handelscomputer MK3" von Burnit und die erste Version des "Teladi Autotrader" von xscripting.com
Hier gab es nämlich schon die ersten Probleme, weil beide mit der
490003.xml daherkahmen. (der Autotrader eigendlich mit der
440003.xml aber das haben wir ja schon geändert)
Wie gesagt: Diese Dateien lassen sich mit dem InternetExplorer anschauen und mit einem Texteditor bearbeiten.
Ich erkläre jetzt die Datei des HandelscomputerMK3:
Code: Select all
<?xml version="1.0" encoding="UTF-8" ?>
<language id="49">
Die erste Zeile. Wenn hier statt der
49 eine
44 steht ändert das.
X² kann sonst, trotz geändertem Dateinamen, den Text nicht laden.
Code: Select all
<page id="17" title="Boardcomp. objects">
<t id="5873">Handelssoftware MK3</t>
</page>
Diese Zeile tragt in die Seite
17 (page id=), an der Stelle
5873 (t id=), den Bordcomputer ein.
Damit weiss X² den Namen, den Produkttyp und den Preis des neuen Produkts. Aber damit schweife ich schon ins scripten ab.
Code: Select all
<page id="1500" title="Trader scripts" descr=" ">
<t id="10">Der Pilot des Schiffes </t>
<t id="11"> in Sektor </t>
<t id="12"> braucht ihre Hilfe. </t>
,..,
<t id="100">Der Pilot des Schiffes %s in Sektor %s braucht ihre Hilfe. </t>
<t id="101"> Bisher verdientes Geld: %s Cr. Anzahl Handelsfahrten: %s.</t>
</page>
Hier lädt X² die Nachrichten, die vom script aufgerufen werden.
Code: Select all
<page id="2010" title="Commands" descr=" ">
<t id="400">Starte Sektorhandel</t>
</page>
Damit wirds wichtig
Die Seite (page id) "2010" enthält die langen und...
Code: Select all
</page><page id="2011" title="Commands" descr=" ">
<t id="400">Starte Sektorhandel</t>
</page>
...die Seite "2011" diekurzen Einträge, die im Bordcomputer als Befehl angezeigt werden. Die Zahlen stehen für die Befehlsgruppe (Nav =2xx, Handel =3xx usw) und den Befehlseintrag (z.B.:"Docke an")
Damit wird die Datei beendet.
Schauen wir noch nach dem "Teladi.."Script:
Code: Select all
<?xml version="1.0" encoding="UTF-8" ?>
<language id="44">
<page id="2008" title="Script Object Commands" descr="0">
<t id="410">COMMAND_TELADI_AUTO_TRADE</t>
<t id="411">COMMAND_TELADI_IMPORT</t>
<t id="412">COMMAND_TELADI_EXPORT</t>
<t id="413">COMMAND_TELADI_BUY_WARE</t>
<t id="414">COMMAND_TELADI_SELL_WARE</t>
<t id="415">COMMAND_TELADI_REPORT</t>
<t id="729">COMMAND_TELADI_LOAD</t>
<t id="730">COMMAND_TELADI_UNLOAD</t>
<t id="731">COMMAND_TELADI_THINK</t>
</page>
<page id="2010" title="Script Cmd Names" descr=" ">
<t id="410">Teladi Automated Trader</t>
<t id="411">Teladi Importer</t>
<t id="412">Teladi Exporter</t>
<t id="413">Teladi Buy ware</t>
<t id="414">Teladi Sell Ware</t>
<t id="415">Request progress log</t>
<t id="729">Load ware...</t>
<t id="730">Unload ware...</t>
<t id="731">Calculating...</t>
</page>
<page id="2011" title="Script Cmd Shorts" descr=" ">
<t id="410">TAT</t>
<t id="411">TIMP</t>
<t id="412">TEXP</t>
<t id="413">TBUY</t>
<t id="414">TSELL</t>
<t id="415">TREQ</t>
</page>
</language>
Jetzt könnt ihr alle Einträge an die entsprechende Stelle in der ersten Datei einfügen.
Alles unter "2010" gehört an die entsprechende Stelle unter "2010" im ersten Script usw.
Wenn, wie hier der Fall, eine neue "page id" auftaucht (2008) dann gehört die natürlich zwischen die "1500" und die "2010".
Wenn ihr fertig seid könnte das Ganze so aussehen:
Code: Select all
<?xml version="1.0" encoding="UTF-8" ?>
<language id="49">
<page id="17" title="Boardcomp. objects">
<t id="5873">Handelssoftware MK3</t>
</page>
<page id="1500" title="Trader scripts" descr=" ">
<t id="10">Der Pilot des Schiffes </t>
<t id="11"> in Sektor </t>
<t id="12"> braucht ihre Hilfe. </t>
<t id="13"> Bisher verdientes Geld: </t>
<t id="14"> Anzahl Handelsfahrten: </t>
<t id="20"> Mein Laderaum ist voll. Ich kann nichts mehr kaufen.</t>
<t id="21"> Ich habe keine Stationen gefunden, mir denen ich handeln kann. Was soll ich jetzt machen? </t>
<t id="22"> Mein Schiff ist zu angeschlagen, um weiterzumachen. Sie finden mich in der Station </t>
<t id="23"> Die Leute HASSEN mich hier, was soll ich jetzt machen? </t>
<t id="24"> Ich konnte meine Ware nicht komplett verkaufen. Brauche Anweisungen. </t>
<t id="25"> Ich bin jetzt im Sektor %s. Mein Schiff ist zu angeschlagen, um weiterzumachen. Sie finden mich in der Station %s.</t>
<t id="100">Der Pilot des Schiffes %s in Sektor %s braucht ihre Hilfe. </t>
<t id="101"> Bisher verdientes Geld: %s Cr. Anzahl Handelsfahrten: %s.</t>
</page>
<page id="2008" title="Script Object Commands" descr="0">
<t id="410">COMMAND_TELADI_AUTO_TRADE</t>
<t id="411">COMMAND_TELADI_IMPORT</t>
<t id="412">COMMAND_TELADI_EXPORT</t>
<t id="413">COMMAND_TELADI_BUY_WARE</t>
<t id="414">COMMAND_TELADI_SELL_WARE</t>
<t id="415">COMMAND_TELADI_REPORT</t>
<t id="729">COMMAND_TELADI_LOAD</t>
<t id="730">COMMAND_TELADI_UNLOAD</t>
<t id="731">COMMAND_TELADI_THINK</t>
</page>
<page id="2010" title="Commands" descr=" ">
<t id="400">Starte Sektorhandel</t>
<t id="410">Teladi Automated Trader</t>
<t id="411">Teladi Importer</t>
<t id="412">Teladi Exporter</t>
<t id="413">Teladi Buy ware</t>
<t id="414">Teladi Sell Ware</t>
<t id="415">Request progress log</t>
<t id="729">Load ware...</t>
<t id="730">Unload ware...</t>
<t id="731">Calculating...</t>
</page>
</page><page id="2011" title="Commands" descr=" ">
<t id="400">Starte Sektorhandel</t>
<t id="410">TAT</t>
<t id="411">TIMP</t>
<t id="412">TEXP</t>
<t id="413">TBUY</t>
<t id="414">TSELL</t>
<t id="415">TREQ</t>
</page>
</language>
Es steht euch natürlich frei, die englishen Einträge zu übersetzen.
Beachtet dabei nur: Keine Umlaute und nur "," "." und "-" als zusätzliche Zeichen!
Wenn der InternetExplorer die Seite
nicht anzeigen kann habt ihr einen Fehler gemacht. Meist sind das versehentlich benutzte Umlaute oder ähnliches.
Der Explorer sagt aber auch, in welcher Zeile der Fehler ist.
Fertig.
Jetzt das Ganze in den X²/t-Ordner kopieren und los gehts.
II.1.3 Nun gehts dem Scripteditor an den Kragen
Wenn ihr nicht den oben beschriebenen Weg gehen wollt oder in der
init.-Datei des Scripts der Eintrag
load text: id= fehlt müsst ihr in den Scripteditor des Spieles.
Erstmal aktivieren. Gebt irgendwo im Weltall (nicht angedockt) folgendes ein:
Thereshallbewings und beachtet das grosse "T".
Daraufhin ertöhnt ein tülüt und der Scripteditor steht zur Benutzung frei.
Über die Commandokonsole des Hauptmenues ('Enter' dann 'S') oder im Commandomenue eines Schiffes ('S', 'C', und 'S') ist der Editor erreichbar.
Sucht im Editor die
init.Datei und öffnet sie.
Ich nehme wieder den "TeladiTrader" als Beispiel.
Die Datei heist in diesem Fall
init.mk2.bindCommands und sieht so aus:
Code: Select all
001 global ship map: set: key=COMMAND_TYPE_TRADE_10, class=Ship, race=Player, script='mk2.Command.localizedTrade', prio=0
002 global ship map: set: key=COMMAND_TYPE_TRADE_11, class=Ship, race=Player, script='mk2.Command.factoryBuy', prio=0
003 global ship map: set: key=COMMAND_TYPE_TRADE_12, class=Ship, race=Player, script='mk2.Command.factorySell', prio=0
004 global ship map: set: key=COMMAND_TYPE_TRADE_13, class=Ship, race=Player, script='mk2.Command.wareBuy', prio=0
005 global ship map: set: key=COMMAND_TYPE_TRADE_14, class=Ship, race=Player, script='mk2.Command.wareSell', prio=0
006 global ship map: set: key=COMMAND_TYPE_TRADE_15, class=Ship, race=Player, script='mk2.command.requestlog', prio=0
007
008 set ship command upgrade: command=COMMAND_TYPE_TRADE_10 upgrade=Handelssoftware MK2
009 set ship command upgrade: command=COMMAND_TYPE_TRADE_11 upgrade=Handelssoftware MK1
010 set ship command upgrade: command=COMMAND_TYPE_TRADE_12 upgrade=Handelssoftware MK2
011 set ship command upgrade: command=COMMAND_TYPE_TRADE_13 upgrade=Handelssoftware MK1
012 set ship command upgrade: command=COMMAND_TYPE_TRADE_14 upgrade=Handelssoftware MK2
013 set ship command upgrade: command=COMMAND_TYPE_TRADE_15 upgrade=Handelscomputer Erweiterung
014
015 return null
Wie ihr seht fehlt der Eintrag zum laden des Textes.
Gehen wir davon aus, dass wir die Textdatei in
491234.xml umbenannt haben.
Dann tragen wir die jetzt ein:
Geht mit dem Cursor auf eine Zeile am Anfang oder am Ende des Scripts und drückt 'Einfg'.
In die Neue Zeile kommt jetzt der Eintrag.
'Enter' drücken und aus dem folgenden Menue den ersten Punkt "
Generell Commands" auswählen.
Im darauf folgenden Menue sucht ihr den Befehl "
load text: id<Var\Num>" und drückt 'Enter'.
Der Befehl erscheint daraufhin im Script und der Cursor steht automatisch auf dem "<Var\Num>"-Teil.
Wieder 'Enter' gedückt und aus der erscheinenden Liste den Eintrag "<Nummer>" auswählen.
Dann könnt ihr die Zahl eintragen, die das Script benutzen soll.
In meinem Beispiel also die
1234.
So sollte das dann aussehen:
Mit 'Esc' raus, Script speichern und das Spiel neu laden.
Jetzt weiss X² welchen Text es benutzen soll.
Fertig.
P.S.: Der Autor übernimmt keine Verantwortung für eventuell entstandene Schäden.
P.P.S.: Wenn ich was vergessen, übersehen oder falsch dargestellt hab bitte berichtigt mich.
II.2 Nemesi$ Tutorial-Wie hänge ich ein eigenes Script in die Menüs ein
Sodele..dann will ich mich mal hier an die Übersetzung von Revens Tutorial wagen. Das Original ist unter
http://www.egosoft.com/x2/forum/viewtopic.php?t=21585 aufzufinden.
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.
Vorgehensweise
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.
So...jetzt aber genug über die Sprachdateien. Nun zu den eigentlichen Anforderungen, die an uns gestellt werden um ein Kommando in den Menübaum zu hängen (Ein kleiner Blick in die Beispieldatei 440021.XML
(440069.XML) an diesem Punkt könnte nicht schaden). Dort müssen 2 Textstücke eingtragen werden: Der lange Namen des Kommandos und die dazugehörige, kurze Version. Jenachdem in welchen Menüs man sich gerade im Spiel aufhält sieht man die lange order die kurze Version. Im eigentlichen Menüsystem sieht man beide, wie folgende Illustration zeigt.
[ 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:
Nemesi$ Code:
Erinnert ihr euch an den XML-Sprachdateinamen, wie er den Sprachcode (44 für Englisch) und die ID am Ende hat, mit der wir die Datei laden wollen? Tja...das ist genau was diese Codezeile macht. Die englische Version von X² wird dann die Datei "440021.XML"
("4400069.XML")laden, die deutsche dagegen "490021.XML"
("490069.XML").
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
Nemesi$ Code:
Code: Select all
set ship command upgrade: command=COMMAND_TYPE_NAV_13 upgrade=[TRUE]
Bei meinem Codebeispiel ist das Kommando ohne irgendwelche Vorraussetzungen verfügbar.
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"
Bisher haben wir die Sprachdatei geladen und dem Spiel erklärt das wir ein neues Kommando hinzugefügt haben, und wo dieses seinen Text findet. Ales was wir jetzt noch machen müssen ist unser eigentliches Script mit dem Kommando verknüpfen.
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
Nemesi$ Code:
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
In diesem Beispiel sind 2 Ausdrücke um unser Ziel zu erreichen. Der erste bedeutet: Erlaube das Kommando COMMAND_TYPE_TRADE_21 für alle Objekte der Klasse ship (die Klasse ship enthält alle Schiffe) die der Rasse Player gehören (das ist der Spieler) und das wir das Script "ship.cmd.maintprod" mit dem Kommando verknüpfen wollen. Zusaätzlich wird mit prio die Priorität festgelegt, mit der das Script ausgeführt werden soll wenn es aufgerufen wird (0 = normal).
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$
IV.
Vanoblis - Der ScriptDebugger - Anleitung (v1.3 UPDATED)
Allgemeines
Der Debugger ist Bestandteil des Script Editors und ist "nur" Objektbezogen. Das heisst es werden alle Scriptbefehle eines Objektes mitgeloggt. (Hinweis: Will man z.b. nur das Flugscript untersuchen, sollte man die Turretscripte/Kommandos abschalten) Scripte, die auf keinem Ojekt(null) laufen, werden als Globale Scripte bezeichnet. Abhängig davon , auf welchem Objekt (zB einem Schiff) das Script läuft, das man debuggen will, muss man den Script Editor unterschiedlich aufrufen (Aktivierung mit "Thereshallbewings" vorrausgesetzt):
für Objektbezogene Scripte:
bestimmtes Schiffsmenu -> Kommando Konsole (des Schiffs) -> Script Editor
für Globale Scripte:
Main Menü -> Kommando Konsole -> Script Editor
Nun steht unter dem Menüpunkt "Script Debugging:XXX" bei XXX der Name des Objekts, das man debuggen will.
Menupunkte des Debuggers
Der Debugger besteht aus vier Menupunkten.
"Script Debugging:XXX"-Einstellung (XXX entweder "GLOBAL" oder ein Schiffsname),
"Clear Debug Messages" löscht alle Debugging Logs des aktuellen Objekts
"Script Debugger Menu". der eigentliche Debugger (Anzeige der Logs)
sei patch 1.3 neu:
"Global Script Tasks". hiermit kann man laufende globale Scripte beenden (Achtung! - Skripte die auf Stationen laufen können zur Zeit nicht abgebrochen werden!)
Einstellung des Debuggers
Diese Einstellung sollte man festlegen, bevor man das Script startet, das man debuggen will (ich hab mir schon mal bei laufendem Script und "Script Debugging:XXX" Wechsel mein Spiel zerschossen
unter dem Menupunkt :"Script Debugging:XXX" gibt es drei Einstellmöglichkeiten.
1)
LOG
2)
TRACE
3)
OFF - deaktiviert den Debugger
---------------------------------
1) LOG:
Bei "LOG" werden alle Commandos, die im Script aufgerufen werden(sprich jede Zeile die auch wirklich ausgeführt wird) im "Script Debugger Menu" aufgelistet(also mitgeloggt). Das Loggen erfolgt so schnell wie die Befehle im Script von eurem Rechner abgearbeitet werden. Wenn also irgendwo im script zB ein " @ = wait 1000 ms" steht, hält der Loggingvorgang auch 1000 ms an. Rumscrollen geht mittels "Bild hoch/runter". Neue Logs werden einfach unten angehängt, solange man nicht mit "Clear Debug Messages" die Logs löscht(ein Menü höher).
die Logging Einträge haben diese Form (Beispiel):
Code: Select all
-----------Scriptname:Line:Stackdepth:Prio:PID:TaskID:Command--------
!trade.buywarebest.pl:22:0:0:164918987:$amount= This -> ....
!trade.buywarebest.pl:23:0:0:164918987: ...undweiterimcode....
!trade.buywarebest.pl:24:0:0:164918987: ...undweiterimcode....
...
in einer Zeile sind mehrer Informationen durch "Doppelpunkt" getrennt.
Scriptname : Name des Scripts, was gerade ausführt wird (bei Namenswechsel muss ein ScriptCall stattgefunden haben)
Line : Zeile des Befehls im Script (!ACHTUNG in X2 v1.2 weicht diese Zeilennummerierung von der im Script ab, da hier nur die "ausgeführten Zeilen" durchnummeriert wurden - war vermutlich nicht so gewollt)
Stackdepth : Anzahl der Scripte auf dem Stack des Objekts(jedes Objekt hat seinen eigenen Stack)
Prio : Priorität des Scripts
PID :
TaskID :
Command : Der ausgeführte Befehl im Script
2) TRACE:
Der unterschied zu LOG ist klein aber fein. Im Trace-Modus loggt der Debugger auch wie LOG alle ausgeführten Befehlszeilen im schon oben erklährten Format mit. Nur findet hier das Logging nicht automatisch statt, sondern man muss mit "ENTER" einen "Step" (Schritt)im Code machen. Das Script steht also zu Beginn still und man muss sich mit <ENTER> quasi Schritt für Schritt durch seinen Code "steppen" und nach Fehlern suchen. Die nächste auszuführende Zeile wird zudem noch grün hervorgehoben. Zusätzlich werden im Trace-Modus auch noch die deklarierten Variablen des aktuell laufenden Scripts und deren Inhalt angezeigt. So kann man zB schnell fehlerhafte Belegungen von Variablen finden.
wenn "Script Debugging:XXX" auf TRACE gestellt ist schauts ungefähr so aus:
Code: Select all
-----------Scriptname:Line:Stackdepth:Prio:PID:TaskID:Command----------
!trade.buywarebest.pl:22:0:0:164918987:$amount= This -> ....
!trade.buywarebest.pl:23:0:0:164918987: ...undweiterimcode....
!trade.buywarebest.pl:24:0:0:164918987: ...undweiterimcode....
...
[b]VariableName: Datatype, Value (interger value) [/b]
$amount: DATATYP_NULL,null,(0) <---------- hier stehen deklarierte Variablen und deren Inhalt
...nochmehrvariablen....
...
Starten, Stoppen und Debugging von Scripten
Objektbezogene Scripte können entweder in die Command Console Menüs eingebunden und somit per Schiffbefehl gestartet werden, oder man startet ein Script mit "r" in der Scriptliste des Script Editors. Beim Starten mit "r" wird sofort nach einem Referenz Objekt, gefragt (Station oder Schiff), also dem Objekt, auf dem das Script nun laufen soll. Wählt man hier "null" , läuft das Script auf keinem Objekt, und wird als "Globales Script" bezeichnet.
Ob ein Script wirklich läuft, kann man sehen, indem man den Namen seines Scripts in der "Script Task Statistik" sucht. Die "Script Task Statistik" findet man auch im Scripteditor - mit der "Bild runter Taste" (also wenn ein Script gestartet wurde, einfach mit ESC ein Menü zurück und dann "Bild runter")
Hat man vor dem Start seines Scripts den Debubber eingeschaltet, werden alle ausgeführten Scriptbefehle des Objekts im "Script Debugger Menu" mitgeloggt.
Beenden kann man Objektgebundene Scripte durch Zuweisen eines neuen Befehls in der "Kommando Console" des Objekts(Schiffs). Skripte die auf Stationen laufen können zur Zeit nicht abgebrochen werden!
Global laufende Scripte kann man mit dem (seit patch 1.3) neuen "Global Script Tasks" Menüpunkt im Script Editor beenden. Einfach das zu beendende Script in der Liste raussuchen und mit <DEL> entfernen.
Damit müssten eigentlich die gröbsten Unklarheiten bezgl. des Script Debuggers beseitigt sein. Sicherlich lassen sich damit viele Programmierfehler aufspüren
Ich hoffe es hilft jemandem weiter...
Vanoblis
Debugmodi in Scripten von Metuelisator
Gerade bei grösseren Scripts ist die Fehlersuche nicht immer einfach.
Solange man an einem Script arbeitet kann man mit Zwischenmeldungen von wichtigen Variablen einen möglichen Fehler schneller finden.
also weist man seinem Script zu Anfang ein Argument "debugmode" vor, unter Eingabe "Number", string debugmode.
Beim starten des Scripts gibt man "0" fur debugmode aus, "1" für debugmode ein an.
Im Script selbst kann dann an beliebig vielen Stellen
Code: Select all
if $debugmode = 1
write to playerlogbook $wichtigeVariable1
write to playerlogbook $nochwichtigereVariable2
usw....
end
eingesetzt werden. Diese Aufrufe müssen auch später nicht unbedingt aus dem Script rausgenommen werden wenn es erstmal läuft.
Ist nicht komplett auf meinem Mist gewachsen, bin in der Handel MK3 über was ähnliches gestolpert.