CCCPaste
tempVal = 0
debugText = true --set this to false to not see $dev messages

mainMenu()

--program helpers

function debug(message) --does $dev messages
	if debugText then print("$"+message)
	else end
end

function print(message) --prints message with new line
 	io.write(message+"\n")
end
 
function cls() --clear screen
	term.clear()
	term.setCursorPos(1,1)
end
 
function pause() --system(pause)
	print("Press enter to continue...")
	io.read()
end

--movement functions

function turnAround()
	turtle.turnRight()
	turtle.turnRight()
end

function KP7() --forward left
	turtle.turnLeft()
	turtle.forward()
	turtle.turnRight()
end

function KP9() --forward right
	turtle.turnRight()
	turtle.forward()
	turtle.turnLeft()
end

function KP8()
	turtle.forward()
end

function KP2()
	turtle.back()
end

function KP1()
	turtle.turnLeft()
	turtle.forward()
	turtle.turnRight()
	turtle.back()
end

function KP3()
	turtle.turnRight()
	turtle.forward()
	turtle.turnLeft()
	turtle.back()
end

function KP4() --strafe left
	LT()
	KP8()
	RT()
end

function KPA()
	turtle.up()
end

function KPD()
	turtle.down()
end

function RT()
	turtle.turnRight()
end

function LT()
	turtle.turnLeft()
end
 
function mainMenu()
 cls()
 local prompt = -1
 debug("reset prompt")
 print("===MAIN MENU===")
 print("What to do next?")
 print("(Choose any option not listed to exit)")
 print("0. Refuel   6. Hollow Box")
 print("1. Line     7. Solid Block")
 print("2. Fence    8. Move")
 print("3. Pad      9. Color by Number")
 print("4. Wall    10. Quarry")
 print("5. Circle   X. Exit")
 io.write(">")
 prompt=io.read()
 if prompt == 0 then
  fillFuel()
  mainMenu()
 elseif prompt == 1 then
  lineMenu()
 elseif prompt == 2 then
  fenceMenu()
 elseif prompt == 3 then
  padMenu()
 elseif prompt == 4 then
  wallMenu()
 elseif prompt == 5 then
  circleMenu()
 elseif prompt == 6 then
  boxMenu()
 elseif prompt == 7 then
  cubeMenu()
 elseif prompt == 8 then
  moveMenu()
 elseif prompt == 9 then
  pixelArtMenu()
 elseif prompt == 10 then
  quarryMenu()	
 else end
end
 
function fillFuel()
	cls()
	debug("filling fuel")
	local iterations = 0
 	while(iterations<16) do
  		turtle.select(iterations+1)
  		debug("selected "+turtle.getSelectedSlot())
  		if (not turtle.refuel(64)) then debug(iterations+": not fuel")
  		else end
  		iterations=iterations+1
  		debug("iteration #"+iterations)
 	end
debug("done refueling")
pause()
end

function lineMenu()
 cls()
 local prompt = -1
 debug("reset prompt")
 local iterations = 0
 debug("reset iterations")
 print("Above or below?")
 print("1. Above")
 print("2. Below")
 io.write(">")
 prompt = io.read()
 print(" ")
 print("How far?")
 io.write(">")
 iterations = io.read()
 if tonumber(iterations)==nil then
	debug("bad iterations")
	print("Not a number.  Returning...")
	pause()
 elseif tonumber(prompt)==nil then
	debug("bad prompts")
	print("Not a number.  Returning...")
	pause()
 elseif prompt==1 then
	debug("lineAbove "+iterations)
	lineAbove(iterations)
	pause()
 elseif prompt==2 then
	debug("lineBelow "+iterations)
	lineBelow(iterations)
	pause()
 else
	debug("bad prompt")
	print("Returning...")
	pause()
	mainMenu()
 end
end
	
