Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:setup_quest

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


Gebäude errichten: SetupEstablish

In vielen Karten wird vom Spieler gefordert, bestimmte Gebäude zu errichten, meistens an einer vorgegebenen Position. SetupEstablish(_QuestDescription) prüft, ob alle Gebäude nach Vorgabe errichtet wurden. _QuestDescription ist ein Table mit den folgenden Parametern:

Key Value-Typ Bedeutung Erforderlich?
Player Player Id Spieler-Id des Spielers, der die Gebäude errichten soll Nein (wenn nicht angegeben, ist es der menschliche Spieler)
AreaPos String oder Number Skriptname oder Entity-Id der Entity, die im Mittelpunkt des Zielgebiets steht Nein (ohne Angabe ganze Karte)
AreaSize Number Radius, in dessen Umkreis um AreaPos herum die Gebäude errichtet werden sollen Nur, wenn AreaPos angegeben wurde
EntityTypes Table Liste mit Entity-Typen der zu bauenden Gebäude und deren Anzahl Ja
Callback Funktion Funktion, die aufgerufen wird, sobald die Gebäude nach Vorgabe errichtet wurden Ja

Hinweis: Prinzipiell wurde im Code von SetupEstablish auch der Parameter Any implementiert, um nur eines der geforderten Gebäude für die Erfüllung der Quest notwendig zu machen. Diese Funktionalität ist allerdings an mehreren Stellen verbuggt und daher nicht zu gebrauchen.

In folgendem Beispiel soll Spieler 1 an der Position des Entities „CathedralTarget“ um Umkreis von 4000 Siedler-cm eine Kathedrale, ein großes Wohnhaus und einen Gutshof errichten:

function CreateQuestBuildCathedral()
    QuestBuildCathedral = {
        Player = 1,
        AreaPos = "CathedralTarget",
        AreaSize = 4000,
        EntityTypes = {
            {Entities.PB_Monastery3, 1}, -- Gebäudetyp und deren Anzahl
            {Entities.PB_Farm3, 1},
            {Entities.PB_Residence3, 1}
        },
        Callback = CallbackQuestBuildCathedral
    }
 
    SetupEstablish(QuestBuildCathedral)
end
 
function CallbackQuestBuildCathedral()
    -- diese Funktion wird automatisch nach Erfüllen der Quest aufgerufen
end

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

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


Wetter umstellen: SetupWeather

In der Kampagnenkarte „Norfolk“ des Hauptspiels erhält der Spieler die Aufgabe, den Winter zu beenden. Dieser Questtyp ist ebenfalls als Standardquest verfügbar und wird mit SetupWeather(_QuestDescription) gestartet. _QuestDescription ist ein Table mit den folgenden Parametern:

Key Value-Typ Bedeutung Erforderlich?
WeatherStates Table Liste der gewünschten Weather states (FIXME link), von denen einer eintreten muss, als Id Ja
Callback Funktion Funktion, die aufgerufen wird, sobald einer der WeatherStates eintritt Ja

Die erwarteten WeatherState-Ids sind 1 für Sommer, 2 für Regen und 3 für Winter. Um sich das besser lesbar zu machen, kann man sich auch ein globales Table definieren:

WeatherStates = {
    Summer = 1,
    Rain = 2,
    Winter = 3
}

Soll der Spieler beispielsweise wie in Norfolk den Winter beenden, könnte der SetupWeather-Aufruf so aussehen:

function CreateQuestEndWinter()
    QuestEndWinter = {
        WeatherStates = { WeatherStates.Summer, WeatherStates.Rain }, -- Sowohl Sommer als auch Regen beenden den Winter
        Callback = CallbackQuestEndWinter
    }
 
    SetupWeather(QuestEndWinter)
end
 
function CallbackQuestEndWinter()
    -- diese Funktion wird automatisch aufgerufen, sobald der Winter zuende ist
end

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

Damit die Quest funktioniert, ist es logischerweise wichtig, dass es zum Zeitpunkt des Aufrufs schneit. Falls der Winter nicht zu Beginn der Karte gestartet wird, sollte der Start der Quest auf den Wintereinbruch warten. Dazu kann ebenfalls SetupWeather benutzt werden:

function CreateQuestWaitForWinter()
    local QuestDescription = {
        WeatherStates = { WeatherStates.Winter },
        Callback = CallbackQuestWaitForWinter
    }
 
    SetupWeather(QuestDescription)
