PaleoCrafter

Tunnel

Jan 16th, 2021 (edited)
694
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.22 KB | None | 0 0
  1. -- Last pos: -7944
  2. SAFE_SLOTS = 3
  3. LAST_FILLER_SLOT = 8
  4. SLOT_COUNT = 16
  5. CHUNK_LOADER_PERIOD=16
  6.  
  7. function selectFiller()
  8.   for slot = SAFE_SLOTS + 1, SLOT_COUNT do
  9.     turtle.select(slot)
  10.     if turtle.compareTo(2) and turtle.getItemCount() > 1 then
  11.       return
  12.     end
  13.   end
  14. end
  15.  
  16. function selectFillerDestination()
  17.   turtle.select(SAFE_SLOTS + 1)
  18. end
  19.  
  20. function placeFiller(direction)
  21.   if direction == nil then
  22.     direction = ''
  23.   end
  24.  
  25.   while turtle['detect' .. direction]() do
  26.     selectFillerDestination()
  27.     turtle['dig' .. direction]()
  28.   end
  29.   selectFiller()
  30.   turtle['place' .. direction]()
  31. end
  32.  
  33. function clear(direction)
  34.   if direction == nil then
  35.     direction = ''
  36.   end
  37.  
  38.   while turtle['detect' .. direction]() do
  39.     selectFiller()
  40.     turtle['place' .. direction]()
  41.     selectFillerDestination()
  42.     turtle['dig' .. direction]()
  43.   end
  44. end
  45.  
  46. function move(direction)
  47.   clear(direction)
  48.  
  49.   if direction == nil or direction == '' then
  50.     turtle.forward()
  51.   elseif direction == 'Up' then
  52.     turtle.up()
  53.   else
  54.     turtle.down()
  55.   end
  56. end
  57.  
  58. function dropNonFuel()
  59.   for slot = LAST_FILLER_SLOT + 1, SLOT_COUNT do
  60.     turtle.select(slot)
  61.     if not turtle.refuel() then
  62.       turtle.drop()
  63.     end
  64.   end
  65. end
  66.  
  67. function buildLayer(width, height)
  68.   local startFuel = turtle.getFuelLevel()
  69.   local left = math.floor(width / 2)
  70.   local right = left
  71.  
  72.   move()
  73.   turtle.turnLeft()
  74.   for i = 1, left + 1 do
  75.     placeFiller('Down')
  76.     clear('')
  77.     move()
  78.   end
  79.  
  80.   placeFiller('Down')
  81.  
  82.   turtle.turnLeft()
  83.   turtle.turnLeft()
  84.   for i = 1, height - 1 do
  85.     move('Up')
  86.     clear()
  87.     placeFiller('Down')
  88.   end
  89.  
  90.   placeFiller('Up')
  91.   turtle.forward()
  92.   turtle.turnLeft()
  93.   turtle.turnLeft()
  94.   placeFiller()
  95.   turtle.turnLeft()
  96.   turtle.turnLeft()
  97.  
  98.   for i = 1, width do
  99.     placeFiller('Up')
  100.     move()
  101.   end
  102.  
  103.   placeFiller('Up')
  104.  
  105.   turtle.turnLeft()
  106.   turtle.turnLeft()
  107.   for i = 1, height - 1 do
  108.     move('Down')
  109.     clear()
  110.     placeFiller('Up')
  111.   end
  112.  
  113.   placeFiller('Down')
  114.   turtle.forward()
  115.   turtle.turnLeft()
  116.   turtle.turnLeft()
  117.   placeFiller()
  118.   turtle.turnLeft()
  119.   turtle.turnLeft()
  120.  
  121.   for i = 1, right - 1 do
  122.     placeFiller('Down')
  123.     move()
  124.   end
  125.  
  126.   placeFiller('Down')
  127.  
  128.   local currentDirection = 'Up'
  129.   move('Up')
  130.   for x = 1, width - 2 do
  131.     for y = 1, height - 3 do
  132.         move(currentDirection)
  133.     end
  134.  
  135.     move()
  136.     if currentDirection == 'Up' then
  137.       currentDirection = 'Down'
  138.     else
  139.       currentDirection = 'Up'
  140.     end
  141.   end
  142.  
  143.   if currentDirection == 'Down' then
  144.     for y = 1, height - 2 do
  145.       move('Down')
  146.     end
  147.   else
  148.     move('Down')
  149.   end
  150.  
  151.   turtle.turnLeft()
  152.   turtle.turnLeft()        
  153.   for i = 1, left do
  154.     move()
  155.   end
  156.   turtle.turnLeft()
  157.  
  158.   local consumedFuel = startFuel - turtle.getFuelLevel()
  159.  
  160.   dropNonFuel()
  161.  
  162.   return consumedFuel
  163. end
  164.  
  165. function moveChunkLoader()
  166.   turtle.turnLeft()
  167.   turtle.turnLeft()
  168.  
  169.   turtle.select(3)
  170.   turtle.place()
  171.  
  172.   turtle.up()
  173.   for i = 1, CHUNK_LOADER_PERIOD do
  174.     move()
  175.   end
  176.   turtle.down()
  177.  
  178.   turtle.dig()
  179.  
  180.   turtle.up()
  181.   for i = 1, CHUNK_LOADER_PERIOD do
  182.     turtle.back()
  183.   end
  184.   turtle.down()
  185.  
  186.   turtle.turnLeft()
  187.   turtle.turnLeft()
  188. end
  189.  
  190. args = {...}
  191. tunnelWidth = tonumber(args[1])
  192. tunnelHeight = tonumber(args[2])
  193.  
  194. if turtle.getFuelLevel() < tunnelWidth * tunnelHeight then
  195.   error('Need some fuel to get started!')
  196. end
  197.  
  198. turtle.turnLeft()
  199. turtle.turnLeft()
  200.  
  201. turtle.select(3)
  202. turtle.place()
  203.    
  204. turtle.turnLeft()
  205. turtle.turnLeft()
  206.  
  207. fuelUsage = buildLayer(tunnelWidth, tunnelHeight)
  208. averageFuelUsage = fuelUsage
  209. layers = 1
  210.  
  211. while turtle.getFuelLevel() > 2 * fuelUsage and (#args < 3 or layers < tonumber(args[3])) do
  212.   fuelUsage = buildLayer(tunnelWidth, tunnelHeight)
  213.   layers = layers + 1
  214.   averageFuelUsage = averageFuelUsage + (fuelUsage - averageFuelUsage) / layers
  215.  
  216.   if layers % CHUNK_LOADER_PERIOD == 0 then
  217.     moveChunkLoader()
  218.   end
  219.  
  220.   if turtle.getFuelLevel() <= 2 * fuelUsage then
  221.     turtle.select(1)
  222.     turtle.refuel(1)
  223.   end
  224. end
  225.  
  226. print('Ran out of fuel or terminated after ' .. tostring(layers) .. ' layers!')
  227. print('Average fuel usage was: ' .. tostring(averageFuelUsage))
  228.  
Add Comment
Please, Sign In to add comment