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.
165 lines
3.5 KiB
165 lines
3.5 KiB
13 years ago
|
-- will make a pythagorian 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)
|
||
|
-- depth 1 => 8 blocks, depth 2 => 64 blocks, depth 3 => ~384 blocks, depth n => 2^(2n + 1)*n (some blocks may overlap)
|
||
|
-- 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( )
|
||
|
local i = 1
|
||
|
while turtle.getItemCount(i) == 0 do i = i+1 end
|
||
|
if not turtle.select(i) then
|
||
|
print("ERROR: I'm empty, press any key to continue, waiting for filling plz")
|
||
|
while turtle.getItemCount(9) == 0 do end
|
||
|
select_non_empty()
|
||
|
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
|
||
|
|
||
|
-- TODO: make more efficient, we are not placing blocks...
|
||
|
local function walk( orientation, n )
|
||
|
for i = 1, n do
|
||
|
forward(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)
|
||
|
|