public static ReplayBlock Parse(Stream data, ReplayBlockType replayBlockType) { switch (replayBlockType) { case ReplayBlockType.StartBlockOne: case ReplayBlockType.StartBlockTwo: case ReplayBlockType.StartBlockThree: return(null); case ReplayBlockType.TimeslotOld: case ReplayBlockType.Timeslot: return(new TimeslotBlock(data)); default: return(null); } }
/// <summary> /// Seek the next <see cref="ReplayBlock"/> in the <paramref name="data"/>. /// </summary> internal static void SkipCurrentBlock(Stream data, out ReplayBlockType replayBlockType) { replayBlockType = (ReplayBlockType)data.ReadByte(); switch (replayBlockType) { case ReplayBlockType.LeaveGame: data.Seek(13, SeekOrigin.Current); break; case ReplayBlockType.StartBlockOne: case ReplayBlockType.StartBlockTwo: case ReplayBlockType.StartBlockThree: data.Seek(4, SeekOrigin.Current); break; case ReplayBlockType.TimeslotOld: case ReplayBlockType.Timeslot: data.Seek(data.ReadWordAsInt(), SeekOrigin.Current); break; case ReplayBlockType.ChatMessage: data.Seek(1, SeekOrigin.Current); data.Seek(data.ReadWordAsInt(), SeekOrigin.Current); break; case ReplayBlockType.ChecksumOrSeed: data.Seek(5, SeekOrigin.Current); break; case ReplayBlockType.Unknown: data.Seek(10, SeekOrigin.Current); break; case ReplayBlockType.ForcedGameEnd: data.Seek(8, SeekOrigin.Current); break; default: throw new InvalidDataException($"Unknown replay block type: {replayBlockType}."); } }