summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build/common.targets9
-rw-r--r--docs/release-notes.md1
-rw-r--r--src/SMAPI.Common/EnvironmentUtility.cs97
-rw-r--r--src/SMAPI.Common/Platform.cs15
-rw-r--r--src/SMAPI.Common/StardewModdingAPI.Common.projitems2
-rw-r--r--src/SMAPI.Installer/Enums/Platform.cs12
-rw-r--r--src/SMAPI.Installer/InteractiveInstaller.cs28
-rw-r--r--src/SMAPI.Installer/StardewModdingAPI.Installer.csproj1
-rw-r--r--src/SMAPI/Constants.cs11
-rw-r--r--src/SMAPI/Framework/Content/ContentCache.cs2
-rw-r--r--src/SMAPI/Framework/ModLoading/AssemblyLoader.cs1
-rw-r--r--src/SMAPI/Framework/ModLoading/Platform.cs12
-rw-r--r--src/SMAPI/Framework/ModLoading/PlatformAssemblyMap.cs1
-rw-r--r--src/SMAPI/Program.cs22
-rw-r--r--src/SMAPI/StardewModdingAPI.csproj2
15 files changed, 140 insertions, 76 deletions
diff --git a/build/common.targets b/build/common.targets
index a6cead8f..95885299 100644
--- a/build/common.targets
+++ b/build/common.targets
@@ -26,6 +26,10 @@
<DefineConstants>$(DefineConstants);SMAPI_FOR_WINDOWS</DefineConstants>
</PropertyGroup>
<ItemGroup>
+ <!-- WMI for environment info -->
+ <Reference Include="System.Management" />
+
+ <!--XNA framework-->
<Reference Include="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
<Private>False</Private>
</Reference>
@@ -38,6 +42,8 @@
<Reference Include="Microsoft.Xna.Framework.Xact, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
<Private>False</Private>
</Reference>
+
+ <!-- game DLLs -->
<Reference Include="Netcode">
<HintPath>$(GamePath)\Netcode.dll</HintPath>
<Private Condition="'$(MSBuildProjectName)' != 'StardewModdingAPI.Tests'">False</Private>
@@ -58,11 +64,14 @@
<DefineConstants>$(DefineConstants);SMAPI_FOR_UNIX</DefineConstants>
</PropertyGroup>
<ItemGroup>
+ <!-- MonoGame -->
<Reference Include="MonoGame.Framework">
<HintPath>$(GamePath)\MonoGame.Framework.dll</HintPath>
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
</Reference>
+
+ <!-- game DLLs -->
<Reference Include="StardewValley">
<HintPath>$(GamePath)\StardewValley.exe</HintPath>
<Private>False</Private>
diff --git a/docs/release-notes.md b/docs/release-notes.md
index 817fcd47..40f404d3 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -14,6 +14,7 @@
* Fixed issue where assets didn't reload correctly when the player switches language.
* For SMAPI developers:
+ * Added MacOS detection to `Constants.Platform`.
* Added prerelease versions to the mod update-check API response where available (GitHub only).
* Added support for beta releases on the home page.
* Split mod DB out of `StardewModdingAPI.config.json`, so we can load config earlier and reduce unnecessary memory usage later.
diff --git a/src/SMAPI.Common/EnvironmentUtility.cs b/src/SMAPI.Common/EnvironmentUtility.cs
new file mode 100644
index 00000000..b8a6d775
--- /dev/null
+++ b/src/SMAPI.Common/EnvironmentUtility.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+#if SMAPI_FOR_WINDOWS
+using System.Management;
+#endif
+using System.Runtime.InteropServices;
+
+namespace StardewModdingAPI.Common
+{
+ /// <summary>Provides methods for fetching environment information.</summary>
+ internal static class EnvironmentUtility
+ {
+ /*********
+ ** Properties
+ *********/
+ /// <summary>Get the OS name from the system uname command.</summary>
+ /// <param name="buffer">The buffer to fill with the resulting string.</param>
+ [DllImport("libc")]
+ static extern int uname(IntPtr buffer);
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Detect the current OS.</summary>
+ public static Platform DetectPlatform()
+ {
+ switch (Environment.OSVersion.Platform)
+ {
+ case PlatformID.MacOSX:
+ return Platform.Mac;
+
+ case PlatformID.Unix:
+ return EnvironmentUtility.IsRunningMac()
+ ? Platform.Mac
+ : Platform.Linux;
+
+ default:
+ return Platform.Windows;
+ }
+ }
+
+
+ /// <summary>Get the human-readable OS name and version.</summary>
+ /// <param name="platform">The current platform.</param>
+ [SuppressMessage("ReSharper", "EmptyGeneralCatchClause", Justification = "Error suppressed deliberately to fallback to default behaviour.")]
+ public static string GetFriendlyPlatformName(Platform platform)
+ {
+#if SMAPI_FOR_WINDOWS
+ try
+ {
+ return new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem")
+ .Get()
+ .Cast<ManagementObject>()
+ .Select(entry => entry.GetPropertyValue("Caption").ToString())
+ .FirstOrDefault();
+ }
+ catch { }
+#endif
+ return (platform == Platform.Mac ? "MacOS " : "") + Environment.OSVersion;
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ /// <summary>Detect whether the code is running on Mac.</summary>
+ /// <remarks>
+ /// This code is derived from the Mono project (see System.Windows.Forms/System.Windows.Forms/XplatUI.cs). It detects Mac by calling the
+ /// <c>uname</c> system command and checking the response, which is always 'Darwin' for MacOS.
+ /// </remarks>
+ private static bool IsRunningMac()
+ {
+ IntPtr buffer = IntPtr.Zero;
+ try
+ {
+ buffer = Marshal.AllocHGlobal(8192);
+ if (uname(buffer) == 0)
+ {
+ string os = Marshal.PtrToStringAnsi(buffer);
+ return os == "Darwin";
+ }
+ return false;
+ }
+ catch
+ {
+ return false; // default to Linux
+ }
+ finally
+ {
+ if (buffer != IntPtr.Zero)
+ Marshal.FreeHGlobal(buffer);
+ }
+ }
+ }
+}
diff --git a/src/SMAPI.Common/Platform.cs b/src/SMAPI.Common/Platform.cs
new file mode 100644
index 00000000..08b4545f
--- /dev/null
+++ b/src/SMAPI.Common/Platform.cs
@@ -0,0 +1,15 @@
+namespace StardewModdingAPI.Common
+{
+ /// <summary>The game's platform version.</summary>
+ internal enum Platform
+ {
+ /// <summary>The Linux version of the game.</summary>
+ Linux,
+
+ /// <summary>The Mac version of the game.</summary>
+ Mac,
+
+ /// <summary>The Windows version of the game.</summary>
+ Windows
+ }
+}
diff --git a/src/SMAPI.Common/StardewModdingAPI.Common.projitems b/src/SMAPI.Common/StardewModdingAPI.Common.projitems
index 223b0d5c..0b89f092 100644
--- a/src/SMAPI.Common/StardewModdingAPI.Common.projitems
+++ b/src/SMAPI.Common/StardewModdingAPI.Common.projitems
@@ -9,6 +9,8 @@
<Import_RootNamespace>StardewModdingAPI.Common</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
+ <Compile Include="$(MSBuildThisFileDirectory)EnvironmentUtility.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)Platform.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Models\ModSeachModel.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Models\ModInfoModel.cs" />
<Compile Include="$(MSBuildThisFileDirectory)SemanticVersionImpl.cs" />
diff --git a/src/SMAPI.Installer/Enums/Platform.cs b/src/SMAPI.Installer/Enums/Platform.cs
deleted file mode 100644
index 9bcaa3c3..00000000
--- a/src/SMAPI.Installer/Enums/Platform.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace StardewModdingApi.Installer.Enums
-{
- /// <summary>The game's platform version.</summary>
- internal enum Platform
- {
- /// <summary>The Linux/Mac version of the game.</summary>
- Mono,
-
- /// <summary>The Windows version of the game.</summary>
- Windows
- }
-} \ No newline at end of file
diff --git a/src/SMAPI.Installer/InteractiveInstaller.cs b/src/SMAPI.Installer/InteractiveInstaller.cs
index b7e698ad..01076573 100644
--- a/src/SMAPI.Installer/InteractiveInstaller.cs
+++ b/src/SMAPI.Installer/InteractiveInstaller.cs
@@ -27,7 +27,8 @@ namespace StardewModdingApi.Installer
{
switch (platform)
{
- case Platform.Mono:
+ case Platform.Linux:
+ case Platform.Mac:
{
string home = Environment.GetEnvironmentVariable("HOME");
@@ -140,7 +141,7 @@ namespace StardewModdingApi.Installer
/****
** Get platform & set window title
****/
- Platform platform = this.DetectPlatform();
+ Platform platform = EnvironmentUtility.DetectPlatform();
Console.Title = $"SMAPI {new SemanticVersionImpl(this.GetType().Assembly.GetName().Version)} installer on {platform}";
Console.WriteLine();
@@ -182,7 +183,7 @@ namespace StardewModdingApi.Installer
DirectoryInfo modsDir = new DirectoryInfo(Path.Combine(installDir.FullName, "Mods"));
var paths = new
{
- executable = Path.Combine(installDir.FullName, platform == Platform.Mono ? "StardewValley.exe" : "Stardew Valley.exe"),
+ executable = Path.Combine(installDir.FullName, platform == Platform.Windows ? "Stardew Valley.exe" : "StardewValley.exe"),
unixSmapiLauncher = Path.Combine(installDir.FullName, "StardewModdingAPI"),
unixLauncher = Path.Combine(installDir.FullName, "StardewValley"),
unixLauncherBackup = Path.Combine(installDir.FullName, "StardewValley-original")
@@ -271,7 +272,7 @@ namespace StardewModdingApi.Installer
** Always uninstall old files
****/
// restore game launcher
- if (platform == Platform.Mono && File.Exists(paths.unixLauncherBackup))
+ if ((platform == Platform.Linux || platform == Platform.Mac) && File.Exists(paths.unixLauncherBackup))
{
this.PrintDebug("Removing SMAPI launcher...");
this.InteractivelyDelete(paths.unixLauncher);
@@ -304,7 +305,7 @@ namespace StardewModdingApi.Installer
}
// replace mod launcher (if possible)
- if (platform == Platform.Mono)
+ if (platform == Platform.Linux || platform == Platform.Mac)
{
this.PrintDebug("Safely replacing game launcher...");
if (!File.Exists(paths.unixLauncherBackup))
@@ -379,21 +380,6 @@ namespace StardewModdingApi.Installer
/*********
** Private methods
*********/
- /// <summary>Detect the game's platform.</summary>
- /// <exception cref="NotSupportedException">The platform is not supported.</exception>
- private Platform DetectPlatform()
- {
- switch (Environment.OSVersion.Platform)
- {
- case PlatformID.MacOSX:
- case PlatformID.Unix:
- return Platform.Mono;
-
- default:
- return Platform.Windows;
- }
- }
-
/// <summary>Test whether the current console supports color formatting.</summary>
private static bool GetConsoleSupportsColor()
{
@@ -635,7 +621,7 @@ namespace StardewModdingApi.Installer
// normalise path
if (platform == Platform.Windows)
path = path.Replace("\"", ""); // in Windows, quotes are used to escape spaces and aren't part of the file path
- if (platform == Platform.Mono)
+ if (platform == Platform.Linux || platform == Platform.Mac)
path = path.Replace("\\ ", " "); // in Linux/Mac, spaces in paths may be escaped if copied from the command line
if (path.StartsWith("~/"))
{
diff --git a/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj b/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj
index a575e06f..7a71bef9 100644
--- a/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj
+++ b/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj
@@ -40,7 +40,6 @@
<Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Enums\ScriptAction.cs" />
- <Compile Include="Enums\Platform.cs" />
<Compile Include="InteractiveInstaller.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs
index a098194b..1faaf656 100644
--- a/src/SMAPI/Constants.cs
+++ b/src/SMAPI/Constants.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
+using StardewModdingAPI.Common;
using StardewModdingAPI.Framework;
using StardewModdingAPI.Framework.ModLoading;
using StardewValley;
@@ -91,12 +92,7 @@ namespace StardewModdingAPI
internal static ISemanticVersion GameVersion { get; } = new GameVersion(Constants.GetGameVersion());
/// <summary>The target game platform.</summary>
- internal static Platform TargetPlatform { get; } =
-#if SMAPI_FOR_WINDOWS
- Platform.Windows;
-#else
- Platform.Mono;
-#endif
+ internal static Platform TargetPlatform { get; } = EnvironmentUtility.DetectPlatform();
/*********
@@ -111,7 +107,8 @@ namespace StardewModdingAPI
Assembly[] targetAssemblies;
switch (targetPlatform)
{
- case Platform.Mono:
+ case Platform.Linux:
+ case Platform.Mac:
removeAssemblyReferences = new[]
{
"Stardew Valley",
diff --git a/src/SMAPI/Framework/Content/ContentCache.cs b/src/SMAPI/Framework/Content/ContentCache.cs
index 533da398..d95de4fe 100644
--- a/src/SMAPI/Framework/Content/ContentCache.cs
+++ b/src/SMAPI/Framework/Content/ContentCache.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using Microsoft.Xna.Framework;
-using StardewModdingAPI.Framework.ModLoading;
+using StardewModdingAPI.Common;
using StardewModdingAPI.Framework.Reflection;
using StardewModdingAPI.Framework.Utilities;
using StardewValley;
diff --git a/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs b/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs
index a60f63da..bf9b6450 100644
--- a/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs
+++ b/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs
@@ -5,6 +5,7 @@ using System.Linq;
using System.Reflection;
using Mono.Cecil;
using Mono.Cecil.Cil;
+using StardewModdingAPI.Common;
using StardewModdingAPI.Framework.Exceptions;
using StardewModdingAPI.Metadata;
diff --git a/src/SMAPI/Framework/ModLoading/Platform.cs b/src/SMAPI/Framework/ModLoading/Platform.cs
deleted file mode 100644
index 45e881c4..00000000
--- a/src/SMAPI/Framework/ModLoading/Platform.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace StardewModdingAPI.Framework.ModLoading
-{
- /// <summary>The game's platform version.</summary>
- internal enum Platform
- {
- /// <summary>The Linux/Mac version of the game.</summary>
- Mono,
-
- /// <summary>The Windows version of the game.</summary>
- Windows
- }
-}
diff --git a/src/SMAPI/Framework/ModLoading/PlatformAssemblyMap.cs b/src/SMAPI/Framework/ModLoading/PlatformAssemblyMap.cs
index 463f45e8..9499b538 100644
--- a/src/SMAPI/Framework/ModLoading/PlatformAssemblyMap.cs
+++ b/src/SMAPI/Framework/ModLoading/PlatformAssemblyMap.cs
@@ -2,6 +2,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Mono.Cecil;
+using StardewModdingAPI.Common;
namespace StardewModdingAPI.Framework.ModLoading
{
diff --git a/src/SMAPI/Program.cs b/src/SMAPI/Program.cs
index 36310fed..27f7b4d5 100644
--- a/src/SMAPI/Program.cs
+++ b/src/SMAPI/Program.cs
@@ -10,10 +10,10 @@ using System.Security;
using System.Text.RegularExpressions;
using System.Threading;
#if SMAPI_FOR_WINDOWS
-using System.Management;
using System.Windows.Forms;
#endif
using Newtonsoft.Json;
+using StardewModdingAPI.Common;
using StardewModdingAPI.Common.Models;
using StardewModdingAPI.Events;
using StardewModdingAPI.Framework;
@@ -165,7 +165,7 @@ namespace StardewModdingAPI
try
{
// init logging
- this.Monitor.Log($"SMAPI {Constants.ApiVersion} with Stardew Valley {Constants.GameVersion} on {this.GetFriendlyPlatformName()}", LogLevel.Info);
+ this.Monitor.Log($"SMAPI {Constants.ApiVersion} with Stardew Valley {Constants.GameVersion} on {EnvironmentUtility.GetFriendlyPlatformName(Constants.TargetPlatform)}", LogLevel.Info);
this.Monitor.Log($"Mods go here: {Constants.ModPath}");
this.Monitor.Log($"Log started at {DateTime.UtcNow:s} UTC", LogLevel.Trace);
@@ -1157,24 +1157,6 @@ namespace StardewModdingAPI
};
}
- /// <summary>Get a human-readable name for the current platform.</summary>
- [SuppressMessage("ReSharper", "EmptyGeneralCatchClause", Justification = "Error suppressed deliberately to fallback to default behaviour.")]
- private string GetFriendlyPlatformName()
- {
-#if SMAPI_FOR_WINDOWS
- try
- {
- return new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem")
- .Get()
- .Cast<ManagementObject>()
- .Select(entry => entry.GetPropertyValue("Caption").ToString())
- .FirstOrDefault();
- }
- catch { }
-#endif
- return Environment.OSVersion.ToString();
- }
-
/// <summary>Log a message if verbose mode is enabled.</summary>
/// <param name="message">The message to log.</param>
private void VerboseLog(string message)
diff --git a/src/SMAPI/StardewModdingAPI.csproj b/src/SMAPI/StardewModdingAPI.csproj
index 6e9d0d9c..9b4a496e 100644
--- a/src/SMAPI/StardewModdingAPI.csproj
+++ b/src/SMAPI/StardewModdingAPI.csproj
@@ -72,7 +72,6 @@
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
- <Reference Include="System.Management" Condition="$(OS) == 'Windows_NT'" />
<Reference Include="System.Numerics">
<Private>True</Private>
</Reference>
@@ -110,7 +109,6 @@
<Compile Include="Framework\ModLoading\IInstructionHandler.cs" />
<Compile Include="Framework\ModLoading\IncompatibleInstructionException.cs" />
<Compile Include="Framework\ModLoading\InstructionHandleResult.cs" />
- <Compile Include="Framework\ModLoading\Platform.cs" />
<Compile Include="Framework\ModLoading\PlatformAssemblyMap.cs" />
<Compile Include="Framework\ModLoading\RewriteHelper.cs" />
<Compile Include="Framework\ModLoading\Rewriters\FieldReplaceRewriter.cs" />