Beispiel #1
0
        public IModelDirectory <BmdModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var superMarioSunshineRom =
                DirectoryConstants.ROMS_DIRECTORY.TryToGetExistingFile(
                    "super_mario_sunshine.gcm");

            if (superMarioSunshineRom == null)
            {
                return(null);
            }

            var options = GcnFileHierarchyExtractor.Options.Standard()
                          .PruneRarcDumpNames("scene");
            var fileHierarchy =
                new GcnFileHierarchyExtractor()
                .ExtractFromRom(options, superMarioSunshineRom);

            var rootModelDirectory =
                new ModelDirectory <BmdModelFileBundle>("super_mario_sunshine");

            this.ExtractMario_(rootModelDirectory, fileHierarchy);
            this.ExtractFludd_(rootModelDirectory, fileHierarchy);
            this.ExtractYoshi_(rootModelDirectory, fileHierarchy);
            this.ExtractScenes_(rootModelDirectory, fileHierarchy);

            return(rootModelDirectory);
        }
Beispiel #2
0
        public IModelDirectory <BmdModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var pikmin2Rom =
                DirectoryConstants.ROMS_DIRECTORY.TryToGetExistingFile(
                    "pikmin_2.gcm");

            if (pikmin2Rom == null)
            {
                return(null);
            }

            var options = GcnFileHierarchyExtractor.Options.Standard()
                          .PruneRarcDumpNames("arc", "data");
            var fileHierarchy =
                new GcnFileHierarchyExtractor().ExtractFromRom(
                    options,
                    pikmin2Rom);

            var rootNode = new ModelDirectory <BmdModelFileBundle>("pikmin_2");

            this.ExtractPikminAndCaptainModels_(rootNode, fileHierarchy);
            this.ExtractAllFromSeparateDirectories_(rootNode, fileHierarchy);
            this.ExtractAllFromMergedDirectories_(rootNode, fileHierarchy);
            this.ExtractLeafBudFlower_(rootNode, fileHierarchy);
            this.ExtractAllTreasures_(rootNode, fileHierarchy);

            return(rootNode);
        }
        private void ExtractCourses_(
            ModelDirectory <BmdModelFileBundle> rootModelDirectory,
            IFileHierarchy fileHierarchy)
        {
            var courseSubdir = fileHierarchy.Root.TryToGetSubdir("Course");
            var coursesNode  = rootModelDirectory.AddSubdir("Course");

            foreach (var subdir in courseSubdir.Subdirs)
            {
                var bmdFiles = subdir.FilesWithExtension(".bmd")
                               .ToArray();
                if (bmdFiles.Length == 0)
                {
                    continue;
                }

                var btiFiles = subdir.FilesWithExtension(".bti")
                               .ToArray();

                var courseNode = coursesNode.AddSubdir(subdir.Name);
                this.ExtractModels_(courseNode,
                                    bmdFiles,
                                    null,
                                    btiFiles);

                var objectsSubdir = subdir.TryToGetSubdir("objects");
                this.ExtractModelsAndAnimationsFromSceneObject_(
                    courseNode.AddSubdir("objects"),
                    objectsSubdir);
            }
        }
        public IModelDirectory <GloModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var gloverSteamDirectory = SteamUtils.GetGameDirectory("Glover", assert);

            if (gloverSteamDirectory == null)
            {
                return(null);
            }

            var rootModelDirectory    = new ModelDirectory <GloModelFileBundle>("glover");
            var parentObjectDirectory = rootModelDirectory.AddSubdir("data")
                                        .AddSubdir("objects");

            var gloverFileHierarchy     = new FileHierarchy(gloverSteamDirectory);
            var topLevelObjectDirectory =
                gloverFileHierarchy.Root.TryToGetSubdir("data/objects");

            foreach (var objectDirectory in topLevelObjectDirectory.Subdirs)
            {
                this.AddObjectDirectory(
                    parentObjectDirectory.AddSubdir(objectDirectory.Name),
                    gloverFileHierarchy, objectDirectory);
            }
            return(rootModelDirectory);
        }
        public IModelDirectory <BmdModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var marioKartDoubleDashRom =
                DirectoryConstants.ROMS_DIRECTORY.TryToGetExistingFile(
                    "mario_kart_double_dash.gcm");

            if (marioKartDoubleDashRom == null)
            {
                return(null);
            }

            var options = GcnFileHierarchyExtractor.Options.Standard()
                          .UseRarcDumpForExtensions(".arc");
            var fileHierarchy =
                new GcnFileHierarchyExtractor()
                .ExtractFromRom(options, marioKartDoubleDashRom);

            var rootModelDirectory =
                new ModelDirectory <BmdModelFileBundle>("mario_kart_double_dash");

            this.ExtractDrivers_(rootModelDirectory, fileHierarchy);
            this.ExtractKarts_(rootModelDirectory, fileHierarchy);
            this.ExtractCourses_(rootModelDirectory, fileHierarchy);
            // TODO: Extract "enemies"
            // TODO: Extract "objects"

            return(rootModelDirectory);
        }
        //------------------------------------------------------------------------

        public ModelDirectory Construct(int number)
        {
            ModelDirectory modelDirectory = new ModelDirectory(m_modelFolderCreator);

            modelDirectory.Number = number;

            try
            {
                if (Directory.Exists(modelDirectory.GetDirectoryName()))
                {
                    modelDirectory.Exists = true;

                    modelDirectory.CountOfFiles = new DirectoryInfo(modelDirectory.GetDirectoryName()).GetFiles().Length;
                }
                else
                {
                    modelDirectory.Exists = false;

                    modelDirectory.CountOfFiles = 0;
                }
            }
            catch (Exception)
            {
                modelDirectory.Exists = false;

                modelDirectory.CountOfFiles = 0;
            }

            return(modelDirectory);
        }
