=====Schatztruhen=====
Die Suche nach Schatztruhen ist eine gute Möglichkeit, die frühen Aufbauphasen durch zusätzliche Ressourcen zu beschleunigen und motiviert darüber hinaus, die Karte möglichst gründlich zu erkunden. Außerdem können Schatztruhen auch in Quests verstrickt sein und wichtige Items, wie z.B. Schlüssel, enthalten.
Im Folgenden stellen wir also einige Funktionen vor, mit denen funktionierende Schatztruhen auf der Karte platziert werden können. Im Anschluss folgt ein Abschnitt zur [[ scripting:tutorials:level2:chests#schatztruhen_aktivieren | "Aktivierung" von Schatztruhen]], der für alle Arten von Schatztruhen wichtig ist.
----
====CreateChest====
''CreateChest(_Position, _Callback)'' ist die generischste aller Schatztruhen. An der Position ''_Position'' wird eine Schatztruhe platziert, deren Öffnung die Funktion ''_Callback'' auslöst. Die Funktion eignet sich deshalb besonders, wenn ganz spezielle, nicht zufällige Ressourcenmengen oder Questitems in der Schatztruhe zu finden sein sollen. Einige Beispiele:
An der Position der ''ScriptEntity'' namens ''"ChestWood"'' sollen genau 1400 Einheiten (veredeltes) Holz zu finden sein.
-- Irgendwo, beispielsweise in der Funktion FirstMapAction, muss die Truhe erschaffen werden:
CreateChest(GetPosition("ChestWood"), CallbackChestWood)
-- Die Schatztruhe muss hierunter noch aktiviert werden, siehe den Abschnitt weiter unten
-- Die Funktion, die als Callback angegeben wurde, muss definiert werden:
function CallbackChestWood()
AddWood(1400)
end
In einem anderen Beispiel soll der Schlüssel zu einem Tor namens ''"Gate"'' in einer Kiste an der Position der ''ScriptEntity'' namens ''"ChestKey"'' versteckt sein:
function FirstMapAction()
-- Zu Beginn hat der Spieler den Schlüssel zum Tor noch nicht gefunden
PlayerHasGateKey = false
-- Ein SimpleJob soll prüfen, ob der Spieler das Tor öffnen kann
StartSimpleJob("OpenGate")
-- Die Truhe mit dem Schlüssel wird platziert
CreateChest(GetPosition("ChestKey"), CallbackChestKey)
-- Hierunter muss die Schatztruhe noch aktiviert werden, siehe den Abschnitt weiter unten
end
function CallbackChestKey()
-- Im Callback der Schatztruhe setzen wir den Schlüssel als gefunden fest
PlayerHasGateKey = true
end
function OpenGate()
-- Wir suchen nach Einheiten von Spieler 1 in der Nähe des Tores
local PositionGate = GetPosition("Gate")
local NumberOfEntities, _ = Logic.GetPlayerEntitiesInArea(1, 0, PositionGate.X, PositionGate.Y, 1000, 1, 2)
-- Wenn mindestens eine Einheit von Spieler 1 in der Nähe des Tores ist...
if NumberOfEntities > 0 then
-- ...prüfe, ob er den Schlüssel besitzt
if PlayerHasGateKey then
-- wenn ja, öffne das Tor
ReplaceEntity("Gate", Entities.XD_WallStraightGate)
-- und beende den Job
return true
else
-- wenn nicht, zeige eine Nachricht an, dass der Schlüssel fehlt
Message("Ihr könnt dieses Tor nicht öffnen, da Euch der Schlüssel fehlt.")
end
end
end
Oft will man aber gar nicht spezielle Schatztruhen bauen, sondern einfach eine Position angeben und dem Spiel zufällig den Inhalt überlassen. Wird keine Funktion als ''_Callback'' angegeben, enthält die Kiste 1000 Einheiten einer zufälligen Ressource oder nichts.
----
====CreateRandomGoldChest====
Mit ''CreateRandomGoldChest(_Position)'' kann an die Position ''_Position'' eine Truhe platziert werden, deren Inhalt ein zufälliger Betrag an Talern zwischen 100 und 500 ist.
====CreateRandomChests====
Mit ''CreateRandomChests()'' werden an die Positionen aller Entities, deren Skriptnamen mit dem Präfix ''"RandomChest"'' durchnummeriert sind, Truhen platziert, die 1000 Einheiten einer zufälligen Ressource oder nichts enthalten.
Wenn du etwa 6 ''ScriptEntities'' mit den Namen ''"RandomChest1"'' bis ''"RandomChest6"'' auf die Karte setzt, kannst du mit einem einzigen Aufruf von ''CreateRandomChests()'' 6 zufällig gefüllte Truhen platzieren.
====CreateRandomGoldChests====
Mit ''CreateRandomGoldChests()'' werden an die Positionen aller Entities, deren Skriptnamen mit dem Präfix ''"GoldChest"'' durchnummeriert sind, Truhen platziert, die einen zufälligen Betrag an Talern zwischen 100 und 500 enthalten.
Wenn du etwa 6 ''ScriptEntities'' mit den Namen ''"GoldChest1"'' bis ''"GoldChest6"'' auf die Karte setzt, kannst du mit einem einzigen Aufruf von ''CreateRandomGoldChests()'' 6 zufällig mit Talern gefüllte Truhen platzieren.
----
====Schatztruhen aktivieren====
Alle Arten von Schatztruhen haben gemeinsam, dass sie ohne Weiteres nicht interaktiv sind. Damit Schatztruhen funktionieren, muss festgelegt werden, wer sie öffnen kann. In der Regel sind das die Helden. Die dafür notwendige Funktion ist ''CreateChestOpener(_Entity)''. Außerdem muss mit der Funktion ''StartChestQuest()'' der automatisch ablaufende Test gestartet werden, der prüft, ob einer der Truhenöffner in der Nähe einer der Truhen ist. Letzteres sollte genau **1 mal** passieren.
Wenn auf deiner Karte ein Dario mit dem Skriptnamen ''"Dario"'' ist, kann er so zum Truhenöffner bestimmt werden:
CreateChestOpener("Dario")
Es ist allerdings nicht zwingend notwendig, dass der Truhenöffner ein Held ist. Auch ein Kundschafter mit dem Skriptnamen ''"Scout"'' kann mit dem entsprechenden Aufruf Truhen öffnen.
CreateChestOpener("Scout")
Zusammen mit einer zufälligen Schatztruhe sowie Dario und dem Kundschafter als Truhenöffner ließe sich so eine zufällig gefüllte Truhe an die Position des ''ScriptEntity'' mit dem Skriptnamen ''"Chest1"'' setzen und interaktiv machen:
function FirstMapAction()
CreateChest(GetPosition("Chest1"))
CreateChestOpener("Dario")
CreateChestOpener("Scout")
StartChestQuest()
end
----
Das nächste Kapitel befasst sich kurz damit, wie funktionierende Söldnerquartiere definiert werden können.
[[ scripting:tutorials:level2:quest_menu | Voriges Kapitel: Das Auftragsmenü ]] \\
[[ scripting:tutorials:level2:mercenaries | Nächstes Kapitel: Söldnerquartiere ]] \\
[[ scripting:tutorials:level2:chests | Zurück nach oben ]]