======Zähler und Zeitlimits======
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====
''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====
''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====
''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====
''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
----
====Zeitanzeige am Rand des Bildschirms====
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 [[ scripting:tutorials:level1:enemy_ai#mapeditor_setupai|in Ebene 1 gezeigten einfachen Computergegnern]] maßgeschneiderte Spawner mit wahlweise defensivem oder aggressivem Verhalten definiert werden können.
[[ scripting:tutorials:level2:mercenaries | Voriges Kapitel: Söldnerquartiere ]] \\
[[ scripting:tutorials:level2:bandit_camps | Nächstes Kapitel: Banditenlager und Spawner ]] \\
[[ scripting:tutorials:level2:countdowns | Zurück nach oben ]]