online multiplayer chess game (note server currently down)
Diffstat (limited to 'networking/PacketHandler.gd')
| -rw-r--r-- | networking/PacketHandler.gd | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/networking/PacketHandler.gd b/networking/PacketHandler.gd new file mode 100644 index 0000000..9ce4a09 --- /dev/null +++ b/networking/PacketHandler.gd @@ -0,0 +1,155 @@ +extends Node +class_name NetManager + +### for the ui +signal set_buttons(enabled) +signal set_status(status, err, isok) +signal set_visible(visibility) +signal set_back_button(disabled) + +signal game_over +signal game_started + +var hosting = false +var leaving = false + +var status = ["", true, false] + +func set_buttons(enabled): + status[2] = enabled + emit_signal("set_buttons", enabled) + +func return(): + if hosting: + leaving = true + Globals.network.send_packet(Globals.network.game_code, Network.HEADERS.stopgame) # stop hosting + hosting = false + set_buttons(true) + set_status("", true) + + +func _ready(): + get_tree().set_auto_accept_quit(false) + if Utils.internet_available(): + var net = Network.new() + set_status("Connecting", true) + Events.connect("go_back", self, "_handle_game_over") + net.connect("move_data", self, "_on_data") + 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 + + +func requestjoin(): + set_buttons( false) + emit_signal("set_back_button", true) + Globals.network.send_packet(Globals.network.game_code, Globals.network.HEADERS.joinrequest) + + +func requesthost(): + set_buttons(false) + emit_signal("set_back_button", true) + Globals.network.send_packet(Globals.network.game_code, Globals.network.HEADERS.hostrequest) + + +func network_ready(): + set_status("", true) + set_buttons(true) + + +func set_status(text, isok): + status[0] = text + status[1] = isok + emit_signal("set_status", text, isok) + + +func _on_join_result(accepted: String) -> void: + if handle_result(accepted, "Joined!", false): + Globals.network.send_packet(Globals.network.game_code, Globals.network.HEADERS.startgame) + + +func _on_host_result(accepted: String) -> void: + hosting = handle_result(accepted, "Hosted!") + + +func handle_result(accepted: String, resultstring: String, team: bool = true) -> bool: + emit_signal("set_back_button", false) + Globals.team = team + if accepted == "Y": + set_status(resultstring, true) + return true + set_status(accepted, false) + set_buttons( true) + return false + + +func _handle_game_over(error = "game over", isok = true) -> void: + Globals.reset_vars() + if get_tree().get_root().has_node("Board"): + get_tree().get_root().get_node("Board").queue_free() + set_status(error, isok) + emit_signal("set_visible", true) + emit_signal("game_over") + + +func _start_game() -> void: + hosting = false + var board = load("res://Board.tscn").instance() + get_tree().get_root().add_child(board) + emit_signal("set_visible", false) + emit_signal("game_started") + set_buttons(false) + + +static func add_turn() -> void: + Events.emit_signal("just_before_turn_over") + Globals.add_turn() + Globals.turn = not Globals.turn + Events.emit_signal("turn_over") + + +func _on_data(data: Dictionary) -> void: + Log.debug([data, " recieved"]) + Globals.fullmove = data["fullmove"] + Globals.turn = data["turn"] + Globals.halfmove = data["halfmove"] + Events.emit_signal("data_recieved") + match data["movetype"]: + Network.MOVEHEADERS.passant: + # en passant + var end_pos = dict2vec(data["positions"][1]) + var start_piece = Piece.at_pos(dict2vec(data["positions"][0])) + Piece.at_pos(dict2vec(data["positions"][2])).took() # kill the unfortunate + start_piece.passant(end_pos) + Network.MOVEHEADERS.move: + var start_piece = Piece.at_pos(dict2vec(data["positions"][0])) + var end_pos = dict2vec(data["positions"][1]) + var end_piece = Piece.at_pos(end_pos) + if end_piece != null: + start_piece.take(end_piece) + else: + start_piece.moveto(end_pos) + Network.MOVEHEADERS.castle: + var king = Piece.at_pos(dict2vec(data["positions"]["king"])) + var rook = Piece.at_pos(dict2vec(data["positions"]["rook"])) + rook.moveto(dict2vec(data["positions"]["rookdestination"]), true, false, true) + Utils.add_move(king.castle(dict2vec(data["positions"]["kingdestination"]))) + Network.MOVEHEADERS.promote: + var dict_data = data["positions"] # positions is a dict for readability sometimes + var pawn = Piece.at_pos(dict2vec(dict_data["start_position"])) + var dest = dict2vec(dict_data["destination"]) + if Piece.at_pos(dest) != null: + Piece.at_pos(dest).took() # move the pawn to the new place, killing if necessary + pawn.clear_clicked() + Globals.grid.make_piece(dest, Pawn.piece(dict_data["become"]), dict_data["white"]) # create the promotion + pawn.took() # kill the pawn + Utils.add_move(dict_data["notation"]) # add a move + Globals.grid.print_matrix_pretty(Globals.grid.matrix) + + +static func dict2vec(dict: Dictionary) -> Vector2: + return Vector2(dict["x"], dict["y"]) |