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(); }