Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 33 additions & 53 deletions src/SMAPI/Framework/Input/GamePadStateBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
Expand All @@ -22,7 +21,7 @@ internal class GamePadStateBuilder : IInputStateBuilder<GamePadStateBuilder, Gam
private GamePadState? State;

/// <summary>The current button states.</summary>
private readonly IDictionary<SButton, ButtonState>? ButtonStates;
private readonly Dictionary<SButton, ButtonState> ButtonStates;

/// <summary>The left trigger value.</summary>
private float LeftTrigger;
Expand All @@ -37,14 +36,6 @@ internal class GamePadStateBuilder : IInputStateBuilder<GamePadStateBuilder, Gam
private Vector2 RightStickPos;


/*********
** Accessors
*********/
/// <summary>Whether the gamepad is currently connected.</summary>
[MemberNotNullWhen(true, nameof(GamePadStateBuilder.ButtonStates))]
public bool IsConnected { get; }


/*********
** Public methods
*********/
Expand All @@ -53,46 +44,44 @@ internal class GamePadStateBuilder : IInputStateBuilder<GamePadStateBuilder, Gam
public GamePadStateBuilder(GamePadState state)
{
this.State = state;
this.IsConnected = state.IsConnected;

if (!this.IsConnected)
return;

GamePadDPad pad = state.DPad;
GamePadButtons buttons = state.Buttons;
GamePadTriggers triggers = state.Triggers;
GamePadThumbSticks sticks = state.ThumbSticks;
this.ButtonStates = new Dictionary<SButton, ButtonState>
if (state.IsConnected)
{
[SButton.DPadUp] = pad.Up,
[SButton.DPadDown] = pad.Down,
[SButton.DPadLeft] = pad.Left,
[SButton.DPadRight] = pad.Right,

[SButton.ControllerA] = buttons.A,
[SButton.ControllerB] = buttons.B,
[SButton.ControllerX] = buttons.X,
[SButton.ControllerY] = buttons.Y,
[SButton.LeftStick] = buttons.LeftStick,
[SButton.RightStick] = buttons.RightStick,
[SButton.LeftShoulder] = buttons.LeftShoulder,
[SButton.RightShoulder] = buttons.RightShoulder,
[SButton.ControllerBack] = buttons.Back,
[SButton.ControllerStart] = buttons.Start,
[SButton.BigButton] = buttons.BigButton
};
this.LeftTrigger = triggers.Left;
this.RightTrigger = triggers.Right;
this.LeftStickPos = sticks.Left;
this.RightStickPos = sticks.Right;
GamePadDPad pad = state.DPad;
GamePadButtons buttons = state.Buttons;
GamePadTriggers triggers = state.Triggers;
GamePadThumbSticks sticks = state.ThumbSticks;
this.ButtonStates = new Dictionary<SButton, ButtonState>
{
[SButton.DPadUp] = pad.Up,
[SButton.DPadDown] = pad.Down,
[SButton.DPadLeft] = pad.Left,
[SButton.DPadRight] = pad.Right,

[SButton.ControllerA] = buttons.A,
[SButton.ControllerB] = buttons.B,
[SButton.ControllerX] = buttons.X,
[SButton.ControllerY] = buttons.Y,
[SButton.LeftStick] = buttons.LeftStick,
[SButton.RightStick] = buttons.RightStick,
[SButton.LeftShoulder] = buttons.LeftShoulder,
[SButton.RightShoulder] = buttons.RightShoulder,
[SButton.ControllerBack] = buttons.Back,
[SButton.ControllerStart] = buttons.Start,
[SButton.BigButton] = buttons.BigButton
};
this.LeftTrigger = triggers.Left;
this.RightTrigger = triggers.Right;
this.LeftStickPos = sticks.Left;
this.RightStickPos = sticks.Right;
}
else
this.ButtonStates = [];
}

/// <inheritdoc />
public GamePadStateBuilder OverrideButtons(IDictionary<SButton, SButtonState> overrides)
{
if (!this.IsConnected)
return this;

foreach (var pair in overrides)
{
bool changed = true;
Expand Down Expand Up @@ -138,10 +127,7 @@ public GamePadStateBuilder OverrideButtons(IDictionary<SButton, SButtonState> ov

// buttons
default:
if (this.ButtonStates.ContainsKey(pair.Key))
this.ButtonStates[pair.Key] = isDown ? ButtonState.Pressed : ButtonState.Released;
else
changed = false;
this.ButtonStates[pair.Key] = isDown ? ButtonState.Pressed : ButtonState.Released;
break;
}

Expand All @@ -155,9 +141,6 @@ public GamePadStateBuilder OverrideButtons(IDictionary<SButton, SButtonState> ov
/// <inheritdoc />
public IEnumerable<SButton> GetPressedButtons()
{
if (!this.IsConnected)
yield break;

// buttons
foreach (Buttons button in this.GetPressedGamePadButtons())
yield return button.ToSButton();
Expand Down Expand Up @@ -213,9 +196,6 @@ public GamePadState GetState()
/// <summary>Get the pressed gamepad buttons.</summary>
private IEnumerable<Buttons> GetPressedGamePadButtons()
{
if (!this.IsConnected)
yield break;

foreach (var pair in this.ButtonStates)
{
if (pair.Value == ButtonState.Pressed && pair.Key.TryGetController(out Buttons button))
Expand Down
4 changes: 2 additions & 2 deletions src/SMAPI/Framework/Input/SInputState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -238,14 +238,14 @@ private bool ApplyOverrides(ISet<SButton> pressed, ISet<SButton> released, GameP
mouseOverrides[button] = newState;
else if (button.TryGetKeyboard(out Keys _))
keyboardOverrides[button] = newState;
else if (controller.IsConnected && button.TryGetController(out Buttons _))
else if (button.TryGetController(out Buttons _))
controllerOverrides[button] = newState;
}

// override states
if (keyboardOverrides.Any())
keyboard.OverrideButtons(keyboardOverrides);
if (controller.IsConnected && controllerOverrides.Any())
if (controllerOverrides.Any())
controller.OverrideButtons(controllerOverrides);
if (mouseOverrides.Any())
mouse.OverrideButtons(mouseOverrides);
Expand Down