public Minimap(Tileset tileset, Texture2D minimapImage)
 {
     set = tileset;
     isHolding = false;
     mouseVector = new Vector2();
     this.minimapImage = minimapImage;
 }
        public TileMap(Tileset tileset, MapLayer layer, int tileWidth, int tileHeight)
            : base(tileWidth, tileHeight)
        {
            mapWidth = layer.Width;
            mapHeight = layer.Height;

            tilesets = new List<Tileset>();
            tilesets.Add(tileset);
            mapLayers = new List<MapLayer>();
            mapLayers.Add(layer);
        }
        /// <summary>
        /// Metoda pro nahrani vsech map a textur a vsech defaultnich veci
        /// </summary>
        /// <param name="mapName"></param>
        public static void LoadMapAndTextures(string mapName)
        {
            //Nahrani mapy
            #region Tile Sets
            font = GameRef.Content.Load<SpriteFont>(@"Fonts\editorFont");

            Texture2D tilesetTexture = GameRef.Content.Load<Texture2D>(@"Tiles\walkable");
            tilesetTexture.Name = "Walkable";
            Tileset tileset1 = new Tileset(tilesetTexture, 10, 10, 32, 32);
            tilesetTexture = GameRef.Content.Load<Texture2D>(@"Tiles\tileset2");
            tilesetTexture.Name = "tileset2";
            Tileset tileset2 = new Tileset(tilesetTexture, 10, 10, 32, 32);
            List<Tileset> tilesets = new List<Tileset>();
            tilesets.Add(tileset1);
            tilesets.Add(tileset2);

            Texture2D pathSetText = GameRef.Content.Load<Texture2D>(@"Tiles\pathSet");
            pathSetText.Name = "pathSet";
            Tileset pathSet = new Tileset(pathSetText, 5, 5, 32, 32);
            tilesets.Add(pathSet);

            charTexture = GameRef.Content.Load<Texture2D>(@"Sprites\characterSet");
            keyTexture = GameRef.Content.Load<Texture2D>(@"Sprites\keySet");

            #endregion

            Serializer ser = new Serializer();
            MapSerialize ob = ser.DeSerializeMap(mapName);
            Session.MapProps = ob.mapProps;

            #region Back Map

            List<MapLayer> backlayers = new List<MapLayer>();
            backlayers.Add(ob.backLayer);
            backlayers.Add(ob.backSplatter);
            Session.BackMap = new TileMap(tilesets, backlayers, Session.MapProps.BackSizeX, Session.MapProps.BackSizeY, Session.MapProps.BackEngineX, Session.MapProps.BackEngineY);

            #endregion

            #region FrontMap

            List<MapLayer> frontlayers = new List<MapLayer>();
            frontlayers.Add(ob.frontLayer);
            frontlayers.Add(ob.frontSplatter);
            Session.FrontMap = new TileMap(tilesets, frontlayers, Session.MapProps.FrontSizeX, Session.MapProps.FrontSizeY, Session.MapProps.FrontEngineX, Session.MapProps.FrontEngineY);

            #endregion

            Session.FrontMap.mapLayers[0].map[25, 7].obj = 1;
            Session.FrontMap.mapLayers[0].map[17, 25].obj = 2;
            Session.FrontMap.mapLayers[0].map[12, 31].obj = 3;
            Session.FrontMap.mapLayers[0].map[26, 34].obj = 4;
            Session.FrontMap.mapLayers[0].map[49, 17].obj = "The End";

            LoadBases();

            Units = new List<Unit>();
            foreach (Unit item in ob.units)
            {
                Units.Add(baseUnits[item.Name].Clone(item.Notoriety, item.Cell.X, item.Cell.Y));
            }

            Keys = new List<GameKey>();
            foreach (GameKey item in ob.keys)
            {
                Keys.Add(baseKeys[item.index].Clone(item.Cell.X, item.Cell.Y));
            }
        }
        protected override void LoadContent()
        {
            ram = new Rectangle(770, 250, 220, 220);

            //Nacteni fontu, ramecku pro tileset a pozadi
            font = Content.Load<SpriteFont>(@"Fonts\editorFont");
            ramTexture = Content.Load<Texture2D>(@"Pictures\ram");
            background = new BackgroundComponent(GameRef, Content.Load<Texture2D>(@"Backgrounds\editorscreen"), DrawMode.Center);

            #region ovladaci prvky

            spriteFont = Content.Load<SpriteFont>(@"Fonts\menuFont");
            string[] LayermenuItems = { "Back Map", "Back Splatter", "Front Map", "Front Splatter" };
            LayerMenu = new MenuComponent(font, LayermenuItems, false);
            LayerMenu.SetPostion(new Vector2(770, 30));
            LayerMenu.SelectedColor = Color.Yellow;
            LayerMenu.HiliteColor = Color.White;

            spriteFont = Content.Load<SpriteFont>(@"Fonts\menuFont");
            string[] ActionmenuItems = { "Add", "Move", "Pick", "Delete" };
            ActionMenu = new MenuComponent(font, ActionmenuItems, false);
            ActionMenu.SetPostion(new Vector2(900, 30));
            ActionMenu.SelectedColor = Color.Yellow;
            ActionMenu.HiliteColor = Color.White;

            spriteFont = Content.Load<SpriteFont>(@"Fonts\menuFont");

            LinkLabel linkLabel1 = new LinkLabel(spriteFont);
            linkLabel1.Text = "Save";
            linkLabel1.Size = linkLabel1.SpriteFont.MeasureString(linkLabel1.Text);
            linkLabel1.Position = new Vector2(770,720);
            linkLabel1.Selected += new EventHandler(linkLabel1_Selected);
            Controls.Add(linkLabel1);

            LinkLabel linkLabel2 = new LinkLabel(spriteFont);
            linkLabel2.Text = "Load";
            linkLabel2.Size = linkLabel2.SpriteFont.MeasureString(linkLabel2.Text);
            linkLabel2.Position = new Vector2(940,720);
            linkLabel2.Selected += new EventHandler(linkLabel2_Selected);
            Controls.Add(linkLabel2);
            Controls.editor = true;

            label1 = new Label(spriteFont);
            label1.Position = new Vector2(845, 720);
            label1.Visible = false;
            Controls.Add(label1);

            Session.LoadMapAndTextures("map.xml");

            string[] CharacterStrings = new string[Session.baseUnits.Keys.Count];
            Session.baseUnits.Keys.CopyTo(CharacterStrings, 0);

            CharacterMenu = new MenuComponent(font, CharacterStrings, false);
            CharacterMenu.SetPostion(new Vector2(770, 200));
            CharacterMenu.SelectedColor = Color.Yellow;
            CharacterMenu.HiliteColor = Color.White;

            int[] KeyInts = new int[Session.baseKeys.Keys.Count];
            Session.baseKeys.Keys.CopyTo(KeyInts, 0);
            string[] KeyStrings = new string[Session.baseKeys.Keys.Count];
            for (int i = 0; i < KeyInts.Length; i++)
            {
                KeyStrings[i] = KeyInts[i].ToString();
            }

            KeyMenu = new MenuComponent(font, KeyStrings, false);
            KeyMenu.SetPostion(new Vector2(770, 200));
            KeyMenu.SelectedColor = Color.Yellow;
            KeyMenu.HiliteColor = Color.White;

            string[] TileSetmenuItems = new string[Session.FrontMap.tilesets.Count + 2];
            for (int i = 0; i < Session.FrontMap.tilesets.Count; i++)
            {
                TileSetmenuItems[i] = Session.FrontMap.tilesets[i].Texture.Name;  //files[i].Name.Substring(0, files[i].Name.Length - 4);
            }
            TileSetmenuItems[TileSetmenuItems.Length - 2] = "Characters";
            TileSetmenuItems[TileSetmenuItems.Length - 1] = "Keys";

            TileSetMenu = new MenuComponent(font, TileSetmenuItems, false);
            TileSetMenu.SetPostion(new Vector2(770, 100));
            TileSetMenu.SelectedColor = Color.Yellow;
            TileSetMenu.HiliteColor = Color.White;

            #endregion

            //Nastaveni prvniho itemu u LayerMenu
            switch (LayerMenu.clickedIndex)
            {
                case 0:
                    CurrentMap = Session.BackMap;
                    CurrentLayer = Session.BackMap.mapLayers[0];
                    break;
                case 1:
                    CurrentMap = Session.BackMap;
                    CurrentLayer = Session.BackMap.mapLayers[1];
                    break;
                case 2:
                    CurrentMap = Session.FrontMap;
                    CurrentLayer = Session.FrontMap.mapLayers[0];
                    break;
                case 3:
                    CurrentMap = Session.FrontMap;
                    CurrentLayer = Session.FrontMap.mapLayers[1];
                    break;
            }

            //Nastaveni bazoveho policka pro akce
            CurrentTile = new Tile(0, 0, -1, -1);
            CurrentTileSet = Session.FrontMap.tilesets[CurrentTile.Tileset];

            //Nacteni vstupnich ramecku pro obraz TileSetu
            int tiles = CurrentTileSet.TilesWide * CurrentTileSet.TilesHigh;
            sourceRectangles = new Rectangle[tiles];
            float Scale = (float)ram.Width / (float)Session.FrontMap.tilesets[CurrentTile.Tileset].Texture.Width;
            int tile = 0;
            for (int y = 0; y < CurrentTileSet.TilesHigh; y++)
                for (int x = 0; x < CurrentTileSet.TilesWide; x++)
                {
                    sourceRectangles[tile] = new Rectangle(
                    (int)(x * CurrentTileSet.TileWidth * Scale),
                    (int)(y * CurrentTileSet.TileWidth * Scale),
                    (int)(CurrentTileSet.TileWidth * Scale),
                    (int)(CurrentTileSet.TileHeight * Scale));
                    tile++;
                }

            base.LoadContent();
        }
        public override void Update(GameTime gameTime)
        {
            if (KeyboardInput.KeyReleased(Keys.Escape))
                manager.PopScreen();

            //Oznamovaci label
            #region Time label

            if (lvisible)
            {
                lvisible = false;
                end = gameTime.TotalGameTime + TimeSpan.FromSeconds(1);
            }
            if (end.TotalMilliseconds < gameTime.TotalGameTime.TotalMilliseconds)
            {
                label1.Visible = false;
            }

            #endregion

            //Osetreni pohybu po mape klavesnici
            #region Posun + camera

            Vector2 motion = new Vector2();

            if (KeyboardInput.KeyDown(Keys.Up))
                motion.Y = -1;
            if (KeyboardInput.KeyDown(Keys.Down))
                motion.Y = 1;
            if (KeyboardInput.KeyDown(Keys.Left))
                motion.X = -1;
            if (KeyboardInput.KeyDown(Keys.Right))
                motion.X = 1;

            Session.Camera.Position += motion * Session.Camera.Speed;
            Session.Camera.LockCamera();

            #endregion

            //Osetreni vsech menicek jejich aktualni hodnoty a nasledne vykresleni tilesetu
            #region Tlacitka + menicka

            if (LayerMenu.isMouseOver() && MouseInput.LeftButtonReleased())
            {
                switch (LayerMenu.SelectedIndex)
                {
                    case 0:
                        LayerMenu.clickedIndex = 0;
                        CurrentMap = Session.BackMap;
                        CurrentLayer = Session.BackMap.mapLayers[0];
                        break;
                    case 1:
                        LayerMenu.clickedIndex = 1;
                        CurrentMap = Session.BackMap;
                        CurrentLayer = Session.BackMap.mapLayers[1];
                        break;
                    case 2:
                        LayerMenu.clickedIndex = 2;
                        CurrentMap = Session.FrontMap;
                        CurrentLayer = Session.FrontMap.mapLayers[0];
                        break;
                    case 3:
                        LayerMenu.clickedIndex = 3;
                        CurrentMap = Session.FrontMap;
                        CurrentLayer = Session.FrontMap.mapLayers[1];
                        break;
                }
            }
            LayerMenu.Update();

            if (ActionMenu.isMouseOver() && MouseInput.LeftButtonReleased() && toMove == null)
            {
                switch (ActionMenu.SelectedIndex)
                {
                    case 0:
                        ActionMenu.clickedIndex = 0;
                        action = Action.Add;
                        break;
                    case 1:
                        ActionMenu.clickedIndex = 1;
                        action = Action.Move;
                        break;
                    case 2:
                        ActionMenu.clickedIndex = 2;
                        action = Action.Pick;
                        break;
                    case 3:
                        ActionMenu.clickedIndex = 3;
                        action = Action.Delete;
                        break;
                }
            }
            ActionMenu.Update();

            if(TileSetMenu.clickedIndex == 3)
            {
                if (CharacterMenu.isMouseOver() && MouseInput.LeftButtonReleased())
                {
                    CharacterMenu.clickedIndex = CharacterMenu.SelectedIndex;
                }
                CharacterMenu.Update();
            }
            if (TileSetMenu.clickedIndex == 4)
            {
                if (KeyMenu.isMouseOver() && MouseInput.LeftButtonReleased())
                {
                    KeyMenu.clickedIndex = KeyMenu.SelectedIndex;
                }
                KeyMenu.Update();
            }

            if (TileSetMenu.isMouseOver() && MouseInput.LeftButtonReleased())
            {
                TileSetMenu.clickedIndex = TileSetMenu.SelectedIndex;
                if (TileSetMenu.clickedIndex < 3)
                {
                    CurrentTile.TileIndex = 0;
                    CurrentTile.Tileset = TileSetMenu.clickedIndex;
                    CurrentTileSet = Session.FrontMap.tilesets[CurrentTile.Tileset];

                    int tiles = CurrentTileSet.TilesWide * CurrentTileSet.TilesHigh;
                    sourceRectangles = new Rectangle[tiles];
                    float Scale = (float)ram.Width / (float)Session.FrontMap.tilesets[CurrentTile.Tileset].Texture.Width;
                    int tile = 0;
                    for (int y = 0; y < CurrentTileSet.TilesHigh; y++)
                        for (int x = 0; x < CurrentTileSet.TilesWide; x++)
                        {
                            sourceRectangles[tile] = new Rectangle(
                            (int)(x * CurrentTileSet.TileWidth * Scale),
                            (int)(y * CurrentTileSet.TileWidth * Scale),
                            (int)(CurrentTileSet.TileWidth * Scale),
                            (int)(CurrentTileSet.TileHeight * Scale));
                            tile++;
                        }
                }
            }
            TileSetMenu.Update();
            Controls.Update(gameTime);

            #endregion

            //Osetreni akci provedenych do mapy
            #region Actions

            switch (action)
            {
                case Action.Delete:
                    {
                        if (MouseInput.MouseOver(Session.ViewportRect.X, Session.ViewportRect.Y, Session.ViewportRect.Width, Session.ViewportRect.Height) && MouseInput.MouseState.LeftButton == ButtonState.Pressed)
                        {
                            if (TileSetMenu.clickedIndex < 3)
                            {
                                Tile tmp = CurrentLayer.GetTile(CurrentMap.MouseToPoint());
                                CurrentLayer.SetTile(tmp.X, tmp.Y, -1, -1, true);
                            }
                            else if (TileSetMenu.clickedIndex == 3 && MouseInput.LeftButtonPressed())
                            {
                                Tile tmp = Session.FrontMap.GetTile(Session.FrontMap.MouseToPoint());
                                Unit u = (Unit)tmp.obj;
                                Session.Units.Remove(u);
                                tmp.obj = null;
                            }
                            else if (TileSetMenu.clickedIndex == 4 && MouseInput.LeftButtonPressed())
                            {
                                Tile tmp = Session.FrontMap.GetTile(Session.FrontMap.MouseToPoint());
                                GameKey u = (GameKey)tmp.obj;
                                Session.Keys.Remove(u);
                                tmp.obj = null;
                            }
                        }

                        break;
                    }
                case Action.Add:
                    {
                        if (MouseInput.MouseOver(Session.ViewportRect.X, Session.ViewportRect.Y, Session.ViewportRect.Width, Session.ViewportRect.Height) && MouseInput.MouseState.LeftButton == ButtonState.Pressed)
                        {
                            if (TileSetMenu.clickedIndex < 3)
                            {
                                Tile tmp = CurrentLayer.GetTile(CurrentMap.MouseToPoint());
                                if (CurrentTile.Tileset == 1)
                                    CurrentLayer.SetTile(tmp.X, tmp.Y, CurrentTile.TileIndex, CurrentTile.Tileset, false);
                                else
                                    CurrentLayer.SetTile(tmp.X, tmp.Y, CurrentTile.TileIndex, CurrentTile.Tileset, true);
                            }
                            else if (TileSetMenu.clickedIndex == 3 && MouseInput.LeftButtonPressed())
                            {
                                Tile tmp = Session.FrontMap.GetTile(Session.FrontMap.MouseToPoint());
                                Session.Units.Add(Session.baseUnits[CharacterMenu.menuItems[CharacterMenu.clickedIndex]].Clone(Notoriety.Enemy, tmp.X, tmp.Y));
                            }
                            else if (TileSetMenu.clickedIndex == 4 && MouseInput.LeftButtonPressed())
                            {
                                Tile tmp = Session.FrontMap.GetTile(Session.FrontMap.MouseToPoint());
                                Session.Keys.Add(Session.baseKeys[KeyMenu.clickedIndex + 1].Clone(tmp.X, tmp.Y));
                            }
                        }
                        break;
                    }
                case Action.Pick:
                    {
                        if (MouseInput.MouseOver(Session.ViewportRect.X, Session.ViewportRect.Y, Session.ViewportRect.Width, Session.ViewportRect.Height) && MouseInput.MouseState.LeftButton == ButtonState.Pressed)
                        {
                            Tile tmp = CurrentLayer.GetTile(CurrentMap.MouseToPoint());
                            CurrentTile = new Tile(tmp.TileIndex, tmp.Tileset, -1, -1);
                            TileSetMenu.clickedIndex = tmp.Tileset;
                        }
                        break;
                    }
                case Action.Move:
                    {
                        if (MouseInput.MouseOver(Session.ViewportRect.X, Session.ViewportRect.Y, Session.ViewportRect.Width, Session.ViewportRect.Height) && MouseInput.LeftButtonPressed())
                        {
                            if (toMove == null)
                            {
                                toMove = CurrentLayer.GetTile(CurrentMap.MouseToPoint());
                            }
                            else
                            {
                                Tile tmp = CurrentLayer.GetTile(CurrentMap.MouseToPoint());
                                if (CurrentTile.Tileset == 1)
                                    CurrentLayer.SetTile(tmp.X, tmp.Y, toMove.TileIndex, toMove.Tileset, false);
                                else
                                    CurrentLayer.SetTile(tmp.X, tmp.Y, CurrentTile.TileIndex, CurrentTile.Tileset, true);
                                CurrentLayer.SetTile(toMove.X, toMove.Y, -1, -1, true);
                                toMove = null;
                            }
                        }
                        break;
                    }
            }

            #endregion

            //Osetreni kliku do tilesetu a nastaveni bazoveho policka pro upravu
            #region Get CurrentTile
            if (MouseInput.MouseOver(ram.X, ram.Y, ram.Width, ram.Height))
            {
                if (MouseInput.LeftButtonReleased())
                {
                    Point p = new Point(MouseInput.MouseState.X, MouseInput.MouseState.Y);
                    p.X -= ram.X;
                    p.Y -= ram.Y;
                    int tiles = CurrentTileSet.TilesWide * CurrentTileSet.TilesHigh;
                    for (int i = 0; i < tiles; i++)
                    {
                        if (sourceRectangles[i].Contains(p))
                        {
                            CurrentTile.TileIndex = i;
                            break;
                        }
                    }
                }
            }

            #endregion

            //Update vsech jednotek a klicu
            Session.UpdateMap(gameTime);
            base.Update(gameTime);
        }