Beispiel #7
0
 public void DelElement(int id)
 {
     using (var transaction = context.Database.BeginTransaction())
     {
         try
         {
             ModelDirectory element = context.Directories.FirstOrDefault(rec => rec.Id == id);
             if (element != null)
             {
                 context.Directories.Remove(element);
                 context.SaveChanges();
             }
             else
             {
                 throw new Exception("Элемент не найден");
             }
             transaction.Commit();
         }
         catch (Exception)
         {
             transaction.Rollback();
             throw;
         }
     }
 }
Beispiel #8
0
        public IModelDirectory <TModelFileBundle> GatherBundles(
            IFileHierarchy fileHierarchy)
        {
            var fileHierarchyRoot  = fileHierarchy.Root;
            var rootModelDirectory =
                new ModelDirectory <TModelFileBundle>(fileHierarchy.Root.Name);

            var lazyFileHierarchyDirToBundleDir =
                new LazyDictionary <IFileHierarchyDirectory,
                                    IModelDirectory <TModelFileBundle> >(
                    (lazyDict, dir) => {
                var parent = dir.Parent != null
                                 ? lazyDict[dir.Parent]
                                 : rootModelDirectory;
                return(parent.AddSubdir(dir.Name));
            });

            lazyFileHierarchyDirToBundleDir[fileHierarchyRoot] = rootModelDirectory;

            foreach (var directory in fileHierarchy)
            {
                var bundles = handler_(directory);
                if (bundles == null)
                {
                    continue;
                }

                foreach (var bundle in bundles)
                {
                    lazyFileHierarchyDirToBundleDir[directory].AddFileBundle(bundle);
                }
            }

            return(rootModelDirectory);
        }
