refactor: improve spawning logic
This commit is contained in:
parent
7301dfed0f
commit
506b4a8a70
9 changed files with 112 additions and 85 deletions
|
|
@ -3,4 +3,4 @@ extends Node3D
|
||||||
var selected_collider : CollisionObject3D
|
var selected_collider : CollisionObject3D
|
||||||
|
|
||||||
func _ready() -> void:
|
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="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="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="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://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="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="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="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="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="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="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="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"]
|
[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
|
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"]
|
[sub_resource type="Environment" id="Environment_036b0"]
|
||||||
background_mode = 1
|
background_mode = 1
|
||||||
background_color = Color(0.924338, 0.849272, 0.847318, 1)
|
background_color = Color(0.924338, 0.849272, 0.847318, 1)
|
||||||
|
|
@ -36,22 +66,6 @@ adjustment_enabled = true
|
||||||
adjustment_contrast = 1.3
|
adjustment_contrast = 1.3
|
||||||
adjustment_saturation = 1.2
|
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"]
|
[node name="World" type="Node3D"]
|
||||||
script = ExtResource("1_fj7yv")
|
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
|
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)
|
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)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
|
||||||
curve = SubResource("Curve3D_aqk2v")
|
curve = SubResource("Curve3D_aqk2v")
|
||||||
script = ExtResource("5_036b0")
|
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="."]
|
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||||
environment = SubResource("Environment_036b0")
|
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)
|
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="."]
|
[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 enemy : PackedScene
|
||||||
@export var number_to_spawn : int = 1
|
@export var number_to_spawn : int = 1
|
||||||
|
@export var spawn_delay : float = 1
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,5 @@ extends Resource
|
||||||
class_name Wave
|
class_name Wave
|
||||||
|
|
||||||
@export var troops : Array[Troop]
|
@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()
|
||||||
|
|
@ -21,7 +21,7 @@ var bullet : PackedScene = preload("res://Bullets/bullet.tscn")
|
||||||
max_energy = value
|
max_energy = value
|
||||||
energy_bar.set_max_value(max_energy)
|
energy_bar.set_max_value(max_energy)
|
||||||
@export var energy_regen : float = 10.0
|
@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
|
@onready var energy_bar : EnergyBar3D = $EnergyBar3D
|
||||||
|
|
||||||
var energy : float = max_energy:
|
var energy : float = max_energy:
|
||||||
|
|
|
||||||
|
|
@ -7,23 +7,27 @@
|
||||||
[sub_resource type="Resource" id="Resource_1mf3x"]
|
[sub_resource type="Resource" id="Resource_1mf3x"]
|
||||||
script = ExtResource("2_mn2od")
|
script = ExtResource("2_mn2od")
|
||||||
enemy = ExtResource("3_40llc")
|
enemy = ExtResource("3_40llc")
|
||||||
number_to_spawn = 1
|
number_to_spawn = 2
|
||||||
|
spawn_delay = 1.0
|
||||||
metadata/_custom_type_script = "uid://blxx3vs2wnfet"
|
metadata/_custom_type_script = "uid://blxx3vs2wnfet"
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_3i3vq"]
|
[sub_resource type="Resource" id="Resource_3i3vq"]
|
||||||
script = ExtResource("2_mn2od")
|
script = ExtResource("2_mn2od")
|
||||||
enemy = ExtResource("3_40llc")
|
enemy = ExtResource("3_40llc")
|
||||||
number_to_spawn = 1
|
number_to_spawn = 1
|
||||||
|
spawn_delay = 3.0
|
||||||
metadata/_custom_type_script = "uid://blxx3vs2wnfet"
|
metadata/_custom_type_script = "uid://blxx3vs2wnfet"
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_qdqr3"]
|
[sub_resource type="Resource" id="Resource_qdqr3"]
|
||||||
script = ExtResource("2_mn2od")
|
script = ExtResource("2_mn2od")
|
||||||
enemy = ExtResource("3_40llc")
|
enemy = ExtResource("3_40llc")
|
||||||
number_to_spawn = 1
|
number_to_spawn = 1
|
||||||
|
spawn_delay = 1.0
|
||||||
metadata/_custom_type_script = "uid://blxx3vs2wnfet"
|
metadata/_custom_type_script = "uid://blxx3vs2wnfet"
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
script = ExtResource("1_bubg8")
|
script = ExtResource("1_bubg8")
|
||||||
troops = Array[ExtResource("2_mn2od")]([SubResource("Resource_1mf3x"), SubResource("Resource_3i3vq"), SubResource("Resource_qdqr3")])
|
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"
|
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