public StageInfo LoadStageXml(FilePath path)
{
_info = new StageInfo();
_info.StagePath = path;
var mapXml = XElement.Load(Path.Combine(_info.StagePath.Absolute, "map.xml"));
_info.Name = Path.GetFileNameWithoutExtension(_info.StagePath.Absolute);
string tilePathRel = mapXml.Attribute("tiles").Value;
var tilePath = FilePath.FromRelative(tilePathRel, _info.StagePath.BasePath);
var tileset = new TilesetXmlReader().Load(tilePath);
_info.ChangeTileset(tileset);
_info.PlayerStartX = 3;
_info.PlayerStartY = 3;
LoadMusicXml(mapXml);
LoadScreens(mapXml);
XElement start = mapXml.Element("Start");
if (start != null)
{
_info.StartScreen = start.RequireAttribute("screen").Value;
_info.PlayerStartX = start.GetAttribute<int>("x");
_info.PlayerStartY = start.GetAttribute<int>("y");
}
foreach (XElement contPoint in mapXml.Elements("Continue"))
{
string screen = contPoint.GetAttribute<string>("screen");
int x = contPoint.GetAttribute<int>("x");
int y = contPoint.GetAttribute<int>("y");
_info.AddContinuePoint(screen, new Point(x, y));
}
foreach (XElement join in mapXml.Elements("Join"))
{
string t = join.Attribute("type").Value;
JoinType type;
if (t.ToLower() == "horizontal") type = JoinType.Horizontal;
else if (t.ToLower() == "vertical") type = JoinType.Vertical;
else throw new GameXmlException(join, "map.xml file contains invalid join type.");
string s1 = join.RequireAttribute("s1").Value;
string s2 = join.RequireAttribute("s2").Value;
int offset1 = join.GetAttribute<int>("offset1");
int offset2 = join.GetAttribute<int>("offset2");
int size = join.GetAttribute<int>("size");
JoinDirection direction;
XAttribute dirAttr = join.Attribute("direction");
if (dirAttr == null || dirAttr.Value.ToUpper() == "BOTH") direction = JoinDirection.Both;
else if (dirAttr.Value.ToUpper() == "FORWARD") direction = JoinDirection.ForwardOnly;
else if (dirAttr.Value.ToUpper() == "BACKWARD") direction = JoinDirection.BackwardOnly;
else throw new GameXmlException(dirAttr, "map.xml file contains invalid join direction.");
string bosstile = null;
XAttribute bossAttr = join.Attribute("bossdoor");
bool bossdoor = (bossAttr != null);
if (bossdoor) bosstile = bossAttr.Value;
Join j = new Join();
j.direction = direction;
j.screenOne = s1;
j.screenTwo = s2;
j.offsetOne = offset1;
j.offsetTwo = offset2;
j.type = type;
j.Size = size;
j.bossDoor = bossdoor;
j.bossEntityName = bosstile;
_info.Joins.Add(j);
}
return _info;
}