Advertisement
HarvDad

clear

Mar 14th, 2014
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.45 KB | None | 0 0
  1. -- clear
  2. -- Mines a clear space to the dimensions supplied by the user
  3. -- Turtle returns to its starting point when mission is completed or fuel runs low
  4. -- Written by HarvDad, March 2014 Last update: May 22, 2014
  5.  
  6. args = {...}
  7. nArgs = #args
  8.  
  9. print("clear: Rev 6.0")
  10. x = 0
  11. y = 0
  12. z = 0
  13. gX = x
  14. gZ = z
  15. face = 0
  16. minimumFuel = 100
  17. missionMessage = "Mission complete."
  18. abort = false
  19. local currentFuelLevel = turtle.getFuelLevel()
  20. lowestLevel = 0
  21. highestLevel = 0
  22.  
  23. if nArgs == 0 or (nArgs == 1 and args[1]== "help") then
  24. print("Clear an area specified by the given length, width, and height")
  25. print("Usage: clear <length><width><height>")
  26. return
  27. end
  28.  
  29. if nArgs ~= 3 then
  30. print("Usage: clear <length><width><height>")
  31. return
  32. end
  33.  
  34. length = tonumber(args[1])
  35. if length == nil then
  36. print("\"", args[1], "\" is not a valid length")
  37. return
  38. end
  39. if length < 1 then
  40. print("length must be a positive number greater than zero")
  41. end
  42.  
  43. width = tonumber(args[2])
  44. if width == nil then
  45. print("\"", args[2], "\" is not a valid width")
  46. return
  47. end
  48. if width < 1 then
  49. print("width must be a positive number greater than zero")
  50. end
  51.  
  52. height = tonumber(args[3])
  53. if height == nil then
  54. print("\"", args[3], "\" is not a valid height")
  55. return
  56. end
  57. --[[
  58. if height < 1 then
  59. print("height must be a positive number greater than zero")
  60. end
  61. --]]
  62.  
  63. if height > 0 then
  64. highestLevel = height - 1
  65. lowestLevel = 0
  66. elseif height < 0 then
  67. highestLevel = 0
  68. lowestLevel = 0 + height
  69. else
  70. highestLevel = 0
  71. lowestLevel = 0
  72. end
  73.  
  74. print("highestLevel = ", highestLevel, ", lowestLevel = ", lowestLevel)
  75.  
  76. targetArea = length * width
  77. areaCovered = 1;
  78.  
  79. function chomp()
  80. -- if y < highestLevel and turtle.detectUp() then
  81. if y < top then
  82. turtle.digUp()
  83. end
  84. -- if turtle.detect() then
  85. -- turtle.dig()
  86. -- end
  87.  
  88. -- if y > 0 then
  89. if y > bottom then
  90. if turtle.detectDown() then
  91. turtle.digDown()
  92. end
  93. elseif y < 0 then
  94. if turtle.detectUp() then
  95. turtle.digUp()
  96. end
  97. end
  98.  
  99. areaCovered = areaCovered+1
  100. end
  101.  
  102. direction = "left"
  103.  
  104. local clock = os.clock
  105. function sleep(n) -- seconds
  106. local t0 = clock()
  107. while clock() - t0 <= n do end
  108. end
  109.  
  110. function left()
  111. if face == 0 then face = 1 turtle.turnLeft() return end
  112. if face == 1 then face = 2 turtle.turnLeft() return end
  113. if face == 2 then face = 3 turtle.turnLeft() return end
  114. if face == 3 then face = 0 turtle.turnLeft() return end
  115. print("function left\(\): Bad face value: ", face)
  116. end
  117.  
  118. function right()
  119. if face == 0 then face = 3 turtle.turnRight() return end
  120. if face == 1 then face = 0 turtle.turnRight() return end
  121. if face == 2 then face = 1 turtle.turnRight() return end
  122. if face == 3 then face = 2 turtle.turnRight() return end
  123. print("function right\(\): Bad face value: ", face)
  124. end
  125.  
  126. function up()
  127. while turtle.detectUp() do -- This loop added in case of falling sand or whatever
  128. turtle.digUp()
  129. end
  130. turtle.up()
  131. y = y+1
  132. end
  133.  
  134. function rise(nBlocks)
  135. local i
  136. for i=1,nBlocks do
  137. up()
  138. end
  139. end
  140.  
  141. function down()
  142. if turtle.detectDown() then
  143. turtle.digDown()
  144. end
  145. turtle.down()
  146. y = y-1
  147. end
  148.  
  149. function turn()
  150. if direction == "left" then
  151. left()
  152. else
  153. right()
  154. end
  155. if areaCovered < targetArea then
  156. forward()
  157. end
  158. -- chomp()
  159. if direction == "left" then
  160. left()
  161. direction = "right"
  162. else
  163. right()
  164. direction = "left"
  165. end
  166. end
  167.  
  168. function forward()
  169. while turtle.detect() do -- This loop added in case of falling sand or whatever
  170. turtle.dig()
  171. -- chomp()
  172. end
  173. for i=1,10 do
  174. if turtle.forward() then
  175. chomp()
  176. break
  177. end
  178. turtle.attack()
  179. sleep(2)
  180. end
  181. if face == 0 then z = z+1 return end
  182. if face == 1 then x = x-1 return end
  183. if face == 2 then z = z-1 return end
  184. if face == 3 then x = x+1 return end
  185. end
  186.  
  187. function setFace(f)
  188. if f == 0 then
  189. if face == 0 then return end
  190. if face == 1 then right() return end
  191. if face == 2 then right() right() return end
  192. if face == 3 then left() return end
  193. end
  194.  
  195. if f == 1 then
  196. if face == 0 then left() return end
  197. if face == 1 then return end
  198. if face == 2 then right() return end
  199. if face == 3 then right() right() return end
  200. end
  201.  
  202. if f == 2 then
  203. if face == 0 then left() left() return end
  204. if face == 1 then left() return end
  205. if face == 2 then return end
  206. if face == 3 then right() return end
  207. end
  208.  
  209. if f == 3 then
  210. if face == 0 then right() return end
  211. if face == 1 then left() left() return end
  212. if face == 2 then left() return end
  213. if face == 3 then return end
  214. end
  215. end
  216.  
  217. function home(targetY)
  218. -- print("home:face ", face, ", x = ", x, ", z = ", z)
  219. if x < 0 then
  220. setFace(3)
  221. while x < 0 do
  222. forward()
  223. end
  224. else
  225. if x > 0 then
  226. setFace(1)
  227. while x > 0 do
  228. forward()
  229. end
  230. end
  231. end
  232.  
  233. if z < 0 then
  234. setFace(0)
  235. while z < 0 do
  236. forward()
  237. end
  238. else
  239. if z > 0 then
  240. setFace(2)
  241. while z > 0 do
  242. forward()
  243. end
  244. end
  245. end
  246. setFace(0)
  247.  
  248. -- print("home: y = ", y, ", targetY = ", targetY)
  249.  
  250. if (targetY == 0) then
  251. if y > 0 then
  252. while y > 0 do
  253. down()
  254. end
  255. elseif y < 0 then
  256. while y < 0 do
  257. up()
  258. end
  259. end
  260. end
  261. end
  262.  
  263. function xzHome()
  264. local X = gX
  265. local Z = gZ
  266.  
  267. if x ~= X then
  268. if x < X then
  269. setFace(east)
  270. while x < X do
  271. forward()
  272. end
  273. else
  274. setFace(west)
  275. while x > X do
  276. forward()
  277. end
  278. end
  279. end
  280.  
  281. if z ~= Z then
  282. if z < Z then
  283. setFace(north)
  284. while z < Z do
  285. forward()
  286. end
  287. else
  288. setFace(south)
  289. while z > Z do
  290. forward()
  291. end
  292. end
  293. end
  294. end
  295.  
  296. function strip(nBlocks)
  297. local i
  298. print("strip ", nBlocks)
  299. for i=1,nBlocks do
  300. checkFuel()
  301. if abort then
  302. areaCovered = targetArea
  303. end
  304.  
  305. -- print("strip: Cleared ", areaCovered, " out of ", targetArea, " blocks")
  306. if areaCovered <= targetArea then
  307. forward()
  308. end
  309. end
  310. end
  311.  
  312.  
  313. function checkFuel()
  314. if currentFuelLevel == "unlimited" then
  315. return true
  316. end
  317.  
  318. if currentFuelLevel < minimumFuel then
  319. if not turtle.refuel() then
  320. areaCovered = targetArea
  321. missionMessage = "Mission aborted due to low fuel."
  322. abort = true
  323. return false
  324. end
  325. end
  326. return true
  327. end
  328.  
  329. function goToLevel(level)
  330. if y < level then
  331. while y < level do
  332. up()
  333. end
  334. elseif y > level then
  335. while y > level do
  336. down()
  337. end
  338. end
  339. end
  340.  
  341. function nextLevel()
  342. if y > 3 then
  343. return y - 3
  344. else
  345. return 0
  346. end
  347. end
  348.  
  349. function goToNextLevel()
  350. if height > 0 then
  351. if y > 3 then
  352. goToLevel(y - 3)
  353. else
  354. goToLevel(bottom)
  355. end
  356. elseif height < 0 then
  357. if y >= bottom + 3 then
  358. goToLevel(y - 3)
  359. else
  360. goToLevel(bottom)
  361. end
  362. end
  363. end
  364.  
  365. -- MAIN PROGRAM
  366.  
  367. currentLevel = y
  368.  
  369. turtle.select(1)
  370.  
  371. print("fuelLevel = ", currentFuelLevel)
  372. print("length = ", length)
  373. print("width = ", width)
  374. print("height = ", height)
  375. print("face = ", face)
  376.  
  377. print("Current Fuel Level: ", currentFuelLevel)
  378.  
  379. if currentFuelLevel ~= "unlimited" then
  380. if currentFuelLevel < minimumFuel then
  381. if not turtle.refuel() then
  382. print("No fuel")
  383. return
  384. end
  385. end
  386. end
  387.  
  388.  
  389.  
  390.  
  391. if height > 0 then
  392. top = height - 1
  393. bottom = 0
  394.  
  395. if height > 2 then
  396. topLevel = height - 2
  397. else
  398. topLevel = 0
  399. end
  400.  
  401. if height % 3 == 0 then
  402. lowestLevel = 1
  403. else
  404. lowestLevel = 0
  405. end
  406. elseif height < 0 then
  407. top = 0
  408. bottom = height + 1
  409.  
  410. if height < -2 then
  411. topLevel = -2
  412. else
  413. topLevel = 0
  414. end
  415.  
  416. if height % 3 == 0 then
  417. lowestLevel = -1
  418. else
  419. lowestLevel = height + 1
  420. end
  421. end
  422.  
  423.  
  424. print("top = ", top, ", bottom = ", bottom)
  425. print("topLevel = ", topLevel, ", lowestLevel = ", lowestLevel)
  426.  
  427. goToLevel(topLevel)
  428.  
  429. done = false
  430.  
  431. chomp()
  432. while not done do
  433. for w=1,width do
  434. if w == width then
  435. strip(length)
  436. else
  437. strip(length-1)
  438. end
  439. -- print("strip: Cleared ", areaCovered, " out of ", targetArea, " blocks")
  440. if areaCovered < targetArea then
  441. turn()
  442. end
  443. if abort then
  444. print("Aborting...")
  445. home(0)
  446. end
  447. end
  448. home(99)
  449. direction = "left"
  450. areaCovered = 1;
  451. print("y = ", y, ", lowestLevel = ", lowestLevel)
  452. if height > 0 then
  453. if y <= lowestLevel then
  454. done = true
  455. else
  456. goToNextLevel()
  457. end
  458. elseif height < 0 then
  459. if y == lowestLevel + 1 or y == lowestLevel then
  460. done = true
  461. print("That's it. It's over.")
  462. else
  463. goToNextLevel()
  464. end
  465. end
  466. end
  467.  
  468. print(missionMessage, " Current fuel level is ", turtle.getFuelLevel())
  469. home(0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement