static void LoadFavoredPrestigeClass()
        {
            alertnessFeat = library.Get <BlueprintFeature>("1c04fe9a13a22bc499ffac03e6f79153");

            var noFeature = Helpers.Create <PrerequisiteNoFeature>();

            favoredPrestigeClass = Helpers.CreateFeatureSelection(
                "FavoredPresitgeClassSelection",
                "天赋进阶职业",
                "你对某个进阶职业产生了偏好,这可能是因为你对它有着更强的认同,比其他单一职业者经受了更多的训练或者是单纯擅长做这个职业。无论原因为何,进阶职业给你带来了一些额外好处,就和天赋基础职业一样。\n" +
                "你可以在获取进阶职业前选择此专长,但在你在此进阶中至少提升1级前,你不会获得此专长的任何好处。",
                "4fab2e6256e644daaa637093bc2421aa",
                Helpers.skillFocusFeat.Icon,
                FeatureGroup.Feat,
                noFeature,
                Helpers.Create <LevelUpRecommendation>(l =>
            {
                // Mark this feat recommended if a prestige class is taken.
                l.ClassPriorities = new ClassesPriority[] {
                    new ClassesPriority()
                    {
                        Classes  = Helpers.prestigeClasses.ToArray(),
                        Priority = RecommendationPriority.Good
                    }
                };
            }));
            // Note: feat order should match Helpers.prestigeClasses so Prestigious Spellcaster can index into this.
            favoredPrestigeClass.SetFeatures(Helpers.prestigeClasses.Select(CreateFavoredPrestigeClass));
            noFeature.Feature = favoredPrestigeClass;

            library.AddFeats(favoredPrestigeClass);
        }
        static void createSpellBlending()
        {
            var icon = library.Get <BlueprintFeature>("55edf82380a1c8540af6c6037d34f322").Icon;

            spell_blending = Helpers.CreateFeatureSelection("SpellBlendingFeature",
                                                            "Spell Blending",
                                                            "When a magus selects this arcana, he must select one spell from the wizard spell list that is of a magus spell level he can cast. He adds this spell to his spellbook and list of magus spells known as a magus spell of its wizard spell level.\n"
                                                            + "Special: A magus can select this magus arcana more than once.",
                                                            "",
                                                            icon,
                                                            FeatureGroup.None);

            var wizard_spell_list = library.Get <BlueprintSpellList>("ba0401fdeb4062f40a7aa95b6f07fe89");

            for (int i = 1; i <= 6; i++)
            {
                var learn_spell = library.CopyAndAdd <BlueprintParametrizedFeature>("bcd757ac2aeef3c49b77e5af4e510956", $"SpellBlending{i}ParametrizedFeature", "");
                learn_spell.SpellLevel         = i;
                learn_spell.SpecificSpellLevel = true;
                learn_spell.SpellLevelPenalty  = 0;
                learn_spell.SpellcasterClass   = magus;
                learn_spell.SpellList          = wizard_spell_list;
                learn_spell.ReplaceComponent <LearnSpellParametrized>(l => { l.SpellList = wizard_spell_list; l.SpecificSpellLevel = true; l.SpellLevel = i; l.SpellcasterClass = magus; });
                learn_spell.AddComponents(Helpers.Create <PrerequisiteClassSpellLevel>(p => { p.CharacterClass = magus; p.RequiredSpellLevel = i; })
                                          );
                learn_spell.SetName(Helpers.CreateString($"SpellBlending{i}ParametrizedFeature.Name", "Spell Blending " + $"(level {i})"));
                learn_spell.SetDescription(spell_blending.Description);
                learn_spell.SetIcon(spell_blending.Icon);

                spell_blending.AllFeatures = spell_blending.AllFeatures.AddToArray(learn_spell);
            }

            magus_arcana.AllFeatures          = magus_arcana.AllFeatures.AddToArray(spell_blending);
            eldritch_magus_arcana.AllFeatures = eldritch_magus_arcana.AllFeatures.AddToArray(spell_blending);
        }
Beispiel #3
0
 public static void AddSelection(this BlueprintFeatureSelection feat, LevelUpState state, UnitDescriptor unit, int level)
 {
     // TODO: we may want to add the selection feat to the unit.
     // (But I don't think Respec mod will be able to clear it out if we do that.)
     // unit.AddFact(feat);
     state.AddSelection(null, feat, feat, level);
 }
        static void createMasterArcher()
        {
            var point_blank_shot = library.Get <BlueprintFeature>("0da0c194d6e1d43419eb8d990b28e0ab");
            var rapid_shot       = library.Get <BlueprintFeature>("9c928dc570bb9e54a9649b3ebfe47a41");
            //deadeye's blessing

            var improved_precise_shot = library.Get <BlueprintFeature>("46f970a6b9b5d2346b10892673fe6e74");
            var manyshot          = library.Get <BlueprintFeature>("adf54af2a681792489826f7fd1b62889");
            var pointblank_master = library.Get <BlueprintParametrizedFeature>("05a3b543b0a0a0346a5061e90f293f0b");

            var deadly_aim = library.Get <BlueprintFeature>("f47df34d53f8c904f9981a3ee8e84892");

            master_archer1 = Helpers.CreateFeatureSelection("HinterlanderMasterArcher1Feature",
                                                            "Master Archer",
                                                            "At 1st level, and again at 3rd, 5th and 10th levels, a hinterlander gains a bonus feat from the following list, even if he doesn’t meet the prerequisites: Deadeye’s Blessing, Point-Blank Shot, and Rapid Shot. At 3rd level, he adds Improved Precise Shot, Point Blank Master, and Manyshot to the list. At 5th level, he adds Deadly Aim to the list.",
                                                            "",
                                                            null,
                                                            FeatureGroup.None);
            master_archer1.IgnorePrerequisites = true;
            master_archer1.AllFeatures         = new BlueprintFeature[] { point_blank_shot, rapid_shot, NewFeats.deadeyes_blessing };

            master_archer2             = library.CopyAndAdd <BlueprintFeatureSelection>(master_archer1.AssetGuid, "HinterlanderMasterArcher2Feature", "");
            master_archer2.AllFeatures = master_archer2.AllFeatures.AddToArray(improved_precise_shot, manyshot, pointblank_master);

            master_archer3             = library.CopyAndAdd <BlueprintFeatureSelection>(master_archer2.AssetGuid, "HinterlanderMasterArcher3Feature", "");
            master_archer3.AllFeatures = master_archer3.AllFeatures.AddToArray(deadly_aim);
        }
Beispiel #5
0
        internal static List <BlueprintFeature> FillTripleSpellSelection(BlueprintFeatureSelection selection, int minLevel, int maxLevel, BlueprintSpellList spellList, Func <int, BlueprintComponent[]> createComponents, BlueprintCharacterClass learnSpellClass = null)
        {
            var choices = new List <BlueprintFeature>();

            //var choicelist = new List<BlueprintFeature>();
            string[] GuidList = new string[]
            {
                null,
                "3921FC7C8617472CAB3F86835D95FE62",
                "E8828D65304F4AE5AB8094F9893A0CCC",
                //"C77D3987222B4609A609A117BCF2E28D"
            };
            //foreach(string thirdGuid in GuidList) {
            for (int level = minLevel; level <= maxLevel; level++)
            {
                var spellArrayAll = Helpers.Create <SelectAnySpellAtLevel>();

                var spellChoice = Helpers.CreateParamSelection <SelectAnySpellAtLevel>(
                    $"{selection.name}Level{level}",
                    $"{selection.Name} (Spell Level {level})",
                    selection.Description,
                    Helpers.MergeIds(selection.AssetGuid, FavoredClassBonus.spellLevelGuids[level - 1], GuidList[2]),
                    null,
                    FeatureGroup.None,
                    createComponents(level));
                spellChoice.SpellList        = spellList;
                spellChoice.SpellLevel       = level;
                spellChoice.SpellcasterClass = learnSpellClass;
                spellChoice.CheckNotKnown    = learnSpellClass != null;
                choices.Add(spellChoice);
            }
            choices.Add(UndoSelection.Feature.Value);
            return(choices);
        }
Beispiel #6
0
        static void createSecretsOfTheGrave()
        {
            var bloodline_undead_arcana = library.Get <BlueprintFeature>("1a5e7191279e7cd479b17a6ca438498c");

            var wizard     = library.Get <BlueprintCharacterClass>("ba34257984f4c41408ce1dc2004e342e");
            var bard       = archetype.GetParentClass();
            var spell_list = Common.combineSpellLists("DirgeBardBonusNecromancySpellsList", bard.Spellbook.SpellList, Witch.witch_class.Spellbook.SpellList, wizard.Spellbook.SpellList);

            Common.filterSpellList(spell_list, s => s.School == SpellSchool.Necromancy);

            var spell_selection = library.CopyAndAdd <BlueprintParametrizedFeature>("4a2e8388c2f0dd3478811d9c947bebfb", "DirgeBardExtraNecromancySpell", "");

            spell_selection.SetNameDescriptionIcon("Secrets of the Grave",
                                                   "At 2nd level, a dirge bard gains a bonus equal to half his bard level on Knowledge (religion) checks made to identify undead creatures and their abilities. A dirge bard may use mind-affecting spells to affect undead as if they were living creatures, even if they are mindless. In addition, he may add one necromancy spell from the spell list of any arcane spellcasting class to his list of spells known at 2nd level and every four levels thereafter.",
                                                   Helpers.GetIcon("a9bb3dcb2e8d44a49ac36c393c114bd9")
                                                   );

            spell_selection.ComponentsArray            = new BlueprintComponent[] { Helpers.CreateLearnSpell(spell_list, archetype.GetParentClass()) };
            spell_selection.BlueprintParameterVariants = Common.getSpellsFromSpellList(spell_list);
            spell_selection.SpellList        = spell_list;
            spell_selection.SpellcasterClass = archetype.GetParentClass();

            secrets_of_the_grave = Common.featureToSelection(spell_selection);
            secrets_of_the_grave.AddComponent(Helpers.CreateAddFact(bloodline_undead_arcana));
        }
Beispiel #7
0
        static void createMartialPerformance()
        {
            var bard_class = library.Get <BlueprintCharacterClass>("772c83a25e2268e448e841dcd548235f");
            var fighter    = library.Get <BlueprintCharacterClass>("48ac8db94d5de7645906c7d0ad3bcfbd");

            martial_performance = Helpers.CreateFeatureSelection("MartialPerformanceFeatureSelection",
                                                                 "Martial Performance",
                                                                 "The bard or skald selects a weapon she is proficient with. She receives a weapon focus with associated weapon category and treats her bard or skald level as half fighter level for the purpose of qualifying for combat feats.",
                                                                 "",
                                                                 library.Get <BlueprintParametrizedFeature>("1e1f627d26ad36f43bbd26cc2bf8ac7e").Icon,
                                                                 FeatureGroup.None,
                                                                 Common.createClassLevelsForPrerequisites(fighter, bard_class, 0.5),
                                                                 Common.createClassLevelsForPrerequisites(fighter, Skald.skald_class, 0.5),
                                                                 Helpers.PrerequisiteClassLevel(bard_class, 6, any: true),
                                                                 Helpers.PrerequisiteClassLevel(Skald.skald_class, 6, any: true)
                                                                 );



            foreach (var category in Enum.GetValues(typeof(WeaponCategory)).Cast <WeaponCategory>())
            {
                var feature = Helpers.CreateFeature(category.ToString() + "MartialPerformanceFeature",
                                                    martial_performance.Name + $" ({LocalizedTexts.Instance.Stats.GetText(category)})",
                                                    martial_performance.Description,
                                                    "",
                                                    martial_performance.Icon,
                                                    FeatureGroup.None,
                                                    Common.createAddParametrizedFeatures(library.Get <BlueprintParametrizedFeature>("1e1f627d26ad36f43bbd26cc2bf8ac7e"), category),
                                                    Helpers.Create <PrerequisiteProficiency>(p => p.WeaponProficiencies = new WeaponCategory[] { category })
                                                    );
                martial_performance.AllFeatures = martial_performance.AllFeatures.AddToArray(feature);
            }
        }
Beispiel #8
0
        static internal void fixAnimalGrowth()
        {
            //fix animal growth to increase size on upgraded animal companions
            var animal_growth       = library.Get <BlueprintAbility>("56923211d2ac95e43b8ac5031bab74d8");
            var animal_growth_buff  = library.Get <BlueprintBuff>("3fca5d38053677044a7ffd9a872d3a0a");
            var animal_growth_buff2 = library.CopyAndAdd(animal_growth_buff, "AnimalGrowth2Buff", "");

            animal_growth_buff2.ReplaceComponent <ChangeUnitSize>(c => c.SizeDelta = 2);

            BlueprintFeatureSelection animal_companion_selection = library.Get <BlueprintFeatureSelection>("2ecd6c64683b59944a7fe544033bb533"); //select ac from domain

            List <BlueprintFeature> upgrade_features = new List <BlueprintFeature>();

            foreach (var ac in animal_companion_selection.AllFeatures)
            {
                var upgrade_feature = ac.GetComponent <AddPet>()?.UpgradeFeature;

                if (upgrade_feature != null)
                {
                    upgrade_features.Add(upgrade_feature);
                }
            }

            var animal_growth_run_action = animal_growth.GetComponent <AbilityEffectRunAction>();
            var apply_buff_action        = animal_growth_run_action.Actions.Actions[0] as ContextActionApplyBuff;
            var apply_buff2_action       = apply_buff_action.CreateCopy();

            apply_buff2_action.Buff = animal_growth_buff2;

            var new_run_action = Helpers.CreateConditional(Common.createContextConditionHasFacts(false, upgrade_features.ToArray()),
                                                           apply_buff2_action,
                                                           apply_buff_action);

            animal_growth_run_action.Actions = Helpers.CreateActionList(new_run_action);
        }
            public Spirit(string name, string display_name, string description, UnityEngine.Sprite icon, string guid,
                          BlueprintFeature spirit_ability, BlueprintFeature greater_spirit_ability, BlueprintFeature manifestation, BlueprintFeature[] hexes)
            {
                var entries = new LevelEntry[] { Helpers.LevelEntry(1, spirit_ability),
                                                 Helpers.LevelEntry(8, greater_spirit_ability),
                                                 Helpers.LevelEntry(20, manifestation) };


                progression = Helpers.CreateProgression(name + "SpiritWhispererProgression",
                                                        display_name + " Spirit",
                                                        description,
                                                        "",
                                                        icon,
                                                        FeatureGroup.None
                                                        );
                progression.LevelEntries = entries.ToArray();
                progression.UIGroups     = Helpers.CreateUIGroups(spirit_ability, greater_spirit_ability, manifestation);

                this.hex_selection = Helpers.CreateFeatureSelection(name + "SpiritWhispirerSpiritHexSelection",
                                                                    display_name + " Spirit Hex",
                                                                    $"You can select one of the hexes granted by {display_name} spirit.",
                                                                    "",
                                                                    icon,
                                                                    FeatureGroup.None,
                                                                    Helpers.PrerequisiteFeature(progression)
                                                                    );
                this.hex_selection.AllFeatures = hexes;
                progression.Classes            = new BlueprintCharacterClass[] { archetype.GetParentClass() };
            }
