Exemplo n.º 1
0
        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);
        }