// READERS / WRITERS /// <summary> /// Reads a data block from a file binary stream. /// </summary> /// <param name="binaryReader">Binary reader to read the block from. Must point to the beginning of the block.</param> /// <param name="index">Index within a sequence (starts at 0).</param> public void Read(SRBinaryReader binaryReader, int index) { try { m_pos_x = binaryReader.ReadInt16(); m_pos_y = binaryReader.ReadInt16(); m_pos_z = binaryReader.ReadInt16(); pitch = binaryReader.ReadInt16(); bank = binaryReader.ReadInt16(); heading = binaryReader.ReadInt16(); int m_str_offset = binaryReader.ReadInt16(); SRTrace.WriteLine(" REFERENCE #{0}: {1},{2},{3},{4},{5},{6},{7}", index + 1, m_pos_x, m_pos_y, m_pos_z, pitch, bank, heading, m_str_offset); name = vFileHeader.GetReferenceNameByReadOffset(m_str_offset); } catch (Exception e) { // Add context information for the error message if (index >= 0) e.Data[BlockName] = index + 1; throw; } }
// READERS / WRITERS /// <summary> /// Reads a data block from a file binary stream. /// </summary> /// <param name="binaryReader">Binary reader to read the block from. Must point to the beginning of the block.</param> /// <param name="size">Maximum number of bytes to read.</param> public void Read(SRBinaryReader binaryReader) { binaryReader.Align(Alignment); SRTrace.WriteLine(""); SRTrace.WriteLine("WORLD ZONE HEADER: [file offset 0x{0:X8}]", binaryReader.BaseStream.Position); signature = new string(binaryReader.ReadChars(4)); SRTrace.WriteLine(" World Zone Signature: " + signature); if (signature != "SR3Z") throw new SRZoneFileException("Incorrect world zone signature.", binaryReader.BaseStream.Position - 4); version = binaryReader.ReadUInt32(); SRTrace.WriteLine(" World Zone Version: {0}", version); if (version != 29 && version != 32) // version 29 = SR3, 32 = SR4 throw new SRZoneFileException("Incorrect world zone version."); int v_file_header_ptr = binaryReader.ReadInt32(); SRTrace.WriteLine(" V-File Header Pointer: 0x{0:X8}", v_file_header_ptr); fileReferenceOffset = new SRPosition(binaryReader); SRTrace.WriteLine(" File Reference Offset: {0}", fileReferenceOffset.ToString()); fileReferencesPtr = binaryReader.ReadUInt32(); SRTrace.WriteLine(" WZ File Reference Ptr: 0x{0:X8}", fileReferencesPtr); int num_file_references = binaryReader.ReadInt16(); SRTrace.WriteLine(" Number of File Refs: {0}", num_file_references); zoneType = binaryReader.ReadByte(); string typeName = (zoneType < WorldZoneTypeNames.Length) ? WorldZoneTypeNames[zoneType] : "unknown"; SRTrace.WriteLine(" Zone Type: {0} ({1})", zoneType, typeName); int unused = binaryReader.ReadByte(); SRTrace.WriteLine(" Unused: {0}", unused); if (unused != 0) throw new SRZoneFileException("Expected unused field to be zero."); int interiorTriggerPtr = binaryReader.ReadInt32(); SRTrace.WriteLine(" Interior Trigger Ptr: 0x{0:X8} (run-time)", interiorTriggerPtr); if (interiorTriggerPtr != 0) throw new SRZoneFileException("Expected interior trigger pointer to be zero."); int numberOfTriggers = binaryReader.ReadInt16(); SRTrace.WriteLine(" Number of Triggers: {0,-10} (run-time)", numberOfTriggers); if (numberOfTriggers != 0) throw new SRZoneFileException("Expected number of triggers to be zero."); int extraObjects = binaryReader.ReadInt16(); SRTrace.WriteLine(" Extra Objects: {0}", extraObjects); if (extraObjects != 0) throw new SRZoneFileException("Expected extra objects to be zero."); binaryReader.BaseStream.Seek(24, SeekOrigin.Current); SRTrace.WriteLine(""); SRTrace.WriteLine(" MESH FILE REFERENCES: [file offset 0x{0:X8}]", binaryReader.BaseStream.Position); references = new List<SRZoneMeshFileReference>(num_file_references); for (int i = 0; i < num_file_references; i++) references.Add(new SRZoneMeshFileReference(binaryReader, i, vFileHeader)); }