Beispiel #10
0
        static void createExtraClassSkill()
        {
            var skill_foci = library.Get <BlueprintFeatureSelection>("c9629ef9eebb88b479b2fbc5e836656a").AllFeatures;

            BlueprintFeature[] skills = new BlueprintFeature[skill_foci.Length];
            for (int i = 0; i < skill_foci.Length; i++)
            {
                StatType stat = skill_foci[i].GetComponent <AddContextStatBonus>().Stat;
                string   name = LocalizedTexts.Instance.Stats.GetText(stat);

                skills[i] = Helpers.CreateFeature(stat.ToString() + "ExtraEidolonSkillFeature",
                                                  "Extra Class Skill: " + name,
                                                  "The Eidolon can choose 2 additional skills as its class skills.",
                                                  "",
                                                  skill_foci[i].Icon,
                                                  FeatureGroup.None,
                                                  Helpers.Create <AddClassSkill>(a => a.Skill = stat),
                                                  Helpers.Create <NewMechanics.PrerequisiteNoClassSkill>(p => p.skill = stat)
                                                  );
            }


            extra_class_skills = Helpers.CreateFeatureSelection("EidolonExtraClassSkill",
                                                                "Extra Class Skill",
                                                                skills[0].Description,
                                                                "",
                                                                null,
                                                                FeatureGroup.None);
            extra_class_skills.AllFeatures = skills;
        }
        static BlueprintArchetype CreateAncientLorekeeper(BlueprintFeatureSelection mysteries, BlueprintFeature mysteryClassSkills)
        {
            var lorekeeper = Helpers.Create <BlueprintArchetype>(a =>
            {
                a.name                 = "AncientLorekeeperArchetype";
                a.LocalizedName        = Helpers.CreateString($"{a.name}.Name", "传古学者");
                a.LocalizedDescription = Helpers.CreateString($"{a.name}.Description",
                                                              "传古学者是精灵一族广博知识和信仰的活生生的图书馆。她在年轻时就已对此展现出浓厚的兴趣,并能理解历史、续写传说;而当成年时,她为自己这个长寿种族的久远记忆服务的意愿便已被所有认识她的人所熟知。\n" +
                                                              "传古学者将知识(奥秘)加入她的本职技能列表中。该能力取代来自先知秘示域的额外本职技能。");
            });

            Helpers.SetField(lorekeeper, "m_ParentClass", oracle);
            library.AddAsset(lorekeeper, "df571bf056a941babe0903e94430dc9d");

            lorekeeper.RemoveFeatures = new LevelEntry[] {
                Helpers.LevelEntry(1, mysteryClassSkills),
            };

            var classSkill = Helpers.CreateFeature("AncientLorekeeperClassSkills",
                                                   UIUtility.GetStatText(StatType.SkillKnowledgeArcana),
                                                   "传古学者将知识(奥秘)加入她的本职技能列表中。",
                                                   "a6edf10077d24a95b6d8a701b8fb51d5", null, FeatureGroup.None,
                                                   Helpers.Create <AddClassSkill>(a => a.Skill = StatType.SkillKnowledgeArcana));

            var entries = new List <LevelEntry> {
                Helpers.LevelEntry(1, classSkill),
            };
            var elvenArcana = CreateElvenArcana();

            for (int level = 2; level <= 18; level += 2)
            {
                entries.Add(Helpers.LevelEntry(level, elvenArcana));
            }
            lorekeeper.AddFeatures = entries.ToArray();

            // Enable archetype prerequisites
            var patchDescription = "Archetype prerequisites (such as Ancient Lorekeeper)";

            Main.ApplyPatch(typeof(CharBSelectorLayer_FillData_Patch), patchDescription);
            Main.ApplyPatch(typeof(DescriptionTemplatesLevelup_LevelUpClassPrerequisites_Patch), patchDescription);
            Main.ApplyPatch(typeof(CharacterBuildController_SetRace_Patch), patchDescription);

            lorekeeper.SetComponents(
                Helpers.PrerequisiteFeaturesFromList(Helpers.elf, Helpers.halfElf));

            // Adjust prerequisites for mysteries
            foreach (var mystery in mysteries.AllFeatures)
            {
                if (mystery == TimeMystery.mystery)
                {
                    mystery.AddComponent(Helpers.Create <PrerequisiteArchetypeLevel>(p => { p.Archetype = lorekeeper; p.CharacterClass = oracle; }));
                }
                else
                {
                    mystery.AddComponent(Helpers.Create <PrerequisiteNoArchetype>(p => { p.Archetype = lorekeeper; p.CharacterClass = oracle; }));
                }
            }

            return(lorekeeper);
        }
Beispiel #12
0
        static void createFeats()
        {
            bonus_feat1 = Helpers.CreateFeatureSelection("BonusFeats1ZenArcherFeature",
                                                         "Bonus Feat",
                                                         "A zen archer’s bonus feats must be taken from the following list: Combat Reflexes, Deflect Arrows, Dodge, Point-Blank Shot, Precise Shot, and Rapid Shot.\n"
                                                         + "At 6th level, the following feats are added to the list: Improved Precise Shot, Manyshot and Mobility.\n"
                                                         + "At 10th level, the following feats are added to the list: Improved Critical.\n"
                                                         + "A monk need not have any of the prerequisites normally required for these feats to select them.",
                                                         "",
                                                         null,
                                                         FeatureGroup.None);
            bonus_feat1.IgnorePrerequisites = true;
            bonus_feat1.AllFeatures         = new BlueprintFeature[]
            {
                library.Get <BlueprintFeature>("0f8939ae6f220984e8fb568abbdfba95"), //combat reflexes
                library.Get <BlueprintFeature>("2c61fdbf242866f4e93c3e1477fb96b5"), //deflect arrows
                library.Get <BlueprintFeature>("97e216dbb46ae3c4faef90cf6bbe6fd5"), //dodge
                library.Get <BlueprintFeature>("0da0c194d6e1d43419eb8d990b28e0ab"), //point blank shot
                library.Get <BlueprintFeature>("8f3d1e6b4be006f4d896081f2f889665"), //precise shot
                library.Get <BlueprintFeature>("9c928dc570bb9e54a9649b3ebfe47a41"), //rapid shot
            };

            bonus_feat6             = library.CopyAndAdd(bonus_feat1, "BonusFeat6ZenArcherFeature", "");
            bonus_feat6.AllFeatures = bonus_feat6.AllFeatures.AddToArray(library.Get <BlueprintFeature>("46f970a6b9b5d2346b10892673fe6e74"), //improved precis shot
                                                                         library.Get <BlueprintFeature>("adf54af2a681792489826f7fd1b62889"), //many shot
                                                                         library.Get <BlueprintFeature>("2a6091b97ad940943b46262600eaeaeb")  // mobility
                                                                         );
            bonus_feat10             = library.CopyAndAdd(bonus_feat6, "BonusFeat10ZenArcherFeature", "");
            bonus_feat10.AllFeatures = bonus_feat10.AllFeatures.AddToArray(library.Get <BlueprintFeature>("f4201c85a991369408740c6888362e20") //mproved critical
                                                                           );
        }
