/// <summary> /// Looks for all invites to the provided game session. If all are accepted, start the game. /// </summary> /// <param name="guid"></param> public void AttemptGameStart(DB_Game da_game) { var gameInvites = from i in _context.DB_Invites where i.GameId == da_game.Id select i; if (gameInvites.Count <DB_Invite>() < 5) { throw new FOEServiceException(FOEStatusCodes.InternalError, "Game start attempted with fewer than 5 players"); } //Check if all invites are accepted. else we just wont start the game. bool allInvitesAccepted = true; List <DB_User> invitedUsers = new List <DB_User>(); foreach (DB_Invite invite in gameInvites) { if (invite.Status != (int)DB_Invite.InviteStatus.Accepted) { allInvitesAccepted = false; break; } invitedUsers.Add((from u in _context.DB_Users where u.Id == invite.InvitedUser.Value select u).FirstOrDefault()); } if (allInvitesAccepted == true) { //Randomize which user that plays which nation. //TODO: Add ability to pick nations? Random rnd = new Random(); DB_User da_user = invitedUsers.OrderBy(x => rnd.Next()).FirstOrDefault(); da_game.GermanPlayer = da_user.Id; SendEventToUser(da_user.ToUser(FOEDataInclusion.Everything), GameEvents.GameStarted); invitedUsers.Remove(da_user); da_user = invitedUsers.OrderBy(x => rnd.Next()).FirstOrDefault(); da_game.JapanesePlayer = da_user.Id; SendEventToUser(da_user.ToUser(FOEDataInclusion.Everything), GameEvents.GameStarted); invitedUsers.Remove(da_user); da_user = invitedUsers.OrderBy(x => rnd.Next()).FirstOrDefault(); da_game.AmericanPlayer = da_user.Id; SendEventToUser(da_user.ToUser(FOEDataInclusion.Everything), GameEvents.GameStarted); invitedUsers.Remove(da_user); da_user = invitedUsers.OrderBy(x => rnd.Next()).FirstOrDefault(); da_game.EnglishPlayer = da_user.Id; SendEventToUser(da_user.ToUser(FOEDataInclusion.Everything), GameEvents.GameStarted); invitedUsers.Remove(da_user); da_game.RussianPlayer = invitedUsers.FirstOrDefault().Id; SendEventToUser(invitedUsers.FirstOrDefault().ToUser(FOEDataInclusion.Everything), GameEvents.GameStarted); da_game.IsActive = true; da_game.Phase = (int)DB_Game.GamePhases.Buy; da_game.Turn = 0; _context.DB_Invites.DeleteAllOnSubmit(gameInvites); _context.SubmitChanges(); } }
/// <summary> /// Creates a game and returns it. /// </summary> /// <returns></returns> public Game CreateGame() { DB_Game da_game = DB_Game.FromGame(new Game() { Id = Guid.NewGuid(), MapId = DB_Map.DefaultMapId, GermanPlayer = DB_User.MockUserId, JapanesePlayer = DB_User.MockUserId, AmericanPlayer = DB_User.MockUserId, EnglishPlayer = DB_User.MockUserId, RussianPlayer = DB_User.MockUserId, Phase = (int)DB_Game.GamePhases.None, Turn = 0, Name = string.Format("{0}'s game", User.UserName), IsActive = false }, _context); if (da_game == null) { throw new FOEServiceException(FOEStatusCodes.InternalError, "Creation of Game failed."); } return(da_game.ToGame()); }