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