コード例 #1
0
        private void PerformAdditionalValidation(List <WildlifeReportTyped> typedRows)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader);

            foreach (var typedRow in typedRows)
            {
                var errors        = new Dictionary <string, List <string> >();
                var submissionRow = _submissionRows[(decimal)typedRow.RowNum];

                if (typedRow.AccidentDate != null && typedRow.AccidentDate > DateTime.Now)
                {
                    errors.AddItem(Fields.AccidentDate, "Cannot be a future date.");
                }

                ValidateHighwayUniqueAgainstServiceArea(typedRow.HighwayUnique, errors);

                if (!ValidateGpsCoordsRange(typedRow.Longitude, typedRow.Latitude))
                {
                    errors.AddItem($"{Fields.Longitude}/{Fields.Latitude}", "Invalid range of GPS coordinates.");
                }

                if (errors.Count > 0)
                {
                    SetErrorDetail(submissionRow, errors, _statusService.FileConflictionError);
                }
            }
        }
コード例 #2
0
        private void PerformAdditionalValidation(List <WorkReportTyped> typedRows)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader);

            foreach (var typedRow in typedRows)
            {
                var errors        = new Dictionary <string, List <string> >();
                var submissionRow = _submissionRows[(decimal)typedRow.RowNum];

                if (typedRow.StartDate != null && typedRow.EndDate < typedRow.StartDate)
                {
                    errors.AddItem("StartDate", "Start Date cannot be greater than End Date");
                }

                if (typedRow.StartDate != null && typedRow.StartDate > DateTime.Now)
                {
                    errors.AddItem(Fields.StartDate, "Cannot be a future date.");
                }

                if (typedRow.EndDate != null && typedRow.EndDate > DateTime.Now)
                {
                    errors.AddItem(Fields.EndDate, "Cannot be a future date.");
                }

                ValidateHighwayUniqueAgainstServiceArea(typedRow.HighwayUnique, errors);

                if (typedRow.SpatialData == SpatialData.Gps)
                {
                    PerformGpsPointValidation(typedRow, errors);
                    PerformGpsLineValidation(typedRow, errors);
                    PerformGpsEitherLineOrPointValidation(typedRow);
                }

                if (typedRow.SpatialData == SpatialData.Lrs)
                {
                    PerformOffsetPointValidation(typedRow, errors);
                    PerformOffsetLineValidation(typedRow, errors);
                    PerformOffsetEitherLineOrPointValidation(typedRow);
                }

                if (!ValidateGpsCoordsRange(typedRow.StartLongitude, typedRow.StartLatitude))
                {
                    errors.AddItem($"{Fields.StartLongitude}/{Fields.StartLatitude}", "Invalid range of GPS coordinates.");
                }

                if (!ValidateGpsCoordsRange(typedRow.EndLongitude, typedRow.EndLatitude))
                {
                    errors.AddItem($"{Fields.EndLongitude}/{Fields.EndLatitude}", "Invalid range of GPS coordinates.");
                }

                if (errors.Count > 0)
                {
                    SetErrorDetail(submissionRow, errors, _statusService.FileConflictionError);
                }
            }
        }
コード例 #3
0
        private void CopyCalculatedFieldsFormUntypedRow(List <RockfallReportTyped> typedRows, List <RockfallReportCsvDto> untypedRows)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader);

            foreach (var typedRow in typedRows)
            {
                var untypedRow = untypedRows.First(x => x.RowNum == typedRow.RowNum);
                typedRow.SpatialData = untypedRow.SpatialData;
                typedRow.RowId       = untypedRow.RowId;
            }
        }