end
 
function CallbackQuestWaitForWinter()
    -- Beginne erst bei Wintereinbruch mit der "tatsächlichen" Spielerquest
    CreateQuestEndWinter()
end

Quests abbrechen

Mit DestroyQuest(_QuestDescription) können Quests vorzeitig wieder abgebrochen werden, sodass die Bedingung nicht mehr geprüft und das Callback nicht mehr aufgerufen wird.

Damit das funktioniert, ist es wichtig, dass das QuestDescription-Table, die für die Erstellung der Quest verwendet wurde, als globale Variable definiert ist. Der Aufruf von Setup… trägt in dieses Table eine Trigger-Id ein, die für DestroyQuest gebraucht wird.

Wir nehmen das Beispiel zum Auffinden von Helias oben. Wenn Helias aus irgendeinem Grund stirbt, soll die Quest QuestFindHelias beendet werden. Dafür können wir analog zu den Sieg- und Niederlagebedingungen aus Ebene 1 einen SimpleJob starten, der prüft, ob Helias gestorben ist. Wenn das der Fall ist, beende die Quest QuestFindHelias.

function FirstMapAction()
    -- Wir erstellen gleichzeitig die Quest, Helias zu finden und den Job,
    -- der Helias Tod prüfen soll
    CreateQuestFindHelias()
    StartSimpleJob("CheckHeliasDeath")
end
 
function CheckHeliasDeath()
    -- wenn Helias tot ist...
    if IsDead("Helias") then
        -- ...beende die Quest
        DestroyQuest(QuestFindHelias)
        -- Und beende die Quest nur 1 mal! Der Job wird nach Beenden der Quest ebenfalls
        -- durch return true beendet
        return true
    end
end
 
-- Hierunter kommt der Beispielcode von oben. Wichtig ist, dass QuestFindHelias global definiert wird

Zusätzliche Parameter

Analog zu den NPC-Callbacks werden auch bei allen Quest-Callbacks die Quest-Tables, die zur Definition der Quest verwendet wurden, als Parameter übergeben. Dies machen wir uns beispielsweise im nächsten Kapitel zunutze, um nach einer SetupEstablish-Quest die errichteten Gebäude dem Spieler des Auftraggebers zu übergeben.

Eine Konsequenz daraus ist, dass im Quest-Table zusätzliche, frei wählbare Parameter angegeben werden können, die im Callback verfügbar sind. Das ist vor allem nützlich, wenn mehrere Quests die gleiche Callback-Funktion verwenden (da andernfalls jedes Callback auf eine einzigartige Quest zurückgeführt werden kann).

Folgende Quest soll umgesetzt werden: Der Spieler hat die Wahl, ob er für den Auftraggeber eine Garnision oder eine Schießanlage errichten möchte. Je nach gewähltem Gebäude soll er einen Trupp Langschwertkämpfer oder Armbrustschützen erhalten. Wenn er sich für eines der Gebäude entschieden und die zugehörige Belohnung erhalten hat, soll die jeweils andere Quest automatisch beendet werden.

Für dieses Setup existiert eine ScriptEntity mit dem Skriptnamen „EstablishMilitaryBuilding“ und eine weitere mit dem Skriptnamen „SpawnRewardTroops“.

function FirstMapAction()
    -- Beide Quests werden mit der gleichen Funktion, aber unterschiedlichen Parametern gestartet
    -- Die Funktionen geben das Quest-Table zurück, damit sie in eine globale Variable gegeben werden können
    -- Das ist notwendig, weil die jeweils nicht erfüllte Quests automatisch beendet werden soll
    QuestBuildBarracks = CreateQuestBuildMilitaryBuilding(Entities.PB_Barracks2, Entities.PU_LeaderSword3)
    QuestBuildArchery = CreateQuestBuildMilitaryBuilding(Entities.PB_Archery2, Entities.PU_LeaderBow3)
 
    -- Um anzugeben, welche Quest beendet werden soll, geben wir diese Information ebenfalls noch in die
    -- Tables:
    QuestBuildBarracks.RemoveQuest = QuestBuildArchery
    QuestBuildArchery.RemoveQuest = QuestBuildBarracks
    -- Im Callback brauchen wir also nur auf den Eintrag RemoveQuest zuzugriefen, um zu wissen, welche
    -- Quest beendet werden muss
