This commit is contained in:
2026-05-30 01:05:14 +02:00
parent 9c7c414bc9
commit f2b3989910
19 changed files with 266 additions and 144 deletions

100
Nodule.cs
View File

@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using Godot;
using GodotUtilities;
using NodeWar.scripts;
namespace NodeWar;
@@ -12,7 +11,7 @@ public enum NoduleType
Connector,
}
[Scene]
[SceneTree]
public partial class Nodule : Area2D
{
private const float GrowthFactor = 0.01f;
@@ -20,6 +19,8 @@ public partial class Nodule : Area2D
[Export]
private NoduleType _noduleType;
private bool _growAreaInside;
[Export]
public float MaxRadius { get; set; } = 360;
@@ -32,7 +33,7 @@ public partial class Nodule : Area2D
[Export]
public PackedScene RootScene { get; set; }
public List<Nodule> ConnectedNodules { get; set; } = [];
public List<Nodule> ConnectedNodules { get; } = [];
[Signal]
public delegate void NoduleBuiltEventHandler();
@@ -40,23 +41,20 @@ public partial class Nodule : Area2D
[Signal]
public delegate void BuildingCanceledEventHandler();
[Node]
private Node2D _gfx;
[Node]
private CollisionShape2D _baseCollision;
public override void _Ready()
{
AreaEntered += OnAreaEntered;
AreaExited += OnAreaExited;
_.ConnectionArea.NoduleEntered += HandleNoduleEntered;
_.ConnectionArea.NoduleExited += HandleNoduleExited;
switch (_noduleType)
{
case NoduleType.Base:
_gfx.Scale = new Vector2(2, 2);
Modulate = Colors.Red;
_baseCollision.Disabled = false;
_.Gfx.Get().Scale = new Vector2(2, 2);
_.BaseCollision.Disabled = false;
BuildNode();
break;
case NoduleType.Connector:
break;
@@ -67,44 +65,15 @@ public partial class Nodule : Area2D
QueueRedraw();
}
private void OnAreaEntered(Area2D area)
{
if (area is Nodule nodule)
{
if (nodule.BuildMode)
{
return;
}
ConnectedNodules.Add(nodule);
}
}
private void OnAreaExited(Area2D area)
{
if (area is Nodule nodule)
{
if (nodule.BuildMode)
{
return;
}
ConnectedNodules.Remove(nodule);
}
}
public override void _Process(double delta)
{
if (BuildMode)
{
GlobalPosition = GetGlobalMousePosition();
if (Input.IsMouseButtonPressed(MouseButton.Left))
if (Input.IsActionJustPressed(MyInput.MouseLeft))
{
EmitSignalNoduleBuilt();
BuildMode = false;
MouseEntered += OnMouseEntered;
BuildNode();
}
if (Input.IsMouseButtonPressed(MouseButton.Right))
@@ -116,6 +85,14 @@ public partial class Nodule : Area2D
}
else
{
if (Input.IsActionJustPressed(MyInput.MouseLeft) && _growAreaInside && !BuildMode)
{
var newNodule = Instantiator.Instantiate<Nodule>();
newNodule.BuildMode = true;
GetParent().AddChild(newNodule);
newNodule.GlobalPosition = GlobalPosition;
}
Age += GrowthFactor * delta.ToFloat();
Age = MathF.Min(Age, 1);
@@ -126,11 +103,6 @@ public partial class Nodule : Area2D
QueueRedraw();
}
private void OnMouseEntered()
{
GD.Print("Mouse entered");
}
public override void _Draw()
{
foreach (var nodule in ConnectedNodules)
@@ -159,11 +131,35 @@ public partial class Nodule : Area2D
}
}
public override void _Notification(int what)
private void HandleNoduleEntered(Nodule nodule)
{
if (what == NotificationSceneInstantiated)
ConnectedNodules.Add(nodule);
}
private void HandleNoduleExited(Nodule nodule)
{
ConnectedNodules.Remove(nodule);
}
private void BuildNode()
{
EmitSignalNoduleBuilt();
BuildMode = false;
// try connecting built nodule to connected ones
foreach (var connectedNodule in ConnectedNodules)
{
WireNodes();
BuildManager.Instance.RegisterConnection(this, connectedNodule);
}
_.GrowArea.Get().MouseEntered += () =>
{
_growAreaInside = true;
};
_.GrowArea.Get().MouseExited += () =>
{
_growAreaInside = false;
};
}
}