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(); } }