Guest User

Untitled

a guest
Aug 17th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.33 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.  
  10. local restore = false
  11. local size = 0
  12. local shitSize = 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> <shit_count> [max_depth]" )
  19. print( "Pattern: ")
  20. print( "###" )
  21. print( "###" )
  22. print( "###" )
  23. print( "^ <-turtle" )
  24. print( " " )
  25. print( "@ <-transposer" )
  26. end
  27.  
  28. local function restoreState()
  29. if not fs.exists(stateFileName) then
  30. print("Can't find state file")
  31. return false
  32. end
  33.  
  34. local f = fs.open(stateFileName, "r")
  35. local state = f.readAll()
  36. f.close()
  37.  
  38. local result = textutils.unserialize( state )
  39. if type(result) == "table" and #result == 7 then
  40. size = result[1]
  41. shitSize = result[2]
  42. xPos, zPos = result[3], result[4]
  43. xDir, xDir = result[5], result[6]
  44. maxDepth = result[7]
  45. return true
  46. else
  47. print("Incorrect format")
  48. return false
  49. end
  50. end
  51.  
  52. local function saveState()
  53. local f = fs.open(stateFileName, "w")
  54. local state = textutils.serialize({size, shitSize, xPos, zPos, xDir, zDir, maxDepth})
  55. f.write(state)
  56. f.close()
  57. end
  58.  
  59. local function deleteState()
  60. fs.delete(stateFileName)
  61. end
  62.  
  63. local function hasSlots()
  64. if turtle.getItemCount(9)==0 then
  65. return true
  66. else
  67. return false
  68. end
  69. end
  70.  
  71. local function cleanSlots()
  72. for i=1,shitSize do
  73. local n = turtle.getItemCount(i)
  74. if n>1 then
  75. turtle.select(i)
  76. turtle.drop(n-1)
  77. end
  78. end
  79. end
  80.  
  81. local function forceDig()
  82. turtle.select(1)
  83. if turtle.dig() then
  84. cleanSlots()
  85. return true
  86. else
  87. return false
  88. end
  89. end
  90.  
  91. local function tryDig()
  92. if not hasSlots() then
  93. return false
  94. end
  95. turtle.select(1)
  96. if turtle.dig() then
  97. cleanSlots()
  98. return true
  99. else
  100. return false
  101. end
  102. end
  103.  
  104. local function tryDigDown()
  105. if not hasSlots() then
  106. return false
  107. end
  108. turtle.select(1)
  109. if turtle.digDown() then
  110. cleanSlots()
  111. return true
  112. else
  113. return false
  114. end
  115. end
  116.  
  117. local function tryDown()
  118. if depth>=maxDepth then
  119. return false
  120. end
  121. if not turtle.down() then
  122. if not tryDigDown() then
  123. return false
  124. end
  125. if not turtle.down() then
  126. return false
  127. end
  128. end
  129. depth = depth + 1
  130. return true
  131. end
  132.  
  133. local function tryUp()
  134. if not turtle.up() then
  135. if not turtle.digUp() then
  136. return false
  137. end
  138. if not turtle.up() then
  139. return false
  140. end
  141. end
  142. depth = depth - 1
  143. return true
  144. end
  145.  
  146. local function makeMine()
  147. while tryDown() do
  148. end
  149. while depth>0 do
  150. tryUp()
  151. end
  152. if hasSlots() then
  153. return true
  154. else
  155. return false
  156. end
  157. end
  158.  
  159. local function dropResources()
  160. local k = shitSize+1
  161. for i=k,9 do
  162. if turtle.getItemCount(i)>0 then
  163. turtle.select(i)
  164. turtle.drop()
  165. sleep(0.5)
  166. end
  167. end
  168. end
  169.  
  170. local function turnLeft()
  171. turtle.turnLeft()
  172. xDir, zDir = -zDir, xDir
  173. end
  174.  
  175. local function turnRight()
  176. turtle.turnRight()
  177. xDir, zDir = zDir, -xDir
  178. end
  179.  
  180. local function tryForward()
  181. if not turtle.forward() then
  182. if not tryDig() then
  183. return false
  184. end
  185. if not turtle.forward() then
  186. return false
  187. end
  188. end
  189. xPos = xPos + xDir
  190. zPos = zPos + zDir
  191. return true
  192. end
  193.  
  194. local function forceForward()
  195. while not turtle.forward() do
  196. forceDig()
  197. sleep(0.8)
  198. end
  199. xPos = xPos + xDir
  200. zPos = zPos + zDir
  201. return true
  202. end
  203.  
  204. local function goto(x, z, xd0, zd0)
  205. local xd = 0
  206. if (xPos-x) < 0 then
  207. xd = 1
  208. else
  209. xd = -1
  210. end
  211.  
  212. local zd = 0
  213. if (zPos-z) < 0 then
  214. zd = 1
  215. else
  216. zd = -1
  217. end
  218.  
  219. while xDir ~= xd do
  220. turnLeft()
  221. end
  222. while xPos ~= x do
  223. forceForward()
  224. end
  225.  
  226. while zDir ~= zd do
  227. turnLeft()
  228. end
  229. while zPos ~= z do
  230. forceForward()
  231. end
  232.  
  233. while xDir ~= xd0 do
  234. turnLeft()
  235. end
  236. while zDir ~= zd0 do
  237. turnLeft()
  238. end
  239. end
  240.  
  241. local function goNext()
  242. local z = zPos + zDir
  243. if (z>=0) and (z<size) then
  244. return tryForward()
  245. end
  246. if (xPos+1) >= size then
  247. return false
  248. end
  249. local zd = zDir
  250. if zd==1 then
  251. turnRight()
  252. else
  253. turnLeft()
  254. end
  255. if not tryForward() then
  256. return false
  257. end
  258. if zd==1 then
  259. turnRight()
  260. else
  261. turnLeft()
  262. end
  263. return true
  264. end
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271. local tArgs = { ... }
  272.  
  273. if tArgs[1]=="restore" then
  274. restore = true
  275. print("restoring state...")
  276. restoreState()
  277. elseif tArgs[1]=="autorun" then
  278. local s = "while turtle.up() do\nend\nturtle.down()\n"
  279. local f = fs.open("/startup", "w")
  280. f.write(s)
  281. f.close()
  282. return
  283. else
  284. if #tArgs < 2 then
  285. usage()
  286. return
  287. end
  288. size = tonumber( tArgs[1] )
  289. shitSize = tonumber( tArgs[2] )
  290. if #tArgs > 2 then
  291. maxDepth = tonumber( tArgs[3] )
  292. end
  293. end
  294.  
  295. if size < 1 then
  296. print( "Excavate diameter must be positive" )
  297. return
  298. end
  299.  
  300. if (shitSize<1) or (shitSize>8) then
  301. print( "Shit size must be in interval [1;8]" )
  302. return
  303. end
  304.  
  305. for i=1,shitSize do
  306. if turtle.getItemCount(i)==0 then
  307. print("Fill shit slots!")
  308. return
  309. end
  310. end
  311.  
  312.  
  313. if restore then
  314. local x,z,xd,zd = xPos,zPos,xDir,zDir
  315. xPos,zPos,xDir,zDir = 0,-1,0,1
  316. depth = 0
  317. goto(x,z,xd,zd)
  318. else
  319. goto(0, 0, 0, 1)
  320. end
  321.  
  322. while true do
  323. saveState()
  324. while not makeMine() do
  325. local x,z,xd,zd = xPos,zPos,xDir,zDir
  326. goto(0, -1, 0, -1)
  327. dropResources()
  328. goto(x,z,xd,zd)
  329. saveState()
  330. end
  331. if not goNext() then
  332. break
  333. end
  334. end
  335.  
  336. goto(0, -1, 0, -1)
  337. dropResources()
  338. turnLeft()
  339. turnLeft()
  340.  
  341. deleteState()
Add Comment
Please, Sign In to add comment