From 807dcfec7723156a36524d5f1889b5f3208d97cf Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 4 Aug 2021 18:02:15 -0400 Subject: undo Constants.Save* changes in 3.12.1 --- src/SMAPI/Constants.cs | 31 ++++++++++++++++---- src/SMAPI/Framework/SCore.cs | 8 ------ src/SMAPI/Patches/SaveGamePatcher.cs | 55 ------------------------------------ 3 files changed, 25 insertions(+), 69 deletions(-) delete mode 100644 src/SMAPI/Patches/SaveGamePatcher.cs (limited to 'src') diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs index 05800970..c3105202 100644 --- a/src/SMAPI/Constants.cs +++ b/src/SMAPI/Constants.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Reflection; using StardewModdingAPI.Enums; using StardewModdingAPI.Framework; @@ -164,9 +165,6 @@ namespace StardewModdingAPI /// The language code for non-translated mod assets. internal static LocalizedContentManager.LanguageCode DefaultLanguage { get; } = LocalizedContentManager.LanguageCode.en; - /// The name of the last save file loaded by the game. - internal static string LastRawSaveFileName { get; set; } - /********* ** Internal methods @@ -343,9 +341,30 @@ namespace StardewModdingAPI if (Context.LoadStage == LoadStage.None) return null; - // get save - string rawSaveName = Constants.LastRawSaveFileName; - return new DirectoryInfo(Path.Combine(Constants.SavesPath, rawSaveName)); + // get basic info + string rawSaveName = Game1.GetSaveGameName(set_value: false); + ulong saveID = Context.LoadStage == LoadStage.SaveParsed + ? SaveGame.loaded.uniqueIDForThisGame + : Game1.uniqueIDForThisGame; + + // get best match (accounting for rare case where folder name isn't sanitized) + DirectoryInfo folder = null; + foreach (string saveName in new[] { rawSaveName, new string(rawSaveName.Where(char.IsLetterOrDigit).ToArray()) }) + { + try + { + folder = new DirectoryInfo(Path.Combine(Constants.SavesPath, $"{saveName}_{saveID}")); + if (folder.Exists) + return folder; + } + catch (ArgumentException) + { + // ignore invalid path + } + } + + // if save doesn't exist yet, return the default one we expect to be created + return folder; } } } diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs index 3f97bd4e..5fb4aa03 100644 --- a/src/SMAPI/Framework/SCore.cs +++ b/src/SMAPI/Framework/SCore.cs @@ -257,7 +257,6 @@ namespace StardewModdingAPI.Framework MiniMonoModHotfix.Apply(); HarmonyPatcher.Apply("SMAPI", this.Monitor, new Game1Patcher(this.Reflection, this.OnLoadStageChanged), - new SaveGamePatcher(this.OnSaveFileReading), new TitleMenuPatcher(this.OnLoadStageChanged) ); @@ -1102,13 +1101,6 @@ namespace StardewModdingAPI.Framework this.EventManager.ReturnedToTitle.RaiseEmpty(); } - /// Raised before the game begins reading a save file. - /// The save folder name. - internal void OnSaveFileReading(string fileName) - { - Constants.LastRawSaveFileName = fileName; - } - /// Apply fixes to the save after it's loaded. private void ApplySaveFixes() { diff --git a/src/SMAPI/Patches/SaveGamePatcher.cs b/src/SMAPI/Patches/SaveGamePatcher.cs deleted file mode 100644 index 969c514e..00000000 --- a/src/SMAPI/Patches/SaveGamePatcher.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using HarmonyLib; -using StardewModdingAPI.Internal.Patching; -using StardewValley; -using StardewValley.Menus; - -namespace StardewModdingAPI.Patches -{ - /// Harmony patches for which track the last loaded save ID. - /// Patch methods must be static for Harmony to work correctly. See the Harmony documentation before renaming patch arguments. - [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] - [SuppressMessage("ReSharper", "IdentifierTypo", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] - internal class SaveGamePatcher : BasePatcher - { - /********* - ** Fields - *********/ - /// A callback to invoke when a save file is being loaded. - private static Action OnSaveFileReading; - - - /********* - ** Public methods - *********/ - /// Construct an instance. - /// A callback to invoke when a save file is being loaded. - public SaveGamePatcher(Action onSaveFileReading) - { - SaveGamePatcher.OnSaveFileReading = onSaveFileReading; - } - - /// - public override void Apply(Harmony harmony, IMonitor monitor) - { - harmony.Patch( - original: this.RequireMethod(nameof(SaveGame.getLoadEnumerator)), - prefix: this.GetHarmonyMethod(nameof(SaveGamePatcher.Before_GetLoadEnumerator)) - ); - } - - - /********* - ** Private methods - *********/ - /// The method to call before . - /// Returns whether to execute the original method. - /// This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments. - private static bool Before_GetLoadEnumerator(string file) - { - SaveGamePatcher.OnSaveFileReading(file); - return true; - } - } -} -- cgit