예제 #1
0
        void _slaveClient_GotGameUpdate(object sender, GameInstance.GameUpdateEventArgs e)
        {
            GamePlayer player = (GamePlayer)sender;

            if (e.Message == GameMessage.EndGame)
            {
                // the slaves can't end it
            }
            else if (e.Message == GameMessage.SetReady)
            {
                player.Device.Ready = true;
                player.SendUpdate(GameMessage.SetReadyResponse, new byte[0]);
                SendGameInfo();
            }
            else if (e.Message == GameMessage.PushState)
            {
                byte[] buffer = new byte[e.GameState.Length + 10];
                Encoding.ASCII.GetBytes("mobilesrc").CopyTo(buffer, 0);
                buffer[9] = 1;
                e.GameState.CopyTo(buffer, 10);

                //_masterClient.SendUpdate(GameMessage.NOP, new byte[1500]);
                _masterClient.SendUpdate(GameMessage.PushStateResponse, e.GameState);
            }
            else
            {
                // Send everything to the master
                // _masterClient.SendUpdate(e.Message, e.GameState);
            }
        }
예제 #2
0
        public static GameInstance JoinGame(UdpClient client, IPEndPoint endPoint, NameValueCollection queryString)
        {
            lock (_gameDb)
            {
                GameInstance instance = ActiveGames[new Guid(queryString["game"])];

                float latitude = 0, longitude = 0;
                float.TryParse(queryString["latitude"], out latitude);
                float.TryParse(queryString["longitude"], out longitude);

                Database.GameDevice device = new Database.GameDevice();
                device.PkGameDevice = Guid.NewGuid();
                device.Game         = instance.Game;
                device.User         = queryString["user"];
                device.Latitude     = latitude;
                device.Longitude    = longitude;
                device.LocalAddress = queryString["address"];
                device.LocalPort    = int.Parse(queryString["port"]);
                device.Device       = queryString["id"];
                device.Date         = DateTime.Now;
                device.Ready        = false;
                device.Accepted     = false;

                Trace.WriteLine("Joining Game: " + device.User);

                _gameDb.GameDevices.InsertOnSubmit(device);
                _gameDb.SubmitChanges();

                instance.AddPlayer(device, client, endPoint);

                return(instance);
            }
            GamePlayer.SendUpdate(GameMessage.JoinResponse, client, endPoint, new byte[0], 1);
        }
예제 #3
0
        public static bool ListGames(UdpClient client, IPEndPoint endPoint, NameValueCollection queryString)
        {
            float latitude = 0;

            float.TryParse(queryString["latitude"], out latitude);
            float longitude = 0;

            float.TryParse(queryString["longitude"], out longitude);
            int gameId = Convert.ToInt32(queryString["gameId"]);

            // TODO: lookup here
            float version = 0;

            float.TryParse(queryString["gameversion"], out version);

            lock (_gameDb)
            {
                var games = (from game in _gameDb.Games
                             where
                             Math.Abs(game.Latitude - latitude) < .001
                             &&
                             Math.Abs(game.Longitude - longitude) < .001
                             &&
                             game.Completed == false
                             &&
                             game.Ready == false
                             &&
                             game.GameId == gameId
                             select game);

                bool hasGame = false;
                using (StringWriter sw = new StringWriter())
                {
                    using (XmlTextWriter tw = new XmlTextWriter(sw))
                    {
                        tw.WriteStartElement("GameCollection");
                        foreach (Database.Game game in games)
                        {
                            if (ActiveGames.ContainsKey(game.PkGame))
                            {
                                hasGame = true;
                                tw.WriteStartElement("Game");
                                tw.WriteElementString("Id", game.PkGame.ToString());
                                tw.WriteElementString("User", game.User.ToString());
                                tw.WriteEndElement();
                            }
                        }
                        tw.WriteEndElement();
                    }
                    GamePlayer.SendUpdate(GameMessage.ListResponse, client, endPoint, Encoding.ASCII.GetBytes(sw.ToString()), 1);
                }
                return(games.Count() > 0);
            }
        }
