summaryrefslogtreecommitdiff
path: root/scripts/wave_spawner.gd
blob: 653fe92f2f2370cbca96c3f56f18a2296bb9dde7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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 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,
	}

	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())