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>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(); } }
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()); } }
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()); } }
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); }
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); }
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); }
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)); }