summaryrefslogtreecommitdiff
path: root/scripts/wave_spawner.gd
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/wave_spawner.gd')
-rw-r--r--scripts/wave_spawner.gd61
1 files changed, 26 insertions, 35 deletions
diff --git a/scripts/wave_spawner.gd b/scripts/wave_spawner.gd
index 4e6e973..653fe92 100644
--- a/scripts/wave_spawner.gd
+++ b/scripts/wave_spawner.gd
@@ -7,15 +7,9 @@ extends Node2D
@onready var gnome_enemy = preload("res://scenes/gnome.tscn")
@onready var map = get_node("../Map")
-@onready var _wave_timer = $Timer
@onready var _path : Path2D
@onready var _enemy_map : Dictionary[String, PackedScene]
-@onready var _wave_pool : Array[Array] = [
- ["fodder", "soldier"],
- ["fodder", "soldier", "gnome"],
- ["soldier", "gnome"],
-]
func _ready() -> void:
_enemy_map = {
@@ -23,7 +17,6 @@ func _ready() -> void:
"soldier": soldier_enemy,
"gnome": gnome_enemy,
}
- _wave_timer.wait_time = game_stats_config.wave_time
var curve : Curve2D = Curve2D.new()
var points : Array[Vector2i] = map.get_enemy_path()
@@ -38,40 +31,38 @@ func _ready() -> void:
_path.curve = curve
add_child(_path)
-func _on_timer_timeout():
- var current_wave : int = GameData.get_current_wave()
- # TODO win screen should play instead
- if current_wave > game_stats_config.max_wave:
- return
+ GameData.connect("wave_started", Callable(self, "spawn_wave"))
- spawn_wave(current_wave)
- GameData.increment_wave()
+func spawn_wave(wave_num):
+ var wave : Dictionary = game_stats_config.wave_data[wave_num]
+ var timestamps = wave.keys()
+ var prev_time = 0
+ timestamps.sort()
-func spawn_wave(current_wave):
- var selected_crawlers: Array = []
- var total_worth : int = 0
- var target_worth : int = game_stats_config.wave_targets[current_wave - 1]
+ var debug_curr_time = (Time.get_ticks_msec() / 1000.0)
- while total_worth < target_worth:
- var crawler_type = _select_crawler(current_wave)
- if crawler_type:
- selected_crawlers.append(crawler_type)
- total_worth += game_stats_config.crawlers[crawler_type]["worth"]
+ for i in timestamps:
+ print("Spawned ", i, " at ", (Time.get_ticks_msec() / 1000.0) - debug_curr_time)
+ await _spawn_crawlers(_get_crawler_spawn_order(wave[i]), i - prev_time)
+ prev_time = i
- var spawn_interval: float = game_stats_config.wave_time / selected_crawlers.size()
+ GameData.stop_spawning()
- for crawler in selected_crawlers:
- await get_tree().create_timer(spawn_interval).timeout
- _spawn_crawler(crawler)
+func _get_crawler_spawn_order(crawler_dict : Dictionary) -> Array[String]:
+ var crawler_array : Array[String]
+ for i in crawler_dict.keys():
+ for j in range(crawler_dict[i]):
+ crawler_array.append(i)
+ crawler_array.shuffle()
+ return crawler_array
+
+func _spawn_crawlers(crawler_array: Array, timeout : float):
+ var spawn_interval = timeout / crawler_array.size()
-func _select_crawler(current_wave) -> String:
- var curr_wave_pool = _wave_pool[current_wave - 1]
- if randi() % 100 < 80:
- # spawn fodder
- return curr_wave_pool[0]
- else:
- var non_fodder = curr_wave_pool.slice(1, curr_wave_pool.size())
- return non_fodder[randi() % non_fodder.size()]
+ for i in range(crawler_array.size()):
+ var crawler_type = crawler_array[i]
+ await get_tree().create_timer(spawn_interval).timeout
+ _spawn_crawler(crawler_type)
func _spawn_crawler(crawler : String):
var follow_path : PathFollow2D = PathFollow2D.new()