public static Response parseGameAction(MessageBuffer msg)
 {
     msg.reset();
       Int32 size = msg.popInt();
       Int16 action = msg.popShort();
       Int32 timeStep = msg.popInt();
       Int16 playerId = msg.popShort();
       Int32 xPos = msg.popInt();
       Int32 yPos = msg.popInt();
       switch (action)
       {
     case Constants.POINTER_LOCATION:
       return new PointerLocationResponse(timeStep, playerId, xPos, yPos);
     case Constants.SELECTED_CASTLE:
       return new SelectedCastleResponse(timeStep, playerId, xPos, yPos);
     case Constants.PLACED_CANNON:
       return new PlacedCannonResponse(timeStep, playerId, xPos, yPos);
     case Constants.FIRED_CANNON:
       return new FiredCannonResponse(timeStep, playerId, xPos, yPos);
     case Constants.ROTATED_WALL:
       return new RotatedWallResponse(timeStep, playerId, xPos, yPos);
     case Constants.PLACED_WALL:
       return new PlacedWallResponse(timeStep, playerId, xPos, yPos);
     default:
       return null;
       }
 }
 public static Response parseEndGame(MessageBuffer msg)
 {
     msg.reset();
       Int32 size = msg.popInt();
       Int16 action = msg.popShort();
       Int16 winnerID = msg.popShort();
       return new EndGameResponse(winnerID);
 }
 public static Response parseAuthAction(MessageBuffer msg)
 {
     msg.reset();
       Int32 size = msg.popInt();
       Int16 action = msg.popShort();
       Int16 result = msg.popShort();
       return new LoginResponse(result);
 }
 public static Response parseCreateRoom(MessageBuffer msg)
 {
     msg.reset();
       Int32 size = msg.popInt();
       Int16 action = msg.popShort();
       Int16 result = msg.popShort();
       string roomName = msg.popString();
       return new RoomCreatedResponse(result, roomName);
 }
 public static Response parseAllowJoinRoom(MessageBuffer msg)
 {
     msg.reset();
       Int32 size = msg.popInt();
       Int16 action = msg.popShort();
       Int16 numPlayers = msg.popShort();
       string roomName = msg.popString();
       List<string> playerNames = new List<string>(numPlayers);
       for (int i = 0; i < numPlayers; i++)
     playerNames.Add(msg.popString());
       return new RoomJoinedResponse(roomName, playerNames, numPlayers);
 }
 public static Response parseDenyJoinRoom(MessageBuffer msg)
 {
     msg.reset();
       Int32 size = msg.popInt();
       Int16 action = msg.popShort();
       string roomName = msg.popString();
       return new RoomNotJoinedResponse(roomName);
 }
 public static Response parseLeaveRoom(MessageBuffer msg)
 {
     msg.reset();
       Int32 size = msg.popInt();
       Int16 action = msg.popShort();
       string userName = msg.popString();
       string roomName = msg.popString();
       return new PlayerLeftRoomResponse(userName, roomName);
 }
 public static Response parseStartGame(MessageBuffer msg)
 {
     msg.reset();
       Int32 size = msg.popInt();
       Int16 action = msg.popShort();
       Int16 numPlayers = msg.popShort();
       List<Int16> playerIds = new List<Int16>(numPlayers);
       for (int i = 0; i < numPlayers; i++)
     playerIds.Add(msg.popShort());
       List<string> playerNames = new List<string>(numPlayers);
       for (int i = 0; i < numPlayers; i++)
     playerNames.Add(msg.popString());
       string map = msg.popString();
       return new StartGameResponse(playerNames, map);
 }
        public static Response parseSendAvailableRooms(MessageBuffer msg)
        {
            msg.reset();
              Int32 size = msg.popInt();
              Int16 action = msg.popShort();
              Int16 numRooms = msg.popShort();
              List<string> roomNames = new List<string>(numRooms);
              for (int i = 0; i < numRooms; i++)
            roomNames.Add(msg.popString());

              List<Room> rooms = new List<Room>(numRooms);
              for (int i = 0; i < numRooms; i++)
            rooms.Add(new Room(roomNames[i], 2));
              return new RoomsAvailableResponse(rooms);
        }
        /**
         * @brief Parse the given packet, transforming it into an instance of the appropriate Response-derived class
         * @param packet the entire packet buffer, including the header consisting of the size and action
         * @return Response represetnting response to message parsed.
         */
        public static Response parsePacket(byte[] packet)
        {
            MessageBuffer msg = new MessageBuffer(packet);
              Response resp = null;

              Int32 size = msg.popInt();
              Int16 action = msg.popShort();
              switch (action)
              {
            case Constants.SERVER_AUTH_ACTION:
              resp = parseAuthAction(msg);
              break;

            case Constants.SERVER_SEND_AVAILABLE_ROOMS_ACTION:
              resp = parseSendAvailableRooms(msg);
              break;

            case Constants.SERVER_CREATE_ROOM_ACTION:
              resp = parseCreateRoom(msg);
              break;

            case Constants.SERVER_ALLOW_JOIN_ROOM_ACTION:
              resp = parseAllowJoinRoom(msg);
              break;

            case Constants.SERVER_DENY_JOIN_ROOM_ACTION:
              resp = parseDenyJoinRoom(msg);
              break;

            case Constants.SERVER_PLAYER_JOINED_ROOM_ACTION:
              resp = parsePlayerJoinedRoom(msg);
              break;

            case Constants.SERVER_LEAVE_ROOM_ACTION:
              resp = parseLeaveRoom(msg);
              break;

            case Constants.SERVER_OWNER_LEFT_ROOM_ACTION:
              resp = parseOwnerLeftRoom(msg);
              break;

            case Constants.SERVER_START_GAME_ACTION:
              resp = parseStartGame(msg);
              break;
            case Constants.END_GAME:
              resp = parseEndGame(msg);
              break;
            case Constants.POINTER_LOCATION:
              resp = parseGameAction(msg);
              break;
            case Constants.SELECTED_CASTLE:
              resp = parseGameAction(msg);
              break;
            case Constants.PLACED_CANNON:
              resp = parseGameAction(msg);
              break;
            case Constants.FIRED_CANNON:
              resp = parseGameAction(msg);
              break;
            case Constants.ROTATED_WALL:
              resp = parseGameAction(msg);
              break;
            case Constants.PLACED_WALL:
              resp = parseGameAction(msg);
              break;
            default:
              resp = null;
              break;
              }
              return resp;
        }