using System; using System.Collections.Generic; using Omegasis.MoreRain.Framework; using StardewModdingAPI; using StardewModdingAPI.Events; using StardewValley; namespace Omegasis.MoreRain { /// The mod entry point. public class MoreRain : Mod { /********* ** Fields *********/ /// The weathers that can be safely overridden. private readonly HashSet NormalWeathers = new HashSet { Game1.weather_sunny, Game1.weather_rain, Game1.weather_lightning, Game1.weather_debris, Game1.weather_snow }; /// The mod configuration. private ModConfig Config; /********* ** Public methods *********/ /// The mod entry point, called after the mod is first loaded. /// Provides simplified APIs for writing mods. public override void Entry(IModHelper helper) { this.Config = helper.ReadConfig(); helper.Events.GameLoop.SaveLoaded += this.OnSaveLoaded; helper.Events.GameLoop.Saving += this.OnSaving; } /********* ** Private methods *********/ /// Raised after the player loads a save slot and the world is initialised. /// The event sender. /// The event arguments. private void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { this.HandleNewDay(); } /// Raised before the game begins writes data to the save file (except the initial save creation). /// The event sender. /// The event arguments. private void OnSaving(object sender, SavingEventArgs e) { this.HandleNewDay(); } /// Update all data for a new day. private void HandleNewDay() { // skip if special weather if (!this.NormalWeathers.Contains(Game1.weatherForTomorrow)) { if (Game1.weatherForTomorrow == Game1.weather_festival) this.VerboseLog("There is a festival tomorrow, therefore it will not rain."); else if (Game1.weatherForTomorrow == Game1.weather_wedding) this.VerboseLog("There is a wedding tomorrow and rain on your wedding day will not happen."); else this.VerboseLog("The weather tomorrow is unknown, so it will not rain."); return; } // set weather Random random = new Random(); int chance = random.Next(0, 100); switch (Game1.currentSeason) { case "spring": // set rain if (this.Config.PrioritizeSpringStorms) { if (chance <= this.Config.SpringThunderChance) { Game1.weatherForTomorrow = Game1.weather_lightning; this.VerboseLog("It will be stormy tomorrow."); return; } if (chance <= this.Config.SpringRainChance) { Game1.weatherForTomorrow = Game1.weather_rain; this.VerboseLog("It will rain tomorrow."); return; } } else { if (chance <= this.Config.SpringRainChance) { Game1.weatherForTomorrow = Game1.weather_rain; this.VerboseLog("It will rain tomorrow."); return; } if (chance <= this.Config.SpringThunderChance) { Game1.weatherForTomorrow = Game1.weather_lightning; this.VerboseLog("It will be stormy tomorrow."); return; } } break; case "summer": // set rain if (this.Config.PrioritizeSummerStorms) { if (chance <= this.Config.SummerThunderChance) { Game1.weatherForTomorrow = Game1.weather_lightning; this.VerboseLog("It will be stormy tomorrow."); return; } if (chance <= this.Config.SummerRainChance) { Game1.weatherForTomorrow = Game1.weather_rain; this.VerboseLog("It will rain tomorrow."); return; } } else { if (chance <= this.Config.SummerRainChance) { Game1.weatherForTomorrow = Game1.weather_rain; this.VerboseLog("It will rain tomorrow."); return; } if (chance <= this.Config.SummerThunderChance) { Game1.weatherForTomorrow = Game1.weather_lightning; this.VerboseLog("It will be stormy tomorrow."); return; } } break; case "fall": case "autumn": // set rain if (this.Config.PrioritizeFallStorms) { if (chance <= this.Config.FallThunderChance) { Game1.weatherForTomorrow = Game1.weather_lightning; this.VerboseLog("It will be stormy tomorrow."); return; } if (this.Config.SnowInFall) { if (chance <= this.Config.FallSnowChance) { Game1.weatherForTomorrow = Game1.weather_snow; this.VerboseLog("It will snow tomorrow."); } } if (chance <= this.Config.FallRainChance) { Game1.weatherForTomorrow = Game1.weather_rain; this.VerboseLog("It will rain tomorrow."); return; } } else { if (chance <= this.Config.FallRainChance) { Game1.weatherForTomorrow = Game1.weather_rain; this.VerboseLog("It will rain tomorrow."); return; } if (this.Config.SnowInFall) { if (chance <= this.Config.FallSnowChance) { Game1.weatherForTomorrow = Game1.weather_snow; this.VerboseLog("It will snow tomorrow."); } } if (chance <= this.Config.FallThunderChance) { Game1.weatherForTomorrow = Game1.weather_lightning; this.VerboseLog("It will be stormy tomorrow."); return; } } break; case "winter": // set snow if (chance <= this.Config.WinterSnowChance) { Game1.weatherForTomorrow = Game1.weather_snow; this.VerboseLog("It will snow tomorrow."); } if (this.Config.RainInWinter) { if (chance <= this.Config.WinterRainChance) { Game1.weatherForTomorrow = Game1.weather_rain; this.VerboseLog("It will snow tomorrow."); } } break; } } /// Log a message if is false. /// The message to log. private void VerboseLog(string message) { if (!this.Config.SuppressLog) this.Monitor.Log(message); } } }