Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level1:weather

Wetter

Eine zentrale Mechanik in Siedler 5 ist die Manipulation des Wetters, um beispielsweise im Winter gefrorene Gewässer passieren zu können. Natürlich kann aber nicht nur der Spieler, sondern auch der Mapper das Wetter auf der Karte steuern.

Das Spiel bietet drei verschiedene Modi fürs Wetter an: Sommer (ohne sonstigen Effekt), Regen (geringere Sichtweite, Fernkämpfer treffen schlechter) und Winter (Wasser gefriert und wird passierbar, Einheiten bewegen sich langsamer).

Diese drei Modi können im Skript auf zweierlei Arten gestartet werden: Periodisch und nicht-periodisch bzw. unverzüglich. Egal um welche Art von Wetter es sich handelt, fügst du im Skript immer einzelne sogenannte Wetterelemente hinzu. Regen, der in regelmäßigen Abständen startet ist genauso ein Wetterelement wie ein plötzlicher, nicht-periodischer Wintereinbruch.

Wenn periodische Wetterelemente per Skript hinzugefügt werden, entsteht je nach Reihenfolge der Aufrufe eine Liste an periodischen Wetterelementen. Diese wird immer von vorne nach hinten abgespielt und beginnt am Ende wieder von vorne. Beispielsweise kannst du ein periodisches Wetterelement für Sommer mit 10 Minuten Dauer festlegen und danach ein weiteres für Regen mit 2 Minuten Dauer. Nach insgesamt 12 Minuten ist diese Liste durchlaufen und wiederholt sich anschließend.

Um periodische Wetterelemente hinzuzufügen, gibt es folgende drei Funktionen:

-- Periodisches Wetterelement Sommer
AddPeriodicSummer(_Duration)
 
-- Periodisches Wetterelement Regen
AddPeriodicRain(_Duration)
 
-- Periodisches Wetterelement Winter
AddPeriodicWinter(_Duration)

Der Parameter _Duration beschreibt dabei die Dauer des Wetterelements in Sekunden. Periodisches Wetter wird in der Regel in der Funktion InitWeather definiert. Für ein periodisches Regen-Element mit 120 Sekunden Dauer sähe ein Aufruf also so aus:

function InitWeather()
    AddPeriodicRain(120)
end

Da nach den 120 Sekunden Regen erneut 120 Sekunden Regen starten, wird es auf der Karte nie aufhören zu regnen. Für unsere Beispielkarte fügen wir deshalb ein Sommer-Wetterelement mit einer großzügigen Dauer hinzu:

function InitWeather()
    -- Eine komfortable Schreibweise für Wetterelemente ist Anzahl der Minuten x Sekunden pro Minute
    -- So wird das Skript leserlicher und die Rechnerei entfällt bzw. wird dem Computer überlassen
    -- In dem Fall haben wir 10 Minuten Sommer und 2 Minuten Regen
    AddPeriodicSummer(10 * 60)
    AddPeriodicRain(2 * 60)
end

Achtung: Du kannst zwar jederzeit neue Wetterelemente hinzufügen, aber niemals wieder entfernen. Überlege dir also insbesondere für periodisches Wetter gut, wie deine Elemente aussehen sollen!


In Abgrenzung zum periodischen Wetter bietet Siedler 5 Elemente für nicht-periodisches Wetter. Diese starten zum Zeitpunkt des Aufrufs sofort und werden nach deren Ende auch nicht mehr gestartet. Dafür gibt es folgende drei Funktionen:

StartSummer(_Duration)
StartRain(_Duration)
StartWinter(_Duration)

_Duration funktioniert genau gleich wie bei den periodischen Pendants oben.

In der Regel werden solche Elemente nicht in InitWeather, sondern bei einem beliebigen Ereignis ausgelöst. Beispielsweise könnte man es nach einem Briefing regnen lassen:

function CreateBriefingHelias()
    -- Im verlinkten Artikel werden Briefings ausführlich erklärt. Dies dient nur als Beispiel
    -- für das Starten eines Wetterelements außerhalb von InitWeather
    local Briefing = {
        {
            title = "Helias",
            text = "Dario, du hast dein Gemüse nicht gegessen.",
            position = GetPosition("Helias")
        }
 
        finished = BriefingHeliasFinished
    }
 
    StartBriefing(Briefing)
