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 { get; set; } private Godot.Collections.Dictionary InputHandlerDict { get; set; } = []; private BaseInputHandler SelectedInputHandler { get; set; } 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); } /// /// 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(); } }