public void ReadFile(string czhFile) { FileStream headerFileStream = null; try { headerFileStream = new FileStream(czhFile, FileMode.Open, FileAccess.Read); SRBinaryReader binaryReader = new SRBinaryReader(headerFileStream); binaryReader.WriteLine(""); binaryReader.WriteLine("V-FILE HEADER:"); Int16 signature = binaryReader.ReadInt16(); binaryReader.WriteLine1(" V-File Signature: 0x{0:X4}", signature); if (signature != 0x3854) throw new Exception("Incorrect signature. Not a valid zone header file."); Int16 version = binaryReader.ReadInt16(); binaryReader.WriteLine1(" V-File Version: {0}", version); if (version != 4) throw new Exception("Incorrect version."); Int32 refDataSize = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Reference Data Size: {0}", refDataSize); Int32 refDataStart = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Reference Data Start: 0x{0:X8}", refDataStart); Int32 refCount = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Reference Count: {0}", refCount); binaryReader.BaseStream.Seek(16, SeekOrigin.Current); long refDataOffset = binaryReader.BaseStream.Position; binaryReader.WriteLine(""); binaryReader.WriteLine(" REFERENCE DATA:"); for (int i = 1; i <= refCount; i++) { uint offset = (uint)(binaryReader.BaseStream.Position - refDataOffset); string name = binaryReader.ReadStringZ(); ReferenceData[offset] = name; binaryReader.WriteLineT("StringZ", " {0,3}. {1}", i, name); } binaryReader.BaseStream.Seek((binaryReader.BaseStream.Position | 0x000F) + 1, SeekOrigin.Begin); binaryReader.WriteLine(""); binaryReader.WriteLine("WORLD ZONE HEADER:"); string signature2 = new string(binaryReader.ReadChars(4)); binaryReader.WriteLineT("Byte[4]", " World Zone Signature: " + signature2); if (signature2 != "SR3Z") throw new Exception("Incorrect signature."); Int32 version2 = binaryReader.ReadInt32(); binaryReader.WriteLine1(" World Zone Version: {0}", version2); if (version2 != 29 && version2 != 32) // version 29 = SR3, 32 = SR4 throw new Exception("Incorrect version."); Int32 v_file_header_ptr = binaryReader.ReadInt32(); binaryReader.WriteLine1(" V-File Header Pointer: 0x{0:X8}", v_file_header_ptr); float x = binaryReader.ReadSingle(); float y = binaryReader.ReadSingle(); float z = binaryReader.ReadSingle(); binaryReader.WriteLineT("float[3]", " File Reference Offset: {0}, {1}, {2}", x, y, z); Int32 wz_file_reference = binaryReader.ReadInt32(); binaryReader.WriteLine1(" WZ File Reference Ptr: 0x{0:X8}", wz_file_reference); Int16 num_file_references = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Number of File Refs: {0}", num_file_references); Byte zone_type = binaryReader.ReadByte(); string typeName = (zone_type < worldZoneTypeNames.Length) ? worldZoneTypeNames[zone_type] : "unknown"; binaryReader.WriteLine1(" Zone Type: {0} ({1})", zone_type, typeName); Byte unused = binaryReader.ReadByte(); binaryReader.WriteLine1(" Unused: {0}", unused); Int32 interior_trigger_ptr = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Interior Trigger Ptr: 0x{0:X8} (run-time)", interior_trigger_ptr); Int16 number_of_triggers = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Number of Triggers: {0,-10} (run-time)", number_of_triggers); Int16 extra_objects = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Extra Objects: {0}", extra_objects); binaryReader.BaseStream.Seek(24, SeekOrigin.Current); binaryReader.WriteLine(""); binaryReader.WriteLine(" MESH FILE REFERENCES" + (normalizeUnits ? " (STANDARD COORDINATE UNITS):" : " (RAW COMPRESSED VALUES):")); binaryReader.WriteLine(" X Y Z Pitch Bank Heading File Name"); binaryReader.WriteLine(" ------ ------ ------ ------ ------ ------- ---------"); // binaryReader.BaseStream.Seek((binaryReader.BaseStream.Position | 0x000F) + 1, SeekOrigin.Begin); for (int i = 1; i <= num_file_references; i++) { Int16 m_pos_x = binaryReader.ReadInt16(); Int16 m_pos_y = binaryReader.ReadInt16(); Int16 m_pos_z = binaryReader.ReadInt16(); Int16 pitch = binaryReader.ReadInt16(); Int16 bank = binaryReader.ReadInt16(); Int16 heading = binaryReader.ReadInt16(); uint m_str_offset = binaryReader.ReadUInt16(); string name = ReferenceData.ContainsKey(m_str_offset) ? ReferenceData[m_str_offset] : "<invalid>"; if (normalizeUnits) { float f_pos_x = MeshPosToFloat(m_pos_x); float f_pos_y = MeshPosToFloat(m_pos_y); float f_pos_z = MeshPosToFloat(m_pos_z); float f_pitch = MeshOrientToFloat(pitch); float f_bank = MeshOrientToFloat(bank); float f_heading = MeshOrientToFloat(heading); binaryReader.WriteLineT("Int16[6]", " {0,4}. {1,7:0.00} {2,7:0.00} {3,7:0.00} {4,7:0.00} {5,7:0.00} {6,8:0.00} {8}", i, f_pos_x, f_pos_y, f_pos_z, f_pitch, f_bank, f_heading, m_str_offset, name); } else { binaryReader.WriteLineT("Int16[6]", " {0,4}.{1,8}{2,8}{3,8}{4,8}{5,8} {6,8} {8}", i, m_pos_x, m_pos_y, m_pos_z, pitch, bank, heading, m_str_offset, name); } } } finally { if (headerFileStream != null) headerFileStream.Close(); } }
public void ReadObjectSection(SRBinaryReader binaryReader, UInt32 cpu_size, long sectionDataStart) { binaryReader.WriteLine(""); binaryReader.WriteLine(" OBJECT SECTION HEADER:"); Int32 signature = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Header Signature: 0x{0:X8}", signature); Int32 version = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Version: {0}", version); Int32 num_objects = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Number of Objects: {0}", num_objects); Int32 num_handles = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Number of Handles: {0}", num_handles); Int32 flags = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Flags: 0x{0:X8}", flags); Int32 handle_list_ptr = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Handle List Pointer: 0x{0:X8} (run-time)", handle_list_ptr); Int32 object_data_ptr = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Object Data Pointer: 0x{0:X8} (run-time)", object_data_ptr); Int32 object_data_size = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Object Data Size: {0,-10} (run-time)", object_data_size); binaryReader.WriteLine(""); binaryReader.WriteLine(" HANDLE LIST:"); for (int i = 1; i <= num_handles; i++) { UInt64 handle = binaryReader.ReadUInt64(); // if (i > 10 && i < num_handles - 10) continue; binaryReader.WriteLineT("UInt64", " {0,3}. 0x{1:X16}", i, handle); } int block = 1; while (block <= num_handles && binaryReader.BaseStream.Position < sectionDataStart + cpu_size) { // Align on a dword boundry while ((binaryReader.BaseStream.Position & 0x00000003) != 0) binaryReader.ReadByte(); if (binaryReader.BaseStream.Position >= sectionDataStart + cpu_size) break; binaryReader.WriteLine(""); binaryReader.WriteLine(" OBJECT #{0}:", block++); UInt64 handle_offset = binaryReader.ReadUInt64(); binaryReader.WriteLine1(" Handle Offset: 0x{0:X16}", handle_offset); UInt64 parent_handle_offset = binaryReader.ReadUInt64(); binaryReader.WriteLine1(" Parent Handle Offset: 0x{0:X16}", parent_handle_offset); Int32 object_type_hash = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Object Type Hash: 0x{0:X8}", object_type_hash); Int16 number_of_properties = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Number of Properties: {0}", number_of_properties); Int16 buffer_size = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Buffer Size: {0}", buffer_size); UInt16 name_offset = binaryReader.ReadUInt16(); binaryReader.WriteLine1(" Name Offset: {0}", name_offset); Int16 padding = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Padding: {0}", padding); long savePosition = binaryReader.BaseStream.Position; binaryReader.BaseStream.Seek(name_offset, SeekOrigin.Current); string objectName = binaryReader.ReadStringZ(); binaryReader.WriteLineX(" Object Name: " + objectName); binaryReader.BaseStream.Seek(savePosition, SeekOrigin.Begin); for (int i = 1; i <= number_of_properties; i++) { // Align on a dword boundry while ((binaryReader.BaseStream.Position & 0x00000003) != 0) binaryReader.ReadByte(); binaryReader.WriteLine(""); binaryReader.WriteLine(" PROPERTY #{0}:", i); uint type = binaryReader.ReadUInt16(); string typeName = (type < propertyTypeNames.Length) ? propertyTypeNames[type] : "unknown"; binaryReader.WriteLineT("UInt16", " Type: {0} ({1})", type, typeName); Int16 size = binaryReader.ReadInt16(); binaryReader.WriteLine1(" Size: {0} bytes", size); Int32 name_crc = binaryReader.ReadInt32(); binaryReader.WriteLine1(" Name CRC: 0x{0:X8} ({0})", name_crc, name_crc); long dataBegin = binaryReader.BaseStream.Position; switch (type) { case 0: binaryReader.WriteLineT("StringZ", " Value: \"" + binaryReader.ReadStringZ() + "\""); break; case 2: binaryReader.WriteLineT("float[3]", " Value: Position (x,y,z): {0}, {1}, {2}", binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle()); break; case 3: binaryReader.WriteLineT("float[3]", " Value: Position (x,y,z): {0}, {1}, {2}", binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle()); binaryReader.WriteLineT("float[4]", " Orientation (x,y,z,w): {0}, {1}, {2}, {3}", binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle()); break; default: if (size > 16) { binaryReader.WriteLine(" Value: ???"); } else { byte[] buffer = new byte[size]; binaryReader.Read(buffer, 0, size); string hexBuffer = ""; for (int j = 0; j < size; j++) { hexBuffer += buffer[j].ToString("X2") + ' '; } binaryReader.WriteLine(" Value: {1}", i, hexBuffer); } break; } binaryReader.BaseStream.Seek(dataBegin + size, SeekOrigin.Begin); } } }