Merge pull request 'refactor: improve spawning logic' (#3) from feature/new-wave-manager into main
Reviewed-on: #3
This commit is contained in:
commit
5b994b91d1
8 changed files with 111 additions and 84 deletions
|
|
@ -3,4 +3,4 @@ extends Node3D
|
|||
var selected_collider : CollisionObject3D
|
||||
|
||||
func _ready() -> void:
|
||||
$Spawner.spawn_next_wave()
|
||||
$WaveManager.spawn_next_wave()
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
|
|
|
|||
|
|
@ -3,3 +3,4 @@ class_name Troop
|
|||
|
||||
@export var enemy : PackedScene
|
||||
@export var number_to_spawn : int = 1
|
||||
@export var spawn_delay : float = 1
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
60
Scripts/WaveManager.gd
Normal file
60
Scripts/WaveManager.gd
Normal file
|
|
@ -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()
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
57
spawner.gd
57
spawner.gd
|
|
@ -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
|
||||
Loading…
Add table
Reference in a new issue