111 lines
2.9 KiB
C#
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();
|
|
}
|
|
}
|