static void createVindicativeSmite()
        {
            vindicative_smite_buff = library.CopyAndAdd <BlueprintBuff>("b6570b8cbb32eaf4ca8255d0ec3310b0", "VindicativeSmiteBuff", "");
            vindicative_smite_buff.SetName("Vindictive Smite");
            vindicative_smite_buff.RemoveComponents <IgnoreTargetDR>();

            Common.addConditionToResoundingBlow(Common.createContextConditionHasBuffFromCaster(vindicative_smite_buff));


            var vindicative_smite_allowed = Helpers.CreateBuff("VindicativeSmiteAllowedBuff",
                                                               "Vindictive Smite Allowed",
                                                               "",
                                                               "",
                                                               vindicative_smite_buff.Icon,
                                                               null);

            vindicative_smite_allowed.SetBuffFlags(BuffFlags.RemoveOnRest);


            vindicative_smite_ability = library.CopyAndAdd <BlueprintAbility>("7bb9eb2042e67bf489ccd1374423cdec", "VindicativeSmiteAbility", "");
            vindicative_smite_ability.SetName(vindicative_smite_buff.Name);
            vindicative_smite_ability.SetDescription("A vindictive bastard is particularly ruthless against those who have harmed her or her allies. Once per day as a swift action, she can smite one target within sight who has dealt hit point damage to her or an ally. She adds her Charisma modifier to her attack rolls and adds her paladin level to damage rolls against the target of her smite. In addition, while vindictive smite is in effect, the vindictive bastard gains a deflection bonus equal to her Charisma bonus (if any) to her AC against attacks by the target of the smite.\n"
                                                     + "The vindictive smite effect remains until the target of the smite is dead or the next time the vindictive bastard rests and regains her uses of this ability. At 4th level and every 3 levels thereafter, the vindictive bastard can invoke her vindictive smite one additional time per day, to a maximum of seven times per day at 19th level.");

            vindicative_smite_ability.ReplaceComponent <AbilityCasterAlignment>(Common.createAbilityTargetHasFact(false, vindicative_smite_allowed));
            vindicative_smite_ability.AddComponent(Common.createAbilityTargetHasFact(true, vindicative_smite_buff));

            var apply_buff = Common.createContextActionApplyBuff(vindicative_smite_buff, Helpers.CreateContextDuration(), is_permanent: true, dispellable: false);

            vindicative_smite_ability.ReplaceComponent <AbilityEffectRunAction>(a => a.Actions = Helpers.CreateActionList(apply_buff));

            var config     = vindicative_smite_ability.GetComponents <ContextRankConfig>().Where(c => c.IsBasedOnClassLevel).FirstOrDefault();
            var new_config = config.CreateCopy();

            Helpers.SetField(new_config, "m_Class", getVindicativeBastardArray());
            vindicative_smite_ability.ReplaceComponent(config, new_config);

            var apply_allowed = Common.createContextActionApplyBuff(vindicative_smite_allowed, Helpers.CreateContextDuration(), is_permanent: true, dispellable: false);

            GameAction trigger = apply_allowed;

            if (!test_mode)
            {
                trigger = Helpers.CreateConditional(Helpers.Create <ContextConditionIsEnemy>(), trigger);
            }

            var vindicative_smite_trigger = Helpers.CreateBuff("VindicativeSmiteTriggerBuff",
                                                               "",
                                                               "",
                                                               "",
                                                               null,
                                                               null,
                                                               Helpers.Create <NewMechanics.AddIncomingDamageTriggerOnAttacker>(c => c.Actions = Helpers.CreateActionList(trigger))
                                                               );

            vindicative_smite_trigger.SetBuffFlags(BuffFlags.HiddenInUi);

            var vindicative_smite_trigger_area = library.CopyAndAdd <BlueprintAbilityAreaEffect>("7ced0efa297bd5142ab749f6e33b112b", "VindicativeSmiteTriggerArea", "");

            vindicative_smite_trigger_area.Size = 100.Feet();
            vindicative_smite_trigger_area.ReplaceComponent <AbilityAreaEffectBuff>(a => a.Buff = vindicative_smite_trigger);

            var vindicative_smite_area_buff = library.CopyAndAdd <BlueprintBuff>("c96380f6dcac83c45acdb698ae70ffc4", "VindicativeSmiteTriggerAreaBuff", "");

            vindicative_smite_area_buff.ReplaceComponent <AddAreaEffect>(a => a.AreaEffect = vindicative_smite_trigger_area);
            smite_resource = library.Get <BlueprintAbilityResource>("b4274c5bb0bf2ad4190eb7c44859048b");//smite_evil_resource

            vindicative_smite = Helpers.CreateFeature("VindicativeSmiteFeature",
                                                      vindicative_smite_ability.Name,
                                                      vindicative_smite_ability.Description,
                                                      "",
                                                      vindicative_smite_ability.Icon,
                                                      FeatureGroup.None,
                                                      Common.createAuraFeatureComponent(vindicative_smite_area_buff),
                                                      Helpers.CreateAddAbilityResource(smite_resource),
                                                      Helpers.CreateAddFact(vindicative_smite_ability)
                                                      );

            add_vindicative_smite_use = library.CopyAndAdd <BlueprintFeature>("0f5c99ffb9c084545bbbe960b825d137", "VindicativeSmiteAdditionalUse", "");
            add_vindicative_smite_use.SetName("Vindicative Smite - Additional Use");
            add_vindicative_smite_use.SetDescription(vindicative_smite.Description);
        }
 static void createStalwart()
 {
     stalwart = library.Get <BlueprintFeature>("ec9dbc9a5fa26e446a54fe5df6779088");
     stalwart.SetDescription("A character can use mental and physical resiliency to avoid certain attacks. If she makes a Fortitude or Will saving throw against an attack that has a halved damage on a successful save, she instead avoids the damage entirely.");
 }
