public bool CraftItem(ResourceInventory ResourceInv, InventoryController SourceInv, InventoryController TargetInv, Recipe CraftRecipe, bool ByPassCraftCheck = false) { if (!ByPassCraftCheck) //optimization to skip checking if we can craft this recipe { if (!CanCraft(ResourceInv, SourceInv, TargetInv, CraftRecipe)) { return(false); } } foreach (var itemIn in CraftRecipe.ItemInput) //TODO Optimize data structure to allow use of a single foreach for inputs { SourceInv.RemoveFromItemBucket(itemIn.item, itemIn.amount); } foreach (var resourceIn in CraftRecipe.ResourceInput) { ResourceInv.RemoveResource(resourceIn.resource, resourceIn.amount); } TargetInv.AddToItemBucket(CraftRecipe.Output.item, CraftRecipe.Output.amount); if (!CraftRecipe.CreatesByProducts) { return(true); } foreach (var itemOut in CraftRecipe.ItemByProducts)//TODO Optimize data structure to allow use of a single foreach for outputs { TargetInv.AddToItemBucket(itemOut.item, itemOut.amount); } foreach (var resOut in CraftRecipe.ResourceByProducts) { ResourceInv.AddResource(resOut.resource, resOut.amount); } return(true); }