static BlueprintFeature CreateBloodlinePower(BlueprintProgression bloodline, int level, BlueprintProgression crossbloodline)
        {
            var power   = EldritchHeritage.GetBloodlinePower(bloodline, level);
            var entries = EldritchHeritage.CollectLevelEntries(level, power, bloodline);

            if (entries.Count == 1)
            {
                return(CreateCrossbloodedFeature(entries[0].Item2, crossbloodline));
            }

            var name = power.name;

            if (name.EndsWith("1"))
            {
                name = name.Substring(0, power.name.Length - 1);
            }

            var feature = Helpers.CreateFeature($"{name}Cross", power.Name, power.Description,
                                                Helpers.MergeIds(power.AssetGuid, "3b983f0653914618844275e20d9fe561"),
                                                power.Icon, FeatureGroup.None);

            var components = new List <BlueprintComponent> {
                crossbloodline.PrerequisiteFeature()
            };

            for (int i = 0; i < entries.Count; i++)
            {
                var e = entries[i];
                components.Add(AddFactOnBloodlineLevel.Create(e.Item2, $"${i}", e.Item1));
            }
            feature.SetComponents(components);
            return(feature);
        }
        // Create the Time mystery.
        //
        // Note: Time does not have a spell list, because too many spells are missing.
        // Instead it's used with the Ancient Lorekeeper archetype.
        // (The prerequsite is added by the archetype.)
        internal static (BlueprintProgression, BlueprintFeature) Create(String mysteryDescription, BlueprintFeature classSkillFeat)
        {
            var revelations = new List <BlueprintFeature>()
            {
                CreateAgingTouch(),
                CreateEraseFromTime(),
                CreateMomentaryGlimpse(),
                CreateRewindTime(),
                CreateKnowledgeOfTheAges(),
                CreateSpeedOrSlowTime(),
                CreateTemporalClarity(),
                CreateTimeFlicker(),
                CreateTimeHop(),
                CreateTimeSight()
            };

            var skill1      = StatType.SkillAthletics;
            var skill2      = StatType.SkillMobility;
            var description = new StringBuilder(mysteryDescription).AppendLine();

            description.AppendLine(
                $"Class skills: {UIUtility.GetStatText(skill1)}, {UIUtility.GetStatText(skill2)}\n" +
                "An oracle with the time mystery can choose from any of the following revelations:");
            foreach (var r in revelations)
            {
                description.AppendLine($"• {r.Name}");
            }

            var mystery = Helpers.CreateProgression("MysteryTimeProgression", "Time Mystery", description.ToString(),
                                                    "b05d63ba0f634061af15c995c1a3340d",
                                                    TimeStop.spell.Icon,
                                                    UpdateLevelUpDeterminatorText.Group,
                                                    AddClassSkillIfHasFeature.Create(skill1, classSkillFeat),
                                                    AddClassSkillIfHasFeature.Create(skill2, classSkillFeat));

            mystery.Classes     = oracleArray;
            TimeMystery.mystery = mystery;

            var finalRevelation = CreateFinalRevelation();

            mystery.LevelEntries = new LevelEntry[] { Helpers.LevelEntry(20, finalRevelation) };

            var revelation = Helpers.CreateFeatureSelection("MysteryTimeRevelation", "Time Revelation",
                                                            mystery.Description, "d9a38bc21fd6441094e4a48de1aa4fad", null, FeatureGroup.None,
                                                            mystery.PrerequisiteFeature());

            revelation.Mode = SelectionMode.OnlyNew;
            revelation.SetFeatures(revelations);

            return(mystery, revelation);
        }
        //here we make bloodline mutations
        static BlueprintFeature CreateMutateBloodlinePower(BlueprintProgression bloodline, int level, BlueprintProgression crossbloodline)
        {
            var power   = EldritchHeritage.GetBloodlinePower(bloodline, level);
            var entries = EldritchHeritage.CollectLevelEntries(level, power, bloodline);

            /*
             * if (entries.Count == 1)
             * {
             *  return CreateCrossbloodedFeature(entries[0].Item2, crossbloodline);
             * }*/
            var spellFocus = library.Get <BlueprintParametrizedFeature>("16fa59cc9a72a6043b566b49184f53fe");
            var name       = power.name;

            if (name.EndsWith("1"))
            {
                name = name.Substring(0, power.name.Length - 1);
            }
            name += " Mutation Havoc";

            var feature = Helpers.CreateFeature($"{name}CrossMutate", "Blood Havoc Mutation(" + bloodline.Name + ")", "A bloodrager need not be in a bloodrage to use her bloodline mutation powers. Alternatively, a bloodrager or sorcerer can select a bloodline mutation in place of a bloodline bonus feat, provided her class level is at least equal to the level of the bloodline ability the mutation normally replaces.\n" +
                                                "Bloodline Mutation: Blood havoc\n" +
                                                "Whenever you cast a bloodrager or sorcerer spell that deals damage, add 1 point of damage per die rolled. ",
                                                Helpers.MergeIds(power.AssetGuid, "2b983f0653914618844275e20d9fe562"),
                                                Helpers.NiceIcons(28), FeatureGroup.None);
            var components = new List <BlueprintComponent> {
                crossbloodline.PrerequisiteFeature(), spellFocus.PrerequisiteFeature(), Helpers.Create <OrcBloodlineArcana>()
            };

            /*
             * for (int i = 0; i < entries.Count; i++)
             * {
             *  var e = entries[i];
             *  components.Add(AddFactOnBloodlineLevel.Create(e.Item2, $"${i}", e.Item1));
             * }
             */
            feature.SetComponents(components);
            return(feature);
        }
        //here we make bloodline mutations
        static BlueprintFeature CreateMutateBloodlinePower(BlueprintProgression bloodline, int level, BlueprintProgression crossbloodline)
        {
            var power   = EldritchHeritage.GetBloodlinePower(bloodline, level);
            var entries = EldritchHeritage.CollectLevelEntries(level, power, bloodline);

            /*
             * if (entries.Count == 1)
             * {
             *  return CreateCrossbloodedFeature(entries[0].Item2, crossbloodline);
             * }*/
            var spellFocus = library.Get <BlueprintParametrizedFeature>("16fa59cc9a72a6043b566b49184f53fe");
            var name       = power.name;

            if (name.EndsWith("1"))
            {
                name = name.Substring(0, power.name.Length - 1);
            }
            name += " Mutation Havoc";

            var feature = Helpers.CreateFeature($"{name}CrossMutate", string.Format(RES.BloodHavocMutationFeatureName_info, bloodline.Name), RES.BloodHavocMutationFeatureDescription_info,
                                                Helpers.MergeIds(power.AssetGuid, "2b983f0653914618844275e20d9fe562"),
                                                Helpers.NiceIcons(28), FeatureGroup.None);
            var components = new List <BlueprintComponent> {
                crossbloodline.PrerequisiteFeature(), spellFocus.PrerequisiteFeature(), Helpers.Create <OrcBloodlineArcana>()
            };

            /*
             * for (int i = 0; i < entries.Count; i++)
             * {
             *  var e = entries[i];
             *  components.Add(AddFactOnBloodlineLevel.Create(e.Item2, $"${i}", e.Item1));
             * }
             */
            feature.SetComponents(components);
            return(feature);
        }