Advertisement
kssr3951

lib_turtle_0.2.1

May 5th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.98 KB | None | 0 0
  1. dofile("lib_log")
  2. userEventHandler = nil
  3. local function myPlace(para1)
  4.   if para1 == 0 then
  5.     turtle.placeUp()
  6.   elseif para1 == 1 then
  7.     turtle.place()
  8.   elseif para1 == 2 then
  9.     turtle.placeDown()
  10.   end
  11. end
  12. local function myThrow(para1, para2)
  13.   if para1 == 0 then
  14.     turtle.dropUp(para2)
  15.   elseif para1 == 1 then
  16.     turtle.drop(para2)
  17.   elseif para1 == 2 then
  18.     turtle.dropDown(para2)
  19.   end
  20. end
  21. local function myExcavate(para1)
  22.   if para1 == 0 then
  23.     if turtle.detectUp() then
  24.       repeat
  25.         turtle.digUp()
  26.         sleep(0.5)
  27.       until not turtle.detectUp()
  28.     end
  29.   elseif para1 == 1 then
  30.     if turtle.detect() then
  31.       for i = 0, 9 do
  32.         turtle.dig()
  33.         sleep(0)
  34.         if false == turtle.detect() then
  35.           return
  36.         end
  37.       end
  38.       for i = 0, 9 do
  39.         turtle.dig()
  40.         sleep(0.5)
  41.         if false == turtle.detect() then
  42.           return
  43.         end
  44.       end
  45.  end
  46.   elseif para1 == 2 then
  47.     turtle.digDown()
  48.   end
  49. end
  50. local function myZzz(para1)
  51.   sleep(para1 / 1000)
  52. end
  53. local function myOutput(para1, para2)
  54.   local dir = { [0] = "top",  [1] = "front", [2] = "bottom",
  55.                 [3] = "left", [4] = "back",  [5] = "right" }
  56.   if para2 == 1 then
  57.     rs.setOutput(dir[para1], true)
  58.   else
  59.     rs.setOutput(dir[para1], false)
  60.   end
  61. end
  62. local function mySuck(para1)
  63.   if para1 == 0 then
  64.     turtle.suckUp()
  65.   elseif para1 == 1 then
  66.     turtle.suck()
  67.   elseif para1 == 2 then
  68.     turtle.suckDown()
  69.   end
  70. end
  71. local function myAttack(para1)
  72.   if para1 == 0 then
  73.     turtle.attackUp()
  74.   elseif para1 == 1 then
  75.     turtle.attack()
  76.   elseif para1 == 2 then
  77.     turtle.attackDown()
  78.   end
  79. end
  80. local function myMove(dirName, moveFunc, detectFunc, attackFunc)
  81.   local rslt, msg
  82.   while true do
  83.     rslt, msg = moveFunc()
  84.     if rslt then
  85.       return
  86.     else
  87.       if moveFunc == turtle.back then
  88.         turtle.turnRight()
  89.         turtle.turnRight()
  90.       end
  91.       if detectFunc() then
  92.         if moveFunc == turtle.back then
  93.           turtle.turnLeft()
  94.           turtle.turnLeft()
  95.         end
  96.         return
  97.       else
  98.         for i = 0, 9 do
  99.           attackFunc()
  100.           attackFunc()
  101.           attackFunc()
  102.           if moveFunc == turtle.back then
  103.             if true == turtle.forward() then
  104.               turtle.turnLeft()
  105.               turtle.turnLeft()
  106.               return
  107.             end
  108.           else
  109.             if true == moveFunc() then
  110.               return
  111.             end
  112.           end
  113.         end
  114.         if moveFunc == turtle.back then
  115.           turtle.turnLeft()
  116.           turtle.turnLeft()
  117.         end
  118.         while true do
  119.           print("move [" .. dirName .. "] failed. retry? (y/n)")
  120.           local input = read()
  121.           if "y" == input then
  122.             break
  123.           elseif "n" == input then
  124.             error("program stopped by user request.")
  125.           else
  126.             print("wrong input. type y or n.")
  127.           end
  128.         end
  129.       end
  130.     end
  131.   end
  132. end
  133. local function myForward()
  134.   myMove("forward", turtle.forward, turtle.detect, turtle.attack)
  135. end
  136. local function myBack()
  137.   myMove("back", turtle.back, turtle.detect, turtle.attack)
  138. end
  139. local function myUp()
  140.   myMove("up", turtle.up, turtle.detectUp, turtle.attackUp)
  141. end
  142. local function myDown()
  143.   myMove("down", turtle.down, turtle.detectDown, turtle.attackDown)
  144. end
  145. local function myUserEvent(para1)
  146.   if nil ~= userEventHandler then
  147.     userEventHandler(para1)
  148.   end
  149. end
  150. local cmdInfo =
  151. {
  152.   f = { paraCnt = 0, func = myForward;        }, -- [f]orward
  153.   b = { paraCnt = 0, func = myBack;           }, -- [b]ack
  154.   l = { paraCnt = 0, func = turtle.turnLeft;  }, -- turn [l]eft
  155.   r = { paraCnt = 0, func = turtle.turnRight; }, -- turn [r]ight
  156.   u = { paraCnt = 0, func = myUp;             }, -- [u]p
  157.   d = { paraCnt = 0, func = myDown;           }, -- [d]own
  158.   s = { paraCnt = 1, func = turtle.select;    }, -- [s]elect
  159.   p = { paraCnt = 1, func = myPlace;          }, -- [p]lace
  160.   t = { paraCnt = 2, func = myThrow;          }, -- [t]hrow = drop
  161.   e = { paraCnt = 1, func = myExcavate;       }, -- [e]xcavate = dig
  162.   z = { paraCnt = 1, func = myZzz;            }, -- [z]zz = sleep
  163.   o = { paraCnt = 2, func = myOutput;         }, -- set [o]utput (redstone)
  164.   k = { paraCnt = 1, func = mySuck;           }, -- suc[k]
  165.   a = { paraCnt = 1, func = myAttack;         }, -- [a]ttack
  166.   v = { paraCnt = 1, func = myUserEvent;      }, -- user e[v]ent
  167. }
  168. local function getParam(command, idx)
  169.   local buff = ""
  170.   local ch = ""
  171.   for i = idx, command:len() do
  172.     ch = command:sub(i, i)
  173.     --log("getParam i = " .. i .. " / ch =[" .. ch .. "]");
  174.     if ch == "," then
  175.       if buff == "" then
  176.         return nil, i + 1
  177.       else
  178.         return tonumber(buff), i + 1
  179.       end
  180.     elseif nil ~= string.find("0123456789", ch, 1, true) then
  181.       buff = buff .. ch
  182.     else
  183.       if buff ~= "" then
  184.         return tonumber(buff), i
  185.       end
  186.     end
  187.   end
  188.   if buff == "" then
  189.     return nil, command:len() + 1
  190.   else
  191.     return tonumber(buff), command:len() + 1
  192.   end
  193. end
  194. local function get1Cmd(command, idx)
  195.   local cmd = string.sub(command, idx, idx)
  196.   local para1, para2, nextIdx, paraCnt
  197.   --log(idx .. " / " .. cmd)
  198.   if nil ~= cmdInfo[cmd] then
  199.     paraCnt = cmdInfo[cmd].paraCnt
  200.   else
  201.     --log("unknown command [" .. cmd .. "]")
  202.     error("unknown command [" .. cmd .. "]")
  203.   end
  204.   if -1 == paraCnt then
  205.     return nil, nil, nil, idx + 1
  206.   elseif paraCnt == 0 then
  207.     return cmd, nil, nil, idx + 1
  208.   elseif paraCnt == 1 then
  209.     para1, nextIdx = getParam(command, idx + 1)
  210.     return cmd, para1, nil, nextIdx
  211.   elseif paraCnt == 2 then
  212.     para1, nextIdx = getParam(command, idx + 1)
  213.     para2, nextIdx = getParam(command, nextIdx)
  214.     return cmd, para1, para2, nextIdx
  215.   end
  216. end
  217. local function checkLoop(command)
  218.   local kBgn = {""}
  219.   local loopInfo = {}
  220.   local ch, repeatCnt, nextIdx, kBgnIdx
  221.   for i = 1, command:len() do
  222.     ch = command:sub(i, i)
  223.     if "(" == ch then
  224.       table.insert(kBgn, i)
  225.     elseif ")" == ch then
  226.       repeatCnt, nextIdx = getParam(command, i + 1)
  227.       loopInfo[i] = { beginIdx   = table.remove(kBgn),
  228.                       endIdx     = i,
  229.                       nextIdx    = nextIdx,
  230.                       repeatCnt  = repeatCnt,
  231.                       currentCnt = 0 }
  232.       --log("loopInfo[" .. i .. "]")
  233.       --log("  beginIdx   = " .. loopInfo[i].beginIdx)
  234.       --log("  endIdx     = " .. loopInfo[i].endIdx)
  235.       --log("  nextIdx    = " .. loopInfo[i].nextIdx)
  236.       --log("  repeatCnt  = " .. loopInfo[i].repeatCnt)
  237.       --log("  currentCnt = " .. loopInfo[i].currentCnt)
  238.       i = nextIdx
  239.     end
  240.   end
  241.   return loopInfo
  242. end
  243. function doCommand(command)
  244.  
  245.   command = command .. " "
  246.   local loopInfo = checkLoop(command)
  247.   --for i, dat in pairs(loopInfo) do
  248.     --log("check loopInfo")
  249.     --log("  i = " .. i)
  250.     --log("  " .. dat.beginIdx .. " / " .. dat.endIdx .. " / " .. dat.repeatCnt)
  251.   --end
  252.   local cmd, para1, para2, nextIdx, ch
  253.   local i = 1
  254.   while true do
  255.     ch = command:sub(i, i)
  256.     --log("doCommand idx = " .. i .. " [" .. ch .. "]")
  257.     if ")" == ch then
  258.       --log("i = " .. i)
  259.       --log(   loopInfo[i].beginIdx .. " / " .. loopInfo[i].endIdx .. " / "
  260.       --    .. loopInfo[i].nextIdx  .. " / " .. loopInfo[i].repeatCnt)
  261.       loopInfo[i].currentCnt = loopInfo[i].currentCnt + 1
  262.       if loopInfo[i].repeatCnt <= loopInfo[i].currentCnt then
  263.         loopInfo[i].currentCnt = 0
  264.         i = loopInfo[i].nextIdx
  265.       else
  266.         i = loopInfo[i].beginIdx
  267.       end
  268.     elseif " " == ch then
  269.       i = i + 1
  270.     elseif "\n" == ch then
  271.       i = i + 1
  272.     elseif "(" == ch then
  273.       i = i + 1
  274.     else
  275.       cmd, para1, para2, nextIdx = get1Cmd(command, i)
  276.       --log("  nextIdx = " .. nextIdx)
  277.       i = nextIdx
  278.       if cmd ~= nil then
  279.         cmdInfo[cmd].func(para1, para2)
  280.       end
  281.     end
  282.     if command:len() <= i then
  283.       break
  284.     end
  285.   end
  286. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement