x = 0
y = 0
z = 0
f = 0 -- 0 = +x, 1 = +z, 2 = -x, 3 = -z
chestX = -1
chestY =  0
chestZ =  0
moveCount = 0
torchSlot = 1

ensureFuel = function()
	if turtle.getFuelLevel() == 0 then
		for slot = 2,16 do
			turtle.select( slot )
			turtle.refuel()
		end
	end
end

right = function()
	if turtle.turnRight() then
		f = f + 1
	end
end

left = function()
	if turtle.turnLeft() then
		f = f - 1
	end
end

face = function( dir )
	while f < dir do
		right()
	end
	while f > dir do
		left()
	end
end

move = function( dir, pickup )
	ensureFuel()
	moveCount = moveCount + 1
	if moveCount == 8 then
		turtle.select( torchSlot )
		left()
		left()
		turtle.place()
		right()
		right()
		moveCount = 0
	end
	if dir == "+x" then
		face( 0 )
		if turtle.forward() then
			x = x + 1
		else
			turtle.dig()
			if turtle.forward() then
				x = x + 1
			end
			turtle.digUp()
		end
	elseif dir == "-x" then
		face( 2 )
		if turtle.forward() then
			x = x - 1
		else
			turtle.dig()
			if turtle.forward() then
				x = x - 1
			end
			turtle.digUp()
		end
	elseif dir == "+z" then
		face( 1 )
		if turtle.forward() then
			z = z + 1
		else
			turtle.dig()
			if turtle.forward() then
				z = z + 1
			end
			turtle.digUp()
		end
	elseif dir == "-z" then
		face( 3 )
		if turtle.forward() then
			z = z - 1
		else
			turtle.dig()
			if turtle.forward() then
				z = z - 1
			end
			turtle.digUp()
		end
	elseif dir == "+y" then
		if turtle.up() then
			y = y + 1
		else
			turtle.digUp()
			if turtle.up() then
				y = y + 1
			end
		end
	elseif dir == "-y" then
		if turtle.down() then
			y = y - 1
		else
			turtle.digDown()
			if turtle.down() then
				y = y - 1
			end
		end
	end
	if pickup == true then
		if turtle.getItemCount( 16 ) > 0 then
			stX = x
			stY = y
			stZ = z
			navigateTo( chestX + 1, chestY, chestZ, false )
			face( 2 )
			for iter = 2,16 do
				turtle.select( iter )
				turtle.drop()
			end
			navigateTo( stX, stY, stZ, false )
		end
		turtle.suck()
	end
end

navigateTo = function( newX, newY, newZ, pickup )
	while x < newX do
		move( "+x", pickup )
	end
	while x > newX do
		move( "-x", pickup )
	end
	while z < newZ do
		move( "+z", pickup )
	end
	while z > newZ do
		move( "-z", pickup )
	end
	while y < newY do
		move( "+y", pickup )
	end
	while y > newY do
		move( "-y", pickup )
	end
end

createGrid = function( offX, offY, offZ )
	navigateTo( offX +  0, offY, offZ +  0, true )
	navigateTo( offX + 60, offY, offZ +  0, true )
	navigateTo( offX + 60, offY, offZ - 60, true )
	navigateTo( offX + 57, offY, offZ - 60, true )
	navigateTo( offX + 57, offY, offZ + 60, true )
	navigateTo( offX + 54, offY, offZ + 60, true )
	navigateTo( offX + 54, offY, offZ - 60, true )
	navigateTo( offX + 51, offY, offZ - 60, true )
	navigateTo( offX + 51, offY, offZ + 60, true )
	navigateTo( offX + 48, offY, offZ + 60, true )
	navigateTo( offX + 48, offY, offZ - 60, true )
	navigateTo( offX + 45, offY, offZ - 60, true )
	navigateTo( offX + 45, offY, offZ + 60, true )
	navigateTo( offX + 42, offY, offZ + 60, true )
	navigateTo( offX + 42, offY, offZ - 60, true )
	navigateTo( offX + 39, offY, offZ - 60, true )
	navigateTo( offX + 39, offY, offZ + 60, true )
	navigateTo( offX + 36, offY, offZ + 60, true )
	navigateTo( offX + 36, offY, offZ - 60, true )
	navigateTo( offX + 33, offY, offZ - 60, true )
	navigateTo( offX + 33, offY, offZ + 60, true )
	navigateTo( offX + 30, offY, offZ + 60, true )
	navigateTo( offX + 30, offY, offZ - 60, true )
	navigateTo( offX + 27, offY, offZ - 60, true )
	navigateTo( offX + 27, offY, offZ + 60, true )
	navigateTo( offX + 24, offY, offZ + 60, true )
	navigateTo( offX + 24, offY, offZ - 60, true )
	navigateTo( offX + 21, offY, offZ - 60, true )
	navigateTo( offX + 21, offY, offZ + 60, true )
	navigateTo( offX + 18, offY, offZ + 60, true )
	navigateTo( offX + 18, offY, offZ - 60, true )
	navigateTo( offX + 15, offY, offZ - 60, true )
	navigateTo( offX + 15, offY, offZ + 60, true )
	navigateTo( offX + 12, offY, offZ + 60, true )
	navigateTo( offX + 12, offY, offZ - 60, true )
	navigateTo( offX +  9, offY, offZ - 60, true )
	navigateTo( offX +  9, offY, offZ + 60, true )
	navigateTo( offX +  6, offY, offZ + 60, true )
	navigateTo( offX +  6, offY, offZ - 60, true )
	navigateTo( offX +  3, offY, offZ - 60, true )
	navigateTo( offX +  3, offY, offZ + 60, true )
	navigateTo( offX +  0, offY, offZ + 60, true )
	navigateTo( offX +  0, offY, offZ +  0, true )
end

create3DGrid = function()
	createGrid( 0, 0, 0 )
	createGrid( 1, 3, 0 )
	navigateTo( 0, 0, 0 )
end

create3DGrid()