Inhaltsverzeichnis

Eigene GFX-Sets

Dieses Tutorial soll eine kurze Einführung in das Thema GFX-Set bieten. Es wird erklärt, was überhaupt ein GFX-Set ist, wofür man es braucht und wie man sich eigene Sets schreiben kann.

GFX-Set?

Das Wetter, Licht und Schatten und der Entfernungsnebel werden durch die sogenannten GFX-Sets gesteuert. Jeder ist damit schon einmal in Kontakt gekommen, aber vermutlich hast du dir da nie große Gedanken drüber gemacht. In jeder Map muss in der Funktion InitWeatherGfxSets() ein GFX-Set angeben werden, zum Beispiel könnte das so aussehen:

function InitWeatherGfxSets()
    SetupNormalWeatherGfxSet()
end

Wie du sicher weißt, kannst du nicht nur „normales“ Wetter angeben, sondern auch „Highland“, „Steppe“, „Evelance“, „Mediterranean“ und „Moor“. Je nachdem welches Set du wählst, sieht die Spielwelt anders aus. Evelance ist düster während Highland etwas kühler wirkt. Ein GFX-Set spielt also für die Umgebung und die Stimmung in der Spielwelt eine herausragende Rolle.

Das Wetter

Es gibt drei Arten von Wetter: Normal, Regen und Schnee. Diese Wetterlagen werden durch IDs gekennzeichnet und haben bekannterweise auch Auswirkungen auf die Spielwelt:

IDWetterEffekte
1normalkeine
2Regen80% Sichtweite für Gebäude und Siedler, 5% Wahrscheinlichkeit, dass Projektile nicht treffen
3Schnee85% Bewegungsgeschwindigkeit für Siedler, 2% Wahrscheinlichkeit, dass Projektile nicht treffen

Ein Wetterwechsel geschieht nicht sofort, sondern dauert eine bestimmte Zeit an. Diese Information wird später noch Bedeutung haben. Die folgende Tabelle zeigt, wie lange ein Wetterwechsel jeweils dauert:

Neue WetterlageVorlaufzeitDauer des Wetterwechsels
normal5 Sekunden (4 Sekunden mit Wetterturm)10 Sekunden (8 Sekunden mit Wetterturm)
Regen5 Sekunden (4 Sekunden mit Wetterturm)10 Sekunden (8 Sekunden mit Wetterturm)
Schnee5 Sekunden10 Sekunden

Visuelle Wettereffekte

Interessanterweise sind die Wetterlagen aber nicht dafür verantwortlich, ob es auch wirklich regnet oder schneit. Diese sichtbaren Effekte sind ein Teil des gewählten GFX-Sets. Es sind wiederum drei Effekte zu unterscheiden:

Wir werden später sehen, dass dieses Effekte beliebig kombiniert werden können (z.B. Schneeregen bei grüner Landschaft).

Licht und Schatten

Die Siedler-Welt wäre ziemlich dunkel, würde es keine virtuelle Sonne geben. Im Gegensatz zur realen Welt, kann man die Siedlersonne verschieben und die Farbe ihres Lichtes verändern. Je nach Einstellung wirkt das Licht heller oder dunkler und Schatten länger oder kürzer.

Der Nebel

In der Regel ist die Siedler-Welt recht vernebelt, wenn man versucht in die Ferne zu schauen. Besonders deutlich wird dies, wenn es regnet. Dann bildet sich ein weiß-grauer Schleier, der die Sicht behindert. Die Intensität und sogar die Farbe dieses Nebels kann über ein GFX-Set gesteuert werden.

Ein GFX-Set erstellen

Ein GFX-Set erstellt man mit einer ganzen Reihe von Funktionsaufrufen aus dem Display-Table. Für jede Wetterlage müssen die Werte für die visuellen Wettereffekte, Licht und Nebel gesetzt werden. Diese Einstellungen „verpacken“ wir in einer Funktion namens SetupXXXWeatherGfxSet(), wobei XXX für einen freiwählbaren Namen steht (z.B. SetupAbendrotWeatherGfxSet()).

Zuallererst muss dem Spiel gesagt werden, dass überhaupt GFX-Sets verwendet werden sollen (es geht nämlich auch ohne, aber das ist ein anderes Thema). Das geschieht mit dem Aufruf von Display.SetRenderUseGfxSets(1):

function SetupXXXWeatherGfxSet()
    Display.SetRenderUseGfxSets(1)
end

Die folgenden Schritte müssen für jede Wetterlage gemacht werden. Es muss also jeweils die WeatherID durch 1, 2 bzw. 3 ersetzt werden. Ebenso tauchen immer wieder die Parameter TransitionStart und TransitionEnd auf. Die Werte dieser Parameter müssen zwischen 0.0 und 1.0 liegen, wobei gilt: TransitionStart < TransitionEnd. Sie geben an, wann und wie lange ein Effekt während des Wetterwechsels auftritt.

Beispiel: Der Wetterwechsel von normal nach Schnee dauert 10 Sekunden. Der Schneefall soll genau 2 Sekunden nach dem Beginn des Wechsels beginnen und nach weiteren 6 Sekunden seine volle Intensität erreichen. TransitionStart muss dafür auf den Wert 0.2 gesetzt werden und TransitionEnd auf 0.8.

Wettereffekte

Um Regen, Schneefall und Schneetexturen/Eis an oder auszuschalten benutzt man diese Funktionen:

