Banner left   Banner center   Banner right

Germanenglish Home · News · Diary · Screenshots · Documentation (Wiki) · Downloads · Guestbook · Forum

Home · Benutzer registrieren · Suchen · Statistik · FAQ · Benutzerliste

Zur Zeit online: keiner ausser dir

 X-Force - Fight For Destiny - Forum —› Testversion —› [V0.910X-Skript] neues Eventsystem Teil1

Autor Mitteilung
verfasst am: 13.05.2006, 13:14
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
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.
verfasst am: 19.05.2006, 22:49 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Hab folgende Zeile im script die als Fehler angezeigt wird:
end;
register_Einsatz_win(@EinsatzWin,Einsatz);

Womit muss ich die nun ersetzen?


Und wo ich schon frage: Wie kann man ein UFO aktiv/inaktiv schalten?
verfasst am: 19.05.2006, 23:53
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
Zitat: LennStar
Und wo ich schon frage: Wie kann man ein UFO aktiv/inaktiv schalten?

Über Changeactivestate - schau mal in meine Demo, ich mache das im SPS002-Script
verfasst am: 19.05.2006, 23:59
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Kann man das auch mit "Handelbar" bei Gegenständen machen?
verfasst am: 20.05.2006, 00:04
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
Da ist das doch direkt eine Eigenschaft im TLagerItem, da braucht man keine Befehle.
Das Aktivieren/Deaktivieren der Gegenstände klappt aber leider noch nicht...
verfasst am: 20.05.2006, 00:34 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Da ist das doch direkt eine Eigenschaft im TLagerItem, da braucht man keine Befehle.
Das Aktivieren/Deaktivieren der Gegenstände klappt aber leider noch nicht...

Ich nix versteh... :(


Ich weiß, dass das eine Eigenschaft im editor ist, da kann man ein Häkchen setzen. Ich will sie aber beliebig ein und ausschalten. z.B. wenn du eine Bodenmission machst, und als Ergebniss kannst du mit bestimmten Gegenständen handeln. Oder du versiebst eine, und dein Abnehmer kratzt ab.
Und für Herstellbar wärs auch nicht schlecht- eine bestimmte Technologie/ein Ereignis erlaubt erst den (Nach)Bau.
verfasst am: 20.05.2006, 06:10
Registrierdatum: 26.03.2006, 08:29

 Beiträge: 83
Was Dirk meint ist, dass man keine extra-Funktion in x-skript braucht, weil man die eigenschaften eines Gegenstandes direkt anwählen/ändern kann. Nur leider haben solche änderungen leider noch keine auswirkungen auf den spielablauf. ich hab's grade eben getestet, obwohl ich da (über skript) die Kevlar-Panzerung auf 'nicht handelbar' gesetzt hatte, wurde an- und verkaufspreis angezeigt.
verfasst am: 20.05.2006, 06:14
Registrierdatum: 26.03.2006, 08:29

 Beiträge: 83
Zitat: LennStar
Hab folgende Zeile im script die als Fehler angezeigt wird:
end;
register_Einsatz_win(@EinsatzWin,Einsatz);

Der Fehler ist, wie du vielleicht schon weißt, dass es die funtkion/prozedur register_einsatz_win nicht mehr gibt. versuchs doch mal mit einer eigenen prozedur wie 'onEinsatzWin', bei anderen Skripten funktioniert das gut.
verfasst am: 20.05.2006, 10:33
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Zitat: LennStar
Kann man das auch mit "Handelbar" bei Gegenständen machen?
Nein!
Zitat: LennStar
Hab folgende Zeile im script die als Fehler angezeigt wird:
Schau dir unter datascriptsmission mal das Script einsatztest.xms an. Da ist ein Beispiel für EinsatzWin drin.



Du musst dich registrieren um auf dieses Thema zu antworten.
Login :: » Name » Passwort

Ladezeit (sec.): 0.016 · Powered by miniBB 1.6 with parts of 1.7 © 2001-2003