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