From 9a6566a1786119119116967b0ba35967330114af Mon Sep 17 00:00:00 2001 From: Jens Becker Date: Mon, 22 Jun 2026 23:15:09 +0200 Subject: [PATCH] decisions decisions decisions --- Slimepire.sln.DotSettings.user | 1 + kanban_tasks_data.kanban | 7 +- src/Gameplay/BuildGhost.cs | 42 ++++---- src/Gameplay/BuildGhost.tscn | 20 ++-- src/Gameplay/Nodules/Components/GrowArea.cs | 57 ++++++++++ .../Nodules/Components/GrowArea.cs.uid | 1 + src/Gameplay/Nodules/Components/GrowArea.tscn | 13 +++ .../Nodules/Components/TubeConnectionArea.cs | 31 ++++++ .../Components/TubeConnectionArea.cs.uid | 1 + .../Components/TubeConnectionArea.tscn | 15 +++ src/Gameplay/Nodules/Nodule.cs | 102 +++--------------- src/Gameplay/Nodules/Nodule.tscn | 26 ++--- src/Gameplay/Tube.tscn | 12 +-- src/Levels/DemoLevel.tscn | 2 - 14 files changed, 174 insertions(+), 156 deletions(-) create mode 100644 src/Gameplay/Nodules/Components/GrowArea.cs create mode 100644 src/Gameplay/Nodules/Components/GrowArea.cs.uid create mode 100644 src/Gameplay/Nodules/Components/GrowArea.tscn create mode 100644 src/Gameplay/Nodules/Components/TubeConnectionArea.cs create mode 100644 src/Gameplay/Nodules/Components/TubeConnectionArea.cs.uid create mode 100644 src/Gameplay/Nodules/Components/TubeConnectionArea.tscn diff --git a/Slimepire.sln.DotSettings.user b/Slimepire.sln.DotSettings.user index a5195fb..2c38479 100644 --- a/Slimepire.sln.DotSettings.user +++ b/Slimepire.sln.DotSettings.user @@ -1,4 +1,5 @@  ForceIncluded + ForceIncluded ForceIncluded ForceIncluded \ No newline at end of file diff --git a/kanban_tasks_data.kanban b/kanban_tasks_data.kanban index ebf28db..6169d50 100644 --- a/kanban_tasks_data.kanban +++ b/kanban_tasks_data.kanban @@ -11,7 +11,6 @@ "uuid": "a2238a3b-e854-43e3-9655-fc856d21892b", "title": "Todo", "tasks": [ - "e2e29c87-042f-49e3-9c98-7ca6b258bcb7", "36c8edc5-2708-440d-9bce-eaac534c3d84", "49ef942e-e48b-4e79-9b61-756e061a0e1d", "3159b7fd-92d2-44e1-ab42-99e871e6fc77", @@ -21,7 +20,9 @@ { "uuid": "e8652da7-7445-495d-8b60-2d303de6224a", "title": "Doing", - "tasks": [] + "tasks": [ + "e2e29c87-042f-49e3-9c98-7ca6b258bcb7" + ] }, { "uuid": "7362331b-07bd-4057-830f-780196f510be", @@ -82,7 +83,7 @@ }, { "uuid": "e2e29c87-042f-49e3-9c98-7ca6b258bcb7", - "title": "Nodules in einzelnen Scenes anstatt Resources und so", + "title": "Refactor Nodules", "description": "", "category": "4bec2406-dc3d-416b-b6c4-d8fd7425b2b5", "steps": [] diff --git a/src/Gameplay/BuildGhost.cs b/src/Gameplay/BuildGhost.cs index 63b33ba..62ab3f4 100644 --- a/src/Gameplay/BuildGhost.cs +++ b/src/Gameplay/BuildGhost.cs @@ -1,7 +1,6 @@ using Godot; -using Slimepire.Core; -using Slimepire.Data; using Slimepire.Gameplay.Nodules; +using Slimepire.Gameplay.Nodules.Components; namespace Slimepire.Gameplay; @@ -11,33 +10,30 @@ public partial class BuildGhost : Node2D private Tube? _tube; private readonly Dictionary _connectedTubes = []; + [Export] + private TubeConnectionArea _tubeConnectionArea = null!; + public override void _Ready() { - TubeConnectionArea.AreaEntered += TubeConnectionAreaOnAreaEntered; - TubeConnectionArea.AreaExited += TubeConnectionAreaOnAreaExited; + _tubeConnectionArea.ConnectionAdded += ConnectionAdded; + _tubeConnectionArea.ConnectionRemoved += ConnectionRemoved; } - private void TubeConnectionAreaOnAreaEntered(Area2D area) + private void ConnectionAdded(Nodule nodule) { - if (area.GetParent() is Nodule nodule) - { - CreateGhostTube(nodule, area.GlobalPosition); - ConnectTubePlayer.Play(); - } + CreateGhostTube(nodule, nodule.GlobalPosition); + ConnectTubePlayer.Play(); } - private void TubeConnectionAreaOnAreaExited(Area2D area) + private void ConnectionRemoved(Nodule nodule) { - if (area.GetParent() is Nodule nodule) - { - var tube = _connectedTubes.GetValueOrDefault(nodule); - if (tube == null) - return; + var tube = _connectedTubes.GetValueOrDefault(nodule); + if (tube == null) + return; - _connectedTubes.Remove(nodule); - tube.QueueFree(); - DisconnectTubePlayer.Play(); - } + _connectedTubes.Remove(nodule); + tube.QueueFree(); + DisconnectTubePlayer.Play(); } private void CreateGhostTube(Nodule connectedNodule, Vector2 pos) @@ -83,9 +79,9 @@ public partial class BuildGhost : Node2D var nodule = Instantiator.Instantiate(); nodule.Position = Position; - nodule.NoduleResource = GD.Load( - GameResources.SimpleNoduleTres.ResourcePath - ); + // nodule.NoduleResource = GD.Load( + // GameResources.SimpleNoduleTres.ResourcePath + // ); GetParent()?.AddChild(nodule); diff --git a/src/Gameplay/BuildGhost.tscn b/src/Gameplay/BuildGhost.tscn index c068130..b351d08 100644 --- a/src/Gameplay/BuildGhost.tscn +++ b/src/Gameplay/BuildGhost.tscn @@ -2,6 +2,7 @@ [ext_resource type="Script" uid="uid://ck5yw760bu8sb" path="res://src/Gameplay/BuildGhost.cs" id="1_ahcoi"] [ext_resource type="Texture2D" uid="uid://cecg47efx7gw8" path="res://assets/simple_nodule.png" id="2_uo42j"] +[ext_resource type="PackedScene" uid="uid://bjesfu1mfx8l5" path="res://src/Gameplay/Nodules/Components/TubeConnectionArea.tscn" id="2_vecmk"] [ext_resource type="AudioStream" uid="uid://mj8wvuwfc6o7" path="res://assets/sfx/tube_disconnect.wav" id="3_nxaxp"] [ext_resource type="AudioStream" uid="uid://bxxi7grsubvgm" path="res://assets/sfx/tube_connect.wav" id="3_quiac"] @@ -29,31 +30,22 @@ animations = [{ "duration": 1.0, "texture": SubResource("AtlasTexture_quiac") }], -"loop": true, +"loop": 1, "name": &"default", "speed": 5.0 }] -[sub_resource type="CircleShape2D" id="CircleShape2D_uo42j"] -radius = 96.38 - -[node name="BuildGhost" type="Node2D" unique_id=150653292] +[node name="BuildGhost" type="Node2D" unique_id=150653292 node_paths=PackedStringArray("_tubeConnectionArea")] script = ExtResource("1_ahcoi") +_tubeConnectionArea = NodePath("TubeConnectionArea") + +[node name="TubeConnectionArea" parent="." unique_id=1821668398 instance=ExtResource("2_vecmk")] [node name="Sprite2D" type="AnimatedSprite2D" parent="." unique_id=260566565] self_modulate = Color(0.1752002, 0.36830294, 0.26058322, 0.50980395) texture_filter = 1 sprite_frames = SubResource("SpriteFrames_vecmk") -[node name="TubeConnectionArea" type="Area2D" parent="." unique_id=2116427547] -unique_name_in_owner = true -collision_layer = 2 -collision_mask = 2 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="TubeConnectionArea" unique_id=1558952717] -shape = SubResource("CircleShape2D_uo42j") -debug_color = Color(0.38922516, 0.6054754, 0.25354394, 0.41960785) - [node name="ConnectTubePlayer" type="AudioStreamPlayer" parent="." unique_id=111889028] unique_name_in_owner = true stream = ExtResource("3_quiac") diff --git a/src/Gameplay/Nodules/Components/GrowArea.cs b/src/Gameplay/Nodules/Components/GrowArea.cs new file mode 100644 index 0000000..dc3908b --- /dev/null +++ b/src/Gameplay/Nodules/Components/GrowArea.cs @@ -0,0 +1,57 @@ +using Godot; +using Slimepire.Core; + +namespace Slimepire.Gameplay.Nodules.Components; + +[SceneTree] +public partial class GrowArea : Area2D +{ + private bool _mouseInsideClickArea; + private bool _clickedInside; + + public override void _Ready() + { + MouseEntered += ClickAreaOnMouseEntered; + MouseExited += ClickAreaOnMouseExited; + } + + private void ClickAreaOnMouseEntered() + { + _mouseInsideClickArea = true; + } + + private void ClickAreaOnMouseExited() + { + _mouseInsideClickArea = false; + + // ghost == null check probably unnecessary + if (_clickedInside && !NoduleManager.Instance.Building) + { + NoduleManager.Instance.Building = true; + _clickedInside = false; + + var ghost = Instantiator.Instantiate(); + ghost.Position = Position; + + // TODO: Make it better... EntityRoot oder vllt. NoduleRoot + // Oder einfach den Baum auch als Baum in der Scene darstellen? + GetTree().Root.AddChild(ghost); + } + } + + public override void _UnhandledInput(InputEvent @event) + { + using (@event) + { + if ( + @event is InputEventMouseButton { ButtonIndex: MouseButton.Left } + && @event.IsPressed() + && _mouseInsideClickArea + ) + { + _clickedInside = true; + GetViewport().SetInputAsHandled(); + } + } + } +} diff --git a/src/Gameplay/Nodules/Components/GrowArea.cs.uid b/src/Gameplay/Nodules/Components/GrowArea.cs.uid new file mode 100644 index 0000000..6bf9e5f --- /dev/null +++ b/src/Gameplay/Nodules/Components/GrowArea.cs.uid @@ -0,0 +1 @@ +uid://cfxb8wmnt7ej7 diff --git a/src/Gameplay/Nodules/Components/GrowArea.tscn b/src/Gameplay/Nodules/Components/GrowArea.tscn new file mode 100644 index 0000000..ad90577 --- /dev/null +++ b/src/Gameplay/Nodules/Components/GrowArea.tscn @@ -0,0 +1,13 @@ +[gd_scene format=3 uid="uid://3x5pqm4t5cbl"] + +[ext_resource type="Script" uid="uid://cfxb8wmnt7ej7" path="res://src/Gameplay/Nodules/Components/GrowArea.cs" id="1_a3tcn"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_7qt20"] +radius = 15.0 + +[node name="GrowArea" type="Area2D" unique_id=979341496] +monitorable = false +script = ExtResource("1_a3tcn") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1616623898] +shape = SubResource("CircleShape2D_7qt20") diff --git a/src/Gameplay/Nodules/Components/TubeConnectionArea.cs b/src/Gameplay/Nodules/Components/TubeConnectionArea.cs new file mode 100644 index 0000000..8e5c905 --- /dev/null +++ b/src/Gameplay/Nodules/Components/TubeConnectionArea.cs @@ -0,0 +1,31 @@ +using Godot; + +namespace Slimepire.Gameplay.Nodules.Components; + +public partial class TubeConnectionArea : Area2D +{ + public Action ConnectionAdded { get; set; } + public Action ConnectionRemoved { get; set; } + + public override void _Ready() + { + AreaEntered += TubeConnectionAreaOnAreaEntered; + AreaExited += TubeConnectionAreaOnAreaExited; + } + + private void TubeConnectionAreaOnAreaEntered(Area2D area) + { + if (area.GetParent() is Nodule nodule) + { + ConnectionAdded?.Invoke(nodule); + } + } + + private void TubeConnectionAreaOnAreaExited(Area2D area) + { + if (area.GetParent() is Nodule nodule) + { + ConnectionRemoved?.Invoke(nodule); + } + } +} diff --git a/src/Gameplay/Nodules/Components/TubeConnectionArea.cs.uid b/src/Gameplay/Nodules/Components/TubeConnectionArea.cs.uid new file mode 100644 index 0000000..87e26e7 --- /dev/null +++ b/src/Gameplay/Nodules/Components/TubeConnectionArea.cs.uid @@ -0,0 +1 @@ +uid://bcw8vylpb533h diff --git a/src/Gameplay/Nodules/Components/TubeConnectionArea.tscn b/src/Gameplay/Nodules/Components/TubeConnectionArea.tscn new file mode 100644 index 0000000..7bfd952 --- /dev/null +++ b/src/Gameplay/Nodules/Components/TubeConnectionArea.tscn @@ -0,0 +1,15 @@ +[gd_scene format=3 uid="uid://bjesfu1mfx8l5"] + +[ext_resource type="Script" uid="uid://bcw8vylpb533h" path="res://src/Gameplay/Nodules/Components/TubeConnectionArea.cs" id="1_uhdst"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_x44k2"] +radius = 96.38 + +[node name="TubeConnectionArea" type="Area2D" unique_id=1821668398] +collision_layer = 2 +collision_mask = 2 +script = ExtResource("1_uhdst") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=301201606] +shape = SubResource("CircleShape2D_x44k2") +debug_color = Color(0.38922516, 0.6054754, 0.25354394, 0.41960785) diff --git a/src/Gameplay/Nodules/Nodule.cs b/src/Gameplay/Nodules/Nodule.cs index 24c0896..b543ad1 100644 --- a/src/Gameplay/Nodules/Nodule.cs +++ b/src/Gameplay/Nodules/Nodule.cs @@ -1,5 +1,5 @@ using Godot; -using Slimepire.Data; +using Slimepire.Gameplay.Nodules.Components; namespace Slimepire.Gameplay.Nodules; @@ -8,105 +8,31 @@ public partial class Nodule : Node2D { public long Id { get; set; } = BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0); - private bool _mouseInsideClickArea; - private bool _clickedInside; - - public readonly List Connections = []; + public List Connections { get; } = []; [Export] - public required NoduleResource NoduleResource; - - private float energy = 0; - - // todo remove? - private bool _isExpanding; + private TubeConnectionArea _tubeConnectionArea; public override void _Ready() { - Gfx.SpriteFrames = NoduleResource.SpriteFrames; - Gfx.SelfModulate = NoduleResource.Color; + Gfx.SelfModulate = Colors.DarkOliveGreen; Gfx.Play(); - ClickArea.MouseEntered += ClickAreaOnMouseEntered; - ClickArea.MouseExited += ClickAreaOnMouseExited; - - TubeConnectionArea.AreaEntered += TubeConnectionAreaOnAreaEntered; - TubeConnectionArea.AreaExited += TubeConnectionAreaOnAreaExited; + _tubeConnectionArea.ConnectionAdded += ConnectionAdded; + _tubeConnectionArea.ConnectionRemoved += ConnectionRemoved; NoduleManager.Instance.RegisterNodule(this); } - public override void _Process(double delta) + private void ConnectionAdded(Nodule nodule) { - EnergyLabel.Text = energy.ToString("F2"); - } - - private void TubeConnectionAreaOnAreaEntered(Area2D area) - { - if (area.GetParent() is Nodule nodule) - { - Connections.Add(nodule); - NoduleManager.Instance.Update(); - } - } - - private void TubeConnectionAreaOnAreaExited(Area2D area) - { - if (area.GetParent() is Nodule nodule) - { - Connections.Remove(nodule); - } - } - - public override void _UnhandledInput(InputEvent @event) - { - using (@event) - { - if ( - @event is InputEventMouseButton { ButtonIndex: MouseButton.Left } - && @event.IsPressed() - && _mouseInsideClickArea - ) - { - _clickedInside = true; - GetViewport().SetInputAsHandled(); - } - } - } - - private void ClickAreaOnMouseEntered() - { - _mouseInsideClickArea = true; - } - - private void ClickAreaOnMouseExited() - { - _mouseInsideClickArea = false; - - // ghost == null check probably unnecessary - if (_clickedInside && !NoduleManager.Instance.Building) - { - NoduleManager.Instance.Building = true; - _clickedInside = false; - _isExpanding = true; - - var ghost = Instantiator.Instantiate(); - ghost.Position = Position; - - GetParent()?.AddChild(ghost); - } - } - - private void OnBuildComplete(Vector2 pos) - { - NoduleManager.Instance.Building = false; - _isExpanding = false; - - var nodule = Instantiator.Instantiate(); - - nodule.Position = pos; Connections.Add(nodule); - nodule.Connections.Add(this); - GetParent()?.AddChild(nodule); + NoduleManager.Instance.Update(); + } + + private void ConnectionRemoved(Nodule nodule) + { + Connections.Remove(nodule); + NoduleManager.Instance.Update(); } } diff --git a/src/Gameplay/Nodules/Nodule.tscn b/src/Gameplay/Nodules/Nodule.tscn index c245d2a..bf62c9a 100644 --- a/src/Gameplay/Nodules/Nodule.tscn +++ b/src/Gameplay/Nodules/Nodule.tscn @@ -2,9 +2,8 @@ [ext_resource type="Script" uid="uid://cmpl0if164dba" path="res://src/Gameplay/Nodules/Nodule.cs" id="1_yembh"] [ext_resource type="Texture2D" uid="uid://cecg47efx7gw8" path="res://assets/simple_nodule.png" id="2_7qt20"] - -[sub_resource type="CircleShape2D" id="CircleShape2D_7qt20"] -radius = 15.0 +[ext_resource type="PackedScene" uid="uid://bjesfu1mfx8l5" path="res://src/Gameplay/Nodules/Components/TubeConnectionArea.tscn" id="2_inlcu"] +[ext_resource type="PackedScene" uid="uid://3x5pqm4t5cbl" path="res://src/Gameplay/Nodules/Components/GrowArea.tscn" id="2_x44k2"] [sub_resource type="AtlasTexture" id="AtlasTexture_7qt20"] atlas = ExtResource("2_7qt20") @@ -35,9 +34,6 @@ animations = [{ "speed": 2.0 }] -[sub_resource type="CircleShape2D" id="CircleShape2D_x44k2"] -radius = 96.38 - [sub_resource type="LabelSettings" id="LabelSettings_x44k2"] font_size = 12 outline_size = 3 @@ -45,15 +41,14 @@ outline_color = Color(0, 0, 0, 1) shadow_size = 3 shadow_color = Color(0, 0, 0, 1) -[node name="Nodule" type="Node2D" unique_id=1637542829] +[node name="Nodule" type="Node2D" unique_id=1637542829 node_paths=PackedStringArray("_tubeConnectionArea")] z_index = 1 script = ExtResource("1_yembh") +_tubeConnectionArea = NodePath("TubeConnectionArea") -[node name="ClickArea" type="Area2D" parent="." unique_id=120357381] -unique_name_in_owner = true +[node name="TubeConnectionArea" parent="." unique_id=1821668398 instance=ExtResource("2_inlcu")] -[node name="CollisionShape2D" type="CollisionShape2D" parent="ClickArea" unique_id=2005066434] -shape = SubResource("CircleShape2D_7qt20") +[node name="GrowArea" parent="." unique_id=979341496 instance=ExtResource("2_x44k2")] [node name="Gfx" type="AnimatedSprite2D" parent="." unique_id=190397869] unique_name_in_owner = true @@ -62,15 +57,6 @@ sprite_frames = SubResource("SpriteFrames_xyjsl") autoplay = "default" frame_progress = 0.120879106 -[node name="TubeConnectionArea" type="Area2D" parent="." unique_id=339547035] -unique_name_in_owner = true -collision_layer = 2 -collision_mask = 2 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="TubeConnectionArea" unique_id=234655540] -shape = SubResource("CircleShape2D_x44k2") -debug_color = Color(0.38922516, 0.6054754, 0.25354394, 0.41960785) - [node name="EnergyLabel" type="Label" parent="." unique_id=466024399] unique_name_in_owner = true anchors_preset = 5 diff --git a/src/Gameplay/Tube.tscn b/src/Gameplay/Tube.tscn index 46b1f29..d910930 100644 --- a/src/Gameplay/Tube.tscn +++ b/src/Gameplay/Tube.tscn @@ -2,9 +2,8 @@ [ext_resource type="Script" uid="uid://dwunaa303epy6" path="res://src/Gameplay/Tube.cs" id="1_76hpl"] -[sub_resource type="Curve" id="Curve_0lkqj"] -_limits = [0.0, 2.0, 0.0, 1.0] -_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.5, 1.4598354), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +[sub_resource type="Curve" id="Curve_kvwlm"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.5, 0), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] point_count = 3 [node name="Tube" type="Node2D" unique_id=226677696] @@ -13,13 +12,14 @@ script = ExtResource("1_76hpl") [node name="Line2D" type="Line2D" parent="." unique_id=1553055261] unique_name_in_owner = true z_as_relative = false +points = PackedVector2Array(0, 0, 32.6, 17, 65.2, 34, 97.799995, 51, 163, 85) width = 8.0 -width_curve = SubResource("Curve_0lkqj") -default_color = Color(0.30588236, 0.4862745, 0.23921569, 0.5568628) +width_curve = SubResource("Curve_kvwlm") +default_color = Color(0.30588236, 0.4862745, 0.23921569, 1) joint_mode = 2 begin_cap_mode = 2 end_cap_mode = 2 [node name="Target" type="Marker2D" parent="." unique_id=630564540] unique_name_in_owner = true -position = Vector2(47, 66) +position = Vector2(163, 85) diff --git a/src/Levels/DemoLevel.tscn b/src/Levels/DemoLevel.tscn index 192eaee..90ac54e 100644 --- a/src/Levels/DemoLevel.tscn +++ b/src/Levels/DemoLevel.tscn @@ -3,7 +3,6 @@ [ext_resource type="Script" uid="uid://c8l12dlpexosv" path="res://src/Levels/DemoLevel.cs" id="1_l2cn0"] [ext_resource type="Script" uid="uid://cdgi3y0sm3rt1" path="res://src/Gameplay/Camera.cs" id="2_mxa1b"] [ext_resource type="PackedScene" uid="uid://cnl6t8o4mh0j3" path="res://src/Gameplay/Nodules/Nodule.tscn" id="3_qhkhc"] -[ext_resource type="Resource" uid="uid://0d8vif4ejtp1" path="res://src/Data/EnergyStorageNodule.tres" id="4_yyao7"] [sub_resource type="LabelSettings" id="LabelSettings_l2cn0"] font_size = 107 @@ -30,4 +29,3 @@ text = "DEMO LEVEL" label_settings = SubResource("LabelSettings_l2cn0") [node name="Nodule" parent="." unique_id=1637542829 instance=ExtResource("3_qhkhc")] -NoduleResource = ExtResource("4_yyao7")