public static NetworkResponse Parse(MemoryStream dataStream)
    {
        ResponseSpeciesAction response = new ResponseSpeciesAction();
        response.action = DataReader.ReadShort(dataStream);
        response.status = DataReader.ReadShort(dataStream);

        if (response.action == 0) {
            response.type = DataReader.ReadShort(dataStream);
            response.selectionList = DataReader.ReadString(dataStream);
        }

        return response;
    }
    public static NetworkResponse Parse(MemoryStream dataStream)
    {
        ResponseSpeciesAction response = new ResponseSpeciesAction();

        response.action = DataReader.ReadShort(dataStream);
        response.status = DataReader.ReadShort(dataStream);

        if (response.action == 0)
        {
            response.type          = DataReader.ReadShort(dataStream);
            response.selectionList = DataReader.ReadString(dataStream);
        }

        return(response);
    }
//	void OnGUI() {
//		windowRect = GUILayout.Window((int) Constants.GUI_ID.World_Menu, windowRect, MakeWindow, "World Menu");
//
//		windowRect.x = (Screen.width - windowRect.width) / 2;
//		windowRect.y = (Screen.height - windowRect.height) / 2;
//	}
//
//	void MakeWindow(int id) {
//		avatarRect = new Rect(20, 30, 80, 80);
//		GUI.Box(avatarRect, "");
////		GUI.DrawTexture(avatarRect, avatar);
//
//		List<WorldData> wListSorted = new List<WorldData>(worldList.Values);
//
//		Rect wListBox = new Rect(20, 120, 180, 30);
//		GUI.Box(wListBox, "");
//
//		scrollViewVector = GUI.BeginScrollView(wListBox, scrollViewVector, new Rect(0, 0, wListBox.width - 16, wListBox.height * wListSorted.Count), false, true);
//			for (int i = 0; i < wListSorted.Count; i++) {
//				if (wListSorted[i] == worldSelected) {
//					GUI.backgroundColor = Color.black;
//				}
//
//				if (GUI.Button(new Rect(0, i * 30, wListBox.width - 16, wListBox.height), wListSorted[i].name)) {
//					worldSelected = wListSorted[i];
//				}
//
//				GUI.backgroundColor = Color.white;
//			}
//		GUI.EndScrollView();
//
//		GUIStyle style = new GUIStyle();
//
//		if (avatarSelected != null) {
//			style.alignment = TextAnchor.UpperLeft;
//			style.normal.textColor = Color.white;
//
//			GUI.Label(new Rect(115, 40, 100, 100), name, style);
//			GUI.Label(new Rect(115, 60, 100, 100), "Level " + avatarSelected.level, style);
//
//			style = new GUIStyle();
//			style.alignment = TextAnchor.UpperRight;
//			style.normal.textColor = Color.white;
//
////			GUI.Label(new Rect(170, 60, 100, 100), avatarSelected.coins + " Coins", style);
//
//			style = new GUIStyle();
//			style.alignment = TextAnchor.UpperCenter;
//			style.normal.textColor = Color.white;
//
//			GUI.Label(new Rect(140, 80, 100, 100), "Last Played on " + last_logout.Split(' ')[0], style);
//		}
//
//		if (worldSelected != null) {
//			style = new GUIStyle();
//			style.alignment = TextAnchor.UpperLeft;
//			style.normal.textColor = Color.white;
//
//			GUI.Label(new Rect(20, 160, 100, 100), "Type " + (worldSelected.type + 1), style);
//			GUI.Label(new Rect(20, 180, 100, 100), "Played " + (worldSelected.play_time / 3600).ToString() + ":" + (worldSelected.play_time % 3600 / 60).ToString().PadLeft(2, '0'), style);
//
//			style = new GUIStyle();
//			style.alignment = TextAnchor.UpperRight;
//			style.normal.textColor = Color.white;
//
//			GUI.Label(new Rect(100, 160, 100, 100), "Credits: " + worldSelected.credits, style);
//			GUI.Label(new Rect(100, 180, 100, 100), "Score: " + worldSelected.score, style);
//		}
//
//		GUILayout.Space(190);
//
//		for (int i = 0; i < 3; i++) {
//			buttonRectList[i] = new Rect(windowRect.width - 85, 120 + i * 30, 75, 25);
//		}
//
//		if (GUI.Button(buttonRectList[0], "Join")) {
//			Join();
//		}
//
//		if (GUI.Button(buttonRectList[1], "Create")) {
//			Create();
//		}
//
//		if (GUI.Button(buttonRectList[2], "Delete")) {
//			Delete();
//		}
//	}
//
//	public void SetAvatarImage(string avatar_id) {
//	}
//
//	public void Create() {
////			RequestWorldMenuAction request = new RequestWorldMenuAction();
////			request.CreateAction(0, "", 1, "Savanna", 1, "");
////
////			cManager.Send(request);
////			messageBox = mainObject.GetComponent<Main>().CreateMessageBox("Creating World...");
//
//		// Get Default Species
//		NetworkManager.Send(
//			SpeciesActionProtocol.Prepare(0, 0),
//			ProcessSpeciesAction
//		);
//	}
//
//	public void Join() {
//		ConnectionManager cManager = mainObject.GetComponent<ConnectionManager>();
//
//		if (cManager) {
////			RequestWorldMenuAction request = new RequestWorldMenuAction();
////			request.JoinAction(worldSelected.world_id);
////
////			cManager.Send(request);
////			messageBox = mainObject.GetComponent<Main>().CreateMessageBox("Joining World...");
//		}
//	}
//
//	public void Delete() {
//		ConnectionManager cManager = mainObject.GetComponent<ConnectionManager>();
//
//		if (cManager) {
////			RequestWorldMenuAction request = new RequestWorldMenuAction();
////			request.DeleteAction(worldSelected.world_id);
////
////			cManager.Send(request);
////			messageBox = mainObject.GetComponent<Main>().CreateMessageBox("Deleting World...");
//		}
//	}
//
//	public void SwitchToLogin() {
//		Destroy(this);
//		GameObject.Find("LoginObject").GetComponent<Login>().Show();
//	}
//
//	public void ResponseWorldMenuAction(NetworkResponse response) {
////		ResponseWorldMenuActionresponse args = response as ResponseWorldMenuActionresponse;
////
////		switch (args.action) {
////			case 1: // Create
////				if (args.status == 0) {
////					WorldData world = new WorldData(args.world_id);
////					world.name = args.name;
////					world.credits = args.credits;
////					world.month = args.month;
////
////					worldList.Add(args.world_id, world);
////				}
////				break;
////			case 2: // Join
////				if (args.status == 0) {
////					WorldData world = new WorldData(args.world_id);
////					world.name = args.name;
////					world.credits = args.credits;
////					world.month = args.month;
////
////					GameState.world = world;
////					Application.LoadLevel("World");//World
////				}
////				break;
////			case 3: // Delete
////				worldList.Remove(args.world_id);
////
////				if (worldList.Count > 0) {
////					worldSelected = new List<WorldData>(worldList.Values)[0];
////				}
////				break;
////			default:
////				break;
////		}
//	}

    public void ProcessSpeciesAction(NetworkResponse response)
    {
        ResponseSpeciesAction args = response as ResponseSpeciesAction;

        if (args.action == 0)
        {
            Dictionary <int, int> speciesList = new Dictionary <int, int>();

            foreach (string item in args.selectionList.Split(','))
            {
                string[] pair       = item.Split(':');
                int      species_id = int.Parse(pair[0]);
                int      biomass    = int.Parse(pair[1]);

                speciesList.Add(species_id, biomass);
                Debug.Log(species_id + " " + biomass);
            }

            NetworkManager.Send(
                SpeciesActionProtocol.Prepare(1, speciesList),
                ProcessSpeciesAction
                );
        }
    }