예제 #4
0
        public static GameInstance CreateInstance(UdpClient client, IPEndPoint endPoint, NameValueCollection queryString, byte[] mapData)
        {
            lock (_gameDb)
            {
                var games = (from delGame in _gameDb.Games
                             where
                             delGame.User == queryString["user"]
                             select delGame);

                foreach (Database.Game delGame in games)
                {
                    delGame.Completed = true;
                    //_gameDb.Games.DeleteOnSubmit(delGame);
                }

                Database.Game game = new Database.Game();
                game.PkGame  = Guid.NewGuid();
                game.MapData = System.Text.Encoding.ASCII.GetString(mapData);
                game.User    = queryString["user"];

                if (string.IsNullOrEmpty(game.User))
                {
                    game.User = queryString["id"];
                }

                game.Completed = false;
                game.Ready     = false;
                game.Date      = DateTime.Now;
                game.Width     = Convert.ToInt32(queryString["width"]);
                game.Height    = Convert.ToInt32(queryString["height"]);

                float latitude = 0, longitude = 0;
                float.TryParse(queryString["latitude"], out latitude);
                game.Latitude = latitude;
                float.TryParse(queryString["longitude"], out longitude);
                game.Longitude = longitude;
                game.GameId    = Convert.ToInt32(queryString["gameId"]);

                // TODO: lookup here
                float version = 0;
                float.TryParse(queryString["gameversion"], out version);

                Database.GameDevice device = new Database.GameDevice();
                device.PkGameDevice = Guid.NewGuid();
                device.Game         = game;
                device.User         = queryString["user"];

                if (string.IsNullOrEmpty(device.User))
                {
                    device.User = queryString["id"];
                }
                device.Latitude     = game.Latitude;
                device.Longitude    = game.Longitude;
                device.LocalAddress = queryString["address"];
                device.LocalPort    = int.Parse(queryString["port"]);
                device.Device       = queryString["id"];
                device.Date         = DateTime.Now;
                device.Ready        = true;
                device.Accepted     = true;

                _gameDb.Games.InsertOnSubmit(game);
                _gameDb.GameDevices.InsertOnSubmit(device);

                _gameDb.SubmitChanges();

                Trace.WriteLine("Starting Game: " + game.User);

                GameInstance instance = new GameInstance(game, device, client, endPoint);

                GamePlayer.SendUpdate(GameMessage.CreateResponse, client, endPoint, Encoding.ASCII.GetBytes(game.PkGame.ToString()), 1);
                ActiveGames.Add(game.PkGame, instance);

                Thread gameThread = new Thread(new ParameterizedThreadStart(LaunchGame));
                gameThread.IsBackground = true;
                gameThread.Start(instance);

                return(instance);
            }
        }
예제 #5
0
        void _masterClient_GotGameUpdate(object sender, GameInstance.GameUpdateEventArgs e)
        {
            GamePlayer player = (GamePlayer)sender;

            if (e.Message == GameMessage.EndGame)
            {
                Trace.WriteLine("Ending Game: " + player.Device.User);
                lock (_gameDb)
                {
                    Game.Completed = true;
                    _gameDb.SubmitChanges();
                }

                if (null != GameEnded)
                {
                    GameEnded(this, new EventArgs());
                }

                player.Close();
            }
            else if (e.Message == GameMessage.AcceptUser)
            {
                Int16  queryStringLength        = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(e.GameState, 0));
                string queryString              = System.Text.Encoding.ASCII.GetString(e.GameState, 2, queryStringLength);
                NameValueCollection queryBucket = System.Web.HttpUtility.ParseQueryString(queryString);

                string device = queryBucket["id"];

                foreach (GamePlayer slave in _slaveClients)
                {
                    if (string.Equals(slave.Device.Device, device, StringComparison.InvariantCultureIgnoreCase))
                    {
                        slave.Device.Accepted = true;
                        slave.SendUpdate(GameMessage.AcceptUserResponse, new byte[0]);

                        break;
                    }
                }

                SendGameInfo();
            }
            else if (e.Message == GameMessage.RejectUser)
            {
                Int16  queryStringLength        = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(e.GameState, 0));
                string queryString              = System.Text.Encoding.ASCII.GetString(e.GameState, 2, queryStringLength);
                NameValueCollection queryBucket = System.Web.HttpUtility.ParseQueryString(queryString);

                string device = queryBucket["id"];

                foreach (GamePlayer slave in _slaveClients)
                {
                    if (string.Equals(slave.Device.Device, device, StringComparison.InvariantCultureIgnoreCase))
                    {
                        slave.SendUpdate(GameMessage.RejectUserResponse, new byte[0]);
                        slave.Close();

                        _slaveClients.Remove(slave);

                        break;
                    }
                }

                SendGameInfo();
            }
            else if (e.Message == GameMessage.Start)
            {
                this.Game.Ready = true;
                SendGameInfo();

                Thread.Sleep(1500);
                player.SendUpdate(GameMessage.StartResponse, new byte[0]);
            }
            else if (e.Message == GameMessage.PushState)
            {
                //Int16 queryStringLength = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(e.GameState, 0));
                //string queryString = System.Text.Encoding.ASCII.GetString(e.GameState, 2, queryStringLength);
                //NameValueCollection queryBucket = System.Web.HttpUtility.ParseQueryString(queryString);

                //byte[] buffer = new byte[e.GameState.Length + 10];
                //Encoding.ASCII.GetBytes("mobilesrc").CopyTo(buffer, 0);
                //buffer[9] = 1;
                //e.GameState.CopyTo(buffer, 10);

                foreach (GamePlayer slave in _slaveClients)
                {
                    Console.WriteLine("_masterClient_GotGameUpdate: " + slave.Device.User);
                    //slave.SendUpdate(GameMessage.NOP, new byte[1500]);
                    try
                    {
                        slave.SendUpdate(GameMessage.PushStateResponse, e.GameState);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("ERROR _masterClient_GotGameUpdate");
                        Console.WriteLine(ex.ToString());
                    }
                }
            }
            else
            {
            }
        }