Ejemplo n.º 1
0
        public void SelectWithQuantityOf0_Thrown(string weapon)
        {
            var thrown = WeaponConstants.GetAllThrown(false, false);
            var simple = WeaponConstants.GetAllSimple(false, false);
            var melee  = WeaponConstants.GetAllMelee(false, false);

            var thrownRanged = thrown.Except(melee).Intersect(simple);

            Assert.That(thrownRanged, Contains.Item(weapon)
                        .And.EquivalentTo(new[]
            {
                WeaponConstants.Javelin,
                WeaponConstants.Dart,
            }));

            var item = itemSelector.SelectFrom($"{weapon}[{ItemTypeConstants.Weapon}]");

            Assert.That(item.Name, Is.EqualTo(weapon), weapon);
            Assert.That(item.ItemType, Is.EqualTo(ItemTypeConstants.Weapon), weapon);
            Assert.That(item.Traits, Is.Empty, weapon);
            Assert.That(item.Magic.SpecialAbilities, Is.Empty, weapon);
            Assert.That(item.Magic.Bonus, Is.Zero, weapon);
            Assert.That(item.IsMagical, Is.False, weapon);
            Assert.That(item.Quantity, Is.Zero, weapon);
        }
Ejemplo n.º 2
0
        public void SimpleWeaponProficiencyFoci()
        {
            var foci       = WeaponConstants.GetAllSimple(false, false);
            var ammunition = WeaponConstants.GetAllAmmunition(false, false);

            foci = foci.Except(ammunition);
            base.AssertDistinctCollection(FeatConstants.WeaponProficiency_Simple, foci.ToArray());
        }
Ejemplo n.º 3
0
        public Item SelectFrom(string source)
        {
            var template = new Item();

            template.Name = source;
            template.Name = itemTypeRegex.Replace(template.Name, string.Empty);
            template.Name = itemBonusRegex.Replace(template.Name, string.Empty);
            template.Name = specialAbilityRegex.Replace(template.Name, string.Empty);
            template.Name = traitRegex.Replace(template.Name, string.Empty);
            template.Name = isMagicRegex.Replace(template.Name, string.Empty);

            template.ItemType = GetMatchValue(itemTypeRegex, source, "[", "]");

            if (isMagicRegex.IsMatch(source))
            {
                var rawIsMagic = GetMatchValue(isMagicRegex, source, "@", "@");
                template.IsMagical = Convert.ToBoolean(rawIsMagic);
            }

            if (itemBonusRegex.IsMatch(source))
            {
                var rawBonus = GetMatchValue(itemBonusRegex, source, "(", ")");
                template.Magic.Bonus = Convert.ToInt32(rawBonus);
            }

            if (specialAbilityRegex.IsMatch(source))
            {
                var rawSpecialAbilities = GetMatchValue(specialAbilityRegex, source, "{", "}");
                var specialAbilities    = rawSpecialAbilities.Split(',');
                template.Magic.SpecialAbilities = GetSpecialAbilities(specialAbilities);
            }

            if (traitRegex.IsMatch(source))
            {
                var rawTraits = GetMatchValue(traitRegex, source, "#");
                var traits    = rawTraits.Split(',');

                foreach (var trait in traits)
                {
                    template.Traits.Add(trait);
                }
            }

            var ammunition         = WeaponConstants.GetAllAmmunition(false, false);
            var thrown             = WeaponConstants.GetAllThrown(false, false);
            var simple             = WeaponConstants.GetAllSimple(false, false);
            var melee              = WeaponConstants.GetAllMelee(false, false);
            var thrownRanged       = thrown.Except(melee).Intersect(simple);
            var needRandomQuantity = ammunition.Union(thrownRanged);

            if (needRandomQuantity.Contains(template.Name))
            {
                template.Quantity = 0;
            }

            return(template);
        }
