Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level1:briefings

Ein Briefing abspielen

Briefings stellen Texte außerhalb des normalen Gameplays mit festen Kamerapositionen und schwarzen Balken am oberen und unteren Bildschirmrand dar. Sie können beispielsweise dazu benutzt werden, Aufgaben zu beschreiben und Dialoge darzustellen.

Zu Beginn einer Karte sind Briefings sehr hilfreich dabei, den Spieler in seine Aufgaben einzuführen und ihm eine Übersicht über seine Situation zu geben. Da Karten in Siedler 5 selten nach einem festen Schema ablaufen, ist es meistens angebracht, eine kurze Einführung in die Map zu geben.

Briefings werden mit dem Befehl StartBriefing(_Briefing) gestartet. Der Parameter _Briefing ist ein Table, das sowohl numerische als auch assoziative Einträge enthält. Wir wollen im Folgenden anhand eines Beispiels zeigen, wie dieses Table aufgebaut sein muss.

Für unser Beispiel definieren wir eine neue Funktion CreateBriefingIntro, die wir in der Funktion FirstMapAction aufrufen können.
Darin definieren wir ein lokales Table namens Briefing. Der größte Teil dieses Tables ist eine Liste von „Seiten“, die das Briefing darstellt. Jede Seite braucht mindestens einen Titel, einen Text und eine Position, auf die die Kamera für diese Seite springt. Seiten selbst sind ebenfalls Tables, in denen Wertepaare dazu benutzt werden, Text, Position und andere Optionen zu definieren. Demnach sind Briefings geschachtelte Tables.
Neben den Seiten kann das Briefing-Table aber noch weitere Optionen beinhalten, die für das gesamte Briefing stehen. So gibt es eine Option, die es erlaubt, direkt nach dem Ende des Briefings eine Funktion aufzurufen.

function CreateBriefingIntro()
    local Briefing = {
        -- Seite 1, ein Table im Table
        {
            -- Mit dem Schlüssel title wird der Titel der Briefingseite angegeben
            title = "Mentor",
            -- Mit dem Schlüssel text wird der Text der Briefingseite angegeben
            text = "Kerberos hat sich auf der anderen Seite des Flusses festgesetzt.",
            -- Mit dem Schlüssel position wird die Position der Briefingseite angegeben
            -- Die Funktion GetPosition nimmt den Namen einer Entity als Parameter und
            -- gibt ihre Postion zurück. Da wir beim Erstellen der Karte ein XD_ScriptEntity
            -- mit dem Namen "PositionCampfire" platziert haben, können wir die Kamera nun
            -- genau auf diese Position richten.
            position = GetPosition("PositionCampfire"),
            -- Mit dem Schlüssel dialogCamera kann optional eine alternative Zoomstufe
            -- eingenommen werden, bei der die Kamera näher am Boden ist. Bei der Position
            -- um das Lagerfeuer sind hauptsächlich die Helden zu sehen, sodass sie mit
            -- dieser Option besser ins Bild gerückt werden.
            dialogCamera = true
        },
 
        -- Seite 2, ein weiteres Table. Wichtig: Komma nicht vergessen!
        {
            title = "Mentor",
            text = "Im Moment ist seine Befestigung hoch oben auf dem Berg für Euch unerreichbar.",
            -- Die Position der Kamera soll nun die des gegnerischen Hauptquartiers sein
            position = GetPosition("Player2"),
            -- Da die Position des Gegners noch verdeckt ist, würde man auf dieser Seite nur
            -- schwarze Landschaft sehen, würde man sie nicht aufdecken.
            -- Mit dem Schlüssel explore kann die Landschaft um die gegebene Position
            -- aufgedeckt werden. Dazu muss ein Radius angegeben werden, der definiert,
            -- wie groß das aufgedeckte Gebiet sein soll
            explore = 1000
        },
 
        -- Seite 3
        {
            title = "Mentor",
            text = "Ihr müsst einen Weg finden, Euch seiner Burg zu nähern.",
            position = GetPosition("Player2"),
            -- Mit dem Schlüssel marker können wir eine Markierung auf der Minimap
            -- erstellen. Mit ANIMATED_MARKER pulsiert diese Markierung auffällig,
            -- während STATIC_MARKER eine statische Markierung an die Position
            -- setzt
            marker = ANIMATED_MARKER
        },
 
        -- Seite 4
        {
            title = "Mentor",
            text = "Möglicherweise schafft Ihr es, im Winter über das Wasser zu gelangen. "..
                "Achtet jedoch darauf, Eure Burg nicht zu verlieren!",
            position = GetPosition("Player1")
        },
 
        -- An dieser Stelle sind die Seiten des Briefings komplett beschrieben. Wir wollen
        -- aber noch einige Optionen für das Briefing setzen
        -- finished erlaubt uns, eine Funktion anzugeben, die unmittelbar nach dem Ende des
        -- Briefings aufgerufen wird.
        -- Diese Funktion müssen wir später natürlich noch definieren
        finished = BriefingIntroFinished,
        -- Mit restoreCamera können wir angeben, ob die Kamera nach dem Briefing auf die
        -- Position zurückspringen soll, an der sie vor Beginn des Briefings war oder aber
        -- an der Position der letzten Briefingseite verbleiben soll.
        -- Weil die Kamera zu Beginn einer Karte auf die Mitte der Karte zeigt, ist es schöner,
        -- wenn sie zum Schluss auf das Hauptquartier des Spielers zeigt
        restoreCamera = false
    }
 
    -- Auf Seite 2 haben wir einen Teil der Landschaft aufgedeckt. Damit wir ihn nach dem Briefing
    -- wieder verdecken können, müssen wir uns die Briefingseite merken, in der wir aufgedeckt haben.
    -- Dazu speichern wir die ganze Seite in einer globalen Variable
    BriefingIntroExplore = Briefing[2]
 
    -- Jetzt können wir das Briefing starten
    StartBriefing(Briefing)