-- Regen
Display.GfxSetSetRainEffectStatus(WeatherID, TransitionStart, TransitionEnd, Flag)
-- Schneefall
Display.GfxSetSetSnowEffectStatus(WeatherID, TransitionStart, TransitionEnd, Flag)
-- Schneetexturen/Eis
Display.GfxSetSetSnowStatus(WeatherID, TransitionStart, TransitionEnd, Flag)

Um den entsprechenden Effekt einzuschalten, muss Flag auf 1 gesetzt werden. Um ihn auszuschalten, setzt man Flag auf 0.

Licht

Das Licht wird mit dieser Funktion eingestellt:

Display.GfxSetSetLightParams(WeatherID, TransitionStart, TransitionEnd,
                             PositionX, PositionY, PositionZ,
                             AmbientR, AmbientG, AmbientB,
                             DiffuseR, DiffuseG, DiffuseB)

PositionX, PositionY, PositionZ gibt die Position der Lichtquelle (der Siedlersonne) an. Die Werte sollten ganze Zahlen sein (auch negative Zahlen sind möglich). Wenn man ein wenig mit den Werten experimentiert, kommt man schnell hinter das System.

AmbientR, AmbientG, AmbientB, ist die Farbe des Umgebungslicht (also das Licht, welches nicht direkt von der Lichtquelle kommt). Die Farbe wird im RGB-Format angegeben (Ganzzahlen zwischen 0 und 255). Dieses Licht ist überall gleich stark.

DiffuseR, DiffuseG, DiffuseB ist die Farbe des Lichtes, welches von der Lichtquelle direkt abgegeben wird.

Nebel

Der Entfernungsnebel wird über diese Funktion eingestellt:

Display.GfxSetSetFogParams(WeatherID, TransitionStart, TransitionEnd, Flag,
                           ColorR, ColorG, ColorB,
                           FogStart, FogEnd)

Flag gibt an, ob überhaupt Nebel dargestellt werden soll. Wie üblich bei Flags muss hier 0 oder 1 angegeben werden.

ColorR, ColorG, ColorB gibt die Farbe des Nebels im RGB-Format an.

FogStart, FogEnd gibt an, in welcher Entfernung (Siedlerzentimeter) der Nebel sichtbar ist. Werte zwischen 2000 und 30000 sind üblich.

Skybox (Himmel)

Der Himmel ist normalerweise gar nicht sichtbar. Er taucht aber in Cutscenes und Briefings auf.

Display.GfxSetSetSkyBox(WeatherID, TransitionStart, TransitionEnd, SkyBoxName)

Es gibt eine ganze Reihe von Himmeln zur Auswahl:

SkyBoxNameBevorzugte Wetterlage
YSkyBox01Schnee
YSkyBox02normal
YSkyBox03normal
YSkyBox04Regen
YSkyBox05normal
YSkyBox06normal
YSkyBox07normal

Beispiel

FIXME Wenn jemand irgendein schönes GFX-Set erstellt hat, bitte hier als Beispiel einfügen und das alte inklusive diesem Hinweis entfernen.
Mal ein Versuch Tag und Nacht zu Simulieren
Habe meinen Link gelöscht, weil der Aufruf verweigert wird
Peermanent

Dies hier ist das GFX-Set, welches für Evelance verwendet wurde:

function SetupEvelanceWeatherGfxSet()
 
    -- GFX-Sets aktivieren
    Display.SetRenderUseGfxSets(1)
 
    -- normal
    Display.GfxSetSetSkyBox(1, 0.0, 1.0, "YSkyBox07")
    Display.GfxSetSetRainEffectStatus(1, 0.0, 1.0, 0)
    Display.GfxSetSetSnowStatus(1, 0, 1.0, 0)
    Display.GfxSetSetSnowEffectStatus(1, 0.0, 0.8, 0)
    Display.GfxSetSetFogParams(1, 0.0, 1.0, 1, 38,48,58, 4000,10500)
    Display.GfxSetSetLightParams(1,  0.0, 1.0, 40, -15, -50,  136,144,144, 128,104,72)
 
    -- Regen
    Display.GfxSetSetSkyBox(2, 0.0, 1.0, "YSkyBox04")
    Display.GfxSetSetRainEffectStatus(2, 0.0, 1.0, 1)
    Display.GfxSetSetSnowStatus(2, 0, 1.0, 0)
    Display.GfxSetSetSnowEffectStatus(2, 0.0, 0.8, 0)
    Display.GfxSetSetFogParams(2, 0.0, 1.0, 1, 38,58,68, 4000,8000)
    Display.GfxSetSetLightParams(2,  0.0, 1.0, 40, -15, -50,  136,144,144, 128,104,72)
 
    -- Schnee
    Display.GfxSetSetSkyBox(3, 0.0, 1.0, "YSkyBox01")
    Display.GfxSetSetRainEffectStatus(3, 0.0, 1.0, 0)
    Display.GfxSetSetSnowStatus(3, 0, 1.0, 1)
    Display.GfxSetSetSnowEffectStatus(3, 0.0, 0.8, 1)
    Display.GfxSetSetFogParams(3, 0.0, 1.0, 1, 108,128,138, 2000,9500)
    Display.GfxSetSetLightParams(3,  0.0, 1.0, 40, -15, -50,  116,144,164, 255,234,202)
end

FIXME