Beispiel #13
0
        public static int GetSelectableFeaturesCount(this BlueprintFeatureSelection selection, UnitDescriptor unit)
        {
            int count = 0;
            NoSelectionIfAlreadyHasFeature component = selection.GetComponent <NoSelectionIfAlreadyHasFeature>();

            if ((UnityEngine.Object)component == (UnityEngine.Object)null)
            {
                return(count);
            }
            if (component.AnyFeatureFromSelection)
            {
                foreach (BlueprintFeature allFeature in selection.AllFeatures)
                {
                    if (!unit.Progression.Features.HasFact((BlueprintFact)allFeature))
                    {
                        count++;
                    }
                }
            }
            foreach (BlueprintFeature feature in component.Features)
            {
                if (!unit.Progression.Features.HasFact((BlueprintFact)feature))
                {
                    count++;
                }
            }
            return(count);
        }
Beispiel #14
0
        static void addToSlayerTalentSelection(BlueprintFeature f, bool advanced = false)
        {
            var selections =
                new BlueprintFeatureSelection[]
            {
                library.Get <BlueprintFeatureSelection>("04430ad24988baa4daa0bcd4f1c7d118"),    //slayer talent2
                library.Get <BlueprintFeatureSelection>("43d1b15873e926848be2abf0ea3ad9a8"),    //slayer talent6
                library.Get <BlueprintFeatureSelection>("913b9cf25c9536949b43a2651b7ffb66"),    //slayerTalent10
                Archetypes.SanctifiedSlayer.talented_slayer,
                Archetypes.NatureFang.slayer_talent4,
                Archetypes.NatureFang.slayer_talent6,
                Archetypes.NatureFang.slayer_talent10,
            };

            foreach (var s in selections)
            {
                s.AllFeatures = s.AllFeatures.AddToArray(f);
            }
            var advanced_talents = library.Get <BlueprintFeature>("a33b99f95322d6741af83e9381b2391c");

            if (advanced)
            {
                f.AddComponent(Helpers.PrerequisiteFeature(advanced_talents));
            }
        }
 static void createBloodlineFamiliar()
 {
     bloodline_familiar = library.CopyAndAdd <BlueprintFeatureSelection>("363cab72f77c47745bf3a8807074d183", "BloodlineFamiliarFeatureSelection", "");
     bloodline_familiar.SetNameDescription("Bloodline Familiar", "Those with an inherent connection to magic often attract creatures who feel a similar instinctive pull toward magical forces. At 1st level, a sorcerer, bloodrager or any other class with bloodline powers can choose to gain a bloodline familiar instead of 1st-level bloodline power.");
     bloodline_familiar.Groups          = new FeatureGroup[0];
     bloodline_familiar.ComponentsArray = new BlueprintComponent[0];
 }
Beispiel #16
0
        static private void FixSpecialComps()
        {
            //arcane 9, new arcane selection, wants a variant for blood arcanist
            BlueprintFeatureSelection arcane9_select = library.Get <BlueprintFeatureSelection>("20a2435574bdd7f4e947f405df2b25ce");
            BlueprintFeature          arcane9_scion  = library.Get <BlueprintFeature>("c66e61dea38f3d8479a54eabec20ac99");
            BlueprintFeature          arcane9_ba     = library.CopyAndAdd <BlueprintFeature>(
                arcane9_scion,
                "BloodlineArcaneNewArcanaFeatureArcanist",
                "b0a5863f046005d408d53f05894a6c3a"//MD5-32[ArcanistClass.Archetype.BloodArcanist.Arcane9.Feat]
                );

            arcane9_ba.RemoveComponent(arcane9_ba.GetComponent <LearnSpellParametrized>());
            arcane9_ba.RemoveComponent(arcane9_ba.GetComponent <PrerequisiteArchetypeLevel>());
            arcane9_ba.AddComponent(Helpers.Create <LearnSpellParametrized>(a => {
                a.SpellcasterClass = ArcanistClass.arcanist;
                a.SpellList        = library.Get <BlueprintSpellList>("ba0401fdeb4062f40a7aa95b6f07fe89");//wizard spelllist
            }));
            arcane9_ba.AddComponent(Helpers.Create <PrerequisiteArchetypeLevel>(a => {
                a.Archetype      = archetype;
                a.CharacterClass = ArcanistClass.arcanist;
                a.Level          = 1;
            }));
            HelpersNeu.Add(ref arcane9_select.AllFeatures, arcane9_ba);
            HelpersNeu.Add(ref arcane9_select.Features, arcane9_ba);
        }
Beispiel #17
0
        static void createCredence()
        {
            dervish_dance = Common.featureToFeature(NewFeats.dervish_dance, false);
            dervish_dance.SetDescription("The Dawnflower anchorite gains Dervish Dance as a bonus feat.");
            dervish_dance.AddComponent(Helpers.PrerequisiteNoFeature(NewFeats.dervish_dance));

            extra_invocations = Helpers.CreateFeature("ExtraInvocationsFeature",
                                                      "Extra Invocations",
                                                      "The Dawnflower anchorite can use solar invocation for twice as many rounds per day as normal.",
                                                      "",
                                                      null,
                                                      FeatureGroup.None,
                                                      Helpers.Create <IncreaseResourceAmountBySharedValue>(i => { i.Resource = solar_invocation_resource; i.Value = Helpers.CreateContextValue(AbilityRankType.Default); }),
                                                      Helpers.Create <IncreaseResourceAmountBySharedValue>(i => { i.Resource = solar_invocation_resource; i.Value = Helpers.CreateContextValue(AbilityRankType.StatBonus); }),
                                                      Helpers.CreateContextRankConfig(ContextRankBaseValueType.ClassLevel, classes: getDawnflowerAcnchoriteArray(), progression: ContextRankProgression.MultiplyByModifier, startLevel: 2),
                                                      Helpers.CreateContextRankConfig(ContextRankBaseValueType.StatBonus, stat: StatType.Charisma, type: AbilityRankType.StatBonus),
                                                      Helpers.Create <RecalculateOnStatChange>(r => r.Stat = StatType.Charisma)
                                                      );
            extra_invocations.ReapplyOnLevelUp = true;
            credence = Helpers.CreateFeatureSelection("CredenceFeatureSelection",
                                                      "Credence",
                                                      "Each Dawnflower anchorite develops a personal credence that guides his worship of Sarenrae. He gains a credence at 6th level and again every 2 class levels thereafter. Each credence can be chosen only once unless noted otherwise.",
                                                      "",
                                                      null,
                                                      FeatureGroup.None);

            credence.AllFeatures = new BlueprintFeature[] { dervish_dance, divine_light, extra_invocations, solar_defense, solar_defense2, solar_weapons };
        }
        static void LoadFavoredPrestigeClass()
        {
            alertnessFeat = library.Get <BlueprintFeature>("1c04fe9a13a22bc499ffac03e6f79153");

            var noFeature = Helpers.Create <PrerequisiteNoFeature>();

            favoredPrestigeClass = Helpers.CreateFeatureSelection(
                "FavoredPresitgeClassSelection",
                "Favored Prestige Class",
                "You have come to favor a certain prestige class, either because you are particularly devoted to the class’s cause, have trained more than most others have for that specific role, or have simply been destined to excel in the prestige class all along. Regardless of the reason, levels gained in your favored prestige class grant additional benefits in a way similar to those you gain for taking levels in your base favored class.\n" +
                "You can select this feat before you gain levels in your chosen favored prestige class, but the benefits of the feat do not apply until you actually gain at least 1 level in that prestige class.",
                "4fab2e6256e644daaa637093bc2421aa",
                Helpers.skillFocusFeat.Icon,
                FeatureGroup.Feat,
                noFeature,
                Helpers.Create <LevelUpRecommendation>(l =>
            {
                // Mark this feat recommended if a prestige class is taken.
                l.ClassPriorities = new ClassesPriority[] {
                    new ClassesPriority()
                    {
                        Classes  = Helpers.prestigeClasses.ToArray(),
                        Priority = RecommendationPriority.Good
                    }
                };
            }));
            // Note: feat order should match Helpers.prestigeClasses so Prestigious Spellcaster can index into this.
            favoredPrestigeClass.SetFeatures(Helpers.prestigeClasses.Select(CreateFavoredPrestigeClass));
            noFeature.Feature = favoredPrestigeClass;

            library.AddFeats(favoredPrestigeClass);
        }
