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