Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }