/// <summary> /// Join a game /// </summary> /// <param name="gameID">The id of the game to join</param> /// <param name="user">The current user</param> /// <param name="passphrase">The passphrase for the game</param> /// <param name="playerType">Type of player joining</param> /// <returns>The response to a join request</returns> public Entities.JoinResponse Execute(Int32 gameID, Entities.User user, String passphrase, Entities.Enums.GamePlayerType playerType) { Entities.Filters.Game.Select filter = new Entities.Filters.Game.Select(); filter.GameID = gameID; filter.DataToSelect |= Entities.Enums.Game.Select.Rounds; filter.DataToSelect |= Entities.Enums.Game.Select.GamePlayerCards; Entities.Game game = _selectGame.Execute(filter); Entities.JoinResponse response = _joinGame.Execute(game, user, passphrase, playerType); if (response.Game != null) { if (response.Game.IsWaiting() && response.Result.HasFlag(Entities.Enums.Game.JoinResponseCode.SuccessfulAlreadyPlayer) == false) { _sendMessage.UpdateWaiting(response.Game, true); } else if (response.Result.HasFlag(Entities.Enums.Game.JoinResponseCode.NewRoundStart) == true) { _sendMessage.UpdateGame(response.Game, true); } else { _sendMessage.UpdateLobby(response.Game, true); } } return(response); }
/// <summary> /// Join a game /// </summary> /// <param name="gameID">The game to join</param> /// <param name="user">The current user</param> /// <param name="playerType">Type of player joining</param> /// <returns>If the user was able to join the game</returns> public Boolean Execute(Entities.Game game, Entities.User user, Entities.Enums.GamePlayerType playerType) { Entities.GamePlayer player = new Entities.GamePlayer(); player.GameID = game.GameID; player.Points = 0; player.User = user; player.PlayerType = playerType; Boolean successful = _insertGamePlayer.Execute(player) != -1; if (successful) { if (playerType == Entities.Enums.GamePlayerType.Player) { game.Players.Add(player); game.PlayerCount++; } else if (playerType == Entities.Enums.GamePlayerType.Spectator) { game.Spectators.Add(player); game.SpectatorCount++; } } return(successful); }
/// <summary> /// Removes a player from the game /// </summary> /// <param name="gameID">The ID of the game to leave</param> /// <param name="user">The user leaving the game</param> /// <param name="playerType">Type of player leaving</param> public void Execute(Int32 gameID, Entities.User user, Entities.Enums.GamePlayerType playerType) { Entities.GamePlayer player = new Entities.GamePlayer(); player.GameID = gameID; player.User = user; player.PlayerType = playerType; _deleteGamePlayer.Execute(player); }
public void RefreshGameView(Int32 gameID, Entities.Enums.ConnectionType connectionType) { Join(gameID, connectionType); AS.GameRound.Base.ISelect _selectGameRound = BusinessLogic.UnityConfig.Container.Resolve <AS.GameRound.Base.ISelect>(); AS.Game.Base.ISelect _selectGame = BusinessLogic.UnityConfig.Container.Resolve <AS.Game.Base.ISelect>(); AS.GamePlayerKickVote.Base.ISelect _selectVotes = BusinessLogic.UnityConfig.Container.Resolve <AS.GamePlayerKickVote.Base.ISelect>(); AS.ActiveConnection.Base.ISelect _selectConnection = BusinessLogic.UnityConfig.Container.Resolve <AS.ActiveConnection.Base.ISelect>(); Int32 currentUserId = Authentication.Security.CurrentUserId; Entities.ActiveConnection connection = _selectConnection.Execute(new Entities.Filters.ActiveConnection.Select(Context.ConnectionId, currentUserId)); Entities.Filters.GamePlayerKickVote.SelectForGame kickVoteFilter = new Entities.Filters.GamePlayerKickVote.SelectForGame(); kickVoteFilter.GameID = gameID; List <Entities.GamePlayerKickVote> votes = _selectVotes.Execute(kickVoteFilter); IEnumerable <IGrouping <Int32, Entities.GamePlayerKickVote> > grouped = votes.GroupBy(x => x.KickUserId); Entities.Models.Game.Board.VoteToKick kickModel = null; List <Entities.Models.Game.Board.VoteToKick> votesToKick = new List <Entities.Models.Game.Board.VoteToKick>(); foreach (IGrouping <Int32, Entities.GamePlayerKickVote> group in grouped) { if (group.FirstOrDefault(x => x.VotedUserId == currentUserId) == null) { kickModel = new Entities.Models.Game.Board.VoteToKick(group.First().KickUser, group.Count(x => x.Vote), group.Count(x => !x.Vote)); votesToKick.Add(kickModel); } } List <Entities.GameRound> completedRounds = _selectGameRound.Execute(new Entities.Filters.GameRound.SelectCompleted(gameID)); Entities.Game game = _selectGame.Execute(new Entities.Filters.Game.Select { GameID = gameID, DataToSelect = Entities.Enums.Game.Select.GamePlayerCards | Entities.Enums.Game.Select.Rounds }); Entities.Enums.GamePlayerType playerType = (connection != null && connection.ConnectionType == Entities.Enums.ConnectionType.GamePlayer) ? Entities.Enums.GamePlayerType.Player : Entities.Enums.GamePlayerType.Spectator; Entities.Models.Game.Board.GameBoard model = new Entities.Models.Game.Board.GameBoard(game, currentUserId, playerType, votesToKick, completedRounds); Clients.Client(Context.ConnectionId).UpdateGameView(model, model.LobbyViewModel); }
public Lobby(Entities.Enums.GamePlayerType playerType, List <Entities.GamePlayer> players, Boolean showSpectators, List <Entities.GamePlayer> spectators) { this.PlayerType = playerType; this.Players = players; this.ShowSpectators = showSpectators; this.Spectators = spectators; }
public JsonResult Index(int id, string passphrase, Entities.Enums.GamePlayerType playerType) { bool validated = false; validated = _validatePassphrase.Execute(id, passphrase); string key = string.Format("Game_{0}_Passphrase", id); if (validated && !string.IsNullOrWhiteSpace(passphrase)) { Session.Add(key, MachineKey.Protect(Encoding.ASCII.GetBytes(passphrase), Session.SessionID)); } string url = Url.Action("Index", "Game", new { id = id }); if (playerType == Entities.Enums.GamePlayerType.Spectator) { url = Url.Action("Spectate", "Game", new { id = id }); } return(Json(new { Validated = validated, URL = url })); }
/// <summary> /// Action responsible for leaving a game /// </summary> /// <param name="id">The game id to leave</param> /// <param name="playerType">The type of player leaving</param> /// <returns>The view for game listing screen</returns> public ActionResult Index(Int32 id, Entities.Enums.GamePlayerType playerType, Boolean windowUnload = false) { Entities.User user = new Entities.User { UserId = Authentication.Security.CurrentUserId, DisplayName = Authentication.Security.CurrentUserName }; if (windowUnload) { String jobId = BackgroundJob.Schedule(() => _leaveGame.Execute(id, user.UserId, user.DisplayName, playerType), TimeSpan.FromSeconds(20)); String key = String.Format("LeaveGame_{0}_JobId", id); Session.Add(key, MachineKey.Protect(Encoding.ASCII.GetBytes(jobId), Session.SessionID)); } else { _leaveGame.Execute(id, user, playerType); } return(Redirect("/GameListing")); }
public static String Build(Entities.Game game, Int32 currentUserId, Entities.Enums.GamePlayerType playerType) { String waitingOnPlayers = "{0} is waiting for {1} more {2}..."; String commanderStartGame = "{0} can be started. {1}"; String waitingOnHost = "{0} waiting on commander to start game..."; String headerText = String.Empty; if (game.HasRequiredNumberOfPlayers() == false) { Int32 shortNumberOfPlayers = game.NumberOfPlayersNeededToStart(); headerText = string.Format(waitingOnPlayers, game.Title, shortNumberOfPlayers.ToString(), shortNumberOfPlayers == 1 ? "player" : "players"); } else { if (game.IsCurrentCommander(currentUserId) && playerType == Entities.Enums.GamePlayerType.Player) { TagBuilder startGame = new TagBuilder("a"); startGame.AddCssClass("button"); startGame.AddCssClass("startGameButton"); startGame.InnerHtml = "Start"; startGame.Attributes.Add("style", "font-size: .8em; cursor: pointer;"); headerText = string.Format(commanderStartGame, game.Title, startGame.ToString()); } else { headerText = string.Format(waitingOnHost, game.Title); } } return(headerText); }
/// <summary> /// Join a game /// </summary> /// <param name="gameID">The game to join</param> /// <param name="user">The current user</param> /// <param name="passphrase">The passphrase for the game</param> /// <param name="playerType">Type of player joining</param> /// <returns>The response to a join request</returns> public Entities.JoinResponse Execute(Entities.Game game, Entities.User user, String passphrase, Entities.Enums.GamePlayerType playerType) { Entities.JoinResponse response = new Entities.JoinResponse(); Boolean wasWaiting = game.IsWaiting(); if (game.GameOver.HasValue) { response.Result = Entities.Enums.Game.JoinResponseCode.GameOver; } else { if (playerType == Entities.Enums.GamePlayerType.Spectator) { AsSpectator(game, user, passphrase, response); } else { AsPlayer(game, user, passphrase, response, wasWaiting); } } return(response); }
/// <summary> /// Removes a player from the game /// </summary> /// <param name="gameID">The ID of the game to leave</param> /// <param name="user">The user leaving the game</param> /// <param name="playerType">Type of player leaving</param> /// <param name="forcedToLeave">The player was forced to leave</param> public void Execute(Int32 gameID, Entities.User user, Entities.Enums.GamePlayerType playerType, Boolean forcedToLeave = false) { Entities.Filters.Game.Select filter = new Entities.Filters.Game.Select(); filter.GameID = gameID; filter.DataToSelect = Entities.Enums.Game.Select.Rounds | Entities.Enums.Game.Select.GamePlayerCards; Entities.Game game = _selectGame.Execute(filter); Boolean wasWaiting = game.IsWaiting(); Boolean wasCurrentCommander = game.IsCurrentCommander(user.UserId) && playerType == Entities.Enums.GamePlayerType.Player; Entities.GamePlayer player = null; if (playerType == Entities.Enums.GamePlayerType.Player) { player = game.Players.Find(x => x.User.UserId == user.UserId); game.Players.Remove(player); game.PlayerCount--; } else { player = game.Spectators.Find(x => x.User.UserId == user.UserId); game.Spectators.Remove(player); game.SpectatorCount--; } if (wasCurrentCommander) { if (game.HasRounds()) { Entities.GameRound current = game.CurrentRound(); if (!current.HasWinner()) { game.Rounds.Remove(current); game.RoundCount--; Entities.Filters.GameRound.Delete deleteRoundFilter = new Entities.Filters.GameRound.Delete(); deleteRoundFilter.GameRoundID = current.GameRoundID; _deleteRound.Execute(deleteRoundFilter); } } Boolean started = false; if (game.PlayerCount > 0) { started = _startRound.Execute(game, game.NextCommander(null)); } if (game.HasRounds() && started) { _sendMessage.CommanderLeft(game, user.DisplayName); } else { _sendMessage.UpdateGame(game, true); } } else if (game.IsWaiting() && wasWaiting) { _sendMessage.UpdateWaiting(game, true); } else { if (game.HasRounds()) { Entities.GameRound current = game.CurrentRound(); current.CurrentPlayerCount--; if (!game.Players.Any(x => x.Hand.Count > 0 && !current.IsCommander(x.User.UserId))) { if (!current.HasWinner() && current.Answers.Count == 0) { _dealCards.Execute(game, false); } } } _sendMessage.UpdateGame(game, true, (forcedToLeave ? (int?)user.UserId : null)); } _leaveGame.Execute(gameID, user, playerType); }
/// <summary> /// Removes a player from the game /// </summary> /// <param name="gameID">The ID of the game to leave</param> /// <param name="userId">The user id of the user leaving the game</param> /// <param name="displayName">The user display name of the user leaving the game</param> /// <param name="playerType">Type of player leaving</param> public void Execute(Int32 gameID, Int32 userId, String displayName, Entities.Enums.GamePlayerType playerType) { this.Execute(gameID, new Entities.User { UserId = userId, DisplayName = displayName }, playerType, false); }
/// <summary> /// Constructor /// </summary> /// <param name="game"></param> /// <param name="userId"></param> /// <param name="hand"></param> /// <param name="playerType"></param> /// <param name="voteToKickList"></param> /// <param name="completedRounds"></param> public GameBoard(Entities.Game game, Int32 userId, Entities.Enums.GamePlayerType playerType, List <Models.Game.Board.VoteToKick> voteToKickList = null, List <Entities.GameRound> completedRounds = null) { Game = game; UserId = userId; Hand = new List <GamePlayerCard>(); if (playerType == Enums.GamePlayerType.Player) { Entities.GamePlayer player = Game.Players.FirstOrDefault(x => x.User.UserId == userId); if (player != null && player.Hand != null) { Hand = player.Hand; } } Hand = playerType == Enums.GamePlayerType.Player ? Game.Players.First(x => x.User.UserId == userId).Hand : new List <GamePlayerCard>(); ActivePlayer = Hand.Count > 0; PlayerType = playerType; Entities.GameRound round = Game.CurrentRound(); if (Game.HasRounds() && round != null) { Answered = round.HasAnswer(UserId); ShowAnswers = round.PlayedCount >= round.CurrentPlayerCount && round.Answers.Count > 0; RoundHasWinner = round.Winner() != null; GroupedAnswers = round.GroupedAnswers(); IsCommander = Game.IsCurrentCommander(UserId) && PlayerType == Entities.Enums.GamePlayerType.Player; } else { Answered = false; ShowAnswers = false; RoundHasWinner = false; IsCommander = false; } ShowHand = ActivePlayer && !Answered && !IsCommander && PlayerType == Entities.Enums.GamePlayerType.Player; ShowWaiting = (round == null || RoundHasWinner) && Game.IsWaiting(); WaitingOnAllAnswersOrWinner = !RoundHasWinner && !ShowAnswers; ShowBoard = !ShowWaiting && !Game.HasWinner(); if (ShowBoard && round != null) { Question = round.Question; } else { Question = null; } AnswersViewModel = new Answers(RoundHasWinner, IsCommander, WaitingOnAllAnswersOrWinner, ShowAnswers, ShowHand, ShowBoard, GroupedAnswers); GameOverViewModel = new GameOver(Game.HasWinner(), Game.GameID, Game.Players); HandViewModel = new Board.Hand(ShowHand, Hand, ShowBoard); LobbyViewModel = new Lobby(PlayerType, Game.Players, Game.MaxNumberOfSpectators > 0, Game.Spectators); RoundQuestionViewModel = new RoundQuestion(round, ShowBoard); WaitingViewModel = new Waiting(ShowWaiting); VotesToKickViewModel = new VotesToKick(voteToKickList ?? new List <Models.Game.Board.VoteToKick>()); AllRoundsViewModel = new AllRounds(completedRounds ?? new List <GameRound>()); HeaderViewModel = new Shared.Header(); if (Game.HasWinner()) { HeaderViewModel.SubHeaderText = "Game Over, man!"; } else if (ShowWaiting) { HeaderViewModel.SubHeaderText = ArmedCards.Entities.Models.Helpers.WaitingHeader.Build(Game, UserId, PlayerType); } else { HeaderViewModel.SubHeaderText = String.Format("{0} is the Card Commander", Game.DetermineCommander().DisplayName); } }
/// <summary> /// Removes a player from the game /// </summary> /// <param name="gameID">The ID of the game to leave</param> /// <param name="user">The user leaving the game</param> /// <param name="playerType">Type of player leaving</param> public void Execute(Int32 gameID, Entities.User user, Entities.Enums.GamePlayerType playerType) { _leaveGame.Execute(gameID, user, playerType); }