daily pastebin goal
51%
SHARE
TWEET

Untitled

a guest Jan 18th, 2019 393 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[ORE COLLECTING MINER V2.6 by BrunoZockt
  2.  
  3. MIT License
  4.  
  5. Copyright (c) 2018 Bruno Heberle
  6.  
  7. Permission is hereby granted, free of charge, to any person obtaining a copy
  8. of this software and associated documentation files (the "Software"), to deal
  9. in the Software without restriction, including without limitation the rights
  10. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. copies of the Software, and to permit persons to whom the Software is
  12. furnished to do so, subject to the following conditions:
  13.  
  14. The above copyright notice and this permission notice shall be included in all
  15. copies or substantial portions of the Software.
  16.  
  17. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23. SOFTWARE.
  24.  
  25.  
  26. V1.0 released 22.07.2016 17kb
  27. V1.1 released 16.08.2016 17kb
  28. V2.0 released 07.10.2017 35kb
  29. V2.1 released 15.12.2017 40kb
  30. V2.2 released 17.12.2017 42kb
  31. V2.3 released 11.02.2018 46kb
  32. V2.4 released 19.06.2018 57kb
  33. V2.5 released 15.07.2018 68kb
  34. V2.5.1 released 19.08.2018 78kb
  35. V2.6 released 16.09.2018 90kb
  36. This program is a work in progress and
  37. will automatically update itself.
  38. If you have any problems, questions or
  39. suggestions I'd be happy if you wrote
  40. an e-mail to 8run0z0ckt@gmail.com.
  41. Feel free to use this program whenever
  42. you want. If you want to use parts of
  43. my program for developing, do so but
  44. don't say it's yours - a sidenote
  45. e.g. "by BrunoZockt" would be nice :)
  46. If you want to understand this program
  47. I recommend to read the variables first
  48. and then the rest of the code from the
  49. bottom to the top! Maybe I will add
  50. some comments for better understanding
  51. soon! The names of my functions and
  52. variables may sound strange because
  53. some are german and others are not
  54. really creative, but I hope you
  55. understand it anyways ;) ]]--
  56.  
  57. local HOST_ENV = _ENV or getfenv()
  58. local OUR_ENV = {}
  59.  
  60. setmetatable(OUR_ENV, {__index = HOST_ENV, OUR_ENV = OUR_ENV})
  61. setfenv(1, OUR_ENV)
  62.  
  63. -----###-----configurable variables-----###-----
  64.  
  65. settings = {
  66.   ["language"] = "en",
  67.   ["tunnelspace"] = 4,
  68.   ["quantity"] = 10,
  69.   ["length"] = 8,
  70.   ["ignor"] = {"minecraft:stone", "minecraft:cobblestone", "minecraft:dirt", "minecraft:lava", "minecraft:flowing_lava", "minecraft:water", "minecraft:flowing_water", "minecraft:torch", "chisel:diorite", "chisel:marble", "chisel:limestone"},
  71.   ["chestSelect"] = 3,
  72.   ["torches"] = true,
  73.   ["mainTorches"] = true,
  74.   ["lateralTorches"] = 1,
  75.   ["Autofuel"] = true,
  76.   ["floor"] = true,
  77.   ["trash"] = false,
  78.   ["walls"] = false
  79. }
  80.  
  81. -----###-----constants-----###-----
  82.  
  83. local programName = shell.getRunningProgram()
  84. local label = os.getComputerLabel() or "the turtle"
  85. local chestSlot = 16
  86. local fuelLevel = turtle.getFuelLevel()
  87. local w, h = term.getSize()
  88. local kill = false
  89. chestList = {"minecraft:chest", "IronChest:BlockIronChest", "IronChest:BlockIronChest:1", "IronChest:BlockIronChest:2", "IronChest:BlockIronChest:3", "IronChest:BlockIronChest:4", "IronChest:BlockIronChest:5", "IronChest:BlockIronChest:6"}
  90. enderChestList = {"EnderStorage:enderChest", "ThermalExpansion:Strongbox", "ThermalExpansion:Tesseract"}
  91. cardinal = {"North", "West", "South", "East"}
  92.  
  93. -----###-----mining variables-----###-----
  94.  
  95. variables = {
  96.   ["searching"] = false,
  97.   ["level"] = 0,
  98.   ["direction"] = 1,
  99.   ["cache"] = {},
  100.   ["maxSpace"] = false,
  101.   ["setup"] = false,
  102.   ["index"] = 2,
  103.   ["slots"] = {"_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_"},
  104.   ["torchPositions"] = {},
  105.   ["stats"] = {
  106.     ["dug"] = 0,
  107.     ["ores"] = 0,
  108.     ["time"] = 0,
  109.     ["moves"] = 0
  110.   },
  111.   ["TorchDemand"] = 0,
  112.   ["orientation"] = {},
  113.   ["CrosswayAmount"] = 0,
  114.   ["FuelDemand"] = 0,
  115.   ["startDay"] = 0,
  116.   ["startTime"] = 0
  117. }
  118.  
  119. -----###-----menu variables-----###-----
  120.  
  121. local select = 1
  122. local menustate
  123. local checkbox = false
  124. local gone = {}
  125. local timer = {}
  126. local chest = {"enderchest", "chest", "none"}
  127. local objects = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
  128. local errors = {false, false, false, false, false, false, false, false}
  129. local Check = {["Fuellevel"] = false, ["torches"] = false, ["chest"] = false}
  130.  
  131. local menuVars = {
  132.   ["notificationCenter"] = {
  133.     time = 0
  134.   },
  135.   ["drawOptions"] = {
  136.     shift = 0,
  137.     shift2 = 0,
  138.     saved = false,
  139.     scroll = 0,
  140.     scroll2 = 0,
  141.     focus = 100,
  142.     ypos
  143.   },
  144.   ["drawPopup"] = {
  145.     scroll = 0,
  146.     lastscroll = 0,
  147.     ypos = 9
  148.   },
  149.   ["drawNews"] = {
  150.     scroll = 0
  151.   }
  152. }
  153.  
  154.  
  155. -----###-----helpful functions-----###-----
  156.  
  157. function Sprint(str, xpos, ypos)
  158.   term.setCursorPos(xpos, ypos)
  159.   term.write(str)
  160. end
  161.  
  162. function printCentered(str, ypos)
  163.   term.setCursorPos(w/2 - #str/2 + 1, ypos)
  164.   term.write(str)
  165. end
  166.  
  167. function printRight(str, ypos, xoffset)
  168.   if xoffset == nil then
  169.     xoffset = 0
  170.   end
  171.   term.setCursorPos(w - xoffset - (#str - 1), ypos)
  172.   term.write(str)
  173. end
  174.  
  175. function printLeft(str, ypos)
  176.   term.setCursorPos(1, ypos)
  177.   term.write(str)
  178. end
  179.  
  180. function printB(tab, y, stop, start)
  181.   if start == nil then
  182.     start = 1
  183.   end
  184.   if stop == nil then
  185.     stop = w
  186.   end
  187.   local letters = 0
  188.   for i in pairs(tab) do
  189.     letters = letters + #tab[i]
  190.   end
  191.   local space = (stop-start)+1-letters
  192.   term.setCursorPos(start, y)
  193.   if (space/(#tab+1))%1 == 0 then
  194.     for i in ipairs(tab) do
  195.       term.write(string.rep(" ", space/(#tab+1))..tab[i])
  196.     end
  197.   elseif (space/(#tab))%2 == 0 then
  198.     term.write(string.rep(" ", (space/#tab)/2))
  199.     for i in ipairs(tab) do
  200.       term.write(tab[i]..string.rep(" ", space/#tab))
  201.     end
  202.   elseif space == #tab-1 then
  203.     term.write(tab[1])
  204.     for i = 2, #tab do
  205.       term.write(" "..tab[i])
  206.     end
  207.   else
  208.     for i in ipairs(tab) do
  209.       term.write(string.rep(" ", round(space/(#tab-i+2), "u"))..tab[i])
  210.       space = space - round(space/(#tab-i+2), "u")
  211.     end
  212.   end
  213. end
  214.  
  215. function printWrapped(tab, xpos, ypos, Space, sep)
  216.   local sep = sep or " "
  217.   if tab[1] == "-" then
  218.     Sprint(tab[1]..sep, xpos, ypos)
  219.     table.remove(tab, 1)
  220.     xpos = xpos+2
  221.     Space = Space-2
  222.   end
  223.   local leftSpace = Space
  224.   local newxpos = xpos
  225.   for word = 1, #tab do
  226.     if Space < #tab[word] + #sep then
  227.       return false
  228.     elseif leftSpace >= #tab[word]+#sep then
  229.       Sprint(tab[word]..sep, newxpos, ypos)
  230.       leftSpace = leftSpace - (#tab[word]+#sep)
  231.       newxpos = newxpos + #tab[word]+#sep
  232.     else
  233.       ypos = ypos + 1
  234.       leftSpace = Space
  235.       Sprint(tab[word]..sep, xpos, ypos)
  236.       leftSpace = leftSpace - (#tab[word]+#sep)
  237.       newxpos = xpos + (#tab[word]+#sep)
  238.     end
  239.   end
  240.   return ypos
  241. end
  242.  
  243. function printLine(xpos, start, stop, point, endPoint)
  244.   for i = start, stop do
  245.     Sprint("|", xpos, i)
  246.   end
  247.   if point ~= nil then
  248.     Sprint(point, xpos, start)
  249.     Sprint((endPoint or point), xpos, stop)
  250.   end
  251. end
  252.  
  253. function Splitter(inputstr, sep)
  254.   if inputstr == nil then
  255.     return nil
  256.   elseif sep == nil then
  257.     sep = "%s"
  258.   end
  259.   local t, i = {}, 1
  260.   for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
  261.     t[i] = str
  262.     i = i + 1
  263.   end
  264.   return t
  265. end
  266.  
  267. local Version = tonumber(Splitter(os.version())[2])
  268.  
  269. function ItemCount(Block, Slot)
  270.   if Slot == 0 then
  271.     return false
  272.   elseif Slot == nil then
  273.     return false
  274.   end
  275.   local loops = 1
  276.   if type(Block) == "table" then
  277.     loops = #Block
  278.   end
  279.   if Version >= 1.64 then
  280.     for i = 1, loops do
  281.       local Data = turtle.getItemDetail(Slot)
  282.       if Data == nil then
  283.         return 0
  284.       elseif loops == 1 then
  285.         if Data.name == Block then
  286.           return Data.count
  287.         end
  288.       else
  289.         if Data.name == Block[i] then
  290.           return Data.count
  291.         end
  292.       end
  293.     end
  294.     return false
  295.   else
  296.     return turtle.getItemCount(Slot)
  297.   end
  298. end
  299.  
  300. function Color()
  301.   if Version <= 1.45 then
  302.     return false
  303.   elseif term.isColor() then
  304.     return true
  305.   else
  306.     return false
  307.   end
  308. end
  309.  
  310. function MoveObjects(deleted, mode)
  311.   if mode == 1 then
  312.     for k, v in ipairs(gone) do
  313.       if v == deleted then
  314.         return
  315.       end
  316.     end
  317.     for k, v in ipairs(objects) do
  318.       if k > deleted and k < 12 then
  319.         objects[k] = objects[k] - 1
  320.       end
  321.     end
  322.     table.insert(gone, deleted)
  323.   elseif mode == 2 then
  324.     for k, v in ipairs(gone) do
  325.       if v == deleted then
  326.         table.remove(gone, k)
  327.         for k, v in ipairs(objects) do
  328.           if k > deleted and k < 12 then
  329.             objects[k] = objects[k] + 1
  330.           end
  331.         end
  332.       end
  333.     end
  334.   end
  335. end
  336.  
  337. function OreCounter()
  338.   if variables.searching == true then
  339.     variables.stats["ores"] = variables.stats["ores"] + 1
  340.     if variables.stats["ores"] == 1 then
  341.       print(lang.status(settings.language, 1))
  342.     else
  343.       print(lang.status(settings.language, 2, variables.stats["ores"]))
  344.     end
  345.   end
  346. end
  347.  
  348. function SlotCalculator(code, param)
  349.   local output = {}
  350.   local item
  351.   if param ~= nil and param ~= "check" then
  352.     item = param
  353.   elseif param == "check" then
  354.     if code == "T" then
  355.       item = "minecraft:torch"
  356.     elseif code == "C" then
  357.       if settings.chestSelect == 1 then
  358.         item = enderChestList
  359.       elseif settings.chestSelect == 2 then
  360.         item = chestList
  361.       end
  362.     end
  363.   end
  364.   for n = 1, #variables.slots do
  365.     if variables.slots[n] == code then
  366.       if param == "empty" then
  367.         table.insert(output, n)
  368.       elseif param == nil then
  369.         if turtle.getItemCount(n) > 0 then
  370.           table.insert(output, n)
  371.         end
  372.       elseif ItemCount(item, n) ~= false and ItemCount(item, n) ~= 0 then
  373.         table.insert(output, n)
  374.       end
  375.     end
  376.   end
  377.   return output
  378. end
  379.  
  380. function refuel(Amount, Execute)
  381.   local ActualAmount = turtle.getItemCount()
  382.   if ActualAmount < Amount then
  383.     if Execute == true then
  384.       if turtle.refuel() == false then
  385.         return false
  386.       else
  387.         while turtle.refuel() ~= false do
  388.         end
  389.         return ActualAmount
  390.       end
  391.     else
  392.       return false
  393.     end
  394.   else
  395.     turtle.refuel(Amount)
  396.     return true
  397.   end
  398. end
  399.  
  400. function basicInputHandler(orientation, event, key)
  401.   if event == "key" then
  402.     if key == 28 then
  403.       menustate = menu[menustate].options[select]
  404.       select = 1
  405.     elseif orientation == "vertical" then
  406.       if key == 200 and select > 1 then
  407.         select = select-1
  408.       elseif key == 208 and select < #menu[menustate].options then
  409.         select = select + 1
  410.       end
  411.     else
  412.       if key == 203 and select > 1 then
  413.         select = select - 1
  414.       elseif key == 205 and select < #menu[menustate].options then
  415.         select = select + 1
  416.       end
  417.     end
  418.   end
  419. end
  420.  
  421. function save(path, content, todolist)
  422.     local file = fs.open(path, "w")
  423.   if todolist then
  424.     file.writeLine("todoList = "..textutils.serialize(content))
  425.   elseif type(content) == "table" then
  426.     for k, v in pairs(content) do
  427.       if type(content[k]) == "table" then
  428.         file.writeLine(k.." = "..textutils.serialize(content[k]))
  429.       else
  430.         file.writeLine(k.." = "..tostring(content[k]))
  431.       end
  432.     end
  433.   else
  434.       file.writeLine(content)
  435.   end
  436.     file.close()
  437. end
  438.  
  439. function translate(str, category)
  440.   if category == "layout" then
  441.     n = 35
  442.   end
  443.   for i = 1, n do
  444.     if str == lang[category]("en", i) then
  445.       return lang[category](settings.language, i)
  446.     end
  447.   end
  448. end
  449.  
  450. function round(int, mode, dez)
  451.   if dez == nil then
  452.     dez = 1
  453.   end
  454.   if mode == "d" then
  455.     mode = 0.4999
  456.   elseif mode == "u" then
  457.     mode = 0.5
  458.   end
  459.   return math.floor(int/dez+mode)*dez
  460. end
  461.  
  462. local function compile(chunk) -- returns compiled chunk or nil and error message
  463.   if type(chunk) ~= "string" then
  464.     error("expected string, got ".. type(chunk), 2)
  465.   end
  466.  
  467.   local function findChunkName(var)
  468.     for k,v in pairs(HOST_ENV) do
  469.       if v==var then
  470.         return k
  471.       end
  472.     end
  473.     return "Unknown chunk"
  474.   end
  475.  
  476.   return load(chunk, findChunkName(chunk), "t", OUR_ENV)
  477. end
  478.  
  479. function insert(code)
  480.   table.insert(todoList, variables.index, code)
  481.   variables.index = variables.index + 1
  482.   save("database/OCM/resume/todoList", todoList, true)
  483. end
  484.  
  485. -----###-----improved functions-----###-----
  486.  
  487. function dig(gravel)
  488.   local a = false
  489.   insert('OreCounter()')
  490.   variables.stats["dug"] = variables.stats["dug"] + 1
  491.   if gravel then
  492.     while turtle.dig() do
  493.       os.sleep(0.05)
  494.       a = true
  495.     end
  496.     return a
  497.   else
  498.     return turtle.dig()
  499.   end
  500. end
  501.  
  502. function digUp()
  503.   insert('OreCounter()')
  504.   variables.stats["dug"] = variables.stats["dug"] + 1
  505.   return turtle.digUp()
  506. end
  507.  
  508. function digDown()
  509.   insert('OreCounter()')
  510.   variables.stats["dug"] = variables.stats["dug"] + 1
  511.   return turtle.digDown()
  512. end
  513.  
  514. function face(int)
  515.   if int == variables.direction then
  516.     return
  517.   elseif (int + variables.direction)%2 == 0 then
  518.     return turn()
  519.   elseif math.abs(int - variables.direction) == 1 then
  520.     if variables.direction < int then
  521.       return left()
  522.     else
  523.       return right()
  524.     end
  525.   else
  526.     if variables.direction < int then
  527.       return right()
  528.     else
  529.       return left()
  530.     end
  531.   end
  532. end
  533.  
  534. function right()
  535.   turtle.turnRight()
  536.   variables.direction = variables.direction - 1
  537.   if variables.direction == 0 then
  538.     variables.direction = 4
  539.   end
  540. end
  541.  
  542. function left()
  543.   turtle.turnLeft()
  544.   variables.direction = variables.direction + 1
  545.   if variables.direction == 5 then
  546.     variables.direction = 1
  547.   end
  548. end
  549.  
  550. function turn()
  551.   left()
  552.   left()
  553. end
  554.  
  555. function Freeway()
  556.   variables.searching = false
  557.   insert([[while not turtle.forward() do
  558.     if turtle.getFuelLevel() == 0 then
  559.       Fuel()
  560.     elseif dig() == false then
  561.       turtle.attack()
  562.     end
  563.   end]])
  564.   variables.stats["moves"] = variables.stats["moves"] + 1
  565. end
  566.  
  567. function FreewayUp()
  568.   variables.searching = false
  569.   insert("variables.level = variables.level + 1")
  570.   insert([[while not turtle.up() do
  571.     if turtle.getFuelLevel() == 0 then
  572.       Fuel()
  573.     elseif digUp() == false then
  574.       turtle.attackUp()
  575.     end
  576.   end]])
  577.   variables.stats['moves'] = variables.stats['moves'] + 1
  578. end
  579.  
  580. function FreewayDown()
  581.   variables.searching = false
  582.   insert("variables.level = variables.level - 1")
  583.   insert([[while not turtle.down() do
  584.     if turtle.getFuelLevel() == 0 then
  585.       Fuel()
  586.     elseif digDown() == false then
  587.       turtle.attackDown()
  588.     end
  589.   end]])
  590.   variables.stats['moves'] = variables.stats['moves'] + 1
  591. end
  592.  
  593. function FreewayBack()
  594.   variables.searching = false
  595.   while not turtle.back() do
  596.     if turtle.getFuelLevel() == 0 then
  597.       Fuel()
  598.     else
  599.       turn()
  600.       insert([[if dig() == false then
  601.         for i = 1, 20 do
  602.           turtle.attack()
  603.           os.sleep(0.05)
  604.         end
  605.       end]])
  606.       turn()
  607.     end
  608.   end
  609.   variables.stats["moves"] = variables.stats["moves"] + 1
  610. end
  611.  
  612.  
  613. -----###-----drawMenus-----###-----
  614.  
  615. function notificationCenter()
  616.   local advice = {
  617.   lang.adv(settings.language, 1, ErrorSlot),
  618.   lang.adv(settings.language, 2, 1),
  619.   lang.adv(settings.language, 3, chestSlot),
  620.   lang.adv(settings.language, 4, chestSlot),
  621.   lang.adv(settings.language, 5, chestSlot),
  622.   lang.adv(settings.language, 6, chestSlot),
  623.   lang.adv(settings.language, 7, 1),
  624.   lang.adv(settings.language, 8, 1)
  625.   }
  626.   if menuVars["notificationCenter"].time > 5 then
  627.     for i = 1, #errors do
  628.       if errors[i] ~= false then
  629.         printWrapped(Splitter(advice[i], " "), 1, objects[8], w - 10)
  630.         return
  631.       end
  632.     end
  633.   end
  634.   for i = 1, 4 do
  635.     printLeft(lang.layout(settings.language, i), objects[i+7])
  636.   end
  637.   menuVars["notificationCenter"].time = menuVars["notificationCenter"].time + 0.5
  638. end
  639.  
  640. function drawPopup(event, p1, p2, p3)
  641.   local errorMessages = {
  642.     lang.popup(settings.language, 1, ErrorSlot),
  643.     lang.popup(settings.language, 2),
  644.     lang.popup(settings.language, 1, chestSlot),
  645.     lang.popup(settings.language, 3),
  646.     lang.popup(settings.language, 1, chestSlot),
  647.     lang.popup(settings.language, 4),
  648.     lang.popup(settings.language, 5),
  649.     lang.popup(settings.language, 6)
  650.   }
  651.   local leftBorder = round(w/9, "u")
  652.   local rightBorder = round(w+1-w/9, "u")
  653.   local winWidth = rightBorder-leftBorder-1
  654.  
  655.   menuVars["drawPopup"].lastscroll = menuVars["drawPopup"].scroll
  656.  
  657.   if event == "mouse_scroll" then
  658.     menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll - p1
  659.   elseif event == "mouse_click" and p1 == 1 then
  660.     if p2 == leftBorder+winWidth then
  661.       if p3 == 6 then
  662.         menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll + 1
  663.       elseif p3 == h-3 then
  664.         menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll - 1
  665.       end
  666.     end
  667.   elseif event == "key" then
  668.     if p1 == 208 then
  669.       menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll - 1
  670.     elseif p1 == 200 then
  671.       menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll + 1
  672.     end
  673.   end
  674.   if menuVars["drawPopup"].scroll < -(menuVars["drawPopup"].ypos-menuVars["drawPopup"].lastscroll-(math.ceil((h-6)/10)+6)) then
  675.     menuVars["drawPopup"].scroll = -(menuVars["drawPopup"].ypos-menuVars["drawPopup"].lastscroll-(math.ceil((h-6)/10)+6))
  676.   elseif menuVars["drawPopup"].scroll > 0 then
  677.     menuVars["drawPopup"].scroll = 0
  678.   end
  679.  
  680.   printLine(leftBorder, 4, h-1, "+")
  681.   printLine(rightBorder, 4, h-1, "+")
  682.   menuVars["drawPopup"].ypos = math.ceil((h-6)/10)+5+menuVars["drawPopup"].scroll
  683.   for i = 1, #errors do
  684.     if errors[i] == true then
  685.       menuVars["drawPopup"].ypos = printWrapped(Splitter("- "..errorMessages[i]), leftBorder+1, menuVars["drawPopup"].ypos+1, winWidth, " ")
  686.     end
  687.   end
  688.   printCentered(string.rep("-", winWidth), 4)
  689.   printCentered(string.rep("-", winWidth), h-1)
  690.   printCentered(string.rep(" ", winWidth), 5)
  691.   printCentered(string.rep(" ", winWidth), 6)
  692.   printWrapped(Splitter(lang.popup(settings.language, 7, label)), leftBorder+1, math.ceil((h-6)/10)+4, winWidth, " ")
  693.   printCentered(string.rep(" ", winWidth), h-3)
  694.   printCentered(string.rep(" ", winWidth), 3)
  695.   drawHeader()
  696.   printLine(rightBorder-1, 6, h-3, "^", "v")
  697.   if select == 1 then
  698.     printB({">"..lang.popup(settings.language, 8).."<"," "..lang.popup(settings.language, 9).." ", " "..lang.popup(settings.language, 10).." "}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
  699.   elseif select == 2 then
  700.     printB({" "..lang.popup(settings.language, 8).." ",">"..lang.popup(settings.language, 9).."<", " "..lang.popup(settings.language, 10).." "}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
  701.   else
  702.     printB({" "..lang.popup(settings.language, 8).." "," "..lang.popup(settings.language, 9).." ", ">"..lang.popup(settings.language, 10).."<"}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
  703.   end
  704. end
  705.  
  706. function drawHeader()
  707.   printCentered("ORE SEARCHING STRIP MINER by BrunoZockt", 1)
  708.   printLeft(string.rep("-", w), 2)
  709. end
  710.  
  711. function drawUpdate(event, p1, p2, p3)
  712.   local leftBorder = round(w/6, "u")
  713.   local rightBorder = round(w/6*5, "u")
  714.   local winWidth = rightBorder-leftBorder-1
  715.   local space = round(winWidth-13, "u")
  716.   if event == "mouse_click" and p1 == 1 then
  717.     if p2 == leftBorder+3 and p3 == math.ceil((h-6)/2)+5 then
  718.       checkbox = not checkbox
  719.     elseif p3 == math.ceil((h-6)/10*9)+4 then
  720.       if p2 >= leftBorder+round(0.25*space, "u")+1 and p2 <= leftBorder+round(0.25*space, "u")+11 then
  721.         if select == 1 then
  722.           menustate = menu[menustate].options[select]
  723.         else
  724.           select = 1
  725.         end
  726.       elseif leftBorder+round(0.75*space, "u")+12 <= p2 and p2 <= leftBorder+round(0.75*space, "u")+13 then
  727.         if select == 2 then
  728.           menustate = menu[menustate].options[select]
  729.         else
  730.           select = 2
  731.         end
  732.       end
  733.     end
  734.   elseif event == "key" then
  735.     if p1 == 203 and select > 1 then
  736.       select = select - 1
  737.     elseif p1 == 205 and select < #menu[menustate].options then
  738.       select = select + 1
  739.     elseif p1 == 28 then
  740.       menustate = menu[menustate].options[select]
  741.     end
  742.   end
  743.   printCentered(lang.layout(settings.language, 5), math.ceil((h-6)/6.9)+4)
  744.   printCentered(string.rep("-", math.floor(w/3*2)), 4)
  745.   printCentered(string.rep("-", math.floor(w/3*2)), 12)
  746.   printLine(leftBorder, 4, 12, "+")
  747.   printLine(rightBorder, 4, 12, "+")
  748.   Sprint("_", leftBorder+3, math.ceil((h-6)/2)+4)
  749.   Sprint("|_|"..lang.layout(settings.language, 6), leftBorder+2, math.ceil((h-6)/2)+5)
  750.   if select == 1 then
  751.     printB({">"..lang.layout(settings.language, 7).."<", " "..lang.layout(settings.language, 8).." "}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
  752.   elseif select == 2 then
  753.     printB({" "..lang.layout(settings.language, 7).." ", ">"..lang.layout(settings.language, 8).."<"}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
  754.   end
  755.   if checkbox == true then
  756.     Sprint("X", leftBorder+3, math.ceil((h-6)/2)+5)
  757.   end
  758. end
  759.  
  760. function drawNews(event, p1, p2, p3)
  761.   if event == "mouse_scroll" then
  762.     menuVars["drawNews"].scroll = menuVars["drawNews"].scroll - p1
  763.   elseif event == "key" then
  764.     if p1 == 28 then
  765.       menustate = menu[menustate].options[select]
  766.       select = 1
  767.       menuVars["drawNews"].scroll = 0
  768.     elseif p1 == 208 then
  769.       menuVars["drawNews"].scroll = menuVars["drawNews"].scroll - 1
  770.     elseif p1 == 200 then
  771.       menuVars["drawNews"].scroll = menuVars["drawNews"].scroll + 1
  772.     end
  773.   elseif event == "mouse_click" then
  774.     if p1 == 1 then
  775.       if p2 == w then
  776.         if p3 == 3 then
  777.           menuVars["drawNews"].scroll = menuVars["drawNews"].scroll + 1
  778.         elseif p3 == h then
  779.           menuVars["drawNews"].scroll = menuVars["drawNews"].scroll - 1
  780.         end
  781.       elseif p2 >= w/2-2 and p2 <= w/2+2 and p3 == h then
  782.         menustate = menu[menustate].options[select]
  783.         select = 1
  784.         menuVars["drawNews"].scroll = 0
  785.       end
  786.     end
  787.   end
  788.   if menuVars["drawNews"].scroll > 0 then
  789.     menuVars["drawNews"].scroll = 0
  790.   elseif menuVars["drawNews"].scroll < -283 then
  791.     menuVars["drawNews"].scroll = -283
  792.   end
  793.   Sprint("Patch 2.6", 1, 3+menuVars["drawNews"].scroll)
  794.   Sprint("-----------", 1, 4+menuVars["drawNews"].scroll)
  795.   Sprint("1.NEW FEATURES", 2, 6+menuVars["drawNews"].scroll)
  796.   local ypos = printWrapped(Splitter("- The program will now continue automatically after a server restart."), 3, 7+menuVars["drawNews"].scroll, w-3, " ")
  797.   ypos = printWrapped(Splitter("- To achieve this it is very important that there is always one torch available so that the turtle can orientate itself."), 4, ypos+1, w-4, " ")
  798.   ypos = printWrapped(Splitter("- The program will also install my Startup Handler in 'startup' so that it can be automatically executed. Any file existing in 'startup' will be moved to 'old_startup' and called whenever there is no program that needs to be resumed."), 4, ypos+1, w-4, " ")
  799.   ypos = printWrapped(Splitter("- Everything that needs to be done is written to an extern file, which also takes up some disk space (very unlikely to exceed 10kb). So make sure that there is some file space left."), 4, ypos+1, w-4, " ")
  800.   ypos = printWrapped(Splitter("- The options 'chest' and 'enderchest' are now compatible with all the chests from the mods 'Iron chests' and 'Thermal Expansion'."), 4, ypos+1, w-4, " ")
  801.   Sprint("2.OPTIMIZATIONS", 2, ypos+2)
  802.   ypos = printWrapped(Splitter("- The path of the external files is now including your program name so that you could have multiple instances of the program on one turtle. The updater had to be modified aswell."), 3, ypos+3, w-3, " ")
  803.   ypos = printWrapped(Splitter("- This page looks a lot cleaner now."), 3, ypos+3, w-3, " ")
  804.   ypos = printWrapped(Splitter("- The variables are now ordered a lot better by splitting them into categories."), 3, ypos+1, w-3, " ")
  805.   ypos = printWrapped(Splitter("- Many minor changes in program structure to save a few bytes."), 3, ypos+1, w-3, " ")
  806.   Sprint("3.Bug fixes", 2, ypos+2)
  807.   ypos = printWrapped(Splitter("- The 'place Walls'-option will now place walls in water or lava like it was originally supposed to (quite stupid mistake on my part)."), 3, ypos+3, w-3, " ")
  808.   Sprint("Patch 2.5.1", 1, ypos+2)
  809.   Sprint("-----------", 1, ypos+3)
  810.   Sprint("1.NEW FEATURES", 2, ypos+5)
  811.   ypos = printWrapped(Splitter("- You can now choose to let the turtle build walls and ceiling to prevent the hallways from being flooded by water or lava."), 3, ypos+6, w-3, " ")
  812.   ypos = printWrapped(Splitter("- If torches need to be placed, the turtle will now determine it's cardial direction at the beginning of digging."), 3, ypos+1, w-3, " ")
  813.   ypos = printWrapped(Splitter("- Torches will -now for real- be placed under all circumstances (see 'Bug fixes')."), 3, ypos+1, w-3, " ")
  814.   Sprint("2.OPTIMIZATIONS", 2, ypos+2)
  815.   ypos = printWrapped(Splitter("- When trash-option or chest-option is true, the turtle will now keep 1 Stack of cobblestone to place floor or walls, if selected."), 3, ypos+3, w-3, " ")
  816.   ypos = printWrapped(Splitter("- Added the page counter in the bottom left"), 3, ypos+1, w-3, " ")
  817.   Sprint("3.Bug fixes", 2, ypos+2)
  818.   ypos = printWrapped(Splitter("- There was a 50% chance (turtle heading north or south) that 50% of the torches (either on the right or the left crosstunnel) were lost. That is because torches are by default placed heading west if possible. The turtle will now determine where it is heading and adjust the way it places torches accordingly so that it never loses a single torch."), 3, ypos+3, w-3, " ")
  819.   ypos = printWrapped(Splitter("- When in default settings, 'chest' was set to 'none' there would be a slot for a chest anyways."), 3, ypos+1, w-3, " ")
  820.   ypos = printWrapped(Splitter("- I missed two instances in my code that would cause a crash when no cobblestone was available. However the probability to hit this crash was soooo low that I'm sure nobody ever encountered it."), 3, ypos+1, w-3, " ")
  821.   Sprint("Patch 2.5", 1, ypos+2)
  822.   Sprint("---------", 1, ypos+3)
  823.   Sprint("1.NEW FEATURES", 2, ypos+5)
  824.   ypos = printWrapped(Splitter("- If you are using ComputerCraft Version 1.64 or higher, the turtle won't determine whether to mine a block or not by comparing it to the Ignor-slots but by comparing it with the new Ignor-list, which you can add blocks to. This is not only easier and more flexible but also a lot faster."), 3, ypos+6, w-3, " ")
  825.   ypos = printWrapped(Splitter("- If you want to, the turtle will now throw away items contained on the Ignor-list."), 3, ypos+1, w-3, " ")
  826.   ypos = printWrapped(Splitter("- The decision whether to empty the inventory into a chest, also takes the length of the lateral tunnel into account now, to prevent the loss of items."), 3, ypos+1, w-3, " ")
  827.   ypos = printWrapped(Splitter("- Torches will now be placed immediatly after digging the tunnel and not only after searching through the tunnel, to prevent mobspawns."), 3, ypos+1, w-3, " ")
  828.   ypos = printWrapped(Splitter("- Torches will now be placed under all circumstances, even if a block for the torch to hold on to has to be placed."), 3, ypos+1, w-3, " ")
  829.   ypos = printWrapped(Splitter("- As soon as torch-slots become free because all its torches have been placed, it changes to an empty slot now, which makes it available for ores."), 3, ypos+1, w-3, " ")
  830.   ypos = printWrapped(Splitter("- The program wont throw an error and terminate, when it doesn't have blocks it wants to place, it simply doesn't place them."), 3, ypos+1, w-3, " ")
  831.   Sprint("2.OPTIMIZATIONS", 2, ypos+2)
  832.   ypos = printWrapped(Splitter("- The turtle will also search right and left at the very first two blocks of the tunnel, just in case you are lazy."), 3, ypos+3, w-3, " ")
  833.   ypos = printWrapped(Splitter("- When you decide to use no chest, the chest-slot will now be converted to an empty slot, available as inventory."), 3, ypos+1, w-3, " ")
  834.   ypos = printWrapped(Splitter("- The floor will now be placed after digging out ores, so that there will definitly be no holes in the ground."), 3, ypos+1, w-3, " ")
  835.   ypos = printWrapped(Splitter("- The inventory will now be cleared after finishing."), 3, ypos+1, w-3, " ")
  836.   ypos = printWrapped(Splitter("- Optimized the dig() function to run faster, increasing the overall speed of the program drasticly."), 3, ypos+1, w-3, " ")
  837.   Sprint("3.Bug fixes", 2, ypos+2)
  838.   ypos = printWrapped(Splitter("- In the main hallway, there was a 25% chance that the block a torch was just placed on gets destroyed a second after, and thereby losing the torch."), 3, ypos+3, w-3, " ")
  839.   ypos = printWrapped(Splitter("- In rare cases when selected normal chest, the turtle would try to return to its chest after the program had finished, resulting in the turtle vanishing to Australia."), 3, ypos+1, w-3, " ")
  840.   ypos = printWrapped(Splitter("- Asking for fuel and taking that fuel wasn't always sync."), 3, ypos+1, w-3, " ")
  841.   ypos = printWrapped(Splitter("- The turtle would sometimes put the coal it needs to fuel itself into the chest."), 3, ypos+1, w-3, " ")
  842.   ypos = printWrapped(Splitter("- When a tunnellength <= 4 was chosen the turtle placed way too much torches."), 3, ypos+1, w-3, " ")
  843.   ypos = printWrapped(Splitter("- Many variables weren't refreshed after changing some options, messing up the preparation page."), 3, ypos+1, w-3, " ")
  844.   ypos = printWrapped(Splitter("- When running out of fuel the turtle would think that it encountered an obstacle, constantly digging and hitting the air in front."), 3, ypos+1, w-3, " ")
  845.   Sprint("Patch 2.4", 1, ypos+2)
  846.   Sprint("---------", 1, ypos+3)
  847.   Sprint("1.NEW FEATURES", 2, ypos+5)
  848.   ypos = printWrapped(Splitter("- Option to place a floor, if needed"), 3, ypos+6, w-3, " ")
  849.   ypos = printWrapped(Splitter("- Option to change language. Currently available: english, german"), 3, ypos+1, w-3, " ")
  850.   ypos = printWrapped(Splitter("- Added a scrollbar to the options page, too"), 3, ypos+1, w-3, " ")
  851.   Sprint("2.OPTIMIZATIONS", 2, ypos+2)
  852.   ypos = printWrapped(Splitter("- The positions of the Buttons are determined more intelligent now, therefore being evenly spaced on every possible monitor size"), 3, ypos+3, w-3, " ")
  853.   ypos = printWrapped(Splitter("- The structure of code is more centralized now, which results in faster processing and less blocked storage"), 3, ypos+1, w-3, " ")
  854.   ypos = printWrapped(Splitter("- The Buttons of the options page won't slide up anymore when there is enough space, was a stupid feature anyways..."), 3, ypos+1, w-3, " ")
  855.   Sprint("3.Bug fixes", 2, ypos+2)
  856.   ypos = printWrapped(Splitter("- When more than 12 stacks torches were needed the ignore slots were overwritten, and wouldn't reset even when the options were changed to need less torches"), 3, ypos+3, w-3, " ")
  857.   ypos = printWrapped(Splitter("- Fixed a bug that caused the turtle to claim having found an ore, even though it had not"), 3, ypos+1, w-3, " ")
  858.   ypos = printWrapped(Splitter("- Fixed a bug where the turtle would place torches at wrong positions when the options were changed before start"), 3, ypos+1, w-3, " ")
  859.   ypos = printWrapped(Splitter("- Everytime after placing a torch the turtle would freeze for a few seconds (related to the bug above), this precious time is being saved now"), 3, ypos+1, w-3, " ")
  860.   Sprint("Patch 2.3", 1, ypos+2)
  861.   Sprint("---------", 1, ypos+3)
  862.   Sprint("1.LAYOUT", 2, ypos+5)
  863.   ypos = printWrapped(Splitter("- Popup on execution in case of Errors"), 3, ypos+6, w-3, " ")
  864.   ypos = printWrapped(Splitter("- Tiny optical improvement on the scrollbar"), 3, ypos+1, w-3, " ")
  865.   Sprint("2.NEW FEATURES", 2, ypos+2)
  866.   ypos = printWrapped(Splitter("- Option to make the turtle place the floor when it's missing"), 3, ypos+3, w-3, " ")
  867.   ypos = printWrapped(Splitter("- Captions in the startmenu are visible for at least 5 seconds now"), 3, ypos+1, w-3, " ")
  868.   Sprint("3.Bug fixes", 2, ypos+2)
  869.   ypos = printWrapped(Splitter("- Autofuel would always refuel 5 coal, no matter how much was needed"), 3, ypos+3, w-3, " ")
  870.   ypos = printWrapped(Splitter("- Options sometimes couldn't be selected or the layout got ugly"), 3, ypos+1, w-3, " ")
  871.   ypos = printWrapped(Splitter("- In the startmenu the displayed amount of necessary torches was wrong"), 3, ypos+1, w-3, " ")
  872.   Sprint("Patch 2.2", 1, ypos+2)
  873.   Sprint("---------", 1, ypos+3)
  874.   Sprint("1.NEW LAYOUT", 2, ypos+5)
  875.   ypos = printWrapped(Splitter("- The awesome update window!"), 3, ypos+6, w-3, " ")
  876.   ypos = printWrapped(Splitter("-> Anti-Annoying-Checkbox ;)"), 4, ypos+1, w-4, " ")
  877.   ypos = printWrapped(Splitter("- This awesome news window!"), 3, ypos+1, w-3, " ")
  878.   ypos = printWrapped(Splitter("-> Very functional scrollbar (mouse_wheel, arrow-keys or arrow-buttons can be used)"), 4, ypos+1, w-4, " ")
  879.   Sprint("2.NEW FEATURES", 2, ypos+2)
  880.   ypos = printWrapped(Splitter("- Favorite options are now savable"), 3, ypos+3, w-3, " ")
  881.   ypos = printWrapped(Splitter("- There is a new function that, when activated, places torches automatically: Perfectly spaced so no mobs can spawn!!!"), 3, ypos+1, w-3, " ")
  882.   ypos = printWrapped(Splitter("- Torches on the main floor are placed instantly now, to prevent mobs from spawning"), 3, ypos+1, w-3, " ")
  883.   Sprint("3.Bug fixes", 2, ypos+2)
  884.   ypos = printWrapped(Splitter("- Putting wrong items into a torchslot resulted in a wrong Errormessage"), 3, ypos+3, w-3, " ")
  885.   ypos = printWrapped(Splitter("- When normal chest was selected, the program crashed trying to deploy the chest"), 3, ypos+1, w-3, " ")
  886.   printLeft(string.rep(" ", w-2), h)
  887.   printLeft("Page "..tostring(math.ceil((-menuVars["drawNews"].scroll+1)/10)).."/"..tostring(math.ceil((ypos-menuVars["drawNews"].scroll)/10)-1), h)
  888.   printCentered(">Ok<", h)
  889.   printLine(w, 3, h, "^", "v")
  890.   drawHeader()
  891. end
  892.  
  893. function drawHome(event, p1, p2, p3)
  894.   for i = 1, 3 do
  895.     printCentered(lang.layout(settings.language, i+8), round((h-5)*(i/4), "u")+i+2)
  896.   end
  897.   printCentered(string.rep("-", #lang.layout(settings.language, select+8)), round((h-5)*(select/4), "u")+select+3)
  898. end
  899.  
  900. function drawStart(event, p1, p2, p3)
  901.   --Fuellevel
  902.   if turtle.getFuelLevel() ~= "unlimited" then
  903.     MoveObjects(3, 2)
  904.     printLeft(lang.layout(settings.language, 12), objects[3])
  905.     if settings.Autofuel then
  906.       fuelLevel = turtle.getFuelLevel()
  907.       if fuelLevel < 3*variables.FuelDemand/settings.quantity then
  908.         Fuellevel = "low"
  909.         errors[8] = true
  910.         printCentered(lang.layout(settings.language, 13), objects[3])
  911.       elseif fuelLevel >= variables.FuelDemand then
  912.         Fuellevel = "perfect"
  913.         errors[8] = false
  914.       elseif fuelLevel > variables.FuelDemand*0.5 then
  915.         Fuellevel = "ready"
  916.         errors[8] = false
  917.       else
  918.         Fuellevel = "risky"
  919.         errors[8] = false
  920.       end
  921.     else
  922.       if fuelLevel >= variables.FuelDemand*1.5 then
  923.         Fuellevel = "perfect"
  924.       elseif fuelLevel >= variables.FuelDemand*1 then
  925.         Fuellevel = "ready"
  926.       else
  927.         Fuellevel = "low"
  928.         printCentered(lang.layout(settings.language, 13), objects[3])
  929.       end
  930.     end
  931.     if help[1] == false then
  932.       help[1] = fuelLevel
  933.     end
  934.     if Color() then
  935.       if Fuellevel == "perfect" then
  936.         term.setBackgroundColor(colors.lime)
  937.       elseif Fuellevel == "ready" or Fuellevel == "risky" then
  938.         term.setBackgroundColor(colors.yellow)
  939.       elseif Fuellevel == "low" then
  940.         term.setBackgroundColor(colors.red)
  941.       end
  942.       printRight(fuelLevel.."/"..variables.FuelDemand, objects[3])
  943.       term.setBackgroundColor(colors.black)
  944.     else
  945.       if Fuellevel == "perfect" then
  946.         printRight("+ "..fuelLevel.."/"..variables.FuelDemand, objects[3])
  947.       elseif Fuellevel == "ready" or Fuellevel == "risky" then
  948.         printRight("+/- "..fuelLevel.."/"..variables.FuelDemand, objects[3])
  949.       elseif Fuellevel == "low" then
  950.         printRight("- "..fuelLevel.."/"..variables.FuelDemand, objects[3])
  951.       end
  952.     end
  953.   else
  954.     MoveObjects(3, 1)
  955.   end
  956.  
  957.   --Torches
  958.   local TorchAmount = 0
  959.   ErrorSlot = 0
  960.   for i = 1, #variables.slots do
  961.     if variables.slots[i] == "T" then
  962.       if ItemCount("minecraft:torch", i) ~= false then
  963.         TorchAmount = TorchAmount + ItemCount("minecraft:torch", i)
  964.       else
  965.         ErrorSlot = i
  966.       end
  967.     end
  968.   end
  969.   if ErrorSlot ~= 0 then
  970.     errors[1] = true
  971.   else
  972.     errors[1] = false
  973.   end
  974.   if variables.TorchDemand ~= 0 then
  975.     MoveObjects(4, 2)
  976.     printLeft(lang.layout(settings.language, 14), objects[4])
  977.     if TorchAmount < variables.TorchDemand then
  978.       Check.torch = false
  979.       if Color() then
  980.         term.setBackgroundColor(colors.red)
  981.       end
  982.     else
  983.       Check.torch = true
  984.       if Color() then
  985.         term.setBackgroundColor(colors.lime)
  986.       end
  987.     end
  988.     printRight(TorchAmount.."/"..variables.TorchDemand, objects[4])
  989.     if Check.torch == false then
  990.       errors[7] = true
  991.     else
  992.       errors[7] = false
  993.     end
  994.     term.setBackgroundColor(colors.black)
  995.   else
  996.     MoveObjects(4, 1)
  997.     errors[7] = false
  998.   end
  999.  
  1000.   --Chest
  1001.   errors[2] = false
  1002.   errors[3] = false
  1003.   errors[4] = false
  1004.   errors[5] = false
  1005.   errors[6] = false
  1006.   Check.chest = false
  1007.   if settings.chestSelect == 1 then
  1008.     MoveObjects(5, 2)
  1009.     printLeft(lang.layout(settings.language, 15), objects[5])
  1010.     if Version < 1.64 then
  1011.       if turtle.getItemCount(chestSlot) == 0 then
  1012.         errors[4] = true
  1013.       else
  1014.         Check.chest = true
  1015.       end
  1016.     else
  1017.       if ItemCount("minecraft:ender_chest", chestSlot) ~= false and ItemCount("minecraft:ender_chest", chestSlot) > 0 then
  1018.         errors[2] = true
  1019.       elseif ItemCount(enderChestList, chestSlot) == false then
  1020.         errors[3] = true
  1021.       elseif ItemCount(enderChestList, chestSlot) == 0 then
  1022.         errors[4] = true
  1023.       else
  1024.         Check.chest = true
  1025.       end
  1026.     end
  1027.   elseif settings.chestSelect == 2 then
  1028.     MoveObjects(5, 2)
  1029.     printLeft(lang.layout(settings.language, 18), objects[5])
  1030.     if ItemCount(chestList, chestSlot) == false then
  1031.       errors[5] = true
  1032.     elseif ItemCount(chestList, chestSlot) == 0 then
  1033.       errors[6] = true
  1034.     else
  1035.       Check.chest = true
  1036.     end
  1037.   else
  1038.     Check.chest = true
  1039.     MoveObjects(5, 1)
  1040.   end
  1041.   if Check.chest == false then
  1042.     if Color() then
  1043.       term.setBackgroundColor(colors.red)
  1044.     end
  1045.     printRight(lang.layout(settings.language, 16), objects[5])
  1046.   else
  1047.     if Color() then
  1048.       term.setBackgroundColor(colors.lime)
  1049.     end
  1050.     printRight(lang.layout(settings.language, 17), objects[5])
  1051.   end
  1052.   term.setBackgroundColor(colors.black)
  1053.  
  1054.   --Autofuel
  1055.   if settings.Autofuel == true then
  1056.     MoveObjects(6, 2)
  1057.     printLeft(lang.layout(settings.language, 19), objects[6])
  1058.     term.setBackgroundColor(colors.lime)
  1059.     printRight(lang.layout(settings.language, 17), objects[6])
  1060.     term.setBackgroundColor(colors.black)
  1061.     if help[4] == false then
  1062.       help[4] = turtle.getItemCount(AutofuelSlot)
  1063.     end
  1064.   else
  1065.     MoveObjects(6, 1)
  1066.   end
  1067.  
  1068.   printLeft(string.rep("-", w), objects[7])
  1069.  
  1070.   --Inventory
  1071.   if Version < 1.64 then
  1072.     for i = 1, #variables.slots do
  1073.       if variables.slots[i] == "I" then
  1074.         variables.slots[i] = "_"
  1075.       end
  1076.     end
  1077.     for i = 1, settings.ignor do
  1078.       variables.slots[i] = "I"
  1079.     end
  1080.   end
  1081.   for k, v in ipairs(SlotCalculator("T", "empty")) do
  1082.     variables.slots[v] = "_"
  1083.   end
  1084.   local stupid = SlotCalculator("_", "empty")
  1085.   for k, v in ipairs(stupid) do
  1086.     if k > #stupid-math.ceil(variables.TorchDemand/64) then
  1087.       variables.slots[v] = "T"
  1088.     end
  1089.   end
  1090.   notificationCenter()
  1091.   printRight("|"..variables.slots[1].."|"..variables.slots[2].."|"..variables.slots[3].."|"..variables.slots[4].."|", objects[8])
  1092.   printRight("|"..variables.slots[5].."|"..variables.slots[6].."|"..variables.slots[7].."|"..variables.slots[8].."|", objects[9])
  1093.   printRight("|"..variables.slots[9].."|"..variables.slots[10].."|"..variables.slots[11].."|"..variables.slots[12].."|", objects[10])
  1094.   printRight("|"..variables.slots[13].."|"..variables.slots[14].."|"..variables.slots[15].."|"..variables.slots[16].."|", objects[11])
  1095.  
  1096.   if objects[11] < 12 then
  1097.     printLeft(string.rep("-", w), 12)
  1098.   end
  1099.  
  1100.   --Buttons
  1101.   if select == 1 then
  1102.     printB({">"..lang.layout(settings.language, 20).."<", " "..lang.layout(settings.language, 10).." ", " "..lang.layout(settings.language, 21).." "}, objects[13])
  1103.   elseif select == 2 then
  1104.     printB({" "..lang.layout(settings.language, 20).." ", ">"..lang.layout(settings.language, 10).."<", " "..lang.layout(settings.language, 21).." "}, objects[13])
  1105.   elseif select == 3 then
  1106.     printB({" "..lang.layout(settings.language, 20).." ", " "..lang.layout(settings.language, 10).." ", ">"..lang.layout(settings.language, 21).."<"}, objects[13])
  1107.   end
  1108.  
  1109.   --Action
  1110.   if fuelLevel < 3*variables.FuelDemand/settings.quantity then
  1111.     local FuelAmount = math.ceil((3*variables.FuelDemand/settings.quantity-fuelLevel)/80)
  1112.     for i = 1, #SlotCalculator("_", "minecraft:coal") do
  1113.       turtle.select(SlotCalculator("_", "minecraft:coal")[i])
  1114.       local output = refuel(FuelAmount, true)
  1115.       if output == true then
  1116.         errors[8] = false
  1117.         Fuellevel = "risky"
  1118.       else
  1119.         FuelAmount = FuelAmount - output
  1120.       end
  1121.     end
  1122.   end
  1123. end
  1124.  
  1125. function drawOptions(event, p1, p2, p3)
  1126.   if menuVars["drawOptions"].focus == 100 then
  1127.     calculateFuelDemand()
  1128.     TorchCalculator()
  1129.     if menuVars["drawOptions"].saved == true and select == 3 then
  1130.       select = 2
  1131.     end
  1132.   end
  1133.   if event == "mouse_scroll" then
  1134.     if menuVars["drawOptions"].focus == 100 then
  1135.       menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll - p1
  1136.     elseif menuVars["drawOptions"].focus == 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift and ((p1 < 0 and menuVars["drawOptions"].scroll2 < 0) or (p1 >= 0 and h < menuVars["drawOptions"].ypos)) then
  1137.       menuVars["drawOptions"].scroll2 = menuVars["drawOptions"].scroll2 - p1
  1138.     end
  1139.   elseif event == "mouse_click" and p1 == 1 and menuVars["drawOptions"].focus == 100 then
  1140.     if p2 == w then
  1141.       if p3 == 3 then
  1142.         menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll + 1
  1143.       elseif p3 == h then
  1144.         menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll - 1
  1145.       end
  1146.     else
  1147.       menuVars["drawOptions"].focus = p3
  1148.       if menuVars["drawOptions"].focus > 15+menuVars["drawOptions"].shift+menuVars["drawOptions"].shift2 or menuVars["drawOptions"].focus > h-3 or menuVars["drawOptions"].focus < 3 then
  1149.         menuVars["drawOptions"].focus = 100
  1150.       end
  1151.     end
  1152.   elseif event == "key" then
  1153.     if p1 == 28 and menuVars["drawOptions"].focus ~= 0 then
  1154.       menuVars["drawOptions"].saved = false
  1155.       menuVars["drawOptions"].focus = 100
  1156.     elseif p1 == 208 and menuVars["drawOptions"].focus == 100 then
  1157.       menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll - 1
  1158.     elseif p1 == 200 and menuVars["drawOptions"].focus == 100 then
  1159.       menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll + 1
  1160.     else
  1161.       if settings.torches == false then
  1162.         if menuVars["drawOptions"].focus == 8+menuVars["drawOptions"].scroll then
  1163.           if p1 == 203 and settings.mainTorches == false then
  1164.             settings.mainTorches = true
  1165.           elseif p1 == 205 and settings.mainTorches == true then
  1166.             settings.mainTorches = false
  1167.           end
  1168.         end
  1169.       end
  1170.       menuVars["drawOptions"].shift2 = 0
  1171.       if Version >= 1.64 then
  1172.         if menuVars["drawOptions"].focus == 14+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1173.           if p1 == 203 and settings.trash == false then
  1174.             settings.trash = true
  1175.           elseif p1 == 205 and settings.trash == true then
  1176.             settings.trash = false
  1177.           end
  1178.         end
  1179.       else
  1180.         menuVars["drawOptions"].shift2 = menuVars["drawOptions"].shift2-1
  1181.       end
  1182.       if menuVars["drawOptions"].focus == 3+menuVars["drawOptions"].scroll then
  1183.         if p1 == 203 and settings.language == "de" then
  1184.           settings.language = "en"
  1185.         elseif p1 == 205 and settings.language == "en" then
  1186.           settings.language = "de"
  1187.         end
  1188.       elseif menuVars["drawOptions"].focus == 4+menuVars["drawOptions"].scroll then
  1189.         if p1 == 203 and settings.tunnelspace == 4 then
  1190.           settings.tunnelspace = 3
  1191.         elseif p1 == 205 and settings.tunnelspace == 3 then
  1192.           settings.tunnelspace = 4
  1193.         end
  1194.       elseif menuVars["drawOptions"].focus == 7+menuVars["drawOptions"].scroll then
  1195.         if p1 == 203 and settings.chestSelect > 1 then
  1196.           settings.chestSelect = settings.chestSelect - 1
  1197.         elseif p1 == 205 and settings.chestSelect < #chest then
  1198.           settings.chestSelect = settings.chestSelect + 1
  1199.         end
  1200.         for k, v in ipairs(chest) do
  1201.           if k == settings.chestSelect then
  1202.             v = true
  1203.           else
  1204.             v = false
  1205.           end
  1206.         end
  1207.       elseif menuVars["drawOptions"].focus == 8+menuVars["drawOptions"].scroll then
  1208.         if p1 == 203 and settings.torches == false then
  1209.           settings.torches = true
  1210.         elseif p1 == 205 and settings.torches == true then
  1211.           settings.torches = false
  1212.         end
  1213.       elseif menuVars["drawOptions"].focus == 11+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1214.         if p1 == 203 and settings.Autofuel == false then
  1215.           settings.Autofuel = true
  1216.         elseif p1 == 205 and settings.Autofuel == true then
  1217.           settings.Autofuel = false
  1218.         end
  1219.       elseif menuVars["drawOptions"].focus == 12+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1220.         if p1 == 203 and settings.floor == false then
  1221.           settings.floor = true
  1222.         elseif p1 == 205 and settings.floor == true then
  1223.           settings.floor = false
  1224.         end
  1225.       elseif menuVars["drawOptions"].focus == 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1226.         if p1 == 200 and menuVars["drawOptions"].scroll2 < 0 then
  1227.           menuVars["drawOptions"].scroll2 = menuVars["drawOptions"].scroll2+1
  1228.         elseif p1 == 208 and h < menuVars["drawOptions"].ypos then
  1229.           menuVars["drawOptions"].scroll2 = menuVars["drawOptions"].scroll2-1
  1230.         elseif Version >= 1.64 then
  1231.           if p1 == 57 or p1 == 14 then
  1232.             for i = 1, 16 do
  1233.               local data = turtle.getItemDetail(i)
  1234.               if data then
  1235.                 for k, v in ipairs(settings.ignor) do
  1236.                   if v == data.name then
  1237.                     table.remove(settings.ignor, k)
  1238.                   end
  1239.                 end
  1240.                 if p1 == 57 then
  1241.                   table.insert(settings.ignor, data.name)
  1242.                 end
  1243.               end
  1244.             end
  1245.           end
  1246.         end
  1247.       elseif menuVars["drawOptions"].focus == 15+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1248.         if p1 == 203 and settings.walls == false then
  1249.           settings.walls = true
  1250.         elseif p1 == 205 and settings.walls == true then
  1251.           settings.walls = false
  1252.         end
  1253.       end
  1254.     end
  1255.   end
  1256.   if menuVars["drawOptions"].scroll > 0 then
  1257.     menuVars["drawOptions"].scroll = 0
  1258.   elseif menuVars["drawOptions"].scroll < -(5+menuVars["drawOptions"].shift+menuVars["drawOptions"].shift2) then
  1259.     menuVars["drawOptions"].scroll = -(5+menuVars["drawOptions"].shift+menuVars["drawOptions"].shift2)
  1260.   end
  1261.  
  1262.   if settings.torches == false then
  1263.     if menuVars["drawOptions"].focus == 9+menuVars["drawOptions"].scroll then
  1264.       printLeft(lang.layout(settings.language, 31), menuVars["drawOptions"].focus)
  1265.       if settings.mainTorches == true then
  1266.         printRight(">"..lang.layout(settings.language, 29).."<  "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
  1267.       else
  1268.         printRight(lang.layout(settings.language, 29).."  >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
  1269.       end
  1270.     elseif menuVars["drawOptions"].focus == 10+menuVars["drawOptions"].scroll then
  1271.       printLeft(lang.layout(settings.language, 32), menuVars["drawOptions"].focus)
  1272.       term.setCursorPos(w-2, menuVars["drawOptions"].focus)
  1273.       settings.lateralTorches = tonumber(read())
  1274.       term.clear()
  1275.       drawHeader()
  1276.       return drawOptions("key", 28)
  1277.     end
  1278.     menuVars["drawOptions"].shift = 0
  1279.   else
  1280.     menuVars["drawOptions"].shift = -2
  1281.   end
  1282.   if Version >= 1.64 then
  1283.     if menuVars["drawOptions"].focus == 14+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1284.       printLeft(lang.layout(settings.language, 39), menuVars["drawOptions"].focus)
  1285.       if settings.trash == true then
  1286.         printRight(">"..lang.layout(settings.language, 29).."<  "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
  1287.       else
  1288.         printRight(lang.layout(settings.language, 29).."  >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
  1289.       end
  1290.     end
  1291.   end
  1292.   if menuVars["drawOptions"].focus == 3+menuVars["drawOptions"].scroll then
  1293.     printLeft(lang.layout(settings.language, 34), menuVars["drawOptions"].focus)
  1294.     if settings.language == "en" then
  1295.       printRight(">en<   de ", menuVars["drawOptions"].focus)
  1296.     else
  1297.       printRight("en   >de<", menuVars["drawOptions"].focus)
  1298.     end
  1299.   elseif menuVars["drawOptions"].focus == 4+menuVars["drawOptions"].scroll then
  1300.     printLeft(lang.layout(settings.language, 22), menuVars["drawOptions"].focus)
  1301.     if settings.tunnelspace == 3 then
  1302.       printRight(">2<  3 ", menuVars["drawOptions"].focus)
  1303.     else
  1304.       printRight("2  >3<", menuVars["drawOptions"].focus)
  1305.     end
  1306.   elseif menuVars["drawOptions"].focus == 5+menuVars["drawOptions"].scroll then
  1307.     printLeft(lang.layout(settings.language, 23), menuVars["drawOptions"].focus)
  1308.     term.setCursorPos(w-2, menuVars["drawOptions"].focus)
  1309.     settings.quantity = tonumber(read())
  1310.     term.clear()
  1311.     drawHeader()
  1312.     return drawOptions("key", 28)
  1313.   elseif menuVars["drawOptions"].focus == 6+menuVars["drawOptions"].scroll then
  1314.     printLeft(lang.layout(settings.language, 24), menuVars["drawOptions"].focus)
  1315.     term.setCursorPos(w-2, menuVars["drawOptions"].focus)
  1316.     settings.length = tonumber(read())
  1317.     term.clear()
  1318.     drawHeader()
  1319.     return drawOptions("key", 28)
  1320.   elseif menuVars["drawOptions"].focus == 7+menuVars["drawOptions"].scroll then
  1321.     printLeft(lang.layout(settings.language, 18), menuVars["drawOptions"].focus)
  1322.     variables.slots[16] = "C"
  1323.     if settings.chestSelect == 1 then
  1324.       printRight(">"..lang.layout(settings.language, 25).."< "..lang.layout(settings.language, 26).."  "..lang.layout(settings.language, 27).." ", menuVars["drawOptions"].focus)
  1325.     elseif settings.chestSelect == 2 then
  1326.       printRight(lang.layout(settings.language, 25).." >"..lang.layout(settings.language, 26).."< "..lang.layout(settings.language, 27).." ", menuVars["drawOptions"].focus)
  1327.     else
  1328.       printRight(lang.layout(settings.language, 25).."  "..lang.layout(settings.language, 26).." >"..lang.layout(settings.language, 27).."<", menuVars["drawOptions"].focus)
  1329.       if variables.slots[16] == "C" then
  1330.         variables.slots[16] = "_"
  1331.       end
  1332.     end
  1333.   elseif menuVars["drawOptions"].focus == 8+menuVars["drawOptions"].scroll then
  1334.     printLeft(lang.layout(settings.language, 28), menuVars["drawOptions"].focus)
  1335.     if settings.torches == true then
  1336.       printRight(">"..lang.layout(settings.language, 29).."< "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
  1337.     else
  1338.       printRight(" "..lang.layout(settings.language, 29).." >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
  1339.     end
  1340.   elseif menuVars["drawOptions"].focus == 11+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1341.     printLeft(lang.layout(settings.language, 19), menuVars["drawOptions"].focus)
  1342.     if settings.Autofuel == true then
  1343.       printRight(">"..lang.layout(settings.language, 29).."<   "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
  1344.     else
  1345.       printRight(lang.layout(settings.language, 29).."   >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
  1346.     end
  1347.   elseif menuVars["drawOptions"].focus == 12+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1348.     printLeft(lang.layout(settings.language, 33), menuVars["drawOptions"].focus)
  1349.     if settings.floor == true then
  1350.       printRight(">"..lang.layout(settings.language, 29).."<   "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
  1351.     else
  1352.       printRight(lang.layout(settings.language, 29).."   >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
  1353.     end
  1354.   elseif menuVars["drawOptions"].focus == 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1355.     if Version >= 1.64 then
  1356.       printLeft(lang.layout(settings.language, 36), 3)
  1357.       local ypos = printWrapped(textutils.unserialize(string.gsub(textutils.serialize(settings.ignor), "minecraft:(%a+)", function(q) return q.."," end)), 1, 4, w)
  1358.       menuVars["drawOptions"].ypos = printWrapped(Splitter(lang.layout(settings.language, 37, label)), 1, ypos+2+menuVars["drawOptions"].scroll2, w-1)
  1359.       for i = 1, ypos+1 do
  1360.         printLeft(string.rep(" ", w), i)
  1361.       end
  1362.       drawHeader()
  1363.       printLeft(lang.layout(settings.language, 36), 3)
  1364.       printWrapped(textutils.unserialize(string.gsub(textutils.serialize(settings.ignor), "minecraft:(%a+_*%a*)", function(q) return q.."," end)), 1, 4, w)
  1365.       printLine(w, ypos+2, h, "^", "v")
  1366.     else
  1367.       printLeft(lang.layout(settings.language, 38), menuVars["drawOptions"].focus)
  1368.       term.setCursorPos(w-2, menuVars["drawOptions"].focus)
  1369.       settings.ignor = tonumber(read())
  1370.       term.clear()
  1371.       drawHeader()
  1372.       return drawOptions("key", 28)
  1373.     end
  1374.   elseif menuVars["drawOptions"].focus == 15+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
  1375.     printLeft(lang.layout(settings.language, 40), menuVars["drawOptions"].focus)
  1376.     if settings.walls == true then
  1377.       printRight(">"..lang.layout(settings.language, 29).."<   "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
  1378.     else
  1379.       printRight(lang.layout(settings.language, 29).."   >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
  1380.     end
  1381.   elseif menuVars["drawOptions"].focus == 100 then
  1382.     printLeft(lang.layout(settings.language, 34), 3+menuVars["drawOptions"].scroll)
  1383.     printLeft(lang.layout(settings.language, 22), 4+menuVars["drawOptions"].scroll)
  1384.     printLeft(lang.layout(settings.language, 23), 5+menuVars["drawOptions"].scroll)
  1385.     printLeft(lang.layout(settings.language, 24), 6+menuVars["drawOptions"].scroll)
  1386.     printLeft(lang.layout(settings.language, 18), 7+menuVars["drawOptions"].scroll)
  1387.     printLeft(lang.layout(settings.language, 28), 8+menuVars["drawOptions"].scroll)
  1388.     if settings.torches == false then
  1389.       printLeft(lang.layout(settings.language, 31), 9+menuVars["drawOptions"].scroll)
  1390.       printLeft(lang.layout(settings.language, 32), 10+menuVars["drawOptions"].scroll)
  1391.     end
  1392.     printLeft(lang.layout(settings.language, 19), 11+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
  1393.     printLeft(lang.layout(settings.language, 33), 12+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
  1394.     printLeft("#"..lang.layout(settings.language, 36), 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
  1395.     printLeft(lang.layout(settings.language, 39), 14+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
  1396.     printLeft(lang.layout(settings.language, 40), 15+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
  1397.     printRight(settings.language, 3+menuVars["drawOptions"].scroll, 1)
  1398.     printRight(tostring(settings.tunnelspace-1), 4+menuVars["drawOptions"].scroll, 1)
  1399.     printRight(tostring(settings.quantity), 5+menuVars["drawOptions"].scroll, 1)
  1400.     printRight(tostring(settings.length), 6+menuVars["drawOptions"].scroll, 1)
  1401.     printRight(translate(chest[tonumber(settings.chestSelect)], "layout"), 7+menuVars["drawOptions"].scroll, 1)
  1402.     printRight(translate(tostring(settings.torches), "layout"), 8+menuVars["drawOptions"].scroll, 1)
  1403.     if settings.torches == false then
  1404.       printRight(translate(tostring(settings.mainTorches), "layout"), 9+menuVars["drawOptions"].scroll, 1)
  1405.       printRight(tostring(settings.lateralTorches), 10+menuVars["drawOptions"].scroll, 1)
  1406.     end
  1407.     printRight(translate(tostring(settings.Autofuel), "layout"), 11+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
  1408.     printRight(translate(tostring(settings.floor), "layout"), 12+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
  1409.     if Version >= 1.64 then
  1410.       printRight(tostring(#settings.ignor-4), 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
  1411.     else
  1412.       printRight(tostring(settings.ignor), 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
  1413.     end
  1414.     printRight(translate(tostring(settings.trash), "layout"), 14+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
  1415.     printRight(translate(tostring(settings.walls), "layout"), 15+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
  1416.     printLeft(string.rep(" ", w-1), h)
  1417.     printLeft(string.rep(" ", w-1), h-1)
  1418.     printLeft(string.rep(" ", w-1), h-2)
  1419.     printB({lang.layout(settings.language, 9), lang.layout(settings.language, 21), lang.layout(settings.language, 35)}, 12)
  1420.     if select == 1 then
  1421.       printB({string.rep("_", #lang.layout(settings.language, 9)), string.rep(" ", #lang.layout(settings.language, 21)), string.rep(" ", #lang.layout(settings.language, 35))}, 13)
  1422.     elseif select == 2 then
  1423.       printB({string.rep(" ", #lang.layout(settings.language, 9)), string.rep("_", #lang.layout(settings.language, 21)), string.rep(" ", #lang.layout(settings.language, 35))}, 13)
  1424.     else
  1425.       printB({string.rep(" ", #lang.layout(settings.language, 9)), string.rep(" ", #lang.layout(settings.language, 21)), string.rep("_", #lang.layout(settings.language, 35))}, 13)
  1426.     end
  1427.     printLine(w, 3, h-2, "^", "v")
  1428.     drawHeader()
  1429.   end
  1430. end
  1431.  
  1432. function drawResume(time)
  1433.   term.setCursorPos(1, 3)
  1434.   print("Program will resume in "..tostring(time).." seconds.\n")
  1435.   print("Press Enter to stop resuming...")
  1436. end
  1437.  
  1438. menu = {
  1439.   ["Update"] = {
  1440.     options = {"News", "Home"},
  1441.     orientation = "horizontal",
  1442.     draw = drawUpdate
  1443.   },
  1444.   ["News"] = {
  1445.     options = {"Home"},
  1446.     orientation = "horizontal",
  1447.     draw = drawNews
  1448.   },
  1449.   ["Home"] = {
  1450.     options = {"Start", "Options", "Quit"},
  1451.     orientation = "vertical",
  1452.     draw = drawHome
  1453.   },
  1454.   ["Start"] = {
  1455.     options = {"Go!", "Options", "Home"},
  1456.     orientation = "horizontal",
  1457.     draw = drawStart
  1458.   },
  1459.   ["Options"] = {
  1460.     options = {"Start", "Home", "Save as default"},
  1461.     orientation = "horizontal",
  1462.     draw = drawOptions
  1463.   },
  1464.   ["Popup"] = {
  1465.     options = {"Go!", "Start", "Quit"},
  1466.     orientation = "horizontal",
  1467.     draw = drawPopup
  1468.   }
  1469. }
  1470.  
  1471. -----###-----sequences-----###-----
  1472.  
  1473. function Return()
  1474.   face(1)
  1475.   if #variables.cache == 0 then
  1476.     return
  1477.   elseif variables.cache[#variables.cache] == 5 then
  1478.     insert('FreewayDown()')
  1479.   elseif variables.cache[#variables.cache] == 6 then
  1480.     insert('FreewayUp()')
  1481.   else
  1482.     insert('FreewayBack()')
  1483.     insert('variables.direction = variables.cache[#variables.cache]')
  1484.   end
  1485.   insert('face(1)')
  1486.   insert('table.remove(variables.cache, #variables.cache)')
  1487. end
  1488.  
  1489. function compare(method, slotNum)
  1490.   turtle.select(slotNum)
  1491.   if method == "down" then
  1492.     return turtle.compareDown()
  1493.   elseif method == "up" then
  1494.     return turtle.compareUp()
  1495.   elseif method == "front" then
  1496.     return turtle.compare()
  1497.   end
  1498. end
  1499.  
  1500. function CompareDown(walls)
  1501.   if Version >= 1.64 then
  1502.     local boolean, data = turtle.inspectDown()
  1503.     if boolean then
  1504.       for k, v in pairs(settings.ignor) do
  1505.         if v == data.name then
  1506.           return
  1507.         end
  1508.       end
  1509.     else
  1510.       return
  1511.     end
  1512.   elseif turtle.detectDown() then
  1513.     for k, v in pairs(SlotCalculator("I")) do
  1514.       if compare("down", k) == true then
  1515.         return
  1516.       end
  1517.     end
  1518.   else
  1519.     return
  1520.   end
  1521.   insert('variables.searching = true')
  1522.   insert('turtle.select(SlotCalculator("_", "empty")[1])')
  1523.   insert('digDown()')
  1524.   insert('FreewayDown()')
  1525.   insert('table.insert(variables.cache, 6)')
  1526.   insert('CompareAll("CompareUp()")')
  1527. end
  1528.  
  1529. function CompareUp(walls)
  1530.   if Version >= 1.64 then
  1531.     local boolean, data = turtle.inspectUp()
  1532.     if boolean then
  1533.       for k, v in pairs(settings.ignor) do
  1534.         if v == data.name then
  1535.           return (walls and placeWall("placeUp")) or nil
  1536.         end
  1537.       end
  1538.     else
  1539.       return (walls and placeWall("placeUp")) or nil
  1540.     end
  1541.   elseif turtle.detectUp() then
  1542.     for k, v in pairs(SlotCalculator("I")) do
  1543.       if compare("up", k) == true then
  1544.         return
  1545.       end
  1546.     end
  1547.   else
  1548.     return (walls and placeWall("placeUp")) or nil
  1549.   end
  1550.   insert('variables.searching = true')
  1551.   insert('turtle.select(SlotCalculator("_", "empty")[1])')
  1552.   insert('digUp()')
  1553.   insert('FreewayUp()')
  1554.   insert('table.insert(variables.cache, 5)')
  1555.   if walls == true then
  1556.     insert('placeWall()')
  1557.   end
  1558.   insert('CompareAll("CompareDown()")')
  1559. end
  1560.  
  1561. function CompareRight(walls)
  1562.   Compare(4, walls)
  1563. end
  1564.  
  1565. function CompareBack(walls)
  1566.   Compare(3, walls)
  1567. end
  1568.  
  1569. function CompareLeft(walls)
  1570.   Compare(2, walls)
  1571. end
  1572.  
  1573. function Compare(facing, walls)
  1574.   if facing == nil then
  1575.     facing = 1
  1576.   elseif type(facing) == "boolean" then
  1577.     walls = facing
  1578.     facing = 1
  1579.   end
  1580.   face(facing)
  1581.   if Version >= 1.64 then
  1582.     local boolean, data = turtle.inspect()
  1583.     if boolean then
  1584.       for k, v in pairs(settings.ignor) do
  1585.         if v == data.name then
  1586.           return (walls and placeWall("placeUp")) or nil
  1587.         end
  1588.       end
  1589.     else
  1590.       return (walls and placeWall()) or nil
  1591.     end
  1592.   elseif turtle.detect() then
  1593.     for k, v in pairs(SlotCalculator("I")) do
  1594.       if compare("front", k) == true then
  1595.         return
  1596.       end
  1597.     end
  1598.   else
  1599.     return (walls and placeWall()) or nil
  1600.   end
  1601.   insert('variables.searching = true')
  1602.   insert('turtle.select(SlotCalculator("_", "empty")[1])')
  1603.   insert('dig()')
  1604.   insert('Freeway()')
  1605.   insert('table.insert(variables.cache, variables.direction)')
  1606.   if walls == true then
  1607.     insert('placeWall("placeUp")')
  1608.   end
  1609.   insert('variables.direction = 1')
  1610.   insert('CompareAll("CompareBack()")')
  1611. end
  1612.  
  1613. function CompareAll(...)
  1614.   local exceptions = {...}
  1615.   local walls
  1616.   if type(exceptions[1]) == "boolean" then
  1617.     walls = exceptions[1]
  1618.     table.remove(exceptions, 1)
  1619.   end
  1620.   insert('Compare()')
  1621.   insert('CompareLeft()')
  1622.   insert('CompareBack()')
  1623.   insert('CompareRight()')
  1624.   insert('CompareUp()')
  1625.   insert('CompareDown()')
  1626.   insert('Return()')
  1627.   local sub = 0
  1628.   for j = 2, 8-sub do
  1629.     for k, v in ipairs(exceptions) do
  1630.       if v == todoList[j] then
  1631.         table.remove(todoList, j)
  1632.         table.remove(exceptions, k)
  1633.         j = j - 1
  1634.         sub = sub + 1
  1635.       end
  1636.     end
  1637.   end
  1638.   if walls == true then
  1639.     for i = 2, 15 do
  1640.       if todoList[i] == 'Return()' then
  1641.         break
  1642.       elseif string.find(todoList[i], 'placeWall(') == nil then
  1643.         if string.find(todoList[i], 'Up') ~= nil then
  1644.           table.insert(todoList, i+1, 'placeWall("placeUp")')
  1645.         elseif string.find(todoList[i], 'Down') == nil then
  1646.           table.insert(todoList, i+1, 'placeWall()')
  1647.         end
  1648.       end
  1649.     end
  1650.   end
  1651. end
  1652.  
  1653. function trash(keptCobble)
  1654.   for k, v in ipairs(SlotCalculator("_")) do
  1655.     local data = turtle.getItemDetail(v)
  1656.     for k2, v2 in pairs(settings.ignor) do
  1657.       if v2 == data.name then
  1658.         if not keptCobble and v2 == "minecraft:cobblestone" then
  1659.           keptCobble = true
  1660.         else
  1661.           turtle.select(v)
  1662.           turtle.drop()
  1663.         end
  1664.       end
  1665.     end
  1666.   end
  1667. end
  1668.  
  1669. function Enderchest(keptCoal, keptCobble)
  1670.   if (#SlotCalculator("_") >= #SlotCalculator("_", "empty")-1-math.ceil(settings.length/12) or keptCoal == true) and #SlotCalculator("C", "check") ~= 0 then
  1671.     turtle.select(SlotCalculator("C", "check")[1])
  1672.     if variables.level == 1 then
  1673.       insert('FreewayDown()')
  1674.     end
  1675.     insert('FreewayBack()')
  1676.     insert([[while not turtle.place() do
  1677.       turtle.attack()
  1678.     end]])
  1679.     insert([[for k, v in ipairs(SlotCalculator("_")) do
  1680.       if settings.Autofuel and not keptCoal and Version >= 1.64 and turtle.getItemDetail(v).name == "minecraft:coal" then
  1681.         keptCoal = true
  1682.       elseif not keptCobble and v == "minecraft:cobblestone" then
  1683.         keptCobble = true
  1684.       else
  1685.         turtle.select(v)
  1686.         while not turtle.drop() do
  1687.           print(lang.status(settings.language, 3))
  1688.           sleep(10)
  1689.         end
  1690.       end
  1691.     end
  1692.     turtle.select(SlotCalculator("C", "empty")[1])]])
  1693.     insert('dig()')
  1694.     insert('Freeway()')
  1695.     insert([[turtle.select(SlotCalculator("_", "empty")[1])
  1696.     print(lang.status(settings.language, 4))]])
  1697.   end
  1698. end
  1699.  
  1700. function NormalChest(keptCoal, keptCobble)
  1701.   local function goToOrigin()
  1702.     insert('turn()')
  1703.     insert([[if variables.level == 1 then
  1704.       FreewayDown()
  1705.     end
  1706.     for Way_Back = 1, variables.CrosswayAmount*settings.tunnelspace do
  1707.       Freeway()
  1708.     end]])
  1709.     insert('turn()')
  1710.   end
  1711.   local function dropOff()
  1712.     insert([[for k, v in ipairs(SlotCalculator("_")) do
  1713.       if settings.Autofuel and not keptCoal and Version >= 1.64 and turtle.getItemDetail(v).name == "minecraft:coal" then
  1714.         keptCoal = true
  1715.       elseif not keptCobble and v == "minecraft:cobblestone" then
  1716.         keptCobble = true
  1717.       else
  1718.         turtle.select(v)
  1719.         while not turtle.dropDown() and turtle.getItemCount() ~= 0 do
  1720.           print(lang.status(settings.language, 3))
  1721.           sleep(10)
  1722.         end
  1723.       end
  1724.     end]])
  1725.   end
  1726.   if variables.setup == nil then
  1727.     if #SlotCalculator("C", "check") == 0 then
  1728.       variables.setup = false
  1729.     elseif #SlotCalculator("_") >= #SlotCalculator("_", "empty")-1-math.ceil(settings.length/12) then
  1730.       goToOrigin()
  1731.       insert('turtle.select(SlotCalculator("C", "check")[1])')
  1732.       insert([[while not turtle.placeDown() do
  1733.         digDown()
  1734.       end]])
  1735.       insert('variables.setup = true')
  1736.       dropOff()
  1737.       insert([[for Way_Back = 1, variables.CrosswayAmount*settings.tunnelspace do
  1738.         Freeway()
  1739.       end]])
  1740.       insert('print(lang.status(settings.language, 4))')
  1741.     end
  1742.   elseif variables.setup == true then
  1743.     goToOrigin()
  1744.     dropOff()
  1745.     insert([[for Way_Back = 1, variables.CrosswayAmount*settings.tunnelspace do
  1746.       Freeway()
  1747.     end]])
  1748.     insert('print(lang.status(settings.language, 4))')
  1749.   end
  1750. end
  1751.  
  1752. function Fuel()
  1753.   local FuelAmount = math.ceil(3*variables.FuelDemand/settings.quantity/80)
  1754.   fuelLevel = turtle.getFuelLevel()
  1755.   if fuelLevel < 3*variables.FuelDemand/settings.quantity then
  1756.     while true do
  1757.       while #SlotCalculator("_", "minecraft:coal") > 0 do
  1758.         turtle.select(SlotCalculator("_", "minecraft:coal")[1])
  1759.         local output = refuel(FuelAmount, true)
  1760.         if output == true then
  1761.           print(lang.status(settings.language, 5))
  1762.           return
  1763.         else
  1764.           FuelAmount = FuelAmount - output
  1765.         end
  1766.       end
  1767.       term.clear()
  1768.       term.setCursorPos(1,1)
  1769.       print(lang.status(settings.language, 6))
  1770.       write(lang.status(settings.language, 7))
  1771.       for k, v in ipairs(SlotCalculator("_", "empty")) do
  1772.         if k == #SlotCalculator("_", "empty") then
  1773.           print(v)
  1774.         else
  1775.           write(v..", ")
  1776.         end
  1777.       end
  1778.       os.pullEvent()
  1779.     end
  1780.   end
  1781. end
  1782.  
  1783. function placeFloor()
  1784.   if settings.floor == true and turtle.detectDown() == false and #SlotCalculator("_", "minecraft:cobblestone") ~= 0 then
  1785.     turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])
  1786.     turtle.placeDown()
  1787.   end
  1788. end
  1789.  
  1790. function placeWall(param)
  1791.   if param == true then
  1792.     param = "place"
  1793.   else
  1794.     param = param or "place"
  1795.   end
  1796.   if #SlotCalculator("_", "minecraft:cobblestone") > 0 then
  1797.     turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])
  1798.     turtle[param]()
  1799.     return true
  1800.   end
  1801.   return false
  1802. end
  1803.  
  1804. -----###-----Processing-----###-----
  1805. function TorchCalculator()
  1806.   local Tspace
  1807.   if settings.torches == true then
  1808.     if (settings.tunnelspace == 4 and settings.length <= 8) or (settings.tunnelspace == 3 and settings.length <= 10) then
  1809.       settings.lateralTorches = 1
  1810.     else
  1811.       settings.lateralTorches = math.floor((settings.length-math.floor(16/settings.tunnelspace))/12)+1
  1812.     end
  1813.     if (settings.tunnelspace == 4 and settings.length <= 3) or (settings.tunnelspace == 3 and settings.length <= 4) then
  1814.       settings.mainTorches = true
  1815.       settings.lateralTorches = 0
  1816.     elseif (settings.tunnelspace == 4 and ((settings.length+2)%12 <= 5 or settings.length == 9)) or (settings.tunnelspace == 3 and (settings.length+1)%12 <= 5) then
  1817.       settings.mainTorches = true
  1818.     else
  1819.       settings.mainTorches = false
  1820.     end
  1821.   end
  1822.   if settings.lateralTorches >= 1 then
  1823.     if settings.mainTorches == true then
  1824.       Tspace = round((settings.length+(settings.tunnelspace-1)-settings.lateralTorches)/(settings.lateralTorches+0.5), "u")
  1825.     else
  1826.       Tspace = (settings.length+(settings.tunnelspace-1)-settings.lateralTorches)/settings.lateralTorches
  1827.     end
  1828.     if Tspace == 11 then
  1829.       variables.maxSpace = true
  1830.     else
  1831.       variables.maxSpace = false
  1832.     end
  1833.     local done = false
  1834.     while not done do
  1835.       variables.torchPositions = {}
  1836.       table.insert(variables.torchPositions, round(Tspace/2, "d")+1)
  1837.       for i = 2, settings.lateralTorches do
  1838.         table.insert(variables.torchPositions, round(Tspace+1+variables.torchPositions[i-1], "d"))
  1839.       end
  1840.       if variables.torchPositions[#variables.torchPositions] > settings.length then
  1841.         Tspace = Tspace - 0.1
  1842.       else
  1843.         done = true
  1844.       end
  1845.     end
  1846.   else
  1847.     variables.maxSpace = false
  1848.     variables.torchPositions = {}
  1849.   end
  1850.   variables.TorchDemand = 2*(settings.lateralTorches*settings.quantity)+1
  1851.   if settings.mainTorches == true then
  1852.     variables.TorchDemand = variables.TorchDemand + settings.quantity
  1853.   end
  1854.   for k, v in ipairs(SlotCalculator("T", "empty")) do
  1855.     variables.slots[v] = "_"
  1856.   end
  1857.   local stupid = SlotCalculator("_", "empty")
  1858.   for k, v in ipairs(stupid) do
  1859.     if k > #stupid-math.ceil(variables.TorchDemand/64) then
  1860.       variables.slots[v] = "T"
  1861.     end
  1862.   end
  1863. end
  1864.  
  1865. function calculateFuelDemand()
  1866.   if settings.chestSelect == 1 then
  1867.     variables.FuelDemand = ((settings.length*2+settings.tunnelspace)*3+3)*settings.quantity
  1868.   elseif settings.chestSelect == 2 then
  1869.     variables.FuelDemand = math.ceil(((settings.length*2+settings.tunnelspace)*3+2)*settings.quantity+settings.tunnelspace*(settings.quantity/2)^2)
  1870.   else
  1871.     variables.FuelDemand = ((settings.length*2+settings.tunnelspace)*3+2)*settings.quantity
  1872.   end
  1873.   if variables.maxSpace == true then
  1874.     variables.FuelDemand = variables.FuelDemand + #variables.torchPositions
  1875.   end
  1876. end
  1877.  
  1878.  
  1879. -----###-----Core functions-----###-----
  1880. function update()
  1881.   if not fs.exists("database/"..programName.."/state") then
  1882.     save("database/"..programName.."/state", "0")
  1883.   end
  1884.   file = fs.open("database/"..programName.."/state", "r")
  1885.   local fileData = {}
  1886.   local line = file.readLine()
  1887.   repeat
  1888.     table.insert(fileData, line)
  1889.     line = file.readLine()
  1890.   until line == nil
  1891.   file.close()
  1892.   updated = fileData[1]
  1893.  
  1894.   if updated == "0" then
  1895.     kill = true
  1896.     term.clear()
  1897.     print("loading...")
  1898.     shell.run("pastebin get cR9vEiTc database/"..programName.."/lang")
  1899.     term.clear()
  1900.     local function installAsStartup()
  1901.       if fs.exists("startup") then
  1902.         os.loadAPI("startup")
  1903.         if startup.name == "SupHa - Startup Handler by BrunoZockt" then
  1904.           for k, v in ipairs(startup.getList()) do
  1905.             if v == programName then
  1906.               return
  1907.             end
  1908.           end
  1909.           startup.set(programName)
  1910.         else
  1911.           os.unloadAPI("startup")
  1912.           fs.move("startup", "old_startup")
  1913.           shell.run("pastebin get 19VG8eD6 startup")
  1914.           os.loadAPI("startup")
  1915.           startup.set("old_startup", "standart")
  1916.           startup.set(programName)
  1917.         end
  1918.       else
  1919.         shell.run("pastebin get 19VG8eD6 startup")
  1920.         os.loadAPI("startup")
  1921.         startup.set(programName)
  1922.       end
  1923.     end
  1924.     installAsStartup()
  1925.     if programName ~= "OCM" then
  1926.       fs.delete("database/OCM")
  1927.     end
  1928.     if shell.run("database/"..programName.."/updaterV2") == false then
  1929.       fs.delete("database/"..programName.."/updater")
  1930.       term.clear()
  1931.       print("loading...")
  1932.       shell.run("pastebin get rUMt9siN database/"..programName.."/updaterV2")
  1933.       term.clear()
  1934.       shell.run("database/"..programName.."/updaterV2")
  1935.     end
  1936.   end
  1937. end
  1938.  
  1939. function getVariables(path)
  1940.   local extSettings = {}
  1941.   if fs.exists("database/"..programName.."/"..path) then
  1942.     file = fs.open("database/"..programName.."/"..path, "r")
  1943.     local line = Splitter(file.readLine(), " = ")
  1944.     repeat
  1945.       if line[2] == "{" or line[2] == "{}" then
  1946.         local str = line[2]
  1947.         if line[2] == "{" then
  1948.         repeat
  1949.           local tline = file.readLine()
  1950.           if tline ~= nil then
  1951.             str = str..tline
  1952.           end
  1953.         until tline == "}"
  1954.         end
  1955.         extSettings[line[1]] = textutils.unserialize(str)
  1956.       else
  1957.         extSettings[line[1]] = line[2]
  1958.       end
  1959.       line = Splitter(file.readLine(), " = ")
  1960.     until line == nil
  1961.     file.close()
  1962.     for k, v in pairs(extSettings) do
  1963.       if type(extSettings[k]) ~= "table" then
  1964.         if not tonumber(extSettings[k]) then
  1965.           if extSettings[k] == "true" or extSettings[k] == "false" then
  1966.             extSettings[k] = extSettings[k] == "true"
  1967.           end
  1968.         else
  1969.           extSettings[k] = tonumber(extSettings[k])
  1970.         end
  1971.       end
  1972.       if Splitter(path, "/")[#Splitter(path, "/")] == "settings" then
  1973.         settings[k] = extSettings[k]
  1974.       elseif Splitter(path, "/")[#Splitter(path, "/")] == "variables" then
  1975.         variables[k] = extSettings[k]
  1976.       end
  1977.     end
  1978.   end
  1979.   if fs.exists("database/"..programName.."/updateCheckbox/V2.6") then
  1980.     local file = fs.open("database/"..programName.."/updateCheckbox/V2.6", "r")
  1981.     checkbox = file.readLine() == "true"
  1982.     file.close()
  1983.   end
  1984.   if checkbox == true then
  1985.     menustate = "Home"
  1986.   else
  1987.     menustate = "Update"
  1988.   end
  1989.   if settings.chestSelect < 3 and #SlotCalculator("C", "empty") == 0 then
  1990.     variables.slots[16] = "C"
  1991.   end
  1992.   calculateFuelDemand()
  1993.   TorchCalculator()
  1994. end
  1995.  
  1996. function getList(path)
  1997.   local file = fs.open("database/"..programName.."/"..path, "r")
  1998.   todoList = textutils.unserialize(Splitter(file.readLine(), " = ")[2]..file.readAll())
  1999.   file.close()
  2000. end
  2001.  
  2002. function saveVars(path, content)
  2003.   save("database/"..programName.."/"..path, content)
  2004. end
  2005.  
  2006. function compStep(n)
  2007.   if n == nil then
  2008.     n = 1
  2009.   else
  2010.     n = tonumber(n)
  2011.   end
  2012.   for i = 1, n do
  2013.     insert('turtle.select(SlotCalculator("T", "empty")[1])')
  2014.     insert('Freeway()')
  2015.     if variables.level == 0 then
  2016.       insert('CompareAll("Compare()", "CompareBack()", "CompareUp()")')
  2017.       insert('placeFloor()')
  2018.       insert('turtle.select(SlotCalculator("T", "empty")[1])')
  2019.       insert('FreewayUp()')
  2020.       insert('CompareAll("Compare()", "CompareBack()", "CompareDown()")')
  2021.     elseif variables.level == 1 then
  2022.       insert('CompareAll("Compare()", "CompareBack()", "CompareDown()")')
  2023.       insert('turtle.select(SlotCalculator("T", "empty")[1])')
  2024.       insert('FreewayDown()')
  2025.       insert('CompareAll("Compare()", "CompareBack()", "CompareUp()")')
  2026.       insert('placeFloor()')
  2027.     end
  2028.   end
  2029. end
  2030.  
  2031. function mainstep(n, first)
  2032.   if n == nil then
  2033.     n = 1
  2034.   else
  2035.     n = tonumber(n)
  2036.   end
  2037.   turtle.select(SlotCalculator("_", "empty")[1])
  2038.   for i = 1, n do
  2039.     insert('variables.searching = false')
  2040.     insert('dig()')
  2041.     insert('Freeway()')
  2042.     insert([[if variables.level == 0 then
  2043.       insert('placeFloor()')
  2044.       insert('digUp()')
  2045.       if ]]..tostring(first)..[[ and ]]..tostring(i)..[[ == 1 or (settings.walls == true and ]]..tostring(i)..[[ == 2 and settings.tunnelspace == 4) then
  2046.         insert('CompareAll("Compare()", "CompareBack()", "CompareUp()")')
  2047.       else
  2048.         insert('CompareDown()')
  2049.       end
  2050.       insert('FreewayUp()')
  2051.       if ]]..tostring(first)..[[ and ]]..tostring(i)..[[ == 1 or (settings.walls == true and ]]..tostring(i)..[[ == 2 and settings.tunnelspace == 4) then
  2052.         insert('CompareAll("Compare()", "CompareBack()", "CompareDown()")')
  2053.       else
  2054.         insert('CompareUp()')
  2055.         insert('placeWall("placeUp")')
  2056.       end
  2057.     elseif variables.level == 1 then
  2058.       insert('digDown()')
  2059.       if ]]..tostring(first)..[[ and ]]..tostring(i)..[[ == 1 or (settings.walls == true and ]]..tostring(i)..[[ == 2 and settings.tunnelspace == 4) then
  2060.         insert('CompareAll("Compare()", "CompareBack()", "CompareDown()")')
  2061.       else
  2062.         insert('CompareUp()')
  2063.         insert('placeWall("placeUp")')
  2064.       end
  2065.       if i == 2 and settings.mainTorches then
  2066.         insert('variables.searching = false')
  2067.         insert('dig(true)')
  2068.       end
  2069.       insert('FreewayDown()')
  2070.       if ]]..tostring(first)..[[ and ]]..tostring(i)..[[ == 1 or (settings.walls == true and ]]..tostring(i)..[[ == 2 and settings.tunnelspace == 4) then
  2071.         insert('CompareAll("Compare()", "CompareBack()", "CompareUp()")')
  2072.       else
  2073.         insert('CompareDown()')
  2074.       end
  2075.       insert('placeFloor()')
  2076.     end]])
  2077.     if settings.mainTorches == true then
  2078.       if i == 2 and #SlotCalculator('T', 'check') ~= 0 then
  2079.         insert([[turtle.select(SlotCalculator('T', 'check')[1])
  2080.         if variables.level == 1 then
  2081.           FreewayDown()
  2082.         end]])
  2083.         insert([[if not turtle.placeUp() then
  2084.           insert('FreewayUp()')
  2085.           insert('left()')
  2086.           insert('turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])')
  2087.           insert('dig()')
  2088.           insert('turtle.place()')
  2089.           insert('right()')
  2090.           insert('FreewayDown()')
  2091.           insert('turtle.select(SlotCalculator("T", "check")[1])')
  2092.           insert('turtle.placeUp()')
  2093.         end]])
  2094.         insert([[for k, v in ipairs(SlotCalculator('T', 'empty')) do
  2095.           variables.slots[v] = '_'
  2096.         end
  2097.         local stupid = SlotCalculator('_', 'empty')
  2098.         for k, v in ipairs(stupid) do
  2099.           if k > #stupid-math.ceil(variables.TorchDemand/64) then
  2100.             variables.slots[v] = 'T'
  2101.           end
  2102.         end
  2103.         variables.TorchDemand = variables.TorchDemand - 1]])
  2104.       end
  2105.     end
  2106.   end
  2107. end
  2108.  
  2109. function stepAside(n)
  2110.   if n == nil then
  2111.     n = 1
  2112.   else
  2113.     n = tonumber(n)
  2114.   end
  2115.   for i = 1, n do
  2116.     insert('variables.searching = false')
  2117.     insert('dig()')
  2118.     insert('Freeway()')
  2119.     if variables.level == 1 then
  2120.       insert('digDown()')
  2121.     elseif variables.level == 0 then
  2122.       insert('placeFloor()')
  2123.       insert('digUp()')
  2124.     end
  2125.   end
  2126. end
  2127.  
  2128. function youJustGotLittUp(steps, func, left)
  2129.   if left == nil then
  2130.     left = false
  2131.   end
  2132.   for Steprepeat = 1, steps do
  2133.     if func == stepAside then
  2134.       insert('stepAside()')
  2135.     end
  2136.     for k, v in ipairs(variables.torchPositions) do
  2137.       if ((func == stepAside and settings.length-v+1 == Steprepeat) or (func == compStep and v == Steprepeat)) and #SlotCalculator("T", "check") > 0 then
  2138.         insert([[turtle.select(SlotCalculator("T", "check")[1])
  2139.         if variables.maxSpace == true then
  2140.           if settings.mainTorches == false and left == true then
  2141.             if k%2 == #variables.torchPositions%2 then
  2142.               if variables.level == 1 then
  2143.                 if variables.orientation[1] == "North" or variables.orientation[1] == "South" then
  2144.                   insert('dig()')
  2145.                 end
  2146.                 insert('FreewayDown()')
  2147.               elseif variables.orientation[1] == "North" or variables.orientation[1] == "South" then
  2148.                 insert('FreewayUp()')
  2149.                 insert('dig()')
  2150.                 insert('FreewayDown()')
  2151.               end
  2152.             else
  2153.               if variables.level == 0 then
  2154.                 insert('FreewayUp()')
  2155.               end
  2156.             end
  2157.           else
  2158.             if k%2 == #variables.torchPositions%2 then
  2159.               if variables.level == 0 then
  2160.                 insert('FreewayUp()')
  2161.               end
  2162.             else
  2163.               if variables.level == 1 then
  2164.                 if variables.orientation[1] == "North" or variables.orientation[1] == "South" then
  2165.                   insert('dig()')
  2166.                 end
  2167.                 insert('FreewayDown()')
  2168.               elseif variables.orientation[1] == "North" or variables.orientation[1] == "South" then
  2169.                 insert('FreewayDown()')
  2170.                 insert('dig()')
  2171.                 insert('FreewayUp()')
  2172.               end
  2173.             end
  2174.           end
  2175.         elseif variables.orientation[1] == "North" or variables.orientation[1] == "South" then
  2176.           if variables.level == 0 then
  2177.             insert('FreewayUp()')
  2178.           end
  2179.         end]])
  2180.         insert([[if variables.level == 1 then
  2181.           turtle.placeDown()
  2182.         elseif variables.level == 0 then
  2183.           if not turtle.placeUp() then
  2184.             insert('FreewayUp()')
  2185.             insert('left()')
  2186.             insert('turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])')
  2187.             insert('dig()')
  2188.             insert('turtle.place()')
  2189.             insert('right()')
  2190.             insert('FreewayDown()')
  2191.             insert('turtle.select(SlotCalculator("T", "check")[1])')
  2192.             insert('turtle.placeUp()')
  2193.           end
  2194.         end]])
  2195.         insert([[for k, v in ipairs(SlotCalculator("T", "empty")) do
  2196.           variables.slots[v] = "_"
  2197.         end
  2198.         local stupid = SlotCalculator("_", "empty")
  2199.         for k, v in ipairs(stupid) do
  2200.           if k > #stupid-math.ceil(variables.TorchDemand/64) then
  2201.             variables.slots[v] = "T"
  2202.           end
  2203.         end]])
  2204.         insert([[if func == compStep then
  2205.           variables.TorchDemand = variables.TorchDemand - 1
  2206.         end
  2207.         turtle.select(SlotCalculator("_", "empty")[1])]])
  2208.       end
  2209.     end
  2210.     if func == compStep then
  2211.       if Steprepeat == settings.length then
  2212.         insert('Freeway()')
  2213.       else
  2214.         insert('compStep()')
  2215.       end
  2216.     end
  2217.   end
  2218. end
  2219.  
  2220. function tunnel(first)
  2221.   if settings.Autofuel == true then
  2222.     insert('Fuel()')
  2223.   end
  2224.   if settings.trash == true then
  2225.     insert('trash()')
  2226.   end
  2227.   if settings.chestSelect == 1 then
  2228.     insert('Enderchest()')
  2229.   elseif settings.chestSelect == 2 then
  2230.     insert('NormalChest()')
  2231.   end
  2232.   insert("mainstep(settings.tunnelspace, "..tostring(first)..")")
  2233.   insert("turtle.turnRight()")
  2234.   insert('old_orientation = {}')
  2235.   insert([[for k,v in ipairs(variables.orientation) do
  2236.     old_orientation[k] = v
  2237.   end]])
  2238.   for i = 1, 4 do
  2239.     insert('variables.orientation['..tostring(i)..'] = old_orientation[('..tostring(i)..'+2)%4+1]')
  2240.   end
  2241.   insert("youJustGotLittUp(settings.length, stepAside)")
  2242.   insert([[if variables.level == 1 then
  2243.     insert('CompareAll("CompareBack()", "CompareDown()")')
  2244.     insert('FreewayDown()')
  2245.     insert('CompareAll("CompareBack()", "CompareUp()")')
  2246.   else
  2247.     insert('CompareAll("CompareBack()", "CompareUp()")')
  2248.     insert('FreewayUp()')
  2249.     insert('CompareAll("CompareBack()", "CompareDown()")')
  2250.   end]])
  2251.   insert('face(3)')
  2252.   insert('old_orientation = {}')
  2253.   insert([[for k,v in ipairs(variables.orientation) do
  2254.     old_orientation[k] = v
  2255.   end]])
  2256.   for i = 1, 4 do
  2257.     insert('variables.orientation['..tostring(i)..'] = old_orientation[('..tostring(i)..'+1)%4+1]')
  2258.   end
  2259.   insert('variables.direction = 1')
  2260.   insert("youJustGotLittUp(settings.length, compStep)")
  2261.   insert("youJustGotLittUp(settings.length, stepAside, true)")
  2262.   insert([[if variables.level == 1 then
  2263.     insert('CompareAll("CompareBack()", "CompareDown()")')
  2264.     insert('FreewayDown()')
  2265.     insert('CompareAll("CompareBack()", "CompareUp()")')
  2266.   else
  2267.     insert('CompareAll("CompareBack()", "CompareUp()")')
  2268.     insert('FreewayUp()')
  2269.     insert('CompareAll("CompareBack()", "CompareDown()")')
  2270.   end]])
  2271.   insert('face(3)')
  2272.   insert('old_orientation = {}')
  2273.   insert([[for k,v in ipairs(variables.orientation) do
  2274.     old_orientation[k] = v
  2275.   end]])
  2276.   for i = 1, 4 do
  2277.     insert('variables.orientation['..tostring(i)..'] = old_orientation[('..tostring(i)..'+1)%4+1]')
  2278.   end
  2279.   insert('variables.direction = 1')
  2280.   insert("youJustGotLittUp(settings.length, compStep, true)")
  2281.   insert('turtle.turnLeft()')
  2282.   insert('old_orientation = {}')
  2283.   insert([[for k,v in ipairs(variables.orientation) do
  2284.     old_orientation[k] = v
  2285.   end]])
  2286.   for i = 1, 4 do
  2287.     insert('variables.orientation['..tostring(i)..'] = old_orientation[('..tostring(i)..')%4+1]')
  2288.   end
  2289. end
  2290.  
  2291. function go()
  2292.   saveVars("resume/settings", settings)
  2293.   variables.startDay = os.day()
  2294.   variables.startTime = os.time()
  2295.   for Tunnelrepeat = 1, settings.quantity do
  2296.     insert("tunnel("..tostring(Tunnelrepeat == 1)..")")
  2297.     insert([[variables.CrosswayAmount = variables.CrosswayAmount + 1
  2298.     print(lang.status(settings.language, 8, variables.CrosswayAmount, settings.quantity))]])
  2299.   end
  2300.   insert('print(lang.status(settings.language, 9))')
  2301.   insert('turn()')
  2302.   insert([[if variables.level == 1 then
  2303.     FreewayDown()
  2304.   end]])
  2305.   for Way_Back = 1, settings.quantity*settings.tunnelspace do
  2306.     insert('Freeway()')
  2307.   end
  2308.   if settings.trash == true then
  2309.     insert('trash()')
  2310.   end
  2311.   if settings.chestSelect == 1 then
  2312.     insert("Enderchest(true)")
  2313.   elseif settings.chestSelect == 2 then
  2314.     insert("NormalChest(true, true)")
  2315.   end
  2316.   insert([[local endDay = os.day()
  2317.   local endTime = os.time()
  2318.   variables.stats["time"] = (endDay-variables.startDay)*24.000+(endTime-variables.startTime)]])
  2319. end
  2320.  
  2321. function Navigation()
  2322.   table.insert(timer, os.startTimer(0.05))
  2323.   while true do
  2324.     local tempState = menustate
  2325.     local event, p1, p2, p3 = os.pullEvent()
  2326.     while (event == "timer" and p1 ~= timer[#timer]) or event == "key_up" do
  2327.       event, p1, p2, p3 = os.pullEvent()
  2328.     end
  2329.     if menuVars["drawOptions"].focus == 100 then
  2330.       basicInputHandler(menu[menustate].orientation, event, p1)
  2331.     end
  2332.     if menustate == "Quit" then
  2333.       break
  2334.     elseif menustate == "Save as default" then
  2335.       saveVars("settings", settings)
  2336.       menuVars["drawOptions"].saved = true
  2337.       menustate = "Options"
  2338.     elseif menustate == "Go!" then
  2339.       menustate = "Popup"
  2340.       local ready = true
  2341.       for i = 1, #errors do
  2342.         if errors[i] == true then
  2343.           ready = false
  2344.         end
  2345.       end
  2346.       if (Fuellevel ~= "low" and ready == true) or tempState == "Popup" then
  2347.         return execute()
  2348.       end
  2349.     end
  2350.     term.clear()
  2351.     drawHeader()
  2352.     if tempState == menustate then
  2353.       menu[menustate].draw(event, p1, p2, p3)
  2354.     else
  2355.       menu[menustate].draw()
  2356.     end
  2357.     if tempState == "Update" then
  2358.       save("database/"..programName.."/updateCheckbox/V2.6", checkbox)
  2359.     end
  2360.     table.insert(timer, os.startTimer(0.5))
  2361.   end
  2362. end
  2363.  
  2364. function extractstats()
  2365.   save("database/"..programName.."/variables.stats", variables.stats)
  2366. end
  2367.  
  2368. function close()
  2369.   fs.delete("database/"..programName.."/resume")
  2370.   term.clear()
  2371.   term.setCursorPos(1,1)
  2372.   if Color() then
  2373.     term.setTextColor(colors.yellow)
  2374.     print(os.version())
  2375.     term.setTextColor(colors.white)
  2376.   else
  2377.     print(os.version())
  2378.   end
  2379.   term.setCursorPos(1, 2)
  2380. end
  2381.  
  2382. -----###-----Executive-----###------
  2383.  
  2384. local function compile(chunk) -- returns compiled chunk or nil and error message
  2385.   if type(chunk) ~= "string" then
  2386.     error("expected string, got ".. type(chunk), 2)
  2387.   end
  2388.  
  2389.   local function findChunkName(var)
  2390.     for k,v in pairs(HOST_ENV) do
  2391.       if v==var then
  2392.         return k
  2393.       end
  2394.     end
  2395.     return "Unknown chunk"
  2396.   end
  2397.  
  2398.   return load(chunk, findChunkName(chunk), "t", OUR_ENV)
  2399. end
  2400.  
  2401. function getOrientation(resume)
  2402.   if resume then
  2403.     for i = 1, 2-variables.level do
  2404.       insert('FreewayUp()')
  2405.     end
  2406.   end
  2407.   if #SlotCalculator("T", "check") ~= 0 then
  2408.     insert('Freeway()')
  2409.     if Version >= 1.64 then
  2410.       insert('FreewayUp()')
  2411.       for i = 1, 3 do
  2412.         insert('right()')
  2413.         insert('dig(true)')
  2414.       end
  2415.       insert('right()')
  2416.       insert([[if turtle.detect() == false then
  2417.         turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])
  2418.         turtle.place()
  2419.       end]])
  2420.       insert('FreewayDown()')
  2421.       insert('turtle.select(SlotCalculator("T", "check")[1])')
  2422.       insert('turtle.placeUp()')
  2423.  
  2424.       insert('torch = {"West", "East", "North", "South"}')
  2425.       insert('_, data = turtle.inspectUp()')
  2426.       insert('new_orientation = torch[data.metadata]')
  2427.  
  2428.       insert('digUp()')
  2429.       insert('FreewayBack()')
  2430.       insert('_, data, torch = nil, nil, nil')
  2431.     else
  2432.       insert('Freeway()')
  2433.       insert('digDown()')
  2434.       insert('FreewayUp()')
  2435.       for i = 1, 4 do
  2436.         insert([[if turtle.detect() == false then
  2437.           turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])
  2438.           turtle.place()
  2439.         end]])
  2440.         insert('right()')
  2441.       end
  2442.       insert('FreewayDown()')
  2443.       insert('turtle.select(SlotCalculator("T", "check")[1])')
  2444.       insert('turtle.placeUp()')
  2445.  
  2446.       insert('torch = {"West", "South", "East", "North"}')
  2447.       for i = 1, 4 do
  2448.         insert('Freeway()')
  2449.         insert('digUp()')
  2450.         insert('os.sleep(0.5)')
  2451.         insert('FreewayBack()')
  2452.         insert([[if turtle.detectUp() == false then
  2453.           i = ]]..tostring(i)..[[
  2454.           insert('turtle.select(SlotCalculator("T", "check")[1])')
  2455.           insert('turtle.suckDown()')
  2456.           insert('new_orientation = torch[i]')
  2457.           insert('i = nil')
  2458.         end]])
  2459.         insert('turtle.turnLeft()')
  2460.       end
  2461.       insert('face(variables.direction)')
  2462.       insert('FreewayBack()')
  2463.     end
  2464.   end
  2465.   if resume then
  2466.     for i = 1, 2-variables.level do
  2467.       insert('FreewayDown()')
  2468.     end
  2469.     insert([[for k, v in pairs(cardinal) do
  2470.       if v == new_orientation then
  2471.         new_orientation = k
  2472.       end
  2473.       if v == variables.orientation[variables.direction] then
  2474.         variables.orientation[variables.direction] = k
  2475.       end
  2476.     end]])
  2477.     insert([[if new_orientation ~= variables.orientation[variables.direction] then
  2478.       if math.abs(new_orientation-variables.orientation[variables.direction]) == 2 then
  2479.         insert('turtle.turnLeft()')
  2480.         insert('turtle.turnLeft()')
  2481.       elseif (new_orientation-variables.orientation[variables.direction]+1)%4 == 0 then
  2482.         insert('turtle.turnLeft()')
  2483.       elseif (new_orientation-variables.orientation[variables.direction]-1)%4 == 0 then
  2484.         insert('turtle.turnRight()')
  2485.       end
  2486.     end]])
  2487.     insert('variables.orientation[variables.direction] = cardinal[variables.orientation[variables.direction]]')
  2488.   else
  2489.     insert([[for k, v in ipairs(cardinal) do
  2490.       if new_orientation == v then
  2491.         for i = 1, 4 do
  2492.           table.insert(variables.orientation, cardinal[(k+i-2)%4+1])
  2493.         end
  2494.       end
  2495.     end]])
  2496.   end
  2497. end
  2498.  
  2499. function execute(resume)
  2500.   if not resume then
  2501.     todoList = {"go()"}
  2502.   end
  2503.   table.insert(todoList, 1, 'getOrientation('..tostring(resume)..')')
  2504.   while #todoList > 0 do
  2505.     compile(todoList[1])()
  2506.     table.remove(todoList, 1)
  2507.     variables.index = 2
  2508.     save("database/"..programName.."/resume/todoList", todoList, true)
  2509.     saveVars("resume/variables", variables)
  2510.   end
  2511. end
  2512.  
  2513. function main()
  2514.   os.loadAPI("database/"..programName.."/lang")
  2515.   if fs.exists("database/"..programName.."/resume") then
  2516.     local countdown = 10
  2517.     local count = {}
  2518.     term.clear()
  2519.     drawResume(countdown)
  2520.     table.insert(count, os.startTimer(1))
  2521.     repeat
  2522.       local event, p1 = os.pullEvent()
  2523.       while (event == "timer" and p1 ~= count[#count]) do
  2524.         event, p1 = os.pullEvent()
  2525.       end
  2526.       if event == "key" then
  2527.         if p1 == 28 then
  2528.           fs.delete("database/"..programName.."/resume")
  2529.           return main()
  2530.         end
  2531.       elseif event == "timer" and p1 == count[#count] then
  2532.         countdown = countdown - 1
  2533.       end
  2534.       term.clear()
  2535.       drawResume(countdown)
  2536.       table.insert(count, os.startTimer(1))
  2537.     until countdown == 0
  2538.     getVariables("resume/settings")
  2539.     getVariables("resume/variables")
  2540.     getList("resume/todoList")
  2541.     execute(true)
  2542.   else
  2543.     update()
  2544.     if kill == true then
  2545.       return
  2546.     end
  2547.     save("database/"..programName.."/state", "0")
  2548.     getVariables("settings")
  2549.     Navigation()
  2550.   end
  2551.   --extractstats()
  2552.   close()
  2553. end
  2554.  
  2555. main()
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top