private LevelUpController AddLevel(UnitDescriptor unit, Dictionary <SelectionEntry, HashSet <int> > selectionsHistory, HashSet <int> spellHistory) { LevelUpController levelUpController = LevelUpController.Start(unit, true, null, null, LevelUpState.CharBuildMode.LevelUp); if (levelUpController.State.CanSelectRace) { BlueprintRace race = unit.Progression.Race; DefaultBuildData data = ElementsContext.GetData <DefaultBuildData>(); if (data != null) { race = data.Race; } if (race != null) { levelUpController.SelectRace(race); } } if (levelUpController.State.CanSelectRaceStat) { levelUpController.SelectRaceStat(instance.RaceStat); } this.ApplyStatsDistributionPreset(levelUpController); if (unit.Progression.GetClassLevel(instance.CharacterClass) <= 0) { foreach (BlueprintArchetype archetype in instance.Archetypes) { levelUpController.AddArchetype(instance.CharacterClass, archetype); } } levelUpController.SelectClass(instance.CharacterClass, false); levelUpController.ApplyClassMechanics(); this.PerformSelections(levelUpController, selectionsHistory, new LevelUpActionPriority?(LevelUpActionPriority.ReplaceSpellbook)); levelUpController.ApplySpellbook(); while (levelUpController.State.AttributePoints > 0 && instance.LevelsStat.IsAttribute()) { levelUpController.SpendAttributePoint(instance.LevelsStat); } this.PerformSelections(levelUpController, selectionsHistory, new LevelUpActionPriority?(LevelUpActionPriority.ApplySkillPoints)); levelUpController.ApplySkillPoints(); while (levelUpController.State.SkillPointsRemaining > 0) { int skillPointsRemaining = levelUpController.State.SkillPointsRemaining; foreach (StatType skill in instance.Skills) { if (levelUpController.State.SkillPointsRemaining <= 0) { break; } levelUpController.SpendSkillPoint(skill); } if (skillPointsRemaining == levelUpController.State.SkillPointsRemaining) { break; } } this.PerformSelections(levelUpController, selectionsHistory, null); this.PerformSpellSelections(levelUpController, spellHistory); return(levelUpController); }