private void LoadMap()
        {
            if (tm != null)
            {
                tm.Dispose();
            }

            tm.Objects = new List<MapObject>();
            newObjects = new List<MapObject>();

            playerDoc = XDocument.Load(Player.SavePath);
            tileDoc = XDocument.Load(TerrainGridHex.SavePath);
            turnDoc = XDocument.Load(Turn.SavePath);

            players = new List<Player>();

            int cnt = playerDoc.XPathSelectElements("Players/Player").Count();

            for (int i = 1; i <= cnt; i++)
            {
                XElement e = playerDoc.XPathSelectElement("Players/Player[Position=\"" + i.ToString() + "\"]");

                String name = e.Element("Name").Value;
                int position = int.Parse(e.Element("Position").Value);
                String race = e.Element("Race").Value;
                String password = e.Element("Password").Value;
                int hor = int.Parse(e.Element("Horizontal").Value);
                int ver = int.Parse(e.Element("Vertical").Value);

                Player p = new Player(name, position, race, password, false, hor, ver);

                players.Add(p);

                //Load towns
                foreach (var elem in e.XPathSelectElements("Buildings/Town"))
                {
                    String _name = elem.Element("Name").Value;
                    int _level = int.Parse(elem.Element("Level").Value);
                    bool _levelChanged = bool.Parse(elem.Element("LevelChanged").Value);
                    String _coverLevel = elem.Element("CoverLevel").Value;
                    String _wallLevel = elem.Element("WallLevel").Value;
                    String _towerLevel = elem.Element("TowerLevel").Value;
                    int _x = int.Parse(elem.Element("X").Value);
                    int _y = int.Parse(elem.Element("Y").Value);
                    String _imgPath = elem.Element("ImagePath").Value;

                    Town t = new Town(_name, _level, _x, _y, _imgPath, name, _coverLevel, _wallLevel, _towerLevel, _levelChanged);

                    if (_x == -1)
                    {
                        newObjects.Add(t);
                    }

                    tm.AddObject(t);
                    p.AddTown(t);
                }

                //Load watchtowers
                foreach (var elem in e.XPathSelectElements("Buildings/Watchtower"))
                {
                    String _name = elem.Element("Name").Value;
                    int _gs = int.Parse(elem.Element("GarrisonSize").Value);
                    int _x = int.Parse(elem.Element("X").Value);
                    int _y = int.Parse(elem.Element("Y").Value);
                    String _imgPath = elem.Element("ImagePath").Value;

                    Watchtower wt = new Watchtower(_name, _x, _y, name, _imgPath, _gs);

                    if (_x == -1)
                    {
                        newObjects.Add(wt);
                    }

                    tm.AddObject(wt);
                    p.AddWatchtower(wt);
                }

                //Load castles
                foreach (var elem in e.XPathSelectElements("Buildings/Castle"))
                {
                    String _name = elem.Element("Name").Value;
                    int _level = int.Parse(elem.Element("Level").Value);
                    bool _levelChanged = bool.Parse(elem.Element("LevelChanged").Value);
                    int _x = int.Parse(elem.Element("X").Value);
                    int _y = int.Parse(elem.Element("Y").Value);
                    String _imgPath = elem.Element("ImagePath").Value;
                    String _wallLevel = elem.Element("WallLevel").Value;
                    String _towerLevel = elem.Element("TowerLevel").Value;
                    String _gatehouseLevel = elem.Element("GatehouseLevel").Value;

                    Castle c = new Castle(_name, _level, _levelChanged, _x, _y, _imgPath, name, _wallLevel, _towerLevel, _gatehouseLevel);

                    if (_x == -1)
                    {
                        newObjects.Add(c);
                    }

                    tm.AddObject(c);
                    p.AddCastle(c);
                }

                //Load armies
                foreach (var elem in e.XPathSelectElements("Armies/Army"))
                {
                    String _name = elem.Element("Name").Value;
                    String _type = elem.Element("Type").Value;
                    int _x = int.Parse(elem.Element("X").Value);
                    int _y = int.Parse(elem.Element("Y").Value);
                    double _moveTotal = double.Parse(elem.Element("MoveTotal").Value);
                    double _moveLeft = double.Parse(elem.Element("MoveLeft").Value);
                    Pen _color = new Pen(Color.FromName(elem.Element("Color").Value));
                    int _size = int.Parse(elem.Element("Size").Value);
                    bool _canBuild = bool.Parse(elem.Element("CanBuild").Value);
                    String _imgPath = elem.Element("ImgPath").Value;
                    List<Resource> _upkeepCost = new List<Resource>();
                    elem.Element("Upkeep").Attributes().ToList().ForEach(val => _upkeepCost.Add(new Resource(val.Name.ToString(), int.Parse(val.Value))));

                    Army a = new Army(_x, _y, _name, _type, _moveTotal, _moveLeft, _color, _size, name, _canBuild, _imgPath, _upkeepCost);

                    if (_x == -1)
                    {
                        newObjects.Add(a);
                    }

                    tm.AddObject(a);
                    p.AddArmy(a);
                }

                //Load resources
                foreach (var elem in e.XPathSelectElements("Resources").Elements())
                {
                    String _name = elem.Name.ToString();
                    int _amt = int.Parse(elem.Value);

                    p.Race.GetResource(_name).Value = _amt;
                }
            }

            //Load battles
            foreach (var e in playerDoc.XPathSelectElements("Players/Player/Armies/Army[IsInBattle=\"true\" or IsInBattle=\"True\"]"))
            {
                Army a = tm.Armies.Find((val) => val.Name == e.Element("Name").Value);
                MapObject mo = tm.Objects.Find((val) => val.Name == e.Element("UnitAttacked").Value);

                a.Attack(mo);
            }

            //Load sieges
            foreach (var e in playerDoc.XPathSelectElements("Players/Player/Armies/Army[IsSieging=\"true\" or IsSieging=\"True\"]"))
            {
                Army a = tm.Armies.Find((val) => val.Name == e.Element("Name").Value);
                Castle c = tm.Castles.Find((val) => val.Name == e.Element("UnitAttacked").Value);
                Town t = tm.Towns.Find((val) => val.Name == e.Element("UnitAttacked").Value);

                if (c != null) a.Siege(c);
                if (t != null) a.Siege(t);
            }

            //Load turn
            String _currentPlayer = turnDoc.XPathSelectElement("Turn/CurrentPlayer").Value;
            int _yearNo = int.Parse(turnDoc.XPathSelectElement("Turn/YearNo").Value);
            int _monthNo = int.Parse(turnDoc.XPathSelectElement("Turn/MonthNo").Value);
            bool _isStartOfTurn = bool.Parse(turnDoc.XPathSelectElement("Turn/IsStartOfTurn").Value);

            turn = new Turn(players, _currentPlayer, _yearNo, _monthNo, _isStartOfTurn);

            tm.BoardHexes.ForEach((val) => ((TerrainGridHex)val).IsSummer = (_monthNo <= 8));

            //New object to be placed logic
            if (newObjects.Count > 0) newObject = newObjects.First();
        }