public CompilerForm(string table)
        {
            InitializeComponent();
            Text      = "Clockwork engine resource compiler V" + Version;
            TablePath = table;

            MainSplitContainer.Panel1.Enabled = false;
            LoaderWorker.RunWorkerAsync();
        }
        private void LoaderWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            LoaderWorker.ReportProgress(0);

            if (File.Exists(TablePath))
            {
                LogQueue.Put("Reading ID table...");
                using (var r = File.OpenText(TablePath))
                {
                    while (!r.EndOfStream)
                    {
                        var line = r.ReadLine();
                        switch (line)
                        {
                        case "[Tiles]": TilesIDTable.Read(r, (string path) => { return(Resource.GetType(path) == ResourceType.Tile); }); break;

                        case "[Events]": EventsIDTable.Read(r, (string path) => { return(Resource.GetType(path) == ResourceType.Event); }); break;

                        case "[Entities]": EntitiesIDTable.Read(r, (string path) => { return(Resource.GetType(path) == ResourceType.Entity); }); break;

                        case "[Outfits]": OutfitsIDTable.Read(r, (string path) => { return(Resource.GetType(path) == ResourceType.Outfit); }); break;

                        case "[Items]": ItemsIDTable.Read(r, (string path) => { return(Resource.GetType(path) == ResourceType.Item); }); break;
                        }
                    }
                }
                LogQueue.Put("Tiles loaded: " + TilesIDTable.Count);
                LogQueue.Put("Tiles valid: " + TilesIDTable.Items.Count((IDTable.Item i) => { return(i.Valid); }));
                LogQueue.Put("Events loaded: " + EventsIDTable.Count);
                LogQueue.Put("Events valid: " + EventsIDTable.Items.Count((IDTable.Item i) => { return(i.Valid); }));
                LogQueue.Put("Entities loaded: " + EntitiesIDTable.Count);
                LogQueue.Put("Entities valid: " + EntitiesIDTable.Items.Count((IDTable.Item i) => { return(i.Valid); }));
                LogQueue.Put("Outfits loaded: " + OutfitsIDTable.Count);
                LogQueue.Put("Outfits valid: " + OutfitsIDTable.Items.Count((IDTable.Item i) => { return(i.Valid); }));
                LogQueue.Put("items loaded: " + ItemsIDTable.Count);
                LogQueue.Put("Items valid: " + ItemsIDTable.Items.Count((IDTable.Item i) => { return(i.Valid); }));
                LogQueue.Put("Reading ID table done.");
            }
            else
            {
                LogQueue.Put("ID table not found.");
            }
            LogQueue.Put("");

            LoaderWorker.ReportProgress(5);

            LogQueue.Put("Indexing files...");
            string[] paths = Directory.GetFiles(Directory.GetCurrentDirectory(), "*", SearchOption.AllDirectories);
            for (int i = 0; i < paths.Length; i++)
            {
                paths[i] = ExtraPath.MakeDirectoryRelated(Directory.GetCurrentDirectory(), paths[i]);
            }
            LogQueue.Put("Files found: " + paths.Length);
            LogQueue.Put("Indexing files done.");
            LogQueue.Put("");

            LoaderWorker.ReportProgress(10);

            LogQueue.Put("Searching resources...");
            int progress = 0;

            for (int i = 0; i < paths.Length; i++)
            {
                int current_progress = i * 90 / (paths.Length - 1);
                if (progress != current_progress)
                {
                    progress = current_progress;
                    LoaderWorker.ReportProgress(10 + progress);
                }

                var path = paths[i];
                switch (Resource.GetType(path))
                {
                case ResourceType.Tile: TilesIDTable.Add(path); break;

                case ResourceType.Event: EventsIDTable.Add(path); break;

                case ResourceType.Sprite: SpritesIDTable.Add(path); break;

                case ResourceType.Ragdoll: RagdollsIDTable.Add(path); break;

                case ResourceType.Animation: AnimationsIDTable.Add(path); break;

                case ResourceType.Entity: EntitiesIDTable.Add(path); break;

                case ResourceType.Outfit: OutfitsIDTable.Add(path); break;

                case ResourceType.Item: ItemsIDTable.Add(path); break;
                }
            }
            LogQueue.Put("Tiles found: " + TilesIDTable.Count);
            LogQueue.Put("Events found: " + EventsIDTable.Count);
            LogQueue.Put("Sprites found: " + SpritesIDTable.Count);
            LogQueue.Put("Ragdolls found: " + RagdollsIDTable.Count);
            LogQueue.Put("Animations found: " + AnimationsIDTable.Count);
            LogQueue.Put("Entities found: " + EntitiesIDTable.Count);
            LogQueue.Put("Outfits found: " + OutfitsIDTable.Count);
            LogQueue.Put("Items found: " + ItemsIDTable.Count);
            LogQueue.Put("Total resources found: " + (
                             TilesIDTable.Count +
                             EventsIDTable.Count +
                             SpritesIDTable.Count +
                             RagdollsIDTable.Count +
                             AnimationsIDTable.Count +
                             EntitiesIDTable.Count +
                             OutfitsIDTable.Count +
                             ItemsIDTable.Count));
            LogQueue.Put("Searching resources done.");
            LogQueue.Put("");
        }