public static void WriteEOFC(this Stream stream, int ID) { PDHead Header = new PDHead { Format = Main.Format.F2LE, ID = ID, Lenght = 0x20, Signature = 0x43464F45, }; stream.Write(Header); }
public static void Write(this Stream stream, PDHead Header, bool X = false) { stream.Write(Header.Signature); stream.Write(Header.DataSize); stream.Write((Header.Format < Main.Format.X && !X) ? 0x40 : 0x20); if (Header.Format == Main.Format.F2BE) { stream.Write(0x18000000); } else { stream.Write(0x10000000); } stream.Write(Header.ID); stream.Write(Header.SectionSize); stream.Write(0x00); stream.Write(0x00); if (Header.Format < Main.Format.X && !X) { stream.Write(Header.Format < Main.Format.MGF ? (int)((Header.SectionSignature ^ (Header.DataSize * (long)Header.Signature)) - Header.ID + Header.SectionSize) : 0); stream.Write(0x00); stream.Write(0x00L); stream.Write(Header.InnerSignature); stream.Write(0x00); stream.Write(0x00L); } }
public static PDHead ReadHeader(this Stream stream) { long Position = stream.LongPosition; PDHead Header = new PDHead { Format = Main.Format.F2LE, Signature = stream.ReadInt32(), DataSize = stream.ReadInt32(), Lenght = stream.ReadInt32() }; if (stream.ReadUInt32() == 0x18000000) { Header.Format = Main.Format.F2BE; } Header.ID = stream.ReadInt32(); Header.SectionSize = stream.ReadInt32(); if (Header.Lenght == 0x40) { stream.Position = 0x30; Header.InnerSignature = stream.ReadInt32(); } stream.IsBE = Header.Format == Main.Format.F2BE; stream.Format = Header.Format; stream.LongPosition = Position + Header.Lenght; Header.SectionSignature = stream.ReadInt32Endian(); return(Header); }
public static POF AddPOF(this PDHead Header) { POF POF = new POF { Offsets = new List <long>(), POFOffsets = new List <long>(), Offset = Header.DataSize + Header.Lenght }; return(POF); }
public void MsgPackReader(string file, bool JSON) { int i0 = 0; int i1 = 0; this.Dex = new EXP[0]; Header = new PDHead(); MsgPack MsgPack = file.ReadMP(JSON); if (MsgPack.Element("Dex", out MsgPack Dex, typeof(object[]))) { MsgPack Temp = new MsgPack(); this.Dex = new EXP[((object[])Dex.Object).Length]; MsgPack EXP = new MsgPack(); for (i0 = 0; i0 < this.Dex.Length; i0++) { if (Dex[i0].GetType() == typeof(MsgPack)) { this.Dex[i0] = new EXP(); EXP = (MsgPack)Dex[i0]; this.Dex[i0].Name = EXP.ReadString("Name"); if (EXP.Element("Main", out Temp, typeof(object[]))) { this.Dex[i0].Main = new List <EXPElement> { Capacity = ((object[])Temp.Object).Length }; for (i1 = 0; i1 < this.Dex[i0].Main.Capacity; i1++) { if (Temp[i1].GetType() == typeof(MsgPack)) { this.Dex[i0].Main.Add(ReadEXP((MsgPack)Temp[i1])); } } } if (EXP.Element("Eyes", out Temp, typeof(object[]))) { this.Dex[i0].Eyes = new List <EXPElement> { Capacity = ((object[])Temp.Object).Length }; for (i1 = 0; i1 < this.Dex[i0].Eyes.Capacity; i1++) { if (Temp[i1].GetType() == typeof(MsgPack)) { this.Dex[i0].Eyes.Add(ReadEXP((MsgPack)Temp[i1])); } } } } } } MsgPack = null; }
public void MsgPackReader(string file, bool JSON) { int i0 = 0; int i1 = 0; this.Dex = new EXP[0]; Header = new PDHead(); MsgPack MsgPack = file.ReadMPAllAtOnce(JSON); if (!MsgPack.Element <MsgPack>("Dex", out MsgPack Dex)) { return; } this.Dex = new EXP[Dex.Array.Length]; for (i0 = 0; i0 < this.Dex.Length; i0++) { if (Dex[i0] is MsgPack EXP) { this.Dex[i0] = new EXP { Name = EXP.ReadString("Name") }; if (EXP.Element <MsgPack>("Main", out MsgPack Main)) { this.Dex[i0].Main = new List <EXPElement>(); for (i1 = 0; i1 < Main.Array.Length; i1++) { if (Main[i1] is MsgPack Exp) { this.Dex[i0].Main.Add(ReadEXP(Exp)); } } } if (EXP.Element <MsgPack>("Eyes", out MsgPack Eyes)) { this.Dex[i0].Eyes = new List <EXPElement>(); for (i1 = 0; i1 < Eyes.Array.Length; i1++) { if (Eyes[i1] is MsgPack Exp) { this.Dex[i0].Eyes.Add(ReadEXP(Exp)); } } } } } MsgPack = MsgPack.New; }
public static void Write(this Stream stream, PDHead Header) { stream.Write(Header.Signature); stream.Write(Header.DataSize); stream.Write(Header.Lenght); if (Header.Format == Main.Format.F2BE) { stream.Write(0x18000000); } else { stream.Write(0x10000000); } stream.Write(Header.ID); stream.Write(Header.SectionSize); stream.Write(0x00); stream.Write(0x00); }
public int STRReader(string filepath, string ext) { Stream reader = File.OpenReader(filepath + ext); Header = new PDHead(); reader.Format = Main.Format.F; Header.Signature = reader.ReadInt32(); if (Header.Signature == 0x41525453) { Header = reader.ReadHeader(true); POF = Header.AddPOF(); reader.Position = Header.Lenght; long Count = reader.ReadInt32Endian(); Offset = reader.ReadInt32Endian(); if (Offset == 0) { Offset = Count; OffsetX = reader.ReadInt64(); Count = reader.ReadInt64(); reader.Offset = Header.Lenght; reader.Format = Main.Format.X; } reader.LongPosition = reader.IsX ? Offset + reader.Offset : Offset; STRs = new String[Count]; for (int i = 0; i < Count; i++) { STRs[i].StrOffset = reader.GetOffset(ref POF).ReadInt32Endian(); STRs[i].ID = reader.ReadInt32Endian(); if (reader.IsX) { STRs[i].StrOffset += (int)OffsetX; } } for (int i = 0; i < Count; i++) { reader.LongPosition = STRs[i].StrOffset + (reader.IsX ? reader.Offset : 0); STRs[i].Str = reader.NullTerminatedUTF8(); } reader.Position = POF.Offset; reader.ReadPOF(ref POF); } else { reader.Position -= 4; int Count = 0; for (int a = 0, i = 0; reader.Position > 0 && reader.Position < reader.Length; i++, Count++) { a = reader.ReadInt32(); if (a == 0) { break; } } STRs = new String[Count]; for (int i = 0; i < Count; i++) { reader.LongPosition = STRs[i].StrOffset + (reader.IsX ? reader.Offset : 0); STRs[i].ID = i; STRs[i].Str = reader.NullTerminatedUTF8(); } } reader.Close(); return(1); }
public STR() { Offset = 0; OffsetX = 0; STRs = null; POF = null; Header = new PDHead(); }
public DEX() { Dex = null; Header = new PDHead(); }
public int DEXReader(string filepath, string ext) { Header = new PDHead(); IO = File.OpenReader(filepath + ext); Header.Format = Main.Format.F; Header.Signature = IO.ReadInt32(); if (Header.Signature == 0x43505845) { Header = IO.ReadHeader(true); } if (Header.Signature != 0x64) { return(0); } Offset = IO.Position - 0x4; Dex = new EXP[IO.ReadInt32()]; int DEXOffset = IO.ReadInt32(); if (IO.ReadInt32() == 0x00) { Header.Format = Main.Format.X; } int DEXNameOffset = IO.ReadInt32(); if (Header.IsX) { IO.ReadInt32(); } IO.Seek(DEXOffset + Offset, 0); for (int i0 = 0; i0 < Dex.Length; i0++) { Dex[i0] = new EXP { Main = new List <EXPElement>(), Eyes = new List <EXPElement>() } } ; for (int i0 = 0; i0 < Dex.Length; i0++) { Dex[i0].MainOffset = IO.ReadInt32(); if (Header.IsX) { IO.ReadInt32(); } Dex[i0].EyesOffset = IO.ReadInt32(); if (Header.IsX) { IO.ReadInt32(); } } IO.Seek(DEXNameOffset + Offset, 0); for (int i0 = 0; i0 < Dex.Length; i0++) { Dex[i0].NameOffset = IO.ReadInt32(); if (Header.IsX) { IO.ReadInt32(); } } for (int i0 = 0; i0 < Dex.Length; i0++) { EXPElement element = new EXPElement(); IO.Seek(Dex[i0].MainOffset + Offset, 0); while (true) { element.Frame = IO.ReadSingle(); element.Both = IO.ReadUInt16(); element.ID = IO.ReadUInt16(); element.Value = IO.ReadSingle(); element.Trans = IO.ReadSingle(); Dex[i0].Main.Add(element); if (element.Frame == 999999 || element.Both == 0xFFFF) { break; } } IO.Seek(Dex[i0].EyesOffset + Offset, 0); while (true) { element.Frame = IO.ReadSingle(); element.Both = IO.ReadUInt16(); element.ID = IO.ReadUInt16(); element.Value = IO.ReadSingle(); element.Trans = IO.ReadSingle(); Dex[i0].Eyes.Add(element); if (element.Frame == 999999 || element.Both == 0xFFFF) { break; } } IO.Seek(Dex[i0].NameOffset + Offset, 0); Dex[i0].Name = IO.NullTerminatedUTF8(); } IO.Close(); return(1); }
public void DEXWriter(string filepath, Main.Format Format) { Header = new PDHead() { Format = Format }; IO = File.OpenWriter(filepath + (Header.Format > Main.Format.F ? ".Dex" : ".bin"), true); IO.Format = Header.Format; if (IO.Format > Main.Format.F) { Header.Lenght = 0x20; Header.DataSize = 0x00; Header.Signature = 0x43505845; Header.SectionSize = 0x00; IO.Write(Header); } IO.Write(0x64); IO.Write(Dex.Length); if (Header.IsX) { IO.Write((long)0x28); } else { IO.Write(0x20); } if (Header.IsX) { IO.Write((long)0x00); } else { IO.Write(0x00); } int Position0 = IO.Position; IO.Write((long)0x00); IO.Write((long)0x00); for (int i = 0; i < Dex.Length * 3; i++) { if (Header.IsX) { IO.Write((long)0x00); } else { IO.Write(0x00); } } IO.Align(0x20, true); for (int i0 = 0; i0 < Dex.Length; i0++) { Dex[i0].MainOffset = IO.Position - Header.Lenght; for (int i1 = 0; i1 < Dex[i0].Main.Count; i1++) { IO.Write(Dex[i0].Main[i1].Frame); IO.Write(Dex[i0].Main[i1].Both); IO.Write(Dex[i0].Main[i1].ID); IO.Write(Dex[i0].Main[i1].Value); IO.Write(Dex[i0].Main[i1].Trans); } IO.Align(0x20, true); Dex[i0].EyesOffset = IO.Position - Header.Lenght; for (int i1 = 0; i1 < Dex[i0].Eyes.Count; i1++) { IO.Write(Dex[i0].Eyes[i1].Frame); IO.Write(Dex[i0].Eyes[i1].Both); IO.Write(Dex[i0].Eyes[i1].ID); IO.Write(Dex[i0].Eyes[i1].Value); IO.Write(Dex[i0].Eyes[i1].Trans); } IO.Align(0x20, true); } for (int i0 = 0; i0 < Dex.Length; i0++) { Dex[i0].NameOffset = IO.Position - Header.Lenght; IO.Write(Dex[i0].Name + "\0"); } IO.Align(0x10, true); if (Header.IsX) { IO.Seek(Header.Lenght + 0x28, 0); } else { IO.Seek(Header.Lenght + 0x20, 0); } for (int i0 = 0; i0 < Dex.Length; i0++) { IO.Write(Dex[i0].MainOffset); if (Header.IsX) { IO.Write(0x00); } IO.Write(Dex[i0].EyesOffset); if (Header.IsX) { IO.Write(0x00); } } int Position1 = IO.Position - Header.Lenght; for (int i0 = 0; i0 < Dex.Length; i0++) { IO.Write(Dex[i0].NameOffset); if (Header.IsX) { IO.Write(0x00); } } if (Header.IsX) { IO.Seek(Position0 - 8, 0); } else { IO.Seek(Position0 - 4, 0); } IO.Write(Position1); if (IO.Format > Main.Format.F) { Offset = IO.Length - Header.Lenght; IO.Seek(IO.Length, 0); IO.WriteEOFC(0); IO.Seek(0, 0); Header.DataSize = Offset; Header.SectionSize = Offset; IO.Write(Header); } IO.Close(); }
public POF() { Type = 0; Lenght = 0; Offset = 0; LastOffset = 0; Offsets = new List <long>(); POFOffsets = new List <long>(); Header = new PDHead(); }
public void DEXWriter(string filepath, Main.Format Format) { Header = new PDHead() { Format = Format }; IO = File.OpenWriter(filepath + (Format > Main.Format.F ? ".dex" : ".bin"), true); IO.Format = Format; IO.Offset = Format > Main.Format.F ? 0x20 : 0; IO.Write(0x64); IO.Write(Dex.Length); IO.WriteX(Header.IsX ? 0x28 : 0x20); IO.WriteX(0x00); int Position0 = IO.Position; IO.Write(0x00L); IO.Write(0x00L); for (int i = 0; i < Dex.Length * 3; i++) { IO.WriteX(0x00); } IO.Align(0x20, true); for (int i0 = 0; i0 < Dex.Length; i0++) { Dex[i0].MainOffset = IO.Position; for (int i1 = 0; i1 < Dex[i0].Main.Count; i1++) { IO.Write(Dex[i0].Main[i1].Frame); IO.Write(Dex[i0].Main[i1].Both); IO.Write(Dex[i0].Main[i1].ID); IO.Write(Dex[i0].Main[i1].Value); IO.Write(Dex[i0].Main[i1].Trans); } IO.Align(0x20, true); Dex[i0].EyesOffset = IO.Position; for (int i1 = 0; i1 < Dex[i0].Eyes.Count; i1++) { IO.Write(Dex[i0].Eyes[i1].Frame); IO.Write(Dex[i0].Eyes[i1].Both); IO.Write(Dex[i0].Eyes[i1].ID); IO.Write(Dex[i0].Eyes[i1].Value); IO.Write(Dex[i0].Eyes[i1].Trans); } IO.Align(0x20, true); } for (int i0 = 0; i0 < Dex.Length; i0++) { Dex[i0].NameOffset = IO.Position; IO.Write(Dex[i0].Name + "\0"); } IO.Align(0x10, true); IO.Position = Header.IsX ? 0x28 : 0x20; for (int i0 = 0; i0 < Dex.Length; i0++) { IO.WriteX(Dex[i0].MainOffset); IO.WriteX(Dex[i0].EyesOffset); } int Position1 = IO.Position; for (int i0 = 0; i0 < Dex.Length; i0++) { IO.WriteX(Dex[i0].NameOffset); } IO.Position = Position0 - (Header.IsX ? 8 : 4); IO.Write(Position1); if (Format > Main.Format.F) { Offset = IO.Length; IO.Offset = 0; IO.Position = IO.Length; IO.WriteEOFC(0); IO.Position = 0; Header.DataSize = Offset; Header.SectionSize = Offset; Header.Signature = 0x43505845; IO.Write(Header, true); } IO.Close(); }