diff options
| author | Matheus <matheus.guedes.mg.m@gmail.com> | 2025-09-14 00:14:25 -0300 |
|---|---|---|
| committer | Matheus <matheus.guedes.mg.m@gmail.com> | 2025-09-14 00:14:25 -0300 |
| commit | 5958d9c071915ab71aea5a5c08d79e88024f6c58 (patch) | |
| tree | 8ab992a1ae055ea501faa48f3fdc778061945ba0 /scripts/InputHandling/CastSpellInputHandler.cs | |
| parent | 539fd4820f37aa54df8878091db9680d89ee027a (diff) | |
The newer scolls: groundrim.
Diffstat (limited to 'scripts/InputHandling/CastSpellInputHandler.cs')
| -rw-r--r-- | scripts/InputHandling/CastSpellInputHandler.cs | 93 |
1 files changed, 93 insertions, 0 deletions
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; + +/// <summary> +/// Esquema de controles para quando o jogador precisar escolher um alvo +/// de feitiço. +/// +/// É bem similar ao InspectorInputHandler. +/// </summary> +public partial class CastSpellInputHandler : BaseInputHandler +{ + private static readonly PackedScene inspectorScene = GD.Load<PackedScene>("res://scenes/Inspector.tscn"); + + private static readonly Godot.Collections.Dictionary<string, Vector2I> 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>(); + + 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<InputHandler>().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<InputHandler>().SetInputHandler(InputHandlers.MainGame); + } + + return action; + } +}
\ No newline at end of file |
