[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
===== Wetterscript =====
Mit diesem Script kann man das Wetter etwas zufälliger gestalten. Wer will kann es auch mal im MP ausprobieren und testen ob es DESYNCs gibt.
==== Anwendung ====
function InitWeather()
-- Erstmal ganz normal das Wetter einstellen
AddPeriodicSummer (300)
AddPeriodicRain ( 60)
-- Jetzt die neuen Wetterperioden einstellen
Weather.AddPeriodicSummer (240, 360) -- Minimum Dauer, Maximum Dauer
Weather.AddPeriodicRain ( 30, 90)
Weather.AddPeriodicWinter (120, 240)
-- Die Wetterlagen sollen nacheinander oder zufällig erscheinen? (WEATHER_PERIODIC oder WEATHER_RANDOM)
Weather.SetOrder(WEATHER_PERIODIC)
-- Starten!
Weather.Init()
end
==== Benötigter Code ====
StartSummerOrig = StartSummer
function StartSummer(_seconds) if Weather.IsActive then Weather.Init(_seconds) end StartSummerOrig(_seconds) end
StartRainOrig = StartRain
function StartRain(_seconds) if Weather.IsActive then Weather.Init(_seconds) end StartRainOrig(_seconds) end
StartWinterOrig = StartWinter
function StartWinter(_seconds) if Weather.IsActive then Weather.Init(_seconds) end StartWinterOrig(_seconds) end
GUI.SetWeatherOrig = GUI.SetWeather
function GUI.SetWeather(_weathertype) if Weather.IsActive then Weather.Init(300) end GUI.SetWeatherOrig(_weathertype) end
Logic.GetNextWeatherStateOrig = Logic.GetNextWeatherState
function Logic.GetNextWeatherState() if Weather.IsActive then return Weather.Next.Type end return Logic.GetNextWeatherStateOrig() end
Logic.GetTimeToNextWeatherPeriodOrig = Logic.GetTimeToNextWeatherPeriod
function Logic.GetTimeToNextWeatherPeriod() if Weather.IsActive then return Weather.TimeToNextWeatherPeriod end return Logic.GetTimeToNextWeatherPeriodOrig() end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WEATHER_PERIODIC = 1
WEATHER_RANDOM = 2
Weather = {Periods = {}, IsActive = false, Order = WEATHER_PERIODIC}
Weather.Init = function(_delay)
Weather.Count = table.getn(Weather.Periods)
if Weather.Count > 0 then
if Weather.IsActive then Weather.Stop() end
Weather.Tick = 0
Weather.Current = {Duration = (_delay or 1), Index = 0}
Weather.Next = Weather.AddElement()
Weather.Id = StartSimpleJob("WeatherStart")
Weather.IsActive = true
end
end
Weather.Start = function()
Weather.Tick = Weather.Tick + 1
Weather.TimeToNextWeatherPeriod = Weather.Current.Duration - Weather.Tick
if Weather.Tick >= Weather.Current.Duration then
Weather.Current = Weather.Next
Weather.Periods[Weather.Current.Index][1](Weather.Current.Duration)
Weather.Next = Weather.AddElement()
Weather.Tick = 0
end
end
WeatherStart = Weather.Start
Weather.AddElement = function()
local Data = {}
if Weather.Order == WEATHER_PERIODIC then
if Weather.Current.Index == Weather.Count then Data.Index = 1
else Data.Index = Weather.Current.Index + 1 end
else
Data.Index = GetRandom(Weather.Count)
end
Data.Duration = GetRandom(Weather.Periods[Data.Index][2], Weather.Periods[Data.Index][3])
Data.Type = Weather.Periods[Data.Index][4]
return Data
end
Weather.Stop = function() EndJob(Weather.Id); Weather.IsActive = false end
Weather.SetOrder = function(_order) Weather.Order = _order end
Weather.AddPeriodicSummer = function(_min, _max) table.insert(Weather.Periods, {StartSummerOrig, _min, _max, 1}) end
Weather.AddPeriodicRain = function(_min, _max) table.insert(Weather.Periods, {StartRainOrig, _min, _max, 2}) end
Weather.AddPeriodicWinter = function(_min, _max) table.insert(Weather.Periods, {StartWinterOrig, _min, _max, 3}) end
==== Zusätzlicher Code ====
Mit diesem zusätzlichen optionalen Code werden bessere Zufallszahlen erzeugt.
Siehe: [[tutorials:zufallszahlen_zufallsereignisse#getrandom_verbessern|GetRandom()]]