end
 
function CreateQuestBuildMilitaryBuilding(_BuildingType, _RewardType)
    -- Da die Funktion 2 mal aufgerufen wird, muss die Questbeschreibung innerhalb der 
    -- Funktion lokal sein. Sie wird mit return zurückgegeben und beim Aufruf in einer
    -- globale Variable gespeichert
    local QuestDescription = {
        Player = 1,
        AreaPos = "EstablishMilitaryBuilding",
        AreaSize = 2000,
        EntityTypes = {
            -- Der Gebäudetyp wird aus dem Parameter geholt
            {_BuildingType, 1}
        },
        -- Hier geben wir den Truppentyp der Belohnung für den Bau des Gebäudes an
        -- Er wird vom Quest-Handling ignoriert, kann aber im Callback verwendet werden,
        -- um die korrekte Belohnung zu spawnen
        RewardType = _RewardType,
        Callback = CallbackQuestBuildMilitaryBuilding
    }
 
    SetupEstablish(QuestDescription)
 
    -- Rückgabe der QuestDescription, um sie in eine globale Variable geben zu können
    return QuestDescription
end
 
function CallbackQuestBuildMilitaryBuilding(_QuestDescription)
    -- In dieser Funktion steht das Table _QuestDescription zur Verfügung, das genau dem Quest-Table
    -- mitsamt unserer zusätzlichen Einträge entspricht
 
    -- Die Funktion CreateMilitaryGroup erstellt einen kompletten Trupp Soldaten vom angegebenen Typ
    -- Siehe die Comfort-Referenz oder den Artikel zu "Belohnungen" in Ebene 2
    -- Für den Typ des Hauptmanns wählen wir den RewardType, der beim erstellen der Quest
    -- abhängig von den Parametern festgelegt wurde
    CreateMilitaryGroup(1, _QuestDescription.RewardType, 8, GetPosition("SpawnRewardTroops"))
    -- Außerdem haben wir pro Quest angegeben, welche die jeweils andere Quest ist, die es nun zu
    -- beenden gilt
    DestroyQuest(_QuestDescription.RemoveQuest)
end

Karawanen beschützen: SetupCaravan

Diese Art der Quest kennst du vielleicht aus der Nebelreich-Kampagnenkarte „Fahrende Händler“. Eine bestimmte Anzahl an Händlern läuft die Handelsroute entlang vorgegebener Wegpunkte ab und verweilt an jedem Wegpunkt kurz. Aufgabe des Spielers ist es, diese Händler zu beschützen. Die Quest ist erfolgreich, wenn ausreichend Händler ihr Ziel erreichen - andernfalls scheitert sie.

Die Funktion SetupCaravan(_QuestDescription) übernimmt dabei das Bewegen der Händler und den Check, ob alle Händler den Zielpunkt erreicht haben oder gestorben sind. Allerdings erschafft die Funktion die Händler nicht von selbst! Sie müssen also vor Beginn der Quest bereits existieren. Der Parameter _QuestDescription ist ein Table mit folgenden Einträgen:

KeyValue-TypBedeutung
Unit String Präfix eines Skriptnamens für mehrere Entities, deren Namen auf der Karte durchnummeriert sind. „Trader“ stände beispielsweise für „Trader1“, „Trader2“, „Trader3“, usw. - abhängig davon, wie viele durchnummerierte Entities existieren
Unit Table (Liste) Liste mit Skriptnamen oder Entity-Ids aller Entities, die der Karawane angehören sollen
Waypoint Table (Liste) Liste von Tables, die für jeden Wegpunkt den Namen einer Positions-Entity und die zugehörige Wartezeit angeben
Remove nil Wenn ~= nil, werden die Entities in der Karawane automatisch gelöscht, wenn sie den Zielpunkt erreichen. Optionaler Parameter
Callback Funktion Funktion, die aufgerufen wird, sobald alle Entities entweder am Zielort oder tot sind
ArrivedCallback Funktion Funktion, die jedes mal aufgerufen wird, sobald eine Entity am Zielort ankommt. Optionaler Parameter

Hinweis: Die Angabe von Unit erfolgt entweder als String oder als Liste.

