diff options
Diffstat (limited to 'scripts/wave_spawner.gd')
-rw-r--r-- | scripts/wave_spawner.gd | 77 |
1 files changed, 58 insertions, 19 deletions
diff --git a/scripts/wave_spawner.gd b/scripts/wave_spawner.gd index 0b4ca2e..eea656f 100644 --- a/scripts/wave_spawner.gd +++ b/scripts/wave_spawner.gd @@ -1,36 +1,75 @@ extends Node2D @onready var map_config = preload("res://resources/map_generator_resource.tres") +@onready var game_stats_config = preload("res://resources/game_stats_config.tres") @onready var fodder_enemy = preload("res://scenes/fodder.tscn") +@onready var soldier_enemy = preload("res://scenes/soldier.tscn") @onready var map = get_node("../Map") -var curve : Curve2D +@onready var _wave_timer = $Timer +@onready var _wave_pool : Array[Array] +@onready var _path : Path2D func _ready() -> void: - curve = Curve2D.new() - - var path : Array[Vector2i] = map.get_enemy_path() + _wave_pool = [ + [fodder_enemy , soldier_enemy], + ] + _wave_timer = game_stats_config.wave_time + var curve : Curve2D = Curve2D.new() + var points : Array[Vector2i] = map.get_enemy_path() # add off-screen points - path.insert(0, path[0] - Vector2i(1, 0)) - path.append(path[path.size() - 1] + Vector2i(1, 0)) - - # adjust to grid size - for i in map.get_enemy_path(): + points.insert(0, points[0] - Vector2i(1, 0)) + points.append(points[points.size() - 1] + Vector2i(1, 0)) + # scale to grid size + for i in points: curve.add_point(i * map_config.tile_size + Vector2i.ONE * (map_config.tile_size / 2)) + _path = Path2D.new() + _path.curve = curve + add_child(_path) + func _on_timer_timeout(): - var path = Path2D.new() - path.curve = curve + var current_wave : int = GameData.get_current_wave() + # TODO win screen should play instead + if current_wave > 1: + return - var follow_path = PathFollow2D.new() - follow_path.set_progress(0) - follow_path.rotates = false - follow_path.loop = false + spawn_wave(current_wave) + GameData.increment_wave() - var enemy = fodder_enemy.instantiate() +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] - follow_path.add_child(enemy) - path.add_child(follow_path) + while total_worth < target_worth: + var crawler_type = _select_crawler(current_wave) + if crawler_type: + selected_crawlers.append(crawler_type) + # FIXME + total_worth += 2 - add_child(path) + var spawn_interval: float = game_stats_config.wave_time / selected_crawlers.size() + + for crawler in selected_crawlers: + await get_tree().create_timer(spawn_interval).timeout + _spawn_crawler(crawler) + +func _select_crawler(current_wave) -> PackedScene: + var curr_wave_pool = _wave_pool[current_wave - 1] + print(curr_wave_pool) + if randi() % 100 < 70: + # 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()] + +func _spawn_crawler(crawler : PackedScene): + var follow_path : PathFollow2D = PathFollow2D.new() + follow_path.set_progress(0) + follow_path.rotates = false + follow_path.loop = false + _path.add_child(follow_path) + follow_path.add_child(crawler.instantiate()) |