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)); }