Für manche Quests möchte man dem Spieler eine gewisse Zeit vorgeben, in der eine Aufgabe zu erledigen ist, zum Beispiel das Erreichen einer bestimmten Forschung oder das Errichten einer Verteidigung vor einem Angriff. Dazu sind Zähler/Counter notwendig, die beim Erreichen eines vorgegebenen Limits ein Ereignis auslösen.
Die einfachste Variante davon, mit bereits bekannten Mitteln umgesetzt, sähe die Definition zweier globaler Variablen vor: Eine Zählvariable mit dem Startwert 0 und eine Limit-Variable n, die den Höchstwert für diesen Counter angibt. In einem SimpleJob
soll diese Variable immer um 1 erhöht werden (also pro Sekunde 1 mal), sodass nach n Sekunden ein Ereignis ausgelöst werden kann:
function MyCounterInit() MyCounter = 0 MyCounterLimit = 240 StartSimpleJob("MyCounterCount") end function MyCounterCount() MyCounter = MyCounter + 1 if MyCounter >= MyCounterLimit then -- Der Zähler wird zurückgesetzt MyCounter = 0 -- hier geschehen Dinge MyCounterEvent() -- Job beenden return true end end
Hinweis: Wenn der Job beim Erreichen des Zählmaximums nicht beendet wird, wird das Ereignis wiederholt nach jeweils 240
Sekunden ausgelöst.
Der Nachteil hierbei ist, dass jedes Mal zwei globale Variablen benötigt werden, über die man einen Überblick behalten muss. Deshalb gibt es bereits vorgefertigt ein Counter
-Modul, das das Zählen und Verwalten der Variablen übernimmt.
Im Counter
-Modul hat jeder Counter einen Namen als String. Zum Setzen, Zählen und Abfragen des Counters wird nur dieser String und die folgenden Funktionen benötigt.
Counter.SetLimit(_Name, _Limit)
setzt das Limit _Limit
in Sekunden für den Counter mit dem Namen _Name
.
Im Beispiel oben entspricht das der Zeile
MyCounterLimit = 240
die sich damit durch die Zeile
Counter.SetLimit("MyCounter", 240)
ersetzen lässt.
Counter.Tick(_Name)
zählt den Counter mit dem Namen _Name
um 1 nach oben. Wenn der Counter sein _Limit
erreicht hat, wird er automatisch auf 0 zurückgesetzt und true zurückgegeben. Andernfalls gibt die Funktion false zurück.
Im Beispiel oben entspricht das den Zeilen
MyCounter = MyCounter + 1 if MyCounter >= MyCounterLimit then MyCounter = 0
die sich damit durch die Zeile
if Counter.Tick("MyCounter") then
ersetzen lassen.
Counter.Reset(_Name)
setzt den Zählstand eines Counters mit dem Namen _Name
auf 0 zurück.
Im Beispiel oben entspricht das der Zeile
MyCounter = 0
die sich damit durch die Zeile
Counter.Reset("MyCounter")
ersetzen lässt.
Counter.Tick2(_Name, _Limit)
vereint die Funktion von Counter.SetLimit
und Counter.Tick
. Das heißt, dass sowohl ein neuer Counter mit dem Namen _Name
und dem Limit _Limit
initialisiert als auch hochgezählt wird. Weil diese Schreibweise so kurz ist, wird sie auch bevorzugt verwendet.
Mit Counter.Tick2
wird das Counter-Beispiel oben stark verkürzt:
function MyCounterInit() StartSimpleJob("MyCounterCount") end function MyCounterCount() -- Erstelle einen neuen Counter, setze das Limit fest und zähle ihn jede Sekunde hoch if Counter.Tick2("MyCounter", 240) then -- hier geschehen Dinge MyCounterEvent() -- Job beenden return true end end
Die Counter, die in den Abschnitten oben betrachtet werden, sind nur für das Skript sichtbar. Manchmal möchte man dem Spieler einen solchen Counter auch anzeigen, beispielsweise um einen nahenden Angriff genau zu datieren. Dazu gibt es die Funktion MapLocal_StartCountDown(_Time)
. Der Parameter _Time
gibt in Sekunden an, wie lange der anzuzeigende Countdown ist. Sobald er komplett runtergezählt hat, verschwindet er wieder. Wenn du die Funktion erneut aufrufst, bevor der alte Countdown fertig ist, wird nur der neue Countdown angezeigt.
Achtung: Die Funktion ist nur dazu da, einen Countdown anzuzeigen. Es wird dadurch nicht ein Ereignis ausgelöst. Das Ereignis muss an einer anderen Stelle im Skript am Ende eines Counters gesondert ausgelöst werden.
Um die Anzeige des Countdowns frühzeitig zu entfernen, kann MapLocal_StopCountDown()
aufgerufen werden.
Im nächsten Kapitel beschreiben wir, wie im Kontrast zu den in Ebene 1 gezeigten einfachen Computergegnern maßgeschneiderte Spawner mit wahlweise defensivem oder aggressivem Verhalten definiert werden können.
Voriges Kapitel: Söldnerquartiere
Nächstes Kapitel: Banditenlager und Spawner
Zurück nach oben