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 wren:
- berarbeitung des Event-Systems
- uses-Support
- Globale Variablen
- nderungen beim erzeugen von Nachrichten
- sonstige interessante neue Befehle
Da die Umstellung des Event-Systems dafr sorgen wird, dass ein Groteil der Skripte aus 0.900 (alle mit alten register-Funktionen) nicht mehr fehlerfrei in 0.910 laufen, wird dieser Themenkomplex als erstes vorgestellt.
Whrend in Version 0.903 fr 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 fr die Siegbedingung (Abschuss aller UFOs) bercksichtigt werden (dies kann man sich sparen, wenn man schon ein Register fr Abschuss, Entkommen etc. angelgt hat). Hier hat sich nichts gegenber Version 0.903 gendert.
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 Vorgnger event_register()
mssen 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 drckt, erscheint eine Liste mit allen vorhandenen Prozeduren, aus der man dann die passende aussuchen kann - oder man whlt den Punkt "neue Funktion anlegen". Dann kann man den gewnschten Namen der aufzurufenden Prozedur eingeben, und das Grundgerst dieser Prozedur wird automatisch im Skript ergnzt).
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). Natrlich 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 gegenber der alten Funktion event_register() eine weitere nderung. Der Rckgabewert 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 heien, 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) nachtrglich ndern bzw. auslesen. Mit TTimerEvent.Active schlielich kann der Timer aktiviert bzw. deaktiviert werden.
So, nun wird es aber Zeit fr ein Beispielskript:
program YourName;
procedure UFOBeschleunigen(Sender: TOBJECT); // erhht Geschwindigkeit des UFOs auf maximal 20
var
UFO : TUFO;
Model : TUFOModel;
begin
UFO := TUFO(Sender); // das Objekt Sender muss zurck 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 stndig wiederhohlen
end;
begin
MissionName := 'YourName';
MissionType := mzUser;
end.
Die beiden anderen register_* Funktionen werden aufgrund des Umfangs im nchsten Teil beschrieben.