Пример #1
0
        /// <summary>
        /// Removes a set of skill levels from this plan.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="skillsToRemove">The skill levels to remove.</param>
        /// <returns>
        /// An object allowing to perform and control the removal.
        /// </returns>
        public IPlanOperation TryRemoveSet <T>(IEnumerable <T> skillsToRemove)
            where T : ISkillLevel
        {
            IEnumerable <PlanEntry> allEntriesToRemove = GetAllEntriesToRemove(skillsToRemove);

            // Creates a plan where the entries and their dependencies have been removed
            PlanScratchpad freePlan = new PlanScratchpad(Character);

            freePlan.RebuildPlanFrom(Items);
            foreach (PlanEntry entry in allEntriesToRemove)
            {
                freePlan.Remove(entry);
            }

            // Gather removables prerequisites now useless
            List <PlanEntry> removablePrerequisites = new List <PlanEntry>();

            foreach (PlanEntry prereqEntry in allEntriesToRemove.SelectMany(
                         entryToRemove => Items.Where(entryToRemove.IsDependentOf).Where(
                             prereq => freePlan.GetMinimumLevel(prereq.Skill) == 0).Select(
                             prereq => freePlan.GetEntry(prereq.Skill, prereq.Level)).Where(
                             prereqEntry => prereqEntry != null && prereqEntry.Type == PlanEntryType.Prerequisite)))
            {
                removablePrerequisites.Add(prereqEntry);
                freePlan.Remove(prereqEntry);
            }

            // Create the operation
            return(new PlanOperation(this, skillsToRemove.Cast <ISkillLevel>(), allEntriesToRemove,
                                     removablePrerequisites));
        }