public Bitmap GenerateMap(MapElement element) { string package = element.Attr("_package", "map"); TileGrid.DefaultBackground = Util.HexToColor("000000"); //Util.HexToColor("48106e");// List <MapElement> levels = element.Select("levels", "level"); Rectangle chapterBounds = GetChapterBounds(levels); Rectangle viewport = new Rectangle(0, 0, chapterBounds.Width, chapterBounds.Height); //Rectangle viewport = new Rectangle(250, 3000, 300, 200); //Rectangle viewport = GetLevelBounds(levels, chapterBounds, "lvl_08-c"); Bitmap chapter = new Bitmap(viewport.Width, viewport.Height, PixelFormat.Format32bppArgb); MapElement bgs = element.SelectFirst("Style", "Backgrounds"); MapElement fgs = element.SelectFirst("Style", "Foregrounds"); background.SetLevelBounds(levels); foreground.SetLevelBounds(levels); string sceneryTileset = "scenery"; TileGrid scenery = GetTileset(sceneryTileset); for (int i = 0; i < levels.Count; i++) { MapElement level = levels[i]; int x = level.AttrInt("x", 0); int y = level.AttrInt("y", 0); int width = level.AttrInt("width", 0); int height = level.AttrInt("height", 0); int widthTiles = width / 8; int heightTiles = height / 8; Point pos = new Point(x - chapterBounds.X, y - chapterBounds.Y); Point offset = new Point(pos.X - viewport.X, pos.Y - viewport.Y); Rectangle levelBounds = new Rectangle(pos.X, pos.Y, width, height); if (!levelBounds.IntersectsWith(viewport)) { continue; } TileGrid tiles = GenerateLevelTiles(level, "bg", widthTiles, heightTiles, background, out VirtualMap <char> solids); string tileset = level.SelectFirst("bgtiles").Attr("tileset", "Scenery"); if (tileset.Equals("terrain", StringComparison.OrdinalIgnoreCase)) { tileset = "scenery"; } if (tileset != sceneryTileset) { scenery = GetTileset(tileset); sceneryTileset = tileset; } tiles.Overlay(level, "bgtiles", widthTiles, heightTiles, scenery); using (Bitmap map = tiles.DisplayMap(level, Backdrop.CreateBackdrops(bgs, levels), new Rectangle(pos, chapterBounds.Size), true)) { OverlayDecals(level.Select("bgdecals", "decal"), map); tiles = GenerateLevelTiles(level, "solids", widthTiles, heightTiles, foreground, out solids); OverlayEntities(level.SelectFirst("entities"), map, solids, true); Util.CopyTo(chapter, map, offset); } tileset = level.SelectFirst("fgtiles").Attr("tileset", "Scenery"); if (tileset.Equals("terrain", StringComparison.OrdinalIgnoreCase)) { tileset = "scenery"; } if (tileset != sceneryTileset) { scenery = GetTileset(tileset); sceneryTileset = tileset; } tiles.Overlay(level, "fgtiles", widthTiles, heightTiles, scenery); using (Bitmap map = tiles.DisplayMap(level, Backdrop.CreateBackdrops(fgs, levels), new Rectangle(pos, chapterBounds.Size), false)) { OverlayDecals(level.Select("fgdecals", "decal"), map); OverlayEntities(level.SelectFirst("entities"), map, solids, false); Util.CopyTo(chapter, map, offset); } //XmlNode objtiles = level.SelectSingleNode("objtiles"); } levels = element.Select("Filler", "rect"); for (int i = 0; i < levels.Count; i++) { MapElement level = levels[i]; int x = level.AttrInt("x", 0); int y = level.AttrInt("y", 0); int width = level.AttrInt("w", 0); int height = level.AttrInt("h", 0); Point pos = new Point(x * 8 - chapterBounds.X, y * 8 - chapterBounds.Y); Point offset = new Point(pos.X - viewport.X, pos.Y - viewport.Y); Rectangle levelBounds = new Rectangle(pos.X, pos.Y, width, height); if (!levelBounds.IntersectsWith(viewport)) { continue; } TileGrid tiles = foreground.GenerateOverlay(DefaultTile, 0, 0, width, height, null); using (Bitmap map = tiles.DisplayMap(null, null, chapterBounds, false)) { Util.CopyTo(chapter, map, pos); } } return(chapter); }