Пример #1
0
        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);
        }
Пример #2
0
        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);
        }