static BlueprintFeature Manipulative()
        {
            var manipulative = ScriptableObject.CreateInstance <BlueprintFeature>();
            var addBluffStat = ScriptableObject.CreateInstance <AddStatBonus>();

            addBluffStat.name       = "CustomRaceStat";
            addBluffStat.Descriptor = Kingmaker.Enums.ModifierDescriptor.Racial;
            addBluffStat.Stat       = Kingmaker.EntitySystem.Stats.StatType.CheckBluff;
            addBluffStat.Value      = 2;
            var addPerceptionStat = ScriptableObject.CreateInstance <AddStatBonus>();

            addPerceptionStat.name       = "CustomRaceStat";
            addPerceptionStat.Descriptor = Kingmaker.Enums.ModifierDescriptor.Racial;
            addPerceptionStat.Stat       = Kingmaker.EntitySystem.Stats.StatType.CheckBluff;
            addPerceptionStat.Value      = 2;
            manipulative.ComponentsArray = new BlueprintComponent[]
            {
                addBluffStat,
                addPerceptionStat,
            };
            manipulative.name = "Manipulative";
            Traverse.Create(manipulative).Field("m_DisplayName").SetValue(BlueprintUtil.MakeLocalized("Manipulative"));
            Traverse.Create(manipulative).Field("m_Description").SetValue(BlueprintUtil.MakeLocalized("Dhampir gain a +2 racial bonus on Bluff and Perception checks."));
            BlueprintUtil.AddBlueprint(manipulative, "6480bda61617490ca18e3ecb068e74bf");
            return(manipulative);
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer szr)
        {
            JObject jObject    = JObject.Load(reader);
            var     name       = (string)jObject["name"];
            var     typeName   = (string)jObject["$type"];
            var     realType   = Type.GetType(typeName);
            var     settings   = JsonBlueprints.CreateSettings(realType);
            var     serializer = JsonSerializer.Create(settings);
            BlueprintScriptableObject result = null;

            if (jObject["$append"] != null)
            {
                serializer.ObjectCreationHandling = ObjectCreationHandling.Reuse;
                var copy = (string)jObject["$append"];
                jObject.Remove("$append");
                var parts = copy.Split(':');
                result = ResourcesLibrary.TryGetBlueprint(parts[1]);
                name   = result.name;
                Main.DebugLog($"Appending to {result.name}");
            }
            if (jObject["$replace"] != null)
            {
                var copy = (string)jObject["$replace"];
                jObject.Remove("$replace");
                var parts = copy.Split(':');
                result = ResourcesLibrary.TryGetBlueprint(parts[1]);
                name   = result.name;
                Main.DebugLog($"replacing to {result.name}");
            }
            if (jObject["$copy"] != null)
            {
                var copy = (string)jObject["$copy"];
                jObject.Remove("$copy");
                var parts    = copy.Split(':');
                var resource = ResourcesLibrary.TryGetBlueprint(parts[1]);
                result = (BlueprintScriptableObject)BlueprintUtil.ShallowClone(resource);
                Main.DebugLog($"Copying {resource.name}");
            }
            if (name == null)
            {
                throw new System.Exception("Missing name");
            }
            if (JsonBlueprints.Blueprints.ContainsKey(name))
            {
                //throw new System.Exception("Cannot create blueprint twice");
            }
            if (result == null)
            {
                result = ScriptableObject.CreateInstance(realType) as BlueprintScriptableObject;
            }
            JsonBlueprints.Blueprints[name] = result;
            BlueprintUtil.AddBlueprint(result, name);
            serializer.Populate(jObject.CreateReader(), result);
            return(result);
        }
        static BlueprintFeatureBase SlayerTalent()
        {
            var slayerTalent = ScriptableObject.CreateInstance <BlueprintFeatureSelection>();

            slayerTalent.Group = FeatureGroup.RogueTalent;
            slayerTalent.name  = "SlayerTalent";
            var rogueTalent = ResourcesLibrary.TryGetBlueprint <BlueprintFeatureSelection>("b78d146cea711a84598f0acef69462ea");

            //var sprite = Traverse.Create(rogueTalent).Field("m_Icon").GetValue<Sprite>();
            //Traverse.Create(slayerTalent).Field("m_Icon").SetValue(sprite);
            Traverse.Create(slayerTalent).Field("m_DisplayName").SetValue(BlueprintUtil.MakeLocalized("Slayer Talent"));
            Traverse.Create(slayerTalent).Field("m_Description").SetValue(BlueprintUtil.MakeLocalized("As a slayer gains experience, he learns a number of talents that aid him and confound his foes. Starting at 2nd level and every 2 levels thereafter, a slayer gains one slayer talent. Unless otherwise noted, a slayer cannot select an individual talent more than once."));
            slayerTalent.AllFeatures = new BlueprintFeature[]
            {
                //TODO
                //Blood Reader
                //Deadly Range
                //Foil Scrutiny
                //Poison Use
                //Ranger Combat Style
                //Rogue Talent
                //Slowing Strike*
                //Sticks and Stones (Ex)
                //Studied Ally
                //Sunlight Strike (Ex)
                //Sure Footing (Ex)
                //Toxin Training (Ex)
                ResourcesLibrary.TryGetBlueprint <BlueprintFeatureSelection>("c6d0da9124735a44f93ac31df803b9a9"), //RangerStyleSelection2
                ResourcesLibrary.TryGetBlueprint <BlueprintFeatureSelection>("61f82ba786fe05643beb3cd3910233a8"), //RangerStyleSelection6
                ResourcesLibrary.TryGetBlueprint <BlueprintFeatureSelection>("78177315fc63b474ea3cbb8df38fafcd"), //RangerStyleSelection10
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("dbb6b3bffe6db3547b31c3711653838e"),          //Trapfinding
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("68a23a419b330de45b4c3789649b5b41"),          //CannyObserver
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("c5158a6622d0b694a99efb1d0025d2c1"),          //CombatTrick,
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("97a6aa2b64dd21a4fac67658a91067d7"),          // FastStealth
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("955ff81c596c1c3489406d03e81e6087"),          // FocusingAttackConfused,
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("791f50e199d069d4f8e933996a2ce054"),          //FocusingAttackShaken,
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("79475c263e538c94f8e23907bd570a35"),          //FocusingAttackSicken
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("6087e0c9801b5eb48bf48d6e75116aad"),          //IronGuts
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("7787030571e87704d9177401c595408e"),          //SlowRections
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("ca5274d057152fa45b7527cad0927840"),          //UncannyDodgeTalent,
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("ce72662a812b1f242849417b2c784b5e"),          //ConfoundingBlades,
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("b696bd7cb38da194fa3404032483d1db"),          //CripplingStrike
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("1b92146b8a9830d4bb97ab694335fa7c"),          //DispellingAttack
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("dd699394df0ef8847abba26038333f02"),          //DoubleDelibitation
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("0d35d6c4d5eef8d4790d09bd9a874e57"),          //ImprovedEvasion
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("e821c61b2711cea4cb993725b910e7e8"),          //ImprovedUncannyDodgeTalent
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("5bb6dc5ce00550441880a6ff8ad4c968"),          //Oppotunist
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("d76497bfc48516e45a0831628f767a0f"),          //IntimidatingProwess
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("c9629ef9eebb88b479b2fbc5e836656a"),          //SkillFocusSelection
                ResourcesLibrary.TryGetBlueprint <BlueprintFeature>("1e1f627d26ad36f43bbd26cc2bf8ac7e"),          //WeaponFocus
            };
            BlueprintUtil.AddBlueprint(slayerTalent, "efc3ce27f70e4487b280272580d601e9");
            return(slayerTalent);
        }
        public static void CopyProgression(BlueprintCharacterClass newClass, BlueprintProgression oldProgression)
        {
            BlueprintProgression newProgression = ScriptableObject.CreateInstance <BlueprintProgression>();

            newProgression.Classes              = new BlueprintCharacterClass[] { newClass };
            newProgression.ComponentsArray      = oldProgression.ComponentsArray;
            newProgression.ExclusiveProgression = newClass;
            newProgression.Groups               = oldProgression.Groups;
            newProgression.LevelEntries         = oldProgression.LevelEntries;
            newProgression.name                 = "Custom_" + oldProgression.name;
            newProgression.Ranks                = oldProgression.Ranks;
            newProgression.UIDeterminatorsGroup = newClass.Progression.LevelEntries[0].Features.ToArray();
            newProgression.UIGroups             = new UIGroup[0];
            newClass.Progression                = newProgression;
            BlueprintUtil.AddBlueprint(newProgression, "376e3fa3a4994cb5a6626d93e63d57e6");
        }
        public static BlueprintCharacterClass CreateClass()
        {
            var newClass = ScriptableObject.CreateInstance <BlueprintCharacterClass>();
            var rogue    = ResourcesLibrary.TryGetBlueprint <BlueprintCharacterClass>("299aa766dee3cbf4790da4efb8c72484");

            newClass.LocalizedName        = BlueprintUtil.MakeLocalized("Ninja");
            newClass.LocalizedDescription = BlueprintUtil.MakeLocalized("When the wealthy and the powerful need an enemy eliminated quietly and without fail, they call upon the ninja. When a general needs to sabotage the siege engines of his foes before they can reach the castle walls, he calls upon the ninja. And when fools dare to move against a ninja or her companions, they will find the ninja waiting for them while they sleep, ready to strike. These shadowy killers are masters of infiltration, sabotage, and assassination, using a wide variety of weapons, practiced skills, and mystical powers to achieve their goals.");
            //Archtypes cannot be duplicated accross classes because breats BlueprintArchetype.GetParentClass()
            //newClass.Archetypes = rogue.Archetypes;
            newClass.Archetypes              = new BlueprintArchetype[0];
            newClass.BaseAttackBonus         = rogue.BaseAttackBonus;
            newClass.ClassSkills             = rogue.ClassSkills;
            newClass.ComponentsArray         = rogue.ComponentsArray;
            newClass.DefaultBuild            = rogue.DefaultBuild;
            newClass.EquipmentEntities       = rogue.EquipmentEntities;
            newClass.FemaleEquipmentEntities = rogue.FemaleEquipmentEntities;
            newClass.FortitudeSave           = rogue.FortitudeSave;
            newClass.HideIfRestricted        = rogue.HideIfRestricted;
            newClass.HitDie                = rogue.HitDie;
            newClass.IsArcaneCaster        = rogue.IsArcaneCaster;
            newClass.IsArcaneCaster        = rogue.IsDivineCaster;
            newClass.MaleEquipmentEntities = rogue.MaleEquipmentEntities;
            newClass.m_Icon                = rogue.m_Icon;
            newClass.name = "NinjaClass";
            newClass.NotRecommendedAttributes = rogue.NotRecommendedAttributes;
            newClass.PrestigeClass            = rogue.PrestigeClass;
            newClass.PrimaryColor             = rogue.PrimaryColor;
            newClass.Progression           = rogue.Progression;
            newClass.RecommendedAttributes = rogue.RecommendedAttributes;
            newClass.ReflexSave            = rogue.ReflexSave;
            newClass.SecondaryColor        = rogue.SecondaryColor;
            newClass.SkillPoints           = rogue.SkillPoints;
            newClass.Spellbook             = rogue.Spellbook;
            newClass.StartingGold          = rogue.StartingGold;
            newClass.StartingItems         = rogue.StartingItems;
            newClass.WillSave = rogue.WillSave;
            BlueprintUtil.AddBlueprint(newClass, "7b9c8a62205d44cf8d1021ed0f4bf2da");
            //Note set progression parent ot newClass
            CopyProgression(newClass, rogue.Progression);
            //BlueprintPgoression.ExclusiveProgression = newClass
            //Check for Prerequisites that contain classblueprints
            return(newClass);
        }
