string[] GetClassSpecials()
        {
            List <string> specials = new List <string>();
            DFCareer      career   = GameManager.Instance.PlayerEntity.Career;
            RaceTemplate  race     = GameManager.Instance.PlayerEntity.RaceTemplate;

            // Tolerances
            Dictionary <DFCareer.Tolerance, string> tolerances = new Dictionary <DFCareer.Tolerance, string>
            {
                { DFCareer.Tolerance.CriticalWeakness, HardStrings.criticalWeakness },
                { DFCareer.Tolerance.Immune, HardStrings.immunity },
                { DFCareer.Tolerance.LowTolerance, HardStrings.lowTolerance },
                { DFCareer.Tolerance.Resistant, HardStrings.resistance }
            };

            if (career.Paralysis != DFCareer.Tolerance.Normal)
            {
                specials.Add(tolerances[career.Paralysis] + " " + HardStrings.toParalysis);
            }

            if (career.Magic != DFCareer.Tolerance.Normal)
            {
                specials.Add(tolerances[career.Magic] + " " + HardStrings.toMagic);
            }

            if (career.Poison != DFCareer.Tolerance.Normal)
            {
                specials.Add(tolerances[career.Poison] + " " + HardStrings.toPoison);
            }

            if (career.Fire != DFCareer.Tolerance.Normal)
            {
                specials.Add(tolerances[career.Fire] + " " + HardStrings.toFire);
            }

            if (career.Frost != DFCareer.Tolerance.Normal)
            {
                specials.Add(tolerances[career.Frost] + " " + HardStrings.toFrost);
            }

            if (career.Shock != DFCareer.Tolerance.Normal)
            {
                specials.Add(tolerances[career.Shock] + " " + HardStrings.toShock);
            }

            if (career.Disease != DFCareer.Tolerance.Normal)
            {
                specials.Add(tolerances[career.Disease] + " " + HardStrings.toDisease);
            }

            // Weapon Proficiencies
            Dictionary <DFCareer.Proficiency, string> profs = new Dictionary <DFCareer.Proficiency, string>
            {
                { DFCareer.Proficiency.Expert, HardStrings.expertiseIn },
                { DFCareer.Proficiency.Forbidden, HardStrings.forbiddenWeaponry }
            };

            if (career.ShortBlades != DFCareer.Proficiency.Normal)
            {
                specials.Add(profs[career.ShortBlades] + " " + HardStrings.shortBlade);
            }

            if (career.LongBlades != DFCareer.Proficiency.Normal)
            {
                specials.Add(profs[career.LongBlades] + " " + HardStrings.longBlade);
            }

            if (career.HandToHand != DFCareer.Proficiency.Normal)
            {
                specials.Add(profs[career.HandToHand] + " " + HardStrings.handToHand);
            }

            if (career.Axes != DFCareer.Proficiency.Normal)
            {
                specials.Add(profs[career.Axes] + " " + HardStrings.axe);
            }

            if (career.BluntWeapons != DFCareer.Proficiency.Normal)
            {
                specials.Add(profs[career.BluntWeapons] + " " + HardStrings.bluntWeapon);
            }

            if (career.MissileWeapons != DFCareer.Proficiency.Normal)
            {
                specials.Add(profs[career.MissileWeapons] + " " + HardStrings.missileWeapon);
            }

            // Attack modifiers
            Dictionary <DFCareer.AttackModifier, string> atkMods = new Dictionary <DFCareer.AttackModifier, string>
            {
                { DFCareer.AttackModifier.Bonus, HardStrings.bonusToHit },
                { DFCareer.AttackModifier.Phobia, HardStrings.phobia }
            };

            if (career.UndeadAttackModifier != DFCareer.AttackModifier.Normal)
            {
                specials.Add(atkMods[career.UndeadAttackModifier] + " " + HardStrings.undead);
            }

            if (career.DaedraAttackModifier != DFCareer.AttackModifier.Normal)
            {
                specials.Add(atkMods[career.DaedraAttackModifier] + " " + HardStrings.daedra);
            }

            if (career.HumanoidAttackModifier != DFCareer.AttackModifier.Normal)
            {
                specials.Add(atkMods[career.HumanoidAttackModifier] + " " + HardStrings.humanoid);
            }

            if (career.AnimalsAttackModifier != DFCareer.AttackModifier.Normal)
            {
                specials.Add(atkMods[career.AnimalsAttackModifier] + " " + HardStrings.animals);
            }

            // Darkness/light powered magery
            if (career.DarknessPoweredMagery != DFCareer.DarknessMageryFlags.Normal)
            {
                if ((career.DarknessPoweredMagery & DFCareer.DarknessMageryFlags.ReducedPowerInLight) == DFCareer.DarknessMageryFlags.ReducedPowerInLight)
                {
                    specials.Add(HardStrings.darknessPoweredMagery + " " + HardStrings.lowerMagicAbilityDaylight);
                }
                if ((career.DarknessPoweredMagery & DFCareer.DarknessMageryFlags.UnableToCastInLight) == DFCareer.DarknessMageryFlags.UnableToCastInLight)
                {
                    specials.Add(HardStrings.darknessPoweredMagery + " " + HardStrings.unableToUseMagicInDaylight);
                }
            }

            if (career.LightPoweredMagery != DFCareer.LightMageryFlags.Normal)
            {
                if ((career.LightPoweredMagery & DFCareer.LightMageryFlags.ReducedPowerInDarkness) == DFCareer.LightMageryFlags.ReducedPowerInDarkness)
                {
                    specials.Add(HardStrings.lightPoweredMagery + " " + HardStrings.lowerMagicAbilityDarkness);
                }
                if ((career.LightPoweredMagery & DFCareer.LightMageryFlags.UnableToCastInDarkness) == DFCareer.LightMageryFlags.UnableToCastInDarkness)
                {
                    specials.Add(HardStrings.lightPoweredMagery + " " + HardStrings.unableToUseMagicInDarkness);
                }
            }

            // Forbidden materials (multiple)
            if (career.ForbiddenMaterials != 0)
            {
                Dictionary <DFCareer.MaterialFlags, string> forbMaterials = new Dictionary <DFCareer.MaterialFlags, string>
                {
                    { DFCareer.MaterialFlags.Adamantium, HardStrings.adamantium },
                    { DFCareer.MaterialFlags.Daedric, HardStrings.daedric },
                    { DFCareer.MaterialFlags.Dwarven, HardStrings.dwarven },
                    { DFCareer.MaterialFlags.Ebony, HardStrings.ebony },
                    { DFCareer.MaterialFlags.Elven, HardStrings.elven },
                    { DFCareer.MaterialFlags.Iron, HardStrings.iron },
                    { DFCareer.MaterialFlags.Mithril, HardStrings.mithril },
                    { DFCareer.MaterialFlags.Orcish, HardStrings.orcish },
                    { DFCareer.MaterialFlags.Silver, HardStrings.silver },
                    { DFCareer.MaterialFlags.Steel, HardStrings.steel }
                };
                foreach (DFCareer.MaterialFlags flag in Enum.GetValues(typeof(DFCareer.MaterialFlags)))
                {
                    if ((career.ForbiddenMaterials & flag) == flag)
                    {
                        specials.Add(HardStrings.forbiddenMaterial + " " + forbMaterials[flag]);
                    }
                }
            }

            // Forbidden shields (multiple)
            if (career.ForbiddenShields != 0)
            {
                Dictionary <DFCareer.ShieldFlags, string> forbShields = new Dictionary <DFCareer.ShieldFlags, string>
                {
                    { DFCareer.ShieldFlags.Buckler, HardStrings.buckler },
                    { DFCareer.ShieldFlags.KiteShield, HardStrings.kiteShield },
                    { DFCareer.ShieldFlags.RoundShield, HardStrings.roundShield },
                    { DFCareer.ShieldFlags.TowerShield, HardStrings.towerShield }
                };
                foreach (DFCareer.ShieldFlags flag in Enum.GetValues(typeof(DFCareer.ShieldFlags)))
                {
                    if ((career.ForbiddenShields & flag) == flag)
                    {
                        specials.Add(HardStrings.forbiddenShieldTypes + " " + forbShields[flag]);
                    }
                }
            }

            // Forbidden armor (multiple)
            if (career.ForbiddenArmors != 0)
            {
                Dictionary <DFCareer.ArmorFlags, string> forbArmors = new Dictionary <DFCareer.ArmorFlags, string>
                {
                    { DFCareer.ArmorFlags.Chain, HardStrings.chain },
                    { DFCareer.ArmorFlags.Leather, HardStrings.leather },
                    { DFCareer.ArmorFlags.Plate, HardStrings.plate }
                };
                foreach (DFCareer.ArmorFlags flag in Enum.GetValues(typeof(DFCareer.ArmorFlags)))
                {
                    if ((career.ForbiddenArmors & flag) == flag)
                    {
                        specials.Add(HardStrings.forbiddenArmorType + " " + forbArmors[flag]);
                    }
                }
            }

            // Forbidden proficiencies (flags)
            // Expert proficiencies (flags)
            // Omitted - redundant

            // Spell point multiplier
            if (career.SpellPointMultiplier != DFCareer.SpellPointMultipliers.Times_0_50)
            {
                Dictionary <DFCareer.SpellPointMultipliers, string> spellPtMults = new Dictionary <DFCareer.SpellPointMultipliers, string>
                {
                    { DFCareer.SpellPointMultipliers.Times_1_00, HardStrings.intInSpellPoints },
                    { DFCareer.SpellPointMultipliers.Times_1_50, HardStrings.intInSpellPoints15 },
                    { DFCareer.SpellPointMultipliers.Times_1_75, HardStrings.intInSpellPoints175 },
                    { DFCareer.SpellPointMultipliers.Times_2_00, HardStrings.intInSpellPoints2 },
                    { DFCareer.SpellPointMultipliers.Times_3_00, HardStrings.intInSpellPoints3 },
                };
                specials.Add(HardStrings.increasedMagery + " " + spellPtMults[career.SpellPointMultiplier]);
            }

            // Spell absorption
            if (career.SpellAbsorption != DFCareer.SpellAbsorptionFlags.None)
            {
                Dictionary <DFCareer.SpellAbsorptionFlags, string> absorbConds = new Dictionary <DFCareer.SpellAbsorptionFlags, string>
                {
                    { DFCareer.SpellAbsorptionFlags.Always, HardStrings.general },
                    { DFCareer.SpellAbsorptionFlags.InDarkness, HardStrings.inDarkness },
                    { DFCareer.SpellAbsorptionFlags.InLight, HardStrings.inLight }
                };
                specials.Add(HardStrings.spellAbsorption + " " + absorbConds[career.SpellAbsorption]);
            }

            // Spell point regeneration
            if (career.NoRegenSpellPoints)
            {
                specials.Add(HardStrings.inabilityToRegen);
            }

            // Talents
            if (career.AcuteHearing)
            {
                specials.Add(HardStrings.acuteHearing);
            }

            if (career.Athleticism)
            {
                specials.Add(HardStrings.athleticism);
            }

            if (career.AdrenalineRush)
            {
                specials.Add(HardStrings.adrenalineRush);
            }

            // Regeneration and rapid healing
            if (career.Regeneration != DFCareer.RegenerationFlags.None)
            {
                Dictionary <DFCareer.RegenerationFlags, string> regenConds = new Dictionary <DFCareer.RegenerationFlags, string>
                {
                    { DFCareer.RegenerationFlags.Always, HardStrings.general },
                    { DFCareer.RegenerationFlags.InDarkness, HardStrings.inDarkness },
                    { DFCareer.RegenerationFlags.InLight, HardStrings.inLight },
                    { DFCareer.RegenerationFlags.InWater, HardStrings.whileImmersed }
                };
                specials.Add(HardStrings.regenerateHealth + " " + regenConds[career.Regeneration]);
            }

            if (career.RapidHealing != DFCareer.RapidHealingFlags.None)
            {
                Dictionary <DFCareer.RapidHealingFlags, string> rapidHealingConds = new Dictionary <DFCareer.RapidHealingFlags, string>
                {
                    { DFCareer.RapidHealingFlags.Always, HardStrings.general },
                    { DFCareer.RapidHealingFlags.InDarkness, HardStrings.inDarkness },
                    { DFCareer.RapidHealingFlags.InLight, HardStrings.inLight }
                };
                specials.Add(HardStrings.rapidHealing + " " + rapidHealingConds[career.RapidHealing]);
            }

            // Damage
            if (career.DamageFromSunlight)
            {
                specials.Add(HardStrings.damage + " " + HardStrings.fromSunlight);
            }

            if (career.DamageFromHolyPlaces)
            {
                specials.Add(HardStrings.damage + " " + HardStrings.fromHolyPlaces);
            }

            // Add racial tolerances and abilities
            Dictionary <DFCareer.EffectFlags, string> raceEffectMods = new Dictionary <DFCareer.EffectFlags, string>
            {
                { DFCareer.EffectFlags.Paralysis, HardStrings.toParalysis },
                { DFCareer.EffectFlags.Magic, HardStrings.toMagic },
                { DFCareer.EffectFlags.Poison, HardStrings.toPoison },
                { DFCareer.EffectFlags.Fire, HardStrings.toFire },
                { DFCareer.EffectFlags.Frost, HardStrings.toFrost },
                { DFCareer.EffectFlags.Shock, HardStrings.toShock },
                { DFCareer.EffectFlags.Disease, HardStrings.toDisease },
            };

            foreach (DFCareer.EffectFlags effectFlag in Enum.GetValues(typeof(DFCareer.EffectFlags)))
            {
                if (effectFlag != DFCareer.EffectFlags.None)
                {
                    // Resistances
                    if ((race.ResistanceFlags & effectFlag) == effectFlag)
                    {
                        string toAdd = HardStrings.resistance + " " + raceEffectMods[effectFlag];
                        if (!specials.Contains(toAdd)) // prevent duplicates from career
                        {
                            specials.Add(toAdd);
                        }
                    }
                    // Immunities
                    if ((race.ImmunityFlags & effectFlag) == effectFlag)
                    {
                        string toAdd = HardStrings.immunity + " " + raceEffectMods[effectFlag];
                        if (!specials.Contains(toAdd))
                        {
                            specials.Add(toAdd);
                        }
                    }
                    // Low tolerances
                    if ((race.LowToleranceFlags & effectFlag) == effectFlag)
                    {
                        string toAdd = HardStrings.lowTolerance + " " + raceEffectMods[effectFlag];
                        if (!specials.Contains(toAdd))
                        {
                            specials.Add(toAdd);
                        }
                    }
                    // Critical weaknesses
                    if ((race.CriticalWeaknessFlags & effectFlag) == effectFlag)
                    {
                        string toAdd = HardStrings.criticalWeakness + " " + raceEffectMods[effectFlag];
                        if (!specials.Contains(toAdd))
                        {
                            specials.Add(toAdd);
                        }
                    }
                }
            }

            Dictionary <DFCareer.SpecialAbilityFlags, string> raceAbilities = new Dictionary <DFCareer.SpecialAbilityFlags, string>
            {
                { DFCareer.SpecialAbilityFlags.AcuteHearing, HardStrings.acuteHearing },
                { DFCareer.SpecialAbilityFlags.Athleticism, HardStrings.acuteHearing },
                { DFCareer.SpecialAbilityFlags.AdrenalineRush, HardStrings.adrenalineRush },
                { DFCareer.SpecialAbilityFlags.NoRegenSpellPoints, HardStrings.inabilityToRegen },
                { DFCareer.SpecialAbilityFlags.SunDamage, HardStrings.damage + " " + HardStrings.fromSunlight },
                { DFCareer.SpecialAbilityFlags.HolyDamage, HardStrings.damage + " " + HardStrings.fromHolyPlaces }
            };

            foreach (DFCareer.SpecialAbilityFlags abilityFlag in Enum.GetValues(typeof(DFCareer.SpecialAbilityFlags)))
            {
                if (abilityFlag != DFCareer.SpecialAbilityFlags.None && (race.SpecialAbilities & abilityFlag) == abilityFlag)
                {
                    string toAdd = raceAbilities[abilityFlag];
                    if (!specials.Contains(toAdd))
                    {
                        specials.Add(toAdd);
                    }
                }
            }

            return(specials.ToArray());
        }