コード例 #4
0
        private void PerformAdditionalValidation(List <RockfallReportTyped> typedRows)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader);

            foreach (var typedRow in typedRows)
            {
                var errors        = new Dictionary <string, List <string> >();
                var submissionRow = _submissionRows[(decimal)typedRow.RowNum];

                if (typedRow.StartOffset != null && typedRow.EndOffset < typedRow.StartOffset)
                {
                    errors.AddItem(Fields.StartOffset, "Start Offset cannot be greater than End Offset");
                }

                if (typedRow.DitchVolume == DitchVolume.Threshold)
                {
                    _validator.Validate(Entities.RockfallReportOtherDitchVolume, Fields.OtherDitchVolume, typedRow.OtherDitchVolume, errors);
                }

                if (typedRow.TravelledLanesVolume == DitchVolume.Threshold)
                {
                    _validator.Validate(Entities.RockfallReportOtherTravelledLanesVolume, Fields.OtherTravelledLanesVolume, typedRow.OtherTravelledLanesVolume, errors);
                }

                if (typedRow.ReportDate != null && typedRow.ReportDate > DateTime.Now)
                {
                    errors.AddItem(Fields.ReportDate, "Cannot be a future date.");
                }

                if (typedRow.EstimatedRockfallDate != null && typedRow.EstimatedRockfallDate > DateTime.Now)
                {
                    errors.AddItem(Fields.EstimatedRockfallDate, "Report Date cannot be a future date.");
                }

                ValidateHighwayUniqueAgainstServiceArea(typedRow.HighwayUnique, errors);

                if (!ValidateGpsCoordsRange(typedRow.StartLongitude, typedRow.StartLatitude))
                {
                    errors.AddItem($"{Fields.StartLongitude}/{Fields.StartLatitude}", "Invalid range of GPS coordinates.");
                }

                if (!ValidateGpsCoordsRange(typedRow.EndLongitude, typedRow.EndLatitude))
                {
                    errors.AddItem($"{Fields.EndLongitude}/{Fields.EndLatitude}", "Invalid range of GPS coordinates.");
                }

                if (errors.Count > 0)
                {
                    SetErrorDetail(submissionRow, errors, _statusService.FileConflictionError);
                }
            }
        }
コード例 #5
0
        private void CopyCalculatedFieldsFormUntypedRow(List <WorkReportTyped> typedRows, List <WorkReportCsvDto> untypedRows)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader);

            foreach (var typedRow in typedRows)
            {
                var untypedRow = untypedRows.First(x => x.RowNum == typedRow.RowNum);
                typedRow.FeatureType      = untypedRow.FeatureType;
                typedRow.SpatialData      = untypedRow.SpatialData;
                typedRow.RowId            = untypedRow.RowId;
                typedRow.SpThresholdLevel = untypedRow.SpThresholdLevel;
            }
        }
コード例 #6
0
        private List <RockfallReportGeometry> PerformSpatialValidationAndConversionBatchAsync(List <RockfallReportTyped> typedRows)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader, $"Total Record: {typedRows.Count}");

            //grouping the rows
            var groups       = new List <List <RockfallReportTyped> >();
            var currentGroup = new List <RockfallReportTyped>();

            var count = 0;

            foreach (var typedRow in typedRows)
            {
                currentGroup.Add(typedRow);
                count++;

                if (count % 10 == 0)
                {
                    groups.Add(currentGroup);
                    currentGroup = new List <RockfallReportTyped>();
                }
            }

            if (currentGroup.Count > 0)
            {
                groups.Add(currentGroup);
            }

            var geometries = new ConcurrentBag <RockfallReportGeometry>();
            var progress   = 0;

            foreach (var group in groups)
            {
                var tasklist = new List <Task>();

                foreach (var row in group)
                {
                    tasklist.Add(Task.Run(async() => geometries.Add(await PerformSpatialValidationAndConversionAsync(row))));
                }

                Task.WaitAll(tasklist.ToArray());

                progress += 10;

                if (progress % 500 == 0)
                {
                    _logger.LogInformation($"{_methodLogHeader} PerformSpatialValidationAndConversionAsync {progress}");
                }
            }

            return(geometries.ToList());
        }