Beispiel #3
0
 static void createHolyVindicatorProficiencies()
 {
     holy_vindicator_proficiencies = library.CopyAndAdd <BlueprintFeature>("b10ff88c03308b649b50c31611c2fefb", "HolyVindicatorProficiencies", "");//paladin
     holy_vindicator_proficiencies.SetName("Holy Vindicator Proficiencies");
     holy_vindicator_proficiencies.SetDescription("A vindicator is proficient with all simple and martial weapons and all armor and shields (except tower shields).");
 }
Beispiel #4
0
        internal static void create()
        {
            var paladin_class = ResourcesLibrary.TryGetBlueprint <BlueprintCharacterClass>("bfa11238e7ae3544bbeb4d0b92e897ec");

            archetype = Helpers.Create <BlueprintArchetype>(a =>
            {
                a.name                 = "IroranPaladinArchetype";
                a.LocalizedName        = Helpers.CreateString($"{a.name}.Name", "Iroran Paladin");
                a.LocalizedDescription = Helpers.CreateString($"{a.name}.Description", "Iroran paladins meditate on self-perfection and train relentlessly, knowing that their example can inspire others to excel. Irori offers no universal paladin code— each paladin in his service creates his own code as part of his spiritual journey, seeing the adherence to such a self-formulated creed as one of the many tests one must face to reach perfection.");
            });
            Helpers.SetField(archetype, "m_ParentClass", paladin_class);
            library.AddAsset(archetype, "");

            archetype.ReplaceClassSkills = true;
            archetype.ClassSkills        = archetype.GetParentClass().ClassSkills.AddToArray(StatType.SkillAthletics, StatType.SkillMobility);

            createConfidentDefense();
            createUnarmedStrike();
            createPersonalTrial();
            createDivineBody();
            createKiPool();
            createAuraOfExcellence();
            createAuraOfPerfection();


            var paladin_proficiencies = library.Get <BlueprintFeature>("b10ff88c03308b649b50c31611c2fefb");
            var smite_evil            = library.Get <BlueprintFeature>("3a6db57fce75b0244a6a5819528ddf26");
            var smite_evil_extra      = library.Get <BlueprintFeature>("0f5c99ffb9c084545bbbe960b825d137");
            var weapon_bond_feature   = library.Get <BlueprintFeature>("1c7cdc1605554954f838d85bbdd22d90");
            var paladin_deity         = library.Get <BlueprintFeatureSelection>("a7c8b73528d34c2479b4bd638503da1d");
            var aura_of_courage       = library.Get <BlueprintFeature>("e45ab30f49215054e83b4ea12165409f");
            var weapon_bond_extra_use = library.Get <BlueprintFeature>("5a64de5435667da4eae2e4c95ec87917");
            var aura_of_justice       = library.Get <BlueprintFeature>("9f13fdd044ccb8a439f27417481cb00e");
            var channel_energy        = library.Get <BlueprintFeature>("cb6d55dda5ab906459d18a435994a760");

            irori = Common.featureToFeature(library.Get <BlueprintFeature>("23a77a5985de08349820429ce1b5a234"), false, "", "IroranPaladin");
            irori.SetDescription("Iroran paladin must worship Irori.");

            var improved_unarmed_strike = library.Get <BlueprintFeature>("7812ad3672a4b9a4fb894ea402095167");

            archetype.RemoveFeatures = new LevelEntry[] { Helpers.LevelEntry(1, paladin_proficiencies, paladin_deity, smite_evil),
                                                          Helpers.LevelEntry(3, aura_of_courage),
                                                          Helpers.LevelEntry(4, smite_evil_extra, channel_energy),
                                                          Helpers.LevelEntry(5, weapon_bond_feature),
                                                          Helpers.LevelEntry(7, smite_evil_extra),
                                                          Helpers.LevelEntry(10, smite_evil_extra),
                                                          Helpers.LevelEntry(11, aura_of_justice),
                                                          Helpers.LevelEntry(13, smite_evil_extra),
                                                          Helpers.LevelEntry(16, smite_evil_extra),
                                                          Helpers.LevelEntry(19, smite_evil_extra), };

            archetype.AddFeatures = new LevelEntry[] { Helpers.LevelEntry(1, irori, personal_trial, confident_defense, unarmed_strike, improved_unarmed_strike),
                                                       Helpers.LevelEntry(3, aura_of_excellence),
                                                       Helpers.LevelEntry(4, ki_pool, ki_strike_magic, personal_trial_extra_use),
                                                       Helpers.LevelEntry(5, divine_body),
                                                       Helpers.LevelEntry(7, ki_strike_cold_iron_silver),
                                                       Helpers.LevelEntry(8, personal_trial_extra_use),
                                                       Helpers.LevelEntry(10, ki_strike_lawful),
                                                       Helpers.LevelEntry(11, aura_of_perfection),
                                                       Helpers.LevelEntry(12, personal_trial_extra_use),
                                                       Helpers.LevelEntry(16, ki_strike_adamantine, personal_trial_extra_use),
                                                       Helpers.LevelEntry(20, personal_trial_extra_use), };

            paladin_class.Progression.UIDeterminatorsGroup = paladin_class.Progression.UIDeterminatorsGroup.AddToArray(irori, confident_defense);
            paladin_class.Progression.UIGroups[0].Features.Add(divine_body);
            paladin_class.Progression.UIGroups[1].Features.Add(personal_trial);
            paladin_class.Progression.UIGroups[1].Features.Add(personal_trial_extra_use);
            paladin_class.Progression.UIGroups[2].Features.Add(aura_of_excellence);
            paladin_class.Progression.UIGroups[2].Features.Add(aura_of_perfection);
            paladin_class.Progression.UIGroups[2].Features.Add(ki_pool);
            paladin_class.Progression.UIGroups = paladin_class.Progression.UIGroups.AddToArray(Helpers.CreateUIGroup(ki_strike_magic, ki_strike_cold_iron_silver, ki_strike_lawful, ki_strike_adamantine));
            paladin_class.Archetypes           = paladin_class.Archetypes.AddToArray(archetype);
        }
