Advertisement
Andrakon

AndyLogger Computercraft Turtle Program

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