コード例 #7
0
        private (List <WildlifeReportCsvDto> untypedRows, string headers) ParseRowsUnTyped(Dictionary <string, List <string> > errors)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader);

            using TextReader textReader = new StreamReader(new MemoryStream(_submission.DigitalRepresentation), Encoding.UTF8);
            using var csv = new CsvReader(textReader, CultureInfo.InvariantCulture);

            CsvHelperUtils.Config(errors, csv, false);
            csv.Configuration.RegisterClassMap <WildlifeReportCsvDtoMap>();

            var rows = GetRecords(csv);

            return(rows, string.Join(',', csv.Context.HeaderRecord).Replace("\"", ""));
        }
コード例 #8
0
        private (decimal rowNum, List <RockfallReportTyped> rows) ParseRowsTyped(string text, Dictionary <string, List <string> > errors)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader);

            using var stringReader = new StringReader(text);
            using var csv          = new CsvReader(stringReader, CultureInfo.InvariantCulture);

            CsvHelperUtils.Config(errors, csv, false);
            csv.Configuration.RegisterClassMap <RockfallReportDtoMap>();

            var rows   = new List <RockfallReportTyped>();
            var rowNum = 0M;

            while (csv.Read())
            {
                try
                {
                    var row = csv.GetRecord <RockfallReportTyped>();
                    row.HighwayUnique = row.HighwayUnique.ToTrimAndUppercase();
                    //rockfall requires Y/N fields to be set to Uppercase, see HMCR-643
                    row.HeavyPrecip   = row.HeavyPrecip.ToTrimAndUppercase();
                    row.FreezeThaw    = row.FreezeThaw.ToTrimAndUppercase();
                    row.DitchSnowIce  = row.DitchSnowIce.ToTrimAndUppercase();
                    row.VehicleDamage = row.VehicleDamage.ToTrimAndUppercase();

                    rows.Add(row);
                    rowNum          = (decimal)row.RowNum;
                    row.ServiceArea = _serviceArea.ConvertToServiceAreaNumber(row.ServiceArea);
                }
                catch (CsvHelper.TypeConversion.TypeConverterException ex)
                {
                    _logger.LogError(ex.ToString());
                    rowNum = GetRowNum(csv.Context.RawRecord);
                    LogRowParseException(rowNum, ex.ToString(), csv.Context);
                    errors.AddItem("Parse Error", $"Exception while parsing the text [{ex.Text}]");
                    return(rowNum, null);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex.ToString());
                    rowNum = GetRowNum(csv.Context.RawRecord);
                    LogRowParseException(rowNum, ex.ToString(), csv.Context);
                    errors.AddItem("Parse Error", $"Exception while parsing");
                    return(rowNum, null);
                }
            }

            return(0, rows);
        }
コード例 #9
0
        private (decimal rowNum, List <RockfallReportTyped> rows) ParseRowsTyped(string text, Dictionary <string, List <string> > errors)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader);

            using var stringReader = new StringReader(text);
            using var csv          = new CsvReader(stringReader, CultureInfo.InvariantCulture);

            CsvHelperUtils.Config(errors, csv, false);
            csv.Configuration.RegisterClassMap <RockfallReportDtoMap>();

            var rows   = new List <RockfallReportTyped>();
            var rowNum = 0M;

            while (csv.Read())
            {
                try
                {
                    var row = csv.GetRecord <RockfallReportTyped>();
                    rows.Add(row);
                    rowNum          = (decimal)row.RowNum;
                    row.ServiceArea = _serviceArea.ConvertToServiceAreaNumber(row.ServiceArea);
                }
                catch (CsvHelper.TypeConversion.TypeConverterException ex)
                {
                    _logger.LogError(ex.ToString());
                    rowNum = GetRowNum(csv.Context.RawRecord);
                    LogRowParseException(rowNum, ex.ToString(), csv.Context);
                    errors.AddItem("Parse Error", $"Exception while parsing the text [{ex.Text}]");
                    return(rowNum, null);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex.ToString());
                    rowNum = GetRowNum(csv.Context.RawRecord);
                    LogRowParseException(rowNum, ex.ToString(), csv.Context);
                    errors.AddItem("Parse Error", $"Exception while parsing");
                    return(rowNum, null);
                }
            }

            return(0, rows);
        }
