online multiplayer chess game (note server currently down)
Diffstat (limited to 'ui/Lobby.gd')
-rw-r--r--ui/Lobby.gd135
1 files changed, 135 insertions, 0 deletions
diff --git a/ui/Lobby.gd b/ui/Lobby.gd
new file mode 100644
index 0000000..0637e84
--- /dev/null
+++ b/ui/Lobby.gd
@@ -0,0 +1,135 @@
+# Default game server port. Can be any number between 1024 and 49151.
+# Not on the list of registered or common ports as of November 2020:
+# https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
+extends Control
+
+# Default game server port. Can be any number between 1024 and 49151.
+# Not on the list of registered or common ports as of November 2020:
+# https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
+const DEFAULT_PORT = 8910
+
+var peer = null
+
+onready var address: LineEdit = $Back/Center/HBox/VBox/Address
+onready var host_button = $Back/Center/HBox/VBox/HBox/HostButton
+onready var join_button = $Back/Center/HBox/VBox/HBox/JoinButton
+onready var status_ok = $Back/Center/HBox/VBox/StatusOK
+onready var status_fail = $Back/Center/HBox/VBox/StatusFail
+onready var port_forward_label = $Back/Center/HBox/VBox2/Portforward
+onready var find_public_ip_button = $Back/Center/HBox/VBox2/FindPublicIP
+
+
+func toggle(onoff):
+ visible = onoff
+
+
+func _ready():
+ address.get_menu()
+ # Connect all the callbacks related to networking.
+ 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, "_connected_ok")
+ get_tree().connect("connection_failed", self, "_connected_fail")
+ get_tree().connect("server_disconnected", self, "_server_disconnected")
+
+
+#### Network callbacks from SceneTree ####
+
+
+# Callback from SceneTree.
+func _player_connected(_id):
+ # Someone connected, start the game!
+ var chess = load("res://World.tscn").instance()
+ # Connect deferred so we can safely erase it from the callback.
+ chess.connect("game_over", self, "_end_game", [], CONNECT_DEFERRED)
+
+ get_tree().get_root().add_child(chess)
+
+
+func _player_disconnected(_id):
+ if get_tree().is_network_server():
+ _end_game("Client disconnected")
+ else:
+ _end_game("Server disconnected")
+
+
+# Callback from SceneTree, only for clients (not server).
+func _connected_ok():
+ pass # This function is not needed for this project.
+
+
+# Callback from SceneTree, only for clients (not server).
+func _connected_fail():
+ _set_status("Couldn't connect", false)
+
+ get_tree().set_network_peer(null) # Remove peer.
+ host_button.show()
+ address.editable = true
+
+
+func _server_disconnected():
+ _end_game("Server disconnected")
+
+
+##### Game creation functions ######
+
+
+func _end_game(_with_error = ""):
+ if has_node("/root/World"):
+ # Erase immediately, otherwise network might show
+ # errors (this is why we connected deferred above).
+ get_node("/root/World").free()
+ show()
+
+ get_tree().set_network_peer(null) # Remove peer.
+ host_button.show()
+ join_button.show()
+ address.editable = true
+
+
+func _set_status(text, isok):
+ # Simple way to show status.
+ if isok:
+ status_ok.set_text(text)
+ status_fail.set_text("")
+ status_ok.visible = len(status_ok.text) > 0
+ status_fail.visible = len(status_fail.text) > 0
+ else:
+ status_ok.set_text("")
+ status_fail.set_text(text)
+ status_fail.visible = len(status_fail.text) > 0
+ status_ok.visible = len(status_ok.text) > 0
+
+
+func _on_host_pressed():
+ peer = NetworkedMultiplayerENet.new()
+ peer.set_compression_mode(NetworkedMultiplayerENet.COMPRESS_RANGE_CODER)
+ var err = peer.create_server(DEFAULT_PORT, 1) # Maximum of 1 peer, since it's a 2-player game.
+ if err != OK:
+ # Is another server running?
+ _set_status("Can't host, address in use.", false)
+ return
+
+ get_tree().set_network_peer(peer)
+ host_button.hide()
+ address.editable = false
+ join_button.hide()
+ _set_status("Waiting for player...", true)
+
+ # Only show hosting instructions when relevant.
+
+
+func _on_join_pressed():
+ var ip = address.get_text()
+ if not ip.is_valid_ip_address():
+ _set_status("IP address is invalid", false)
+ return
+
+ peer = NetworkedMultiplayerENet.new()
+ peer.set_compression_mode(NetworkedMultiplayerENet.COMPRESS_RANGE_CODER)
+ peer.create_client(ip, DEFAULT_PORT)
+ get_tree().set_network_peer(peer)
+
+
+func _on_find_public_ip_pressed():
+ OS.shell_open("https://icanhazip.com/")