private void CheckWeapons()
        {
            WeaponGroupAttackBonus weaponGroupAttackBonus = WeaponTraining.GetComponent <WeaponGroupAttackBonus>();

            if (base.Owner.Body.SecondaryHand.MaybeWeapon != null &&
                AdvancedWeaponTraining._weaponCategoryToWeaponTraining[base.Owner.Body.SecondaryHand.MaybeWeapon.Blueprint.Category] == weaponGroupAttackBonus.WeaponGroup &&
                !base.Owner.Body.SecondaryHand.MaybeWeapon.Blueprint.IsLight)
            {
                Activate();
            }
            else
            {
                Deactivate();
            }
        }
        public static bool WieldsWeaponFromFighterGroup(UnitDescriptor owner, BlueprintFeature weaponTraining)
        {
            WeaponGroupAttackBonus weaponGroupAttackBonus = weaponTraining.GetComponent <WeaponGroupAttackBonus>();

            if (weaponGroupAttackBonus != null)
            {
                return((owner.Body.PrimaryHand.MaybeWeapon != null && owner.Body.PrimaryHand.MaybeWeapon.Blueprint.FighterGroup == weaponGroupAttackBonus.WeaponGroup) ||
                       (owner.Body.SecondaryHand.MaybeWeapon != null && owner.Body.SecondaryHand.MaybeWeapon.Blueprint.FighterGroup == weaponGroupAttackBonus.WeaponGroup));
            }

            WeaponParametersAttackBonus weaponParametersAttackBonus = weaponTraining.GetComponent <WeaponParametersAttackBonus>();

            if (weaponParametersAttackBonus != null)
            {
                return(weaponParametersAttackBonus.OnlyTwoHanded && owner.Body.PrimaryHand.MaybeWeapon != null && owner.Body.PrimaryHand.MaybeWeapon.Blueprint.IsTwoHanded);
            }

            return(false);
        }
        private static String getWeaponTrainingName(BlueprintFeature weaponTraining, bool removeBlanks = false)
        {
            String toReturn = "";
            WeaponGroupAttackBonus weaponGroupAttackBonus = weaponTraining.GetComponent <WeaponGroupAttackBonus>();

            if (weaponGroupAttackBonus != null)
            {
                switch (weaponGroupAttackBonus.WeaponGroup)
                {
                case WeaponFighterGroup.Axes:
                    toReturn = "Axes";
                    break;

                case WeaponFighterGroup.BladesHeavy:
                    toReturn = "Blades, Heavy";
                    break;

                case WeaponFighterGroup.BladesLight:
                    toReturn = "Blades, Light";
                    break;

                case WeaponFighterGroup.Bows:
                    toReturn = "Bows";
                    break;

                case WeaponFighterGroup.Close:
                    toReturn = "Close";
                    break;

                case WeaponFighterGroup.Crossbows:
                    toReturn = "Crossbows";
                    break;

                case WeaponFighterGroup.Double:
                    toReturn = "Double";
                    break;

                case WeaponFighterGroup.Flails:
                    toReturn = "Flails";
                    break;

                case WeaponFighterGroup.Hammers:
                    toReturn = "Hammers";
                    break;

                case WeaponFighterGroup.Monk:
                    toReturn = "Monk";
                    break;

                case WeaponFighterGroup.Natural:
                    toReturn = "Natural";
                    break;

                case WeaponFighterGroup.None:
                    toReturn = "Unknown";
                    break;

                case WeaponFighterGroup.Polearms:
                    toReturn = "Polearms";
                    break;

                case WeaponFighterGroup.Spears:
                    toReturn = "Spears";
                    break;

                case WeaponFighterGroup.Thrown:
                    toReturn = "Thrown";
                    break;
                }
            }
            else
            {
                WeaponParametersAttackBonus weaponParametersAttackBonus = weaponTraining.GetComponent <WeaponParametersAttackBonus>();
                if (weaponParametersAttackBonus.OnlyTwoHanded)
                {
                    toReturn = "Two-Handed";
                }
            }

            if (removeBlanks)
            {
                toReturn = toReturn.Trim();
            }

            return(toReturn);
        }
        private static void FillWeaponFocusAndWeaponTrainingDictionaries()
        {
            Dictionary <WeaponFighterGroup, List <WeaponCategory> > weaponFighterGroupToWeaponCategory = new Dictionary <WeaponFighterGroup, List <WeaponCategory> >();

            foreach (var weaponType in Resources.FindObjectsOfTypeAll <BlueprintWeaponType>())
            {
                _weaponCategoryToWeaponTraining[weaponType.Category] = weaponType.FighterGroup;
                if (weaponFighterGroupToWeaponCategory.TryGetValue(weaponType.FighterGroup, out var value))
                {
                    value.Add(weaponType.Category);
                }
                else
                {
                    List <WeaponCategory> categories = new List <WeaponCategory>();
                    categories.Add(weaponType.Category);
                    weaponFighterGroupToWeaponCategory[weaponType.FighterGroup] = categories;
                }
            }

            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("1b18d6a1297950f4bba9d121cfc735e9")); // WeaponTrainingAxes
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("2a0ce0186af38ed419f47fce16f93c2a")); // WeaponTrainingHeavyBlades
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("4923409590bdb604590e04da4253ab78")); // WeaponTrainingLightBlades
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("e0401ecade57d4144978dbd714c4069f")); // WeaponTrainingBows
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("9cdfc2a236ee6d349ad6d8a2170477d5")); // WeaponTrainingCrossbows
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("a7a7ad500d4e2a847b450b85cbe68d65")); // WeaponTrainingDouble
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("8bb8579622b823c4285d851274a009c3")); // WeaponTrainingHammers
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("3ab76d4a8aa9e4c459add32139080206")); // WeaponTrainingNatural
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("c062c6d16aecddc4ab67d9c783b2ad46")); // WeaponTrainingPolearms
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("d5c04077fc063e44784384a00377b7cf")); // WeaponTrainingSpears
            _weaponTrainingBluePrints.Add(library.Get <BlueprintFeature>("bd75a95b36a3cd8459513ee1932c8c22")); // WeaponTrainingClose
            BlueprintFeature twoWeaponFeature = library.Get <BlueprintFeature>("88da2a5dfc505054f933bb81014e864f");

            _weaponTrainingBluePrints.Add(twoWeaponFeature);

            CreateWeaponTrainingForWeaponFighterGroup(WeaponFighterGroup.None, weaponFighterGroupToWeaponCategory[WeaponFighterGroup.None]);
            CreateWeaponTrainingForWeaponFighterGroup(WeaponFighterGroup.Thrown, weaponFighterGroupToWeaponCategory[WeaponFighterGroup.Thrown]);
            //CreateWeaponTrainingForWeaponFighterGroup(WeaponFighterGroup.Flails, weaponFighterGroupToWeaponCategory[WeaponFighterGroup.Flails]);
            CreateWeaponTrainingForWeaponFighterGroup(WeaponFighterGroup.Monk, weaponFighterGroupToWeaponCategory[WeaponFighterGroup.Monk]);


            _weaponTrainingToStatType[WeaponFighterGroup.Axes] = new List <StatType>()
            {
                StatType.SkillAthletics, StatType.SkillLoreNature, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.BladesHeavy] = new List <StatType>()
            {
                StatType.CheckDiplomacy, StatType.SkillAthletics, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.BladesLight] = new List <StatType>()
            {
                StatType.CheckDiplomacy, StatType.SkillThievery, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Bows] = new List <StatType>()
            {
                StatType.SkillKnowledgeWorld, StatType.SkillPerception, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Close] = new List <StatType>()
            {
                StatType.SkillStealth, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Crossbows] = new List <StatType>()
            {
                StatType.SkillPerception, StatType.SkillStealth, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Double] = new List <StatType>()
            {
                StatType.SkillMobility, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Flails] = new List <StatType>()
            {
                StatType.SkillMobility, StatType.SkillThievery, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Hammers] = new List <StatType>()
            {
                StatType.CheckDiplomacy, StatType.SkillAthletics, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Monk] = new List <StatType>()
            {
                StatType.SkillMobility, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Natural] = new List <StatType>()
            {
                StatType.SkillAthletics, StatType.SkillMobility, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.None] = new List <StatType>()
            {
                StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Polearms] = new List <StatType>()
            {
                StatType.CheckDiplomacy, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Spears] = new List <StatType>()
            {
                StatType.SkillLoreNature, StatType.SkillAthletics, StatType.CheckBluff, StatType.CheckIntimidate
            };
            _weaponTrainingToStatType[WeaponFighterGroup.Thrown] = new List <StatType>()
            {
                StatType.SkillMobility, StatType.SkillPerception, StatType.CheckBluff, StatType.CheckIntimidate
            };


            Dictionary <WeaponFighterGroup, BlueprintFeature> WeaponTrainingByGroup = new Dictionary <WeaponFighterGroup, BlueprintFeature>();

            foreach (var weaponTrainingBluePrint in _weaponTrainingBluePrints)
            {
                WeaponGroupAttackBonus weaponGroupAttackBonus = weaponTrainingBluePrint.GetComponent <WeaponGroupAttackBonus>();
                if (weaponGroupAttackBonus != null)
                {
                    WeaponTrainingByGroup[weaponGroupAttackBonus.WeaponGroup] = weaponTrainingBluePrint;
                }
            }

            foreach (var weaponType in Resources.FindObjectsOfTypeAll <BlueprintWeaponType>())
            {
                _weaponCategoryToWeaponTraining[weaponType.Category] = weaponType.FighterGroup;
                if (_weaponTrainingToWeaponCategory.TryGetValue(WeaponTrainingByGroup[weaponType.FighterGroup], out var value))
                {
                    value.Add(weaponType.Category);
                }
                else
                {
                    HashSet <WeaponCategory> categories = new HashSet <WeaponCategory>();
                    categories.Add(weaponType.Category);
                    _weaponTrainingToWeaponCategory[WeaponTrainingByGroup[weaponType.FighterGroup]] = categories;
                }

                if (weaponType.IsTwoHanded)
                {
                    if (_weaponTrainingToWeaponCategory.TryGetValue(twoWeaponFeature, out value))
                    {
                        value.Add(weaponType.Category);
                    }
                    else
                    {
                        HashSet <WeaponCategory> categories = new HashSet <WeaponCategory>();
                        categories.Add(weaponType.Category);
                        _weaponTrainingToWeaponCategory[twoWeaponFeature] = categories;
                    }
                }
            }
        }
        private static List <BlueprintFeature> getAdvancedWeaponTraining(BlueprintCharacterClass fighter)
        {
            var weaponFocus   = library.Get <BlueprintParametrizedFeature>("1e1f627d26ad36f43bbd26cc2bf8ac7e");
            var weaponFinesse = library.Get <BlueprintFeature>("90e54424d682d104ab36436bd527af09");
            var features      = new List <BlueprintFeature>();

            FillWeaponFocusAndWeaponTrainingDictionaries();
            CreateAbilityMoveActions();


            foreach (var weaponTraining in _weaponTrainingBluePrints)
            {
                string weaponTrainingName        = getWeaponTrainingName(weaponTraining, true);
                string weaponTrainingDisplayName = getWeaponTrainingName(weaponTraining);


                string newAssetID = Helpers.getGuid("FocusedWeapon" + weaponTrainingName);

                var focusedWeaponSpecific = Helpers.Create <BlueprintParametrizedFeatureWeaponTraining>(x => x.WeaponTraining = weaponTraining);
                Helpers.SetFeatureInfo(focusedWeaponSpecific, "FocusedWeapon" + weaponTrainingName,
                                       "Focused Weapon (" + weaponTrainingDisplayName + ")", "The fighter selects one weapon for which he has Weapon Focus and that belongs to the associated fighter weapon group. The fighter can deal damage with this weapon based on the damage of the warpriest’s sacred weapon class feature, treating his fighter level as his warpriest level. The fighter must have Weapon Focus with the selected weapon in order to choose this option.",
                                       newAssetID,
                                       WeaponTraining.Icon,
                                       FeatureGroup.Feat,
                                       weaponFocus.PrerequisiteFeature(),
                                       weaponTraining.PrerequisiteFeature(),
                                       Helpers.Create <FocusedWeaponLogic>());
                focusedWeaponSpecific.ParameterType = FeatureParameterType.WeaponCategory;
                focusedWeaponSpecific.Prerequisite  = weaponFocus;
                focusedWeaponSpecific.Ranks         = 1;

                features.Add(focusedWeaponSpecific);


                features.Add(Helpers.CreateFeature(
                                 "ArmedBravery" + weaponTrainingName,
                                 "Armed Bravery (" + weaponTrainingDisplayName + ")",
                                 "The fighter applies his bonus from bravery to Will saving throws. In addition, the DC of Intimidate checks to demoralize him increases by an amount equal to twice his bonus from bravery. The fighter must have the bravery class feature in order to select this option.",
                                 Helpers.getGuid("ArmedBravery" + weaponTrainingName),
                                 WeaponTraining.Icon,
                                 FeatureGroup.CombatFeat,
                                 weaponTraining.PrerequisiteFeature(),
                                 BraveryFeature.PrerequisiteFeature(),
                                 Helpers.Create <ArmedBraveryLogic>(x => x.WeaponTraining = weaponTraining)
                                 ));

                features.Add(Helpers.CreateFeature(
                                 "CombatManeuverDefense" + weaponTrainingName,
                                 "Combat Maneuver Defense (" + weaponTrainingDisplayName + ")",
                                 "When the fighter is wielding weapons from the associated weapon group, his weapon training bonus applies to his CMD against all combat maneuvers attempted against him, instead of just against disarm and sunder combat maneuvers.",
                                 Helpers.getGuid("CombatManeuverDefense" + weaponTrainingName),
                                 WeaponTraining.Icon,
                                 FeatureGroup.CombatFeat,
                                 weaponTraining.PrerequisiteFeature(),
                                 Helpers.Create <CombatManeuverDefenseLogic>(x => x.WeaponTraining = weaponTraining)
                                 ));

                features.Add(Helpers.CreateFeature(
                                 "DazzlingIntimidation" + weaponTrainingName,
                                 "Dazzling Intimidation (" + weaponTrainingDisplayName + ")",
                                 "The fighter applies his weapon training bonus to Intimidate checks and can attempt an Intimidate check to demoralize an opponent as a move action instead of a standard action. If he has the Dazzling Display feat, he can use it as a standard action instead of a full-round action.",
                                 Helpers.getGuid("DazzlingIntimidation" + weaponTrainingName),
                                 WeaponTraining.Icon,
                                 FeatureGroup.CombatFeat,
                                 weaponTraining.PrerequisiteFeature(),
                                 Helpers.Create <DazzlingIntimidationLogic>(x => x.WeaponTraining = weaponTraining)
                                 ));

                features.Add(Helpers.CreateFeature(
                                 "DefensiveWeaponTraining" + weaponTrainingName,
                                 "Defensive Weapon Training (" + weaponTrainingDisplayName + ")",
                                 "The fighter gains a +1 shield bonus to his Armor Class. The fighter adds half his weapon’s enhancement bonus (if any) to this shield bonus. When his weapon training bonus for weapons from the associated fighter weapon group reaches +4, this shield bonus increases to +2. This shield bonus is lost if the fighter is immobilized or helpless.",
                                 Helpers.getGuid("DefensiveWeaponTraining" + weaponTrainingName),
                                 WeaponTraining.Icon,
                                 FeatureGroup.CombatFeat,
                                 weaponTraining.PrerequisiteFeature(),
                                 Helpers.Create <DefensiveWeaponTrainingLogic>(x => x.WeaponTraining = weaponTraining)
                                 ));

                features.Add(Helpers.CreateFeature(
                                 "EffortlessDualWielding" + weaponTrainingName,
                                 "Effortless Dual-Wielding (" + weaponTrainingDisplayName + ")",
                                 "The fighter treats all one-handed weapons that belong to the associated weapon group as though they were light weapons when determining his penalties on attack rolls for fighting with two weapons.",
                                 Helpers.getGuid("EffortlessDualWielding" + weaponTrainingName),
                                 WeaponTraining.Icon,
                                 FeatureGroup.CombatFeat,
                                 weaponTraining.PrerequisiteFeature(),
                                 Helpers.Create <EffortlessDualWieldingLogic>(x => x.WeaponTraining = weaponTraining)
                                 ));

                BlueprintFeatureSelection versatileTraining = Helpers.CreateFeatureSelection(
                    "VersatileTraining" + weaponTrainingName,
                    "Versatile Training (" + weaponTrainingDisplayName + ")",
                    "The fighter can use his base attack bonus in place of his ranks in two skills of his choice that are associated with the fighter weapon group he has chosen with this option (see below). The fighter need not be wielding an associated weapon to use this option. When using versatile training, the fighter substitutes his total base attack bonus (including his base attack bonus gained through levels in other classes) for his ranks in these skills, but adds the skill’s usual ability score modifier and any other bonuses or penalties that would modify those skills. Once the skills have been selected, they cannot be changed and the fighter can immediately retrain all of his skill ranks in the selected skills at no additional cost in money or time. In addition, the fighter adds all skills chosen with this option to his list of class skills. A fighter can choose this option up to two times. The Bluff and Intimidate skills are associated with all fighter weapon groups. The various fighter weapon groups also have the following associated skills: axes (Climb, Survival), bows (Knowledge [engineering], Perception), close (Sense Motive, Stealth), crossbows (Perception, Stealth), double (Acrobatics, Sense Motive), firearms (Perception, Sleight of Hand), flails (Acrobatics, Sleight of Hand), hammers (Diplomacy, Ride), heavy blades (Diplomacy, Ride), light blades (Diplomacy, Sleight of Hand), monk (Acrobatics, Escape Artist), natural (Climb, Fly, Swim), polearms (Diplomacy, Sense Motive), siege engines (Disable Device, Profession [driver]), spears (Handle Animal, Ride), and thrown (Acrobatics, Perception)",
                    Helpers.getGuid("VersatileTraining" + weaponTrainingName),
                    WeaponTraining.Icon,
                    FeatureGroup.CombatFeat,
                    weaponTraining.PrerequisiteFeature());

                List <BlueprintFeature> versatileTrainingFeatures = new List <BlueprintFeature>();
                WeaponGroupAttackBonus  weaponGroupAttackBonus    = weaponTraining.GetComponent <WeaponGroupAttackBonus>();
                if (weaponGroupAttackBonus != null)
                {
                    foreach (var statType in _weaponTrainingToStatType[weaponGroupAttackBonus.WeaponGroup])
                    {
                        versatileTrainingFeatures.Add(Helpers.CreateFeature(
                                                          "VersatileTraining" + weaponTrainingName + statType,
                                                          "Versatile Training (" + statType + ")",
                                                          "The fighter treats all one-handed weapons that belong to the associated weapon group as though they were light weapons when determining his penalties on attack rolls for fighting with two weapons.",
                                                          Helpers.getGuid("VersatileTraining" + weaponTrainingDisplayName + statType),
                                                          WeaponTraining.Icon,
                                                          FeatureGroup.CombatFeat,
                                                          weaponTraining.PrerequisiteFeature(),
                                                          Helpers.Create <SetSkillRankToBabLogic>(x => x.type = statType)));
                    }
                }

                versatileTraining.AddComponent(Helpers.Create <PrerequisiteMeetsPrerequisiteForAny>(x => x.Features = versatileTrainingFeatures.ToArray()));
                versatileTraining.SetFeatures(versatileTrainingFeatures);
                features.Add(versatileTraining);

                var fightersFinesse = Helpers.CreateFeature(
                    "FightersFinesse" + weaponTrainingName,
                    "Fighter’s Finesse (" + weaponTrainingDisplayName + ")",
                    "The fighter gains the benefits of the Weapon Finesse feat with all melee weapons that belong to the associated fighter weapon group (even if they cannot normally be used with Weapon Finesse). The fighter must have the Weapon Finesse feat before choosing this option.",
                    Helpers.getGuid("FightersFinesse" + weaponTrainingName),
                    WeaponTraining.Icon,
                    FeatureGroup.CombatFeat,
                    weaponTraining.PrerequisiteFeature(),
                    weaponFinesse.PrerequisiteFeature(),
                    Helpers.Create <FightersFinesseLogic>(x => x.WeaponTraining = weaponTraining));
                features.Add(fightersFinesse);

                features.Add(Helpers.CreateFeature(
                                 "TrainedGrace" + weaponTrainingName,
                                 "Trained Grace (" + weaponTrainingDisplayName + ")",
                                 "When the fighter uses Weapon Finesse to make a melee attack with a weapon, using his Dexterity modifier on attack rolls and his Strength modifier on damage rolls, he doubles his weapon training bonus on damage rolls. The fighter must have Weapon Finesse in order to choose this option.",
                                 Helpers.getGuid("TrainedGrace" + weaponTrainingName),
                                 WeaponTraining.Icon,
                                 FeatureGroup.CombatFeat,
                                 weaponTraining.PrerequisiteFeature(),
                                 weaponFinesse.PrerequisiteFeature(),
                                 Helpers.Create <TrainedGraceLogic>(x =>
                {
                    x.WeaponFighterGroupFeature = weaponTraining;
                    x.FightersFinesseFeature    = fightersFinesse;
                })));

                features.Add(Helpers.CreateFeature(
                                 "FightersReflexes" + weaponTrainingName,
                                 "Fighter’s Reflexes (" + weaponTrainingDisplayName + ")",
                                 "The fighter applies his weapon training bonus to Reflex saving throws. He loses this bonus when he is flat-footed or denied his Dexterity bonus to AC.",
                                 Helpers.getGuid("FightersReflexes" + weaponTrainingName),
                                 WeaponTraining.Icon,
                                 FeatureGroup.CombatFeat,
                                 weaponTraining.PrerequisiteFeature(),
                                 Helpers.Create <FightersReflexesLogic>(x => x.WeaponTraining = weaponTraining)));

                features.Add(Helpers.CreateFeature(
                                 "FightersTactics" + weaponTrainingName,
                                 "Fighter’s Tactics (" + weaponTrainingDisplayName + ")",
                                 "All of the fighter’s allies are treated as if they had the same teamwork feats as the fighter for the purpose of determining whether the fighter receives a bonus from his teamwork feats. His allies do not receive any bonuses from these feats unless they actually have the feats themselves. The allies’ positioning and actions must still meet the prerequisites listed in the teamwork feat for the fighter to receive the listed bonus.",
                                 Helpers.getGuid("FightersTactics" + weaponTrainingName),
                                 WeaponTraining.Icon,
                                 FeatureGroup.CombatFeat,
                                 weaponTraining.PrerequisiteFeature(),
                                 Helpers.Create <FightersTacticsLogic>(x => x.WeaponTraining = weaponTraining)));
            }

            features.AddRange(AddWarriorSpirit());

            return(features);
        }