Пример #1
0
        public IActionResult StartGame([FromRoute] string code, string adminCode)
        {
            var game = GameStore.GetGame(code);

            if (game == null)
            {
                return(NotFound());
            }
            if (game.Status != GameStatus.NotStarted)
            {
                return(StatusCode(403, "Can only start unstarted games"));
            }
            if (game.Players.First().ConnectionId != adminCode)
            {
                return(Unauthorized());
            }

            game.Status = GameStatus.NormalTurn;

            TimerStore.SetupAnswerTimeout(game);

            // TODO _gameClient.GameUpdated(game);

            return(Ok());
        }
Пример #2
0
        public IActionResult SendAnswer([FromRoute] string code, string playerCode, string answer, string rule)
        {
            var game = GameStore.GetGame(code);

            if (game == null)
            {
                return(NotFound());
            }
            if (game.CurrentPlayer.ConnectionId != playerCode)
            {
                return(Unauthorized());
            }
            if (game.Status == GameStatus.NameAnother && rule != null)
            {
                return(BadRequest("Adding rule not allowed when naming another"));
            }

            game.Turns.Add(new Turn(game.Turns.Count, game.CurrentPlayer, game.Status, answer, rule));
            game.CurrentPlayer = game.FindNextPlayer();

            TimerStore.SetupAnswerTimeout(game);

            // TODO _gameClient.GameUpdated(game);

            return(Ok());
        }
Пример #3
0
        public IActionResult Vote([FromRoute] string code, string playerCode, bool vote)
        {
            var game = GameStore.GetGame(code);

            if (game == null)
            {
                return(NotFound());
            }
            if (game.Status != GameStatus.Challenge)
            {
                return(StatusCode(403, "Can only vote if challenge is ongoing"));
            }

            Player player = game.FindActivePlayer(playerCode);

            if (player == null || player == game.CurrentPlayer)
            {
                return(Unauthorized());
            }
            if (game.Votes.Exists(v => v.Player == player))
            {
                return(Conflict("Cannot vote twice on one challenge"));
            }

            game.Votes.Add(new Vote(player, vote));

            // Check if everyone but challenged player has voted
            if (game.Votes.Count == game.CountActivePlayers() - 1)
            {
                game.ResolveChallenge();

                TimerStore.SetupAnswerTimeout(game);
            }

            // TODO _gameClient.GameUpdated(game);

            return(Ok());
        }
Пример #4
0
        public IActionResult RequestNameAnother([FromRoute] string code, string playerCode, int turnId)
        {
            var game = GameStore.GetGame(code);

            if (game == null)
            {
                return(NotFound());
            }
            if (game.Turns.Last().TurnId != turnId)
            {
                return(StatusCode(403, "Cannot request name another for rule other than latest"));
            }
            if (game.Turns.Last().TurnType == GameStatus.NameAnother)
            {
                return(StatusCode(403, "Name another can only be requested once per answer"));
            }
            if (game.Status == GameStatus.NameAnother)
            {
                return(Conflict("Name another has already been requested"));
            }

            Player player = game.FindActivePlayer(playerCode);

            if (player == null || player == game.CurrentPlayer)
            {
                return(Unauthorized());
            }

            game.Status        = GameStatus.NameAnother;
            game.CurrentPlayer = game.FindPreviousPlayer();

            TimerStore.SetupAnswerTimeout(game);

            // TODO _gameClient.GameUpdated(game);

            return(Ok());
        }