Beispiel #6
0
        static public BlueprintRace CopyRace(BlueprintRace original, string newID = null)
        {
            var newRace = ScriptableObject.CreateInstance <BlueprintRace>();

            if (newID == null)
            {
                newID = original.AssetGuid;
            }
            BlueprintUtil.AddBlueprint(newRace, newID);
            newRace.RaceId              = original.RaceId;
            newRace.SoundKey            = original.SoundKey;
            newRace.SelectableRaceStat  = original.SelectableRaceStat;
            newRace.MaleSpeedSettings   = original.MaleSpeedSettings;
            newRace.FemaleSpeedSettings = original.FemaleSpeedSettings;
            newRace.MaleOptions         = CopyCustomisationOptions(original.MaleOptions, newID + "MaleOptions");
            newRace.FemaleOptions       = CopyCustomisationOptions(original.FemaleOptions, newID + "FemaleOptions");
            newRace.Presets             = CopyPresets(original, newID + "Presets");
            newRace.Features            = (BlueprintFeatureBase[])original.Features.Clone();
            return(newRace);
        }
Beispiel #7
0
        //TODO make spellResistance6plusCR
        static BlueprintFeatureBase SpellResistance()
        {
            var blueprints             = ResourcesLibrary.LibraryObject.BlueprintsByAssetId;
            var spellResistance5plusCR = (BlueprintFeature)blueprints["2378680aaca855840ba325c509f5d654"];
            var spellResistance6plusCR = ScriptableObject.CreateInstance <BlueprintFeature>();
            var addSpellResistance     = ScriptableObject.CreateInstance <AddSpellResistance>();

            addSpellResistance.AddCR = true;
            addSpellResistance.Value = new Kingmaker.UnitLogic.Mechanics.ContextValue()
            {
                Value = 6
            };
            spellResistance6plusCR.ComponentsArray = new BlueprintComponent[]
            {
                addSpellResistance
            };
            spellResistance6plusCR.name = "SpellResistance6plusCR";
            Traverse.Create(spellResistance6plusCR).Field("m_DisplayName").SetValue(BlueprintUtil.MakeLocalized("Spell Resistance"));
            Traverse.Create(spellResistance6plusCR).Field("m_Description").SetValue(BlueprintUtil.MakeLocalized("Drow possess spell resistance (SR) equal to 6 plus their total number of class levels."));
            BlueprintUtil.AddBlueprint(spellResistance6plusCR, "94cb101bb5e944bea2e1777e6627dc5c");
            return(spellResistance6plusCR);
        }
        public static BlueprintCharacterClass CreateClass()
        {
            var ranger          = ResourcesLibrary.TryGetBlueprint <BlueprintCharacterClass>("cda0615668a6df14eb36ba19ee881af6");
            var rogue           = ResourcesLibrary.TryGetBlueprint <BlueprintCharacterClass>("299aa766dee3cbf4790da4efb8c72484");
            var newClass        = ScriptableObject.CreateInstance <BlueprintCharacterClass>();
            var preRequeNoClass = ScriptableObject.CreateInstance <PrerequisiteNoClassLevel>(); //Slayer can't be AnimalClass

            preRequeNoClass.CharacterClass = ResourcesLibrary.TryGetBlueprint <BlueprintCharacterClass>("4cd1757a0eea7694ba5c933729a53920");
            newClass.ComponentsArray       = new BlueprintComponent[] { preRequeNoClass };
            newClass.name                 = "SlayerClass";
            newClass.LocalizedName        = BlueprintUtil.MakeLocalized("Slayer");
            newClass.LocalizedDescription = BlueprintUtil.MakeLocalized("Skilled at tracking down targets, slayers are consummate hunters, living for the chase and the deadly stroke that brings it to a close. Slayers spend most of their time honing their weapon skills, studying the habits and anatomy of foes, and practicing combat maneuvers.");
            newClass.HitDie               = Kingmaker.RuleSystem.DiceType.D10;
            newClass.SkillPoints          = 4;
            newClass.BaseAttackBonus      = ranger.BaseAttackBonus;
            newClass.FortitudeSave        = ranger.FortitudeSave;
            newClass.ReflexSave           = ranger.ReflexSave;
            newClass.WillSave             = ranger.WillSave;
            newClass.Archetypes           = new BlueprintArchetype[0]; //No Archtypes
            newClass.ClassSkills          = new StatType[]
            {
                StatType.SkillMobility,
                StatType.SkillAthletics,
                StatType.SkillPersuasion,
                StatType.SkillPerception,
                StatType.SkillStealth,
                StatType.SkillKnowledgeWorld
            };
            SetupClassApperance(newClass, rogue, ranger);
            SetupProgression(newClass);
            newClass.StartingGold          = 411;
            newClass.StartingItems         = new Kingmaker.Blueprints.Items.BlueprintItem[] { };
            newClass.RecommendedAttributes = new StatType[] { StatType.Dexterity };
            //newClass.DefaultBuild = rogue.DefaultBuild;
            BlueprintUtil.AddBlueprint(newClass, "38e7361d138f4a04bf03659e4204543e");
            BlueprintUtil.AddBlueprint(newClass.Progression, "d6bdd34d8f8f4295b6433a201c8e0605");
            return(newClass);
        }
