コード例 #1
0
ファイル: LevelPosition.cs プロジェクト: zcxxv1213/Pixel3D
        public void Deserialize(LevelDeserializeContext context)
        {
            position = context.br.ReadPosition();
            int count = context.br.ReadInt32();

            for (int i = 0; i < count; i++)
            {
                properties.Add(context.br.ReadString(), context.br.ReadString());
            }
        }
コード例 #2
0
        /// <summary>Check that an AnimationSet round-trips through serialization cleanly</summary>
        public void RoundTripCheck(GraphicsDevice graphicsDevice, IAssetProvider assetProvider, IAssetPathProvider assetPathProvider, bool useExternalImages)
        {
            // Serialize a first time
            MemoryStream firstMemoryStream = new MemoryStream();
            BinaryWriter firstBinaryWriter = new BinaryWriter(firstMemoryStream);
            ImageWriter  firstImageWriter  = null;

            if (useExternalImages)
            {
                firstImageWriter = new ImageWriter();
                this.RegisterImages(firstImageWriter, assetPathProvider);
                firstImageWriter.WriteOutAllImages(firstMemoryStream);
            }
            LevelSerializeContext firstSerializeContext = new LevelSerializeContext(firstBinaryWriter, firstImageWriter, assetPathProvider);

            Serialize(firstSerializeContext);
            byte[] originalData = firstMemoryStream.ToArray();

            // Then deserialize that data
            BinaryReader br          = new BinaryReader(new MemoryStream(originalData));
            ImageBundle  imageBundle = null;

            if (useExternalImages)
            {
                var helper = new SimpleTextureLoadHelper(graphicsDevice);
                imageBundle            = new ImageBundle();
                br.BaseStream.Position = imageBundle.ReadAllImages(originalData, (int)br.BaseStream.Position, helper);
            }
            LevelDeserializeContext deserializeContext = new LevelDeserializeContext(br, imageBundle, assetProvider, graphicsDevice);
            Level deserialized = new Level(deserializeContext);

            // Then serialize that deserialized data and see if it matches
            MemoryCompareStream secondMemoryStream = new MemoryCompareStream(originalData);
            BinaryWriter        secondBinaryWriter = new BinaryWriter(secondMemoryStream);
            ImageWriter         secondImageWriter  = null;

            if (useExternalImages)
            {
                secondImageWriter = new ImageWriter();
                deserialized.RegisterImages(secondImageWriter, assetPathProvider);
                secondImageWriter.WriteOutAllImages(secondMemoryStream);
            }
            LevelSerializeContext secondSerializeContext = new LevelSerializeContext(secondBinaryWriter, secondImageWriter, assetPathProvider);

            deserialized.Serialize(secondSerializeContext);

            // Clean-up:
            if (imageBundle != null)
            {
                imageBundle.Dispose();
            }
        }
コード例 #3
0
        /// <summary>Deserialize into new object instance</summary>
        public Teleporter(LevelDeserializeContext context)
        {
            TargetLevel = context.br.ReadNullableString();
            if (TargetLevel != null)
            {
                TargetLevel = TargetLevel.ToLowerInvariant();
            }
            targetSpawn = context.br.ReadNullableString();

            if (context.Version >= 18)
            {
                neverSelectAtRandom = context.br.ReadBoolean();
            }

            base.Deserialize(context);
        }
コード例 #4
0
        public static Level ReadFromFile(string path, IAssetProvider assetProvider, GraphicsDevice graphicsDevice)
        {
            string      texturePath = System.IO.Path.ChangeExtension(path, ".tex");
            ImageBundle imageBundle = null;

            if (File.Exists(texturePath))
            {
#if false // OLD FORMAT
                using (var stream = File.OpenRead(texturePath))
                {
                    using (var unzip = new GZipStream(stream, CompressionMode.Decompress, true))
                    {
                        using (var br = new BinaryReader(unzip))
                        {
                            imageBundle = new ImageBundle();
                            imageBundle.ReadAllImagesOLD(br, graphicsDevice);
                        }
                    }
                }
#else
#if !WINDOWS
                texturePath = texturePath.Replace('\\', '/');
#endif
                byte[] data = File.ReadAllBytes(texturePath);
                if (data[0] != 0)
                {
                    throw new Exception("Bad version number");
                }

                var helper = new SimpleTextureLoadHelper(graphicsDevice);
                imageBundle = new ImageBundle();
                imageBundle.ReadAllImages(data, 1, helper);
#endif
            }

            using (var stream = File.OpenRead(path))
            {
                using (var unzip = new GZipStream(stream, CompressionMode.Decompress, true))
                {
                    using (var br = new BinaryReader(unzip))
                    {
                        var deserializeContext = new LevelDeserializeContext(br, imageBundle, assetProvider, graphicsDevice);
                        return(new Level(deserializeContext));
                    }
                }
            }
        }
コード例 #5
0
        /// <summary>Deserialize into new object instance</summary>
        public Path(LevelDeserializeContext context)
        {
            looped = context.br.ReadBoolean();
            var positionsCount = context.br.ReadInt32();

            positions = new List <LevelPosition>(positionsCount);
            for (var i = 0; i < positionsCount; i++)
            {
                positions.Add(new LevelPosition(context));
            }

            var count = context.br.ReadInt32();

            for (var i = 0; i < count; i++)
            {
                properties.Add(context.br.ReadString(), context.br.ReadString());
            }
        }