コード例 #10
0
        private (List <RockfallReportCsvDto> untypedRows, string headers) ParseRowsUnTyped(Dictionary <string, List <string> > errors)
        {
            MethodLogger.LogEntry(_logger, _enableMethodLog, _methodLogHeader);

            using TextReader textReader = new StreamReader(new MemoryStream(_submission.DigitalRepresentation), Encoding.UTF8);
            using var csv = new CsvReader(textReader, CultureInfo.InvariantCulture);

            CsvHelperUtils.Config(errors, csv, false);
            csv.Configuration.RegisterClassMap <RockfallReportCsvDtoMap>();

            var rows = csv.GetRecords <RockfallReportCsvDto>().ToList();

            for (var i = 0; i < rows.Count; i++)
            {
                rows[i].RowNum      = i + 2;
                rows[i].ServiceArea = _serviceArea.ConvertToServiceAreaString(rows[i].ServiceArea);
            }

            return(rows, string.Join(',', csv.Context.HeaderRecord).Replace("\"", ""));
        }
コード例 #11
0
        private static void LogRequest(IRestRequest request, IRestResponse response, long durationMs, RestClient _restClient)
        {
            var requestToLog = new
            {
                resource = request.Resource,
                // Parameters are custom anonymous objects in order to have the parameter type as a nice string
                // otherwise it will just show the enum value
                parameters = request.Parameters.ConvertAll(parameter => new
                {
                    name  = parameter.Name,
                    value = parameter.Value,
                    type  = parameter.Type.ToString()
                }),
                // ToString() here to have the method as a nice string otherwise it will just show the enum value
                method = request.Method.ToString(),
                // This will generate the actual Uri used in the request
                uri = _restClient.BuildUri(request),
            };

            var responseToLog = new
            {
                statusCode = response.StatusCode,
                content    = response.Content,
                headers    = response.Headers,
                // The Uri that actually responded (could be different from the requestUri if a redirection occurred)
                responseUri  = response.ResponseUri,
                errorMessage = response.ErrorMessage,
            };

            MethodLogger.SaveLogToFile(string.Format("Request completed in {0} ms", durationMs));
            MethodLogger.SaveLogToFile(string.Format("Request: {0}", JsonConvert.SerializeObject(requestToLog).ToString().Replace("\\\"", "\"")));
            MethodLogger.SaveLogToFile(string.Format("Response: {0}", JsonConvert.SerializeObject(responseToLog).ToString().Replace("\\\"", "\"")));


            //Log4netLogger<string>.LogInfo(string.Format("Request completed in {0} ms", durationMs));
            //Log4netLogger<string>.LogInfo(string.Format("Request: {0}", JsonConvert.SerializeObject(requestToLog).ToString().Replace("\\\"", "\"")));
            //Log4netLogger<string>.LogInfo(string.Format("Response: {0}", JsonConvert.SerializeObject(responseToLog).ToString().Replace("\\\"", "\"")));
        }
