diff --git a/html/crafting.js b/html/crafting.js index b23795782..8234ff70a 100644 --- a/html/crafting.js +++ b/html/crafting.js @@ -26,8 +26,14 @@ function onCraftingSelectorChanged() { $("#crafting_error").fadeIn(FADE_DURATION).delay(ERROR_DISPLAY_DURATION).fadeOut(FADE_DURATION); } else { var count = parseInt($("#crafting_count option:selected").val()); + var inventory = createManifest(); - var missingMaterials = recipe.computeMissingMaterials(inventory, count); + var missingMaterials = createManifest(); + for (var i = 0; i < count; i++) { + recipe.craft(inventory, missingMaterials); + if (inventory.contains(count, recipeName)) break; + } + $("#missing_materials").html(missingMaterials.toHtml()); $("#leftover_materials").html(inventory.toHtml()); $("#crafting_output").fadeIn(FADE_DURATION); @@ -119,6 +125,10 @@ function createManifest() { } }; + object.removeAll = function() { + object.materials = {}; + } + object.toHtml = function() { var result = ""; var count = 0; @@ -149,56 +159,52 @@ function createRecipe(data) { // Methods //////////////////////////////////////////// - object.computeMissingMaterials = function(inventory, count) { + object.craft = function(inventory, missingMaterials) { if (inventory === undefined) inventory = createManifest(); - if (count === undefined) count = 1; - var missingMaterials = createManifest(); - var queue = []; + if (missingMaterials === undefined) missingMaterials = createManifest(); + var toCraftManifest = createManifest(); + + function drainCraftingManifest(consumeItems) { + for (var name in toCraftManifest.materials) { + var count = toCraftManifest.materials[name]; + var itemRecipe = findRecipe(name); - function craftItem(ingredient) { - var recipe = findRecipe(ingredient.name); - if (recipe === undefined) { - missingMaterials.add(1, ingredient.name); - ingredient.count -= 1 - } else { - $.each(recipe.input, function(j, childIngredient) { - queue.push({count: childIngredient.count, name: childIngredient.name}); - }); - $.each(recipe.output, function(j, childProduct) { - inventory.add(childProduct.count, childProduct.name); - }); - $.each(recipe.tools, function(j, tool) { - if (! inventory.contains(1, tool)) { - if (findRecipe(tool) === undefined) { - inventory.add(1, tool); - missingMaterials.add(1, tool); - } else { - craftItem({count: 1, name: tool}); + for (var i = 0; i < count; i++) { + if (inventory.contains(1, name)) { + if (consumeItems) { + inventory.remove(1, name); + } + } else if (itemRecipe === undefined) { + missingMaterials.add(1, name); + } else { + itemRecipe.craft(inventory, missingMaterials); + if (consumeItems) { + inventory.remove(1, name); } } - }); - } - return recipe; - } - - for (var i = 0; i < count; i++) { - craftItem({count: 1, name: object.output[0].name}); - } - - while (queue.length > 0) { - var ingredient = queue.shift(); - while (ingredient.count > 0) { - if (inventory.contains(1, ingredient.name)) { - inventory.remove(1, ingredient.name); - ingredient.count -= 1; - } else { - console.log("Crafting ingredient: " + ingredient.name); - craftItem(ingredient); } } + toCraftManifest.removeAll(); } - return missingMaterials; - } + + $(object.input).each(function(i, input) { + for (var j = 0; j < input.count; j++) { + toCraftManifest.add(1, input.name); + } + }); + drainCraftingManifest(true); + + $(object.tools).each(function(i, tool) { + if (! inventory.contains(1, tool)) { + toCraftManifest.add(1, tool); + } + }); + drainCraftingManifest(false); + + $(object.output).each(function(i, output) { + inventory.add(output.count, output.name); + }); + }; return object; }