Beispiel #9
0
        static BlueprintRaceVisualPreset[] CopyPresets(BlueprintRace original, string prevGUID)
        {
            var newPresets = new BlueprintRaceVisualPreset[original.Presets.Length];

            for (int i = 0; i < original.Presets.Length; i++)
            {
                newPresets[i] = ScriptableObject.CreateInstance <BlueprintRaceVisualPreset>();
                var presetAssetGUID = GetDeterministicAssetID(prevGUID);
                BlueprintUtil.AddBlueprint(newPresets[i], presetAssetGUID);
                //RaceManager.assets[presetAssetGUID] = newPresets[i];
                newPresets[i].RaceId         = original.Presets[i].RaceId;
                newPresets[i].MaleSkeleton   = original.Presets[i].MaleSkeleton;
                newPresets[i].FemaleSkeleton = original.Presets[i].FemaleSkeleton;
                newPresets[i].Skin           = ScriptableObject.CreateInstance <KingmakerEquipmentEntity>();
                var maleSkin   = CopyLinks(original.Presets[i].Skin.GetLinks(Gender.Male, original.RaceId), presetAssetGUID + "MaleSalt");
                var femaleSkin = CopyLinks(original.Presets[i].Skin.GetLinks(Gender.Female, original.RaceId), presetAssetGUID + "FemaleSalt");
                Traverse.Create(newPresets[i].Skin).Field("m_RaceDependent").SetValue(false);
                Traverse.Create(newPresets[i].Skin).Field("m_MaleArray").SetValue(maleSkin);
                Traverse.Create(newPresets[i].Skin).Field("m_FemaleArray").SetValue(femaleSkin);
                prevGUID = presetAssetGUID;
            }
            return(newPresets);
        }
        static void SetupProgression(BlueprintCharacterClass newClass)
        {
            var progression = ScriptableObject.CreateInstance <BlueprintProgression>();

            progression.name = "SlayerProgression";
            //progression.Archetypes = new BlueprintArchetype[0];
            progression.Classes = new BlueprintCharacterClass[] { newClass };
            progression.ExclusiveProgression = newClass;
            progression.LevelEntries         = new LevelEntry[20];
            //progression.Description
            //Progression.Name
            var slayerTalent = SlayerTalent();
            List <List <string> > features = new List <List <string> >();

            features.Capacity = 20;
            for (int i = 0; i < features.Capacity; i++)
            {
                features.Add(new List <string>());
            }
            features[0].Add("c5e479367d07d62428f2fe92f39c0341");  //RangerProficiencies TODO: Clone and change name
            features[0].Add("16cc2c937ea8d714193017780e7d4fc6");  //FavoriteEnemySelection TODO: Make Studied Target
            features[1].Add(slayerTalent.AssetGuid);              //SlayerTalent
            features[2].Add("9b9eac6709e1c084cb18c3a366e0ec87");  //SneakAttack
            features[3].Add(slayerTalent.AssetGuid);              //SlayerTalent
            features[4].Add("16cc2c937ea8d714193017780e7d4fc6");  //FavoriteEnemySelection TODO: Make Studied Target
            features[4].Add("c1be13839472aad46b152cf10cf46179");  //FavoriteEnemyRankUp TODO: Make Studied Target
            features[5].Add(slayerTalent.AssetGuid);              //SlayerTalent
            features[5].Add("9b9eac6709e1c084cb18c3a366e0ec87");  //SneakAttack
            features[6].Add("c7e1d5ef809325943af97f093e149c4f");  //Stealthy TODO: Make Stalker talent
            features[7].Add(slayerTalent.AssetGuid);              //SlayerTalent
            features[8].Add("9b9eac6709e1c084cb18c3a366e0ec87");  //SneakAttack
            features[9].Add("16cc2c937ea8d714193017780e7d4fc6");  //FavoriteEnemySelection TODO: Make Studied Target
            features[9].Add("c1be13839472aad46b152cf10cf46179");  //FavoriteEnemyRankUp TODO: Make Studied Target
            features[9].Add(slayerTalent.AssetGuid);              //SlayerTalent
            features[9].Add("a33b99f95322d6741af83e9381b2391c");  //AdvanceTalents TODO: Make Advanced Slayer Talent
            features[10].Add("97a6aa2b64dd21a4fac67658a91067d7"); //FastStealth TODO: Make Swift Tracker
            features[11].Add(slayerTalent.AssetGuid);             //SlayerTalent
            features[11].Add("16cc2c937ea8d714193017780e7d4fc6"); //FavoriteEnemySelection TODO: Make Studied Target
            features[11].Add("c1be13839472aad46b152cf10cf46179"); //FavoriteEnemyRankUp TODO: Make Studied Target
            features[11].Add("9b9eac6709e1c084cb18c3a366e0ec87"); //SneakAttack
            features[12].Add("7df32d4e9bd2cdc48b0f69b03a57754a"); //SwiftFootFeature TODO replace with Slayer’s Advance
            features[13].Add("385260ca07d5f1b4e907ba22a02944fc"); //Quarry
            features[13].Add(slayerTalent.AssetGuid);             //SlayerTalent
            features[14].Add("16cc2c937ea8d714193017780e7d4fc6"); //FavoriteEnemySelection TODO: Make Studied Target
            features[14].Add("c1be13839472aad46b152cf10cf46179"); //FavoriteEnemyRankUp TODO: Make Studied Target
            features[14].Add("9b9eac6709e1c084cb18c3a366e0ec87"); //SneakAttack
            features[15].Add(slayerTalent.AssetGuid);             //SlayerTalent
            features[16].Add("7df32d4e9bd2cdc48b0f69b03a57754a"); //SwiftFootFeature TODO replace with Slayer’s Advance
            features[17].Add(slayerTalent.AssetGuid);             //SlayerTalent
            features[17].Add("9b9eac6709e1c084cb18c3a366e0ec87"); //SneakAttack
            features[18].Add("25e009b7e53f86141adee3a1213af5af"); //Improved Quary
            features[19].Add("16cc2c937ea8d714193017780e7d4fc6"); //FavoriteEnemySelection TODO: Make Studied Target
            features[19].Add("c1be13839472aad46b152cf10cf46179"); //FavoriteEnemyRankUp TODO: Make Studied Target
            features[19].Add("9d53ef63441b5d84297587d75f72fc17"); //MasterHunter TODO: Make Master Slayer
            features[19].Add("72dcf1fb106d5054a81fd804fdc168d3"); //MasterStrike TODO: Make Master Slayer
            features[19].Add(slayerTalent.AssetGuid);             //SlayerTalent
            for (int i = 0; i < features.Count; i++)
            {
                progression.LevelEntries[i]       = new LevelEntry();
                progression.LevelEntries[i].Level = i + 1;
                foreach (var featureId in features[i])
                {
                    progression.LevelEntries[i].Features.Add(ResourcesLibrary.TryGetBlueprint <BlueprintFeatureBase>(featureId));
                }
            }
            progression.UIDeterminatorsGroup = new BlueprintFeatureBase[] {
                //RangerProficiencies
                ResourcesLibrary.TryGetBlueprint <BlueprintFeatureBase>("c5e479367d07d62428f2fe92f39c0341")
            };
            progression.UIGroups = new UIGroup[]
            {
                new UIGroup()
                {
                    Features = new BlueprintFeatureBase[]
                    {
                        //FavoriteEnemySelection
                        ResourcesLibrary.TryGetBlueprint <BlueprintFeatureBase>("16cc2c937ea8d714193017780e7d4fc6"),
                        //FavoriteEnemyRankUp
                        ResourcesLibrary.TryGetBlueprint <BlueprintFeatureBase>("c1be13839472aad46b152cf10cf46179")
                    }.ToList()
                },
                new UIGroup()
                {
                    Features = new BlueprintFeatureBase[]
                    {
                        //Quarry
                        ResourcesLibrary.TryGetBlueprint <BlueprintFeatureBase>("385260ca07d5f1b4e907ba22a02944fc"),
                        //ImprovedQuarry
                        ResourcesLibrary.TryGetBlueprint <BlueprintFeatureBase>("25e009b7e53f86141adee3a1213af5af")
                    }.ToList()
                },
            };
            BlueprintUtil.AddBlueprint(progression, "3efb832cd03c4c94a858ef8539d9ce92");
            newClass.Progression = progression;
        }