private void DoBuild(object o) { DisableButton(); BuildOptions options = (BuildOptions)o; SetProgressBarSettings(0, 100, 1, ProgressBarStyle.Marquee); IPackfile packfile = null; switch (options.Game) { case GameSteamID.SaintsRow2: { packfile = new Packfiles.Version04.Packfile(); break; } case GameSteamID.SaintsRowIV: case GameSteamID.SaintsRowGatOutOfHell: { packfile = new Packfiles.Version0A.Packfile(Path.GetExtension(options.Destination) == ".str2_pc"); break; } default: { throw new NotImplementedException(); } } Stream2File asm = null; Stream2.Container thisContainer = null; SetText("Setting up..."); if (Path.GetExtension(options.Destination) == ".str2_pc") { packfile.IsCondensed = true; packfile.IsCompressed = true; if (options.Asm != null) { using (Stream asmStream = File.OpenRead(options.Asm)) { asm = new Stream2File(asmStream); } } } else { string filename = Path.GetFileName(options.Destination); if (OriginalPackfileInfo.OptionsList.ContainsKey(options.Game) && OriginalPackfileInfo.OptionsList[options.Game].ContainsKey(filename)) { var vppOptions = OriginalPackfileInfo.OptionsList[options.Game][filename]; packfile.IsCondensed = vppOptions.Condense; packfile.IsCompressed = vppOptions.Compress; } } if (asm != null) { string containerName = Path.GetFileNameWithoutExtension(options.Destination); foreach (var container in asm.Containers) { string tempContainerName = Path.GetFileNameWithoutExtension(container.Name); if (tempContainerName == containerName) { thisContainer = container; break; } } if (thisContainer == null) { SetText("Couldn't find a container called {0} in the selected asm_pc file!", containerName); SetProgressBarSettings(0, 100, 0, ProgressBarStyle.Continuous); EnableButton(); return; } SetProgressBarSettings(0, thisContainer.PrimitiveCount, 0, ProgressBarStyle.Continuous); SetText("Adding files..."); foreach (Primitive primitive in thisContainer.Primitives) { string primitiveFile = Path.Combine(options.Source, primitive.Name); if (!File.Exists(primitiveFile)) { SetText("Couldn't find a container called {0} in the selected asm_pc file!", containerName); SetProgressBarSettings(0, 100, 0, ProgressBarStyle.Continuous); EnableButton(); return; } string filename = Path.GetFileName(primitiveFile); Stream stream = File.OpenRead(primitiveFile); packfile.AddFile(stream, filename); string extension = Path.GetExtension(primitiveFile); string gpuExtension = ""; switch (extension) { default: { if (extension.StartsWith(".c")) { gpuExtension = ".g" + extension.Remove(0, 2); } break; } } string gpuFile = Path.ChangeExtension(primitiveFile, gpuExtension); if (File.Exists(gpuFile)) { string gpuFilename = Path.GetFileName(gpuFile); Stream gpuStream = File.OpenRead(gpuFile); packfile.AddFile(gpuStream, gpuFilename); } Step(); } } else { string[] files = Directory.GetFiles(options.Source); SetProgressBarSettings(0, files.Length, 0, ProgressBarStyle.Continuous); SetText("Adding files..."); foreach (string file in files) { string filename = Path.GetFileName(file); Stream stream = File.OpenRead(file); packfile.AddFile(stream, filename); } } SetProgressBarSettings(0, 100, 0, ProgressBarStyle.Marquee); SetText("Writing output file: {0}", options.Destination); using (Stream output = File.Open(options.Destination, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { packfile.Save(output); } if (asm != null) { SetText("Updating asm_pc file: {0}", options.Asm); packfile.Update(thisContainer); using (Stream asmStream = File.Create(options.Asm)) { asm.Save(asmStream); } Console.WriteLine("done."); } SetProgressBarSettings(0, 1, 1, ProgressBarStyle.Continuous); Step(); SetText("Finished!"); EnableButton(); }
static void Main(string[] args) { Options options = null; try { options = CommandLine.Parse <Options>(); } catch (CommandLineException exception) { Console.WriteLine(exception.ArgumentHelp.Message); Console.WriteLine(); Console.WriteLine(exception.ArgumentHelp.GetHelpText(Console.BufferWidth)); Console.ReadLine(); return; } if (options.Source == null) { string sriv = ThomasJepp.SaintsRow.Utility.GetGamePath(GameSteamID.SaintsRowIV); string srgooh = ThomasJepp.SaintsRow.Utility.GetGamePath(GameSteamID.SaintsRowGatOutOfHell); int gameCount = 0, srivNum = 0, srgoohNum = 0; Console.WriteLine("Detected the following games:"); if (sriv != null) { gameCount++; srivNum = gameCount; Console.WriteLine("{0}. Saints Row IV: {1}", gameCount, sriv); } if (srgooh != null) { gameCount++; srgoohNum = gameCount; Console.WriteLine("{0}. Saints Row Gat Out Of Hell: {1}", gameCount, srgooh); } Console.WriteLine(); while (true) { Console.Write("Which game do you want to update? (enter the number) "); ConsoleKeyInfo input = Console.ReadKey(); Console.WriteLine(); Console.WriteLine(); if (input.Key == ConsoleKey.D1 || input.Key == ConsoleKey.NumPad1) { if (srivNum == 1) { options.Source = sriv; Console.WriteLine("Updating Saints Row IV files."); } else if (srgoohNum == 1) { options.Source = srgooh; Console.WriteLine("Updating Saints Row: Gat Out Of Hell files."); } } else if (input.Key == ConsoleKey.D2 || input.Key == ConsoleKey.NumPad2) { if (srivNum == 2) { options.Source = sriv; Console.WriteLine("Updating Saints Row IV files."); } else if (srgoohNum == 2) { options.Source = srgooh; Console.WriteLine("Updating Saints Row: Gat Out Of Hell files."); } } if (options.Source != null) { break; } } } if (options.Source == null) { Console.WriteLine("Couldn't find the Saints Row IV folder?"); Console.WriteLine(); Console.WriteLine("Press enter to exit."); Console.ReadLine(); return; } string str2Dir = options.Source; //if (Directory.Exists(Path.Combine(options.Source, "mods"))) //str2Dir = Path.Combine(options.Source, "mods"); string[] str2Paths = Directory.GetFiles(str2Dir, "*.str2_pc"); List <string> str2Files = new List <string>(); foreach (string str2Path in str2Paths) { str2Files.Add(Path.GetFileName(str2Path)); } if (str2Files.Count == 0) { Console.WriteLine("No str2_pc files found - no update needed."); Console.WriteLine(); Console.WriteLine("Press enter to exit."); Console.ReadLine(); return; } string packfileCache = Path.Combine(options.Source, "packfiles", "pc", "cache"); Dictionary <string, Stream2File> asmsToSave = new Dictionary <string, Stream2File>(); string[] packfiles = Directory.GetFiles(packfileCache, "*.vpp_pc"); int vppCount = 0; foreach (string packfilePath in packfiles) { vppCount++; Console.WriteLine("[{0}/{1}] Checking {2}...", vppCount, packfiles.Length, Path.GetFileName(packfilePath)); using (Stream stream = File.OpenRead(packfilePath)) { using (IPackfile packfile = Packfile.FromStream(stream, false)) { foreach (var packedFile in packfile.Files) { if (Path.GetExtension(packedFile.Name) != ".asm_pc") { continue; } using (Stream asmStream = packedFile.GetStream()) { Stream2File asm = new Stream2File(asmStream); foreach (var container in asm.Containers) { string containerName = Path.ChangeExtension(container.Name, ".str2_pc"); if (str2Files.Contains(containerName)) { if (!asmsToSave.ContainsKey(packedFile.Name)) { asmsToSave.Add(packedFile.Name, asm); } Console.Write(" - Updating {0} - {1}...", packedFile.Name, containerName); using (Stream str2Stream = File.OpenRead(Path.Combine(str2Dir, containerName))) { using (IPackfile str2 = Packfile.FromStream(str2Stream, true)) { str2.Update(container); } } Console.WriteLine(" done."); } } } } } } } Console.WriteLine(); Console.WriteLine("Writing updated asm_pc files..."); int count = 0; foreach (var asmPair in asmsToSave) { count++; Console.Write("[{0}/{1}] Saving {2}...", count, asmsToSave.Count, asmPair.Key); string outPath = Path.Combine(str2Dir, asmPair.Key); using (Stream outStream = File.Create(outPath)) { asmPair.Value.Save(outStream); } Console.WriteLine(" done."); } Console.WriteLine("Done."); Console.WriteLine(); Console.WriteLine("Press enter to exit."); Console.ReadLine(); }
static void Main(string[] args) { Options options = null; try { options = CommandLine.Parse <Options>(); } catch (CommandLineException exception) { Console.WriteLine(exception.ArgumentHelp.Message); Console.WriteLine(); Console.WriteLine(exception.ArgumentHelp.GetHelpText(Console.BufferWidth)); #if DEBUG Console.ReadLine(); #endif return; } IPackfile packfile = null; Stream2File asm = null; Console.WriteLine("Building {0} using data from {1}.", options.Output, options.Source); IGameInstance instance = GameInstance.GetFromString(options.Game); switch (instance.Game) { case GameSteamID.SaintsRow2: packfile = new Packfiles.Version04.Packfile(); break; case GameSteamID.SaintsRowTheThird: throw new NotImplementedException(); break; case GameSteamID.SaintsRowIV: case GameSteamID.SaintsRowGatOutOfHell: packfile = new Packfiles.Version0A.Packfile(Path.GetExtension(options.Output) == ".str2_pc"); if (Path.GetExtension(options.Output) == ".str2_pc") { packfile.IsCondensed = true; packfile.IsCompressed = true; if (options.AsmFile != null) { Console.WriteLine("Will update asm_pc file {0} with data for new package.", options.AsmFile); using (Stream asmStream = File.OpenRead(options.AsmFile)) { asm = new Stream2File(asmStream); } } } break; default: throw new NotImplementedException(); } if (options.Condensed.ToLowerInvariant() == "true") { packfile.IsCondensed = true; } else if (options.Condensed.ToLowerInvariant() == "false") { packfile.IsCondensed = false; } if (options.Compressed.ToLowerInvariant() == "true") { packfile.IsCompressed = true; } else if (options.Compressed.ToLowerInvariant() == "false") { packfile.IsCompressed = false; } Container thisContainer = null; if (asm != null) { string containerName = Path.GetFileNameWithoutExtension(options.Output); foreach (var container in asm.Containers) { string tempContainerName = Path.GetFileNameWithoutExtension(container.Name); if (tempContainerName == containerName) { thisContainer = container; break; } } if (thisContainer == null) { throw new Exception(String.Format("Unable to find container {0} in asm_pc file {1}.", containerName, options.AsmFile)); } foreach (Primitive primitive in thisContainer.Primitives) { string primitiveFile = Path.Combine(options.Source, primitive.Name); if (!File.Exists(primitiveFile)) { Console.WriteLine("Unable to find primitive {0} for container {1}", containerName, primitive.Name); continue; } string filename = Path.GetFileName(primitiveFile); Console.Write("Adding {0}... ", filename); Stream stream = File.OpenRead(primitiveFile); packfile.AddFile(stream, filename); Console.WriteLine("done."); string extension = Path.GetExtension(primitiveFile); string gpuExtension = ""; switch (extension) { default: { if (extension.StartsWith(".c")) { gpuExtension = ".g" + extension.Remove(0, 2); } break; } } string gpuFile = Path.ChangeExtension(primitiveFile, gpuExtension); if (File.Exists(gpuFile)) { string gpuFilename = Path.GetFileName(gpuFile); Console.Write("Adding {0}... ", gpuFilename); Stream gpuStream = File.OpenRead(gpuFile); packfile.AddFile(gpuStream, gpuFilename); Console.WriteLine("done."); } } } else { string[] files = Directory.GetFiles(options.Source); foreach (string file in files) { string filename = Path.GetFileName(file); Console.Write("Adding {0}... ", filename); Stream stream = File.OpenRead(file); packfile.AddFile(stream, filename); Console.WriteLine("done."); } } using (Stream output = File.Open(options.Output, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { Console.Write("Writing packfile to {0}... ", options.Output); packfile.Save(output); Console.WriteLine("done."); } if (asm != null) { Console.Write("Updating asm_pc file {0}... ", options.AsmFile); packfile.Update(thisContainer); using (Stream asmStream = File.Create(options.AsmFile)) { asm.Save(asmStream); } Console.WriteLine("done."); } #if DEBUG Console.ReadLine(); #endif }
static void Main(string[] args) { string src = @"D:\Gaming\Saints Row 4\test\in"; string temp = @"D:\Gaming\Saints Row 4\test"; string dst = @"D:\Gaming\Saints Row 4\test\out"; string[] packfileFolders = Directory.GetDirectories(src); GameSteamID game = GameSteamID.SaintsRowIV; foreach (string packfileFolder in packfileFolders) { string pfTemp = Path.Combine(temp, Path.GetFileName(packfileFolder)); Directory.CreateDirectory(pfTemp); // Copy raw files string[] pfFiles = Directory.GetFiles(packfileFolder); foreach (string file in pfFiles) { File.Copy(file, Path.Combine(pfTemp, Path.GetFileName(file))); } string[] asmFiles = Directory.GetFiles(pfTemp, "*.asm_pc"); foreach (string asmFile in asmFiles) { Stream2File asm = null; using (Stream stream = File.OpenRead(asmFile)) { asm = new Stream2File(stream); } int count = 0; foreach (var container in asm.Containers) { count++; string str2Name = Path.ChangeExtension(container.Name, ".str2_pc"); string str2Src = Path.Combine(packfileFolder, str2Name); Console.Write("[{0}/{1}] Building {2}...", count, asm.Containers.Count, str2Src.Remove(0, src.Length + 1)); if (Directory.Exists(str2Src)) { string outputFile = Path.Combine(pfTemp, Path.GetFileName(str2Src)); ProcessStartInfo psi = new ProcessStartInfo(@"D:\Development\SaintsRow\bin\Release\ThomasJepp.SaintsRow.BuildPackfile.exe", String.Format("{3} \"{0}\" \"{1}\" /asm:\"{2}\"", str2Src, outputFile, asmFile, game.ToString())); psi.CreateNoWindow = true; psi.WindowStyle = ProcessWindowStyle.Hidden; Process p = Process.Start(psi); p.WaitForExit(); Console.WriteLine(" OK"); } else { Console.WriteLine(" not found!"); } } } Console.Write("Building {0}...", Path.GetFileName(packfileFolder)); var options = OriginalPackfileInfo.OptionsList[game][Path.GetFileName(packfileFolder)]; ProcessStartInfo packpsi = new ProcessStartInfo(@"D:\Development\SaintsRow\bin\Release\ThomasJepp.SaintsRow.BuildPackfile.exe", String.Format("sriv \"{0}\" \"{1}\" /condensed:{2} /compressed:{3}", pfTemp, Path.Combine(dst, Path.GetFileName(packfileFolder)), options.Condense, options.Compress)); packpsi.CreateNoWindow = true; packpsi.WindowStyle = ProcessWindowStyle.Hidden; Process packProcess = Process.Start(packpsi); packProcess.WaitForExit(); Console.WriteLine(" OK"); } Console.WriteLine("Done."); }