Beispiel #5
0
        static public BlueprintFeature Create()
        {
            MagicSupremancyBuffComp comp = Helpers.Create <MagicSupremancyBuffComp>();

            comp.resource = ArcaneReservoir.resource;
            buff          = Helpers.CreateBuff("ArcanistClassMagicSupremancyBuff", "", "",
                                               "d4a2fc38efec094263696cb8342bd274",//MD5-32[ArcanistClass.MagaicSupremancy.Buff]
                                               IconSet.tsunami,
                                               null,
                                               comp);
            buff.SetName(Helpers.CreateString("ArcanistClass.MagaicSupremancy.Buff.Name"));
            buff.SetDescription(Helpers.CreateString("ArcanistClass.MagaicSupremancy.Buff.Desc"));
            //When buff finds the first spell to apply, add buff2 to caster as a flag
            buff2 = Helpers.CreateBuff("ArcanistClassMagicSupremancyBuff2", "", "",
                                       "b1e2b39dd4ecb343322098b3403d11df",//MD5-32[ArcanistClass.MagaicSupremancy.Buff_FindProperSpell]
                                       IconSet.tsunami, null);
            var comp_res = Helpers.Create <AbilityResourceLogic>();

            comp_res.Amount           = 1;
            comp_res.RequiredResource = ArcaneReservoir.resource;
            comp_res.IsSpendResource  = true;
            comp_res.CostIsCustom     = false;

            var ablEffectComp       = Helpers.Create <AbilityEffectRunAction>();
            var ablEffectCompAction = Helpers.Create <ContextActionApplyBuff>();

            ablEffectCompAction.Buff            = buff;
            ablEffectCompAction.Permanent       = false;
            ablEffectCompAction.DurationValue   = PresetDurations.threeRounds;
            ablEffectCompAction.IsFromSpell     = false;
            ablEffectCompAction.IsNotDispelable = false;
            ablEffectCompAction.ToCaster        = false;
            ablEffectCompAction.AsChild         = true;
            ablEffectComp.Actions = new ActionList {
                Actions = new GameAction[] { null, ablEffectCompAction }
            };

            var abl = Helpers.CreateAbility("ArcanistClassMagicSupremancyAbl", "", "",
                                            "fb2a3383e82cbc6ad9c13ac0bca46723",//MD5-32[ArcanistClass.MagicSupremancy.Abl]
                                            IconSet.tsunami,
                                            AbilityType.Supernatural,
                                            UnitCommand.CommandType.Free,
                                            AbilityRange.Personal,
                                            "", "",
                                            comp_res,
                                            ablEffectComp);

            abl.SetName(Helpers.CreateString("ArcanistClass.MagicSupremancy.Abl.Name"));
            abl.SetDescription(Helpers.CreateString("ArcanistClass.MagicSupremancy.Abl.Desc"));
            abl.LocalizedDuration    = Helpers.CreateString("ArcaneTide.ThreeRounds");
            abl.LocalizedSavingThrow = Helpers.CreateString("ArcaneTide.NoSave");

            feat = Helpers.CreateFeature("ArcanistClassMagicSupremancyFeat", "", "",
                                         "e9438c7efd1c9df62a041ba6e360a5c1",//MD5-32[ArcanistClass.MagicSupremancy.Feat]
                                         IconSet.tsunami,
                                         FeatureGroup.None,
                                         Helpers.Create <AddFacts>(a => a.Facts = new BlueprintUnitFact[] { abl }));
            feat.SetName(Helpers.CreateString("ArcanistClass.MagicSupremancy.Feat.Name"));
            feat.SetDescription(Helpers.CreateString("ArcanistClass.MagicSupremancy.Feat.Desc"));
            return(feat);
        }
