Jahreszeiten manipulieren

Ausnahmsweise in gelber "Warnfarbe", weil dieses Beispiel wesentlich komplizierter zu verstehen ist als die anderen.

Das Spiel sieht einen Wechsel der Jahreszeiten vor. In manchen Klimazonen hat dies keinen Einfluss auf das Spiel (SE und NA), jedoch muss man in den übrigen Klimazonen die Jahreszeiten einplanen. Man braucht Vorräte für den Winter oder muss seine Siedler vor der Regenzeit in Sicherheit bringen.

Die Jahreszeiten passen nicht in jede Geschichte. Ich zeige dir, wie du die Jahreszeiten nach deinem Willen steuern kannst.

Dazu solltest du folgende Artikel durcharbeiten:

Korrigieren der Jahreszeit

Wie du bereits gelesen hast, lassen sich Display Sets nicht speichern. Dafür brauchst du die Funktion Mission_OnSaveGameLoaded in deinem Skript. Diese Funktion solltest du in der FMA aufrufen. Dabei musst du darauf achten, dass du die Originalfunktion unter einem eindeutigen Namen speicherst. Zwar ist Mission_OnSaveGameLoaded standartmäßig leer, aber vielleicht verwendest du Fremdcode, der diese Funktion benutzt. Den würdest du überschreiben, wenn du einfach in die Funktion schreibst. Deshalb sollte die Funktion wie folgt aussehen:

Mission_OnSaveGameLoaded_OrigMISSION = Mission_OnSaveGameLoaded
Mission_OnSaveGameLoaded = function()
    Mission_OnSaveGameLoaded_OrigMISSION()
end

Für einen korrekten Reset der Jahreszeit, nachdem der Spielstand geladen wurde, musst du eine Fallunterscheidung durchführen. Wie diese aussieht sei dir überlassen. hier ein Beispiel:

