public async Task <FullGameStateOutVM> Play(PlayCardInVM move, int gameID, int playerID) { using var transaction = await _transactionManager.BeginTransactionAsync(); Game game = await _gameManagementService.GetPlayableGame(gameID, playerID); FullGameStateOutVM output = await InternalPlayCard(move, game, playerID); await transaction.CommitAsync(); return(output); }
public async Task <FullGameStateOutVM> Draw(DrawCardInVM move, int gameID, int playerID) { using var transaction = await _transactionManager.BeginTransactionAsync(); Game game = await _gameManagementService.GetPlayableGame(gameID, playerID); if (!PlayerCanDraw(game, playerID)) { throw new BadRequestException("Player should not draw"); } var playerState = game.State.Where(s => s.PlayerID == playerID).Single(); var hand = _cardSerializer.DeserializeCards(playerState.Hand).ToList(); if (move.DrawFromDeck) { var deck = _cardSerializer.DeserializeCards(game.Deck).ToList(); if (!deck.Any()) { var discarded = _cardSerializer.DeserializeCards(game.Discarded); var newDeck = _deckService.Shuffle(discarded); deck = newDeck; game.Discarded = _cardSerializer.SerializeCards(new Card[] { }); } var drawn = deck[0]; deck.RemoveAt(0); hand.Add(drawn); game.Deck = _cardSerializer.SerializeCards(deck); } else { var discarded = _cardSerializer.DeserializeCards(game.Discarded).ToList(); if (!discarded.Any()) { throw new BadRequestException("Cannot draw from discarded cards, empty stack"); } var drawn = discarded.Last(); discarded.RemoveAt(discarded.Count - 1); hand.Add(drawn); game.Discarded = _cardSerializer.SerializeCards(discarded); } playerState.Hand = _cardSerializer.SerializeCards(hand); UpdateLastMove(game); FullGameStateOutVM output = _mapper.MapFullGameState(game); await _context.SaveChangesAsync(); await transaction.CommitAsync(); return(output); }