Beispiel #9
0
        private void ExtractScenes_(
            ModelDirectory <BmdModelFileBundle> rootModelDirectory,
            IFileHierarchy fileHierarchy)
        {
            var sceneSubdir =
                fileHierarchy.Root.TryToGetSubdir(@"data\scene");

            foreach (var subdir in sceneSubdir.Subdirs)
            {
                var sceneNode = rootModelDirectory.AddSubdir(subdir.Name);

                var mapSubdir = subdir.TryToGetSubdir("map");
                var bmdFiles  = mapSubdir.TryToGetSubdir("map")
                                .Files.Where(file => file.Extension == ".bmd")
                                .ToArray();
                this.ExtractModels_(sceneNode.AddSubdir("map"), bmdFiles);

                var montemcommon =
                    subdir.Subdirs.SingleOrDefault(
                        subdir => subdir.Name == "montemcommon");
                var montewcommon =
                    subdir.Subdirs.SingleOrDefault(
                        subdir => subdir.Name == "montewcommon");
                var hamukurianm =
                    subdir.Subdirs.SingleOrDefault(
                        subdir => subdir.Name == "hamukurianm");

                foreach (var objectSubdir in subdir.Subdirs)
                {
                    var objName    = objectSubdir.Name;
                    var objectNode = sceneNode.AddSubdir(objName);

                    if (objName.StartsWith("montem") && !objName.Contains("common"))
                    {
                        this.ExtractFromSeparateDirectories_(
                            objectNode, objectSubdir, Asserts.CastNonnull(montemcommon));
                    }
                    else if (objName.StartsWith("montew") &&
                             !objName.Contains("common"))
                    {
                        this.ExtractFromSeparateDirectories_(
                            objectNode, objectSubdir, Asserts.CastNonnull(montewcommon));
                    }
                    else if (objName.StartsWith("hamukuri"))
                    {
                        if (!objName.Contains("anm"))
                        {
                            this.ExtractFromSeparateDirectories_(
                                objectNode, objectSubdir, Asserts.CastNonnull(hamukurianm));
                        }
                    }
                    else
                    {
                        this.ExtractModelsAndAnimationsFromSceneObject_(
                            objectNode, objectSubdir);
                    }
                }
            }
        }
Beispiel #10
0
        public IModelDirectory <ModModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var pikmin1Rom =
                DirectoryConstants.ROMS_DIRECTORY.TryToGetExistingFile(
                    "pikmin_1.gcm");

            if (pikmin1Rom == null)
            {
                return(null);
            }

            var options       = GcnFileHierarchyExtractor.Options.Empty();
            var fileHierarchy =
                new GcnFileHierarchyExtractor().ExtractFromRom(options, pikmin1Rom);

            var rootModelDirectory =
                new ModelDirectory <ModModelFileBundle>("pikmin_1");
            var parentObjectDirectory = rootModelDirectory.AddSubdir("data")
                                        .AddSubdir("objects");

            var queue =
                new Queue <(IFileHierarchyDirectory,
                            IModelDirectory <ModModelFileBundle>)>();

            queue.Enqueue((fileHierarchy.Root, rootModelDirectory));
            while (queue.Any())
            {
                var(directory, node) = queue.Dequeue();

                // TODO: Handle special cases:
                // - olimar
                // - pikmin
                // - frog

                var modFiles = directory.FilesWithExtension(".mod").ToArray();
                var anmFiles = directory.FilesWithExtension(".anm").ToArray();
                foreach (var modFile in modFiles)
                {
                    var anmFile =
                        anmFiles
                        .FirstOrDefault(anmFile => anmFile.NameWithoutExtension ==
                                        modFile.NameWithoutExtension);

                    node.AddFileBundle(new ModModelFileBundle {
                        ModFile = modFile,
                        AnmFile = anmFile,
                    });
                }

                foreach (var subdir in directory.Subdirs)
                {
                    queue.Enqueue((subdir, node.AddSubdir(subdir.Name)));
                }
            }

            return(rootModelDirectory);
        }
        public IModelDirectory <DatModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var superSmashBrosMeleeRom =
                DirectoryConstants.ROMS_DIRECTORY.TryToGetExistingFile(
                    "super_smash_bros_melee.gcm");

            if (superSmashBrosMeleeRom == null)
            {
                return(null);
            }

            var options       = GcnFileHierarchyExtractor.Options.Standard();
            var fileHierarchy =
                new GcnFileHierarchyExtractor()
                .ExtractFromRom(options, superSmashBrosMeleeRom);

            var rootModelDirectory =
                new ModelDirectory <DatModelFileBundle>("super_smash_bros_melee");

            foreach (var datFile in fileHierarchy.Root.FilesWithExtension(".dat"))
            {
                var datFileName = datFile.NameWithoutExtension;

                var isValidModel = false;

                // Playable character data
                if (datFileName.StartsWith("Pl"))
                {
                    if (datFileName.EndsWith("Nr"))
                    {
                        isValidModel = true;
                    }
                }

                // Stages
                if (datFileName.StartsWith("Gr"))
                {
                    isValidModel = true;
                }

                // Trophies
                if (datFileName.StartsWith("Ty"))
                {
                    isValidModel = true;
                }

                // TODO: Look into the other files

                if (isValidModel)
                {
                    rootModelDirectory.AddFileBundle(new DatModelFileBundle(datFile));
                }
            }

            return(rootModelDirectory);
        }
