public static Shim DeserializeShim(this LevelDeserializeContext context)
        {
            var animationSet = context.ReadAnimationSet();
            var position     = context.br.ReadPosition();
            var facingLeft   = context.br.ReadBoolean();
            var parallaxX    = context.br.ReadSingle();
            var parallaxY    = context.br.ReadSingle();

            var shim = new Shim(animationSet, position, facingLeft, parallaxX, parallaxY);

            shim.animationNumber    = context.br.ReadInt32();
            shim.ambientSoundSource = context.br.ReadNullableString();

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

            if (context.Version >= 16)
            {
                int count = context.br.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    shim.properties.Add(context.br.ReadString(), context.br.ReadString());
                }
            }

            return(shim);
        }
        /// <summary>Deserialize into new object instance</summary>
        public static Thing DeserializeThing(this LevelDeserializeContext context)
        {
            var animationSet = context.ReadAnimationSet();
            var position     = context.br.ReadPosition();
            var facingLeft   = context.br.ReadBoolean();

            var thing = new Thing(animationSet, position, facingLeft);

            thing.overrideBehaviour   = context.br.ReadNullableString();
            thing.includeInNavigation = context.br.ReadBoolean();

            // Properties:
            int count = context.br.ReadInt32();

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

            return(thing);
        }
示例#3
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();
            }
        }
        public static Level DeserializeLevel(this LevelDeserializeContext context, Level level)
        {
            level.friendlyName  = context.br.ReadNullableString();
            level.behaviourName = context.br.ReadNullableString();

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

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

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

            // Player Spawns
            {
                int playerSpawnsCount = context.br.ReadInt32();
                level.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());
                    }
                    level.playerSpawns.Add(name, positions);
                }
            }

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

            // Geometry
            {
                // Regions
                {
                    int count = context.br.ReadInt32();
                    level.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++)
                        {
                            level.regions.Add(regionKey, context.DeserializeRegion());
                        }
                    }
                }

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

                // Positions
                {
                    int count = context.br.ReadInt32();
                    level.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++)
                        {
                            level.positions.Add(positionKey, new LevelPosition(context));
                        }
                    }
                }
            }

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

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

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

            if (context.Version >= 20)
            {
                level.isAPitLevel = context.br.ReadBoolean();
            }

            return(level);
        }