using Godot;
using TheLegendOfGustav.Entities.Actions;
using TheLegendOfGustav.Entities.Actors;
using TheLegendOfGustav.Utils;
using TheLengendOfGustav.InputHandling;
namespace TheLegendOfGustav.InputHandling;
public enum InputHandlers
{
MainGame,
GameOver,
Inspect,
Pickup,
Inventory,
CastSpell,
SpellMenu
}
///
/// Máquina de estado que obtém ações do usuário conforme o estado atual do jogo.
///
public partial class InputHandler : Node
{
[Export]
private InputHandlers startingInputHandler;
private Godot.Collections.Dictionary inputHandlerDict = [];
private BaseInputHandler selectedInputHandler;
public override void _Ready()
{
base._Ready();
// Controles para quando o jogador está vivo e jogando normalmente.
inputHandlerDict.Add(InputHandlers.MainGame, GetNode("MainGameInputHandler"));
// Controles para quando o jogador está morto.
inputHandlerDict.Add(InputHandlers.GameOver, GetNode("GameOverInputHandler"));
// Controles para observar o cenário
inputHandlerDict.Add(InputHandlers.Inspect, GetNode("InspectInputHandler"));
// Controles para pegar um item do chão.
inputHandlerDict.Add(InputHandlers.Pickup, GetNode("PickupInputHandler"));
// Controles para quando o inventário for aberto.
inputHandlerDict.Add(InputHandlers.Inventory, GetNode("InventoryInputHandler"));
// Controles para quando o jogador precisar escolher um alvo de feitiço.
inputHandlerDict.Add(InputHandlers.CastSpell, GetNode("CastSpellInputHandler"));
// Controles para quando o menu de feitiços for aberto.
inputHandlerDict.Add(InputHandlers.SpellMenu, GetNode("SpellMenuInputHandler"));
SetInputHandler(startingInputHandler);
SignalBus.Instance.CommandInputHandler += SetInputHandler;
}
public Action GetAction(Player player)
{
return selectedInputHandler.GetAction(player);
}
public override void _Notification(int what)
{
if (what == NotificationPredelete)
{
SignalBus.Instance.CommandInputHandler -= SetInputHandler;
}
base._Notification(what);
}
///
/// Define o esquema de controle atual do jogo
/// para o estado informado.
///
/// Estado do jogo.
public void SetInputHandler(InputHandlers inputhandler)
{
selectedInputHandler?.Exit();
selectedInputHandler = inputHandlerDict[inputhandler];
selectedInputHandler.Enter();
}
}