public FerngillClimateTimeSpan(FerngillClimateTimeSpan CTS) { this.BeginSeason = CTS.BeginSeason; this.EndSeason = CTS.EndSeason; this.BeginDay = CTS.BeginDay; this.EndDay = CTS.EndDay; this.ChillwaveChance = CTS.ChillwaveChance; this.HeatwaveChance = CTS.HeatwaveChance; this.WeatherChances = new List <WeatherParameters>(); foreach (WeatherParameters w in CTS.WeatherChances) { this.WeatherChances.Add(new WeatherParameters(w)); } this.SystemChances = new List <WeatherSystems>(); foreach (WeatherSystems w in CTS.SystemChances) { this.SystemChances.Add(new WeatherSystems(w)); } }
internal static bool TestForSpecialWeather(WeatherConditions curr, FerngillClimateTimeSpan ClimateForDay) { bool specialWeatherTriggered = false; // Conditions: Blizzard - occurs in weather_snow in "winter" // Dry Lightning - occurs if it's sunny in any season if temps exceed 25C. // Frost and Heatwave check against the configuration. // Thundersnow - as Blizzard, but really rare. Will not happen in fog, may happen in Blizzard/WhiteOut // Sandstorm - windy, with no precip for several days. Spring-Fall only, highest chance in summer. // Fog - per climate, although night fog in winter is double normal chance curr.GenerateEveningFog = (ClimatesOfFerngill.Dice.NextDouble() < ClimateForDay.EveningFogChance * ClimateForDay.RetrieveOdds(ClimatesOfFerngill.Dice, "fog", Game1.dayOfMonth)) && !curr.GetCurrentConditions().HasFlag(CurrentWeather.Wind); bool blockFog = ClimatesOfFerngill.MoonAPI != null && ClimatesOfFerngill.MoonAPI.IsSolarEclipse(); if (blockFog || ClimatesOfFerngill.WeatherOpt.DisableAllFog) { curr.GenerateEveningFog = false; } double fogRoll = (ClimatesOfFerngill.WeatherOpt.DisableAllFog ? 1.1 : ClimatesOfFerngill.Dice.NextDoublePositive()); if (fogRoll < ClimateForDay.RetrieveOdds(ClimatesOfFerngill.Dice, "fog", Game1.dayOfMonth) && !curr.GetCurrentConditions().HasFlag(CurrentWeather.Wind) && !blockFog) { curr.CreateWeather("Fog"); if (ClimatesOfFerngill.WeatherOpt.Verbose) { ClimatesOfFerngill.Logger.Log($"{curr.FogDescription(fogRoll, ClimateForDay.RetrieveOdds(ClimatesOfFerngill.Dice, "fog", Game1.dayOfMonth))}"); } specialWeatherTriggered = true; } //set special temps before we check for the results of them if (ClimatesOfFerngill.Dice.NextDouble() < ClimateForDay.HeatwaveChance) { SetHotwave(); } else if (ClimatesOfFerngill.Dice.NextDouble() < ClimateForDay.ChillwaveChance) { SetChillWave(); } //do these here //20190626 - Thanks to Crops Anywhere, I have to add this if ((curr.TodayLow < ClimatesOfFerngill.WeatherOpt.TooColdOutside && !Game1.IsWinter) || (curr.TodayLow < ClimatesOfFerngill.WeatherOpt.TooColdOutside && Game1.IsWinter && ClimatesOfFerngill.WeatherOpt.ApplyFrostsInWinter)) { if (ClimatesOfFerngill.WeatherOpt.HazardousWeather) { curr.AddWeather(CurrentWeather.Frost); specialWeatherTriggered = true; } } //test for spring conversion if (curr.HasWeather(CurrentWeather.Rain) && curr.HasWeather(CurrentWeather.Frost) && (Game1.currentSeason == "spring" || Game1.currentSeason == "fall") && ClimatesOfFerngill.Dice.NextDoublePositive() <= ClimatesOfFerngill.WeatherOpt.RainToSnowConversion) { curr.RemoveWeather(CurrentWeather.Rain); curr.AddWeather(CurrentWeather.Snow); Game1.isRaining = false; Game1.isSnowing = true; specialWeatherTriggered = true; } if (curr.HasWeather(CurrentWeather.Snow)) { double blizRoll = ClimatesOfFerngill.Dice.NextDoublePositive(); double blizOdds = ClimateForDay.RetrieveOdds(ClimatesOfFerngill.Dice, "blizzard", Game1.dayOfMonth); if (blizRoll <= blizOdds) { curr.CreateWeather("Blizzard"); if (ClimatesOfFerngill.WeatherOpt.Verbose) { ClimatesOfFerngill.Logger.Log($"With roll {blizRoll:N3} against {blizOdds}, there will be blizzards today"); } if (ClimatesOfFerngill.Dice.NextDoublePositive() < ClimatesOfFerngill.WeatherOpt.WhiteOutChances && ClimatesOfFerngill.WeatherOpt.HazardousWeather) { curr.CreateWeather("WhiteOut"); } } specialWeatherTriggered = true; } //Dry Lightning is also here for such like the dry and arid climates // which have so low rain chances they may never storm. if (curr.HasWeather(CurrentWeather.Snow)) { double oddsRoll = ClimatesOfFerngill.Dice.NextDoublePositive(); double thunderSnowOdds = ClimateForDay.RetrieveOdds(ClimatesOfFerngill.Dice, "storm", Game1.dayOfMonth); if (oddsRoll <= thunderSnowOdds && !curr.HasWeather(CurrentWeather.Fog)) { curr.AddWeather(CurrentWeather.Lightning); if (ClimatesOfFerngill.WeatherOpt.Verbose) { ClimatesOfFerngill.Logger.Log($"With roll {oddsRoll:N3} against {thunderSnowOdds}, there will be thundersnow today"); } specialWeatherTriggered = true; } } if (!(curr.HasPrecip())) { double oddsRoll = ClimatesOfFerngill.Dice.NextDoublePositive(); if (oddsRoll <= ClimatesOfFerngill.WeatherOpt.DryLightning && curr.TodayHigh >= ClimatesOfFerngill.WeatherOpt.DryLightningMinTemp && !curr.HasWeather(CurrentWeather.Frost)) { curr.AddWeather(CurrentWeather.Lightning); if (ClimatesOfFerngill.WeatherOpt.Verbose) { ClimatesOfFerngill.Logger.Log($"With roll {oddsRoll:N3} against {ClimatesOfFerngill.WeatherOpt.DryLightning}, there will be dry lightning today."); } specialWeatherTriggered = true; } if (curr.TodayHigh > ClimatesOfFerngill.WeatherOpt.TooHotOutside && ClimatesOfFerngill.WeatherOpt.HazardousWeather) { curr.AddWeather(CurrentWeather.Heatwave); specialWeatherTriggered = true; } double sandstormOdds = .18; if (Game1.currentSeason == "summer") { sandstormOdds *= 1.2; } if (oddsRoll < sandstormOdds && ClimatesOfFerngill.WeatherOpt.HazardousWeather && Game1.isDebrisWeather) { curr.AddWeather(CurrentWeather.Sandstorm); specialWeatherTriggered = true; curr.CreateWeather("Sandstorm"); } } //and finally, test for thunder frenzy if (curr.HasWeather(CurrentWeather.Lightning) && curr.HasWeather(CurrentWeather.Rain) && ClimatesOfFerngill.WeatherOpt.HazardousWeather) { double oddsRoll = ClimatesOfFerngill.Dice.NextDouble(); if (oddsRoll < ClimatesOfFerngill.WeatherOpt.ThunderFrenzyOdds) { curr.AddWeather(CurrentWeather.ThunderFrenzy); specialWeatherTriggered = true; if (ClimatesOfFerngill.WeatherOpt.Verbose) { ClimatesOfFerngill.Logger.Log($"With roll {oddsRoll:N3} against {ClimatesOfFerngill.WeatherOpt.ThunderFrenzyOdds}, there will be a thunder frenzy today"); } curr.CreateWeather("ThunderFrenzy"); } } return(specialWeatherTriggered); }
internal bool TestForSpecialWeather(FerngillClimateTimeSpan ClimateForDay) { bool specialWeatherTriggered = false; // Conditions: Blizzard - occurs in weather_snow in "winter" // Dry Lightning - occurs if it's sunny in any season if temps exceed 25C. // Frost and Heatwave check against the configuration. // Thundersnow - as Blizzard, but really rare. // Fog - per climate, although night fog in winter is double normal chance GenerateEveningFog = (Dice.NextDouble() < ClimateForDay.EveningFogChance * ClimateForDay.RetrieveOdds(Dice,"fog",Game1.dayOfMonth)) && !this.GetCurrentConditions().HasFlag(CurrentWeather.Wind); bool blockFog = ClimatesOfFerngill.MoonAPI != null && ClimatesOfFerngill.MoonAPI.IsSolarEclipse(); if (blockFog) GenerateEveningFog = false; double fogRoll = Dice.NextDoublePositive(); if (fogRoll < ClimateForDay.RetrieveOdds(Dice, "fog", Game1.dayOfMonth) && !this.GetCurrentConditions().HasFlag(CurrentWeather.Wind) && !blockFog) { this.CreateWeather("Fog"); if (ModConfig.Verbose) Monitor.Log($"{FogDescription(fogRoll, ClimateForDay.RetrieveOdds(Dice, "fog", Game1.dayOfMonth))}"); specialWeatherTriggered = true; } if (this.HasWeather(CurrentWeather.Snow)) { double blizRoll = Dice.NextDoublePositive(); if (blizRoll <= ModConfig.BlizzardOdds) { this.CreateWeather("Blizzard"); if (ModConfig.Verbose) Monitor.Log($"With roll {blizRoll:N3} against {ModConfig.BlizzardOdds}, there will be blizzards today"); if (Dice.NextDoublePositive() < .05 && ModConfig.HazardousWeather) { this.CreateWeather("WhiteOut"); } } specialWeatherTriggered = true; } //Dry Lightning is also here for such like the dry and arid climates // which have so low rain chances they may never storm. if (this.HasWeather(CurrentWeather.Snow)) { double oddsRoll = Dice.NextDoublePositive(); if (oddsRoll <= ModConfig.ThundersnowOdds) { this.AddWeather(CurrentWeather.Lightning); if (ModConfig.Verbose) Monitor.Log($"With roll {oddsRoll:N3} against {ModConfig.ThundersnowOdds}, there will be thundersnow today"); specialWeatherTriggered = true; } } if (!(this.HasPrecip())) { double oddsRoll = Dice.NextDoublePositive(); if (oddsRoll <= ModConfig.DryLightning && this.TodayHigh >= ModConfig.DryLightningMinTemp && !this.CurrentConditionsN.HasFlag(CurrentWeather.Frost)) { this.AddWeather(CurrentWeather.Lightning); if (ModConfig.Verbose) Monitor.Log($"With roll {oddsRoll:N3} against {ModConfig.DryLightning}, there will be dry lightning today."); specialWeatherTriggered = true; } if (this.TodayHigh > ModConfig.TooHotOutside && ModConfig.HazardousWeather) { this.AddWeather(CurrentWeather.Heatwave); specialWeatherTriggered = true; } } if (this.TodayLow < ModConfig.TooColdOutside && !Game1.IsWinter) { if (ModConfig.HazardousWeather) { this.AddWeather(CurrentWeather.Frost); specialWeatherTriggered = true; } } //test for spring conversion.- 50% chance if (this.HasWeather(CurrentWeather.Rain) && this.HasWeather(CurrentWeather.Frost) && Game1.currentSeason == "spring" && Dice.NextDoublePositive() <= .5) { CurrentConditionsN.RemoveFlags(CurrentWeather.Rain); CurrentConditionsN |= CurrentWeather.Snow; Game1.isRaining = false; Game1.isSnowing = true; specialWeatherTriggered = true; } //and finally, test for thunder frenzy if (this.HasWeather(CurrentWeather.Lightning) && this.HasWeather(CurrentWeather.Rain) && ModConfig.HazardousWeather) { double oddsRoll = Dice.NextDouble(); if (oddsRoll < ModConfig.ThunderFrenzyOdds) { this.AddWeather(CurrentWeather.ThunderFrenzy); specialWeatherTriggered = true; if (ModConfig.Verbose) Monitor.Log($"With roll {oddsRoll:N3} against {ModConfig.ThunderFrenzyOdds}, there will be a thunder frenzy today"); this.CreateWeather("ThunderFrenzy"); } } return specialWeatherTriggered; }