internal static (BlueprintFeature, BlueprintFeature) Create(String mysteryDescription, BlueprintFeature classSkillFeat)
        {
            var skill1 = StatType.SkillKnowledgeArcana;
            var skill2 = StatType.SkillPerception;

            var mystery = Helpers.CreateProgression("MysteryHeavensProgression", "夜空秘视域", $"{mysteryDescription}\n" +
                                                    "被深邃夜空吸引的先知可以学到一系列从夜空中汲取力量的法术和启示,璀璨炫目的星光,空灵皎洁的银月,或是幽暗深沉的虚空,都是他们的力量之源。\n" +
                                                    $"本职技能: {UIUtility.GetStatText(skill1)}, {UIUtility.GetStatText(skill2)}",
                                                    "dabcaefe63bc471dac44e8e23c1c330f",
                                                    Helpers.GetIcon("91da41b9793a4624797921f221db653c"), // color spray
                                                    UpdateLevelUpDeterminatorText.Group,
                                                    AddClassSkillIfHasFeature.Create(skill1, classSkillFeat),
                                                    AddClassSkillIfHasFeature.Create(skill2, classSkillFeat));

            mystery.Classes = oracleArray;

            var spells = Bloodlines.CreateSpellProgression(mystery, new String[] {
                "91da41b9793a4624797921f221db653c", // color spray
                Spells.hypnoticPatternId,
                "bf0accce250381a44b857d4af6c8e10d", // searing light (should be: daylight)
                "4b8265132f9c8174f87ce7fa6d0fe47b", // rainbow pattern
                FlySpells.overlandFlight.AssetGuid,
                "645558d63604747428d55f0dd3a4cb58", // chain lightning
                "b22fd434bdb60fb4ba1068206402c4cf", // prismatic spray
                "e96424f70ff884947b06f41a765b7658", // sunburst
                FireSpells.meteorSwarm.AssetGuid,
            });

            var revelations = new List <BlueprintFeature>()
            {
                // TODO
            };
            var description = new StringBuilder(mystery.Description).AppendLine();

            description.AppendLine("选择了火焰秘视域的先知可以选择以下启示:");
            foreach (var r in revelations)
            {
                description.AppendLine($"• {r.Name}");
                r.InsertComponent(0, Helpers.PrerequisiteFeature(mystery));
            }
            mystery.SetDescription(description.ToString());

            var entries = new List <LevelEntry>();

            for (int level = 1; level <= 9; level++)
            {
                entries.Add(Helpers.LevelEntry(level * 2, spells[level - 1]));
            }
            // TODO:
            //var finalRevelation = CreateFinalRevelation();
            //entries.Add(Helpers.LevelEntry(20, finalRevelation));

            mystery.LevelEntries = entries.ToArray();
            mystery.UIGroups     = Helpers.CreateUIGroups(new List <BlueprintFeatureBase>(spells) /*TODO:finalRevelation*/ }
Exemple #2
0
        internal static (BlueprintFeature, BlueprintFeature) Create(String mysteryDescription, BlueprintFeature classSkillFeat)
        {
            var skill1 = StatType.SkillKnowledgeArcana;
            var skill2 = StatType.SkillPerception;

            var mystery = Helpers.CreateProgression("MysteryHeavensProgression", "Heavens Mystery", $"{mysteryDescription}\n" +
                                                    "Oracles who drawn to the night sky learn spells and revelations that draw power from the heavens: the many colors of starlight, the moon, or the empty void of space.\n" +
                                                    $"Class skills: {UIUtility.GetStatText(skill1)}, {UIUtility.GetStatText(skill2)}",
                                                    "dabcaefe63bc471dac44e8e23c1c330f",
                                                    Helpers.GetIcon("91da41b9793a4624797921f221db653c"), // color spray
                                                    UpdateLevelUpDeterminatorText.Group,
                                                    AddClassSkillIfHasFeature.Create(skill1, classSkillFeat),
                                                    AddClassSkillIfHasFeature.Create(skill2, classSkillFeat));

            mystery.Classes = oracleArray;

            var spells = Bloodlines.CreateSpellProgression(mystery, new String[] {
                "91da41b9793a4624797921f221db653c", // color spray
                Spells.hypnoticPatternId,
                "bf0accce250381a44b857d4af6c8e10d", // searing light (should be: daylight)
                "4b8265132f9c8174f87ce7fa6d0fe47b", // rainbow pattern
                FlySpells.overlandFlight.AssetGuid,
                "645558d63604747428d55f0dd3a4cb58", // chain lightning
                "b22fd434bdb60fb4ba1068206402c4cf", // prismatic spray
                "e96424f70ff884947b06f41a765b7658", // sunburst
                FireSpells.meteorSwarm.AssetGuid,
            });

            var revelations = new List <BlueprintFeature>()
            {
                // TODO
            };
            var description = new StringBuilder(mystery.Description).AppendLine();

            description.AppendLine("An oracle with the flame mystery can choose from any of the following revelations:");
            foreach (var r in revelations)
            {
                description.AppendLine($"• {r.Name}");
                r.InsertComponent(0, Helpers.PrerequisiteFeature(mystery));
            }
            mystery.SetDescription(description.ToString());

            var entries = new List <LevelEntry>();

            for (int level = 1; level <= 9; level++)
            {
                entries.Add(Helpers.LevelEntry(level * 2, spells[level - 1]));
            }
            // TODO:
            //var finalRevelation = CreateFinalRevelation();
            //entries.Add(Helpers.LevelEntry(20, finalRevelation));

            mystery.LevelEntries = entries.ToArray();
            mystery.UIGroups     = Helpers.CreateUIGroups(new List <BlueprintFeatureBase>(spells) /*TODO:finalRevelation*/ }
        // 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);
        }
Exemple #4
0
        internal static (BlueprintFeature, BlueprintFeature) Create(String mysteryDescription, BlueprintFeature classSkillFeat)
        {
            var revelations = new List <BlueprintFeature>()
            {
                CreateChannel(),
                CreateCombatHealer(),
                CreateDelayAffliction(),
                CreateEnergyBody(),
                CreateEnhancedCures(),
                CreateHealingHands(),
                CreateLifeLink(),
                CreateLifeSense(),
                CreateSafeCuring(),
                CreateSpiritBoost()
            };

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

            description.AppendLine(string.Format(RES.LifeMysteryProgressionDescription_info, UIUtility.GetStatText(skill1), UIUtility.GetStatText(skill2)));
            foreach (var r in revelations)
            {
                description.AppendLine(string.Format(RES.SingleLineDescription_info, r.Name));
            }

            var mystery = Helpers.CreateProgression("MysteryLifeProgression", RES.LifeMysteryProgressionName_info, description.ToString(),
                                                    "a2c3c801deb84bc9bab6bd35e5290d5d",
                                                    Helpers.GetIcon("d5847cad0b0e54c4d82d6c59a3cda6b0"), // channel energy // a79013ff4bcd4864cb669622a29ddafb
                                                    UpdateLevelUpDeterminatorText.Group,
                                                    AddClassSkillIfHasFeature.Create(skill1, classSkillFeat),
                                                    AddClassSkillIfHasFeature.Create(skill2, classSkillFeat));

            mystery.Classes = oracleArray;

            var spells = Bloodlines.CreateSpellProgression(mystery, new String[] {
                "f6f95242abdfac346befd6f4f6222140", // remove sickness (should be: detect undead)
                "e84fc922ccf952943b5240293669b171", // lesser restoration
                "e7240516af4241b42b2cd819929ea9da", // neutralize poison
                "f2115ac1148256b4ba20788f7e966830", // restoration
                "d5847cad0b0e54c4d82d6c59a3cda6b0", // breath of life
                "5da172c4c89f9eb4cbb614f3a67357d3", // heal
                "fafd77c6bfa85c04ba31fdc1c962c914", // greater restoration
                "867524328b54f25488d371214eea0d90", // mass heal
                //FireSpells.meteorSwarm.AssetGuid, // if miracle does not work (should be: true resurrection)
                //Spells.MassResurrectionId,          // true rez
                //"bd623ae7179a4d19a40b977ffca1b84g" //true rez
                WishSpells.miracle.AssetGuid, // miracle (should be: true resurrection)
            });

            var entries = new List <LevelEntry>();

            for (int level = 1; level <= 9; level++)
            {
                entries.Add(Helpers.LevelEntry(level * 2, spells[level - 1]));
            }
            var finalRevelation = CreateFinalRevelation();

            entries.Add(Helpers.LevelEntry(20, finalRevelation));

            mystery.LevelEntries = entries.ToArray();
            mystery.UIGroups     = Helpers.CreateUIGroups(new List <BlueprintFeatureBase>(spells)
            {
                finalRevelation
            });

            var revelation = Helpers.CreateFeatureSelection("MysteryLifeRevelation", RES.LifeRevelationFeatureName_info,
                                                            mystery.Description, "6949da6445394dabbfb327c000706122", null, FeatureGroup.None,
                                                            mystery.PrerequisiteFeature());

            revelation.Mode = SelectionMode.OnlyNew;
            revelation.SetFeatures(revelations);
            return(mystery, revelation);
        }
        internal static (BlueprintFeature, BlueprintFeature) Create(String mysteryDescription, BlueprintFeature classSkillFeat)
        {
            var skill1  = StatType.SkillPerception;
            var skill2  = StatType.SkillKnowledgeArcana;
            var mystery = Helpers.CreateFeatureSelection("MysteryDragonSelection", "Dragon Mystery", $"{mysteryDescription}\n" +
                                                         "Oracles who draw their power from the mysterious and primal might of dragons are usually solitary folk. They are deep thinkers and often quick of wit, but prideful and equally quick-tempered.\n" +
                                                         "Upon selecting this mystery, the oracle must select an energy type (acid, cold, electricity, or fire) to be her associated element, which impacts several revelations.\n" +
                                                         $"Class skills: {UIUtility.GetStatText(skill1)}, {UIUtility.GetStatText(skill2)}",
                                                         "aec53bfbee334a0e93b90a283d4e308d",
                                                         Helpers.GetIcon("da48f9d7f697ae44ca891bfc50727988"), // Blood of Dragons selection
                                                         UpdateLevelUpDeterminatorText.Group);

            var classSkills = new BlueprintComponent[] {
                AddClassSkillIfHasFeature.Create(skill1, classSkillFeat),
                AddClassSkillIfHasFeature.Create(skill2, classSkillFeat)
            };

            BlueprintProgression acid, cold, electric, fire;

            mystery.SetFeatures(
                acid     = CreateMysteryForEnergy(mystery, classSkills, DamageEnergyType.Acid, SpellDescriptor.Acid, "8e339ab3898fdd14b879753eaaae933d", "3d77ee3fc4913c44b9df7c5bbcdc4906"),               // copper dragon acid breath, protection from acid
                cold     = CreateMysteryForEnergy(mystery, classSkills, DamageEnergyType.Cold, SpellDescriptor.Cold, "cd36514cf1f38f84a977a265cec113ae", "021d39c8e0eec384ba69140f4875e166"),               // silver dragon cold breath, protection from cold
                electric = CreateMysteryForEnergy(mystery, classSkills, DamageEnergyType.Electricity, SpellDescriptor.Electricity, "f97e345b9f474764fae2b7eff1c1a1c7", "e24ce0c3e8eaaaf498d3656b534093df"), // bronze dragon elecric breath, protection from electric
                fire     = CreateMysteryForEnergy(mystery, classSkills, DamageEnergyType.Fire, SpellDescriptor.Fire, "2a711cd134b91d34ab027b50d721778b", "3f9605134d34e1243b096e1f6cb4c148"));              // gold dragon fire breath, protection from fire

            var energyFeats = mystery.Features;
            var revelations = new List <BlueprintFeature> {
                CreateBreathWeapon(energyFeats),
                CreateDragonMagic(),
                CreateDragonSenses(),
                CreateFormOfTheDragon(),
                CreatePresenceOfDragons(),
                CreateScaledToughness(),
                CreateTailSwipe(),
                CreateWingsOfTheDragon(),
            };
            var description = new StringBuilder(mystery.Description).AppendLine();

            description.AppendLine("An oracle with the dragon mystery can choose from any of the following revelations:");
            foreach (var r in revelations)
            {
                description.AppendLine($"• {r.Name}");
            }
            revelations.AddRange(new BlueprintFeature[] {
                CreateDragonResistanceToEnergy(acid, DamageEnergyType.Acid, "fedc77de9b7aad54ebcc43b4daf8decd"),            // resist acid
                CreateDragonResistanceToEnergy(cold, DamageEnergyType.Cold, "5368cecec375e1845ae07f48cdc09dd1"),            // resist cold
                CreateDragonResistanceToEnergy(electric, DamageEnergyType.Electricity, "90987584f54ab7a459c56c2d2f22cee2"), // resist electric
                CreateDragonResistanceToEnergy(fire, DamageEnergyType.Fire, "ddfb4ac970225f34dbff98a10a4a8844"),            // resist fire
                CreateTalonsOfTheDragon(acid, DamageEnergyType.Acid, "b522759a265897b4f8f7a1a180a692e4"),                   // acid (copper)
                CreateTalonsOfTheDragon(cold, DamageEnergyType.Cold, "c7d2f393e6574874bb3fc728a69cc73a"),                   // cold (silver)
                CreateTalonsOfTheDragon(electric, DamageEnergyType.Electricity, "7e0f57d8d00464441974e303b84238ac"),        // electricity (bronze)
                CreateTalonsOfTheDragon(fire, DamageEnergyType.Fire, "6c67ef823db8d7d45bb0ef82f959743d"),                   // fire (gold)
            });
            description.AppendLine($"• Draconic Resistances");
            description.AppendLine($"• Talons of the Dragon");
            var descriptionStr = description.ToString();

            mystery.SetDescription(descriptionStr);
            foreach (var choice in mystery.Features)
            {
                choice.SetDescription(descriptionStr);
            }
            var revelation = Helpers.CreateFeatureSelection("MysteryDragonRevelation", "Dragon Revelation",
                                                            mystery.Description, "b5bff56fe6cc4ca192df65f5ced050c9", null, FeatureGroup.None,
                                                            mystery.PrerequisiteFeature());

            revelation.Mode = SelectionMode.OnlyNew;
            revelations.Add(UndoSelection.Feature.Value);
            revelation.SetFeatures(revelations);
            return(mystery, revelation);
        }
        internal static (BlueprintFeature, BlueprintFeature) Create(String mysteryDescription, BlueprintFeature classSkillFeat)
        {
            // Note: Gaze of Flames removed, as it wouldn't do anything in PF:K
            var revelations = new List <BlueprintFeature>()
            {
                CreateBurningMagic(),
                CreateFirestorm(),
                CreateCinderDance(),
                CreateHeatAura(),
                CreateFireBreath(),
                CreateFormOfFlame(),
                CreateMoltenSkin(),
                CreateTouchOfFlame(),
                CreateWingsOfFire()
            };

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

            description.AppendLine(String.Format(RES.MysteryFlameDescription_info, UIUtility.GetStatText(skill1), UIUtility.GetStatText(skill2)));
            foreach (var r in revelations)
            {
                description.AppendLine($"• {r.Name}");
            }

            var mystery = Helpers.CreateProgression("MysteryFlameProgression", RES.MysteryFlameName_info, description.ToString(),
                                                    "11205333c1be4c6f868e413633fc7557",
                                                    Helpers.GetIcon("17cc794d47408bc4986c55265475c06f"), // Fire elemental bloodline
                                                    UpdateLevelUpDeterminatorText.Group,
                                                    AddClassSkillIfHasFeature.Create(skill1, classSkillFeat),
                                                    AddClassSkillIfHasFeature.Create(skill2, classSkillFeat));

            mystery.Classes = oracleArray;

            var spells = Bloodlines.CreateSpellProgression(mystery, new String[] {
                "4783c3709a74a794dbe7c8e7e0b1b038", // burning hands
                "21ffef7791ce73f468b6fca4d9371e8b", // resist energy
                "2d81362af43aeac4387a3d4fced489c3", // fireball
                FireSpells.wallOfFire.AssetGuid,    // wall of fire
                "ebade19998e1f8542a1b55bd4da766b3", // fire snake (should be: summon elemental, moved to 6th level)
                "4814f8645d1d77447a70479c0be51c72", // summon elemental huge fire (should be: fire seeds)
                "e3d0dfe1c8527934294f241e0ae96a8d", // fire storm
                FireSpells.incendiaryCloud.AssetGuid,
                "08ccad78cac525040919d51963f9ac39", // fiery body
            });

            var entries = new List <LevelEntry>();

            for (int level = 1; level <= 9; level++)
            {
                entries.Add(Helpers.LevelEntry(level * 2, spells[level - 1]));
            }
            var finalRevelation = CreateFinalRevelation();

            entries.Add(Helpers.LevelEntry(20, finalRevelation));

            mystery.LevelEntries = entries.ToArray();
            mystery.UIGroups     = Helpers.CreateUIGroups(new List <BlueprintFeatureBase>(spells)
            {
                finalRevelation
            });

            var revelation = Helpers.CreateFeatureSelection("MysteryFlameRevelation", RES.MysteryFlameRevelationName_info,
                                                            mystery.Description, "40db1e0f9b3a4f5fb9fde0801b158216", null, FeatureGroup.None,
                                                            mystery.PrerequisiteFeature());

            revelation.Mode = SelectionMode.OnlyNew;
            revelation.SetFeatures(revelations);
            return(mystery, revelation);
        }
        internal static (BlueprintFeature, BlueprintFeature) Create(String mysteryDescription, BlueprintFeature classSkillFeat)
        {
            var skill1  = StatType.SkillPerception;
            var skill2  = StatType.SkillKnowledgeArcana;
            var mystery = Helpers.CreateFeatureSelection("MysteryDragonSelection", "巨龙秘视域", $"{mysteryDescription}\n" +
                                                         "追寻着巨龙的神秘并从那原始的魔力中汲取力量的先知们常常在这条道路上踽踽独行。他们往往深思熟虑,聪明骄傲。但与此同时,巨龙们的暴躁个性也渗透进了他们的灵魂中。\n" +
                                                         "在选择这个启示时,先知们必须选择一种能量类型 (酸,冷,电或者火) 作为他的专注元素。这会影响几个他所获得的启示。\n" +
                                                         $"本职技能: {UIUtility.GetStatText(skill1)}, {UIUtility.GetStatText(skill2)}",
                                                         "aec53bfbee334a0e93b90a283d4e308d",
                                                         Helpers.GetIcon("da48f9d7f697ae44ca891bfc50727988"), // Blood of Dragons selection
                                                         UpdateLevelUpDeterminatorText.Group);

            var classSkills = new BlueprintComponent[] {
                AddClassSkillIfHasFeature.Create(skill1, classSkillFeat),
                AddClassSkillIfHasFeature.Create(skill2, classSkillFeat)
            };

            BlueprintProgression acid, cold, electric, fire;

            mystery.SetFeatures(
                acid     = CreateMysteryForEnergy(mystery, classSkills, DamageEnergyType.Acid, SpellDescriptor.Acid, "8e339ab3898fdd14b879753eaaae933d", "3d77ee3fc4913c44b9df7c5bbcdc4906"),               // copper dragon acid breath, protection from acid
                cold     = CreateMysteryForEnergy(mystery, classSkills, DamageEnergyType.Cold, SpellDescriptor.Cold, "cd36514cf1f38f84a977a265cec113ae", "021d39c8e0eec384ba69140f4875e166"),               // silver dragon cold breath, protection from cold
                electric = CreateMysteryForEnergy(mystery, classSkills, DamageEnergyType.Electricity, SpellDescriptor.Electricity, "f97e345b9f474764fae2b7eff1c1a1c7", "e24ce0c3e8eaaaf498d3656b534093df"), // bronze dragon elecric breath, protection from electric
                fire     = CreateMysteryForEnergy(mystery, classSkills, DamageEnergyType.Fire, SpellDescriptor.Fire, "2a711cd134b91d34ab027b50d721778b", "3f9605134d34e1243b096e1f6cb4c148"));              // gold dragon fire breath, protection from fire

            var energyFeats = mystery.Features;
            var revelations = new List <BlueprintFeature> {
                CreateBreathWeapon(energyFeats),
                CreateDragonMagic(),
                CreateDragonSenses(),
                CreateFormOfTheDragon(),
                CreatePresenceOfDragons(),
                CreateScaledToughness(),
                CreateTailSwipe(),
                CreateWingsOfTheDragon(),
            };
            var description = new StringBuilder(mystery.Description).AppendLine();

            description.AppendLine("选择了巨龙秘视域的先知可以选择以下启示:");
            foreach (var r in revelations)
            {
                description.AppendLine($"• {r.Name}");
            }
            revelations.AddRange(new BlueprintFeature[] {
                CreateDragonResistanceToEnergy(acid, DamageEnergyType.Acid, "fedc77de9b7aad54ebcc43b4daf8decd"),            // resist acid
                CreateDragonResistanceToEnergy(cold, DamageEnergyType.Cold, "5368cecec375e1845ae07f48cdc09dd1"),            // resist cold
                CreateDragonResistanceToEnergy(electric, DamageEnergyType.Electricity, "90987584f54ab7a459c56c2d2f22cee2"), // resist electric
                CreateDragonResistanceToEnergy(fire, DamageEnergyType.Fire, "ddfb4ac970225f34dbff98a10a4a8844"),            // resist fire
                CreateTalonsOfTheDragon(acid, DamageEnergyType.Acid, "b522759a265897b4f8f7a1a180a692e4"),                   // acid (copper)
                CreateTalonsOfTheDragon(cold, DamageEnergyType.Cold, "c7d2f393e6574874bb3fc728a69cc73a"),                   // cold (silver)
                CreateTalonsOfTheDragon(electric, DamageEnergyType.Electricity, "7e0f57d8d00464441974e303b84238ac"),        // electricity (bronze)
                CreateTalonsOfTheDragon(fire, DamageEnergyType.Fire, "6c67ef823db8d7d45bb0ef82f959743d"),                   // fire (gold)
            });
            description.AppendLine($"• Draconic Resistances");
            description.AppendLine($"• Talons of the Dragon");
            var descriptionStr = description.ToString();

            mystery.SetDescription(descriptionStr);
            foreach (var choice in mystery.Features)
            {
                choice.SetDescription(descriptionStr);
            }
            var revelation = Helpers.CreateFeatureSelection("MysteryDragonRevelation", "巨龙启示",
                                                            mystery.Description, "b5bff56fe6cc4ca192df65f5ced050c9", null, FeatureGroup.None,
                                                            mystery.PrerequisiteFeature());

            revelation.Mode = SelectionMode.OnlyNew;
            revelations.Add(UndoSelection.Feature.Value);
            revelation.SetFeatures(revelations);
            return(mystery, revelation);
        }
        internal static (BlueprintFeature, BlueprintFeature) Create(String mysteryDescription, BlueprintFeature classSkillFeat)
        {
            var skill1 = StatType.SkillPerception;
            var skill2 = StatType.SkillMobility;

            var revelations = new List <BlueprintFeature> {
                CreateBattlecry(),
                CreateBattlefieldClarity(),
                CreateCombatHealer(),
                CreateIronSkin(),
                CreateManeuverMastery(),
                CreateResiliency(),
                CreateSkillAtArms(),
                CreateSurprisingCharge(),
                CreateWarSight(),
                CreateWeaponMastery(),
            };
            var description = new StringBuilder(mysteryDescription);

            description.AppendLine(
                $"\nClass skills: {UIUtility.GetStatText(skill1)}, {UIUtility.GetStatText(skill2)}\n" +
                "An oracle with the battle mystery can choose from any of the following revelations:");
            foreach (var r in revelations)
            {
                description.AppendLine($"• {r.Name}");
            }
            var mystery = Helpers.CreateProgression("MysteryBattleProgression", "Battle Mystery", description.ToString(),
                                                    "4c1f09f08d984c05993c552a27a04b12",
                                                    Helpers.GetIcon("27203d62eb3d4184c9aced94f22e1806"), // Transformation spell
                                                    UpdateLevelUpDeterminatorText.Group,
                                                    AddClassSkillIfHasFeature.Create(skill1, classSkillFeat),
                                                    AddClassSkillIfHasFeature.Create(skill2, classSkillFeat));

            mystery.Classes = oracleArray;

            var spells = Bloodlines.CreateSpellProgression(mystery, new String[] {
                "c60969e7f264e6d4b84a1499fdcf9039", // enlarge person
                "5181c2ed0190fc34b8a1162783af5bf4", // stone call (should be: fog cloud)
                "2d4263d80f5136b4296d6eb43a221d7d", // magic vestment
                FireSpells.wallOfFire.AssetGuid,    // wall of fire
                "90810e5cf53bf854293cbd5ea1066252", // righteous might
                "6a234c6dcde7ae94e94e9c36fd1163a7", // mass bull's strength
                "8eb769e3b583f594faabe1cfdb0bb696", // summon elemental, greater (should be: control weather)
                "7cfbefe0931257344b2cb7ddc4cdff6f", // stormbolts (should be: earthquake)
                "ba48abb52b142164eba309fd09898856", // polar midnight (should be: storm of vengeance)
            });

            var entries = new List <LevelEntry>();

            for (int level = 1; level <= 9; level++)
            {
                entries.Add(Helpers.LevelEntry(level * 2, spells[level - 1]));
            }
            entries.Add(Helpers.LevelEntry(20, CreateFinalRevelation()));

            mystery.LevelEntries = entries.ToArray();
            mystery.UIGroups     = Helpers.CreateUIGroups(new List <BlueprintFeatureBase>(spells)
            {
                finalRevelation
            });

            var revelation = Helpers.CreateFeatureSelection("MysteryBattleRevelation", "Battle Revelation",
                                                            mystery.Description, "3c553e119a484a179e70b0aada836283", null, FeatureGroup.None,
                                                            mystery.PrerequisiteFeature());

            revelation.Mode = SelectionMode.OnlyNew;
            revelations.Add(UndoSelection.Feature.Value);
            revelation.SetFeatures(revelations);
            return(mystery, revelation);
        }