internal static void Extract(string gameDirectory) { FileStream ImageFile; try { ImageFile = File.OpenRead(gameDirectory + "/scenes/scenes.image"); } catch (FileNotFoundException e) { Console.WriteLine("Didn't find scenes.image"); Console.WriteLine(e.Message); return; } catch (UnauthorizedAccessException f) { Console.WriteLine("Cannot read scenes.image file."); Console.WriteLine(f.Message); return; } MemoryStream image = new MemoryStream(); ImageFile.CopyTo(image); ImageFile.Close(); image.Position = 0; VSIF_Header Header = PopulateHeader(image); if (Header.ID != Common.FourCC("VSIF", false)) { Console.WriteLine("Scenes.image has incorrect Magic"); return; } if (Header.Version != 2) { Console.WriteLine("Scenes.image has incorrect version"); return; } if (Header.ScenesCount == 0) { Console.WriteLine("Scenes.image is empty"); return; } Console.WriteLine("Extracting scenes.image ({0} scenes)\n", Header.ScenesCount); /* Extraction */ for (int i = 0; i < Header.ScenesCount; i++) { ExtractScene(ref image, i, Header); //there's only one VSIF Header } //VSIF_ExtractScene(Image, i, Maps, MapsCount, GameDirectory); //free(Image); //printf("Finished extracting scenes from game %s\n", GameDirectory); //return 0; image.Close(); Console.WriteLine("Finished extracting scenes from {0}", gameDirectory); }
private static VSIF_Header PopulateHeader(MemoryStream image) { using (BinaryReader bin_img = new BinaryReader(image, System.Text.Encoding.UTF8, true)) { long pnt = image.Position; VSIF_Header Header = new VSIF_Header() { ID = bin_img.ReadUInt32(), Version = bin_img.ReadUInt32(), ScenesCount = bin_img.ReadUInt32(), StringsCount = bin_img.ReadUInt32(), EntryOffset = bin_img.ReadUInt32() }; image.Seek(pnt, SeekOrigin.Begin); return(Header); } //BinaryReader bin_img = new BinaryReader(image); //bin_img.Close(); }
private static void ExtractScene(ref MemoryStream image, int i, VSIF_Header Header) { //VSIF_Header sceneHeader = PopulateHeader(image); UInt32 entryStart = (UInt32)(Header.EntryOffset + (i * sizeof(UInt32) * 4)); image.Seek(entryStart, SeekOrigin.Begin); VSIF_Entry Entry = PopulateEntry(image); MemoryStream SceneBuffer; FileStream VCDFile = null; UInt32 SceneBufferSize = UncompressScene(ref image, Entry.Offset, out SceneBuffer, Entry.Size); if (SceneBufferSize == 0) { Console.Error.WriteLine("Failed to uncompress scene with CRC {0}", Entry.CRC); return; } //if (BVCDDecompiler.OpenVCDForWriting(out VCDFile,Entry.CRC)) //{ //} // throw new NotImplementedException(); BVCDDecompiler.OpenVCDForWriting(out VCDFile, Entry.CRC); SceneBuffer.Position = 0; image.Position = 0; if (VCDFile != null) { if (!BVCDDecompiler.Decompile(ref VCDFile, ref SceneBuffer, ref image)) { Console.WriteLine("Cannot decompile VCD with CRC {0:x}", Entry.CRC); } //VCDFile.Close(); } //SceneBuffer.Close(); //Close methods of BinaryReader and StringWriter close underlying streams by default }