using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; using Harmony; using StardewValley; using xTile.Tiles; namespace StardewModdingAPI.Framework.Patching { /// A Harmony patch for the method. internal class GameLocationPatch : IHarmonyPatch { /********* ** Accessors *********/ /// A unique name for this patch. public string Name => $"{nameof(GameLocation)}.{nameof(GameLocation.updateSeasonalTileSheets)}"; /********* ** Public methods *********/ /// Apply the Harmony patch. /// The Harmony instance. public void Apply(HarmonyInstance harmony) { MethodInfo method = AccessTools.Method(typeof(GameLocation), nameof(GameLocation.updateSeasonalTileSheets)); MethodInfo prefix = AccessTools.Method(this.GetType(), nameof(GameLocationPatch.Prefix)); harmony.Patch(method, new HarmonyMethod(prefix), null); } /********* ** Private methods *********/ /// An implementation of which correctly handles custom map tilesheets. /// The location instance being patched. [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument name is defined by Harmony.")] private static bool Prefix(ref GameLocation __instance) { if (!__instance.IsOutdoors || __instance.Name.Equals("Desert")) return false; foreach (TileSheet tilesheet in __instance.Map.TileSheets) { string imageSource = tilesheet.ImageSource; string imageFile = Path.GetFileName(imageSource); if (imageFile.StartsWith("spring_") || imageFile.StartsWith("summer_") || imageFile.StartsWith("fall_") || imageFile.StartsWith("winter_")) { string imageDir = Path.GetDirectoryName(imageSource); if (string.IsNullOrWhiteSpace(imageDir)) imageDir = "Maps"; tilesheet.ImageSource = Path.Combine(imageDir, Game1.currentSeason + "_" + imageFile.Split('_')[1]); } } return false; } } }