DrakeAedus

AndyLogger Computercraft Turtle Program (Furnace Fix)

Oct 4th, 2013
754
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 55.75 KB | None | 0 0
  1. -- AndyLogger a Computercraft Turtle Program by Andrakon
  2. -- Version 1.72.1
  3. -- Get the startup script with "pastebin get nDgxjQas startup"
  4.  
  5. -- 04 Oct 2013 by DrakeAedus
  6. -- Minor modification made to furnaceCheck() and makeCharcoal() to support
  7. -- the new furnace sided inventory for fuel input and item removal
  8.  
  9. -- Section: Variables -----------------------------------------------------------------------------
  10. -- these are defaults loaded when the turtle runs for the first time
  11. local whatsMyName = "Andy Logger"
  12. local logSlot = 2              
  13. local fuelSlot1 = 13
  14. local fuelSlot2 = 14
  15. local saplingSlot1 = 9
  16. local saplingSlot2 = 10
  17. local dirtSlot = 1
  18. local minFuel = 100         -- the turtle will refuel itself if the fuel level dips below this
  19. local firstRun = true       -- do I need to place down the dirt for the first time
  20. local saplingGap = 2        -- blocks between saplings
  21. local wallGap = 2       -- blocks between turtle's starting position and the first tree
  22. local sleepTime = 600       -- automatically adjusted by program
  23. local baseTime = 600        -- used for making the sleepTime calculation and is not saved in logger.cfg
  24. local useFurnace = true     -- do you want the turtle to make its own charcoal? Put a furnace above it to use.
  25. local poweredFurnace = false    -- set to true if your furnace is powered by something else
  26. local charcoalNumber = 2    -- number of charcoal to make each logging run, in multiples of 8
  27. local dumpStuff = true      -- if true the turtle will drop off extra stuff in a chest on its right
  28. local getSaplings = true    -- if true the turtle will get saplings from a chest on its left, put only saplings in there
  29. local treeTotal = 0         -- keeps track of how many trees it has cut down
  30. local charcoalMade = 0      -- keeps track of how many charcoal it has made
  31. local saplingsPlanted = 0   -- keeps track of how many saplings it has planted
  32. local fuelOn = true     -- setting for if the server has fuel disabled for turtles
  33. local rowOffset = 0         -- scoot the first row left (+) or right (-) with a positive or negative number
  34. local needsBroken = false   -- if the turtle can't find its way back home you will need to break it before it runs again
  35. local omgDirt = 0
  36. -- variables for saving the turtle's cordinates, saved in loggercords.dat
  37. local cordsx = 0
  38. local cordsy = 0
  39. local cordsz = 0
  40. local facing = 1
  41.  
  42. -- SECTION: Settings Saving and Loading -----------------------------------------------------------
  43. function saveSettings() -- write the settings to logger.cfg
  44.     term.setCursorPos (3, 2)
  45.     write ("Commiting to memory")
  46.     local file = fs.open ("logger.cfg", "w")
  47.     file.writeLine (whatsMyName)
  48.     file.writeLine (logSlot)
  49.     file.writeLine (fuelSlot1)
  50.     file.writeLine (fuelSlot2)
  51.     file.writeLine (saplingSlot1)
  52.     file.writeLine (saplingSlot2)
  53.     file.writeLine (dirtSlot)
  54.     file.writeLine (minFuel)
  55.     file.writeLine (firstRun)
  56.     file.writeLine (saplingGap)
  57.     file.writeLine (wallGap)
  58.     file.writeLine (sleepTime)
  59.     file.writeLine (long)
  60.     file.writeLine (wide)
  61.     file.writeLine (useFurnace)
  62.     file.writeLine (poweredFurnace)
  63.     file.writeLine (charcoalNumber)
  64.     file.writeLine (dumpStuff)
  65.     file.writeLine (getSaplings)
  66.     file.writeLine (treeTotal)
  67.     file.writeLine (charcoalMade)
  68.     file.writeLine (saplingsPlanted)
  69.     file.writeLine (fuelOn)
  70.     file.writeLine (rowOffset)
  71.     file.writeLine (needsBroken)
  72.     file.close ( )
  73.     sleep (0.3)
  74.     term.setCursorPos (3, 2)
  75.     write ("                   ")
  76. end
  77.  
  78. function loadSettings() -- load values from logger.cfg
  79.     term.setCursorPos (3, 2)
  80.     write (" Trying to Remember...")
  81.     local file = fs.open ("logger.cfg", "r")
  82.     whatsMyName = file.readLine ( )
  83.     logSlot = tonumber (file.readLine ( ))
  84.     fuelSlot1 = tonumber (file.readLine ( ))
  85.     fuelSlot2 = tonumber (file.readLine ( ))
  86.     saplingSlot1 = tonumber (file.readLine ( ))
  87.     saplingSlot2 = tonumber (file.readLine ( ))
  88.     dirtSlot = tonumber (file.readLine ( ))
  89.     minFuel = tonumber (file.readLine ( ))
  90.     firstRun = file.readLine ( ) == "true"
  91.     saplingGap = tonumber (file.readLine ( ))
  92.     wallGap = tonumber (file.readLine ( ))
  93.     sleepTime = tonumber (file.readLine ( ))
  94.     long = tonumber (file.readLine ( ))
  95.     wide = tonumber (file.readLine ( ))
  96.     useFurnace = file.readLine ( ) == "true"
  97.     poweredFurnace = file.readLine ( ) == "true"
  98.     charcoalNumber = tonumber (file.readLine ( ))
  99.     dumpStuff = file.readLine ( ) == "true"
  100.     getSaplings = file.readLine ( ) == "true"
  101.     treeTotal = tonumber (file.readLine ( ))
  102.     charcoalMade = tonumber (file.readLine ( ))
  103.     saplingsPlanted = tonumber (file.readLine ( ))
  104.     fuelOn = file.readLine ( ) == "true"
  105.     liltest = (file.readLine ( ))
  106.     if type( tonumber (liltest) ) == "number" then
  107.         -- rowOffset = tonumber (file.readLine ( ))
  108.         rowOffset = tonumber (liltest)
  109.     else
  110.         rowOffset = 0
  111.         rowOffset = tonumber (rowOffset)
  112.     end
  113.     needsBroken = file.readLine ( ) == "true"
  114.     file.close ( )
  115. end
  116.  
  117.  
  118. -- SECTION: Cordinate Handling
  119. -- cords notes: x is forward and backward, z is left and right
  120. -- faceing is as follows: 1 is x+, 2 is z+, 3 is x-, 4 is z- or
  121. -- Forward, Right, Backward, Left from inital placement
  122. -- all cords and facings are relative to turtles initial placement, not minecraft cords
  123.  
  124. function saveCords() -- write cordinates to loggercords.dat
  125.     local file = fs.open ("loggercords.dat", "w")
  126.     file.writeLine (cordsx)
  127.     file.writeLine (cordsy)
  128.     file.writeLine (cordsz)
  129.     file.writeLine (facing)
  130.     file.close ( )
  131. end
  132.  
  133. function loadCords() -- read cordinates from loggercords.dat
  134.     local file = fs.open ("loggercords.dat", "r")
  135.     cordsx = tonumber (file.readLine ( ))
  136.     cordsy = tonumber (file.readLine ( ))
  137.     cordsz = tonumber (file.readLine ( ))
  138.     facing = tonumber (file.readLine ( ))
  139.     file.close ( )
  140. end
  141.    
  142. function homeCheck() -- see if turtle is at home after booting up
  143.     -- checks to see if turtle was broken, most likely the player will not refill logslot
  144.     if turtle.getItemCount(logSlot) == 0 then
  145.         cordsx = 0
  146.         cordsy = 0
  147.         cordsz = 0
  148.         facing = 1
  149.         saveCords()
  150.         loadCords()
  151.         return true
  152.     end
  153.     -- check cords and returns true if at home position and facing
  154.     if cordsx == 0 then
  155.         if cordsy == 0 then
  156.             if cordsz == 0 then
  157.                 if facing == 1 then
  158.                     return true
  159.                 else
  160.                     return false
  161.                 end
  162.             else
  163.                 return false
  164.             end
  165.         else
  166.             return false
  167.         end
  168.     else
  169.         return false
  170.     end
  171. end
  172.    
  173. function goHome() -- turtle was out in the field when restarted, lets get it home
  174.     -- finish cutting down tree first
  175.     if cordsx == 0 then -- Dodge the furnace!
  176.         if cordsz == 0 then
  177.             if cordsy == 2 then
  178.                 while facing ~= 1 do
  179.                     turn ("left")
  180.                 end
  181.                 forward(1)
  182.                 down(2)
  183.                 turn("back")
  184.                 forward(1)
  185.                 turn("back")
  186.                 return
  187.             end
  188.         end
  189.     end
  190.     turtle.select(logSlot)
  191.     if cordsy ~= 0 then
  192.         height = 0
  193.         up(1)
  194.         height = height + 1
  195.         while turtle.compareUp() do
  196.             turtle.digUp ()
  197.             up (1)
  198.             height = height + 1
  199.         end
  200.         down(height)
  201.     end
  202.     -- get to the right height
  203.     term.setCursorPos (1, 2)
  204.     clearLine()
  205.     write ("| Im heading home! :D")
  206.     while cordsy > 0 do
  207.         down (1)
  208.         sleep (0.2)
  209.     end
  210.     if cordsy < 0 then
  211.         up (1)
  212.     end
  213.     -- face the correct z direction to go home
  214.     if cordsz < 0 then
  215.         while facing ~= 2 do
  216.             turn ("right")
  217.         end
  218.     elseif cordsz > 0 then
  219.         while facing ~= 4 do
  220.             turn ("left")
  221.         end
  222.     end
  223.     -- get to z = 0
  224.     while cordsz ~= 0 do
  225.         forward (1)
  226.         sleep (0.3)
  227.     end
  228.     -- face towards home
  229.     while facing ~= 3 do
  230.         turn ("left")
  231.     end
  232.     -- go home
  233.     while cordsx ~= 0 do
  234.         forward (1)
  235.         sleep (0.2)
  236.     end
  237.     turn ("back") -- should now be home facing the right direction
  238.     if useFurnace == true then -- lets make sure the turtle made it home, assuming a chest or furnace is nearby
  239.         if furnaceCheck() == false then
  240.             needsBroken = true
  241.             saveSettings()
  242.             term.clear()
  243.             term.setCursorPos (1, 1)
  244.             print ("Logger may not have made it home so the program was closed. Break the turtle and replace it to continue.")
  245.             running = false
  246.             return
  247.         end
  248.     elseif dumpStuff == true then -- if useFurnace is off, check for a dump chest
  249.         turn ("right")
  250.         if turtle.detect() == false then
  251.             needsBroken = true
  252.             saveSettings()
  253.             turn ("left")
  254.             term.clear()
  255.             term.setCursorPos (1, 1)
  256.             print ("Logger may not have made it home so the program was closed. Break the turtle and replace it to continue.")
  257.             running = false
  258.             return
  259.         end
  260.     elseif getSaplings == true then -- if dumpchest is off, check for a sapling chest
  261.         turn ("left")
  262.         if turtle.detect() == false then
  263.             needsBroken = true
  264.             saveSettings()
  265.             turn ("right")
  266.             term.clear()
  267.             term.setCursorPos (1, 1)
  268.             print ("Logger may not have made it home so the program was closed. Break the turtle and replace it to continue.")
  269.             running = false
  270.             return
  271.         end
  272.     end -- if somehow the tests pass, or all chests and furnace are turned off, and the turtle isn't in the right spot, then too bad.
  273. end
  274.    
  275. -- SECTION: Settings Menus, used for changing variables -------------------------------------------
  276.    
  277. function settings() -- main settings menu
  278.     -- display settings menu
  279.     -- allow for selection of different setting categories
  280.     -- some settings categories goes to their own page, some toggles
  281.     -- menus:
  282.     -- Turtle Name, change slots, Farm layout, Sleep Time,
  283.     -- Furnace (toggle), Sapling chest (toggle), Output chest (toggle)
  284.     -- Powered Furnace (toggle), Quit Program
  285.     if running == false then return end
  286.     term.clear()
  287.     box()
  288.     term.setCursorPos (15, 1)
  289.     write ("Settings Menu")
  290.     term.setCursorPos (1, 13)
  291.     write ("O---a=back, d=select, w=up, s=down ---O")
  292.     keypress = 0
  293.     selection = 1
  294.     while gotosettings == true do       -- menus start here
  295.         if selection == 1 then          -- Turtle Name 
  296.             term.setCursorPos (14, 3)
  297.             write ("*Turtle Name  ")
  298.             if keypress == 32 then
  299.                 changeName()
  300.                 return
  301.             end
  302.         else
  303.             term.setCursorPos (14, 3)
  304.             write (" Turtle Name ")
  305.         end
  306.         if selection == 2 then
  307.             term.setCursorPos (14, 4)
  308.             write ("*Change Slots")
  309.             if keypress == 32 then
  310.                 changeSlots()
  311.                 return
  312.             end
  313.         else
  314.             term.setCursorPos (14, 4)
  315.             write (" Change Slots ")
  316.         end
  317.         if selection == 3 then          -- Farm Layout
  318.             term.setCursorPos (14, 5)
  319.             write ("*Farm Layout")
  320.             if keypress == 32 then
  321.                 farmLayout()
  322.                 return
  323.             end
  324.         else
  325.             term.setCursorPos (14, 5)
  326.             write (" Farm Layout ")
  327.         end
  328.         if selection == 4 then          -- Sleep Time
  329.             term.setCursorPos (14, 6)
  330.             write ("*Sleep Time")
  331.             if keypress == 32 then
  332.                 changeSleepTime()
  333.                 return
  334.             end
  335.         else
  336.             term.setCursorPos (14, 6)
  337.             write (" Sleep Time ")
  338.         end
  339.         if selection == 5 then          -- Furnace (toggle)
  340.             term.setCursorPos (14, 7)
  341.             write ("*Furnace ("..tostring(useFurnace)..") ")
  342.             if keypress == 32 then
  343.                 if useFurnace == false then
  344.                     useFurnace = true
  345.                 else
  346.                     useFurnace = false
  347.                 end
  348.                 term.setCursorPos (14, 7)
  349.                 write ("*Furnace ("..tostring(useFurnace)..") ")
  350.             end
  351.         else
  352.             term.setCursorPos (14, 7)
  353.             write (" Furnace ("..tostring(useFurnace)..")  ")
  354.         end
  355.         if selection == 6 then          -- Powered Furnace (toggle)
  356.             term.setCursorPos (14, 8)
  357.             write ("*Powered Furnace ("..tostring(poweredFurnace)..") ")
  358.             if keypress == 32 then
  359.                 if poweredFurnace == false then
  360.                     poweredFurnace = true
  361.                 else
  362.                     poweredFurnace = false
  363.                 end
  364.                 term.setCursorPos (14, 8)
  365.                 write ("*Powered Furnace ("..tostring(poweredFurnace)..") ")
  366.             end
  367.         else
  368.             term.setCursorPos (14, 8)
  369.             write (" Powered Furnace ("..tostring(poweredFurnace)..") ")
  370.         end    
  371.         if selection == 7 then          -- Sapling Chest (toggle)
  372.             term.setCursorPos (14, 9)
  373.             write ("*Sapling Chest ("..tostring(getSaplings)..") ")
  374.             if keypress == 32 then
  375.                 if getSaplings == false then
  376.                     getSaplings = true
  377.                 else
  378.                     getSaplings = false
  379.                 end
  380.                 term.setCursorPos (14, 9)
  381.                 write ("*Sapling Chest ("..tostring(getSaplings)..") ")
  382.             end
  383.         else
  384.             term.setCursorPos (14, 9)
  385.             write (" Sapling Chest ("..tostring(getSaplings)..")  ")
  386.         end
  387.         if selection == 8 then          -- Output Chest (toggle)
  388.             term.setCursorPos (14, 10)
  389.             write ("*Output Chest ("..tostring(dumpStuff)..") ")
  390.             if keypress == 32 then
  391.                 if dumpStuff == false then
  392.                     dumpStuff = true
  393.                 else
  394.                     dumpStuff = false
  395.                 end
  396.                 term.setCursorPos (14, 10)
  397.                 write ("*Output Chest ("..tostring(dumpStuff)..") ")
  398.             end
  399.         else
  400.             term.setCursorPos (14, 10)
  401.             write (" Output Chest ("..tostring(dumpStuff)..")  ")
  402.         end
  403.         if selection == 9 then          -- Quit Program
  404.             term.setCursorPos (14, 11)
  405.             write ("*Quit Program ")
  406.             if keypress == 32 then
  407.                 gotosettings = false
  408.                 term.clear()
  409.                 saveSettings()
  410.                 term.clear()
  411.                 running = false
  412.                 term.clear()
  413.                 term.setCursorPos (1, 1)
  414.                 return
  415.             end
  416.         else
  417.             term.setCursorPos (14, 11)
  418.             write (" Quit Program ")
  419.         end
  420.         --------------------controls-----------------------
  421.         keypress = 0
  422.         sleep (0.2)
  423.         event, keypress = os.pullEvent("key")
  424.         if keypress == 17 then          -- w key or UP on the menu
  425.             selection = selection - 1
  426.             if selection < 1 then
  427.                 selection = 9
  428.             end
  429.         elseif keypress == 31 then      -- s key or DOWN on the menu
  430.             selection = selection + 1
  431.             if selection > 9 then
  432.                 selection = 1
  433.             end
  434.         elseif keypress == 30 then      -- a key or Back on the menu
  435.             gotosettings = false
  436.             term.clear()
  437.             graphics()
  438.             saveSettings()
  439.             loadSettings()
  440.             sleep(1)
  441.             return
  442.         end
  443.     end
  444. end
  445.  
  446. function changeName() -- Change the turtles name (whatsMyName)
  447.     term.clear()
  448.     box()
  449.     term.setCursorPos (15, 1)
  450.     write ("Turtle Name")
  451.     term.setCursorPos (5, 3)
  452.     write ("My name is "..os.getComputerLabel())
  453.     term.setCursorPos (5, 5)
  454.     write ("Would you like to change it? y/n")
  455.     sleep(0.3)
  456.     while true do
  457.         keypress = 0
  458.         event, keypress = os.pullEvent("key")
  459.         if keypress == 49 then
  460.             settings()
  461.             break
  462.         elseif keypress == 21 then
  463.             term.setCursorPos (5, 5)
  464.             write ("What is my new name?            ")
  465.             term.setCursorPos (5, 6)
  466.             sleep(0.3)
  467.             whatsMyName = read ()
  468.             os.setComputerLabel(whatsMyName)
  469.             sleep(1.5)
  470.             settings()
  471.             break
  472.         elseif keypress == 30 then
  473.             settings()
  474.             break
  475.         end
  476.     end
  477. end
  478.    
  479. function changeSlots() -- Slots for dirt, log, sapling 1 and 2, fuel 1 and 2
  480.     term.clear()
  481.     box()
  482.     term.setCursorPos (15, 1)
  483.     write ("Change Slots")
  484.     term.setCursorPos (1, 13)
  485.     write ("O---a=back, d=select, w=up, s=down ---O")
  486.     selection = 1
  487.     keypress = 0
  488.     while true do
  489.         term.setCursorPos (15, 3)
  490.        
  491.         if selection == 1 then                  -- dirtSlot
  492.             write ("*Dirt: "..dirtSlot)
  493.             turtle.select(dirtSlot)
  494.             if keypress == 32 then
  495.                 term.setCursorPos (10, 9)
  496.                 write ("Type new Dirt slot: ")
  497.                 sleep(0.1)
  498.                 newlong = read ()
  499.                 liltest = tonumber ( newlong )
  500.                 if type( liltest ) ~= "number" then
  501.                     term.setCursorPos (10, 10)
  502.                     write ("I was expecting a number")
  503.                     sleep(1.5)
  504.                     term.setCursorPos (10, 10)
  505.                     write ("                        ")
  506.                 else
  507.                     dirtSlot = tonumber(newlong)
  508.                     changeSlots()
  509.                     return
  510.                 end
  511.                 term.setCursorPos (10, 9)
  512.                 write ("                        ")
  513.             end
  514.         else
  515.             write (" Dirt: "..dirtSlot)
  516.         end
  517.         term.setCursorPos (15, 4)
  518.        
  519.         if selection == 2 then                  -- logSlot
  520.             write ("*Log: "..logSlot)
  521.             turtle.select(logSlot)
  522.             if keypress == 32 then
  523.                 term.setCursorPos (10, 9)
  524.                 write ("Type new Log Slot: ")
  525.                 sleep(0.1)
  526.                 newwide = read ()
  527.                 liltest = tonumber ( newwide )
  528.                 if type( liltest ) ~= "number" then
  529.                     term.setCursorPos (10, 10)
  530.                     write ("I was expecting a number")
  531.                     sleep(1.5)
  532.                     term.setCursorPos (10, 10)
  533.                     write ("                        ")
  534.                 else
  535.                     logSlot = tonumber(newwide)
  536.                     changeSlots()
  537.                     return
  538.                 end
  539.                 term.setCursorPos (10, 9)
  540.                 write ("                        ")
  541.             end
  542.         else
  543.             write (" Log: "..logSlot)
  544.         end
  545.         term.setCursorPos (15, 5)
  546.        
  547.         if selection == 3 then                  -- saplingSlot1
  548.             write ("*Sapling 1: "..saplingSlot1)
  549.             turtle.select(saplingSlot1)
  550.             if keypress == 32 then
  551.                 term.setCursorPos (10, 9)
  552.                 write ("Type new Sapling 1 slot: ")
  553.                 sleep(0.1)
  554.                 newgap = read ()
  555.                 liltest = tonumber ( newgap )
  556.                 if type( liltest ) ~= "number" then
  557.                     term.setCursorPos (10, 10)
  558.                     write ("I was expecting a number")
  559.                     sleep(1.5)
  560.                     term.setCursorPos (10, 10)
  561.                     write ("                        ")
  562.                 else
  563.                     saplingSlot1 = tonumber(newgap)
  564.                     changeSlots()
  565.                     return
  566.                 end
  567.             term.setCursorPos (10, 9)
  568.             write ("                        ")
  569.             end
  570.         else
  571.             write (" Sapling 1: "..saplingSlot1)
  572.         end
  573.         term.setCursorPos (15, 6)
  574.        
  575.         if selection == 4 then                  -- saplingSlot2
  576.             write ("*Sapling 2: "..saplingSlot2)
  577.             turtle.select(saplingSlot2)
  578.             if keypress == 32 then
  579.                 term.setCursorPos (10, 9)
  580.                 write ("Type new Sapling 2 slot: ")
  581.                 sleep(0.1)
  582.                 newgap = read ()
  583.                 liltest = tonumber ( newgap )
  584.                 if type( liltest ) ~= "number" then
  585.                     term.setCursorPos (10, 10)
  586.                     write ("I was expecting a number")
  587.                     sleep(1.5)
  588.                     term.setCursorPos (10, 10)
  589.                     write ("                        ")
  590.                 else
  591.                     saplingSlot2 = tonumber(newgap)
  592.                     changeSlots()
  593.                     return
  594.                 end
  595.             term.setCursorPos (10, 9)
  596.             write ("                        ")
  597.             end
  598.         else
  599.             write (" Sapling 2: "..saplingSlot2)
  600.         end
  601.         term.setCursorPos (15, 7)
  602.        
  603.         if selection == 5 then                  -- fuelSlot1
  604.             write ("*Fuel 1: "..fuelSlot1)
  605.             turtle.select(fuelSlot1)
  606.             if keypress == 32 then
  607.                 term.setCursorPos (10, 9)
  608.                 write ("Type new Fuel 1 slot: ")
  609.                 sleep(0.1)
  610.                 newgap = read ()
  611.                 liltest = tonumber ( newgap )
  612.                 if type( liltest ) ~= "number" then
  613.                     term.setCursorPos (10, 10)
  614.                     write ("I was expecting a number")
  615.                     sleep(1.5)
  616.                     term.setCursorPos (10, 10)
  617.                     write ("                        ")
  618.                 else
  619.                     fuelSlot1 = tonumber(newgap)
  620.                     changeSlots()
  621.                     return
  622.                 end
  623.             term.setCursorPos (10, 9)
  624.             write ("                        ")
  625.             end
  626.         else
  627.             write (" Fuel 1: "..fuelSlot1)
  628.         end
  629.         term.setCursorPos (15, 8)
  630.        
  631.         if selection == 6 then                  ---- fuelSlot2
  632.             write ("*Fuel 2: "..fuelSlot2)
  633.             turtle.select(fuelSlot2)
  634.             if keypress == 32 then
  635.                 term.setCursorPos (10, 9)
  636.                 write ("Type new Sapling 2 slot: ")
  637.                 sleep(0.1)
  638.                 newgap = read ()
  639.                 liltest = tonumber ( newgap )
  640.                 if type( liltest ) ~= "number" then
  641.                     term.setCursorPos (10, 10)
  642.                     write ("I was expecting a number")
  643.                     sleep(1.5)
  644.                     term.setCursorPos (10, 10)
  645.                     write ("                        ")
  646.                 else
  647.                     fuelSlot2 = tonumber(newgap)
  648.                     changeSlots()
  649.                     return
  650.                 end
  651.             term.setCursorPos (10, 9)
  652.             write ("                        ")
  653.             end
  654.         else
  655.             write (" Fuel 2: "..fuelSlot2)
  656.         end
  657.        
  658.         -- listen for keyboard input
  659.         sleep(0.3)
  660.         keypress = 0
  661.         event, keypress = os.pullEvent("key")
  662.         if keypress == 17 then
  663.             selection = selection - 1
  664.             if selection < 1 then
  665.                 selection = 6
  666.             end
  667.         elseif keypress == 31 then
  668.             selection = selection + 1
  669.             if selection > 6 then
  670.                 selection = 1
  671.             end
  672.         elseif keypress == 30 then
  673.             settings()
  674.             return
  675.         end
  676.         term.setCursorPos (15, 8)
  677.         write ("                      ")
  678.     end
  679. end
  680.        
  681. function changeSleepTime() -- Change how long the turtle waits (sleepTime)
  682.     term.clear()
  683.     box()
  684.     term.setCursorPos (15, 1)
  685.     write ("Sleep Time")
  686.     term.setCursorPos (3, 3)
  687.     write ("I will currently sleep "..sleepTime.." seconds.")
  688.     term.setCursorPos (3, 5)
  689.     write ("Would you like to change that? y/n")
  690.     sleep(0.3)
  691.     while true do
  692.         keypress = 0
  693.         event, keypress = os.pullEvent("key")
  694.         if keypress == 49 then
  695.             settings()
  696.             break
  697.         elseif keypress == 21 then
  698.             term.setCursorPos (3, 5)
  699.             write ("How long should I sleep?          ")
  700.             term.setCursorPos (3, 6)
  701.             sleep(0.3)
  702.             newTime = read ()
  703.             liltest = tonumber ( newTime )
  704.             if type( liltest ) ~= "number" then
  705.                 term.setCursorPos (15, 10)
  706.                 write ("I was expecting a number")
  707.                 sleep(1.5)
  708.                 term.setCursorPos (15, 10)
  709.                 write ("                        ")
  710.                 changeSleepTime()
  711.                 return
  712.             else
  713.                 sleepTime = tonumber(newTime)
  714.             end
  715.             sleep(1.5)
  716.             settings()
  717.             break
  718.         elseif keypress == 30 then
  719.             settings()
  720.             break
  721.         end
  722.     end
  723. end
  724.  
  725. function farmLayout() -- Change the layout for the farm
  726.     -- graphical setup
  727.     term.clear()
  728.     box()
  729.     line(13)
  730.     selection = 1
  731.     keypress = 0
  732.     -- show demonstration
  733.     term.setCursorPos (15, 1)
  734.     write ("Farm Layout")
  735.     term.setCursorPos (1, 13)
  736.     write ("O---a=back, d=select, w=up, s=down ---O")
  737.     term.setCursorPos (4, 3)   
  738.     write ("Width")
  739.     term.setCursorPos (3, 4)
  740.     write ("T  T  T")
  741.     term.setCursorPos (3, 5)   
  742.     write ("T  T  T") -- last char is on 10, 4
  743.     term.setCursorPos (3, 6)   
  744.     write ("T  T  T")
  745.     term.setCursorPos (3, 7)   
  746.     write ("T  T  T")
  747.     term.setCursorPos (3, 8)   
  748.     write ("T  T  T")
  749.     term.setCursorPos (3, 9)   
  750.     write ("@")
  751.     term.setCursorPos (3, 10)  
  752.     write ("^ Turtle")
  753.     term.setCursorPos (3, 11)  
  754.     write ("| facing")
  755.     term.setCursorPos (3, 12)  
  756.     write ("| Up")
  757.     -- write the word length vertically
  758.     term.setCursorPos (11, 3)
  759.     write ("L")
  760.     term.setCursorPos (11, 4)
  761.     write ("e")
  762.     term.setCursorPos (11, 5)
  763.     write ("n")
  764.     term.setCursorPos (11, 6)
  765.     write ("g")
  766.     term.setCursorPos (11, 7)
  767.     write ("t")
  768.     term.setCursorPos (11, 8)
  769.     write ("h")
  770.  
  771.     while true do
  772.         term.setCursorPos (15, 3)
  773.        
  774.         if selection == 1 then                  -- long
  775.             write ("*Length: "..long)
  776.             term.setCursorPos (15, 8)
  777.             write ("Number of trees long")
  778.             if keypress == 32 then
  779.                 term.setCursorPos (15, 9)
  780.                 write ("Type new Length: ")
  781.                 sleep(0.4)
  782.                 newlong = read ()
  783.                 liltest = tonumber ( newlong )
  784.                 if type( liltest ) ~= "number" then
  785.                     term.setCursorPos (15, 10)
  786.                     write ("I was expecting a number")
  787.                     sleep(1.5)
  788.                     term.setCursorPos (15, 10)
  789.                     write ("                        ")
  790.                 elseif liltest > 0 then
  791.                     long = tonumber(newlong)
  792.                     firstRun = true
  793.                     farmLayout()
  794.                     return
  795.                 elseif liltest == 0 then
  796.                     term.setCursorPos (15, 10)
  797.                     write ("Must be more than Zero")
  798.                     sleep(1.5)
  799.                     farmLayout()
  800.                     return
  801.                 end
  802.                 term.setCursorPos (15, 10)
  803.                 write ("                        ")
  804.             end
  805.         else
  806.             write (" Length: "..long)
  807.         end
  808.  
  809.         term.setCursorPos (15, 4)
  810.        
  811.         if selection == 2 then                  -- wide
  812.             write ("*Width: "..wide)
  813.             term.setCursorPos (15, 8)
  814.             write ("Number of trees wide")
  815.             if keypress == 32 then
  816.                 term.setCursorPos (15, 9)
  817.                 write ("Type new Width: ")
  818.                 sleep(0.4)
  819.                 newwide = read ()
  820.                 liltest = tonumber ( newwide )
  821.                 if type( liltest ) ~= "number" then
  822.                     term.setCursorPos (15, 10)
  823.                     write ("I was expecting a number")
  824.                     sleep(1.5)
  825.                     term.setCursorPos (15, 10)
  826.                     write ("                        ")
  827.                 elseif liltest > 0 then
  828.                     wide = tonumber(newwide)
  829.                     firstRun = true
  830.                     farmLayout()
  831.                     return
  832.                 elseif liltest == 0 then
  833.                     term.setCursorPos (15, 10)
  834.                     write ("Must be more than Zero")
  835.                     sleep(1.5)
  836.                     farmLayout()
  837.                     return
  838.                 end
  839.                 term.setCursorPos (15, 9)
  840.                 write ("                        ")
  841.             end
  842.         else
  843.             write (" Width: "..wide)
  844.         end
  845.  
  846.         term.setCursorPos (15, 5)
  847.        
  848.         if selection == 3 then                  -- saplingGap/Tree Gap
  849.             write ("*Tree Gap: "..saplingGap)
  850.             term.setCursorPos (15, 8)
  851.             write ("Blocks between Trees")
  852.             if keypress == 32 then
  853.                 term.setCursorPos (15, 9)
  854.                 write ("Type new Gap size: ")
  855.                 sleep(0.4)
  856.                 newgap = read ()
  857.                 liltest = tonumber ( newgap )
  858.                 if type( liltest ) ~= "number" then
  859.                     term.setCursorPos (15, 10)
  860.                     write ("I was expecting a number")
  861.                     sleep(1.5)
  862.                     term.setCursorPos (15, 10)
  863.                     write ("                        ")
  864.                 else
  865.                     saplingGap = tonumber(newgap)
  866.                     farmLayout()
  867.                     return
  868.                 end
  869.             term.setCursorPos (15, 9)
  870.             write ("                        ")
  871.             end
  872.         else
  873.             write (" Tree Gap: "..saplingGap)
  874.         end
  875.         term.setCursorPos (15, 6)
  876.        
  877.         if selection == 4 then                  -- wallGap/ Turtle Gap
  878.             write ("*Turtle Gap: "..wallGap)
  879.             term.setCursorPos (15, 8)
  880.             write ("Distance to First tree")
  881.             if keypress == 32 then
  882.                 term.setCursorPos (15, 9)
  883.                 write ("Type new Gap size: ")
  884.                 sleep(0.1)
  885.                 newgap = read ()
  886.                 liltest = tonumber ( newgap )
  887.                 if type( liltest ) ~= "number" then
  888.                     term.setCursorPos (15, 10)
  889.                     write ("I was expecting a number")
  890.                     sleep(1.5)
  891.                     term.setCursorPos (15, 10)
  892.                     write ("                        ")
  893.                 elseif liltest > 0 then
  894.                     wallGap = tonumber(newgap)
  895.                     farmLayout()
  896.                     return
  897.                 elseif liltest == 0 then
  898.                     term.setCursorPos (15, 10)
  899.                     write ("Must be more than Zero")
  900.                     sleep(1.5)
  901.                     farmLayout()
  902.                     return
  903.                 end
  904.             term.setCursorPos (15, 9)
  905.             write ("                        ")
  906.             end
  907.         else
  908.             write (" Turtle Gap: "..wallGap)
  909.         end
  910.         -- rowOffset
  911.         term.setCursorPos (15, 7)
  912.        
  913.         if selection == 5 then                  -- rowOffset
  914.             write ("*Row Offset: "..rowOffset)
  915.             term.setCursorPos (15, 8)
  916.             write ("Move first row")
  917.             term.setCursorPos (15, 9)
  918.             write ("left with positive num")
  919.             term.setCursorPos (15, 10)
  920.             write ("right with negative num")
  921.             if keypress == 32 then
  922.                 term.setCursorPos (15, 11)
  923.                 write ("Type new Row Offset: ")
  924.                 sleep(0.1)
  925.                 newgap = read ()
  926.                 liltest = tonumber ( newgap )
  927.                 if type( liltest ) ~= "number" then
  928.                     term.setCursorPos (15, 10)
  929.                     write ("I was expecting a number")
  930.                     sleep(1.5)
  931.                     term.setCursorPos (15, 10)
  932.                     write ("                        ")
  933.                 else
  934.                     rowOffset = tonumber(newgap)
  935.                     farmLayout()
  936.                     return
  937.                 end
  938.             term.setCursorPos (15, 11)
  939.             write ("                        ")
  940.             end
  941.         else
  942.             write (" Row Offset: "..rowOffset)
  943.         end
  944.        
  945.         -- listen for keyboard input
  946.         sleep(0.4)
  947.         keypress = 0
  948.         event, keypress = os.pullEvent("key")
  949.         if keypress == 17 then
  950.             selection = selection - 1
  951.             if selection < 1 then
  952.                 selection = 5
  953.             end
  954.         elseif keypress == 31 then
  955.             selection = selection + 1
  956.             if selection > 5 then
  957.                 selection = 1
  958.             end
  959.         elseif keypress == 30 then
  960.             sleepTime = baseTime - ((long * wide) * 5)
  961.             if sleepTime < 60 then
  962.                 sleepTime = 60
  963.             end
  964.             settings()
  965.             return
  966.         end
  967.         term.setCursorPos (15, 8)
  968.         write ("                      ")
  969.         term.setCursorPos (15, 9)
  970.         write ("                      ")
  971.         term.setCursorPos (15, 10)
  972.         write ("                      ")
  973.     end
  974. end
  975.  
  976. function startup() -- Get inital lengh and width on first startup
  977.     term.clear()
  978.     term.setCursorPos (1, 1)
  979.     print ("")
  980.     print ("W I D E")
  981.     print ("T  T  T  L")
  982.     print ("T  T  T  O")
  983.     print ("T  T  T  N")
  984.     print ("T  T  T  G")
  985.     print ("@  <-- Turtle facing Up")
  986.     print ("")
  987.     print ("How many trees Long?")
  988.     long = read ()
  989.     liltesta = tonumber ( long )
  990.     if type( liltesta ) ~= "number" then
  991.         print ("I was expecting a number...")
  992.         print ("Lets try that again.")
  993.         sleep(2)
  994.         startup()
  995.         return
  996.     end
  997.     print ("How many trees Wide?")
  998.     wide = read ()
  999.     liltestb = tonumber ( wide )
  1000.     if type( liltestb ) ~= "number" then
  1001.         print ("I was expecting a number...")
  1002.         print ("Lets try that again.")
  1003.         sleep(2)
  1004.         startup()
  1005.         return
  1006.     end
  1007.     sleep (1)
  1008.     if liltesta == 0 then long = 1 end
  1009.     if liltestb == 0 then wide = 1 end
  1010.     while ((wide + long) * saplingGap) > minFuel do
  1011.         minFuel = minFuel + 50
  1012.     end
  1013.     sleepTime = baseTime - ((long * wide) * 5)
  1014.     if sleepTime < 60 then
  1015.         sleepTime = 60
  1016.     end
  1017. end
  1018.  
  1019. -- SECTION: Graphics ------------------------------------------------------------------------------
  1020.  
  1021. function box() -- 39x12 box used in some menus
  1022.     term.setCursorPos (1, 1)
  1023.     write ("O-------------------------------------O")
  1024.     for i = 2, 12 do
  1025.         term.setCursorPos (1, i)
  1026.         clearLine()
  1027.     end
  1028.     term.setCursorPos (1, 13)
  1029.     write ("O-------------------------------------O")
  1030. end
  1031.  
  1032. function line(char) -- 12 long vertical line used in some menus
  1033.     for i = 2, 12 do
  1034.         term.setCursorPos (char, i)
  1035.         write ("|")
  1036.     end
  1037. end
  1038.  
  1039. function totals() -- updates the totals on main GUI
  1040.     term.setCursorPos (3, 6)
  1041.     write ("Tree Total: "..treeTotal)
  1042.     term.setCursorPos (24, 6)
  1043.     write ("Fuel "..turtle.getFuelLevel().."/" ..minFuel.." ")
  1044.     term.setCursorPos (5, 7)
  1045.     write ("Charcoal: "..charcoalMade)
  1046.     term.setCursorPos (5, 8)
  1047.     write ("Saplings: "..saplingsPlanted)
  1048.     term.setCursorPos (24, 8)
  1049.     write ("Farm: "..long.."x"..wide)
  1050. end
  1051.  
  1052. function graphics() -- displays graphics for main GUI, not run often
  1053.     term.setCursorPos (1, 1)
  1054.     write ("O----(^u^)----------------------------O")
  1055.     mylable = os.getComputerLabel()
  1056.     term.setCursorPos (15, 1)
  1057.     write (mylable)
  1058.     term.setCursorPos (1, 2)
  1059.     write ("|")
  1060.     term.setCursorPos (39, 2)
  1061.     write ("|")
  1062.     term.setCursorPos (1, 3)
  1063.     write ("|")
  1064.     term.setCursorPos (39, 3)
  1065.     write ("|")
  1066.     term.setCursorPos (1, 4)
  1067.     write ("|")
  1068.     term.setCursorPos (39, 4)
  1069.     write ("|")
  1070.     term.setCursorPos (1, 5)
  1071.     write ("O--------------------O----------------O")
  1072.     term.setCursorPos (1, 6)
  1073.     write ("|")
  1074.     term.setCursorPos (22, 6)
  1075.     write ("|")
  1076.     term.setCursorPos (39, 6)
  1077.     write ("|")
  1078.     term.setCursorPos (1, 7)
  1079.     write ("|")
  1080.     term.setCursorPos (22, 7)
  1081.     write ("O----------------O")
  1082.     term.setCursorPos (1, 8)
  1083.     write ("|")
  1084.     term.setCursorPos (22, 8)
  1085.     write ("|")
  1086.     term.setCursorPos (39, 8)
  1087.     write ("|")
  1088.     term.setCursorPos (1, 9)
  1089.     write ("O--------------------O----------------O")
  1090.     if useFurnace == true then
  1091.         term.setCursorPos (12, 11)
  1092.         write ("Furnace Above Me")
  1093.     end
  1094.     if getSaplings == true then
  1095.         term.setCursorPos (3, 12)
  1096.         write ("<--Sapling Chest")
  1097.     end
  1098.     if dumpStuff == true then
  1099.         term.setCursorPos (22, 12)
  1100.         write ("Dropoff Chest-->")
  1101.     end
  1102.     if useFurnace == true or getSaplings == true or dumpStuff == true then
  1103.         term.setCursorPos (14, 10)
  1104.         write ("Configuration")
  1105.         term.setCursorPos (17, 13)
  1106.         write ("My Back")
  1107.     end
  1108.     totals()
  1109. end
  1110.  
  1111. function clearLine() -- used to clear a line at the previously set cursor postion
  1112.     local x, y = term.getCursorPos()
  1113.     write ("|                                     |")
  1114.     term.setCursorPos (1, y)
  1115. end
  1116.  
  1117. -- SECTION: Movement ------------------------------------------------------------------------------
  1118.  
  1119. function forward(value) -- moves a quantity of blocks forward even with obstructions
  1120.     for i = 1, value do
  1121.         if turtle.detect() == true then
  1122.             turtle.dig()
  1123.         end
  1124.         if facing == 1 then -- Cordinates code for movement x, z
  1125.             cordsx = cordsx + 1
  1126.         elseif facing == 2 then
  1127.             cordsz = cordsz + 1
  1128.         elseif facing == 3 then
  1129.             cordsx = cordsx - 1
  1130.         elseif facing == 4 then
  1131.             cordsz = cordsz - 1
  1132.         end
  1133.         saveCords()
  1134.         local movement = false
  1135.         while not movement do
  1136.             movement = turtle.forward ()
  1137.             if not movement and turtle.detect () then
  1138.                 turtle.dig ()
  1139.             end
  1140.         end
  1141.     end
  1142. end
  1143.  
  1144. function up(value) -- moves up
  1145.     for i = 1, value do
  1146.         cordsy = cordsy + 1 -- cords code for y up
  1147.         saveCords()
  1148.         local movement = false
  1149.         while not movement do
  1150.             movement = turtle.up ()
  1151.             if not movement and turtle.detectUp () then
  1152.                 turtle.digUp ()
  1153.             end
  1154.         end
  1155.     end
  1156. end
  1157.  
  1158. function down (value) -- moves down
  1159.     for i = 1, value do
  1160.         cordsy = cordsy - 1
  1161.         saveCords()
  1162.         movement = false
  1163.         while not movement do
  1164.             movement = turtle.down ()
  1165.             if not movement and turtle.detectDown () then
  1166.                 turtle.digDown ()
  1167.             end
  1168.         end
  1169.     end
  1170. end
  1171.  
  1172. function turn(way) -- easier turning
  1173.     if way == "left" then               -- faces left
  1174.         facing = facing - 1
  1175.         if facing < 1 then
  1176.             facing = 4
  1177.         end
  1178.         saveCords()
  1179.         turtle.turnLeft()
  1180.     elseif way == "right" then          -- faces right
  1181.         facing = facing + 1
  1182.         if facing > 4 then
  1183.             facing = 1
  1184.         end
  1185.         saveCords()
  1186.         turtle.turnRight()
  1187.     elseif way == "back" then           -- turnes around
  1188.         facing = facing + 1
  1189.         if facing > 4 then
  1190.             facing = 1
  1191.         end
  1192.         saveCords()
  1193.         turtle.turnRight()
  1194.         facing = facing + 1
  1195.         if facing > 4 then
  1196.             facing = 1
  1197.         end
  1198.         saveCords()
  1199.         turtle.turnRight()
  1200.         end
  1201. end
  1202.  
  1203. -- SECTION: Resource Checking ---------------------------------------------------------------------
  1204.  
  1205. local function saplingTotal() -- returns curent total of saplings
  1206.     if running == false then return end
  1207.     if saplingSlot1 ~= saplingSlot2 then
  1208.         sTotal1 = turtle.getItemCount(saplingSlot1)
  1209.         sTotal2 = turtle.getItemCount(saplingSlot2)
  1210.         return sTotal1 + sTotal2
  1211.     else
  1212.         return turtle.getItemCount(saplingSlot1) + 1
  1213.     end
  1214. end
  1215.  
  1216. function saplings() -- ensures the turtle has enough saplings for a logging run + 1
  1217.     if running == false then return end
  1218.     imdone = false
  1219.     term.setCursorPos (1, 4)
  1220.     clearLine()
  1221.     term.setCursorPos (1, 3)
  1222.     clearLine()
  1223.     term.setCursorPos (1, 2)
  1224.     clearLine()
  1225.     sapNeed = saplingTotal()
  1226.     while sapNeed-1 < (long * wide) do
  1227.         turtle.select(saplingSlot1)
  1228.         term.setCursorPos(1, 2)
  1229.         write ("| Put saplings in slot "..saplingSlot1..". Extras ")
  1230.         term.setCursorPos (1, 3)
  1231.         write ("| go into the Left chest and slot "..saplingSlot2..".")
  1232.         term.setCursorPos (1, 4)
  1233.         write ("| "..(1+(long*wide)-sapNeed).." more saplings needed...")
  1234.         sleep (0.5)
  1235.         sapNeed = saplingTotal()
  1236.     end
  1237.     imdone = true
  1238. end
  1239.  
  1240. function dirt() -- ensure the turtle has enough dirt
  1241.     if running == false then return end
  1242.     imdone = false
  1243.     term.setCursorPos (1, 4)
  1244.     clearLine()
  1245.     term.setCursorPos (1, 3)
  1246.     clearLine()
  1247.     term.setCursorPos (1, 2)
  1248.     clearLine()
  1249.     if firstRun == true then
  1250.         if (long * wide) + 1 < 64 then
  1251.             while turtle.getItemCount(dirtSlot) < (long * wide) + 1 do
  1252.                 term.setCursorPos(1, 2)
  1253.                 turtle.select(dirtSlot)
  1254.                 write ("| Please put dirt in slot "..dirtSlot)
  1255.                 dirtplox = (long*wide) - turtle.getItemCount(dirtSlot) + 1
  1256.                 term.setCursorPos(1, 3)
  1257.                 write ("| "..dirtplox.." dirt needed...")
  1258.                 term.setCursorPos (1, 4)
  1259.                 write ("| Press any key to change settings.")
  1260.                 sleep (0.5)
  1261.             end
  1262.         else
  1263.             while turtle.getItemCount(dirtSlot) < 64 do
  1264.                 omgDirt = 1 +(long * wide) - 63
  1265.                 term.setCursorPos(1, 2)
  1266.                 turtle.select(dirtSlot)
  1267.                 write ("| Please put 64 dirt in slot "..dirtSlot)
  1268.                 dirtplox = (long*wide) - turtle.getItemCount(dirtSlot) + 1
  1269.                 term.setCursorPos(1, 3)
  1270.                 write ("| "..omgDirt.." dirt will be needed next run")
  1271.                 term.setCursorPos (1, 4)
  1272.                 write ("| Press any key to change settings.")
  1273.                 sleep (0.5)
  1274.             end
  1275.         end
  1276.     else
  1277.         if (long * wide) + 1 < 64 then
  1278.             while turtle.getItemCount(dirtSlot) < 1 do
  1279.                 term.setCursorPos(1, 2)
  1280.                 turtle.select(dirtSlot)
  1281.                 write ("| Please put dirt in slot "..dirtSlot)
  1282.                 term.setCursorPos(1, 3)
  1283.                 write ("| 1 dirt needed...")
  1284.                 term.setCursorPos (1, 4)
  1285.                 write ("| Press any key to change settings.")
  1286.                 sleep (0.5)
  1287.             end
  1288.         else
  1289.             if omgDirt == 0 then
  1290.                 while turtle.getItemCount(dirtSlot) < 1 do
  1291.                     term.setCursorPos(1, 2)
  1292.                     turtle.select(dirtSlot)
  1293.                     write ("| Please put dirt in slot "..dirtSlot)
  1294.                     term.setCursorPos(1, 3)
  1295.                     write ("| 1 dirt needed...")
  1296.                     term.setCursorPos (1, 4)
  1297.                     write ("| Press any key to change settings.")
  1298.                     sleep (0.5)
  1299.                 end
  1300.             elseif omgDirt > 0 then
  1301.                 if omgDirt > 64 then
  1302.                     while turtle.getItemCount(dirtSlot) < 64 do -- 64 +
  1303.                         omgDirt = omgDirt - 63
  1304.                         term.setCursorPos(1, 2)
  1305.                         turtle.select(dirtSlot)
  1306.                         write ("| Please put 64 dirt in slot "..dirtSlot)
  1307.                         dirtplox = (long*wide) - turtle.getItemCount(dirtSlot) + 1
  1308.                         term.setCursorPos(1, 3)
  1309.                         write ("| "..omgDirt.." dirt will be needed next run")
  1310.                         term.setCursorPos (1, 4)
  1311.                         write ("| Press any key to change settings.")
  1312.                         sleep (0.5)
  1313.                     end
  1314.                 else
  1315.                     while turtle.getItemCount(dirtSlot) < omgDirt do -- 64 or less
  1316.                         term.setCursorPos(1, 2)
  1317.                         turtle.select(dirtSlot)
  1318.                         write ("| Please put "..omgDirt.." dirt in slot "..dirtSlot)
  1319.                         dirtplox = (long*wide) - turtle.getItemCount(dirtSlot) + 1
  1320.                         term.setCursorPos(1, 3)
  1321.                         write ("| No more dirt will be needed next run")
  1322.                         term.setCursorPos (1, 4)
  1323.                         write ("| Press any key to change settings.")
  1324.                         sleep (0.5)
  1325.                     end
  1326.                     omgDirt = 0
  1327.                 end
  1328.             end
  1329.         end
  1330.     end
  1331.     imdone = true
  1332. end
  1333.  
  1334. function someFuel() -- ensure the turtle has fuel before leaving home
  1335.     if running == false then return end
  1336.     imdone = false
  1337.     if fuelOn == true then
  1338.         treeNumbers = ((wide * long) / 5) + 1
  1339.         fuelCheck = turtle.getItemCount(fuelSlot1) + turtle.getItemCount(fuelSlot2)
  1340.         while fuelCheck < (treeNumbers + charcoalNumber) do
  1341.             term.setCursorPos (1, 4)
  1342.             clearLine()
  1343.             term.setCursorPos (1, 3)
  1344.             clearLine()
  1345.             term.setCursorPos (1, 2)
  1346.             clearLine()
  1347.             write ("| Please put more fuel in slot "..fuelSlot1.." or "..fuelSlot2)
  1348.             term.setCursorPos (1, 3)
  1349.             write ("| I need at least "..(treeNumbers + charcoalNumber).." fuel before")
  1350.             term.setCursorPos (1, 4)
  1351.             write ("| I can go logging!")
  1352.             turtle.select(fuelSlot1)
  1353.             sleep(1)
  1354.             fuelCheck = turtle.getItemCount(fuelSlot1) + turtle.getItemCount(fuelSlot2)
  1355.         end
  1356.     end
  1357.     imdone = true
  1358. end
  1359.  
  1360. function refillSaplings() -- get saplings from sapling chest
  1361.     if running == false then return end
  1362.     if getSaplings == true then
  1363.         term.setCursorPos (1, 4)
  1364.         clearLine()
  1365.         term.setCursorPos (1, 3)
  1366.         clearLine()
  1367.         term.setCursorPos (1, 2)
  1368.         clearLine()
  1369.         write ("| Refilling Saplings")
  1370.         turn("left")
  1371.         checkfuelSlot2 = turtle.getItemCount(fuelSlot2)
  1372.         turtle.select(saplingSlot1)
  1373.         turtle.suck()
  1374.         turtle.select(saplingSlot2)
  1375.         turtle.suck()
  1376.         if not turtle.compareTo(saplingSlot1) then
  1377.             for cnt = 1, 16 do
  1378.                 if cnt ~= logSlot then
  1379.                     if cnt ~= fuelSlot1 then
  1380.                         if cnt ~= fuelSlot2 then
  1381.                             if cnt ~= saplingSlot1 then
  1382.                                 if cnt ~= saplingSlot2 then
  1383.                                     if cnt ~= dirtSlot then
  1384.                                         turtle.transferTo(cnt, 64)
  1385.                                     end
  1386.                                 end
  1387.                             end
  1388.                         end
  1389.                     end
  1390.                 end
  1391.             end
  1392.         end
  1393.         for cnt=1, 16 do -- picked up too many? put them back!
  1394.             if cnt ~= saplingSlot1 then
  1395.                 if cnt ~= saplingSlot2 then
  1396.                     if turtle.getItemCount(cnt) > 0 then
  1397.                         turtle.select(cnt)
  1398.                         if turtle.compareTo(saplingSlot1) then 
  1399.                             turtle.drop()  
  1400.                         end
  1401.                     end
  1402.                 end
  1403.             end
  1404.         end
  1405.         if checkfuelSlot2 < turtle.getItemCount(fuelSlot2) then
  1406.             turtle.select(fuelSlot2)
  1407.             for cnt = 1, 16 do
  1408.                 if cnt ~= logSlot then
  1409.                     if cnt ~= fuelSlot1 then
  1410.                         if cnt ~= fuelSlot2 then
  1411.                             if cnt ~= saplingSlot1 then
  1412.                                 if cnt ~= saplingSlot2 then
  1413.                                     if cnt ~= dirtSlot then
  1414.                                         turtle.transferTo(cnt, 64)
  1415.                                     end
  1416.                                 end
  1417.                             end
  1418.                         end
  1419.                     end
  1420.                 end
  1421.             end
  1422.         end
  1423.         turn("right")
  1424.     end
  1425. end
  1426.  
  1427. -- SECTION: Fueling and Charcoal Making -----------------------------------------------------------
  1428.    
  1429. function fuel() -- refuels the turtle and ensures it has fuel
  1430.     if running == false then return end
  1431.     imdone = false
  1432.     if fuelOn == true then
  1433.         term.setCursorPos (1, 4)
  1434.         clearLine()
  1435.         term.setCursorPos (1, 3)
  1436.         clearLine()
  1437.         term.setCursorPos (1, 2)
  1438.         clearLine()
  1439.         write ("| I'm checking my fuel")
  1440.         while turtle.getFuelLevel() < minFuel do            -- compare current fuel level to the minimum
  1441.             if turtle.getItemCount(fuelSlot1) > 1 then      -- refuels from slot 1 if there is more than 1 fuel
  1442.                 turtle.select(fuelSlot1)
  1443.                 turtle.refuel(1)
  1444.             elseif turtle.getItemCount(fuelSlot2) ~= 0 then -- if slot 1 is empty, tries to fuel from slot 2
  1445.                 turtle.select(fuelSlot2)
  1446.                 turtle.refuel(1)
  1447.             else                                            -- if there is not enough fuel, ask the player for some
  1448.                 term.setCursorPos (1, 2)
  1449.                 turtle.select(fuelSlot1)
  1450.                 if useFurnace == false then
  1451.                     write ("| Please put more fuel in slot "..fuelSlot1.." or "..fuelSlot2)
  1452.                     term.setCursorPos (1, 4)
  1453.                     write ("| Press any key to change settings.")
  1454.                     sleep (1)
  1455.                 else
  1456.                     write ("| Please put more fuel in slot "..fuelSlot1)
  1457.                     term.setCursorPos (1, 3)
  1458.                     write ("| Reserve slot "..fuelSlot2.." for charcoal")
  1459.                     term.setCursorPos (1, 4)
  1460.                     write ("| Press any key to change settings.")
  1461.                     sleep (1)
  1462.                 end
  1463.             end
  1464.         end
  1465.         term.setCursorPos (24, 6)
  1466.         write ("Fuel "..turtle.getFuelLevel().."/" ..minFuel.." ")
  1467.     end
  1468.     imdone = true
  1469. end
  1470.  
  1471. function furnaceCheck() -- checks to see if it has a furnace, but only if fuelOn is enabled and poweredFurnace is disabled
  1472.     if running == false then return end
  1473.     if fuelOn == true then
  1474.         if poweredFurnace == false then
  1475.             term.setCursorPos (1, 4)
  1476.             clearLine()
  1477.             term.setCursorPos (1, 3)
  1478.             clearLine()
  1479.             term.setCursorPos (1, 2)
  1480.             clearLine()
  1481.             write ("| Do I have a furnace?")
  1482.             if turtle.detectUp() then -- check for a furnace
  1483.                 if turtle.getItemCount(fuelSlot1) > 2 then
  1484.                     turtle.select(fuelSlot1)
  1485.                     rememberNumber = turtle.getItemCount(fuelSlot1)
  1486.                     -- new sided inventory of furnaces
  1487.                     forward(1)
  1488.                     up(1)
  1489.                     turn("back")
  1490.                     turtle.drop(2)
  1491.                     sleep(0.5)
  1492.                     turtle.suck()
  1493.                     down(1)
  1494.                     forward(1)
  1495.                     turn("back")
  1496.                     if rememberNumber == turtle.getItemCount(fuelSlot1) then
  1497.                         return true
  1498.                     elseif rememberNumber == turtle.getItemCount(fuelSlot1)+1 then
  1499.                         turtle.suckDown()
  1500.                         return true
  1501.                     elseif rememberNumber < turtle.getItemCount(fuelSlot1) then
  1502.                         return true
  1503.                     end
  1504.                 elseif turtle.getItemCount(fuelSlot2) > 2 then
  1505.                     turtle.select(fuelSlot2)
  1506.                     rememberNumber = turtle.getItemCount(fuelSlot2)
  1507.                     -- new sided inventory of furnaces
  1508.                     forward(1)
  1509.                     up(1)
  1510.                     turn("back")
  1511.                     turtle.drop(2)
  1512.                     sleep(0.5)
  1513.                     turtle.suck()
  1514.                     down(1)
  1515.                     forward(1)
  1516.                     turn("back")
  1517.                     if rememberNumber == turtle.getItemCount(fuelSlot2) then
  1518.                         return true
  1519.                     elseif rememberNumber == turtle.getItemCount(fuelSlot2)+1 then
  1520.                         turtle.suckDown()
  1521.                         return true
  1522.                     elseif rememberNumber < turtle.getItemCount(fuelSlot2) then
  1523.                         return true
  1524.                     end
  1525.                 else
  1526.                     turtle.suckDown()
  1527.                     return false
  1528.                 end
  1529.             end
  1530.         else return true
  1531.         end
  1532.     end
  1533. end
  1534.  
  1535. function makeCharcoal(anumber) -- makes specified number of charcoal in multiples of 8
  1536.     if fuelOn == true then
  1537.         if useFurnace == true then
  1538.             if furnaceCheck() == true then
  1539.                 quickcheck = turtle.getItemSpace(fuelSlot1) + turtle.getItemSpace(fuelSlot2) -- adds empty space in both slots
  1540.                 if quickcheck > 8 * charcoalNumber then -- if there is enough room for more fuel then make some charcoal
  1541.                     term.setCursorPos (1, 4)
  1542.                     clearLine()
  1543.                     term.setCursorPos (1, 3)
  1544.                     clearLine()
  1545.                     term.setCursorPos (1, 2)
  1546.                     clearLine()
  1547.                     write ("| I'm making Charcoal")
  1548.                     hadfuel = "false"
  1549.                     if poweredFurnace == false then
  1550.                         if turtle.getItemCount(fuelSlot1) > 1 + anumber then -- checks for fuel and logs, puts fuel in furnace
  1551.                             if turtle.getItemCount(logSlot) > 8 * anumber then
  1552.                                 turtle.select(fuelSlot1)
  1553.                                 -- new sided inventory of furnaces
  1554.                                 forward(1)
  1555.                                 up(1)
  1556.                                 turn("back")
  1557.                                 turtle.suck()
  1558.                                 turtle.drop(1 * anumber)
  1559.                                 turtle.suckDown() -- incase of overflow
  1560.                                 hadfuel = "true"
  1561.                             end
  1562.                         elseif turtle.getItemCount(fuelSlot2) > 1 + anumber then -- not enough in fuelSlot1, then try fuelSlot2
  1563.                             if turtle.getItemCount(logSlot) > 8 * anumber then
  1564.                                 turtle.select(fuelSlot2)
  1565.                                 -- new sided inventory of furnaces
  1566.                                 forward(1)
  1567.                                 up(1)
  1568.                                 turn("back")
  1569.                                 turtle.suck()
  1570.                                 turtle.drop(1 * anumber)
  1571.                                 turtle.suckDown() -- incase of overflow
  1572.                                 hadfuel = "true"
  1573.                             end
  1574.                         end
  1575.                     end
  1576.                     if poweredFurnace == true then -- assume the furnace has fuel and don't put any in
  1577.                         -- new sided inventory of furnaces
  1578.                         forward(1)
  1579.                         up(1)
  1580.                         turn("back")
  1581.                         hadfuel = "true"
  1582.                     end
  1583.                     if turtle.getItemCount(logSlot) > 8 * anumber  and hadfuel == "true" then -- if there are enough logs and the furnace has been fueled, put in some logs
  1584.                         up(1)
  1585.                         forward(1)
  1586.                         turn("back")
  1587.                         turtle.select(logSlot)
  1588.                         turtle.dropDown(8 * anumber)
  1589.                         charcoalMade = charcoalMade + (8 * anumber)
  1590.                         term.setCursorPos (5, 7)
  1591.                         write ("Charcoal: "..charcoalMade)
  1592.                         forward(1)
  1593.                         down(2)
  1594.                         turn("back")
  1595.                         forward(1)
  1596.                         turn("back")
  1597.                     end
  1598.                     turtle.select(fuelSlot1)
  1599.                     turtle.suckUp()
  1600.                     turtle.select(fuelSlot2)
  1601.                     turtle.suckUp()
  1602.                 else
  1603.                     return
  1604.                 end
  1605.             end
  1606.         end
  1607.     end
  1608. end
  1609.  
  1610. -- SECTION: Docking and Undocking -----------------------------------------------------------------    
  1611.  
  1612. function undock() -- moves from docking station to first tree
  1613.     if running == false then return end
  1614.     parallel.waitForAny(dirt, wakeUp)
  1615.     if gotosettings == true then -- goes to settings first if another function wanted it to happen
  1616.         settings()
  1617.     end
  1618.     if imdone == false then -- if settings wasn't done and somehow got back here, return to the beginning of undocking
  1619.         undock()
  1620.         return
  1621.     end
  1622.     refillSaplings() -- don't leave without saplings
  1623.     parallel.waitForAny(saplings, wakeUp)
  1624.     if gotosettings == true then
  1625.         settings()
  1626.     end
  1627.     if imdone == false then
  1628.         undock()
  1629.         return
  1630.     end
  1631.     parallel.waitForAny(fuel, wakeUp) -- don't leave without fuel
  1632.     if gotosettings == true then
  1633.         settings()
  1634.     end
  1635.     if imdone == false then
  1636.         undock()
  1637.         return
  1638.     end
  1639.     parallel.waitForAny(someFuel, wakeUp) -- make sure you have enough too!
  1640.     if gotosettings == true then
  1641.         settings()
  1642.     end
  1643.     if imdone == false then
  1644.         undock()
  1645.         return
  1646.     end
  1647.     dropOff() -- drop off all extra inventory items
  1648.     if dumpStuff == false then -- check that there is inventry room for another run
  1649.         emptySpace = 0
  1650.         for cnt=1, 16 do
  1651.             if cnt ~= logSlot then
  1652.                 if cnt ~= fuelSlot1 then
  1653.                     if cnt ~= fuelSlot2 then
  1654.                         if cnt ~= saplingSlot1 then
  1655.                             if cnt ~= saplingSlot2 then
  1656.                                 if cnt ~= dirtSlot then
  1657.                                     turtle.select(cnt)
  1658.                                     emptySpace = emptySpace + turtle.getItemSpace(cnt)
  1659.                                 end
  1660.                             end
  1661.                         end
  1662.                     end
  1663.                 end
  1664.             end
  1665.         end
  1666.     end
  1667.     dropFail() -- if there was not enough inventory the program will quit, happens if the output chest is full
  1668.     if running == false then return end -- something quit the program, cancel everything!
  1669.     term.setCursorPos (1, 4)
  1670.     clearLine()
  1671.     term.setCursorPos (1, 3)
  1672.     clearLine()
  1673.     term.setCursorPos (1, 2)
  1674.     clearLine()
  1675.     sleep(1)
  1676.     write ("| Let's get going!")    -- start getting into position
  1677.     turtle.select(saplingSlot2)
  1678.     forward(wallGap)
  1679.     up(1)
  1680.     if rowOffset > 0 then -- move first row to the left
  1681.     turn ("left")
  1682.     forward (rowOffset)
  1683.     turn ("right")
  1684.     end
  1685.     if rowOffset < 0 then -- or move first row to the right
  1686.     adjOffset = rowOffset - (rowOffset + rowOffset)
  1687.     turn ("right")
  1688.     forward (adjOffset)
  1689.     turn ("left")
  1690.     end
  1691.     turtle.select(logSlot)
  1692. end
  1693.  
  1694. function redock() -- logging is done so lets get back home
  1695.     fuel()
  1696.     term.setCursorPos (1, 4)
  1697.     clearLine()
  1698.     term.setCursorPos (1, 3)
  1699.     clearLine()
  1700.     term.setCursorPos (1, 2)
  1701.     clearLine()
  1702.     write ("| Going Home")
  1703.     if wide % 2 == 1 then -- check to see if we are far from home or close by
  1704.         turn ("right")
  1705.         forward (1)
  1706.         turn ("right")
  1707.         forward ((long - 1) * (saplingGap + 1) + 1)
  1708.         turn ("right")
  1709.         forward (1 )
  1710.     else
  1711.         forward (1)
  1712.         turn ("right")
  1713.     end
  1714.     if ((wide - 1) * (saplingGap + 1)) >= rowOffset then -- if we are far away, move closer
  1715.     forward ((wide - 1) * (saplingGap + 1) - rowOffset)
  1716.     down(1)
  1717.     turn("left")
  1718.     else -- move to being in front of home
  1719.     turn("back")
  1720.     forward(rowOffset)
  1721.     down(1)
  1722.     turn("right")
  1723.     end -- move the wallGap distance to home
  1724.     forward(wallGap)
  1725.     turn("back")
  1726.     fuel()
  1727. end
  1728.  
  1729. -- SECTION: Drop off stuff ------------------------------------------------------------------------
  1730.  
  1731. function dropOff() -- put stuff in the output chest
  1732.     if dumpStuff == true then
  1733.         term.setCursorPos (1, 4)
  1734.         clearLine()
  1735.         term.setCursorPos (1, 3)
  1736.         clearLine()
  1737.         term.setCursorPos (1, 2)
  1738.         clearLine()
  1739.         write ("| Dropping Off Inventory")
  1740.         turn("right")
  1741.         emptySpace = 0
  1742.         for cnt=1, 16 do -- check all slots except the designated resource slots for stuff we want to keep
  1743.             if cnt ~= logSlot then
  1744.                 if cnt ~= fuelSlot1 then
  1745.                     if cnt ~= fuelSlot2 then
  1746.                         if cnt ~= saplingSlot1 then
  1747.                             if cnt ~= saplingSlot2 then
  1748.                                 if cnt ~= dirtSlot then
  1749.                                     emptySpace = emptySpace + turtle.getItemSpace(cnt)
  1750.                                     if turtle.getItemCount(cnt) > 0 then
  1751.                                         turtle.select(cnt)
  1752.                                         turtle.drop()
  1753.                                     end
  1754.                                 end
  1755.                             end
  1756.                         end
  1757.                     end
  1758.                 end
  1759.             end
  1760.         end
  1761.         turn("left")
  1762.     end
  1763. end
  1764.  
  1765. function dropFail() -- if inventory is full quit program
  1766.     if emptySpace < 64 then
  1767.         term.setCursorPos (1, 4)
  1768.         clearLine()
  1769.         term.setCursorPos (1, 3)
  1770.         clearLine()
  1771.         term.setCursorPos (1, 2)
  1772.         clearLine()
  1773.         write ("| Oh Noes! The dropoff chest is full!")
  1774.         sleep(2)
  1775.         running = false
  1776.         term.clear()
  1777.         term.setCursorPos (1, 2)
  1778.         write (whatsMyName.." Stopped logging")
  1779.         write ("\nbecause the output chest is Full.")
  1780.         write ("\nPlease make room in the chest")
  1781.         write ("\nand restart the program")
  1782.         term.setCursorPos (1, 6)
  1783.         return
  1784.     end
  1785. end
  1786.  
  1787. -- SECTION: Farming Functions ---------------------------------------------------------------------
  1788.  
  1789. function checkPlant() -- ensure there is a sapling and dirt where a tree is to be grown
  1790.     term.setCursorPos (1, 4)
  1791.     clearLine()
  1792.     term.setCursorPos (1, 3)
  1793.     clearLine()
  1794.     term.setCursorPos (1, 2)
  1795.     clearLine()
  1796.     write ("| Checking for Sapling and Dirt")
  1797.     forward(1)
  1798.     if treeCheckDown() == true then
  1799.         turtle.digDown()
  1800.     end
  1801.     turtle.select(dirtSlot)
  1802.     if turtle.compareDown() == true then
  1803.         turtle.digDown()
  1804.     end
  1805.     if turtle.detectDown() == false then
  1806.         down(1)
  1807.         if turtle.compareDown() == false then
  1808.             turtle.digDown()
  1809.             turtle.placeDown()
  1810.         end
  1811.         up(1)
  1812.         turtle.select(saplingSlot1)
  1813.         if turtle.getItemCount(saplingSlot1) > 1 then
  1814.             turtle.placeDown()
  1815.             saplingsPlanted = saplingsPlanted + 1
  1816.             term.setCursorPos (5, 8)
  1817.             write ("Saplings: "..saplingsPlanted)
  1818.         elseif turtle.getItemCount(saplingSlot2) > 1 then
  1819.             if turtle.compareTo(saplingSlot1) then
  1820.                 turtle.select(saplingSlot2)
  1821.                 turtle.placeDown()
  1822.                 saplingsPlanted = saplingsPlanted + 1
  1823.                 term.setCursorPos (5, 8)
  1824.                 write ("Saplings: "..saplingsPlanted)
  1825.             end
  1826.         end
  1827.     end
  1828.     turtle.select(logSlot)
  1829.     checkup = treeCheckUp()
  1830.     if checkup == true then
  1831.         term.setCursorPos (1, 2)
  1832.         clearLine()
  1833.         write ("| Chopping Tree")
  1834.         height = 0
  1835.         while turtle.compareUp() do
  1836.             turtle.digUp ()
  1837.             up (1)
  1838.             height = height + 1
  1839.         end
  1840.         down(height)
  1841.         treeTotal = treeTotal +1
  1842.         term.setCursorPos (3, 6)
  1843.         write ("Tree Total: "..treeTotal)
  1844.     end
  1845. end
  1846.  
  1847. function treeCheckUp() -- return true if turtle faces a tree
  1848.     logCount = turtle.getItemCount(logSlot)
  1849.     if logCount > 0 then
  1850.         turtle.select(logSlot)
  1851.         ret = turtle.compareUp()
  1852.         return ret
  1853.     else
  1854.         return false
  1855.     end
  1856. end
  1857.  
  1858. -- function treeCheck() -- return true if turtle faces a tree (NOT IN USE)
  1859.     -- logCount = turtle.getItemCount(logSlot)
  1860.     -- if logCount > 0 then
  1861.         -- turtle.select(logSlot)
  1862.         -- ret = turtle.compare()
  1863.         -- return ret
  1864.     -- else
  1865.         -- return true
  1866.     -- end
  1867. -- end
  1868.  
  1869. function treeCheckDown() -- return true if turtle faces a tree
  1870.     logCount = turtle.getItemCount(logSlot)
  1871.     if logCount > 0 then
  1872.         turtle.select(logSlot)
  1873.         ret = turtle.compareDown()
  1874.         return ret
  1875.     else
  1876.         return false
  1877.     end
  1878. end
  1879.  
  1880. -- function fellTree() -- cut down a tree
  1881.     -- term.setCursorPos (1, 4)
  1882.     -- clearLine()
  1883.     -- term.setCursorPos (1, 3)
  1884.     -- clearLine()
  1885.     -- term.setCursorPos (1, 2)
  1886.     -- clearLine()
  1887.     -- write ("| Chopping Tree")
  1888.     -- turtle.select(logSlot)
  1889.     -- turtle.dig()
  1890.     -- forward(1)
  1891.     -- turtle.digDown ()
  1892.     -- down(1)
  1893.     -- turtle.select(dirtSlot)
  1894.     -- if not turtle.compareDown() then
  1895.         -- turtle.digDown()
  1896.         -- turtle.placeDown()
  1897.     -- end
  1898.     -- up (1)
  1899.     -- turtle.select(saplingSlot1)
  1900.     -- if turtle.getItemCount(saplingSlot1) > 1 then
  1901.         -- turtle.placeDown()
  1902.         -- saplingsPlanted = saplingsPlanted + 1
  1903.         -- term.setCursorPos (5, 8)
  1904.         -- write ("Saplings: "..saplingsPlanted)
  1905.     -- elseif turtle.getItemCount(saplingSlot2) > 1 then
  1906.         -- if turtle.compareTo(saplingSlot1) then
  1907.             -- turtle.select(saplingSlot2)
  1908.             -- turtle.placeDown()
  1909.             -- saplingsPlanted = saplingsPlanted + 1
  1910.             -- term.setCursorPos (5, 8)
  1911.             -- write ("Saplings: "..saplingsPlanted)
  1912.         -- end
  1913.     -- end 
  1914.     -- turtle.select(logSlot)
  1915.     -- height = 0
  1916.     -- while turtle.compareUp() do
  1917.         -- turtle.digUp ()
  1918.         -- up (1)
  1919.         -- height = height + 1
  1920.     -- end
  1921.     -- down(height)
  1922.     -- treeTotal = treeTotal +1
  1923.     -- term.setCursorPos (3, 6)
  1924.     -- write ("Tree Total: "..treeTotal)
  1925. -- end
  1926.  
  1927. function logging() -- MAIN FARMING FUNCTION, calls checkPlant(), treeCheck(), fellTree(), and moves tree to tree
  1928.     undock()
  1929.     if running == false then return end
  1930.     turnleftnow = 0
  1931.     for countWide=1, wide do
  1932.         for countLong=1, long do -- loop for each tree
  1933.             fuel()
  1934.             turtle.select(logSlot)
  1935.             -- treeTest = treeCheck()
  1936.             -- if treeTest == true then
  1937.                 -- fellTree()
  1938.             -- else
  1939.                 checkPlant()
  1940.             -- end
  1941.             if countLong ~= long then
  1942.                 turtle.select(saplingSlot1)
  1943.                 forward(saplingGap)
  1944.                 term.setCursorPos (1, 4)
  1945.                 clearLine()
  1946.                 term.setCursorPos (1, 3)
  1947.                 clearLine()
  1948.                 term.setCursorPos (1, 2)
  1949.                 clearLine()
  1950.                 write ("| Moving to next tree")
  1951.             end
  1952.         end
  1953.         term.setCursorPos (1, 4)
  1954.         clearLine()
  1955.         term.setCursorPos (1, 3)
  1956.         clearLine()
  1957.         term.setCursorPos (1, 2)
  1958.         clearLine()
  1959.         write ("| Moving to next row")
  1960.         if countWide < wide then -- loop for moving to next row of trees
  1961.             forward(1)
  1962.             if turnleftnow == 1 then
  1963.                 turn("left")
  1964.                 forward(saplingGap + 1)
  1965.                 turn("left")
  1966.                 turnleftnow = 0
  1967.             else
  1968.                 turn("right")
  1969.                 forward(saplingGap + 1)
  1970.                 turn("right")
  1971.                 turnleftnow = 1
  1972.             end
  1973.         end
  1974.     end
  1975.     redock()
  1976. end
  1977.  
  1978. -- SECTION: Sleeping between logging runs ---------------------------------------------------------
  1979.  
  1980. goodNight = function() -- Waiting between runs
  1981.     imdone = false
  1982.     term.setCursorPos (1, 4)
  1983.     clearLine()
  1984.     term.setCursorPos (1, 2)
  1985.     clearLine()
  1986.     term.setCursorPos (1, 3)
  1987.     clearLine()
  1988.     write ("| Press any key to change settings.")
  1989.     if sleepTime > 0 then
  1990.         while resetsleep < sleepTime do
  1991.             if running == false then break end
  1992.             term.setCursorPos (1, 2)
  1993.             write ("| Sleeping for "..sleepTime-resetsleep.." seconds...")
  1994.             sleep(1)
  1995.             resetsleep = resetsleep + 1
  1996.         end
  1997.     end
  1998.     term.setCursorPos (1, 3)
  1999.     clearLine()
  2000.     term.setCursorPos (1, 2)
  2001.     clearLine()
  2002.     resetsleep = 1
  2003.     imdone = true
  2004. end
  2005.  
  2006. wakeUp = function() -- inturrption by keyboard input, goes to settings menu
  2007.     sleep(1)
  2008.     os.pullEvent("char")
  2009.     gotosettings = true
  2010. end
  2011.  
  2012. function nowISleep() -- sets up for sleeping and inturrupting the sleep for the settings menu
  2013.     parallel.waitForAny(goodNight, wakeUp)
  2014.     if running == false then term.clear() return end
  2015.     if gotosettings == true then
  2016.         sleep(0.4)
  2017.         settings()
  2018.     end
  2019.     if imdone == false then
  2020.     nowISleep()
  2021.     end
  2022. end
  2023.  
  2024. -- SECTION: Misc. ---------------------------------------------------------------------------------
  2025.  
  2026. function fuelSettingCheck() -- checks to see if the server has fuel use disabled
  2027.     if turtle.getFuelLevel() ~= "unlimited" then
  2028.         fuelOn = true
  2029.     else
  2030.         fuelOn = false
  2031.     end
  2032. end
  2033.  
  2034. function breakTest() -- if the turtle coulden't find its way home it will need broken before restarting itself
  2035.     if turtle.getItemCount(logSlot) == 0 then
  2036.         needsBroken = false
  2037.         saveSettings()
  2038.     end
  2039.     if needsBroken == true then
  2040.         term.clear()
  2041.         term.setCursorPos (1, 1)
  2042.         print ("Logger may not have made it home so the program was closed. Break the turtle and replace it to continue.")
  2043.         running = false
  2044.     end
  2045. end
  2046.  
  2047. -------------------- PROGRAM START ----------------------------------------------------------------
  2048.  
  2049. -- Make sure files exist
  2050. while not fs.exists ("logger.cfg") do
  2051.     os.setComputerLabel(whatsMyName)
  2052.     startup()
  2053.     saveSettings()
  2054.     saveCords()
  2055. end
  2056.  
  2057. while not fs.exists ("loggercords.dat") do
  2058.     saveCords()
  2059. end
  2060.  
  2061. -- Load settings and start initial graphical setup
  2062. term.clear()
  2063. gotosettings = false
  2064. imdone = true
  2065. loadSettings()
  2066. graphics() -- renders the GUI
  2067. fuelSettingCheck() -- checks for unlimeted fuel setting
  2068. running = true
  2069.  
  2070. -- Checks cordinates and goes back to starting position if out in the field
  2071. loadCords()
  2072. if homeCheck() == false then
  2073.     goHome()
  2074. end
  2075. breakTest()
  2076.  
  2077. -- Start main loop
  2078. while running == true do
  2079.     logging()
  2080.     if running == false then break end
  2081.     firstRun = false
  2082.     makeCharcoal(charcoalNumber)
  2083.     saveSettings()
  2084.     resetsleep = 1
  2085.     nowISleep()
  2086.     if running == false then break end
  2087. end
Advertisement
Add Comment
Please, Sign In to add comment