blob: 725f3e1809547edf80f3ddd074c029252ba80b4f (
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
73
74
75
76
|
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 _wave_pool : Array[Array]
@onready var _path : Path2D
func _ready() -> void:
_wave_pool = [
[fodder_enemy, soldier_enemy],
[soldier_enemy, fodder_enemy, gnome_enemy],
[gnome_enemy, 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)
# FIXME
total_worth += 2
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]
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 : PackedScene):
var follow_path : PathFollow2D = PathFollow2D.new()
follow_path.rotates = false
follow_path.loop = false
_path.add_child(follow_path)
follow_path.add_child(crawler.instantiate())
|