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);
        }
示例#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
        public static AnimationSet ReadAnimationSet(this LevelDeserializeContext context)
        {
            bool externalReference = context.br.ReadBoolean();

            if (externalReference)
            {
                return(context.assetProvider.Load <AnimationSet>(context.br.ReadString()));
            }
            else
            {
                return(context.animationDeserializeContext.DeserializeAnimationSet());
            }
        }
示例#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());
            }
        }
        public static Teleporter DeserializeTeleporter(this LevelDeserializeContext context)
        {
            var teleporter = new Teleporter();

            teleporter.TargetLevel = context.br.ReadNullableString();
            if (teleporter.TargetLevel != null)
            {
                teleporter.TargetLevel = teleporter.TargetLevel.ToLowerInvariant();
            }
            teleporter.targetSpawn = context.br.ReadNullableString();

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

            DeserializeRegion(context, teleporter);

            return(teleporter);
        }
        /// <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);
        }
        public static Path DeserializePath(this LevelDeserializeContext context)
        {
            var path = new Path();

            path.looped = context.br.ReadBoolean();
            var positionsCount = context.br.ReadInt32();

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

            var count = context.br.ReadInt32();

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

            return(path);
        }
示例#9
0
        public NavEdge(LevelDeserializeContext context)
        {
            if (context.Version < 19)
            {
                // NOTE: Legacy bits were: North, South, East, West, Jump, Drop, Climb
                int       oldTypeValue     = context.br.ReadByte();
                const int oldDirectionBits = 1 | 2 | 4 | 8;
                switch (oldTypeValue & oldDirectionBits)
                {
                case 1: direction = DirectionNumber.North; break;

                case 2: direction = DirectionNumber.South; break;

                case 4: direction = DirectionNumber.East;  break;

                case 8: direction = DirectionNumber.West;  break;

                default:
                    direction = 0;     // <- garbage, but easy to re-generate
                    Debug.Assert(false, "Nonsense direction value, need to regenerate level file");
                    break;
                }

                type = (EdgeType)(oldTypeValue & ~oldDirectionBits);
            }
            else
            {
                direction = (DirectionNumber)context.br.ReadByte();
                type      = (EdgeType)context.br.ReadByte();
            }

            nextSector    = context.br.ReadByte();
            region.startX = context.br.ReadInt32();
            region.startZ = context.br.ReadInt32();
            region.endX   = context.br.ReadInt32();
            region.endZ   = context.br.ReadInt32();
        }
        private static Region DeserializeRegion(LevelDeserializeContext context, Region region)
        {
            region.mask = new MaskData(context.br, context.FastReadHack);

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

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

            region.regionIndex = context.nextRegionIndex++;

            return(region);
        }
示例#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);
 }
        public static AnimationSet ReadAnimationSet(this LevelDeserializeContext context)
        {
            bool externalReference = context.br.ReadBoolean();

            return(externalReference ? context.assetProvider.Load <AnimationSet>(context.br.ReadString()) : new AnimationSet(context.animationDeserializeContext));
        }
        public static Region DeserializeRegion(this LevelDeserializeContext context)
        {
            var region = new Region();

            return(DeserializeRegion(context, region));
        }
        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);
        }
        public static Level DeserializeLevel(this LevelDeserializeContext context)
        {
            var level = new Level();

            return(DeserializeLevel(context, level));
        }