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); }
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); }
//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); }
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; }