private void AddObjectDirectory(
            IModelDirectory <GloModelFileBundle> parentNode,
            IFileHierarchy gloverFileHierarchy,
            IFileHierarchyDirectory objectDirectory)
        {
            var objectFiles = objectDirectory.FilesWithExtension(".glo");

            var gloverSteamDirectory = gloverFileHierarchy.Root;
            var textureDirectories   = gloverSteamDirectory
                                       .TryToGetSubdir("data/textures/generic")
                                       .Subdirs.ToList();

            try {
                var levelTextureDirectory = gloverSteamDirectory.TryToGetSubdir(
                    objectDirectory.LocalPath.Replace("data\\objects",
                                                      "data\\textures"));
                textureDirectories.Add(levelTextureDirectory);
                textureDirectories.AddRange(levelTextureDirectory.Subdirs);
            } catch (Exception e) {
                ;
            }

            foreach (var objectFile in objectFiles)
            {
                parentNode.AddFileBundle(
                    new GloModelFileBundle(objectFile, textureDirectories));
            }
        }
        private void ExtractFromDriverDirectory_(
            IModelDirectory <BmdModelFileBundle> node,
            IFileHierarchyDirectory directory)
        {
            var bmdFiles = directory.FilesWithExtension(".bmd")
                           .ToArray();
            var bcxFiles = directory.FilesWithExtensions(".bca", ".bck")
                           .ToArray();

            var driverBmdFiles = bmdFiles
                                 .Where(file => file.Name.StartsWith("driver"))
                                 .ToArray();
            var driverBcxFiles =
                bcxFiles.Where(file => file.Name.StartsWith("b_") ||
                               file.Name.StartsWith("c_") ||
                               file.Name.StartsWith("all"))
                .ToArray();

            this.ExtractModels_(node,
                                driverBmdFiles,
                                driverBcxFiles);

            var otherBmdFiles = bmdFiles.Where(file => !driverBmdFiles.Contains(file))
                                .ToArray();

            if (otherBmdFiles.Length > 0)
            {
                var otherBcxFiles =
                    bcxFiles.Where(file => !driverBcxFiles.Contains(file))
                    .ToArray();
                this.ExtractModels_(node,
                                    otherBmdFiles,
                                    otherBcxFiles);
            }
        }
Example #3
0
        private void ExtractPikminAndCaptainModels_(
            IModelDirectory <BmdModelFileBundle> parentNode,
            IFileHierarchy fileHierarchy)
        {
            var pikminAndCaptainBaseDirectory =
                fileHierarchy.Root.TryToGetSubdir(
                    @"user\Kando\piki\pikis_designer");

            var bcxFiles =
                pikminAndCaptainBaseDirectory.TryToGetSubdir("motion")
                .Files;

            var captainSubdir =
                pikminAndCaptainBaseDirectory.TryToGetSubdir("orima_model");

            this.ExtractModels_(parentNode.AddSubdir("captains"),
                                captainSubdir.Files,
                                bcxFiles);

            var pikminSubdir =
                pikminAndCaptainBaseDirectory.TryToGetSubdir("piki_model");

            this.ExtractModels_(parentNode.AddSubdir("pikmin"),
                                pikminSubdir.Files,
                                bcxFiles);
        }
Example #4
0
        private void ExtractAllTreasures_(
            IModelDirectory <BmdModelFileBundle> parentNode,
            IFileHierarchy fileHierarchy)
        {
            var treasureBaseDirectory =
                fileHierarchy.Root.TryToGetSubdir(@"user\Abe\Pellet");

            var baseDirectory = parentNode.AddSubdir("treasures");

            foreach (var locale in treasureBaseDirectory.Subdirs)
            {
                var localeNode = baseDirectory.AddSubdir(locale.Name);

                foreach (var treasure in locale.Subdirs)
                {
                    var treasureNode = localeNode.AddSubdir(treasure.Name);

                    var bmdFiles = treasure.Files.Where(file => file.Extension == ".bmd")
                                   .ToArray();
                    if (bmdFiles.Length > 0)
                    {
                        var bcxFiles =
                            treasure.Files
                            .Where(file => file.Extension == ".bca" ||
                                   file.Extension == ".bck")
                            .ToList();
                        this.ExtractModels_(treasureNode, bmdFiles, bcxFiles);
                    }
                }
            }
        }
        public void ExtractModel_(
            IModelDirectory <CmbModelFileBundle> parentNode,
            IFileHierarchyDirectory subdir)
        {
            var cmbFiles = subdir.FilesWithExtension(".cmb").ToArray();

            if (cmbFiles.Length == 0)
            {
                return;
            }

            var csabFiles = subdir.FilesWithExtension(".csab").ToArray();
            var ctxbFiles = subdir.FilesWithExtension(".ctxb").ToArray();
            var shpaFiles = subdir.FilesWithExtension(".shpa").ToArray();

            try {
                var bundles =
                    this.separator_.Separate(subdir, cmbFiles, csabFiles);

                foreach (var bundle in bundles)
                {
                    parentNode.AddFileBundle(new CmbModelFileBundle(
                                                 bundle.ModelFile,
                                                 bundle.AnimationFiles.ToArray(),
                                                 ctxbFiles,
                                                 shpaFiles
                                                 ));
                }
            } catch { }
        }
