Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:countdowns

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 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

scripting/tutorials/level2/countdowns.txt · Zuletzt geändert: 2024/02/10 16:57 von fritz_98