コード例 #1
0
ファイル: Program.cs プロジェクト: GovanifY/KH2FM_Toolkit
        private static void KH2PatchExtractor(Stream patch, string outputname)
        {
            try
            {
            Directory.CreateDirectory(Path.GetDirectoryName("output/"));
            }
            catch
            {
            } //Creating folder
            using (var br = new BinaryStream(patch, Encoding.ASCII, leaveOpen: true))
            {
            using (TextWriter op = new StreamWriter("output/log.log"))
            {
            uint tmp = br.ReadUInt32();
            if (tmp != 1345472587u && tmp != 1362249803u)
            {
            br.Close();
            br.Close();
            throw new InvalidDataException("Invalid KH2Patch file!");
            }
            uint oaAuther = br.ReadUInt32(),
            obFileCount = br.ReadUInt32(),
            num = br.ReadUInt32();
            string patchname = "";
            patchname = Path.GetFileName(patchname);
            try
            {
            string author = br.ReadCString();
            op.WriteLine(author);
            op.WriteLine(num);
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("Loading patch {0} version {1} by {2}", patchname, num, author);
            Console.ResetColor();
            br.Seek(oaAuther, SeekOrigin.Begin);
            uint os1 = br.ReadUInt32(),
            os2 = br.ReadUInt32(),
            os3 = br.ReadUInt32();
            br.Seek(oaAuther + os1, SeekOrigin.Begin);
            num = br.ReadUInt32();
            if (num > 0)
            {
            br.Seek(num * 4, SeekOrigin.Current);
            //Console.WriteLine("Changelog:");
            Console.ForegroundColor = ConsoleColor.Green;
            while (num > 0)
            {
            --num;
            op.WriteLine(br.ReadCString());
            //Console.WriteLine(" * {0}", br.ReadCString());
            }
            op.WriteLine("");
            }
            br.Seek(oaAuther + os2, SeekOrigin.Begin);
            num = br.ReadUInt32();
            if (num > 0)
            {
            br.Seek(num * 4, SeekOrigin.Current);
            Console.ResetColor();
            //Console.WriteLine("Credits:");
            Console.ForegroundColor = ConsoleColor.Green;
            while (num > 0)
            {
            --num;
            op.WriteLine(br.ReadCString());
            //Console.WriteLine(" * {0}", br.ReadCString());
            }
            op.WriteLine("");
            Console.ResetColor();
            }
            br.Seek(oaAuther + os3, SeekOrigin.Begin);
            author = br.ReadCString();
            /*author = author.Replace("\r\n", string.Empty);
            author = author.Replace("\n", string.Empty);//Shitty but I know someone who made mods for adding more than one line...*/
            if (author.Length != 0)
            {
            // Console.WriteLine("Other information:\r\n");
            Console.ForegroundColor = ConsoleColor.Green;
            op.WriteLine(author);
            //Console.WriteLine("{0}", author);
            }
            op.WriteLine("");
            Console.ResetColor();
            }
            catch (Exception e)
            {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Error reading kh2patch header: {0}: {1}\r\nAttempting to continue files...",
            e.GetType(), e.Message);
            Console.ResetColor();
            }
            Console.WriteLine("");
            br.Seek(obFileCount, SeekOrigin.Begin);
            num = br.ReadUInt32();
            while (num > 0)
            {
            --num;
            uint Hash = br.ReadUInt32();
            oaAuther = br.ReadUInt32();
            uint CompressedSize = br.ReadUInt32();
            uint UncompressedSize = br.ReadUInt32();
            uint Parent = br.ReadUInt32();
            uint Relink = br.ReadUInt32();
            bool Compressed = br.ReadUInt32() != 0;
            bool IsNew = br.ReadUInt32() == 1; //Custom

            string fname3 = "";

            string fname2;
            if (Relink == 0)
            {
            if (CompressedSize != 0)
            {
            var KH2PFileStream = new Substream(patch, oaAuther, CompressedSize);
            if (HashList.HashList.pairs.TryGetValue(Hash, out fname2)) { Console.Write("Extracting {0}...", fname2); }
            else
            { fname2 = String.Format("@noname/{0:X8}.bin", Hash); ; Console.Write("Extracting {0}...", fname2); }
            long brpos = br.Tell();
            KH2PATCHInternal(KH2PFileStream, fname2, Compressed, UncompressedSize);
            br.ChangePosition((int)brpos);
            //Changing the original position of the BinaryReader for what's next
            }
            else
            {
            throw new InvalidDataException("File length is 0, but not relinking.");
            }

            op.WriteLine(fname2);
            op.WriteLine(fname3);
            string Compressed2 = "";
            if (Compressed) { Compressed2 = "y"; } else { Compressed2 = "n"; }
            op.WriteLine(Compressed2);
            string Parent2 = "";
            if (Parent == 0) { }
            if (Parent == 1) { Parent2 = "OVL"; }
            if (Parent == 2) { Parent2 = "ISO"; }
            op.WriteLine(Parent2);
            string IsNew2 = "";
            if (IsNew) { IsNew2 = "y"; } else { IsNew2 = "n"; }
            op.WriteLine(IsNew2);
            }
            else
            {
            if (!HashList.HashList.pairs.TryGetValue(Hash, out fname2)) { fname2 = String.Format("@noname/{0:X8}.bin", Hash); }
            if (!HashList.HashList.pairs.TryGetValue(Relink, out fname3))
            {
            fname3 = String.Format("@noname/{0:X8}.bin", Relink);
            }
            Console.WriteLine("File {1} relinked to {0}, no need to extract", fname3, fname2);

            op.WriteLine(fname2);
            op.WriteLine(fname3);
            string Parent2 = "";
            if (Parent == 0) { }
            if (Parent == 1) { Parent2 = "OVL"; }
            if (Parent == 2) { Parent2 = "ISO"; }
            op.WriteLine(Parent2);
            string IsNew2 = "";
            if (IsNew) { IsNew2 = "y"; } else { IsNew2 = "n"; }
            op.WriteLine(IsNew2);
            }

            br.Seek(60, SeekOrigin.Current);
            }
            op.WriteLine("");
            using (TextWriter bat = new StreamWriter("output/output.bat"))
            {
            bat.WriteLine("@echo off");
            bat.WriteLine("KH2FM_Toolkit.exe -patchmaker -batch -uselog log.log -output \"{0}\"", outputname);
            }
            File.Copy(System.Reflection.Assembly.GetEntryAssembly().Location, "output/KH2FM_Toolkit.exe");
            }
            } //End of br
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: GovanifY/KH2FM_Toolkit
        private static void KH2PATCHInternal(Substream KH2PFileStream, string fname2, bool Compressed,
		UInt32 UncompressedSize)
        {
            fname2 = "output/" + fname2;
            try
            {
            Directory.CreateDirectory(Path.GetDirectoryName(fname2));
            }
            catch
            {
            } //Creating folder
            FileStream fileStream = File.Create(fname2);
            var buffer = new byte[KH2PFileStream.Length];
            var buffer2 = new byte[UncompressedSize];
            var file3 = new MemoryStream();
            if (Compressed)
            {
            KH2PFileStream.CopyTo(file3);
            buffer = file3.ToArray();
            buffer2 = KH2Compressor.decompress(buffer, UncompressedSize);
            // Will crash if the byte array is equal to void.
            file3 = new MemoryStream(buffer2);
            }
            else
            {
            KH2PFileStream.CopyTo(file3);
            buffer2 = file3.ToArray();
            file3 = new MemoryStream(buffer2);
            }
            file3.CopyTo(fileStream);
            fileStream.Close();
            Console.WriteLine("Done!");
        }
コード例 #3
0
 public void Dispose()
 {
     if (Stream != null)
     {
         Stream.Dispose();
         Stream = null;
     }
 }