public void Execute() { var form = new ParsingDatabaseProgressView(); var parser = new ArzParsingWrapper(); string vanillaTags = GrimFolderUtility.FindArcFile(_grimdawnLocation, "text_en.arc"); string expansion1Tags = GrimFolderUtility.FindArcFile(Path.Combine(_grimdawnLocation, "gdx1"), "text_en.arc"); string modTags = string.IsNullOrEmpty(_modLocation) ? "" : GrimFolderUtility.FindArcFile(_modLocation, "text_en.arc"); List <Action> actions = new List <Action>(); actions.Add(() => parser.LoadTags(vanillaTags, expansion1Tags, modTags, _localizationFile, new WinformsProgressBar(form.LoadingTags).Tracker)); actions.Add(() => _itemTagDao.Save(parser.Tags, new WinformsProgressBar(form.SavingTags).Tracker)); string vanillaItems = GrimFolderUtility.FindArzFile(_grimdawnLocation); string expansion1Items = GrimFolderUtility.FindArzFile(Path.Combine(_grimdawnLocation, "gdx1")); string modItems = string.IsNullOrEmpty(_modLocation) ? "" : GrimFolderUtility.FindArzFile(_modLocation); actions.Add(() => parser.LoadItems(vanillaItems, expansion1Items, modItems, new WinformsProgressBar(form.LoadingItems).Tracker)); // TODO: actions.Add(() => parser.MapItemNames(new WinformsProgressBar(form.MappingItemNames).Tracker)); actions.Add(() => parser.RenamePetStats(new WinformsProgressBar(form.MappingPetStats).Tracker)); actions.Add(() => _databaseItemDao.Save(parser.Items, new WinformsProgressBar(form.SavingItems).Tracker)); // TODO: This depends on the DB item name.. which is in english, not localized actions.Add(() => { var records = parser.GenerateSpecialRecords(new WinformsProgressBar(form.GeneratingSpecialStats).Tracker); _databaseItemStatDao.Save(records, new WinformsProgressBar(form.SavingSpecialStats).Tracker); }); actions.Add(() => parser.ParseComplexItems(_itemSkillDao, new WinformsProgressBar(form.GeneratingSkills).Tracker)); actions.Add(() => { var tracker = new WinformsProgressBar(form.SkillCorrectnessCheck).Tracker; tracker.MaxValue = 1; _itemSkillDao.EnsureCorrectSkillRecords(); tracker.MaxProgress(); }); // Invoke the background thread & show progress UI Thread t = new Thread(() => { foreach (var action in actions) { action.Invoke(); } Action close = () => form.OverrideClose(); form.Invoke(close); }); t.Start(); form.ShowDialog(); }
public void EnsureCorrectSkillRecords() { _threadExecuter.Execute( () => _repo.EnsureCorrectSkillRecords() ); }
public void Execute() { var form = new ParsingDatabaseProgressView(); var parser = new ArzParsingWrapper(); List <string> tagfiles = new List <string>(); string vanillaTags = GrimFolderUtility.FindArcFile(_grimdawnLocation, "text_en.arc"); if (!string.IsNullOrEmpty(vanillaTags)) { tagfiles.Add(vanillaTags); } foreach (string path in GrimFolderUtility.GetGrimExpansionFolders(_grimdawnLocation)) { string expansionTags = GrimFolderUtility.FindArcFile(path, "text_en.arc"); if (!string.IsNullOrEmpty(expansionTags)) { tagfiles.Add(expansionTags); } } string modTags = string.IsNullOrEmpty(_modLocation) ? "" : GrimFolderUtility.FindArcFile(_modLocation, "text_en.arc"); if (!string.IsNullOrEmpty(modTags)) { tagfiles.Add(modTags); } List <Action> actions = new List <Action>(); actions.Add(() => parser.LoadTags(tagfiles, _localizationFile, new WinformsProgressBar(form.LoadingTags).Tracker)); actions.Add(() => _itemTagDao.Save(parser.Tags, new WinformsProgressBar(form.SavingTags).Tracker)); List <string> arzFiles = new List <string> { GrimFolderUtility.FindArzFile(_grimdawnLocation) }; foreach (string path in GrimFolderUtility.GetGrimExpansionFolders(_grimdawnLocation)) { string expansionItems = GrimFolderUtility.FindArzFile(path); if (!string.IsNullOrEmpty(expansionItems)) { arzFiles.Add(GrimFolderUtility.FindArzFile(expansionItems)); } } if (!string.IsNullOrEmpty(_modLocation)) { arzFiles.Add(GrimFolderUtility.FindArzFile(_modLocation)); } actions.Add(() => parser.LoadItems(arzFiles, new WinformsProgressBar(form.LoadingItems).Tracker)); actions.Add(() => parser.MapItemNames(new WinformsProgressBar(form.MappingItemNames).Tracker)); actions.Add(() => parser.RenamePetStats(new WinformsProgressBar(form.MappingPetStats).Tracker)); actions.Add(() => _databaseItemDao.Save(parser.Items, new WinformsProgressBar(form.SavingItems).Tracker)); // TODO: This depends on the DB item name.. which is in english, not localized actions.Add(() => { var records = parser.GenerateSpecialRecords(new WinformsProgressBar(form.GeneratingSpecialStats).Tracker); _databaseItemStatDao.Save(records, new WinformsProgressBar(form.SavingSpecialStats).Tracker); }); actions.Add(() => parser.ParseComplexItems(_itemSkillDao, new WinformsProgressBar(form.GeneratingSkills).Tracker)); actions.Add(() => { var tracker = new WinformsProgressBar(form.SkillCorrectnessCheck).Tracker; tracker.MaxValue = 1; _itemSkillDao.EnsureCorrectSkillRecords(); tracker.MaxProgress(); }); // Invoke the background thread & show progress UI Thread t = new Thread(() => { ExceptionReporter.EnableLogUnhandledOnThread(); foreach (var action in actions) { action.Invoke(); } Action close = () => form.OverrideClose(); form.Invoke(close); }); t.Start(); form.ShowDialog(); OnParseComplete?.Invoke(this, null); }
/// <summary> /// Parses the data from Grim Dawn (arz and arc files) /// If the supplied location is a mod, supply whetever its an addative or a replacement for the original database. /// Eg, should it clear the existing database upon insert, or add/replace? /// The prior is faster, but will not work for mods with a partial database. /// </summary> /// <param name="grimdawnLocation"></param> /// <param name="localizationFile"></param> /// <param name="expansionOnlyMod">Whetever this mod only expands upon EXISTING content</param> public void LoadArzDb(string grimdawnLocation, string localizationFile, bool expansionOnlyMod) { try { // Init & abort if not needed Logger.InfoFormat("Parse Arz/Arc, Location: \"{0}\", Additive: {1}, ClearFix: {2}", grimdawnLocation, expansionOnlyMod, !expansionOnlyMod); string databaseFile = FindArzFile(grimdawnLocation); //string expansionDatabaseFile = FindArzFile(Path.Combine(grimdawnLocation, "gdx1")); string arcTagfile = FindArcFile(grimdawnLocation, "text_en.arc"); var arcItemsFile = FindArcFile(grimdawnLocation, "items.arc"); if (string.IsNullOrEmpty(arcTagfile) || string.IsNullOrEmpty(arcItemsFile) || string.IsNullOrEmpty(databaseFile)) { Logger.FatalFormat( "Unable to parse the Grim Dawn database, could not find the relevant files at {0}", grimdawnLocation); return; } //long lastExpansionModified = string.IsNullOrEmpty(expansionDatabaseFile) ? 0 : File.GetLastWriteTime(expansionDatabaseFile).Ticks; long lastModified = File.GetLastWriteTime(databaseFile).Ticks; Logger.Info("Updating..."); var mappedTags = LoadTags(arcTagfile, localizationFile, expansionOnlyMod); // Process the items loaded var skipLots = true; List <IItem> _items = Parser.Arz.ArzParser.LoadItemRecords(databaseFile, skipLots); // TODO int x = 9; { List <DatabaseItem> items = new List <DatabaseItem>(); foreach (IItem item in _items) { items.Add(new DatabaseItem { Record = item.Record, Stats = item.Stats.Select(map).ToList() }); } // Map the name using the name _tags MapItemNames(items, mappedTags); RenamePetStats(items); // Add skill accumulation _skills.AddRange(items.Where(m => m.Record.Contains("/skills/"))); var specialStats = CreateSpecialRecords(items, mappedTags); Logger.Info($"Mapped {specialStats.Count()} special stats"); Logger.Info("Storing items to database.."); // Store to DB (cache) if (expansionOnlyMod) { _databaseItemDao.SaveOrUpdate(items); } else { // Deletes all existing data and saves new _databaseItemDao.Save(items); Logger.InfoFormat("Stored {0} items and {1} stats to internal db.", items.Count, -1); } _databaseItemStatDao.Save(specialStats); Logger.Debug("Special stats saved to DB"); // Obs: Do this after storing items as the item IDs changes var skillParser = new ComplexItemParser(_items, mappedTags); skillParser.Generate(); _itemSkillDao.Save(skillParser.Skills, expansionOnlyMod); _itemSkillDao.Save(skillParser.SkillItemMapping, expansionOnlyMod); _databaseSettingDao.UpdateDatabaseTimestamp(lastModified); LoadIcons(arcItemsFile); _itemSkillDao.EnsureCorrectSkillRecords(); } } catch (AggregateException ex) { Logger.Warn("System.AggregateException waiting for tasks, throwing first exception."); foreach (var inner in ex.InnerExceptions) { Logger.Warn(inner.Message); Logger.Warn(inner.StackTrace); //ExceptionReporter.ReportException(inner, "[AggregateException]", true); if (inner.InnerException != null) { Logger.Warn(inner.InnerException.Message); Logger.Warn(inner.InnerException.StackTrace); } } ex.Handle(x => { throw x; }); } }