Jedes mal, wenn ein Mitglied der Karawane den letzten Wegpunkt erreicht, wird außerdem eine Zählvariable im Quest-Table .ArrivedCount hochgezählt. Da das Quest-Table in den Callbacks verfügbar ist, können wir darin abfragen, wie viele der Entities erfolgreich am Ziel angekommen sind.

Für folgendes Anwendungsbeispiel existieren auf der Karte einige ScriptEntities, die duchnummeriert die Namen „QuestCaravanWaypoint1“ bis „QuestCaravanWaypoint5“ tragen, sowie ein ScriptEntity mit „QuestCaravanStart“.

Außerdem werden wir uns die Möglichkeit zusätzlicher Parameter zunutze machen, um im Quest-Table zu definieren, wie viele der Händler, die gestartet sind, ankommen müssen.

function CreateQuestCaravan()
    -- Die Händler existieren noch nicht, wir müssen sie also erst erstellen
    for i = 1, 5 do
        -- Skriptnamen werden beim Erstellen in der Schleife gleich durchnummeriert
        CreateEntity(4, Entities.PU_Travelling_Salesman, GetPosition("QuestCaravanStart"), "QuestCaravanTrader"..i)
    end
 
    local QuestDescription = {
        -- Alle 5 Händler sind gemeint - der gemeinsame Namenspräfix reicht
        Unit = "QuestCaravanTrader",
 
        -- Hier wird die Liste der Wegpunkte angegeben
        -- Jeder Wegpunkt hat einen Namen (Skriptname der Entity, deren Position der Wegpunkt ist)
        -- und eine Wartezeit
        Waypoint = {
            {Name = "QuestCaravanWaypoint1", WaitTime = 30},
            {Name = "QuestCaravanWaypoint2", WaitTime = 30},
            {Name = "QuestCaravanWaypoint3", WaitTime = 30},
            {Name = "QuestCaravanWaypoint4", WaitTime = 30},
            {Name = "QuestCaravanWaypoint5", WaitTime = 30}
        },
 
        -- Jeder angekommene Händler soll direkt von der Map entfernt werden
        Remove = true,
 
        -- Dies ist ein eigener Parameter. Wir geben hier an, dass 3 der 5 Händler ankommen müssen
        -- Diese Bedingung prüfen wir später im Callback
        Necessary = 3,
 
        -- Zwei verschiedene Funktionen für zwei verschiedene Callbacks
        -- Einmal die Funktion, die bei jedem angekommenen Händler ausgelöst wird
        ArrivedCallback = CallbackArrivedQuestCaravan,
        -- und die Funktion, die ausgelöst wird, sobald alle Händler angekommen oder tot sind
        Callback = CallbackQuestCaravan,
    }
 
    SetupCaravan(QuestDescription)
end
 
function CallbackArrivedQuestCaravan()
    -- In diesem Callback lassen wir den Spieler lediglich wissen, dass einer der Händler angekommen ist
    Message("Ein Händler ist an seinem Ziel angekommen!")
end
 
function CallbackQuestCaravan(_QuestDescription)
    -- Hier prüfen wir, ob genug Händler ihre Reise überlebt haben
    -- Die Variable _QuestDescription.ArrivedCount wurde automatisch hochgezählt
    if _QuestDescription.ArrivedCount >= _QuestDescription.Necessary then
        Message("Ihr habt erfolgreich die Karawane beschützt!")
        -- hier folgt alles Weitere nach dem erfolgreichen Erfüllen der Quest
    else
        Message("Ihr habt es nicht geschafft, die Karawane zu beschützen!")
        -- hier folgt alles nach dem Scheitern der Quest (z.B. neuer Versuch, etc)
    end
end

Hinweis: Die Karawane verhält sich so, dass der erste Händler vorausgeht und alle weiteren Händler ihrem Vordermann folgen. Wenn du nicht genug Wartezeit pro Wegpunkt angibst, fallen die letzten Händler in der Reihe möglicherweise zurück. Die Wartezeit an den Wegpunkten sollte also ungefähr mit der Größe der Karawane wachsen.


NPCs geben Aufträge, deren Bedingungen nun geprüft werden können. Im nächsten Kapitel stellen wir einige Funktionen vor, mit denen der Spieler für seine Aktionen belohnt werden kann.

Voriges Kapitel: NPCs
Nächstes Kapitel: Belohnungen
Zurück nach oben

scripting/tutorials/level2/setup_quest.txt · Zuletzt geändert: 2023/11/11 14:07 von fritz_98