Beispiel #6
0
        static void createPhantomProgression()
        {
            outsider.HideInCharacterSheetAndLevelUp = true;
            outsider.HideInUI = true;
            //devotion
            //evasion
            //natural armorc
            //str/dex increase
            //improved evasion

            devotion = library.CopyAndAdd <BlueprintFeature>("226f939b7dfd47b4697ec52f79799012", "PhantomDevotionFeature", "");
            devotion.SetDescription("The phantom gains a +4 morale bonus on Will saves against enchantment spells and effects.");

            endure_torment = Helpers.CreateFeature("EndureTormentPhantomFeature",
                                                   "Endure Torment",
                                                   "At 5th level, a scourge’s phantom gains a +4 bonus on saving throws against death effects and effects that could cause it to become staggered or stunned.",
                                                   "",
                                                   null,
                                                   FeatureGroup.None,
                                                   Common.createSavingThrowBonusAgainstDescriptor(4, ModifierDescriptor.UntypedStackable, SpellDescriptor.Stun | SpellDescriptor.Staggered | SpellDescriptor.Death)
                                                   );


            var natural_armor = library.CopyAndAdd <BlueprintFeature>("0d20d88abb7c33a47902bd99019f2ed1", "PhantomNaturalArmorFeature", "");

            natural_armor.SetNameDescription("Armor Bonus",
                                             "Phantom receives bonuses to their natural armor. A phantom cannot wear armor of any kind, as the armor interferes with the spiritualist’s connection to the phantom.");
            dex_cha_bonus = library.CopyAndAdd <BlueprintFeature>("0c80276018694f24fbaf59ec7b841f2b", "PhantomDexChaIncreaseFeature", "");
            dex_cha_bonus.SetNameDescription("Phantom Prowess", "Phantom receives +1 bonus to their Dexterity and Charisma.");
            dex_cha_bonus.ComponentsArray = new BlueprintComponent[]
            {
                Helpers.CreateAddStatBonus(StatType.Dexterity, 1, ModifierDescriptor.None),
                Helpers.CreateAddStatBonus(StatType.Charisma, 1, ModifierDescriptor.None),
            };
            str_cha_bonus = library.CopyAndAdd <BlueprintFeature>("0c80276018694f24fbaf59ec7b841f2b", "PhantomStrChaIncreaseFeature", "");
            str_cha_bonus.SetNameDescription("Phantom Prowess", "Anger phantom receives +1 bonus to their Strength and Charisma.");
            str_cha_bonus.ComponentsArray = new BlueprintComponent[]
            {
                Helpers.CreateAddStatBonus(StatType.Strength, 1, ModifierDescriptor.None),
                Helpers.CreateAddStatBonus(StatType.Charisma, 1, ModifierDescriptor.None),
            };

            createExtraClassSkill();
            createSlamDamage();
            createDr();
            phantom_progression = Helpers.CreateProgression("PhantomProgression",
                                                            phantom_class.Name,
                                                            phantom_class.Description,
                                                            "",
                                                            phantom_class.Icon,
                                                            FeatureGroup.None);
            phantom_progression.Classes = new BlueprintCharacterClass[] { phantom_class };


            magic_attacks = Helpers.CreateFeature("PhantomMagicAttacksFeature",
                                                  "Magic Attacks",
                                                  "Starting from 3rd level, the phantom treats its slam attacks as if they were magic for the purposes of overcoming damage reduction.",
                                                  "",
                                                  null,
                                                  FeatureGroup.None,
                                                  Common.createAddOutgoingMagic()
                                                  );


            var bonus_feat = library.Get <BlueprintFeatureSelection>("247a4068296e8be42890143f451b4b45");

            phantom_progression.LevelEntries = new LevelEntry[] { Helpers.LevelEntry(1, outsider, dr5_slashing, slam_damage,
                                                                                     library.Get <BlueprintFeature>("d3e6275cfa6e7a04b9213b7b292a011c"),  // ray calculate feature
                                                                                     library.Get <BlueprintFeature>("62ef1cdb90f1d654d996556669caf7fa"),  //touch calculate feature
                                                                                     library.Get <BlueprintFeature>("0aeba56961779e54a8a0f6dedef081ee")), //inside the storm
                                                                  Helpers.LevelEntry(2, natural_armor, dex_cha_bonus, extra_class_skills, bonus_feat),
                                                                  Helpers.LevelEntry(3, magic_attacks),
                                                                  Helpers.LevelEntry(4, natural_armor, dex_cha_bonus, dr_magic),
                                                                  Helpers.LevelEntry(5, devotion),
                                                                  Helpers.LevelEntry(6, natural_armor, dex_cha_bonus),
                                                                  Helpers.LevelEntry(7, Eidolon.multi_attack),
                                                                  Helpers.LevelEntry(8, natural_armor, dex_cha_bonus),
                                                                  Helpers.LevelEntry(9, natural_armor, dex_cha_bonus),
                                                                  Helpers.LevelEntry(10),
                                                                  Helpers.LevelEntry(11),
                                                                  Helpers.LevelEntry(12, natural_armor, dex_cha_bonus),
                                                                  Helpers.LevelEntry(13, natural_armor, dex_cha_bonus),
                                                                  Helpers.LevelEntry(14),
                                                                  Helpers.LevelEntry(15, natural_armor, dex_cha_bonus, dr15),
                                                                  Helpers.LevelEntry(16),
                                                                  Helpers.LevelEntry(17),
                                                                  Helpers.LevelEntry(18),
                                                                  Helpers.LevelEntry(19),
                                                                  Helpers.LevelEntry(20) };


            phantom_progression.UIGroups = new UIGroup[]  { Helpers.CreateUIGroup(slam_damage, magic_attacks, devotion, Eidolon.multi_attack, endure_torment),
                                                            Helpers.CreateUIGroup(dr5_slashing, dr_magic, dr15),
                                                            Helpers.CreateUIGroup(natural_armor),
                                                            Helpers.CreateUIGroup(dex_cha_bonus, str_cha_bonus), };
        }
