Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:setup_quest

Dies ist eine alte Version des Dokuments!


Orte erreichen, Gebäude bauen, Gegner besiegen

Für viele Typen von Quests, die in Siedler 5 üblich sind, existieren vorgefertigte Skripthilfen, um sie leichter implementieren zu können. Zu diesen Typen zählt das Erreichen eines gewissen Zielorts, die Zerstörung bestimmter Gegner oder das Errichten einiger Gebäude. Die dafür zur Verfügung stehenden Hilfsfunktionen werden im Folgenden nacheinander vorgestellt.

Wichtig: Die Funktionen, die wir vorstellen, prüfen nur die Erfüllung einer Quest! Einleitende oder abschließende Briefings, Questlogeinträge, NPCs, etc müssen gesondert definiert werden.


Orte erreichen: SetupExpedition

SetupExpedition(_QuestDescription) prüft, ob eine bestimmte Entity oder eine Entity einer bestimmten Kategorie einen Bereich auf der Karte erreicht hat. _QuestDescription ist ein Table mit den folgenden Parametern:

Key Value-Typ Bedeutung Erforderlich?
EntityName String oder Number Skriptname oder Entity-Id der Entity, die den Bereich erreichen soll Ja, wenn sonst nichts gegeben, sonst optional
Heroes Boolean Irgendein Held muss den Bereich erreichen Ja, wenn sonst nichts gegeben, sonst optional
Leaders Boolean Irgendein Hauptmann muss den Bereich erreichen Ja, wenn sonst nichts gegeben, sonst optional
Serfs Boolean Irgendein Leibeigener muss den Bereich erreichen Ja, wenn sonst nichts gegeben, sonst optional
TargetName String oder Number Skriptname oder Entity-Id der Entity, die im Mittelpunkt des zu erreichenden Bereichs steht Ja
Distance Number Abstand zu TargetName, der für die Erfüllung der Bedingung unterschritten werden muss Ja
Callback Funktion Funktion, die aufgerufen wird, sobald der Bereich erreicht wurde Ja

Der zu erreichende Bereich wird demnach als Kreisfläche definiert. Mindestens einer von EntityName, Heroes, Leaders oder Serfs muss angegeben sein, damit die Quest erfüllbar wird.

In foldendem einfachen Beispiel soll Dario Helias in Crawford erreichen. Dazu müssen auf der Karte sowohl eine Entity mit dem Skriptnamen „Dario“ als auch eine Entity mit dem Skriptnamen „Helias“ existieren.

function CreateQuestFindHelias()
    QuestFindHelias = {
        EntityName = "Dario",
        TargetName = "Helias",
        Distance = 700,
        Callback = CallbackQuestFindHelias
    }
 
    SetupExpedition(QuestFindHelias)
end
 
function CallbackQuestFindHelias()
    -- diese Funktion wird ausgeführt, sobald Dario am Ziel ist
end

Tipp: Du kannst deine gewünschte Distanz durch Platzieren eines XS_Ambient auf die Entity mit TargetName ermitteln. Das 100-fache der angegebenen Größe der Ambient-Entity entspricht genau der anzugebenden Distanz in SetupExpedition.

Im obigen Beispiel definieren wir die _QuestDescription als globales Table. Das ist nur notwendig, falls du die Quest später vorzeitig beenden (FIXME link) willst.

Man kann die Bedingungen für einzelne Entities und Entity-Kategorien auch kombinieren. Beispielsweise soll entweder ein Bote namens „Hannes“ oder ein beliebiger Held den Bürgermeister „Mayor“ erreichen. Entities mit den entsprechenden Skriptnamen müssen auf der Karte existieren.

function CreateQuestReachMayor()
    local QuestDescription = {
        EntityName = "Hannes",
        Heroes = true,
        TargetName = "Mayor",
        Distance = 1000,
        Callback = CallbackQuestReachMayor
    }
 
    SetupExpedition(QuestDescription)
end
 
function CallbackQuestReachMayor()
    -- sobald der Bürgermeister erreicht wurde, wird diese Funktion ausgeführt
end

Gegner besiegen: SetupDestroy

In Siedler 5 gibt es zahlreiche denkbare Bedingungen dafür, wann ein Gegner als besiegt gelten kann. Die Funktion SetupDestroy(_QuestDescription) deckt die meisten davon ab. _QuestDescription ist ein Table mit den folgenden Parametern, die in „Gruppen“ zusammengefasst sind und jeweils für eine andere Questbedingung stehen (alle Parameter innerhalb einer Gruppe müssen zusammen verwendet werden).