コード例 #12
0
        public static bool Prefix(CharacterInspectionScreen __instance, InputCommands.Id command)
        {
            switch (command)
            {
            // Handle 'E' for 'Export'
            case InputCommands.Id.RotateCCW:
                SaveCharacter();
                break;
            }

            return(true);

            void SaveCharacter()
            {
                var rulesetEntityService = ServiceRepository.GetService <IRulesetEntityService>();

                using (var logger = new MethodLogger("CharacterInspectionScreen_HandleInput"))
                {
                    var heroCharacter = __instance.InspectedCharacter.RulesetCharacterHero;

                    // record current name, etc..
                    var name    = heroCharacter.Name;
                    var builtin = heroCharacter.BuiltIn;
                    var guid    = heroCharacter.Guid;

                    // record current conditions, powers, spells and attunements
                    var conditions     = heroCharacter.ConditionsByCategory.ToList();
                    var powers         = heroCharacter.PowersUsedByMe.ToList();
                    var spells         = heroCharacter.SpellsCastByMe.ToList();
                    var inventoryItems = new List <RulesetItem>();
                    heroCharacter.CharacterInventory.EnumerateAllItems(inventoryItems);
                    var attunedItems = inventoryItems.Select(i => new { Item = i, Name = i.AttunedToCharacter }).ToList();

                    // record item guids
                    var heroItemGuids      = heroCharacter.Items.Select(i => new { Item = i, i.Guid }).ToList();
                    var inventoryItemGuids = inventoryItems.Select(i => new { Item = i, i.Guid }).ToList();

                    try
                    {
                        // TODO: update to use convention = name-nnn.sav
                        // TODO: then need UI to allow user to change name on export
                        // For now just add EX-
                        heroCharacter.Name    = "EX-" + name;
                        heroCharacter.BuiltIn = false;

                        // remove active conditions (or filter out during serialization)
                        heroCharacter.ConditionsByCategory.Clear();

                        // remove spells and effects (or filter out during serialization)
                        heroCharacter.PowersUsedByMe.Clear();
                        heroCharacter.SpellsCastByMe.Clear();

                        // remove attunement, attuned items don't work well in the character inspection screen out of game
                        foreach (var item in attunedItems)
                        {
                            item.Item.AttunedToCharacter = string.Empty;
                        }

                        // clear guids
                        AccessTools.Field(heroCharacter.GetType(), "guid").SetValue(heroCharacter, 0UL);

                        foreach (var item in heroItemGuids)
                        {
                            AccessTools.Field(item.Item.GetType(), "guid").SetValue(item.Item, 0UL);
                        }

                        foreach (var item in inventoryItemGuids)
                        {
                            AccessTools.Field(item.Item.GetType(), "guid").SetValue(item.Item, 0UL);
                        }

                        ServiceRepository
                        .GetService <ICharacterPoolService>()
                        .SaveCharacter(heroCharacter, true);
                    }
                    finally
                    {
                        // TODO: check these things are really restored

                        // restore original values
                        heroCharacter.Name    = name;
                        heroCharacter.BuiltIn = builtin;

                        // restore conditions
                        foreach (var kvp in conditions)
                        {
                            heroCharacter.ConditionsByCategory.Add(kvp.Key, kvp.Value);
                        }

                        // restore active spells and effects
                        heroCharacter.PowersUsedByMe.AddRange(powers);
                        heroCharacter.SpellsCastByMe.AddRange(spells);

                        // restore attunement
                        foreach (var item in attunedItems)
                        {
                            item.Item.AttunedToCharacter = item.Name;
                        }

                        // restore guids
                        AccessTools.Field(heroCharacter.GetType(), "guid").SetValue(heroCharacter, guid);

                        foreach (var item in heroItemGuids)
                        {
                            AccessTools.Field(item.Item.GetType(), "guid").SetValue(item.Item, item.Guid);
                        }

                        foreach (var item in inventoryItemGuids)
                        {
                            AccessTools.Field(item.Item.GetType(), "guid").SetValue(item.Item, item.Guid);
                        }
                    }
                }
            }
        }
