コード例 #1
0
        public static void Parse(StormReplay replay, ReadOnlySpan <byte> source)
        {
            BitReader bitReader = new BitReader(source, EndianType.BigEndian);

            bitReader.ReadAlignedBytes(3);
            bitReader.ReadAlignedByte();
            bitReader.ReadAlignedBytes(4); // Data Max Size
            bitReader.ReadAlignedBytes(4); // Header Offset
            bitReader.ReadAlignedBytes(4); // User Data Header Size

            VersionedDecoder versionedDecoder = new VersionedDecoder(ref bitReader);

            // headerStructure.StructureByIndex[0].GetValueAsString(); // m_signature => "Heroes of the Storm replay 11

            // m_version struct
            replay.ReplayVersion.Major     = (int)(versionedDecoder.Structure?[1].Structure?[1].GetValueAsUInt32() !); // m_major
            replay.ReplayVersion.Minor     = (int)(versionedDecoder.Structure?[1].Structure?[2].GetValueAsUInt32() !); // m_minor
            replay.ReplayVersion.Revision  = (int)(versionedDecoder.Structure?[1].Structure?[3].GetValueAsUInt32() !); // m_revision
            replay.ReplayVersion.Build     = (int)(versionedDecoder.Structure?[1].Structure?[4].GetValueAsUInt32() !); // m_build
            replay.ReplayVersion.BaseBuild = (int)(versionedDecoder.Structure?[1].Structure?[5].GetValueAsUInt32() !); // m_baseBuild

            // the major version is a 0 before build 51978, it may be set as a 1

            /* if (stormReplay.ReplayBuild < 51978)
            *   stormReplay.ReplayVersion.Major = 1; */

            /* headerStructure.StructureByIndex[2].GetValueAsUInt32(); m_type */

            replay.ElapsedGamesLoops = (int)versionedDecoder.Structure ![3].GetValueAsUInt32(); // m_elapsedGameLoops
コード例 #2
0
        public static void Parse(StormReplay replay, ReadOnlySpan <byte> source)
        {
            BitReader bitReader = new BitReader(source, EndianType.BigEndian);

            uint gameLoop = 0;

            while (bitReader.Index < source.Length)
            {
                gameLoop += new VersionedDecoder(ref bitReader).ChoiceData !.GetValueAsUInt32();

                TimeSpan timeSpan             = TimeSpan.FromSeconds(gameLoop / 16.0);
                StormTrackerEventType type    = (StormTrackerEventType) new VersionedDecoder(ref bitReader).GetValueAsUInt32();
                VersionedDecoder      decoder = new VersionedDecoder(ref bitReader);

                replay.TrackerEventsInternal.Add(new StormTrackerEvent(type, timeSpan, decoder));
            }

            SetParsedData(replay);
        }
コード例 #3
0
        public static void Parse(StormReplay replay, ReadOnlySpan <byte> source)
        {
            BitReader bitReader = new BitReader(source, EndianType.BigEndian);

            VersionedDecoder versionedDecoder = new VersionedDecoder(ref bitReader);

            // this section does not include the observers
            VersionedDecoder[]? versionDecoders = versionedDecoder.Structure?[0].OptionalData?.ArrayData;

            if (versionDecoders == null || versionDecoders.Length < 1)
            {
                throw new StormParseException("ReplayDetails: Less than 1 player");
            }

            replay.Players = new StormPlayer[versionDecoders.Length];

            for (int i = 0; i < versionDecoders?.Length; i++)
            {
                StormPlayer stormPlayer = new StormPlayer
                {
                    Name = versionDecoders[i].Structure ![0].GetValueAsString(), // m_name