/// <summary> /// Gets the SDL2 data from a byte array buffer. /// </summary> /// <param name="Buffer">The buffer with the data</param> /// <returns>The SDL2 data</returns> public static SDL2Data GetDataFromBuffer(byte[] Buffer) { SDL2Data Output = new SDL2Data(); using (MemoryStream SDL2 = new MemoryStream(Buffer)) { EncryptedBinary Reader = new EncryptedBinary(SDL2); string Signature = Reader.ReadString(4); if (Signature != "SDL2") throw new Exception("SDL2 signature not found!"); Output.Key = Reader.Key = Reader.ReadUInt32(); ushort Table0Count = Reader.ReadUInt16XOrBE(); ushort DialogsCount = Reader.ReadUInt16XOrBE(); Output.Unknown = new UnknownEntry[Table0Count]; for (int i = 0; i < Table0Count; i++) { uint SectionBOffset = Reader.ReadUInt32XOrBE(); uint SectionAOffset = Reader.ReadUInt32XOrBE(); long Position = SDL2.Position; UnknownEntry Entry = new UnknownEntry(); SDL2.Seek(SectionAOffset, SeekOrigin.Begin); uint Entries = Reader.ReadUInt32XOrBE(); Entry.Values = new SectionAEntry[Entries]; for (int j = 0; j < Entries; j++) { Entry.Values[j].Value0 = Reader.ReadUInt32XOrBE(); Entry.Values[j].Value1 = Reader.ReadUInt32XOrBE(); } SDL2.Seek(SectionBOffset, SeekOrigin.Begin); Entry.Value0 = Reader.ReadUInt32XOrBE(); Entry.Value1 = Reader.ReadUInt32XOrBE(); Output.Unknown[i] = Entry; SDL2.Seek(Position, SeekOrigin.Begin); } Output.Dialogs = new string[DialogsCount]; for (int i = 0; i < DialogsCount; i++) { uint DialogOffset = Reader.ReadUInt32XOrBE(); long Position = SDL2.Position; SDL2.Seek(DialogOffset, SeekOrigin.Begin); Output.Dialogs[i] = Reader.ReadUTF8(); SDL2.Seek(Position, SeekOrigin.Begin); } } return Output; }
/// <summary> /// Transforms a binary DBIN2 file into a serializable object. /// </summary> /// <param name="FileName">The file name of the binary file</param> /// <returns>The object</returns> private static DBIN2 Unbinarize(string FileName) { DBIN2 Output = new DBIN2(); using (FileStream DBIN2 = new FileStream(FileName, FileMode.Open)) { EncryptedBinary Reader = new EncryptedBinary(DBIN2); string Signature = Reader.ReadString(4); if (Signature != "DBN2") { throw new Exception("DBN2 signature not found!"); } Output.Key = Reader.Key = Reader.ReadUInt32(); uint Entries = Reader.ReadUInt32XOrBE(); Output.Unknown = Reader.ReadUInt32XOrBE(); Output.Entries = new SDL2Entry[Entries]; for (int i = 0; i < Entries; i++) { DBIN2.Seek(0x10 + i * 0x10, SeekOrigin.Begin); SDL2Entry Entry = new SDL2Entry(); Entry.Unknown0 = Reader.ReadUInt32XOrBE(); Entry.Unknown1 = Reader.ReadUInt32XOrBE(); uint Offset = Reader.ReadUInt32XOrBE(); uint Length = Reader.ReadUInt32XOrBE(); byte[] Buffer = new byte[Length]; DBIN2.Seek(Offset, SeekOrigin.Begin); DBIN2.Read(Buffer, 0, Buffer.Length); Entry.SDL2 = SDL2.GetDataFromBuffer(Buffer); Output.Entries[i] = Entry; } } return(Output); }
/// <summary> /// Transforms a object into a binary DBIN2 file. /// </summary> /// <param name="FileName">The output file name</param> /// <param name="Data">The object to be binarized</param> private static void Binarize(string FileName, DBIN2 Data) { using (FileStream Output = new FileStream(FileName, FileMode.Create)) { EncryptedBinary Writer = new EncryptedBinary(Output); Writer.WriteString("DBN2"); Writer.WriteUInt32(Data.Key); Writer.Key = Data.Key; Writer.WriteUInt32XOrBE((uint)Data.Entries.Length); Writer.WriteUInt32XOrBE(Data.Unknown); int DataOffset = 0x10 + Data.Entries.Length * 0x10; for (int i = 0; i < Data.Entries.Length; i++) { Output.Seek(0x10 + i * 0x10, SeekOrigin.Begin); byte[] Buffer = SDL2.GetBufferFromData(Data.Entries[i].SDL2); Writer.WriteUInt32XOrBE(Data.Entries[i].Unknown0); Writer.WriteUInt32XOrBE(Data.Entries[i].Unknown1); Writer.WriteUInt32XOrBE((uint)DataOffset); Writer.WriteUInt32XOrBE((uint)Buffer.Length); Output.Seek(DataOffset, SeekOrigin.Begin); Output.Write(Buffer, 0, Buffer.Length); DataOffset += Buffer.Length; //Align the buffer to 64-bits if needed while ((DataOffset & 7) != 0) { Writer.WriteUInt8XOr(0); DataOffset++; } } } }
/// <summary> /// Gets the SDL2 data from a byte array buffer. /// </summary> /// <param name="Buffer">The buffer with the data</param> /// <returns>The SDL2 data</returns> public static SDL2Data GetDataFromBuffer(byte[] Buffer) { SDL2Data Output = new SDL2Data(); using (MemoryStream SDL2 = new MemoryStream(Buffer)) { EncryptedBinary Reader = new EncryptedBinary(SDL2); string Signature = Reader.ReadString(4); if (Signature != "SDL2") { throw new Exception("SDL2 signature not found!"); } Output.Key = Reader.Key = Reader.ReadUInt32(); ushort Table0Count = Reader.ReadUInt16XOrBE(); ushort DialogsCount = Reader.ReadUInt16XOrBE(); Output.Unknown = new UnknownEntry[Table0Count]; for (int i = 0; i < Table0Count; i++) { uint SectionBOffset = Reader.ReadUInt32XOrBE(); uint SectionAOffset = Reader.ReadUInt32XOrBE(); long Position = SDL2.Position; UnknownEntry Entry = new UnknownEntry(); SDL2.Seek(SectionAOffset, SeekOrigin.Begin); uint Entries = Reader.ReadUInt32XOrBE(); Entry.Values = new SectionAEntry[Entries]; for (int j = 0; j < Entries; j++) { Entry.Values[j].Value0 = Reader.ReadUInt32XOrBE(); Entry.Values[j].Value1 = Reader.ReadUInt32XOrBE(); } SDL2.Seek(SectionBOffset, SeekOrigin.Begin); Entry.Value0 = Reader.ReadUInt32XOrBE(); Entry.Value1 = Reader.ReadUInt32XOrBE(); Output.Unknown[i] = Entry; SDL2.Seek(Position, SeekOrigin.Begin); } Output.Dialogs = new string[DialogsCount]; for (int i = 0; i < DialogsCount; i++) { uint DialogOffset = Reader.ReadUInt32XOrBE(); long Position = SDL2.Position; SDL2.Seek(DialogOffset, SeekOrigin.Begin); Output.Dialogs[i] = Reader.ReadUTF8(); SDL2.Seek(Position, SeekOrigin.Begin); } } return(Output); }
/// <summary> /// Creates a buffer from the SDL2 data. /// </summary> /// <param name="Data">The data to be binarized</param> /// <returns>The data as a byte array</returns> public static byte[] GetBufferFromData(SDL2Data Data) { using (MemoryStream Output = new MemoryStream()) { EncryptedBinary Writer = new EncryptedBinary(Output); Writer.WriteString("SDL2"); Writer.WriteUInt32(Data.Key); Writer.Key = Data.Key; Writer.WriteUInt16XOrBE((ushort)Data.Unknown.Length); Writer.WriteUInt16XOrBE((ushort)Data.Dialogs.Length); int SectionALength = Data.Unknown.Length * 4; foreach (UnknownEntry Entry in Data.Unknown) { SectionALength += Entry.Values.Length * 8; } int SectionAOffset = 0xc + Data.Unknown.Length * 8 + Data.Dialogs.Length * 4; int SectionBOffset = SectionAOffset + SectionALength; int DialogsOffset = SectionBOffset + Data.Unknown.Length * 8; for (int i = 0; i < Data.Unknown.Length; i++) { Writer.WriteUInt32XOrBE((uint)SectionBOffset); Writer.WriteUInt32XOrBE((uint)SectionAOffset); long Position = Output.Position; Output.Seek(SectionAOffset, SeekOrigin.Begin); Writer.WriteUInt32XOrBE((uint)Data.Unknown[i].Values.Length); SectionAOffset += 4; foreach (SectionAEntry Entry in Data.Unknown[i].Values) { Writer.WriteUInt32XOrBE(Entry.Value0); Writer.WriteUInt32XOrBE(Entry.Value1); SectionAOffset += 8; } Output.Seek(SectionBOffset, SeekOrigin.Begin); Writer.WriteUInt32XOrBE(Data.Unknown[i].Value0); Writer.WriteUInt32XOrBE(Data.Unknown[i].Value1); SectionBOffset += 8; Output.Seek(Position, SeekOrigin.Begin); } for (int i = 0; i < Data.Dialogs.Length; i++) { Writer.WriteUInt32XOrBE((uint)DialogsOffset); long Position = Output.Position; Output.Seek(DialogsOffset, SeekOrigin.Begin); DialogsOffset += Writer.WriteUTF8(Data.Dialogs[i]); while ((DialogsOffset & 3) != 0) { //Align into 32-bits if needed Writer.WriteUInt8XOr(0); DialogsOffset++; } Output.Seek(Position, SeekOrigin.Begin); } return(Output.ToArray()); } }
/// <summary> /// Transforms a binary DBIN2 file into a serializable object. /// </summary> /// <param name="FileName">The file name of the binary file</param> /// <returns>The object</returns> private static DBIN2 Unbinarize(string FileName) { DBIN2 Output = new DBIN2(); using (FileStream DBIN2 = new FileStream(FileName, FileMode.Open)) { EncryptedBinary Reader = new EncryptedBinary(DBIN2); string Signature = Reader.ReadString(4); if (Signature != "DBN2") throw new Exception("DBN2 signature not found!"); Output.Key = Reader.Key = Reader.ReadUInt32(); uint Entries = Reader.ReadUInt32XOrBE(); Output.Unknown = Reader.ReadUInt32XOrBE(); Output.Entries = new SDL2Entry[Entries]; for (int i = 0; i < Entries; i++) { DBIN2.Seek(0x10 + i * 0x10, SeekOrigin.Begin); SDL2Entry Entry = new SDL2Entry(); Entry.Unknown0 = Reader.ReadUInt32XOrBE(); Entry.Unknown1 = Reader.ReadUInt32XOrBE(); uint Offset = Reader.ReadUInt32XOrBE(); uint Length = Reader.ReadUInt32XOrBE(); byte[] Buffer = new byte[Length]; DBIN2.Seek(Offset, SeekOrigin.Begin); DBIN2.Read(Buffer, 0, Buffer.Length); Entry.SDL2 = SDL2.GetDataFromBuffer(Buffer); Output.Entries[i] = Entry; } } return Output; }
/// <summary> /// Transforms a object into a binary DBIN2 file. /// </summary> /// <param name="FileName">The output file name</param> /// <param name="Data">The object to be binarized</param> private static void Binarize(string FileName, DBIN2 Data) { using (FileStream Output = new FileStream(FileName, FileMode.Create)) { EncryptedBinary Writer = new EncryptedBinary(Output); Writer.WriteString("DBN2"); Writer.WriteUInt32(Data.Key); Writer.Key = Data.Key; Writer.WriteUInt32XOrBE((uint)Data.Entries.Length); Writer.WriteUInt32XOrBE(Data.Unknown); int DataOffset = 0x10 + Data.Entries.Length * 0x10; for (int i = 0; i < Data.Entries.Length; i++) { Output.Seek(0x10 + i * 0x10, SeekOrigin.Begin); byte[] Buffer = SDL2.GetBufferFromData(Data.Entries[i].SDL2); Writer.WriteUInt32XOrBE(Data.Entries[i].Unknown0); Writer.WriteUInt32XOrBE(Data.Entries[i].Unknown1); Writer.WriteUInt32XOrBE((uint)DataOffset); Writer.WriteUInt32XOrBE((uint)Buffer.Length); Output.Seek(DataOffset, SeekOrigin.Begin); Output.Write(Buffer, 0, Buffer.Length); DataOffset += Buffer.Length; //Align the buffer to 64-bits if needed while ((DataOffset & 7) != 0) { Writer.WriteUInt8XOr(0); DataOffset++; } } } }
/// <summary> /// Creates a buffer from the SDL2 data. /// </summary> /// <param name="Data">The data to be binarized</param> /// <returns>The data as a byte array</returns> public static byte[] GetBufferFromData(SDL2Data Data) { using (MemoryStream Output = new MemoryStream()) { EncryptedBinary Writer = new EncryptedBinary(Output); Writer.WriteString("SDL2"); Writer.WriteUInt32(Data.Key); Writer.Key = Data.Key; Writer.WriteUInt16XOrBE((ushort)Data.Unknown.Length); Writer.WriteUInt16XOrBE((ushort)Data.Dialogs.Length); int SectionALength = Data.Unknown.Length * 4; foreach (UnknownEntry Entry in Data.Unknown) SectionALength += Entry.Values.Length * 8; int SectionAOffset = 0xc + Data.Unknown.Length * 8 + Data.Dialogs.Length * 4; int SectionBOffset = SectionAOffset + SectionALength; int DialogsOffset = SectionBOffset + Data.Unknown.Length * 8; for (int i = 0; i < Data.Unknown.Length; i++) { Writer.WriteUInt32XOrBE((uint)SectionBOffset); Writer.WriteUInt32XOrBE((uint)SectionAOffset); long Position = Output.Position; Output.Seek(SectionAOffset, SeekOrigin.Begin); Writer.WriteUInt32XOrBE((uint)Data.Unknown[i].Values.Length); SectionAOffset += 4; foreach (SectionAEntry Entry in Data.Unknown[i].Values) { Writer.WriteUInt32XOrBE(Entry.Value0); Writer.WriteUInt32XOrBE(Entry.Value1); SectionAOffset += 8; } Output.Seek(SectionBOffset, SeekOrigin.Begin); Writer.WriteUInt32XOrBE(Data.Unknown[i].Value0); Writer.WriteUInt32XOrBE(Data.Unknown[i].Value1); SectionBOffset += 8; Output.Seek(Position, SeekOrigin.Begin); } for (int i = 0; i < Data.Dialogs.Length; i++) { Writer.WriteUInt32XOrBE((uint)DialogsOffset); long Position = Output.Position; Output.Seek(DialogsOffset, SeekOrigin.Begin); DialogsOffset += Writer.WriteUTF8(Data.Dialogs[i]); while ((DialogsOffset & 3) != 0) { //Align into 32-bits if needed Writer.WriteUInt8XOr(0); DialogsOffset++; } Output.Seek(Position, SeekOrigin.Begin); } return Output.ToArray(); } }