コード例 #13
0
        // ENTRY POINT IF YOU NEED SAFE DATABASE ACCESS
        internal static void ModAfterDBReady()
        {
            using (var logger = new MethodLogger(nameof(ModAfterDBReady)))
            {
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.Dwarf);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.DwarfHill);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.DwarfSnow);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.Elf);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.ElfHigh);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.ElfSylvan);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.HalfElf);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.Halfling);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.HalflingIsland);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.HalflingMarsh);
                ShowNames(DatabaseHelper.CharacterRaceDefinitions.Human);

                void ShowNames(CharacterRaceDefinition race)
                {
                    Log($"Race: {race.Name} -----------------------");
                    Log("Male");
                    race.RacePresentation.MaleNameOptions.ForEach(n => Log(n));
                    Log("Female");
                    race.RacePresentation.FemaleNameOptions.ForEach(n => Log(n));
                }

                //logger.Log("Getting dbs");

                //var databases = (Dictionary<Type, object>)AccessTools
                //    .Field(typeof(DatabaseRepository), "databases")
                //    .GetValue(null);

                //var path = Path.Combine(Directory.GetCurrentDirectory(), "Dump.text");

                //logger.Log($"Folder={path}");

                //File.WriteAllText(path, string.Join(Environment.NewLine, databases.Select(kvp => kvp.Key.FullName)));

                //logger.Log("Dump complete");

                /*
                 * var longsword = Helpers.GetWeapons().Where(w => w.Name.Contains("Longsword")).FirstOrDefault();
                 *
                 * if (longsword != null)
                 * {
                 *  //longsword.DumpDefinition();
                 *
                 *  //Log($"ACM: {longsword.ComputeAttackDamageEnhancement(true, null)}");
                 *  //Log($"ACM: {longsword.ComputeAttackHitEnhancement(true, null)}");
                 *
                 *  var defender = longsword.Clone("longsword defender", "17dee48b08434bc88b1b5297eddf5bab");
                 *
                 *  foreach(var ef in defender.WeaponDescription.EffectDescription.EffectForms)
                 *  {
                 *      ef.DamageForm.DamageBonusTrends.Add(new RuleDefinitions.TrendInfo
                 *      {
                 *
                 *      });
                 *  }
                 *
                 *  //defender.DumpDefinition();
                 * }
                 *
                 * logger.Log("Just testing");
                 */

                //Helpers.DumpDefinition(DatabaseHelper.FeatureDefinitionDamageAffinitys.DamageAffinityBludgeoningResistance);
                //Helpers.DumpMonstersWithFeatureDefinition(DatabaseHelper.FeatureDefinitionDamageAffinitys.DamageAffinityBludgeoningResistance, true);
                //Helpers.DumpDefinition(DatabaseHelper.FeatureDefinitionDamageAffinitys.DamageAffinityColdResistance);
                //Helpers.DumpMonstersWithFeatureDefinition(DatabaseHelper.FeatureDefinitionDamageAffinitys.DamageAffinityColdResistance, true);
                //Helpers.DumpDefinition(DatabaseHelper.FeatureDefinitionDamageAffinitys.DamageAffinityContagionFleshRotForce);
                //Helpers.DumpMonstersWithFeatureDefinition(DatabaseHelper.FeatureDefinitionDamageAffinitys.DamageAffinityContagionFleshRotForce, true);

                //var frfClone = DatabaseHelper.FeatureDefinitionDamageAffinitys.DamageAffinityContagionFleshRotForce.Clone("MyFleshRotForce");
                //Helpers.DumpDefinition(frfClone);

                //var coldResistantMonsters = Helpers.GetMonstersWithFeatureDefinition(DatabaseHelper.FeatureDefinitionDamageAffinitys.DamageAffinityColdResistance, true);

                //// TODO: create new ones / modify existing ones?
                //DatabaseRepository.GetDatabase<FeatureDefinitionDamageAffinity>().Add(new FeatureDefinitionDamageAffinityEx
                //{
                //    // TODO: populate - unfortunately some/most fields are read only -- need to use reflection or Harmony to set them
                //    // Name = "PsionicBlast"
                //    // etc
                //});


                // maybe this is something like what you want
                //FeatureDefinitionDamageAffinity_ModulateSustainedDamage_ExtraProperties.Apply();

                // Or this
                //FeatureDefinitionDamageAffinity_ModulateSustainedDamage.Apply();

                //var boots = DatabaseHelper.FeatureDefinitionMovementAffinitys.MovementAffinitySixLeaguesBoots;
                //boots.SetSpeedAddBase(false);
                //boots.SetBaseSpeedMultiplicativeModifier(1f);

                //var tome = DatabaseHelper.ItemDefinitions.Tome_Of_Understanding;
                //tome.SetField("isUsableDevice", true);

                //var bread = DatabaseHelper.ItemDefinitions.DwarfBread;
                //bread.SlotsWhereActive.Clear();
                //bread.SlotsWhereActive.Add("UtilitySlot");
                //bread.SlotTypes.Clear();
                //bread.SlotTypes.AddRange(new string[] { "UtilitySlot", "ContainerSlot" });

                //DatabaseRepository.GetDatabase<ItemDefinition>().ForEach(item => item.SetInDungeonEditor(true));
                //DatabaseRepository.GetDatabase<MonsterDefinition>().ForEach(item => item.SetInDungeonEditor(true));


                //var orcJav = DatabaseHelper.ItemDefinitions.Orc_Javelin;
                //var orcJavForms = orcJav.WeaponDescription.EffectDescription.EffectForms;
                //if (!orcJavForms.Any())
                //{
                //    orcJavForms.Add(new EffectForm
                //    {
                //        DamageForm = new DamageForm
                //        {
                //            DiceNumber = 1,
                //            DieType = RuleDefinitions.DieType.D8,
                //            DamageType = "DamagePiercing"
                //        }
                //    });
                //}
                //orcJav.SetCanBeStacked(true);
                //orcJav.SetStackSize(5);

                //var ogreJav = DatabaseHelper.ItemDefinitions.Ogre_Javelin;
                //var ogreJavForms = ogreJav.WeaponDescription.EffectDescription.EffectForms;
                //if (!ogreJavForms.Any())
                //{
                //    ogreJavForms.Add(new EffectForm
                //    {
                //        DamageForm = new DamageForm
                //        {
                //            DiceNumber = 1,
                //            DieType = RuleDefinitions.DieType.D10,
                //            DamageType = "DamagePiercing"
                //        }
                //    });
                //}
                //ogreJav.SetCanBeStacked(true);
                //ogreJav.SetStackSize(5);


                //DatabaseRepository.GetDatabase<ItemDefinition>().ForEach(item =>
                //{
                //    if (!item.ForceEquip) // COTF is the only item that has to be equipped
                //    {
                //        item.SetForceEquipSlot(string.Empty);
                //    }
                //});

                //DatabaseHelper.LootPackDefinitions.
                //var chest = DatabaseHelper.LootPackDefinitions.CONJURATION_TheSuperEgo_Mansion_OptionalQuest_LootQuest_Chest_01;
                //var list = chest.ItemOccurencesList;

                //foreach(var i in list)
                //{
                //    Log($"{i.ItemDefinition.Name}, {i.DiceNumber}, {i.DiceType}");
                //}

                //list.Add(Create(DatabaseHelper.ItemDefinitions.Enchanted_Longsword_Dragonblade));
                //list.Add(Create(DatabaseHelper.ItemDefinitions.MantleOfSpellResistance));
                //list.Add(Create(DatabaseHelper.ItemDefinitions.CloakOfDisplacement));
                //list.Add(Create(DatabaseHelper.ItemDefinitions.ShieldPlus3));
                //list.Add(Create(DatabaseHelper.ItemDefinitions.ScrollGreaterInvisibility));
                //list.Add(Create(DatabaseHelper.ItemDefinitions.ScrollGreaterInvisibility));
                //list.Add(Create(DatabaseHelper.ItemDefinitions.ScrollGreaterInvisibility));

                //foreach (var i in list)
                //{
                //    Log($"{i.ItemDefinition.Name}, {i.DiceNumber}, {i.DiceType}");
                //}

                //ItemOccurence Create(ItemDefinition definition)
                //{
                //    var item = new ItemOccurence
                //    {
                //        DiceNumber = 1,
                //        DiceType = RuleDefinitions.DieType.D1
                //    };

                //    item.SetItemDefinition(definition);

                //    return item;
                //}

                //try
                //{
                //    var definition = new DivineHumanFeatureDefinitionCastSpellBuilder(
                //            DatabaseHelper.FeatureDefinitionCastSpells.CastSpellElfHigh, // clone original
                //            "DivineHumanSpells", // new name
                //            "4b61816bfbd04601b07ddba281ec7d5c") // new guid
                //        .AddToDB(); // add to database

                //    // assign
                //    DatabaseHelper.CharacterRaceDefinitions.Human.FeatureUnlocks.Add(new FeatureUnlockByLevel(definition, 1));
                //}
                //catch (Exception ex)
                //{
                //    Error(ex);
                //    throw;
                //}
            }
        }