Beispiel #1
0
        public TagViewer(Settings Settings, Extractor Output)
        {
            InitializeComponent();
            settings = Settings;
            output   = Output;

            vMeta = new MetaViewer();
            eBitm = new BitmapExtractor();
            eMode = new ModelExtractor();
            eSnd_ = new SoundExtractor();
            eSnd4 = new SoundExtractorH4();
            vUnic = new StringsViewer();
            eSbsp = new BSPExtractor();
            vS3D  = new S3DExplorer();

            eBitm.TagExtracted             += new TagExtractedEventHandler(extractor_TagExtracted);
            eMode.TagExtracted             += new TagExtractedEventHandler(extractor_TagExtracted);
            eSnd_.TagExtracted             += new TagExtractedEventHandler(extractor_TagExtracted);
            eSnd4.TagExtracted             += new TagExtractedEventHandler(extractor_TagExtracted);
            eSbsp.TagExtracted             += new TagExtractedEventHandler(extractor_TagExtracted);
            eBitm.ErrorExtracting          += new ErrorExtractingEventHandler(extractor_ErrorExtracting);
            eMode.ErrorExtracting          += new ErrorExtractingEventHandler(extractor_ErrorExtracting);
            eSnd_.ErrorExtracting          += new ErrorExtractingEventHandler(extractor_ErrorExtracting);
            eSnd4.ErrorExtracting          += new ErrorExtractingEventHandler(extractor_ErrorExtracting);
            eSbsp.ErrorExtracting          += new ErrorExtractingEventHandler(extractor_ErrorExtracting);
            eMode.FinishedRecursiveExtract += new FinishedRecursiveExtractEventHandler(eMode_FinishedRecursiveExtract);
            eSbsp.FinishedRecursiveExtract += new FinishedRecursiveExtractEventHandler(eMode_FinishedRecursiveExtract);

            eBitm.DefaultBitmFormat = settings.BitmFormat;
            eMode.DefaultBitmFormat = settings.BitmFormat;
            eMode.DefaultModeFormat = settings.ModeFormat;
            eSnd_.DefaultSnd_Format = settings.Snd_Format;
            eSbsp.DefaultBitmFormat = settings.BitmFormat;
            eSbsp.DefaultModeFormat = settings.ModeFormat;

            tabMeta = new TabPage("Meta Viewer");
            tabMeta.Controls.Add(vMeta);
            vMeta.Dock = DockStyle.Fill;

            tabRaw   = new TabPage("Raw Extractor");
            tabModel = new TabPage("Model Viewer");

            tabControl1.TabPages.Add(tabMeta);
        }
