public static DaggerfallStats GetClassBaseStats(DFCareer dfClass)
        {
            DaggerfallStats stats = new DaggerfallStats();

            stats.Strength = dfClass.Strength;
            stats.Intelligence = dfClass.Intelligence;
            stats.Willpower = dfClass.Willpower;
            stats.Agility = dfClass.Agility;
            stats.Endurance = dfClass.Endurance;
            stats.Personality = dfClass.Personality;
            stats.Speed = dfClass.Speed;
            stats.Luck = dfClass.Luck;

            return stats;
        }
 public int GetStatValue(DFCareer.Stats stat)
 {
     switch (stat)
     {
         case DFCareer.Stats.Strength:
             return this.Strength;
         case DFCareer.Stats.Intelligence:
             return this.Intelligence;
         case DFCareer.Stats.Willpower:
             return this.Willpower;
         case DFCareer.Stats.Agility:
             return this.Agility;
         case DFCareer.Stats.Endurance:
             return this.Endurance;
         case DFCareer.Stats.Personality:
             return this.Personality;
         case DFCareer.Stats.Speed:
             return this.Speed;
         case DFCareer.Stats.Luck:
             return this.Luck;
         default:
             return 0;
     }
 }
 // Set some default values for testing during development
 void SetDefaultValues()
 {
     race = GetRaceTemplate(Races.Breton);
     gender = Genders.Male;
     career = DaggerfallEntity.GetClassCareerTemplate(ClassCareers.Mage);
     name = "Nameless";
     reflexes = PlayerReflexes.Average;
     workingSkills.SetDefaults();
     workingStats.SetFromCareer(career);
     faceIndex = 0;
 }
 void SetClass(DFCareer dfClass)
 {
     Setup();
     this.dfClass = dfClass;
     skillsRollout.SetClassSkills(dfClass);
 }
 public void SetFromCareer(DFCareer career)
 {
     if (career != null)
     {
         Strength = career.Strength;
         Intelligence = career.Intelligence;
         Willpower = career.Willpower;
         Agility = career.Agility;
         Endurance = career.Endurance;
         Personality = career.Personality;
         Speed = career.Speed;
         Luck = career.Luck;
     }
 }
 public int GetStatDescriptionTextID(DFCareer.Stats stat)
 {
     switch (stat)
     {
         case DFCareer.Stats.Strength:
             return 0;
         case DFCareer.Stats.Intelligence:
             return 1;
         case DFCareer.Stats.Willpower:
             return 2;
         case DFCareer.Stats.Agility:
             return 3;
         case DFCareer.Stats.Endurance:
             return 4;
         case DFCareer.Stats.Personality:
             return 5;
         case DFCareer.Stats.Speed:
             return 6;
         case DFCareer.Stats.Luck:
             return 7;
         default:
             return -1;
     }
 }
 public string GetAbbreviatedStatName(DFCareer.Stats stat)
 {
     switch (stat)
     {
         case DFCareer.Stats.Strength:
             return "STR";
         case DFCareer.Stats.Intelligence:
             return "INT";
         case DFCareer.Stats.Willpower:
             return "WIL";
         case DFCareer.Stats.Agility:
             return "AGI";
         case DFCareer.Stats.Endurance:
             return "END";
         case DFCareer.Stats.Personality:
             return "PER";
         case DFCareer.Stats.Speed:
             return "SPD";
         case DFCareer.Stats.Luck:
             return "LUC";
         default:
             return string.Empty;
     }
 }
 public static DFCareer.Stats GetPrimaryStat(DFCareer.Skills skill)
 {
     switch (skill)
     {
         case DFCareer.Skills.Medical:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Etiquette:
             return DFCareer.Stats.Personality;
         case DFCareer.Skills.Streetwise:
             return DFCareer.Stats.Personality;
         case DFCareer.Skills.Jumping:
             return DFCareer.Stats.Strength;
         case DFCareer.Skills.Orcish:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Harpy:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Giantish:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Dragonish:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Nymph:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Daedric:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Spriggan:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Centaurian:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Impish:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Lockpicking:
             return DFCareer.Stats.Intelligence;
         case DFCareer.Skills.Mercantile:
             return DFCareer.Stats.Personality;
         case DFCareer.Skills.Pickpocket:
             return DFCareer.Stats.Agility;
         case DFCareer.Skills.Stealth:
             return DFCareer.Stats.Agility;
         case DFCareer.Skills.Swimming:
             return DFCareer.Stats.Endurance;
         case DFCareer.Skills.Climbing:
             return DFCareer.Stats.Strength;
         case DFCareer.Skills.Backstabbing:
             return DFCareer.Stats.Agility;
         case DFCareer.Skills.Dodging:
             return DFCareer.Stats.Speed;
         case DFCareer.Skills.Running:
             return DFCareer.Stats.Speed;
         case DFCareer.Skills.Destruction:
             return DFCareer.Stats.Willpower;
         case DFCareer.Skills.Restoration:
             return DFCareer.Stats.Willpower;
         case DFCareer.Skills.Illusion:
             return DFCareer.Stats.Willpower;
         case DFCareer.Skills.Alteration:
             return DFCareer.Stats.Willpower;
         case DFCareer.Skills.Thaumaturgy:
             return DFCareer.Stats.Willpower;
         case DFCareer.Skills.Mysticism:
             return DFCareer.Stats.Willpower;
         case DFCareer.Skills.ShortBlade:
             return DFCareer.Stats.Agility;
         case DFCareer.Skills.LongBlade:
             return DFCareer.Stats.Agility;
         case DFCareer.Skills.HandToHand:
             return DFCareer.Stats.Agility;
         case DFCareer.Skills.Axe:
             return DFCareer.Stats.Strength;
         case DFCareer.Skills.BluntWeapon:
             return DFCareer.Stats.Strength;
         case DFCareer.Skills.Archery:
             return DFCareer.Stats.Agility;
         case DFCareer.Skills.CriticalStrike:
             return DFCareer.Stats.Agility;
         default:
             return (DFCareer.Stats)(-1);
     }
 }
 void ConfirmClassPopup_OnButtonClick(DaggerfallMessageBox sender, DaggerfallMessageBox.MessageBoxButtons messageBoxButton)
 {
     if (messageBoxButton == DaggerfallMessageBox.MessageBoxButtons.Yes)
     {
         sender.CloseWindow();
         CloseWindow();
     }
     else if (messageBoxButton == DaggerfallMessageBox.MessageBoxButtons.No)
     {
         selectedClass = null;
         sender.CancelWindow();
     }
 }
        void RemoveSkillPoint(DFCareer.Skills skill, LeftRightSpinner spinner)
        {
            // Working skill value cannot fall below rolled skill value
            int workingValue = workingSkills.GetSkillValue(skill);
            if (workingValue == startingSkills.GetSkillValue(skill))
                return;

            // Remove a point from skill and assign to pool
            spinner.Value += 1;
            workingSkills.SetSkillValue(skill, (short)(workingValue - 1));
            UpdateSkillValueLabels();
        }
        void AddSkillPoint(DFCareer.Skills skill, LeftRightSpinner spinner)
        {
            // Bonus point pool cannot fall below zero
            int workingValue = workingSkills.GetSkillValue(skill);
            if (spinner.Value == 0)
                return;

            // Remove a point from pool and assign to skill
            spinner.Value -= 1;
            workingSkills.SetSkillValue(skill, (short)(workingValue + 1));
            UpdateSkillValueLabels();
        }
        public void SetClassSkills(DFCareer dfClass)
        {
            // Set primary, major, minor skills from class template
            primarySkills[0] = dfClass.PrimarySkill1;
            primarySkills[1] = dfClass.PrimarySkill2;
            primarySkills[2] = dfClass.PrimarySkill3;
            majorSkills[0] = dfClass.MajorSkill1;
            majorSkills[1] = dfClass.MajorSkill2;
            majorSkills[2] = dfClass.MajorSkill3;
            minorSkills[0] = dfClass.MinorSkill1;
            minorSkills[1] = dfClass.MinorSkill2;
            minorSkills[2] = dfClass.MinorSkill3;
            minorSkills[3] = dfClass.MinorSkill4;
            minorSkills[4] = dfClass.MinorSkill5;
            minorSkills[5] = dfClass.MinorSkill6;

            UpdateSkillLabels();
            Reroll();
        }
 public void SetStatValue(DFCareer.Stats stat, int value)
 {
     switch (stat)
     {
         case DFCareer.Stats.Strength:
             this.Strength = value;
             break;
         case DFCareer.Stats.Intelligence:
             this.Intelligence = value;
             break;
         case DFCareer.Stats.Willpower:
             this.Willpower = value;
             break;
         case DFCareer.Stats.Agility:
             this.Agility = value;
             break;
         case DFCareer.Stats.Endurance:
             this.Endurance = value;
             break;
         case DFCareer.Stats.Personality:
             this.Personality = value;
             break;
         case DFCareer.Stats.Speed:
             this.Speed = value;
             break;
         case DFCareer.Stats.Luck:
             this.Luck = value;
             break;
     }
 }
 public short GetSkillValue(DFCareer.Skills skill)
 {
     switch (skill)
     {
         case DFCareer.Skills.Medical:
             return Medical;
         case DFCareer.Skills.Etiquette:
             return Etiquette;
         case DFCareer.Skills.Streetwise:
             return Streetwise;
         case DFCareer.Skills.Jumping:
             return Jumping;
         case DFCareer.Skills.Orcish:
             return Orcish;
         case DFCareer.Skills.Harpy:
             return Harpy;
         case DFCareer.Skills.Giantish:
             return Giantish;
         case DFCareer.Skills.Dragonish:
             return Dragonish;
         case DFCareer.Skills.Nymph:
             return Nymph;
         case DFCareer.Skills.Daedric:
             return Daedric;
         case DFCareer.Skills.Spriggan:
             return Spriggan;
         case DFCareer.Skills.Centaurian:
             return Centaurian;
         case DFCareer.Skills.Impish:
             return Impish;
         case DFCareer.Skills.Lockpicking:
             return Lockpicking;
         case DFCareer.Skills.Mercantile:
             return Mercantile;
         case DFCareer.Skills.Pickpocket:
             return Pickpocket;
         case DFCareer.Skills.Stealth:
             return Stealth;
         case DFCareer.Skills.Swimming:
             return Swimming;
         case DFCareer.Skills.Climbing:
             return Climbing;
         case DFCareer.Skills.Backstabbing:
             return Backstabbing;
         case DFCareer.Skills.Dodging:
             return Dodging;
         case DFCareer.Skills.Running:
             return Running;
         case DFCareer.Skills.Destruction:
             return Destruction;
         case DFCareer.Skills.Restoration:
             return Restoration;
         case DFCareer.Skills.Illusion:
             return Illusion;
         case DFCareer.Skills.Alteration:
             return Alteration;
         case DFCareer.Skills.Thaumaturgy:
             return Thaumaturgy;
         case DFCareer.Skills.Mysticism:
             return Mysticism;
         case DFCareer.Skills.ShortBlade:
             return ShortBlade;
         case DFCareer.Skills.LongBlade:
             return LongBlade;
         case DFCareer.Skills.HandToHand:
             return HandToHand;
         case DFCareer.Skills.Axe:
             return Axe;
         case DFCareer.Skills.BluntWeapon:
             return BluntWeapon;
         case DFCareer.Skills.Archery:
             return Archery;
         case DFCareer.Skills.CriticalStrike:
             return CriticalStrike;
         default:
             return 0;
     }
 }
        void DaggerfallClassSelectWindow_OnItemPicked(int index, string className)
        {
            selectedClass = classList[index];

            TextFile.Token[] textTokens = DaggerfallUnity.Instance.TextProvider.GetRSCTokens(startClassDescriptionID + index);
            DaggerfallMessageBox messageBox = new DaggerfallMessageBox(uiManager, this);
            messageBox.SetTextTokens(textTokens);
            messageBox.AddButton(DaggerfallMessageBox.MessageBoxButtons.Yes);
            Button noButton = messageBox.AddButton(DaggerfallMessageBox.MessageBoxButtons.No);
            noButton.ClickSound = DaggerfallUI.Instance.GetAudioClip(SoundClips.ButtonClick);
            messageBox.OnButtonClick += ConfirmClassPopup_OnButtonClick;
            uiManager.PushWindow(messageBox);

            AudioClip clip = DaggerfallUnity.Instance.SoundReader.GetAudioClip(SoundClips.SelectClassDrums);
            DaggerfallUI.Instance.AudioSource.PlayOneShot(clip);
        }
 public void SetSkillValue(DFCareer.Skills skill, short value)
 {
     switch (skill)
     {
         case DFCareer.Skills.Medical:
             Medical = value;
             break;
         case DFCareer.Skills.Etiquette:
             Etiquette = value;
             break;
         case DFCareer.Skills.Streetwise:
             Streetwise = value;
             break;
         case DFCareer.Skills.Jumping:
             Jumping = value;
             break;
         case DFCareer.Skills.Orcish:
             Orcish = value;
             break;
         case DFCareer.Skills.Harpy:
             Harpy = value;
             break;
         case DFCareer.Skills.Giantish:
             Giantish = value;
             break;
         case DFCareer.Skills.Dragonish:
             Dragonish = value;
             break;
         case DFCareer.Skills.Nymph:
             Nymph = value;
             break;
         case DFCareer.Skills.Daedric:
             Daedric = value;
             break;
         case DFCareer.Skills.Spriggan:
             Spriggan = value;
             break;
         case DFCareer.Skills.Centaurian:
             Centaurian = value;
             break;
         case DFCareer.Skills.Impish:
             Impish = value;
             break;
         case DFCareer.Skills.Lockpicking:
             Lockpicking = value;
             break;
         case DFCareer.Skills.Mercantile:
             Mercantile = value;
             break;
         case DFCareer.Skills.Pickpocket:
             Pickpocket = value;
             break;
         case DFCareer.Skills.Stealth:
             Stealth = value;
             break;
         case DFCareer.Skills.Swimming:
             Swimming = value;
             break;
         case DFCareer.Skills.Climbing:
             Climbing = value;
             break;
         case DFCareer.Skills.Backstabbing:
             Backstabbing = value;
             break;
         case DFCareer.Skills.Dodging:
             Dodging = value;
             break;
         case DFCareer.Skills.Running:
             Running = value;
             break;
         case DFCareer.Skills.Destruction:
             Destruction = value;
             break;
         case DFCareer.Skills.Restoration:
             Restoration = value;
             break;
         case DFCareer.Skills.Illusion:
             Illusion = value;
             break;
         case DFCareer.Skills.Alteration:
             Alteration = value;
             break;
         case DFCareer.Skills.Thaumaturgy:
             Thaumaturgy = value;
             break;
         case DFCareer.Skills.Mysticism:
             Mysticism = value;
             break;
         case DFCareer.Skills.ShortBlade:
             ShortBlade = value;
             break;
         case DFCareer.Skills.LongBlade:
             LongBlade = value;
             break;
         case DFCareer.Skills.HandToHand:
             HandToHand = value;
             break;
         case DFCareer.Skills.Axe:
             Axe = value;
             break;
         case DFCareer.Skills.BluntWeapon:
             BluntWeapon = value;
             break;
         case DFCareer.Skills.Archery:
             Archery = value;
             break;
         case DFCareer.Skills.CriticalStrike:
             CriticalStrike = value;
             break;
     }
 }
        /// <summary>
        /// Sets enemy career and prepares entity settings.
        /// </summary>
        public void SetEnemyCareer(MobileEnemy mobileEnemy, EntityTypes entityType)
        {
            if (entityType == EntityTypes.EnemyMonster)
            {
                careerIndex = (int)mobileEnemy.ID;
                career = GetMonsterCareerTemplate((MonsterCareers)careerIndex);
                stats.SetFromCareer(career);

                // Enemy monster has predefined level and health
                level = career.HitPointsPerLevelOrMonsterLevel;
                maxHealth = UnityEngine.Random.Range(mobileEnemy.MinHealth, mobileEnemy.MaxHealth + 1);
            }
            else if (entityType == EntityTypes.EnemyClass)
            {
                careerIndex = (int)mobileEnemy.ID - 128;
                career = GetClassCareerTemplate((ClassCareers)careerIndex);
                stats.SetFromCareer(career);

                // Enemy class is levelled to player and uses same health rules
                level = GameManager.Instance.PlayerEntity.Level;
                maxHealth = FormulaHelper.RollMaxHealth(level, stats.Endurance, career.HitPointsPerLevelOrMonsterLevel);

                // Enemy class damage is temporarily set by a fudged level multiplier
                // This will change once full entity setup and items are available
                const float damageMultiplier = 4f;
                mobileEnemy.MinDamage = (int)(level * damageMultiplier);
                mobileEnemy.MaxDamage = (int)((level + 2) * damageMultiplier);
            }
            else
            {
                career = new DFCareer();
                careerIndex = -1;
                return;
            }

            this.mobileEnemy = mobileEnemy;
            this.entityType = entityType;
            name = career.Name;

            FillVitalSigns();
        }
        public void Reroll(DFCareer dfClass)
        {
            // Assign base stats from class template
            DaggerfallStats rolledStats = CharacterSheet.GetClassBaseStats(dfClass);

            // Roll bonus value for each base stat
            // Using maxBonusRoll + 1 as Unity's Random.Range(int,int) is exclusive
            // of maximum value and we want to be inclusive of maximum value
            rolledStats.Strength += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1);
            rolledStats.Intelligence += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1);
            rolledStats.Willpower += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1);
            rolledStats.Agility += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1);
            rolledStats.Endurance += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1);
            rolledStats.Personality += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1);
            rolledStats.Speed += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1);
            rolledStats.Luck += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1);

            // Roll bonus pool for player to distribute
            // Using maxBonusPool + 1 for inclusive range as above
            int bonusPool = UnityEngine.Random.Range(minBonusPool, maxBonusPool + 1);

            // Apply stats to control
            SetStats(rolledStats, rolledStats, bonusPool);
            UpdateStatLabels();

            // Play "rolling dice" sound
            DaggerfallUI.Instance.PlayOneShot(SoundClips.DiceRoll);
        }
 // Adds button for attribute popup text
 // NOTE: This has only partial functionality until %vars and all formatting tokens are supported
 void AddAttributePopupButton(DFCareer.Stats stat, Rect rect)
 {
     Button button = DaggerfallUI.AddButton(rect, NativePanel);
     button.Tag = DaggerfallUnity.TextProvider.GetStatDescriptionTextID(stat);
     button.OnMouseClick += StatButton_OnMouseClick;
 }
 public string GetSkillName(DFCareer.Skills skill)
 {
     switch (skill)
     {
         case DFCareer.Skills.Medical:
             return "Medical";
         case DFCareer.Skills.Etiquette:
             return "Etiquette";
         case DFCareer.Skills.Streetwise:
             return "Streetwise";
         case DFCareer.Skills.Jumping:
             return "Jumping";
         case DFCareer.Skills.Orcish:
             return "Orcish";
         case DFCareer.Skills.Harpy:
             return "Harpy";
         case DFCareer.Skills.Giantish:
             return "Giantish";
         case DFCareer.Skills.Dragonish:
             return "Dragonish";
         case DFCareer.Skills.Nymph:
             return "Nymph";
         case DFCareer.Skills.Daedric:
             return "Daedric";
         case DFCareer.Skills.Spriggan:
             return "Spriggan";
         case DFCareer.Skills.Centaurian:
             return "Centaurian";
         case DFCareer.Skills.Impish:
             return "Impish";
         case DFCareer.Skills.Lockpicking:
             return "Lockpicking";
         case DFCareer.Skills.Mercantile:
             return "Mercantile";
         case DFCareer.Skills.Pickpocket:
             return "Pickpocket";
         case DFCareer.Skills.Stealth:
             return "Stealth";
         case DFCareer.Skills.Swimming:
             return "Swimming";
         case DFCareer.Skills.Climbing:
             return "Climbing";
         case DFCareer.Skills.Backstabbing:
             return "Backstabbing";
         case DFCareer.Skills.Dodging:
             return "Dodging";
         case DFCareer.Skills.Running:
             return "Running";
         case DFCareer.Skills.Destruction:
             return "Destruction";
         case DFCareer.Skills.Restoration:
             return "Restoration";
         case DFCareer.Skills.Illusion:
             return "Illusion";
         case DFCareer.Skills.Alteration:
             return "Alteration";
         case DFCareer.Skills.Thaumaturgy:
             return "Thaumaturgy";
         case DFCareer.Skills.Mysticism:
             return "Mysticism";
         case DFCareer.Skills.ShortBlade:
             return "Short Blade";
         case DFCareer.Skills.LongBlade:
             return "Long Blade";
         case DFCareer.Skills.HandToHand:
             return "Hand To Hand";
         case DFCareer.Skills.Axe:
             return "Axe";
         case DFCareer.Skills.BluntWeapon:
             return "Blunt Weapon";
         case DFCareer.Skills.Archery:
             return "Archery";
         case DFCareer.Skills.CriticalStrike:
             return "Critical Strike";
         default:
             return string.Empty;
     }
 }
        // Creates formatting tokens for skill popups
        TextFile.Token[] CreateSkillTokens(DFCareer.Skills skill)
        {
            List<TextFile.Token> tokens = new List<TextFile.Token>();

            TextFile.Token skillNameToken = new TextFile.Token();
            skillNameToken.text = DaggerfallUnity.Instance.TextProvider.GetSkillName(skill);
            skillNameToken.formatting = TextFile.Formatting.Text;

            TextFile.Token skillValueToken = new TextFile.Token();
            skillValueToken.text = string.Format("{0}%", playerEntity.Skills.GetSkillValue(skill));
            skillValueToken.formatting = TextFile.Formatting.Text;

            DFCareer.Stats primaryStat = DaggerfallSkills.GetPrimaryStat(skill);
            TextFile.Token skillPrimaryStatToken = new TextFile.Token();
            skillPrimaryStatToken.text = DaggerfallUnity.Instance.TextProvider.GetAbbreviatedStatName(primaryStat);
            skillPrimaryStatToken.formatting = TextFile.Formatting.Text;

            TextFile.Token spacesToken = new TextFile.Token();
            spacesToken.formatting = TextFile.Formatting.Text;
            spacesToken.text = "  ";

            TextFile.Token tabToken = new TextFile.Token();
            tabToken.formatting = TextFile.Formatting.PositionPrefix;

            // Add tokens in order
            tokens.Add(skillNameToken);
            tokens.Add(tabToken);
            tokens.Add(tabToken);
            tokens.Add(skillValueToken);
            tokens.Add(spacesToken);
            tokens.Add(skillPrimaryStatToken);

            return tokens.ToArray();
        }
 public string GetStatName(DFCareer.Stats stat)
 {
     switch (stat)
     {
         case DFCareer.Stats.Strength:
             return "Strength";
         case DFCareer.Stats.Intelligence:
             return "Intelligence";
         case DFCareer.Stats.Willpower:
             return "Willpower";
         case DFCareer.Stats.Agility:
             return "Agility";
         case DFCareer.Stats.Endurance:
             return "Endurance";
         case DFCareer.Stats.Personality:
             return "Personality";
         case DFCareer.Stats.Speed:
             return "Speed";
         case DFCareer.Stats.Luck:
             return "Luck";
         default:
             return string.Empty;
     }
 }
        void OnGUI()
        {
            if (!IsReady())
            {
                EditorGUILayout.HelpBox("DaggerfallUnity instance not ready. Have you set your Arena2 path?", MessageType.Info);
                return;
            }

            // Select class source
            EditorGUILayout.Space();
            careerSource = (CareerSource)EditorGUILayout.EnumPopup(new GUIContent("Source"), (CareerSource)careerSource);

            // Select class from specified source
            selectedCareer = null;
            if (careerSource == CareerSource.PlayerClasses && classNames != null && classNames.Length > 0)
            {
                if (selectedTemplate > classNames.Length)
                    selectedTemplate = 0;
                selectedTemplate = EditorGUILayout.Popup(new GUIContent("Class"), selectedTemplate, classNames);
                selectedCareer = classTemplates[selectedTemplate];
            }
            else if (careerSource == CareerSource.Monsters && monsterNames != null && monsterNames.Length > 0)
            {
                if (selectedTemplate > monsterNames.Length)
                    selectedTemplate = 0;
                selectedTemplate = EditorGUILayout.Popup(new GUIContent("Class"), selectedTemplate, monsterNames);
                selectedCareer = monsterTemplates[selectedTemplate];
            }
            else
            {
                return;
            }

            // Show foldouts
            if (selectedCareer != null)
            {
                scrollPos = GUILayoutHelper.ScrollView(scrollPos, () =>
                {
                    ShowAdvancementGUI();
                    ShowAttributesGUI();
                    ShowSecondaryAttributesGUI();
                    ShowSkillsGUI();
                    ShowTolerancesGUI();
                    ShowProficienciesGUI();
                    ShowForbiddenMaterialsGUI();
                    ShowForbiddenArmorGUI();
                    ShowForbiddenShieldsGUI();
                    ShowMagickaGUI();
                    ShowMiscellaneousGUI();
                    //ShowUnknownGUI();
                });
            }
        }