示例#1
0
        internal static void SortGadgets()
        {
            Dictionary <GadgetInfo, IEnumerable <GadgetInfo> > orderDependencies = new Dictionary <GadgetInfo, IEnumerable <GadgetInfo> >();

            foreach (GadgetInfo info in gadgets.Values)
            {
                List <GadgetInfo> list = new List <GadgetInfo>();
                list.AddRange(info.Attribute.LoadBefore.Select(x => GetGadgetInfo(x)).Where(x => x != null));
                list.AddRange(gadgets.Values.Where(x => x.Attribute.LoadAfter.Contains(info.Attribute.Name)));
                orderDependencies[info] = list;
            }
            LoadOrderTree = new MultiTreeList <GadgetInfo>(orderDependencies);
            foreach (MultiTreeList <GadgetInfo> node in LoadOrderTree.SelectMany(x => x.ListAllNodes()))
            {
                node.Sort((x, y) => x.Value.Attribute.LoadPriority - y.Value.Attribute.LoadPriority);
            }
            sortedGadgetList = LoadOrderTree.FlattenUniqueByBreadth().Where(x => x != null).ToList();
            LoadOrderTree.MakeReadOnly();
            for (int i = 0; i < sortedGadgetList.Count; i++)
            {
                sortedGadgetList[i].Gadget.ModID = i;
            }
            foreach (GadgetInfo gadget in sortedGadgetList)
            {
                gadget.Dependencies = gadget.Attribute.Dependencies.Select(x => GetGadgetInfo(x)).ToArray();
                gadget.Dependents   = sortedGadgetList.Where(x => x.Attribute.Dependencies.Contains(gadget.Attribute.Name)).ToArray();
            }
        }
示例#2
0
        /// <summary>
        /// Calculates the load-order tree for Gadgets related to this one by their LoadBefore and LoadAfter attributes.
        /// </summary>
        public MultiTreeList <GadgetInfo> CalculateLoadTree(MultiTreeList <GadgetInfo> parent = null)
        {
            MultiTreeList <GadgetInfo> tree = new MultiTreeList <GadgetInfo>(this);

            return(tree);
        }