Example #1
0
        // This will judge whether a mod is optional, so this should be called in UnityMain thread.
        private static CapsResManifest MergeAndCollapseRuntimeManifest(CapsResManifest rawmani)
        {
            var root  = rawmani.Root;
            var rmani = new CapsResManifest();

            if (root != null)
            {
                rmani.Root = new CapsResManifestNode(rmani);
                CapsResManifestNode tmpNode  = new CapsResManifestNode(rawmani);
                CapsResManifestNode archNode = null;
                if (root.Children != null)
                {
                    tmpNode.Children = new SortedList <string, CapsResManifestNode>();
                    for (int i = 0; i < root.Children.Count; ++i)
                    {
                        var child = root.Children.Values[i];
                        if (child.PPath == "mod")
                        {
                            continue;
                        }
                        else if (child.PPath == "@64")
                        {
                            if (Environment.Is64BitProcess)
                            {
                                archNode = child;
                            }
                            continue;
                        }
                        else if (child.PPath == "@32")
                        {
                            if (!Environment.Is64BitProcess)
                            {
                                archNode = child;
                            }
                            continue;
                        }
                        tmpNode.Children[child.PPath] = child;
                    }
                }
                // merge - no mod
                CapsResManifest.MergeManifestNode(rmani.Root, tmpNode, true);
                // merge - no mod on arch
                if (archNode != null)
                {
                    tmpNode = new CapsResManifestNode(rawmani);
                    if (archNode.Children != null)
                    {
                        tmpNode.Children = new SortedList <string, CapsResManifestNode>();
                        for (int i = 0; i < archNode.Children.Count; ++i)
                        {
                            var child = archNode.Children.Values[i];
                            if (child.PPath == "mod")
                            {
                                continue;
                            }
                            tmpNode.Children[child.PPath] = child;
                        }
                    }
                    CapsResManifest.MergeManifestNode(rmani.Root, tmpNode, true);
                }
                // merge - mod
                MergeRuntimeManifestInMod(rmani, root);
                // merge - mod on arch
                if (archNode != null)
                {
                    MergeRuntimeManifestInMod(rmani, archNode);
                }
                // Collapse
                var flags = ResManager.GetValidDistributeFlags();
                rmani.CollapseManifest(flags);
                rmani.TrimExcess();
            }
            return(rmani);
        }