Beispiel #19
0
        static void createOppositionResearch()
        {
            var opposition_schools = library.Get <BlueprintFeatureSelection>("6c29030e9fea36949877c43a6f94ff31").AllFeatures;
            var icon = Helpers.GetIcon("68a23a419b330de45b4c3789649b5b41");

            opposition_research = Helpers.CreateFeatureSelection("OppositionResearchWizardDiscoveryFeature",
                                                                 "Opposition Research",
                                                                 "Select one Wizard opposition school; preparing spells of this school now only requires one spell slot of the appropriate level instead of two.",
                                                                 "",
                                                                 icon,
                                                                 FeatureGroup.Feat,
                                                                 Helpers.PrerequisiteFeaturesFromList(opposition_schools),
                                                                 Helpers.PrerequisiteClassLevel(wizard, 9)
                                                                 );
            opposition_research.AddComponent(Helpers.PrerequisiteNoFeature(opposition_research));

            foreach (BlueprintFeature opposition_school in opposition_schools)
            {
                SpellSchool school  = opposition_school.GetComponent <AddOppositionSchool>().School;
                var         feature = Helpers.CreateFeature(school.ToString() + "OppositionResearchWizardDiscoveryFeature",
                                                            "Opposition Research: " + school.ToString(),
                                                            opposition_research.Description,
                                                            "",
                                                            opposition_school.Icon,
                                                            FeatureGroup.WizardFeat,
                                                            Helpers.Create <RemoveFeatureOnApply>(f => f.Feature  = opposition_school),
                                                            Helpers.Create <RemoveOppositionSchool>(s => s.school = school),
                                                            Helpers.PrerequisiteFeature(opposition_school),
                                                            Helpers.PrerequisiteClassLevel(wizard, 9)
                                                            );
                opposition_research.AllFeatures = opposition_research.AllFeatures.AddToArray(feature);
            }

            addWizardDiscovery(opposition_research);
        }
        static void createArcaneArchery()
        {
            var bard_class = ResourcesLibrary.TryGetBlueprint <BlueprintCharacterClass>("772c83a25e2268e448e841dcd548235f");
            var icon       = library.Get <BlueprintAbility>("9a46dfd390f943647ab4395fc997936d").Icon; //acid arrow

            arcane_achery = Helpers.CreateFeature("ArrowsongMinstrelArcaneArcheryFeature",
                                                  "Arcane Archery",
                                                  "An Arrowsong minstrel’s skill at ranged martial arts allows her to learn to cast a number of powerful, offensive spells that would otherwise be unavailable to her.\n"
                                                  + "Arrowsong Minstrel adds following spells to her spell list: acid arrow, flame arrow, hurricane bow, greater magic weapon, magic weapon, protection from arrows, snowball, true strike, and sorcerer/wizard spells of the evocation school. An Arrowsong minstrel must still select these spells as spells known before she can cast them.\n"
                                                  + "In addition, for the purpose of meeting the requirements of combat feats and prestige classes, an Arrowsong minstrel treats her bard level as her base attack bonus (in addition to base attack bonuses gained from other classes and Hit Dice).\n"
                                                  + "An Arrowsong minstrel casts one fewer spell of each level than normal. If this reduces the number to 0, she can cast spells of that level only if her Charisma score allows bonus spells of that level.",
                                                  "",
                                                  icon,
                                                  FeatureGroup.None,
                                                  Common.createReplace34BabWithClassLevel(bard_class)
                                                  );
            var magus = library.Get <BlueprintCharacterClass>("45a4607686d96a1498891b3286121780");

            arcane_achery_selection = Helpers.CreateFeatureSelection("ArrowsongMinstrelArcaneArcherySelectionFeature",
                                                                     arcane_achery.Name,
                                                                     arcane_achery.Description,
                                                                     "",
                                                                     icon,
                                                                     FeatureGroup.None
                                                                     );
            arcane_achery_selection.Obligatory  = true;
            arcane_achery_selection.AllFeatures = new BlueprintFeature[] { arcane_achery };
            arcane_achery.AddComponent(Helpers.Create <PrerequisiteNoClassLevel>(p => p.CharacterClass = magus));
        }
Beispiel #21
0
        static void LoadFavoredPrestigeClass()
        {
            alertnessFeat = library.Get <BlueprintFeature>("1c04fe9a13a22bc499ffac03e6f79153");

            var noFeature = Helpers.Create <PrerequisiteNoFeature>();

            favoredPrestigeClass = Helpers.CreateFeatureSelection(
                "FavoredPresitgeClassSelection",
                RES.FavoredPresitgeClassFeatureName_info,
                RES.FavoredPresitgeClassFeatureDescription_info,
                "4fab2e6256e644daaa637093bc2421aa",
                Image2Sprite.Create("Mods/EldritchArcana/sprites/favored_prestige_class.png"),
                FeatureGroup.Feat,
                noFeature,
                Helpers.Create <LevelUpRecommendation>(l =>
            {
                // Mark this feat recommended if a prestige class is taken.
                l.ClassPriorities = new ClassesPriority[] {
                    new ClassesPriority()
                    {
                        Classes  = Helpers.prestigeClasses.ToArray(),
                        Priority = RecommendationPriority.Good
                    }
                };
            }));
            // Note: feat order should match Helpers.prestigeClasses so Prestigious Spellcaster can index into this.
            favoredPrestigeClass.SetFeatures(Helpers.prestigeClasses.Select(CreateFavoredPrestigeClass));
            noFeature.Feature = favoredPrestigeClass;

            library.AddFeats(favoredPrestigeClass);
        }
