Example #1
0
        public async Task <BattleResultDto> PlayGame(BattleDto battleDto)
        {
            Task.Delay(3000).Wait();

            var heroes = _context.Heroes
                         .Include(h => h.Powers).ThenInclude(hp => hp.Power)
                         .Include(h => h.Type)
                         .Include(h => h.Badges).ThenInclude(hp => hp.Badge);

            var initiator = await _heroService.FindById(battleDto.InitiatorId);

            var opponent = await _heroService.FindById(battleDto.OpponentId);

            initiator.Latitude      = opponent.Latitude + 0.1;
            initiator.Longitude     = opponent.Longitude + 0.1;
            initiator.LastTimeMoved = DateTime.Now;

            await _rewardService.AddBadge(BadgeType.TierCategory2, initiator);

            battleDto.Heroes           = _heroService.ModifyStrengthOfHeroParty(battleDto.Heroes.ToList());
            battleDto.Villains         = _villainService.ModifyStrengthOfHeroParty(battleDto.Villains.ToList());
            battleDto.HeroesStrength   = battleDto.Heroes.Sum(v => v.OverallStrength);
            battleDto.VillainsStrength = battleDto.Villains.Sum(v => v.OverallStrength);

            if (battleDto.VillainsStrength > battleDto.HeroesStrength)
            {
                foreach (var villain in battleDto.Villains)
                {
                    await SetWinner(villain.Id, battleDto.Id);

                    var dbHero = heroes.Where(h => h.IsBadGuy).FirstOrDefault(h => h.Id == villain.Id);
                    await _rewardService.AddBadge(BadgeType.TierCategory1, dbHero);
                }

                foreach (var hero in battleDto.Heroes)
                {
                    var dbHero = heroes.Where(h => !h.IsBadGuy).FirstOrDefault(h => h.Id == hero.Id);
                    var mostValuableBadgeType = _rewardService.GetMostValuableBadgeType(dbHero);
                    await _rewardService.DeleteBadge(mostValuableBadgeType, dbHero);
                }

                return(new BattleResultDto
                {
                    Result = Constants.VILLAINS_WON_MESSAGE,
                    HeroesStrength = battleDto.HeroesStrength,
                    VillainStrength = battleDto.VillainsStrength
                });
            }
            else if (battleDto.HeroesStrength == battleDto.VillainsStrength)
            {
                return(new BattleResultDto
                {
                    Result = Constants.EQUAL_SCORE_MESSAGE,
                    HeroesStrength = battleDto.HeroesStrength,
                    VillainStrength = battleDto.VillainsStrength
                });
            }
            else
            {
                foreach (var hero in battleDto.Heroes)
                {
                    await SetWinner(hero.Id, battleDto.Id);

                    var dbHero = heroes.Where(h => !h.IsBadGuy).FirstOrDefault(h => h.Id == hero.Id);
                    await _rewardService.AddBadge(BadgeType.TierCategory1, dbHero);
                }

                foreach (var villain in battleDto.Villains)
                {
                    var dbHero = heroes.Where(h => h.IsBadGuy).FirstOrDefault(h => h.Id == villain.Id);
                    var mostValuableBadgeType = _rewardService.GetMostValuableBadgeType(dbHero);
                    await _rewardService.DeleteBadge(mostValuableBadgeType, dbHero);
                }

                return(new BattleResultDto
                {
                    Result = Constants.HEROES_WON_MESSAGE,
                    HeroesStrength = battleDto.HeroesStrength,
                    VillainStrength = battleDto.VillainsStrength
                });
            }
        }