In Version 0.910 wurde die Skriptsprache deutlich verbessert. Hier sollen nach und nach die wichtigsten Änderungen bzw. Erweiterungen von X-Skript besprochen werden, als da wären:
- Überarbeitung des Event-Systems
- uses-Support
- Globale Variablen
- Änderungen beim erzeugen von Nachrichten
- sonstige interessante neue Befehle
Da die Umstellung des Event-Systems dafür sorgen wird, dass ein Großteil der Skripte aus 0.900 (alle mit alten register-Funktionen) nicht mehr fehlerfrei in 0.910 laufen, wird dieser Themenkomplex als erstes vorgestellt.
Während in Version 0.903 für jedes Event (also z.B. UFO-Abschuss, Einsatz gewonnen etc.) eine eigene Registerfunktion vorhanden war, wird mit v0.910 ein anderer Weg beschritten. In der neuen Version gibt es insgesamt nur noch 4 Registerfunktionen:
- register_ufo()
- register_timed_event() : TTimerEvent
- register_event() : TEvent
- register_special_event() : TEvent
register_ufo() dient lediglich dazu, festzulegen, welche UFOs beim Missionstyp mzUFO für die Siegbedingung (Abschuss aller UFOs) berücksichtigt werden (dies kann man sich sparen, wenn man schon ein Register für Abschuss, Entkommen etc. angelgt hat). Hier hat sich nichts gegenüber Version 0.903 geändert.
register_timed_event() ersetzt die alte Funktion event_register(). Mit ihr kann man eine Zeit festlegen, nach der eine andere Prozedur aufgerufen werden soll. Im Gegensatz zum Vorgänger event_register()
müssen der neuen Funktion aber 3 Parameter übergeben werden.
Der erste Parameter ist wie gehabt ein @ gefolgt vom Namen der aufzurufenden Prozedur (Anmerkung: Mit Version 0.910 gibts ein Feature im Skripteditor (medit.exe), was einem die Arbeit etwas erleichtert. Wenn man nach eingeben des @ die Tasten Strg+Leertaste drückt, erscheint eine Liste mit allen vorhandenen Prozeduren, aus der man dann die passende aussuchen kann - oder man wählt den Punkt "neue Funktion anlegen". Dann kann man den gewünschten Namen der aufzurufenden Prozedur eingeben, und das Grundgerüst dieser Prozedur wird automatisch im Skript ergänzt).
Der zweite Parameter ist eine beliebige Objekt-Variable, die der aufgerufenen Prozedur übergeben wird. Damit kann man in der augerufenen Prozedur z.B. auf ein an anderer Stelle erzeugtes UFO zugreifen. (Anmerkung: wer sich nicht sicher ist, welche Variablen alles Objektvariablen sind, der kann in medit ja mal im Objektbrowser unter Typen->Objekte nachschauen). Natürlich muss die aufgerufene Prozedur auch mit einem entsprechenden Parameter deklariert werden. Dabei hat dieser Parameter in der aufgerufenen Prozedur den Typ TObject. Um ihn zu verwenden muss er erst entsprechend weiterverarbeitet werden (siehe dazu Skriptbeispiel unten). Will man eigentlich kein Objekt übergeben, kann man stattdessen auch einfach den Wert NIL übergeben.
Der dritte Parameter ist vom Typ LongInt. Er gibt an, nach wievielen Minuten die angegebene Prozedur aufgerufen werden soll.
Neben der Parameteranzahl gibt es gegenüber der alten Funktion event_register() eine weitere Änderung. Der Rückgabewert ist nicht mehr vom Typ TEvent, sondern vom Typ TTimerEvent. Über eine entsprechende Variable kann man aber wie gehabt den Timer auf repeat setzen (soll heißen, nachdem die Prozedur aufgerufen wurde beginnt der Timer erneut, bis das Skript beendet ist). Auch kann man so die Anzahl der Minuten (TTimerEvent.Interval) oder das zu übergebende Objekt (TTimerEvent.obj) nachträglich ändern bzw. auslesen. Mit TTimerEvent.Active schließlich kann der Timer aktiviert bzw. deaktiviert werden.
So, nun wird es aber Zeit für ein Beispielskript:
program YourName;
procedure UFOBeschleunigen(Sender: TOBJECT); // erhöht Geschwindigkeit des UFOs auf maximal 20
var
UFO : TUFO;
Model : TUFOModel;
begin
UFO := TUFO(Sender); // das Objekt Sender muss zurück zu TUFO gecasted werden
Model := UFO.Model;
if (Model.Pps >= 20) then // Mission beenden, sobald Ufo Geschwindigkeit 20 erreicht hat
begin
mission_win;
end;
Model.Pps := Model.Pps + 1;
UFO.Model := Model;
end;
procedure StartMission;
var
event : TTimerEvent;
UFO : TUfo;
begin
UFO := ufo_api_CreateUfo;
event := register_timed_event(@UFOBeschleunigen,UFO,30); // Das UFO wird der Funktion
// UFOBeschleunigen als Parameter Sender übergeben
event.Repeated := true; // Event soll sich ständig wiederhohlen
end;
begin
MissionName := 'YourName';
MissionType := mzUser;
end.
Die beiden anderen register_* Funktionen werden aufgrund des Umfangs im nächsten Teil beschrieben.