using Godot; using Slimepire.Core; using Slimepire.Data; using Slimepire.Gameplay.Nodules; namespace Slimepire.Gameplay; [SceneTree] public partial class BuildGhost : Node2D { private Tube? _tube; private readonly Dictionary _connectedTubes = []; public override void _Ready() { TubeConnectionArea.AreaEntered += TubeConnectionAreaOnAreaEntered; TubeConnectionArea.AreaExited += TubeConnectionAreaOnAreaExited; } private void TubeConnectionAreaOnAreaEntered(Area2D area) { if (area.GetParent() is Nodule nodule) { CreateGhostTube(nodule, area.GlobalPosition); ConnectTubePlayer.Play(); } } private void TubeConnectionAreaOnAreaExited(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 / 2; // TODO WHYYY???? _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 = Instantiator.Instantiate(); nodule.Position = Position; nodule.NoduleResource = GD.Load( GameResources.SimpleNoduleTres.ResourcePath ); GetParent()?.AddChild(nodule); CleanupBuildMode(); } } } private void CleanupBuildMode() { NoduleManager.Instance.Building = false; foreach (var (_, tube) in _connectedTubes) { tube.QueueFree(); } _connectedTubes.Clear(); QueueFree(); GetViewport().SetInputAsHandled(); } }