a bit more stuff

This commit is contained in:
2026-05-31 19:14:19 +02:00
parent 69c941b0e1
commit c9ec6c6c55
14 changed files with 180 additions and 81 deletions

View File

@@ -5,7 +5,7 @@ namespace NodeWar;
public partial class BuildManager : Node public partial class BuildManager : Node
{ {
private bool Building { get; set; } public bool IsBuilding { get; set; }
private Nodule BuildingNodule { get; set; } private Nodule BuildingNodule { get; set; }
@@ -20,7 +20,7 @@ public partial class BuildManager : Node
public override void _Process(double delta) public override void _Process(double delta)
{ {
if (Input.IsActionJustPressed(Scripts.Globals.MyInput.Build) && !Building) if (Input.IsActionJustPressed(Scripts.Globals.MyInput.Build) && !IsBuilding)
{ {
StartBuilding(); StartBuilding();
} }
@@ -30,18 +30,18 @@ public partial class BuildManager : Node
{ {
BuildingNodule = Instantiator.Instantiate<Nodule>(); BuildingNodule = Instantiator.Instantiate<Nodule>();
Building = true; IsBuilding = true;
BuildingNodule.BuildMode = true; BuildingNodule.BuildMode = true;
BuildingNodule.NoduleBuilt += () => BuildingNodule.NoduleBuilt += () =>
{ {
Building = false; IsBuilding = false;
BuildingNodule = null; BuildingNodule = null;
}; };
BuildingNodule.BuildingCanceled += () => BuildingNodule.BuildingCanceled += () =>
{ {
Building = false; IsBuilding = false;
BuildingNodule = null; BuildingNodule = null;
}; };

View File

@@ -24,9 +24,6 @@ public partial class ConnectionArea : Area2D
case Nodule nodule: case Nodule nodule:
HandleNoduleEntered(nodule); HandleNoduleEntered(nodule);
break; break;
case ConnectionArea connectionArea:
HandleNoduleEntered(connectionArea.GetParent() as Nodule);
break;
} }
return; return;
@@ -49,9 +46,6 @@ public partial class ConnectionArea : Area2D
case Nodule nodule: case Nodule nodule:
HandleNoduleExited(nodule); HandleNoduleExited(nodule);
break; break;
case ConnectionArea connectionArea:
HandleNoduleExited(connectionArea.GetParent() as Nodule);
break;
} }
return; return;
@@ -66,4 +60,9 @@ public partial class ConnectionArea : Area2D
EmitSignalNoduleExited(newNodule); EmitSignalNoduleExited(newNodule);
} }
} }
public float GetRadius()
{
return ((CircleShape2D)_.CollisionShape2D.Shape).Radius;
}
} }

View File

