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()); } }
/// <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(); } }
/// <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); }
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)); } } } }
/// <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()); } }
/// <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()); } } }
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++; }
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()); } } }
/// <summary>Deserialize into new object instance</summary> public LevelPosition(LevelDeserializeContext context) { Deserialize(context); }
/// <summary>Deserialize into new object instance</summary> public Region(LevelDeserializeContext context) { Deserialize(context); }
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(); } }
/// <summary>Deserialize into new object instance</summary> public Level(LevelDeserializeContext context) { Deserialize(context); }