diff options
Diffstat (limited to 'scripts/wave_spawner.gd')
-rw-r--r-- | scripts/wave_spawner.gd | 61 |
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() |