Advertisement
disasm

dig_ng.lua

Oct 3rd, 2022 (edited)
917
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.40 KB | None | 0 0
  1. --[[
  2. startup:
  3. shell.run("/rom/programs/turtle/dig", "restore")
  4. shell.run("/dig", "restore")
  5. ]]
  6.  
  7. local stateFileName = "/dig.state"
  8. local maxDepth = 1000  -- for debug, default=1000
  9. local ender_chest = "EnderStorage:enderChest"
  10.  
  11. local restore = false
  12. local size = 0
  13. local xPos,zPos = 0,-1
  14. local xDir,zDir = 0,1
  15. local depth = 0
  16.  
  17. local function usage()
  18.     print( "Usage: dig <diameter> [max_depth]" )
  19.     print( "Pattern: ")
  20.     print( "###" )
  21.     print( "###" )
  22.     print( "###" )
  23.     print( "^    <-turtle" )
  24. end
  25.  
  26. local function restoreState()
  27.     if not fs.exists(stateFileName) then
  28.         print("Can't find state file")
  29.         return false
  30.     end
  31.  
  32.     local f = fs.open(stateFileName, "r")
  33.     local state = f.readAll()
  34.     f.close()
  35.  
  36.     local result = textutils.unserialize( state )
  37.     if type(result) == "table" and #result == 7 then
  38.         size = result[1]
  39.         xPos, zPos = result[2], result[3]
  40.         xDir, zDir = result[4], result[5]
  41.         maxDepth = result[6]
  42.         return true
  43.     else
  44.         print("Incorrect format")
  45.         return false
  46.     end
  47. end
  48.  
  49. local function saveState()
  50.     local f = fs.open(stateFileName, "w")
  51.     local state = textutils.serialize({size, xPos, zPos, xDir, zDir, maxDepth})
  52.     f.write(state)
  53.     f.close()
  54. end
  55.  
  56. local function deleteState()
  57.     fs.delete(stateFileName)
  58. end
  59.  
  60. local function refuel(needed)
  61.     local fuelLevel = turtle.getFuelLevel()
  62.     if fuelLevel == "unlimited" then
  63.         return true
  64.     end
  65.  
  66.     if fuelLevel < needed then
  67.         for n=1,16 do
  68.             if turtle.getItemCount(n) > 0 then
  69.                 turtle.select( n )
  70.                 if turtle.refuel(1) then
  71.                     while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  72.                         turtle.refuel(1)
  73.                     end
  74.                 end
  75.                 if turtle.getFuelLevel() >= needed then
  76.                     turtle.select(1)
  77.                     return true
  78.                 end
  79.             end
  80.         end
  81.         turtle.select(1)
  82.         return false
  83.     end
  84.  
  85.     return true
  86. end
  87.  
  88. local nofuel = false
  89.  
  90. local function checkFuel(needed)
  91.     local fuelLevel = turtle.getFuelLevel()
  92.     if fuelLevel == "unlimited" then
  93.         nofuel = false
  94.         return true
  95.     end
  96.  
  97.     if fuelLevel < needed then
  98.         nofuel = true
  99.     else
  100.         nofuel = false
  101.     end
  102.     return not nofuel
  103. end
  104.  
  105. local function hasSlots()
  106.     if turtle.getItemCount(15)==0 then
  107.         return true
  108.     else
  109.         return false
  110.     end
  111. end
  112.  
  113. local function unload()
  114.     while not turtle.up() do
  115.         sleep(0.1)
  116.     end
  117.     turtle.select(16)
  118.     while not turtle.placeDown() do
  119.         sleep(0.1)
  120.     end
  121.  
  122.     for i=1,15 do
  123.         if turtle.getItemCount(i) > 0 then
  124.             turtle.select(i)
  125.             turtle.dropDown()
  126.             sleep(0.5)
  127.         end
  128.     end
  129.  
  130.     turtle.select(16)
  131.     turtle.digDown()
  132.     turtle.select(1)
  133.  
  134.     while not turtle.down() do
  135.         sleep(0.1)
  136.     end
  137. end
  138.  
  139. local function forceDig()
  140.     turtle.select(1)
  141.     if turtle.dig() then
  142.         return true
  143.     else
  144.         return false
  145.     end
  146. end
  147.  
  148. local function tryDig()
  149.     if not hasSlots() then
  150.         return false
  151.     end
  152.     turtle.select(1)
  153.     if turtle.dig() then
  154.         return true
  155.     else
  156.         return false
  157.     end
  158. end
  159.  
  160. local function tryDigDown()
  161.     if not hasSlots() then
  162.         unload()
  163.     end
  164.     if not hasSlots() then
  165.         return false
  166.     end
  167.     turtle.select(1)
  168.     if turtle.digDown() then
  169.         return true
  170.     else
  171.         return false
  172.     end
  173. end
  174.  
  175. local function tryDown()
  176.     if depth>=maxDepth then
  177.         return false
  178.     end
  179.     if not turtle.down() then
  180.         if not tryDigDown() then
  181.             return false
  182.         end
  183.         if not turtle.down() then
  184.             return false
  185.         end
  186.     end
  187.     depth = depth + 1
  188.     return true
  189. end
  190.  
  191. local function tryUp()
  192.     if not turtle.up() then
  193.         if not turtle.digUp() then
  194.             return false
  195.         end
  196.         if not turtle.up() then
  197.             return false
  198.         end
  199.     end
  200.     depth = depth - 1
  201.     return true
  202. end
  203.  
  204. local function makeMine()
  205.     if checkFuel(512)==false then
  206.         return false
  207.     end
  208.  
  209.     while tryDown() do
  210.     end
  211.     while depth>0 do
  212.         tryUp()
  213.     end
  214.     if hasSlots() then
  215.         return true
  216.     else
  217.         return false
  218.     end
  219. end
  220.  
  221. local function dropResources()
  222.     for i=1,16 do
  223.         if turtle.getItemCount(i)>0 then
  224.             turtle.select(i)
  225.             turtle.drop()
  226.             sleep(0.5)
  227.         end
  228.     end
  229. end
  230.  
  231. local function turnLeft()
  232.     turtle.turnLeft()
  233.     xDir, zDir = -zDir, xDir
  234. end
  235.  
  236. local function turnRight()
  237.     turtle.turnRight()
  238.     xDir, zDir = zDir, -xDir
  239. end
  240.  
  241. local function tryForward()
  242.     tries = 0
  243.     while not turtle.forward() do
  244.         forceDig()
  245.         tries = tries + 1
  246.         if tries > 20 then
  247.             return false
  248.         end
  249.         sleep(0.8)
  250.     end
  251.     xPos = xPos + xDir
  252.     zPos = zPos + zDir
  253.     return true
  254. end
  255.  
  256. local function forceForward()
  257.     while not turtle.forward() do
  258.         forceDig()
  259.         sleep(0.8)
  260.     end
  261.     xPos = xPos + xDir
  262.     zPos = zPos + zDir
  263.     return true
  264. end
  265.  
  266. local function gotoDir(xd, zd)
  267.     while (xDir ~= xd) or (zDir ~= zd) do
  268.         turnLeft()
  269.     end
  270. end
  271.  
  272. local function goto(x, z, xd0, zd0)
  273.     local xd = 0
  274.     if (xPos-x) < 0 then
  275.         xd = 1
  276.     else
  277.         xd = -1
  278.     end
  279.  
  280.     local zd = 0
  281.     if (zPos-z) < 0 then
  282.         zd = 1
  283.     else
  284.         zd = -1
  285.     end
  286.  
  287.     gotoDir(xd, 0)
  288.     while xPos ~= x do
  289.         forceForward()
  290.     end
  291.  
  292.     gotoDir(0, zd)
  293.     while zPos ~= z do
  294.         forceForward()
  295.     end
  296.  
  297.     gotoDir(xd0, zd0)
  298. end
  299.  
  300. local function goNext()
  301.     local z = zPos + zDir
  302.     if (z>=0) and (z<size) then
  303.         return tryForward()
  304.     end
  305.     if (xPos+1) >= size then
  306.         return false
  307.     end
  308.     local zd = zDir
  309.     if zd==1 then
  310.         turnRight()
  311.     else
  312.         turnLeft()
  313.     end
  314.     if not tryForward() then
  315.         return false
  316.     end
  317.     if zd==1 then
  318.         turnRight()
  319.     else
  320.         turnLeft()
  321.     end
  322.     return true
  323. end
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330. local tArgs = { ... }
  331.  
  332. if tArgs[1]=="restore" then
  333.     restore = true
  334.     print("restoring state...")
  335.     restoreState()
  336. elseif tArgs[1]=="autorun" then
  337.     local s = "while turtle.up() do\nend\nturtle.down()\n"
  338.     local f = fs.open("/startup", "w")
  339.     f.write(s)
  340.     f.close()
  341.     return
  342. else
  343.     if #tArgs < 1 then
  344.         usage()
  345.         return
  346.     end
  347.     size = tonumber( tArgs[1] )
  348.     if #tArgs > 1 then
  349.         maxDepth = tonumber( tArgs[2] )
  350.     end
  351. end
  352.  
  353. if size < 1 then
  354.     print( "Excavate diameter must be positive" )
  355.     return
  356. end
  357.  
  358.  
  359. -- find ender chest
  360. local item = turtle.getItemDetail(16)
  361. if item == nil or item.name ~= ender_chest then
  362.     print("Put ender chest to slot 16!")
  363.     return
  364. end
  365.  
  366.  
  367. if restore then
  368.     local x,z,xd,zd = xPos,zPos,xDir,zDir
  369.     xPos,zPos,xDir,zDir = 0,-1,0,1
  370.     depth = 0
  371.     goto(x,z,xd,zd)
  372. else
  373.     goto(0, 0, 0, 1)
  374. end
  375.  
  376. while true do
  377.     saveState()
  378.     while not makeMine() do
  379.         break
  380.     end
  381.     if not goNext() then
  382.         break
  383.     end
  384. end
  385.  
  386. goto(0, -1, 0, 1)
  387. unload()
  388.  
  389. if nofuel then
  390.     print("No enough fuel")
  391.     return
  392. end
  393.  
  394. deleteState()
  395.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement