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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
 public BinaryDeserializer(Stream p_Stream)
 {
     m_Stream = new ZHMStream(p_Stream, Endianness.LittleEndian, false);
 }