@@ -2,16 +2,11 @@
[ext_resource type="Script" uid="uid://w5ba3yo120vc" path="res://ConnectionArea.cs" id="1_djo5v"] [ext_resource type="Script" uid="uid://w5ba3yo120vc" path="res://ConnectionArea.cs" id="1_djo5v"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_bv6fd"] [sub_resource type="CircleShape2D" id="CircleShape2D_djo5v"]
size = Vector2(150, 150) radius = 300.0
[node name="ConnectionArea" type="Area2D" unique_id=943082837] [node name="ConnectionArea" type="Area2D" unique_id=943082837]
script = ExtResource("1_djo5v") script = ExtResource("1_djo5v")
[node name="Collision" type="CollisionShape2D" parent="." unique_id=260055498] [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=804584423]
rotation = 0.7853982 shape = SubResource("CircleShape2D_djo5v")
scale = Vector2(0.99999994, 0.99999994)
shape = SubResource("RectangleShape2D_bv6fd")
[node name="Collision2" type="CollisionShape2D" parent="." unique_id=1676208642]
shape = SubResource("RectangleShape2D_bv6fd")

28
EnergyProducer.cs Normal file
View File

@@ -0,0 +1,28 @@
using Godot;
using NodeWar.scripts;
using NodeWar.Scripts;
namespace NodeWar;
public partial class EnergyProducer : Node
{
[Export]
public float EnergyCapacity = 100;
[Export]
public float EnergyStored = 0;
[Export]
public float EnergyGenerationRate = 1.0f;
public override void _Ready()
{
EnergyManager.Instance.EnergyProducers.Add(this);
}
public override void _Process(double delta)
{
EnergyStored += EnergyGenerationRate * delta.ToFloat();
EnergyStored = Mathf.Clamp(EnergyStored, 0, EnergyCapacity);
}
}

1
EnergyProducer.cs.uid Normal file
View File

@@ -0,0 +1 @@
uid://labc6hameh2q

6
EnergyProducer.tscn Normal file
View File

@@ -0,0 +1,6 @@
[gd_scene format=3 uid="uid://b0vhqymerr5mx"]
[ext_resource type="Script" uid="uid://labc6hameh2q" path="res://EnergyProducer.cs" id="1_vpkbi"]
[node name="EnergyProducer" type="Node" unique_id=30257502]
script = ExtResource("1_vpkbi")

View File

@@ -16,13 +16,15 @@ public partial class Nodule : Area2D
{ {
private const float GrowthFactor = 0.01f; private const float GrowthFactor = 0.01f;
private bool _growAreaInside;
private bool _holdInsideGrowArea;
private Vector2 _lastPosition;
private bool _freezeMove;
[Export] [Export]
private NoduleType _noduleType; private NoduleType _noduleType;
private bool _growAreaInside; private float _maxRadius;
[Export]
public float MaxRadius { get; set; } = 360;
[Export] [Export]
public bool BuildMode { get; set; } = false; public bool BuildMode { get; set; } = false;
@@ -35,6 +37,10 @@ public partial class Nodule : Area2D
public List<Nodule> ConnectedNodules { get; } = []; public List<Nodule> ConnectedNodules { get; } = [];
public Nodule ParentNoduleWhileBuilding;
public Nodule ChildNoduleWhileBuilding;
[Signal] [Signal]
public delegate void NoduleBuiltEventHandler(); public delegate void NoduleBuiltEventHandler();
@@ -43,6 +49,7 @@ public partial class Nodule : Area2D
public override void _Ready() public override void _Ready()
{ {
_maxRadius = _.ConnectionArea.GetRadius();
_.ConnectionArea.NoduleEntered += HandleNoduleEntered; _.ConnectionArea.NoduleEntered += HandleNoduleEntered;
_.ConnectionArea.NoduleExited += HandleNoduleExited; _.ConnectionArea.NoduleExited += HandleNoduleExited;
@@ -52,7 +59,6 @@ public partial class Nodule : Area2D
Modulate = Colors.Red; Modulate = Colors.Red;
_.Gfx.Get().Scale = new Vector2(2, 2); _.Gfx.Get().Scale = new Vector2(2, 2);
_.BaseCollision.Disabled = false;
BuildNode(); BuildNode();
break; break;
@@ -67,11 +73,24 @@ public partial class Nodule : Area2D
public override void _Process(double delta) public override void _Process(double delta)
{ {
// TODO: StateMachine?
if (BuildMode) if (BuildMode)
{ {
GlobalPosition = GetGlobalMousePosition(); var distanceToParent =
GetGlobalMousePosition() - ParentNoduleWhileBuilding.GlobalPosition;
if (Input.IsActionJustPressed(Scripts.Globals.MyInput.MouseLeft)) if (distanceToParent.Length() > _maxRadius)
{
GlobalPosition =
ParentNoduleWhileBuilding.GlobalPosition
+ distanceToParent.Normalized() * _maxRadius;
}
else
{
GlobalPosition = GetGlobalMousePosition();
}
if (Input.IsActionJustReleased(Scripts.Globals.MyInput.MouseLeft))
{ {
BuildNode(); BuildNode();
} }
@@ -80,21 +99,21 @@ public partial class Nodule : Area2D
{ {
EmitSignalBuildingCanceled(); EmitSignalBuildingCanceled();
BuildMode = false; BuildMode = false;
BuildManager.Instance.IsBuilding = false;
QueueFree(); QueueFree();
} }
} }
else else
{ {
if ( if (Input.IsActionJustPressed(Scripts.Globals.MyInput.MouseLeft) && _growAreaInside)
Input.IsActionJustPressed(Scripts.Globals.MyInput.MouseLeft)
&& _growAreaInside
&& !BuildMode
)
{ {
var newNodule = Instantiator.Instantiate<Nodule>(); _holdInsideGrowArea = true;
newNodule.BuildMode = true; }
GetParent().AddChild(newNodule);
newNodule.GlobalPosition = GlobalPosition; if (Input.IsActionJustReleased(Scripts.Globals.MyInput.MouseLeft) && _growAreaInside)
{
_holdInsideGrowArea = false;
} }
Age += GrowthFactor * delta.ToFloat(); Age += GrowthFactor * delta.ToFloat();
@@ -105,13 +124,15 @@ public partial class Nodule : Area2D
// TODO: replace with line2d? // TODO: replace with line2d?
QueueRedraw(); QueueRedraw();
_lastPosition = GlobalPosition;
} }
public override void _Draw() public override void _Draw()
{
foreach (var nodule in ConnectedNodules)
{ {
if (BuildMode) if (BuildMode)
{
foreach (var nodule in ConnectedNodules)
{ {
DrawDashedLine( DrawDashedLine(
Vector2.Zero, Vector2.Zero,
@@ -123,16 +144,6 @@ public partial class Nodule : Area2D
); );
} }
} }
var value = 200 * Age;
if (!BuildMode)
{
DrawRect(
new Rect2(-value / 2, -value / 2, value, value),
new Color(Colors.WhiteSmoke, 0.4f)
);
}
} }
private void HandleNoduleEntered(Nodule nodule) private void HandleNoduleEntered(Nodule nodule)
@@ -148,7 +159,12 @@ public partial class Nodule : Area2D
private void BuildNode() private void BuildNode()
{ {
EmitSignalNoduleBuilt(); EmitSignalNoduleBuilt();
BuildMode = false; BuildMode = false;
ChildNoduleWhileBuilding = null;
// Weird architecture...
BuildManager.Instance.IsBuilding = false;
// try connecting built nodule to connected ones // try connecting built nodule to connected ones
foreach (var connectedNodule in ConnectedNodules) foreach (var connectedNodule in ConnectedNodules)
@@ -163,7 +179,30 @@ public partial class Nodule : Area2D
_.GrowArea.Get().MouseExited += () => _.GrowArea.Get().MouseExited += () =>
{ {
if (_holdInsideGrowArea)
{
StartBuilding();
_holdInsideGrowArea = false;
}
_growAreaInside = false; _growAreaInside = false;
}; };
} }
private void StartBuilding()
{
GD.Print("START BUILDING");
if (BuildManager.Instance.IsBuilding)
return;
BuildManager.Instance.IsBuilding = true;
var newNodule = Instantiator.Instantiate<Nodule>();
GetParent().AddChild(newNodule);
newNodule.BuildMode = true;
newNodule.GlobalPosition = GlobalPosition;
newNodule.ParentNoduleWhileBuilding = this;
ChildNoduleWhileBuilding = newNodule;
}
} }

29
Scripts/EnergyManager.cs Normal file
View File

@@ -0,0 +1,29 @@
using System.Collections.Generic;
using System.Linq;
using Godot;
namespace NodeWar.Scripts;
[Singleton]
public partial class EnergyManager
{
public List<EnergyProducer> EnergyProducers { get; set; } = []; // TODO: privat set
public float GetTotalEnergyCapacity()
{
// TODO: cache + dirty flag
return EnergyProducers.Sum(energyProducer => energyProducer.EnergyCapacity);
}
public float GetEnergyGeneration()
{
// TODO: cache + dirty flag
return EnergyProducers.Sum(energyProducer => energyProducer.EnergyGenerationRate);
}
public float GetEnergyStored()
{
// TODO: cache + dirty flag
return EnergyProducers.Sum(energyProducer => energyProducer.EnergyStored);
}
}

View File

@@ -0,0 +1 @@
uid://lmswu03qs5f3

View File

@@ -1,39 +1,34 @@
using System.Globalization; using System.Globalization;
using Godot; using Godot;
using GodotUtilities;
using NodeWar.Scripts.Globals; using NodeWar.Scripts.Globals;
namespace NodeWar.Scripts.Gui; namespace NodeWar.Scripts.Gui;
[Scene] [SceneTree]
public partial class Gui : Control public partial class Gui : Control
{ {
[Node]
private Label _infoLabel;
[Node]
private Label _energyGeneration;
[Node]
private Label _energyConsumption;
[Node]
private Label _energyStorage;
public override void _Ready() public override void _Ready()
{ {
_energyGeneration.Text = 1f.ToString(CultureInfo.InvariantCulture); base._Ready();
_energyConsumption.Text = 0f.ToString(CultureInfo.InvariantCulture);
_energyStorage.Text = 100f.ToString(CultureInfo.InvariantCulture);
Autoloads.EventBus.SelectionChanged += text => _infoLabel.Text = text; EnergyGeneration.Text = 1f.ToString(CultureInfo.InvariantCulture);
EnergyConsumption.Text = 0f.ToString(CultureInfo.InvariantCulture);
EnergyCapacity.Text = 100f.ToString(CultureInfo.InvariantCulture);
Autoloads.EventBus.SelectionChanged += text => _InfoLabel.Text = text;
} }
public override void _Notification(int what) public override void _Process(double delta)
{ {
if (what == NotificationSceneInstantiated) EnergyGeneration.Text = EnergyManager
{ .Instance.GetEnergyGeneration()
WireNodes(); .ToString(CultureInfo.InvariantCulture);
}
EnergyCapacity.Text = EnergyManager
.Instance.GetTotalEnergyCapacity()
.ToString(CultureInfo.InvariantCulture);
EnergyProgressBar.MaxValue = EnergyManager.Instance.GetTotalEnergyCapacity();
EnergyProgressBar.Value = EnergyManager.Instance.GetEnergyStored();
} }
} }

View File

@@ -64,10 +64,9 @@ layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
size_flags_vertical = 4 size_flags_vertical = 4
theme_override_styles/fill = SubResource("StyleBoxFlat_80edf") theme_override_styles/fill = SubResource("StyleBoxFlat_80edf")
value = 37.15 value = 36.59
show_percentage = false
[node name="EnergyStorage" type="Label" parent="Top/MarginContainer/HBoxContainer" unique_id=1992827443] [node name="EnergyCapacity" type="Label" parent="Top/MarginContainer/HBoxContainer" unique_id=1992827443]
unique_name_in_owner = true unique_name_in_owner = true
custom_minimum_size = Vector2(80, 0) custom_minimum_size = Vector2(80, 0)
layout_mode = 2 layout_mode = 2

View File

@@ -8,6 +8,7 @@
[ext_resource type="Script" uid="uid://dl1t88tthmwts" path="res://addons/curved_lines_2d/scalable_arc_list.gd" id="6_c6i3y"] [ext_resource type="Script" uid="uid://dl1t88tthmwts" path="res://addons/curved_lines_2d/scalable_arc_list.gd" id="6_c6i3y"]
[ext_resource type="Script" uid="uid://rirna2vebukw" path="res://addons/strategy_cam/strategy_camera.gd" id="7_c2ibq"] [ext_resource type="Script" uid="uid://rirna2vebukw" path="res://addons/strategy_cam/strategy_camera.gd" id="7_c2ibq"]
[ext_resource type="PackedScene" uid="uid://cb07jvtr8x7i1" path="res://Nodule.tscn" id="8_j4qnp"] [ext_resource type="PackedScene" uid="uid://cb07jvtr8x7i1" path="res://Nodule.tscn" id="8_j4qnp"]
[ext_resource type="PackedScene" uid="uid://b0vhqymerr5mx" path="res://EnergyProducer.tscn" id="9_03owx"]
[sub_resource type="Curve2D" id="Curve2D_5vw27"] [sub_resource type="Curve2D" id="Curve2D_5vw27"]
resource_local_to_scene = true resource_local_to_scene = true
@@ -56,10 +57,13 @@ polygon = PackedVector2Array(-13.812602, -13.812602, 13.812602, -13.812602, 13.8
metadata/_edit_lock_ = true metadata/_edit_lock_ = true
[node name="StrategyCamera" type="Camera2D" parent="." unique_id=706618209] [node name="StrategyCamera" type="Camera2D" parent="." unique_id=706618209]
zoom = Vector2(0.205, 0.205)
limit_enabled = false limit_enabled = false
script = ExtResource("7_c2ibq") script = ExtResource("7_c2ibq")
translation_speed = 300.0 translation_speed = 300.0
metadata/_custom_type_script = "uid://rirna2vebukw" metadata/_custom_type_script = "uid://rirna2vebukw"
[node name="Nodule" parent="." unique_id=698496795 instance=ExtResource("8_j4qnp")] [node name="Base" parent="." unique_id=698496795 instance=ExtResource("8_j4qnp")]
_noduleType = 0 _noduleType = 0
[node name="EnergyProducer" parent="Base" unique_id=30257502 instance=ExtResource("9_03owx")]

View File

@@ -7,8 +7,8 @@
[ext_resource type="Script" uid="uid://dlbv4pit17dnu" path="res://addons/curved_lines_2d/scalable_arc.gd" id="3_fnyqb"] [ext_resource type="Script" uid="uid://dlbv4pit17dnu" path="res://addons/curved_lines_2d/scalable_arc.gd" id="3_fnyqb"]
[ext_resource type="Script" uid="uid://dl1t88tthmwts" path="res://addons/curved_lines_2d/scalable_arc_list.gd" id="4_qiyup"] [ext_resource type="Script" uid="uid://dl1t88tthmwts" path="res://addons/curved_lines_2d/scalable_arc_list.gd" id="4_qiyup"]
[sub_resource type="CircleShape2D" id="CircleShape2D_k6tuy"] [sub_resource type="CircleShape2D" id="CircleShape2D_0cigu"]
radius = 140.0 radius = 12.0
[sub_resource type="Curve2D" id="Curve2D_272bh"] [sub_resource type="Curve2D" id="Curve2D_272bh"]
resource_local_to_scene = true resource_local_to_scene = true
@@ -24,15 +24,14 @@ script = ExtResource("4_qiyup")
[sub_resource type="CircleShape2D" id="CircleShape2D_8l2gl"] [sub_resource type="CircleShape2D" id="CircleShape2D_8l2gl"]
radius = 18.027756 radius = 18.027756
[node name="Nodule" type="Area2D" unique_id=698496795] [node name="Nodule" type="Area2D" unique_id=540162896]
script = ExtResource("1_beybw") script = ExtResource("1_beybw")
_noduleType = 1 _noduleType = 1
Age = 0.5 Age = 0.5
RootScene = ExtResource("2_k6tuy") RootScene = ExtResource("2_k6tuy")
[node name="BaseCollision" type="CollisionShape2D" parent="." unique_id=1607878878] [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1698228409]
shape = SubResource("CircleShape2D_k6tuy") shape = SubResource("CircleShape2D_0cigu")
disabled = true
[node name="ConnectionArea" parent="." unique_id=943082837 instance=ExtResource("3_0cigu")] [node name="ConnectionArea" parent="." unique_id=943082837 instance=ExtResource("3_0cigu")]

View File

@@ -32,6 +32,10 @@ EventBus="*uid://bibq3e4nkwiwv"
project/assembly_name="Node War" project/assembly_name="Node War"
[editor]
naming/scene_name_casing=1
[editor_plugins] [editor_plugins]
enabled=PackedStringArray("res://addons/curved_lines_2d/plugin.cfg", "res://addons/strategy_cam/plugin.cfg") enabled=PackedStringArray("res://addons/curved_lines_2d/plugin.cfg", "res://addons/strategy_cam/plugin.cfg")