Пример #1
0
        private void ParseFeats(string feats)
        {
            MythicFeats = new List <string>();
            Feats       = feats.Replace("*", string.Empty).Split(',').ToList();
            Feats.RemoveAll(x => x == string.Empty);
            Feats.Remove(PathfinderConstants.SPACE);

            FeatCount = new Dictionary <string, int>();

            int Count = Feats.Count - 1;

            for (int a = Count; a >= 0; a--)
            {
                if (Feats[a].EndsWith("B"))
                {
                    Feats[a] = Feats[a].Substring(0, Feats[a].Length - 1);
                }

                if (Feats[a].Contains(PathfinderConstants.PAREN_LEFT))
                {
                    _featsHaveParens = true;
                    int    Pos  = Feats[a].IndexOf(PathfinderConstants.PAREN_LEFT);
                    string temp = Feats[a].Substring(Pos);
                    temp = Utility.RemoveParentheses(temp);
                    int value;
                    int.TryParse(temp, out value);
                    if (value > 0)
                    {
                        Feats[a] = Feats[a].Replace(temp, string.Empty);
                        temp     = Utility.RemoveParentheses(temp);
                        Feats[a] = Utility.RemoveParentheses(Feats[a]);
                        Feats[a] = Utility.RemoveSuperScripts(Feats[a]);
                        FeatCount.Add(Feats[a].Trim(), value);
                    }
                    else if (temp.Contains("see "))
                    {
                        Feats[a] = Feats[a].Replace(temp, string.Empty);
                    }
                }

                Feats[a] = Utility.RemoveSuperScripts(Feats[a]);
                if (Feats[a].EndsWith("[M]") || Feats[a].Contains("[M] "))
                {
                    string temp = Feats[a].Replace("[M] ", PathfinderConstants.SPACE);
                    if (temp.EndsWith("[M]"))
                    {
                        temp = temp.Substring(0, temp.Length - 3);
                    }
                    temp = temp.Trim();
                    string tempOld = temp;
                    MythicFeats.Add(temp);
                    if (temp.Contains(PathfinderConstants.PAREN_LEFT))
                    {
                        _featsHaveParens = true;
                        int Pos = temp.IndexOf(PathfinderConstants.PAREN_LEFT);
                        temp = temp.Substring(0, Pos).Trim();
                    }
                    IFeatStatBlock tempFeat = _featStatBlockBusiness.GetMythicFeatByName(temp);
                    if (tempFeat != null && tempFeat.prerequisite_feats == temp)
                    {
                        Feats[a] = tempOld;
                    }
                    else
                    {
                        Feats[a] = string.Empty;
                    }

                    Feats.RemoveAll(x => x == string.Empty);
                }
                else
                {
                    Feats[a] = Feats[a].Trim();
                }
            }
        }
        public void CheckFeatCount(string Feats)
        {
            string CheckName = "Feat Count";

            string hold = Feats;

            Utility.ParenCommaFix(ref hold);
            List <string> MythicFeats = new List <string>();
            List <string> featList    = hold.Replace("*", string.Empty).Split(',').ToList();

            featList.RemoveAll(p => p == string.Empty);
            List <string> NewFeats = new List <string>();

            featList = RemoveSuperScripts(featList); //not mythic M
            featList.RemoveAll(p => p == PathfinderConstants.SPACE);

            int Count = featList.Count - 1;

            for (int a = Count; a >= 0; a--)
            {
                string feat = featList[a];
                if (feat.Contains("- "))
                {
                    _sbCheckerBaseInput.MessageXML.AddFail("Feat Spelling", "hyphen space in feat name");
                }
                if (feat.Contains(PathfinderConstants.PAREN_LEFT))
                {
                    int    Pos   = feat.IndexOf(PathfinderConstants.PAREN_LEFT);
                    string temp3 = feat.Substring(Pos);
                    temp3 = temp3.Replace(PathfinderConstants.PAREN_LEFT, string.Empty);
                    temp3 = temp3.Replace(PathfinderConstants.PAREN_RIGHT, string.Empty);
                    int count;
                    int.TryParse(temp3, out count);
                    if (count > 0)
                    {
                        NewFeats.Add(feat);
                    }
                    else
                    {
                        if (temp3.Contains("|"))
                        {
                            List <string> MultipleFeats = temp3.Split('|').ToList();

                            Pos = feat.IndexOf(PathfinderConstants.PAREN_LEFT);
                            string baseFeat = feat.Substring(0, Pos).Trim();
                            featList[a] = baseFeat + " (" + MultipleFeats[0].Trim() + PathfinderConstants.PAREN_RIGHT;

                            for (int b = 1; b <= MultipleFeats.Count - 1; b++)
                            {
                                NewFeats.Add(baseFeat + " (" + MultipleFeats[b].Trim() + PathfinderConstants.PAREN_RIGHT);
                            }
                        }
                    }
                }
                //if (feat.EndsWith("M") || feat.Contains("M "))
                if (feat.Contains("[M]"))
                {
                    string temp2 = feat.Replace("[M]", string.Empty);
                    if (temp2.EndsWith("M"))
                    {
                        temp2 = temp2.Substring(0, temp2.Length - 1);
                    }
                    string tempOld = temp2;
                    if (temp2.Contains(PathfinderConstants.PAREN_LEFT))
                    {
                        int Pos = temp2.IndexOf(PathfinderConstants.PAREN_LEFT);
                        temp2 = temp2.Substring(0, Pos).Trim();
                    }
                    temp2 = temp2.Trim();
                    MythicFeats.Add(temp2.Trim());
                    IFeatStatBlock tempFeat = _featStatBlockBusiness.GetMythicFeatByName(temp2);
                    if (tempFeat != null && tempFeat.prerequisite_feats == temp2)
                    {
                        featList[a] = tempOld;
                    }
                    else
                    {
                        featList[a] = string.Empty;
                    }
                }
            }
            featList.RemoveAll(x => x == string.Empty);
            featList.AddRange(NewFeats);
            if (_sbCheckerBaseInput.MonsterSBSearch.IsMythic)
            {
                int value           = _sbCheckerBaseInput.MonsterSBSearch.MythicValue;
                int MythicFeatCount = StatBlockInfo.GetMythicFeats(value);

                if (MythicFeatCount == MythicFeats.Count)
                {
                    _sbCheckerBaseInput.MessageXML.AddPass("Mythic Feat Count");
                }
                else
                {
                    _sbCheckerBaseInput.MessageXML.AddFail("Mythic Feat Count", MythicFeatCount.ToString(), MythicFeats.Count.ToString(), "");
                }
            }

            int    FeatCount = _sbCheckerBaseInput.CharacterClasses.FindClassFeatCount();
            string formula   = FeatCount.ToString() + " classes";

            if ((featList.Contains("AlertnessB") || featList.Contains("Alertness")) && _sbCheckerBaseInput.MonsterSBSearch.HasFamiliar())
            {
                FeatCount++;
                formula += " +1 Familiar bonus";
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasHex("cauldron"))
            {
                FeatCount++;
                formula += " +1 cauldron hex";
            }

            //if (_sbCheckerBaseInput.Race_Base.RaceBaseType != RaceBase.RaceType.Race)
            //{
            int count2 = featList.Count;

            for (int a = count2 - 1; a >= 0; a--)
            {
                if (featList[a].LastIndexOf("B") == featList[a].Length - 1)
                {
                    featList.Remove(featList[a]);
                }
                else if (featList[a].Contains(PathfinderConstants.PAREN_LEFT))
                {
                    string tempFeat = featList[a].Substring(0, featList[a].IndexOf(PathfinderConstants.PAREN_LEFT)).Trim();
                    if (tempFeat.LastIndexOf("B") == tempFeat.Length - 1)
                    {
                        featList.Remove(featList[a]);
                    }
                }
                else if (featList[a].Contains("B "))
                {
                    featList.Remove(featList[a]);
                }
            }
            //}

            if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("secrets")) //loremaster
            {
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("secret health"))
                {
                    FeatCount++;
                    formula += " +1 secret health";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("applicable knowledge"))
                {
                    FeatCount++;
                    formula += " +1 applicable knowledge";
                }
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("slayer talents"))
            {
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("combat trick"))
                {
                    FeatCount++;
                    formula += " +1 combat trick";
                }
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("rogue talent") || _sbCheckerBaseInput.MonsterSBSearch.HasSQ("ninja tricks"))
            {
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("combat trick"))
                {
                    FeatCount++;
                    formula += " +1 combat trick";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("finesse rogue"))
                {
                    FeatCount++; //weapon finesse
                    formula += " +1 finesse rogue";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("weapon training"))
                {
                    FeatCount++;
                    formula += " +1 weapon training";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("feat"))
                {
                    FeatCount++;
                    formula += " +1 rogue talent feat";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("card sharp"))
                {
                    FeatCount++;
                    formula += " +1 card sharp";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("grit"))
                {
                    FeatCount += 2;
                    formula   += " +2 grit";
                }
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasCavalierOrder("order of the cockatrice"))
            {
                int cavalierLevels = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("cavalier");
                if (cavalierLevels >= 2)
                {
                    FeatCount++;
                    formula += " +1 order of the cockatrice";
                }
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasCavalierOrder("order of the whip"))
            {
                int cavalierLevels = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("cavalier");
                if (cavalierLevels >= 2)
                {
                    FeatCount++;
                    formula += " +1 order of the whip";
                }
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("revelations") && _sbCheckerBaseInput.MonsterSBSearch.HasSQ("weapon mastery")) // oracle battle mystery
            {
                int OracleLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("oracle");
                FeatCount++;
                formula += " +1 weapon focus";
                if (OracleLevel >= 8)
                {
                    FeatCount++;
                    formula += " +1 Improved Critical";
                }
                if (OracleLevel >= 12)
                {
                    FeatCount++;
                    formula += " +1 Greater Weapon Focus";
                }
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("revelations") && _sbCheckerBaseInput.MonsterSBSearch.HasSQ("stone stability")) // oracle stone mystery
            {
                int OracleLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("oracle");
                if (OracleLevel >= 5)
                {
                    FeatCount++;
                    formula += " +1  Improved Trip";
                }
                if (OracleLevel >= 10)
                {
                    FeatCount++;
                    formula += " +1 Greater Trip";
                }
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("revelations") && _sbCheckerBaseInput.MonsterSBSearch.HasSQ("cinder dance")) // oracle flame mystery
            {
                int OracleLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("oracle");
                if (OracleLevel >= 5)
                {
                    FeatCount++;
                    formula += " +1  Nimble Moves";
                }
                if (OracleLevel >= 10)
                {
                    FeatCount++;
                    formula += " +1 Acrobatic Steps";
                }
            }

            #region ClassArchetypes
            if (_sbCheckerBaseInput.MonsterSBSearch.HasAnyClassArchetypes())
            {
                if (_sbCheckerBaseInput.MonsterSBSearch.HasClassArchetype("unarmed fighter"))
                {
                    FeatCount++;
                    formula += " +1 Unarmed Style";
                }

                if (_sbCheckerBaseInput.MonsterSBSearch.HasClassArchetype("pirate"))
                {
                    FeatCount++;
                    formula += " +1 Sea Legs";
                }

                if (_sbCheckerBaseInput.MonsterSBSearch.HasClassArchetype("musketeer"))
                {
                    FeatCount += 2;
                    formula   += " +2 Musketeer Instruction";
                }

                if (_sbCheckerBaseInput.MonsterSBSearch.HasClassArchetype("cad"))
                {
                    int CadLevels = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("fighter");
                    if (CadLevels >= 3)
                    {
                        FeatCount++;                 // Catch Off Guard
                    }
                    formula += " +1 Catch Off Guard";
                }

                if (_sbCheckerBaseInput.MonsterSBSearch.HasClassArchetype("steel hound"))
                {
                    int investigatorLevels = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("investigator");
                    if (investigatorLevels >= 2)
                    {
                        FeatCount += 2;                          // Amateur Gunslinger and Gunsmithing
                    }
                    formula += " +2 Packing Heat";
                }

                if (_sbCheckerBaseInput.MonsterSBSearch.HasClassArchetype("constable"))
                {
                    FeatCount++; // Apprehend (Ex)
                    formula += " +1 Apprehend";
                }

                if (_sbCheckerBaseInput.MonsterSBSearch.HasClassArchetype("staff magus"))
                {
                    FeatCount++; // Quarterstaff Master (Ex)
                    formula += " +1 Quarterstaff Master";
                }

                if (_sbCheckerBaseInput.MonsterSBSearch.HasClassArchetype("musket master"))
                {
                    FeatCount++; // Rapid Reloader
                    formula += " +1 Rapid Reloader";
                }

                if (_sbCheckerBaseInput.MonsterSBSearch.HasClassArchetype("weapon adept"))
                {
                    int monkLevels = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("monk");
                    if (monkLevels >= 1)
                    {
                        FeatCount++;
                    }
                    formula += " +1 Perfect Strike";
                    if (monkLevels >= 2)
                    {
                        FeatCount++;
                        formula += " +1 Weapon Focus";
                    }
                }
            }
            #endregion ClassArchetypes

            if (_sbCheckerBaseInput.MonsterSBSearch.HasSpellDomians())
            {
                int clericLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("cleric");
                if (clericLevel == 0)
                {
                    clericLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("druid");
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSpellDomain("Nobility") && clericLevel >= 8)
                {
                    FeatCount++;
                    formula += " +1 Nobility";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSpellDomain("Rune"))
                {
                    FeatCount++;
                    formula += " +1 Rune";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSpellDomain("Darkness"))
                {
                    FeatCount++;
                    formula += " +1 Darkness";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSpellDomain("Persistence"))
                {
                    FeatCount++;  //step up
                    formula += " +1 Persistence";
                }
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSpellDomain("Black Powder"))
                {
                    FeatCount++;  //Gunsmithing  inquisition
                    formula += " +1 Black Powder";
                }
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasTemplate("worm that walks"))
            {
                FeatCount++;  //diehard
                formula += " +1 worm that walks";
            }

            if (_sbCheckerBaseInput.CharacterClasses.HasClass("arcanist"))
            {
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSpecialAttack("metamagic knowledge"))
                {
                    FeatCount++;  //Metamagic Knowledge
                    formula += " +1 metamagic knowledge";
                }
            }

            if (_sbCheckerBaseInput.CharacterClasses.HasClass("slayer"))
            {
                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("ranger combat style"))
                {
                    int slayerLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("slayer");
                    int tempMod     = 0;

                    if (slayerLevel >= 2)
                    {
                        tempMod++;
                    }
                    if (slayerLevel >= 6)
                    {
                        tempMod++;
                    }
                    if (slayerLevel >= 10)
                    {
                        tempMod++;
                    }
                    if (slayerLevel >= 14)
                    {
                        tempMod++;
                    }
                    if (slayerLevel >= 18)
                    {
                        tempMod++;
                    }

                    if (tempMod > 0)
                    {
                        FeatCount += tempMod;
                        formula   += " +" + tempMod.ToString() + " ranger combat style";
                    }
                }

                if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("weapon training"))
                {
                    FeatCount += 1;
                    formula   += " +1 weapon training";
                }
            }

            if (_sbCheckerBaseInput.CharacterClasses.HasClass("hellknight signifer"))
            {
                int hellknightSigniferLevel = _sbCheckerBaseInput.CharacterClasses.FindClassLevel("hellknight signifer");
                if (hellknightSigniferLevel >= 2 && _sbCheckerBaseInput.MonsterSBSearch.HasFeat("Arcane Armor Training"))
                {
                    FeatCount++;  //Arcane Armor Mastery
                    formula += " +1 Arcane Armor Expertise";
                }
            }

            if (_sbCheckerBaseInput.MonsterSBSearch.HasSQ("investigator talent") && _sbCheckerBaseInput.MonsterSBSearch.HasSQ("bonus feat")) // oracle battle mystery
            {
                FeatCount++;                                                                                                                 //Investigator Talents
                formula += " +1 Investigator Talent";
            }


            int temp = 0;
            if (_sbCheckerBaseInput.Race_Base != null)
            {
                if (_sbCheckerBaseInput.Race_Base.RaceBaseType == RaceBase.RaceType.StatBlock && _sbCheckerBaseInput.Race_Base.UseRacialHD)
                {
                    if (!HasEnvirmonment)
                    {
                        temp       = _sbCheckerBaseInput.Race_Base.BonusFeatCount();
                        formula   += " +" + temp.ToString() + " Race";
                        FeatCount += temp;
                    }
                }

                //FeatCount += StatBlockInfo.GetHDFeats(_sbCheckerBaseInput.CharacterClasses.FindTotalClassLevels());
                temp       = StatBlockInfo.GetHDFeats(HDValue);
                formula   += " +" + temp.ToString() + " Hit Dice";
                FeatCount += temp;
                if (_sbCheckerBaseInput.Race_Base.RaceBaseType == RaceBase.RaceType.Race)
                {
                    temp       = _sbCheckerBaseInput.Race_Base.BonusFeatCount();
                    formula   += " +" + temp.ToString() + " Race";
                    FeatCount += temp;
                }
            }

            int SB_count = featList.Count();

            if (IntAbilityScoreValue == 0)
            {
                FeatCount = 0;
                formula   = " Int=0";
            }

            if (SB_count == FeatCount)
            {
                _sbCheckerBaseInput.MessageXML.AddPass(CheckName, formula);
            }
            else
            {
                _sbCheckerBaseInput.MessageXML.AddFail(CheckName, FeatCount.ToString(), SB_count.ToString(), formula);
            }
        }
