x = 0
y = 0
z = 0
f = 0 -- 0 = +x, 1 = +z, 2 = -x, 3 = -z
chestX = -1
chestY =  0
chestZ =  0
torchX = -1
torchY =  0
torchZ =  3
moveCount = 0
torchSlot = 1
retorching = false
garbageCollected = 0

refuel = function()
	for slot = 5,16 do
		turtle.select( slot )
		turtle.refuel()
	end
end

ensureFuel = function()
	if turtle.getFuelLevel() == 0 then
		print( "Give fuel" )
		refuel()
	end
end

removeBlacklist = function()
	for iter1 = 2,4 do
		turtle.select( iter1 )
		for iter2 = 5,16 do
			if turtle.compareTo( iter2 ) then
				turtle.select( iter2 )
				turtle.drop()
				turtle.select( iter1 )
			end
		end
	end
	if turtle.getItemCount( 16 ) > 0 then
		for iter1 = 1,15 do
			start = iter1 + 1
			if start < 5 then
				start = 5
			end
			for iter2 = start,16 do
				if turtle.getItemCount( iter2 ) > 0 then
					turtle.select( iter2 )
					turtle.transferTo( iter1 )
				end
			end
		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
		moveCount = 0
		if turtle.getItemCount( torchSlot ) <= 16 and not retorching then
			retorching = true
			st2X = x
			st2Y = y
			st2Z = z
			navigateTo( torchX + 1, torchY, torchZ, false )
			face( 2 )
			turtle.select( torchSlot )
			turtle.drop()
			while turtle.getItemCount( torchSlot ) < 64 do
				turtle.suck()
			end
			for iter = 2,16 do
				if turtle.compareTo( iter ) then
					turtle.select( iter )
					turtle.drop()
					turtle.select( torchSlot )
				end
			end
			navigateTo( st2X, st2Y, st2Z, false )
			retorching = false
		end
		while turtle.getItemCount( torchSlot ) <= 1 do
			print( "Give torches" )
		end
		turtle.select( torchSlot )
		left()
		left()
		turtle.place()
		right()
		right()
	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
			removeBlacklist()
			garbageCollected = garbageCollected + 1
		else
			garbageCollected = 0
		end
		if turtle.getItemCount( 16 ) > 0 or garbageCollected > 3 then
			stX = x
			stY = y
			stZ = z
			navigateTo( chestX + 1, chestY, chestZ, false )
			if turtle.getFuelLevel() < 1000 then
				refuel()
			end
			face( 2 )
			for iter = 5,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 y < newY do
		move( "+y", 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 x > newX do
		move( "-x", 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()
