Example #1
0
        private void worker_DoWork(object sender, DoWorkEventArgs e, IList <MapEntry> generatorMaps, string outputPath,
                                   BackgroundWorker worker)
        {
            var      globalMaps     = new Dictionary <string, MetaMap>();
            DateTime startTime      = DateTime.Now;
            string   gameIdentifier = "";

            worker.ReportProgress(0);

            for (int i = 0; i < generatorMaps.Count; i++)
            {
                var tagMaps = new Dictionary <ITag, MetaMap>();

                IReader reader;
                KeyValuePair <ICacheFile, EngineDescription> cacheData = LoadMap(generatorMaps[i].LocalMapPath, out reader);
                ICacheFile cacheFile = cacheData.Key;
                var        analyzer  = new MetaAnalyzer(cacheFile);
                if (gameIdentifier == "")
                {
                    gameIdentifier = cacheData.Value.Settings.GetSetting <string>("shortName");
                }

                var mapsToProcess = new Queue <MetaMap>();
                foreach (ITag tag in cacheFile.Tags)
                {
                    if (tag.MetaLocation == null)
                    {
                        continue;
                    }

                    var map = new MetaMap();
                    tagMaps[tag] = map;
                    mapsToProcess.Enqueue(map);

                    reader.SeekTo(tag.MetaLocation.AsOffset());
                    analyzer.AnalyzeArea(reader, tag.MetaLocation.AsPointer(), map);
                }
                GenerateSubMaps(mapsToProcess, analyzer, reader, cacheFile);

                var classMaps = new Dictionary <string, MetaMap>();
                foreach (ITag tag in cacheFile.Tags)
                {
                    if (tag.MetaLocation == null)
                    {
                        continue;
                    }

                    MetaMap map = tagMaps[tag];
                    EstimateMapSize(map, tag.MetaLocation.AsPointer(), analyzer.GeneratedMemoryMap, 1);

                    string  magicStr = CharConstant.ToString(tag.Class.Magic);
                    MetaMap oldClassMap;
                    if (classMaps.TryGetValue(magicStr, out oldClassMap))
                    {
                        oldClassMap.MergeWith(map);
                    }
                    else
                    {
                        classMaps[magicStr] = map;
                    }
                }

                foreach (var map in classMaps)
                {
                    MetaMap globalMap;
                    if (globalMaps.TryGetValue(map.Key, out globalMap))
                    {
                        globalMap.MergeWith(map.Value);
                    }
                    else
                    {
                        globalMaps[map.Key] = map.Value;
                    }
                }

                reader.Close();

                worker.ReportProgress(100 * (i + 1) / (generatorMaps.Count));
            }

            string badChars = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());

            foreach (var map in globalMaps)
            {
                string filename = badChars.Aggregate(map.Key, (current, badChar) => current.Replace(badChar, '_'));
                filename += ".xml";
                string path = Path.Combine(outputPath, filename);

                var settings = new XmlWriterSettings
                {
                    Indent      = true,
                    IndentChars = "\t"
                };
                using (XmlWriter writer = XmlWriter.Create(path, settings))
                {
                    var pluginWriter = new AssemblyPluginWriter(writer, gameIdentifier);

                    int size = map.Value.GetBestSizeEstimate();
                    FoldSubMaps(map.Value);

                    pluginWriter.EnterPlugin(size);

                    pluginWriter.EnterRevisions();
                    pluginWriter.VisitRevision(new PluginRevision("Assembly", 1, "Generated plugin from scratch."));
                    pluginWriter.LeaveRevisions();

                    WritePlugin(map.Value, size, pluginWriter);
                    pluginWriter.LeavePlugin();
                }
            }

            DateTime endTime = DateTime.Now;

            e.Result = endTime.Subtract(startTime);
        }
Example #2
0
        private void doConvert(BackgroundWorker worker, string gameName)
        {
            List <string> files = SelectedPlugins.Select(file => file.LocalMapPath).ToList();

            int progress = 0;

            foreach (string file in files)
            {
                string name = Path.GetFileName(file);
                worker.ReportProgress(progress, name);
                progress++;

                if ((!file.EndsWith(".asc") && !file.EndsWith(".alt") && !file.EndsWith(".ent") && !file.EndsWith(".xml")) ||
                    Path.GetFileNameWithoutExtension(file).Length != 4)
                {
                    continue;
                }

                XmlReader reader = null;
                XmlWriter writer = null;
                try
                {
                    string extension = "";
                    Dispatcher.Invoke(new Action(() =>
                    {
                        switch ((OutputFormats)cbOutputFormat.SelectedIndex)
                        {
                        case OutputFormats.Ascention:
                            extension = ".asc";
                            break;

                        case OutputFormats.Alteration:
                            extension = ".alt";
                            break;

                        default:
                            extension = ".xml";
                            break;
                        }
                    }));
                    var settings = new XmlWriterSettings
                    {
                        Indent      = true,
                        IndentChars = "\t"
                    };

                    string outPath = "";
                    Dispatcher.Invoke(new Action(() =>
                    {
                        outPath = Path.Combine(txtOutputFolder.Text,
                                               Path.ChangeExtension(name, extension));
                    }));
                    writer = XmlWriter.Create(outPath, settings);
                    reader = XmlReader.Create(file);

                    IPluginVisitor visitor;
                    var            format = OutputFormats.Assembly;
                    Dispatcher.Invoke(new Action(() => { format = (OutputFormats)cbOutputFormat.SelectedIndex; }));
                    switch (format)
                    {
                    case OutputFormats.Ascention:
                        visitor = new AscensionPluginWriter(writer, Path.GetFileNameWithoutExtension(file));
                        break;

                    case OutputFormats.Assembly:
                        visitor = new AssemblyPluginWriter(writer, gameName);
                        break;

                    default:
                        throw new InvalidOperationException("Unsupported output format.");
                    }

                    UniversalPluginLoader.LoadPlugin(reader, visitor);
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                    if (writer != null)
                    {
                        writer.Close();
                    }
                }
            }
            worker.ReportProgress(progress, "");
        }