Files
GameJamDungeon/Zennysoft.Game.Ma/src/options/InputMapper.cs
T
2025-12-03 23:21:29 -08:00

257 lines
11 KiB
C#

using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using NathanHoad;
using SimpleInjector.Lifestyles;
using System.Collections.Generic;
using System.IO.Abstractions;
using System.Linq;
using Zennysoft.Game.Abstractions;
using Zennysoft.Game.Implementation;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
public partial class InputMapper : Control
{
public override void _Notification(int what) => this.Notify(what);
[Node] public VBoxContainer ActionList { get; set; }
[Node] public KeyboardRemapButton MoveForwardKeyboard { get; set; }
[Node] public JoypadRemapButton MoveForwardController { get; set; }
[Node] public KeyboardRemapButton MoveLeftKeyboard { get; set; }
[Node] public JoypadRemapButton MoveLeftController { get; set; }
[Node] public KeyboardRemapButton MoveRightKeyboard { get; set; }
[Node] public JoypadRemapButton MoveRightController { get; set; }
[Node] public KeyboardRemapButton MoveBackwardKeyboard { get; set; }
[Node] public JoypadRemapButton MoveBackwardController { get; set; }
[Node] public KeyboardRemapButton StrafeLeftKeyboard { get; set; }
[Node] public JoypadRemapButton StrafeLeftController { get; set; }
[Node] public KeyboardRemapButton StrafeRightKeyboard { get; set; }
[Node] public JoypadRemapButton StrafeRightController { get; set; }
[Node] public KeyboardRemapButton AttackKeyboard { get; set; }
[Node] public JoypadRemapButton AttackController { get; set; }
[Node] public KeyboardRemapButton InteractKeyboard { get; set; }
[Node] public JoypadRemapButton InteractController { get; set; }
[Node] public KeyboardRemapButton InventoryKeyboard { get; set; }
[Node] public JoypadRemapButton InventoryController { get; set; }
[Node] public KeyboardRemapButton SortKeyboard { get; set; }
[Node] public JoypadRemapButton SortController { get; set; }
private Button _remappingButton = null;
private InputEvent _remappingAction = null;
private List<JoypadRemapButton> _actionJoyMap = [];
private List<KeyboardRemapButton> _actionKeyMap = [];
private SimpleInjector.Container _container;
[Signal] public delegate void SaveControllerInputEventHandler();
private bool _remappingKeyboard;
private bool _remappingController;
public void OnReady()
{
SetProcessInput(false);
_container = new SimpleInjector.Container();
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.RegisterSingleton<IFileSystem, FileSystem>();
_container.RegisterSingleton<ISaveFileManager, SaveFileManager>();
MoveForwardController.Action = GameInputs.MoveUp;
MoveForwardKeyboard.Action = GameInputs.MoveUp;
MoveLeftController.Action = GameInputs.MoveLeft;
MoveLeftKeyboard.Action = GameInputs.MoveLeft;
MoveRightController.Action = GameInputs.MoveRight;
MoveRightKeyboard.Action = GameInputs.MoveRight;
MoveBackwardController.Action = GameInputs.MoveDown;
MoveBackwardKeyboard.Action = GameInputs.MoveDown;
StrafeLeftController.Action = GameInputs.StrafeLeft;
StrafeLeftKeyboard.Action = GameInputs.StrafeLeft;
StrafeRightController.Action = GameInputs.StrafeRight;
StrafeRightKeyboard.Action = GameInputs.StrafeRight;
AttackController.Action = GameInputs.Attack;
AttackKeyboard.Action = GameInputs.Attack;
InteractController.Action = GameInputs.Interact;
InteractKeyboard.Action = GameInputs.Interact;
InventoryController.Action = GameInputs.Inventory;
InventoryKeyboard.Action = GameInputs.Inventory;
SortController.Action = GameInputs.InventorySort;
SortKeyboard.Action = GameInputs.InventorySort;
MoveForwardController.CancelRemap += CancelRemap;
MoveForwardKeyboard.CancelRemap += CancelRemap;
MoveLeftController.CancelRemap += CancelRemap;
MoveLeftKeyboard.CancelRemap += CancelRemap;
MoveRightController.CancelRemap += CancelRemap;
MoveRightKeyboard.CancelRemap += CancelRemap;
MoveBackwardController.CancelRemap += CancelRemap;
MoveBackwardKeyboard.CancelRemap += CancelRemap;
StrafeLeftController.CancelRemap += CancelRemap;
StrafeLeftKeyboard.CancelRemap += CancelRemap;
StrafeRightController.CancelRemap += CancelRemap;
StrafeRightKeyboard.CancelRemap += CancelRemap;
AttackController.CancelRemap += CancelRemap;
AttackKeyboard.CancelRemap += CancelRemap;
InteractController.CancelRemap += CancelRemap;
InteractKeyboard.CancelRemap += CancelRemap;
InventoryController.CancelRemap += CancelRemap;
InventoryKeyboard.CancelRemap += CancelRemap;
SortController.CancelRemap += CancelRemap;
SortKeyboard.CancelRemap += CancelRemap;
_actionJoyMap.Add(MoveForwardController);
_actionJoyMap.Add(MoveLeftController);
_actionJoyMap.Add(MoveRightController);
_actionJoyMap.Add(MoveBackwardController);
_actionJoyMap.Add(StrafeLeftController);
_actionJoyMap.Add(StrafeRightController);
_actionJoyMap.Add(AttackController);
_actionJoyMap.Add(InteractController);
_actionJoyMap.Add(InventoryController);
_actionJoyMap.Add(SortController);
_actionKeyMap.Add(MoveForwardKeyboard);
_actionKeyMap.Add(MoveLeftKeyboard);
_actionKeyMap.Add(MoveRightKeyboard);
_actionKeyMap.Add(MoveBackwardKeyboard);
_actionKeyMap.Add(StrafeLeftKeyboard);
_actionKeyMap.Add(StrafeRightKeyboard);
_actionKeyMap.Add(AttackKeyboard);
_actionKeyMap.Add(InteractKeyboard);
_actionKeyMap.Add(InventoryKeyboard);
_actionKeyMap.Add(SortKeyboard);
MoveForwardKeyboard.Remap += OnRemap;
MoveForwardController.Remap += OnRemap;
MoveLeftKeyboard.Remap += OnRemap;
MoveLeftController.Remap += OnRemap;
MoveRightKeyboard.Remap += OnRemap;
MoveRightController.Remap += OnRemap;
MoveBackwardKeyboard.Remap += OnRemap;
MoveBackwardController.Remap += OnRemap;
StrafeLeftKeyboard.Remap += OnRemap;
StrafeLeftController.Remap += OnRemap;
StrafeRightKeyboard.Remap += OnRemap;
StrafeRightController.Remap += OnRemap;
AttackKeyboard.Remap += OnRemap;
AttackController.Remap += OnRemap;
InteractKeyboard.Remap += OnRemap;
InteractController.Remap += OnRemap;
InventoryKeyboard.Remap += OnRemap;
InventoryController.Remap += OnRemap;
SortKeyboard.Remap += OnRemap;
SortController.Remap += OnRemap;
VisibilityChanged += InputMapper_VisibilityChanged;
FocusEntered += InputMapper_FocusEntered;
InputHelper.JoypadInputChanged += (string action, InputEvent input) =>
{
if (!_remappingController)
return;
var buttonChanged = _actionJoyMap.SingleOrDefault(x => x.Action == action);
if (buttonChanged != null)
{
buttonChanged.SetProcessInput(false);
buttonChanged.Text = InputHelper.GetLabelForInput(input);
_remappingController = false;
}
var allButtons = _actionKeyMap.Concat<InputMapButton>(_actionJoyMap);
foreach (var button in allButtons)
button.Disabled = false;
};
InputHelper.KeyboardInputChanged += (string action, InputEvent input) =>
{
if (!_remappingKeyboard)
return;
var buttonChanged = _actionKeyMap.SingleOrDefault(x => x.Action == action);
if (buttonChanged != null)
{
buttonChanged.SetProcessInput(false);
buttonChanged.Text = InputHelper.GetLabelForInput(input);
_remappingKeyboard = false;
}
var allButtons = _actionKeyMap.Concat<InputMapButton>(_actionJoyMap);
foreach (var button in allButtons)
button.Disabled = false;
if (!InputHelper.HasJoypad())
foreach (var joyPadButton in _actionJoyMap)
joyPadButton.Disabled = true;
};
if (!InputHelper.HasJoypad())
foreach (var joyPadButton in _actionJoyMap)
joyPadButton.Disabled = true;
}
private void InputMapper_FocusEntered()
{
MoveForwardKeyboard.GrabFocus();
}
private void CancelRemap()
{
var allButtons = _actionKeyMap.Concat<InputMapButton>(_actionJoyMap);
foreach (var button in allButtons)
button.Disabled = false;
}
private void InputMapper_VisibilityChanged()
{
SetProcessInput(Visible);
}
public void LoadControllerInput(string jsonData)
{
InputHelper.DeserializeInputsForActions(jsonData);
InitializeButtonText();
}
public void InitializeButtonText()
{
MoveForwardKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.MoveUp));
MoveForwardController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.MoveUp));
MoveLeftKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.MoveLeft));
MoveLeftController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.MoveLeft));
MoveRightKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.MoveRight));
MoveRightController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.MoveRight));
MoveBackwardKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.MoveDown));
MoveBackwardController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.MoveDown));
StrafeLeftKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.StrafeLeft));
StrafeLeftController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.StrafeLeft));
StrafeRightKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.StrafeRight));
StrafeRightController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.StrafeRight));
AttackKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.Attack));
AttackController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.Attack));
InteractKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.Interact));
InteractController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.Interact));
InventoryKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.Inventory));
InventoryController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.Inventory));
SortKeyboard.Text = InputHelper.GetLabelForInput(InputHelper.GetKeyboardInputForAction(GameInputs.InventorySort));
SortController.Text = InputHelper.GetLabelForInput(InputHelper.GetJoypadInputForAction(GameInputs.InventorySort));
}
private void OnRemap(InputMapButton inputButton)
{
if (_actionJoyMap.Contains(inputButton))
_remappingController = true;
if (_actionKeyMap.Contains(inputButton))
_remappingKeyboard = true;
inputButton.Text = "...";
inputButton.SetProcessInput(true);
var allButtons = _actionKeyMap.Concat<InputMapButton>(_actionJoyMap);
foreach (var button in allButtons)
button.Disabled = true;
ReleaseFocus();
}
}