diff --git a/py_tree b/py_tree new file mode 100644 index 0000000..18b5b0c --- /dev/null +++ b/py_tree @@ -0,0 +1,164 @@ +-- 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) +