diff --git a/docs/release-notes.md b/docs/release-notes.md index b84f8a06..4cbd1ad9 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -4,20 +4,27 @@ ## Upcoming release * For players: * Improved translations. Thanks to ChulkyBow (updated Ukrainian)! + * Fixed `player_add` console command's handling of Journal Scraps and Secret Notes. * For mod authors: - * Added `IAssetName` field to the asset info received by `IAssetEditor` and `IAssetLoader` methods. - _This provides utility methods for working with asset names, parsed locales, etc. The `asset.AssetNameEquals` method is now deprecated in favor of `asset.Name.IsEquivalentTo`_. - * The `SDate` constructor is no longer case-sensitive for season names. - * Fixed issue where suppressing `[Left|Right]Thumbstick[Down|Left]` keys would suppress the opposite direction instead. + * Added `IAssetName Name` field to the info received by `IAssetEditor` and `IAssetLoader` methods. + _This adds methods for working with asset names, parsed locales, etc._ + * Fixed the `SDate` constructor being case-sensitive. * Fixed support for using locale codes from custom languages in asset names (e.g. `Data/Achievements.eo-EU`). + * Fixed issue where suppressing `[Left|Right]Thumbstick[Down|Left]` keys would suppress the opposite direction instead. -* For console commands: - * Fixed `player_add` with Journal Scraps and Secret Notes. +* **Deprecation warning for mod authors:** + These APIs are now deprecated and will be removed in the upcoming SMAPI 4.0.0. + + API | how to update code + :-- | :----------------- + `Constants.ExecutionPath` | Use `Constants.GamePath` instead. + `IAssetInfo.AssetName`
`IAssetData.AssetName` | Use `Name` instead, which changes the type from `string` to the new `AssetName`. + `IAssetInfo.AssetNameEquals`
`IAssetData.AssetNameEquals` | Use `Name.IsEquivalentTo` instead. * For the web UI: * Added `data-*` attributes to log parser page for external tools. - * Fixed JSON validator warning for update keys without a subkey. + * Fixed JSON validator warning shown for update keys without a subkey. ## 3.13.4 Released 16 January 2022 for Stardew Valley 1.5.6 or later. diff --git a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Other/ShowGameFilesCommand.cs b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Other/ShowGameFilesCommand.cs index 71093184..b97cb3e6 100644 --- a/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Other/ShowGameFilesCommand.cs +++ b/src/SMAPI.Mods.ConsoleCommands/Framework/Commands/Other/ShowGameFilesCommand.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; namespace StardewModdingAPI.Mods.ConsoleCommands.Framework.Commands.Other { @@ -18,8 +18,8 @@ namespace StardewModdingAPI.Mods.ConsoleCommands.Framework.Commands.Other /// The command arguments. public override void Handle(IMonitor monitor, string command, ArgumentParser args) { - Process.Start(Constants.ExecutionPath); - monitor.Log($"OK, opening {Constants.ExecutionPath}.", LogLevel.Info); + Process.Start(Constants.GamePath); + monitor.Log($"OK, opening {Constants.GamePath}.", LogLevel.Info); } } } diff --git a/src/SMAPI.Mods.SaveBackup/ModEntry.cs b/src/SMAPI.Mods.SaveBackup/ModEntry.cs index d6414e9c..b89bb9c3 100644 --- a/src/SMAPI.Mods.SaveBackup/ModEntry.cs +++ b/src/SMAPI.Mods.SaveBackup/ModEntry.cs @@ -19,7 +19,7 @@ namespace StardewModdingAPI.Mods.SaveBackup private readonly int BackupsToKeep = 10; /// The absolute path to the folder in which to store save backups. - private readonly string BackupFolder = Path.Combine(Constants.ExecutionPath, "save-backups"); + private readonly string BackupFolder = Path.Combine(Constants.GamePath, "save-backups"); /// A unique label for the save backup to create. private readonly string BackupLabel = $"{DateTime.UtcNow:yyyy-MM-dd} - SMAPI {Constants.ApiVersion} with Stardew Valley {Game1.version}"; diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs index 667491d6..810dfe48 100644 --- a/src/SMAPI/Constants.cs +++ b/src/SMAPI/Constants.cs @@ -31,10 +31,10 @@ namespace StardewModdingAPI ** Accessors *********/ /// The path to the game folder. - public static string ExecutionPath { get; } = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + public static string GamePath { get; } = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); /// The absolute path to the folder containing SMAPI's internal files. - public static readonly string InternalFilesPath = Path.Combine(EarlyConstants.ExecutionPath, "smapi-internal"); + public static readonly string InternalFilesPath = Path.Combine(EarlyConstants.GamePath, "smapi-internal"); /// The target game platform. internal static GamePlatform Platform { get; } = (GamePlatform)Enum.Parse(typeof(GamePlatform), LowLevelEnvironmentUtility.DetectPlatform()); @@ -77,7 +77,11 @@ namespace StardewModdingAPI public static GameFramework GameFramework { get; } = EarlyConstants.GameFramework; /// The path to the game folder. - public static string ExecutionPath { get; } = EarlyConstants.ExecutionPath; + [Obsolete($"Use {nameof(GamePath)} instead.")] + public static string ExecutionPath => Constants.GamePath; + + /// The path to the game folder. + public static string GamePath { get; } = EarlyConstants.GamePath; /// The directory path containing Stardew Valley's app data. public static string DataPath { get; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley"); @@ -139,7 +143,7 @@ namespace StardewModdingAPI internal static string UpdateMarker => Path.Combine(Constants.InternalFilesPath, "StardewModdingAPI.update.marker"); /// The default full path to search for mods. - internal static string DefaultModsPath { get; } = Path.Combine(Constants.ExecutionPath, "Mods"); + internal static string DefaultModsPath { get; } = Path.Combine(Constants.GamePath, "Mods"); /// The actual full path to search for mods. internal static string ModsPath { get; set; } @@ -222,7 +226,7 @@ namespace StardewModdingAPI internal static void ConfigureAssemblyResolver(AssemblyDefinitionResolver resolver) { // add search paths - resolver.AddSearchDirectory(Constants.ExecutionPath); + resolver.AddSearchDirectory(Constants.GamePath); resolver.AddSearchDirectory(Constants.InternalFilesPath); // add SMAPI explicitly diff --git a/src/SMAPI/Framework/ContentCoordinator.cs b/src/SMAPI/Framework/ContentCoordinator.cs index 97a37b3f..00f9439c 100644 --- a/src/SMAPI/Framework/ContentCoordinator.cs +++ b/src/SMAPI/Framework/ContentCoordinator.cs @@ -107,7 +107,7 @@ namespace StardewModdingAPI.Framework this.Reflection = reflection; this.JsonHelper = jsonHelper; this.OnLoadingFirstAsset = onLoadingFirstAsset; - this.FullRootDirectory = Path.Combine(Constants.ExecutionPath, rootDirectory); + this.FullRootDirectory = Path.Combine(Constants.GamePath, rootDirectory); this.ContentManagers.Add( this.MainContentManager = new GameContentManager( name: "Game1.content", diff --git a/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs b/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs index be892b33..26f0921d 100644 --- a/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs +++ b/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs @@ -56,7 +56,7 @@ namespace StardewModdingAPI.Framework.ContentManagers public LanguageCode Language => this.GetCurrentLanguage(); /// - public string FullRootDirectory => Path.Combine(Constants.ExecutionPath, this.RootDirectory); + public string FullRootDirectory => Path.Combine(Constants.GamePath, this.RootDirectory); /// public bool IsNamespaced { get; } diff --git a/src/SMAPI/Program.cs b/src/SMAPI/Program.cs index 0c90f2aa..f2f65287 100644 --- a/src/SMAPI/Program.cs +++ b/src/SMAPI/Program.cs @@ -66,7 +66,7 @@ namespace StardewModdingAPI { Program.AssemblyPathsByName = new(StringComparer.OrdinalIgnoreCase); - foreach (string searchPath in new[] { EarlyConstants.ExecutionPath, Program.DllSearchPath }) + foreach (string searchPath in new[] { EarlyConstants.GamePath, Program.DllSearchPath }) { foreach (string dllPath in Directory.EnumerateFiles(searchPath, "*.dll")) { @@ -110,7 +110,7 @@ namespace StardewModdingAPI catch (Exception ex) { // file doesn't exist - if (!File.Exists(Path.Combine(EarlyConstants.ExecutionPath, $"{EarlyConstants.GameAssemblyName}.exe"))) + if (!File.Exists(Path.Combine(EarlyConstants.GamePath, $"{EarlyConstants.GameAssemblyName}.exe"))) Program.PrintErrorAndExit("Oops! SMAPI can't find the game. Make sure you're running StardewModdingAPI.exe in your game folder."); // can't load file @@ -160,8 +160,8 @@ namespace StardewModdingAPI /// This is needed to resolve native DLLs like libSkiaSharp. private static void AssertDepsJson() { - string sourcePath = Path.Combine(Constants.ExecutionPath, "Stardew Valley.deps.json"); - string targetPath = Path.Combine(Constants.ExecutionPath, "StardewModdingAPI.deps.json"); + string sourcePath = Path.Combine(Constants.GamePath, "Stardew Valley.deps.json"); + string targetPath = Path.Combine(Constants.GamePath, "StardewModdingAPI.deps.json"); if (!File.Exists(targetPath) || FileUtilities.GetFileHash(sourcePath) != FileUtilities.GetFileHash(targetPath)) { @@ -194,7 +194,7 @@ namespace StardewModdingAPI // normalise modsPath = !string.IsNullOrWhiteSpace(rawModsPath) - ? Path.Combine(Constants.ExecutionPath, rawModsPath) + ? Path.Combine(Constants.GamePath, rawModsPath) : Constants.DefaultModsPath; }