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
75
76
77
78
79
80
81
|
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 _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 = {
"fodder": fodder_enemy,
"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()
# 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)
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
spawn_wave(current_wave)
GameData.increment_wave()
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]
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"]
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) -> 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()]
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())
|