end

Natürlich müssen wir außerdem die Funktion BriefingIntroFinished definieren, da wir sonst einen Fehler auslösen.

In dieser Funktion wollen wir dem Spieler einen Auftrag ins Questmenü schreiben und die Landschaft, die wir während des Briefings aufgedeckt haben, wieder verdecken. Die Definition von Quests wird in Ebene 2 ausführlicher beschrieben. Das Beispiel hier dient nur der Vollständigkeit.

function BriefingIntroFinished()
    -- Die Briefing-Seite, die wir uns zuvor gemerkt haben, kann mit ResolveBriefing 
    -- "rückgängig" gemacht werden. Auf die gleiche Art und Weise kann auch ein Marker
    -- wieder von der Minimap entfernt werden.
    ResolveBriefing(BriefingIntroExplore)
 
    -- Mit Logic.AddQuest kann eine neue Quest im Auftragsmenü erstellt werden bzw.
    -- eine vorhandene verändert. In Ebene 2 werden wir genauer darauf eingehen.
    -- Parameter 1 ist die Spieler-Id, muss für den menschlichen Spieler also 1 sein
    -- Parameter 2 ist die Quest-Id und ist eine ganze Zahl >= 1. Beachte, dass
    -- das Spiel nicht mehr als 8 Quests gleichzeitig darstellen kann. Wenn mehrere
    -- Quests ins Spiel kommen, ist es sinnvoll, den Quest-Ids über Variablen Namen
    -- zu geben, um eine bessere Übersicht zu behalten
    -- Parameter 3 ist der Questtyp. Zur Auswahl stehen MAINQUEST_OPEN, MAINQUEST_CLOSED, 
    -- SUBQUEST_OPEN und SUBQUEST_CLOSED. Da unsere Quest eine offene Hauptaufgabe
    -- ist, wählen wir MAINQUEST_OPEN
    -- Parameter 4 ist der Titel der Quest
    -- Parameter 5 ist der Text der Quest
    -- Parameter 6 ist entweder 0 oder 1 und gibt an, ob der Mentor auf die neue
    -- Aufgabe aufmerksam machen soll.
    QuestDefeatKerberos = 1
    Logic.AddQuest(1, QuestDefeatKerberos, MAINQUEST_OPEN, "Besiegt Kerberos", "Auf der "..
        "anderen Seite des Flusses hat Kerberos einen Stützpunkt errichtet. Findet einen "..
        "Weg über den Fluss und stellt ihn in seiner Burg!", 1)
end

Wir haben nun einen Computergegner erstellt und dem Spieler mitgeteilt, was er tun muss. Es bleibt die Implementierung eines Skripts, das dafür sorgt, das die Aktionen des Spielers tatsächlich Auswirkungen auf das Spiel haben. Kurz: Wir müssen definieren, wann der Spieler gewonnen und wann er verloren hat.

Voriges Kapitel: Einen Computergegner platzieren
Nächstes Kapitel: Eine Siegbedingung formulieren
Zurück nach oben

scripting/tutorials/level1/briefings.txt · Zuletzt geändert: 2023/08/05 13:45 von fritz_98