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