end
 
function BriefingHeliasFinished()
    -- Dario hat sein Gemüse nicht gegessen, darum regnet es nun
    StartRain(5 * 60)
end

Achtung: Wenn du nicht-periodische Wetterelemente benutzt, braucht die Karte mindestens ein periodisches Wetterelement. Andernfalls wird sie abstürzen.

Zusammenhang periodisches und nicht-periodisches Wetter

Mit periodischen und nicht-periodischen Elementen gleichzeitig stellt sich die Frage, welches davon im Spiel angezeigt werden soll. Dies wird intern über deren Priorität entschieden. Das Element mit der höchsten Priorität wird angezeigt.

Weil nicht-periodisches Wetter sofort beim Aufruf starten soll, hat es eine höhere Priorität als periodisches Wetter. Aus dem gleichen Grund ist die Priorität nicht-periodischer Elemente untereinander nach dem Zeitpunkt des Erstellens geordnet - das zuletzt erstellte Element hat die höchste Priorität.

Nur weil ein Element nicht angezeigt wird, bedeutet das aber nicht, dass es nicht im Hintergrund aktiv ist. Der Zähler nicht angezeigter Elemente läuft im Hintergrund weiter. Das hat den Effekt, dass ein langes, nicht-periodisches Element nach dem Ende eines kürzeren Elements erneut angezeigt werden kann. Ein Beispiel:

Angenommen, folgendes periodisches Wetter wurde zu Beginn definiert:

function InitWeather()
    AddPeriodicSummer(3 * 60)
    AddPeriodicRain(2 * 60)
    AddPeriodicWinter(1 * 60)
end

Nach 2 Minuten löst der Spieler eine Aktion aus, bei der es für 3 Minuten Winter wird (nicht-periodisch). Nach einer weiteren Minute erstellen wir ein nicht-periodisches Regenelement. Dieser Ablauf ist im Bild unten dargestellt:

weatherprioexample.jpg

Die Priorität des kurzen Regenelements ist also zu der Zeit, in der es aktiv ist, am höchsten, da es das zuletzt hinzugefügte nicht-periodische Element ist. Nach dem Ende des kurzen Regenelements beginnt zuerst das nicht-periodische Winterelement, da das noch nicht zu Ende ist. Erst danach kehrt das Wetter zur periodischen Liste zurück.


Gfx-Sets

Streng genommen sind Wetterelemente nur die „logische“ Seite des Wetters. Sie steuern, wie sich das Spiel verhalten soll. Für die Darstellung von Wetterelementen brauchen wir sogenannte Gfx-Sets. In einem Gfx-Set ist beispielsweise definiert, dass bei einem Regenelement der Regeneffekt angezeigt und der Nebel dichter werden soll. Auch wird über das Gfx-Set angegeben, wie stark die Sonne scheint und aus welcher Richtung ihr Licht kommt.

Es gibt einige Gfx-Sets, die vom Spiel vorbereitet sind und sich an den Landschaftssets orientieren. Mit einer der folgenden Funktionen kannst du ein passendes Gfx-Set auswählen:

SetupEvelanceWeatherGfxSet()
SetupHighlandWeatherGfxSet()
SetupMediterraneanWeatherGfxSet()
SetupMoorWeatherGfxSet()
SetupNormalWeatherGfxSet()
SetupSteppeWeatherGfxSet()

Wichtig: Das Gfx-Set sollte immer in der Funktion InitWeatherGfxSets definiert werden, da es sonst beim Laden eines Spielstands verloren geht!

Für unsere Beispielkarte, die ein mitteleuropäisches Landschaftsbild hat, wählen wir das dazugehörige Gfx-Set:

function InitWeatherGfxSets()
    SetupNormalWeatherGfxSet()
end

In Ebene 4 stellen wir vor, wie man eigene Gfx-Sets definieren und verwenden kann.


Die Spielvoraussetzungen sind nun alle definiert. Im Weiteren wollen wir einen Ablauf festlegen, dem der Spieler folgen kann.

Voriges Kapitel: Technologien
Zurück nach oben
Zurück zur Übersicht

scripting/tutorials/level1/weather.txt · Zuletzt geändert: 2024/05/16 11:05 von fritz_98