public unsafe void Read(byte[] data, bool shiftX) { Value Val = 0; Offsets = KKdList <long> .New; fixed(byte *ptr = data) { int i = 0, offset = 0, v = 0; byte bitShift = (byte)(shiftX ? 3 : 2); int length = *(int *)ptr - 4; byte *localPtr = ptr + 4; while (length > i) { v = *ptr & 0x3F; Val = (Value)(*ptr & 0xC0); localPtr++; i++; if (Val == Value.Int32) { v = (v << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; localPtr += 3; i += 3; } else if (Val == Value.Int16) { v = (v << 8) | ptr[0]; localPtr += 1; i += 3; } else if (Val == Value.Invalid) { break; } offset += v; Offsets.Add(offset << bitShift); } } }
public unsafe void Read(byte[] data, bool shiftX) { Offsets = KKdList <long> .New; fixed(byte *ptr = data) { long offset = 0; int i = 0, j = 0, v = 0; byte bitShift = (byte)(shiftX ? 3 : 2); int length = *(int *)ptr - 4; byte *l = ptr + 4; Offsets.Capacity = length; while (length > i) { if (ReadPOFValue(ref l, out v)) { break; } j++; offset += v; Offsets.Add(offset << bitShift); } Offsets.Capacity = j; } }
public unsafe static POF Read(byte[] data, bool shiftX) { Value Val = 0; KKdList <long> offsets = KKdList <long> .New; byte * ptr = data.GetPtr(); int i = 0, offset = 0, v = 0; byte bitShift = (byte)(shiftX ? 3 : 2); int length = *(int *)ptr - 4; ptr += 4; while (length > i) { v = *ptr & 0x3F; Val = (Value)(*ptr & 0xC0); ptr++; i++; if (Val == Value.Int32) { v = (v << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; ptr += 3; i += 3; } else if (Val == Value.Int16) { v = (v << 8) | ptr[0]; ptr += 1; i += 3; } else if (Val == Value.Invalid) { break; } offset += v; offsets.Add(offset << bitShift); } return(new POF { Offsets = offsets }); }
public static byte[] NT(this Stream stream, byte end = 0) { KKdList <byte> s = KKdList <byte> .New; while (stream.PI64 < stream.LI64) { byte a = stream.RU8(); if (a == end) { break; } else { s.Add(a); } } return(s.ToArray()); }
public static byte[] NullTerminated(this Stream stream, byte End = 0) { KKdList <byte> s = KKdList <byte> .New; while (stream.LongPosition < stream.LongLength) { byte a = stream.ReadByte(); if (a == End) { break; } else { s.Add(a); } } return(s.ToArray()); }
public void STRWriter(string filepath) { if (STRs == null || STRs.Length == 0 || header.Format > Format.F2BE) { return; } uint offset = 0; uint currentOffset = 0; _IO = File.OpenWriter(filepath + (header.Format > Format.AFT && header.Format < Format.FT ? ".str" : ".bin"), true); _IO.Format = header.Format; pof.Offsets = KKdList <long> .New; long count = STRs.LongLength; if (_IO.Format > Format.AFT && _IO.Format < Format.FT) { _IO.P = 0x40; _IO.WX(count, ref pof); _IO.WX(0x80); _IO.P = 0x80; for (int i = 0; i < count; i++) { _IO.W(0x00L); } _IO.A(0x10); } else { for (int i = 0; i < count; i++) { _IO.W(0x00); } _IO.A(0x20); } KKdList <string> usedSTR = KKdList <string> .New; KKdList <int> usedSTRPos = KKdList <int> .New; int[] STRPos = new int[count]; usedSTRPos.Add(_IO.P); usedSTR.Add(""); _IO.W(0); for (int i = 0; i < count; i++) { if (!usedSTR.Contains(STRs[i].Str.V)) { STRPos[i] = _IO.P; usedSTRPos.Add(STRPos[i]); usedSTR.Add(STRs[i].Str.V); _IO.W(STRs[i].Str.V); _IO.W(0); } else { for (int i2 = 0; i2 < count; i2++) { if (usedSTR[i2] == STRs[i].Str.V) { STRPos[i] = usedSTRPos[i2]; break; } } } } if (_IO.Format > Format.AFT) { _IO.A(0x10); offset = _IO.U32P; _IO.P = 0x80; for (int i = 0; i < count; i++) { pof.Offsets.Add(_IO.P); _IO.WE(STRPos[i]); _IO.WE(STRs[i].ID); } _IO.U32P = offset; _IO.W(pof, false, 1); currentOffset = _IO.U32P; _IO.WEOFC(); header.DataSize = (int)(currentOffset - 0x40); header.Signature = 0x41525453; header.SectionSize = (int)(offset - 0x40); _IO.P = 0; _IO.W(header, true); } else { _IO.P = 0; for (int i = 0; i < count; i++) { _IO.W(STRPos[i]); } } _IO.C(); }
private static void FARCProcessor(KKdFARC farc, string choose, Format format, bool a3dcOpt) { if (!farc.HeaderReader() || !farc.HasFiles) { return; } KKdList <string> list = KKdList <string> .New; for (int i = 0; i < farc.Files.Count; i++) { string file = farc.Files[i].Name.ToLower(); if (!file.Contains("_div_") && file.EndsWith(".a3da")) { list.Add(file); } } KKdList <string> A3DAlist = KKdList <string> .New; for (int i = 0; i < farc.Files.Count; i++) { if (farc.Files[i].Name.ToLower().EndsWith(".a3da")) { A3DAlist.Add(farc.Files[i].Name); } } byte[] data = null; if (list.Count == A3DAlist.Count) { KKdA3DA a3da; for (int i = 0; i < A3DAlist.Count; i++) { using (a3da = new KKdA3DA(a3dcOpt)) { data = farc.FileReader(A3DAlist[i]); int state = a3da.A3DAReader(data); if (state == 1) { KKdFARC.FARCFile file = farc.Files[i]; a3da.Head.Format = format; file.Data = (choose == "1" || choose == "4") ? a3da.A3DAWriter() : a3da.A3DCWriter(); farc.Files[i] = file; } } } farc.Save(); return; } KKdA3DA[] a3daArray; using (KKdList <KKdA3DA> a3daList = KKdList <KKdA3DA> .NewReserve(list.Count)) { for (int i = 0; i < list.Count; i++) { KKdA3DA a3da; using (a3da = new KKdA3DA(a3dcOpt)) { data = farc.FileReader(list[i]); int state = a3da.A3DAReader(data); if (state == 1) { a3daList.Add(a3da); } } } a3daArray = a3daList.ToArray(); } for (int i = 0; i < list.Count; i++) { if (a3daArray[i].Data.PlayControl.Div == null) { continue; } int div = a3daArray[i].Data.PlayControl.Div.Value; string filename = Path.RemoveExtension(list[i]); string ext = Path.GetExtension(list[i]).ToLower(); KKdA3DA a3da; for (int i1 = 1; i1 < div; i1++) { using (a3da = new KKdA3DA(a3dcOpt)) { string file = filename + "_div_" + i1 + ext; data = farc.FileReader(file); int state = a3da.A3DAReader(data); if (state == 1) { a3daArray[i].A3DAMerger(ref a3da.Data); } } } a3daArray[i].Data.PlayControl.Div = null; } farc.Files.Capacity = 0; farc.Files.Capacity = list.Count; for (int i = 0; i < list.Count; i++) { KKdFARC.FARCFile file = default; file.Name = list[i]; a3daArray[i].Head.Format = format; file.Data = (choose == "1" || choose == "4") ? a3daArray[i].A3DAWriter() : a3daArray[i].A3DCWriter(); farc.Files.Add(file); } farc.Save(); return; }
private static void FARCProcessor(KKdFARC farc, string choose, Format format) { if (!farc.HeaderReader()) { return; } if (!farc.HasFiles) { return; } KKdList <string> list = KKdList <string> .New; for (int i = 0; i < farc.Files.Length; i++) { if (!farc.Files[i].Name.Contains("div") && farc.Files[i].Name.EndsWith(".a3da")) { list.Add(farc.Files[i].Name); } } KKdList <string> A3DAlist = KKdList <string> .New; for (int i = 0; i < farc.Files.Length; i++) { if (farc.Files[i].Name.EndsWith(".a3da")) { A3DAlist.Add(farc.Files[i].Name); } } byte[] data = null; if (list.Count == A3DAlist.Count || (format > Format.AFT && format < Format.FT)) { KKdA3DA a3da; for (int i = 0; i < A3DAlist.Count; i++) { using (a3da = new KKdA3DA(true)) { data = farc.FileReader(A3DAlist[i]); int state = a3da.A3DAReader(data); if (state == 1) { a3da.Data._.CompressF16 = format > Format.AFT && format < Format.FT ? format == Format.MGF ? 2 : 1 : 0; a3da.Head.Format = format; farc.Files[i].Data = (choose != "1" && choose != "3") ? a3da.A3DCWriter() : a3da.A3DAWriter(); } } } farc.Save(); return; } KKdA3DA[] a3daArray; using (KKdList <KKdA3DA> a3daList = KKdList <KKdA3DA> .New) { for (int i = 0; i < list.Count; i++) { KKdA3DA a3da; using (a3da = new KKdA3DA(true)) { data = farc.FileReader(list[i]); int state = a3da.A3DAReader(data); if (state == 1) { a3daList.Add(a3da); } } } a3daArray = a3daList.ToArray(); } for (int i = 0; i < list.Count; i++) { if (a3daArray[i].Data.PlayControl.Div == null) { continue; } float Div = a3daArray[i].Data.PlayControl.Div.Value; KKdA3DA a3da; for (int i1 = 1; i1 < Div; i1++) { using (a3da = new KKdA3DA(true)) { string file = Path.GetFileNameWithoutExtension(list[i]) + "_div_" + i1 + Path.GetExtension(list[i]); data = farc.FileReader(file); int state = a3da.A3DAReader(data); if (state == 1) { a3daArray[i].A3DAMerger(ref a3da.Data); } } } a3daArray[i].Data.PlayControl.Div = null; } farc.Files = new KKdFARC.FARCFile[list.Count]; for (int i = 0; i < list.Count; i++) { farc.Files[i].Name = list[i]; a3daArray[i].Data._.CompressF16 = format > Format.AFT && format < Format.FT ? format == Format.MGF ? 2 : 1 : 0; a3daArray[i].Head.Format = format; farc.Files[i].Data = (choose != "1" && choose != "3") ? a3daArray[i].A3DCWriter() : a3daArray[i].A3DAWriter(); } farc.Save(); return; }
public void STRWriter(string filepath) { if (STRs == null || STRs.Length == 0 || Header.Format > Main.Format.F2BE) { return; } uint Offset = 0; uint CurrentOffset = 0; IO = File.OpenWriter(filepath + (Header.Format > Main.Format.FT ? ".str" : ".bin"), true); IO.Format = Header.Format; POF = new POF(); IO.IsBE = IO.Format == Main.Format.F2BE; long Count = STRs.LongLength; if (IO.Format > Main.Format.FT) { IO.Position = 0x40; IO.WriteX(Count); IO.GetOffset(ref POF); IO.WriteX(0x80); IO.Position = 0x80; for (int i = 0; i < Count; i++) { IO.Write(0x00L); } IO.Align(0x10); } else { for (int i = 0; i < Count; i++) { IO.Write(0x00); } IO.Align(0x20); } KKdList <string> UsedSTR = KKdList <string> .New; KKdList <int> UsedSTRPos = KKdList <int> .New; int[] STRPos = new int[Count]; for (int i = 0; i < Count; i++) { if (!UsedSTR.Contains(STRs[i].Str.Value)) { STRPos[i] = IO.Position; UsedSTRPos.Add(STRPos[i]); UsedSTR.Add(STRs[i].Str.Value); IO.Write(STRs[i].Str.Value + "\0"); } else { for (int i2 = 0; i2 < Count; i2++) { if (UsedSTR[i2] == STRs[i].Str.Value) { STRPos[i] = UsedSTRPos[i2]; break; } } } } if (IO.Format > Main.Format.FT) { IO.Align(0x10); Offset = IO.UIntPosition; IO.Position = 0x80; for (int i = 0; i < Count; i++) { IO.GetOffset(ref POF); IO.WriteEndian(STRPos[i]); IO.WriteEndian(STRs[i].ID); } IO.UIntPosition = Offset; IO.Write(ref POF, 1); CurrentOffset = IO.UIntPosition; IO.WriteEOFC(0); Header.DataSize = (int)(CurrentOffset - 0x40); Header.Signature = 0x41525453; Header.SectionSize = (int)(Offset - 0x40); IO.Position = 0; IO.Write(Header); } else { IO.Position = 0; for (int i = 0; i < Count; i++) { IO.Write(STRPos[i]); } } IO.Close(); }
public void STRWriter(string filepath) { uint Offset = 0; uint CurrentOffset = 0; Stream writer = File.OpenWriter(filepath + (Header. Format > Main.Format.FT ? ".str" : ".bin"), true); writer.Format = Header.Format; POF = new POF(); writer.IsBE = writer.Format == Main.Format.F2BE; long Count = STRs.LongLength; if (writer.Format > Main.Format.FT) { writer.Position = 0x40; writer.WriteEndian(Count); writer.GetOffset(ref POF).WriteEndian(0x80); writer.Position = 0x80; for (int i = 0; i < Count; i++) { writer.GetOffset(ref POF).Write(0x00); writer.WriteEndian(STRs[i].ID); } writer.Align(0x10); } else { for (int i = 0; i < Count; i++) { writer.Write(0x00); } writer.Align(0x20); } KKdList <string> UsedSTR = KKdList <string> .New; KKdList <int> UsedSTRPos = KKdList <int> .New; int[] STRPos = new int[Count]; for (int i1 = 0; i1 < Count; i1++) { if (UsedSTR.Contains(STRs[i1].Str)) { for (int i2 = 0; i2 < Count; i2++) { if (UsedSTR[i2] == STRs[i1].Str) { STRPos[i1] = UsedSTRPos[i2]; break; } } } else { STRPos[i1] = writer.Position; UsedSTRPos.Add(STRPos[i1]); UsedSTR.Add(STRs[i1].Str); writer.Write(STRs[i1].Str); writer.WriteByte(0); } } if (writer.Format > Main.Format.FT) { writer.Align(0x10); Offset = writer.UIntPosition; writer.Position = 0x80; } else { writer.Position = 0; } for (int i1 = 0; i1 < Count; i1++) { writer.WriteEndian(STRPos[i1]); if (writer.Format > Main.Format.FT) { writer.Position += 4; } } if (writer.Format > Main.Format.FT) { writer.UIntPosition = Offset; writer.Write(ref POF, 1); CurrentOffset = writer.UIntPosition; writer.WriteEOFC(0); Header.Lenght = 0x40; Header.DataSize = (int)(CurrentOffset - Header.Lenght); Header.Signature = 0x41525453; Header.SectionSize = (int)(Offset - Header.Lenght); writer.Position = 0; writer.Write(Header); } writer.Close(); }
public void BINWriter(string file) { if (AetSets == null) { return; } if (AetSets.Length == 0) { return; } KKdList <string> setName = KKdList <string> .New; KKdList <string> setFileName = KKdList <string> .New; KKdList <int> ids = KKdList <int> .New; KKdList <int> setIds = KKdList <int> .New; KKdList <int> notAdd = KKdList <int> .New; AET temp; AetSet set; for (i = 0; i < AetSets.Length; i++) { set = AetSets[i]; if (set.Name != null) { if (setName.Contains(set.Name)) { notAdd.Add(i); continue; } else { setName.Add(set.Name); } } if (set.FileName != null) { if (setFileName.Contains(set.FileName)) { notAdd.Add(i); continue; } else { setFileName.Add(set.FileName); } } if (set.NewId) { AetSets[i].Id = null; for (i0 = 0; i0 < set.Aets.Length; i0++) { AetSets[i].Aets[i0].Id = null; } continue; } if (set.Id != null) { if (setIds.Contains((int)set.Id)) { notAdd.Add(i); continue; } else { setIds.Add((int)set.Id); } } for (i0 = 0; i0 < set.Aets.Length; i0++) { temp = set.Aets[i0]; if (temp.Id != null) { if (ids.Contains((int)temp.Id)) { notAdd.Add(i); break; } else { ids.Add((int)temp.Id); } } } } setName.Dispose(); setFileName.Dispose(); for (i = 0; i < AetSets.Length; i++) { set = AetSets[i]; if (notAdd.Contains(i)) { continue; } if (!set.NewId) { continue; } i1 = 0; if (set.Id == null) { while (true) { if (!setIds.Contains(i1)) { AetSets[i].Id = i1; setIds.Add(i1); break; } i1++; } } for (i0 = 0, i1 = 0; i0 < set.Aets.Length; i0++) { if (set.Aets[i0].Id == null) { while (true) { if (!ids.Contains(i1)) { AetSets[i].Aets[i0].Id = i1; ids.Add(i1); break; } i1++; } } } } ids.Dispose(); setIds.Dispose(); for (i = 0, i0 = 0, i2 = 0; i < AetSets.Length; i++) { if (!notAdd.Contains(i)) { i0 += AetSets[i].Aets.Length; i2++; } } i1 = i0 * 12; i1 = i1.A(0x20) + 0x20; s = File.OpenWriter(file + ".bin", true); s.W(i2); s.W(i1); s.W(i0); s.W(0x20); s.W(0x9066906690669066); s.W(0x9066906690669066); s.P = (i1 + i2 * 0x14).A(0x20); for (i = 0; i < AetSets.Length; i++) { if (notAdd.Contains(i)) { continue; } AetSets[i].NameOffset = s.P; s.W(AetSets[i].Name + "\0"); AetSets[i].FileNameOffset = s.P; s.W(AetSets[i].FileName + "\0"); } for (i = 0; i < AetSets.Length; i++) { if (notAdd.Contains(i)) { continue; } for (i0 = 0; i0 < AetSets[i].Aets.Length; i0++) { AetSets[i].Aets[i0].NameOffset = s.P; s.W(AetSets[i].Aets[i0].Name + "\0"); } } s.A(0x08, true); s.P = 0x20; for (i = 0, i2 = 0; i < AetSets.Length; i++) { if (notAdd.Contains(i)) { i2++; continue; } for (i0 = 0; i0 < AetSets[i].Aets.Length; i0++) { s.W(AetSets[i].Aets[i0].Id); s.W(AetSets[i].Aets[i0].NameOffset); s.W((ushort)i0); s.W((ushort)(i - i2)); } } s.A(0x20); for (i = 0, i2 = 0; i < AetSets.Length; i++) { if (notAdd.Contains(i)) { i2++; continue; } s.W(AetSets[i].Id); s.W(AetSets[i].NameOffset); s.W(AetSets[i].FileNameOffset); s.W(i - i2); s.W(AetSets[i].SpriteSetId); } notAdd.Dispose(); s.C(); }
public void STRWriter(string filepath) { if (Strings == null || Strings.Length == 0 || header.Format > Format.F2) { return; } uint offset = 0; uint currentOffset = 0; Format format = header.Format; s = File.OpenWriter(filepath + (header.Format > Format.AFT && header.Format < Format.FT ? ".str" : ".bin"), true); s.Format = header.Format; s.IsBE = header.UseBigEndian; pof.Offsets = KKdList <long> .New; long count = Strings.LongLength; if (s.Format > Format.AFT && s.Format < Format.FT) { s.P = 0x40; s.WX(count, ref pof); s.WX(0x80); s.P = 0x80; for (int i = 0; i < count; i++) { s.W(0x00L); } } else { for (int i = 0; i < count; i++) { s.W(0x00); } } s.A(0x10); KKdList <string> usedSTR = KKdList <string> .New; KKdList <int> usedSTRPos = KKdList <int> .New; int[] STRPos = new int[count]; for (int i = 0; i < count; i++) { if (usedSTR.Contains(Strings[i].Str.V)) { for (int i2 = 0; i2 < count; i2++) { if (usedSTR[i2] == Strings[i].Str.V) { STRPos[i] = usedSTRPos[i2]; break; } } } else { usedSTRPos.Add(STRPos[i] = s.P); usedSTR.Add(Strings[i].Str.V); s.W(Strings[i].Str.V); s.W((byte)0); if (format < Format.F) { s.A(0x8); } } } s.A(0x4); s.L = s.P; if (s.Format > Format.AFT) { s.A(0x10); offset = s.PU32; s.P = 0x80; for (int i = 0; i < count; i++) { pof.Offsets.Add(s.P); s.WE(STRPos[i]); s.WE(Strings[i].ID); } s.PU32 = offset; s.W(pof, false, 1); s.WEOFC(1); currentOffset = s.PU32; s.WEOFC(); header.DataSize = currentOffset - 0x40; header.Signature = 0x41525453; header.SectionSize = offset - 0x40; header.UseSectionSize = true; s.P = 0; s.W(header, true); } else { s.P = 0; s.IsBE = header.Format < Format.F; for (int i = 0; i < count; i++) { s.WE(STRPos[i]); } } s.C(); }
private static Struct ReadStruct(ref Stream stream, Header Header) { Struct Struct = new Struct { Header = Header, DataOffset = stream.Position, Data = stream.ReadBytes(Header.SectionSize) }; int ID = Header.ID; KKdList <Struct> SubStructs = KKdList <Struct> .New; long Length = stream.Length - stream.Position; long Position = 0; while (Length > Position) { Header = stream.ReadHeader(false); Position += Header.Length + Header.DataSize; if (Header.ID == ID && Header.Signature == 0x43464F45) { Struct.HasEOFC = true; break; } else if (Header.ID == 0 && Header.Signature == 0x53524E45) { SubStructs.Add(new Struct { Header = Header, DataOffset = stream.Position, Data = stream.ReadBytes(Header.SectionSize) }); } else if (Header.ID <= ID) { stream.LongPosition -= Header.Length; break; } else { SubStructs.Add(ReadStruct(ref stream, Header)); } //(Header.Signature == 0x30464F50 || Header.Signature == // 0x31464F50 || Header.Signature == 0x53524E45) } for (int i = 0; i < SubStructs.Capacity; i++) { string Sig = SubStructs[i].Header.ToString(); if (Sig == "ENRS" || Sig == "POF0" || Sig == "POF1") { if (Sig == "ENRS") { Struct.ENRS = (Mini)SubStructs[i]; } else { Struct.POF = (Mini)SubStructs[i]; } SubStructs.RemoveAt(i); SubStructs.Capacity--; i--; } } if (SubStructs.Capacity > 0) { Struct.SubStructs = SubStructs.ToArray(); } return(Struct); }