예제 #1
0
        private static bool TryFindBestBillIngredientsInSet_NoMix(List <Thing> availableThings, Bill bill, List <ThingCount> chosen)
        {
            RecipeDef recipe = bill.recipe;

            chosen.Clear();
            WorkGiver_DoBill.availableCounts.Clear();
            WorkGiver_DoBill.availableCounts.GenerateFrom(availableThings);
            for (int i = 0; i < WorkGiver_DoBill.ingredientsOrdered.Count; i++)
            {
                IngredientCount ingredientCount = recipe.ingredients[i];
                bool            flag            = false;
                for (int j = 0; j < WorkGiver_DoBill.availableCounts.Count; j++)
                {
                    float num = (float)ingredientCount.CountRequiredOfFor(WorkGiver_DoBill.availableCounts.GetDef(j), bill.recipe);
                    if (num <= WorkGiver_DoBill.availableCounts.GetCount(j))
                    {
                        if (ingredientCount.filter.Allows(WorkGiver_DoBill.availableCounts.GetDef(j)))
                        {
                            if (ingredientCount.IsFixedIngredient || bill.ingredientFilter.Allows(WorkGiver_DoBill.availableCounts.GetDef(j)))
                            {
                                for (int k = 0; k < availableThings.Count; k++)
                                {
                                    if (availableThings[k].def == WorkGiver_DoBill.availableCounts.GetDef(j))
                                    {
                                        int num2 = availableThings[k].stackCount - ThingCountUtility.CountOf(chosen, availableThings[k]);
                                        if (num2 > 0)
                                        {
                                            int num3 = Mathf.Min(Mathf.FloorToInt(num), num2);
                                            ThingCountUtility.AddToList(chosen, availableThings[k], num3);
                                            num -= (float)num3;
                                            if (num < 0.001f)
                                            {
                                                flag = true;
                                                float num4 = WorkGiver_DoBill.availableCounts.GetCount(j);
                                                num4 -= (float)ingredientCount.CountRequiredOfFor(WorkGiver_DoBill.availableCounts.GetDef(j), bill.recipe);
                                                WorkGiver_DoBill.availableCounts.SetCount(j, num4);
                                                break;
                                            }
                                        }
                                    }
                                }
                                if (flag)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
                if (!flag)
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #2
0
        internal static bool TryFindBestMixInSet_NoMix(List <Thing> availableThings, Bill bill, List <ThingCount> chosen, List <IngredientCount> ingredientsOrdered)
        {
            var       availableCounts = new BMixDefCountList();
            RecipeDef recipe          = bill.recipe;

            chosen.Clear();
            availableCounts.Clear();
            availableCounts.GenerateFrom(availableThings);
            for (var i = 0; i < ingredientsOrdered.Count; i++)
            {
                IngredientCount ingredientCount = recipe.ingredients[i];
                var             flag            = false;
                for (var j = 0; j < availableCounts.Count; j++)
                {
                    float num = ingredientCount.CountRequiredOfFor(availableCounts.GetDef(j), bill.recipe);
                    if (num > availableCounts.GetCount(j) || !ingredientCount.filter.Allows(availableCounts.GetDef(j)) || (!ingredientCount.IsFixedIngredient && !bill.ingredientFilter.Allows(availableCounts.GetDef(j))))
                    {
                        continue;
                    }
                    for (var k = 0; k < availableThings.Count; k++)
                    {
                        if (availableThings[k].def != availableCounts.GetDef(j))
                        {
                            continue;
                        }
                        var num2 = availableThings[k].stackCount - ThingCountUtility.CountOf(chosen, availableThings[k]);
                        if (num2 > 0)
                        {
                            var num3 = Mathf.Min(Mathf.FloorToInt(num), num2);
                            ThingCountUtility.AddToList(chosen, availableThings[k], num3);
                            num -= (float)num3;
                            if (num < 0.001f)
                            {
                                flag = true;
                                var 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);
        }
예제 #3
0
        private static bool TryFindBestBillIngredientsInSet_NoMix(List <Thing> availableThings, Building_CokeFurnace bill, List <ThingCount> chosen)
        {
            RecipeDef recipe = bill.SelectedRecipe;

            chosen.Clear();
            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.SelectedRecipe);
                    if (num > availableCounts.GetCount(j) || !ingredientCount.filter.Allows(availableCounts.GetDef(j)) || !ingredientCount.IsFixedIngredient)
                    {
                        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)
                        {
                            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.SelectedRecipe);
                                availableCounts.SetCount(j, count);
                                break;
                            }
                        }
                    }
                    if (flag)
                    {
                        break;
                    }
                }
                if (!flag)
                {
                    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 TryFindBestBillIngredientsInSet_NoMix(List <Thing> availableThings, Bill bill, List <ThingCount> chosen, IntVec3 rootCell, bool alreadySorted)
        {
            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();
            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);
        }
예제 #6
0
        private static bool TryFindBestBillIngredientsInSet_NoMix(
            List <Thing> availableThings,
            Bill bill,
            List <ThingCount> chosen)
        {
            var recipe = bill.recipe;

            chosen.Clear();
            availableCounts.Clear();

            // 利用可能な材料リストとその個数
            // Things側はゲーム中に見えているThingのリスト
            // Counts側は、違うThingでも個数をまとめている
            availableCounts.GenerateFrom(availableThings);

            // レシピが必要としている材料の種類だけループ
            foreach (var ingredientCount in recipe.ingredients)
            {
                var isIngredientFound = false;
                for (var j = 0; j < availableCounts.Count; j++)
                {
                    // 利用可能な物
                    var curDef   = availableCounts.GetDef(j);
                    var curCount = availableCounts.GetCount(j);

                    // レシピ完遂のためにそれが何個必要なのか
                    var requiredCount       = (float)ingredientCount.CountRequiredOfFor(curDef, bill.recipe);
                    var remainRequiredCount = requiredCount;

                    // 利用可能な個数は必要数より少ない
                    if (requiredCount > curCount)
                    {
                        continue;
                    }

                    // レシピとして許可されていない
                    if (!ingredientCount.filter.Allows(curDef))
                    {
                        continue;
                    }

                    // レシピの固定材料でもなければ billとして許可されているわけでもない
                    if (!ingredientCount.IsFixedIngredient && !bill.ingredientFilter.Allows(curDef))
                    {
                        continue;
                    }

                    // Thingの検索
                    foreach (var availableThing in availableThings)
                    {
                        // 探している物ではない
                        if (availableThing.def != curDef)
                        {
                            continue;
                        }

                        // 未使用の材料数(全個数から、既に追加されている個数を引いた数)
                        var unusedCount = availableThing.stackCount - ThingCountUtility.CountOf(chosen, availableThing);

                        // 未使用数0以下
                        if (unusedCount <= 0)
                        {
                            continue;
                        }

                        // そのスタックからいくつ使うか(必要数と未使用数のうち小さい方)
                        var actualUseCount = Mathf.Min(Mathf.FloorToInt(remainRequiredCount), unusedCount);

                        // リストに加える
                        ThingCountUtility.AddToList(chosen, availableThing, actualUseCount);

                        // 残りの必要個数を減らす
                        remainRequiredCount -= actualUseCount;

                        // まだ必要であれば続けて探す
                        if (remainRequiredCount >= 0.001f)
                        {
                            continue;
                        }

                        // その材料は全部見つかった
                        // ⇒残りの利用可能数を減らす
                        isIngredientFound = true;
                        availableCounts.SetCount(j, curCount - requiredCount);
                        break;
                    }

                    // その材料は全部見つかったので残りは探さなくていい
                    if (isIngredientFound)
                    {
                        break;
                    }
                }

                // 1個でも見つからない材料があればダメ
                if (!isIngredientFound)
                {
                    return(false);
                }
            }

            // 全部見つかったのでOK
            return(true);
        }