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); }
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 } } } }
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(); }