Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:chests

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

scripting:tutorials:level2:chests [2023/11/16 14:52] – angelegt fritz_98scripting:tutorials:level2:chests [2023/11/23 12:11] (aktuell) fritz_98
Zeile 3: Zeile 3:
 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.  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 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====
 +
 +''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.
 +<code lua>
 +-- 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
 +</code>
 +
 +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:
 +<code lua>
 +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
 +</code>
 +
 +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==== ====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==== ====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==== ====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:
 +<code lua>
 +CreateChestOpener("Dario")
 +</code>
 +
 +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.
 +<code lua>
 +CreateChestOpener("Scout")
 +</code>
 +
 +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:
 +<code lua>
 +function FirstMapAction()
 +    CreateChest(GetPosition("Chest1"))
 +    CreateChestOpener("Dario")
 +    CreateChestOpener("Scout")
 +    StartChestQuest()
 +end
 +</code>
 +
 +----
 +
 +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 ]]
scripting/tutorials/level2/chests.1700146378.txt.gz · Zuletzt geändert: 2023/11/16 14:52 von fritz_98