Beispiel #7
0
        static public BlueprintFeature Create()
        {
            if (ArcaneReservoir.resource == null)
            {
                UnityModManagerNet.UnityModManager.Logger.Log("[Arcanist ConsumeSpell]Arcane Reservoir Pool must be created before ConsumeSpells::Create()");
                return(null);
            }
            if (library.BlueprintsByAssetId.ContainsKey("6e48c034817eabd99df991e0435025ed"))
            {
                return(library.Get <BlueprintFeature>("6e48c034817eabd99df991e0435025ed"));
            }
            consume_resource = Helpers.CreateAbilityResource("ArcanistClassConsumeSpellAblResource", "", "",
                                                             "56e3d1e34251f5c628ae08e78dbf0360",//MD5-32[ArcanistClass.ConsumeSpell.AblResource]
                                                             IconSet.vanish_icon);
            consume_resource.SetIncreasedByStat(3, StatType.Charisma);

            var variants = new List <BlueprintAbility>();

            for (int i = 1; i <= 9; i++)
            {
                int least_arcanist_level = (i == 1) ? 1 : 2 * i;
                AbilityRequirementClassSpellLevel comp_pre = Helpers.Create <AbilityRequirementClassSpellLevel>();
                comp_pre.characterClass     = arcanist;
                comp_pre.RequiredSpellLevel = i;

                AbilityResourceLogic comp_res = Helpers.Create <AbilityResourceLogic>();
                comp_res.Amount           = 1;
                comp_res.IsSpendResource  = true;
                comp_res.RequiredResource = consume_resource;
                comp_res.CostIsCustom     = false;

                AbilityEffectRunAction         comp_act = Helpers.Create <AbilityEffectRunAction>();
                ConsumeSpellForReservoirAction act      = Helpers.Create <ConsumeSpellForReservoirAction>();
                act.resource           = ArcaneReservoir.resource;
                act.spellLevel         = i;
                act.blueprintSpellbook = arcanist.Spellbook;
                comp_act.Actions       = new ActionList {
                    Actions = new GameAction[] { act }
                };

                BlueprintAbility abl_i = Helpers.CreateAbility($"ArcanistClassConsumeSpellLevel{i}Abl", "", "",
                                                               OtherUtils.GetMd5($"ArcanistClassConsumeSpellLevel{i}Abl"), IconSet.magus_spellrecall, AbilityType.Supernatural,
                                                               UnitCommand.CommandType.Move, AbilityRange.Personal,
                                                               "", "", comp_pre, comp_res, comp_act);
                abl_i.SetName(Helpers.CreateString($"ArcanistClass.ConsumeSpell.Level{i}.Abl.Name"));
                abl_i.SetDescription(Helpers.CreateString($"ArcanistClass.ConsumeSpell.Level{i}.Abl.Desc"));
                abl_i.LocalizedDuration    = Helpers.CreateString("ArcaneTide.Instant");
                abl_i.LocalizedSavingThrow = Helpers.CreateString("ArcaneTide.NoSave");
                variants.Add(abl_i);
                ablList.Add(abl_i);
            }

            AbilityResourceLogic comp_res0 = Helpers.Create <AbilityResourceLogic>();

            comp_res0.Amount           = 1;
            comp_res0.IsSpendResource  = true;
            comp_res0.RequiredResource = consume_resource;
            comp_res0.CostIsCustom     = false;

            abl = Helpers.CreateAbility("ArcanistClassConsumeSpellAbl", "", "",
                                        "33bec6603df0f7cfe904525e9a44432e",//MD5-32[ArcanistClass.ConsumeSpells.Abl]
                                        IconSet.magus_spellrecall,
                                        AbilityType.Supernatural,
                                        UnitCommand.CommandType.Move,
                                        AbilityRange.Personal,
                                        "",
                                        "",
                                        comp_res0);
            abl.SetName(Helpers.CreateString("ArcanistClass.ConsumeSpells.Abl.Name"));
            abl.SetDescription(Helpers.CreateString("ArcanistClass.ConsumeSpells.Abl.Desc"));
            abl.LocalizedDuration    = Helpers.CreateString("ArcaneTide.Instant");
            abl.LocalizedSavingThrow = Helpers.CreateString("ArcaneTide.NoSave");
            abl.AddComponent(abl.CreateAbilityVariants(variants.ToArray <BlueprintAbility>()));
            ablList.Add(abl);
            feat = Helpers.CreateFeature("ArcanistClassConsumeSpellsFeat", "", "",
                                         "6e48c034817eabd99df991e0435025ed",//MD5-32[ArcanistClass.ConsumeSpells.Feat]
                                         IconSet.magus_spellrecall,
                                         FeatureGroup.None,
                                         Helpers.Create <AddAbilityResources>(a => a.Resource = consume_resource),
                                         Helpers.Create <AddFacts>(a => a.Facts = new BlueprintUnitFact[] { abl }));
            feat.SetName(Helpers.CreateString("ArcanistClass.ConsumeSpells.Name"));
            feat.SetDescription(Helpers.CreateString("ArcanistClass.ConsumeSpells.Desc"));
            return(feat);
        }
