summaryrefslogtreecommitdiff
path: root/Global.gd
blob: ac637e3659fa79a6e2b500e3a019cac67647d579 (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
extends Node


signal level_map_updated()
signal game_won()


const Levels = [
	"Level_0001",
	"Level_0001",
	"Level_0001",
	"Level_0001",
	"Level_0001",
	"Level_0001",
	"Level_0001",
	"Level_0001",
	"Level_0001",
]

var Level_Map = []


func _ready():
	Network.connect("game_ended", self, "_on_game_end")
	
	for level in self.Levels:
		self.Level_Map.push_back({
			time = 0,
			cleared_by = { # Network.player
				idx = -1,
				name = ""
			},
			meta = {
				path = "res://Levels/%s.tscn" % level,
				name = level,
			},
		})


func change_scene_to_instance(instance):
	call_deferred("_deferred_change_scene_to_instance", instance)
func _deferred_change_scene_to_instance(instance):
	get_tree().current_scene.free()
	get_tree().get_root().add_child(instance)
	get_tree().set_current_scene(instance)


func get_level(idx):
	return self.Level_Map[idx]


func start_level(idx):
	var global_level = self.get_level(idx)
	
	var Level = load(global_level.meta.path)
	var instance_level = Level.instance()
	instance_level.idx = idx
	self.change_scene_to_instance(instance_level)


func end_level(instance_level):
	var global_level = self.get_level(instance_level.idx)
	
	var time = stepify(instance_level.timer, 0.01)
	if (global_level.time == 0 or time < global_level.time):
		global_level.time = time
		global_level.cleared_by = Network.player
	
	for id in Network.players:
		rpc_id(id, "_update_level_map", instance_level.idx, global_level)
	get_tree().change_scene("res://UI/LevelSelect.tscn")
	
	self.check_win()


remote func _update_level_map(idx, global_level):
	self.Level_Map[idx] = global_level
	emit_signal("level_map_updated")


func check_win():
	var has_won = false
	
	var cleared_levels_idx = []
	for idx in range(self.Level_Map.size()):
		if self.Level_Map[idx].cleared_by.idx == Network.player.idx:
			cleared_levels_idx.push_back(idx)
	
	var possible_winning_conditions = [
		[0, 1, 2],
		[3, 4, 5],
		[6, 7, 8],
		
		[0, 3, 6],
		[1, 4, 7],
		[2, 5, 8],
		
		[0, 4, 8],
		[2, 4, 6],
	]
	
	# because there's no intersection method on arrays..
	for cond in possible_winning_conditions:
		var has_cleared = 0
		for digit in cond:
			if digit in cleared_levels_idx:
				has_cleared += 1
		
		if has_cleared == 3:
			has_won = true
			break
	
	if has_won:
		emit_signal("game_won", Network.player)


func _on_game_end():
	self.Level_Map = []
	self._ready()