Пример #1
0
        public async Task <ActionResult <FighterExperienceDto> > GetExperience(Guid id, [FromServices] IFighterExperienceCalculator fighterExperienceCalculator)
        {
            var userId = User.Claims.GetUserId();

            if (userId == null)
            {
                return(Forbid());
            }

            var fighterExperience = await Context.FighterExperiences.FirstOrDefaultAsync(o => o.FighterId == id);

            if (fighterExperience == null)
            {
                return(Ok(new FighterExperienceDto()
                {
                    Level = 1,
                    CurrentExp = 0,
                    LevelExp = fighterExperienceCalculator.GetNeededExperience(1),
                }));
            }

            var level = fighterExperienceCalculator.GetLevel(fighterExperience);

            return(Ok(new FighterExperienceDto()
            {
                Level = level.Level,
                CurrentExp = level.Experience,
                LevelExp = level.RequiredExperience,
            }));
        }
        public async Task Process(Match match, IEnumerable <FighterContribution> contributions)
        {
            foreach (var contribution in contributions)
            {
                var fighter = await databaseContext.Fighters
                              .AsTracking()
                              .FirstOrDefaultAsync(o => o.Id == contribution.FighterId);

                if (fighter == null)
                {
                    continue;
                }

                var fighterExperience = await databaseContext.FighterExperiences
                                        .AsTracking()
                                        .FirstOrDefaultAsync(o => o.FighterId == contribution.FighterId);

                if (fighterExperience == null)
                {
                    fighterExperience = new FighterExperience()
                    {
                        FighterId = contribution.FighterId,
                    };
                    databaseContext.FighterExperiences.Add(fighterExperience);
                }

                var levelBefore = fighterExperienceCalculator.GetLevel(fighterExperience);
                await fighterExperienceCalculator.AddExperienceAsync(fighterExperience, contribution, 0);

                var levelAfter = fighterExperienceCalculator.GetLevel(fighterExperience);

                for (int i = levelBefore.Level; i < levelAfter.Level; i++)
                {
                    databaseContext.AddRange(fighterLevelUpHandler.Up(fighter));
                }
            }

            await databaseContext.SaveChangesAsync();
        }