public Nanofactory(List <string> reactionList) { foreach (var l in reactionList) { List <InputOutputChemical> reactionInputs = new List <InputOutputChemical>(); var equationSides = l.Split("=>"); var outputChemicalStr = equationSides.Last().Trim().Split(' ').Last(); int outputChemicalAmt = int.Parse(equationSides.Last().Trim().Split(' ').First()); var outputProduction = new InputOutputChemical { Amount = outputChemicalAmt, Chemical = outputChemicalStr }; var inputChemicals = equationSides.First().Split(','); foreach (var c in inputChemicals) { var inputChemStr = c.Trim().Split(' ').Last(); int inputChemAmt = int.Parse(c.Trim().Split(' ').First()); reactionInputs.Add(new InputOutputChemical { Amount = inputChemAmt, Chemical = inputChemStr }); } Reactions.Add(outputProduction.Chemical, new Reaction { Output = outputProduction, RequiredInputs = reactionInputs }); } }
public void RunFactory(InputOutputChemical request) { if (request.Chemical.Equals("ORE")) { OreCount += request.Amount; return; } // if we have extra if (ExtraMaterials.ContainsKey(request.Chemical)) { if (ExtraMaterials[request.Chemical] < request.Amount) { request.Amount -= ExtraMaterials[request.Chemical]; ExtraMaterials[request.Chemical] = 0; } else { ExtraMaterials[request.Chemical] -= request.Amount; return; } } var reaction = Reactions[request.Chemical]; // how many times we need to run the reaction var reactionCount = (int)Math.Ceiling(request.Amount / (double)reaction.Output.Amount); // go through each input for the reaction that's needed // to create this amount of output foreach (var p in reaction.RequiredInputs) { RunFactory(new InputOutputChemical { Amount = p.Amount * reactionCount, Chemical = p.Chemical }); } // if the reaction creates more output than was in the request, // store it for another potential use if (reaction.Output.Amount * reactionCount > request.Amount) { if (ExtraMaterials.ContainsKey(reaction.Output.Chemical)) { ExtraMaterials[reaction.Output.Chemical] += (reaction.Output.Amount * reactionCount) - request.Amount; } else { ExtraMaterials.Add(reaction.Output.Chemical, (reaction.Output.Amount * reactionCount) - request.Amount); } } }