Beispiel #2
0
        private void BatchExtract(CacheBase cache, List <TreeNode> parents, Settings settings, string dest, BackgroundWorker worker)
        {
            foreach (TreeNode parent in parents)
            {
                foreach (TreeNode child in parent.Nodes)
                {
                    if (worker.CancellationPending)
                    {
                        return;
                    }

                    if (child.Nodes.Count > 0)
                    {
                        BatchExtract(cache, new List <TreeNode>()
                        {
                            child
                        }, settings, dest, worker);
                        continue;
                    }

                    var tag   = child.Tag as CacheBase.IndexItem;
                    var fName = dest + ((settings.Flags.HasFlag(SettingsFlags.OutputByType)) ? "\\" + tag.ClassName : "") + "\\" + tag.Filename;
                    var tName = tag.Filename + "." + tag.ClassCode;

                    switch (tag.ClassCode)
                    {
                        #region bink
                    case "bink":
                        try
                        {
                            //only supports H4R
                            if (cache.Version < DefinitionSet.Halo4Retail)
                            {
                                continue;
                            }

                            fName += ".bik";

                            //AddLine("Extracting " + tName + "...");
                            if (settings.Flags.HasFlag(SettingsFlags.OverwriteTags) || !File.Exists(fName))
                            {
                                BinkExtractor.SaveBink(fName, cache, tag);
                                AddLine("Extracted " + tName + ".");
                                tagsExtracted++;
                            }
                        }

                        catch (Exception ex)
                        {
                            AddLine("Error extracting " + tName + ":");
                            AddLine("--" + ex.Message.Replace("\r\n", " "));
                            tagsMissed++;
                        }
                        break;

                        #endregion
                        #region bitm
                    case "bitm":
                        try
                        {
                            switch (settings.BitmFormat)
                            {
                            case BitmapFormat.TIF:
                                fName += ".tif";
                                break;

                            case BitmapFormat.DDS:
                                fName += ".dds";
                                break;

                            case BitmapFormat.RAW:
                                fName += ".bin";
                                break;
                            }

                            if (settings.Flags.HasFlag(SettingsFlags.OverwriteTags) || !File.Exists(fName))
                            {
                                BitmapExtractor.SaveAllImages(fName, cache, tag, settings.BitmFormat, settings.Flags.HasFlag(SettingsFlags.BitmapAlpha));
                                AddLine("Extracted " + tName + ".");
                                tagsExtracted++;
                            }
                        }
                        catch (Exception ex)
                        {
                            AddLine("Error extracting " + tName + ":");
                            AddLine("--" + ex.Message.Replace("\r\n", " "));
                            tagsMissed++;
                        }
                        break;

                        #endregion
                        #region mode
                    case "mode":
                    case "mod2":
                        try
                        {
                            switch (settings.ModeFormat)
                            {
                            case ModelFormat.EMF:
                                fName += ".emf";
                                break;

                            case ModelFormat.JMS:
                                fName += ".jms";
                                break;

                            case ModelFormat.OBJ:
                                fName += ".obj";
                                break;

                            case ModelFormat.AMF:
                                fName += ".amf";
                                break;
                            }

                            if (settings.Flags.HasFlag(SettingsFlags.OverwriteTags) || !File.Exists(fName))
                            {
                                ModelExtractor.SaveAllModelParts(fName, cache, tag, settings.ModeFormat, settings.Flags.HasFlag(SettingsFlags.SplitMeshes));
                                AddLine("Extracted " + tName + ".");
                                tagsExtracted++;
                            }
                        }
                        catch (Exception ex)
                        {
                            AddLine("Error extracting " + tName + ":");
                            AddLine("--" + ex.Message.Replace("\r\n", " "));
                            tagsMissed++;
                        }
                        break;

                        #endregion
                        #region sbsp
                    case "sbsp":
                        try
                        {
                            //AddLine("Extracting " + tName + "...");
                            switch (settings.ModeFormat)
                            {
                            case ModelFormat.EMF:
                                fName += ".emf";
                                break;

                            case ModelFormat.OBJ:
                                fName += ".obj";
                                break;

                            case ModelFormat.AMF:
                            case ModelFormat.JMS:
                                fName += ".amf";
                                break;
                            }

                            if (settings.Flags.HasFlag(SettingsFlags.OverwriteTags) || !File.Exists(fName))
                            {
                                BSPExtractor.SaveAllBSPParts(fName, cache, tag, settings.ModeFormat);
                                AddLine("Extracted " + tName + ".");
                                tagsExtracted++;
                            }
                        }
                        catch (Exception ex)
                        {
                            AddLine("Error extracting " + tName + ":");
                            AddLine("--" + ex.Message.Replace("\r\n", " "));
                            tagsMissed++;
                        }
                        break;

                        #endregion
                        #region snd!
                    case "snd!":
                        try
                        {
                            //H2, H3B not supported
                            if (cache.Version <= DefinitionSet.Halo3Beta)
                            {
                                continue;
                            }

                            //AddLine("Extracting " + tName + "...");
                            if (cache.Version < DefinitionSet.Halo4Retail)
                            {
                                SoundExtractor.SaveAllAsSeparate(dest + tag.Filename, cache, tag, settings.Snd_Format, settings.Flags.HasFlag(SettingsFlags.OverwriteTags));
                            }
                            else
                            {
                                (new SoundExtractorH4()).SaveAllAsSeparate(dest + tag.Filename, cache, tag, settings.Snd_Format, settings.Flags.HasFlag(SettingsFlags.OverwriteTags));
                            }

                            //SoundExtractor.SaveAllAsSingle(fName, cache, tag, settings.Snd_Format);
                            AddLine("Extracted " + tag.Filename + "." + tag.ClassCode + ".");
                            tagsExtracted++;
                        }
                        catch (Exception ex)
                        {
                            AddLine("Error extracting " + tName + ":");
                            AddLine("--" + ex.Message.Replace("\r\n", " "));
                            tagsMissed++;
                        }
                        break;

                        #endregion
                        #region unic
                    case "unic":
                        try
                        {
                            //H2 not supported
                            if (cache.Version < DefinitionSet.Halo3Beta)
                            {
                                continue;
                            }

                            fName += ".txt";

                            //AddLine("Extracting " + tName + "...");
                            if (settings.Flags.HasFlag(SettingsFlags.OverwriteTags) || !File.Exists(fName))
                            {
                                StringsViewer.SaveUnicStrings(fName, cache, tag, settings.Language);
                                AddLine("Extracted " + tName + ".");
                                tagsExtracted++;
                            }
                        }
                        catch (Exception ex)
                        {
                            AddLine("Error extracting " + tName + ":");
                            AddLine("--" + ex.Message.Replace("\r\n", " "));
                            tagsMissed++;
                        }
                        break;
                        #endregion
                    }
                }
            }
        }
