public override void DoEffect(Pawn user)
        {
            if (parent.def != null)
            {
                bool customClass = false;
                for (int i = 0; i < TM_ClassUtility.CustomClasses().Count; i++)
                {
                    if ((TM_ClassUtility.CustomClasses()[i].isMage && user.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted)) || (TM_ClassUtility.CustomClasses()[i].isMage && TM_ClassUtility.CustomClasses()[i].isFighter && (user.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted) || user.story.traits.HasTrait(TorannMagicDefOf.PhysicalProdigy))))
                    {
                        if (parent.def == TM_ClassUtility.CustomClasses()[i].tornScript || parent.def == TM_ClassUtility.CustomClasses()[i].fullScript)
                        {
                            customClass = true;
                            if (parent.def == TM_ClassUtility.CustomClasses()[i].fullScript)
                            {
                                HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                            }

                            ApplyTrait(user, TM_ClassUtility.CustomClasses()[i].classTrait, TM_ClassUtility.CustomClasses()[i].traitDegree);

                            //Unique actions hook
                            ApplyTraitAdjustments(user, TM_ClassUtility.CustomClasses()[i].classTrait);
                            //
                            this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                            CompAbilityUserMagic comp = user.TryGetComp <CompAbilityUserMagic>();
                            if (comp != null)
                            {
                                comp.customIndex = i;
                                comp.customClass = TM_ClassUtility.CustomClasses()[i];
                            }
                            else
                            {
                                Log.Message("failed to initialize custom magic class comp");
                            }
                            CompAbilityUserMight mComp = user.TryGetComp <CompAbilityUserMight>();
                            if (mComp != null && TM_ClassUtility.CustomClasses()[i].isFighter)
                            {
                                mComp.customIndex = i;
                                mComp.customClass = TM_ClassUtility.CustomClasses()[i];
                            }
                            break;
                        }
                    }
                }
                if (!customClass && user.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted))
                {
                    if (parent.def.defName == "BookOfInnerFire" || parent.def.defName == "Torn_BookOfInnerFire")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.InnerFire, 4, false));
                        if (parent.def.defName == "BookOfInnerFire")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        //this.parent.Destroy(DestroyMode.Vanish);
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfHeartOfFrost" || parent.def.defName == "Torn_BookOfHeartOfFrost")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.HeartOfFrost, 4, false));
                        if (parent.def.defName == "BookOfHeartOfFrost")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfStormBorn" || parent.def.defName == "Torn_BookOfStormBorn")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.StormBorn, 4, false));
                        if (parent.def.defName == "BookOfStormBorn")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfArcanist" || parent.def.defName == "Torn_BookOfArcanist")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Arcanist, 4, false));
                        if (parent.def.defName == "BookOfArcanist")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfValiant" || parent.def.defName == "Torn_BookOfValiant")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Paladin, 4, false));
                        if (parent.def.defName == "BookOfValiant")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfSummoner" || parent.def.defName == "Torn_BookOfSummoner")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Summoner, 4, false));
                        if (parent.def.defName == "BookOfSummoner")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfDruid" || parent.def.defName == "Torn_BookOfNature")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Druid, 4, false));
                        if (parent.def.defName == "BookOfDruid")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfNecromancer" || parent.def.defName == "Torn_BookOfUndead")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Necromancer, 4, false));
                        if (parent.def.defName == "BookOfNecromancer")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfPriest" || parent.def.defName == "Torn_BookOfPriest")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        FixPriestSkills(user);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Priest, 4, false));
                        if (parent.def.defName == "BookOfPriest")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfBard" || parent.def.defName == "Torn_BookOfBard")
                    {
                        if (user.story.DisabledWorkTagsBackstoryAndTraits != WorkTags.Social)
                        {
                            FixTrait(user, user.story.traits.allTraits);
                            FixBardSkills(user);
                            user.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Bard, 0, false));
                            if (parent.def.defName == "BookOfBard")
                            {
                                HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                            }
                            this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                        }
                        else
                        {
                            Messages.Message("TM_NotSocialCapable".Translate(
                                                 user.LabelShort
                                                 ), MessageTypeDefOf.RejectInput);
                        }
                    }
                    else if (parent.def.defName == "BookOfDemons" || parent.def.defName == "Torn_BookOfDemons")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        if (user.gender == Gender.Male)
                        {
                            user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Warlock, 4, false));
                        }
                        else if (user.gender == Gender.Female)
                        {
                            user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Succubus, 4, false));
                        }
                        else
                        {
                            Log.Message("No gender found - assigning random trait.");
                            if (Rand.Chance(.5f))
                            {
                                user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Succubus, 4, false));
                            }
                            else
                            {
                                user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Warlock, 4, false));
                            }
                        }
                        if (parent.def.defName == "BookOfDemons")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfEarth" || parent.def.defName == "Torn_BookOfEarth")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Geomancer, 4, false));
                        if (parent.def.defName == "BookOfEarth")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfMagitech" || parent.def.defName == "Torn_BookOfMagitech")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Technomancer, 4, false));
                        if (parent.def.defName == "BookOfMagitech")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfHemomancy" || parent.def.defName == "Torn_BookOfHemomancy")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.BloodMage, 4, false));
                        if (parent.def.defName == "BookOfHemomancy")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfEnchanter" || parent.def.defName == "Torn_BookOfEnchanter")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Enchanter, 4, false));
                        if (parent.def.defName == "BookOfEnchanter")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfChronomancer" || parent.def.defName == "Torn_BookOfChronomancer")
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Chronomancer, 4, false));
                        if (parent.def.defName == "BookOfChronomancer")
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def == TorannMagicDefOf.BookOfChaos || parent.def == TorannMagicDefOf.Torn_BookOfChaos)
                    {
                        FixTrait(user, user.story.traits.allTraits);
                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.ChaosMage, 4, false));
                        if (parent.def == TorannMagicDefOf.BookOfChaos)
                        {
                            HealthUtility.AdjustSeverity(user, TorannMagicDefOf.TM_Uncertainty, 0.2f);
                        }
                        this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                    }
                    else if (parent.def.defName == "BookOfQuestion")
                    {
                        int attempts = 0;
                        ModOptions.SettingsRef settingsRef = new ModOptions.SettingsRef();
                        FixTrait(user, user.story.traits.allTraits);
                        RetryBookOfQuestion :;
                        if (attempts < 50)
                        {
                            int baseClassCount   = 17;
                            int customClassCount = TM_ClassUtility.CustomMageClasses.Count;
                            int rnd = Mathf.RoundToInt(Rand.RangeInclusive(0, baseClassCount + customClassCount));
                            switch (rnd)
                            {
                            case 0:
                                if (settingsRef.Demonkin)
                                {
                                    if (user.gender == Gender.Male)
                                    {
                                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Warlock, 4, false));
                                    }
                                    else if (user.gender == Gender.Female)
                                    {
                                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Succubus, 4, false));
                                    }
                                    else
                                    {
                                        Log.Message("No gender found.");
                                    }
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 15:
                                if (settingsRef.Demonkin)
                                {
                                    if (user.gender == Gender.Male)
                                    {
                                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Warlock, 4, false));
                                    }
                                    else if (user.gender == Gender.Female)
                                    {
                                        user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Succubus, 4, false));
                                    }
                                    else
                                    {
                                        Log.Message("No gender found.");
                                    }
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 1:
                                if (settingsRef.Necromancer)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Necromancer, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 2:
                                if (settingsRef.Druid)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Druid, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 3:
                                if (settingsRef.Summoner)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Summoner, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 4:
                                if (settingsRef.FireMage)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.InnerFire, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 5:
                                if (settingsRef.IceMage)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.HeartOfFrost, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 6:
                                if (settingsRef.LitMage)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.StormBorn, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 7:
                                if (settingsRef.Arcanist)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Arcanist, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 8:
                                if (settingsRef.Priest)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Priest, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 9:
                                if (settingsRef.Bard)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Bard, 0, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 10:
                                if (settingsRef.Paladin)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Paladin, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 11:
                                if (settingsRef.Geomancer)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Geomancer, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 12:
                                if (settingsRef.Technomancer)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Technomancer, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 13:
                                if (settingsRef.BloodMage)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.BloodMage, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 14:
                                if (settingsRef.Technomancer)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Enchanter, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 16:
                                if (settingsRef.Chronomancer)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Chronomancer, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case 17:
                                if (settingsRef.ChaosMage)
                                {
                                    user.story.traits.GainTrait(new Trait(TorannMagicDefOf.ChaosMage, 4, false));
                                }
                                else
                                {
                                    attempts++;
                                    goto RetryBookOfQuestion;
                                }
                                break;

                            case int val when rnd > baseClassCount:
                                val = val - baseClassCount - 1;
                                user.story.traits.GainTrait(new Trait(TM_ClassUtility.CustomClasses()[val].classTrait, TM_ClassUtility.CustomClasses()[val].traitDegree));
                                break;
                            }
                            this.parent.SplitOff(1).Destroy(DestroyMode.Vanish);
                        }
                        else
                        {
                            user.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Gifted, 2, false));
                            Messages.Message("Unable to find a valid class to assign after 50 attempts - ending attempt", MessageTypeDefOf.RejectInput);
                        }
                    }
                    else
                    {
                        Messages.Message("NotArcaneBook".Translate(), MessageTypeDefOf.RejectInput);
                    }
                }
                else if (!customClass && !user.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted))
                {
                    Messages.Message("NotGiftedPawn".Translate(
                                         user.LabelShort
                                         ), MessageTypeDefOf.RejectInput);
                }
            }
            else
            {
                Messages.Message("NotGiftedPawn".Translate(
                                     user.LabelShort
                                     ), MessageTypeDefOf.RejectInput);
            }
        }