summaryrefslogtreecommitdiff
path: root/UI/lobby.gd
blob: f7d84056a87ffd8ad69dc5bccbcdfd3535565641 (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
extends Control


signal joined

var current_map_idx := 0

var settings := {}

@onready var list: VBoxContainer = %PlayersList


func _ready() -> void:
	if not multiplayer.is_server():
		%StartButton.disabled = true
		#%StartButton.queue_free()
	
	%PlayersList.remove_child(%PlayersList.get_child(0))
	%PlayersList.remove_child(%PlayersList.get_child(0))
	
	if multiplayer.is_server():
		set_map.rpc(current_map_idx)
		joined.connect(func():
			set_map.rpc(current_map_idx)
		)
		for idx in %Maps.get_child_count():
			%Maps.get_child(idx).pressed.connect(func():
				set_map.rpc(idx)
			)
	if not multiplayer.is_server():
		set_map(0)
		for node: Control in %Maps.get_children():
			node.mouse_filter = Control.MOUSE_FILTER_IGNORE
	
	Network.players_changed.connect(update_players)
	update_players()
	
	multiplayer.peer_disconnected.connect(remove_player)
	multiplayer.peer_connected.connect(_on_peer_connected)
	multiplayer.peer_disconnected.connect(_on_peer_disconnected)
	
	# reset map texture for clean load
	%Thumbnail.texture = null
	set_map(current_map_idx)


func update_players():
	for id in Network.get_ordered_player_ids():
		var player: Player = Network.get_player(id)
		
		var control: Control = list.get_node_or_null(str(id))
		if not control:
			control = MarginContainer.new()
			control.name = str(id)
			var label = Label.new()
			label.add_theme_color_override("font_color", player.get_color())
			if id == multiplayer.get_unique_id():
				label.add_theme_color_override("font_outline_color", Color(0.75, 0.75, 0.75, 0.75))
				label.add_theme_constant_override("outline_size", 10)
			control.add_child(label)
			list.add_child(control)
			joined.emit()
		
		control.get_child(0).text = str(player.username)
		control.get_child(0).tooltip_text = str(id)
		list.move_child(control, Network.get_ordered_player_ids().find(id) + 1)


func remove_player(id):
	list.remove_child(list.get_node(str(id)))


func _on_peer_connected(id):
	Network._on_peer_connected(id)
func _on_peer_disconnected(id):
	Network._on_peer_disconnected(id)


func _on_start_button_pressed() -> void:
	start.rpc()


func _on_cancel_button_pressed() -> void:
	multiplayer.multiplayer_peer.close()
	get_tree().change_scene_to_file("res://UI/Start.tscn")


@rpc("authority", "call_local")
func start():
	var packed_scene = %Maps.get_child(current_map_idx).get_meta("map_scene")
	var scene = packed_scene.instantiate()
	
	for setting in settings:
		scene[setting] = settings[setting]
	
	Client.change_scene_to_instance(scene)


@rpc("authority", "call_local")
func set_map(index: int):
	current_map_idx = index
	
	for node: Button in %Maps.get_children():
		node.add_theme_color_override("font_color", Color(1.0, 1.0, 1.0, 0.5))
	
	var node = %Maps.get_child(index)
	var thumbnail = node.get_meta("thumbnail")
	
	# settings
	for child in %Settings.get_children():
		child.queue_free()
	if node.get_meta("settings"):
		var scene = node.get_meta("map_scene").instantiate()
		for setting in node.get_meta("settings", []):
			settings[setting] = scene[setting]
			var control = preload("res://UI/lobby_setting.tscn").instantiate()
			control.label = setting
			control.value = settings[setting]
			control.disabled = !multiplayer.is_server()
			if multiplayer.is_server():
				control.value_changed.connect(func(value):
					set_setting.rpc(setting, value)
				)
			%Settings.add_child(control)
	
	node.add_theme_color_override("font_color", Color(1.0, 1.0, 1.0, 1.0))
	%Thumbnail.texture = thumbnail


@rpc("authority", "call_local")
func set_setting(key: String, value: Variant):
	settings[key] = value
	
	if not multiplayer.is_server():
		%Settings.get_node(key).value = value