You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
3.6 KiB
168 lines
3.6 KiB
-- will make a pythagoras tree-like thing with a given depth (depth 0 are leaves)
|
|
-- this is a costy operation and takes lots of blocks (you can refill during the build)
|
|
-- we will always face to the tree and not move forward
|
|
-- orientation will define left/right/up/down
|
|
|
|
-- basic movement (orientation-less)
|
|
local function bup()
|
|
while not turtle.up() do turtle.digUp() end
|
|
end
|
|
|
|
local function bdown()
|
|
while not turtle.down() do turtle.digDown() end
|
|
end
|
|
|
|
local function bforward()
|
|
while not turtle.forward() do turtle.dig() end
|
|
end
|
|
|
|
local function bleft()
|
|
turtle.turnLeft()
|
|
bforward()
|
|
turtle.turnRight()
|
|
end
|
|
|
|
local function bright()
|
|
turtle.turnRight()
|
|
bforward()
|
|
turtle.turnLeft()
|
|
end
|
|
|
|
local function select_non_empty( )
|
|
for i = 1, 9 do
|
|
if turtle.getItemCount(i) > 0 then
|
|
turtle.select(i)
|
|
return
|
|
end
|
|
end
|
|
|
|
turtle.select(1)
|
|
print("ERROR: I'm empty, plz refill me!")
|
|
while turtle.getItemCount(1) == 0 do sleep(2) end
|
|
end
|
|
|
|
local function place()
|
|
select_non_empty()
|
|
turtle.place()
|
|
end
|
|
|
|
-- basic orientation operations
|
|
local function toleft( orientation )
|
|
return (orientation + 3) % 4
|
|
end
|
|
|
|
local function toback( orientation )
|
|
return (orientation + 2) % 4
|
|
end
|
|
|
|
local function toright( orientation )
|
|
return (orientation + 1) % 4
|
|
end
|
|
|
|
-- basic movement (with orientation)
|
|
local function forward( orientation )
|
|
if orientation == 0 then bup()
|
|
elseif orientation == 1 then bright()
|
|
elseif orientation == 2 then bdown()
|
|
elseif orientation == 3 then bleft()
|
|
else print("Error, wrong orientation")
|
|
end
|
|
end
|
|
|
|
local function walk( orientation, n )
|
|
if orientation == 0 then for i = 1, n do bup() end
|
|
elseif orientation == 1 then turtle.turnRight() for i = 1, n do bforward() end turtle.turnLeft()
|
|
elseif orientation == 2 then for i = 1, n do bdown(2) end
|
|
elseif orientation == 3 then turtle.turnLeft() for i = 1, n do bforward() end turtle.turnRight()
|
|
else print("Error, wrong orientation")
|
|
end
|
|
end
|
|
|
|
-- stops after the line
|
|
local function line( orientation, n )
|
|
for i = 1, n do
|
|
place()
|
|
forward(orientation)
|
|
end
|
|
end
|
|
|
|
-- stops after the rect
|
|
local function fill( w, h, orientation )
|
|
print(" fill "..w.."x"..h.." in orientation "..orientation)
|
|
if w == 1 then
|
|
line(orientation, h)
|
|
return
|
|
end
|
|
for i = 1, h do
|
|
if i % 2 == 1 then line(toright(orientation), w - 1)
|
|
else line(toleft(orientation), w - 1) end
|
|
place()
|
|
forward(orientation)
|
|
end
|
|
end
|
|
|
|
local function tree( depth, orientation )
|
|
print("Start with "..depth.." in orientation "..orientation)
|
|
-- done with recursion
|
|
if depth == 0 then
|
|
place()
|
|
walk(toback(orientation), 1)
|
|
return
|
|
end
|
|
|
|
local n = 2^depth
|
|
local half = n/2
|
|
local w = n
|
|
local h = n + half
|
|
|
|
-- big chunk, if needed move to left
|
|
fill(w, h, orientation)
|
|
if h % 2 == 1 then
|
|
walk(toleft(orientation), w - 1)
|
|
end
|
|
|
|
walk(toleft(orientation), 1)
|
|
line(toleft(orientation), half)
|
|
|
|
-- first branch (left)
|
|
tree(depth - 1, toleft(orientation))
|
|
line(orientation, half)
|
|
|
|
-- second branch (left)
|
|
tree(depth - 1, orientation)
|
|
|
|
-- fill between branches
|
|
if half - 1 > 0 then
|
|
forward(toright(orientation))
|
|
fill(half - 1, half - 1, toright(orientation))
|
|
else
|
|
walk(toright(orientation), 1)
|
|
end
|
|
|
|
-- walk to right branches
|
|
walk(toright(orientation), w)
|
|
|
|
-- fill between branches
|
|
if half - 2 > 0 then
|
|
fill(half - 1, half - 2, orientation)
|
|
end
|
|
walk(orientation, 1)
|
|
|
|
-- first branch
|
|
tree(depth - 1, orientation)
|
|
line(toright(orientation), half)
|
|
|
|
-- second branch
|
|
tree(depth - 1, toright(orientation))
|
|
line(toback(orientation), half - 1)
|
|
line(toleft(orientation), half)
|
|
|
|
-- move back to pre-begin
|
|
walk(toback(orientation), h)
|
|
walk(toleft(orientation), w - 1)
|
|
walk(toback(orientation), 1)
|
|
end
|
|
|
|
local args = { ... }
|
|
tree(args[1], 0)
|
|
|
|
|