private void doConvert(BackgroundWorker worker, string gameName) { var files = SelectedPlugins.Select(file => file.LocalMapPath).ToList(); var progress = 0; foreach (var file in files) { var 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 { var 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" }; var 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, ""); }
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 = ""; 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/(generatorMaps.Count - 1)); } 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); }