Advertisement
HarvDad

dome

Jul 18th, 2014
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.54 KB | None | 0 0
  1. ---- Builds a dome or portion thereof
  2. -- Turtle returns to its starting point when mission is completed or fuel runs low
  3. -- Written by HarvDad, June 2014
  4.  
  5. args = {...}
  6. nArgs = #args
  7. version = "dome: Rev 3.0"
  8. usage = "Usage: dome [start level] [stack count]"
  9.  
  10. levels = {
  11. level1,
  12. level2,
  13. level3,
  14. level4,
  15. level5,
  16. level6,
  17. level7,
  18. level8,
  19. level9,
  20. level10,
  21. level11,
  22. level12,
  23. level13,
  24. level14,
  25. level15,
  26. level16,
  27. level17,
  28. }
  29.  
  30. level17 = "F4 L1 l1 F2 R1 R2 L1 L2 r1 r3"
  31. level16 = "F2 l1 L2 R1 R3 l1 L3 R1 r1 F4 L1 L3 R1 r1 F3"
  32. level15 = "F1 L1 L1 R1 R1 L1 L1 R1 r1 F2 l1 L2 R1 r1 F2 L1 L1 R1 r2 R1 L1 L1 R1 R1 L1 L1 r0"
  33. level14 = "F1 L1 L1 R1 r1 L2 R1 L2 R1 L1 R1 L1 R2 L1 R3 L1 R1"
  34. level13 = "L2 R1 L3 R1 L2 r1 L1 R2 l1 R1 L1 R3 L1 R2"
  35. level12 = "L3 r1 L3 r1 L1 R1 L2 r1 F1 L1 R2 l1 R3 l1 R2"
  36. level11 = "L2 r1 L4 r1 L2 r1 L1 r1 L1 r1 L1 r1 F2 l1 R4 l1 R1"
  37. level10 = "L5 r1 L2 r1 L2 r1 L1 r1 L1 r1 F2 l1 R2 l1 R4"
  38. level9 = "L4 r1 L3 r1 L2 r1 L1 r1 L1 r1 L1 r1 F2 l1 R3 l1 R3"
  39. level8 = "L6 r1 L2 r1 L1 r1 L2 r1 F2 l1 R1 l1 R2 l1 R5"
  40. level7 = "L4 r1 L3 r1 L2 r1 L1 r1 L1 r1 L1 r1 L1 r1 F2 l1 R3 l1 R3"
  41. level6 = "L5 r1 L3 r1 L1 r1 L2 r1 L1 r1 F2 l1 F1 r1 F3 l1 R4"
  42. level5 = "F1 l1 F5 r1 L2 r1 L2 r1 L1 r1 L1 r1 L1 r1 F2 l1 R2 l1 R5 l1 r0"
  43. level4 = "L3 r1 L4 r1 L2 r1 L1 r1 L1 r1 L1 r1 L1 r1 L1 r1 F2 l1 R4 l1 R2"
  44. level3 = "L4 r1 L3 r1 L2 r1 L1 r1 L2 r1 F2 l1 R1 l1 R2 l1 R3 l1 R3"
  45. level2 = "L4 r1 L3 r1 L2 r1 L2 r1 L1 r1 L1 r1 F2 l1 R2 l1 R3 l1 R3"
  46. level1 = "L5 r1 L2 r1 L2 r1 L2 r1 L1 r1 L1 r1 F2 l1 R2 l1 R2 l1 R4"
  47.  
  48. forwards = {0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 2, 2, 2, 0}
  49.  
  50. materialSlot = 1
  51. startLevel = 0
  52. stackCount = 0
  53.  
  54. buildDome = false
  55. buildStacks = false
  56.  
  57. x = 0
  58. y = 0
  59. z = 0
  60. face = 0
  61. north = 0
  62. west = 1
  63. south = 2
  64. east = 3
  65.  
  66. saveX = 0
  67. saveY = 0
  68. saveZ = 0
  69. saveFace = 0
  70.  
  71. abort = false
  72.  
  73. function savePosition()
  74. saveX = x
  75. saveY = y
  76. saveZ = z
  77. saveFace = face
  78. print("Saved xyz as ", saveX, ", ", saveY, ", ", saveZ, ", face: ", saveFace)
  79. end
  80.  
  81. function restorePosition()
  82. x = saveX
  83. y = saveY
  84. z = saveZ
  85. face = saveFace
  86. print("Restored xyz as ", x, ", ", y, ", ", z, ", face: ", face)
  87. end
  88.  
  89. -- Split text into a list consisting of the strings in text,
  90. -- separated by strings matching delimiter (which may be a pattern).
  91. -- example: strsplit(",%s*", "Anna, Bob, Charlie,Dolores")
  92.  
  93. function strsplit(delimiter, text)
  94. local list = {}
  95. local pos = 1
  96. local index = 1
  97.  
  98. if string.find("", delimiter, 1) then -- this would result in endless loops
  99. error("delimiter matches empty string!")
  100. end
  101. while 1 do
  102. local first, last = string.find(text, delimiter, pos)
  103. if first then -- found?
  104. list[index] = string.sub(text, pos, first-1)
  105. pos = last+1
  106. index = index+1
  107. else
  108. list[index] = string.sub(text, pos)
  109. index = index+1
  110. break
  111. end
  112. end
  113. return list
  114. end
  115.  
  116. function isUpper(char)
  117. return string.match(char, "%u")
  118. end
  119.  
  120. function ensureMaterial()
  121. if turtle.getItemCount(materialSlot) < 3 then
  122. organizeMaterial()
  123. end
  124. if turtle.getItemCount(materialSlot) < 3 then
  125. print("No more material")
  126. reload()
  127. print("Reloaded")
  128. end
  129. end
  130.  
  131. function reload()
  132. home()
  133. load(1,16)
  134. turtle.select(materialSlot)
  135. moveTo(saveX, saveY, saveZ)
  136. setFace(saveFace)
  137. end
  138.  
  139. function load(startSlot, endSlot)
  140. print("Attempting to reload at ", x, ", ", y, ", ", z)
  141. for slot=startSlot, endSlot do
  142. turtle.select(slot)
  143. turtle.suckDown()
  144. end
  145. end
  146.  
  147. function left()
  148. if face == 0 then face = 1 turtle.turnLeft() return end
  149. if face == 1 then face = 2 turtle.turnLeft() return end
  150. if face == 2 then face = 3 turtle.turnLeft() return end
  151. if face == 3 then face = 0 turtle.turnLeft() return end
  152. print("function left\(\): Bad face value: ", face)
  153. end
  154.  
  155. function right()
  156. if face == 0 then face = 3 turtle.turnRight() return end
  157. if face == 1 then face = 0 turtle.turnRight() return end
  158. if face == 2 then face = 1 turtle.turnRight() return end
  159. if face == 3 then face = 2 turtle.turnRight() return end
  160. print("function right\(\): Bad face value: ", face)
  161. end
  162.  
  163. function up()
  164. turtle.up()
  165. y = y+1
  166. end
  167.  
  168. function down()
  169. if turtle.detectDown() then
  170. turtle.digDown()
  171. end
  172. turtle.down()
  173. y = y-1
  174. end
  175.  
  176. function forward()
  177. while turtle.detect() do -- This loop added in case of falling sand or whatever
  178. -- turtle.dig()
  179. return
  180. end
  181. for i=1,10 do -- This loop trys to handle pests (mob) that might be in the way
  182. if turtle.forward() then
  183. break
  184. end
  185. turtle.attack()
  186. sleep(2)
  187. end
  188.  
  189. if face == 0 then z = z+1 return end
  190. if face == 1 then x = x-1 return end
  191. if face == 2 then z = z-1 return end
  192. if face == 3 then x = x+1 return end
  193. end
  194.  
  195. function setFace(f)
  196. if f == 0 then
  197. if face == 0 then return end
  198. if face == 1 then right() return end
  199. if face == 2 then right() right() return end
  200. if face == 3 then left() return end
  201. end
  202.  
  203. if f == 1 then
  204. if face == 0 then left() return end
  205. if face == 1 then return end
  206. if face == 2 then right() return end
  207. if face == 3 then right() right() return end
  208. end
  209.  
  210. if f == 2 then
  211. if face == 0 then left() left() return end
  212. if face == 1 then left() return end
  213. if face == 2 then return end
  214. if face == 3 then right() return end
  215. end
  216.  
  217. if f == 3 then
  218. if face == 0 then right() return end
  219. if face == 1 then left() left() return end
  220. if face == 2 then left() return end
  221. if face == 3 then return end
  222. end
  223. end
  224.  
  225. function organizeMaterial()
  226. local i
  227. materialCount = turtle.getItemCount(materialSlot)
  228.  
  229. if materialCount < 3 then
  230. -- print("Attempting to refill slot ", materialSlot)
  231. for i=2,16 do
  232. turtle.select(i)
  233. if turtle.compareTo(materialSlot) then
  234. turtle.transferTo(materialSlot)
  235. end
  236. end
  237. end
  238. turtle.select(materialSlot)
  239. end
  240.  
  241. local function placeAndMove(direction, nBlocks)
  242. if direction == "L" then
  243. left()
  244. elseif direction == "R" then
  245. right()
  246. elseif direction == "F" then
  247. end
  248. for i=1,nBlocks do
  249. ensureMaterial()
  250. turtle.select(materialSlot)
  251. turtle.placeDown()
  252. forward()
  253. end
  254. end
  255.  
  256. local function move(direction, nBlocks)
  257. -- print(" move ", direction, " ", nBlocks, " blocks")
  258. if direction == "l" then
  259. left()
  260. -- turtle.turnLeft()
  261. elseif direction == "r" then
  262. right()
  263. -- turtle.turnRight()
  264. elseif direction == "f" then
  265. end
  266. for i=1,nBlocks do
  267. forward()
  268. -- turtle.forward()
  269. end
  270. end
  271.  
  272. function moveTo(X, Y, Z)
  273. print("moveTo(", X, ", ", Y, ", ", Z, ") y: ", y)
  274. if y == nil then print("y is nil") end
  275. if Y == nil then print("Y is nil") end
  276.  
  277. if y ~= Y then
  278. if y < Y then
  279. while y < Y do
  280. up()
  281. end
  282. else
  283. while y > Y do
  284. down()
  285. end
  286. end
  287. end
  288.  
  289. if x ~= X then
  290. if x < X then
  291. setFace(east)
  292. while x < X do
  293. forward()
  294. end
  295. else
  296. setFace(west)
  297. while x > X do
  298. forward()
  299. end
  300. end
  301. end
  302.  
  303. if z ~= Z then
  304. if z < Z then
  305. setFace(north)
  306. while z < Z do
  307. forward()
  308. end
  309. else
  310. setFace(south)
  311. while z > Z do
  312. go(1)
  313. end
  314. end
  315. end
  316. end
  317.  
  318. -- placeSection
  319. -- Place one quarter of structure defined by level string
  320.  
  321. function placeSection(string)
  322. segments = strsplit(" ", string)
  323.  
  324. for i=1,#segments do
  325. local direction = string.sub(segments[i], 1, 1)
  326. local distance = string.sub(segments[i], 2)
  327. -- print(segments[i])
  328. if isUpper(direction) then
  329. placeAndMove(direction, distance)
  330. else
  331. move(direction, distance)
  332. end
  333. if abort then
  334. return
  335. end
  336. end
  337. end
  338.  
  339. function placeLevel(level)
  340. placeSection(level)
  341. right()
  342. -- turtle.turnRight()
  343. placeSection(level)
  344. right()
  345. -- turtle.turnRight()
  346. placeSection(level)
  347. right()
  348. -- turtle.turnRight()
  349. placeSection(level)
  350. right()
  351. -- turtle.turnRight()
  352. end
  353.  
  354. function home()
  355. savePosition()
  356.  
  357. if x > 0 then
  358. setFace(west)
  359. while x > 0 do
  360. forward()
  361. end
  362. elseif x < 0 then
  363. setFace(east)
  364. while x < 0 do
  365. forward()
  366. end
  367. end
  368. if z > 0 then
  369. setFace(south)
  370. while z > 0 do
  371. forward()
  372. end
  373. elseif z < 0 then
  374. setFace(north)
  375. while z < 0 do
  376. forward()
  377. end
  378. end
  379. if y > 0 then
  380. while y > 0 do
  381. down()
  382. end
  383. elseif y < 0 then
  384. while y < 0 do
  385. up()
  386. end
  387. end
  388. print("Reached home at ", x, ", ", y, ", ", z)
  389. end
  390.  
  391. function getArgs()
  392. if (nArgs == 1 and args[1]== "help") then
  393. print(version)
  394. print("Build a dome or portion thereof")
  395. print("Turtle should be pre-fueled")
  396. print("Material starting in slot ", materialSlot)
  397. print(usage)
  398. abort = true
  399. return
  400. end
  401.  
  402. if nArgs > 2 then
  403. print(usage)
  404. abort = true
  405. return
  406. end
  407.  
  408. if nArgs == 0 then
  409. buildDome = true
  410. startLevel = 1
  411. stackCount = 1
  412. elseif nArgs >= 1 then
  413. startLevel = tonumber(args[1])
  414. if startLevel == nil then
  415. print("\"", args[1], "\" is not a valid start level")
  416. abort = true
  417. return
  418. end
  419. if startLevel > 17 then
  420. print("Start level must be an integer from 1 to 17");
  421. abort = true
  422. end
  423. if nArgs == 1 then
  424. buildDome = true
  425. end
  426. end
  427. if nArgs == 2 then
  428. stackCount = tonumber(args[2])
  429. if stackCount == nil then
  430. print("\"", args[2], "\" is not a valid stack count")
  431. abort = true
  432. return
  433. end
  434. if stackCount < 1 then
  435. print("stack count must be a positive number greater than zero")
  436. abort = true
  437. end
  438. buildStacks = true
  439. end
  440. end
  441.  
  442. function domeBuild()
  443. up()
  444. forward()
  445. for i = startLevel,17 do
  446. placeLevel(levels[i])
  447. up()
  448. f = forwards[i]
  449. for j = 1,f do
  450. forward()
  451. end
  452. end
  453. end
  454.  
  455. function stacksBuild()
  456. up()
  457. forward()
  458. for i = 1,stackCount do
  459. placeLevel(levels[startLevel])
  460. if i < stackCount then
  461. up()
  462. end
  463. end
  464. end
  465.  
  466. getArgs()
  467. if abort then
  468. return
  469. end
  470.  
  471. if buildDome then
  472. print("Build dome starting at level ", startLevel)
  473. domeBuild()
  474. home()
  475. elseif buildStacks then
  476. print("Build ", stackCount, " high wall of level ", startLevel)
  477. stacksBuild()
  478. home()
  479. end
  480. if true then
  481. return
  482. end
  483.  
  484.  
  485. up()
  486. forward()
  487.  
  488. if startLevel == 1 then
  489. elseif startLevel == 2 then
  490. end
  491.  
  492.  
  493.  
  494. placeLevel(level1)
  495. up()
  496. placeLevel(level2)
  497. up()
  498. placeLevel(level3)
  499. up()
  500. placeLevel(level4)
  501. up()
  502. placeLevel(level5)
  503. up()
  504. forward()
  505. placeLevel(level6)
  506. up()
  507. placeLevel(level7)
  508. up()
  509. forward()
  510. placeLevel(level8)
  511. up()
  512. placeLevel(level9)
  513. up()
  514. forward()
  515. placeLevel(level10)
  516. up()
  517. placeLevel(level11)
  518. up()
  519. forward()
  520. placeLevel(level12)
  521. up()
  522. forward()
  523. placeLevel(level13)
  524. up()
  525. forward()
  526. placeLevel(level14)
  527. up()
  528. forward()
  529. forward()
  530. placeLevel(level15)
  531. up()
  532. forward()
  533. forward()
  534. placeLevel(level16)
  535. up()
  536. forward()
  537. forward()
  538. placeLevel(level17)
  539.  
  540. home()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement