Пример #1
0
 static WorkGiver_Repair()
 {
     ReCheckFailedBillTicksRange = new IntRange(500, 600);
     RelevantThings    = new List <Thing>();
     NewRelevantThings = new List <Thing>();
     AssignedThings    = new HashSet <Thing>();
     AvailableCounts   = new DefCountList();
 }
        public static bool TryFindBestRecipeIngredientsInSet_NoMix(this RecipeDef recipeDef, List <Thing> availableThings, List <ThingCount> chosen)
        {
            chosen.Clear();
            List <IngredientCount> ingredientsOrdered = new List <IngredientCount>();
            HashSet <Thing>        assignedThings     = new HashSet <Thing>();
            DefCountList           availableCounts    = new DefCountList();

            availableCounts.GenerateFrom(availableThings);

            for (int ingredientIndex = 0; ingredientIndex < recipeDef.ingredients.Count; ++ingredientIndex)
            {
                IngredientCount ingredientCount = recipeDef.ingredients[ingredientIndex];
                if (ingredientCount.filter.AllowedDefCount == 1)
                {
                    ingredientsOrdered.Add(ingredientCount);
                }
            }
            for (int ingredientIndex = 0; ingredientIndex < recipeDef.ingredients.Count; ++ingredientIndex)
            {
                IngredientCount ingredientCount = recipeDef.ingredients[ingredientIndex];
                if (!ingredientsOrdered.Contains(ingredientCount))
                {
                    ingredientsOrdered.Add(ingredientCount);
                }
            }

            for (int orderedIndex = 0; orderedIndex < ingredientsOrdered.Count; ++orderedIndex)
            {
                IngredientCount ingredientCount = recipeDef.ingredients[orderedIndex];
                bool            hasAllRequired  = false;
                for (int countsIndex = 0; countsIndex < availableCounts.Count; ++countsIndex)
                {
                    float countRequiredFor = (float)ingredientCount.CountRequiredOfFor(availableCounts.GetDef(countsIndex), recipeDef);
                    if (
                        ((double)countRequiredFor <= (double)availableCounts.GetCount(countsIndex)) &&
                        (ingredientCount.filter.Allows(availableCounts.GetDef(countsIndex)))
                        )
                    {
                        for (int thingsIndex = 0; thingsIndex < availableThings.Count; ++thingsIndex)
                        {
                            if (
                                (availableThings[thingsIndex].def == availableCounts.GetDef(countsIndex)) &&
                                (!assignedThings.Contains(availableThings[thingsIndex]))
                                )
                            {
                                int countToAdd = Mathf.Min(Mathf.FloorToInt(countRequiredFor), availableThings[thingsIndex].stackCount);
                                ThingCountUtility.AddToList(chosen, availableThings[thingsIndex], countToAdd);
                                countRequiredFor -= (float)countToAdd;
                                assignedThings.Add(availableThings[thingsIndex]);
                                if ((double)countRequiredFor < 1.0 / 1000.0)
                                {
                                    hasAllRequired = true;
                                    float val = availableCounts.GetCount(countsIndex) - ingredientCount.GetBaseCount();
                                    availableCounts.SetCount(countsIndex, val);
                                    break;
                                }
                            }
                        }
                        if (hasAllRequired)
                        {
                            break;
                        }
                    }
                }
                if (!hasAllRequired)
                {
                    return(false);
                }
            }
            return(true);
        }
Пример #3
0
    public static bool TryFindBestRecipeIngredientsInSet_NoMix(this RecipeDef recipeDef,
                                                               List <Thing> availableThings, List <ThingCount> chosen)
    {
        chosen.Clear();
        var ingredientsOrdered = new List <IngredientCount>();
        var assignedThings     = new HashSet <Thing>();
        var availableCounts    = new DefCountList();

        availableCounts.GenerateFrom(availableThings);

        foreach (var ingredientCount in recipeDef.ingredients)
        {
            if (ingredientCount.filter.AllowedDefCount == 1)
            {
                ingredientsOrdered.Add(ingredientCount);
            }
        }

        foreach (var ingredientCount in recipeDef.ingredients)
        {
            if (!ingredientsOrdered.Contains(ingredientCount))
            {
                ingredientsOrdered.Add(ingredientCount);
            }
        }

        for (var orderedIndex = 0; orderedIndex < ingredientsOrdered.Count; ++orderedIndex)
        {
            var ingredientCount = recipeDef.ingredients[orderedIndex];
            var hasAllRequired  = false;
            for (var countsIndex = 0; countsIndex < availableCounts.Count; ++countsIndex)
            {
                var countRequiredFor =
                    (float)ingredientCount.CountRequiredOfFor(availableCounts.GetDef(countsIndex), recipeDef);
                if (!(countRequiredFor <= (double)availableCounts.GetCount(countsIndex)) ||
                    !ingredientCount.filter.Allows(availableCounts.GetDef(countsIndex)))
                {
                    continue;
                }

                foreach (var thing in availableThings)
                {
                    if (thing.def != availableCounts.GetDef(countsIndex) || assignedThings.Contains(thing))
                    {
                        continue;
                    }

                    var countToAdd = Mathf.Min(Mathf.FloorToInt(countRequiredFor),
                                               thing.stackCount);
                    ThingCountUtility.AddToList(chosen, thing, countToAdd);
                    countRequiredFor -= countToAdd;
                    assignedThings.Add(thing);
                    if (!(countRequiredFor < 1.0 / 1000.0))
                    {
                        continue;
                    }

                    hasAllRequired = true;
                    var val = availableCounts.GetCount(countsIndex) - ingredientCount.GetBaseCount();
                    availableCounts.SetCount(countsIndex, val);
                    break;
                }

                if (hasAllRequired)
                {
                    break;
                }
            }

            if (!hasAllRequired)
            {
                return(false);
            }
        }

        return(true);
    }
Пример #4
0
        private static bool TryFindBestBillIngredientsInSet_NoMix2(
            List <Thing> availableThings,
            Bill bill,
            List <ThingCount> chosen,
            IntVec3 rootCell,
            bool alreadySorted, List <IngredientCount> ingredientsOrdered)
        {
            if (!alreadySorted)
            {
                Comparison <Thing> comparison = (t1, t2) => ((float)(t1.Position - rootCell).LengthHorizontalSquared).CompareTo((t2.Position - rootCell).LengthHorizontalSquared);
                availableThings.Sort(comparison);
            }
            RecipeDef recipe = bill.recipe;

            chosen.Clear();
            //WorkGiver_DoBill.availableCounts.Clear();
            DefCountList availableCounts = new DefCountList();

            availableCounts.GenerateFrom(availableThings);
            for (int index1 = 0; index1 < ingredientsOrdered.Count; ++index1)
            {
                IngredientCount ingredient = recipe.ingredients[index1];
                bool            flag       = false;
                for (int index2 = 0; index2 < availableCounts.Count; ++index2)
                {
                    float f = ingredient.CountRequiredOfFor(availableCounts.GetDef(index2), bill.recipe);
                    if ((recipe.ignoreIngredientCountTakeEntireStacks || f <= availableCounts.GetCount(index2)) && ingredient.filter.Allows(availableCounts.GetDef(index2)) && (ingredient.IsFixedIngredient || bill.ingredientFilter.Allows(availableCounts.GetDef(index2))))
                    {
                        for (int index3 = 0; index3 < availableThings.Count; ++index3)
                        {
                            if (availableThings[index3].def == availableCounts.GetDef(index2))
                            {
                                int num = availableThings[index3].stackCount - ThingCountUtility.CountOf(chosen, availableThings[index3]);
                                if (num > 0)
                                {
                                    if (recipe.ignoreIngredientCountTakeEntireStacks)
                                    {
                                        ThingCountUtility.AddToList(chosen, availableThings[index3], num);
                                        return(true);
                                    }
                                    int countToAdd = Mathf.Min(Mathf.FloorToInt(f), num);
                                    ThingCountUtility.AddToList(chosen, availableThings[index3], countToAdd);
                                    f -= countToAdd;
                                    if (f < 1.0 / 1000.0)
                                    {
                                        flag = true;
                                        float val = availableCounts.GetCount(index2) - ingredient.CountRequiredOfFor(availableCounts.GetDef(index2), bill.recipe);
                                        availableCounts.SetCount(index2, val);
                                        break;
                                    }
                                }
                            }
                        }
                        if (flag)
                        {
                            break;
                        }
                    }
                }
                if (!flag)
                {
                    return(false);
                }
            }
            return(true);
        }
Пример #5
0
        private static bool TryFindAnyBillIngredientsInSet_NoMix(List <Thing> availableThings, Bill bill, List <ThingCount> chosen, IntVec3 rootCell, bool alreadySorted, List <IngredientCount> ingredientsOrdered)
        {
            /*
             * if (!alreadySorted)
             * {
             *  Comparison<Thing> comparison = delegate (Thing t1, Thing t2)
             *  {
             *      float num4 = (t1.Position - rootCell).LengthHorizontalSquared;
             *      float value = (t2.Position - rootCell).LengthHorizontalSquared;
             *      return num4.CompareTo(value);
             *  };
             *  availableThings.Sort(comparison);
             * }
             */
            RecipeDef recipe = bill.recipe;

            chosen.Clear();
            DefCountList availableCounts = new DefCountList();

            //availableCounts.Clear();
            availableCounts.GenerateFrom(availableThings);
            for (int i = 0; i < ingredientsOrdered.Count; i++)
            {
                IngredientCount ingredientCount = recipe.ingredients[i];
                bool            flag            = false;
                for (int j = 0; j < availableCounts.Count; j++)
                {
                    float num = ingredientCount.CountRequiredOfFor(availableCounts.GetDef(j), bill.recipe);
                    if ((!recipe.ignoreIngredientCountTakeEntireStacks && num > availableCounts.GetCount(j)) || !ingredientCount.filter.Allows(availableCounts.GetDef(j)) || (!ingredientCount.IsFixedIngredient && !bill.ingredientFilter.Allows(availableCounts.GetDef(j))))
                    {
                        continue;
                    }

                    for (int k = 0; k < availableThings.Count; k++)
                    {
                        if (availableThings[k].def != availableCounts.GetDef(j))
                        {
                            continue;
                        }

                        int num2 = availableThings[k].stackCount - ThingCountUtility.CountOf(chosen, availableThings[k]);
                        if (num2 > 0)
                        {
                            if (recipe.ignoreIngredientCountTakeEntireStacks)
                            {
                                ThingCountUtility.AddToList(chosen, availableThings[k], num2);
                                return(true);
                            }

                            int num3 = Mathf.Min(Mathf.FloorToInt(num), num2);
                            ThingCountUtility.AddToList(chosen, availableThings[k], num3);
                            num -= (float)num3;
                            if (num < 0.001f)
                            {
                                flag = true;
                                float count = availableCounts.GetCount(j);
                                count -= (float)ingredientCount.CountRequiredOfFor(availableCounts.GetDef(j), bill.recipe);
                                availableCounts.SetCount(j, count);
                                break;
                            }
                        }
                    }

                    if (flag)
                    {
                        break;
                    }
                }

                if (!flag)
                {
                    return(false);
                }
            }

            return(true);
        }