Files
slimepire/src/Gameplay/BuildGhost.cs

111 lines
2.9 KiB
C#

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<Nodule, Tube> _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>();
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>();
nodule.Position = Position;
nodule.NoduleResource = GD.Load<NoduleResource>(
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();
}
}