Beispiel #1
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);
        }
Beispiel #2
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);
        }
        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);
        }
Beispiel #4
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 #6
0
        public void ExtractAll()
        {
            var paperMarioTheThousandYearDoorRom =
                DirectoryConstants.ROMS_DIRECTORY.GetExistingFile(
                    "paper_mario_the_thousand_year_door.gcm");

            var options       = GcnFileHierarchyExtractor.Options.Standard();
            var fileHierarchy =
                new GcnFileHierarchyExtractor()
                .ExtractFromRom(options, paperMarioTheThousandYearDoorRom);
        }
        public void ExtractAll()
        {
            var animalCrossingRom =
                DirectoryConstants.ROMS_DIRECTORY.GetExistingFile(
                    "animal_crossing.gcm");

            var options = GcnFileHierarchyExtractor.Options.Standard();

            var fileHierarchy =
                new GcnFileHierarchyExtractor().ExtractFromRom(
                    options,
                    animalCrossingRom);

            var logger = Logging.Create <AnimalCrossingExtractor>();

            // TODO: Extract models via display lists
        }
Beispiel #8
0
        public void ExtractAll()
        {
            var luigisMansionRom =
                DirectoryConstants.ROMS_DIRECTORY.GetExistingFile(
                    "luigis_mansion.gcm");

            var options =
                GcnFileHierarchyExtractor.Options.Standard()
                .UseRarcDumpForExtensions(
                    // For some reason, some MDL files are compressed as RARC.
                    ".mdl");

            var fileHierarchy =
                new GcnFileHierarchyExtractor().ExtractFromRom(
                    options,
                    luigisMansionRom);

            // TODO: Use Mdl2Fbx
        }
        public IModelDirectory <ModlModelFileBundle>?GatherModelFileBundles(
            bool assert)
        {
            var battalionWarsRom =
                DirectoryConstants.ROMS_DIRECTORY.TryToGetExistingFile(
                    "battalion_wars_1.gcm");

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

            var options = GcnFileHierarchyExtractor.Options.Standard();

            var fileHierarchy =
                new GcnFileHierarchyExtractor().ExtractFromRom(
                    options,
                    battalionWarsRom);

            foreach (var directory in fileHierarchy)
            {
                var didUpdate = false;
                var resFiles  = directory.FilesWithExtension(".res");
                foreach (var resFile in resFiles)
                {
                    didUpdate |= new ResDump().Run(resFile);
                }

                if (didUpdate)
                {
                    directory.Refresh();
                }
            }

            return(new FileHierarchyBundler <ModlModelFileBundle>(
                       directory => {
                var modlFiles = directory.FilesWithExtension(".modl");
                var animFiles = directory.FilesWithExtension(".anim");

                var svetModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "SVET");
                var sgruntModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "SGRUNT");

                var tvetModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "TVET");
                var tgruntModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "TGRUNT");

                var uvetModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "UVET");
                var ugruntModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "UGRUNT");

                var wvetModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "WVET");
                var wgruntModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "WGRUNT");

                var xvetModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "XVET");
                var xgruntModlFile =
                    modlFiles.Where(modlFile =>
                                    modlFile.NameWithoutExtension is "XGRUNT");


                var fvAnimFiles =
                    animFiles.Where(
                        animFile =>
                        animFile.NameWithoutExtension.StartsWith("FV"))
                    .ToArray();
                var fgAnimFiles =
                    animFiles.Where(
                        animFile =>
                        animFile.NameWithoutExtension.StartsWith("FG"))
                    .ToArray();

                var sgAnimFiles =
                    animFiles.Where(
                        animFile =>
                        animFile.NameWithoutExtension.StartsWith(
                            "SG"))
                    .ToArray();
                var uvAnimFiles =
                    animFiles.Where(
                        animFile =>
                        animFile.NameWithoutExtension.StartsWith(
                            "UV"))
                    .ToArray();
                var wgruntAnimFiles =
                    animFiles.Where(
                        animFile =>
                        animFile.NameWithoutExtension.StartsWith(
                            "WGRUNT"))
                    .ToArray();
                var xgAnimFiles =
                    animFiles.Where(
                        animFile =>
                        animFile.NameWithoutExtension.StartsWith(
                            "XG"))
                    .ToArray();
                var xvAnimFiles =
                    animFiles.Where(
                        animFile =>
                        animFile.NameWithoutExtension.StartsWith(
                            "XV"))
                    .ToArray();

                var otherModlFiles =
                    modlFiles.Where(
                        modlFile =>
                        !sgruntModlFile.Contains(modlFile) &&
                        !svetModlFile.Contains(modlFile) &&
                        !tgruntModlFile.Contains(modlFile) &&
                        !tvetModlFile.Contains(modlFile) &&
                        !ugruntModlFile.Contains(modlFile) &&
                        !uvetModlFile.Contains(modlFile) &&
                        !wgruntModlFile.Contains(modlFile) &&
                        !wvetModlFile.Contains(modlFile) &&
                        !xgruntModlFile.Contains(modlFile) &&
                        !xvetModlFile.Contains(modlFile)
                        )
                    .ToArray();

                var allModlsAndAnims =
                    new (IEnumerable <IFileHierarchyFile>, IList <IFileHierarchyFile>?
                         )
                    [] {
                    (sgruntModlFile,
                     fgAnimFiles.Concat(sgAnimFiles).ToArray()),
                    (svetModlFile, fvAnimFiles),
                    (tgruntModlFile, fgAnimFiles),
                    (tvetModlFile, fvAnimFiles),
                    (ugruntModlFile, fgAnimFiles),
                    (uvetModlFile,
                     fvAnimFiles.Concat(uvAnimFiles).ToArray()),
                    (wgruntModlFile,
                     fgAnimFiles.Concat(wgruntAnimFiles).ToArray()),
                    (wvetModlFile, fvAnimFiles),
                    (xgruntModlFile,
                     fgAnimFiles.Concat(xgAnimFiles).ToArray()),
                    (xvetModlFile,
                     fvAnimFiles.Concat(xvAnimFiles).ToArray()),
                    (otherModlFiles, null),
                };

                var bundles =
                    allModlsAndAnims
                    .SelectMany(
                        modlsAndAnims =>
                        modlsAndAnims
                        .Item1
                        .Select(
                            modlFile => new ModlModelFileBundle {
                    ModlFile = modlFile,
                    ModlType = ModlType.BW1,
                    AnimFiles = modlsAndAnims.Item2
                }))
                    .ToList();
                bundles.Sort((lhs, rhs) =>
                             lhs.MainFile.Name.CompareTo(rhs.MainFile.Name));

                return bundles;
            }
        public void ExtractAll()
        {
            var windWakerRom =
                DirectoryConstants.ROMS_DIRECTORY.GetExistingFile(
                    "wind_waker.gcm");

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

            var objectDirectory = fileHierarchy.Root.TryToGetSubdir(@"res\Object");

            {
                var yaz0Dec       = new Yaz0Dec();
                var didDecompress = false;
                foreach (var arcFile in objectDirectory.FilesWithExtension(".arc"))
                {
                    didDecompress |= yaz0Dec.Run(arcFile, true);
                }

                if (didDecompress)
                {
                    objectDirectory.Refresh();
                }

                var rarcDump = new RarcDump();
                var didDump  = false;
                foreach (var rarcFile in objectDirectory.FilesWithExtension(".rarc"))
                {
                    didDump |= rarcDump.Run(rarcFile,
                                            true,
                                            new HashSet <string>(new[] { "archive" }));
                }

                if (didDump)
                {
                    objectDirectory.Refresh(true);
                }
            }

            this.ExtractObjects_(objectDirectory);

            /*{
             * var relsDirectory = fileHierarchy.Root.TryToGetSubdir("rels");
             * var mapFiles = fileHierarchy.Root.TryToGetSubdir("maps").Files;
             *
             * var yaz0Dec = new Yaz0Dec();
             * var didDecompress = false;
             * foreach (var relFile in relsDirectory.FilesWithExtension(".rel")) {
             *  didDecompress |= yaz0Dec.Run(relFile, false);
             * }
             *
             * if (didDecompress) {
             *  relsDirectory.Refresh();
             * }
             *
             * var didDump = false;
             * var relDump = new RelDump();
             * foreach (var rarcFile in relsDirectory.FilesWithExtension(".rarc")) {
             *  var mapFile = mapFiles.Single(
             *      file => file.NameWithoutExtension ==
             *              rarcFile.NameWithoutExtension);
             *
             *  didDump |= relDump.Run(rarcFile, mapFile, true);
             * }
             *
             * if (didDump) {
             *  relsDirectory.Refresh(true);
             * }
             * }*/
        }