Files
slimepire/src/Gameplay/BuildGhost.cs
2026-06-24 13:21:16 +02:00

110 lines
2.8 KiB
C#

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<PackedScene>(
"res://src/Gameplay/Nodules/BasicNodule/BasicNodule.tscn"
);
private readonly Dictionary<Nodule, Tube> _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>();
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>();
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();
}
}