Turtlemove (Custom API)
From ComputerCraft Wiki
The turtlemove API is an unofficial API. This means that you must install it manually.
The turtlemove api will be an API to facilitate programming your turtle's movement. It is in development.
doString
doString(str="", checkFuel=10, refuel=true, fuelRetLocation={x,y,z})
doString takes as an argument a commandstr and some options. The commandstr is defined below. If the recorder is not on, Store and Goto require a wireless modem (for GPS). If any unsupported operation is attempted, the function will cause an error().
checkFuel
- -2: The turtle will attempt to return to fuelRetLocation if it has exactly that much fuel left after refueling attempts.
- -1: The turtle will make no attempt to examine fuel levels.
- n>=0: The API call will halt with a return of the string position if less than this much fuel is left AND refueling attempts fail.
refuel
- true: The turtle will try all slots, starting with 1, in an attempt to refuel.
- false: The turtle will never attempt refueling,
commandstr
commandstr := {command}*
command := {direction} | {repeat} | {store} | {goto} | {mine} | {place} | {whitespace}
whitespace := Anything not defined here
direction := 'f' | 'b' | 'u' | 'd' | 'l' | 'r'
repeat := 'X{number}['{commandstr}']'
store := 'S<'{identifier}'>'
goto := 'G<'{identifier}'>'
identifier := [a-zA-Z0-9_ ]+
number := [0-9]+
Code
turtlemove = {}
local ALLCMDS=fbudlrxsg
function turtlemove.doString(str, checkFuel, refuel, fuelRetLocation)
local function fuelCheck()
--TODO
end
local pos=0
local str = string.lower(str)
while pos <= string.len(str) do
pos = pos+1
fuelCheck()
local c = string.sub(str,pos,pos)
if string.find(ALLCMDS,c,1,true) then
if string.find("fbudlr",c,1,true) then
if c=="f" then
while not turtle.forward() do os.sleep(0.01) end
elseif c=="b" then
while not turtle.back() do os.sleep(0.01) end
elseif c=="u" then
while not turtle.up() do os.sleep(0.01) end
elseif c=="d" then
while not turtle.down() do os.sleep(0.01) end
elseif c=="l" then
while not turtle.turnLeft() do os.sleep(0.01) end
elseif c=="r" then
while not turtle.turnRight() do os.sleep(0.01) end
end
elseif c=="x" then
local numstr = ""
while pos <= string.len(str) do
pos = pos + 1
c2 = string.sub(str,pos,pos)
-- break check
if c2 == "[" then break end
-- errorcheck
if not string.find("0123456789",c2,1,true) then error("Unexpected character "..c2.." at position "..pos.." in repetition count") end
numstr = numstr .. c2
end
local pos_b = pos
local reps = tonumber(numstr)
if reps == nil then error("Repeated section at postition "..pos.." has no repetition count") end
while true do
pos=pos+1
c3=string.sub(str,pos,pos)
if c3=="]" then break end
if pos > string.len(str) then error("Repeated section not closed by position "..pos) end
end
local cmdstr = string.sub(str,pos_b,pos)
for i=1, reps do
turtlemove.doString(cmdstr)
end
else
error("Unimplemented character "..string.sub(str,pos,pos).." at position "..pos)
end
else
error("Unexpected character "..string.sub(str,pos,pos).." at position "..pos)
end
end
end