From 5958d9c071915ab71aea5a5c08d79e88024f6c58 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 14 Sep 2025 00:14:25 -0300 Subject: The newer scolls: groundrim. --- scripts/InputHandling/CastSpellInputHandler.cs | 93 ++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 scripts/InputHandling/CastSpellInputHandler.cs (limited to 'scripts/InputHandling/CastSpellInputHandler.cs') diff --git a/scripts/InputHandling/CastSpellInputHandler.cs b/scripts/InputHandling/CastSpellInputHandler.cs new file mode 100644 index 0000000..1c5d005 --- /dev/null +++ b/scripts/InputHandling/CastSpellInputHandler.cs @@ -0,0 +1,93 @@ +using Godot; +using TheLegendOfGustav.Entities.Actors; +using TheLegendOfGustav.Entities.Actions; +using TheLegendOfGustav.Utils; + +using TheLegendOfGustav.InputHandling; +using TheLegendOfGustav.Map; +using TheLegendOfGustav.Magic; + +namespace TheLengendOfGustav.InputHandling; + +/// +/// Esquema de controles para quando o jogador precisar escolher um alvo +/// de feitiço. +/// +/// É bem similar ao InspectorInputHandler. +/// +public partial class CastSpellInputHandler : BaseInputHandler +{ + private static readonly PackedScene inspectorScene = GD.Load("res://scenes/Inspector.tscn"); + + private static readonly Godot.Collections.Dictionary directions = new() + { + {"walk-up", Vector2I.Up}, + {"walk-down", Vector2I.Down}, + {"walk-left", Vector2I.Left}, + {"walk-right", Vector2I.Right}, + {"walk-up-right", Vector2I.Up + Vector2I.Right}, + {"walk-up-left", Vector2I.Up + Vector2I.Left}, + {"walk-down-right", Vector2I.Down + Vector2I.Right}, + {"walk-down-left", Vector2I.Down + Vector2I.Left}, + }; + + private Inspector inspector = null; + private SpellResource selectedSpell = null; + [Export] + private Map map; + + public override void _Ready() + { + base._Ready(); + + // O jogador informa qual feitiço será usado. + SignalBus.Instance.PlayerSpellChooseLocation += (SpellResource spell) => selectedSpell = spell; + } + + public override void Enter() + { + inspector = inspectorScene.Instantiate(); + + inspector.GridPosition = map.MapData.Player.GridPosition; + + map.AddChild(inspector); + } + + public override void Exit() + { + selectedSpell = null; + inspector.QueueFree(); + } + + + public override Action GetAction(Player player) + { + Action action = null; + + foreach (var direction in directions) + { + if (Input.IsActionJustPressed(direction.Key)) + { + inspector.Walk(direction.Value); + } + } + + if (selectedSpell != null && Input.IsActionJustPressed("ui_accept")) + { + action = new SpellAction(player, inspector.GridPosition - player.GridPosition, selectedSpell); + + GetParent().SetInputHandler(InputHandlers.MainGame); + } + + // Se o jogador cancelar a seleção, + // Mandamos um sinal avisando que o feitiço não foi executado com sucesso. + // Pergaminhos usam esta informação. + if (Input.IsActionJustPressed("quit")) + { + SignalBus.Instance.EmitSignal(SignalBus.SignalName.PlayerSpellCast, false); + GetParent().SetInputHandler(InputHandlers.MainGame); + } + + return action; + } +} \ No newline at end of file -- cgit v1.2.3