Beispiel #3
0
        public static void Main(string[] args)
        {
            var gamePath = args.Length >= 1 ? Path.GetFullPath(args[0]) : DefaultGamePath;

            if (!Directory.Exists(gamePath))
            {
                Logger.Error("Invalid game path \"{0}\" (Missing directory)", gamePath);
                Environment.Exit(1);
                return;
            }

            var extractedGamePath = Path.GetFullPath(ExtractedGameDirectory);

            if (!Directory.Exists(extractedGamePath))
            {
                Logger.Debug("Using game path: \"{0}\"", gamePath);

                var pakPath = Path.Combine(gamePath, AudioPakPath);
                if (!File.Exists(pakPath))
                {
                    Logger.Error("Missing audio pak file in \"{0}\" ({1})", pakPath, UnsupportedVersionMessage);
                    Environment.Exit(1);
                    return;
                }

                Logger.Debug("Sounds PAK file found: \"{0}\"", pakPath);

                // EXTRACTING GAME FILES

                var extractor = new GameExtractor(pakPath);
                if (!extractor.Extract(extractedGamePath))
                {
                    Logger.Error("Unable to extract the game files");
                    Environment.Exit(1);
                    return;
                }
            }
            else
            {
                Logger.Debug("Using extracted game path: \"{0}\"", extractedGamePath);
            }

            // PARSING SOUND BANKS FILE
            var soundsPath = Path.Combine(extractedGamePath, SoundDirectory);

            if (!Directory.Exists(soundsPath))
            {
                Logger.Error("Missing sounds folder at \"{0}\" ({1})", soundsPath, UnsupportedVersionMessage);
                Environment.Exit(1);
                return;
            }

            var soundParser = new SoundParser(soundsPath);

            var streamedSounds = soundParser.ParseStreamedSounds();

            if (streamedSounds == null)
            {
                Logger.Error("Unable to parse the streamed sounds");
                Environment.Exit(1);
                return;
            }

            var soundBanks = soundParser.ParseBanks();

            if (soundBanks == null)
            {
                Logger.Error("Unable to parse the sound banks");
                Environment.Exit(1);
                return;
            }

            // EXTRACTING SOUND FILES
            var tmpDirectory    = Path.GetFullPath(TempDirectory);
            var outputDirectory = Path.GetFullPath(OutputDirectory);

            Directory.CreateDirectory(tmpDirectory);
            Directory.CreateDirectory(outputDirectory);

            var soundExtractor = new SoundExtractor(soundsPath, streamedSounds, soundBanks);

            soundExtractor.ExtractStreamedFiles(outputDirectory);
            soundExtractor.ExtractSoundBanks(tmpDirectory, outputDirectory);
            soundExtractor.ExtractLeftOverSounds(outputDirectory);

            var soundProcessor = new SoundProcessor(outputDirectory);

            soundProcessor.ProcessSounds();

            Logger.Info("Done.");
            Console.ReadKey();
        }