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); }
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); }
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); }
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); }
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); }
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); }