Ejemplo n.º 1
0
        public void Serialize(BitWriter writer)
        {
            if (OldLevelHeader == default)
            {
                LevelInfo.LvlVersion = LvlVersion;

                if (LevelObjects != default)
                {
                    LevelObjects.LvlVersion = LvlVersion;
                }

                SerializeNew(writer);

                return;
            }

            OldLevelHeader.Serialize(writer);

            LevelObjects.LvlVersion = OldLevelHeader.LvlVersion;

            LevelObjects.Serialize(writer);

            writer.Write <byte>(0);
            writer.Write <byte>(0);
        }
Ejemplo n.º 2
0
 public void ConvertToOld(ushort version = 39)
 {
     OldLevelHeader = new OldLevelHeader {
         LvlVersion = version, SkyBox = LevelSkyConfig.Skybox
     };
 }
Ejemplo n.º 3
0
        public void Deserialize(BitReader reader)
        {
            var magic = new string(reader.ReadBuffer(4).Select(s => (char)s).ToArray());

            if (magic != "CHNK")
            {
                reader.BaseStream.Position = 0;

                OldLevelHeader = new OldLevelHeader();

                OldLevelHeader.Deserialize(reader);

                LvlVersion = OldLevelHeader.LvlVersion;

                LevelObjects = new LevelObjects(LvlVersion);

                LevelObjects.Deserialize(reader);

                return;
            }

            reader.BaseStream.Position = 0;

            while (reader.BaseStream.Position != reader.BaseStream.Length)
            {
                var startPosition = reader.BaseStream.Position;

                magic = new string(reader.ReadBuffer(4).Select(s => (char)s).ToArray());

                if (startPosition % 16 != 0 || magic != "CHNK")
                {
                    throw new Exception($"{startPosition} % 16 = {startPosition % 16} | {magic}");
                }

                var chunkType = reader.Read <uint>();

                reader.Read <ushort>();

                var index = reader.Read <ushort>();

                var chunkLength = reader.Read <uint>();

                var chunkAddress = reader.Read <uint>();

                reader.BaseStream.Position = chunkAddress;

                if (reader.BaseStream.Position % 16 != 0)
                {
                    break;
                }

                switch (chunkType)
                {
                case 1000:
                    var chunk1000 = new LevelInfo
                    {
                        Index = index
                    };

                    chunk1000.Deserialize(reader);

                    LvlVersion = chunk1000.LvlVersion;

                    LevelInfo = chunk1000;
                    break;

                case 2000:
                    var chunk2000 = new LevelSkyConfig
                    {
                        Index = index
                    };

                    chunk2000.Deserialize(reader);

                    LevelSkyConfig = chunk2000;
                    break;

                case 2001:
                    var chunk2001 = new LevelObjects(LvlVersion)
                    {
                        Index = index
                    };

                    chunk2001.Deserialize(reader);

                    LevelObjects = chunk2001;
                    break;

                case 2002:
                    var chunk2002 = new LevelEnvironmentConfig
                    {
                        Index = index
                    };

                    chunk2002.Deserialize(reader);

                    LevelEnvironmentConfig = chunk2002;
                    break;

                default:
                    throw new ArgumentOutOfRangeException($"{chunkType} is not a valid chunk type.");
                }

                reader.BaseStream.Position = startPosition + chunkLength;
            }
        }