Beispiel #22
0
        public static void addToTalentSelection(BlueprintFeature f, bool advanced = false, bool for_investigator = true)
        {
            var selections =
                new BlueprintFeatureSelection[]
            {
                library.Get <BlueprintFeatureSelection>("c074a5d615200494b8f2a9c845799d93"),    //rogue talent
                library.Get <BlueprintFeatureSelection>("04430ad24988baa4daa0bcd4f1c7d118"),    //slayer talent2
                library.Get <BlueprintFeatureSelection>("43d1b15873e926848be2abf0ea3ad9a8"),    //slayer talent6
                library.Get <BlueprintFeatureSelection>("913b9cf25c9536949b43a2651b7ffb66"),    //slayerTalent10
                Archetypes.SanctifiedSlayer.talented_slayer,
                Archetypes.NatureFang.slayer_talent4,
                Archetypes.NatureFang.slayer_talent6,
                Archetypes.NatureFang.slayer_talent10,
                Skald.rogue_talents,                //red tongue
                VersatilePerformance.rogue_talents, //archaelogist
            };

            if (for_investigator)
            {
                selections = selections.AddToArray(Investigator.investigator_talent_selection);
            }

            foreach (var s in selections)
            {
                s.AllFeatures = s.AllFeatures.AddToArray(f);
            }

            var advanced_talents = library.Get <BlueprintFeature>("a33b99f95322d6741af83e9381b2391c");

            if (advanced)
            {
                f.AddComponent(Helpers.PrerequisiteFeature(advanced_talents));
            }
        }
        static BlueprintParametrizedFeature CreateSpellPerfection(BlueprintFeature[] newMetamagics)
        {
            var library       = Main.library;
            var allMetamagics = newMetamagics.Concat((new String[] {
                "a1de1e4f92195b442adb946f0e2b9d4e",
                "f180e72e4a9cbaa4da8be9bc958132ef",
                "2f5d1e705c7967546b72ad8218ccf99c",
                "7f2b282626862e345935bbea5e66424b",
                "ef7ece7bb5bb66a41b256976b27f424e",
                "46fad72f54a33dc4692d3b62eca7bb78",
            }).Select(id => (BlueprintFeature)library.BlueprintsByAssetId[id])).ToArray();

            spellSpecialization     = library.Get <BlueprintProgression>("fe9220cdc16e5f444a84d85d5fa8e3d5");
            spellPenetration        = library.Get <BlueprintFeature>("ee7dc126939e4d9438357fbd5980d459");
            spellPenetrationGreater = library.Get <BlueprintFeature>("1978c3f91cfbbc24b9c9b0d017f4beec");
            elementalFocus          = library.Get <BlueprintFeatureSelection>("bb24cc01319528849b09a3ae8eec0b31");
            elementalFocusGreater   = library.Get <BlueprintFeatureSelection>("1c17446a3eb744f438488711b792ca4d");

            var spellSpecialization1 = library.Get <BlueprintParametrizedFeature>("f327a765a4353d04f872482ef3e48c35");
            var noFeature            = Helpers.PrerequisiteNoFeature(null);
            var spellPerfection      = Helpers.CreateParamSelection <KnownSpellSelection>("SpellPerfection",
                                                                                          "完美法术",
                                                                                          "选择一个你能够释放的法术,每次你释放此法术时,你可以在不影响施法时间和法术环级的情况下对其施加任何一个你所知晓的超魔专长,只要此法术的合计等级不超过九级(添加多个超魔时,环数调整最低的适用此专长)。此外,如果你有其他专长允许你对这个法术的任何一个方面添加一个加值(例如法术专攻,法术穿透,武器专攻-射线等),那么这些专长在这个法术上的效果加倍。",
                                                                                          "82165fb15af34cbb9c0c2e6fb232b2fc",
                                                                                          spellSpecialization.Icon,
                                                                                          FeatureGroup.Feat,
                                                                                          Helpers.PrerequisiteStatValue(StatType.SkillKnowledgeArcana, 15),
                                                                                          Helpers.Create <PrerequisiteFeaturesFromList>(p => { p.Amount = 3; p.Features = allMetamagics; }),
                                                                                          Helpers.Create <ReduceMetamagicCostForSpell>(r => r.OneMetamagicIsFree = true),
                                                                                          Helpers.Create <SpellPerfectionDoubleFeatBonuses>(),
                                                                                          noFeature);

            noFeature.Feature = spellPerfection;
            return(spellPerfection);
        }
Beispiel #24
0
        static BlueprintParametrizedFeature CreateSpellPerfection(BlueprintFeature[] newMetamagics)
        {
            var library       = Main.library;
            var allMetamagics = newMetamagics.Concat((new String[] {
                "a1de1e4f92195b442adb946f0e2b9d4e",
                "f180e72e4a9cbaa4da8be9bc958132ef",
                "2f5d1e705c7967546b72ad8218ccf99c",
                "7f2b282626862e345935bbea5e66424b",
                "ef7ece7bb5bb66a41b256976b27f424e",
                "46fad72f54a33dc4692d3b62eca7bb78",
            }).Select(id => (BlueprintFeature)library.BlueprintsByAssetId[id])).ToArray();

            spellSpecialization     = library.Get <BlueprintProgression>("fe9220cdc16e5f444a84d85d5fa8e3d5");
            spellPenetration        = library.Get <BlueprintFeature>("ee7dc126939e4d9438357fbd5980d459");
            spellPenetrationGreater = library.Get <BlueprintFeature>("1978c3f91cfbbc24b9c9b0d017f4beec");
            elementalFocus          = library.Get <BlueprintFeatureSelection>("bb24cc01319528849b09a3ae8eec0b31");
            elementalFocusGreater   = library.Get <BlueprintFeatureSelection>("1c17446a3eb744f438488711b792ca4d");

            var spellSpecialization1 = library.Get <BlueprintParametrizedFeature>("f327a765a4353d04f872482ef3e48c35");
            var noFeature            = Helpers.PrerequisiteNoFeature(null);
            var spellPerfection      = Helpers.CreateParamSelection <KnownSpellSelection>("SpellPerfection",
                                                                                          "Spell Perfection",
                                                                                          "Pick one spell which you have the ability to cast. Whenever you cast that spell you may apply any one metamagic feat you have to that spell without affecting its level or casting time, as long as the total modified level of the spell does not use a spell slot above 9th level. In addition, if you have other feats which allow you to apply a set numerical bonus to any aspect of this spell (such as Spell Focus, Spell Penetration, Weapon Focus [ray], and so on), double the bonus granted by that feat when applied to this spell.",
                                                                                          "82165fb15af34cbb9c0c2e6fb232b2fc",
                                                                                          spellSpecialization.Icon,
                                                                                          FeatureGroup.Feat,
                                                                                          Helpers.PrerequisiteStatValue(StatType.SkillKnowledgeArcana, 15),
                                                                                          Helpers.Create <PrerequisiteFeaturesFromList>(p => { p.Amount = 3; p.Features = allMetamagics; }),
                                                                                          Helpers.Create <ReduceMetamagicCostForSpell>(r => r.OneMetamagicIsFree = true),
                                                                                          Helpers.Create <SpellPerfectionDoubleFeatBonuses>(),
                                                                                          noFeature);

            noFeature.Feature = spellPerfection;
            return(spellPerfection);
        }
