public Dictionary <MachinePermutation, int> GetMinimumMiners() { Dictionary <MachinePermutation, int> results = new Dictionary <MachinePermutation, int>(); Resource resource = DataCache.Resources.Values.FirstOrDefault(r => r.result == SuppliedItem.Name); if (resource == null) { return(results); } List <Miner> allowedMiners = DataCache.Miners.Values .Where(m => m.Enabled) .Where(m => m.ResourceCategories.Contains(resource.Category)).ToList(); List <MachinePermutation> allowedPermutations = new List <MachinePermutation>(); foreach (Miner miner in allowedMiners) { allowedPermutations.AddRange(miner.GetAllPermutations()); } List <MachinePermutation> sortedPermutations = allowedPermutations.OrderBy(p => p.GetRate(resource.Time)).ToList(); if (sortedPermutations.Any()) { float requiredRate = GetRequiredOutput(SuppliedItem); MachinePermutation permutationToAdd = sortedPermutations.LastOrDefault(a => a.GetRate(resource.Time) < requiredRate); if (permutationToAdd != null) { int numberToAdd = Convert.ToInt32(Math.Ceiling(requiredRate / permutationToAdd.GetRate(resource.Time))); results.Add(permutationToAdd, numberToAdd); } } return(results); }
public Dictionary <MachinePermutation, int> GetMinimumAssemblers() { var results = new Dictionary <MachinePermutation, int>(); double requiredRate = GetRateRequiredByOutputs(); List <Assembler> allowedAssemblers = DataCache.Assemblers.Values .Where(a => a.Enabled) .Where(a => a.Categories.Contains(BaseRecipe.Category)) .Where(a => a.MaxIngredients >= BaseRecipe.Ingredients.Count).ToList(); List <MachinePermutation> allowedPermutations = new List <MachinePermutation>(); foreach (Assembler assembler in allowedAssemblers) { allowedPermutations.AddRange(assembler.GetAllPermutations()); } var sortedPermutations = allowedPermutations.OrderBy(a => a.GetRate(BaseRecipe.Time)).ToList(); if (sortedPermutations.Any()) { double totalRateSoFar = 0; while (totalRateSoFar < requiredRate) { double remainingRate = requiredRate - totalRateSoFar; MachinePermutation permutationToAdd = sortedPermutations.LastOrDefault(p => p.GetRate(BaseRecipe.Time) <= remainingRate); if (permutationToAdd != null) { int numberToAdd; if (Graph.OneAssemblerPerRecipe) { numberToAdd = Convert.ToInt32(Math.Ceiling(remainingRate / permutationToAdd.GetRate(BaseRecipe.Time))); } else { numberToAdd = Convert.ToInt32(Math.Floor(remainingRate / permutationToAdd.GetRate(BaseRecipe.Time))); } results.Add(permutationToAdd, numberToAdd); } else { permutationToAdd = sortedPermutations.FirstOrDefault(a => a.GetRate(BaseRecipe.Time) > remainingRate); int amount = Convert.ToInt32(Math.Ceiling(remainingRate / permutationToAdd.GetRate(BaseRecipe.Time))); if (results.ContainsKey(permutationToAdd)) { results[permutationToAdd] += amount; } else { results.Add(permutationToAdd, amount); } } totalRateSoFar = 0; foreach (var a in results) { totalRateSoFar += a.Key.GetRate(BaseRecipe.Time) * a.Value; } } } return(results); }