static void SortWriter(string Template, string Origin, int I1, UID[] UID, ref KKtIO writer) { for (byte i0 = 0; i0 < 10; i0++) { int i = int.Parse(Origin + i0.ToString()); if (UID.Length > i) { if (UID[i].Category != "") { writer.Write(Template + i + ".category=" + UID[i].Category + "\n"); } if (UID[i].Size != -1) { writer.Write(Template + i + ".size=" + UID[i].Size + "\n"); } if (UID[i].Value != "") { writer.Write(Template + i + ".value=" + UID[i].Value + "\n"); } } else { break; } if (UID.Length > I1 && i != 0) { SortWriter(Template, i.ToString(), I1 * 10, UID, ref writer); } } }
void CompressStuff(int i, ref FARCFile[] Files, ref KKtIO writer) { Files[i].Offset = (int)writer.Position; if (Signature == Farc.FArc) { KKtIO reader = KKtIO.OpenReader(Files[i].Name); writer.Write(reader.ReadBytes((int)reader.Length)); Files[i].SizeUnc = (int)reader.Length; } else { Files[i].Data = File.ReadAllBytes(Files[i].Name); if (Signature != Farc.FArc) { MemoryStream stream = new MemoryStream(); using (GZipStream gZipStream = new GZipStream(stream, CompressionMode.Compress)) gZipStream.Write(Files[i].Data, 0, Files[i].Data.Length); Files[i].SizeUnc = Files[i].Data.Length; Files[i].Data = stream.ToArray(); Files[i].SizeComp = Files[i].Data.Length; } else if (Signature == Farc.FARC) { int AlignData = (int)Main.Align(Files[i].Data.Length, 0x40); byte[] Data = new byte[AlignData]; for (int i1 = 0; i1 < Files[i].Data.Length; i1++) { Data[i1] = Files[i].Data[i1]; } for (int i1 = Files[i].Data.Length; i1 < AlignData; i1++) { Data[i1] = 0x78; } Files[i].Data = Encrypt(Data, false); } writer.Write(Files[i].Data); Files[i].Data = null; } if (Signature != Farc.FARC) { int Align = (int)Main.Align(writer.Position, 0x20) - (int)writer.Position; for (int i1 = 0; i1 < Align; i1++) { if (Signature == Farc.FArc) { writer.Write((byte)0x00); } else { writer.Write((byte)0x78); } } } }
void HeaderReader(int HeaderLenght, ref FARCFile[] Files, ref KKtIO reader) { if (Files == null) { int Count = 0; long Position = reader.BaseStream.Position; while (reader.BaseStream.Position < HeaderLenght) { reader.NullTerminated(0x00); reader.ReadInt32(); if (Signature != Farc.FArc) { reader.ReadInt32(); } reader.ReadInt32(); if (Signature == Farc.FARC && FT) { reader.ReadInt32(); } Count++; } reader.Seek(Position, 0); Files = new FARCFile[Count]; } int LocalMode = 0; for (int i = 0; i < Files.Length; i++) { Files[i].Name = Text.ToUTF8(reader.NullTerminated(0x00)); Files[i].Offset = reader.ReadInt32Endian(true); if (Signature != Farc.FArc) { Files[i].SizeComp = reader.ReadInt32Endian(true); } Files[i].SizeUnc = reader.ReadInt32Endian(true); if (Signature == Farc.FARC && FT) { LocalMode = reader.ReadInt32Endian(true); Files[i].GZip = (LocalMode & 2) == 2; Files[i].ECB = (LocalMode & 4) == 4; } } }
public static void Encrypt(int I, string file) { KKtIO reader = KKtIO.OpenReader(file); if (reader.ReadInt64() == 0x454C494641564944) { reader.Close(); Decrypt(I, file); } else { Console.Title = "PD_Tool: DIVAFILE Encryptor - File: " + Path.GetFileName(file); int FileLenghtOrigin = (int)reader.Length; int FileLenght = (int)KKtMain.Align((long)FileLenghtOrigin, 16); reader.Close(); byte[] In = File.ReadAllBytes(file); byte[] Inalign = new byte[FileLenght]; for (int i = 0; i < In.Length; i++) { Inalign[i] = In[i]; } In = null; byte[] encrypted = new byte[FileLenght]; using (AesManaged crypto = new AesManaged()) { crypto.Key = Key; crypto.IV = new byte[16]; crypto.Mode = CipherMode.ECB; crypto.Padding = PaddingMode.Zeros; using (CryptoStream cryptoData = new CryptoStream(new MemoryStream(Inalign), crypto.CreateEncryptor(crypto.Key, crypto.IV), CryptoStreamMode.Read)) cryptoData.Read(encrypted, 0, FileLenght); } KKtIO writer = KKtIO.OpenWriter(file, Inalign.Length); writer.Write(0x454C494641564944); writer.Write(FileLenght); writer.Write(FileLenghtOrigin); writer.Write(encrypted); writer.Close(); } Console.Title = "PD_Tool"; }
static void DIVAFILEEncDec(int I, string file, int code) { if (File.Exists(file)) { KKtIO reader = KKtIO.OpenReader(file); string header = reader.ReadString(8); reader.Close(); Console.Clear(); switch (function) { case "3": if (header.ToUpper() == "DIVAFILE") { DIVAFILE.Decrypt(I, file); } else if (code == 1) { Console.WriteLine("This file isn't DIVAFILE, FARC Archive or F2nd/X DSC."); } else { ReturnCode = 81; } break; case "4": if (code != 1) { DIVAFILE.Encrypt(I, file); } break; } } else { Console.WriteLine("File {0} doesn't exist!", file); } }
public static void BINWriter(ref AUTH Data, string file) { DateTime date = DateTime.Now; KKtIO writer = KKtIO.OpenWriter(file + ".bin", true); writer.Write("#A3DA__________\n"); writer.Write("#" + KKtMain.ToTitleCase(date.ToString("ddd")) + " " + KKtMain. ToTitleCase(date.ToString("MMM")) + " " + date.ToString("dd HH:mm:ss yyyy") + "\n"); if (Data.Category != null) { SortWriter("category.", "", 10, Data.Category, ref writer); writer.Write("category.length=" + Data.Category.Length.ToString() + "\n"); } if (Data.UID != null) { SortWriter("uid.", "", 10, Data.UID, ref writer); writer.Write("uid.length=" + Data.UID.Length.ToString() + "\n"); } writer.Close(); }
public static void Decrypt(int I, string file) { KKtIO reader = KKtIO.OpenReader(file); if (reader.ReadInt64() != 0x454C494641564944) { reader.Close(); Encrypt(I, file); } else { Console.Title = "PD_Tool: DIVAFILE Decryptor - File: " + Path.GetFileName(file); reader.ReadUInt32(); int StreamLenght = (int)reader.Length; int FileLenght = reader.ReadInt32(); byte[] decrypted = new byte[StreamLenght]; reader.Seek(0, 0); using (AesManaged crypto = new AesManaged()) { crypto.Key = Key; crypto.IV = new byte[16]; crypto.Mode = CipherMode.ECB; crypto.Padding = PaddingMode.Zeros; using (CryptoStream cryptoData = new CryptoStream(reader.BaseStream, crypto.CreateDecryptor(crypto.Key, crypto.IV), CryptoStreamMode.Read)) cryptoData.Read(decrypted, 0, StreamLenght); } KKtIO writer = KKtIO.OpenWriter(file, FileLenght); for (int i = 0x10; i < StreamLenght && i < FileLenght + 0x10; i++) { writer.Write(decrypted[i]); } writer.Close(); } Console.Title = "PD_Tool"; }
static void SortWriter(string Template, string Origin, int I1, string[] Data, ref KKtIO writer) { for (byte i0 = 0; i0 < 10; i0++) { int i = int.Parse(Origin + i0.ToString()); if (Data.Length > i) { writer.Write(Template + i + ".value=" + Data + "\n"); } else { break; } if (Data.Length > I1 && i != 0) { SortWriter(Template, i.ToString(), I1 * 10, Data, ref writer); } } }
public static int BINReader(ref AUTH Data, string file) { Data = new AUTH { dataArray = new string[4], Name = new List <string>(), Value = new List <string>() }; KKtIO reader = KKtIO.OpenReader(file + ".bin"); reader.Format = KKtMain.Format.F; Data.Signature = reader.ReadInt32(); if (Data.Signature != 0x44334123) { return(0); } Data.Signature = reader.ReadInt32(); if (Data.Signature != 0x5F5F5F41) { return(0); } reader.ReadInt64(); byte[] STRData = reader.ReadBytes((int)(reader.Length - reader.Position)); string TempSTRData = ""; foreach (byte a in STRData) { if (a == 0x0A) { if (!TempSTRData.StartsWith("#")) { Data.dataArray = TempSTRData.Split('='); Data.Name.Add(Data.dataArray[0]); Data.Value.Add(Data.dataArray[1]); } TempSTRData = ""; } else { TempSTRData += Convert.ToChar(a); } } for (int i = 0; i < Data.Name.Count; i++) { if (Data.Name[i] == "category.length") { Data.Category = new string[int.Parse(Data.Value[i])]; } else if (Data.Name[i] == "uid.length") { Data.UID = new UID[int.Parse(Data.Value[i])]; } } if (Data.Category != null) { for (int i0 = 0; i0 < Data.Category.Length; i0++) { for (int i = 0; i < Data.Name.Count; i++) { if (Data.Name[i] == "category." + i0 + ".value") { Data.Category[i0] = Data.Value[i]; } } } } if (Data.UID != null) { for (int i0 = 0; i0 < Data.UID.Length; i0++) { Data.UID[i0].Category = ""; Data.UID[i0].Size = -1; Data.UID[i0].Value = ""; for (int i = 0; i < Data.Name.Count; i++) { if (Data.Name[i] == "uid." + i0 + ".category") { Data.UID[i0].Category = Data.Value[i]; } else if (Data.Name[i] == "uid." + i0 + ".size") { Data.UID[i0].Size = int.Parse(Data.Value[i]); } else if (Data.Name[i] == "uid." + i0 + ".value") { Data.UID[i0].Value = Data.Value[i]; } } } } reader.Close(); return(1); }
public int DEXReader() { KKtIO reader = KKtIO.OpenReader(filepath + ext); Header = new KKtMain.Header(); Header.Format = KKtMain.Format.F; Header.Signature = reader.ReadInt32(); if (Header.Signature == 0x43505845) { Header = reader.ReadHeader(true); } if (Header.Signature != 0x64) { return(0); } Offset = reader.Position - 0x4; DEX = new EXP[reader.ReadInt32()]; int DEXOffset = reader.ReadInt32(); if (reader.ReadInt32() == 0x00) { Header.Format = KKtMain.Format.X; } reader.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 = reader.ReadInt32(); if (Header.Format == KKtMain.Format.X) { reader.ReadInt32(); } DEX[i0].EyesOffset = reader.ReadInt32(); if (Header.Format == KKtMain.Format.X) { reader.ReadInt32(); } } for (int i0 = 0; i0 < DEX.Length; i0++) { DEX[i0].NameOffset = reader.ReadInt32(); if (Header.Format == KKtMain.Format.X) { reader.ReadInt32(); } } for (int i0 = 0; i0 < DEX.Length; i0++) { EXPElement element = new EXPElement(); reader.Seek(DEX[i0].MainOffset + Offset, 0); while (true) { element.Frame = reader.ReadSingle(); element.Both = reader.ReadUInt16(); element.ID = reader.ReadUInt16(); element.Value = reader.ReadSingle(); element.Trans = reader.ReadSingle(); DEX[i0].Main.Add(element); if (element.Frame == 999999 || element.Both == 0xFFFF) { break; } } reader.Seek(DEX[i0].EyesOffset + Offset, 0); while (true) { element.Frame = reader.ReadSingle(); element.Both = reader.ReadUInt16(); element.ID = reader.ReadUInt16(); element.Value = reader.ReadSingle(); element.Trans = reader.ReadSingle(); DEX[i0].Eyes.Add(element); if (element.Frame == 999999 || element.Both == 0xFFFF) { break; } } reader.Seek(DEX[i0].NameOffset + Offset, 0); DEX[i0].Name = KKtText.ToUTF8(reader.NullTerminated()); } reader.Close(); return(1); }
public void DEXWriter() { KKtIO writer = KKtIO.OpenWriter(filepath + (Header.Format > KKtMain.Format.F ? ".dex" : ".bin"), true); writer.Format = Header.Format; if (writer.Format > KKtMain.Format.F) { Header.Lenght = 0x20; Header.DataSize = 0x00; Header.Signature = 0x43505845; Header.SectionSize = 0x00; writer.Write(Header); } writer.Write(0x64); writer.Write(DEX.Length); if (Header.Format == KKtMain.Format.X) { writer.Write(0x28); writer.Write(0x00); writer.Write(0x18 + (int)KKtMain.Align(DEX.Length * 3 * 8, 0x10)); writer.Write(0x00); writer.Seek(KKtMain.Align(DEX.Length * 3 * 8, 0x10) + 0x20 + Header.Lenght, 0); } else { writer.Write(0x20); writer.Write(0x10 + (int)KKtMain.Align(DEX.Length * 3 * 4, 0x10)); writer.Seek(KKtMain.Align(DEX.Length * 3 * 4, 0x10) + 0x30 + Header.Lenght, 0); } for (int i0 = 0; i0 < DEX.Length; i0++) { DEX[i0].MainOffset = writer.Position - Header.Lenght; for (int i1 = 0; i1 < DEX[i0].Main.Count; i1++) { writer.Write((float)DEX[i0].Main[i1].Frame); writer.Write(DEX[i0].Main[i1].Both); writer.Write(DEX[i0].Main[i1].ID); writer.Write((float)DEX[i0].Main[i1].Value); writer.Write((float)DEX[i0].Main[i1].Trans); } writer.Align(0x20, true); DEX[i0].EyesOffset = writer.Position - Header.Lenght; for (int i1 = 0; i1 < DEX[i0].Eyes.Count; i1++) { writer.Write((float)DEX[i0].Eyes[i1].Frame); writer.Write(DEX[i0].Eyes[i1].Both); writer.Write(DEX[i0].Eyes[i1].ID); writer.Write((float)DEX[i0].Eyes[i1].Value); writer.Write((float)DEX[i0].Eyes[i1].Trans); } writer.Align(0x20, true); } for (int i0 = 0; i0 < DEX.Length; i0++) { DEX[i0].NameOffset = writer.Position - Header.Lenght; writer.Write(DEX[i0].Name + "\0"); } writer.Align(0x10, true); if (Header.Format == KKtMain.Format.X) { writer.Seek(Header.Lenght + 0x28, 0); } else { writer.Seek(Header.Lenght + 0x20, 0); } for (int i0 = 0; i0 < DEX.Length; i0++) { writer.Write(DEX[i0].MainOffset); if (Header.Format == KKtMain.Format.X) { writer.Write(0x00); } writer.Write(DEX[i0].EyesOffset); if (Header.Format == KKtMain.Format.X) { writer.Write(0x00); } } for (int i0 = 0; i0 < DEX.Length; i0++) { writer.Write(DEX[i0].NameOffset); if (Header.Format == KKtMain.Format.X) { writer.Write(0x00); } } if (writer.Format > KKtMain.Format.F) { Offset = writer.Length - Header.Lenght; writer.Seek(writer.Length, 0); writer.WriteEOFC(0); writer.Seek(0, 0); Header.DataSize = Offset; Header.SectionSize = Offset; writer.Write(Header); } writer.Close(); }
public void UnPack(string file, bool SaveToDisk) { Files = null; Signature = Farc.FArC; FT = false; Console.Title = "PD_Tool: FARC Extractor - Archive: " + Path.GetFileName(file); if (File.Exists(file)) { KKtIO reader = KKtIO.OpenReader(file); string directory = Path.GetFullPath(file).Replace(Path.GetExtension(file), ""); Signature = (Farc)reader.ReadInt32Endian(true); if (Signature == Farc.FARC) { Directory.CreateDirectory(directory); int HeaderLenght = reader.ReadInt32Endian(true); int Mode = reader.ReadInt32Endian(true); reader.ReadUInt32(); bool GZip = (Mode & 2) == 2; bool ECB = (Mode & 4) == 4; int FARCType = reader.ReadInt32Endian(true); FT = FARCType == 0x10; bool CBC = !FT && FARCType != 0x40; if (ECB && CBC) { byte[] Header = new byte[HeaderLenght - 0x08]; FT = true; reader.Close(); FileStream stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); stream.Seek(0x10, 0); using (CryptoStream cryptoStream = new CryptoStream(stream, GetAes(true, null).CreateDecryptor(), CryptoStreamMode.Read)) cryptoStream.Read(Header, 0x00, HeaderLenght - 0x08); Header = SkipData(Header, 0x10); KKtIO CBCreader = new KKtIO(new MemoryStream(Header)); CBCreader.BaseStream.Seek(0, 0); FARCType = CBCreader.ReadInt32Endian(true); FT = FARCType == 0x10; if (CBCreader.ReadInt32Endian(true) == 1) { Files = new FARCFile[CBCreader.ReadInt32Endian(true)]; } CBCreader.ReadUInt32(); HeaderReader(HeaderLenght, ref Files, ref CBCreader); CBCreader.Close(); } else { if (reader.ReadInt32Endian(true) == 1) { Files = new FARCFile[reader.ReadInt32Endian(true)]; } reader.ReadUInt32(); HeaderReader(HeaderLenght, ref Files, ref reader); reader.Close(); } for (int i = 0; i < Files.Length; i++) { int FileSize = ECB || Files[i].ECB ? (int)Main. Align(Files[i].SizeComp, 0x10) : Files[i].SizeComp; FileStream stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); stream.Seek(Files[i].Offset, 0); Files[i].Data = new byte[FileSize]; bool Encrypted = false; if (ECB) { if ((FT && Files[i].ECB) || CBC) { using (CryptoStream cryptoStream = new CryptoStream(stream, GetAes(true, null).CreateDecryptor(), CryptoStreamMode.Read)) cryptoStream.Read(Files[i].Data, 0, FileSize); Files[i].Data = SkipData(Files[i].Data, 0x10); } else { using (CryptoStream cryptoStream = new CryptoStream(stream, GetAes(false, null).CreateDecryptor(), CryptoStreamMode.Read)) cryptoStream.Read(Files[i].Data, 0, FileSize); } Encrypted = true; } bool Compressed = false; bool LocalGZip = (FT && Files[i].GZip) || GZip && Files[i].SizeUnc != 0; if (LocalGZip) { GZipStream gZipStream; if (Encrypted) { gZipStream = new GZipStream(new MemoryStream( Files[i].Data), CompressionMode.Decompress); stream.Close(); } else { gZipStream = new GZipStream(stream, CompressionMode.Decompress); } Files[i].Data = new byte[Files[i].SizeUnc]; gZipStream.Read(Files[i].Data, 0, Files[i].SizeUnc); Compressed = true; } if (!Encrypted && !Compressed) { Files[i].Data = new byte[Files[i].SizeUnc]; stream.Read(Files[i].Data, 0, Files[i].SizeUnc); stream.Close(); } if (SaveToDisk) { KKtIO writer = KKtIO.OpenWriter(Path.Combine(directory, Files[i].Name), true); writer.Write(Files[i].Data); writer.Close(); Files[i].Data = null; } } } else if (Signature == Farc.FArC) { Directory.CreateDirectory(directory); int HeaderLength = reader.ReadInt32Endian(true); reader.ReadUInt32(); HeaderReader(HeaderLength, ref Files, ref reader); reader.Close(); for (int i = 0; i < Files.Length; i++) { FileStream stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); stream.Seek(Files[i].Offset, 0); Files[i].Data = new byte[Files[i].SizeComp]; stream.Read(Files[i].Data, 0, Files[i].SizeComp); stream.Close(); using (MemoryStream memorystream = new MemoryStream(Files[i].Data)) { GZipStream gZipStream = new GZipStream(memorystream, CompressionMode.Decompress); Files[i].Data = new byte[Files[i].SizeUnc]; gZipStream.Read(Files[i].Data, 0, Files[i].SizeUnc); } KKtIO writer = KKtIO.OpenWriter(Path.Combine(directory, Files[i].Name), true); writer.Write(Files[i].Data); writer.Close(); Files[i].Data = null; } } else if (Signature == Farc.FArc) { Directory.CreateDirectory(directory); int HeaderLength = reader.ReadInt32Endian(true); reader.ReadUInt32(); HeaderReader(HeaderLength, ref Files, ref reader); for (int i = 0; i < Files.Length; i++) { FileStream stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); stream.Seek(Files[i].Offset, 0); Files[i].Data = new byte[Files[i].SizeUnc]; stream.Read(Files[i].Data, 0, Files[i].SizeUnc); stream.Close(); KKtIO writer = KKtIO.OpenWriter(Path.Combine(directory, Files[i].Name), true); writer.Write(Files[i].Data); writer.Close(); Files[i].Data = null; } } else { Console.WriteLine("Unknown signature"); reader.Close(); } } else { Console.WriteLine("File {0} doesn't exist.", Path.GetFileName(file)); } Console.Clear(); Console.Title = "PD_Tool: FARC Extractor"; }
public void Pack(string file) { Files = null; FT = false; string[] files = Directory.GetFiles(file); Files = new FARCFile[files.Length]; for (int i = 0; i < files.Length; i++) { Files[i] = new FARCFile { Name = files[i] }; string ext = Path.GetExtension(files[i]).ToLower(); if (ext == ".a3da" || ext == ".mot" || ext == ".vag") { Signature = Farc.FArc; } } files = null; KKtIO writer = KKtIO.OpenWriter(file + ".farc", true); if (Signature == Farc.FArc) { writer.Write(Text.ToASCII("FArc")); } else if (Signature == Farc.FArC) { writer.Write(Text.ToASCII("FArC")); } else { writer.Write(Text.ToASCII("FARC")); } KKtIO HeaderWriter = new KKtIO(new MemoryStream()); for (int i = 0; i < 3; i++) { HeaderWriter.Write((byte)0x00); } if (Signature == Farc.FArc) { HeaderWriter.Write((byte)0x20); } else if (Signature == Farc.FArC) { HeaderWriter.Write((byte)0x10); } else if (Signature == Farc.FARC) { HeaderWriter.Write((byte)0x06); for (int i = 0; i < 7; i++) { HeaderWriter.Write((byte)0x00); } HeaderWriter.Write((byte)0x40); for (int i = 0; i < 8; i++) { HeaderWriter.Write((byte)0x00); } } for (int i = 0; i < Files.Length; i++) { for (int i1 = 0; i1 < Path.GetFileName(Files[i].Name).Length + (Signature == Farc.FArc ? 0x09 : 0x0D); i1++) { HeaderWriter.Write((byte)0x00); } } writer.WriteEndian((uint)HeaderWriter.Length, true); writer.Write(HeaderWriter.ToArray()); HeaderWriter = null; int Align = (int)Main.Align(writer.Position, 0x10) - (int)writer.Position; for (int i1 = 0; i1 < Align; i1++) { if (Signature == Farc.FArc) { writer.Write((byte)0x00); } else { writer.Write((byte)0x78); } } for (int i = 0; i < Files.Length; i++) { CompressStuff(i, ref Files, ref writer); } if (Signature == Farc.FARC) { writer.Seek(0x1C, 0); } else { writer.Seek(0x0C, 0); } for (int i = 0; i < Files.Length; i++) { writer.Write(Text.ToUTF8(Path.GetFileName(Files[i].Name) + "\0")); writer.WriteEndian(Files[i].Offset, true); if (Signature != Farc.FArc) { writer.WriteEndian(Files[i].SizeComp, true); } writer.WriteEndian(Files[i].SizeUnc, true); } writer.Close(); }
public int STRReader() { KKtIO reader = KKtIO.OpenReader(filepath + ext); reader.Format = KKtMain.Format.F; Header.Signature = reader.ReadInt32(); if (Header.Signature == 0x41525453) { Header = reader.ReadHeader(true); STR = new List <String>(); POF = KKtMain.AddPOF(Header); reader.Position = Header.Lenght; Count = reader.ReadInt32Endian(); Offset = reader.ReadInt32Endian(); if (Offset == 0) { Offset = Count; OffsetX = reader.ReadInt64(); Count = reader.ReadInt64(); reader.XOffset = Header.Lenght; reader.Format = KKtMain.Format.X; } reader.LongPosition = reader.IsX ? Offset + reader.XOffset : Offset; for (int i = 0; i < Count; i++) { String Str = new String { StrOffset = reader.GetOffset(ref POF).ReadInt32Endian(), ID = reader.ReadInt32Endian() }; if (reader.IsX) { Str.StrOffset += (int)OffsetX; } STR.Add(Str); } for (int i = 0; i < Count; i++) { reader.LongPosition = STR[i].StrOffset + (reader.IsX ? reader.XOffset : 0); STR[i] = new String { ID = STR[i].ID, Str = KKtText. ToUTF8(reader.NullTerminated()), StrOffset = STR[i].StrOffset }; } reader.Seek(POF.Offset, 0); reader.ReadPOF(ref POF); } else { reader.Seek(-4, (SeekOrigin)1); int i = 0; STR = new List <String>(); while (reader.LongPosition > 0 && reader.LongPosition < reader.LongLength) { int a = reader.ReadInt32(); if (a != 0) { reader.Seek(-4, (SeekOrigin)1); STR.Add(new String { Str = KKtText.ToUTF8(reader.NullTerminated()), ID = i }); i++; } else { break; } } Count = STR.Count; } reader.Close(); return(1); }
public void STRWriter() { uint Offset = 0; uint CurrentOffset = 0; KKtIO writer = KKtIO.OpenWriter(filepath + ((int)Header.Format > 5 ? ".str" : ".bin"), true); writer.Format = Header.Format; POF = new KKtMain.POF { Offsets = new List <int>(), POFOffsets = new List <long>() }; writer.IsBE = writer.Format == KKtMain.Format.F2BE; if ((int)writer.Format > 1) { writer.Seek(0x40, 0); writer.WriteEndian(Count); writer.GetOffset(ref POF).WriteEndian(0x80); writer.Seek(0x80, 0); for (int i = 0; i < STR.Count; i++) { writer.GetOffset(ref POF).Write(0x00); writer.WriteEndian(STR[i].ID); } writer.Align(16); } else { for (int i = 0; i < Count; i++) { writer.Write(0x00); } writer.Align(32); } List <string> UsedSTR = new List <string>(); List <int> UsedSTRPos = new List <int>(); int[] STRPos = new int[Count]; for (int i1 = 0; i1 < Count; i1++) { if (UsedSTR.Contains(STR[i1].Str)) { for (int i2 = 0; i2 < Count; i2++) { if (UsedSTR[i2] == STR[i1].Str) { STRPos[i1] = UsedSTRPos[i2]; break; } } } else { STRPos[i1] = (int)writer.Position; UsedSTRPos.Add(STRPos[i1]); UsedSTR.Add(STR[i1].Str); writer.Write(STR[i1].Str + "\0"); } } if (writer.Format > KKtMain.Format.F) { writer.Align(16); Offset = (uint)writer.Position; writer.Seek(0x80, 0); } else { writer.Seek(0, 0); } for (int i1 = 0; i1 < Count; i1++) { writer.WriteEndian(STRPos[i1]); if (writer.Format > KKtMain.Format.F) { writer.Seek(4, (SeekOrigin)1); } } if (writer.Format > KKtMain.Format.F) { writer.Seek(Offset, 0); writer.Write(ref POF, 1); CurrentOffset = (uint)writer.Length; writer.WriteEOFC(0); Header.IsBE = writer.IsBE; Header.Lenght = 0x40; Header.DataSize = (int)(CurrentOffset - Header.Lenght); Header.Signature = 0x41525453; Header.SectionSize = (int)(Offset - Header.Lenght); writer.Seek(0, 0); writer.Write(Header); } writer.Close(); }