function lineAbove(distance)
	local iterations = 0
	if (distance > turtle.getSelectedSlot()) then
		lineAbove(turtle.getSelectedSlot())
		print("Out of material.  Which slot?")
		io.write(">")
		local prompt = io.read()
		if tonumber(prompt)==nil then 
			print("Not a number.  Cancelling...")
			pause()
			mainMenu()
		else
		turtle.select(prompt)
		lineAbove(distance-iterations)
		end
	else end
	local stock
	local fuel=turtle.getFuelLevel()
	while (iterations turtle.getSelectedSlot()) then
		lineBelow(turtle.getSelectedSlot())
		print("Out of material.  Which slot?")
		io.write(">")
		local prompt = io.read()
		if tonumber(prompt)==nil then 
			print("Not a number.  Cancelling...")
			pause()
			mainMenu()
		else
		turtle.select(prompt)
		lineBelow(distance-iterations)
		end
	else end
	local stock
	local fuel=turtle.getFuelLevel()
	while (iterations")
	varForward=io.read()
	if tonumber(varForward)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else end
	print("Left or right?")
	print("1. Left\n2. Right")
	io.write(">")
	prompt = io.read()
	if tonumber(prompt)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	elseif prompt == 1 then
		leftTurn = true
	elseif prompt ~= 2 then
		print("Not a valid number. Returning to menu...")
		pause()
		mainMenu()
	else
		debug("setting LT to false just in case something stupid")
		leftTurn=false
	end
	print("How many long?")
	io.write(varForward+"x?\n>")
	varSideways=io.read()
	if tonumber(varSideways)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else end
	print("Above or below?")
	print("1. Above\n2. Below")
	io.write(">")
	prompt = io.read()
	if tonumber(prompt)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	elseif prompt == 1 then
		boolUp = true
	elseif prompt ~= 2 then
		print("Not a valid number. Returning to menu...")
		pause()
		mainMenu()
	else end
	if boolUp then fenceAbove(varForward, varSideways, leftTurn)
	else fenceBelow(varForward, varSideways)
	end
	pause()
	mainMenu()
end

function fenceAbove(forward, sideways, turnLeft)
	lineAbove(forward)
	debug("leg 1 done")
	if turnLeft then LT() else RT() end
	lineAbove(sideways)
	debug("leg 2 done")
	if turnLeft then LT() else RT() end
	lineAbove(forward)
	debug("leg 3 done")
	if turnLeft then LT() else RT() end
	lineAbove(sideways)
	debug("leg 4 done")
	KP8()--start pos, no place
	if turnLeft then LT() else RT() end
end

function fenceBelow(forward, sideways, turnLeft)
	lineBelow(forward)
	debug("leg 1 done")
	if turnLeft then LT() else RT() end
	lineBelow(sideways)
	debug("leg 2 done")
	if turnLeft then LT() else RT() end
	lineBelow(forward)
	debug("leg 3 done")
	if turnLeft then LT() else RT() end
	lineBelow(sideways)
	debug("leg 4 done")
	KP8() --return to start pos
	if turnLeft then LT() else RT() end --return to start rot
end

function padMenu()
	local varForward=0
	local varSideways=0
	local varUp=false
	local iterations=0
	local leftTurn=false
	local prompt
	cls()
	print("How far forward?")
	io.write(">")
	varForward=io.read()
	if tonumber(varForward)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else end
	print("Left or right?")
	print("1. Left\n2. Right")
	io.write(">")
	prompt = io.read()
	if tonumber(prompt)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	elseif prompt == 1 then
		leftTurn = true
	elseif prompt ~= 2 then
		print("Not a valid number. Returning to menu...")
		pause()
		mainMenu()
	else
		debug("setting LT to false just in case something stupid")
		leftTurn=false
	end
	print("How many long?")
	io.write(varForward+"x?\n>")
	varSideways=io.read()
	if tonumber(varSideways)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else
	end
	print("Above or below?")
	print("1. Above\n2. Below")
	io.write(">")
	prompt = io.read()
	if tonumber(prompt)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	elseif prompt == 1 then
		varUp = true
	elseif prompt ~= 2 then
		print("Not a valid number. Returning to menu...")
		pause()
		mainMenu()
	end
	if varUp then padAbove(varForward, varSideways, leftTurn)
	else padBelow(varForward, varSideways, leftTurn)
	end
	pause()
	mainMenu()
end

function padAbove(forward, sideways, turnLeft)
	local smaller
	if (forward2 then fenceAbove(forward-2, sideways-2, turnLeft) else end
	if turnLeft then KP3() else KP1() end
end

function padBelow(forward, sideways, turnLeft)
	local smaller
	if (forward2 then fenceAbove(forward-2, sideways-2, turnLeft) else end
	if turnLeft then KP3() else KP1() end
end

function cubeMenu()
	local varForward=0
	local varSideways=0
	local varHeight=0
	local boolUp=true
	local iterations=0
	local leftTurn=false
	local prompt
	cls()
	print("How far forward?")
	io.write(">")
	varForward=io.read()
	if tonumber(varForward)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else end
	print("Left or right?")
	print("1. Left\n2. Right")
	io.write(">")
	prompt = io.read()
	if tonumber(prompt)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	elseif prompt == 1 then
		leftTurn = true
	elseif prompt ~= 2 then
		print("Not a valid number. Returning to menu...")
		pause()
		mainMenu()
	else
		debug("setting LT to false just in case something stupid")
		leftTurn=false
	end
	print("How many long?")
	io.write(varForward+"x?\n>")
	varSideways=io.read()
	if tonumber(varSideways)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else end
	print("Above or below?")
	print("1. Work Up\n2. Work Down")
	io.write(">")
	prompt = io.read()
	if tonumber(prompt)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	elseif prompt == 1 then
		boolUp = true
	elseif prompt ~= 2 then
		print("Not a valid number. Returning to menu...")
		pause()
		mainMenu()
	end
		print("How many tall?")
	io.write(varForward+"x"+varSideways+"x?\n>")
	varHeight=io.read()
	if tonumber(varHeight)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else end
	if boolUp then cubeBelow(varForward, varSideways, varHeight, leftTurn)
	else cubeAbove(varForward, varSideways, varHeight, leftTurn)
	end
	pause()
	mainMenu()
end

function cubeAbove(varForward, varSideways, varHeight, leftTurn)
	local iterations = 0
	while iterations < varHeight do
		padAbove(varForward, varSideways, leftTurn)
		debug("finished iteration "+iterations)
		iterations = iterations + 1
		KPD()
	end
	KP2()
	debug("backing out")
	while iterations > 0 do
		KPA()
		debug("ascended from "+iterations)
		iterations = iterations -1
	end
	pause()
end

function cubeBelow(varForward, varSideways, varHeight, leftTurn)
	local iterations = 0
	while iterations < varHeight do
		padAbove(varForward, varSideways, leftTurn)
		debug("finished iteration "+iterations)
		iterations = iterations + 1
		KPA()
	end
	KP2()
	debug("backing out")
	while iterations > 0 do
		KPD()
		debug("descended from "+iterations)
		iterations = iterations -1
	end
	pause()
end

function boxMenu()
	local varForward=0
	local varSideways=0
	local varHeight=0
	local boolUp=true
	local iterations=0
	local leftTurn=false
	local prompt
	cls()
	print("How far forward?")
	io.write(">")
	varForward=io.read()
	if tonumber(varForward)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else end
	print("Left or right?")
	print("1. Left\n2. Right")
	io.write(">")
	prompt = io.read()
	if tonumber(prompt)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	elseif prompt == 1 then
		leftTurn = true
	elseif prompt ~= 2 then
		print("Not a valid number. Returning to menu...")
		pause()
		mainMenu()
	else
		debug("setting LT to false just in case something stupid")
		leftTurn=false
	end
	print("How many long?")
	io.write(varForward+"x?\n>")
	varSideways=io.read()
	if tonumber(varSideways)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else end
	print("Above or below?")
	print("1. Work Up\n2. Work Down")
	io.write(">")
	prompt = io.read()
	if tonumber(prompt)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	elseif prompt == 1 then
		boolUp = true
	elseif prompt ~= 2 then
		print("Not a valid number. Returning to menu...")
		pause()
		mainMenu()
	end
		print("How many tall?")
	io.write(varForward+"x"+varSideways+"x?\n>")
	varHeight=io.read()
	if tonumber(varHeight)==nil then
		print("Not a number. Returning to menu...")
		pause()
		mainMenu()
	else end
	if boolUp then cubeBelow(varForward, varSideways, varHeight, leftTurn)
	else cubeAbove(varForward, varSideways, varHeight, leftTurn)
	end
	pause()
	mainMenu()
end

function boxAbove(varForward, varSideways, varHeight, leftTurn)
	local iterations = 0
	padbove(varForward, varSideways, leftTurn)
	while iterations < varHeight-2 do
		fenceAbove(varForward, varSideways, leftTurn)
		debug("finished iteration "+iterations)
		iterations = iterations + 1
		KPD()
	end
	padbove(varForward, varSideways, leftTurn)
	KP2()
	debug("backing out")
	while iterations > 0 do
		KPA()
		debug("ascended from "+iterations)
		iterations = iterations -1
	end
	pause()
end

function boxBelow(varForward, varSideways, varHeight, leftTurn)
	local iterations = 0
	padBelow(varForward, varSideways, leftTurn)
	while iterations < varHeight-2 do
		fenceBelow(varForward, varSideways, leftTurn)
		debug("finished iteration "+iterations)
		iterations = iterations + 1
		KPA()
	end
	padAbove(varForward, varSideways, leftTurn)
	KP2()
	debug("backing out")
	while iterations > 0 do
		KPD()
		debug("descended from "+iterations)
		iterations = iterations -1
	end
	pause()
end

function circleMenu()
	print("Coming Soon!")
	pause()
	mainMenu()
end

function pixelArtMenu()
	print("Coming Soon")
	pause()
	mainMenu()
end

function wallMenu()
	print("Coming Soon!")
	pause()
	mainMenu()
end

function moveMenu() --0 down, 5 up
	print("Coming Soon!")
	pause()
	mainMenu()
end

function quarryMenu()
	print("Coming Soon!")
	pause()
	mainMenu()
end