From c5799d47e2614119d25993afcf02ce163406fcb4 Mon Sep 17 00:00:00 2001 From: Varylios Date: Wed, 27 Aug 2025 01:30:37 +0200 Subject: [PATCH] refactor: improve spawning logic --- Levels/world.gd | 2 +- Levels/world.tscn | 64 +++++++++++++------- Scripts/Troop.gd | 1 + Scripts/Wave.gd | 3 +- Scripts/WaveManager.gd | 60 ++++++++++++++++++ spawner.gd.uid => Scripts/WaveManager.gd.uid | 0 Towers/TowerList.gd | 17 ++++++ Towers/TowerList.gd.uid | 1 + Towers/tower.gd | 2 +- Waves/wave_1.tres | 8 ++- spawner.gd | 57 ----------------- 11 files changed, 130 insertions(+), 85 deletions(-) create mode 100644 Scripts/WaveManager.gd rename spawner.gd.uid => Scripts/WaveManager.gd.uid (100%) create mode 100644 Towers/TowerList.gd create mode 100644 Towers/TowerList.gd.uid delete mode 100644 spawner.gd diff --git a/Levels/world.gd b/Levels/world.gd index c156813..2a0f3ae 100644 --- a/Levels/world.gd +++ b/Levels/world.gd @@ -3,4 +3,4 @@ extends Node3D var selected_collider : CollisionObject3D func _ready() -> void: - $Spawner.spawn_next_wave() + $WaveManager.spawn_next_wave() diff --git a/Levels/world.tscn b/Levels/world.tscn index c88dec7..96f4e4e 100644 --- a/Levels/world.tscn +++ b/Levels/world.tscn @@ -1,15 +1,17 @@ -[gd_scene load_steps=20 format=3 uid="uid://ky0uewndeuwv"] +[gd_scene load_steps=25 format=3 uid="uid://ky0uewndeuwv"] [ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_fj7yv"] [ext_resource type="PackedScene" uid="uid://d1f6m15niwgt" path="res://Tiles/tile.tscn" id="3_aqk2v"] [ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/PlayerManager.gd" id="3_ju8gl"] [ext_resource type="PackedScene" uid="uid://d17sleiqkdoo2" path="res://Assets/GLB format/selection-a.glb" id="3_tlwt5"] [ext_resource type="PackedScene" uid="uid://do7gm1gjhu1t5" path="res://Tiles/road.tscn" id="4_036b0"] -[ext_resource type="Script" uid="uid://tpon511km4al" path="res://spawner.gd" id="5_036b0"] +[ext_resource type="Script" uid="uid://tpon511km4al" path="res://Scripts/WaveManager.gd" id="5_036b0"] [ext_resource type="PackedScene" uid="uid://dpjfo15otkfru" path="res://Tiles/cube.tscn" id="5_wse8f"] [ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Scripts/Wave.gd" id="6_gbfbk"] [ext_resource type="Resource" uid="uid://dkbuy7fetnihs" path="res://Waves/wave_1.tres" id="7_ioo17"] [ext_resource type="PackedScene" uid="uid://djyye2otjju2d" path="res://game_menu.tscn" id="9_44brb"] +[ext_resource type="Script" uid="uid://blxx3vs2wnfet" path="res://Scripts/Troop.gd" id="10_oyb16"] +[ext_resource type="PackedScene" uid="uid://dknt1oiyei5e5" path="res://enemies/enemy-a.tscn" id="11_43wwi"] [ext_resource type="PackedScene" uid="uid://c54881eookjth" path="res://Assets/Meshes/SM_B26.glb" id="12_44brb"] [ext_resource type="Script" uid="uid://xkk2pxkrwsq8" path="res://bullet_container.gd" id="12_k3n1d"] [ext_resource type="PackedScene" uid="uid://dxeb1kk5ieix2" path="res://Assets/Meshes/SM_MiniHouse.glb" id="13_ju8gl"] @@ -24,6 +26,34 @@ _data = { } point_count = 2 +[sub_resource type="Resource" id="Resource_1mf3x"] +script = ExtResource("10_oyb16") +enemy = ExtResource("11_43wwi") +number_to_spawn = 2 +spawn_delay = 0.0 +metadata/_custom_type_script = "uid://blxx3vs2wnfet" + +[sub_resource type="Resource" id="Resource_3i3vq"] +script = ExtResource("10_oyb16") +enemy = ExtResource("11_43wwi") +number_to_spawn = 1 +spawn_delay = 1.0 +metadata/_custom_type_script = "uid://blxx3vs2wnfet" + +[sub_resource type="Resource" id="Resource_qdqr3"] +script = ExtResource("10_oyb16") +enemy = ExtResource("11_43wwi") +number_to_spawn = 1 +spawn_delay = 1.0 +metadata/_custom_type_script = "uid://blxx3vs2wnfet" + +[sub_resource type="Resource" id="Resource_gtojq"] +script = ExtResource("6_gbfbk") +troops = Array[ExtResource("10_oyb16")]([SubResource("Resource_1mf3x"), SubResource("Resource_3i3vq"), SubResource("Resource_qdqr3")]) +wait_time_before_launch_wave = 5 +wait_for_enemy_kills = true +metadata/_custom_type_script = "uid://chu8s12rtdeqx" + [sub_resource type="Environment" id="Environment_036b0"] background_mode = 1 background_color = Color(0.924338, 0.849272, 0.847318, 1) @@ -36,22 +66,6 @@ adjustment_enabled = true adjustment_contrast = 1.3 adjustment_saturation = 1.2 -[sub_resource type="GDScript" id="GDScript_ju8gl"] -script/source = "extends Node3D - -class_name TowerList - -func _ready() -> void: - child_entered_tree.connect(_on_child_entered_tree) - child_exiting_tree.connect(_on_child_exiting_tree) - -func _on_child_entered_tree(child): - EventBus.tower_count_changed.emit(get_children().count()) - -func _on_child_exiting_tree(child): - EventBus.team_in_action_changed.emit(get_children().count()) -" - [node name="World" type="Node3D"] script = ExtResource("1_fj7yv") @@ -175,13 +189,17 @@ transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 9.5, 0 unique_name_in_owner = true transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 10.1496, 0.209118, 0.497613) -[node name="Spawner" type="Path3D" parent="."] +[node name="WaveManager" type="Path3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) curve = SubResource("Curve3D_aqk2v") script = ExtResource("5_036b0") -waves = Array[ExtResource("6_gbfbk")]([ExtResource("7_ioo17")]) +waves = Array[ExtResource("6_gbfbk")]([ExtResource("7_ioo17"), SubResource("Resource_gtojq")]) -[node name="SpawnTimer" type="Timer" parent="Spawner"] +[node name="WaveTimer" type="Timer" parent="WaveManager"] +one_shot = true + +[node name="TroopTimer" type="Timer" parent="WaveManager"] +one_shot = true [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_036b0") @@ -216,6 +234,6 @@ transform = Transform3D(-0.0471892, 0, 1.99944, 0, 2, 0, -1.99944, 0, -0.0471892 transform = Transform3D(1.08365, 0, 1.68098, 0, 2, 0, -1.68098, 0, 1.08365, 1.44235, 0, 4.63481) [node name="Towers" type="Node3D" parent="."] -script = SubResource("GDScript_ju8gl") -[connection signal="timeout" from="Spawner/SpawnTimer" to="Spawner" method="_on_spawn_timer_timeout"] +[connection signal="timeout" from="WaveManager/WaveTimer" to="WaveManager" method="_on_wave_timer_timeout"] +[connection signal="timeout" from="WaveManager/TroopTimer" to="WaveManager" method="_on_troop_timer_timeout"] diff --git a/Scripts/Troop.gd b/Scripts/Troop.gd index 0e71dad..1cdd957 100644 --- a/Scripts/Troop.gd +++ b/Scripts/Troop.gd @@ -3,3 +3,4 @@ class_name Troop @export var enemy : PackedScene @export var number_to_spawn : int = 1 +@export var spawn_delay : float = 1 diff --git a/Scripts/Wave.gd b/Scripts/Wave.gd index a623efe..17d51e3 100644 --- a/Scripts/Wave.gd +++ b/Scripts/Wave.gd @@ -2,4 +2,5 @@ extends Resource class_name Wave @export var troops : Array[Troop] -@export var wait_time_before_next_wave : int = 3 +@export var wait_time_before_launch_wave : int = 3 +@export var wait_for_enemy_kills : bool = true diff --git a/Scripts/WaveManager.gd b/Scripts/WaveManager.gd new file mode 100644 index 0000000..3911e29 --- /dev/null +++ b/Scripts/WaveManager.gd @@ -0,0 +1,60 @@ +extends Path3D +class_name WaveManager + +@export var waves : Array[Wave] +var current_wave : Wave +var current_troop : Troop + +var enemies_to_spawn : int = 0 +var wave_on_going : bool = false +var game_has_start : bool = false + + +func _process(delta: float) -> void: + if GameManager.wave > 0: + spawn_manager() + + +func spawn_next_wave() -> void: + if waves.is_empty(): + EventBus.player_has_won.emit() + return + + current_wave = waves.pop_front() + GameManager.wave += 1 + $WaveTimer.start(current_wave.wait_time_before_launch_wave) + + +func spawn_troop() -> void: + for n in current_troop.number_to_spawn: + var tempEnemy = current_troop.enemy.instantiate() + add_child(tempEnemy) + GameManager.enemies_alive += 1 + + +func spawn_manager() -> void: + #Send next troop + if !$WaveTimer.is_stopped() || !$TroopTimer.is_stopped(): + return + + if !current_wave.troops.is_empty(): + current_troop = current_wave.troops.pop_front() + if (current_troop.spawn_delay == 0): + spawn_troop() + else: + $TroopTimer.wait_time = current_troop.spawn_delay + $TroopTimer.start() + + wave_on_going = true + if GameManager.enemies_alive == 0 && current_wave.troops.is_empty(): + wave_on_going = false + spawn_next_wave() + elif !current_wave.wait_for_enemy_kills: + spawn_next_wave() + + +func _on_wave_timer_timeout() -> void: + pass + +func _on_troop_timer_timeout() -> void: + spawn_troop() diff --git a/spawner.gd.uid b/Scripts/WaveManager.gd.uid similarity index 100% rename from spawner.gd.uid rename to Scripts/WaveManager.gd.uid diff --git a/Towers/TowerList.gd b/Towers/TowerList.gd new file mode 100644 index 0000000..28c118a --- /dev/null +++ b/Towers/TowerList.gd @@ -0,0 +1,17 @@ +extends Node3D + +class_name TowerList + +enum TOWERS { PIERRE, ALINE, MAXENCE, VICTORIA, EVAN, ALEX } + +func _ready() -> void: + child_entered_tree.connect(_on_child_entered_tree) + child_exiting_tree.connect(_on_child_exiting_tree) + +func _on_child_entered_tree(child): + #EventBus.tower_count_changed.emit(get_children().count()) + pass + +func _on_child_exiting_tree(child): + #EventBus.team_in_action_changed.emit(get_children().count()) + pass diff --git a/Towers/TowerList.gd.uid b/Towers/TowerList.gd.uid new file mode 100644 index 0000000..967758f --- /dev/null +++ b/Towers/TowerList.gd.uid @@ -0,0 +1 @@ +uid://cinbnfxcyrfsr diff --git a/Towers/tower.gd b/Towers/tower.gd index ed4dbd4..8e566a4 100644 --- a/Towers/tower.gd +++ b/Towers/tower.gd @@ -21,7 +21,7 @@ var bullet : PackedScene = preload("res://Bullets/bullet.tscn") max_energy = value energy_bar.set_max_value(max_energy) @export var energy_regen : float = 10.0 -@export var energy_cost : float = 50.0 +@export var energy_cost : float = 10.0 @onready var energy_bar : EnergyBar3D = $EnergyBar3D var energy : float = max_energy: diff --git a/Waves/wave_1.tres b/Waves/wave_1.tres index e729785..e49c9d9 100644 --- a/Waves/wave_1.tres +++ b/Waves/wave_1.tres @@ -7,23 +7,27 @@ [sub_resource type="Resource" id="Resource_1mf3x"] script = ExtResource("2_mn2od") enemy = ExtResource("3_40llc") -number_to_spawn = 1 +number_to_spawn = 2 +spawn_delay = 1.0 metadata/_custom_type_script = "uid://blxx3vs2wnfet" [sub_resource type="Resource" id="Resource_3i3vq"] script = ExtResource("2_mn2od") enemy = ExtResource("3_40llc") number_to_spawn = 1 +spawn_delay = 3.0 metadata/_custom_type_script = "uid://blxx3vs2wnfet" [sub_resource type="Resource" id="Resource_qdqr3"] script = ExtResource("2_mn2od") enemy = ExtResource("3_40llc") number_to_spawn = 1 +spawn_delay = 1.0 metadata/_custom_type_script = "uid://blxx3vs2wnfet" [resource] script = ExtResource("1_bubg8") troops = Array[ExtResource("2_mn2od")]([SubResource("Resource_1mf3x"), SubResource("Resource_3i3vq"), SubResource("Resource_qdqr3")]) -wait_time_before_next_wave = 3 +wait_time_before_launch_wave = 5 +wait_for_enemy_kills = true metadata/_custom_type_script = "uid://chu8s12rtdeqx" diff --git a/spawner.gd b/spawner.gd deleted file mode 100644 index f229c0d..0000000 --- a/spawner.gd +++ /dev/null @@ -1,57 +0,0 @@ -extends Path3D -class_name Spawner - -@export var waves : Array[Wave] -var current_wave : Wave -var current_troop : Troop - -var enemies_to_spawn : int = 0 -var can_spawn : bool = false -var wave_on_going : bool = false - -func spawn_next_wave() -> void: - if waves.is_empty(): - EventBus.player_has_won.emit() - return - - current_wave = waves.pop_front() - $SpawnTimer.start(current_wave.wait_time_before_next_wave) - - -func _process(delta: float) -> void: - spawn_manager() - - -func spawn() -> void: - $SpawnTimer.start() - var tempEnemy = current_troop.enemy.instantiate() - add_child(tempEnemy) - - enemies_to_spawn -= 1 - GameManager.enemies_alive += 1 - - can_spawn = false - - -func spawn_manager() -> void: - if !can_spawn: - return - - #Send next troop - if !current_wave.troops.is_empty() and enemies_to_spawn == 0: - current_troop = current_wave.troops.pop_front() - enemies_to_spawn = current_troop.number_to_spawn - - - if enemies_to_spawn > 0: - spawn() - if GameManager.enemies_alive > 0: - wave_on_going = true - else: - wave_on_going = false - spawn_next_wave() - - -func _on_spawn_timer_timeout() -> void: - can_spawn = true - $SpawnTimer.wait_time = 1.0