using Godot; using Slimepire.Gameplay.Components; using Slimepire.Gameplay.Nodules; namespace Slimepire.Gameplay; [SceneTree] public partial class BuildGhost : Node2D { private static readonly PackedScene NoduleScene = GD.Load( "res://src/Gameplay/Nodules/BasicNodule/BasicNodule.tscn" ); private readonly Dictionary _connectedTubes = []; [Export] private TubeConnectionArea _tubeConnectionArea = null!; public override void _Ready() { _tubeConnectionArea.AreaEntered += OnAreaEntered; _tubeConnectionArea.AreaExited += OnAreaExited; } private void OnAreaEntered(Area2D area) { if (area.GetParent() is Nodule nodule) { CreateGhostTube(nodule, nodule.GlobalPosition); ConnectTubePlayer.Play(); } } private void OnAreaExited(Area2D area) { if (area.GetParent() is Nodule nodule) { var tube = _connectedTubes.GetValueOrDefault(nodule); if (tube == null) return; _connectedTubes.Remove(nodule); tube.QueueFree(); DisconnectTubePlayer.Play(); } } private void CreateGhostTube(Nodule connectedNodule, Vector2 pos) { var tube = Instantiator.Instantiate(); tube.Position = pos; _connectedTubes.Add(connectedNodule, tube); GetParent()?.AddChild(tube); } public override void _Process(double delta) { GlobalPosition = GetGlobalMousePosition(); foreach (var (_, tube) in _connectedTubes) { tube.SetTarget(GlobalPosition); } } public override void _UnhandledKeyInput(InputEvent @event) { using (@event) { if (@event is InputEventKey { Keycode: Key.Escape, Pressed: true }) { NoduleManager.Instance.Building = false; QueueFree(); } } } public override void _UnhandledInput(InputEvent @event) { using (@event) { if (@event is InputEventMouseButton { Pressed: true, ButtonIndex: MouseButton.Right }) { CleanupBuildMode(); } if (@event is InputEventMouseButton { Pressed: false, ButtonIndex: MouseButton.Left }) { var nodule = NoduleScene.Instantiate(); nodule.Position = Position; GetParent()?.AddChild(nodule); CleanupBuildMode(); } } } private void CleanupBuildMode() { NoduleManager.Instance.Building = false; foreach (var (_, tube) in _connectedTubes) { tube.QueueFree(); } _connectedTubes.Clear(); QueueFree(); GetViewport().SetInputAsHandled(); } }