=====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 ]]