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
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); }
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