Ejemplo n.º 4
0
        public void SelectWithQuantityOf1_AllOtherWeapons()
        {
            var allWeapons   = WeaponConstants.GetAllWeapons(false, false);
            var ammos        = WeaponConstants.GetAllAmmunition(false, false);
            var thrown       = WeaponConstants.GetAllThrown(false, false);
            var simple       = WeaponConstants.GetAllSimple(false, false);
            var melee        = WeaponConstants.GetAllMelee(false, false);
            var thrownRanged = thrown.Except(melee).Intersect(simple);

            var weapons = allWeapons.Except(ammos).Except(thrownRanged);

            foreach (var weapon in weapons)
            {
                var item = itemSelector.SelectFrom($"{weapon}[{ItemTypeConstants.Weapon}]");
                Assert.That(item.Name, Is.EqualTo(weapon), weapon);
                Assert.That(item.ItemType, Is.EqualTo(ItemTypeConstants.Weapon), weapon);
                Assert.That(item.Traits, Is.Empty, weapon);
                Assert.That(item.Magic.SpecialAbilities, Is.Empty, weapon);
                Assert.That(item.Magic.Bonus, Is.Zero, weapon);
                Assert.That(item.IsMagical, Is.False, weapon);
                Assert.That(item.Quantity, Is.EqualTo(1), weapon);
            }
        }
Ejemplo n.º 5
0
        public void SimpleWeaponsMatchConstants()
        {
            var simple = WeaponConstants.GetAllSimple(false, false);

            VerifyAttribute(simple, AttributeConstants.Simple);
        }
