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
|
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():
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)
|