Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:chests

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

Voriges Kapitel: Das Auftragsmenü
Nächstes Kapitel: Söldnerquartiere
Zurück nach oben

scripting/tutorials/level2/chests.txt · Zuletzt geändert: 2023/11/23 12:11 von fritz_98