protected override void OnLoad(EventArgs e)
 {
     scene = SceneLoader.FromFile("Levels\\Test.xml");
     base.OnLoad(e);
 }
        public static Scene FromXml(string xml)
        {
            const string me = "SceneLoader";
            NumberStyles styles = NumberStyles.Number;
            CultureInfo culture = CultureInfo.InvariantCulture;
            Scene scene = new Scene();

            scene.Resources.LoadResource("Sound\\Environment\\WalkerPropCollision.mp3");
            scene.Jukebox.AssertSound("Sound\\Environment\\WalkerPropCollision.mp3", "WalkerPropCollision");

            scene.Resources.LoadResource("Sound\\Footsteps\\step1.mp3");
            scene.Resources.LoadResource("Sound\\Footsteps\\step2.mp3");
            scene.Resources.LoadResource("Sound\\Footsteps\\step3.mp3");
            scene.Resources.LoadResource("Sound\\Footsteps\\step4.mp3");
            scene.Jukebox.AssertSound("Sound\\Footsteps\\step1.mp3", "step1");
            scene.Jukebox.AssertSound("Sound\\Footsteps\\step2.mp3", "step2");
            scene.Jukebox.AssertSound("Sound\\Footsteps\\step3.mp3", "step3");
            scene.Jukebox.AssertSound("Sound\\Footsteps\\step4.mp3", "step4");
            scene.Player.AddStepSound("step1");
            scene.Player.AddStepSound("step2");
            scene.Player.AddStepSound("step3");
            scene.Player.AddStepSound("step4");

            XmlDocument document = new XmlDocument();
            document.LoadXml(xml);
            XmlElement level = document["level"];

            XmlElement resources = level["resources"];
            XmlElement entities = level["entities"];
            XmlElement scripts = level["scripts"];
            XmlElement player = level["player"];

            Func<XmlElement, string, double> ParseDoubleAttr = (element, name) =>
                double.Parse(element.Attributes[name].Value, styles, culture);
            Func<XmlElement, string, bool> ParseBoolAttr = (element, name) =>
                bool.Parse(element.Attributes[name].Value);

            scene.Player.X = ParseDoubleAttr(player, "x");
            scene.Player.Y = ParseDoubleAttr(player, "y");
            scene.Player.Z = ParseDoubleAttr(player, "z");

            foreach (XmlElement child in resources.ChildNodes)
            {
                if (child.Name == "resource")
                {
                    string path = child.Attributes["path"].Value;
                    string macro = child.Attributes["macro"].Value;
                    scene.Resources.LoadResource(path);
                    scene.Jukebox.AssertSound(path, macro);
                    LogConsole.Info(me, "Loading '{0}'", path);
                }
            }

            foreach (XmlElement child in scripts.ChildNodes)
            {
                // TODO: Parse 'n compile scripts!
            }

            foreach (XmlElement child in entities.ChildNodes)
            {
                if (child.Name == "entity")
                {
                    var typename = "InvisibilityGame." + child.Attributes["class"].Value;
                    var args = new object[1] { child.Attributes["name"].Value };
                    var type = Type.GetType(typename);
                    Entity ent = (Entity)Activator
                        .CreateInstance(type, args);

                    if (child.HasAttribute("x"))
                        ent.X = ParseDoubleAttr(child, "x");
                    if (child.HasAttribute("y"))
                        ent.Y = ParseDoubleAttr(child, "y");
                    if (child.HasAttribute("z"))
                        ent.Z = ParseDoubleAttr(child, "z");
                    if (child.HasAttribute("width"))
                        ent.Width = ParseDoubleAttr(child, "width");
                    if (child.HasAttribute("height"))
                        ent.Height = ParseDoubleAttr(child, "height");
                    if (child.HasAttribute("length"))
                        ent.Length = ParseDoubleAttr(child, "length");

                    scene.AddEntity(ent);
                }
            }

            return scene;
        }