Beispiel #12
0
        public IModelDirectory <IHaloWarsModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var haloWarsSteamDirectory =
                SteamUtils.GetGameDirectory("HaloWarsDE", assert);

            if (haloWarsSteamDirectory == null)
            {
                return(null);
            }

            var scratchDirectory = DirectoryConstants.ROMS_DIRECTORY
                                   .GetSubdir("halo_wars", true);

            var context = new HWContext(haloWarsSteamDirectory.FullName,
                                        scratchDirectory.FullName);

            // Expand all compressed/encrypted game files. This also handles the .xmb -> .xml conversion
            context.ExpandAllEraFiles();

            var fileHierarchy = new FileHierarchy(scratchDirectory);

            var rootNode = new ModelDirectory <IHaloWarsModelFileBundle>("halo_wars");

            var mapDirectories =
                fileHierarchy.Root
                .TryToGetSubdir("scenario/skirmish/design")
                .Subdirs;

            foreach (var srcMapDirectory in mapDirectories)
            {
                var xtdFile = srcMapDirectory.FilesWithExtension(".xtd").Single();
                var xttFile = srcMapDirectory.FilesWithExtension(".xtt").Single();
                rootNode.AddFileBundleRelative(
                    new XtdModelFileBundle(xtdFile, xttFile, context));
            }

            var artDirectory   = fileHierarchy.Root.TryToGetSubdir("art");
            var artSubdirQueue = new FinQueue <IFileHierarchyDirectory>(artDirectory);

            // TODO: Switch to DFS instead, it's more intuitive as a user
            while (artSubdirQueue.TryDequeue(out var artSubdir))
            {
                // TODO: Skip a file if it's already been extracted
                // TODO: Parse UGX files instead, as long as they specify their own animations
                var visFiles = artSubdir.FilesWithExtension(".vis");
                foreach (var visFile in visFiles)
                {
                    rootNode.AddFileBundleRelative(new VisModelFileBundle(visFile, context));
                }

                artSubdirQueue.Enqueue(artSubdir.Subdirs);
            }

            return(rootNode);
        }
        public void BuildDirectorInAction(string id)
        {
            var channelCache = (ModelChannel)cache.Get(id);
            var directories  = _dbContext.Directory.AsNoTracking().Where(d => d.DOwnerId.Equals(id))
                               .Select(f => new { f.DId, f.DName, f.DOwner, f.DDepth }).ToList();          //Now not support nested Directory

            foreach (var directory in directories)
            {
                var modelDirectory = new ModelDirectory(directory.DId, directory.DName);
                channelCache.addDirectory(modelDirectory);
            }
        }
