protected override Map Read(ContentReader input, Map existingInstance) { Map map = new Map(); map.Name = input.ReadString(); map.Dimensions = input.ReadObject <Point>(); map.TileDimensions = input.ReadObject <Point>(); map.Description = input.ReadString(); map.ThumbnailAsset = input.ReadString(); if (string.IsNullOrEmpty(map.ThumbnailAsset)) { map.ThumbnailAsset = "nothumb"; map.Thumbnail = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}", map.ThumbnailAsset)); } else { map.Thumbnail = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.ThumbnailAsset)); } map.TileSheetAsset = input.ReadString(); if (string.IsNullOrEmpty(map.TileSheetAsset)) { throw new Exception("You need a tile sheet in order to create a map."); } map.TileSheet = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.TileSheetAsset)); map.NumberOfTilesInSheet = new Point(map.TileSheet.Width / map.TileDimensions.X, map.TileSheet.Height / map.TileDimensions.Y); map.GroundTiles = input.ReadObject <int[]>(); map.PathTiles = input.ReadObject <int[]>(); map.SpawnLocation = input.ReadObject <Point>(); map.SpawnAssetName = input.ReadString(); if (string.IsNullOrEmpty(map.SpawnAssetName)) { throw new Exception("You need a spawn asset name in the XML."); } map.Spawn = new GameplayObject(); map.Spawn.Texture = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.SpawnAssetName)); map.Spawn.Position = new Vector2((map.SpawnLocation.X * map.TileDimensions.X) + map.Spawn.Origin.X, (map.SpawnLocation.Y * map.TileDimensions.Y) + map.Spawn.Origin.Y); map.CastleLocation = input.ReadObject <Point>(); map.CastleAssetName = input.ReadString(); if (string.IsNullOrEmpty(map.CastleAssetName)) { throw new Exception("You need a castle asset name in the XML."); } map.Castle = new GameplayObject(); map.Castle.Texture = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.CastleAssetName)); map.Castle.Position = new Vector2((map.CastleLocation.X * map.TileDimensions.X) + map.Castle.Origin.X, (map.CastleLocation.Y * map.TileDimensions.Y) + map.Castle.Origin.Y); GenerateActiveTilePath(map); map.Spawn.Rotation = GetAngleBetweenTwoMapLocations(map.SpawnLocation, GetAdjacentTileLocation(map, map.SpawnLocation)); map.Castle.Rotation = GetAngleBetweenTwoMapLocations(map.CastleLocation, GetAdjacentTileLocation(map, map.CastleLocation)); map.Endless = input.ReadBoolean(); map.TowersAvailable.AddRange(input.ReadObject <List <string> >()); map.TowersInfo = String.Format("Available Towers: {0}", map.TowersAvailable.Count); map.TowerList = new List <Tower>(map.TowersAvailable.Count); foreach (string s in map.TowersAvailable) { Tower t = input.ContentManager.Load <Tower>(String.Format("Towers\\{0}", s)).Clone(); t.Initialize(map, input.ContentManager); map.TowerList.Add(t); } map.WavesAvailable.AddRange(input.ReadObject <List <string> >()); map.WavesInfo = String.Format("Waves: {0}", map.WavesAvailable.Count); map.WaveList = new List <Wave>(map.WavesAvailable.Count); foreach (string s in map.WavesAvailable) { Wave w = input.ContentManager.Load <Wave>(String.Format("Wave\\{0}", s)).Clone(); w.Initialize(map); map.WaveList.Add(w); } map.ActiveWave = map.WaveList[0]; map.WaveIndex = 0; map.WaveDelay = input.ReadSingle(); map.Difficulty = input.ReadInt32(); map.DifficultyInfo = String.Format("Difficulty: {0}", map.Difficulty); map.Money = input.ReadInt32(); map.ForeColorArray = input.ReadObject <int[]>(); if (map.ForeColorArray.Length == 4) { map.ForeColor = new Color(map.ForeColorArray[0], map.ForeColorArray[1], map.ForeColorArray[2], map.ForeColorArray[3]); } else { throw new Exception(input.AssetName + ".xml must have 4 integers to represent RGBA color data in the ForeColorArray tag."); } map.ErrorColorArray = input.ReadObject <int[]>(); if (map.ErrorColorArray.Length == 4) { map.ErrorColor = new Color(map.ErrorColorArray[0], map.ErrorColorArray[1], map.ErrorColorArray[2], map.ErrorColorArray[3]); } else { throw new Exception(input.AssetName + ".xml must have 4 integers to represent RGBA color data in the ErrorColorArray tag."); } map.InfoBarBackgroundAsset = input.ReadString(); if (!string.IsNullOrEmpty(map.InfoBarBackgroundAsset)) { map.InfoBarBackground = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.InfoBarBackgroundAsset)); } map.BorderColorArray = input.ReadObject <int[]>(); if (map.BorderColorArray.Length == 4) { map.BorderColor = new Color(map.BorderColorArray[0], map.BorderColorArray[1], map.BorderColorArray[2], map.BorderColorArray[3]); } map.BorderTextureAsset = input.ReadString(); if (!string.IsNullOrEmpty(map.BorderTextureAsset)) { map.BorderTexture = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.BorderTextureAsset)); } map.MouseTextureAsset = input.ReadString(); if (!string.IsNullOrEmpty(map.MouseTextureAsset)) { map.MouseTexture = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.MouseTextureAsset)); } map.PlaceableArray = GeneratePlaceableArray(map); map.SmallErrorButtonTextureAsset = input.ReadString(); if (!string.IsNullOrEmpty(map.SmallErrorButtonTextureAsset)) { map.SmallErrorButtonTexture = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.SmallErrorButtonTextureAsset)); } map.SmallNormalButtonTextureAsset = input.ReadString(); if (!string.IsNullOrEmpty(map.SmallNormalButtonTextureAsset)) { map.SmallNormalButtonTexture = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.SmallNormalButtonTextureAsset)); } map.LargeErrorButtonTextureAsset = input.ReadString(); if (!string.IsNullOrEmpty(map.LargeErrorButtonTextureAsset)) { map.LargeErrorButtonTexture = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.LargeErrorButtonTextureAsset)); } map.LargeNormalButtonTextureAsset = input.ReadString(); if (!string.IsNullOrEmpty(map.LargeNormalButtonTextureAsset)) { map.LargeNormalButtonTexture = input.ContentManager.Load <Texture2D>(String.Format("Textures\\Maps\\{0}\\{1}", map.Name, map.LargeNormalButtonTextureAsset)); } if (map.SmallNormalButtonTexture.Bounds != map.SmallErrorButtonTexture.Bounds) { throw new Exception("The SmallNormalButtonTexture and the SmallErrorButtonTexture must be the same size"); } if (map.LargeNormalButtonTexture.Bounds != map.LargeErrorButtonTexture.Bounds) { throw new Exception("The LargeNormalButtonTexture and the LargeErrorButtonTexture must be the same size"); } if (map.WaveDelay > 0) { map.State = MapState.WaveDelay; map.Timer = map.WaveDelay; } map.SongCueName = input.ReadString(); return(map); }