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