Advertisement
jhnphm

TurtleTunnel

Feb 18th, 2013
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.07 KB | None | 0 0
  1. P_START = 0
  2. P_PLCTORCH = 1
  3. P_RIGHTCLR = 2
  4. P_LEFTCLR = 3
  5. P_RETURN = 4
  6. P_DONE = 5
  7.  
  8. local tArgs = { ... }
  9.  
  10. local length
  11.  
  12. local state = nil
  13. local state_file = fs.open("tunnel_state.dat", "r")
  14. if state_file ~= nil then
  15.     state = textutils.unserialize(state_file.readLine())
  16.     length = state.length
  17.     state_file.close()
  18. else
  19.     if #tArgs ~= 2 and #tArgs ~=1 then
  20.         error( "Usage: tunnel3 <length>" )
  21.     end
  22.     length = tonumber( tArgs[1] )
  23.     if length < 1 then
  24.         print( "Tunnel length must be positive" )
  25.         return
  26.     end
  27.     state = {i=1,n=1,phase = P_START, ["length"] = length}
  28. end
  29.  
  30.  
  31.  
  32. -- Mine in a quarry pattern until we hit something we can't dig
  33.    
  34. local collected = 0
  35.  
  36. function dump()
  37.     turtle.dig()
  38.     turtle.select(14)
  39.     turtle.place()
  40.     for i=2,12 do
  41.         turtle.select(i)
  42.         turtle.drop()
  43.     end
  44.     turtle.select(14)
  45.     turtle.dig()
  46.     turtle.select(1)
  47. end
  48.  
  49. function collect()
  50.     collected = collected + 1
  51.     if math.fmod(collected, 25) == 0 then
  52.         print( "Mined "..collected.." items." )
  53.     end
  54.     if math.fmod(collected, 16) == 0 then
  55.         dump()
  56.     end
  57. end
  58.  
  59. function tryDig()
  60.     while turtle.detect() do
  61.         if turtle.dig() then
  62.             collect()
  63.             --sleep(0.5)
  64.         else
  65.             return false
  66.         end
  67.     end
  68.     return true
  69. end
  70.  
  71. function tryDigUp()
  72.     while turtle.detectUp() do
  73.         if turtle.digUp() then
  74.             collect()
  75.             --sleep(0.5)
  76.         else
  77.             return false
  78.         end
  79.     end
  80.     return true
  81. end
  82.  
  83. function tryDigDown()
  84.     while turtle.detectDown() do
  85.         if turtle.digDown() then
  86.             collect()
  87.             --sleep(0.5)
  88.         else
  89.             return false
  90.         end
  91.     end
  92.     return true
  93. end
  94.  
  95. function refuel()
  96.     local fuelLevel = turtle.getFuelLevel()
  97.     if fuelLevel == "unlimited" or fuelLevel > 0 then
  98.         return
  99.     end
  100.    
  101.     function tryRefuel()
  102.         turtle.dig()
  103.         turtle.select(16)
  104.         turtle.place()
  105.         turtle.suck()
  106.         if turtle.refuel() then
  107.             turtle.dig()
  108.             return true
  109.         else
  110.             turtle.dig()
  111.             return false
  112.         end
  113.     end
  114.    
  115.     if not tryRefuel() then
  116.         print( "Add more fuel to continue." )
  117.         while not tryRefuel() do
  118.             sleep(1)
  119.         end
  120.         print( "Resuming Tunnel." )
  121.     end
  122. end
  123.  
  124. function tryUp()
  125.     refuel()
  126.     while not turtle.up() do
  127.         if turtle.detectUp() then
  128.             if not tryDigUp() then
  129.                 return false
  130.             end
  131.         elseif turtle.attackUp() then
  132.             collect()
  133.         else
  134.             sleep( 0.5 )
  135.         end
  136.     end
  137.     return true
  138. end
  139.  
  140. function tryDown()
  141.     refuel()
  142.     while not turtle.down() do
  143.         if turtle.detectDown() then
  144.             if not tryDigDown() then
  145.                 return false
  146.             end
  147.         elseif turtle.attackDown() then
  148.             collect()
  149.         else
  150.             sleep( 0.5 )
  151.         end
  152.     end
  153.     return true
  154. end
  155.  
  156. function tryForward()
  157.     refuel()
  158.     while not turtle.forward() do
  159.         if turtle.detect() then
  160.             if not tryDig() then
  161.                 return false
  162.             end
  163.         elseif turtle.attack() then
  164.             collect()
  165.         else
  166.             sleep( 0.5 )
  167.         end
  168.     end
  169.     return true
  170. end
  171.  
  172. -- Retrieve enderchest if still out
  173. function checkChest(slotNum)
  174.     if turtle.getItemCount(slotNum) == 0 then
  175.         turtle.select(slotNum)
  176.         turtle.dig()
  177.     end
  178.     if turtle.getItemCount(slotNum) == 0 then
  179.         error("Missing chest")
  180.     end
  181. end
  182.  
  183. print( "Tunnelling..." )
  184.  
  185.  
  186.  
  187.  
  188.  
  189. checkChest(13)
  190. checkChest(14)
  191. checkChest(16)
  192.  
  193. function saveState()
  194.     local state_file = fs.open("tunnel_state.dat", "w")
  195.     state_file.writeLine(textutils.serialize(state))
  196.     state_file.close()
  197. end
  198.  
  199. function returnStart()
  200.     turtle.turnLeft()
  201.     for n=state.n, (length/3)*3-2 do
  202.         state.n = n
  203.         state.phase = P_RETURN
  204.         saveState()
  205.         turtle.select(1)
  206.         tryForward()
  207.     end
  208.     tryDown()
  209.     turtle.turnLeft()
  210.     dump()
  211.  
  212.  
  213.     print( "Tunnel complete." )
  214.     --[[
  215.     print( "Returning to start..." )
  216.  
  217.     -- Return to where we started
  218.     turtle.turnLeft()
  219.     turtle.turnLeft()
  220.     while depth > 0 do
  221.         if turtle.forward() then
  222.             depth = depth - 1
  223.         else
  224.             turtle.dig()
  225.         end
  226.     end
  227.     turtle.turnRight()
  228.     turtle.turnRight()
  229.     ]]
  230.  
  231.     print( "Tunnel complete." )
  232.     print( "Mined "..collected.." items total." )
  233.     fs.delete("tunnel_state.dat")
  234.     error(0)
  235. end
  236.  
  237.  
  238.  
  239.  
  240. for i=state.i,(length/3) do
  241.     function start()
  242.         for n=state.n,length do
  243.             state.n = n
  244.             state.phase = P_START
  245.             saveState()
  246.         print("filling path")
  247.             turtle.select(1)
  248.             turtle.placeDown()
  249.             if n<length then
  250.                 tryDigUp()
  251.                 if not tryForward() then
  252.                     error( "Aborting Tunnel." )
  253.                 end
  254.             end
  255.         end
  256.         state.n = 1
  257.  
  258.  
  259.     -- Hope turtle isn't shut dwon in this critical block
  260.         turtle.turnRight()
  261.         turtle.turnRight()
  262.         tryUp()
  263.     --
  264.     --
  265.         plcTorch()
  266.     end
  267.  
  268.     function plcTorch()
  269.         for n=state.n,length-1 do
  270.             state.n = n
  271.             state.phase = P_PLCTORCH
  272.             saveState()
  273.         turtle.select(1)
  274.             tryDigUp()
  275.             if n % 3 == 0 then
  276.                 turtle.select(15)
  277.                 while turtle.getItemCount(15) < 5 do
  278.                     turtle.select(1)
  279.                     turtle.dig()
  280.                     turtle.select(13)
  281.                     turtle.place()
  282.                     turtle.select(15)
  283.                     turtle.suck()
  284.                     turtle.select(13)
  285.                     turtle.dig()
  286.                     turtle.select(15)
  287.                     if turtle.getItemCount(15) < 5 then
  288.                         print( "Add more torches to continue." )
  289.                         sleep(1)
  290.                     end
  291.                 end
  292.                 turtle.placeDown()
  293.             end
  294.             if not tryForward() then
  295.                 error( "Aborting Tunnel." )
  296.             end
  297.         end
  298.         state.n = 1
  299.  
  300.     -- Hope turtle isn't shut dwon in this critical block
  301.         turtle.turnLeft()
  302.         tryDig()
  303.         if not tryForward() then
  304.             error( "Aborting Tunnel." )
  305.         end
  306.         turtle.turnLeft()
  307.     --
  308.     --
  309.         rightClr()
  310.     end
  311.  
  312.  
  313.     function rightClr()
  314.         for n=state.n,length-1 do
  315.             state.n = n
  316.             state.phase = P_RIGHTCLR
  317.             saveState()
  318.         turtle.select(1)
  319.             tryDigUp()
  320.             tryDigDown()
  321.             if not tryForward() then
  322.                 error( "Aborting Tunnel." )
  323.             end
  324.         end
  325.         state.n = 1
  326.  
  327.  
  328.  
  329.     -- Hope turtle isn't shut dwon in this critical block
  330.         tryDigUp()
  331.         tryDigDown()
  332.         turtle.turnLeft()
  333.         if not tryForward() then
  334.             error( "Aborting Tunnel." )
  335.         end
  336.         tryDig()
  337.         if not tryForward() then
  338.             error( "Aborting Tunnel." )
  339.         end
  340.         turtle.turnLeft()
  341.     --
  342.     --
  343.         leftClr()
  344.     end
  345.  
  346.     function leftClr()
  347.         for n=state.n,length-1 do
  348.             state.n = n
  349.             state.phase = P_LEFTCLR
  350.             saveState()
  351.         turtle.select(1)
  352.             tryDigUp()
  353.             tryDigDown()
  354.             if not tryForward() then
  355.                 error( "Aborting Tunnel." )
  356.             end
  357.         end
  358.         state.n = 1
  359.        
  360.     -- Hope turtle isn't shut dwon in this critical block
  361.         if i ~= length/3 then
  362.             turtle.turnRight()
  363.             tryDigUp()
  364.             tryDigDown()
  365.             tryForward()
  366.             tryDigUp()
  367.             tryDigDown()
  368.             tryForward()
  369.             tryDigUp()
  370.             tryDown()
  371.             turtle.turnRight()
  372.             state.phase = P_START
  373.         saveState()
  374.         else
  375.             returnStart()
  376.         end
  377.     --
  378.     --
  379.    
  380.     end
  381.  
  382.     state.i = i
  383.     if state.phase == P_START then
  384.         start()
  385.     elseif state.phase == P_PLCTORCH then
  386.         plcTorch()
  387.     elseif state.phase == P_RIGHTCLR then
  388.         rightClr()
  389.     elseif state.phase == P_LEFTCLR then
  390.         leftClr()
  391.     elseif state.phase == P_RETURN then
  392.         returnStart()
  393.     end
  394. end
  395. returnStart()
  396.  
  397.  
  398.  
  399.  
  400. -- vim: set ft=lua:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement