예제 #1
0
        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();
        }
예제 #2
0
 public void Save(IEnumerable <DatabaseItemStat> objs, ProgressTracker progressTracker)
 {
     ThreadExecuter.Execute(
         () => repo.Save(objs, progressTracker)
         );
 }
예제 #3
0
        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);
        }
예제 #4
0
        /// <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; });
            }
        }