online multiplayer chess game (note server currently down)
Diffstat (limited to 'networking/Network.gd')
| -rw-r--r-- | networking/Network.gd | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/networking/Network.gd b/networking/Network.gd new file mode 100644 index 0000000..6c8758c --- /dev/null +++ b/networking/Network.gd @@ -0,0 +1,105 @@ +extends Node +class_name Network + +var ws := WebSocketClient.new() +var game_code := "" + +const HEADERS := { + "move": "M", + "joinrequest": "J", + "hostrequest": "H", + "stopgame": "K", + "ping": "P", + "startgame": "S", +} + +const MOVEHEADERS := { + "take": "K", + "move": "M", + "castle": "C", + "passant": "P", + "promote": "Q", +} + +var notation := "" + +signal start_game +signal move_data(data) +signal host_result(result) +signal join_result(result) +signal game_over(problem, isok) + +const url := "wss://gd-chess-server.herokuapp.com/" + + +func _ready() -> void: + ws.connect("connection_established", self, "_connection_established") + ws.connect("connection_closed", self, "_connection_closed") + ws.connect("connection_error", self, "_connection_error") + ws.connect("data_received", self, "_data_recieved") + print("Connecting to server...") # maybe i shouldnt broadcast the server url + ws.connect_to_url(url) + var t = Timer.new() + add_child(t) + t.wait_time = 1 + t.start(1) + t.connect("timeout", self, "ping") + + +func ping() -> void: + send_packet("ping", HEADERS.ping) + + +func _connection_established(_protocol) -> void: + print("Connection established") + + +func _connection_closed(_was_clean_closed) -> void: + printerr("Connection closed") + emit_signal("game_over", "Connection closed", false) + + +func _connection_error() -> void: + printerr("Connection error") + emit_signal("game_over", "Connection error", false) + + +func send_move_packet(positions, header: String) -> void: + var packet := {"movetype": header, "gamecode": game_code, "positions": positions} + Globals.add_turn() + var globals = Globals.pack_vars() + for variable in globals: + packet[variable] = globals[variable] + send_packet(packet, HEADERS.move) # your move will wait till the server relays back :> + + +func _data_recieved() -> void: + var recieve: Dictionary = ws.get_peer(1).get_var() + var header: String = recieve.header + var text = recieve.data + match header: + HEADERS.hostrequest: + emit_signal("host_result", text) + HEADERS.move: + emit_signal("move_data", text) + HEADERS.joinrequest: + emit_signal("join_result", text) + HEADERS.stopgame: + emit_signal("game_over", "your opponent requested stop", true) + HEADERS.startgame: + emit_signal("start_game") + HEADERS.ping: + pass + + +func _process(_delta) -> void: + if ( + ws.get_connection_status() == ws.CONNECTION_CONNECTING + or ws.get_connection_status() == ws.CONNECTION_CONNECTED + ): + ws.poll() + + +func send_packet(variant, header: String) -> void: + if ws.get_peer(1).is_connected_to_host(): + ws.get_peer(1).put_var({"header": header, "data": variant}) |