aboutsummaryrefslogtreecommitdiff
path: root/scripts/wave.gd
blob: c4c43c7bf541da56d01e8fec5b506937d001b4f3 (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
extends Node

var _timer : Resource = load("res://scenes/wave/timer_batch.tscn")

var wave_num : int = 0
var waves = []

var ongoing = false

var load_shapes : Node
var gui : Node

func fetch ():
	var root = get_tree().root.get_node("world")
	var saveload = root.get_node("saveload")
	load_shapes = saveload.get_node("load_shapes")
	gui = root.get_node("gui")

func make_queue (spawn):
	var queue = []
	for order in spawn.enemies:
		for n in order.amount:
			var e = {
				"cooldown": order.cooldown,
				"enemy": order.enemy
			}
			queue += [e]
	if spawn.random: queue.shuffle()
	return queue

func add_spawner (spawn):
	var timer = _timer.instance()
	timer.queue = make_queue(spawn)
	add_child(timer)
	timer.fetch()
	timer.start(spawn.time)
	
func start_wave (wave):
	for spawn in wave:
		add_spawner(spawn)
		

func get_hp_budget (x : int):
	var hp = pow((x + 10), 2.7) * 1.8 - 850
	return hp
	
func get_affordable_enemies (hp_budget : int):
	var aff = []
	for enemy in load_shapes.info:
		if load_shapes.info[enemy].cost <= hp_budget:
			aff += [load_shapes.info[enemy]]
	return aff
		
func pick_enemy (hp_budget : int):
	var amt = 1
	var aff = get_affordable_enemies(hp_budget)
	var enemy = aff[randi() % aff.size()]
	var order = {
		"amount" : amt,
		"enemy": enemy.name,
		"cooldown": 0.5
	}
	return { "enemy": order, "cost": enemy.cost }

func gen_wave (wave_num : int):
	var hp_budget = get_hp_budget(wave_num)
	
	var enemies = []
	for i in range(0, 1000):
		if hp_budget < 10: break
		var enemy_cost = pick_enemy(hp_budget)
		enemies += [ enemy_cost.enemy ]
		hp_budget -= enemy_cost.cost
	
	var w = [
		{
			"time": 0, "random": true,
			"enemies": enemies
		}
	]
	return w

func start():
	fetch()
	ongoing = true
	var w = null
	if wave_num <= waves.size()-1: w = waves[wave_num]
	else: w = gen_wave(wave_num)
	start_wave(w)
	
func end():
	ongoing = false
	wave_num += 1
	gui.refresh()