Gruppe Key Value-Typ Bedeutung
Gruppe 1: Alle Gebäude in einem Gebiet zerstören AreaPlayerID Player Id Spieler-Id, dessen Gebäude im Zielgebiet zerstört werden sollen
AreaPos String oder Number Skriptname oder Entity-Id der Entity, die im Mittelpunkt des Zielgebiets steht
AreaSize Number Radius, in dessen Umkreis um AreaPos herum alle Gebäude von Spieler AreaPlayerID zerstört werden sollen
Gruppe 2: Eine bestimmte Entity zerstören Target String oder Number Skriptname oder Entity-Id der Entity, die zerstört werden soll
Gruppe 3: Mehrere bestimmte Entities zerstören Targets Table Liste mit Skriptnamen oder Entity-Ids aller Entities, die zerstört werden sollen
Targets String Präfix eines Skriptnamens für mehrere Entities, deren Namen auf der Karte durchnummeriert sind. „Serf“ stände beispielsweise für „Serf1“, „Serf2“, „Serf3“, usw. - abhängig davon, wie viele durchnummerierte Entities existieren
Gruppe 4: Eine Armee (FIXME link) zerstören Army Table Army-Table der zu besiegenden Armee
ArmyPos String oder Number Skriptname oder Entity-Id der Entity, zu deren Position die Armee beim Questaufruf geht (optional)
ArmyRange Number Radius der Armee nach dem Questaufruf (nur wenn ArmyPos angegeben)
Immer notwendig Callback Funktion Funktion, die aufgerufen wird, sobald alle Ziele zerstört wurden

Armee-Tables werden erst in Ebene 3 (FIXME link) behandelt, diesen Use Case lassen wir für die folgenden Beispiele also außen vor.

Im einfachsten aller Beispiele soll nur ein einzelner Banditenturm zerstört werden, dem wir den Skriptnamen „RobberyTower“ im Editor gegeben haben. Folgendermaßen kann seine Zerstörung ermittelt werden:

function CreateQuestDestroyRobberyTower()
    QuestDestroyRobberyTower = {
        Target = "RobberyTower",
        Callback = CallbackQuestDestroyRobberyTower
    }
 
    SetupDestroy(QuestDestroyRobberyTower)
end
 
function CallbackQuestDestroyRobberyTower()
    -- diese Funktion wird aufgerufen, sobald der Banditenturm zerstört wurde
end

Hinweis: Im obigen Beispiel definieren wir die _QuestDescription als globales Table. Das ist nur notwendig, falls du die Quest später vorzeitig beenden (FIXME link) willst.

Die einzelnen Gruppen können auch kombiniert werden. Die Questbedingung ist genau dann erfüllt, wenn jede Bedingung der Gruppen erfüllt ist. Beispielsweise wollen wir in folgendem Beispiel ausdrücken, dass der Spieler alle Gebäude von Spieler 3 in einem Umkreis von 3000 Siedler-cm um die Entity „Player3Position“ zerstören muss. Außerdem haben wir einige PB_Beautification09 auf der Karte verteilt, deren Skriptnamen wir mit „Flower1“, „Flower2“, usw. durchnummeriert haben und die ebenfalls für die Quest zerstört werden müssen.

function CreateQuestDestroyPlayer3()
    local QuestDescription = {
        AreaPlayerID = 3,
        AreaPos = "Player3Position",
        AreaSize = 3000,
 
        Targets = "Flower",
 
        Callback = CallbackQuestDestroyPlayer3
    }
 
    SetupDestroy(QuestDescription)
end
 
function CallbackQuestDestroyPlayer3()
    -- diese Funktion wird aufgerufen, wenn die Questbedingung erfüllt ist
end

Tipp: Du kannst deinen gewünschten Radius durch Platzieren eines XS_Ambient auf die Entity mit den Namen AreaPos ermitteln. Das 100-fache der angegebenen Größe der Ambient-Entity entspricht genau dem anzugebenden Radius in SetupDestroy.

Beachte, dass in diesem Beispiel die Blumen nicht notwendigerweise Spieler 3 gehören müssen! Die Angabe von AreaPlayerID bezieht sich nur auf die Gebiets-Bedingung.


scripting/tutorials/level2/setup_quest.1698327723.txt.gz · Zuletzt geändert: 2023/10/26 13:42 von fritz_98