Beispiel #14
0
        public void AddElement(ModelDirectory model)
        {
            ModelDirectory element = new ModelDirectory
            {
                ContractId = model.ContractId,
                ServiceId  = model.ServiceId,
                Data       = model.Data
            };

            context.Directories.Add(element);
            context.SaveChanges();
        }
        private void ExtractKarts_(
            ModelDirectory <BmdModelFileBundle> rootModelDirectory,
            IFileHierarchy fileHierarchy)
        {
            var kartSubdir = fileHierarchy.Root.TryToGetSubdir(@"MRAM\kart");
            var kartNode   = rootModelDirectory.AddSubdir("kart");

            foreach (var subdir in kartSubdir.Subdirs)
            {
                var bmdFiles = subdir.FilesWithExtension(".bmd")
                               .ToArray();
                this.ExtractModels_(kartNode.AddSubdir(subdir.Name), bmdFiles);
            }
        }
        private void DataGridView_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            try
            {
                ModelDirectory direc = serviceD.GetElement(Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[0].Value));

                toolStripComboBoxService.SelectedItem = direc.ServiceId;
                dateTimePicker1.Value = direc.Data;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Beispiel #17
0
        private void ExtractFludd_(
            ModelDirectory <BmdModelFileBundle> rootModelDirectory,
            IFileHierarchy fileHierarchy)
        {
            var fluddSubdir =
                fileHierarchy.Root.TryToGetSubdir(@"data\mario\watergun2");

            foreach (var subdir in fluddSubdir.Subdirs)
            {
                this.ExtractPrimaryAndSecondaryModels_(
                    rootModelDirectory.AddSubdir("fludd"),
                    subdir,
                    file => file.Name.Contains("wg"));
            }
        }
Beispiel #18
0
        public void UpdElement(ModelDirectory model)
        {
            ModelDirectory element = context.Directories.FirstOrDefault(rec => rec.Id == model.Id);

            if (element == null)
            {
                throw new Exception("Элемент не найден");
            }


            element.ContractId = model.ContractId;
            element.ServiceId  = model.ServiceId;
            element.Data       = model.Data;

            context.SaveChanges();
        }
Beispiel #19
0
        public ModelDirectory GetElement(int id)
        {
            ModelDirectory element = context.Directories.FirstOrDefault(rec => rec.Id == id);

            if (element != null)
            {
                return(new ModelDirectory
                {
                    Id = element.Id,
                    ContractId = element.ContractId,
                    ServiceId = element.ServiceId,
                    Data = element.Data
                });
            }
            throw new Exception("Элемент не найден");
        }
Beispiel #20
0
        public IViewComponentResult Invoke()
        {
            string channelID   = RouteData.Values["Cid"] as string;
            string directoryID = RouteData.Values["Did"] as string;
            string threadID    = RouteData.Values["Tid"] as string;

            ModelChannel channel;

            if (!cache.TryGetValue(channelID, out channel))                                  //Check if channel in cache or not
            {
                return(new HtmlContentViewComponentResult(new HtmlString("Wrong Channel"))); //not in cache
            }
            else
            {
                ModelDirectory directory = channel.GetDirectory(directoryID);                   //check if the directory is vaild or not
                if (directory == null)
                {
                    return(new HtmlContentViewComponentResult(new HtmlString("Wrong directory")));    //not vaild
                }
                else
                {
                    ModelThread thread = directory.GetThread(threadID);     //check if there is thread that have the requsted id
                    if (thread == null)
                    {
                        return(new HtmlContentViewComponentResult(new HtmlString("Wrong Path")));  //not Available
                    }
                    else
                    {
                        var Comments = _dbContext.Comment.Where(c => c.FileID.Equals(threadID)).ToList();
                        foreach (var comment in Comments)
                        {
                            var user   = _dbContext.Users.FirstOrDefault(u => u.UId.Equals(comment.CUserId)).UFirstName;
                            var useImg = ImageConverter.ConvertToString(_dbContext.UsersImg.FirstOrDefault(u => u.UId.Equals(comment.CUserId)).UImg);

                            thread.AddComment(new ModelComment
                            {
                                CommentId = comment.CId,
                                Comment   = comment.CommentText,
                                userName  = user,
                                userImg   = useImg
                            });
                        }
                        return(View(thread));      //return thread
                    }
                }
            }
        }
