summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI/Framework')
-rw-r--r--src/SMAPI/Framework/SCore.cs1
-rw-r--r--src/SMAPI/Framework/SGame.cs13
-rw-r--r--src/SMAPI/Framework/Serialization/KeybindConverter.cs89
3 files changed, 103 insertions, 0 deletions
diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs
index 1b39065f..0c55164c 100644
--- a/src/SMAPI/Framework/SCore.cs
+++ b/src/SMAPI/Framework/SCore.cs
@@ -208,6 +208,7 @@ namespace StardewModdingAPI.Framework
{
JsonConverter[] converters = {
new ColorConverter(),
+ new KeybindConverter(),
new PointConverter(),
new Vector2Converter(),
new RectangleConverter()
diff --git a/src/SMAPI/Framework/SGame.cs b/src/SMAPI/Framework/SGame.cs
index 634680a0..af7fa387 100644
--- a/src/SMAPI/Framework/SGame.cs
+++ b/src/SMAPI/Framework/SGame.cs
@@ -11,6 +11,7 @@ using StardewModdingAPI.Framework.Input;
using StardewModdingAPI.Framework.Reflection;
using StardewModdingAPI.Framework.StateTracking.Snapshots;
using StardewModdingAPI.Framework.Utilities;
+using StardewModdingAPI.Utilities;
using StardewValley;
using StardewValley.BellsAndWhistles;
using StardewValley.Locations;
@@ -124,6 +125,18 @@ namespace StardewModdingAPI.Framework
this.OnUpdating = onUpdating;
}
+ /// <summary>Get the current input state for a button.</summary>
+ /// <param name="button">The button to check.</param>
+ /// <remarks>This is intended for use by <see cref="Keybind"/> and shouldn't be used directly in most cases.</remarks>
+ internal static SButtonState GetInputState(SButton button)
+ {
+ SInputState input = Game1.input as SInputState;
+ if (input == null)
+ throw new InvalidOperationException("SMAPI's input state is not in a ready state yet.");
+
+ return input.GetState(button);
+ }
+
/*********
** Protected methods
diff --git a/src/SMAPI/Framework/Serialization/KeybindConverter.cs b/src/SMAPI/Framework/Serialization/KeybindConverter.cs
new file mode 100644
index 00000000..1bc146f8
--- /dev/null
+++ b/src/SMAPI/Framework/Serialization/KeybindConverter.cs
@@ -0,0 +1,89 @@
+using System;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using StardewModdingAPI.Toolkit.Serialization;
+using StardewModdingAPI.Utilities;
+
+namespace StardewModdingAPI.Framework.Serialization
+{
+ /// <summary>Handles deserialization of <see cref="Keybind"/> and <see cref="KeybindList"/> models.</summary>
+ internal class KeybindConverter : JsonConverter
+ {
+ /*********
+ ** Accessors
+ *********/
+ /// <inheritdoc />
+ public override bool CanRead { get; } = true;
+
+ /// <inheritdoc />
+ public override bool CanWrite { get; } = true;
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Get whether this instance can convert the specified object type.</summary>
+ /// <param name="objectType">The object type.</param>
+ public override bool CanConvert(Type objectType)
+ {
+ return
+ typeof(Keybind).IsAssignableFrom(objectType)
+ || typeof(KeybindList).IsAssignableFrom(objectType);
+ }
+
+ /// <summary>Reads the JSON representation of the object.</summary>
+ /// <param name="reader">The JSON reader.</param>
+ /// <param name="objectType">The object type.</param>
+ /// <param name="existingValue">The object being read.</param>
+ /// <param name="serializer">The calling serializer.</param>
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ string path = reader.Path;
+
+ // validate JSON type
+ if (reader.TokenType != JsonToken.String)
+ throw new SParseException($"Can't parse {nameof(KeybindList)} from {reader.TokenType} node (path: {reader.Path}).");
+
+ // parse raw value
+ string str = JToken.Load(reader).Value<string>();
+ if (objectType == typeof(Keybind))
+ {
+ return Keybind.TryParse(str, out Keybind parsed, out string[] errors)
+ ? parsed
+ : throw new SParseException($"Can't parse {nameof(Keybind)} from invalid value '{str}' (path: {path}).\n{string.Join("\n", errors)}");
+ }
+
+ if (objectType == typeof(KeybindList))
+ {
+ return KeybindList.TryParse(str, out KeybindList parsed, out string[] errors)
+ ? parsed
+ : throw new SParseException($"Can't parse {nameof(KeybindList)} from invalid value '{str}' (path: {path}).\n{string.Join("\n", errors)}");
+ }
+
+ throw new SParseException($"Can't parse unexpected type {objectType} from {reader.TokenType} node (path: {reader.Path}).");
+ }
+
+ /// <summary>Writes the JSON representation of the object.</summary>
+ /// <param name="writer">The JSON writer.</param>
+ /// <param name="value">The value.</param>
+ /// <param name="serializer">The calling serializer.</param>
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ writer.WriteValue(value?.ToString());
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ /// <summary>Read a JSON string.</summary>
+ /// <param name="str">The JSON string value.</param>
+ /// <param name="path">The path to the current JSON node.</param>
+ protected KeybindList ReadString(string str, string path)
+ {
+ return KeybindList.TryParse(str, out KeybindList parsed, out string[] errors)
+ ? parsed
+ : throw new SParseException($"Can't parse {nameof(KeybindList)} from invalid value '{str}' (path: {path}).\n{string.Join("\n", errors)}");
+ }
+ }
+}