コード例 #6
0
        /// <summary>Deserialize into new object instance</summary>
        public Thing(LevelDeserializeContext context)
        {
            AnimationSet = context.ReadAnimationSet();

            Position   = context.br.ReadPosition();
            FacingLeft = context.br.ReadBoolean();

            overrideBehaviour = context.br.ReadNullableString();

            includeInNavigation = context.br.ReadBoolean();

            // Properties
            {
                int count = context.br.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    properties.Add(context.br.ReadString(), context.br.ReadString());
                }
            }
        }
コード例 #7
0
ファイル: Region.cs プロジェクト: zcxxv1213/Pixel3D
        protected void Deserialize(LevelDeserializeContext context)
        {
            mask = new MaskData(context.br, context.FastReadHack);

            if (context.Version >= 15)
            {
                startY = context.br.ReadInt32();
                endY   = context.br.ReadInt32();

                if (context.Version < 17 && endY != beforeVersion17WorldPhysicsMaximumHeight)
                {
                    endY++; // <- Old version had an inclusive upper bound
                }
            }
            else
            {
                startY = 0;
                endY   = WorldPhysics.MaximumHeight;
            }

            regionIndex = context.nextRegionIndex++;
        }
コード例 #8
0
        public Shim(LevelDeserializeContext context)
        {
            AnimationSet       = context.ReadAnimationSet();
            Position           = context.br.ReadPosition();
            FacingLeft         = context.br.ReadBoolean();
            parallaxX          = context.br.ReadSingle();
            parallaxY          = context.br.ReadSingle();
            animationNumber    = context.br.ReadInt32();
            ambientSoundSource = context.br.ReadNullableString();

            if (context.Version >= 14)
            {
                tag = context.br.ReadInt32();
            }

            if (context.Version >= 16)
            {
                int count = context.br.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    properties.Add(context.br.ReadString(), context.br.ReadString());
                }
            }
        }
コード例 #9
0
ファイル: LevelPosition.cs プロジェクト: zcxxv1213/Pixel3D
 /// <summary>Deserialize into new object instance</summary>
 public LevelPosition(LevelDeserializeContext context)
 {
     Deserialize(context);
 }
コード例 #10
0
ファイル: Region.cs プロジェクト: zcxxv1213/Pixel3D
 /// <summary>Deserialize into new object instance</summary>
 public Region(LevelDeserializeContext context)
 {
     Deserialize(context);
 }
コード例 #11
0
        private void Deserialize(LevelDeserializeContext context)
        {
            friendlyName  = context.br.ReadNullableString();
            behaviourName = context.br.ReadNullableString();

            if (context.br.ReadBoolean())
            {
                levelAnimation = context.ReadAnimationSet();
            }

            // Properties
            {
                int count = context.br.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    properties.Add(context.br.ReadString(), context.br.ReadString());
                }
            }

            // Teleporters
            {
                int teleportersCount = context.br.ReadInt32();
                teleporters = new List <Teleporter>(teleportersCount);
                for (int i = 0; i < teleportersCount; i++)
                {
                    teleporters.Add(new Teleporter(context));
                }
            }

            // Player Spawns
            {
                int playerSpawnsCount = context.br.ReadInt32();
                playerSpawns = new OrderedDictionary <string, List <Position> >(playerSpawnsCount);
                for (int i = 0; i < playerSpawnsCount; i++)
                {
                    string          name           = context.br.ReadString();
                    int             positionsCount = context.br.ReadInt32();
                    List <Position> positions      = new List <Position>(positionsCount);
                    for (int j = 0; j < positionsCount; j++)
                    {
                        positions.Add(context.br.ReadPosition());
                    }
                    playerSpawns.Add(name, positions);
                }
            }

            // Things
            {
                int thingsCount = context.br.ReadInt32();
                things = new List <Thing>(thingsCount);
                for (int i = 0; i < thingsCount; i++)
                {
                    things.Add(new Thing(context));
                }
            }

            // Geometry
            {
                // Regions
                {
                    int count = context.br.ReadInt32();
                    regions = new MultiDictionary <string, Region>();
                    for (int i = 0; i < count; i++)
                    {
                        var regionKey = context.br.ReadString();
                        var areaCount = context.br.ReadInt32();
                        for (var j = 0; j < areaCount; j++)
                        {
                            regions.Add(regionKey, new Region(context));
                        }
                    }
                }

                // Paths
                {
                    int count = context.br.ReadInt32();
                    paths = new OrderedDictionary <string, Path>(count);
                    for (int i = 0; i < count; i++)
                    {
                        paths.Add(context.br.ReadString(), new Path(context));
                    }
                }

                // Positions
                {
                    int count = context.br.ReadInt32();
                    positions = new MultiDictionary <string, LevelPosition>();
                    for (int i = 0; i < count; i++)
                    {
                        var positionKey = context.br.ReadString();
                        var pointCount  = context.br.ReadInt32();
                        for (var j = 0; j < pointCount; j++)
                        {
                            positions.Add(positionKey, new LevelPosition(context));
                        }
                    }
                }
            }

            // Shims
            {
                int count = context.br.ReadInt32();
                shims = new List <Shim>(count);
                for (int i = 0; i < count; i++)
                {
                    shims.Add(new Shim(context));
                }

                backgroundShimsEndIndex   = context.br.ReadSByte();
                foregroundShimsStartIndex = context.br.ReadSByte();
                animatedShimCount         = context.br.ReadByte();
            }

            // Camera Bounds
            cameraBounds = context.br.ReadRectangle();

            if (context.Version >= 20)
            {
                isAPitLevel = context.br.ReadBoolean();
            }
        }
コード例 #12
0
 /// <summary>Deserialize into new object instance</summary>
 public Level(LevelDeserializeContext context)
 {
     Deserialize(context);
 }