Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ---- Builds a dome or portion thereof
- -- Turtle returns to its starting point when mission is completed or fuel runs low
- -- Written by HarvDad, June 2014
- args = {...}
- nArgs = #args
- version = "dome: Rev 3.0"
- usage = "Usage: dome [start level] [stack count]"
- levels = {
- level1,
- level2,
- level3,
- level4,
- level5,
- level6,
- level7,
- level8,
- level9,
- level10,
- level11,
- level12,
- level13,
- level14,
- level15,
- level16,
- level17,
- }
- level17 = "F4 L1 l1 F2 R1 R2 L1 L2 r1 r3"
- level16 = "F2 l1 L2 R1 R3 l1 L3 R1 r1 F4 L1 L3 R1 r1 F3"
- level15 = "F1 L1 L1 R1 R1 L1 L1 R1 r1 F2 l1 L2 R1 r1 F2 L1 L1 R1 r2 R1 L1 L1 R1 R1 L1 L1 r0"
- level14 = "F1 L1 L1 R1 r1 L2 R1 L2 R1 L1 R1 L1 R2 L1 R3 L1 R1"
- level13 = "L2 R1 L3 R1 L2 r1 L1 R2 l1 R1 L1 R3 L1 R2"
- level12 = "L3 r1 L3 r1 L1 R1 L2 r1 F1 L1 R2 l1 R3 l1 R2"
- level11 = "L2 r1 L4 r1 L2 r1 L1 r1 L1 r1 L1 r1 F2 l1 R4 l1 R1"
- level10 = "L5 r1 L2 r1 L2 r1 L1 r1 L1 r1 F2 l1 R2 l1 R4"
- level9 = "L4 r1 L3 r1 L2 r1 L1 r1 L1 r1 L1 r1 F2 l1 R3 l1 R3"
- level8 = "L6 r1 L2 r1 L1 r1 L2 r1 F2 l1 R1 l1 R2 l1 R5"
- level7 = "L4 r1 L3 r1 L2 r1 L1 r1 L1 r1 L1 r1 L1 r1 F2 l1 R3 l1 R3"
- level6 = "L5 r1 L3 r1 L1 r1 L2 r1 L1 r1 F2 l1 F1 r1 F3 l1 R4"
- level5 = "F1 l1 F5 r1 L2 r1 L2 r1 L1 r1 L1 r1 L1 r1 F2 l1 R2 l1 R5 l1 r0"
- level4 = "L3 r1 L4 r1 L2 r1 L1 r1 L1 r1 L1 r1 L1 r1 L1 r1 F2 l1 R4 l1 R2"
- level3 = "L4 r1 L3 r1 L2 r1 L1 r1 L2 r1 F2 l1 R1 l1 R2 l1 R3 l1 R3"
- level2 = "L4 r1 L3 r1 L2 r1 L2 r1 L1 r1 L1 r1 F2 l1 R2 l1 R3 l1 R3"
- level1 = "L5 r1 L2 r1 L2 r1 L2 r1 L1 r1 L1 r1 F2 l1 R2 l1 R2 l1 R4"
- forwards = {0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 2, 2, 2, 0}
- materialSlot = 1
- startLevel = 0
- stackCount = 0
- buildDome = false
- buildStacks = false
- x = 0
- y = 0
- z = 0
- face = 0
- north = 0
- west = 1
- south = 2
- east = 3
- saveX = 0
- saveY = 0
- saveZ = 0
- saveFace = 0
- abort = false
- function savePosition()
- saveX = x
- saveY = y
- saveZ = z
- saveFace = face
- print("Saved xyz as ", saveX, ", ", saveY, ", ", saveZ, ", face: ", saveFace)
- end
- function restorePosition()
- x = saveX
- y = saveY
- z = saveZ
- face = saveFace
- print("Restored xyz as ", x, ", ", y, ", ", z, ", face: ", face)
- end
- -- Split text into a list consisting of the strings in text,
- -- separated by strings matching delimiter (which may be a pattern).
- -- example: strsplit(",%s*", "Anna, Bob, Charlie,Dolores")
- function strsplit(delimiter, text)
- local list = {}
- local pos = 1
- local index = 1
- if string.find("", delimiter, 1) then -- this would result in endless loops
- error("delimiter matches empty string!")
- end
- while 1 do
- local first, last = string.find(text, delimiter, pos)
- if first then -- found?
- list[index] = string.sub(text, pos, first-1)
- pos = last+1
- index = index+1
- else
- list[index] = string.sub(text, pos)
- index = index+1
- break
- end
- end
- return list
- end
- function isUpper(char)
- return string.match(char, "%u")
- end
- function ensureMaterial()
- if turtle.getItemCount(materialSlot) < 3 then
- organizeMaterial()
- end
- if turtle.getItemCount(materialSlot) < 3 then
- print("No more material")
- reload()
- print("Reloaded")
- end
- end
- function reload()
- home()
- load(1,16)
- turtle.select(materialSlot)
- moveTo(saveX, saveY, saveZ)
- setFace(saveFace)
- end
- function load(startSlot, endSlot)
- print("Attempting to reload at ", x, ", ", y, ", ", z)
- for slot=startSlot, endSlot do
- turtle.select(slot)
- turtle.suckDown()
- end
- end
- function left()
- if face == 0 then face = 1 turtle.turnLeft() return end
- if face == 1 then face = 2 turtle.turnLeft() return end
- if face == 2 then face = 3 turtle.turnLeft() return end
- if face == 3 then face = 0 turtle.turnLeft() return end
- print("function left\(\): Bad face value: ", face)
- end
- function right()
- if face == 0 then face = 3 turtle.turnRight() return end
- if face == 1 then face = 0 turtle.turnRight() return end
- if face == 2 then face = 1 turtle.turnRight() return end
- if face == 3 then face = 2 turtle.turnRight() return end
- print("function right\(\): Bad face value: ", face)
- end
- function up()
- turtle.up()
- y = y+1
- end
- function down()
- if turtle.detectDown() then
- turtle.digDown()
- end
- turtle.down()
- y = y-1
- end
- function forward()
- while turtle.detect() do -- This loop added in case of falling sand or whatever
- -- turtle.dig()
- return
- end
- for i=1,10 do -- This loop trys to handle pests (mob) that might be in the way
- if turtle.forward() then
- break
- end
- turtle.attack()
- sleep(2)
- end
- if face == 0 then z = z+1 return end
- if face == 1 then x = x-1 return end
- if face == 2 then z = z-1 return end
- if face == 3 then x = x+1 return end
- end
- function setFace(f)
- if f == 0 then
- if face == 0 then return end
- if face == 1 then right() return end
- if face == 2 then right() right() return end
- if face == 3 then left() return end
- end
- if f == 1 then
- if face == 0 then left() return end
- if face == 1 then return end
- if face == 2 then right() return end
- if face == 3 then right() right() return end
- end
- if f == 2 then
- if face == 0 then left() left() return end
- if face == 1 then left() return end
- if face == 2 then return end
- if face == 3 then right() return end
- end
- if f == 3 then
- if face == 0 then right() return end
- if face == 1 then left() left() return end
- if face == 2 then left() return end
- if face == 3 then return end
- end
- end
- function organizeMaterial()
- local i
- materialCount = turtle.getItemCount(materialSlot)
- if materialCount < 3 then
- -- print("Attempting to refill slot ", materialSlot)
- for i=2,16 do
- turtle.select(i)
- if turtle.compareTo(materialSlot) then
- turtle.transferTo(materialSlot)
- end
- end
- end
- turtle.select(materialSlot)
- end
- local function placeAndMove(direction, nBlocks)
- if direction == "L" then
- left()
- elseif direction == "R" then
- right()
- elseif direction == "F" then
- end
- for i=1,nBlocks do
- ensureMaterial()
- turtle.select(materialSlot)
- turtle.placeDown()
- forward()
- end
- end
- local function move(direction, nBlocks)
- -- print(" move ", direction, " ", nBlocks, " blocks")
- if direction == "l" then
- left()
- -- turtle.turnLeft()
- elseif direction == "r" then
- right()
- -- turtle.turnRight()
- elseif direction == "f" then
- end
- for i=1,nBlocks do
- forward()
- -- turtle.forward()
- end
- end
- function moveTo(X, Y, Z)
- print("moveTo(", X, ", ", Y, ", ", Z, ") y: ", y)
- if y == nil then print("y is nil") end
- if Y == nil then print("Y is nil") end
- if y ~= Y then
- if y < Y then
- while y < Y do
- up()
- end
- else
- while y > Y do
- down()
- end
- end
- end
- if x ~= X then
- if x < X then
- setFace(east)
- while x < X do
- forward()
- end
- else
- setFace(west)
- while x > X do
- forward()
- end
- end
- end
- if z ~= Z then
- if z < Z then
- setFace(north)
- while z < Z do
- forward()
- end
- else
- setFace(south)
- while z > Z do
- go(1)
- end
- end
- end
- end
- -- placeSection
- -- Place one quarter of structure defined by level string
- function placeSection(string)
- segments = strsplit(" ", string)
- for i=1,#segments do
- local direction = string.sub(segments[i], 1, 1)
- local distance = string.sub(segments[i], 2)
- -- print(segments[i])
- if isUpper(direction) then
- placeAndMove(direction, distance)
- else
- move(direction, distance)
- end
- if abort then
- return
- end
- end
- end
- function placeLevel(level)
- placeSection(level)
- right()
- -- turtle.turnRight()
- placeSection(level)
- right()
- -- turtle.turnRight()
- placeSection(level)
- right()
- -- turtle.turnRight()
- placeSection(level)
- right()
- -- turtle.turnRight()
- end
- function home()
- savePosition()
- if x > 0 then
- setFace(west)
- while x > 0 do
- forward()
- end
- elseif x < 0 then
- setFace(east)
- while x < 0 do
- forward()
- end
- end
- if z > 0 then
- setFace(south)
- while z > 0 do
- forward()
- end
- elseif z < 0 then
- setFace(north)
- while z < 0 do
- forward()
- end
- end
- if y > 0 then
- while y > 0 do
- down()
- end
- elseif y < 0 then
- while y < 0 do
- up()
- end
- end
- print("Reached home at ", x, ", ", y, ", ", z)
- end
- function getArgs()
- if (nArgs == 1 and args[1]== "help") then
- print(version)
- print("Build a dome or portion thereof")
- print("Turtle should be pre-fueled")
- print("Material starting in slot ", materialSlot)
- print(usage)
- abort = true
- return
- end
- if nArgs > 2 then
- print(usage)
- abort = true
- return
- end
- if nArgs == 0 then
- buildDome = true
- startLevel = 1
- stackCount = 1
- elseif nArgs >= 1 then
- startLevel = tonumber(args[1])
- if startLevel == nil then
- print("\"", args[1], "\" is not a valid start level")
- abort = true
- return
- end
- if startLevel > 17 then
- print("Start level must be an integer from 1 to 17");
- abort = true
- end
- if nArgs == 1 then
- buildDome = true
- end
- end
- if nArgs == 2 then
- stackCount = tonumber(args[2])
- if stackCount == nil then
- print("\"", args[2], "\" is not a valid stack count")
- abort = true
- return
- end
- if stackCount < 1 then
- print("stack count must be a positive number greater than zero")
- abort = true
- end
- buildStacks = true
- end
- end
- function domeBuild()
- up()
- forward()
- for i = startLevel,17 do
- placeLevel(levels[i])
- up()
- f = forwards[i]
- for j = 1,f do
- forward()
- end
- end
- end
- function stacksBuild()
- up()
- forward()
- for i = 1,stackCount do
- placeLevel(levels[startLevel])
- if i < stackCount then
- up()
- end
- end
- end
- getArgs()
- if abort then
- return
- end
- if buildDome then
- print("Build dome starting at level ", startLevel)
- domeBuild()
- home()
- elseif buildStacks then
- print("Build ", stackCount, " high wall of level ", startLevel)
- stacksBuild()
- home()
- end
- if true then
- return
- end
- up()
- forward()
- if startLevel == 1 then
- elseif startLevel == 2 then
- end
- placeLevel(level1)
- up()
- placeLevel(level2)
- up()
- placeLevel(level3)
- up()
- placeLevel(level4)
- up()
- placeLevel(level5)
- up()
- forward()
- placeLevel(level6)
- up()
- placeLevel(level7)
- up()
- forward()
- placeLevel(level8)
- up()
- placeLevel(level9)
- up()
- forward()
- placeLevel(level10)
- up()
- placeLevel(level11)
- up()
- forward()
- placeLevel(level12)
- up()
- forward()
- placeLevel(level13)
- up()
- forward()
- placeLevel(level14)
- up()
- forward()
- forward()
- placeLevel(level15)
- up()
- forward()
- forward()
- placeLevel(level16)
- up()
- forward()
- forward()
- placeLevel(level17)
- home()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement