online multiplayer chess game (note server currently down)
Diffstat (limited to 'networking/PacketHandler.gd')
-rw-r--r--networking/PacketHandler.gd102
1 files changed, 63 insertions, 39 deletions
diff --git a/networking/PacketHandler.gd b/networking/PacketHandler.gd
index 9cb6bbd..eb96f08 100644
--- a/networking/PacketHandler.gd
+++ b/networking/PacketHandler.gd
@@ -95,44 +95,68 @@ func _start_game() -> void:
lobby.set_buttons(false)
-func _on_data(data: Dictionary) -> void:
+func _on_data(data: String) -> void:
Globals.add_turn()
Log.debug([data, " recieved"])
- Events.emit_signal("data_recieved")
- match data["type"]:
- 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: Dictionary = data["positions"] # positions is a dict for readability sometimes
- var pawn: 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)
- _:
- Log.err("Wtf")
-
-
-static func dict2vec(dict: Dictionary) -> Vector2:
- return Vector2(dict["x"], dict["y"])
+ Utils.add_move(data)
+ var mov = SanParse.parse(data)
+ match mov.move_kind.type:
+ Move.MoveKind.CASTLE:
+ var side = 7 if Globals.turn else 0
+ var rook: Rook
+ var rook_goto: Vector2
+ var kingpos = Vector2(4, side)
+ var king: King = Piece.at_pos(kingpos)
+ var king_goto: Vector2
+ match mov.move_kind.data:
+ Move.CASTLETYPES.KING_SIDE:
+ rook = Piece.at_pos(Vector2(7, side))
+ rook_goto = Vector2(5, side)
+ king_goto = Vector2(6, side)
+ Move.CASTLETYPES.QUEEN_SIDE:
+ rook = Piece.at_pos(Vector2(0, side))
+ rook_goto = Vector2(3, side)
+ king_goto = Vector2(2, side)
+ _:
+ Log.error("Invalid castle type")
+ return
+ rook.moveto(rook_goto)
+ king.castle(king_goto)
+ Move.MoveKind.NORMAL:
+ # this needs to handle enpassant, taking, and promotion.
+ mov.make_long()
+ var positions = mov.move_kind.data
+ if mov.promotion != -1:
+ var promote_to = SanParse.from_str(mov.promotion)
+ Piece.at_pos(positions[0]).promote_to(promote_to, mov.is_capture, positions[1])
+
+ elif mov.is_capture:
+ Piece.at_pos(positions[0]).take(Piece.at_pos(positions[1]))
+
+ elif not Piece.at_pos(positions[1]) and mov.piece == SanParser.PAWN: # if not positions[1] and piece is pawn: enpassant!
+ var pawn: Pawn = Piece.at_pos(positions[0])
+ pawn.passant(positions[1])
+ else: # a very normal move
+ Piece.at_pos(positions[0]).moveto(positions[1])
+
+ # Events.emit_signal("data_recieved")
+ # match data["type"]:
+ # 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.promote:
+ # var dict_data: Dictionary = data["positions"] # positions is a dict for readability sometimes
+ # _:
+ # Log.err("Wtf")