function Mission_GameCallbacks()
    Mission_OnSaveGameLoaded_OrigMISSION = Mission_OnSaveGameLoaded
    Mission_OnSaveGameLoaded = function()
        Mission_OnSaveGameLoaded_OrigMISSION()

        if g_Mission.Season == "summer" then
         Logic.ExecuteInLuaLocalState([[
         Display.WeatherOverride_SetSeason(2)
         Display.StopUsingExplicitEnvironmentSettings()
         Display.SetExplicitEnvironmentSettings("me_summer.xml")
         Display.UseCloseUpSettings()
         ]])
        elseif g_Mission.Season == "fall" then
         Logic.ExecuteInLuaLocalState([[
         Display.WeatherOverride_SetSeason(4)
         Display.StopUsingExplicitEnvironmentSettings()
         Display.SetExplicitEnvironmentSettings("me_fall.xml")
         Display.UseCloseUpSettings()
         ]])
        elseif g_Mission.Season == "winter" or g_Mission.Season == "wintericefrozen" then
         Logic.ExecuteInLuaLocalState([[
         Display.StopUsingExplicitEnvironmentSettings()
         Display.SetExplicitEnvironmentSettings("me_winterrain.xml")
         Display.UseCloseUpSettings()
        end
    end
end

In diesem Beispiel sind viele Jahreszeiten eingebaut. Je nach dem String innerhalb der Tablevariable g_Mission.Season wird die entsprechende Jahreszeit geladen.

Damit ist es aber noch nicht getan. Damit im Sommer nicht irgend wann die Blätter welken, muss die Jahreszeit auch am Monatsende neu erstellt werden. Dafür verwendest du die Funktion GameCallback_EndOfMonth. Hier das entsprechende Beispiel:

GameCallback_EndOfMonth_OrigMISSION = GameCallback_EndOfMonth
GameCallback_EndOfMonth = function(_LastMonth, _CurrentMonth)
    GameCallback_EndOfMonth_OrigMISSION(_LastMonth, _CurrentMonth)

    if g_Mission.Season == "summer" then
        Logic.ExecuteInLuaLocalState([[
         Display.WeatherOverride_SetSeason(2)
         Display.StopUsingExplicitEnvironmentSettings()
         Display.SetExplicitEnvironmentSettings("me_summer.xml")
         Display.UseCloseUpSettings()
        ]])
    elseif g_Mission.Season == "fall" then
        Logic.ExecuteInLuaLocalState([[
         Display.WeatherOverride_SetSeason(4)
         Display.StopUsingExplicitEnvironmentSettings()
         Display.SetExplicitEnvironmentSettings("me_fall.xml")
         Display.UseCloseUpSettings()
        ]])
    elseif g_Mission.Season == "winter" or g_Mission.Season == "wintericefrozen" then
        elseif g_Mission.Season == "spring" then
        if g_Mission.WinterIsOver then
         Logic.ExecuteInLuaLocalState([[
         Display.WeatherOverride_SetSeason(2)
         Display.StopUsingExplicitEnvironmentSettings()
         Display.SetExplicitEnvironmentSettings("me_spring_cs.xml")
         Display.UseCloseUpSettings()
         ]])
        end
    end
end

Wie du sehen kannst sind in GameCallback_EndOfMonth ähnliche/gleiche Aufrufe wie in der Mission_OnSaveGameLoaded platziert.

Feste Jahreszeit

Das alleine reicht natürlich noch nicht für eine feste Jahreszeit. Wir brauchen natürlich noch ein Wetterevent, dass unsere Jahreszeit steuert und bei seinem Aufruf die Jahreszeit initialisiert. Hier ein Beispiel für pernamenten Sommer:

function Season_SetSummer()
    Logic.ExecuteInLuaLocalState([[
        Display.WeatherOverride_SetSeason(2)
        Display.StopUsingExplicitEnvironmentSettings()
        Display.WeatherOverride_SetRainSnowIce(false,false,false)
        Display.SetExplicitEnvironmentSettings("me_summer.xml")
        Display.UseCloseUpSettings()
    ]])
    g_Mission.Season = "summer"

    Logic.DeactivateWeatherEvent()
    Logic.WeatherEventClearGoodTypesNotGrowing()
    Logic.WeatherEventSetPrecipitationFalling(false)
    Logic.WeatherEventSetPrecipitationHeaviness(0)
    Logic.WeatherEventSetPrecipitationIsSnow(false)
    Logic.WeatherEventSetShallowWaterFloods(false)
    Logic.WeatherEventSetWaterFreezes(false)
    Logic.WeatherEventSetWaterRegenerationFactor(1)
    Logic.ActivateWeatherEvent()
end

Hier siehst du nochmals Displayfunktionen, die dein Wetter erstmals einstellen. Würde das fehlen, müsstest du mindestens bis zum Monatsende warten ;) . Darunter wird in g_Mission.Season der String "summer" gespeichert, den wir für die Fallunterscheidung in unseren Game Callbacks brauchen. Darunter beginnt das eigentliche Wetterevent. Zuerst beenden wir alle laufenden Events. Danach löschen wir alle Wachstumsverbote. Der Regen ist abgestellt und die Regenstärke ist 0. Ebenfalls ist der Schnee und der Monsun abgestellt und das Wasser friert nicht ein. Die Wasserregeneration ist 1. Danach wird das Event gestartet.

Achte darauf Logic.WeatherEventSetShallowWaterFloods auszukommentieren, wenn du das Skript im Haupspiel verwenden willst.

Während unserer Jahreszeit wird es niemals regnen. Selbst wenn du es regnen lässt, verhindert das Display Set die Darstellung des Regens. Damit Regen dargestellt wird, musst du me_summer.xml mit me_summerrain.xml auswechseln.

Zurück zu Beispiele | Drucken | Tags
Sofern nicht anders angegeben, steht der Inhalt dieser Seite unter Lizenz Creative Commons Attribution-ShareAlike 3.0 License