summaryrefslogtreecommitdiff
path: root/src/SMAPI/Program.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI/Program.cs')
-rw-r--r--src/SMAPI/Program.cs63
1 files changed, 37 insertions, 26 deletions
diff --git a/src/SMAPI/Program.cs b/src/SMAPI/Program.cs
index 3a34872a..6bacf564 100644
--- a/src/SMAPI/Program.cs
+++ b/src/SMAPI/Program.cs
@@ -3,12 +3,15 @@ using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Reflection;
+using System.Runtime.CompilerServices;
using System.Threading;
#if SMAPI_FOR_WINDOWS
#endif
using StardewModdingAPI.Framework;
-using StardewModdingAPI.Internal;
+using StardewModdingAPI.Toolkit.Utilities;
+[assembly: InternalsVisibleTo("SMAPI.Tests")]
+[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // Moq for unit testing
namespace StardewModdingAPI
{
/// <summary>The main entry point for SMAPI, responsible for hooking into and launching the game.</summary>
@@ -37,9 +40,14 @@ namespace StardewModdingAPI
Program.AssertGameVersion();
Program.Start(args);
}
+ catch (BadImageFormatException ex) when (ex.FileName == "StardewValley")
+ {
+ string executableName = Program.GetExecutableAssemblyName();
+ Console.WriteLine($"SMAPI failed to initialize because your game's {executableName}.exe seems to be invalid.\nThis may be a pirated version which modified the executable in an incompatible way; if so, you can try a different download or buy a legitimate version.\n\nTechnical details:\n{ex}");
+ }
catch (Exception ex)
{
- Console.WriteLine($"SMAPI failed to initialise: {ex}");
+ Console.WriteLine($"SMAPI failed to initialize: {ex}");
Program.PressAnyKeyToExit(true);
}
}
@@ -74,19 +82,9 @@ namespace StardewModdingAPI
/// <remarks>This must be checked *before* any references to <see cref="Constants"/>, and this method should not reference <see cref="Constants"/> itself to avoid errors in Mono.</remarks>
private static void AssertGamePresent()
{
- Platform platform = EnvironmentUtility.DetectPlatform();
- string gameAssemblyName = platform == Platform.Windows ? "Stardew Valley" : "StardewValley";
+ string gameAssemblyName = Program.GetExecutableAssemblyName();
if (Type.GetType($"StardewValley.Game1, {gameAssemblyName}", throwOnError: false) == null)
- {
- Program.PrintErrorAndExit(
- "Oops! SMAPI can't find the game. "
- + (Assembly.GetCallingAssembly().Location.Contains(Path.Combine("internal", "Windows")) || Assembly.GetCallingAssembly().Location.Contains(Path.Combine("internal", "Mono"))
- ? "It looks like you're running SMAPI from the download package, but you need to run the installed version instead. "
- : "Make sure you're running StardewModdingAPI.exe in your game folder. "
- )
- + "See the readme.txt file for details."
- );
- }
+ Program.PrintErrorAndExit("Oops! SMAPI can't find the game. Make sure you're running StardewModdingAPI.exe in your game folder. See the readme.txt file for details.");
}
/// <summary>Assert that the game version is within <see cref="Constants.MinimumGameVersion"/> and <see cref="Constants.MaximumGameVersion"/>.</summary>
@@ -108,26 +106,39 @@ namespace StardewModdingAPI
}
- /// <summary>Initialise SMAPI and launch the game.</summary>
+ /// <summary>Get the game's executable assembly name.</summary>
+ private static string GetExecutableAssemblyName()
+ {
+ Platform platform = EnvironmentUtility.DetectPlatform();
+ return platform == Platform.Windows ? "Stardew Valley" : "StardewValley";
+ }
+
+ /// <summary>Initialize SMAPI and launch the game.</summary>
/// <param name="args">The command-line arguments.</param>
/// <remarks>This method is separate from <see cref="Main"/> because that can't contain any references to assemblies loaded by <see cref="CurrentDomain_AssemblyResolve"/> (e.g. via <see cref="Constants"/>), or Mono will incorrectly show an assembly resolution error before assembly resolution is set up.</remarks>
private static void Start(string[] args)
{
- // get flags from arguments
- bool writeToConsole = !args.Contains("--no-terminal");
+ // get flags
+ bool writeToConsole = !args.Contains("--no-terminal") && Environment.GetEnvironmentVariable("SMAPI_NO_TERMINAL") == null;
- // get mods path from arguments
- string modsPath = null;
+ // get mods path
+ string modsPath;
{
+ string rawModsPath = null;
+
+ // get from command line args
int pathIndex = Array.LastIndexOf(args, "--mods-path") + 1;
if (pathIndex >= 1 && args.Length >= pathIndex)
- {
- modsPath = args[pathIndex];
- if (!string.IsNullOrWhiteSpace(modsPath) && !Path.IsPathRooted(modsPath))
- modsPath = Path.Combine(Constants.ExecutionPath, modsPath);
- }
- if (string.IsNullOrWhiteSpace(modsPath))
- modsPath = Constants.DefaultModsPath;
+ rawModsPath = args[pathIndex];
+
+ // get from environment variables
+ if (string.IsNullOrWhiteSpace(rawModsPath))
+ rawModsPath = Environment.GetEnvironmentVariable("SMAPI_MODS_PATH");
+
+ // normalise
+ modsPath = !string.IsNullOrWhiteSpace(rawModsPath)
+ ? Path.Combine(Constants.ExecutionPath, rawModsPath)
+ : Constants.DefaultModsPath;
}
// load SMAPI