diff --git a/Assets/Scripts/InputSystem/ControllerTypes/InputJoyshock.cs b/Assets/Scripts/InputSystem/ControllerTypes/InputJoyshock.cs
index 21f0468d9..8e359750f 100644
--- a/Assets/Scripts/InputSystem/ControllerTypes/InputJoyshock.cs
+++ b/Assets/Scripts/InputSystem/ControllerTypes/InputJoyshock.cs
@@ -98,7 +98,7 @@ namespace HeavenStudio.InputSystem
{
public class InputJoyshock : InputController
{
- static string[] joyShockNames =
+ static readonly string[] joyShockNames =
{
"Unknown",
"Joy-Con (L)",
@@ -108,7 +108,7 @@ namespace HeavenStudio.InputSystem
"DualSense"
};
- static int[] dsPlayerColours = new[]
+ static readonly int[] dsPlayerColours = new[]
{
0xd41817,
0x04d4fa,
@@ -119,8 +119,7 @@ namespace HeavenStudio.InputSystem
0x888888
};
- //TODO: see if single joy-con mappings differ from a normal pad (they don't!)
- int[] defaultMappings = new[]
+ static readonly int[] defaultMappings = new[]
{
ButtonMaskUp,
ButtonMaskDown,
@@ -135,7 +134,7 @@ namespace HeavenStudio.InputSystem
ButtonMaskPlus,
-1
};
- int[] defaultMappingsL = new[]
+ static readonly int[] defaultMappingsL = new[]
{
-1,
-1,
@@ -150,7 +149,7 @@ namespace HeavenStudio.InputSystem
ButtonMaskMinus,
-1
};
- int[] defaultMappingsR = new[]
+ static readonly int[] defaultMappingsR = new[]
{
-1,
-1,
@@ -189,6 +188,7 @@ namespace HeavenStudio.InputSystem
JSL_SETTINGS joySettings;
InputJoyshock otherHalf;
+ bool isPair;
public struct JoyshockButtonState
{
@@ -215,20 +215,21 @@ namespace HeavenStudio.InputSystem
int GetButtonForSplitType(int action)
{
+ if (currentBindings.ControllerName == null) return -1;
if (action < 0 || action >= BINDS_MAX) return -1;
+ ControlBindings actionMap = currentBindings;
if (otherHalf == null)
{
switch (splitType)
{
case SplitLeft:
- return defaultMappingsL[action];
case SplitRight:
- return defaultMappingsR[action];
+ return actionMap.Pad[action];
default:
return defaultMappings[action];
}
}
- return defaultMappings[action];
+ return actionMap.Pad[action];
}
public static void JslEventInit()
@@ -239,7 +240,7 @@ namespace HeavenStudio.InputSystem
static void JslEventCallback(int handle, JOY_SHOCK_STATE state, JOY_SHOCK_STATE lastState,
IMU_STATE imuState, IMU_STATE lastImuState, float deltaTime)
{
- if (!joyshocks.ContainsKey(handle)) return;
+ if (joyshocks == null || !joyshocks.ContainsKey(handle)) return;
InputJoyshock js = joyshocks[handle];
if (js == null) return;
if (js.inputStack == null) return;
@@ -272,14 +273,14 @@ namespace HeavenStudio.InputSystem
joyTouchStateLast = new TOUCH_STATE();
- //FUTURE: remappable controls
-
joySettings = JslGetControllerInfoAndSettings(joyshockHandle);
type = joySettings.controllerType;
joyshockName = joyShockNames[type];
splitType = joySettings.splitType;
+ currentBindings = GetDefaultBindings();
+
joyshocks.Add(joyshockHandle, this);
}
@@ -400,6 +401,46 @@ namespace HeavenStudio.InputSystem
return false;
}
+ public override ControlBindings GetDefaultBindings()
+ {
+ ControlBindings binds = new ControlBindings();
+ switch (type)
+ {
+ case TypeJoyConLeft:
+ binds.Pad = defaultMappingsL;
+ binds.ControllerName = "Joy-Con (L)";
+ break;
+ case TypeJoyConRight:
+ binds.Pad = defaultMappingsR;
+ binds.ControllerName = "Joy-Con (R)";
+ break;
+ case TypeProController:
+ binds.Pad = defaultMappings;
+ binds.ControllerName = "Pro Controller";
+ break;
+ case TypeDualShock4:
+ binds.Pad = defaultMappings;
+ binds.ControllerName = "DualShock 4";
+ break;
+ case TypeDualSense:
+ binds.Pad = defaultMappings;
+ binds.ControllerName = "DualSense";
+ break;
+ }
+ return binds;
+ }
+
+ public override void ResetBindings()
+ { }
+
+ public override ControlBindings GetCurrentBindings()
+ {
+ return currentBindings;
+ }
+
+ public override void SetCurrentBindings(ControlBindings newBinds)
+ { }
+
public override int GetLastButtonDown()
{
for (int i = 0; i < buttonStates.Length; i++)
diff --git a/Assets/Scripts/InputSystem/ControllerTypes/InputKeyboard.cs b/Assets/Scripts/InputSystem/ControllerTypes/InputKeyboard.cs
index 72bcdae2a..93d588b30 100644
--- a/Assets/Scripts/InputSystem/ControllerTypes/InputKeyboard.cs
+++ b/Assets/Scripts/InputSystem/ControllerTypes/InputKeyboard.cs
@@ -40,21 +40,23 @@ namespace HeavenStudio.InputSystem
.Where(k => ((int)k < (int)KeyCode.Mouse0))
.ToArray();
- //FUTURE: remappable controls
- //KeyCode[] mappings = new KeyCode[Enum.GetNames(typeof(ButtonsPad)).Length];
- KeyCode[] defaultMappings = new KeyCode[]
+ static readonly ControlBindings defaultBindings = new()
{
- KeyCode.W, // dpad up
- KeyCode.S, // dpad down
- KeyCode.A, // dpad left
- KeyCode.D, // dpad right
- KeyCode.K, // south face button
- KeyCode.J, // east face button
- KeyCode.I, // west face button
- KeyCode.U, // north face button
- KeyCode.C, // left shoulder button
- KeyCode.N, // right shoulder button
- KeyCode.Escape, // start button
+ ControllerName = "Keyboard",
+ Pad = new int[]
+ {
+ (int)KeyCode.W,
+ (int)KeyCode.S,
+ (int)KeyCode.A,
+ (int)KeyCode.D,
+ (int)KeyCode.K,
+ (int)KeyCode.J,
+ (int)KeyCode.I,
+ (int)KeyCode.U,
+ (int)KeyCode.C,
+ (int)KeyCode.N,
+ (int)KeyCode.Escape,
+ },
};
InputDirection hatDirectionCurrent;
@@ -62,7 +64,7 @@ namespace HeavenStudio.InputSystem
public override void InitializeController()
{
- //FUTURE: remappable controls
+ currentBindings = GetDefaultBindings();
}
public override void UpdateState()
@@ -90,6 +92,22 @@ namespace HeavenStudio.InputSystem
return false;
}
+ public override ControlBindings GetDefaultBindings()
+ {
+ return defaultBindings;
+ }
+
+ public override void ResetBindings()
+ { }
+
+ public override ControlBindings GetCurrentBindings()
+ {
+ return currentBindings;
+ }
+
+ public override void SetCurrentBindings(ControlBindings newBinds)
+ { }
+
public override int GetLastButtonDown()
{
return 0;
@@ -110,19 +128,19 @@ namespace HeavenStudio.InputSystem
public override bool GetButton(int button)
{
- return Input.GetKey(defaultMappings[button]);
+ return Input.GetKey((KeyCode)defaultBindings.Pad[button]);
}
public override bool GetButtonDown(int button, out double dt)
{
dt = 0;
- return Input.GetKeyDown(defaultMappings[button]);
+ return Input.GetKeyDown((KeyCode)defaultBindings.Pad[button]);
}
public override bool GetButtonUp(int button, out double dt)
{
dt = 0;
- return Input.GetKeyUp(defaultMappings[button]);
+ return Input.GetKeyUp((KeyCode)defaultBindings.Pad[button]);
}
public override float GetAxis(InputAxis axis)
@@ -136,13 +154,13 @@ namespace HeavenStudio.InputSystem
switch (direction)
{
case InputDirection.Up:
- return Input.GetKey(defaultMappings[0]);
+ return Input.GetKey((KeyCode)defaultBindings.Pad[0]);
case InputDirection.Down:
- return Input.GetKey(defaultMappings[1]);
+ return Input.GetKey((KeyCode)defaultBindings.Pad[1]);
case InputDirection.Left:
- return Input.GetKey(defaultMappings[2]);
+ return Input.GetKey((KeyCode)defaultBindings.Pad[2]);
case InputDirection.Right:
- return Input.GetKey(defaultMappings[3]);
+ return Input.GetKey((KeyCode)defaultBindings.Pad[3]);
default:
return false;
}
@@ -154,13 +172,13 @@ namespace HeavenStudio.InputSystem
switch (direction)
{
case InputDirection.Up:
- return Input.GetKeyDown(defaultMappings[0]);
+ return Input.GetKeyDown((KeyCode)defaultBindings.Pad[0]);
case InputDirection.Down:
- return Input.GetKeyDown(defaultMappings[1]);
+ return Input.GetKeyDown((KeyCode)defaultBindings.Pad[1]);
case InputDirection.Left:
- return Input.GetKeyDown(defaultMappings[2]);
+ return Input.GetKeyDown((KeyCode)defaultBindings.Pad[2]);
case InputDirection.Right:
- return Input.GetKeyDown(defaultMappings[3]);
+ return Input.GetKeyDown((KeyCode)defaultBindings.Pad[3]);
default:
return false;
}
@@ -172,13 +190,13 @@ namespace HeavenStudio.InputSystem
switch (direction)
{
case InputDirection.Up:
- return Input.GetKeyUp(defaultMappings[0]);
+ return Input.GetKeyUp((KeyCode)defaultBindings.Pad[0]);
case InputDirection.Down:
- return Input.GetKeyUp(defaultMappings[1]);
+ return Input.GetKeyUp((KeyCode)defaultBindings.Pad[1]);
case InputDirection.Left:
- return Input.GetKeyUp(defaultMappings[2]);
+ return Input.GetKeyUp((KeyCode)defaultBindings.Pad[2]);
case InputDirection.Right:
- return Input.GetKeyUp(defaultMappings[3]);
+ return Input.GetKeyUp((KeyCode)defaultBindings.Pad[3]);
default:
return false;
}
diff --git a/Assets/Scripts/InputSystem/InputController.cs b/Assets/Scripts/InputSystem/InputController.cs
index e9135a822..b45c8c1a7 100644
--- a/Assets/Scripts/InputSystem/InputController.cs
+++ b/Assets/Scripts/InputSystem/InputController.cs
@@ -127,8 +127,7 @@ namespace HeavenStudio.InputSystem
// FUTURE: Move Style needs to be implemented per-game (maybe implement checks for common actions?)
- protected int currentInputFlags = 0;
- protected int lastInputFlags = 0;
+ protected ControlBindings currentBindings;
protected int? playerNum;
protected int directionStateCurrent = 0;
@@ -142,22 +141,105 @@ namespace HeavenStudio.InputSystem
public abstract bool GetIsConnected();
public abstract bool GetIsPoorConnection();
- // public abstract int[] GetDefaultMappings(ControlStyles style);
- // public abstract int[] GetCurrentMappings(ControlStyles style);
- // public abstract int[] SetCurrentMappings(ControlStyles style);
+ ///
+ /// Gets the controller's default mappings
+ ///
+ ///
+ public abstract ControlBindings GetDefaultBindings();
- public abstract int GetLastButtonDown(); // Get the last button down
- public abstract KeyCode GetLastKeyDown(); // Get the last key down (used for keyboards and other devices that use Keycode)
- public abstract bool GetButton(int button); // is button currently pressed?
- public abstract bool GetButtonDown(int button, out double dt); // is button just pressed?
- public abstract bool GetButtonUp(int button, out double dt); // is button just released?
- public abstract float GetAxis(InputAxis axis); // Get the value of an axis
- public abstract bool GetHatDirection(InputDirection direction); // is direction active?
- public abstract bool GetHatDirectionDown(InputDirection direction, out double dt); // direction just became active?
- public abstract bool GetHatDirectionUp(InputDirection direction, out double dt); // direction just became inactive?
+ ///
+ /// Resets the controller's mappings to default
+ ///
+ public abstract void ResetBindings();
- public abstract void SetPlayer(int? playerNum); // Set the player number (starts at 1, set to -1 or null for no player)
- public abstract int? GetPlayer(); // Get the player number (null if no player)
+ ///
+ /// Gets the controller's current mappings
+ ///
+ ///
+ public abstract ControlBindings GetCurrentBindings();
+
+ ///
+ /// Sets the controller's current mappings
+ ///
+ ///
+ public abstract void SetCurrentBindings(ControlBindings newBinds);
+
+ ///
+ /// Gets the last pressed button
+ ///
+ ///
+ public abstract int GetLastButtonDown();
+
+ ///
+ /// Gets the last pressed key (keyboards)
+ ///
+ ///
+ public abstract KeyCode GetLastKeyDown();
+
+ ///
+ /// True if the given button is being held
+ ///
+ ///
+ ///
+ public abstract bool GetButton(int button);
+
+ ///
+ /// True if the button was just pressed this Update
+ ///
+ ///
+ /// time since the reported event, use to compensate for controller delays
+ ///
+ public abstract bool GetButtonDown(int button, out double dt);
+
+ ///
+ /// True if the button was just released this Update
+ ///
+ ///
+ /// time since the reported event, use to compensate for controller delays
+ ///
+ public abstract bool GetButtonUp(int button, out double dt);
+
+ ///
+ /// Get the value of an analogue axis
+ ///
+ ///
+ ///
+ public abstract float GetAxis(InputAxis axis);
+
+ ///
+ /// True if the current direction is active
+ ///
+ ///
+ ///
+ public abstract bool GetHatDirection(InputDirection direction);
+
+ ///
+ /// True if the current direction just became active this Update
+ ///
+ ///
+ /// time since the reported event, use to compensate for controller delays
+ ///
+ public abstract bool GetHatDirectionDown(InputDirection direction, out double dt);
+
+ ///
+ /// True if the current direction just became inactive this Update
+ ///
+ ///
+ /// time since the reported event, use to compensate for controller delays
+ ///
+ public abstract bool GetHatDirectionUp(InputDirection direction, out double dt);
+
+ ///
+ /// Sets the player number (starts at 1, set to -1 or null for no player)
+ ///
+ ///
+ public abstract void SetPlayer(int? playerNum);
+
+ ///
+ /// Gets the player number (starts at 1, -1 or null for no player)
+ ///
+ ///
+ public abstract int? GetPlayer();
//public abstract Sprite GetDisplayIcon(); //"big icon" for the controller in the settings menu
//public abstract Sprite GetPlaybackIcon(); //"small icon" for the controller during playback