Example #6
0
        private void ExtractLeafBudFlower_(
            IModelDirectory <BmdModelFileBundle> parentNode,
            IFileHierarchy fileHierarchy)
        {
            var leafBudFlowerDirectory =
                fileHierarchy.Root.TryToGetSubdir(
                    @"user\Kando\piki\pikis_designer\happa_model");

            this.ExtractModelsInDirectoryAutomatically_(
                parentNode.AddSubdir("leaf_bud_flower"), leafBudFlowerDirectory);
        }
Example #7
0
        private void ExtractModelsInDirectoryAutomatically_(
            IModelDirectory <BmdModelFileBundle> parentNode,
            IFileHierarchyDirectory directory)
        {
            var bmdFiles = directory.FilesWithExtension(".bmd").ToArray();

            if (bmdFiles.Length > 0)
            {
                var bcxFiles = directory.FilesWithExtensions(".bca", ".bck")
                               .ToList();
                var btiFiles = directory.FilesWithExtension(".bti").ToList();
                this.ExtractModels_(parentNode, bmdFiles, bcxFiles, btiFiles);
            }
        }
Example #8
0
        /// <summary>
        ///   Gets from model/animations in same szs (e.g. user\Kando)
        /// </summary>
        private void ExtractAllFromMergedDirectories_(
            IModelDirectory <BmdModelFileBundle> parentNode,
            IFileHierarchy fileHierarchy)
        {
            foreach (var subdir in fileHierarchy)
            {
                var arcSubdir =
                    subdir.Subdirs.SingleOrDefault(dir => dir.Name == "arc");

                if (arcSubdir != null &&
                    arcSubdir.FilesWithExtension(".bmd").Any())
                {
                    this.ExtractModelsInDirectoryAutomatically_(
                        parentNode.AddSubdir(subdir.Name), arcSubdir);
                }
            }
        }
        private void ExtractFromSeparateDriverDirectories_(
            IModelDirectory <BmdModelFileBundle> node,
            IFileHierarchyDirectory directory,
            IFileHierarchyDirectory common)
        {
            Asserts.Nonnull(common);

            var bmdFiles = directory.FilesWithExtension(".bmd")
                           .ToArray();
            var commonBcxFiles = common.FilesWithExtensions(".bca", ".bck")
                                 .ToArray();
            var localBcxFiles = directory.FilesWithExtensions(".bca", ".bck")
                                .ToArray();

            this.ExtractModels_(node,
                                bmdFiles,
                                commonBcxFiles.Concat(localBcxFiles).ToArray());
        }
Example #10
0
        private void ExtractModels_(
            IModelDirectory <BmdModelFileBundle> node,
            IReadOnlyList <IFileHierarchyFile> bmdFiles,
            IReadOnlyList <IFileHierarchyFile>?bcxFiles = null,
            IReadOnlyList <IFileHierarchyFile>?btiFiles = null
            )
        {
            Asserts.True(bmdFiles.Count > 0);

            foreach (var bmdFile in bmdFiles)
            {
                node.AddFileBundle(new BmdModelFileBundle {
                    BmdFile   = bmdFile,
                    BcxFiles  = bcxFiles,
                    BtiFiles  = btiFiles,
                    FrameRate = 60
                });
            }
        }
Example #11
0
        private void ExtractPrimaryAndSecondaryModels_(
            IModelDirectory <BmdModelFileBundle> node,
            IFileHierarchyDirectory directory,
            Func <IFileHierarchyFile, bool> primaryIdentifier
            )
        {
            var bmdFiles = directory.Files.Where(
                file => file.Extension == ".bmd")
                           .ToArray();
            var bcxFiles = directory
                           .Files.Where(
                file => file.Extension == ".bck" ||
                file.Extension == ".bca")
                           .ToArray();

            this.ExtractPrimaryAndSecondaryModels_(node,
                                                   primaryIdentifier,
                                                   bmdFiles,
                                                   bcxFiles);
        }