Ejemplo n.º 6
0
        private (IEnumerable <string> Common, IEnumerable <string> Uncommon) GetProficientWeaponNames(
            IEnumerable <Feat> feats,
            IEnumerable <Feat> proficiencyFeats,
            IEnumerable <string> baseWeapons,
            bool twoHandedAllowed)
        {
            var common   = new List <string>();
            var uncommon = new List <string>();

            var nonProficiencyFoci = feats
                                     .Except(proficiencyFeats)
                                     .SelectMany(f => f.Foci);

            nonProficiencyFoci = SwapForTemplates(nonProficiencyFoci, WeaponConstants.CompositeShortbow,
                                                  WeaponConstants.CompositeShortbow_StrengthPlus0,
                                                  WeaponConstants.CompositeShortbow_StrengthPlus1,
                                                  WeaponConstants.CompositeShortbow_StrengthPlus2);

            nonProficiencyFoci = SwapForTemplates(nonProficiencyFoci, WeaponConstants.CompositeLongbow,
                                                  WeaponConstants.CompositeLongbow_StrengthPlus0,
                                                  WeaponConstants.CompositeLongbow_StrengthPlus1,
                                                  WeaponConstants.CompositeLongbow_StrengthPlus2,
                                                  WeaponConstants.CompositeLongbow_StrengthPlus3,
                                                  WeaponConstants.CompositeLongbow_StrengthPlus4);

            var nonProficiencyWeaponFoci = nonProficiencyFoci.Intersect(baseWeapons);

            if (nonProficiencyWeaponFoci.Any())
            {
                common.AddRange(nonProficiencyWeaponFoci);
            }

            var proficiencyFoci = proficiencyFeats.SelectMany(f => f.Foci);

            proficiencyFoci = SwapForTemplates(proficiencyFoci, WeaponConstants.CompositeShortbow,
                                               WeaponConstants.CompositeShortbow_StrengthPlus0,
                                               WeaponConstants.CompositeShortbow_StrengthPlus1,
                                               WeaponConstants.CompositeShortbow_StrengthPlus2);

            proficiencyFoci = SwapForTemplates(proficiencyFoci, WeaponConstants.CompositeLongbow,
                                               WeaponConstants.CompositeLongbow_StrengthPlus0,
                                               WeaponConstants.CompositeLongbow_StrengthPlus1,
                                               WeaponConstants.CompositeLongbow_StrengthPlus2,
                                               WeaponConstants.CompositeLongbow_StrengthPlus3,
                                               WeaponConstants.CompositeLongbow_StrengthPlus4);

            var proficiencyWeaponFoci = proficiencyFoci.Intersect(baseWeapons);

            if (proficiencyWeaponFoci.Any())
            {
                uncommon.AddRange(proficiencyWeaponFoci);
            }

            if (proficiencyFeats.Any(f => f.Name == FeatConstants.WeaponProficiency_Simple &&
                                     f.Foci.Contains(GroupConstants.All)))
            {
                var simpleWeapons = WeaponConstants.GetAllSimple(false, false);
                simpleWeapons = simpleWeapons.Intersect(baseWeapons);
                uncommon.AddRange(simpleWeapons);
            }

            if (proficiencyFeats.Any(f => f.Name == FeatConstants.WeaponProficiency_Martial &&
                                     f.Foci.Contains(GroupConstants.All)))
            {
                var martialWeapons = WeaponConstants.GetAllMartial(false, true);

                martialWeapons = martialWeapons.Intersect(baseWeapons);
                uncommon.AddRange(martialWeapons);
            }

            if (proficiencyFeats.Any(f => f.Name == FeatConstants.WeaponProficiency_Exotic &&
                                     f.Foci.Contains(GroupConstants.All)))
            {
                var exoticWeapons = WeaponConstants.GetAllExotic(false, false);
                exoticWeapons = exoticWeapons.Intersect(baseWeapons);
                uncommon.AddRange(exoticWeapons);
            }

            var ammunition = WeaponConstants.GetAllAmmunition(false, false)
                             .Except(new[] { WeaponConstants.Shuriken });

            common   = common.Except(ammunition).ToList();
            uncommon = uncommon.Except(ammunition).ToList();

            if (!twoHandedAllowed)
            {
                var twoHandedWeapons = WeaponConstants.GetAllTwoHandedMelee(false, false);
                common   = common.Except(twoHandedWeapons).ToList();
                uncommon = uncommon.Except(twoHandedWeapons).ToList();
            }

            common = SwapForTemplates(common, WeaponConstants.CompositeShortbow,
                                      WeaponConstants.CompositeShortbow_StrengthPlus0,
                                      WeaponConstants.CompositeShortbow_StrengthPlus1,
                                      WeaponConstants.CompositeShortbow_StrengthPlus2);

            common = SwapForTemplates(common, WeaponConstants.CompositeLongbow,
                                      WeaponConstants.CompositeLongbow_StrengthPlus0,
                                      WeaponConstants.CompositeLongbow_StrengthPlus1,
                                      WeaponConstants.CompositeLongbow_StrengthPlus2,
                                      WeaponConstants.CompositeLongbow_StrengthPlus3,
                                      WeaponConstants.CompositeLongbow_StrengthPlus4);

            uncommon = SwapForTemplates(uncommon, WeaponConstants.CompositeShortbow,
                                        WeaponConstants.CompositeShortbow_StrengthPlus0,
                                        WeaponConstants.CompositeShortbow_StrengthPlus1,
                                        WeaponConstants.CompositeShortbow_StrengthPlus2);

            uncommon = SwapForTemplates(uncommon, WeaponConstants.CompositeLongbow,
                                        WeaponConstants.CompositeLongbow_StrengthPlus0,
                                        WeaponConstants.CompositeLongbow_StrengthPlus1,
                                        WeaponConstants.CompositeLongbow_StrengthPlus2,
                                        WeaponConstants.CompositeLongbow_StrengthPlus3,
                                        WeaponConstants.CompositeLongbow_StrengthPlus4);

            return(common, uncommon);
        }
