void Update(object o)
        {
            if (LoggedIn && Connected)
            {
                NetworkStream stream = tcpClient.GetStream();
                ClientRequest req    = new ClientRequest(this.LocalID);

                if (ServerInfo.GamePhase == GamePhase.Lobby)
                {
                    Stopwatch stopky = new Stopwatch();
                    stopky.Start();

                    req.Purpose = RequestPurpose.LobbyStatus;
                    req.Data    = new object[] { ServersideClientInfo.FromClient(this) };
                    req.SendTo(stream);

                    ServerResponse resp = ServerResponse.ReceiveFrom(stream);

                    if (resp.Purpose == ResponseType.LobbyInfo)
                    {
                        this.ServerInfo = (ClientsideServerInfo)resp.Data[0];
                        this.LobbyMenu.UpdateItems();
                        this.LobbyMenu.Draw();
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }

                    stopky.Stop();
                    this.Ping = (int)stopky.ElapsedMilliseconds;
                }
            }
        }
        void OnConnect(IAsyncResult result)
        {
            work++;
            if (tcpClient.Connected)
            {
                NetworkStream stream = tcpClient.GetStream();

                ClientRequest req = new ClientRequest(-1);
                req.Purpose = RequestPurpose.Login;
                req.Data    = new object[] { Character.Name, Character.ToString() };
                req.SendTo(stream);

                ServerResponse resp = ServerResponse.ReceiveFrom(stream);
                if (resp.Purpose == ResponseType.LoginAccepted)
                {
                    this.LocalID    = (int)resp.Data[0];
                    this.ServerInfo = (ClientsideServerInfo)resp.Data[1];
                    LoggedIn        = true;
                }
                else // resp.Purpose == ResponseType.ActionDenied;
                {
                    this.ErrorMessage = (string)resp.Data[0];
                }
            }
            work--;
        }
        public void Send(ClientRequest req)
        {
            NetworkStream stream = tcpClient.GetStream();

            req.SendTo(stream);

            ServerResponse resp = ServerResponse.ReceiveFrom(stream);

            ProcessResponse(resp);
        }