Пример #3
0
        public void ParseFeats()
        {
            string workingFeat = null;

            try
            {
                bool   found     = false;
                string holdFeats = _sbCheckerBaseInput.MonsterSB.Feats;
                Utility.ParenCommaFix(ref holdFeats);
                List <string> tempFeats = holdFeats.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();

                string startFeatName = string.Empty;
                for (int a = tempFeats.Count - 1; a >= 0; a--)
                {
                    if (tempFeats[a].Contains("|"))
                    {
                        int Pos = tempFeats[a].IndexOf(PathfinderConstants.PAREN_LEFT);
                        startFeatName = tempFeats[a].Substring(0, Pos + 1).Trim();
                        holdFeats     = tempFeats[a].Substring(Pos);
                        holdFeats     = holdFeats.Replace(PathfinderConstants.PAREN_RIGHT, string.Empty);
                        holdFeats     = holdFeats.Replace(PathfinderConstants.PAREN_LEFT, string.Empty).Trim();
                        List <string> subFeatsList = holdFeats.Split('|').ToList();
                        //1st one
                        tempFeats[a] = startFeatName + subFeatsList[0].Trim() + PathfinderConstants.PAREN_RIGHT;
                        subFeatsList.Remove(subFeatsList[0]);
                        foreach (string sub in subFeatsList)
                        {
                            tempFeats.Add(startFeatName + sub.Trim() + PathfinderConstants.PAREN_RIGHT);
                        }
                    }
                }

                for (int a = 0; a < tempFeats.Count; a++)
                {
                    found = false;
                    foreach (string script in _sbCheckerBaseInput.SourceSuperScripts)
                    {
                        if (tempFeats[a].EndsWith(script))
                        {
                            tempFeats[a] = tempFeats[a].Substring(0, tempFeats[a].Length - script.Length).Trim();
                            found        = true;
                        }

                        if (tempFeats[a].Contains(script) && !found)
                        {
                            tempFeats[a] = tempFeats[a].Replace(script, string.Empty).Trim();
                            found        = true;
                        }
                    }
                    if (tempFeats[a].EndsWith("M") && !found)
                    {
                        tempFeats[a] = tempFeats[a].Substring(0, tempFeats[a].Length - 1).Trim();
                    }
                }


                StatBlockInfo.ArmorProficiencies tempArmorPro = _sbCheckerBaseInput.CharacterClasses.GetAllKnownArmorProficiencies();
                if ((tempArmorPro & StatBlockInfo.ArmorProficiencies.Light) == StatBlockInfo.ArmorProficiencies.Light)
                {
                    tempFeats.Add("Light Armor Proficiency");
                }
                if ((tempArmorPro & StatBlockInfo.ArmorProficiencies.Medium) == StatBlockInfo.ArmorProficiencies.Medium)
                {
                    tempFeats.Add("Medium Armor Proficiency");
                }
                if ((tempArmorPro & StatBlockInfo.ArmorProficiencies.Heavy) == StatBlockInfo.ArmorProficiencies.Heavy)
                {
                    tempFeats.Add("Heavy Armor Proficiency");
                }
                StatBlockInfo.ShieldProficiencies tempShieldPro = _sbCheckerBaseInput.CharacterClasses.GetAllKnownShieldProficiencies();
                if ((tempShieldPro & StatBlockInfo.ShieldProficiencies.Shield) == StatBlockInfo.ShieldProficiencies.Shield)
                {
                    tempFeats.Add("Shield Proficiency");
                }
                if ((tempShieldPro & StatBlockInfo.ShieldProficiencies.Tower) == StatBlockInfo.ShieldProficiencies.Tower)
                {
                    tempFeats.Add("Tower Shield Proficiency");
                }
                StatBlockInfo.WeaponProficiencies tempWeaponPro = _sbCheckerBaseInput.CharacterClasses.GetAllKnownWeaponsProficiencies();
                if ((tempWeaponPro & StatBlockInfo.WeaponProficiencies.Simple) == StatBlockInfo.WeaponProficiencies.Simple)
                {
                    tempFeats.Add("Simple Weapon Proficiency");
                }
                if ((tempWeaponPro & StatBlockInfo.WeaponProficiencies.Martial) == StatBlockInfo.WeaponProficiencies.Martial)
                {
                    tempFeats.Add("Martial Weapon Proficiency");
                }
                if ((tempWeaponPro & StatBlockInfo.WeaponProficiencies.Exotic) == StatBlockInfo.WeaponProficiencies.Exotic)
                {
                    tempFeats.Add("Exotic Weapon Proficiency");
                }

                string         hold         = string.Empty;
                string         selectedItem = string.Empty;
                bool           bonusFeat;
                IFeatStatBlock featSB;
                List <string>  FailedFeats = new List <string>();
                tempFeats.RemoveAll(p => p == string.Empty);
                tempFeats.RemoveAll(p => p == " *");
                tempFeats.RemoveAll(p => p == PathfinderConstants.SPACE);

                foreach (string tempFeat in tempFeats)
                {
                    hold        = tempFeat.Trim();
                    workingFeat = hold;
                    // hold = hold.Replace("'", string.Empty);
                    bonusFeat = false;
                    if (hold.EndsWith("B"))
                    {
                        hold      = hold.Substring(0, hold.Length - 1);
                        bonusFeat = true;
                    }
                    else if (hold.Contains("B "))
                    {
                        hold      = hold.Replace("B ", PathfinderConstants.SPACE);
                        bonusFeat = true;
                    }
                    selectedItem = string.Empty;
                    int Pos = hold.IndexOf(PathfinderConstants.PAREN_LEFT);
                    if (Pos >= 0)
                    {
                        selectedItem = hold.Substring(Pos);
                        hold         = hold.Replace(selectedItem, string.Empty).Trim();
                        selectedItem = Utility.RemoveParentheses(selectedItem);
                    }
                    hold = hold.Replace("**", string.Empty);
                    hold = hold.Replace("*", string.Empty);

                    if (hold.EndsWith("[M]"))
                    {
                        // hold = hold.Substring(0, hold.Length - 1);
                        hold   = hold.Replace("[M]", string.Empty);
                        featSB = _featStatBlockBusiness.GetMythicFeatByName(hold);
                    }
                    else
                    {
                        featSB = _featStatBlockBusiness.GetFeatByName(hold);
                    }
                    if (featSB != null)
                    {
                        _featManager.AddFeatData(new FeatData(featSB.name, featSB.prerequisites, featSB.prerequisite_feats, bonusFeat, selectedItem, featSB.type, featSB.prerequisite_skills));
                    }
                    else
                    {
                        FailedFeats.Add(hold);
                    }
                }

                if (FailedFeats.Any())
                {
                    _sbCheckerBaseInput.MessageXML.AddFail("ParseFeats", "Feats: " + string.Join(", ", FailedFeats.ToArray()) + " not defined");
                }

                //_featManager = new FeatMaster(temp);
            }
            catch (Exception ex)
            {
                if (_featManager == null)
                {
                    _featManager = new FeatMaster(new List <string>());
                }
                _sbCheckerBaseInput.MessageXML.AddFail("Parse Feats", "Working Feat : " + workingFeat + "   " + ex.Message);
            }
        }