Ejemplo n.º 1
0
        public static ResearchProjectDef GetBestRPDForBuilding(ThingDef td, bool ignoreLocked = false)
        {
            if (td.category != ThingCategory.Building && td.building == null)
            {
                Log.Error("Tried to get RPD for building, but thingDef is not building");
                return(null);
            }
            ResearchProjectDef overrideRPD;

            if (GearAssigner.GetOverrideAssignment(td, out overrideRPD))
            {
                return(overrideRPD);
            }

            if (td.researchPrerequisites != null && td.researchPrerequisites.Count > 0)
            {
                foreach (ResearchProjectDef prereq in td.researchPrerequisites)
                {
                    if (prereq.techprintCount > 0)
                    {
                        return(prereq);
                    }
                }
                if (TechprintingSettings.printAllItems || ignoreLocked)
                {
                    return(td.researchPrerequisites[0]);
                }
            }

            return(null);
        }
Ejemplo n.º 2
0
        public static ResearchProjectDef GetBestRPDForRecipe(RecipeDef recipe, bool ignoreLocked = false)
        {
            ThingDef thingDef = recipe.ProducedThingDef;

            if (thingDef == null)
            {
                return(null);
            }
            ResearchProjectDef overrideRPD;

            if (GearAssigner.GetOverrideAssignment(thingDef, out overrideRPD))
            {
                return(overrideRPD);
            }
            if ((thingDef.category == ThingCategory.Building || thingDef.building != null) && !TechprintingSettings.shardBuildings)
            {
                return(null);
            }
            if (TechprintingSettings.weaponsApparelOnly && (!thingDef.IsWeapon && !thingDef.IsApparel) && !ignoreLocked && !TechprintingSettings.printAllItems)
            {
                return(null);
            }

            if (recipe.researchPrerequisite != null)             // direct prereq for this recipe
            {
                if (recipe.researchPrerequisite.techprintCount > 0 || TechprintingSettings.printAllItems || ignoreLocked)
                {
                    return(recipe.researchPrerequisite);
                }
            }

            if (recipe.researchPrerequisites != null && recipe.researchPrerequisites.Count > 0)             // prerequisites list, never seen this but could be possible, not sure what's checked for
            {
                foreach (ResearchProjectDef prereq in recipe.researchPrerequisites)
                {
                    if (prereq.techprintCount > 0)
                    {
                        return(prereq);
                    }
                }
                if (TechprintingSettings.printAllItems || ignoreLocked)
                {
                    return(recipe.researchPrerequisites[0]);
                }
            }

            if (recipe.recipeUsers != null)             // no direct prereqs, look at benches
            {
                foreach (ThingDef user in recipe.recipeUsers)
                {
                    if (user.researchPrerequisites != null && user.researchPrerequisites.Count > 0)
                    {
                        foreach (ResearchProjectDef prereq in user.researchPrerequisites)
                        {
                            if (prereq.techprintCount > 0)
                            {
                                return(prereq);
                            }
                        }
                    }
                }
                if (TechprintingSettings.printAllItems || ignoreLocked)
                {
                    float    lowestSpeed = 99999f;
                    ThingDef bestThing   = null;
                    foreach (ThingDef user in recipe.recipeUsers)
                    {
                        if (user.researchPrerequisites != null && user.researchPrerequisites.Count > 0)
                        {
                            float workRate = user.GetStatValueAbstract(StatDefOf.WorkTableWorkSpeedFactor);
                            if (workRate < lowestSpeed)
                            {
                                bestThing   = user;
                                lowestSpeed = workRate;
                            }
                        }
                    }
                    if (bestThing != null)
                    {
                        return(bestThing.researchPrerequisites[0]);
                    }
                }
            }
            return(null);
        }