public static bool Includes(this ThingRequestGroup group, ThingDef def)
        {
            switch (group)
            {
            case ThingRequestGroup.Undefined:
                return(false);

            case ThingRequestGroup.Nothing:
                return(false);

            case ThingRequestGroup.Everything:
                return(true);

            case ThingRequestGroup.HaulableEver:
                return(def.EverHaulable);

            case ThingRequestGroup.HaulableAlways:
                return(def.alwaysHaulable);

            case ThingRequestGroup.FoodSource:
                return(def.IsNutritionGivingIngestible || def.thingClass == typeof(Building_NutrientPasteDispenser));

            case ThingRequestGroup.FoodSourceNotPlantOrTree:
                return((def.IsNutritionGivingIngestible && (def.ingestible.foodType & ~FoodTypeFlags.Plant & ~FoodTypeFlags.Tree) != FoodTypeFlags.None) || def.thingClass == typeof(Building_NutrientPasteDispenser));

            case ThingRequestGroup.Corpse:
                return(def.thingClass == typeof(Corpse));

            case ThingRequestGroup.Blueprint:
                return(def.IsBlueprint);

            case ThingRequestGroup.BuildingArtificial:
                return(def.IsBuildingArtificial);

            case ThingRequestGroup.BuildingFrame:
                return(def.IsFrame);

            case ThingRequestGroup.Pawn:
                return(def.category == ThingCategory.Pawn);

            case ThingRequestGroup.PotentialBillGiver:
                return(!def.AllRecipes.NullOrEmpty <RecipeDef>());

            case ThingRequestGroup.Medicine:
                return(def.IsMedicine);

            case ThingRequestGroup.Filth:
                return(def.filth != null);

            case ThingRequestGroup.AttackTarget:
                return(typeof(IAttackTarget).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Weapon:
                return(def.IsWeapon);

            case ThingRequestGroup.Refuelable:
                return(def.HasComp(typeof(CompRefuelable)));

            case ThingRequestGroup.HaulableEverOrMinifiable:
                return(def.EverHaulable || def.Minifiable);

            case ThingRequestGroup.Drug:
                return(def.IsDrug);

            case ThingRequestGroup.Shell:
                return(def.IsShell);

            case ThingRequestGroup.HarvestablePlant:
                return(def.category == ThingCategory.Plant && def.plant.Harvestable);

            case ThingRequestGroup.Fire:
                return(typeof(Fire).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Plant:
                return(def.category == ThingCategory.Plant);

            case ThingRequestGroup.Construction:
                return(def.IsBlueprint || def.IsFrame);

            case ThingRequestGroup.HasGUIOverlay:
                return(def.drawGUIOverlay);

            case ThingRequestGroup.Apparel:
                return(def.IsApparel);

            case ThingRequestGroup.MinifiedThing:
                return(typeof(MinifiedThing).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Grave:
                return(typeof(Building_Grave).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Art:
                return(def.HasComp(typeof(CompArt)));

            case ThingRequestGroup.ThingHolder:
                return(def.ThisOrAnyCompIsThingHolder());

            case ThingRequestGroup.ActiveDropPod:
                return(typeof(IActiveDropPod).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Transporter:
                return(def.HasComp(typeof(CompTransporter)));

            case ThingRequestGroup.LongRangeMineralScanner:
                return(def.HasComp(typeof(CompLongRangeMineralScanner)));

            case ThingRequestGroup.AffectsSky:
                return(def.HasComp(typeof(CompAffectsSky)));

            case ThingRequestGroup.PsychicDroneEmanator:
                return(def.HasComp(typeof(CompPsychicDrone)));

            case ThingRequestGroup.WindSource:
                return(def.HasComp(typeof(CompWindSource)));

            case ThingRequestGroup.AlwaysFlee:
                return(def.alwaysFlee);

            default:
                throw new ArgumentException("group");
            }
        }
        public static bool Includes(this ThingRequestGroup group, ThingDef def)
        {
            switch (group)
            {
            case ThingRequestGroup.Undefined:
                return(false);

            case ThingRequestGroup.Nothing:
                return(false);

            case ThingRequestGroup.Everything:
                return(true);

            case ThingRequestGroup.HaulableEver:
                return(def.EverHaulable);

            case ThingRequestGroup.HaulableAlways:
                return(def.alwaysHaulable);

            case ThingRequestGroup.Plant:
                return(def.category == ThingCategory.Plant);

            case ThingRequestGroup.HarvestablePlant:
                if (def.category == ThingCategory.Plant)
                {
                    return(def.plant.Harvestable);
                }
                return(false);

            case ThingRequestGroup.FoodSource:
                if (!def.IsNutritionGivingIngestible)
                {
                    return(def.thingClass == typeof(Building_NutrientPasteDispenser));
                }
                return(true);

            case ThingRequestGroup.FoodSourceNotPlantOrTree:
                if (!def.IsNutritionGivingIngestible || (def.ingestible.foodType & ~FoodTypeFlags.Plant & ~FoodTypeFlags.Tree) == 0)
                {
                    return(def.thingClass == typeof(Building_NutrientPasteDispenser));
                }
                return(true);

            case ThingRequestGroup.HasGUIOverlay:
                return(def.drawGUIOverlay);

            case ThingRequestGroup.Corpse:
                return(def.thingClass == typeof(Corpse));

            case ThingRequestGroup.Blueprint:
                return(def.IsBlueprint);

            case ThingRequestGroup.Construction:
                if (!def.IsBlueprint)
                {
                    return(def.IsFrame);
                }
                return(true);

            case ThingRequestGroup.BuildingArtificial:
                return(def.IsBuildingArtificial);

            case ThingRequestGroup.BuildingFrame:
                return(def.IsFrame);

            case ThingRequestGroup.Pawn:
                return(def.category == ThingCategory.Pawn);

            case ThingRequestGroup.PotentialBillGiver:
                return(!def.AllRecipes.NullOrEmpty());

            case ThingRequestGroup.Medicine:
                return(def.IsMedicine);

            case ThingRequestGroup.Apparel:
                return(def.IsApparel);

            case ThingRequestGroup.MinifiedThing:
                return(typeof(MinifiedThing).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Filth:
                return(def.filth != null);

            case ThingRequestGroup.AttackTarget:
                return(typeof(IAttackTarget).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Weapon:
                return(def.IsWeapon);

            case ThingRequestGroup.Refuelable:
                return(def.HasComp(typeof(CompRefuelable)));

            case ThingRequestGroup.HaulableEverOrMinifiable:
                if (!def.EverHaulable)
                {
                    return(def.Minifiable);
                }
                return(true);

            case ThingRequestGroup.Drug:
                return(def.IsDrug);

            case ThingRequestGroup.Shell:
                return(def.IsShell);

            case ThingRequestGroup.Bed:
                return(def.IsBed);

            case ThingRequestGroup.Grave:
                return(typeof(Building_Grave).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Art:
                return(def.HasComp(typeof(CompArt)));

            case ThingRequestGroup.ThingHolder:
                return(def.ThisOrAnyCompIsThingHolder());

            case ThingRequestGroup.ActiveDropPod:
                return(typeof(IActiveDropPod).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Transporter:
                return(def.HasComp(typeof(CompTransporter)));

            case ThingRequestGroup.LongRangeMineralScanner:
                return(def.HasComp(typeof(CompLongRangeMineralScanner)));

            case ThingRequestGroup.AffectsSky:
                return(def.HasComp(typeof(CompAffectsSky)));

            case ThingRequestGroup.WindSource:
                return(def.HasComp(typeof(CompWindSource)));

            case ThingRequestGroup.AlwaysFlee:
                return(def.alwaysFlee);

            case ThingRequestGroup.Fire:
                return(typeof(Fire).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.ResearchBench:
                return(typeof(Building_ResearchBench).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Facility:
                return(def.HasComp(typeof(CompFacility)));

            case ThingRequestGroup.AffectedByFacilities:
                return(def.HasComp(typeof(CompAffectedByFacilities)));

            case ThingRequestGroup.CreatesInfestations:
                return(def.HasComp(typeof(CompCreatesInfestations)));

            case ThingRequestGroup.WithCustomRectForSelector:
                return(def.hasCustomRectForSelector);

            case ThingRequestGroup.ProjectileInterceptor:
                return(def.HasComp(typeof(CompProjectileInterceptor)));

            case ThingRequestGroup.ConditionCauser:
                return(def.GetCompProperties <CompProperties_CausesGameCondition>() != null);

            case ThingRequestGroup.MusicalInstrument:
                return(typeof(Building_MusicalInstrument).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.Throne:
                return(typeof(Building_Throne).IsAssignableFrom(def.thingClass));

            case ThingRequestGroup.FoodDispenser:
                return(def.IsFoodDispenser);

            case ThingRequestGroup.Projectile:
                return(def.projectile != null);

            case ThingRequestGroup.MeditationFocus:
                return(def.HasComp(typeof(CompMeditationFocus)));

            case ThingRequestGroup.Chunk:
                if (!def.thingCategories.NullOrEmpty())
                {
                    if (!def.thingCategories.Contains(ThingCategoryDefOf.Chunks))
                    {
                        return(def.thingCategories.Contains(ThingCategoryDefOf.StoneChunks));
                    }
                    return(true);
                }
                return(false);

            default:
                throw new ArgumentException("group");
            }
        }