online multiplayer chess game (note server currently down)
Diffstat (limited to 'networking/PacketHandler.gd')
-rw-r--r--networking/PacketHandler.gd161
1 files changed, 141 insertions, 20 deletions
diff --git a/networking/PacketHandler.gd b/networking/PacketHandler.gd
index 5806126..01f410b 100644
--- a/networking/PacketHandler.gd
+++ b/networking/PacketHandler.gd
@@ -1,10 +1,36 @@
-extends Node
-class_name NetManager
+extends Network
var lobby: Lobby = null
signal hosting(newhosting)
-signal game_over
-signal game_started
+signal signal_recieved(what)
+signal chat(text)
+signal undo(undo)
+signal info_recieved(info)
+signal start_game
+signal move_data(data)
+## for accounts(mostly)
+signal signinresult(what)
+signal signupresult(what)
+
+const HEADERS := {
+ "joinrequest": "J",
+ "hostrequest": "H",
+ "stopgame": "K",
+ "signup": "C",
+ "signin": ">",
+ "relay": "R", # relay goes to both
+ "signal": "S", # signal is one way
+ "loadpgn": "L", # server telling me to load a pgn
+ "info": "I",
+ "move": "M",
+ "undo": "<",
+ "spectate": "0" # its a eye you see
+}
+
+var game_code := ""
+
+const RELAYHEADERS := {chat = "C"}
+const SIGNALHEADERS := {takeback = "T", draw = "D", resign = "R", info = "I"} # subheaders for HEADERS.signal
var hosting := false setget set_hosting
var leaving := false
@@ -18,7 +44,7 @@ func set_hosting(newhosting: bool) -> void:
func return() -> void: # return to the void
if hosting:
leaving = true
- Globals.network.stopgame("") # stop hosting
+ stopgame("") # stop hosting
lobby.set_status("", true)
set_hosting(false)
lobby.set_buttons(true)
@@ -26,29 +52,81 @@ func return() -> void: # return to the void
func _ready() -> void:
if Utils.internet and get_tree().get_root().has_node("StartMenu"):
- var net := Network.new()
- Events.connect("go_back", self, "_handle_game_over")
- net.connect("join_result", self, "_on_join_result")
- net.connect("host_result", self, "_on_host_result")
- net.connect("game_over", self, "_handle_game_over")
- net.connect("start_game", self, "_start_game")
- net.connect("connection_established", self, "network_ready")
- add_child(net)
- Globals.network = net
yield(get_tree().create_timer(.1), "timeout")
+ open() # open connection
lobby.set_status("Connecting", true)
-func network_ready() -> void:
+func _data_recieved() -> void:
+ var data = ws.get_peer(1).get_var()
+ Log.net(["RECIEVED:", data])
+ var header: String = data.header
+ var text = data.data
+ match header:
+ HEADERS.undo:
+ emit_signal("undo", text)
+ HEADERS.move:
+ if !OS.is_window_focused() and !Debug.debug: # dont be annoying in debug mode
+ OS.request_attention()
+ emit_signal("move_data", text.move)
+ HEADERS.hostrequest:
+ host_result(text)
+ HEADERS.relay:
+ var relay: Dictionary = text
+ match relay.type:
+ RELAYHEADERS.chat:
+ emit_signal("chat", relay)
+ HEADERS.joinrequest:
+ join_result(text)
+ HEADERS.info:
+ yield(get_tree().create_timer(.5), "timeout")
+ emit_signal("info_recieved", text)
+ HEADERS.spectate:
+ # handle spectate here
+ if typeof(text) == TYPE_STRING: # ew error
+ lobby.set_status(text, false)
+ lobby.set_buttons(true)
+ return
+ Globals.spectating = true
+ _start_game()
+ yield(get_tree().create_timer(.5), "timeout")
+ Globals.grid.play_pgn(text.pgn, true)
+ emit_signal("info_recieved", text)
+ HEADERS.loadpgn:
+ _start_game()
+ yield(get_tree().create_timer(.5), "timeout")
+ Log.info("load pgn " + text)
+ Globals.grid.play_pgn(text, true) # call deferred wont work since grid obj may be null
+ HEADERS.stopgame:
+ if !leaving: # dont emit the signal if its a stophost thing (HACK)
+ emit_signal("game_over", text, true)
+ leaving = false
+ HEADERS.signal:
+ var signal: Dictionary = text
+ match signal.type:
+ _:
+ emit_signal("signal_recieved", signal)
+ HEADERS.signup:
+ emit_signal("signupresult", text)
+ HEADERS.signin:
+ emit_signal("signinresult", text)
+ _:
+ Log.err("unknown header %s" % header)
+
+
+func _connection_established(protocol) -> void:
+ ._connection_established(protocol)
lobby.set_status("", true)
lobby.set_buttons(true)
-func _on_join_result(accepted) -> void:
- handle_result(accepted, "Joined!")
+func join_result(accepted) -> void:
+ if handle_result(accepted, "Joined!"):
+ yield(get_tree(), "idle_frame")
+ Globals.grid.flip_board() # joine should be black; flip the board
-func _on_host_result(accepted) -> void:
+func host_result(accepted) -> void:
set_hosting(handle_result(accepted, "Hosted!"))
@@ -63,7 +141,7 @@ func handle_result(accepted, resultstring: String) -> bool:
func _handle_game_over(error := "game over", isok := true) -> void:
- Globals.network.stopgame(error)
+ stopgame(error)
Globals.reset_vars()
if has_node("/root/Game"):
get_node("/root/Game").queue_free()
@@ -78,5 +156,48 @@ func _start_game() -> void:
var board: Control = load("res://Game.tscn").instance()
get_tree().get_root().add_child(board)
lobby.toggle(false)
- emit_signal("game_started")
+ emit_signal("start_game")
lobby.set_buttons(false)
+
+
+## packet sending wrapper functions
+func signin(data):
+ send_packet(data, HEADERS.signin)
+
+
+func signup(data):
+ send_packet(data, HEADERS.signup)
+
+
+func signal(body: Dictionary, header: String, _mainheader := HEADERS.signal) -> Dictionary:
+ var data: Dictionary = Utils.append_dict({"type": header}, body)
+ send_gamecode_packet(data, _mainheader)
+ return data
+
+
+func join_game(game: String = game_code) -> void:
+ send_gamecode_packet(SaveLoad.get_public_info(), HEADERS.joinrequest, game)
+
+
+func host_game(game: String = game_code) -> void:
+ send_gamecode_packet(SaveLoad.get_public_info(), HEADERS.hostrequest, game)
+
+
+func spectate(game: String = game_code) -> void:
+ send_gamecode_packet(SaveLoad.get_public_info(), HEADERS.spectate, game)
+
+
+func send_gamecode_packet(data: Dictionary, header: String, gamecode: String = game_code):
+ send_packet(Utils.append_dict({"gamecode": gamecode}, data), header)
+
+
+func relay_signal(body: Dictionary, header: String) -> Dictionary: # its really the same thing as signal()
+ return signal(body, header, HEADERS.relay)
+
+
+func send_mov(mov: Move):
+ send_packet({move = mov.compile(), gamecode = game_code}, HEADERS.move)
+
+
+func stopgame(reason: String) -> void:
+ send_packet({"reason": reason, "gamecode": game_code}, HEADERS.stopgame)