From 929dccb75a1405737975d76648e015a3e7c00177 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 7 Oct 2017 23:07:10 -0400 Subject: reorganise repo structure --- src/SMAPI/Constants.cs | 169 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 src/SMAPI/Constants.cs (limited to 'src/SMAPI/Constants.cs') diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs new file mode 100644 index 00000000..4d0a9ca9 --- /dev/null +++ b/src/SMAPI/Constants.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using StardewModdingAPI.Framework; +using StardewModdingAPI.Framework.ModLoading; +using StardewValley; + +namespace StardewModdingAPI +{ + /// Contains SMAPI's constants and assumptions. + public static class Constants + { + /********* + ** Properties + *********/ + /// The directory path containing the current save's data (if a save is loaded). + private static string RawSavePath => Context.IsSaveLoaded ? Path.Combine(Constants.SavesPath, Constants.GetSaveFolderName()) : null; + + /// Whether the directory containing the current save's data exists on disk. + private static bool SavePathReady => Context.IsSaveLoaded && Directory.Exists(Constants.RawSavePath); + + + /********* + ** Accessors + *********/ + /**** + ** Public + ****/ + /// SMAPI's current semantic version. + public static ISemanticVersion ApiVersion { get; } = new SemanticVersion(2, 0, 0, "beta.1"); + + /// The minimum supported version of Stardew Valley. + public static ISemanticVersion MinimumGameVersion { get; } = new SemanticVersion("1.2.30"); + + /// The maximum supported version of Stardew Valley. + public static ISemanticVersion MaximumGameVersion { get; } = null; + + /// The path to the game folder. + public static string ExecutionPath { get; } = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + + /// The directory path containing Stardew Valley's app data. + public static string DataPath { get; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley"); + + /// The directory path in which error logs should be stored. + public static string LogDir { get; } = Path.Combine(Constants.DataPath, "ErrorLogs"); + + /// The directory path where all saves are stored. + public static string SavesPath { get; } = Path.Combine(Constants.DataPath, "Saves"); + + /// The directory name containing the current save's data (if a save is loaded and the directory exists). + public static string SaveFolderName => Context.IsSaveLoaded ? Constants.GetSaveFolderName() : ""; + + /// The directory path containing the current save's data (if a save is loaded and the directory exists). + public static string CurrentSavePath => Constants.SavePathReady ? Path.Combine(Constants.SavesPath, Constants.GetSaveFolderName()) : ""; + + /**** + ** Internal + ****/ + /// The GitHub repository to check for updates. + internal const string GitHubRepository = "Pathoschild/SMAPI"; + + /// The file path for the SMAPI configuration file. + internal static string ApiConfigPath => Path.Combine(Constants.ExecutionPath, $"{typeof(Program).Assembly.GetName().Name}.config.json"); + + /// The file path to the log where the latest output should be saved. + internal static string DefaultLogPath => Path.Combine(Constants.LogDir, "SMAPI-latest.txt"); + + /// A copy of the log leading up to the previous fatal crash, if any. + internal static string FatalCrashLog => Path.Combine(Constants.LogDir, "SMAPI-crash.txt"); + + /// The file path which stores a fatal crash message for the next run. + internal static string FatalCrashMarker => Path.Combine(Constants.ExecutionPath, "StardewModdingAPI.crash.marker"); + + /// The full path to the folder containing mods. + internal static string ModPath { get; } = Path.Combine(Constants.ExecutionPath, "Mods"); + + /// The game's current semantic version. + internal static ISemanticVersion GameVersion { get; } = new GameVersion(Constants.GetGameVersion()); + + /// The target game platform. + internal static Platform TargetPlatform { get; } = +#if SMAPI_FOR_WINDOWS + Platform.Windows; +#else + Platform.Mono; +#endif + + /// Maps vendor keys (like Nexus) to their mod URL template (where {0} is the mod ID) during mod compatibility checks. This doesn't affect update checks, which defer to the remote web API. + internal static readonly IDictionary VendorModUrls = new Dictionary(StringComparer.InvariantCultureIgnoreCase) + { + ["Chucklefish"] = "https://community.playstarbound.com/resources/{0}", + ["Nexus"] = "http://nexusmods.com/stardewvalley/mods/{0}", + ["GitHub"] = "https://github.com/{0}/releases" + }; + + + /********* + ** Internal methods + *********/ + /// Get metadata for mapping assemblies to the current platform. + /// The target game platform. + internal static PlatformAssemblyMap GetAssemblyMap(Platform targetPlatform) + { + // get assembly changes needed for platform + string[] removeAssemblyReferences; + Assembly[] targetAssemblies; + switch (targetPlatform) + { + case Platform.Mono: + removeAssemblyReferences = new[] + { + "Stardew Valley", + "Microsoft.Xna.Framework", + "Microsoft.Xna.Framework.Game", + "Microsoft.Xna.Framework.Graphics" + }; + targetAssemblies = new[] + { + typeof(StardewValley.Game1).Assembly, + typeof(Microsoft.Xna.Framework.Vector2).Assembly + }; + break; + + case Platform.Windows: + removeAssemblyReferences = new[] + { + "StardewValley", + "MonoGame.Framework" + }; + targetAssemblies = new[] + { + typeof(StardewValley.Game1).Assembly, + typeof(Microsoft.Xna.Framework.Vector2).Assembly, + typeof(Microsoft.Xna.Framework.Game).Assembly, + typeof(Microsoft.Xna.Framework.Graphics.SpriteBatch).Assembly + }; + break; + + default: + throw new InvalidOperationException($"Unknown target platform '{targetPlatform}'."); + } + + return new PlatformAssemblyMap(targetPlatform, removeAssemblyReferences, targetAssemblies); + } + + + /********* + ** Private methods + *********/ + /// Get the name of a save directory for the current player. + private static string GetSaveFolderName() + { + string prefix = new string(Game1.player.name.Where(char.IsLetterOrDigit).ToArray()); + return $"{prefix}_{Game1.uniqueIDForThisGame}"; + } + + /// Get the game's current version string. + private static string GetGameVersion() + { + // we need reflection because it's a constant, so SMAPI's references to it are inlined at compile-time + FieldInfo field = typeof(Game1).GetField(nameof(Game1.version), BindingFlags.Public | BindingFlags.Static); + if (field == null) + throw new InvalidOperationException($"The {nameof(Game1)}.{nameof(Game1.version)} field could not be found."); + return (string)field.GetValue(null); + } + } +} -- cgit