Beispiel #8
0
        static BlueprintFeature CreateSpellVulnerability()
        {
            //Log.Write(DrawFeatGuids[1]);
            var spellvulsprite           = Image2Sprite.Create("Mods/EldritchArcana/sprites/spell_vulnerability.png");
            int SpellVunrabilityBonus    = -4;
            var components               = new List <BlueprintComponent> {
            };
            var SpellschoolChoiceFeature = (new SpellSchool[]
            {
                SpellSchool.Abjuration,
                SpellSchool.Conjuration,
                //SpellSchool.Divination,
                SpellSchool.Enchantment,
                SpellSchool.Evocation,
                SpellSchool.Illusion,
                SpellSchool.Necromancy,
                SpellSchool.Transmutation,
                //SpellSchool.Universalist
            }).Select((school) => Helpers.CreateFeature($"SpellVulnerability{school}", $"SpellVulnerability-{school}",
                                                        $" you have {SpellVunrabilityBonus} on saves vs {school}", Helpers.MergeIds(DrawFeatGuids[1], Helpers.spellSchoolGuid(school)),
                                                        Helpers.GetIcon(Helpers.spellSchoolGuid(school)), FeatureGroup.None,
                                                        Helpers.Create <SavingThrowBonusAgainstSchool>(a =>
            {
                a.School             = school;
                a.Value              = SpellVunrabilityBonus;
                a.ModifierDescriptor = ModifierDescriptor.Penalty;
            }))).ToArray();

            var ElementalWeaknes = new DamageEnergyType[] {
                DamageEnergyType.Cold,
                DamageEnergyType.Acid,
                //divination
                DamageEnergyType.Sonic,
                DamageEnergyType.Fire,
                DamageEnergyType.Electricity,
                DamageEnergyType.Unholy,
                DamageEnergyType.Divine,
                //universalist
            };

            BlueprintFeature feature = SpellschoolChoiceFeature[1];

            for (int i = 0; i < 7; i++)
            {
                feature = SpellschoolChoiceFeature[i];
                feature.SetDescription(feature.GetDescription() + $" and Elementalweakness {ElementalWeaknes[i]}");
                feature.AddComponent(Helpers.Create <AddEnergyVulnerability>(a => { a.Type = ElementalWeaknes[i]; }));
            }

            //var noFeature = Helpers.PrerequisiteNoFeature(null);

            var feat = Helpers.CreateFeatureSelection("SpellVulnerability", "Spell Vulnerability",
                                                      "if you pick a Drawback at level one you can choose an extra feat on top\n" +
                                                      $"Bane: choose a spellschool you have {SpellVunrabilityBonus} on saves vs that spellschool.", //\n(except universalist and divination becouse there are no saves of those catagory)
                                                      DrawFeatGuids[1],
                                                      spellvulsprite,                                                                               //Helpers.NiceIcons(15),
                                                      FeatureGroup.Feat);

            //,PrerequisiteCharacterLevelExact.Create(1)
            //feat.AddComponents(ElementalWeaknesChoiceFeature);
            //noFeature.Feature = feat;

            /*
             * foreach (var choice in SpellschoolChoiceFeature)
             * {
             *  Log.Write(choice.Name);
             *  Log.Write(choice.Description);
             * }*/
            feat.SetFeatures(SpellschoolChoiceFeature);


            //feat.AddComponents(ikweethetniet);
            //components.AddRange(ikweethetniet);

            return(feat);
        }
