summaryrefslogtreecommitdiff
path: root/scripts/wave_spawner.gd
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())