private void GetAllHediffs()
        {
            if (runtime == null) // If that setting is null don't get any more at runtime.
            {
                _allCompleteDefs = hediffDefsComplete;
                _allPartialDefs  = hediffDefs;
                return;
            }

            var completeSet = new HashSet <HediffDef>(hediffDefsComplete); // Use hash sets so we don't have any duplicates.
            var partialSet  = new HashSet <HediffDef>(hediffDefs);

            IEnumerable <HediffDef> allTfHediffs = TransformerUtility.AllMorphTfs;

            foreach (HediffDef morphTf in allTfHediffs)
            {
                if (IsValidTfDef(morphTf))
                {
                    MorphTransformationTypes type = morphTf.GetTransformationType();
                    if ((type & MorphTransformationTypes.Full) != 0)
                    {
                        completeSet.Add(morphTf);
                    }

                    if ((type & MorphTransformationTypes.Partial) != 0)
                    {
                        partialSet.Add(morphTf);
                    }
                }
            }

            _allCompleteDefs = completeSet.ToList(); // Now convert them back to lists.
            _allPartialDefs  = completeSet.ToList();
        }
        private bool IsValidTfDef(HediffDef def)
        {
            MorphTransformationTypes type = def.GetTransformationType();

            if ((type & runtime.types) == 0)
            {
                return(false);
            }

            var hasAnyCats = false;

            foreach (MorphDef morphDef in MorphUtilities.GetAssociatedMorph(def))
            {
                bool hasCat =
                    morphDef.categories.Any(c => runtime.categories.Contains(c)); // Check if the morph has any of the listed categories.

                if (runtime.isBlackList && hasCat)
                {
                    return(false);
                }
                if (hasCat)
                {
                    hasAnyCats = true;
                }
            }

            if (!runtime.isBlackList && !hasAnyCats)
            {
                return(false); //if it's a white list make sure at least one category is present
            }
            return(true);
        }