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 gnome_enemy = preload("res://scenes/gnome.tscn") @onready var knight_enemy = preload("res://scenes/gnome.tscn") @onready var map = get_node("../Map") @onready var _path : Path2D @onready var _enemy_map : Dictionary[String, PackedScene] func _ready() -> void: _enemy_map = { "fodder": fodder_enemy, "soldier": soldier_enemy, "gnome": gnome_enemy, "knight": knight_enemy, } var curve : Curve2D = Curve2D.new() var points : Array[Vector2i] = map.get_enemy_path() # add off-screen points 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) GameData.connect("wave_started", Callable(self, "spawn_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() var debug_curr_time = (Time.get_ticks_msec() / 1000.0) 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 GameData.stop_spawning() 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() 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() follow_path.rotates = false follow_path.loop = false _path.add_child(follow_path) follow_path.add_child(_enemy_map[crawler].instantiate())