public async Task <EnumMessage> DiscardCardToReroll(GameActionDto gameActionDto, IList <Die> dice)
        {
            var gameDetails = await GetPlayerGameRoundAsync(gameActionDto);

            if (gameDetails.Player.CardsInHand.Count == 0)
            {
                return(EnumMessage.NotEnoughCardsToDiscard);
            }

            if (!gameDetails.Player.CardsInHand.Any(a => a.Id == gameActionDto.CardId))
            {
                return(EnumMessage.CardNotInHand);
            }

            var dicePool = gameDetails.Player.DicePool;

            var rolledDices = new List <PlayerRoundRolledDice>();

            if (GetRolledDice(dice, dicePool, ref rolledDices))
            {
                return(EnumMessage.DieNotInPool);
            }

            //await _playerRoundService.DiscardToRerollAsync(gameDetails.Player, rolledDices);

            return(EnumMessage.Success);
        }
        public async Task <EnumMessage> PlayCardFromHandAsync(GameActionDto gameActionDto)
        {
            var gameDetails = await GetPlayerGameRoundAsync(gameActionDto);

            var hand = gameDetails.Player.CardsInHand;

            var cardPlayed = hand.First(a => a.Id == gameDetails.Card.Id);

            if (cardPlayed == null)
            {
                return(EnumMessage.CardNotInHand);
            }

            var types = cardPlayed.Card.CardTypes.Select(a => (EnumType)a.Type.Id).ToList();

            if (types.Contains(EnumType.Event) || types.Contains(EnumType.Upgrade))
            {
                await _playerRoundService.AddLimboAsync(gameDetails.Player, cardPlayed.Card);
            }

            if (types.Contains(EnumType.Support))
            {
                await _playerRoundService.AddSuportAsync(gameDetails.Player, cardPlayed.Card);
            }

            hand.Remove(cardPlayed);

            return(EnumMessage.Success);
        }
        public async Task <EnumMessage> Pass(GameActionDto gameActionDto)
        {
            var gameDetails = await GetPlayerGameRoundAsync(gameActionDto);

            await _playerRoundService.PassAsync(gameDetails.Player);

            return(EnumMessage.Success);
        }
        public async Task <EnumMessage> ClaimBattleField(GameActionDto gameActionDto)
        {
            var gameDetails = await GetPlayerGameRoundAsync(gameActionDto);

            if (gameDetails.Round.BattleFieldClaimed)
            {
                return(EnumMessage.BattleFieldAlreadyClaimed);
            }

            await _playerRoundService.ClaimBattleFieldAsync(gameDetails.Player);

            return(EnumMessage.Success);
        }
        public async Task <EnumMessage> UseCardAction(GameActionDto gameActionDto, Effect effect)
        {
            var gameDetails = await GetPlayerGameRoundAsync(gameActionDto);

            if (!gameDetails.Card.Effects.Any(a => a.Id == effect.Id))
            {
                return(EnumMessage.EffectNotPresentInCard);
            }

            await _playerRoundService.UseCardActionAsync(gameDetails.Player, gameDetails.Card, effect);

            return(EnumMessage.Success);
        }
        public async Task <EnumMessage> ActivateCardAsync(GameActionDto gameActionDto, int cardId)
        {
            var gameDetails = await GetPlayerGameRoundAsync(gameActionDto);

            if (!gameDetails.Player.CardsInPlay.Any(a => a.Id == cardId))
            {
                return(EnumMessage.CardNotInPlay);
            }

            await _playerRoundService.ActivateCardAsync(gameDetails.Player, gameDetails.Card);

            return(EnumMessage.Success);
        }
        public async Task <IEnumerable <EnumAction> > GetListPossibleActionsAsync(GameActionDto gameActionDto)
        {
            var gameDetails = await GetPlayerGameRoundAsync(gameActionDto);

            var list = new List <EnumAction>
            {
                EnumAction.Pass
            };

            if (gameDetails.Round.BattleFieldClaimed && gameDetails.Round.PlayerGameIdClaimedBattlefield == gameActionDto.PlayerId)
            {
                return(list);
            }

            if (!gameDetails.Round.BattleFieldClaimed)
            {
                list.Add(EnumAction.ClaimBattleField);
            }

            if (gameDetails.Player.DicePool.Count() > 0)
            {
                list.Add(EnumAction.ResolveDice);
            }

            if (gameDetails.Player.CardsInHand.Count() > 0)
            {
                list.Add(EnumAction.PlayCard);
            }

            if (gameDetails.Player.CardsInHand.Count() > 0 && gameDetails.Player.DicePool.Count() > 0)
            {
                list.Add(EnumAction.DiscardAndReroll);
            }

            if (gameDetails.Player.CardsInPlay.Any(a => (a.Card.IsCharacter || a.Card.IsSuport) && !a.Exausted) ||
                gameDetails.Player.CardsInPlay.Any(a => (a.Card.IsCharacter || a.Card.IsSuport) && a.Upgrades.Any(b => b.CanBeExausted && !b.Exausted)))
            {
                list.Add(EnumAction.ActivateCard);
            }

            if (gameDetails.Player.CardsInPlay.Any(a =>
                                                   a.Card.Effects.Any(b => b.EnumEffect == EnumEffect.Action ||
                                                                      b.EnumEffect == EnumEffect.PowerAction)))
            {
                list.Add(EnumAction.UseCardAction);
            }

            return(list);
        }
        private async Task <(PlayerRound Player, Game Game, Round Round, Card Card)> GetPlayerGameRoundAsync(
            GameActionDto gameActionDto)
        {
            var game = await _gameService.GetByIdAsync(gameActionDto.GameId.ToEntityId());

            var roundGame = game.Rounds.Single(a => a.Id == gameActionDto.RoundId);
            var round     = roundGame.Round;

            var player = roundGame.PlayerRounds.Single(a => a.PlayerGameId == gameActionDto.PlayerId);

            var card = gameActionDto.CardId == null
                ? null
                : await _cardService.GetByIdAsync(gameActionDto.CardId.Value.ToEntityId());

            return(player, game, round, card);
        }
        public async Task <EnumMessage> ResolveDice(GameActionDto gameActionDto, IList <Die> dice)
        {
            var gameDetails = await GetPlayerGameRoundAsync(gameActionDto);

            var dicePool = gameDetails.Player.DicePool;

            var rolledDices = new List <PlayerRoundRolledDice>();

            if (GetRolledDice(dice, dicePool, ref rolledDices))
            {
                return(EnumMessage.DieNotInPool);
            }

            foreach (var rolledDie in rolledDices)
            {
                await _playerRoundService.ResolveDieAsync(gameDetails.Player, rolledDie);
            }

            return(EnumMessage.Success);
        }