public async Task <ActionResult <GameStateDTO> > CreateGuessWord(Guid gameRoomId, Guid guessWordId, NewGuessLetterRequestDTO newGuessLetterRequestDTO) { var newGuessLetterDTO = new NewGuessLetterDTO { GameRoomId = gameRoomId, GuessWordId = guessWordId, PlayerId = newGuessLetterRequestDTO.PlayerId, GuessLetter = newGuessLetterRequestDTO.GuessLetter }; _logger.LogInformation("New guess letter creation: {@newGuessLetterDTO", newGuessLetterDTO); var validator = new NewGuessLetterValidator(_gameRoomServiceAsync, _playerServiceAsync); var validationResult = validator.Validate(newGuessLetterDTO); if (!validationResult.IsValid) { return(BadRequest(validationResult.Errors)); } var gameStateDTO = await _gameRoomServiceAsync.UpdateGameRoundState(newGuessLetterDTO); return(StatusCode(201, gameStateDTO)); }
public async Task <GameStateDTO> UpdateGameRoundState(NewGuessLetterDTO newGuessLetterDTO) { var guessWord = await GetGuessedWord(newGuessLetterDTO.GuessWordId); var newGuessLetterString = newGuessLetterDTO.GuessLetter; _logger.LogInformation("Persisting new player's move..."); await CreateGuessLetter(guessWord !, newGuessLetterString); // previously validated guess word var gameRound = guessWord !.Round; var allGuessLetters = guessWord.GuessLetters.Select(letter => letter.Letter); // with new guess letter already var updatedGameState = new GameStateDTO() { GuessWord = null, IsOver = false, PlayerHealth = guessWord.Round.Health, GuessWordSoFar = _gameLogic.GetGuessWordSoFar(allGuessLetters, guessWord.Word), GuessedLetters = allGuessLetters, }; if (_gameLogic.IsGuessedLetterInGuessWord(newGuessLetterString, guessWord.Word)) { _logger.LogInformation("Player guessed a right letter. Checking if turn is over..."); if (_gameLogic.HasPlayerHasDiscoveredGuessWord(allGuessLetters, guessWord.Word)) { _logger.LogInformation("Guess word {:l} has been found! Turn is over...", guessWord.Word); gameRound = _gameLogic.FinishGameRound(gameRound); await _repositoryGameRound.Update(gameRound); _logger.LogInformation("Setting final game state for return..."); updatedGameState.IsOver = true; updatedGameState.GuessWord = guessWord.Word; } } else { _logger.LogInformation("Player has guessed a wrong letter. Punishing him with a health hit..."); gameRound = _gameLogic.ReducePlayerHealth(gameRound); if (_gameLogic.HasPlayerBeenHung(gameRound)) { _logger.LogInformation("Player has been hung and is dead! Turn is over..."); gameRound = _gameLogic.FinishGameRound(gameRound); _logger.LogInformation("Setting final game state for return..."); updatedGameState.IsOver = true; updatedGameState.GuessWord = guessWord.Word; } await _repositoryGameRound.Update(gameRound); } updatedGameState.PlayerHealth = gameRound.Health; _logger.LogInformation("Returning updated game state data..."); return(updatedGameState); }