/// <summary> /// Parses the object table. /// </summary> /// <param name="indexBytes">The index file to read.</param> private void zobjParser(byte[] indexBytes) { int index = 8; while (index < indexBytes.Length) { string chunkType = ""; byte[] chunkType_byte = new byte[4]; byte[] chunkSize = new byte[4]; int chunkSize_int; // Get the chunk type int i = index; for (; index < i + 4; index++) { chunkType_byte[index - i] = indexBytes[index]; } chunkType = System.Text.Encoding.Default.GetString(chunkType_byte.Reverse().ToArray()); // Get the chunk size i = index; for (; index < i + 4; index++) { chunkSize[index - i] = indexBytes[index]; } chunkSize_int = BitConverter.ToInt32(chunkSize.Reverse().ToArray(), 0); // Get the raw data byte[] chunkRawData = new byte[chunkSize_int]; i = index; for (; index < i + chunkSize_int; index++) { chunkRawData[index - i] = indexBytes[index]; } switch (chunkType) { case "ZOBJ": zobject = new IndexObject(); zobjHelper(chunkRawData); break; default: break; } } }
/// <summary> /// Constructor for the class. Sets the in-class parser information. /// </summary> /// <param name="parser"></param> public IndexWriter(IndexParser parser) { engTable = parser.engParser; freTable = parser.freParser; japTable = parser.japParser; gerTable = parser.gerParser; itaTable = parser.itaParser; espTable = parser.espParser; indexObject = parser.zobject; // Initialize all lists. engTable_keys_byte = new List <byte>(); japTable_keys_byte = new List <byte>(); itaTable_keys_byte = new List <byte>(); freTable_keys_byte = new List <byte>(); espTable_keys_byte = new List <byte>(); gerTable_keys_byte = new List <byte>(); engTable_strings_byte = new List <byte>(); japTable_strings_byte = new List <byte>(); itaTable_strings_byte = new List <byte>(); freTable_strings_byte = new List <byte>(); espTable_strings_byte = new List <byte>(); gerTable_strings_byte = new List <byte>(); index_byte = new List <byte>(); // Write out all string tables. engTable_byte = WriteTable(engTable, 0); freTable_byte = WriteTable(freTable, 1); japTable_byte = WriteTable(japTable, 2); gerTable_byte = WriteTable(gerTable, 3); itaTable_byte = WriteTable(itaTable, 4); espTable_byte = WriteTable(espTable, 5); // Write out the ZOBJ section. zobject_final = WriteObject(indexObject); // Write the index section of the file. WriteIndex(); // Write the final goddamn file WriteFile(); }
/// <summary> /// Writes out the object section of the index file. /// </summary> /// <param name="indexObject">The struct representation of the object.</param> private List <byte> WriteObject(IndexObject indexObject) { List <byte> zobject_byte = new List <byte>(); List <byte> zobject_24entry = new List <byte>(); List <byte> zobject_filepath = new List <byte>(); // Add header bytes zobject_byte.Add(BitConverter.GetBytes('J')[0]); zobject_byte.Add(BitConverter.GetBytes('B')[0]); zobject_byte.Add(BitConverter.GetBytes('O')[0]); zobject_byte.Add(BitConverter.GetBytes('Z')[0]); // Add zeroed data, fill it later for (int i = 0; i < 4; i++) { zobject_byte.Add(0x0); } // Add the index key byte[] indexKey_byte = BitConverter.GetBytes(indexObject.indexKey).Reverse().ToArray(); for (int i = 0; i < indexKey_byte.Length; i++) { zobject_byte.Add(indexKey_byte[i]); } // Add the object key byte[] objectKey_byte = BitConverter.GetBytes(indexObject.objectKey).Reverse().ToArray(); for (int i = 0; i < objectKey_byte.Length; i++) { zobject_byte.Add(objectKey_byte[i]); } // Add the type string key byte[] typeStringKey_byte = BitConverter.GetBytes(indexObject.typeStringKey).Reverse().ToArray(); for (int i = 0; i < typeStringKey_byte.Length; i++) { zobject_byte.Add(typeStringKey_byte[i]); } // Add zeroed data for (int i = 0; i < 8; i++) { zobject_byte.Add(0x0); } // Add the DLC Number byte[] dlcNum_byte = BitConverter.GetBytes(indexObject.dlcNum).Reverse().ToArray(); for (int i = 0; i < dlcNum_byte.Length; i++) { zobject_byte.Add(dlcNum_byte[i]); } // Add the number of entries to write byte[] numEntries_byte = BitConverter.GetBytes(indexObject.numEntries).Reverse().ToArray(); for (int i = 0; i < numEntries_byte.Length; i++) { zobject_byte.Add(numEntries_byte[i]); } // Add the constant value for (int i = 0; i < 4; i++) { switch (i) { case 3: zobject_byte.Add(0x4); break; default: zobject_byte.Add(0x0); break; } } // Add all entries. int counter = indexObject.numEntries - 1; int entryNum = 0; foreach (IndexEntry entry in indexObject.entryList) { // Write tag byte[] tagKey_byte = BitConverter.GetBytes(entry.tagKey).Reverse().ToArray(); for (int i = 0; i < tagKey_byte.Length; i++) { zobject_24entry.Add(tagKey_byte[i]); } // Write second key byte[] regularKey_byte = BitConverter.GetBytes(entry.regularKey).Reverse().ToArray(); for (int i = 0; i < regularKey_byte.Length; i++) { zobject_24entry.Add(regularKey_byte[i]); } // Add decimal for (int i = 0; i < 4; i++) { switch (i) { case 3: if (counter == 0) { zobject_24entry.Add(0x2); } else { zobject_24entry.Add(0x1); } break; default: zobject_24entry.Add(0x0); break; } } // Calculate offset int offset = (counter * 24) + (entryNum * 248) + 4; // Write offset byte[] offset_byte = BitConverter.GetBytes(offset).Reverse().ToArray(); for (int i = 0; i < offset_byte.Length; i++) { zobject_24entry.Add(offset_byte[i]); } // Write data to entry list byte[] stringKey_byte = BitConverter.GetBytes(entry.stringKey).Reverse().ToArray(); for (int i = 0; i < stringKey_byte.Length; i++) { zobject_filepath.Add(stringKey_byte[i]); } // Write filepath to entry list byte[] filePath_byte = System.Text.Encoding.Unicode.GetBytes(entry.filepath); for (int i = 0; i < filePath_byte.Length; i += 2) { zobject_filepath.Add(filePath_byte[i]); } // Write zeroed data for (int i = 0; i < (248 - entry.filepath.Length - 8); i++) { zobject_filepath.Add(0x0); } counter--; } // Concatenate the lists foreach (byte entry in zobject_24entry) { zobject_byte.Add(entry); } foreach (byte entry in zobject_filepath) { zobject_byte.Add(entry); } byte[] realSize = BitConverter.GetBytes(zobject_byte.Count - 8).Reverse().ToArray(); zobject_byte[4] = realSize[0]; zobject_byte[5] = realSize[1]; zobject_byte[6] = realSize[2]; zobject_byte[7] = realSize[3]; return(zobject_byte); }