コード例 #1
0
        public static ReplayFile FromFileSystemEntry(FileSystemEntry entry, bool onlyHeader = false)
        {
            using (var stream = entry.Open())
                using (var reader = new BinaryReader(stream, Encoding.Unicode, true))
                {
                    var result = new ReplayFile
                    {
                        Header = ReplayHeader.Parse(reader)
                    };

                    if (onlyHeader)
                    {
                        return(result);
                    }

                    var chunks = new List <ReplayChunk>();
                    while (reader.BaseStream.Position < reader.BaseStream.Length)
                    {
                        chunks.Add(ReplayChunk.Parse(reader));
                    }
                    result.Chunks = chunks;

                    if (result.Header.NumTimecodes != chunks[chunks.Count - 1].Header.Timecode)
                    {
                        throw new InvalidDataException();
                    }

                    return(result);
                }
        }
コード例 #2
0
        internal static ReplayHeader Parse(BinaryReader reader)
        {
            var gameType = ParseGameType(reader.BaseStream);

            var result = new ReplayHeader
            {
                GameType = gameType
            };

            result.StartTime = ReadTimestamp(reader);
            result.EndTime   = ReadTimestamp(reader);

            if (gameType == ReplayGameType.Generals)
            {
                result.NumTimecodes = reader.ReadUInt16();

                var zero = reader.ReadBytes(12);
                // TODO
                //for (var i = 0; i < zero.Length; i++)
                //{
                //    if (zero[i] != 0)
                //    {
                //        throw new InvalidDataException();
                //    }
                //}
            }
            else
            {
                throw new NotImplementedException();
            }

            result.Filename = reader.ReadNullTerminatedString();

            result.Timestamp = ReplayTimestamp.Parse(reader);

            result.Version   = reader.ReadNullTerminatedString();
            result.BuildDate = reader.ReadNullTerminatedString();

            result.VersionMinor = reader.ReadUInt16();
            result.VersionMajor = reader.ReadUInt16();

            result.UnknownHash = reader.ReadBytes(8);

            result.Metadata = ReplayMetadata.Parse(reader);

            result.Unknown1 = reader.ReadUInt16();

            result.Unknown2 = reader.ReadUInt32();
            result.Unknown3 = reader.ReadUInt32();
            result.Unknown4 = reader.ReadUInt32();

            result.GameSpeed = reader.ReadUInt32();

            return(result);
        }