summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--StardewModdingAPI/Constants.cs11
-rw-r--r--StardewModdingAPI/Events/EventArgs.cs10
-rw-r--r--StardewModdingAPI/Events/Graphics.cs8
-rw-r--r--StardewModdingAPI/Events/Mine.cs6
-rw-r--r--StardewModdingAPI/Inheritance/SGame.cs55
-rw-r--r--StardewModdingAPI/Log.cs181
-rw-r--r--StardewModdingAPI/Program.cs40
-rw-r--r--StardewModdingAPI/StardewModdingAPI.csproj2
8 files changed, 99 insertions, 214 deletions
diff --git a/StardewModdingAPI/Constants.cs b/StardewModdingAPI/Constants.cs
index a29e5fa8..109f22f8 100644
--- a/StardewModdingAPI/Constants.cs
+++ b/StardewModdingAPI/Constants.cs
@@ -42,13 +42,20 @@ namespace StardewModdingAPI
/// Path for log files to be output to.
/// %LocalAppData%//StardewValley//ErrorLogs
/// </summary>
- public static string LogPath => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley", "ErrorLogs");
+ public static string LogDir => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley", "ErrorLogs");
+ public static string LogPath => Path.Combine(LogDir, "MODDED_ProgramLog.Log_LATEST.txt");
- public static readonly Version Version = new Version(0, 39, 2, "Alpha");
+ public static readonly Version Version = new Version(0, 39, 3, "Alpha");
/// <summary>
/// Not quite "constant", but it makes more sense for it to be here, at least for now
/// </summary>
public static int ModsLoaded = 0;
+
+ /// <summary>
+ /// Whether or not to enable the Render Target drawing code offered by ClxS
+ /// Do not mark as 'const' or else 'if' checks will complain that the expression is always true in ReSharper
+ /// </summary>
+ public static bool EnableDrawingIntoRenderTarget => true;
}
}
diff --git a/StardewModdingAPI/Events/EventArgs.cs b/StardewModdingAPI/Events/EventArgs.cs
index a6de3597..59fa1bbd 100644
--- a/StardewModdingAPI/Events/EventArgs.cs
+++ b/StardewModdingAPI/Events/EventArgs.cs
@@ -108,6 +108,16 @@ namespace StardewModdingAPI.Events
}
public List<GameLocation> NewLocations { get; private set; }
}
+ public class EventArgsMineLevelChanged : EventArgs
+ {
+ public EventArgsMineLevelChanged(int previousMineLevel, int currentMineLevel)
+ {
+ PreviousMineLevel = previousMineLevel;
+ CurrentMineLevel = currentMineLevel;
+ }
+ public int PreviousMineLevel { get; private set; }
+ public int CurrentMineLevel { get; private set; }
+ }
public class EventArgsLocationObjectsChanged : EventArgs
{
diff --git a/StardewModdingAPI/Events/Graphics.cs b/StardewModdingAPI/Events/Graphics.cs
index 87ee845b..db963924 100644
--- a/StardewModdingAPI/Events/Graphics.cs
+++ b/StardewModdingAPI/Events/Graphics.cs
@@ -6,6 +6,7 @@ namespace StardewModdingAPI.Events
{
public static event EventHandler Resize = delegate { };
public static event EventHandler DrawTick = delegate { };
+ public static event EventHandler DrawInRenderTargetTick = delegate { };
public static void InvokeDrawTick()
{
@@ -15,10 +16,15 @@ namespace StardewModdingAPI.Events
}
catch (Exception ex)
{
- Log.Error("An exception occured in XNA DrawTick: " + ex);
+ Log.Error("An exception occured in a Mod's DrawTick: " + ex);
}
}
+ public static void InvokeDrawInRenderTargetTick()
+ {
+ DrawInRenderTargetTick.Invoke(null, EventArgs.Empty);
+ }
+
public static void InvokeResize(object sender, EventArgs e)
{
Resize.Invoke(sender, e);
diff --git a/StardewModdingAPI/Events/Mine.cs b/StardewModdingAPI/Events/Mine.cs
index 2f4e9ba7..f48e9574 100644
--- a/StardewModdingAPI/Events/Mine.cs
+++ b/StardewModdingAPI/Events/Mine.cs
@@ -4,11 +4,11 @@ namespace StardewModdingAPI.Events
{
public static class MineEvents
{
- public static event EventHandler<EventArgsCurrentLocationChanged> MineLevelChanged = delegate { };
+ public static event EventHandler<EventArgsMineLevelChanged> MineLevelChanged = delegate { };
- public static void InvokeLocationsChanged(int currentMineLevel)
+ public static void InvokeMineLevelChanged(int previousMinelevel, int currentMineLevel)
{
-
+ MineLevelChanged.Invoke(null, new EventArgsMineLevelChanged(previousMinelevel, currentMineLevel));
}
}
}
diff --git a/StardewModdingAPI/Inheritance/SGame.cs b/StardewModdingAPI/Inheritance/SGame.cs
index da6260be..ce2488d5 100644
--- a/StardewModdingAPI/Inheritance/SGame.cs
+++ b/StardewModdingAPI/Inheritance/SGame.cs
@@ -32,15 +32,10 @@ namespace StardewModdingAPI.Inheritance
public Keys[] CurrentlyPressedKeys => KStateNow.GetPressedKeys();
public Keys[] PreviouslyPressedKeys => KStatePrior.GetPressedKeys();
- public Keys[] FramePressedKeys
- {
- get { return CurrentlyPressedKeys.Except(PreviouslyPressedKeys).ToArray(); }
- }
- public Keys[] FrameReleasedKeys
- {
- get { return PreviouslyPressedKeys.Except(CurrentlyPressedKeys).ToArray(); }
- }
-
+ public Keys[] FramePressedKeys => CurrentlyPressedKeys.Except(PreviouslyPressedKeys).ToArray();
+
+ public Keys[] FrameReleasedKeys => PreviouslyPressedKeys.Except(CurrentlyPressedKeys).ToArray();
+
public Buttons[][] PreviouslyPressedButtons;
private bool WasButtonJustPressed(Buttons button, ButtonState buttonState, PlayerIndex stateIndex)
@@ -161,6 +156,8 @@ namespace StardewModdingAPI.Inheritance
public GameLocation PreviousGameLocation { get; private set; }
public IClickableMenu PreviousActiveMenu { get; private set; }
+ public int PreviousMineLevel { get; private set; }
+
public Int32 PreviousTimeOfDay { get; private set; }
public Int32 PreviousDayOfMonth { get; private set; }
public String PreviousSeasonOfYear { get; private set; }
@@ -282,6 +279,40 @@ namespace StardewModdingAPI.Inheritance
GraphicsEvents.InvokeDrawTick();
+ if (Constants.EnableDrawingIntoRenderTarget)
+ {
+ if (!options.zoomLevel.Equals(1.0f))
+ {
+ if (Screen.RenderTargetUsage == RenderTargetUsage.DiscardContents)
+ {
+ Screen = new RenderTarget2D(graphics.GraphicsDevice, Math.Min(4096, (int) (Window.ClientBounds.Width * (1.0 / options.zoomLevel))),
+ Math.Min(4096, (int) (Window.ClientBounds.Height * (1.0 / options.zoomLevel))),
+ false, SurfaceFormat.Color, DepthFormat.Depth16, 1, RenderTargetUsage.PreserveContents);
+ }
+ GraphicsDevice.SetRenderTarget(Screen);
+ }
+
+ // Not beginning the batch due to inconsistancies with the standard draw tick...
+ //spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, null);
+
+ GraphicsEvents.InvokeDrawInRenderTargetTick();
+
+ //spriteBatch.End();
+
+ if (!options.zoomLevel.Equals(1.0f))
+ {
+ GraphicsDevice.SetRenderTarget(null);
+ spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullNone);
+ spriteBatch.Draw(Screen, Vector2.Zero, Screen.Bounds, Color.White, 0.0f, Vector2.Zero, options.zoomLevel, SpriteEffects.None, 1f);
+ spriteBatch.End();
+ }
+
+ //Re-draw the mouse
+ spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, null);
+ spriteBatch.Draw(mouseCursors, new Vector2(getMouseX(), getMouseY()), getSourceRectForStandardTileSheet(mouseCursors, mouseCursor, 16, 16), Color.White * mouseCursorTransparency, 0.0f, Vector2.Zero, pixelZoom + dialogueButtonScale / 150f, SpriteEffects.None, 1f);
+ spriteBatch.End();
+ }
+
if (Debug)
{
spriteBatch.Begin();
@@ -490,6 +521,12 @@ namespace StardewModdingAPI.Inheritance
FireLoadedGameEvent = true;
PreviouslyLoadedGame = hasLoadedGame;
}
+
+ if (mine != null && PreviousMineLevel != mine.mineLevel)
+ {
+ MineEvents.InvokeMineLevelChanged(PreviousMineLevel, mine.mineLevel);
+ PreviousMineLevel = mine.mineLevel;
+ }
}
private bool HasInventoryChanged(List<Item> items, out List<ItemStackChange> changedItems)
diff --git a/StardewModdingAPI/Log.cs b/StardewModdingAPI/Log.cs
deleted file mode 100644
index 6c338edc..00000000
--- a/StardewModdingAPI/Log.cs
+++ /dev/null
@@ -1,181 +0,0 @@
-using System;
-using System.IO;
-using System.Threading;
-
-namespace StardewModdingAPI
-{
-
- /// <summary>
- /// Class to organize logging calls.
- /// </summary>
- public class Log
- {
- private static StreamWriter _logStream;
- private static string _logPath;
-
- /// <summary>
- /// Set up the logging stream
- /// </summary>
- /// <param name="logPath"></param>
- public static void Initialize(string logPath)
- {
- _logPath = logPath;
- var logFile = string.Format("{0}\\MODDED_ProgramLog.Log_LATEST.txt", logPath);
- try
- {
- _logStream = new StreamWriter(logFile, false);
- }
- catch (Exception)
- {
- // TODO: not use general exception
- Error("Could not initialize LogStream - Logging is disabled");
- }
- }
-
- private static void PrintLog(object message, bool disableLogging)
- {
- string logOutput = $"[{DateTime.Now.ToLongTimeString()}] {message?.ToString()}";
- Console.WriteLine(logOutput);
-
- if (_logStream != null && !disableLogging)
- {
- _logStream.WriteLine(logOutput);
- _logStream.Flush();
- }
- }
-
- /// <summary>
- /// Print provided parameters to the console/file as applicable
- /// </summary>
- /// <param name="message">Desired message</param>
- /// <param name="disableLogging">When true, writes to ONLY console and not the log file.</param>
- /// <param name="values">Deprecated. Does nothing.</param>
- private static void PrintLog(object message, bool disableLogging, params object[] values)
- {
- PrintLog(message, disableLogging);
- }
-
- /// <summary>
- /// Successful message to display to console and logging.
- /// </summary>
- /// <param name="message"></param>
- /// <param name="values">Deprecated. Do not use.</param>
- public static void Success(object message, params object[] values)
- {
- Console.ForegroundColor = ConsoleColor.Green;
- PrintLog(message?.ToString(), false);
- Console.ForegroundColor = ConsoleColor.Gray;
- }
-
- /// <summary>
- /// Generic comment to display to console and logging.
- /// </summary>
- /// <param name="message"></param>
- /// <param name="values">Deprecated. Do not use.</param>
- public static void Verbose(object message, params object[] values)
- {
- Console.ForegroundColor = ConsoleColor.Gray;
- PrintLog(message?.ToString(), false);
- Console.ForegroundColor = ConsoleColor.Gray;
- }
-
- /// <summary>
- /// Additional comment to display to console and logging.
- /// </summary>
- /// <param name="message"></param>
- /// <param name="values">Deprecated. Do not use.</param>
- public static void Comment(object message, params object[] values)
- {
- Console.ForegroundColor = ConsoleColor.Yellow;
- PrintLog(message?.ToString(), false);
- Console.ForegroundColor = ConsoleColor.Gray;
- }
-
- /// <summary>
- /// Message for only console. Does not appear in logging.
- /// </summary>
- /// <param name="message"></param>
- /// <param name="values">Deprecated. Do not use.</param>
- public static void Info(object message, params object[] values)
- {
- Console.ForegroundColor = ConsoleColor.Gray;
- PrintLog(message?.ToString(), true);
- Console.ForegroundColor = ConsoleColor.Gray;
- }
-
- /// <summary>
- /// Important message indicating an error.
- /// </summary>
- /// <param name="message"></param>
- /// <param name="values">Deprecated. Do not use.</param>
- public static void Error(object message, params object[] values)
- {
- Console.ForegroundColor = ConsoleColor.Red;
- PrintLog(message?.ToString(), false);
- Console.ForegroundColor = ConsoleColor.Gray;
- }
-
- /// <summary>
- /// A message displayed only while in DEBUG mode
- /// </summary>
- /// <param name="message"></param>
- /// <param name="values">Deprecated. Do not use.</param>
- public static void Debug(object message, params object[] values)
- {
-#if DEBUG
- Console.ForegroundColor = ConsoleColor.Yellow;
- Log.PrintLog(message.ToString(), false);
- Console.ForegroundColor = ConsoleColor.Gray;
-#endif
- }
-
- /// <summary>
- /// Catch unhandled exception from the application
- /// </summary>
- /// <remarks>Should be moved out of here if we do more than just log the exception.</remarks>
- public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
- {
- Console.WriteLine("An exception has been caught");
- File.WriteAllText(_logPath + "\\MODDED_ErrorLog.Log_" + DateTime.UtcNow.Ticks + ".txt", e.ExceptionObject.ToString());
- }
-
- /// <summary>
- /// Catch thread exception from the application
- /// </summary>
- /// <remarks>Should be moved out of here if we do more than just log the exception.</remarks>
- public static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
- {
- Console.WriteLine("A thread exception has been caught");
- File.WriteAllText(_logPath + "\\MODDED_ErrorLog.Log_" + Extensions.Random.Next(100000000, 999999999) + ".txt", e.Exception.ToString());
- }
-
- // I'm including the following for now because they have a lot of references with different uses.
- // They should be removed since they do not provide any insight into actual problems, and other log methods should be used.
-
- public static void LogValueNotSpecified()
- {
- Error("<value> must be specified");
- }
-
- public static void LogObjectValueNotSpecified()
- {
- Error("<object> and <value> must be specified");
- }
-
- public static void LogValueInvalid()
- {
- Error("<value> is invalid");
- }
-
- public static void LogObjectInvalid()
- {
- Error("<object> is invalid");
- }
-
- public static void LogValueNotInt32()
- {
- Error("<value> must be a whole number (Int32)");
- }
-
- }
-}
diff --git a/StardewModdingAPI/Program.cs b/StardewModdingAPI/Program.cs
index 4d1d23d1..05da664c 100644
--- a/StardewModdingAPI/Program.cs
+++ b/StardewModdingAPI/Program.cs
@@ -59,6 +59,8 @@ namespace StardewModdingAPI
catch (Exception e)
{
// Catch and display all exceptions.
+ Console.WriteLine(e);
+ Console.ReadKey();
Log.Error("Critical error: " + e);
}
@@ -99,9 +101,7 @@ namespace StardewModdingAPI
//Checks that all defined modpaths exist as directories
_modPaths.ForEach(path => VerifyPath(path));
//_modContentPaths.ForEach(path => VerifyPath(path));
- VerifyPath(Constants.LogPath);
-
- Log.Initialize(Constants.LogPath);
+ VerifyPath(Constants.LogDir);
if (!File.Exists(Constants.ExecutionPath + "\\Stardew Valley.exe"))
{
@@ -267,7 +267,7 @@ namespace StardewModdingAPI
string t = File.ReadAllText(s);
if (string.IsNullOrEmpty(t))
{
- Log.Error("Failed to read mod manifest '{0}'. Manifest is empty!", s);
+ Log.Error($"Failed to read mod manifest '{s}'. Manifest is empty!");
continue;
}
@@ -275,41 +275,47 @@ namespace StardewModdingAPI
if (string.IsNullOrEmpty(manifest.EntryDll))
{
- Log.Error("Failed to read mod manifest '{0}'. EntryDll is empty!", s);
+ Log.Error($"Failed to read mod manifest '{s}'. EntryDll is empty!");
continue;
}
}
catch (Exception ex)
{
- Log.Error("Failed to read mod manifest '{0}'. Exception details:\n" + ex, s);
+ Log.Error($"Failed to read mod manifest '{s}'. Exception details:\n" + ex);
continue;
}
+ string targDir = Path.GetDirectoryName(s);
+ string psDir = Path.Combine(targDir, "psconfigs");
+ Log.Info($"Created psconfigs directory @{psDir}");
try
{
if (manifest.PerSaveConfigs)
{
- if (!Directory.Exists(Path.GetDirectoryName(s)))
- Directory.CreateDirectory(Path.GetDirectoryName(s));
+ if (!Directory.Exists(psDir))
+ {
+ Directory.CreateDirectory(psDir);
+ Log.Info($"Created psconfigs directory @{psDir}");
+ }
- if (!Directory.Exists(Path.GetDirectoryName(s)))
+ if (!Directory.Exists(psDir))
{
- Log.Error("Failed to create psconfigs directory '{0}'. No exception occured.", Path.GetDirectoryName(s));
+ Log.Error($"Failed to create psconfigs directory '{psDir}'. No exception occured.");
continue;
}
}
}
catch (Exception ex)
{
- Log.Error("Failed to create psconfigs directory '{0}'. Exception details:\n" + ex, Path.GetDirectoryName(s));
+ Log.Error($"Failed to create psconfigs directory '{targDir}'. Exception details:\n" + ex);
continue;
}
string targDll = string.Empty;
try
{
- targDll = Path.Combine(Path.GetDirectoryName(s), manifest.EntryDll);
+ targDll = Path.Combine(targDir, manifest.EntryDll);
if (!File.Exists(targDll))
{
- Log.Error("Failed to load mod '{0}'. File {1} does not exist!", manifest.EntryDll, targDll);
+ Log.Error($"Failed to load mod '{manifest.EntryDll}'. File {targDll} does not exist!");
continue;
}
@@ -320,9 +326,9 @@ namespace StardewModdingAPI
Log.Verbose("Loading Mod DLL...");
TypeInfo tar = mod.DefinedTypes.First(x => x.BaseType == typeof (Mod));
Mod m = (Mod) mod.CreateInstance(tar.ToString());
- m.PathOnDisk = Path.GetDirectoryName(s);
+ m.PathOnDisk = targDir;
m.Manifest = manifest;
- Log.Success("LOADED MOD: {0} by {1} - Version {2} | Description: {3} (@ {4})", m.Manifest.Name, m.Manifest.Authour, m.Manifest.Version, m.Manifest.Description, targDll);
+ Log.Success($"LOADED MOD: {m.Manifest.Name} by {m.Manifest.Authour} - Version {m.Manifest.Version} | Description: {m.Manifest.Description} (@ {targDll})");
Constants.ModsLoaded += 1;
m.Entry();
}
@@ -333,12 +339,12 @@ namespace StardewModdingAPI
}
catch (Exception ex)
{
- Log.Error("Failed to load mod '{0}'. Exception details:\n" + ex, targDll);
+ Log.Error($"Failed to load mod '{targDll}'. Exception details:\n" + ex);
}
}
}
}
- Log.Success("LOADED {0} MODS", Constants.ModsLoaded);
+ Log.Success($"LOADED {Constants.ModsLoaded} MODS");
Console.Title = Constants.ConsoleTitle;
}
diff --git a/StardewModdingAPI/StardewModdingAPI.csproj b/StardewModdingAPI/StardewModdingAPI.csproj
index 76ebd86c..d60e2544 100644
--- a/StardewModdingAPI/StardewModdingAPI.csproj
+++ b/StardewModdingAPI/StardewModdingAPI.csproj
@@ -152,7 +152,7 @@
<Compile Include="Inheritance\SBareObject.cs" />
<Compile Include="Inheritance\SObject.cs" />
<Compile Include="JsonResolver.cs" />
- <Compile Include="Log.cs" />
+ <Compile Include="Logger.cs" />
<Compile Include="Manifest.cs" />
<Compile Include="Mod.cs" />
<Compile Include="ModItem.cs" />