public void Release()
        {
            MyCollection.Release();
            MyCollection = null;

            MyType    = null;
            MyTileSet = null;

            MyLevel = null;
        }
        public static Background UseCode(BackgroundTemplate template, Background b)
        {
            b.MyCollection.Lists.Clear();

            template.Code(b);

            b.SetLevel(b.MyLevel);
            b.SetBackground(b);

            //b.Move(new Vector2(Tools.GlobalRnd.RndFloat(0, -15000), 0));

            b.Reset();

            return(b);
        }
        public static void Load(string path)
        {
            BackgroundTemplate template;

            if (PathLookup.ContainsKey(path))
            {
                template = PathLookup[path];
            }
            else
            {
                template = new BackgroundTemplate();

                var name = Tools.GetFileName(path);
                template.Name = name;
                template.File = path;

                AddTemplate(template);
            }

            template.MadeOfCode = false;
            template.MadeOfText = true;
        }
        public override void Init(Level level)
        {
            MyLevel      = level;
            MyCollection = new BackgroundCollection(MyLevel);
            TR           = new Vector2(5000, 2000);
            BL           = new Vector2(-2000, -2000);

            if (MyTemplate != null)
            {
                if (MyTemplate.MadeOfCode)
                {
                    if (level.Geometry == LevelGeometry.Up || level.Geometry == LevelGeometry.Down)
                    {
                        MyTemplate = BackgroundType._Castle_Vertical;
                    }

                    UseCode(MyTemplate, this);
                }
                else if (MyTemplate.MadeOfText)
                {
                    Load(MyTemplate.File);
                }
            }
        }
 public static void AddTemplate(BackgroundTemplate template)
 {
     NameLookup.AddOrOverwrite(template.Name, template);
     PathLookup.AddOrOverwrite(template.File, template);
 }
 public static Background Get(BackgroundTemplate Type)
 {
     return(Type.MakeInstanceOf());
 }
        /// <summary>
        /// Read tileset info from a file.
        /// </summary>
        public void Read(String path)
        {
            MyPath = path;
            _Start();

            // Find path
            Tools.UseInvariantCulture();
            FileStream stream        = null;
            string     original_path = path;

            try
            {
                stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None);
            }
            catch
            {
                try
                {
                    path   = Path.Combine(Globals.ContentDirectory, original_path);
                    stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None);
                }
                catch
                {
                    try
                    {
                        path   = Path.Combine(Globals.ContentDirectory, Path.Combine("DynamicLoad", original_path));
                        stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None);
                    }
                    catch
                    {
                        Tools.Log(string.Format("Attempting to load a .tileset file. Path <{0}> not found."));
                    }
                }
            }


            StreamReader reader = new StreamReader(stream);

            String line;

            line = reader.ReadLine();
            while (line != null)
            {
                var bits = Tools.GetBitsFromLine(line);

                if (bits.Count > 1)
                {
                    var first = bits[0];

                    // Is it a pillar?
                    if (first.Contains("Pillar_"))
                    {
                        ParseBlock(bits, first, Pillars);
                    }
                    // Is it a platform?
                    else if (first.Contains("Platform_"))
                    {
                        ParseBlock(bits, first, Platforms);
                    }
                    // Is it a ceiling?
                    else if (first.Contains("Ceiling_"))
                    {
                        HasCeiling = true;
                        var pq = ParseBlock(bits, first, Ceilings);
                        pq.Data.BottomFlush = true;
                    }
                    // Is it a start piece?
                    if (first.Contains("Start_"))
                    {
                        ParseBlock(bits, first, StartBlock);
                    }
                    // Is it an end piece?
                    if (first.Contains("End_"))
                    {
                        ParseBlock(bits, first, EndBlock);
                    }
                    // Is it a moving block?
                    else if (first.Contains("MovingBlock_"))
                    {
                        ParseBlock(bits, first, MyTileSetInfo.MovingBlocks.Group);
                    }
                    // Is it an elevator block?
                    else if (first.Contains("Elevator_"))
                    {
                        ParseBlock(bits, first, MyTileSetInfo.Elevators.Group);
                    }
                    // Is it a pendulum block?
                    else if (first.Contains("Pendulum_"))
                    {
                        ParseBlock(bits, first, MyTileSetInfo.Pendulums.Group);
                    }
                    // Is it a falling block?
                    else if (first.Contains("FallingBlock_"))
                    {
                        ParseBlock(bits, first, MyTileSetInfo.FallingBlocks.Group);
                    }
                    // Is it a bouncy block?
                    else if (first.Contains("BouncyBlock_"))
                    {
                        ParseBlock(bits, first, MyTileSetInfo.BouncyBlocks.Group);
                    }
                    else
                    {
                        switch (first)
                        {
                        case "sprite_anim":
                            var dict = Tools.GetLocations(bits, "name", "file", "size", "frames", "frame_length", "reverse_at_end");

                            var name = bits[dict["name"] + 1];
                            var file = bits[dict["file"] + 1];

                            AnimationData_Texture sprite_anim = null;
                            if (dict.ContainsKey("frames"))
                            {
                                int start_frame = int.Parse(bits[dict["frames"] + 1]);
                                int end_frame;
                                if (bits[dict["frames"] + 2][0] == 't')
                                {
                                    end_frame = int.Parse(bits[dict["frames"] + 3]);
                                }
                                else
                                {
                                    end_frame = int.Parse(bits[dict["frames"] + 2]);
                                }
                                sprite_anim = new AnimationData_Texture(file, start_frame, end_frame);
                            }

                            if (dict.ContainsKey("frame_length"))
                            {
                                var frame_length = int.Parse(bits[dict["frame_length"] + 1]);
                                sprite_anim.Anims[0].Speed = 1f / frame_length;
                            }

                            Tools.TextureWad.Add(sprite_anim, name);

                            break;

                        case "BackgroundFile":
                            BackgroundTemplate template;
                            try
                            {
                                template = BackgroundType.NameLookup[bits[1]];
                            }
                            catch
                            {
                                template      = new BackgroundTemplate();
                                template.Name = bits[1];
                            }

                            MyBackgroundType = template;

                            break;

                        case "Name": Name = bits[1]; break;

                        default:
                            Tools.ReadLineToObj(MyTileSetInfo, bits);
                            break;
                        }
                    }
                }

                line = reader.ReadLine();
            }

            reader.Close();
            stream.Close();

            _Finish();
        }