rules54

direTable alpha

Jul 15th, 2016
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local tArgs = {...}
  2. local p = peripheral.wrap("bottom")
  3. local c = peripheral.wrap("top")
  4.  
  5. local function loadRecipes() -- return contents of recipes as table
  6.     local data = nil
  7.     if fs.exists("recipes") then
  8.         file = fs.open("recipes", "r")
  9.         data = textutils.unserialize(file.readAll())
  10.         file.close()
  11.     end
  12.     return data
  13. end
  14.  
  15. local function learnRecipe() --returns disp_name (string), recipeLearned (bool), recipeExists (bool)
  16.     local product = p.getStackInSlot(1)
  17.     local recipeExists, recipeLearned = false
  18.     if product then
  19.         local recipe = {product = product.display_name, schematic = {}, ingredient = {}}
  20.         for i=2, 82 do
  21.             local slot = p.getStackInSlot(i)
  22.             if slot then
  23.                 local name = slot.display_name
  24.                 recipe.schematic[i] = name
  25.                 if recipe.ingredient[name] then
  26.                     recipe.ingredient[name] = recipe.ingredient[name] + slot.qty
  27.                 else
  28.                   recipe.ingredient[name] = slot.qty
  29.                 end
  30.             end
  31.         end --ends for schematic record loop
  32.         local savedRecipes = {}
  33.         local writeRecipe = false
  34.         if fs.exists("recipes") then   
  35.             savedRecipes = loadRecipes()
  36.             if savedRecipes[recipe.product] then
  37.                 --print("Recipe for "..recipe.product.. " already exists.")
  38.                 recipeExists = true
  39.             else writeRecipe = true
  40.             end
  41.         else writeRecipe = true
  42.         end
  43.         if writeRecipe then
  44.             savedRecipes[product.display_name] = recipe
  45.             local file = fs.open("recipes", "w")
  46.             file.write(textutils.serialize(savedRecipes))
  47.             file.close()
  48.             recipeLearned = true
  49.         end
  50.     end
  51.     return product.displayname, recipeLearned, recipeExists
  52. end
  53.  
  54. local function chestQuery() -- returns table | table.slotNum == display_name, table.qty.display_name == total qty
  55.     local chestSize = c.getInventorySize()
  56.     local chest = {slotNum = {}, qty = {}}
  57.     for i=1, chestSize do
  58.       local slot = c.getStackInSlot(i)
  59.       if slot then
  60.         local name = slot.display_name
  61.         chest.slotNum[i] = name
  62.         if chest.qty[name] then
  63.           chest.qty[name] = chest.qty[name] + slot.qty
  64.         else
  65.           chest.qty[name] = slot.qty
  66.         end  
  67.       end
  68.     end
  69.     return(chest)
  70. end
  71.  
  72. local function checkStock(item) -- returns boolean 'craftable', table missingIngredients
  73.     local recipes = loadRecipes()
  74.     local stock = chestQuery()
  75.     local craftable = false
  76.    
  77.     for k,v in pairs(recipes) do
  78.         if k == item then
  79.             craftable = true
  80.         end
  81.     end
  82.  
  83.     local missingIngredients = recipes[item].ingredient
  84.     local missingSum = 0
  85.     if craftable then
  86.         for k,v in pairs(stock.qty) do
  87.             missingIngredients[k] = missingIngredients[k] - v
  88.             missingSum = missingSum + missingIngredients[k]
  89.         end
  90.     end
  91.    
  92.     if missingSum <= 0 then
  93.         craftable = true
  94.     else
  95.         craftable = false
  96.     end
  97.    
  98.     return craftable, missingIngredients
  99. end
  100.  
  101. local function craft(item)
  102.     if checkStock(item) then
  103.         local recipes = loadRecipes()
  104.         local schematic = recipes[item].schematic
  105.         local chest = chestQuery()
  106.        
  107.         for k,v in pairs(schematic) do
  108.             for k1,v1 in pairs(chest.slotNum) do
  109.                 if k==k1 then
  110.                     c.pushItem("down",1,1)
  111.                     p.pullItemIntoSlot("up", k)
  112.                 end
  113.             end
  114.         end
  115.     end
  116. end
  117.  
  118. if tArgs[1] == "learn" then
  119.     local x,y,z = learnRecipe()
  120.     if y then
  121.         print("Sucessfully learnt.")
  122.     elseif z then
  123.         print("Recipe already known.")
  124.     else
  125.         print("Recipe cannot be learnt. (Invalid product?)")
  126.     end
  127. elseif tArgs[1] == "recipes" then
  128.     if fs.exists("recipes") then
  129.         local file = fs.open("recipes","r")
  130.         local recipes = textutils.unserialize(file.readAll())
  131.         file.close()
  132.         for k,v in pairs(recipes) do
  133.             print(k)
  134.         end
  135.     else
  136.         print("No recipes exist.")
  137.     end
  138. elseif tArgs[1] == "craft" then
  139.     if #tArgs >= 2 then
  140.         local itemName = tArgs[2]
  141.         if #tArgs >= 3 then
  142.             for i=3,#tArgs do
  143.                 itemName = itemName.. " ".. tArgs[i]
  144.             end
  145.         end
  146.         craft(itemName)
  147.     end
  148. elseif tArgs[1] == "chestQuery" then
  149.     print(textutils.serialize(chestQuery()))
  150. elseif tArgs[1] == "checkStock" then
  151.     if #tArgs >= 2 then
  152.     local itemName = tArgs[2]
  153.     if #tArgs >= 3 then
  154.         for i=3,#tArgs do
  155.             itemName = itemName.. " ".. tArgs[i]
  156.         end
  157.     end
  158.     local x, y = checkStock(itemName)
  159.     print(x)
  160.     print(textutils.serialize(y))
  161.     end
  162. end
Add Comment
Please, Sign In to add comment