Benutzer-Werkzeuge

Webseiten-Werkzeuge


tutorials:defeatconditions

Niederlage-Bedingungen

Häufig hat der Spieler verloren, wenn sein Hauptquartier zerstört wurde. Im Allgemeinen hängt die Niederlage immer von einer ganz bestimmten Einheit/einem ganz bestimmten Gebäude ab. Speziell für das Hauptquartier haben die Entwickler bereits die Funktion MapEditor_CreateHQDefeatCondition bereitgestellt. Für andere Gebäude oder bewegliche Einheiten müsste man einen eigenen Job starten (häufig als DefeatJob() bezeichnet). Aber auch dafür gibt es wieder eine (undokumentierte) Comfort-Funktion, die das vereinfacht.

AddDefeatEntity

Mit der Funktion AddDefeatEntity() kann man die Niederlage von einer ganz bestimmten Entity (egal ob Gebäude, Held, Hauptmann, Siedler oder Baum) abhängig machen. Stirbt die Entity (bzw. wird die Entity zerstört), ist das Spiel verloren. Es wird dann ein kurzes Briefing gestartet, welches den Spieler über seine Niederlage informiert und die letzte Position der Entity zeigt.

Syntax

AddDefeatEntity( _name, _updatePosFlag )

_name ist der Script-Name der Entity. Die Entity muss zum Zeitpunkt des Funktionsaufrufes noch am Leben sein/existieren, sonst bricht das Spiel mit einer Fehlermeldung ab.
_updatePosFlag kann true oder false sein. true sollte unbedingt bei beweglichen Entities verwendet werden (Helden, NPCs); false oder nil (nichts) bei unbeweglichen (Gebäude).

Beispiel 1

In diesem Beispiel darf ein NPC namens „OldMcChromix“ nicht sterben, da sonst das Spiel verloren sein soll. Der NPC wurde gerade mitten im dunklen Wald von Ari gefunden und hat sich verlaufen. Ari muss diesen NPC jetzt zurück ins Dorf begleiten und ihn dabei vor dem bösen Wolf beschützen. So würde dann der Aufruf von AddDefeatEntity() aussehen:

AddDefeatEntity( "OldMcChromix", true )

Man übergibt also einmal den Script-Namen der Entity und als zweiten Parameter true, da sich die Entity nach dem Aufruf der Funktion noch bewegen wird.

Beispiel 2

Im zweiten Beispiel darf der Baum des Lebens nicht abgeholzt werden, sonst kann ein ganz schwer kranker NPC nicht mehr geheilt werden und man wird nie erfahren was der Sinn des Lebens ist. Angenommen der Baum hat den Script-Namen „TreeOfLife“ und hat keine Füße, so dass er sich nicht bewegen kann, sieht der Funktionsaufruf so aus:

AddDefeatEntity( "TreeOfLife", false )

Man könnte das false hier auch einfach weglassen, zum Verständnis ist es aber schöner, wenn man es hinschreibt.

RemoveDefeatCondition

Es gibt sicher auch Situationen, bei denen man so eine Niederlage-Bedingung nur für einen bestimmten Zeitraum aufrecht erhalten will. Das Beispiel 1 von oben wäre zum Beispiel so eine Situation. Auch dafür gibt es natürlich eine Funktion:

Syntax

TriggerID = AddDefeatEntity( _name, _updatePosFlag )
RemoveDefeatCondition( TriggerID )

AddDefeatCondition liefert eine ID für die Niederlage-Bedingung. Diese ID braucht man, um eine Bedingung wieder zu entfernen. Das funktioniert dann mit der Funktion RemoveDefeatCondition(), der diese ID als Parameter übergeben werden muss.

Beispiel

Dazu greifen wir auf das Beispiel 1 zurück. Wenn Ari den NPC „OldMcChromix“ zurück in das Dorf gebracht hat, kann die Niedlerlage-Bedingung wieder entfernt werden. Dazu muss der Aufruf von AddDefeatCondition etwas erweitert werden:

DefeatCondition_OldMcChromix = AddDefeatEntity( "OldMcChromix", true )

Es wird also die ID der Niederlage-Bedingung in der Variablen DefeatCondition_OldMcChromix gespeichert.
Wenn „OldMcChromix“ jetzt zurück im Dorf ist, kann die Bedingung so wieder entfernt werden:

RemoveDefeatCondition( DefeatCondition_OldMcChromix )

Wenn „OldMcChromix“ nun doch noch sterben sollte, passiert nichts mehr.

Andere Niederlage Bedingungen

Es ist auch möglich, eigene Niederlage-Bedingungen zu entwerfen, die nicht von einer bestimmten Entity abhängen. Dafür gibt es die allgemeine Funktion AddDefeatCondition(). Dies ist aber keine Comfort-Funktion, sondern kann als eine Schnittstelle für eigene Comfort-Funktionen dienen. Wer schon etwas fitter mit Lua ist, kann damit ja mal experimentieren. Die Syntax der Funtion sieht so aus:

Syntax

AddDefeatCondition( _function, _posList )

_function ist eine Funktion, die die Niederlage-Bedingung enthält. Sie muss bei einem Aufruf true oder false zurückgeben.
_posList ein eine Liste (Table), welche mehrere Elemente enthalten kann. Ein Element hat den Aufbau: { name, updatePosFlag }

Die Einschränkung die besteht ist, dass beim Eintreffen der Bedingung mindestens eine der Entities aus der posList tot sein muss, da sonst das Abschluss-Briefing hängen bleibt. Das lässt sich natürlich leicht umgehen, wenn man einen Namen angibt, der ungültig ist.

tutorials/defeatconditions.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)