192 lines
9.0 KiB
C#
192 lines
9.0 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 : PanelContainer
|
|
{
|
|
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;
|
|
private ISaveFileManager _saveFileManager;
|
|
|
|
[Signal] public delegate void SaveControllerInputEventHandler();
|
|
|
|
public void OnReady()
|
|
{
|
|
_container = new SimpleInjector.Container();
|
|
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
|
|
_container.RegisterSingleton<IFileSystem, FileSystem>();
|
|
_container.RegisterSingleton<ISaveFileManager, SaveFileManager>();
|
|
_saveFileManager = _container.GetInstance<ISaveFileManager>();
|
|
|
|
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;
|
|
|
|
_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;
|
|
|
|
InputHelper.JoypadInputChanged += (string action, InputEvent input) =>
|
|
{
|
|
var buttonChanged = _actionJoyMap.SingleOrDefault(x => x.Action == action);
|
|
if (buttonChanged != null)
|
|
{
|
|
buttonChanged.SetProcessInput(false);
|
|
buttonChanged.Text = InputHelper.GetLabelForInput(input);
|
|
}
|
|
var allButtons = _actionKeyMap.Concat<InputMapButton>(_actionJoyMap);
|
|
foreach (var button in allButtons)
|
|
button.Disabled = false;
|
|
};
|
|
|
|
InputHelper.KeyboardInputChanged += (string action, InputEvent input) =>
|
|
{
|
|
var buttonChanged = _actionKeyMap.SingleOrDefault(x => x.Action == action);
|
|
if (buttonChanged != null)
|
|
{
|
|
buttonChanged.SetProcessInput(false);
|
|
buttonChanged.Text = InputHelper.GetLabelForInput(input);
|
|
}
|
|
var allButtons = _actionKeyMap.Concat<InputMapButton>(_actionJoyMap);
|
|
foreach (var button in allButtons)
|
|
button.Disabled = false;
|
|
};
|
|
}
|
|
|
|
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)
|
|
{
|
|
inputButton.Text = "...";
|
|
inputButton.SetProcessInput(true);
|
|
var allButtons = _actionKeyMap.Concat<InputMapButton>(_actionJoyMap);
|
|
foreach (var button in allButtons)
|
|
button.Disabled = true;
|
|
ReleaseFocus();
|
|
}
|
|
}
|