Beispiel #25
0
        static void createPatronSpellsAndMetamagic()
        {
            var diety_selection = library.Get <BlueprintFeatureSelection>("59e7a76987fe3b547b9cce045f4db3e4");

            patron_spells = Helpers.CreateFeatureSelection("PactWizardPatronSelection",
                                                           "Patron Spells",
                                                           "At 1st level, a pact wizard must select a patron. This functions like the witch class ability of the same name, except the pact wizard automatically adds his patron’s spells to his spellbook instead of to his familiar.\n"
                                                           + "In addition, the pact wizard can expend any prepared spell that isn’t a spell prepared using the additional spell slot the wizard receives from his arcane school in order to spontaneously cast one of his patron’s spells of the same level.",
                                                           "",
                                                           diety_selection.Icon,
                                                           FeatureGroup.None);

            patron_metamagic = Helpers.CreateFeature("PactWizardPatronMetamagicFeature",
                                                     "Great Power, Greater Expense",
                                                     "At 15th level, when pact wizard applies metamagic feats to any spells he learned via his patron or curse, he treats that spell’s final effective level as 1 lower (to a minimum level equal to the spell’s original level).",
                                                     "",
                                                     Helpers.GetIcon("3524a71d57d99bb4b835ad20582cf613"),
                                                     FeatureGroup.None);

            foreach (var kv in Witch.patron_spelllist_map)
            {
                var    learn_spell_list = kv.Value.createLearnSpellList("PactWizard" + kv.Key + "PatronSpellList", "", archetype.GetParentClass());
                string description      = kv.Key + " patron grants pact wizard the following spells: ";
                for (int i = 1; i <= 9; i++)
                {
                    description += learn_spell_list.SpellList.SpellsByLevel[i].Spells[0].Name + ((i == 9) ? "" : ", ");
                }
                description += ".";

                var patron = Helpers.CreateFeature("PactWizard" + kv.Key + "PatronFeature",
                                                   kv.Key + " Patron",
                                                   description,
                                                   "",
                                                   null,
                                                   FeatureGroup.None,
                                                   learn_spell_list
                                                   );
                var spells       = Common.getSpellsFromSpellList(learn_spell_list.SpellList);
                var spells_array = Common.createSpelllistsForSpontaneousConversion(spells);

                for (int i = 0; i < spells_array.Length; i++)
                {
                    patron.AddComponent(Common.createSpontaneousSpellConversion(archetype.GetParentClass(), spells_array[i].ToArray()));
                }

                patron_spells.AllFeatures = patron_spells.AllFeatures.AddToArray(patron);


                var feature2 = Helpers.CreateFeature(kv.Key + "PatronMetamagicFeature",
                                                     "",
                                                     "",
                                                     "",
                                                     null,
                                                     FeatureGroup.None,
                                                     Helpers.Create <NewMechanics.MetamagicMechanics.ReduceMetamagicCostForSpecifiedSpells>(r => { r.reduction = 1; r.spells = spells.ToArray(); })
                                                     );
                feature2.HideInCharacterSheetAndLevelUp = true;
                patron_metamagic.AddComponent(Common.createAddFeatureIfHasFact(patron, feature2));
            }
        }
        internal static List <BlueprintArchetype> Create(BlueprintFeatureSelection mystery, BlueprintFeatureSelection revelation, BlueprintFeature mysteryClassSkills)
        {
            var archetypes = new List <BlueprintArchetype>();

            archetypes.Add(CreateSeeker(revelation, mysteryClassSkills));
            archetypes.Add(CreateAncientLorekeeper(mystery, mysteryClassSkills));
            //archetypes.Add(CreateDivineHerbalist(revelation, mysteryClassSkills));

            // TODO: oracle archetypes? Ideas
            // - Divine Herbalist (paladin feel -- lay on hands & chance to cure conditions, popular choice with Life)
            // - Dual Cursed (very popular choice, not too hard to implement other than the spells, see below.)
            // - Elementalist Oracle (not too bad if Admixture subschool is implemented.)
            // - ...
            //
            // Dual Cursed:
            // - Fortune: is basically the same as Rewind Time, so it's already implemented.
            // - Misfortune: forcing enemies to reroll saving throws is generally the best use
            //   of this ability; a toggle could be used to enable this for all enemies. Similar
            //   to Persistent Spell.
            // - Ill Omen spell: kind of like Rewind Time but reversed, must take worse rolls.
            // - Oracle's burden: a bit tricky because the curses are not really designed to work
            //   on

            return(archetypes);
        }
        static BlueprintArchetype CreateAncientLorekeeper(BlueprintFeatureSelection mysteries, BlueprintFeature mysteryClassSkills)
        {
            var lorekeeper = Helpers.Create <BlueprintArchetype>(a =>
            {
                a.name                 = "AncientLorekeeperArchetype";
                a.LocalizedName        = Helpers.CreateString($"{a.name}.Name", "Ancient Lorekeeper");
                a.LocalizedDescription = Helpers.CreateString($"{a.name}.Description",
                                                              "The ancient lorekeeper is a repository for all the beliefs and vast knowledge of an elven people. They show a strong interest in and understanding of histories and creation legends at a young age, and as they mature their calling to serve as the memory of their long-lived people becomes clear to all who know them.\n" +
                                                              "An ancient lorekeeper adds Knowledge (arcana) to their list of class skills. This replaces the bonus skills the ancient lorekeeper gains from their mystery.");
            });

            Helpers.SetField(lorekeeper, "m_ParentClass", oracle);
            library.AddAsset(lorekeeper, "df571bf056a941babe0903e94430dc9d");

            lorekeeper.RemoveFeatures = new LevelEntry[] {
                Helpers.LevelEntry(1, mysteryClassSkills),
            };

            var classSkill = Helpers.CreateFeature("AncientLorekeeperClassSkills",
                                                   UIUtility.GetStatText(StatType.SkillKnowledgeArcana),
                                                   "An ancient lorekeeper adds Knowledge (arcana) to their class skills.",
                                                   "a6edf10077d24a95b6d8a701b8fb51d5", null, FeatureGroup.None,
                                                   Helpers.Create <AddClassSkill>(a => a.Skill = StatType.SkillKnowledgeArcana));

            var entries = new List <LevelEntry> {
                Helpers.LevelEntry(1, classSkill),
            };
            var elvenArcana = CreateElvenArcana();

            for (int level = 2; level <= 18; level += 2)
            {
                entries.Add(Helpers.LevelEntry(level, elvenArcana));
            }
            lorekeeper.AddFeatures = entries.ToArray();

            // Enable archetype prerequisites
            var patchDescription = "Archetype prerequisites (such as Ancient Lorekeeper)";

            Main.ApplyPatch(typeof(CharBSelectorLayer_FillData_Patch), patchDescription);
            Main.ApplyPatch(typeof(DescriptionTemplatesLevelup_LevelUpClassPrerequisites_Patch), patchDescription);
            Main.ApplyPatch(typeof(CharacterBuildController_SetRace_Patch), patchDescription);

            lorekeeper.SetComponents(
                Helpers.PrerequisiteFeaturesFromList(Helpers.elf, Helpers.halfElf));

            // Adjust prerequisites for mysteries
            foreach (var mystery in mysteries.AllFeatures)
            {
                if (mystery == TimeMystery.mystery)
                {
                    mystery.AddComponent(Helpers.Create <PrerequisiteArchetypeLevel>(p => { p.Archetype = lorekeeper; p.CharacterClass = oracle; }));
                }
                else
                {
                    mystery.AddComponent(Helpers.Create <PrerequisiteNoArchetype>(p => { p.Archetype = lorekeeper; p.CharacterClass = oracle; }));
                }
            }

            return(lorekeeper);
        }
