diff options
author | Daniel Weipert <code@drogueronin.de> | 2021-01-02 14:54:57 +0100 |
---|---|---|
committer | Daniel Weipert <code@drogueronin.de> | 2021-01-02 14:54:57 +0100 |
commit | ebae6d04ffc95c6648e863d3de71835f6cd4be96 (patch) | |
tree | 58ce9119a65ccd6925d661f12aab98a057dfb53d /Network | |
parent | fb64f15e22acfc1c03c7c5357dd66077454adbcf (diff) |
Initial working commit
Diffstat (limited to 'Network')
-rw-r--r-- | Network/Lobby.gd | 82 | ||||
-rw-r--r-- | Network/Lobby.tscn | 101 | ||||
-rw-r--r-- | Network/Network.gd | 114 |
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("") |