using Godot; using TheLegendOfGustav.Entities.Actors; using TheLegendOfGustav.Entities.Actions; using TheLegendOfGustav.InputHandling; using TheLegendOfGustav.GUI; using TheLegendOfGustav.Time; using TheLegendOfGustav.Utils; namespace TheLegendOfGustav; /// /// Classe principal do jogo. /// Lar da lógica central do jogo. /// public partial class Game : Node { /// /// Definição de um jogador. /// private static readonly PlayerDefinition playerDefinition = GD.Load("res://assets/definitions/actor/Player.tres"); /// /// O jogo possui o mapa. /// private Map.Map Map { get; set; } /// /// Objeto para obter input do usuário. /// private InputHandler InputHandler { get; set; } /// /// Gerenciador de turnos /// private TurnManager TurnManager { get; set; } private Hud hud; [Signal] public delegate void MainMenuRequestedEventHandler(); private SignalBus.EscapeRequestedEventHandler escapeLambda; public override void _Ready() { base._Ready(); escapeLambda = () => EmitSignal(SignalName.MainMenuRequested); SignalBus.Instance.EscapeRequested += escapeLambda; Map = GetNode("Map"); InputHandler = GetNode("InputHandler"); hud = GetNode("HUD"); // O jogador é criado pelo jogo. Player player = new Player(Vector2I.Zero, null, playerDefinition); Camera2D camera = GetNode("Camera2D"); RemoveChild(camera); player.HealthChanged += (int hp, int maxHp) => hud.OnHealthChanged(hp, maxHp); player.ManaChanged += hud.OnManaChanged; player.Died += () => InputHandler.SetInputHandler(InputHandlers.GameOver); player.AddChild(camera); Map.Generate(player); Map.UpdateFOV(player.GridPosition); TurnManager = new(Map); MessageLogData.Instance.AddMessage("Boa sorte!"); } public override void _Notification(int what) { if (what == NotificationPredelete) { if (escapeLambda != null) { SignalBus.Instance.EscapeRequested -= escapeLambda; } } base._Notification(what); } /// /// Método executa aproximadamente 60 vezes por segundo. /// /// public override void _PhysicsProcess(double delta) { base._PhysicsProcess(delta); Player player = Map.MapData.Player; // Pegamos uma ação do usuário Action action = InputHandler.GetAction(player); if (action != null) { TurnManager.InsertPlayerAction(action); } // Computamos um turno. TurnManager.Tick(); } }