mirror of
https://github.com/kepler155c/opus
synced 2025-01-05 21:30:28 +00:00
84 lines
1.9 KiB
Plaintext
84 lines
1.9 KiB
Plaintext
require = requireInjector(getfenv(1))
|
|
local Point = require('point')
|
|
|
|
local checkedNodes = { }
|
|
local nodes = { }
|
|
local box = { x = 65, ex = 69, y = 65, ey = 70, z = -23, ez = -19 }
|
|
|
|
local function inBox(pt, box)
|
|
return pt.x >= box.x and
|
|
pt.y >= box.y and
|
|
pt.z >= box.z and
|
|
pt.x <= box.ex and
|
|
pt.y <= box.ey and
|
|
pt.z <= box.ez
|
|
end
|
|
|
|
local function toKey(pt)
|
|
return table.concat({ pt.x, pt.y, pt.z }, ':')
|
|
end
|
|
|
|
local function addNode(node)
|
|
|
|
for i = 0, 5 do
|
|
local hi = turtle.getHeadingInfo(i)
|
|
local testNode = { x = node.x + hi.xd, y = node.y + hi.yd, z = node.z + hi.zd }
|
|
|
|
if inBox(testNode, box) then
|
|
local key = toKey(testNode)
|
|
if not checkedNodes[key] then
|
|
nodes[key] = testNode
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function dig(facing)
|
|
local direction = facing
|
|
if direction == 'forward' then
|
|
direction = turtle.getHeadingInfo(turtle.point.heading).direction
|
|
end
|
|
local hi = turtle.getHeadingInfo(direction)
|
|
local node = { x = turtle.point.x + hi.xd, y = turtle.point.y + hi.yd, z = turtle.point.z + hi.zd }
|
|
if inBox(node, box) then
|
|
if turtle.getAction(facing).dig() then
|
|
addNode(node)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function level()
|
|
repeat
|
|
local node = { x = turtle.point.x, y = turtle.point.y, z = turtle.point.z }
|
|
local key = toKey(node)
|
|
|
|
checkedNodes[key] = true
|
|
nodes[key] = nil
|
|
|
|
dig('down')
|
|
dig('up')
|
|
dig('forward')
|
|
|
|
print(string.format('%d nodes remaining', Util.size(nodes)))
|
|
|
|
if Util.size(nodes) == 0 then
|
|
break
|
|
end
|
|
|
|
local node = Point.closest(turtle.point, nodes)
|
|
if not turtle.gotoPoint(node) then
|
|
break
|
|
end
|
|
until turtle.abort
|
|
end
|
|
|
|
local pt = Util.shallowCopy(turtle.point)
|
|
turtle.setPolicy(turtle.policies.none)
|
|
if turtle.pathfind({ x = 65, y = 70, z = -23 }) then
|
|
--turtle.reset()
|
|
turtle.setPolicy(turtle.policies.digOnly)
|
|
level()
|
|
end
|
|
turtle.pathfind(pt)
|
|
--local s, m = turtle.run(level)
|