summaryrefslogtreecommitdiff
path: root/StardewModdingAPI
diff options
context:
space:
mode:
Diffstat (limited to 'StardewModdingAPI')
-rw-r--r--StardewModdingAPI/Events/Controls.cs6
-rw-r--r--StardewModdingAPI/Inheritance/SGame.cs10
-rw-r--r--StardewModdingAPI/Program.cs174
-rw-r--r--StardewModdingAPI/StardewModdingAPI.csproj1
-rw-r--r--StardewModdingAPI/Version.cs23
5 files changed, 157 insertions, 57 deletions
diff --git a/StardewModdingAPI/Events/Controls.cs b/StardewModdingAPI/Events/Controls.cs
index ace890ca..8cf0f431 100644
--- a/StardewModdingAPI/Events/Controls.cs
+++ b/StardewModdingAPI/Events/Controls.cs
@@ -11,6 +11,7 @@ namespace StardewModdingAPI.Events
{
public static event EventHandler<EventArgsKeyboardStateChanged> KeyboardChanged = delegate { };
public static event EventHandler<EventArgsKeyPressed> KeyPressed = delegate { };
+ public static event EventHandler<EventArgsKeyPressed> KeyReleased = delegate { };
public static event EventHandler<EventArgsMouseStateChanged> MouseChanged = delegate { };
public static void InvokeKeyboardChanged(KeyboardState priorState, KeyboardState newState)
@@ -27,5 +28,10 @@ namespace StardewModdingAPI.Events
{
KeyPressed.Invoke(null, new EventArgsKeyPressed(key));
}
+
+ public static void InvokeKeyReleased(Keys key)
+ {
+ KeyReleased.Invoke(null, new EventArgsKeyPressed(key));
+ }
}
}
diff --git a/StardewModdingAPI/Inheritance/SGame.cs b/StardewModdingAPI/Inheritance/SGame.cs
index c7b07c43..120f4a6e 100644
--- a/StardewModdingAPI/Inheritance/SGame.cs
+++ b/StardewModdingAPI/Inheritance/SGame.cs
@@ -43,6 +43,10 @@ namespace StardewModdingAPI.Inheritance
{
get { return CurrentlyPressedKeys.Where(x => !PreviouslyPressedKeys.Contains(x)).ToArray(); }
}
+ public Keys[] FrameReleasedKeys
+ {
+ get { return PreviouslyPressedKeys.Where(x => !CurrentlyPressedKeys.Contains(x)).ToArray(); }
+ }
public int PreviousGameLocations { get; private set; }
public int PreviousLocationObjects { get; private set; }
@@ -233,11 +237,15 @@ namespace StardewModdingAPI.Inheritance
{
KStateNow = Keyboard.GetState();
CurrentlyPressedKeys = KStateNow.GetPressedKeys();
+
MStateNow = Mouse.GetState();
foreach (Keys k in FramePressedKeys)
Events.ControlEvents.InvokeKeyPressed(k);
-
+
+ foreach (Keys k in FrameReleasedKeys)
+ Events.ControlEvents.InvokeKeyReleased(k);
+
if (KStateNow != KStatePrior)
{
Events.ControlEvents.InvokeKeyboardChanged(KStatePrior, KStateNow);
diff --git a/StardewModdingAPI/Program.cs b/StardewModdingAPI/Program.cs
index 900c4889..9767c1b4 100644
--- a/StardewModdingAPI/Program.cs
+++ b/StardewModdingAPI/Program.cs
@@ -21,8 +21,10 @@ namespace StardewModdingAPI
private static List<string> _modPaths;
private static List<string> _modContentPaths;
+ private static string _consoleTitle = string.Format("Stardew Modding API Console - Version {0}", Version.VersionString);
+
public static string ExecutionPath { get; private set; }
- public static string DataPath = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley"));
+ public static string DataPath = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley"));
public static string LogPath = Path.Combine(Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley")), "ErrorLogs");
public static Texture2D DebugPixel { get; private set; }
@@ -38,9 +40,6 @@ namespace StardewModdingAPI
public static Thread gameThread;
public static Thread consoleInputThread;
- private const string _version = "0.36 Alpha";
- private static string _consoleTitle = string.Format("Stardew Modding API Console - Version {0}", _version);
-
public static bool StardewInjectorLoaded { get; private set; }
public static Mod StardewInjectorMod { get; private set; }
@@ -51,7 +50,7 @@ namespace StardewModdingAPI
/// </summary>
/// <param name="args"></param>
private static void Main(string[] args)
- {
+ {
try
{
ConfigureUI();
@@ -64,10 +63,10 @@ namespace StardewModdingAPI
catch (Exception e)
{
// Catch and display all exceptions.
- Log.Error("Critical error: " + e);
+ StardewModdingAPI.Log.Error("Critical error: " + e);
}
- Log.Comment("The API will now terminate. Press any key to continue...");
+ StardewModdingAPI.Log.Comment("The API will now terminate. Press any key to continue...");
Console.ReadKey();
}
@@ -77,10 +76,11 @@ namespace StardewModdingAPI
private static void ConfigureUI()
{
Console.Title = _consoleTitle;
-
+
+ Console.Title += " - Version " + Version.VersionString;
#if DEBUG
Console.Title += " - DEBUG IS NOT FALSE, AUTHOUR NEEDS TO REUPLOAD THIS VERSION";
-#endif
+#endif
}
/// <summary>
@@ -88,7 +88,7 @@ namespace StardewModdingAPI
/// </summary>
private static void ConfigurePaths()
{
- Log.Info("Validating api paths...");
+ StardewModdingAPI.Log.Info("Validating api paths...");
_modPaths = new List<string>();
_modContentPaths = new List<string>();
@@ -105,16 +105,16 @@ namespace StardewModdingAPI
_modContentPaths.ForEach(path => VerifyPath(path));
VerifyPath(LogPath);
- Log.Initialize(LogPath);
+ StardewModdingAPI.Log.Initialize(LogPath);
- Log.Verbose(LogPath);
+ StardewModdingAPI.Log.Verbose(LogPath);
if (!File.Exists(ExecutionPath + "\\Stardew Valley.exe"))
- {
+ {
throw new FileNotFoundException(string.Format("Could not found: {0}\\Stardew Valley.exe", ExecutionPath));
+ }
}
- }
-
+
/// <summary>
/// Load the injector.
/// </summary>
@@ -125,23 +125,23 @@ namespace StardewModdingAPI
/// All you need is a DLL that inherits from mod and is called StardewInjector.dll with an Entry() method
/// </remarks>
private static void ConfigureInjector()
- {
- //This will load the injector before anything else if it sees it
- //It doesn't matter though
- //I'll leave it as a feature in case anyone in the community wants to tinker with it
- //All you need is a DLL that inherits from mod and is called StardewInjector.dll with an Entry() method
+ {
+ //This will load the injector before anything else if it sees it
+ //It doesn't matter though
+ //I'll leave it as a feature in case anyone in the community wants to tinker with it
+ //All you need is a DLL that inherits from mod and is called StardewInjector.dll with an Entry() method
foreach (string ModPath in _modPaths)
{
foreach (String s in Directory.GetFiles(ModPath, "StardewInjector.dll"))
{
- Log.Success(ConsoleColor.Green, "Found Stardew Injector DLL: " + s);
+ StardewModdingAPI.Log.Success(ConsoleColor.Green, "Found Stardew Injector DLL: " + s);
try
{
Assembly mod = Assembly.UnsafeLoadFrom(s); //to combat internet-downloaded DLLs
if (mod.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0)
{
- Log.Success("Loading Injector DLL...");
+ StardewModdingAPI.Log.Success("Loading Injector DLL...");
TypeInfo tar = mod.DefinedTypes.First(x => x.BaseType == typeof(Mod));
Mod m = (Mod)mod.CreateInstance(tar.ToString());
Console.WriteLine("LOADED: {0} by {1} - Version {2} | Description: {3}", m.Name, m.Authour, m.Version, m.Description);
@@ -151,15 +151,15 @@ namespace StardewModdingAPI
}
else
{
- Log.Error("Invalid Mod DLL");
+ StardewModdingAPI.Log.Error("Invalid Mod DLL");
}
}
catch (Exception ex)
{
- Log.Error("Failed to load mod '{0}'. Exception details:\n" + ex, s);
+ StardewModdingAPI.Log.Error("Failed to load mod '{0}'. Exception details:\n" + ex, s);
}
}
- }
+ }
}
/// <summary>
@@ -167,7 +167,7 @@ namespace StardewModdingAPI
/// </summary>
private static void ConfigureSDV()
{
- Log.Info("Initializing SDV Assembly...");
+ StardewModdingAPI.Log.Info("Initializing SDV Assembly...");
// Load in that assembly. Also, ignore security :D
StardewAssembly = Assembly.UnsafeLoadFrom(ExecutionPath + "\\Stardew Valley.exe");
@@ -213,12 +213,12 @@ namespace StardewModdingAPI
#endregion
//Change the game's version
- Log.Info("Injecting New SDV Version...");
- Game1.version += "-Z_MODDED | SMAPI " + _version;
+ StardewModdingAPI.Log.Info("Injecting New SDV Version...");
+ Game1.version += "-Z_MODDED | SMAPI " + Version.VersionString;
//Create the thread for the game to run in.
gameThread = new Thread(RunGame);
- Log.Info("Starting SDV...");
+ StardewModdingAPI.Log.Info("Starting SDV...");
gameThread.Start();
//I forget.
@@ -230,10 +230,10 @@ namespace StardewModdingAPI
}
//SDV is running
- Log.Comment("SDV Loaded Into Memory");
+ StardewModdingAPI.Log.Comment("SDV Loaded Into Memory");
//Create definition to listen for input
- Log.Verbose("Initializing Console Input Thread...");
+ StardewModdingAPI.Log.Verbose("Initializing Console Input Thread...");
consoleInputThread = new Thread(ConsoleInputThread);
//The only command in the API (at least it should be, for now)\
@@ -253,13 +253,13 @@ namespace StardewModdingAPI
#endif
//Do tweaks using winforms invoke because I'm lazy
- Log.Verbose("Applying Final SDV Tweaks...");
+ StardewModdingAPI.Log.Verbose("Applying Final SDV Tweaks...");
StardewInvoke(() =>
{
gamePtr.IsMouseVisible = false;
gamePtr.Window.Title = "Stardew Valley - Version " + Game1.version;
StardewForm.Resize += Events.GraphicsEvents.InvokeResize;
- });
+ });
}
/// <summary>
@@ -268,10 +268,10 @@ namespace StardewModdingAPI
private static void GameRunInvoker()
{
//Game's in memory now, send the event
- Log.Verbose("Game Loaded");
+ StardewModdingAPI.Log.Verbose("Game Loaded");
Events.GameEvents.InvokeGameLoaded();
- Log.Comment("Type 'help' for help, or 'help <cmd>' for a command's usage");
+ StardewModdingAPI.Log.Comment(ConsoleColor.Cyan, "Type 'help' for help, or 'help <cmd>' for a command's usage");
//Begin listening to input
consoleInputThread.Start();
@@ -286,8 +286,8 @@ namespace StardewModdingAPI
if (consoleInputThread != null && consoleInputThread.ThreadState == ThreadState.Running)
consoleInputThread.Abort();
- Log.Verbose("Game Execution Finished");
- Log.Verbose("Shutting Down...");
+ StardewModdingAPI.Log.Verbose("Game Execution Finished");
+ StardewModdingAPI.Log.Verbose("Shutting Down...");
Thread.Sleep(100);
Environment.Exit(0);
}
@@ -306,23 +306,23 @@ namespace StardewModdingAPI
}
}
catch (Exception ex)
- {
- Log.Error("Could not create a path: " + path + "\n\n" + ex);
- }
+ {
+ StardewModdingAPI.Log.Error("Could not create a path: " + path + "\n\n" + ex);
+ }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static void RunGame()
{
- Application.ThreadException += Log.Application_ThreadException;
+ Application.ThreadException += StardewModdingAPI.Log.Application_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
- AppDomain.CurrentDomain.UnhandledException += Log.CurrentDomain_UnhandledException;
+ AppDomain.CurrentDomain.UnhandledException += StardewModdingAPI.Log.CurrentDomain_UnhandledException;
try
{
gamePtr = new SGame();
- Log.Verbose("Patching SDV Graphics Profile...");
+ StardewModdingAPI.Log.Verbose("Patching SDV Graphics Profile...");
Game1.graphics.GraphicsProfile = GraphicsProfile.HiDef;
LoadMods();
@@ -352,7 +352,7 @@ namespace StardewModdingAPI
}
catch (Exception ex)
{
- Log.Error("Game failed to start: " + ex);
+ StardewModdingAPI.Log.Error("Game failed to start: " + ex);
}
}
@@ -371,7 +371,7 @@ namespace StardewModdingAPI
public static void LoadMods()
{
- Log.Verbose("LOADING MODS");
+ StardewModdingAPI.Log.Verbose("LOADING MODS");
int loadedMods = 0;
foreach (string ModPath in _modPaths)
{
@@ -379,14 +379,14 @@ namespace StardewModdingAPI
{
if (s.Contains("StardewInjector"))
continue;
- Log.Success("Found DLL: " + s);
+ StardewModdingAPI.Log.Success("Found DLL: " + s);
try
{
Assembly mod = Assembly.UnsafeLoadFrom(s); //to combat internet-downloaded DLLs
if (mod.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0)
{
- Log.Verbose("Loading Mod DLL...");
+ StardewModdingAPI.Log.Verbose("Loading Mod DLL...");
TypeInfo tar = mod.DefinedTypes.First(x => x.BaseType == typeof(Mod));
Mod m = (Mod)mod.CreateInstance(tar.ToString());
Console.WriteLine("LOADED MOD: {0} by {1} - Version {2} | Description: {3}", m.Name, m.Authour, m.Version, m.Description);
@@ -395,16 +395,16 @@ namespace StardewModdingAPI
}
else
{
- Log.Error("Invalid Mod DLL");
+ StardewModdingAPI.Log.Error("Invalid Mod DLL");
}
}
catch (Exception ex)
{
- Log.Error("Failed to load mod '{0}'. Exception details:\n" + ex, s);
+ StardewModdingAPI.Log.Error("Failed to load mod '{0}'. Exception details:\n" + ex, s);
}
}
}
- Log.Success("LOADED {0} MODS", loadedMods);
+ StardewModdingAPI.Log.Success("LOADED {0} MODS", loadedMods);
}
public static void ConsoleInputThread()
@@ -419,7 +419,7 @@ namespace StardewModdingAPI
static void Events_LoadContent(object o, EventArgs e)
{
- Log.Info("Initializing Debug Assets...");
+ StardewModdingAPI.Log.Info("Initializing Debug Assets...");
DebugPixel = new Texture2D(Game1.graphics.GraphicsDevice, 1, 1);
DebugPixel.SetData(new Color[] { Color.White });
@@ -455,7 +455,7 @@ namespace StardewModdingAPI
static void Events_MenuChanged(IClickableMenu newMenu)
{
- Log.Verbose("NEW MENU: " + newMenu.GetType());
+ StardewModdingAPI.Log.Verbose("NEW MENU: " + newMenu.GetType());
if (newMenu is GameMenu)
{
Game1.activeClickableMenu = SGameMenu.ConstructFromBaseClass(Game1.activeClickableMenu as GameMenu);
@@ -494,17 +494,79 @@ namespace StardewModdingAPI
{
Command fnd = Command.FindCommand(e.Command.CalledArgs[0]);
if (fnd == null)
- Log.Error("The command specified could not be found");
+ StardewModdingAPI.Log.Error("The command specified could not be found");
else
{
if (fnd.CommandArgs.Length > 0)
- Log.Info("{0}: {1} - {2}", fnd.CommandName, fnd.CommandDesc, fnd.CommandArgs.ToSingular());
+ StardewModdingAPI.Log.Info("{0}: {1} - {2}", fnd.CommandName, fnd.CommandDesc, fnd.CommandArgs.ToSingular());
else
- Log.Info("{0}: {1}", fnd.CommandName, fnd.CommandDesc);
+ StardewModdingAPI.Log.Info("{0}: {1}", fnd.CommandName, fnd.CommandDesc);
}
}
else
- Log.Info("Commands: " + Command.RegisteredCommands.Select(x => x.CommandName).ToSingular());
+ StardewModdingAPI.Log.Info("Commands: " + Command.RegisteredCommands.Select(x => x.CommandName).ToSingular());
+ }
+
+ #region Logging
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void Log(object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Info(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogColour(ConsoleColor c, object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Info(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogInfo(object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Info(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogError(object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Error(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogDebug(object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Debug(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogValueNotSpecified()
+ {
+ StardewModdingAPI.Log.Error("<value> must be specified");
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogObjectValueNotSpecified()
+ {
+ StardewModdingAPI.Log.Error("<object> and <value> must be specified");
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogValueInvalid()
+ {
+ StardewModdingAPI.Log.Error("<value> is invalid");
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogObjectInvalid()
+ {
+ StardewModdingAPI.Log.Error("<object> is invalid");
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogValueNotInt32()
+ {
+ StardewModdingAPI.Log.Error("<value> must be a whole number (Int32)");
}
+ #endregion
}
} \ No newline at end of file
diff --git a/StardewModdingAPI/StardewModdingAPI.csproj b/StardewModdingAPI/StardewModdingAPI.csproj
index dde32d41..8d9dc4ba 100644
--- a/StardewModdingAPI/StardewModdingAPI.csproj
+++ b/StardewModdingAPI/StardewModdingAPI.csproj
@@ -121,6 +121,7 @@
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Inheritance\SGame.cs" />
+ <Compile Include="Version.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
diff --git a/StardewModdingAPI/Version.cs b/StardewModdingAPI/Version.cs
new file mode 100644
index 00000000..baccd53b
--- /dev/null
+++ b/StardewModdingAPI/Version.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace StardewModdingAPI
+{
+ public static class Version
+ {
+ public const int MajorVersion = 0;
+ public const int MinorVersion = 37;
+ public const int PatchVersion = 1;
+ public const string Build = "Alpha";
+
+ public static string VersionString {
+ get
+ {
+ return string.Format("{0}.{1}.{2} {3}", MajorVersion, MinorVersion, PatchVersion, Build);
+ }
+ }
+ }
+}