diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/SMAPI/Constants.cs | 31 | ||||
-rw-r--r-- | src/SMAPI/Framework/SCore.cs | 8 | ||||
-rw-r--r-- | src/SMAPI/Patches/SaveGamePatcher.cs | 55 |
3 files changed, 25 insertions, 69 deletions
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 /// <summary>The language code for non-translated mod assets.</summary> internal static LocalizedContentManager.LanguageCode DefaultLanguage { get; } = LocalizedContentManager.LanguageCode.en; - /// <summary>The name of the last save file loaded by the game.</summary> - 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(); } - /// <summary>Raised before the game begins reading a save file.</summary> - /// <param name="fileName">The save folder name.</param> - internal void OnSaveFileReading(string fileName) - { - Constants.LastRawSaveFileName = fileName; - } - /// <summary>Apply fixes to the save after it's loaded.</summary> 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 -{ - /// <summary>Harmony patches for <see cref="SaveGame"/> which track the last loaded save ID.</summary> - /// <remarks>Patch methods must be static for Harmony to work correctly. See the Harmony documentation before renaming patch arguments.</remarks> - [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 - *********/ - /// <summary>A callback to invoke when a save file is being loaded.</summary> - private static Action<string> OnSaveFileReading; - - - /********* - ** Public methods - *********/ - /// <summary>Construct an instance.</summary> - /// <param name="onSaveFileReading">A callback to invoke when a save file is being loaded.</param> - public SaveGamePatcher(Action<string> onSaveFileReading) - { - SaveGamePatcher.OnSaveFileReading = onSaveFileReading; - } - - /// <inheritdoc /> - public override void Apply(Harmony harmony, IMonitor monitor) - { - harmony.Patch( - original: this.RequireMethod<SaveGame>(nameof(SaveGame.getLoadEnumerator)), - prefix: this.GetHarmonyMethod(nameof(SaveGamePatcher.Before_GetLoadEnumerator)) - ); - } - - - /********* - ** Private methods - *********/ - /// <summary>The method to call before <see cref="TitleMenu.createdNewCharacter"/>.</summary> - /// <returns>Returns whether to execute the original method.</returns> - /// <remarks>This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments.</remarks> - private static bool Before_GetLoadEnumerator(string file) - { - SaveGamePatcher.OnSaveFileReading(file); - return true; - } - } -} |