Exemplo n.º 1
0
        public async Task <VoidAppResult> AttackPlayer(Guid gameId, DtoAttackPlayerMove attackPlayerMove, CancellationToken cancellationToken = default(CancellationToken))
        {
            var game = await this.dbContext.Games.IncludeUserParticipations().IncludeEntities().SingleOrDefaultAsync(_ => _.Id == gameId, cancellationToken);

            if (game == null)
            {
                return(VoidAppResult.Error(ErrorPreset.OnLoadingData));
            }
            var currentTurnPlayerResult = await this.GetCurrentTurnPlayer(game, cancellationToken);

            if (currentTurnPlayerResult.IsErrorResult)
            {
                return(currentTurnPlayerResult.GetVoidAppResult());
            }
            var currentTurnPlayer = currentTurnPlayerResult.SuccessReturnValue;

            if (currentTurnPlayer.Mail != this.loginManager.LoggedInUser.Mail)
            {
                return(VoidAppResult.Error(ErrorPreset.NotYourTurn));
            }

            var attacker = await dbContext.GameCards.IncludeAll().SingleOrDefaultAsync(_ => _.Id == attackPlayerMove.AttackerId);

            var target = await dbContext.Players.Include(_ => _.User).SingleOrDefaultAsync(_ => _.User.Mail == this.loginManager.LoggedInUser.Mail);

            if (target == null || attacker == null)
            {
                return(VoidAppResult.Error(ErrorPreset.OnLoadingData));
            }

            var attackerDtoCardResult = await this.GetDtoCardsFromGameCards(new List <GameCard> {
                attacker
            }, gameId);

            if (attackerDtoCardResult.IsErrorResult)
            {
                return(attackerDtoCardResult.GetVoidAppResult());
            }
            if (!attackerDtoCardResult.SuccessReturnValue.First().CanAttack)
            {
                return(VoidAppResult.Error(AppActionResultType.RuleError, "This card has already attacked in this turn."));
            }

            target.Health = -(attacker.Card.Attack + attacker.StatModifiersCount);
            if (target.Health <= 0)
            {
                game.Status = GameStatus.Finished;
            }

            await dbContext.SaveChangesAsync();

            return(VoidAppResult.Success());
        }
        public async Task <IActionResult> AttackPlayer(Guid gameId, [FromBody] DtoAttackPlayerMove attackPlayerMove)
        {
            var result = await this.gamesService.AttackPlayer(gameId, attackPlayerMove).ConfigureAwait(false);

            return(this.utility.GetActionResult(result));
        }