local tArgs = {...}
local LEFT = 0
local FORWARD = 1
local RIGHT = 2
local nCurrentDir = FORWARD
local nCurrentX = 0
local nCurrentY = 0
--(( Functions ))--
local function look(nDir)
while nDir < nCurrentDir do
turtle.turnLeft()
nCurrentDir = nCurrentDir - 1
end
while nDir > nCurrentDir do
turtle.turnRight()
nCurrentDir = nCurrentDir + 1
end
end
local function _go(move, suffix)
while not turtle[move]() do
if not turtle["dig"..suffix]() then
if turtle["detect"..suffix]() then
error("Bedrock while trying to move " .. move, 0)
end
turtle["attack"..suffix]()
end
end
end
local function goForward()
_go("forward", "")
if nCurrentDir == RIGHT then
nCurrentX = nCurrentX + 1
elseif nCurrentDir == LEFT then
nCurrentX = nCurrentX - 1
end
end
local function goUp()
_go("up", "Up")
nCurrentY = nCurrentY + 1
end
local function goDown()
_go("down", "Down")
nCurrentY = nCurrentY - 1
end
local function _digTilTop(nHeight)
-- dig til top-1
while nCurrentY < nHeight - 2 do
goUp()
end
if nCurrentY <= nHeight - 2 then
repeat until not turtle.digUp()
end
end
local function _digTilBottom(nHeight)
-- dig til bottom+1
while nCurrentY > 1 do
goDown()
end
if nCurrentY >= 1 then
repeat until not turtle.digDown()
end
end
local function digColumn(nHeight)
if nCurrentY < nHeight / 2 then
-- bot to top
_digTilBottom(nHeight)
_digTilTop(nHeight)
else
-- top to bot
_digTilTop(nHeight)
_digTilBottom(nHeight)
end
end
local function digFrame(nHeight, nWidth)
digColumn(nHeight)
if nWidth == 1 then
return
end
if nCurrentX > nWidth / 2 then
look(LEFT)
else
look(RIGHT)
end
for i = 1,nWidth-1 do
goForward()
digColumn(nHeight)
end
end
local function tunnel(nLength, nHeight, nWidth)
for i=1,nLength do
look(FORWARD)
goForward()
digFrame(nHeight, nWidth)
end
if nCurrentX > 0 then
look(LEFT)
repeat
goForward()
until nCurrentX <= 0
end
look(FORWARD)
while nCurrentY > 0 do
goDown()
end
end
--(( Error checking ))--
local nArgLength = tonumber(tArgs[1])
local nArgHeight = tonumber(tArgs[2] or 2)
local nArgWidth = tonumber(tArgs[3] or 1)
local function usage(sMsg)
sMsg = sMsg and (sMsg .. "\n") or ""
error(sMsg .. "Usage: tunnel <length> [height=2] [width=1]", 0)
end
if #tArgs==0 then usage("Missing length.") end
if not nArgLength then usage("Invalid length, expected number.") end
if not nArgHeight then usage("Invalid height, expected number.") end
if not nArgWidth then usage("Invalid width, expected number.") end
if nArgLength <= 0 then usage("Invalid length, negative not supported.") end
if nArgHeight <= 0 then usage("Invalid height, negative not supported.") end
if nArgWidth <= 0 then usage("Invalid width, negative not supported.") end
if nArgLength % 1 ~= 0 then usage("Invalid length, fractions not supported.") end
if nArgHeight % 1 ~= 0 then usage("Invalid height, fractions not supported.") end
if nArgWidth % 1 ~= 0 then usage("Invalid width, fractions not supported.") end
--(( Main program ))--
tunnel(nArgLength, nArgHeight, nArgWidth)
--(( EOF ))---
Comments