jseely

wirelessTurtle

Nov 17th, 2012
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.21 KB | None | 0 0
  1. module(...)
  2.  
  3. local U = require "utils"
  4. local T = require "turtle"
  5.  
  6. rednet.open("right")
  7.  
  8. function goto(X, Y, Z)
  9. dirFacing = getDirFacing()
  10. cX, cY, cZ = gps.locate(10)
  11. upFirst = true
  12. if Y < cY then
  13. upFirst = false
  14. end
  15. dirsTried = 0
  16. while dirFacing == "?" do
  17. if upFirst and turtle.detectUp() then
  18. upFirst = false
  19. dirsTried = dirsTried + 1
  20. elseif not upFirst and turtle.detectDown() then
  21. upFirst = true
  22. dirsTried = dirsTried + 1
  23. end
  24. if dirsTried == 2 then
  25. return false
  26. end
  27. if upFirst then
  28. T.sUp()
  29. else
  30. T.sDown()
  31. end
  32. dirFacing = getDirFacing()
  33. end
  34.  
  35. stack = { "$" }
  36.  
  37. backtrack = false
  38. cX, cY, cZ = gps.locate(10)
  39. while not U.equal({cX, cY, cZ}, {X, Y, Z}) do
  40. optimal = findOptimal({cX, cY, cZ}, {X, Y, Z}, (backtrack and table.remove(stack, #stack) or nil), oposite(stack[#stack]))
  41. if backtrack and optimal == false then
  42. return false
  43. end
  44.  
  45. if optimal == oposite(stack[#stack]) then
  46.  
  47. end
  48. end
  49.  
  50. function findOptimal(s, d, prevDir, backtrackDir)
  51. dx = {}
  52. for i = 1, 3, 1 do
  53. dx[i] = d[i] - s[i]
  54. end
  55. order = {}
  56. if math.abs(dx[1]) >= math.abs(dx[2]) and math.abs(dx[1]) >= math.abs(dx[3]) then
  57. if math.abs(dx[3]) >= math.abs(dx[2]) then
  58. order[1] = ((dx[1] > 0) and "+x" or "-x")
  59. order[2] = ((dx[3] > 0) and "+z" or "-z")
  60. order[3] = ((dx[2] > 0) and "+y" or "-y")
  61. order[4] = oposite(order[3]) order[5] = oposite(order[2]) order[6] = oposite(order[1])
  62. else
  63. order[1] = ((dx[1] > 0) and "+x" or "-x")
  64. order[2] = ((dx[2] > 0) and "+y" or "-y")
  65. order[3] = ((dx[3] > 0) and "+z" or "-z")
  66. order[4] = oposite(order[3]) order[5] = oposite(order[2]) order[6] = oposite(order[1])
  67. end
  68. elseif math.abs(dx[3]) >= math.abs(dx[2]) and math.abs(dx[3]) > math.abs(dx[1]) then
  69. if math.abs(dx[1]) >= math.abs(dx[2]) then
  70. order[1] = ((dx[3] > 0) and "+z" or "-z")
  71. order[2] = ((dx[1] > 0) and "+x" or "-x")
  72. order[3] = ((dx[2] > 0) and "+y" or "-y")
  73. order[4] = oposite(order[3]) order[5] = oposite(order[2]) order[6] = oposite(order[1])
  74. else
  75. order[1] = ((dx[3] > 0) and "+z" or "-z")
  76. order[2] = ((dx[2] > 0) and "+y" or "-y")
  77. order[3] = ((dx[1] > 0) and "+x" or "-x")
  78. order[4] = oposite(order[3]) order[5] = oposite(order[2]) order[6] = oposite(order[1])
  79. end
  80. elseif math.abs(dx[2]) > math.abs(dx[1]) and math.abs(dx[2]) > math.abs(dx[3]) then
  81. if math.abs(dx[1]) >= math.abs(dx[3]) then
  82. order[1] = ((dx[2] > 0) and "+y" or "-y")
  83. order[2] = ((dx[1] > 0) and "+x" or "-x")
  84. order[3] = ((dx[3] > 0) and "+z" or "-z")
  85. order[4] = oposite(order[3]) order[5] = oposite(order[2]) order[6] = oposite(order[1])
  86. else
  87. order[1] = ((dx[2] > 0) and "+y" or "-y")
  88. order[2] = ((dx[3] > 0) and "+z" or "-z")
  89. order[3] = ((dx[1] > 0) and "+x" or "-x")
  90. order[4] = oposite(order[3]) order[5] = oposite(order[2]) order[6] = oposite(order[1])
  91. end
  92. end
  93.  
  94. if prevDir == nil && backtrackDir ~= order[1] then
  95. return order[1]
  96. end
  97. prevOrder = 1
  98. for i = 1, 6, 1 do
  99. if oreder[i] == prevDir then
  100. if i == 6 then
  101. return backtrackDir
  102. else
  103. if backtrackDir ~= order[i + 1] then
  104. return order[i + 1]
  105. else
  106. return ((i + 2 <= 6) and order[i + 2] or backtrackDir)
  107. end
  108. end
  109. end
  110. end
  111. return false
  112. end
  113.  
  114. function oposite(x)
  115. if ascii(x) == '-' then
  116. return '+'..ascii(x, 2)
  117. elseif ascii(x) == '+' then
  118. return '-'..ascii(x, 2)
  119. end
  120. return x
  121. end
  122.  
  123. function go(dir, dirFacing)
  124. if dir == "+y" then
  125. return T.sUp()
  126. elseif dir == "-y" then
  127. return T.sDown()
  128. end
  129.  
  130. local dirs = { ["+x"] = 0, ["+z"] = 1, ["-x"] = 2, ["-z"] = 3 }
  131.  
  132. if dir ~= dirFacing then
  133. turnDir = dirs[dir] - dirs[dirFacing]
  134. if turnDir <= 2 then
  135. T.turn("right", turnDir)
  136. else
  137. T.turn("left", 1)
  138. end
  139. end
  140. return T.sForward()
  141. end
  142.  
  143. function getDirFacing()
  144. cX, cY, cZ = gps.locate(10)
  145. turnCount = 0
  146. while not T.sForward() do
  147. T.turn("right")
  148. turnCount = turnCount + 1
  149. if turnCount >= 4 then
  150. return "?"
  151. end
  152. end
  153. nX, nY, nZ = gps.locate(10)
  154. if nX ~= cX then
  155. if nX > cX then
  156. return "+x"
  157. else
  158. return "-x"
  159. end
  160. elseif nZ ~= cZ then
  161. if nZ > cZ then
  162. return "+z"
  163. else
  164. return "-z"
  165. end
  166. end
  167. return "?"
  168. end
Advertisement
Add Comment
Please, Sign In to add comment