Example #12
0
        private void ExtractPrimaryAndSecondaryModels_(
            IModelDirectory <BmdModelFileBundle> node,
            Func <IFileHierarchyFile, bool> primaryIdentifier,
            IReadOnlyList <IFileHierarchyFile> bmdFiles,
            IReadOnlyList <IFileHierarchyFile>?bcxFiles = null
            )
        {
            var primaryBmdFile =
                bmdFiles.Single(bmdFile => primaryIdentifier(bmdFile));

            this.ExtractModels_(node, new[] { primaryBmdFile }, bcxFiles);

            var secondaryBmdFiles = bmdFiles
                                    .Where(bmdFile => !primaryIdentifier(bmdFile))
                                    .ToArray();

            if (secondaryBmdFiles.Length > 0)
            {
                this.ExtractModels_(node, secondaryBmdFiles);
            }
        }
Example #13
0
        private void ExtractFromSeparateDirectories_(
            IModelDirectory <BmdModelFileBundle> node,
            IFileHierarchyDirectory directory,
            IFileHierarchyDirectory common)
        {
            Asserts.Nonnull(common);

            var bmdFiles = directory.FilesWithExtension(".bmd")
                           .ToArray();
            var commonBcxFiles = common.FilesWithExtensions(".bca", ".bck")
                                 .ToArray();
            var commonBtiFiles = common.FilesWithExtension(".bti")
                                 .ToArray();

            var localBcxFiles = directory.FilesWithExtensions(".bca", ".bck")
                                .ToArray();

            if (bmdFiles.Length == 1)
            {
                this.ExtractModels_(node,
                                    bmdFiles,
                                    commonBcxFiles.Concat(localBcxFiles).ToArray(),
                                    commonBtiFiles);
                return;
            }

            try {
                Asserts.True(localBcxFiles.Length == 0);

                this.ExtractPrimaryAndSecondaryModels_(
                    node,
                    bmdFile => bmdFile.Name.StartsWith(
                        "default"),
                    bmdFiles,
                    commonBcxFiles);
            } catch {
                ;
            }
        }
Example #14
0
        private FileNode AddDirectoryToNode_(IModelDirectory directory,
                                             FileNode parentNode)
        {
            var uiNode = parentNode.AddChild(directory.Name);

            foreach (var subdirectory in directory.Subdirs)
            {
                this.AddDirectoryToNode_(subdirectory, uiNode);
            }

            foreach (var fileBundle in directory.FileBundles)
            {
                uiNode.AddChild(fileBundle);
            }

            if (DebugFlags.OPEN_DIRECTORIES_BY_DEFAULT)
            {
                uiNode.Expand();
            }

            return(uiNode);
        }
Example #15
0
        /// <summary>
        ///   Gets from separate model/animation szs (e.g. Enemies)
        /// </summary>
        private void ExtractAllFromSeparateDirectories_(
            IModelDirectory <BmdModelFileBundle> parentNode,
            IFileHierarchy fileHierarchy)
        {
            foreach (var subdir in fileHierarchy)
            {
                var modelSubdir =
                    subdir.Subdirs.SingleOrDefault(dir => dir.Name == "model");
                var animSubdir =
                    subdir.Subdirs.SingleOrDefault(dir => dir.Name == "anim");

                if (modelSubdir != null && animSubdir != null)
                {
                    var bmdFiles = modelSubdir.Files;
                    var bcxFiles = animSubdir.Files;
                    var btiFiles = subdir.FilesWithExtensionRecursive(".bti").ToArray();

                    this.ExtractModels_(parentNode.AddSubdir(subdir.Name), bmdFiles,
                                        bcxFiles, btiFiles);
                }
            }
        }
Example #16
0
        private void ExtractModelsAndAnimationsFromSceneObject_(
            IModelDirectory <BmdModelFileBundle> node,
            IFileHierarchyDirectory directory)
        {
            var bmdFiles = directory.Files.Where(
                file => file.Extension == ".bmd")
                           .OrderByDescending(file => file.Name.Length)
                           .ToArray();

            var allBcxFiles = directory
                              .Files.Where(
                file => file.Extension == ".bck" ||
                file.Extension == ".bca")
                              .ToArray();

            var specialCase = false;

            if (allBcxFiles.Length == 1 &&
                allBcxFiles[0].Name == "fish_swim.bck" &&
                bmdFiles.All(file => file.Name.StartsWith("fish")))
            {
                specialCase = true;
            }
            if (allBcxFiles.Length == 1 &&
                allBcxFiles[0].Name == "butterfly_fly.bck" &&
                bmdFiles.All(file => file.Name.StartsWith("butterfly")))
            {
                specialCase = true;
            }
            if (allBcxFiles.All(file => file.Name.StartsWith("popo_")) &&
                bmdFiles.All(file => file.Name.StartsWith("popo")))
            {
                specialCase = true;
            }

            // If there is only one model or 0 animations, it's easy to tell which
            // animations go with which model.
            if (bmdFiles.Length == 1 || allBcxFiles.Length == 0 || specialCase)
            {
                foreach (var bmdFile in bmdFiles)
                {
                    this.ExtractModels_(node,
                                        new[] {
                        bmdFile
                    },
                                        allBcxFiles);
                }
                return;
            }

            if (directory.Name == "montemcommon" ||
                directory.Name == "montewcommon")
            {
                foreach (var bmdFile in bmdFiles)
                {
                    this.ExtractModels_(node,
                                        new[] {
                        bmdFile
                    });
                }
                return;
            }

            var unclaimedBcxFiles = allBcxFiles.ToHashSet();
            var bmdAndBcxFiles    = new Dictionary <IFileHierarchyFile, IFileHierarchyFile[]>();

            foreach (var bmdFile in bmdFiles)
            {
                var prefix = bmdFile.Name;
                prefix = prefix.Substring(0, prefix.Length - ".bmd".Length);

                // Blegh. These special cases are gross.
                {
                    var modelIndex = prefix.IndexOf("_model");
                    if (modelIndex != -1)
                    {
                        prefix = prefix.Substring(0, modelIndex);
                    }

                    var bodyIndex = prefix.IndexOf("_body");
                    if (bodyIndex != -1)
                    {
                        prefix = prefix.Substring(0, bodyIndex);
                    }

                    prefix = prefix.Replace("peach_hair_ponytail", "peach_hair_pony");
                    prefix = prefix.Replace("eggyoshi_normal", "eggyoshi");
                }

                var claimedBcxFiles = unclaimedBcxFiles
                                      .Where(bcxFile => bcxFile.Name.StartsWith(prefix))
                                      .ToArray();

                foreach (var claimedBcxFile in claimedBcxFiles)
                {
                    unclaimedBcxFiles.Remove(claimedBcxFile);
                }

                bmdAndBcxFiles[bmdFile] = claimedBcxFiles;
            }
            //Asserts.True(unclaimedBcxFiles.Count == 0);
            foreach (var(bmdFile, bcxFiles) in bmdAndBcxFiles)
            {
                this.ExtractModels_(node, new[] { bmdFile }, bcxFiles);
            }
        }
        private void ExtractModelsAndAnimationsFromSceneObject_(
            IModelDirectory <BmdModelFileBundle> node,
            IFileHierarchyDirectory directory)
        {
            var bmdFiles = directory.Files.Where(
                file => file.Extension == ".bmd")
                           .OrderByDescending(file => file.Name.Length)
                           .ToArray();
            var allBcxFiles = directory
                              .Files.Where(
                file => file.Extension == ".bck" ||
                file.Extension == ".bca")
                              .ToArray();
            var btiFiles = directory.FilesWithExtension(".bti")
                           .ToArray();

            // If there is only one model or 0 animations, it's easy to tell which
            // animations go with which model.
            if (bmdFiles.Length == 1 || allBcxFiles.Length == 0)
            {
                foreach (var bmdFile in bmdFiles)
                {
                    this.ExtractModels_(node,
                                        new[] {
                        bmdFile
                    },
                                        allBcxFiles,
                                        btiFiles);
                }
                return;
            }

            var unclaimedBcxFiles = allBcxFiles.ToHashSet();
            var bmdAndBcxFiles    = new Dictionary <IFileHierarchyFile, IFileHierarchyFile[]>();

            foreach (var bmdFile in bmdFiles)
            {
                var prefix = bmdFile.Name;
                prefix = prefix.Substring(0, prefix.Length - ".bmd".Length);

                // Blegh. These special cases are gross.
                {
                    var modelIndex = prefix.IndexOf("_model");
                    if (modelIndex != -1)
                    {
                        prefix = prefix.Substring(0, modelIndex);
                    }

                    var babyIndex = prefix.IndexOf("_body");
                    if (babyIndex != -1)
                    {
                        prefix = prefix.Substring(0, babyIndex);
                    }

                    // TODO: Fix animations shared by piantas
                }

                var claimedBcxFiles = unclaimedBcxFiles
                                      .Where(bcxFile => bcxFile.Name.StartsWith(prefix))
                                      .ToArray();

                foreach (var claimedBcxFile in claimedBcxFiles)
                {
                    unclaimedBcxFiles.Remove(claimedBcxFile);
                }

                bmdAndBcxFiles[bmdFile] = claimedBcxFiles;
            }
            Asserts.True(unclaimedBcxFiles.Count == 0);
            foreach (var(bmdFile, bcxFiles) in bmdAndBcxFiles)
            {
                this.ExtractModels_(node, new[] { bmdFile }, bcxFiles, btiFiles);
            }
        }