/// <summary> /// Extracts all dat archives to C:\skeletonKey\SourceDats\ /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void btnDeArchiveDATs_Click(object sender, RoutedEventArgs e) { var dats = DATFile.GetDatFiles(); string outputDir = @"C:\skeletonKey\SourceDats\"; Directory.CreateDirectory(outputDir); Console.WriteLine("Retrieving local DAT file archives - Count: " + dats.Count()); Console.WriteLine("Extracting DATs to " + outputDir); await Task.Run(() => { foreach (var d in dats) { try { using (SevenZip.SevenZipExtractor archive = new SevenZip.SevenZipExtractor(d)) { Console.WriteLine("Extracting: " + Path.GetFileName(d) + " To: " + outputDir + Path.GetFileNameWithoutExtension(d)); archive.ExtractArchive(outputDir); } } catch (Exception ex) { string eS = ex.ToString(); } } }); Console.WriteLine("------------Done------------"); }
public override void GenerateScripts(string icao, DATFile datFile, DSFFile dsfFile, TSCFile tscFile, string outputFolder, string texturesFolder) { this.icao = icao; this.datFile = datFile; this.dsfFile = dsfFile; this.tscFile = tscFile; var maxScriptFilePath = AppDomain.CurrentDomain.BaseDirectory + "\\ScriptGenerators\\ScriptTemplates\\MaxScript.liquid"; var maxScript = File.ReadAllText(maxScriptFilePath); var scriptModel = new ScriptModel(); this.CalculateRunways(scriptModel); this.CalculateDATFilePavements(scriptModel); this.CalculateDSFFileBuildings(scriptModel); this.CalculateAirportBoundary(scriptModel); scriptModel.AirportName = datFile.AirportHeader.Name; scriptModel.AirportICAO = datFile.AirportHeader.ICAOCode; scriptModel.GeneratedOn = DateTime.UtcNow; scriptModel.SaveFilePath = (outputFolder + @"\Input\" + icao + ".max").Replace(@"\", @"\\");; scriptModel.TexturesPath = (texturesFolder + @"\").Replace(@"\", @"\\"); Template template = Template.Parse(maxScript); Template.NamingConvention = new CSharpNamingConvention(); var maxScriptFinal = template.Render(Hash.FromAnonymousObject(scriptModel)); var outputFilePath = outputFolder + @"\Input\" + icao + ".py"; File.WriteAllText(outputFilePath, maxScriptFinal); }
private bool loadContainer() { container = new DATFile(filename); if (!container.Parse()) { MessageBox.Show("Sorry, seems like the DAT file is different from what was expected." + Environment.NewLine + "Check log output for details.", "Failed to parse DAT file", MessageBoxButtons.OK, MessageBoxIcon.Error); outputBox.Text = container.Log; return(false); } outputBox.Text = container.Log; foreach (DATFileEntry entry in container.Entries.Values) { entry.Note = notes.GetNote(entry.Filename); var item = new ListViewItem(new string[] { entry.Filename, entry.TypeName, entry.Note }); item.Tag = entry; item.UseItemStyleForSubItems = false; item.SubItems[1].BackColor = entry.TypeColor; datFileEntriesListView.Items.Add(item); } return(true); }
public MeleeDataNode(string fname) { fileName = fname; DatFile = Decompiler.Decompile(File.ReadAllBytes(fname)); if (Path.GetFileNameWithoutExtension(fname).StartsWith("Pl") && File.Exists(fname.Substring(0, fname.Length - 6) + ".dat")) { DialogResult dialogResult = MessageBox.Show("Mark LOD Models?\nUseful for easier importing", "Import LOD Information", MessageBoxButtons.YesNo); if (dialogResult != DialogResult.Yes) { return; } // Read it FileData d = new FileData(fname.Substring(0, fname.Length - 6) + ".dat"); d.endian = Endianness.Big; d.Seek(0x24); d.Seek(d.ReadInt() + 0x20); int off; while ((off = d.ReadInt()) != 0) { int temp = d.Pos(); d.Seek(off + 0x20); int Count = d.ReadInt(); int Offset = d.ReadInt() + 0x20; for (int i = 0; i < Count; i++) { d.Seek(Offset + i * 8); int c = d.ReadInt(); int o = d.ReadInt() + 0x20; LodModels.AddRange(d.GetSection(o, c)); } d.Seek(temp); break; } } ImageKey = "dat"; SelectedImageKey = "dat"; ContextMenu = new ContextMenu(); MenuItem Save = new MenuItem(); MenuItem Export = new MenuItem("Save As"); Export.Click += SaveAs; ContextMenu.MenuItems.Add(Export); MenuItem Recompile = new MenuItem("Update Vertices"); Recompile.Click += RecompileVertices; ContextMenu.MenuItems.Add(Recompile); /*if(LodModels.Count > 0) * { * MenuItem Import = new MenuItem("Import High Poly From File"); * Import.Click += SaveAs; * ContextMenu.MenuItems.Add(Import); * }*/ }
public DATFile GetAsDATFile() { DATFile d = new DATFile(); DATRoot root = new DATRoot(); root.Text = Text; root.Animations.Add(DatAnimation); d.AddRoot(root); return(d); }
/// <summary> /// Prints current source DAT files /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnEnumDatFiles_Click(object sender, RoutedEventArgs e) { var dats = DATFile.GetDatFiles(); Console.WriteLine("Retrieving local DAT file archives - Count: " + dats.Count()); Console.WriteLine("Enumerating....."); foreach (var dat in dats) { Console.WriteLine(Path.GetFileName(dat)); } Console.WriteLine("------------Done------------"); }
private void LoadFile(string filename) { this.filename = Path.GetFullPath(filename); byte[] file = File.ReadAllBytes(filename); Text = "SADXsndSharp - Loading file, please wait..."; this.Enabled = false; archive = new DATFile(file); RefreshListView(mainView); Text = "SADXsndSharp - " + Path.GetFileName(filename); this.Enabled = true; saveToolStripMenuItem.Enabled = true; unsaved = false; }
private void Form1_Load(object sender, EventArgs e) { this.FormClosing += Form1_FormClosing; string[] args = Environment.GetCommandLineArgs(); if (args.Length == 1) { archive = new DATFile(); } else { LoadFile(args[1]); } }
public void Convert(DATFile datFile, TSCFile tscFile, TOCFile tocFile) { this.datFile = datFile; tscFile.ICAO = datFile.AirportHeader.ICAOCode; tscFile.AirportLongName = datFile.AirportHeader.Name; tscFile.AirportShortName = datFile.AirportHeader.Name; if (datFile.LandRunways != null) { foreach (var landRunway in datFile.LandRunways) { TSCRunway runway = new TSCRunway(); runway.Width = landRunway.Width; runway.End1 = new TSCRunwayEnd(); runway.End2 = new TSCRunwayEnd(); ConvertRunwayEnd(runway.End1, landRunway.End1); ConvertRunwayEnd(runway.End2, landRunway.End2); tscFile.Runways.Add(runway); } } tscFile.Location = this.CalculateAirportCenterPoint(); var airportNameClean = tscFile.AirportShortName.Replace(" ", "_").ToLower(); // Add the runway object TSCSceneryObject runwayObject = new TSCSceneryObject(); runwayObject.GeometryFile = String.Format("{0}_{1}_rwy", tscFile.ICAO.ToLower(), airportNameClean); runwayObject.Position = new GeoCoordinate3d(tscFile.Location); runwayObject.Type = "ground"; // Add the decals object TSCSceneryObject decalObject = new TSCSceneryObject(); decalObject.GeometryFile = String.Format("{0}_{1}_decal", tscFile.ICAO.ToLower(), airportNameClean); decalObject.Position = new GeoCoordinate3d(tscFile.Location); decalObject.Type = "decal"; tscFile.Objects.Add(runwayObject); tscFile.Objects.Add(decalObject); }
public void LoadPlayerAJ(string fname) { DialogResult dialogResult = MessageBox.Show("Import Animations?", "Animation Import", MessageBoxButtons.YesNo); if (dialogResult != DialogResult.Yes) { return; } FileData d = new FileData(fname); //Extract All Animations from the AJ file DATRoot r = new DATRoot(); r.Text = Path.GetFileNameWithoutExtension(fname); DatFile.AddRoot(r); FileData f = new FileData(fname); while (f.Pos() < f.Eof()) { int size = f.ReadInt(); byte[] data = f.GetSection(f.Pos() - 4, size); f.Skip(size - 4); f.Align(0x20); DATFile datfile = Decompiler.Decompile(data); datfile.Roots[0].Animations[0].Text = datfile.Roots[0].Text; r.Animations.Add(datfile.Roots[0].Animations[0]); } /*foreach (DATRoot root in DatFile.Roots) * { * if(root.FighterData.Count > 0) * foreach (DatFighterScript script in root.FighterData[0].Scripts) * { * if(script.AnimationOffset != 0) * { * DATFile datfile = Decompiler.Decompile(d.getSection(script.AnimationOffset, script.AnimationSize)); * datfile.Roots[0].Animations[0].Text = script.Text; * r.Animations.Add(datfile.Roots[0].Animations[0]); * } * } * }*/ }
private void newToolStripMenuItem_Click(object sender, EventArgs e) { if (unsaved) { DialogResult result = ShowSaveChangesDialog(); if (result == DialogResult.Yes) { SaveFile(); } else if (result == DialogResult.Cancel) { return; } } filename = null; Text = "SADXsndSharp"; archive = new DATFile(); RefreshListView(mainView); saveToolStripMenuItem.Enabled = false; unsaved = false; }
/// <summary> /// Scans the DAT archives returning the different system names /// then imports them to the database /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnImportSystems_Click(object sender, RoutedEventArgs e) { var dats = DATFile.GetDatFiles(); Console.WriteLine("Retrieving local DAT file archives - Count: " + dats.Count()); Console.WriteLine("Enumerating....."); List <string> sysNames = new List <string>(); foreach (var dat in dats) { string dName = Path.GetFileNameWithoutExtension(dat); sysNames.Add(dName); Console.WriteLine(dName); } Console.WriteLine("Adding/updating systems in the database..."); Database.DBFunctions.AddUpdateSystems(sysNames); Console.WriteLine("...Done"); Console.WriteLine("------------Done------------"); }
public override void GenerateScripts(string icao, DATFile datFile, DSFFile dsfFile, TSCFile tscFile, string outputFolder, string texturesFolder) { throw new NotImplementedException(); }
/// <summary> /// Main function for automatic archive building from a folder. /// </summary> static void BuildFromFolder(string[] args) { bool createPB = false; bool createARCX = false; filePath = args[0]; compressPRS = false; for (int a = 0; a < args.Length; a++) { if (args[a] == "-prs") { compressPRS = true; } if (args[a] == "-pb") { createPB = true; } if (args[a] == "-arcx") { createARCX = true; } } // Folder mode if (Directory.Exists(filePath)) { GenericArchive arc; string indexfilename = Path.Combine(filePath, "index.txt"); if (createARCX) { CreateARCX(filePath); return; } if (!File.Exists(indexfilename)) { BuildPAK(filePath); return; } List <string> filenames = new List <string>(File.ReadAllLines(indexfilename).Where(a => !string.IsNullOrEmpty(a))); string ext = Path.GetExtension(filenames[0]).ToLowerInvariant(); if (filenames[0].Contains(",")) { string[] checkf = filenames[0].Split(','); ext = Path.GetExtension(checkf[0].ToLowerInvariant()); } switch (ext) { case ".pvr": if (createPB) { folderMode = ArchiveFromFolderMode.PB; arc = new PBFile(); } else { folderMode = ArchiveFromFolderMode.PVM; arc = new PuyoFile(); } break; case ".gvr": arc = new PuyoFile(true); folderMode = ArchiveFromFolderMode.GVM; break; case ".xvr": arc = new XVM(); folderMode = ArchiveFromFolderMode.XVM; break; case ".wav": case ".adx": folderMode = ArchiveFromFolderMode.DAT; arc = new DATFile(); break; case ".mpb": case ".mdb": case ".msb": case ".osb": case ".fpb": case ".fob": case ".fpw": case ".psr": folderMode = ArchiveFromFolderMode.MLT; arc = new MLTFile(); break; case ".gcaxmpb": case ".gcaxmsb": folderMode = ArchiveFromFolderMode.gcaxMLT; arc = new gcaxMLTFile(); break; case ".png": case ".jpg": case ".bmp": case ".dds": case ".gif": default: folderMode = ArchiveFromFolderMode.PVMX; arc = new PVMXFile(); break; } Console.WriteLine("Creating {0} archive from folder: {1}", folderMode.ToString(), filePath); int id = 0; foreach (string line in filenames) { string[] split = line.Split(','); string filename = split[0]; switch (folderMode) { case ArchiveFromFolderMode.gcaxMLT: int bIDgc = int.Parse(split[1]); arc.Entries.Add(new gcaxMLTEntry(Path.Combine(filePath, filename), bIDgc)); extension = ".mlt"; break; case ArchiveFromFolderMode.MLT: int bID = int.Parse(split[1]); int mem = int.Parse(split[2], System.Globalization.NumberStyles.HexNumber); int sz = int.Parse(split[3]); int version = 1; int revision = 1; string versionfilename = Path.Combine(filePath, "version.txt"); if (File.Exists(versionfilename)) { string[] ver = File.ReadAllLines(versionfilename); version = int.Parse(ver[0]); revision = int.Parse(ver[1]); MLTFile mlt = (MLTFile)arc; mlt.Version = (byte)version; mlt.Revision = (byte)revision; } arc.Entries.Add(new MLTEntry(Path.Combine(filePath, filename), bID, mem, sz)); extension = ".mlt"; break; case ArchiveFromFolderMode.DAT: arc.Entries.Add(new DATEntry(Path.Combine(filePath, filename))); extension = ".dat"; break; case ArchiveFromFolderMode.PVM: arc.Entries.Add(new PVMEntry(Path.Combine(filePath, filename))); extension = ".pvm"; break; case ArchiveFromFolderMode.GVM: arc.Entries.Add(new GVMEntry(Path.Combine(filePath, filename))); extension = ".gvm"; break; case ArchiveFromFolderMode.PB: PBFile pbf = (PBFile)arc; arc.Entries.Add(new PBEntry(Path.Combine(filePath, filename), pbf.GetCurrentOffset(id, filenames.Count))); extension = ".pb"; break; case ArchiveFromFolderMode.PVMX: extension = ".pvmx"; filename = split[1]; int width = 0; int height = 0; uint gbix = uint.Parse(split[0]); if (split.Length > 2) { width = int.Parse(split[2].Split('x')[0]); height = int.Parse(split[2].Split('x')[1]); } arc.Entries.Add(new PVMXEntry(Path.GetFileName(filename), gbix, File.ReadAllBytes(Path.Combine(filePath, filename)), width, height)); break; case ArchiveFromFolderMode.XVM: arc.Entries.Add(new XVMEntry(Path.Combine(filePath, filename))); extension = ".xvm"; break; default: extension = ".bin"; break; } Console.WriteLine("Added entry {0}: {1}", id.ToString(), filename); id++; } byte[] data = arc.GetBytes(); outputPath = Path.GetFullPath(filePath) + extension; if (compressPRS) { Console.WriteLine("Compressing to PRS..."); data = FraGag.Compression.Prs.Compress(data); outputPath = Path.ChangeExtension(outputPath, ".PRS"); } Console.WriteLine("Output file: {0}", outputPath); File.WriteAllBytes(outputPath, data); } }
/// <summary> /// Processes DAT files from disk (already extracted) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void btnProcessDATsNoArchive_Click(object sender, RoutedEventArgs e) { var dats = DATFile.GetDatFolders(); List <string> DATErrors = new List <string>(); Console.WriteLine("Retrieving local DAT folders - Count: " + dats.Count()); int counter = 0; // setup output directory string baseDir = AppDomain.CurrentDomain.BaseDirectory; string exportedDir = "C:\\skeletonKey\\ExportedDats\\"; string baseExportedDir = "rj\\scrapeart\\"; string rootPath = exportedDir + baseExportedDir; Directory.CreateDirectory(rootPath); foreach (var dat in dats)//.Where(a => a.ToLower().Contains("lynx"))) { // create dir for DAT string datName = new DirectoryInfo(dat).Name; string datExportDir = rootPath + datName; Directory.CreateDirectory(datExportDir); counter++; Console.WriteLine("Processing " + datName + " (" + counter + " of " + dats.Count() + ")"); //Archive arch = new Archive(); Console.WriteLine("(Exporting to " + datExportDir + ")"); await Task.Run(() => { var results = Directory.GetFiles(dat).Where(a => Path.GetExtension(a).ToLower() == ".xml"); var rCount = results.Count(); var percentage = rCount / 50; int cnt = 0; int cnter = 0; // process each archived file foreach (var file in results) { string finalXml = string.Empty; var str = File.ReadAllText(file); string fix = XML.FixXml(str, this); if (fix == null) { // there was an error parsing this file StringBuilder sb = new StringBuilder(); sb.Append("SKIPPED: "); sb.Append(datName); sb.Append(@"\"); sb.Append(Path.GetFileName(file)); DATErrors.Add(sb.ToString()); } finalXml = fix; /* * using (Stream archiveStream = File.OpenRead(dat)) * { * byte[] fData = Archive.ExtractFileToByteArray(archiveStream, file.InternalPath); * var str = Encoding.ASCII.GetString(fData); * string fix = XML.FixXml(str, this); * finalXml = fix; * } */ cnt++; // write file to disk File.WriteAllText(datExportDir + "\\" + Path.GetFileName(file), finalXml); // percentage complete int currPos = Convert.ToInt32((double)(((double)cnt / (double)rCount) * 100)); if (currPos > cnter) { Console.Write("."); cnter = currPos; } } Console.Write("\n"); }); } Console.WriteLine("----------------"); Console.WriteLine("ERRORs Detected: " + DATErrors.Count()); Console.WriteLine("ERROR Listings:"); Console.WriteLine(); foreach (var error in DATErrors) { Console.WriteLine(error); } Console.WriteLine("------------Done------------"); }
/// <summary> /// Processes DAT files from disk (from archives) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void btnProcessDATs_Click(object sender, RoutedEventArgs e) { var dats = DATFile.GetDatFiles(); Console.WriteLine("Retrieving local DAT file archives - Count: " + dats.Count()); int counter = 0; // setup output directory string baseDir = AppDomain.CurrentDomain.BaseDirectory; string exportedDir = "C:\\skeletonKey\\ExportedDats\\"; string baseExportedDir = "rj\\scrapeart\\"; string rootPath = exportedDir + baseExportedDir; Directory.CreateDirectory(rootPath); foreach (var dat in dats)//.Where(a => a.ToLower().Contains("lynx"))) { // create dir for DAT string datExportDir = rootPath + Path.GetFileNameWithoutExtension(dat); Directory.CreateDirectory(datExportDir); counter++; Console.WriteLine("Processing " + System.IO.Path.GetFileName(dat) + " (" + counter + " of " + dats.Count() + ")"); Archive arch = new Archive(); Console.WriteLine("(Exporting to " + datExportDir + ")"); await Task.Run(() => { var results = arch.ProcessArchive(dat); var rCount = results.Results.Count(); var percentage = rCount / 50; int cnt = 0; int cnter = 0; // process each archived file foreach (var file in results.Results) { string finalXml = string.Empty; using (Stream archiveStream = File.OpenRead(dat)) { byte[] fData = Archive.ExtractFileToByteArray(archiveStream, file.InternalPath); var str = Encoding.ASCII.GetString(fData); string fix = XML.FixXml(str, this); finalXml = fix; } cnt++; // write file to disk File.WriteAllText(datExportDir + "\\" + file.FileName, finalXml); // percentage complete int currPos = Convert.ToInt32((double)(((double)cnt / (double)rCount) * 100)); if (currPos > cnter) { Console.Write("."); cnter = currPos; } } Console.Write("\n"); foreach (var res in results.Results) { //Console.WriteLine(res.InternalPath); } }); } Console.WriteLine("------------Done------------"); }
static void Main(string[] args) { ArchiveFromFolderMode folderMode; string dir; string filePath; string directoryName; ArchiveBase pvmArchive; ArchiveWriter pvmWriter; string archiveName; string path; byte[] filedata; bool isPRS; bool isBIN = false; string extension; // Usage if (args.Length == 0) { Console.WriteLine("ArchiveTool is a command line tool to extract and create PVM, GVM, PRS, DAT and PB archives.\nIt can also decompress SADX Gamecube 'SaCompGC' REL files.\n"); Console.WriteLine("Usage:\n"); Console.WriteLine("Extracting a PVM/GVM/PRS/PB/PVMX/DAT/REL file:\nArchiveTool <archivefile>\nIf the archive is PRS compressed, it will be decompressed first.\nIf the archive contains textures/sounds, the program will extract them and create a list of files named 'index.txt'.\n"); Console.WriteLine("Extracting an NjUtil archive: ArchiveTool -nju <archivefile>\n"); Console.WriteLine("Converting PVM/GVM to a folder texture pack: ArchiveTool -png <archivefile>\n"); Console.WriteLine("Creating a PB archive from a folder with textures: ArchiveTool -pb <foldername>"); Console.WriteLine("Creating a PVM/GVM/DAT/PVMX from a folder with textures/sounds: ArchiveTool <foldername> [-prs]\nThe program will create an archive from files listed in 'index.txt' in the folder.\nThe -prs option will make the program output a PRS compressed archive.\n"); Console.WriteLine("Creating a PVM from PNG textures: ArchiveTool -pvm <folder> [-prs]\nThe texture list 'index.txt' must contain global indices listed before each texture filename for this option to work.\n"); Console.WriteLine("Converting GVM to PVM (lossy): ArchiveTool -gvm2pvm <file.gvm> [-prs]\n"); Console.WriteLine("Creating a PRS compressed binary: ArchiveTool <file.bin>\nFile extension must be .BIN for this option to work.\n"); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); return; } switch (args[0].ToLowerInvariant()) { // GVM2PVM mode case "-gvm2pvm": filePath = args[1]; isPRS = false; if (args.Length > 2 && args[2] == "-prs") { isPRS = true; } Console.WriteLine("Converting GVM to PVM: {0}", filePath); directoryName = Path.GetDirectoryName(filePath); extension = Path.GetExtension(filePath).ToLowerInvariant(); if (!File.Exists(filePath)) { Console.WriteLine("Supplied GVM archive does not exist!"); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); return; } if (extension != ".gvm") { Console.WriteLine("GVM2PVM mode can only be used with GVM files."); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); return; } path = Path.Combine(directoryName, Path.GetFileNameWithoutExtension(filePath)); Directory.CreateDirectory(path); filedata = File.ReadAllBytes(filePath); using (TextWriter texList = File.CreateText(Path.Combine(path, Path.GetFileName(path) + ".txt"))) { try { ArchiveBase gvmfile = null; byte[] gvmdata = File.ReadAllBytes(filePath); gvmfile = new GvmArchive(); ArchiveReader gvmReader = gvmfile.Open(gvmdata); Stream pvmStream = File.Open(Path.ChangeExtension(filePath, ".pvm"), FileMode.Create); pvmArchive = new PvmArchive(); pvmWriter = pvmArchive.Create(pvmStream); foreach (ArchiveEntry file in gvmReader.Entries) { if (!File.Exists(Path.Combine(path, file.Name))) { gvmReader.ExtractToFile(file, Path.Combine(path, file.Name)); } Stream data = File.Open(Path.Combine(path, file.Name), FileMode.Open); VrTexture vrfile = new GvrTexture(data); Bitmap tempTexture = vrfile.ToBitmap(); System.Drawing.Imaging.BitmapData bmpd = tempTexture.LockBits(new Rectangle(Point.Empty, tempTexture.Size), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); int stride = bmpd.Stride; byte[] bits = new byte[Math.Abs(stride) * bmpd.Height]; System.Runtime.InteropServices.Marshal.Copy(bmpd.Scan0, bits, 0, bits.Length); tempTexture.UnlockBits(bmpd); int tlevels = 0; archiveName = Path.GetFileNameWithoutExtension(filePath); for (int y = 0; y < tempTexture.Height; y++) { int srcaddr = y * Math.Abs(stride); for (int x = 0; x < tempTexture.Width; x++) { Color c = Color.FromArgb(BitConverter.ToInt32(bits, srcaddr + (x * 4))); if (c.A == 0) { tlevels = 1; } else if (c.A < 255) { tlevels = 2; break; } } if (tlevels == 2) { break; } } PvrPixelFormat ppf = PvrPixelFormat.Rgb565; if (tlevels == 1) { ppf = PvrPixelFormat.Argb1555; } else if (tlevels == 2) { ppf = PvrPixelFormat.Argb4444; } PvrDataFormat pdf; if (!vrfile.HasMipmaps) { if (tempTexture.Width == tempTexture.Height) { pdf = PvrDataFormat.SquareTwiddled; } else { pdf = PvrDataFormat.Rectangle; } } else { if (tempTexture.Width == tempTexture.Height) { pdf = PvrDataFormat.SquareTwiddledMipmaps; } else { pdf = PvrDataFormat.RectangleTwiddled; } } PvrTextureEncoder encoder = new PvrTextureEncoder(tempTexture, ppf, pdf); encoder.GlobalIndex = vrfile.GlobalIndex; string pvrPath = Path.ChangeExtension(Path.Combine(path, file.Name), ".pvr"); if (!File.Exists(pvrPath)) { encoder.Save(pvrPath); } data.Close(); File.Delete(Path.Combine(path, file.Name)); pvmWriter.CreateEntryFromFile(pvrPath); texList.WriteLine(Path.GetFileName(pvrPath)); Console.WriteLine("Adding texture {0}", pvrPath); } pvmWriter.Flush(); pvmStream.Flush(); pvmStream.Close(); if (isPRS) { Console.WriteLine("Compressing to PRS..."); byte[] pvmdata = File.ReadAllBytes(Path.ChangeExtension(filePath, ".pvm")); pvmdata = FraGag.Compression.Prs.Compress(pvmdata); File.WriteAllBytes(Path.ChangeExtension(filePath, ".PVM.PRS"), pvmdata); File.Delete(Path.ChangeExtension(filePath, ".PVM")); } Console.WriteLine("Archive converted!"); } catch (Exception ex) { Console.WriteLine("Exception thrown: {0}", ex.ToString()); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); return; } } break; // CompilePVM mode case "-pvm": bool IsPRS = false; if (args[args.Length - 1] == "-prs") { IsPRS = true; } filePath = args[1]; string FullLine; string texturename; uint GBIX = 0; List <string> textureNames = new List <String>(); List <PvrTexture> finalTextureList = new List <PvrTexture>(); directoryName = Path.GetDirectoryName(filePath); archiveName = Path.GetFileNameWithoutExtension(filePath); if (Directory.Exists(filePath)) { Console.WriteLine("Converting texture pack to PVM: {0}", filePath); StreamReader texlistStream = File.OpenText(Path.Combine(filePath, "index.txt")); while (!texlistStream.EndOfStream) { textureNames.Add(texlistStream.ReadLine()); } pvmArchive = new PvmArchive(); Stream pvmStream = File.Open(Path.ChangeExtension(filePath, ".pvm"), FileMode.Create); pvmWriter = (PvmArchiveWriter)pvmArchive.Create(pvmStream); // Reading in textures for (uint imgIndx = 0; imgIndx < textureNames.Count; imgIndx++) { FullLine = textureNames[(int)imgIndx]; if (string.IsNullOrEmpty(FullLine)) { continue; } String[] substrings = FullLine.Split(','); GBIX = UInt32.Parse(substrings[0]); texturename = substrings[1]; Bitmap tempTexture = new Bitmap(8, 8); string texturePath = Path.Combine(filePath, Path.ChangeExtension(texturename, ".png")); if (File.Exists(texturePath)) { Console.WriteLine("Adding texture: " + (texturePath)); tempTexture = (Bitmap)Bitmap.FromFile(texturePath); tempTexture = tempTexture.Clone(new Rectangle(Point.Empty, tempTexture.Size), System.Drawing.Imaging.PixelFormat.Format32bppArgb); } else { Console.WriteLine(String.Concat("Texture ", textureNames[(int)imgIndx], " not found. Generating a placeholder. Check your files.")); } System.Drawing.Imaging.BitmapData bmpd = tempTexture.LockBits(new Rectangle(Point.Empty, tempTexture.Size), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); int stride = bmpd.Stride; byte[] bits = new byte[Math.Abs(stride) * bmpd.Height]; System.Runtime.InteropServices.Marshal.Copy(bmpd.Scan0, bits, 0, bits.Length); tempTexture.UnlockBits(bmpd); int tlevels = 0; for (int y = 0; y < tempTexture.Height; y++) { int srcaddr = y * Math.Abs(stride); for (int x = 0; x < tempTexture.Width; x++) { Color c = Color.FromArgb(BitConverter.ToInt32(bits, srcaddr + (x * 4))); if (c.A == 0) { tlevels = 1; } else if (c.A < 255) { tlevels = 2; break; } } if (tlevels == 2) { break; } } PvrPixelFormat ppf = PvrPixelFormat.Rgb565; if (tlevels == 1) { ppf = PvrPixelFormat.Argb1555; } else if (tlevels == 2) { ppf = PvrPixelFormat.Argb4444; } PvrDataFormat pdf = PvrDataFormat.Rectangle; if (tempTexture.Width == tempTexture.Height) { pdf = PvrDataFormat.SquareTwiddled; } PvrTextureEncoder encoder = new PvrTextureEncoder(tempTexture, ppf, pdf); encoder.GlobalIndex = GBIX; string pvrPath = Path.ChangeExtension(texturePath, ".pvr"); encoder.Save(pvrPath); pvmWriter.CreateEntryFromFile(pvrPath); } pvmWriter.Flush(); pvmStream.Close(); if (IsPRS) { Console.WriteLine("Compressing to PRS..."); byte[] pvmdata = File.ReadAllBytes(Path.ChangeExtension(filePath, ".pvm")); pvmdata = FraGag.Compression.Prs.Compress(pvmdata); File.WriteAllBytes(Path.ChangeExtension(filePath, ".prs"), pvmdata); File.Delete(Path.ChangeExtension(filePath, ".pvm")); } Console.WriteLine("Archive was compiled successfully!"); } else { Console.WriteLine("Supplied texture list does not exist!"); Console.WriteLine("Press ENTER to continue..."); Console.ReadLine(); return; } break; // Create PB mode case "-pb": filePath = args[1]; Console.WriteLine("Building PB from folder: {0}", filePath); if (Directory.Exists(filePath)) { string indexfilename = Path.Combine(filePath, "index.txt"); if (!File.Exists(indexfilename)) { Console.WriteLine("Supplied path does not have an index file."); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); return; } List <string> filenames = new List <string>(File.ReadAllLines(indexfilename).Where(a => !string.IsNullOrEmpty(a))); PBFile pba = new PBFile(filenames.Count); int l = 0; foreach (string tex in filenames) { byte[] texbytes = File.ReadAllBytes(Path.Combine(filePath, tex)); pba.AddPVR(texbytes, l); l++; } path = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(filePath)), Path.GetFileNameWithoutExtension(filePath)); string filename_full = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(filePath)), Path.GetFileName(filePath) + ".pb"); Console.WriteLine("Output file: {0}", filename_full); File.WriteAllBytes(filename_full, pba.GetBytes()); } else { Console.WriteLine("Supplied path does not exist."); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); return; } break; // Extract NjArchive mode case "-nju": filePath = args[1]; filedata = File.ReadAllBytes(filePath); if (Path.GetExtension(filePath).Equals(".prs", StringComparison.OrdinalIgnoreCase)) { filedata = FraGag.Compression.Prs.Decompress(filedata); } NjArchive njarc = new NjArchive(filedata); Console.WriteLine("Extracting Ninja archive: {0}", filePath); dir = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath)); Console.WriteLine("Output folder: {0}", dir); Directory.CreateDirectory(dir); for (int i = 0; i < njarc.Entries.Count; i++) { byte[] data = njarc.Entries[i]; extension = ".bin"; string desc = "Unknown"; switch (System.Text.Encoding.ASCII.GetString(data, 0, 4)) { case "NJIN": desc = "Ninja Information"; extension = ".nji"; break; case "NJCM": desc = "Ninja Chunk model"; extension = ".nj"; break; case "GJCM": desc = "Ninja Chunk model (GC)"; extension = ".gj"; break; case "NJBM": desc = "Ninja Basic model"; extension = ".nj"; break; case "NMDM": desc = "Ninja Motion"; extension = ".njm"; break; case "NJLI": desc = "Ninja Light"; extension = ".njl"; break; case "NLIM": desc = "Ninja Light Motion"; extension = ".njlm"; break; case "NSSM": desc = "Ninja Simple Shape Motion"; extension = ".njsm"; break; case "NCAM": desc = "Ninja Camera Motion"; extension = ".ncm"; break; case "NJTL": desc = "Ninja Texlist"; extension = ".nj"; break; case "GJTL": desc = "Ninja Texlist (GC)"; extension = ".gj"; break; case "PVMH": desc = "PVM"; extension = ".pvm"; break; case "GVMH": desc = "GVM"; extension = ".gvm"; break; } Console.WriteLine("Entry {0} is {1}", i, desc); string outpath = Path.Combine(dir, i.ToString("D3") + extension); File.WriteAllBytes(outpath, njarc.Entries[i]); } break; // PVM2TexPack mode case "-png": Queue <string> files = new Queue <string>(); for (int u = 1; u < args.Length; u++) { files.Enqueue(args[u]); } if (files.Count == 0) { Console.Write("File: "); files.Enqueue(Console.ReadLine()); } while (files.Count > 0) { string filename = files.Dequeue(); path = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(filename)), Path.GetFileNameWithoutExtension(filename)); string filename_full = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(filename)), Path.GetFileName(filename)); Console.WriteLine("Converting file to texture pack: {0}", filename_full); Directory.CreateDirectory(path); filedata = File.ReadAllBytes(filename_full); using (TextWriter texList = File.CreateText(Path.Combine(path, "index.txt"))) { try { if (PvrTexture.Is(filedata)) { if (!AddTexture(false, path, Path.GetFileName(filename_full), new MemoryStream(filedata), texList)) { texList.Close(); Directory.Delete(path, true); } continue; } else if (GvrTexture.Is(filedata)) { if (!AddTexture(true, path, Path.GetFileName(filename_full), new MemoryStream(filedata), texList)) { texList.Close(); Directory.Delete(path, true); } continue; } bool gvm = false; ArchiveBase pvmfile = null; byte[] pvmdata = File.ReadAllBytes(filename_full); if (Path.GetExtension(filename_full).Equals(".prs", StringComparison.OrdinalIgnoreCase)) { pvmdata = FraGag.Compression.Prs.Decompress(pvmdata); } pvmfile = new PvmArchive(); MemoryStream stream = new MemoryStream(pvmdata); if (!PvmArchive.Identify(stream)) { pvmfile = new GvmArchive(); gvm = true; } ArchiveEntryCollection pvmentries = pvmfile.Open(pvmdata).Entries; bool fail = false; foreach (ArchiveEntry file in pvmentries) { if (!AddTexture(gvm, path, file.Name, file.Open(), texList)) { texList.Close(); Directory.Delete(path, true); fail = true; break; } } if (fail) { continue; } } catch (Exception ex) { Console.WriteLine("Exception thrown: " + ex.ToString() + "\nCanceling conversion."); return; } Console.WriteLine("Conversion complete!"); } } break; // Other modes default: filePath = args[0]; IsPRS = false; if (args.Length > 1 && args[1] == "-prs") { IsPRS = true; } extension = Path.GetExtension(filePath).ToLowerInvariant(); //Folder mode if (Directory.Exists(filePath)) { string indexfilename = Path.Combine(filePath, "index.txt"); List <string> filenames = new List <string>(File.ReadAllLines(indexfilename).Where(a => !string.IsNullOrEmpty(a))); string ext = Path.GetExtension(filenames[0]).ToLowerInvariant(); pvmArchive = new PvmArchive(); switch (ext) { case ".pvr": folderMode = ArchiveFromFolderMode.PVM; break; case ".gvr": pvmArchive = new GvmArchive(); folderMode = ArchiveFromFolderMode.GVM; break; case ".wav": folderMode = ArchiveFromFolderMode.DAT; break; case ".png": case ".jpg": case ".bmp": case ".dds": case ".gif": default: folderMode = ArchiveFromFolderMode.PVMX; break; } Console.WriteLine("Creating {0} archive from folder: {1}", folderMode.ToString(), filePath); switch (folderMode) { case ArchiveFromFolderMode.DAT: // Load index DATFile dat = new DATFile(); TextReader tr = File.OpenText(Path.Combine(filePath, "index.txt")); string line = tr.ReadLine(); while (line != null) { Console.WriteLine("Adding file {0}", Path.Combine(filePath, line)); dat.AddFile(Path.Combine(filePath, line)); line = tr.ReadLine(); } tr.Close(); // Save DAT archive File.WriteAllBytes(filePath + ".DAT", dat.GetBytes()); if (IsPRS) { Console.WriteLine("Compressing to PRS..."); byte[] datdata = File.ReadAllBytes(filePath + ".DAT"); datdata = FraGag.Compression.Prs.Compress(datdata); File.WriteAllBytes(filePath + ".PRS", datdata); File.Delete(filePath + ".DAT"); } Console.WriteLine("Archive compiled successfully!"); return; case ArchiveFromFolderMode.PVM: case ArchiveFromFolderMode.GVM: if (filenames.Any(a => !Path.GetExtension(a).Equals(ext, StringComparison.OrdinalIgnoreCase))) { Console.WriteLine("Cannot create archive from mixed file types."); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); return; } ext = folderMode == ArchiveFromFolderMode.PVM ? ".pvm" : ".gvm"; using (Stream pvmStream = File.Open(Path.ChangeExtension(filePath, ext), FileMode.Create)) { pvmWriter = pvmArchive.Create(pvmStream); // Reading in textures foreach (string tex in filenames) { if (folderMode == ArchiveFromFolderMode.PVM) { pvmWriter.CreateEntryFromFile(Path.Combine(filePath, Path.ChangeExtension(tex, ".pvr"))); } else { pvmWriter.CreateEntryFromFile(Path.Combine(filePath, Path.ChangeExtension(tex, ".gvr"))); } Console.WriteLine("Adding file: {0}", tex); } pvmWriter.Flush(); } if (IsPRS) { Console.WriteLine("Compressing to PRS..."); byte[] pvmdata = File.ReadAllBytes(Path.ChangeExtension(filePath, ext)); pvmdata = FraGag.Compression.Prs.Compress(pvmdata); File.WriteAllBytes(Path.ChangeExtension(filePath, ".prs"), pvmdata); File.Delete(Path.ChangeExtension(filePath, ext)); } Console.WriteLine("Archive was compiled successfully!"); return; case ArchiveFromFolderMode.PVMX: // Load index PVMXFile pvmx = new PVMXFile(); TextReader trp = File.OpenText(Path.Combine(filePath, "index.txt")); foreach (string str in filenames) { string[] split = str.Split(','); string texfile = Path.Combine(Path.GetFullPath(filePath), split[1]); Console.WriteLine("Adding file {0}", texfile); if (split.Length > 2) { string[] dimensions = split[2].Split('x'); pvmx.AddFile(split[1], uint.Parse(split[0]), File.ReadAllBytes(texfile), int.Parse(dimensions[0]), int.Parse(dimensions[1])); } else { pvmx.AddFile(split[1], uint.Parse(split[0]), File.ReadAllBytes(texfile)); } } Console.WriteLine("Output file: {0}", Path.ChangeExtension(filePath, ".pvmx")); File.WriteAllBytes(Path.ChangeExtension(filePath, ".pvmx"), pvmx.GetBytes()); Console.WriteLine("Archive was compiled successfully!"); return; } } //Continue with file mode otherwise if (!File.Exists(filePath)) { Console.WriteLine("Supplied archive/texture list does not exist!"); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); return; } switch (extension) { case ".rel": Console.WriteLine("Decompressing REL file: {0}", filePath); byte[] input = File.ReadAllBytes(args[0]); byte[] output = SA_Tools.HelperFunctions.DecompressREL(input); File.WriteAllBytes(Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + "_dec.rel"), output); return; case ".dat": Console.WriteLine("Extracting DAT file: {0}", filePath); DATFile dat = new DATFile(File.ReadAllBytes(filePath)); dir = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath)); if (Directory.Exists(dir)) { Directory.Delete(dir, true); } Directory.CreateDirectory(dir); using (StreamWriter sw = File.CreateText(Path.Combine(dir, "index.txt"))) { dat.Entries.Sort((f1, f2) => StringComparer.OrdinalIgnoreCase.Compare(f1.name, f2.name)); for (int i = 0; i < dat.GetCount(); i++) { string fname = dat.Entries[i].name; sw.WriteLine(fname); if (dat.Steam) { fname = Path.GetFileNameWithoutExtension(fname) + ".adx"; } Console.WriteLine("Extracting file: {0}", fname); File.WriteAllBytes(Path.Combine(dir, fname), dat.GetFile(i)); } sw.Flush(); sw.Close(); } Console.WriteLine("Archive extracted!"); break; case ".pvmx": Console.WriteLine("Extracting PVMX file: {0}", filePath); byte[] pvmxdata = File.ReadAllBytes(filePath); dir = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath)); Directory.CreateDirectory(dir); PVMXFile pvmx = new PVMXFile(pvmxdata); using (TextWriter texList = File.CreateText(Path.Combine(dir, "index.txt"))) { for (int u = 0; u < pvmx.GetCount(); u++) { byte[] tdata = pvmx.GetFile(u); string outpath = Path.Combine(dir, pvmx.GetName(u)); File.WriteAllBytes(outpath, tdata); string entry; string dimensions = string.Join("x", pvmx.GetWidth(u).ToString(), pvmx.GetHeight(u).ToString()); if (pvmx.HasDimensions(u)) { entry = string.Join(",", pvmx.GetGBIX(u).ToString(), pvmx.GetName(u), dimensions); } else { entry = string.Join(",", pvmx.GetGBIX(u).ToString(), pvmx.GetName(u)); } texList.WriteLine(entry); } texList.Flush(); texList.Close(); } Console.WriteLine("Archive extracted!"); break; case ".pb": Console.WriteLine("Extracting PB file: {0}", filePath); byte[] pbdata = File.ReadAllBytes(filePath); dir = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath)); Directory.CreateDirectory(dir); PBFile pba = new PBFile(pbdata); using (TextWriter texList = File.CreateText(Path.Combine(dir, "index.txt"))) { for (int u = 0; u < pba.GetCount(); u++) { byte[] pvrt = pba.GetPVR(u); string outpath = Path.Combine(dir, u.ToString("D3") + ".pvr"); File.WriteAllBytes(outpath, pvrt); texList.WriteLine(u.ToString("D3") + ".pvr"); } texList.Flush(); texList.Close(); } Console.WriteLine("Archive extracted!"); break; case ".bin": Console.WriteLine("Compressing BIN file: {0}", filePath); byte[] bindata = File.ReadAllBytes(Path.ChangeExtension(filePath, ".bin")); bindata = FraGag.Compression.Prs.Compress(bindata); File.WriteAllBytes(Path.ChangeExtension(filePath, ".prs"), bindata); Console.WriteLine("PRS archive was compiled successfully!"); return; case ".prs": case ".pvm": case ".gvm": Console.WriteLine("Extracting archive: {0}", filePath); path = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath)); Directory.CreateDirectory(path); filedata = File.ReadAllBytes(filePath); using (TextWriter texList = File.CreateText(Path.Combine(path, "index.txt"))) { try { ArchiveBase pvmfile = null; byte[] pvmdata = File.ReadAllBytes(filePath); if (extension == ".prs") { pvmdata = FraGag.Compression.Prs.Decompress(pvmdata); } pvmfile = new PvmArchive(); MemoryStream stream = new MemoryStream(pvmdata); if (!PvmArchive.Identify(stream)) { pvmfile = new GvmArchive(); if (!GvmArchive.Identify(stream)) { File.WriteAllBytes(Path.ChangeExtension(filePath, ".bin"), pvmdata); isBIN = true; Console.WriteLine("PRS archive extracted!"); } } if (!isBIN) { ArchiveReader pvmReader = pvmfile.Open(pvmdata); foreach (ArchiveEntry pvmentry in pvmReader.Entries) { Console.WriteLine("Extracting file: {0}", pvmentry.Name); texList.WriteLine(pvmentry.Name); pvmReader.ExtractToFile(pvmentry, Path.Combine(path, pvmentry.Name)); } Console.WriteLine("Archive extracted!"); } } catch { Console.WriteLine("Exception thrown. Canceling conversion."); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); Directory.Delete(path, true); throw; } } if (isBIN) { Directory.Delete(path, true); } break; default: Console.WriteLine("Unknown extension \"{0}\".", extension); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); break; } break; } }
public abstract void GenerateScripts(string icao, DATFile datFile, DSFFile dsfFile, TSCFile tscFile, string outputFolder, string texturesFolder);
/// <summary> /// Main function for extracting archives. /// </summary> static void ExtractArchive(string[] args) { GenericArchive arc; string arcname = extension.ToUpperInvariant(); Console.WriteLine("Extracting {0} file: {1}", arcname.Substring(1, arcname.Length - 1), filePath); byte[] arcdata = File.ReadAllBytes(filePath); outputPath = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath)); switch (extension.ToLowerInvariant()) { case (".rel"): outputPath = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + "_dec.rel"); Console.WriteLine("Output file: {0}", outputPath); byte[] inputData = File.ReadAllBytes(args[0]); byte[] outputData = SA_Tools.HelperFunctions.DecompressREL(inputData); File.WriteAllBytes(outputPath, outputData); Console.WriteLine("File extracted!"); return; case (".pvmx"): arc = new PVMXFile(arcdata); break; case (".prs"): arcdata = FraGag.Compression.Prs.Decompress(arcdata); if (PuyoFile.Identify(arcdata) == PuyoArchiveType.Unknown) { outputPath = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + ".bin"); Console.WriteLine("Output file: {0}", Path.GetFullPath(outputPath)); File.WriteAllBytes(outputPath, arcdata); Console.WriteLine("Archive extracted!"); return; } arc = new PuyoFile(arcdata); break; case (".pvm"): case (".gvm"): arc = new PuyoFile(arcdata); break; case (".pb"): arc = new PBFile(arcdata); break; case (".pak"): arc = new PAKFile(filePath); break; case (".dat"): arc = new DATFile(arcdata); break; case (".mdl"): arc = new MDLArchive(arcdata); break; case (".mdt"): arc = new MDTArchive(arcdata); break; case (".mld"): arc = new MLDArchive(arcdata); break; case (".mlt"): arc = new MLTArchive(arcdata); break; default: Console.WriteLine("Unknown archive type"); return; } Console.WriteLine("Output folder: {0}", Path.GetFullPath(outputPath)); Directory.CreateDirectory(outputPath); foreach (GenericArchiveEntry entry in arc.Entries) { Console.WriteLine("Extracting file: {0}", entry.Name); File.WriteAllBytes(Path.Combine(outputPath, entry.Name), entry.Data); } arc.CreateIndexFile(outputPath); Console.WriteLine("Archive extracted!"); }
/// <summary> /// Main function for extracting archives. /// </summary> static void ExtractArchive(string[] args) { GenericArchive arc; string arcname = extension.ToUpperInvariant(); Console.WriteLine("Extracting {0} file: {1}", arcname.Substring(1, arcname.Length - 1), filePath); byte[] arcdata = File.ReadAllBytes(filePath); outputPath = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath)); switch (extension.ToLowerInvariant()) { case (".rel"): outputPath = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + "_dec.rel"); Console.WriteLine("Output file: {0}", outputPath); byte[] inputData = File.ReadAllBytes(args[0]); byte[] outputData = SplitTools.HelperFunctions.DecompressREL(inputData); File.WriteAllBytes(outputPath, outputData); Console.WriteLine("File extracted!"); return; case (".pvmx"): arc = new PVMXFile(arcdata); break; case (".arcx"): arc = new ARCXFile(arcdata); break; case (".prs"): arcdata = FraGag.Compression.Prs.Decompress(arcdata); if (ARCXFile.Identify(arcdata)) { arc = new ARCXFile(arcdata); } else if (PuyoFile.Identify(arcdata) == PuyoArchiveType.Unknown) { outputPath = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + ".bin"); Console.WriteLine("Output file: {0}", Path.GetFullPath(outputPath)); File.WriteAllBytes(outputPath, arcdata); Console.WriteLine("Archive extracted!"); return; } else { arc = new PuyoFile(arcdata); } break; case (".pvm"): case (".gvm"): arc = new PuyoFile(arcdata); break; case (".xvm"): arc = new XVM(arcdata); break; case (".pb"): arc = new PBFile(arcdata); break; case (".pak"): arc = new PAKFile(filePath); break; case (".dat"): arc = new DATFile(arcdata); break; case (".mdl"): arc = new MDLArchive(arcdata); break; case (".mdt"): arc = new MDTArchive(arcdata); break; case (".mld"): arc = new MLDArchive(arcdata); break; case (".mlt"): case (".gcaxmlt"): string test = System.Text.Encoding.ASCII.GetString(arcdata, 0, 4); if (test == "gcax") { arc = new gcaxMLTFile(arcdata, Path.GetFileNameWithoutExtension(filePath)); } else { arc = new MLTFile(arcdata, Path.GetFileNameWithoutExtension(filePath)); } break; default: Console.WriteLine("Unknown archive type"); return; } Console.WriteLine("Output folder: {0}", Path.GetFullPath(outputPath)); Directory.CreateDirectory(outputPath); foreach (GenericArchiveEntry entry in arc.Entries) { if (entry.Data == null) { Console.WriteLine("Entry {0} has no data", entry.Name); continue; } Console.WriteLine("Extracting file: {0}", entry.Name); if (arc is ARCXFile) { ARCXFile.ARCXEntry ARCXentry = (ARCXFile.ARCXEntry)entry; Directory.CreateDirectory(Path.Combine(outputPath, ARCXentry.Folder)); File.WriteAllBytes(Path.Combine(outputPath, ARCXentry.Folder, entry.Name), entry.Data); } else { File.WriteAllBytes(Path.Combine(outputPath, entry.Name), entry.Data); } } arc.CreateIndexFile(outputPath); Console.WriteLine("Archive extracted!"); }
/// <summary> /// Main function for automatic archive building from a folder. /// </summary> static void BuildFromFolder(string[] args) { bool createPB = false; filePath = args[0]; compressPRS = false; for (int a = 0; a < args.Length; a++) { if (args[a] == "-prs") { compressPRS = true; } if (args[a] == "-pb") { createPB = true; } } //Folder mode if (Directory.Exists(filePath)) { GenericArchive arc; string indexfilename = Path.Combine(filePath, "index.txt"); List <string> filenames = new List <string>(File.ReadAllLines(indexfilename).Where(a => !string.IsNullOrEmpty(a))); string ext = Path.GetExtension(filenames[0]).ToLowerInvariant(); switch (ext) { case ".pvr": if (createPB) { folderMode = ArchiveFromFolderMode.PB; arc = new PBFile(); } else { folderMode = ArchiveFromFolderMode.PVM; arc = new PuyoFile(); } break; case ".gvr": arc = new PuyoFile(true); folderMode = ArchiveFromFolderMode.GVM; break; case ".wav": case ".adx": folderMode = ArchiveFromFolderMode.DAT; arc = new DATFile(); break; case ".png": case ".jpg": case ".bmp": case ".dds": case ".gif": default: folderMode = ArchiveFromFolderMode.PVMX; arc = new PVMXFile(); break; } Console.WriteLine("Creating {0} archive from folder: {1}", folderMode.ToString(), filePath); int id = 0; foreach (string line in filenames) { string[] split = line.Split(','); string filename = split[0]; switch (folderMode) { case ArchiveFromFolderMode.DAT: arc.Entries.Add(new DATEntry(Path.Combine(filePath, filename))); extension = ".dat"; break; case ArchiveFromFolderMode.PVM: arc.Entries.Add(new PVMEntry(Path.Combine(filePath, filename))); extension = ".pvm"; break; case ArchiveFromFolderMode.GVM: arc.Entries.Add(new GVMEntry(Path.Combine(filePath, filename))); extension = ".gvm"; break; case ArchiveFromFolderMode.PB: PBFile pbf = (PBFile)arc; arc.Entries.Add(new PBEntry(Path.Combine(filePath, filename), pbf.GetCurrentOffset(id, filenames.Count))); extension = ".pb"; break; case ArchiveFromFolderMode.PVMX: extension = ".pvmx"; filename = split[1]; int width = 0; int height = 0; uint gbix = uint.Parse(split[0]); if (split.Length > 2) { width = int.Parse(split[2].Split('x')[0]); height = int.Parse(split[2].Split('x')[1]); } arc.Entries.Add(new PVMXEntry(Path.GetFileName(filename), gbix, File.ReadAllBytes(Path.Combine(filePath, filename)), width, height)); break; default: extension = ".bin"; break; } Console.WriteLine("Added entry {0}: {1}", id.ToString(), filename); id++; } byte[] data = arc.GetBytes(); outputPath = Path.GetFullPath(filePath) + extension; if (compressPRS) { Console.WriteLine("Compressing to PRS..."); data = FraGag.Compression.Prs.Compress(data); outputPath = Path.ChangeExtension(outputPath, ".PRS"); } Console.WriteLine("Output file: {0}", outputPath); File.WriteAllBytes(outputPath, data); } }