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); } }
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); }
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); } }
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); } }
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 { } }