Beispiel #28
0
        static public void LoadNeutral()
        {
            RisiaAddFacts = new List <BlueprintFeature>();

            compNeutral                = Helpers.Create <AddClassLevels>();
            compNeutral.Archetypes     = new BlueprintArchetype[] { };
            compNeutral.CharacterClass = arcanist;
            compNeutral.Levels         = 7;
            compNeutral.LevelsStat     = StatType.Intelligence;
            compNeutral.Skills         = new StatType[] {
                StatType.SkillKnowledgeArcana,
                StatType.SkillKnowledgeWorld,
                StatType.SkillPersuasion,
                StatType.SkillStealth,
                StatType.SkillPerception,
                StatType.SkillUseMagicDevice,
                StatType.SkillMobility
            };
            compNeutral.SelectSpells   = RisiaSpellKnownLevelupSelect;
            compNeutral.MemorizeSpells = RisiaSpellMemory;

            BlueprintFeatureSelection    basicFeatSelection = getSelection("247a4068296e8be42890143f451b4b45");
            BlueprintParametrizedFeature spellFocus         = getFeat("16fa59cc9a72a6043b566b49184f53fe") as BlueprintParametrizedFeature;

            List <SelectionEntry> selectionEntryList = new List <SelectionEntry>();

            selectionEntryList.Add(new SelectionEntry {
                Selection = basicFeatSelection,//basic feat selection
                Features  = RisiaFeats
            });
            selectionEntryList.Add(new SelectionEntry {
                Selection             = getSelection("247a4068296e8be42890143f451b4b45"),
                IsParametrizedFeature = true,
                ParametrizedFeature   = spellFocus,
                ParamSpellSchool      = SpellSchool.Illusion
            });
            selectionEntryList.Add(new SelectionEntry {
                Selection             = getSelection("247a4068296e8be42890143f451b4b45"),
                IsParametrizedFeature = true,
                ParametrizedFeature   = spellFocus,
                ParamSpellSchool      = SpellSchool.Enchantment
            });
            selectionEntryList.Add(new SelectionEntry {
                Selection = ArcaneExploits.exploitSelection,
                Features  = RisiaArcaneExploits
            });
            compNeutral.Selections = selectionEntryList.ToArray();
            learnNeutral           = Helpers.Create <LearnSpells>(a => {
                a.Spells         = RisiaSpellKnownAfterwards;
                a.CharacterClass = ArcanistClass.arcanist;
            });
            var RisiaLearnSpellFeat = Helpers.CreateFeature("RisiaLearnSpellFeat", "", "",
                                                            OtherUtils.GetMd5("Risia.LearnSpellFeat"),
                                                            null,
                                                            FeatureGroup.None,
                                                            learnNeutral);

            RisiaAddFacts.Add(RisiaLearnSpellFeat);
        }
Beispiel #29
0
            static void createGreaterSpiritAbility()
            {
                var icon = library.Get <BlueprintAbility>("f2115ac1148256b4ba20788f7e966830").Icon; //restoration
                BlueprintFeatureSelection learn_selection = Helpers.CreateFeatureSelection("ShamanArcaneEnlightenmentFeatureSelection",
                                                                                           "Arcane Enlightenment",
                                                                                           "The shaman’s native intelligence grants her the ability to tap into arcane lore. The shaman can add a spell from the sorceror/wizard spell list to the list of shaman spells she can prepare.\n"
                                                                                           + "To select a spell she needs to have both Intelligence and Charisma scores equal to 10 + the spell's level. She can add an additional spell every two levels thereafter.",
                                                                                           "",
                                                                                           icon,
                                                                                           FeatureGroup.None);

                var wizard_spell_list = library.Get <BlueprintSpellList>("ba0401fdeb4062f40a7aa95b6f07fe89");

                for (int i = 1; i <= 9; i++)
                {
                    var learn_spell = library.CopyAndAdd <BlueprintParametrizedFeature>("bcd757ac2aeef3c49b77e5af4e510956", $"ShamanArcaneEnlightenment{i}ParametrizedFeature", "");
                    learn_spell.SpellLevel         = i;
                    learn_spell.SpecificSpellLevel = true;
                    learn_spell.SpellLevelPenalty  = 0;
                    learn_spell.SpellcasterClass   = shaman_class;
                    learn_spell.SpellList          = wizard_spell_list;
                    learn_spell.ReplaceComponent <LearnSpellParametrized>(l => { l.SpellList = wizard_spell_list; l.SpecificSpellLevel = true; l.SpellLevel = i; l.SpellcasterClass = shaman_class; });
                    learn_spell.AddComponents(Helpers.PrerequisiteStatValue(StatType.Intelligence, 10 + i),
                                              Helpers.PrerequisiteStatValue(StatType.Charisma, 10 + i),
                                              Common.createPrerequisiteClassSpellLevel(shaman_class, i)
                                              );
                    learn_spell.SetName(Helpers.CreateString($"ShamanArcaneEnlightenmentParametrizedFeature{i + 1}.Name", "Arcane Enlightenment " + $"(level {i})"));
                    learn_spell.SetDescription(learn_selection.Description);
                    learn_spell.SetIcon(learn_selection.Icon);

                    learn_selection.AllFeatures = learn_selection.AllFeatures.AddToArray(learn_spell);
                }

                greater_spirit_ability = Helpers.CreateProgression("ShamanArcaneEnlightenmentProgression",
                                                                   learn_selection.Name,
                                                                   learn_selection.Description,
                                                                   "",
                                                                   learn_selection.Icon,
                                                                   FeatureGroup.None);

                greater_spirit_ability_wandering = library.CopyAndAdd <BlueprintProgression>(greater_spirit_ability.AssetGuid, "ShamanArcaneEnlightenmentWanderingFeatureSelection", "");

                var entries = new List <LevelEntry>();

                for (int i = 8; i <= 20; i = i + 2)
                {
                    entries.Add(Helpers.LevelEntry(i, learn_selection));
                }
                (greater_spirit_ability as BlueprintProgression).LevelEntries = entries.ToArray();

                entries = new List <LevelEntry>();
                for (int i = 12; i <= 20; i = i + 2)
                {
                    entries.Add(Helpers.LevelEntry(i, learn_selection));
                }

                (greater_spirit_ability_wandering as BlueprintProgression).LevelEntries = entries.ToArray();
            }
Beispiel #30
0
 static void createSlayerTalents()
 {
     slayer_talent4 = library.CopyAndAdd <BlueprintFeatureSelection>("04430ad24988baa4daa0bcd4f1c7d118", "NatureFangSlayerTalent4FeatureSelection", "");
     slayer_talent4.SetDescription("At 4th level and every 2 levels thereafter, a nature fang selects a slayer talent. Starting at 12th level, she can select an advanced slayer talent in place of a slayer talent. She uses her druid level as her slayer level to determine what talents she can select.");
     slayer_talent6 = library.CopyAndAdd <BlueprintFeatureSelection>("43d1b15873e926848be2abf0ea3ad9a8", "NatureFangSlayerTalent6FeatureSelection", "");
     slayer_talent6.SetDescription(slayer_talent4.Description);
     slayer_talent10 = library.CopyAndAdd <BlueprintFeatureSelection>("913b9cf25c9536949b43a2651b7ffb66", "NatureFangSlayerTalent10FeatureSelection", "");
     slayer_talent10.SetDescription(slayer_talent10.Description);
 }