public bool Load(XElement root, GameMain gameMain)
{
var galaxyElement = root.Element("Galaxy");
if (galaxyElement == null)
{
return false;
}
GalaxySize = int.Parse(galaxyElement.Attribute("Width").Value);
starSystems = new List<StarSystem>();
_quickLookupSystem = new Dictionary<int, StarSystem>();
var starsElement = galaxyElement.Element("Stars");
foreach (var star in starsElement.Elements())
{
string name = star.Attribute("Name").Value;
string description = star.Attribute("Description").Value;
int id = int.Parse(star.Attribute("ID").Value);
int xPos = int.Parse(star.Attribute("XPos").Value);
int yPos = int.Parse(star.Attribute("YPos").Value);
string[] color = star.Attribute("Color").Value.Split(new[] {','});
float[] starColor = new float[4];
for (int i = 0; i < 4; i++)
{
starColor[i] = float.Parse(color[i]);
}
StarSystem newStar = new StarSystem(name, id, xPos, yPos, Color.FromArgb((int)(255 * starColor[3]), (int)(255 * starColor[0]), (int)(255 * starColor[1]), (int)(255 * starColor[2])), description, gameMain.Random);
newStar.ExploredByIDs = star.Attribute("ExploredBy").Value;
foreach (var planetElement in star.Elements())
{
string planetName = planetElement.Attribute("Name").Value;
string type = planetElement.Attribute("Type").Value;
int owner = -1;
if (!string.IsNullOrEmpty(planetElement.Attribute("Owner").Value))
{
owner = int.Parse(planetElement.Attribute("Owner").Value);
}
int populationMax = int.Parse(planetElement.Attribute("MaxPopulation").Value);
var newPlanet = new Planet(planetName, type, populationMax, null, newStar, gameMain.Random);
newPlanet.OwnerID = owner;
newPlanet.Factories = float.Parse(planetElement.Attribute("Buildings").Value);
newPlanet.EnvironmentAmount = int.Parse(planetElement.Attribute("EnvironmentPercentage").Value);
newPlanet.InfrastructureAmount = int.Parse(planetElement.Attribute("InfrastructurePercentage").Value);
newPlanet.DefenseAmount = int.Parse(planetElement.Attribute("DefensePercentage").Value);
newPlanet.ConstructionAmount = int.Parse(planetElement.Attribute("ConstructionPercentage").Value);
newPlanet.ResearchAmount = int.Parse(planetElement.Attribute("ResearchPercentage").Value);
newPlanet.EnvironmentLocked = bool.Parse(planetElement.Attribute("EnvironmentLocked").Value);
newPlanet.InfrastructureLocked = bool.Parse(planetElement.Attribute("InfrastructureLocked").Value);
newPlanet.DefenseLocked = bool.Parse(planetElement.Attribute("DefenseLocked").Value);
newPlanet.ConstructionLocked = bool.Parse(planetElement.Attribute("ConstructionLocked").Value);
newPlanet.ResearchLocked = bool.Parse(planetElement.Attribute("ResearchLocked").Value);
newPlanet.ShipBeingBuiltID = int.Parse(planetElement.Attribute("ShipBuilding").Value);
newPlanet.ShipConstructionAmount = float.Parse(planetElement.Attribute("AmountBuilt").Value);
newPlanet.RelocateToSystemID = int.Parse(planetElement.Attribute("RelocatingTo").Value);
var transferTo = planetElement.Element("TransferTo");
if (transferTo != null)
{
newPlanet.TransferSystemID = new KeyValuePair<int, int>(int.Parse(transferTo.Attribute("StarSystem").Value), int.Parse(transferTo.Attribute("Amount").Value));
}
var races = planetElement.Element("Races");
foreach (var race in races.Elements())
{
newPlanet.AddRacePopulation(gameMain.RaceManager.GetRace(race.Attribute("RaceName").Value), float.Parse(race.Attribute("Amount").Value));
}
newStar.Planets.Add(newPlanet);
}
starSystems.Add(newStar);
_quickLookupSystem.Add(newStar.ID, newStar);
}
//Now match up IDs to actual classes
foreach (var starSystem in starSystems)
{
foreach (var planet in starSystem.Planets)
{
if (planet.RelocateToSystemID != -1)
{
planet.RelocateToSystem = new TravelNode {StarSystem = _quickLookupSystem[planet.RelocateToSystemID]};
planet.RelocateToSystemID = -1;
}
if (!planet.TransferSystemID.Equals(new KeyValuePair<int, int>()))
{
planet.TransferSystem = new KeyValuePair<TravelNode, int>(new TravelNode { StarSystem = _quickLookupSystem[planet.TransferSystemID.Key] }, planet.TransferSystemID.Value);
}
}
}
return true;
}