public static WeatherSystem CreateRandomWeatherSystem( GameConstants.WeatherSystemTypes weatherType, GameConstants.WeatherSystemSeasonTypes season, double latitude) { WeatherSystem system = new WeatherSystem(); system.WindDirectionFromDeg = GameManager.Instance.GetRandomNumber(360); if (GameManager.Instance.ThrowDice(34)) { system.WindDirectionFromDeg = GameManager.Instance.GetRandomNumber(30) + 240; //wind tends to be from the west } double MinTemp = 0; double MaxTemp = 0; GetMinMaxTempFromLatitude(season, latitude, out MinTemp, out MaxTemp); int TempRange = (int)GetRange(MinTemp, MaxTemp); system.TemperatureC = GameManager.Instance.GetRandomNumber(TempRange) + MinTemp; switch (weatherType) { case GameConstants.WeatherSystemTypes.Random: system.CloudCover8ths = GameManager.Instance.GetRandomNumber(8); if (season == GameConstants.WeatherSystemSeasonTypes.Summer && GameManager.Instance.ThrowDice(50)) { system.CloudCover8ths = GameManager.Instance.GetRandomNumber(3); } system.WindSpeedMSec = GameManager.Instance.GetRandomNumber(30); if (system.WindSpeedMSec > 10 && GameManager.Instance.ThrowDice(25)) { system.WindSpeedMSec = GameManager.Instance.GetRandomNumber(5); } system.Precipitation = (GameConstants.PrecipitationLevel) GameManager.Instance.GetRandomNumber((int)GameConstants.PrecipitationLevel.Heavy); if (GameManager.Instance.ThrowDice(25)) { system.Precipitation = GameConstants.PrecipitationLevel.None; } if (system.Precipitation > GameConstants.PrecipitationLevel.None) { if (system.TemperatureC > 0) { system.PrecipitationType = GameConstants.PrecipitationType.Rain; } else { system.PrecipitationType = GameConstants.PrecipitationType.Snow; } } break; case GameConstants.WeatherSystemTypes.Fine: system.CloudCover8ths = GameManager.Instance.GetRandomNumber(2); system.Precipitation = GameConstants.PrecipitationLevel.None; system.TemperatureC = system.TemperatureC.Clamp(-5, 25); system.WindSpeedMSec = GameManager.Instance.GetRandomNumber(5); break; case GameConstants.WeatherSystemTypes.Fair: system.CloudCover8ths = GameManager.Instance.GetRandomNumber(2); system.Precipitation = GameConstants.PrecipitationLevel.None; if (GameManager.Instance.ThrowDice(20)) { system.Precipitation = GameConstants.PrecipitationLevel.Light; } system.TemperatureC = system.TemperatureC.Clamp(-5, 25); system.WindSpeedMSec = GameManager.Instance.GetRandomNumber(12); break; case GameConstants.WeatherSystemTypes.Rough: system.WindSpeedMSec = GameManager.Instance.GetRandomNumber(15) + 10; system.Precipitation = (GameConstants.PrecipitationLevel) GameManager.Instance.GetRandomNumber((int)GameConstants.PrecipitationLevel.Heavy); if (system.Precipitation > GameConstants.PrecipitationLevel.None) { if (system.TemperatureC > 0) { system.PrecipitationType = GameConstants.PrecipitationType.Rain; } else { system.PrecipitationType = GameConstants.PrecipitationType.Snow; } } break; case GameConstants.WeatherSystemTypes.Severe: system.WindSpeedMSec = GameManager.Instance.GetRandomNumber(20) + 20; system.Precipitation = (GameConstants.PrecipitationLevel) GameManager.Instance.GetRandomNumber((int)GameConstants.PrecipitationLevel.Heavy); if (system.Precipitation > GameConstants.PrecipitationLevel.None) { if (system.TemperatureC > 0) { system.PrecipitationType = GameConstants.PrecipitationType.Rain; } else { system.PrecipitationType = GameConstants.PrecipitationType.Snow; } } break; } if (system.Precipitation >= GameConstants.PrecipitationLevel.Light && system.CloudCover8ths < 7) { system.CloudCover8ths = 7; } if (system.Precipitation > GameConstants.PrecipitationLevel.Intermediate && system.CloudCover8ths < 8) { system.CloudCover8ths = 8; } return(system); }
private static void GetMinMaxTempFromLatitude(GameConstants.WeatherSystemSeasonTypes season, double latitude, out double minTemp, out double maxTemp) { double lat = Math.Abs(latitude); lat = lat.Clamp(0, 90); minTemp = 5; maxTemp = 15; switch (season) { case GameConstants.WeatherSystemSeasonTypes.Summer: if (lat > 70) { minTemp = -1; maxTemp = 10; } else if (lat > 60) { minTemp = 5; maxTemp = 20; } else if (lat > 50) { minTemp = 10; maxTemp = 25; } else if (lat > 40) { minTemp = 10; maxTemp = 30; } else { minTemp = 15; maxTemp = 40; } break; case GameConstants.WeatherSystemSeasonTypes.Spring: if (lat > 70) { minTemp = -30; maxTemp = -5; } else if (lat > 60) { minTemp = -10; maxTemp = 10; } else if (lat > 50) { minTemp = 0; maxTemp = 20; } else if (lat > 40) { minTemp = 15; maxTemp = 30; } else { minTemp = 20; maxTemp = 40; } break; case GameConstants.WeatherSystemSeasonTypes.Autumn: if (lat > 70) { minTemp = -20; maxTemp = -2; } else if (lat > 60) { minTemp = -5; maxTemp = 12; } else if (lat > 50) { minTemp = 2; maxTemp = 10; } else if (lat > 40) { minTemp = 5; maxTemp = 20; } else { minTemp = 10; maxTemp = 35; } break; case GameConstants.WeatherSystemSeasonTypes.Winter: case GameConstants.WeatherSystemSeasonTypes.ArcticWinter: if (lat > 70) { minTemp = -50; maxTemp = -20; } else if (lat > 60) { minTemp = -30; maxTemp = -5; } else if (lat > 50) { minTemp = -10; maxTemp = 10; } else if (lat > 40) { minTemp = -1; maxTemp = 15; } else { minTemp = 10; maxTemp = 30; } break; } }