示例#1
0
        private IList <IPerk> GetPerks()
        {
            var schemes = _schemeService.GetSchemes <IPerkScheme>()
                          // Для развития годятся только те перки, которые не врождённые.
                          // Врождённые перки даются только при генерации персонажа.
                          .Where(x => !x.IsBuildIn)
                          // Защиита от схем, в которых забыли прописать уровни.
                          // По идее, такие перки либо должны быть врождёнными.
                          // Следовательно, если они не отсеяны выше, то это ошибка.
                          // Такие схемы лучше проверять в тестах на валидацию схем.
                          .Where(x => x.Levels != null);

            var perks = new List <IPerk>(_buildInPerks);

            if (Perks != null)
            {
                perks.AddRange(Perks);
            }

            foreach (var perkScheme in schemes)
            {
                var existingPerk = Perks?.SingleOrDefault(x => x.Scheme == perkScheme);
                if (existingPerk != null)
                {
                    continue;
                }

                //TODO Сейчас можно качнуть только первый уровень перка. Должно быть полноценное развитие.
                var levels = perkScheme.Levels;
                if (levels is null)
                {
                    throw new InvalidOperationException();
                }

                var level0 = levels[0];
                if (level0 is null)
                {
                    throw new InvalidOperationException();
                }

                var perk = new Perk(perkScheme)
                {
                    CurrentLevel = null,
                    CurrentJobs  = level0.Jobs
                                   .Where(x => x != null)
                                   .Select(x => x !)
                                   .Select(x => (IJob) new PerkJob(x))
                                   .ToArray()
                };

                perks.Add(perk);
            }

            return(perks);
        }