Beispiel #21
0
        private void ExtractMario_(
            ModelDirectory <BmdModelFileBundle> rootModelDirectory,
            IFileHierarchy fileHierarchy)
        {
            var marioSubdir =
                fileHierarchy.Root.TryToGetSubdir(@"data\mario");
            var bcxFiles = marioSubdir.TryToGetSubdir("bck")
                           .Files.Where(
                file => file.Name.StartsWith("ma_"))
                           .ToArray();
            var bmdFile = marioSubdir.TryToGetSubdir("bmd")
                          .Files.Single(
                file => file.Name == "ma_mdl1.bmd");

            this.ExtractModels_(rootModelDirectory.AddSubdir("mario"),
                                new[] { bmdFile }, bcxFiles);
        }
Beispiel #22
0
        private void ExtractYoshi_(
            ModelDirectory <BmdModelFileBundle> rootModelDirectory,
            IFileHierarchy fileHierarchy)
        {
            var yoshiSubdir =
                fileHierarchy.Root.TryToGetSubdir(@"data\yoshi");
            var bcxFiles = yoshiSubdir
                           .Files.Where(
                file => file.Extension == ".bck")
                           // TODO: Look into this, this animation seems to need extra bone(s)?
                           .Where(file => !file.Name.StartsWith("yoshi_tongue"))
                           .ToArray();
            var bmdFile = yoshiSubdir.Files.Single(
                file => file.Name == "yoshi_model.bmd");

            this.ExtractModels_(rootModelDirectory.AddSubdir("yoshi"),
                                new[] { bmdFile }, bcxFiles);
        }
        public FileInfo TryFindAutomaticaly()
        {
            var    reportMatchFound  = false;
            string matchedReportName = null;

            if (ReportDirectoryFound)
            {
                var modelInDepartmentName = ModelDirectory.Split('\\').LastOrDefault();
                var files = Directory.GetFiles(DialogIntialDirectory, "*.html");
                foreach (var file in files)
                {
                    var inReportModelName = GetRelatedModelName(file);
                    if (inReportModelName != null && inReportModelName.Contains(modelInDepartmentName))
                    {
                        matchedReportName = file; reportMatchFound = true;
                    }
                }
            }
            if (reportMatchFound)
            {
                return(new FileInfo(matchedReportName));
            }
            return(this.FindWithDialog());
        }
        public IModelDirectory <CmbModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var luigisMansionRom =
                DirectoryConstants.ROMS_DIRECTORY.TryToGetExistingFile(
                    "luigis_mansion_3d.cia");

            if (luigisMansionRom == null)
            {
                return(null);
            }

            var fileHierarchy =
                new ThreeDsFileHierarchyExtractor().ExtractFromRom(
                    luigisMansionRom);

            var rootModelDirectory =
                new ModelDirectory <CmbModelFileBundle>("luigis_mansion_3d");
            var queue =
                new Queue <(IFileHierarchyDirectory,
                            IModelDirectory <CmbModelFileBundle>)>();

            queue.Enqueue((fileHierarchy.Root, rootModelDirectory));
            while (queue.Any())
            {
                var(directory, node) = queue.Dequeue();

                this.ExtractModel_(node, directory);

                foreach (var subdir in directory.Subdirs)
                {
                    queue.Enqueue((subdir, node.AddSubdir(subdir.Name)));
                }
            }
            return(rootModelDirectory);
        }
        private void ExtractDrivers_(
            ModelDirectory <BmdModelFileBundle> rootModelDirectory,
            IFileHierarchy fileHierarchy)
        {
            var mramSubdir = fileHierarchy.Root.TryToGetSubdir(@"MRAM\driver");
            var driverNode = rootModelDirectory.AddSubdir("driver");

            {
                var plumberNames   = new[] { "mario", "luigi", };
                var plumberSubdirs =
                    mramSubdir.Subdirs.Where(
                        subdir => plumberNames.Contains(subdir.Name));
                var plumberCommon = mramSubdir.TryToGetSubdir("cmn_hige");
                foreach (var plumberSubdir in plumberSubdirs)
                {
                    this.ExtractFromSeparateDriverDirectories_(
                        driverNode.AddSubdir(plumberSubdir.Name),
                        plumberSubdir,
                        plumberCommon);
                }
            }

            {
                var babyNames = new[] {
                    "babymario", "babyluigi",
                    // Should the toads actually be included here?
                    "kinipio", "kinopico"
                };
                var babySubdirs =
                    mramSubdir.Subdirs.Where(
                        subdir => babyNames.Contains(subdir.Name));
                var babyCommon = mramSubdir.TryToGetSubdir("cmn_baby");
                foreach (var babySubdir in babySubdirs)
                {
                    this.ExtractFromSeparateDriverDirectories_(
                        driverNode.AddSubdir(babySubdir.Name),
                        babySubdir,
                        babyCommon);
                }
            }

            {
                var princessNames   = new[] { "daisy", "peach" };
                var princessSubdirs =
                    mramSubdir.Subdirs.Where(
                        subdir => princessNames.Contains(subdir.Name));
                var princessCommon = mramSubdir.TryToGetSubdir("cmn_hime");
                foreach (var princessSubdir in princessSubdirs)
                {
                    this.ExtractFromSeparateDriverDirectories_(
                        driverNode.AddSubdir(princessSubdir.Name),
                        princessSubdir,
                        princessCommon);
                }
            }

            {
                var lizardNames   = new[] { "catherine", "yoshi" };
                var lizardSubdirs =
                    mramSubdir.Subdirs.Where(
                        subdir => lizardNames.Contains(subdir.Name));
                var lizardCommon = mramSubdir.TryToGetSubdir("cmn_liz");
                foreach (var lizardSubdir in lizardSubdirs)
                {
                    this.ExtractFromSeparateDriverDirectories_(
                        driverNode.AddSubdir(lizardSubdir.Name),
                        lizardSubdir,
                        lizardCommon);
                }
            }

            // TODO: Where are toad's animations?

            {
                var koopaNames   = new[] { "patapata", "nokonoko" };
                var koopaSubdirs =
                    mramSubdir.Subdirs.Where(
                        subdir => koopaNames.Contains(subdir.Name));
                var koopaCommon = mramSubdir.TryToGetSubdir("cmn_zako");
                foreach (var koopaSubdir in koopaSubdirs)
                {
                    this.ExtractFromSeparateDriverDirectories_(
                        driverNode.AddSubdir(koopaSubdir.Name),
                        koopaSubdir,
                        koopaCommon);
                }
            }

            {
                var standaloneNames = new[] {
                    "bosspakkun",
                    "dk",
                    "dkjr",
                    "kingteresa",
                    "koopa",
                    "koopajr",
                    "waluigi",
                    "wario",
                };
                var standaloneSubdirs =
                    mramSubdir.Subdirs.Where(
                        subdir => standaloneNames.Contains(subdir.Name));
                foreach (var standaloneSubdir in standaloneSubdirs)
                {
                    this.ExtractFromDriverDirectory_(
                        driverNode.AddSubdir(standaloneSubdir.Name),
                        standaloneSubdir);
                }
            }
        }