public object?ParseSegment(ZHMStream p_SegmentDataStream, ZHMStream p_ResourceDataStream) { var s_RelocationCount = p_SegmentDataStream.ReadUInt32(); for (var i = 0; i < s_RelocationCount; ++i) { var s_RelocationOffset = p_SegmentDataStream.ReadUInt32(); p_ResourceDataStream.Seek(s_RelocationOffset, SeekOrigin.Begin); var s_RelocValue = p_ResourceDataStream.ReadInt64(); /* * I don't think we need to emulate this relocation behavior right now * but basically what happens is that if [s_RelocValue] is -1 then the * value at [p_ResourceDataStream + s_RelocationOffset] is set to 0. * If it's not, then it's set to a pointer pointing to * [p_ResourceDataStream + s_RelocValue]. * * For now in our implementation we'll just handle the -1 case. */ if (s_RelocValue == 0) { p_ResourceDataStream.Seek(s_RelocationOffset, SeekOrigin.Begin); p_ResourceDataStream.Write((ulong)0); } } return(null); }
public object?ParseSegment(ZHMStream p_SegmentDataStream, ZHMStream p_ResourceDataStream) { var s_ResourceIdCount = p_SegmentDataStream.ReadUInt32(); Console.WriteLine($"Parsing {s_ResourceIdCount} resource ids."); var s_Ids = new List <ZRuntimeResourceID>(); for (var i = 0; i < s_ResourceIdCount; ++i) { var s_Offset = p_SegmentDataStream.ReadInt32(); // TODO: This is very very wrong. Fix it. p_ResourceDataStream.Seek(s_Offset, SeekOrigin.Begin); var s_ResourceId = new ZRuntimeResourceID() { Id = p_ResourceDataStream.ReadUInt64(), }; Console.WriteLine($"Read Resource ID '{s_ResourceId.Id}'."); s_Ids.Add(s_ResourceId); } return(s_Ids); }
public const uint BinaryResourceMagic = 0x314E4942; // BIN1 public static bool IsBinaryResource(Stream p_Stream) { using var s_Reader = new ZHMStream(p_Stream, Endianness.LittleEndian, false); var s_HasValidMagic = s_Reader.ReadUInt32() == BinaryResourceMagic; s_Reader.Seek(-4, SeekOrigin.Current); return(s_HasValidMagic); }
public object?ParseSegment(ZHMStream p_SegmentDataStream, ZHMStream p_ResourceDataStream) { var s_TypeIndices = new List <uint>(); var s_TypeCount = p_SegmentDataStream.ReadUInt32(); for (var i = 0; i < s_TypeCount; ++i) { var s_TypeIndexOffset = p_SegmentDataStream.ReadInt32(); p_ResourceDataStream.Seek(s_TypeIndexOffset, SeekOrigin.Begin); var s_TypeIndex = p_ResourceDataStream.ReadUInt32(); s_TypeIndices.Add(s_TypeIndex); } var s_TypeIdCount = p_SegmentDataStream.ReadUInt32(); Console.WriteLine($"Parsing {s_TypeIdCount} ids."); var s_TypeIds = new Dictionary <uint, TypeId>(); for (var i = 0; i < s_TypeIdCount; ++i) { p_SegmentDataStream.AlignReadTo(4); var s_TypeId = new TypeId() { Index = p_SegmentDataStream.ReadUInt32(), Unk = p_SegmentDataStream.ReadInt32(), Name = p_SegmentDataStream.ReadString(), }; s_TypeIds.Add(s_TypeId.Index, s_TypeId); } var s_FinalTypes = new List <TypeId>(); for (var i = 0; i < s_TypeIndices.Count; ++i) { var s_TypeIndex = s_TypeIndices[i]; var s_TypeId = s_TypeIds[s_TypeIndex]; Console.WriteLine($"[{i}] => {s_TypeId.Name}"); s_FinalTypes.Add(s_TypeId); } return(s_FinalTypes); }
public T Deserialize <T>() where T : new() { var s_Resource = new T(); m_Stream.Skip(4); // Magic (BIN1) m_Stream.Skip(1); // Unknown (always 0?) Alignment = m_Stream.ReadUByte(); var s_SegmentCount = m_Stream.ReadUByte(); m_Stream.Skip(1); // Unknown (always 0?) var s_DataSize = m_Stream.ReadUInt32Flipped(); m_Stream.Skip(4); // Unknown (maybe alignment?) var s_Data = m_Stream.ReadBytes((int)s_DataSize); using var s_DataReader = new ZHMStream(new MemoryStream(s_Data)); for (var i = 0; i < s_SegmentCount; ++i) { var s_SegmentType = m_Stream.ReadUInt32(); var s_SegmentSize = m_Stream.ReadUInt32(); Console.WriteLine($"Found segment {i} with {s_SegmentSize} bytes of data. Type: {s_SegmentType:X08}."); if (SegmentParsers.TryGetValue(s_SegmentType, out var s_Parser)) { using var s_SegmentReader = new LimitedReader(m_Stream, s_SegmentSize, false); s_Parser.ParseSegment(s_SegmentReader, s_DataReader); } else { throw new Exception($"Could not find a segment parser for segment of type {s_SegmentType:X08}."); } } Console.WriteLine($"Read {s_SegmentCount} segments with {m_Stream.BaseStream.Length - m_Stream.BaseStream.Position} bytes left to read."); return(s_Resource); }
public BinaryDeserializer(Stream p_Stream) { m_Stream = new ZHMStream(p_Stream, Endianness.LittleEndian, false); }