private void ProcessWeatherChanges(object sender, WeatherNotificationArgs e) { if (e.Weather == "WhiteOut") { if (e.Present) { CurrentConditionsN = CurrentConditionsN | CurrentWeather.WhiteOut; } else { CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.WhiteOut); } } if (e.Weather == "ThunderFrenzy") { if (e.Present) { CurrentConditionsN = CurrentConditionsN | CurrentWeather.ThunderFrenzy; } else { CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.ThunderFrenzy); } } if (e.Weather == "Fog") { if (e.Present) { CurrentConditionsN = CurrentConditionsN | CurrentWeather.Fog; } else { CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Fog); } } if (e.Weather == "Blizzard") { if (e.Present) CurrentConditionsN = CurrentConditionsN | CurrentWeather.Blizzard; else CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Blizzard); } }
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; }
public void AddWeather(CurrentWeather newWeather) { //sanity remove these once weather is set. CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Unset); //Some flags are contradictory. Fix that here. if (newWeather == CurrentWeather.Rain) { //unset debris, sunny, snow and blizzard, if it's raining. CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Sunny); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Snow); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Blizzard); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Wind); CurrentConditionsN |= newWeather; } else if (newWeather == CurrentWeather.Sunny) { //unset debris, rain, snow and blizzard, if it's sunny. CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Rain); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Snow); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Blizzard); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Wind); CurrentConditionsN |= newWeather; } else if (newWeather == CurrentWeather.Wind) { //unset sunny, rain, snow and blizzard, if it's debris. CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Rain); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Snow); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Blizzard); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Sunny); CurrentConditionsN |= newWeather; } else if (newWeather == CurrentWeather.Snow) { //unset debris, sunny, snow and blizzard, if it's raining. CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Sunny); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Rain); CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Wind); CurrentConditionsN |= newWeather; } else if (newWeather == CurrentWeather.Frost) { CurrentConditionsN.RemoveFlags(CurrentWeather.Heatwave); CurrentConditionsN |= newWeather; } else if (newWeather == CurrentWeather.Heatwave) { CurrentConditionsN = CurrentConditionsN.RemoveFlags(CurrentWeather.Frost); CurrentConditionsN |= newWeather; } else if (newWeather == CurrentWeather.Wedding || newWeather == CurrentWeather.Festival) { CurrentConditionsN = newWeather; //Clear *everything else* if it's a wedding or festival. } else CurrentConditionsN |= newWeather; }