public static bool IsQwestActive(Aim qwest, Pers pers) { // Проверка по выполненности if (qwest.IsDoneProperty) { qwest.NotAllowReqwirements = string.Empty; return(false); } var isEnabled = true; var reqwirements = string.Empty; // Делаем квест недоступным, если дата начала не подходит if (qwest.BeginDate > MainViewModel.selectedTime) { return(false); isEnabled = false; reqwirements += $"Дата начала {qwest.BeginDate.Date.ToShortDateString()}; "; } // Делаем недоступным если минимальный уровень перса меньше if (pers.PersLevelProperty < qwest.MinLevelProperty) { return(false); isEnabled = false; reqwirements += "Недостаточный уровень персонажа; "; } // Делаем недоступными квесты, если связанные квесты не выполнены var reqAims = qwest.Needs.Where(n => n.IsDoneProperty == false).ToList(); if (reqAims.Any()) { return(false); isEnabled = false; foreach (var reqAim in reqAims) { reqwirements += $"Квест \"{reqAim.NameOfProperty}\" должен быть выполнен; "; } } // Делаем недоступными квесты, если дочерние не выполнены var reqAimsChild = qwest.CompositeAims.Where(n => n.AimProperty.IsDoneProperty == false).ToList(); if (reqAimsChild.Any()) { return(false); isEnabled = false; foreach (var reqAim in reqAimsChild) { reqwirements += $"Квест \"{reqAim.AimProperty.NameOfProperty}\" должен быть выполнен; "; } } // Прибавляем к этим скиллам все скиллы из его родительских квестов var allParrent = qwest.AllParrentAims.ToList(); allParrent.Add(qwest); allParrent = allParrent.Distinct().ToList(); var plusAbLinksOf = from linksOfTask in qwest.LinksOfTasks from abiliti in pers.Abilitis where abiliti.NeedTasks .Where( n => n.TaskProperty == linksOfTask).Any(n => n.LevelProperty >= abiliti.CellValue && n.ToLevelProperty <= abiliti.CellValue) select abiliti; // Проверка по связанным скиллам if (allParrent.All(n => n.AbilitiLinksOf.Union(plusAbLinksOf).All(q => !q.IsEnebledProperty))) { foreach ( var abilitiModel in allParrent.SelectMany(q => q.AbilitiLinksOf).Where(n => n.IsEnebledProperty == false).ToList()) { return(false); reqwirements += $"Навык \"{abilitiModel.NameOfProperty}\" должен быть активено; "; isEnabled = false; } } // Проверка по значениям требований скиллов StaticMetods.GetAbillsReq(qwest.NeedAbilities, ref reqwirements, ref isEnabled); // Проверка по значениям требований характеристик StaticMetods.GetCharactReq(qwest.NeedCharacts, ref reqwirements, ref isEnabled); // Проверка по скиллам GetSkillsReqvirements(qwest, pers, ref reqwirements, ref isEnabled); qwest.NotAllowReqwirements = reqwirements; if (qwest.IsAutoActiveProperty) { qwest.IsActiveProperty = true; } if (isEnabled == false) { qwest.IsActiveProperty = false; } return(qwest.IsActiveProperty); }