CCCPaste
tempVal = 0
debugText = true --set this to false to not see $dev messages
 
 
--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 = "Q"
 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(distanceM)
    local iterations = 0
 local distanceT = distanceM
    local distance = tonumber(distanceT)
 local slot = tonumber(turtle.getSelectedSlot())
 local count = tonumber(turtle.getItemCount(slot))
    if (distance > count) 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 count) 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(forwardM, sidewaysM, turnLeft)
    local forwardT = forwardM
	local forward = tonumber(forwardT)
	local sidewaysT = sidewaysM
    local sideways = tonumber(sidewaysT)
    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)
    local forwardT = forwardM
	local forward = tonumber(forwardT)
	local sidewaysT = sidewaysM
    local sideways = tonumber(sidewaysT)
    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(tonumber(varForward), tonumber(varSideways), leftTurn)
    else padBelow(tonumber(varForward), tonumber(varSideways), leftTurn)
    end
    pause()
    mainMenu()
end
 
function padAbove(forwardM, sidewaysM, turnLeft)
    local forwardT = forwardM
	local forward = tonumber(forwardT)
	local sidewaysT = sidewaysM
    local sideways = tonumber(sidewaysT)
    local smaller
    if (forward2 then fenceAbove(forward-2, sideways-2, turnLeft) else end
    if turnLeft then KP3() else KP1() end
end
 
function padBelow(forwardM, sidewaysM, turnLeft)
    local forwardT = forwardM
	local forward = tonumber(forwardT)
	local sidewaysT = sidewaysM
    local sideways = tonumber(sidewaysT)
    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(varForwardM, varSidewaysM, varHeightM, leftTurn)
    local varForwardT = varForwardM
	local varForward = tonumber(varForwardT)
	local varSidewaysT = varSidewaysM
    local varSideways = tonumber(varSidewaysT)
	local varHeightT = varHeightM
    local varHeight = tonumber(varHeightT)
    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(varForwardM, varSidewaysM, varHeightM, leftTurn)
    local varForwardT = varForwardM
	local varForward = tonumber(varForwardT)
	local varSidewaysT = varSidewaysM
    local varSideways = tonumber(varSidewaysT)
	local varHeightT = varHeightM
    local varHeight = tonumber(varHeightT)
    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(varForwardM, varSidewaysM, varHeightM, leftTurn)
    local varForwardT = varForwardM
	local varForward = tonumber(varForwardT)
	local varSidewaysT = varSidewaysM
    local varSideways = tonumber(varSidewaysT)
	local varHeightT = varHeightM
    local varHeight = tonumber(varHeightT)
    local iterations = 0
    padAbove(varForward, varSideways, leftTurn)
    while iterations < varHeight-2 do
        fenceAbove(varForward, varSideways, leftTurn)
        debug("finished iteration "..iterations)
        iterations = iterations + 1
        KPD()
    end
    padAbove(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 varForwardT = varForwardM
	local varForward = tonumber(varForwardT)
	local varSidewaysT = varSidewaysM
    local varSideways = tonumber(varSidewaysT)
	local varHeightT = varHeightM
    local varHeight = tonumber(varHeightT)
    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()
	cls()
    print("Coming Soon!")
    pause()
    mainMenu()
end
 
function pixelArtMenu()
	cls()
    print("Coming Soon")
    pause()
    mainMenu()
end
 
function wallMenu()
	cls()
    print("Coming Soon!")
    pause()
    mainMenu()
end
 
function moveMenu() --0 down, 5 up
	cls()
    print("Coming Soon! Will have mouse support!")
    pause()
    --option for "forward 7" or click menu
    --make click menu
--while true do --make boolean escape var
    -- Wait specifically for a "mouse_click" event
    --local event, button, x, y = os.pullEvent("mouse_click")
    -- 'button' is 1 for left, 2 for right, 3 for middle
    --print("Button " .. button .. " was clicked at coordinates " .. x .. ", " .. y)
--end
    mainMenu()
end
 
function quarryMenu()
    print("Coming Soon!")
    pause()
    mainMenu()
end
 
mainMenu()
 
--  lineMenu(done)
--  fenceMenu(done)
--  padMenu(done)
--  wallMenu(placeholder)
--  circleMenu(postponed)
--  boxMenu(done)
--  cubeMenu(done)
--  moveMenu(placeholder)
--  pixelArtMenu(postponed)
--  quarryMenu(placeholder)