public string SerializeLevel(Level l)
        {
            var types =
                from q
                in System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
                where q.IsSubclassOf(typeof(Unicorn21.GameObjects.StaticGameObject)) || q.IsSubclassOf(typeof(LevelChunk))
                select q;

            //try
            //{
            //    var exTypes =
            //        from r
            //            in System.Reflection.Assembly.LoadFile(l.GameObjectsPath).GetTypes()
            //        where r.IsSubclassOf(typeof(Unicorn21.GameObjects.GameObject))
            //        select r;

            //    types = types.Union(exTypes);
            //}
            //catch
            //{
            //}
            var sw = new System.IO.StringWriter();
            System.Xml.Serialization.XmlSerializer x = new
                System.Xml.Serialization.XmlSerializer(l.GetType(), types.ToArray());

            x.Serialize(sw, l);
            return sw.ToString();
        }
        public void SaveLevel(Level l, string path)
        {
            var types = from q in System.Reflection.Assembly.GetExecutingAssembly().GetTypes() where q.IsSubclassOf(typeof(Unicorn21.GameObjects.StaticGameObject)) || q.IsSubclassOf( typeof(Unicorn21.GameObjects.LevelChunk)) select q;

            //var exTypes = from r in System.Reflection.Assembly.LoadFile(l.GameObjectsPath).GetTypes() where r.IsSubclassOf(typeof(Unicorn21.GameObjects.GameObject)) select r;

            //types = types.Union(exTypes);

            System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(l.GetType(), types.ToArray());
            x.Serialize(new System.IO.FileStream(path,System.IO.FileMode.Create), l);
        }
        public void DoPhysics(double dt, Level l)
        {
            var xTest = this.X + ((this.Vx) * dt);
            var yTest = this.Y + ((this.Vy) * dt);

            bool hitx = false;
            foreach (var levelObject in l.Chunks)
            {
                if (Collisions.LevelChunkCollision(
                    new Circle2D(
                        new Vector2D(xTest, this.Y),
                        this.Radius),
                    this.Z,
                    this.Height,
                    levelObject))
                {
                    hitx = true;
                    break;
                }

            }

            bool hity = false;
            foreach (var levelObject in l.Chunks)
            {
                if (Collisions.LevelChunkCollision(new Circle2D(new Vector2D(this.X, yTest), this.Radius),
                   this.Z, this.Height, levelObject))
                {
                    hity = true;
                    break;
                }

            }

            if (!hitx) this.X += this.Velocity.X * dt;

            if (!hity) this.Y += this.Velocity.Y * dt;

            var corridors = (from x in l.Chunks where x is Corridor select x as Corridor).ToList();

            var intersectingCorridor = new List<Corridor>();
            foreach (var x in corridors)
            {
                if (Intersections.IsPointInPolygon(x.Area, this.Position))
                {
                    intersectingCorridor.Add(x);
                }
            }

            var ordered = (from x in intersectingCorridor orderby x.FloorHeight descending select x).ToList();

            LevelChunk highest = ordered.FirstOrDefault();

            var platforms = (from x in l.Chunks where x is Platform select x as Platform).ToList();
            var intersectingPlatforms = new List<Platform>();

            foreach (var x in platforms)
            {
                if (Intersections.IsPointInPolygon(x.Area, this.Position)
                    &&
                    (this.Z + this.Height / 2) > (x.FloorHeight)
                    )
                {
                       intersectingPlatforms.Add(x);
                }
            }

            var orderedPlatforms = (from x in intersectingPlatforms orderby x.FloorHeight descending select x).ToList();

            if (orderedPlatforms.Count > 0)
            {
                highest = orderedPlatforms.First();
            }

            double heightestHeight =-1000;

            if (highest is Corridor)
            {

                heightestHeight = (highest as Corridor).FloorHeight;

            }

            if (highest is Platform)
            {

                heightestHeight = (highest as Platform).FloorHeight;

            }

            this.IsAirborne = (this.Z > heightestHeight);

            if (!this.IsAirborne)
            {
                Console.WriteLine("XYZ: {0}, {1}, {2} -- highest: {3}", X, Y, Z, highest.GetType().Name);
                if (highest is Platform)
                {
                    Console.WriteLine("On Platform");
                }

                this.Vz = 0;
                this.Z = heightestHeight;

            }
            else
            {
                // gravity is in play!
                this.Vz += (l.Gravity * dt);
                this.Z += (this.Vz * dt);
            }

            this.Vx *= highest.FloorFriction;
            this.Vy *= highest.FloorFriction;
        }
 public SandboxGameInstance(Level l)
     : base(l)
 {
 }
 public GameInstance(Level l)
 {
     _livingGameObjects = new List<DynamicGameObject>();
     _gameActions = new Queue<GameActions.GameAction>();
     _level = l;
 }