def place_pdu(self, context, client, x, y):
        if client == context.socket_player_white:
            if GameLogic.is_valid_position(context.boardmodel, x, y, Player.WHITE):
                affected_positions = GameLogic.get_affected_positions(context.boardmodel, x, y, Player.WHITE)
                GameLogic.apply_move(context.boardmodel, x, y, Player.WHITE)
                board_pdu = GameClientPDUCodec.update_board_pdu(Player.WHITE, affected_positions)
                context.request.send_req(context.socket_player_white, board_pdu)
                context.request.send_req(context.socket_player_black, board_pdu)
                next_turn_player = GameLogic.next_turn_player(context.boardmodel, Player.WHITE)

                white_count, black_count = context.boardmodel.count_disks()
                # if white_count > 4:
                #    context.end_game()

                if next_turn_player == Player.WHITE:
                    context.turn = context.socket_player_white
                    context.state = context.WHITE_TURN
                    context.state.turn_req(context)
                elif next_turn_player == Player.BLACK:
                    context.turn = context.socket_player_black
                    context.state = context.BLACK_TURN
                    context.state.turn_req(context)
                else:
                    # no valid movements->board full or no valid placements for any player
                    context.end_game()
            else:
                context.request.send_req(client, GameClientPDUCodec.place_error_pdu())
                context.request.send_req(client, GameClientPDUCodec.turn_pdu())
        else:
            # not your turn
            # read protocol, I don't remember if it's specified to report the error or not
            context.request.send_req(client, GameClientPDUCodec.place_error_pdu())
    def end_game(self, context):
        white_count, black_count = context.boardmodel.count_disks()

        winner_pdu = GameClientPDUCodec.winner_pdu(Player.EMPTY)

        if white_count > black_count:
            winner_pdu = GameClientPDUCodec.winner_pdu(Player.WHITE)
        elif black_count > white_count:
            winner_pdu = GameClientPDUCodec.winner_pdu(Player.BLACK)

        context.request.send_req(context.socket_player_white, winner_pdu)
        context.request.send_req(context.socket_player_black, winner_pdu)
        context.request.shutdown_req()
 def disconnection_ind(self, context, client):
     print "[Game Instance] Got a disconnection"
     winner = None
     if client == context.socket_player_white:
         other_player = context.socket_player_black
         winner = Player.BLACK
     else:
         other_player = context.socket_player_white
         winner = Player.WHITE
     context.request.send_req(other_player, GameClientPDUCodec.winner_pdu(winner))
     context.request.shutdown_req()
    def game_init(self):
        self.request.send_req(self.socket_player_white, GameClientPDUCodec.connect_ok_pdu(Player.WHITE))
        self.request.send_req(self.socket_player_black, GameClientPDUCodec.connect_ok_pdu(Player.BLACK))

        initial_board = GameLogic.initial_board_as_affected_positions(8)
        self.request.send_req(self.socket_player_white, GameClientPDUCodec.update_board_pdu(Player.WHITE, initial_board[0]))
        self.request.send_req(self.socket_player_white, GameClientPDUCodec.update_board_pdu(Player.BLACK, initial_board[1]))
        self.request.send_req(self.socket_player_black, GameClientPDUCodec.update_board_pdu(Player.WHITE, initial_board[0]))
        self.request.send_req(self.socket_player_black, GameClientPDUCodec.update_board_pdu(Player.BLACK, initial_board[1]))

        self.request.send_req(self.socket_player_black, GameClientPDUCodec.turn_pdu())
 def recv_ind(self, client, data):
     (pdu_id, pdu_size, pdu_data) = GameClientPDUCodec.decode(data)
     print (pdu_id, pdu_size, pdu_data)
     if pdu_id == PDUCodes.CLIENT_CONNECT_OK:
         self.state.connection_ok_ind(self, pdu_data[0])
     elif pdu_id == PDUCodes.PLACE_ERROR:
         self.state.place_error_ind(self)
     elif pdu_id == PDUCodes.TURN:
         self.state.turn_ind(self)
     elif pdu_id == PDUCodes.WINNER:
         self.state.winner_ind(self, pdu_data[0])
     elif pdu_id == PDUCodes.UPDATE_BOARD:
         self.state.updated_board_ind(self, pdu_data[0], pdu_data[1])
     return pdu_size
 def turn_req(self, context):
     context.request.send_req(context.turn, GameClientPDUCodec.turn_pdu())