summaryrefslogtreecommitdiff
path: root/Network
diff options
context:
space:
mode:
Diffstat (limited to 'Network')
-rw-r--r--Network/Lobby.gd82
-rw-r--r--Network/Lobby.tscn101
-rw-r--r--Network/Network.gd114
3 files changed, 297 insertions, 0 deletions
diff --git a/Network/Lobby.gd b/Network/Lobby.gd
new file mode 100644
index 0000000..d962081
--- /dev/null
+++ b/Network/Lobby.gd
@@ -0,0 +1,82 @@
+extends Control
+
+
+func _ready():
+ Network.connect("connection_succeeded", self, "_on_connection_succeeded")
+ Network.connect("connection_failed", self, "_on_connection_failed")
+ Network.connect("player_list_changed", self, "refresh_lobby")
+ Network.connect("game_error", self, "_on_game_error")
+ Network.connect("game_ended", self, "_on_game_ended")
+
+ if OS.has_environment("USERNAME"):
+ $Connect/Name.text = OS.get_environment("USERNAME")
+ else:
+ var desktop_path = OS.get_system_dir(0).replace("\\", "/").split("/")
+ $Connect/Name.text = desktop_path[desktop_path.size() - 2]
+
+
+func disable_connect_buttons(is_disabled = true):
+ $Connect/Host.disabled = is_disabled
+ $Connect/Join.disabled = is_disabled
+
+
+func refresh_lobby():
+ var players = Network.players.values()
+ var player = Network.player
+
+ $Players/List.clear()
+ $Players/List.add_item(player.name + " (You)")
+ for p in players:
+ $Players/List.add_item(p.name)
+
+ $Players/Start.disabled = not get_tree().is_network_server()
+
+
+func _on_connection_succeeded():
+ $Connect.hide()
+ $Players.show()
+
+
+func _on_connection_failed():
+ self.disable_connect_buttons()
+ $Connect/Error.set_text("Connection failed!")
+
+
+func _on_game_error(error):
+ $ErrorDialog.dialog_text = error
+ $ErrorDialog.popup_centered_minsize()
+ self.disable_connect_buttons()
+
+
+func _on_game_ended():
+ self.show()
+ $Connect.show()
+ $Players.hide()
+ self.disable_connect_buttons()
+
+
+func _on_Host_pressed():
+ $Connect.hide()
+ $Players.show()
+ $Connect/Error.text = ""
+
+ var player_name = $Connect/Name.text
+ Network.host_game(player_name)
+ self.refresh_lobby()
+
+
+func _on_Join_pressed():
+ var ip = $Connect/IP.text
+ if not ip.is_valid_ip_address():
+ $Connect/Error.text = "Invalid IP address!"
+ return
+
+ $Connect/Error.text = ""
+ self.disable_connect_buttons(false)
+
+ var player_name = $Connect/Name.text
+ Network.join_game(ip, player_name)
+
+
+func _on_Start_pressed():
+ Network.start_game()
diff --git a/Network/Lobby.tscn b/Network/Lobby.tscn
new file mode 100644
index 0000000..0caf892
--- /dev/null
+++ b/Network/Lobby.tscn
@@ -0,0 +1,101 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://Network/Lobby.gd" type="Script" id=1]
+
+[node name="Lobby" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Connect" type="Panel" parent="."]
+margin_left = 424.0
+margin_top = 232.0
+margin_right = 600.0
+margin_bottom = 376.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Name" type="LineEdit" parent="Connect"]
+margin_left = 8.0
+margin_top = 8.0
+margin_right = 168.0
+margin_bottom = 32.0
+placeholder_text = "Name"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="IP" type="LineEdit" parent="Connect"]
+margin_left = 8.0
+margin_top = 40.0
+margin_right = 168.0
+margin_bottom = 64.0
+placeholder_text = "IP"
+
+[node name="Host" type="Button" parent="Connect"]
+margin_left = 8.0
+margin_top = 112.0
+margin_right = 64.0
+margin_bottom = 136.0
+text = "Host"
+
+[node name="Join" type="Button" parent="Connect"]
+margin_left = 112.0
+margin_top = 112.0
+margin_right = 168.0
+margin_bottom = 136.0
+text = "Join"
+
+[node name="Error" type="Label" parent="Connect"]
+margin_left = 8.0
+margin_top = 72.0
+margin_right = 168.0
+margin_bottom = 104.0
+custom_colors/font_color = Color( 1, 0.137255, 0.137255, 1 )
+
+[node name="Players" type="Panel" parent="."]
+visible = false
+margin_left = 384.0
+margin_top = 48.0
+margin_right = 640.0
+margin_bottom = 512.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Label" type="Label" parent="Players"]
+margin_left = 16.0
+margin_top = 16.0
+margin_right = 240.0
+margin_bottom = 32.0
+text = "Lobby"
+
+[node name="List" type="ItemList" parent="Players"]
+margin_left = 16.0
+margin_top = 48.0
+margin_right = 240.0
+margin_bottom = 400.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Start" type="Button" parent="Players"]
+margin_left = 64.0
+margin_top = 416.0
+margin_right = 192.0
+margin_bottom = 448.0
+text = "START!"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ErrorDialog" type="AcceptDialog" parent="."]
+margin_right = 83.0
+margin_bottom = 58.0
+[connection signal="pressed" from="Connect/Host" to="." method="_on_Host_pressed"]
+[connection signal="pressed" from="Connect/Join" to="." method="_on_Join_pressed"]
+[connection signal="pressed" from="Players/Start" to="." method="_on_Start_pressed"]
diff --git a/Network/Network.gd b/Network/Network.gd
new file mode 100644
index 0000000..0f007b4
--- /dev/null
+++ b/Network/Network.gd
@@ -0,0 +1,114 @@
+extends Node
+
+
+signal connection_succeeded()
+signal connection_failed()
+signal player_list_changed()
+signal game_error()
+signal game_ended()
+
+
+const PORT = 10567
+
+const MAX_PEERS = 2
+
+
+var peer = null
+
+var player = {
+ idx = 0,
+ name = "",
+}
+
+# Dictionary { id = { idx: 1, name: "" } }
+var players = {}
+var players_ready = []
+
+
+func _ready():
+ get_tree().connect("network_peer_connected", self, '_player_connected')
+ get_tree().connect("network_peer_disconnected", self,"_player_disconnected")
+ get_tree().connect("connected_to_server", self, "_connection_succeeded")
+ get_tree().connect("connection_failed", self, "_connection_failed")
+ get_tree().connect("server_disconnected", self, "_server_disconnected")
+ Global.connect("game_won", self, "end_game")
+
+
+remote func register_player(name):
+ var id = get_tree().get_rpc_sender_id()
+ self.players[id] = {
+ name = name
+ }
+ emit_signal("player_list_changed")
+
+
+func unregister_player(id):
+ self.player.erase(id)
+ emit_signal("player_list_changed")
+
+
+func host_game(player_name):
+ self.player.name = player_name
+ self.peer = NetworkedMultiplayerENet.new()
+ self.peer.create_server(self.PORT, self.MAX_PEERS)
+ get_tree().set_network_peer(self.peer)
+
+
+func join_game(ip, player_name):
+ self.player.name = player_name
+ self.peer = NetworkedMultiplayerENet.new()
+ self.peer.create_client(ip, self.PORT)
+ get_tree().set_network_peer(self.peer)
+
+
+func start_game():
+ # preconfigure game and set idx to each player
+ var idx = 1
+ for id in self.players:
+ self.players[id].idx = idx
+ rpc_id(id, "_preconfigure_game", idx)
+ idx += 1
+
+ # start game for everyone
+ rpc("_start_game")
+
+
+remote func _preconfigure_game(idx):
+ self.player.idx = idx
+
+
+sync func _start_game():
+ get_tree().change_scene("res://UI/LevelSelect.tscn")
+
+
+func end_game(winning_player):
+ # TODO: change scene for all to win scene and set winning player id,
+ # so it can be displayed with self.players
+ print(winning_player)
+ get_tree().change_scene("res://Network/Lobby.tscn")
+ pass
+
+
+func _player_connected(id):
+ rpc_id(id, "register_player", self.player.name)
+
+
+func _player_disconnected(id):
+ # if game is in progress:
+ # self.end_game() ?
+ # else
+ self.unregister_player(id)
+
+
+func _connection_succeeded():
+ emit_signal("connection_succeeded")
+
+
+func _connection_failed():
+ get_tree().set_network_peer(null) # remove peer
+ emit_signal("connection_failed")
+
+
+func _server_disconnected():
+ emit_signal("game_error", "Server disconnected!")
+ self.end_game("")