using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using V3.Camera; using V3.Objects; namespace V3.Map { // ReSharper disable once ClassNeverInstantiated.Global public class MapManager : IMapManager { private TiledParser mTiledParser; private FloorLayer mFloorLayer; private ObjectLayer mObjectLayer; private List mAreas; private PathfindingGrid mPathfindingGrid; private readonly ContentManager mContentManager; private readonly GraphicsDeviceManager mGraphicsDeviceManager; public List Areas => mAreas; public Point SizeInPixel { get; private set; } public Point SizeInTiles { get; private set; } public Point TileSize { get; private set; } public Point PathfindingGridSize { get; private set; } public Point PathfindingCellSize { get; private set; } public string FileName { get; private set; } public MapManager(ContentManager contentManager, GraphicsDeviceManager graphicsDeviceManager) { mContentManager = contentManager; mGraphicsDeviceManager = graphicsDeviceManager; } public void DrawFloor(SpriteBatch spriteBatch, ICamera camera) { mFloorLayer.Draw(spriteBatch, camera); } public void Load(string fileName) { mTiledParser = new TiledParser(); // Parse map data. mTiledParser.Parse(fileName); FileName = fileName; TileSize = new Point(mTiledParser.TileWidth, mTiledParser.TileHeight); SizeInTiles = new Point(mTiledParser.MapWidth, mTiledParser.MapHeight); SizeInPixel = new Point((SizeInTiles.X - 1) * TileSize.X, SizeInTiles.Y / 2 * TileSize.Y - TileSize.Y / 2); // Create floor layer of the map. mFloorLayer = new FloorLayer(mTiledParser.TileWidth, mTiledParser.TileHeight, mTiledParser.MapWidth, mTiledParser.MapHeight, mTiledParser.MapLayers[0], mTiledParser.TileSets); mFloorLayer.CreateObjects(); mFloorLayer.LoadContent(mContentManager); // Create object layer of the map. mObjectLayer = new ObjectLayer(mTiledParser.TileWidth, mTiledParser.TileHeight, mTiledParser.MapWidth, mTiledParser.MapHeight, mTiledParser.MapLayers[1], mTiledParser.TileSets); mObjectLayer.CreateObjects(); mObjectLayer.LoadContent(mContentManager); // Get areas from the map mAreas = mTiledParser.Areas; // Create pathfinding grid used in the pathfinder. mPathfindingGrid = new PathfindingGrid(mTiledParser.MapWidth, mTiledParser.MapHeight, mTiledParser.TileWidth, mTiledParser.TileHeight); mPathfindingGrid.LoadContent(mContentManager); mPathfindingGrid.CreateCollisions(mFloorLayer.ExtractCollisions()); mPathfindingGrid.CreateCollisions(mObjectLayer.ExtractCollisions()); PathfindingGridSize = new Point(mPathfindingGrid.mGridWidth, mPathfindingGrid.mGridHeight); PathfindingCellSize = new Point(Constants.CellWidth, Constants.CellHeight); // Create Minimap texture from pathfinding grid. mPathfindingGrid.CreateMinimap(mGraphicsDeviceManager.GraphicsDevice); } public List GetObjects() { return mObjectLayer.ExtractObjects(); } public List GetPopulation(CreatureFactory creatureFactory, Pathfinder pathfinder) { return mAreas.SelectMany(area => area.GetPopulation(creatureFactory, pathfinder)).ToList(); } public PathfindingGrid GetPathfindingGrid() { return mPathfindingGrid; } public void DrawPathfindingGrid(SpriteBatch spriteBatch, ICamera camera) { mPathfindingGrid.Draw(spriteBatch, camera); } public void DrawMinimap(SpriteBatch spriteBatch, Rectangle position) { mPathfindingGrid.DrawSmallGrid(spriteBatch, position); } } }