Beispiel #9
0
        static void createEidolonProgression()
        {
            outsider.HideInCharacterSheetAndLevelUp = true;
            outsider.HideInUI = true;
            //devotion
            //evasion
            //natural armor
            //str/dex increase
            //improved evasion

            devotion = library.CopyAndAdd <BlueprintFeature>("226f939b7dfd47b4697ec52f79799012", "EidolonDevotionFeature", "");
            devotion.SetDescription("An eidolon gains a +4 morale bonus on Will saves against enchantment spells and effects.");
            var evasion = library.CopyAndAdd <BlueprintFeature>("815bec596247f9947abca891ef7f2ca8", "EidolonEvasionFeature", "");

            evasion.SetDescription("If the eidolon is subjected to an attack that normally allows a Reflex save for half damage, it takes no damage if it succeeds at its saving throw.");
            var improved_evasion = library.CopyAndAdd <BlueprintFeature>("bcb37922402e40d4684e7fb7e001d110", "EidolonImprovedEvasionFeature", "");

            improved_evasion.SetDescription("When subjected to an attack that allows a Reflex saving throw for half damage, an eidolon takes no damage if it succeeds at its saving throw and only half damage if it fails.");

            var natural_armor = library.CopyAndAdd <BlueprintFeature>("0d20d88abb7c33a47902bd99019f2ed1", "EidolonNaturalArmorFeature", "");

            natural_armor.SetNameDescription("Armor Bonus",
                                             "Eidolon receives bonuses to their natural armor. An eidolon cannot wear armor of any kind, as the armor interferes with the summoner’s connection to the eidolon.");
            var str_dex_bonus = library.CopyAndAdd <BlueprintFeature>("0c80276018694f24fbaf59ec7b841f2b", "EidolonStrDexIncreaseFeature", "");

            str_dex_bonus.SetNameDescription("Physical Prowess", "Eidolon receives +1 bonus to their Strength and Dexterity.");

            createExtraClassSkill();
            eidolon_progression = Helpers.CreateProgression("EidolonProgression",
                                                            eidolon_class.Name,
                                                            eidolon_class.Description,
                                                            "",
                                                            eidolon_class.Icon,
                                                            FeatureGroup.None);
            eidolon_progression.Classes = new BlueprintCharacterClass[] { eidolon_class };

            var bonus_feat = library.Get <BlueprintFeatureSelection>("247a4068296e8be42890143f451b4b45");

            eidolon_progression.LevelEntries = new LevelEntry[] { Helpers.LevelEntry(1, outsider,
                                                                                     library.Get <BlueprintFeature>("d3e6275cfa6e7a04b9213b7b292a011c"),  // ray calculate feature
                                                                                     library.Get <BlueprintFeature>("62ef1cdb90f1d654d996556669caf7fa"),  //touch calculate feature
                                                                                     library.Get <BlueprintFeature>("0aeba56961779e54a8a0f6dedef081ee")), //inside the storm
                                                                  Helpers.LevelEntry(2, natural_armor, evasion, str_dex_bonus, extra_class_skills, extra_class_skills, bonus_feat),
                                                                  Helpers.LevelEntry(3),
                                                                  Helpers.LevelEntry(4, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(5, devotion),
                                                                  Helpers.LevelEntry(6, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(7),
                                                                  Helpers.LevelEntry(8, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(9, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(10),
                                                                  Helpers.LevelEntry(11, improved_evasion),
                                                                  Helpers.LevelEntry(12, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(13, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(14),
                                                                  Helpers.LevelEntry(15, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(16),
                                                                  Helpers.LevelEntry(17),
                                                                  Helpers.LevelEntry(18),
                                                                  Helpers.LevelEntry(19),
                                                                  Helpers.LevelEntry(20) };


            eidolon_progression.UIGroups = new UIGroup[]  { Helpers.CreateUIGroup(evasion, devotion, improved_evasion),
                                                            Helpers.CreateUIGroup(natural_armor),
                                                            Helpers.CreateUIGroup(str_dex_bonus), };
        }
Beispiel #10
0
        static void createEidolonProgression()
        {
            outsider.HideInCharacterSheetAndLevelUp = true;
            outsider.HideInUI = true;
            //devotion
            //evasion
            //natural armor
            //str/dex increase
            //improved evasion


            multi_attack = Helpers.CreateFeature("MultiAttackFeature",
                                                 "Multiattack",
                                                 "The creature reduces secondary attacks penalty to -2 if it has 3 or more natural attacks. If it does not have the requisite 3 or more natural attacks (or it is reduced to less than 3 attacks), the creature instead gains a second attack with one of its natural weapons, albeit at a –5 penalty.",
                                                 "",
                                                 null,
                                                 FeatureGroup.Feat,
                                                 Helpers.Create <CompanionMechanics.MultiAttack>(),
                                                 Helpers.PrerequisiteStatValue(StatType.BaseAttackBonus, 6)
                                                 );
            library.AddFeats(multi_attack);

            devotion = library.CopyAndAdd <BlueprintFeature>("226f939b7dfd47b4697ec52f79799012", "EidolonDevotionFeature", "");
            devotion.SetDescription("An eidolon gains a +4 morale bonus on Will saves against enchantment spells and effects.");
            var evasion = library.CopyAndAdd <BlueprintFeature>("815bec596247f9947abca891ef7f2ca8", "EidolonEvasionFeature", "");

            evasion.SetDescription("If the eidolon is subjected to an attack that normally allows a Reflex save for half damage, it takes no damage if it succeeds at its saving throw.");
            var improved_evasion = library.CopyAndAdd <BlueprintFeature>("bcb37922402e40d4684e7fb7e001d110", "EidolonImprovedEvasionFeature", "");

            improved_evasion.SetDescription("When subjected to an attack that allows a Reflex saving throw for half damage, an eidolon takes no damage if it succeeds at its saving throw and only half damage if it fails.");

            var natural_armor = library.CopyAndAdd <BlueprintFeature>("0d20d88abb7c33a47902bd99019f2ed1", "EidolonNaturalArmorFeature", "");

            natural_armor.SetNameDescription("Armor Bonus",
                                             "Eidolon receives bonuses to their natural armor. An eidolon cannot wear armor of any kind, as the armor interferes with the summoner’s connection to the eidolon.");
            var str_dex_bonus = library.CopyAndAdd <BlueprintFeature>("0c80276018694f24fbaf59ec7b841f2b", "EidolonStrDexIncreaseFeature", "");

            str_dex_bonus.SetNameDescription("Physical Prowess", "Eidolon receives +1 bonus to their Strength and Dexterity.");

            createExtraClassSkill();
            eidolon_progression = Helpers.CreateProgression("EidolonProgression",
                                                            eidolon_class.Name,
                                                            eidolon_class.Description,
                                                            "",
                                                            eidolon_class.Icon,
                                                            FeatureGroup.None);
            eidolon_progression.Classes = new BlueprintCharacterClass[] { eidolon_class };

            var bonus_feat = library.Get <BlueprintFeatureSelection>("247a4068296e8be42890143f451b4b45");

            eidolon_progression.LevelEntries = new LevelEntry[] { Helpers.LevelEntry(1, outsider,
                                                                                     library.Get <BlueprintFeature>("d3e6275cfa6e7a04b9213b7b292a011c"),  // ray calculate feature
                                                                                     library.Get <BlueprintFeature>("62ef1cdb90f1d654d996556669caf7fa"),  //touch calculate feature
                                                                                     library.Get <BlueprintFeature>("0aeba56961779e54a8a0f6dedef081ee")), //inside the storm
                                                                  Helpers.LevelEntry(2, natural_armor, evasion, str_dex_bonus, extra_class_skills, extra_class_skills, bonus_feat),
                                                                  Helpers.LevelEntry(3),
                                                                  Helpers.LevelEntry(4, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(5, devotion),
                                                                  Helpers.LevelEntry(6, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(7, multi_attack),
                                                                  Helpers.LevelEntry(8, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(9, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(10),
                                                                  Helpers.LevelEntry(11, improved_evasion),
                                                                  Helpers.LevelEntry(12, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(13, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(14),
                                                                  Helpers.LevelEntry(15, natural_armor, str_dex_bonus),
                                                                  Helpers.LevelEntry(16),
                                                                  Helpers.LevelEntry(17),
                                                                  Helpers.LevelEntry(18),
                                                                  Helpers.LevelEntry(19),
                                                                  Helpers.LevelEntry(20) };


            eidolon_progression.UIGroups = new UIGroup[]  { Helpers.CreateUIGroup(evasion, devotion, multi_attack, improved_evasion),
                                                            Helpers.CreateUIGroup(natural_armor),
                                                            Helpers.CreateUIGroup(str_dex_bonus), };

            var animal_companion_archetype = library.Get <BlueprintArchetype>("9f8a232fbe435a9458bf64c3024d7bee");

            foreach (var le in animal_companion_archetype.AddFeatures)
            {
                if (le.Level == 8)
                {
                    le.Features.Add(multi_attack);
                }
            }
        }
        static void createFavoredTerrain()
        {
            favored_terrain = library.CopyAndAdd <BlueprintFeature>("c657b9b7ebab46541b5992cfa7a0e1ef", "HinterlanderFavoredTerrain", "");
            favored_terrain.SetDescription("The hinterlander gains a +2 bonus on initiative checks and Lore (Nature), Perception, and Stealth skill checks when he is in plains.\nAt 9th level these bonuses increase to +4.");

            var eagle_splendor   = library.Get <BlueprintAbility>("446f7bf201dc1934f96ac0a26e324803");
            var choosen_kin_buff = Helpers.CreateBuff("HinterlanderChoosenKinBuff",
                                                      "Choosen Kin",
                                                      "At 4th level, hinterlander provides half of her favored terrain bonus to all her allies within 30 ft. At 7th level, the range increases to 60 feet.",
                                                      "",
                                                      eagle_splendor.Icon,
                                                      null,
                                                      Helpers.Create <NewMechanics.FavoredTerrainBonus>(f =>
            {
                f.Settings = favored_terrain.GetComponent <FavoredTerrain>().Settings;
                f.Value    = Helpers.CreateContextValue(AbilityRankType.StatBonus);
            }
                                                                                                        ),
                                                      Helpers.CreateContextRankConfig(baseValueType: ContextRankBaseValueType.ClassLevel, classes: getHinterlanderArray(),
                                                                                      progression: ContextRankProgression.OnePlusDivStep, stepLevel: 9, type: AbilityRankType.StatBonus)
                                                      );

            int[] ranges = new int[] { 30, 60 };
            BlueprintFeature[] choosen_kin_features = new BlueprintFeature[ranges.Length];

            for (int i = 0; i < ranges.Length; i++)
            {
                var area = library.CopyAndAdd <BlueprintAbilityAreaEffect>("7ced0efa297bd5142ab749f6e33b112b", $"HinterlanderChoosenKin{i+1}Area", "");
                area.Size = ranges[i].Feet();
                area.ReplaceComponent <AbilityAreaEffectBuff>(a =>
                {
                    a.Buff      = choosen_kin_buff;
                    a.Condition = Helpers.CreateConditionsCheckerAnd(Helpers.Create <ContextConditionIsAlly>(), Common.createContextConditionIsCaster(not: true));
                }
                                                              );

                var effect_buff = Helpers.CreateBuff($"HinterlanderChoosenKinEffect{i + 1}Buff",
                                                     "",
                                                     "",
                                                     "",
                                                     null,
                                                     null,
                                                     Common.createAddAreaEffect(area)
                                                     );
                effect_buff.SetBuffFlags(BuffFlags.HiddenInUi);

                choosen_kin_features[i] = Helpers.CreateFeature($"HinterlanderChoosenKin{i+1}Feature",
                                                                "",
                                                                "",
                                                                "",
                                                                null,
                                                                FeatureGroup.None,
                                                                Common.createAuraFeatureComponent(effect_buff)
                                                                );
                choosen_kin_features[i].HideInUI = true;
            }


            choosen_kin = Helpers.CreateFeature("HinterlanderChoosenKinFeature",
                                                choosen_kin_buff.Name,
                                                choosen_kin_buff.Description,
                                                "",
                                                choosen_kin_buff.Icon,
                                                FeatureGroup.None,
                                                Helpers.CreateAddFeatureOnClassLevel(choosen_kin_features[0], 7, getHinterlanderArray(), new BlueprintArchetype[0], true),
                                                Helpers.CreateAddFeatureOnClassLevel(choosen_kin_features[1], 7, getHinterlanderArray(), new BlueprintArchetype[0])
                                                );
        }