Ejemplo n.º 7
0
        public static IEnumerable <string> GetFeatsWithFoci()
        {
            var featsWithFoci = new List <string>();

            var simpleWeapons = WeaponConstants.GetAllSimple(false, false);

            foreach (var weapon in simpleWeapons)
            {
                featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Simple}/{weapon}");
            }

            var martialWeapons = WeaponConstants.GetAllMartial(false, false);

            foreach (var weapon in martialWeapons)
            {
                featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{weapon}");
            }

            //INFO: Adding in some exotic as martial, for weapon familiarity
            featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{WeaponConstants.DwarvenUrgrosh}");
            featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{WeaponConstants.DwarvenWaraxe}");
            featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{WeaponConstants.OrcDoubleAxe}");
            featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Martial}/{WeaponConstants.GnomeHookedHammer}");

            var exoticWeapons = WeaponConstants.GetAllExotic(false, false);

            foreach (var weapon in exoticWeapons)
            {
                featsWithFoci.Add($"{FeatConstants.WeaponProficiency_Exotic}/{weapon}");
            }

            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Appraise}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Balance}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Bluff}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Climb}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Concentration}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Craft}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Alchemy)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Armorsmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Blacksmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Bookbinding)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Bowmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Brassmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Brewing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Candlemaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Cloth)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Coppersmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Dyemaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Gemcutting)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Glass)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Goldsmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Hatmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Hornworking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Jewelmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Leather)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Locksmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Mapmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Milling)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Painting)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Parchmentmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Pewtermaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Potterymaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Sculpting)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Shipmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Shoemaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Silversmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Skinning)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Soapmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Stonemasonry)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Tanning)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Trapmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Weaponsmithing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Weaving)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Wheelmaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Winemaking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Craft, SkillConstants.Foci.Craft.Woodworking)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.DecipherScript}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Diplomacy}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.DisableDevice}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Disguise}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.EscapeArtist}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Forgery}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.GatherInformation}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.HandleAnimal}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Heal}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Hide}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Intimidate}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Jump}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Knowledge}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Arcana)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.ArchitectureAndEngineering)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Dungeoneering)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Geography)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.History)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Local)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Nature)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.NobilityAndRoyalty)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.Religion)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Knowledge, SkillConstants.Foci.Knowledge.ThePlanes)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Listen}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.MoveSilently}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.OpenLock}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Perform}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Act)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Comedy)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Dance)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.KeyboardInstruments)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Oratory)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.PercussionInstruments)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.Sing)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.StringInstruments)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Perform, SkillConstants.Foci.Perform.WindInstruments)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Profession}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Adviser)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Alchemist)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.AnimalGroomer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.AnimalTrainer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Apothecary)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Appraiser)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Architect)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Armorer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Barrister)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Blacksmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Bookbinder)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Bowyer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Brazier)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Brewer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Butler)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Carpenter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cartographer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cartwright)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Chandler)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.CityGuide)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Clerk)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cobbler)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Coffinmaker)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Coiffeur)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Cook)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Coppersmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Craftsman)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Dowser)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Dyer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Embalmer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Engineer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Entertainer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.ExoticAnimalTrainer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Farmer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Fletcher)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Footman)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Gemcutter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Goldsmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Governess)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Haberdasher)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Healer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Horner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Hunter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Interpreter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Jeweler)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Laborer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Launderer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Limner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.LocalCourier)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Locksmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Maid)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Masseuse)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Matchmaker)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Midwife)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Miller)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Miner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Navigator)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Nursemaid)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.OutOfTownCourier)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Painter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Parchmentmaker)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Pewterer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Polisher)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Porter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Potter)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Sage)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.SailorCrewmember)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.SailorMate)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Scribe)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Sculptor)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Shepherd)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Shipwright)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Silversmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Skinner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Soapmaker)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Soothsayer)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Tanner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Teacher)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Teamster)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Trader)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Trapper)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Valet)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Vintner)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Weaponsmith)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Weaver)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.Wheelwright)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Build(SkillConstants.Profession, SkillConstants.Foci.Profession.WildernessGuide)}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Ride}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Search}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.SenseMotive}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.SleightOfHand}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Spellcraft}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Spot}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Survival}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Swim}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.Tumble}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.UseMagicDevice}");
            featsWithFoci.Add($"{FeatConstants.SkillFocus}/{SkillConstants.UseRope}");

            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Boar}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Rat}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Raven}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Spider_Monstrous_Hunter_Small}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Spider_Monstrous_Hunter_Medium}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Spider_Monstrous_WebSpinner_Small}");
            featsWithFoci.Add($"{FeatConstants.SpecialQualities.AlternateForm}/{CreatureConstants.Spider_Monstrous_WebSpinner_Medium}");

            return(featsWithFoci);
        }