Advertisement
dadragon84

storekeeper nofuel

Jun 3rd, 2016
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[
  2. Name: storeKeeperV
  3. Version: 1.4
  4. Description: Put items away in an inventory system made up of a network of stacked chests.  Be able
  5. to store, identify and count the contents of each chest and be able to retrieve items when requested
  6. by the InventoryControl program.
  7.  
  8. Note:  This program has been extensively rewritten from the original program written by nitrogetfingers used in his Turtle Butler example.
  9. The use of the parallel option was removed because of problems using it on a server.
  10.  
  11. Date: 01/14/13
  12. Author: Severino
  13.  
  14. Future enhancements planned:
  15. - Unloading mine carts
  16.  
  17. ]]--
  18.  
  19. -- Current inventory location
  20. location = 0
  21. locLevel = 0
  22. locDir = 0
  23. -- Current Inventory Location
  24. currentLocation = locLevel..","..locDir
  25. -- Current orientation within the room (1 = forward, 2=right, 3=back, 4=left)
  26. orientation = 1
  27. -- Flag to abort mission.
  28. abortMission = false
  29. -- Maximum slot to use to transfer inventory
  30. maxSlot = 15
  31. -- Slot to use to store fuel.
  32. fuelSlot = 16
  33. -- Setup Directions.
  34. invDir = 1
  35. fuelDir = 2
  36. unknownDir = 4
  37. -- Inventory Names
  38. inventoryName = {}
  39. -- Home Terminal
  40. orderComputer = nil
  41. storeKeeperID = nil
  42.  
  43. -- Has Pick Axe
  44. hasPickAxe = true
  45. --The list of all tasks to be done
  46. queue = {}
  47.  
  48. -- List of empty chests encountered.
  49. emptyChests = {}
  50.  
  51. function saveTable(tableData, tableName)
  52.     save = textutils.serialize(tableData)
  53.     file = fs.open(tableName, "w")
  54.     file.write(save)
  55.     file.close()
  56. end
  57. function loadTable(tableName)
  58.     if fs.exists(tableName) then
  59.       file = fs.open(tableName, "r")
  60.       vars = file.readAll()
  61.       file.close()
  62.       tableData = textutils.unserialize(vars)
  63.     else
  64.       file = fs.open(tableName, "w")
  65.       tableData = {}
  66.       vars = textutils.serialize(tableData)
  67.       file.write(vars)
  68.       file.close()
  69.     end
  70.     return tableData
  71. end
  72. function reportInventory(computerId)
  73.   invData = textutils.serialize(inventoryName)
  74.   if computerId == nil then
  75.     rednet.broadcast("inventory"..invData)
  76.   else
  77.     rednet.send(computerId, "inventory"..invData)
  78.   end
  79. end
  80. function identifyInventory()
  81.   -- If there is inventory left and there are empty chests, put it in the empty chests
  82.   if not isTurtleEmpty() then
  83.     if not goToStart() then return end
  84.     emptyInventory()
  85.   end
  86.  
  87.   -- This function locates inventory locations that have not been identified and requests descriptions.
  88.   local level = 1
  89.   local dir = 0
  90.   local slot = 0
  91.   local locationsLevel = {}
  92.   local locationsDir = {}
  93.   local locationsName = {}
  94.   local locationNotEmpty = true
  95.   setStatus("Retrieving Inventory")
  96.   while slot < maxSlot and locationNotEmpty do
  97.     for dir = 1,4 do
  98.       local invLoc = level..","..dir
  99.       local name, qty = getInventoryNameQty(invLoc)
  100.       if name == "_" then
  101.         gotoLocation(level,dir)
  102.         if turtle.detect() then
  103.           slot = slot + 1
  104.           turtle.select(slot)
  105.           if turtle.suck() then
  106.             turtle.drop(turtle.getItemCount(slot)-1)
  107.             locationsLevel[slot] = level
  108.             locationsDir[slot] = dir
  109.             print("at "..invLoc)
  110.             setStatus("at "..invLoc)
  111.             if qty ~= nil then
  112.               if tonumber(qty) > 0 then
  113.                 qty = qty - 1
  114.                 inventoryName[invLoc] = "_#"..qty
  115.               end
  116.             end
  117.           else
  118.             slot = slot - 1
  119.           end
  120.         else
  121.           locationNotEmpty = false
  122.           break
  123.         end
  124.       end
  125.       if slot == maxSlot then break end
  126.     end
  127.     level = level + 1
  128.   end
  129.   if goToStart() then
  130.     if not isTurtleEmpty() then
  131.       -- Something was loaded.  Get names for each item in
  132.       local i = 1
  133.       while locationsLevel[i] ~= nil do
  134.         if turtle.getItemCount(i) > 0 then
  135.           level = locationsLevel[i]
  136.           dir = locationsDir[i]
  137.           local name, qty = getInventoryNameQty(invLoc)
  138.           name = nil
  139.           while name == nil do
  140.             setStatus("Identify slot "..i)
  141.             term.write("Identify slot "..i.." (b=back):")
  142.             name = io.read()
  143.           end
  144.           if string.lower(name) == "b" then
  145.             if i > 1 then i = i - 2 else i = i - 1 end
  146.           else
  147.             inventoryName[level..","..dir] = name.."#"..qty
  148.             setStatus("identify"..level..","..dir.."-"..name)
  149.           end
  150.         end
  151.         i = i + 1
  152.       end
  153.       saveTable(inventoryName, "inventory")
  154.       -- Now go and put everything away.
  155.       setStatus("Putting inventory back.")
  156.       local i = 1
  157.       while locationsLevel[i] ~= nil do
  158.         if turtle.getItemCount(i) > 0 then
  159.           level = locationsLevel[i]
  160.           dir = locationsDir[i]
  161.           returnItemToInventory(i, level, dir)          
  162.         end
  163.         i = i + 1
  164.       end
  165.       goToStart()
  166.     else
  167.       setStatus("done identifying.")
  168.     end
  169.   end
  170. end
  171. -- Is there anything in the turtle.
  172. function isTurtleEmpty()
  173.   for s=1,maxSlot,1 do
  174.     if turtle.getItemCount(s) > 0 then return false end
  175.   end
  176.   return true
  177. end
  178. -- Change the orientation of the turtle
  179. function changeOrientation(dir)
  180.   if dir < 1 then dir = dir + 4 end
  181.   if dir > 4 then dir = dir - 4 end
  182.   while orientation ~= dir do
  183.     if (orientation - dir) == -3 or (orientation - dir) == 1 then
  184.       turtle.turnLeft()
  185.       orientation = orientation - 1
  186.     else
  187.       turtle.turnRight()
  188.       orientation = orientation + 1
  189.     end
  190.         if orientation > 4 then
  191.       orientation = 1
  192.     elseif orientation == 0 then
  193.       orientation = 4
  194.     end
  195.     end
  196. end
  197. --Go to starting position
  198. function goToStart()
  199.   print("Going to start.")
  200.   setStatus("going to start")
  201.   -- Move out of chest shaft.
  202.   local ceilingFound = false
  203.   for a=1,70 do
  204.      
  205.     if not turtle.detectUp() then turtle.up() else
  206.       ceilingFound = true
  207.       break
  208.     end
  209.   end
  210.   if not ceilingFound then
  211.     for b=1,70 do
  212.        
  213.       turtle.down()
  214.     end
  215.     print("Ceiling not found.")
  216.     return false
  217.   end
  218.   changeOrientation(invDir)  -- Now facing material chest
  219.  
  220.   -- Reset location to indicate at Start position.
  221.   location = 0
  222.   locLevel = 0
  223.   locDir = 0
  224.   currentLocation = locLevel..","..locDir
  225.   changeOrientation(invDir)
  226.   return true
  227. end
  228. -- Go to a specific inventory location.
  229. function gotoLocation(level, dir)
  230.   if locDir == 0 then
  231.     -- Should be 1 above floor
  232.     if not turtle.down() then return false end  -- Now even with floor
  233.     if not turtle.down() then return false end  -- Now 1 below fllor
  234.     if not turtle.down() then return false end  -- Now even with the first level of chest.
  235.     locLevel = 1
  236.     changeOrientation(1)
  237.     locDir = 1
  238.     currentLocation = locLevel..","..locDir
  239.   end
  240.   while level ~= locLevel do
  241.      
  242.     if locLevel < level  then
  243.       if turtle.down() then locLevel = locLevel + 1 else return false end
  244.     else
  245.       if turtle.up() then locLevel = locLevel - 1 else return false end
  246.     end
  247.     currentLocation = locLevel..","..locDir
  248.   end
  249.   -- Now must be at the correct level.
  250.   changeOrientation(dir)
  251.   locDir = dir
  252.   return turtle.detect()
  253. end
  254. -- Go to next inventory location.
  255. function gotoNextInventoryLocation()
  256.     -- Check to see if the turtle has started a level.
  257.   if locDir == 0 then
  258.     -- Should be 1 above floor
  259.     turtle.down()  -- Now even with floor
  260.     turtle.down()  -- Now 1 below fllor
  261.     turtle.down()  -- Now even with the first level of chest.
  262.     locLevel = 1
  263.     changeOrientation(1)
  264.     locDir = 1
  265.     currentLocation = locLevel..","..locDir
  266.   elseif locDir == 4 then
  267.     if turtle.detectDown() then
  268.       -- We have reached the bottom.
  269.       return false
  270.     else
  271.       -- Move down to the next chest.
  272.       while not turtle.down() do
  273.         setStatus("blocked at level "..locLevel)
  274.         sleep(10)
  275.       end
  276.       locLevel = locLevel + 1
  277.       locDir = 1
  278.       changeOrientation(locDir)
  279.       currentLocation = locLevel..","..locDir
  280.       -- Check to see if there isn't a chest there.
  281.       if not turtle.detect() then return false end
  282.     end
  283.   else
  284.     locDir = locDir + 1
  285.     changeOrientation(locDir)
  286.     currentLocation = locLevel..","..locDir
  287.     -- Check to see if there isn't a chest there.
  288.     if not turtle.detect() then return false end
  289.   end
  290.   return true
  291. end
  292.  
  293. -- Load Inventory To Put Away
  294. function loadInventory()
  295.     -- Pick up all of the items in the chest in front of the turtle.
  296.     -- Set the flag that the inventory is empty.
  297.     inventoryLoaded = false
  298.     -- Start filling at slot 2.  Keep slot 1 clear for comparing to contents of chest.
  299.     s=2
  300.     while s <= maxSlot do    
  301.         turtle.select(s)
  302.         if turtle.suck() then
  303.             -- Something was picked up so reset the flag.
  304.             inventoryLoaded = true
  305.         else
  306.             -- The inventory chest is empty.
  307.             break
  308.         end
  309.         -- Move to the next slot in the turtle.
  310.         s = s + 1
  311.     end
  312.     return inventoryLoaded
  313. end
  314.  
  315. -- Empty non-identified items
  316. function emptyInventory()
  317.     print("Emptying inv.")
  318.   setStatus("emptying inventory")
  319.     changeOrientation(unknownDir)
  320.     -- Dump everything into chest of unknown material.
  321.     for s=1,maxSlot,1 do
  322.         turtle.select(s)
  323.         turtle.drop()
  324.     end
  325.     -- Return to Start position
  326.     changeOrientation(invDir)
  327. end
  328. function digFoward()
  329.   turtle.select(6)
  330.   while turtle.detect() do
  331.     turtle.dig()
  332.     sleep(.5)
  333.   end
  334. end
  335. function selectFill()
  336.   for s=7,15 do
  337.     turtle.select(s)
  338.     if turtle.compareTo(6) then return end
  339.   end
  340.   turtle.select(6)
  341. end
  342. function placeSeal()
  343.   selectFill()
  344.   while not turtle.detect() do
  345.     turtle.place()
  346.     sleep(.5)
  347.   end
  348. end
  349. function placeSealDown()
  350.   selectFill()
  351.   while not turtle.detectDown() do
  352.     turtle.placeDown()
  353.     sleep(.5)
  354.   end
  355. end
  356. function digDown()
  357.   turtle.select(6)
  358.   while turtle.detectDown() do
  359.     turtle.digDown()
  360.     sleep(.5)
  361.   end
  362. end
  363. function goForward()
  364.   while not turtle.forward() do
  365.     print("Forward blocked")
  366.     sleep(4)
  367.   end
  368. end
  369. function goBack()
  370.   while not turtle.back() do
  371.     print("Back blocked")
  372.     sleep(4)
  373.   end
  374. end
  375. function selectChest()
  376.   for s=5,15 do
  377.     turtle.select(s)
  378.     if turtle.compareTo(1) then return true end
  379.   end
  380.   if turtle.getItemCount(1) > 0 then
  381.     turtle.select(1)
  382.     return true
  383.   end
  384.   return false
  385. end
  386. function placeChest()
  387.   selectChest()
  388.   turtle.place()
  389. end
  390. function placeChestUp()
  391.   selectChest()
  392.   turtle.placeUp()
  393. end  
  394. function selectGlass()
  395.   for s=5,15 do
  396.     turtle.select(s)
  397.     if turtle.compareTo(2) then return true end
  398.   end
  399.   turtle.select(2)
  400.   if turtle.getItemCount(2) > 0 then
  401.     turtle.select(2)
  402.     return true
  403.   end
  404.   return false
  405. end
  406. function placeGlass()
  407.   if selectGlass() then
  408.     turtle.place()
  409.   else
  410.     placeSeal()
  411.   end
  412. end
  413. function selectTorch()
  414.   for s=5,15 do
  415.     turtle.select(s)
  416.     if turtle.compareTo(3) then return true end
  417.   end
  418.   if turtle.getItemCount(3) > 0 then
  419.     turtle.select(3)
  420.     return true
  421.   end
  422.   return false
  423. end
  424. function placeTorchUp()
  425.   if selectTorch() then
  426.     turtle.placeUp()
  427.     return true
  428.   end
  429.   return false
  430. end
  431. function selectLadder()
  432.   for s=5,15 do
  433.     turtle.select(s)
  434.     if turtle.compareTo(4) then return true end
  435.   end
  436.   if turtle.getItemCount(4) > 0 then
  437.     turtle.select(4)
  438.     return true
  439.   end
  440.   return false
  441. end
  442. function placeLadderUp()
  443.   if selectLadder() then
  444.     turtle.placeUp()
  445.     return true
  446.   end
  447.   return false
  448. end
  449. function placeSign(message)
  450.   if hasSigns then
  451.     if not turtle.detect() then
  452.       goForward()
  453.       if not turtle.detect() then placeSeal() end
  454.       goBack()
  455.     end
  456.     turtle.select(5)
  457.     turtle.place(message)
  458.   end
  459. end
  460. -- Create Initial Chest Setup
  461. function Initialize()
  462.   if not hasPickAxe then
  463.     print("Turtle must have a pick axe to")
  464.     print("be able to create warehouse shaft.")
  465.     return false
  466.   end
  467.   -- First check that you are facing a wall.
  468.   local wallDetected = false
  469.   for a=1,4 do
  470.     if turtle.detect() then
  471.       wallDetected = true
  472.       break
  473.     end
  474.     turtle.turnRight()
  475.   end
  476.   if not wallDetected then
  477.     print("Turtle must be next to a wall to create initial setup.")
  478.     return false
  479.   end
  480.   -- Now give instructions about where to put chests.
  481.   while turtle.getItemCount(fuelSlot) < 5 do
  482.     print("Place 5+ fuel in slot "..fuelSlot..".")
  483.     term.write("Ready? (Y/N):")
  484.     continue = string.upper(io.read())
  485.     if continue ~= "Y" then return false end
  486.   end
  487.   while turtle.getItemCount(1) < 10 do
  488.     print("Place the following material in the slots.")
  489.     print("Slot 1: 30+ chests")
  490.     print("Slot 2: 30+ glass blocks")
  491.     print("Slot 3: 20+ torches")
  492.     print("Slot 4: 30+ ladders")
  493.     print("Slot 5: 3 signs")
  494.     print("Slot 6: Material to seal walls")
  495.     print("Place additional chests, glass and material in other slots.")
  496.     term.write("Ready? (Y/N):")
  497.     continue = string.upper(io.read())
  498.     if continue ~= "Y" then return false end
  499.   end
  500.   -- Check for clearance to place chests
  501.    
  502.   rightOk = false
  503.   backOk = false
  504.   leftOk = false
  505.   upOk = false
  506.   hasGlass = turtle.getItemCount(2) > 0
  507.   hasTorches = turtle.getItemCount(3) > 0
  508.   hasLadders = turtle.getItemCount(4) > 0
  509.   hasSigns = turtle.getItemCount(5) > 0
  510.   while not (rightOk and leftOk and backOk and upOk) do
  511.     -- Check to the right
  512.     turtle.turnRight()
  513.     -- Facing right
  514.     if not turtle.detect() then
  515.       if turtle.forward() then
  516.         if not turtle.detect() then rightOk = true end
  517.         turtle.back()
  518.       end
  519.     end
  520.     -- Check to the back.
  521.     turtle.turnRight()
  522.     -- Facing front
  523.     if not turtle.detect() then backOk = true end
  524.     -- Check to the left
  525.     turtle.turnRight()
  526.     -- Facing left
  527.     if not turtle.detect() then
  528.       if turtle.forward() then
  529.         if not turtle.detect() then leftOk = true end
  530.         turtle.back()
  531.       end
  532.     end
  533.     -- Check Up
  534.     if not turtle.detectUp() then upOk = true end
  535.     turtle.turnRight()
  536.     -- Facing back
  537.     if not upOk then print("Space above turtle must be clear.") end
  538.     if not rightOk then print("2 spaces to right must be clear.") end
  539.     if not backOk then print("Space behind turtle must be clear.") end
  540.     if not leftOk then print("2 spaces to left must be clear.") end
  541.     if not (rightOk and leftOk and backOk and upOk) then
  542.       print("Continue?")
  543.       cont = io.read()
  544.     end
  545.   end
  546.   ---------- BLOCK PATTERN ---------
  547.   --             Back
  548.   --               X
  549.   --            P  U  W
  550.   --         R  O  T  V  Y
  551.   -- Left 11 N  M  S  A  B 12 Right
  552.   --      10 L  I  G  E  C 13
  553.   --       9 K  J  H  F  D 14
  554.   --         8  1  2  3  4
  555.   --            7  6  5
  556.   --             Front
  557.   -- Everthing ready, start setting things up.
  558.    
  559.   -- Place double unidentified chest
  560.   turtle.turnRight()
  561.   -- Facing right
  562.   goForward()
  563.   placeChest()
  564.   goBack()
  565.   placeChest()
  566.   -- Now put a sign on it.
  567.   if hasSigns then
  568.     if turtle.up() then
  569.       turtle.turnRight()
  570.       if turtle.forward() then
  571.         turtle.turnLeft()
  572.         if turtle.forward() then
  573.           if turtle.forward() then
  574.             turtle.turnLeft()
  575.             placeSign("\nOverflow\nInventory")
  576.             turtle.turnRight()
  577.             turtle.back()
  578.           end
  579.           turtle.back()
  580.         end
  581.         turtle.turnRight()
  582.         turtle.back()
  583.       end
  584.       turtle.turnLeft()
  585.       turtle.down()
  586.     end
  587.   end
  588.   -- Place double fuel chest
  589.   turtle.turnRight()
  590.   turtle.turnRight()
  591.   -- Facing left
  592.   goForward()
  593.   placeChest()
  594.   goBack()
  595.   placeChest()
  596.   -- Now put some fuel in it.
  597.   turtle.select(fuelSlot)
  598.   turtle.drop(1)
  599.   -- Now put a sign on it.
  600.   if hasSigns then
  601.     if turtle.up() then
  602.       turtle.turnLeft()
  603.       if turtle.forward() then
  604.         turtle.turnRight()
  605.         if turtle.forward() then
  606.           if turtle.forward() then
  607.             turtle.turnRight()
  608.             placeSign("\nStoreKeeper\nFuel")
  609.             turtle.turnLeft()
  610.             turtle.back()
  611.           end
  612.           turtle.back()
  613.         end
  614.         turtle.turnLeft()
  615.         turtle.back()
  616.       end
  617.       turtle.turnRight()
  618.       turtle.down()
  619.     end
  620.   end
  621.   -- Place retrieval chest
  622.   turtle.turnRight()
  623.   -- Facing back
  624.   placeChestUp()
  625.   -- Now put a sign on it.
  626.   if turtle.back() then
  627.     if turtle.up() then
  628.       if turtle.up() then
  629.         placeSign("\nRequested\nItems")
  630.         turtle.down()
  631.       end
  632.       turtle.down()
  633.       turtle.forward()
  634.     end
  635.   end
  636.   -- Place unknown item chest
  637.   turtle.turnRight()
  638.   turtle.turnRight()
  639.   -- Facing front
  640.   goForward()
  641.   placeChest()
  642.   goBack()
  643.   placeChest()
  644.   turtle.turnRight()
  645.   turtle.turnRight()
  646.   -- Facing back
  647.  
  648.   -- Now replace the floor with glass blocks and a crawl hole  
  649.    
  650.   local level = 0
  651.   turtle.turnRight()
  652.   -- Facing right
  653.   turtle.digDown()
  654.   turtle.down()
  655.   level = level + 1
  656.   -- If we have glass blocks then replace floor with glass blocks
  657.   -- Replace floor to right
  658.   digFoward()
  659.   goForward() -- A
  660.   turtle.turnLeft() -- Facing back
  661.   placeGlass() -- V
  662.   turtle.turnRight() -- Facing left
  663.   digFoward()
  664.   goForward() -- B
  665.   turtle.turnLeft() -- Facing back
  666.   placeGlass() -- Y
  667.   turtle.turnRight() -- Facing left
  668.   digFoward()
  669.   goForward() -- 12
  670.   turtle.turnRight() -- Facing front
  671.   digFoward()
  672.   goForward() -- 13
  673.   digFoward()
  674.   goForward() -- 14
  675.   digFoward()
  676.   placeSeal() -- 15
  677.   goBack() -- 13
  678.   placeSeal() -- 14
  679.   goBack() -- 12
  680.   placeSeal() -- 13
  681.   turtle.turnLeft() -- Facing right
  682.   goBack() -- B
  683.   placeSeal() -- 12
  684.   turtle.turnRight() -- Facing front
  685.   digFoward()
  686.   goForward() -- C
  687.   digForward()
  688.   goForward() -- D
  689.   goBack() -- C
  690.   goBack() -- B
  691.   placeGlass() -- C
  692.   turtle.turnLeft() -- Facing right
  693.   goBack() -- A
  694.   placeGlass() -- B
  695.   turtle.turnRight() -- Facing front
  696.   digFoward()
  697.   placeGlass() -- E
  698.   turtle.turnLeft() -- Facing right
  699.   goBack() -- Start
  700.   placeGlass() -- A
  701.   turtle.turnRight() -- Facing front
  702.   -- Replace floor to front with glass
  703.   digFoward()
  704.   goForward() -- G
  705.   digFoward()
  706.   goForward() -- H
  707.   digFoward()
  708.   goForward() -- 2
  709.   turtle.turnLeft() -- Facing right
  710.   digFoward()
  711.   goForward() -- 3
  712.   placeGlass() -- 4
  713.   goBack() -- 2
  714.   placeGlass() -- 3
  715.   turtle.turnRight() -- Facing front
  716.   turtle.turnRight() -- Facing left
  717.   digFoward()
  718.   goForward() -- 1
  719.   digForward()
  720.   goForward() -- 8
  721.   placeGlass() -- 16
  722.   goBack() -- 1
  723.   placeGlass() -- 8
  724.   goBack() -- 2
  725.   placeGlass() -- 1
  726.   turtle.turnLeft() -- Facing front
  727.   goBack() -- H
  728.   placeGlass() -- 2
  729.   turtle.turnLeft() -- Facing right
  730.   digFoward()
  731.   goForward() -- F
  732.   digFoward()
  733.   goBack() -- H
  734.   placeGlass() -- F
  735.   turtle.turnRight() -- Facing front
  736.   turtle.turnRight() -- Facing left
  737.   digFoward()
  738.   goForward() -- J
  739.   digFoward() -- K
  740.   goForward() -- K
  741.   placeGlass() -- 9
  742.   goBack() -- J
  743.   goBack() -- H
  744.   placeGlass() -- J
  745.   turtle.turnLeft() -- Facing front
  746.   goBack() -- G
  747.   placeGlass() -- H
  748.   goBack() -- S
  749.   placeGlass() -- G
  750.   -- Replace floor on left
  751.   turtle.turnRight() -- Facing left
  752.   digFoward()
  753.   goForward() -- M
  754.   turtle.turnLeft() -- Facing front
  755.   digFoward()
  756.   placeGlass() -- I
  757.   turtle.turnRight() -- Facing left
  758.   digFoward()
  759.   goForward() -- N
  760.   digForward()
  761.   goForward() -- 11
  762.   turtle.turnLeft() -- Facing front
  763.   placeGlass() -- 10
  764.   turtle.turnRight() -- Facing left
  765.   goBack() -- N
  766.   turtle.turnLeft() -- Facing front
  767.   digFoward()
  768.   placeGlass() -- L
  769.   turtle.turnRight() -- Facing left
  770.   placeSeal() -- 11
  771.   goBack() -- M
  772.   placeGlass() -- N
  773.   goBack() -- Start
  774.   placeGlass() -- M
  775.   turtle.turnRight() -- Facing back
  776.   -- Put fill in for the back
  777.   digForward()
  778.   goForward() -- T
  779.   turtle.turnLeft() -- Facing left
  780.   digForward() -- O
  781.   goForward() -- O
  782.   placeGlass() -- R
  783.   goBack() -- T
  784.   placeGlass() -- O
  785.   turtle.turnRight() -- Facing back
  786.   digForward() -- U
  787.   goForward() -- U
  788.   turtle.turnLeft() -- Facing left
  789.   placeSeal() -- P
  790.   turtle.turnRight() -- Facing back
  791.   placeGlass() -- X
  792.   turtle.turnRight() -- Facing right
  793.   placeGlass() -- W
  794.   turtle.turnLeft() -- Facing back
  795.   goBack() -- T
  796.   placeGlass() -- U
  797.   goBack() -- S
  798.   placeGlass() -- T w
  799.   turtle.turnRight() -- Facing right
  800.   turtle.digDown()
  801.   turtle.down()
  802.   level = level + 1
  803.   -- Now start placing chests for warehouse until we run out of chests.
  804.   -- Clear out space above chests.
  805.    
  806.   for d=1,4 do
  807.     digFoward()
  808.     goForward() -- 1=A, 2=G, 3=M, 4=T
  809.     if d == 1 or d == 4 then
  810.       turtle.turnLeft() -- Facing 1=back, 3=left
  811.       placeSeal() -- 1=V, 4=O
  812.       turtle.turnRight() -- Facing 1=right, 3=back
  813.     elseif d == 2 or d == 4 then
  814.       turtle.turnLeft() -- Facing right
  815.       if d == 2 then digFoward() else placeSeal() end -- O
  816.       turtle.turnRight() -- Facing front
  817.       turtle.turnRight() -- Facing left
  818.       if d == 2 then digFoward() else placeSeal() end -- V
  819.       turtle.turnLeft() -- Facing front
  820.     end
  821.     digFoward()
  822.     goForward() -- 1=B, 2=H, 3=N, 4=U
  823.     if d == 1 or d == 4 then
  824.       placeSeal() -- 1=12, 4=X
  825.       turtle.turnLeft() -- Facing 1=back, 4=left
  826.       placeSeal() -- 1=Y, 4=P
  827.       turtle.turnRight() -- Facing 1=right, 4=back
  828.       turtle.turnRight() -- Facing 1=front, 4=right
  829.       if d == 1 then
  830.         digFoward()
  831.         placeGlass() -- C
  832.       elseif d == 4 then placeSeal() end -- W
  833.       turtle.turnLeft() -- Facing 1=right, 4=back
  834.     elseif d == 2 then
  835.       turtle.turnLeft() -- Facing 2=right
  836.       digForward() -- F
  837.       goForward() -- F
  838.       digForward() -- D
  839.       goForward() -- D
  840.       placeSeal() -- 14
  841.       goBack() -- F
  842.       goBack() -- H
  843.       placeGlass() -- F
  844.       turtle.turnRight() -- Facing front
  845.       turtle.turnRight() -- Facing left
  846.       digForward()
  847.       goForward() -- J
  848.       digForward() -- K
  849.       goForward() -- K
  850.       placeSeal() -- 9
  851.       turtle.turnLeft() -- Facing front
  852.       placeSeal() -- 8
  853.       turtle.turnRight() -- Facing left
  854.       goBack() -- J
  855.       goBack() -- H
  856.       placeGlass() -- J
  857.       turtle.turnLeft() -- Facing front
  858.       digForward()
  859.       goForward() -- 2
  860.       placeSeal() -- 6
  861.       turtle.turnLeft() -- Facing right
  862.       digForward() -- 3
  863.       goForward() -- 3
  864.       placeSeal() -- 4
  865.       goBack() -- 2
  866.       placeGlass() -- 3
  867.       turtle.turnRight() -- Facing front
  868.       turtle.turnRight() -- Facing left
  869.       digForward() -- 1
  870.       placeGlass() -- 1
  871.       turtle.turnLeft() -- Facing front
  872.       goBack() -- H
  873.     elseif d == 3 then
  874.       placeSeal() -- 11
  875.       turtle.turnLeft() -- Facing front
  876.       digForward()
  877.       placeGlass() -- L
  878.       turtle.turnRight() -- Facing left
  879.       turtle.turnRight() -- Facing back
  880.       placeSeal() -- R
  881.       turtle.turnLeft() -- Facing left      
  882.     end
  883.     goBack() -- 1=A, 2=G, 3=M, 4=T
  884.     goBack() -- Start
  885.     turtle.turnRight() -- Facing 1=front, 2=left, 3=back, 4=right
  886.   end
  887.   -- Facing right
  888.   -- S
  889.   -- Now start adding layers of chests until they are all gone.
  890.   while turtle.getItemCount(1) > 1 do
  891.      
  892.     turtle.digDown()
  893.     turtle.down()
  894.     level = level + 1
  895.     for d=1,4 do
  896.       -- Facing 1=right, 2=front, 3=left, 4=back
  897.       turtle.select(5)
  898.       digForward() -- 1=A, 2=G, 3=M, 4=T
  899.       goForward() -- 1=A, 2=G, 3=M, 4=T      
  900.       if d == 1 or d == 4 then
  901.         turtle.turnLeft() -- Facing 1=back, 3=left
  902.         placeSeal() -- 1=V, 4=O
  903.         turtle.turnRight() -- Facing 1=right, 3=back
  904.       elseif d == 2 or d == 4 then
  905.         turtle.turnLeft() -- Facing right
  906.         if d == 2 then
  907.           digFoward()
  908.           if (level-2)%6 == 0 then placeGlass() else -- E
  909.             goForward()
  910.             goBack()
  911.           end
  912.         else placeSeal() end -- O
  913.         turtle.turnRight() -- Facing front
  914.         turtle.turnRight() -- Facing left
  915.         if d == 2 then
  916.           digFoward()
  917.           if (level-2)%6 == 0 then placeGlass() else -- I
  918.             goForward()
  919.             goBack()
  920.           end
  921.         else placeSeal() end -- V
  922.         turtle.turnLeft() -- Facing front
  923.       end
  924.       digForward() -- 1=B, 2=H, 3=N, 4=U
  925.       goForward() -- 1=B, 2=H, 3=N, 4=U
  926.       if (d == 1) then
  927.         placeSeal() -- 12
  928.         turtle.turnLeft() -- Facing back
  929.         placeSeal() -- Y
  930.         turtle.turnRight() -- Facing right
  931.         turtle.turnRight() -- Facing front
  932.         digForward() -- C
  933.         goForward()
  934.         goBack()
  935.         if not(level%6 == 0 or (level-1)%6 == 0) then
  936.           placeGlass() -- F
  937.         else
  938.           goForward() -- C
  939.           turtle.turnLeft() -- Facing right
  940.           placeSeal() -- 13
  941.           turtle.turnRight() -- Facing front
  942.           goBack() -- B
  943.         end
  944.         turtle.turnLeft() -- Facing 2=right        
  945.       elseif (d == 2) then
  946.         turtle.turnLeft() -- Facing 2=right
  947.         digForward() -- F
  948.         goForward() -- F
  949.         digForward() -- D
  950.         goForward() -- D
  951.         placeSeal() -- 14
  952.         placeLadderUp() -- D
  953.         turtle.turnRight() -- Facing front
  954.         placeSeal() -- 4
  955.         turtle.turnLeft() -- Facing right
  956.         goBack() -- F
  957.         turtle.turnRight() -- Facing 2=front
  958.         digForward() -- 3
  959.         if level%8 then
  960.           placeGlass() -- 3
  961.         else
  962.           goForward() -- 3
  963.           placeSeal() -- 5
  964.           goBack() -- F
  965.         end
  966.         turtle.turnLeft() -- Facing 2=right
  967.         goBack() -- H
  968.         if not(level%6 == 0 or (level-1)%6 == 0) then placeGlass() end -- F
  969.         turtle.turnRight() -- Facing 2=front
  970.         digForward() -- 2
  971.         if level%8 then
  972.           placeGlass() -- 2
  973.         else
  974.           goForward() -- 2
  975.           placeSeal() -- 6
  976.           goBack() -- H
  977.         end
  978.         turtle.turnRight() -- Facing 2=left
  979.         digForward() -- J
  980.         goForward() -- J
  981.         digForward() -- K
  982.         goForward() -- K
  983.         placeSeal() -- 9
  984.         placeLadderUp() -- K
  985.         turtle.turnLeft() -- Facing front
  986.         placeSeal() -- 8
  987.         turtle.turnRight() -- Facing left
  988.         goBack() -- J
  989.         turtle.turnLeft() -- Facing 2=front
  990.         digForward() -- 1
  991.         if level%8 then
  992.           placeGlass() -- 1
  993.         else
  994.           goForward() -- 1
  995.           placeSeal() -- 7
  996.           goBack() -- J
  997.         end
  998.         turtle.turnRight() -- Facing 2=left
  999.         goBack() -- H
  1000.         if not(level%6 == 0 or (level-1)%6 == 0) then placeGlass() end -- J
  1001.         turtle.turnLeft() -- Facing 2=front
  1002.       elseif (d == 3) then
  1003.         placeSeal() -- 11
  1004.         turtle.turnRight() -- Facing back
  1005.         placeSeal() -- R
  1006.         turtle.turnLeft() -- Facing left
  1007.         turtle.turnLeft() -- Facing 3=front
  1008.         digForward() -- L
  1009.         if not(level%6 == 0 or (level-1)%6 == 0) then
  1010.           placeGlass() -- L
  1011.         else
  1012.           goForward() -- L
  1013.           turtle.turnRight() -- Facing left
  1014.           placeSeal() -- 10
  1015.           placeTorchUp()
  1016.           turtle.turnLeft() -- Facing front
  1017.           goBack() -- N
  1018.         end
  1019.         turtle.turnRight() -- Facing 3=left          
  1020.       elseif (d == 4) then
  1021.         placeSeal() -- X
  1022.         turtle.turnLeft() -- Facing left
  1023.         placeSeal() -- P
  1024.         turtle.turnRight() -- Facing back
  1025.         turtle.turnRight() -- Facing right
  1026.         placeSeal() -- W
  1027.         turtle.turnLeft() -- Facing back
  1028.       end
  1029.       -- Facing 1=right, 2=front, 3=left, 4=back
  1030.       goBack() -- 1=A, 2=G, 3=M, 4=T
  1031.       goBack() -- Start
  1032.       turtle.turnRight() -- Facing 1=front, 2=left, 3=back, 3=right
  1033.     end
  1034.     for d=1,4 do
  1035.       goForward()
  1036.       placeChest() -- 1=B, 2=H, 3=N, 4=U
  1037.       goBack() -- Start
  1038.       placeChest() -- 1=A, 2=G, 3=M, 4=T
  1039.       turtle.turnRight() -- Facing 1=front, 2=left, 3=back, 3=right
  1040.     end
  1041.     print("Finished layer "..level)
  1042.   end
  1043.   -- Now put in an empty space below the last chest.
  1044.   digDown()
  1045.   turtle.down()
  1046.   for d=1,4 do
  1047.     digForward()
  1048.     goForward() -- 1=A, 2=G, 3=M, 4=T
  1049.     turtle.turnLeft()
  1050.     digForward()
  1051.     goForward()
  1052.     placeSeal()
  1053.     goBack()
  1054.     turtle.turnRight()    
  1055.     digForward()
  1056.     goForward() -- 1=B, 2=H, 3=N, 4=U
  1057.     turtle.turnLeft()
  1058.     digForward()
  1059.     goForward()
  1060.     placeSeal()
  1061.     goBack()
  1062.     turtle.turnRight()    
  1063.     turtle.turnRight()
  1064.     digForward()
  1065.     goForward() -- 1=C, 2=H, 3=N, 4=U
  1066.     digForward()
  1067.     goForward() -- 1=D, 2=H, 3=N, 4=U
  1068.     placeSeal()
  1069.     placeLadderUp()
  1070.     goBack() -- 1=C
  1071.     goBack() -- 1=B
  1072.     turtle.turnLeft()
  1073.     goBack() -- 1=A
  1074.     goBack() -- 1=S
  1075.     turtle.turnRight()
  1076.   end
  1077.   -- Now seal the bottom.
  1078.   digDown()
  1079.   turtle.down()
  1080.   placeSealDown()
  1081.   for d=1,4 do
  1082.     digForward()
  1083.     goForward() -- 1=A, 2=G, 3=M, 4=T
  1084.     placeSealDown()
  1085.     turtle.turnLeft()
  1086.     digForward()
  1087.     goForward()
  1088.     placeSeal()
  1089.     placeSealDown()
  1090.     goBack()
  1091.     turtle.turnRight()    
  1092.     digForward()
  1093.     goForward() -- 1=B, 2=H, 3=N, 4=U
  1094.     placeSealDown()
  1095.     turtle.turnLeft()
  1096.     digForward()
  1097.     goForward()
  1098.     placeSeal()
  1099.     placeSealDown()
  1100.     goBack()
  1101.     turtle.turnRight()    
  1102.     turtle.turnRight()
  1103.     digForward()
  1104.     goForward() -- 1=C, 2=H, 3=N, 4=U
  1105.     placeSealDown()
  1106.     digForward()
  1107.     goForward() -- 1=D, 2=H, 3=N, 4=U
  1108.     placeSeal()
  1109.     placeSealDown()
  1110.     placeLadderUp()
  1111.     goBack() -- 1=C
  1112.     goBack() -- 1=B
  1113.     turtle.turnLeft()
  1114.     goBack() -- 1=A
  1115.     goBack() -- 1=S
  1116.     turtle.turnRight()
  1117.   end
  1118.   -- All down now go home.
  1119.   if goToStart() then return true else return false end
  1120. end
  1121. function moveDownDigging()
  1122.   if turtle.detectDown() then
  1123.     if not hasPickAxe then
  1124.       print("Turtle must have a pick axe to")
  1125.       print("be able to dig.")
  1126.       setStatus("unable to dig without pickaxe")
  1127.       return false
  1128.     end
  1129.     if not turtle.digDown() then return false end
  1130.   end
  1131.   if not turtle.down() then return false end
  1132.   return true
  1133. end
  1134. function digForward()
  1135.   if turtle.detect() then
  1136.     if not hasPickAxe then
  1137.       print("Turtle must have a pick axe to")
  1138.       print("be able to dig.")
  1139.       setStatus("unable to dig without pickaxe")
  1140.       return false
  1141.     end
  1142.     if not turtle.dig() then return false end
  1143.   end
  1144.   return true
  1145. end
  1146. function addInventoryLocation()
  1147.   -- If a chest is found in inventory to be put away then create a new inventory location.
  1148.   -- Go find the first inventory location without a chest.
  1149.   if turtle.getItemCount(1) > 1 then
  1150.     print("Adding inventory location.")
  1151.     --print("Place glass blocks in slot 2.")
  1152.     --print("Place torches in slot 3.")
  1153.     --print("Place ladders in slot 4.")
  1154.     --print("Place fill material in slot 6.")
  1155.     --print("Press enter to continue:")
  1156.     --io.read()
  1157.     local level = 0
  1158.     local location = 0
  1159.     locDir = locDir + 1
  1160.     changeOrientation(locDir)
  1161.     if not moveDownDigging() then return false end
  1162.     -- Now at floor level
  1163.     level = level + 1
  1164.     if not moveDownDigging() then return false end
  1165.     -- Now at level above chests
  1166.     level = level + 1
  1167.     if not moveDownDigging() then return false end
  1168.     -- Now at level of first chests
  1169.     level = level + 1
  1170.     locLevel = 1
  1171.     while turtle.getItemCount(1) > 1 do
  1172.       -- Find next Inventory location with no chest.
  1173.        
  1174.       print("Checking level "..locLevel)
  1175.       for d=0,3 do
  1176.         changeOrientation(invDir + d)
  1177.         -- Check for an existing chest
  1178.         if turtle.detect() then
  1179.           turtle.select(1)
  1180.           if not turtle.compare(1) then
  1181.             while turtle.detect() do
  1182.               turtle.select(2)
  1183.               if not digForward() then return false end
  1184.               sleep(.5)
  1185.             end
  1186.             turtle.forward()
  1187.             while turtle.detect() do
  1188.               turtle.select(2)
  1189.               if not digForward() then return false end
  1190.               sleep(.5)
  1191.             end
  1192.             turtle.back()
  1193.           end
  1194.         end
  1195.         if not turtle.detect() then
  1196.           turtle.forward()
  1197.           while turtle.detect() do
  1198.             turtle.select(2)
  1199.             if not digForward() then return false end
  1200.             sleep(.5)
  1201.           end
  1202.           turtle.select(1)
  1203.           turtle.place()
  1204.           turtle.back()
  1205.           turtle.place()
  1206.         end
  1207.       end
  1208.       if turtle.detectDown() then
  1209.         turtle.select(2)
  1210.         if not moveDownDigging() then return false end
  1211.       else
  1212.         if not turtle.down() then return false end
  1213.       end
  1214.       level = level + 1
  1215.       locLevel = locLevel + 1
  1216.     end
  1217.     for l=1,level do turtle.up() end
  1218.     level = 0
  1219.     changeOrientation(unknownDir)
  1220.     for s=1,maxSlot do
  1221.       turtle.select(s)
  1222.       if turtle.getItemCount(s) > 0 then turtle.drop() end
  1223.     end
  1224.     locDir = 0
  1225.   end
  1226. end
  1227. -- Compare Inventory to contents of chest.
  1228. function compareLocation(fillEmptyChests)
  1229.   local emptyChestsFound = false
  1230.     -- Set flag to indicate turtle is empty
  1231.   turtle.select(1)
  1232.   turtle.suck()
  1233.   -- Only compare the slots if the chest wasn't empty.
  1234.   local quantity = 0
  1235.   if turtle.getItemCount(1) == 0 then
  1236.     if fillEmptyChests then    
  1237.       -- Put the next unidentified item in the slot to compare and place in the chest.
  1238.       for s=2,maxSlot do
  1239.         if turtle.getItemCount(s) > 0 then
  1240.           turtle.select(s)
  1241.           turtle.transferTo(1)
  1242.           quantity = quantity + turtle.getItemCount(1)
  1243.           break
  1244.         end
  1245.       end
  1246.     else
  1247.       emptyChestsFound = true
  1248.       table.insert(emptyChests, currentLocation)
  1249.     end
  1250.   end
  1251.   for s=2,maxSlot do
  1252.     -- Are there any items in this slot?
  1253.     if turtle.getItemCount(s) > 0 then
  1254.       turtle.select(s)
  1255.       if turtle.compareTo(1) then
  1256.         -- The current item matches the contents of the chest.
  1257.         quantity = quantity + turtle.getItemCount(s)
  1258.         turtle.drop()
  1259.         -- Subtract any that failed to be dropped.
  1260.         quantity = quantity - turtle.getItemCount(s)
  1261.         -- How do we detect that the chest is full?  You won't be able to drop it.
  1262.       end
  1263.     end
  1264.   end
  1265.   -- Now put the items back that were in slot 1.
  1266.   -- If the chest is full the material will remain in slot 1 and needs to be moved out.
  1267.   turtle.select(1)
  1268.   turtle.drop()
  1269.   -- Update inventory of location
  1270.   local name, qty = getInventoryNameQty(currentLocation)
  1271.   qty = qty + quantity
  1272.   inventoryName[currentLocation] = name.."#"..qty
  1273.   return emptyChestsFound
  1274. end
  1275. -- Put Inventory Away
  1276. function putInventoryAway()
  1277.   setStatus("putting inventory away")
  1278.   -- Make sure there is nothing is slot 1.
  1279.   if turtle.getItemCount(1) > 0 then
  1280.     changeOrientation(unknownDir)
  1281.     turtle.select(1)
  1282.     turtle.drop()
  1283.   end
  1284.   -- First put any fuel away.
  1285.   changeOrientation(fuelDir)
  1286.   for s=2,maxSlot do
  1287.     turtle.select(s)
  1288.     if turtle.compareTo(fuelSlot) then turtle.drop() end
  1289.   end
  1290.  
  1291. -- Check to see if any chests are in inventory
  1292.   local chestFound = false
  1293.   for s=2,maxSlot do
  1294.     turtle.select(s)
  1295.     if turtle.compare() then
  1296.       turtle.transferTo(1)
  1297.       chestFound = true
  1298.     end
  1299.   end
  1300.  
  1301.   -- If there are chests then create new inventory locations with them.
  1302.   changeOrientation(invDir)
  1303.   if chestFound then addInventoryLocation() end
  1304.   changeOrientation(invDir)
  1305.   -- If there is still something in slot 1 then move it back to inventory chest.
  1306.   if turtle.getItemCount(1) > 0 then turtle.drop() end
  1307.   -- If there is still something in the turtle then put it away.
  1308.   local emptyChestsFound = false, emptyChestLevel, emptyChestDir
  1309.   emptyChests = {}
  1310.     while not isTurtleEmpty() and gotoNextInventoryLocation() and not abortMission do
  1311.     emptyChestsFound = compareLocation(false)
  1312.     if emptyChestsFound and emptyChestLevel == nil then
  1313.       emptyChestLevel = locLevel
  1314.       emptyChestDir = locDir
  1315.     end
  1316.   end
  1317.   while not isTurtleEmpty() and #emptyChests > 0 do  
  1318.     local chestLocation = emptyChests[1]
  1319.     table.remove(emptyChests, 1)
  1320.     print("Filling location "..chestLocation)
  1321.     dirIdx = string.find(chestLocation, ",")
  1322.     if dirIdx ~= nil then
  1323.       emptyChestLevel = tonumber(string.sub(chestLocation, 1, dirIdx-1))
  1324.       emptyChestDir = tonumber(string.sub(chestLocation, dirIdx+1))
  1325.       gotoLocation(emptyChestLevel, emptyChestDir)
  1326.       compareLocation(true)
  1327.     end
  1328.   end
  1329.     if not goToStart() then return end
  1330.   -- If there is inventory left then put it in the Unknown inventory chest
  1331.     if not isTurtleEmpty() then emptyInventory() end
  1332. end
  1333. function putAwayInventory()
  1334.     -- Is there inventory to put away
  1335.     if not isTurtleEmpty() or loadInventory() then
  1336.         putInventoryAway()
  1337.     saveTable(inventoryName, "inventory")
  1338.     return true
  1339.   else
  1340.     return false
  1341.   end
  1342. end
  1343.  function findFuelChest()
  1344.   -- Find first empty slot.
  1345.   for s=1,maxSlot do
  1346.     if turtle.getItemCount(s)==0 then
  1347.       turtle.select(s)
  1348.       break
  1349.     end
  1350.   end
  1351.   testOK = false
  1352.   for a=1,4 do
  1353.     if turtle.suck() then
  1354.       -- Was the fuel chest was found so we are in the correct location.
  1355.       if turtle.compareTo(fuelSlot) then testOK = true end
  1356.       turtle.drop()
  1357.     end
  1358.     if testOK then break else turtle.turnRight() end
  1359.   end
  1360.   return testOK
  1361. end
  1362. function powerUpChecks()
  1363.   if turtle.getItemCount(fuelSlot) == 0 then
  1364.     print("Place fuel in slot "..fuelSlot.." for fuel.")
  1365.     while turtle.getItemCount(fuelSlot) == 0 do
  1366.       sleep(10)
  1367.     end
  1368.   end
  1369.   getPickAxeStatus()
  1370.   --Move to the top
  1371.   local x = 0
  1372.   firstEmpty = false
  1373.   while not turtle.detectUp() do
  1374.     if turtle.up() then x = x + 1 end
  1375.      
  1376.    
  1377.     if x > 10 and not turtle.detect() and firstEmpty then
  1378.       -- We have travelled far enough
  1379.       for z=1,x do
  1380.          
  1381.         turtle.down()
  1382.       end
  1383.       print("Can't locate ceiling.")
  1384.       break
  1385.     end
  1386.     if not turtle.detect() then
  1387.       firstEmpty = true
  1388.     else
  1389.       firstEmpty = false
  1390.     end
  1391.   end
  1392.   print("Testing orientation.")
  1393.   local testOK = "N"
  1394.   if findFuelChest() then testOK = "Y" end
  1395.   if string.upper(testOK) ~= "Y" then
  1396.     local setupNeeded = ""
  1397.     term.write("Create inventory chests? (Y/N):")
  1398.     setupNeeded = string.upper(io.read())
  1399.     if setupNeeded == "Y" then
  1400.       hasPickAxe = true
  1401.       local onFloor = "N"
  1402.       while onFloor ~= "Y" do
  1403.         term.write("At floor level? ('Y'/'U'p/'D'own):")
  1404.         onFloor = string.upper(io.read())
  1405.         if onFloor == "U" then turtle.up() end
  1406.         if onFloor == "D" then turtle.down() end
  1407.       end
  1408.       if Initialize() then
  1409.         if findFuelChest() then
  1410.           testOK = "Y"
  1411.           orientation = fuelDir
  1412.           emptyInventory()
  1413.           changeOrientation(fuelDir)
  1414.         end
  1415.       else
  1416.         abortMission = true
  1417.       end
  1418.     else
  1419.       return false
  1420.     end
  1421.   end
  1422.   while abortMission == false and string.upper(testOK) ~= "Y" do
  1423.     turtle.turnLeft()
  1424.     print("Facing fuel chest? (Y/N):")
  1425.     testOK = string.upper(io.read())
  1426.     if testOK == "Y" then
  1427.       turtle.select(fuelSlot)
  1428.       turtle.drop(1)
  1429.     end
  1430.   end
  1431.   orientation = fuelDir
  1432.   print("Found fuel chest")
  1433.   -- Make sure nothing is in slot 1.  Bad things happen if that is so.
  1434.   if turtle.getItemCount(1) > 0 then
  1435.     changeOrientation(unknownDir)
  1436.     turtle.select(1)
  1437.     turtle.drop()
  1438.   end  
  1439.   changeOrientation(invDir)
  1440.   inventoryName = loadTable("inventory")  
  1441.   return true
  1442. end
  1443. function listenForMessages()
  1444.   rednet.open("right")
  1445.   while true do
  1446.     setStatus("Listening")
  1447.     local id, msg = rednet.receive(5)
  1448.     if type(id) == "number" then
  1449.       if id ~= storeKeeperID then table.insert(queue, msg) end
  1450.     else
  1451.       return false
  1452.     end
  1453.   end
  1454.   rednet.close("right")
  1455. end
  1456. function setStatus(msg)
  1457.   if rednet.isOpen("right") then
  1458.     if orderComputer ~= nil then
  1459.       rednet.send(orderComputer, msg)
  1460.     else
  1461.       rednet.broadcast(msg)
  1462.     end
  1463.   end
  1464. end
  1465. function returnItemToInventory(slot, level, dir)
  1466.   local invLoc = level..","..dir
  1467.   if turtle.getItemCount(slot) > 0 then
  1468.     if gotoLocation(level,dir) then
  1469.       turtle.select(slot)
  1470.       local name, qty = getInventoryNameQty(invLoc)
  1471.       qty = qty + turtle.getItemCount(slot)
  1472.       inventoryName[invLoc] = name.."#"..qty
  1473.       turtle.drop()
  1474.     end
  1475.   end
  1476. end
  1477. function countNew()
  1478.   -- Count all of the inventory locations that don't have a quantity
  1479.   local level = 1
  1480.   local dir = 1  
  1481.   while true do
  1482.     local invLoc = level..","..dir
  1483.     local name = inventoryName[invLoc]
  1484.     if name ~= nil then
  1485.       local qidx = string.find(name,"#")
  1486.       if qidx == nil then countLocation(invLoc) end
  1487.       if dir == 4 then
  1488.         dir = 1
  1489.         level = level + 1
  1490.       else
  1491.         dir = dir + 1
  1492.       end
  1493.     end
  1494.   end
  1495.   goToStart()
  1496. end
  1497. function countAll()
  1498.   -- Count all of the inventory locations that don't have a quantity
  1499.   local level = 1
  1500.   local dir = 1  
  1501.   while true do
  1502.     local invLoc = level..","..dir
  1503.     if countLocation(invLoc) then
  1504.       if dir == 4 then
  1505.         dir = 1
  1506.         level = level + 1
  1507.       else
  1508.         dir = dir + 1
  1509.       end
  1510.     else
  1511.       break
  1512.     end
  1513.   end
  1514.   goToStart()
  1515. end
  1516. function countLocation(invLoc)
  1517.   -- Count item in invLoc.
  1518.   print("Counting "..invLoc)
  1519.   local totalQty = 0
  1520.   local name, quantity = getInventoryNameQty(invLoc)
  1521.   local quantity = 0  
  1522.   local displayname = name
  1523.   if name == "_" then displayname = "Unidentified" end
  1524.   setStatus("counting "..displayname.." in location "..invLoc)
  1525.   local idx = string.find(invLoc.."",",")
  1526.   local level = tonumber(string.sub(invLoc,1,idx-1))
  1527.   local dir = tonumber(string.sub(invLoc,idx+1))
  1528.   if gotoLocation(level,dir) then
  1529.     turtle.select(1)
  1530.     while turtle.suck() and turtle.getItemCount(maxSlot)==0 do found = true end
  1531.     for slot=1,maxSlot do
  1532.       quantity = quantity + turtle.getItemCount(slot)
  1533.     end
  1534.     if quantity==0 then
  1535.       inventoryName = tableRemoveKey(inventoryName,invLoc)
  1536.     else
  1537.       inventoryName[invLoc] = name.."#"..quantity
  1538.     end
  1539.    
  1540.     setStatus(quantity.." "..displayname.." in location "..invLoc)
  1541.     -- Now put it all back
  1542.     for slot=1,maxSlot do
  1543.       if turtle.getItemCount(slot) > 0 then
  1544.         turtle.select(slot)
  1545.         turtle.drop()
  1546.       else
  1547.         break
  1548.       end
  1549.     end
  1550.   else
  1551.     return false
  1552.   end
  1553.   return true
  1554. end
  1555. function fetchItem(command)
  1556.   local invLoc = string.sub(command,6)
  1557.   local quantity = 1
  1558.   local quantityIdx = string.find(invLoc.."","-")
  1559.   if quantityIdx ~= nil then
  1560.     quantity = tonumber(string.sub(invLoc, quantityIdx+1))
  1561.     invLoc = string.sub(invLoc,1,quantityIdx-1)
  1562.   end
  1563.   local item,qty = getInventoryNameQty(invLoc)
  1564.   setStatus("Fetching "..item.." from "..invLoc)
  1565.   print("Fetching "..quantity.." of "..item)
  1566.   setStatus("fetching "..quantity.." of "..item)
  1567.   depositInMasterChest(item, invLoc, quantity)
  1568. end
  1569. function tableRemoveKey(sourceTable, keyToRemove)
  1570.   local newTable = {}
  1571.   for key,value in pairs(sourceTable) do
  1572.     if key ~= keyToRemove then newTable[key]=value end
  1573.   end
  1574.   return newTable
  1575. end
  1576. function emptyInMasterChest(invLoc)
  1577.   -- Locate item in inventoryName.
  1578.   local found = false
  1579.   local totalQty = 0
  1580.   print("emptying location "..invLoc)
  1581.   setStatus("emptying location "..invLoc)
  1582.   found = true
  1583.   local idx = string.find(invLoc.."",",")
  1584.   local level = tonumber(string.sub(invLoc,1,idx-1))
  1585.   local dir = tonumber(string.sub(invLoc,idx+1))
  1586.   if gotoLocation(level,dir) then
  1587.     turtle.select(1)
  1588.     print("sucking from "..invLoc)
  1589.     while turtle.suck() and turtle.getItemCount(maxSlot)==0 do found = true end
  1590.     if turtle.getItemCount(maxSlot) == 0 then
  1591.       print("removing "..invLoc)
  1592.       inventoryName = tableRemoveKey(inventoryName,invLoc)
  1593.     end
  1594.   else
  1595.     setStatus("Unable to access location")
  1596.     return false
  1597.   end
  1598.   if goToStart() then
  1599.     if found then
  1600.       if turtleInventory() == 0 then
  1601.         setStatus("Location "..invLoc.." already empty.")
  1602.       else
  1603.         for s=1,maxSlot do
  1604.           turtle.select(s)
  1605.           turtle.dropUp()
  1606.         end
  1607.         setStatus("Location "..invLoc.." emptied.")
  1608.       end
  1609.       return true
  1610.     end
  1611.   end
  1612.   setStatus("Unable to find location "..invLoc)
  1613.   return false
  1614. end
  1615. function turtleInventory()
  1616.   local qty = 0
  1617.   for s=1,maxSlot do
  1618.     qty = qty + turtle.getItemCount(s)
  1619.   end
  1620.   return qty
  1621. end
  1622. function getInventoryNameQty(invLocation)        
  1623.   local name = inventoryName[invLocation]
  1624.   local qty = 0
  1625.   if name ~= nil then
  1626.     local idx = string.find(name,"#")
  1627.     if idx ~= nil then
  1628.       qty = string.sub(name,idx+1)
  1629.       if qty == nil then qty = 0 end
  1630.       name = string.sub(name,1,idx-1)
  1631.     end
  1632.   else
  1633.     name = "_"
  1634.   end
  1635.   return name,qty
  1636. end
  1637. function depositInMasterChest(item, invLoc, quantity)
  1638.   -- Locate item in inventoryName.
  1639.   local found = false
  1640.   local totalQty = 0
  1641.   for invLocation,value in pairs(inventoryName) do
  1642.     local name, qty = getInventoryNameQty(invLocation)    
  1643.     if name == item then
  1644.       print("checking location "..invLocation)
  1645.       setStatus("checking location "..invLocation)
  1646.       found = true
  1647.       local idx = string.find(invLocation.."", ",")
  1648.       local level = tonumber(string.sub(invLocation,1,idx-1))
  1649.       local dir = tonumber(string.sub(invLocation,idx+1))
  1650.       if gotoLocation(level,dir) then
  1651.         local prevQty = 0
  1652.         turtle.select(1)
  1653.         local firstSuck = true
  1654.         totalQty = turtleInventory()
  1655.         while totalQty < quantity do
  1656.           if not turtle.suck() then
  1657.             -- No more to suck
  1658.             if firstSuck then tableRemoveKey(inventoryName,invLocation) end
  1659.             break
  1660.           else
  1661.             totalQty = turtleInventory()
  1662.             if totalQty > quantity then
  1663.               -- We sucked more than we need
  1664.               turtle.drop(totalQty - quantity)
  1665.               break
  1666.             elseif firstSuck then
  1667.               -- We need to leave at least 1 per location.
  1668.               turtle.drop(1)
  1669.               firstSuck = false
  1670.             end
  1671.             qty = totalQty - prevQty
  1672.             prevQty = totalQty
  1673.             found = true
  1674.           end
  1675.         end
  1676.         inventoryName[invLocation] = name.."#"..qty  
  1677.         if totalQty == quantity then break end
  1678.       else
  1679.         setStatus("Unable to access location")
  1680.         inventoryName = tableRemoveKey(inventoryName,invLocation)
  1681.         return false
  1682.       end
  1683.       break
  1684.     end
  1685.   end
  1686.   if goToStart() then
  1687.     if found then
  1688.       if turtleInventory() == 0 then
  1689.         setStatus("only 1 "..item.." found.")
  1690.       else
  1691.         for s=1,maxSlot do
  1692.           turtle.select(s)
  1693.           turtle.dropUp()
  1694.         end
  1695.         setStatus("finished retrieving item "..item)
  1696.       end
  1697.       return true
  1698.     end
  1699.   end
  1700.   setStatus("Unable to find item "..item)
  1701.   return false
  1702. end
  1703. function getPickAxeStatus()
  1704.   local fname = "hasPickAxe"
  1705.   if fs.exists(fname) then
  1706.     file = fs.open(fname, "r")
  1707.     local frcd = file.readAll()
  1708.     if frcd == "Y" then hasPickAxe = true else hasPickAxe = false end
  1709.     file.close()
  1710.   else
  1711.     file = fs.open(fname, "w")
  1712.     file.write("N")
  1713.     file.close()
  1714.     hasPickAxe = false
  1715.   end
  1716. end
  1717. function getOrderComputer()
  1718.   local fname = "InventoryControlID"
  1719.   if fs.exists(fname) then
  1720.     file = fs.open(fname, "r")
  1721.     local frcd = file.readAll()
  1722.     orderComputer = tonumber(frcd)
  1723.     file.close()
  1724.   else
  1725.     print("Inventory Manager ID:")
  1726.     orderComputer = tonumber(io.read())
  1727.     file = fs.open(fname, "w")
  1728.     file.write(orderComputer)
  1729.     file.close()
  1730.   end
  1731. end
  1732. function runQueue()
  1733.   while true do
  1734.     if #queue == 0 then
  1735.       if not putAwayInventory() then
  1736.          
  1737.         setStatus("waiting")
  1738.       end
  1739.       return true
  1740.     else
  1741.       local command = queue[1]
  1742.       print("Queue contains "..command)
  1743.       table.remove(queue, 1)
  1744.       if command == "identify" then
  1745.         setStatus("Identify Acknowledged")
  1746.         -- Identify items in unidentified locations
  1747.         identifyInventory()
  1748.         setStatus("finished")
  1749.       elseif (command == "reportinventory") then
  1750.         setStatus("Report Acknowledged")
  1751.         reportInventory(orderComputer)
  1752.       elseif (string.sub(command,1,5) == "fetch") then
  1753.         setStatus("Fetch Acknowledged")
  1754.         fetchItem(command)
  1755.         saveTable(inventoryName, "inventory")
  1756.         setStatus("finished")
  1757.       elseif (string.sub(command,1,5) == "empty") then
  1758.         setStatus("Empty Acknowledged")
  1759.         local invLoc = string.sub(command,6)
  1760.         setStatus("Emptying "..invLoc)
  1761.         while inventoryName[invLoc] ~= nil do emptyInMasterChest(invLoc) end
  1762.         saveTable(inventoryName, "inventory")
  1763.         setStatus("finished")
  1764.       elseif (string.sub(command,1,5) == "count") then
  1765.         setStatus("Count Acknowledged")
  1766.         local invLoc = string.sub(command,7)
  1767.         if invLoc == "all" then
  1768.           countAll()
  1769.         elseif invLoc == "new" then
  1770.           countNew()
  1771.         else
  1772.           countLocation(invLoc)
  1773.           goToStart()
  1774.         end
  1775.         saveTable(inventoryName, "inventory")
  1776.         setStatus("finished")
  1777.       end
  1778.     end
  1779.   end
  1780. end
  1781. --------------------- Main Program ---------------------
  1782. -- Check orientation. and move to start position.
  1783. storeKeeperID = os.getComputerID()
  1784. print("Computer ID: "..storeKeeperID)
  1785. if not powerUpChecks() then return end
  1786. print("Startup completed")
  1787. getOrderComputer()
  1788. while true do
  1789.   if not listenForMessages() then
  1790.     runQueue()
  1791.   end
  1792. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement