Advertisement
pedrosgali

Fancy new Move API

Mar 18th, 2014
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 29.29 KB | None | 0 0
  1. --NEW ALL SINGING ALL DANCING MOVE API--
  2.  
  3. os.loadAPI("API/draw") --I know you shouldn't do this =)
  4.  
  5. --CONSTANTS
  6.  
  7. N = 0
  8. E = 1
  9. S = 2
  10. W = 3
  11. FUEL = 1
  12. FUELMIN = 80
  13.  
  14. --VARIABLES
  15.  
  16. digging = false
  17. building = false
  18. refuel = false
  19. unloading = false
  20.  
  21. --LOADED INIT
  22.  
  23. function init()
  24.     if fs.exists("Tables/myTab") then
  25.         data = fs.open("Tables/myTab", "r")
  26.         myTab = textutils.unserialize(data.readLine())
  27.         data.close()
  28.     else
  29.         local x, y = term.getSize()
  30.         draw.clear()
  31.         draw.centerText(1, x, (y / 2) - 1, draw.black, draw.lime, "Hi there! I'm your new turtle friend")
  32.         sleep(2)
  33.         draw.centerText(1, x, (y / 2) + 1, draw.black, draw.lime, ".;,;.")
  34.         sleep(2)
  35.         draw.clear()
  36.         draw.centerText(1, x, (y / 2), draw.black, draw.lime, "Main thing really, what is my name?")
  37.         sleep(1)
  38.         draw.centerText(1, x, (y / 2) + 1, draw.black, draw.lime, "try to keep it under 7 letters,")
  39.         sleep(1)
  40.         draw.centerText(1, x, (y / 2) + 2, draw.black, draw.lime, "I get scared by long words.")
  41.         sleep(1)
  42.         draw.centerText(1, x, (y / 2) + 3, draw.black, draw.lightBlue, "I shall call you ")
  43.         tName = tostring(read())
  44.         os.setComputerLabel(tName)
  45.         sleep(1)
  46.         draw.clear()
  47.         draw.centerText(1, x, (y / 2) - 1, draw.black, draw.lime, "Hmmm, "..tName..".")
  48.         sleep(2)
  49.         draw.centerText(1, x, (y / 2), draw.black, draw.lime, "Hi there, I'm "..tName..".")
  50.         sleep(2)
  51.         draw.centerText(1, x, (y / 2) + 1, draw.black, draw.lime, "Good work "..tName)
  52.         sleep(2)
  53.         draw.centerText(1, x, (y / 2) + 2, draw.black, draw.lime, "That's what you'll be saying.")
  54.         sleep(2)
  55.         draw.centerText(1, x, (y / 2) + 3, draw.black, draw.lime, "Yeah, "..tName.." good choice boss. .;,;.")
  56.         sleep(2)
  57.         draw.clear()
  58.         draw.centerText(1, x, (y / 2) - 1, draw.black, draw.lime, "So, what is my X co-ordinate?")
  59.         sleep(1)
  60.         draw.centerText(1, x, (y / 2), draw.black, draw.lightBlue, "You're at ")
  61.         startX = tonumber(read())
  62.         sleep(1)
  63.         draw.clear()
  64.         draw.centerText(1, x, (y / 2) - 1, draw.black, draw.lime, "So, what is my Y co-ordinate?")
  65.         sleep(1)
  66.         draw.centerText(1, x, (y / 2), draw.black, draw.lightBlue, "You're at ")
  67.         startY = tonumber(read())
  68.         sleep(1)
  69.         draw.clear()
  70.         draw.centerText(1, x, (y / 2) - 1, draw.black, draw.lime, "So, what is my Z co-ordinate?")
  71.         sleep(1)
  72.         draw.centerText(1, x, (y / 2), draw.black, draw.lightBlue, "You're at ")
  73.         startZ = tonumber(read())
  74.         sleep(1)
  75.         while true do
  76.             draw.clear()
  77.             draw.centerText(1, x, (y / 2) - 1, draw.black, draw.lime, "So, what direction am I facing?")
  78.             sleep(1)
  79.             draw.centerText(1, x, (y / 2), draw.black, draw.lightBlue, "You're facing ")
  80.             startH = read()
  81.             if startH == "north" or startH == "North" or startH == "n" or startH == "N" then
  82.                 startH = N
  83.                 break
  84.             elseif startH == "east" or startH == "East" or startH == "e" or startH == "E" then
  85.                 startH = E
  86.                 break
  87.             elseif startH == "south" or startH == "South" or startH == "s" or startH == "S" then
  88.                 startH = S
  89.                 break
  90.             elseif startH == "west" or startH == "West" or startH == "w" or startH == "W" then
  91.                 startH = W
  92.                 break
  93.             end
  94.             sleep(1)
  95.         end
  96.         draw.clear()
  97.         draw.centerText(1, x, (y / 2) - 1, draw.black, draw.lime, "What's the Id of the server?")
  98.         sleep(1)
  99.         draw.centerText(1, x, (y / 2), draw.black, draw.lightBlue, "The server Id is ")
  100.         startServer = tonumber(read())
  101.         sleep(1)
  102.         draw.clear()
  103.         draw.centerText(1, x, (y / 2) - 1, draw.black, draw.lime, "And finally,")
  104.         sleep(1)
  105.         draw.centerText(1, x, (y / 2), draw.black, draw.lime, "what is my safe move height?")
  106.         sleep(1)
  107.         draw.centerText(1, x, (y / 2) + 1, draw.black, draw.lightBlue, "The safezone is ")
  108.         startSafe = tonumber(read())
  109.         sleep(1)
  110.         draw.clear()
  111.         myTab = {
  112.             xPos = startX;
  113.             yPos = startY;
  114.             zPos = startZ;
  115.             hPos = startH;
  116.             name = tName;
  117.             home = true;
  118.                         homeX = startX;
  119.             homeY = startY;
  120.             homeZ = startZ;
  121.             homeH = startH;
  122.             state = "Initialised.";
  123.             server = startServer;
  124.             safezone = startSafe;
  125.             curSlot = 1;
  126.             lastSlot = 1;
  127.             targetSlot = 2;
  128.         }
  129.     end
  130.     saveMyData()
  131.     loadLocData()
  132.     loadOnboardData()
  133. end
  134.  
  135. --TABLE FUNCTIONS
  136.  
  137. function addLoc(label, locX, locY, locZ, locH)
  138.     loadLocData()
  139.     if locTab[1] ~= nil then
  140.         locMax = #locTab + 1
  141.     else
  142.         locMax = 1
  143.     end
  144.     if locMax > 1 then
  145.         for i = 1, #locTab do
  146.             if locTab[i][1] == label then
  147.                 report("Amending old data...")
  148.                 locTab[i][1] = label
  149.                 locTab[i][2] = locX
  150.                 locTab[i][3] = locY
  151.                 locTab[i][4] = locZ
  152.                 locTab[i][5] = locH
  153.                 report("Location "..label.." updated.")
  154.                 saveLocs()
  155.                 return
  156.             end
  157.         end
  158.     end
  159.     locTab[locMax] = {}
  160.     locTab[locMax][1] = label
  161.     locTab[locMax][2] = locX
  162.     locTab[locMax][3] = locY
  163.     locTab[locMax][4] = locZ
  164.     locTab[locMax][5] = locH
  165.     report("Location "..label.." added.")
  166.     saveLocs()
  167. end
  168.  
  169. function setReturnPoint(label)
  170.     addLoc(label, myTab.xPos, myTab.yPos, myTab.zPos, myTab.hPos)
  171. end
  172.  
  173. function resetHome()
  174.     loadData()
  175.     myTab.homeX = myTab.xPos
  176.     myTab.homeY = myTab.yPos
  177.     myTab.homeZ = myTab.zPos
  178.     myTab.homeH = myTab.hPos
  179.     saveMyData()
  180. end
  181.  
  182. --REDNET FUNCTIONS
  183.  
  184. function report(text, refresh)
  185.     if refresh ~= nil then
  186.         draw.clear()
  187.     end
  188.     myTab.state = text
  189.     saveMyData()
  190.     print(text)
  191.     transmit()
  192. end
  193.  
  194. function listen()
  195.     rednet.open("right")
  196.     while true do
  197.         id, msg = rednet.receive()
  198.         if id == myTab.server then
  199.             if msg == "recall" then
  200.                 goHome()
  201.                 os.reboot()
  202.             elseif string.sub(msg, 1, 6) == "travel" then
  203.                 moveToLoc(string.sub(msg, 8, #msg))
  204.                 return
  205.             end
  206.         end
  207.     end
  208. end
  209.  
  210. function transmit()
  211.     rednet.open("right")
  212.     rednet.send(myTab.server, textutils.serialize(myTab))
  213. end
  214.  
  215. --FILE FUNCTIONS
  216.  
  217. function saveMyData()
  218.     data = fs.open("Tables/myTab", "w")
  219.     data.writeLine(textutils.serialize(myTab))
  220.     data.close()
  221. end
  222.  
  223. function loadData()
  224.     data = fs.open("Tables/myTab", "r")
  225.     myTab = textutils.unserialize(data.readLine())
  226.     data.close()
  227. end
  228.  
  229. function saveOnboardData()
  230.     datafile = fs.open("Tables/onboardTab", "w")
  231.     datafile.writeLine(textutils.serialize(obTab))
  232.     datafile.close()
  233. end
  234.  
  235. function loadOnboardData()
  236.     if fs.isDir("Tables") then
  237.         if fs.exists("Tables/onboardTab") then
  238.             data = fs.open("Tables/onboardTab", "r")
  239.             obTab = textutils.unserialize(data.readLine())
  240.             data.close()
  241.             return true
  242.         end
  243.     else
  244.         shell.run("mkDir Tables")
  245.     end
  246.     clearOnboardData()
  247. end
  248.  
  249. function saveLocs()
  250.     data = fs.open("Tables/locTab", "w")
  251.     data.writeLine(textutils.serialize(locTab))
  252.     data.close()
  253. end
  254.  
  255. function loadLocData()
  256.     if fs.isDir("Tables") then
  257.         if fs.exists("Tables/locTab") then
  258.             data = fs.open("Tables/locTab", "r")
  259.             locTab = textutils.unserialize(data.readLine())
  260.             data.close()
  261.             return true
  262.         end
  263.     else
  264.         shell.run("mkDir Tables")
  265.     end
  266.     locTab = {}
  267.     saveLocs()
  268. end
  269.  
  270. function loadChestData()
  271.     if fs.exists("Tables/chests") then
  272.         data = fs.open("Tables/chests", "r")
  273.         chestTab = textutils.unserialize(data.readLine())
  274.         data.close()
  275.     else
  276.         chestTab = {}
  277.     end
  278. end
  279.  
  280. --USEFUL FUNCTIONS
  281.  
  282. function clear()
  283.     term.clear()
  284.     term.setCursorPos(1, 1)
  285. end
  286.  
  287. function clearOnboardData()
  288.     obTab = nil
  289.     obTab = {}
  290.     for i = 1, 16 do
  291.         obTab[i] = {}
  292.         if i == FUEL then
  293.             obTab[i][1] = "Fuel"
  294.             obTab[i][2] = turtle.getItemCount(FUEL)
  295.         else
  296.             obTab[i][1] = "Nowt"
  297.             obTab[i][2] = 0
  298.         end
  299.     end
  300.     saveOnboardData()
  301. end
  302.  
  303. function checkOnboardData()
  304.     for i = 1, 16 do
  305.         if obTab[i][1] ~= "Nowt" then
  306.             obTab[i][2] = turtle.getItemCount(i)
  307.         else
  308.             if turtle.getItemCount(i) > 0 then
  309.                 obTab[i][1] = "Unknown"
  310.                 obTab[i][2] = turtle.getItemCount(i)
  311.             end
  312.         end
  313.     end
  314.     saveOnboardData()
  315. end
  316.  
  317. function getFreeSlot()
  318.     for i = 1, 16 do
  319.         if turtle.getItemCount(i) == 0 then
  320.             return(i)
  321.         end
  322.     end
  323.     return false
  324. end
  325.  
  326. function slotSelect(slot)
  327.         turtle.select(slot)
  328.         myTab.lastSlot = myTab.curSlot
  329.         myTab.curSlot = slot
  330. end
  331.  
  332. function emptySlot(slot)
  333.     slotSelect(slot)
  334.     turtle.drop()
  335. end
  336.  
  337. function emptyAll()
  338.     for i = 2, 16 do
  339.         turtle.select(i)
  340.         turtle.drop()
  341.     end
  342.     clearOnboardData()
  343. end
  344.  
  345. function readChest()
  346.     chest = peripheral.wrap("front")
  347.     chest.condenseItems()
  348.     invSize = chest.getInventorySize()
  349.     chkTab = {}
  350.     for i = 1, invSize do
  351.         chkTab[i] = {}
  352.         items = chest.getStackInSlot(i)
  353.         if items ~= nil then
  354.             for key, value in pairs(items) do
  355.                 if key == "name" then
  356.                     chkTab[i][1] = value
  357.                 end
  358.                 if key == "qty" then
  359.                     chkTab[i][2] = value
  360.                 end
  361.             end
  362.         else
  363.             chkTab[i][1] = "Nowt"
  364.             chkTab[i][2] = 0
  365.         end
  366.     end
  367. end
  368.  
  369. function fillSlot(slot)
  370.     while turtle.getItemCount(slot) < 64 do
  371.         slotSelect(slot)
  372.         turtle.suck()
  373.     end
  374. end
  375.  
  376. function fillFrom()
  377.     readChest()
  378.     obTab = {}
  379.     for i = 2, 16 do
  380.         turtle.select(i)
  381.         for j = 1, 54 do
  382.             if chkTab[j][1] ~= "Nowt." then
  383.                 turtle.suck()
  384.                 obTab[i] = {}
  385.                 obTab[i][1] = chkTab[j][1]
  386.                 obTab[i][2] = turtle.getItemCount(i)
  387.                 chkTab[j][1], chkTab[j][2] = "Nowt.", 0
  388.                 print(i..". "..obTab[i][1]..": "..obTab[i][2])
  389.                 break
  390.             end
  391.         end
  392.         if turtle.getItemCount(i) == 0 then
  393.             obTab[i] = {}
  394.             obTab[i][1] = "Nowt."
  395.             obTab[i][2] = 0
  396.         end
  397.     end
  398. end
  399.  
  400. function getItem(item, slot, amt)
  401.     if amt == nil then
  402.         amt = 64
  403.     end
  404.     itemFound = false
  405.     while turtle.getItemCount(slot) < amt do
  406.         readChest()
  407.         if itemFound then
  408.             slotSelect(slot)
  409.             turtle.suck()
  410.             if turtle.getItemCount(slot) >= amt then
  411.                 break
  412.             else
  413.                 itemFound = false
  414.             end
  415.         else
  416.             while not itemFound do
  417.                 readChest()
  418.                 for i = 1, #chkTab do
  419.                     if chkTab[i][1] == item then
  420.                         chest.swapStacks(i, 1)
  421.                         itemFound = true
  422.                         break
  423.                     end
  424.                 end
  425.                 if itemFound then
  426.                     break
  427.                 else
  428.                     sleep(.2)
  429.                 end
  430.             end
  431.         end
  432.     end
  433.     if turtle.getItemCount(slot) > amt then
  434.         dropCount = turtle.getItemCount(slot) - amt
  435.         slotSelect(slot)
  436.         turtle.drop(dropCount)
  437.     end
  438.     obTab[slot][1] = item
  439.     obTab[slot][2] = amt
  440.     saveOnboardData()
  441. end
  442.  
  443. function checkBuild(item)
  444.         for i = 1, 16 do
  445.                 if obTab[i][1] == item then
  446.                         turtle.select(i)
  447.                         turtle.placeDown()
  448.             return true
  449.                 end
  450.         end
  451.     return false
  452. end
  453.  
  454. function checkFull()
  455.     if turtle.getItemCount(16) > 0 then
  456.         unloading = true
  457.         addLoc("whereIWas", myTab.xPos, myTab.yPos, myTab.zPos, myTab.hPos)
  458.         moveToLoc("digSiteEntry", "l")
  459.         goHome()
  460.         unload()
  461.         moveToLoc("digSiteEntry")
  462.         moveToLoc("whereIWas", "l")
  463.     end
  464. end
  465.  
  466. function unload()
  467.     unloading = true
  468.     rt()
  469.     emptyAll()
  470.     report("Need sort")
  471.     spin()
  472.     fillSlot(FUEL)
  473.     emptyAll()
  474.     rt()
  475.     unloading = false
  476.     refuel = false
  477. end
  478.  
  479. --MOVEMENT FUNCTIONS
  480.  
  481. function checkFuel()
  482.         slotSelect(FUEL)
  483.         fuelLevel = turtle.getFuelLevel()
  484.         if not refuel then
  485.                 if turtle.getItemCount(FUEL) > 16 then
  486.                         while fuelLevel < FUELMIN do
  487.                                 turtle.refuel(1)
  488.                                 fuelLevel = turtle.getFuelLevel()
  489.                         end
  490.                 else
  491.                         refuel = true
  492.             addLoc("whereIWas", myTab.xPos, myTab.yPos, myTab.zPos, myTab.hPos)
  493.             if digging then
  494.                 moveToLoc("digSiteEntry", "l")
  495.             end
  496.                         goHome()
  497.             unload()
  498.             if digging then
  499.                 moveToLoc("digSiteEntry", "l")
  500.                 moveToLoc("whereIWas", "l")
  501.             else
  502.                 moveToLoc("whereIWas")
  503.             end
  504.                 end
  505.         else
  506.                 if turtle.getItemCount(FUEL) > 0 and fuelLevel < FUELMIN then
  507.                         turtle.refuel(1)
  508.                 else
  509.                         report("Out of Fuel.")
  510.                 end
  511.         end
  512.         slotSelect(myTab.lastSlot)
  513. end
  514.  
  515. function fd(dist, modi)
  516.     loadData()
  517.         checkFuel()
  518.     if dist == nil then dist = 1 end
  519.     if unloading == false and refuel == false then
  520.         if digging then checkFull() end
  521.     end
  522.     for i = 1, dist do
  523.         while true do
  524.             if modi == "dig" or modi == "d" then
  525.                 turtle.dig()
  526.             elseif modi == "tunnel" or modi == "t" then
  527.                 turtle.digUp()
  528.                 turtle.digDown()
  529.                 turtle.dig()
  530.             end
  531.             if turtle.forward() then
  532.                 if myTab.hPos == 0 then
  533.                     myTab.zPos = myTab.zPos - 1
  534.                     report("Moving N", "c")
  535.                 elseif myTab.hPos == 1 then
  536.                     myTab.xPos = myTab.xPos + 1
  537.                     report("Moving E", "c")
  538.                 elseif myTab.hPos == 2 then
  539.                     myTab.zPos = myTab.zPos + 1
  540.                     report("Moving S", "c")
  541.                 elseif myTab.hPos == 3 then
  542.                     myTab.xPos = myTab.xPos - 1
  543.                     report("Moving W", "c")
  544.                 end
  545.                 saveMyData()
  546.                 break
  547.             else
  548.                 report("Blocked F", "c")
  549.                 if not digging then
  550.                     unblock()
  551.                 end
  552.             end
  553.         end
  554.     end
  555. end
  556.  
  557. function bk(dist, modi)
  558.     loadData()
  559.         checkFuel()
  560.     if dist == nil then dist = 1 end
  561.     for i = 1, dist do
  562.         while true do
  563.             if modi == "build" or modi == "b" then
  564.                 checkBuild(myTab.targetSlot)
  565.             end
  566.             if turtle.back() then
  567.                 if myTab.hPos == 0 then
  568.                     myTab.zPos = myTab.zPos + 1
  569.                     report("Reversing S", "c")
  570.                 elseif myTab.hPos == 1 then
  571.                     myTab.xPos = myTab.xPos - 1
  572.                     report("Reversing W", "c")
  573.                 elseif myTab.hPos == 2 then
  574.                     myTab.zPos = myTab.zPos - 1
  575.                     report("Reversing N", "c")
  576.                 elseif myTab.hPos == 3 then
  577.                     myTab.xPos = myTab.xPos + 1
  578.                     report("Reversing E", "c")
  579.                 end
  580.                 saveMyData()
  581.                 break
  582.             else
  583.                 report("Blocked B")
  584.             end
  585.         end
  586.     end
  587. end
  588.  
  589. function up(dist, modi)
  590.     loadData()
  591.         checkFuel()
  592.     if dist == nil then dist = 1 end
  593.     for i = 1, dist do
  594.         while true do
  595.             if modi == "dig" or modi == "d" then
  596.                 turtle.digUp()
  597.             end
  598.             if turtle.up() then
  599.                 myTab.yPos = myTab.yPos + 1
  600.                 report("Ascending")
  601.                 saveMyData()
  602.                 break
  603.             else
  604.                 report("Blocked U")
  605.             end
  606.         end
  607.     end
  608. end
  609.  
  610. function dn(dist, modi)
  611.     loadData()
  612.         checkFuel()
  613.     if dist == nil then dist = 1 end
  614.     for i = 1, dist do
  615.         while true do
  616.             if modi == "dig" or modi == "d" then
  617.                 turtle.digDown()
  618.             end
  619.             if turtle.down() then
  620.                 myTab.yPos = myTab.yPos - 1
  621.                 report("Descending")
  622.                 saveMyData()
  623.                 break
  624.             else
  625.                 report("Blocked D")
  626.             end
  627.         end
  628.     end
  629. end
  630.  
  631. function rt()
  632.     loadData()
  633.         turtle.turnRight()
  634.         myTab.hPos = (myTab.hPos + 1)%4
  635.     report(myTab.hPos)
  636.     saveMyData()
  637. end
  638.  
  639. function lt()
  640.     loadData()
  641.         turtle.turnLeft()
  642.         myTab.hPos = (myTab.hPos - 1)%4
  643.     report(myTab.hPos)
  644.     saveMyData()
  645. end
  646.  
  647. function spin()
  648.         rt()
  649.         rt()
  650. end
  651.  
  652. --ADVANCED MOVEMENT FUNCTIONS
  653.  
  654. function unblock()
  655.     report("Unblocking!")
  656.     local upBool, dnBool = true, true
  657.     local yLine = myTab.yPos
  658.     while turtle.detect() do
  659.         if turtle.detectUp() then
  660.             upBool = false
  661.             report("not up")
  662.         end
  663.         if turtle.detectDown() then
  664.             dnBool = false
  665.             report("not down")
  666.         end
  667.         local coinToss = math.random(0, 1)
  668.         if coinToss == 0 then
  669.             if upBool then
  670.                 up()
  671.             else
  672.                 dn()
  673.             end
  674.         else
  675.             if dnBool then
  676.                 dn()
  677.             else
  678.                 up()
  679.             end
  680.         end
  681.     end
  682. end
  683.  
  684. function face(heading)
  685.     heading = tonumber(heading)
  686.         if heading < myTab.hPos then
  687.         if myTab.hPos == 3 and heading == 0 then
  688.             left = false
  689.         else
  690.             left = true
  691.         end
  692.     else
  693.         if myTab.hPos == 0 and heading == 3 then
  694.             left = true
  695.         else
  696.             left = false
  697.         end
  698.     end
  699.     while heading ~= myTab.hPos do
  700.         if left then
  701.             lt()
  702.         else
  703.             rt()
  704.         end
  705.     end
  706.     saveMyData()
  707. end
  708.  
  709. function findX(target, modi)
  710.     loadData()
  711.         report("Finding "..target.." on X axis")
  712.         if target > myTab.xPos then
  713.                 face(E)
  714.         else
  715.                 face(W)
  716.     end
  717.         while myTab.xPos ~= target do
  718.                 if modi == nil then
  719.                         fd()
  720.                 elseif modi == "dig" or modi == "d" then
  721.                         fd(1, modi)
  722.                 end
  723.         end
  724. end
  725.  
  726. function findZ(target, modi)
  727.     loadData()
  728.         report("Finding "..target.." on Z axis")
  729.         if target < myTab.zPos then
  730.                 face(N)
  731.         else
  732.                 face(S)
  733.     end
  734.     while myTab.zPos ~= target do
  735.         if modi == nil then
  736.             fd()
  737.         elseif modi == "dig" or modi == "d" then
  738.             fd(1, modi)
  739.         end
  740.     end
  741. end
  742.  
  743. function findY(target, modi)
  744.     loadData()
  745.         report("Finding "..target.." on Y axis")
  746.         if target < myTab.yPos then
  747.                 while target < myTab.yPos do
  748.                         if modi == nil then
  749.                                 dn()
  750.                         elseif modi == "dig" or modi == "d" then
  751.                                 dn(1, modi)
  752.                         end
  753.                 end
  754.         else
  755.                 while target > myTab.yPos do
  756.                         if modi == nil then
  757.                                 up()
  758.                         elseif modi == "dig" or modi == "d" then
  759.                                 up(1, modi)
  760.                         end
  761.                 end
  762.         end
  763. end
  764.  
  765. function travel(tgtX, tgtY, tgtZ, tgtH)
  766.     report("Outbound")
  767.     myTab.home = false
  768.     saveMyData()
  769.     loadData()
  770.     findY(myTab.safezone, "d")
  771.     findX(tgtX)
  772.     findZ(tgtZ)
  773.     findY(tgtY, "d")
  774.     face(tgtH)
  775.     report("Arrived")
  776. end
  777.  
  778. function moveToLoc(label, modi)
  779.     myTab.home = false
  780.     saveMyData()
  781.     loadLocData()
  782.     for i = 1, #locTab do
  783.         if locTab[i][1] == label then
  784.             if modi ~= nil then
  785.                 if modi == "lateral" or modi == "l" then
  786.                     findX(locTab[i][2], "d")
  787.                     findZ(locTab[i][4], "d")
  788.                     face(locTab[i][5])
  789.                 else
  790.                     travel(locTab[i][2], locTab[i][3], locTab[i][4], locTab[i][5], modi)
  791.                     break
  792.                 end
  793.             else
  794.                 travel(locTab[i][2], locTab[i][3], locTab[i][4], locTab[i][5])
  795.                 break
  796.             end
  797.         end
  798.     end
  799. end
  800.  
  801. function goHome()
  802.     report("Inbound")
  803.     loadData()
  804.     findY(myTab.safezone, "d")
  805.     findZ(myTab.homeZ)
  806.     findX(myTab.homeX)
  807.     findY(myTab.homeY, "d")
  808.     face(myTab.homeH)
  809.     myTab.home = true
  810.     saveMyData()
  811. end
  812.  
  813. --MINING FUNCTIONS
  814.  
  815. function digGrid(length, width)
  816.     turn = true
  817.     length = length - 1
  818.     for i = 1, width do
  819.         if i ~= width then
  820.             fd(length, "t")
  821.             if turn then
  822.                 rt()
  823.             else
  824.                 lt()
  825.             end
  826.             fd(1, "t")
  827.             if turn then
  828.                 rt()
  829.             else
  830.                 lt()
  831.             end
  832.             turn = not turn
  833.         else
  834.             fd(length, "t")
  835.         end
  836.     end
  837.     turtle.digUp()
  838.     turtle.digDown()
  839. end
  840.  
  841. function quarry(length, width, fb)
  842.     digging = true
  843.     if fb ~= nil then
  844.         depth = 2
  845.     else
  846.         depth = 6
  847.     end
  848.     findY(depth, "d")
  849.     fd(1, "t")
  850.     turtle.digUp()
  851.     turtle.digDown()
  852.     while not turtle.detectUp() do
  853.         up()
  854.     end
  855.     dn()
  856.     bk()
  857.     while myTab.yPos < myTab.safezone do
  858.         addLoc("digSiteEntry", myTab.xPos, myTab.yPos, myTab.zPos, myTab.hPos)
  859.         digGrid(length, width)
  860.         moveToLoc("digSiteEntry", "l")
  861.         up(3)
  862.     end
  863.     digging = false
  864.     goHome()
  865.     unload()
  866. end
  867.  
  868. --BUILDING FUNCTIONS
  869.  
  870. function loadBlueprint(label)
  871.     data = fs.open("Blueprints/"..label, "r")
  872.     bpTab = textutils.unserialize(data.readLine())
  873.     data.close()
  874. end
  875.  
  876. function itemPlace(item)
  877.     for i = 2, 16 do
  878.         if obTab[i][1] == item then
  879.             if obTab[i][2] > 0 then
  880.                 slotSelect(i)
  881.                 report("Placing "..item)
  882.                 if turtle.placeDown() then
  883.                     obTab[i][2] = obTab[i][2] - 1
  884.                 end
  885.                 break
  886.             end
  887.         end
  888.     end
  889. end
  890.  
  891. function countItems(level)
  892.     typeCount = {}
  893.     skipLayer = false
  894.     report("Checking Blueprint.")
  895.     for i = 1, #bpTab[level] do
  896.         for j = 1, #bpTab[level][i] do
  897.             found = false
  898.             if bpTab[level][i][j][1] ~= "air" then
  899.                 if typeCount[1] ~= nil then
  900.                     for k = 1, #typeCount do
  901.                         if typeCount[k][1] == bpTab[level][i][j][1] then
  902.                             typeCount[k][2] = typeCount[k][2] + 1
  903.                             found = true
  904.                             break
  905.                         end
  906.                     end
  907.                     if not found then
  908.                         report("New type found.")
  909.                         newMax = #typeCount + 1
  910.                         typeCount[newMax] = {}
  911.                         typeCount[newMax][1] = bpTab[level][i][j][1]
  912.                         typeCount[newMax][2] = 1
  913.                         --report(typeCount[newMax][1].." "..typeCount[newMax][2])
  914.                     end
  915.                 else
  916.                     report("First type found.")
  917.                     typeCount[1] = {}
  918.                     typeCount[1][1] = bpTab[level][i][j][1]
  919.                     typeCount[1][2] = 1
  920.                     --report(typeCount[1][1].." "..typeCount[1][2])
  921.                 end
  922.             end
  923.         end
  924.     end
  925.     if typeCount[1] == nil then
  926.         skipLayer = true
  927.     end
  928. end
  929.  
  930. function readBlueprint(label, level)
  931.     if fs.exists("Blueprints/"..label) then
  932.         data = fs.open("Blueprints/"..label, "r")
  933.         bpTab = textutils.unserialize(data.readLine())
  934.         data.close()
  935.     else
  936.         report("No matching blueprint.")
  937.         return false
  938.     end
  939.     countItems(level)
  940.     for i = 1, #typeCount do
  941.         print(i..". "..typeCount[i][1].." required: "..typeCount[i][2])
  942.     end
  943.     for i = 1, #typeCount do
  944.         freeSlot = getFreeSlot()
  945.         if typeCount[i][2] > 64 then
  946.             local itemCount = typeCount[i][2]
  947.             while itemCount > 0 do
  948.                 getItem(typeCount[i][1], freeSlot, 64)
  949.                 itemCount = itemCount - 64
  950.                 freeSlot = getFreeSlot()
  951.             end
  952.         else
  953.             getItem(typeCount[i][1], freeSlot, typeCount[i][2])
  954.         end
  955.     end
  956. end
  957.  
  958. function buildLayer(label, level)
  959.     goHome()
  960.     unload()
  961.     rt()
  962.     readBlueprint(label, level)
  963.     if skipLayer then
  964.         return
  965.     end
  966.     moveToLoc("buildSite")
  967.     dn(#bpTab - level)
  968.     turns = true
  969.     for i = 1, #bpTab[level] do
  970.         if turns then
  971.             for j = 1, #bpTab[level][i] do
  972.                 if bpTab[level][i][j][1] ~= "air" then
  973.                     if bpTab[level][i][j][5] ~= nil then
  974.                         oldFacing = myTab.hPos
  975.                         face(bpTab[level][i][j][5])
  976.                         itemPlace(bpTab[level][i][j][1])
  977.                         face(oldFacing)
  978.                     else
  979.                         itemPlace(bpTab[level][i][j][1])
  980.                     end
  981.                 end
  982.                 if j ~= #bpTab[level][i] then
  983.                     fd()
  984.                 end
  985.             end
  986.             if j ~= #bpTab[level][i] then
  987.                 rt()
  988.                 fd()
  989.                 rt()
  990.             end
  991.         else
  992.             for j = #bpTab[level][i], 1, -1 do
  993.                 if bpTab[level][i][j][1] ~= "air" then
  994.                     if bpTab[level][i][j][5] ~= nil then
  995.                         oldFacing = myTab.hPos
  996.                         face(bpTab[level][i][j][5])
  997.                         itemPlace(bpTab[level][i][j][1])
  998.                         face(oldFacing)
  999.                     else
  1000.                         itemPlace(bpTab[level][i][j][1])
  1001.                     end
  1002.                 end
  1003.                 if j ~= 1 then
  1004.                     fd()
  1005.                 end
  1006.             end
  1007.             if j ~= 1 then
  1008.                 lt()
  1009.                 fd()
  1010.                 lt()
  1011.             end
  1012.         end
  1013.         turns = not turns
  1014.     end
  1015. end
  1016.  
  1017. function buildBP(location, bpName)
  1018.     moveToLoc(location)
  1019.     loadBlueprint(bpName)
  1020.     up(#bpTab)
  1021.     addLoc("buildSite", myTab.xPos, myTab.yPos, myTab.zPos, myTab.hPos)
  1022.     for i = 1, #bpTab do
  1023.         buildLayer(bpName, i)
  1024.     end
  1025.     goHome()
  1026.     unload()
  1027.     os.reboot()
  1028. end
  1029.  
  1030. --SORTING FUNCTIONS
  1031.  
  1032. function smartFill()
  1033.     report("Checking chest.")
  1034.     for i = 2, 16 do
  1035.         readChest()
  1036.         for j = 1, #chkTab do
  1037.             if chkTab[j][1] ~= "Nowt" then
  1038.                 turtle.select(i)
  1039.                 turtle.suck()
  1040.                 obTab[i][1] = chkTab[j][1]
  1041.                 obTab[i][2] = chkTab[j][2]
  1042.                 chkTab[j][1] = "Nowt"
  1043.                 chkTab[j][2] = 0
  1044.                 report("Found "..obTab[i][2].." "..obTab[i][1])
  1045.                 break
  1046.             end
  1047.         end
  1048.     end
  1049.     saveOnboardData()
  1050. end
  1051.  
  1052. function sortChest()
  1053.     report("Sort initialised.")
  1054.     smartFill()
  1055.     for i = 2, 16 do
  1056.         report("Sorting slot "..i..".")
  1057.         found = false
  1058.         report("Checking chest list")
  1059.         myTab.opt1 = obTab[i][1]
  1060.         print(myTab.opt1)
  1061.         saveMyData()
  1062.         report("Chest lookup")
  1063.         listen()
  1064.         turtle.select(i)
  1065.         if turtle.drop() then
  1066.             if turtle.getItemCount(i) > 0 then
  1067.                 myTab["opt1"] = obTab[i][1]
  1068.                 myTab["opt2"] = obTab[i][2] - turtle.getItemCount(i)
  1069.                 obTab[i][2] = turtle.getItemCount(i)
  1070.                 saveMyData()
  1071.                 saveOnboardData()
  1072.                 report("Item add")
  1073.             else
  1074.                 myTab["opt1"] = obTab[i][1]
  1075.                 myTab["opt2"] = obTab[i][2]
  1076.                 saveMyData()
  1077.                 obTab[i][1] = "Nowt"
  1078.                 obTab[i][2] = 0
  1079.                 saveOnboardData()
  1080.                 report("Item add")
  1081.             end
  1082.         end
  1083.     end
  1084.     goHome()
  1085.     rt()
  1086.     emptyAll()
  1087.     lt()
  1088. end
  1089.  
  1090. --PROGRAM INIT
  1091.  
  1092. init()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement