=====Eine Siegbedingung formulieren=====
Um einen vollständigen Spielablauf zu erhalten, muss der Spieler sowohl gewinnen als auch verlieren können. Gewonnen hat der Spieler, wenn er das feindliche Haupthaus zerstört. Verloren hat er, wenn er das eigene verliert.
Da eine dieser beiden Bedingungen jederzeit eintreffen kann, müssen wir beide zu jeder Zeit prüfen. Dazu verwenden wir einen sogenannten //SimpleJob//. Ein //SimpleJob// ist ein Trigger, der jede Sekunde ausgelöst wird.
Wir werden Trigger im [[ scripting:tutorials:level3:trigger |zugehörigen Kapitel]] näher beleuchten. Im Moment soll uns die Vorstellung genügen, dass im Spiel automatisch verschiedene Ereignisse/**Events** ausgelöst werden (siehe dazu auch [[ scripting:tutorials:level1:programming_intro|Ereignisse im Spielablauf]]). Für jedes dieser Events kann man (theoretisch beliebig viele) Trigger registrieren. Der Trigger ist im einfachsten Fall einfach nur eine Funktion, die als Reaktion auf das zugehörige Ereignis automatisch aufgerufen wird.
Beispielsweise ist ein Event der Wetterwechsel. Der zugehörige Trigger sorgt dafür, dass der Mentor den Wetterwechsel ankündigt. Im Fall eines //SimpleJob// ist das Event, dass eine Sekunde Spielzeit vergangen ist. So rufen wir also in jeder Sekunde eine Funktion im Skript auf. Damit können wir die Sieg- und Niederlagebedingungen definieren: Da wir nicht wissen, wann das gegnerische Haupthaus zerstört wurde, fragen wir einfach jede Sekunde, ob es noch steht. Sobald es nicht mehr steht, hat der Spieler gewonnen. Die Niederlagebedingung funktioniert analog.
Zu Beginn des Spiels starten wir beide //SimpleJob//s mit der Funktion ''StartSimpleJob'' in der ''FirstMapAction'', zusammen mit dem Briefing und der Definition des Computergegners. Der Name der Funktion, die jede Sekunde aufgerufen werden soll, muss als String angegeben werden:
function FirstMapAction()
CreatePlayer2()
CreateBriefingIntro()
StartSimpleJob("VictoryCondition")
StartSimpleJob("DefeatCondition")
end
**Wichtig**: Für die Namen der //SimpleJob//-Funktionen gelten die gleichen Regeln wie für [[ scripting:tutorials:level1:variables|Variablen]]. Beachte, dass //SimpleJob//s keine Parameter entgegen nehmen.
Die beiden Funktionen ''VictoryCondition'' und ''DefeatCondition'' sehen zueinander recht ähnlich aus:
function VictoryCondition()
-- Die Funktion IsDead nimmt einen Entity-Namen als Parameter und gibt einen Boolean zurück
-- Wenn die Entity mit dem angegebenen Namen noch lebt, wird false zurückgegeben
-- Wenn die Entity mit dem angegebenen Namen nicht mehr lebt, wird true zurückgegeben
-- Die if-Bedingung ist also genau dann erfüllt, wenn "Player2" nicht mehr lebt
if IsDead("Player2") then
-- Victory bewirkt den Sieg für den menschlichen Spieler. Er erhält dann den
-- entsprechenden Bildschirm mit der "Hurra, Ihr habt das Spiel gewonnen"-Meldung
Victory()
-- Die Rückgabe von true bewirkt, dass der Trigger beendet wird. Würden wir den
-- Trigger an dieser Stelle nicht beenden, würde der Sieg beim Fall der Burg
-- jede Sekunde ausgelöst werden.
-- Wenn wir den Trigger beenden, wird der Sieg genau 1 mal ausgelöst, sobald die
-- Burg fällt
return true
end
end
function DefeatCondition()
-- Die Bedingung für die Niederlage ist der Fall der Spielerburg
if IsDead("Player1") then
-- Defeat bewirkt die Niederlage für den menschlichen Spieler. Er erhält dann
-- den Bildschirm mit der "Oh nein, Ihr habt das Spiel verloren"-Meldung
Defeat()
-- Auch in diesem Fall soll die Niederlage nur genau 1 mal ausgelöst werden,
-- weshalb wir den Job nach dem Fall der Burg sofort beenden
return true
end
end
Das Skript unserer Beispielkarte ist damit vollständig und bereit für Tests. In den nächsten Kapiteln besprechen wir, wie Fehler im Skript gefunden werden können und wie mit Testergebnissen umzugehen ist. Über //Skript// → //Importiere Skript...// im Skript-Editor kannst du das Skript in die Mapdatei laden. Wir werden im nächsten Kapitel noch eine andere Methode kennenlernen, das Skript der Map hinzuzufügen, die das Testen beschleunigt.
Das vollständige Skript unserer Beispielkarte inklusive der Kommentare findest du {{ scripting:tutorials:level1:basis_script:mapscript.zip |hier}}.
----
**Tipp**: Um einen //SimpleJob// besser nachvollziehen zu können und "sichtbarer" zu machen, kannst du auf einer Testmap folgenden Testjob starten:
function FirstMapAction()
-- Definiere eine globale Zählvariable
MyCounter = 0
StartSimpleJob("CounterJob")
end
function CounterJob()
-- Zähle jede Sekunde die globale Zählvariable um 1 nach oben
MyCounter = MyCounter + 1
-- Zeige den aktuellen Zählstand im Spiel an
Message(MyCounter)
-- Wenn der Zähler den Wert 10 erreicht hat, beende den Job
if MyCounter >= 10 then
return true
end
end
Im Spiel kannst du dann beobachten, wie die Zahlen von 1 bis 10 angezeigt werden und der //SimpleJob// dann beendet wird.
----
[[ scripting:tutorials:level1:briefings | Voriges Kapitel: Einen Computergegner platzieren ]] \\
[[ scripting:tutorials:level1:simple_job | Zurück nach oben ]] \\
[[ scripting:tutorials#die_karte_testen| Zurück zur Übersicht ]]