128 lines
2.2 KiB
Lua
128 lines
2.2 KiB
Lua
pp = require("cc.pretty")
|
|
|
|
if _G.pos == nil then
|
|
_G.facing = "south"
|
|
_G.pos = vector.new(0,0,0)
|
|
file = fs.open("pos.txt", "r")
|
|
data = splitString(file.readAll())
|
|
_G.pos.x = tonumber(data[1])
|
|
_G.pos.y = tonumber(data[2])
|
|
_G.pos.z = tonumber(data[3])
|
|
_G.facing = data[4]
|
|
end
|
|
|
|
local up = vector.new(0,1,0)
|
|
|
|
local rightOf = {
|
|
south = "west",
|
|
west = "north",
|
|
north = "east",
|
|
east = "south"
|
|
}
|
|
|
|
local leftOf = {
|
|
west = "south",
|
|
north = "west",
|
|
east = "north",
|
|
south = "east"
|
|
}
|
|
|
|
local vecOf = {
|
|
north = vector.new(0,0,-1),
|
|
south = vector.new(0,0,1),
|
|
east = vector.new(1,0,0),
|
|
west = vector.new(-1,0,0),
|
|
}
|
|
|
|
function savePos()
|
|
fs.delete("pos.txt")
|
|
file = fs.open("pos.txt", "w")
|
|
file.write(_G.pos.x .. " " .. _G.pos.y .. " " .. _G.pos.z .. " " .. _G.facing)
|
|
end
|
|
|
|
|
|
function goUp()
|
|
if turtle.up() then
|
|
_G.pos.y = _G.pos.y + 1
|
|
savePos()
|
|
else
|
|
printError("failed to go up")
|
|
printError(pos)
|
|
end
|
|
end
|
|
|
|
function goDown()
|
|
if turtle.down() then
|
|
_G.pos.y = _G.pos.y - 1
|
|
savePos()
|
|
else
|
|
printError("failed to go down")
|
|
printError(pos)
|
|
end
|
|
end
|
|
|
|
function goLeft()
|
|
turtle.turnLeft()
|
|
_G.facing = leftOf[_G.facing]
|
|
savePos()
|
|
end
|
|
|
|
function goRight()
|
|
turtle.turnRight()
|
|
_G.facing = rightOf[_G.facing]
|
|
savePos()
|
|
end
|
|
|
|
function goForward()
|
|
if turtle.forward() then
|
|
_G.pos = _G.pos + vecOf[_G.facing]
|
|
savePos()
|
|
else
|
|
printError("failed to go forward")
|
|
printError(pos)
|
|
end
|
|
end
|
|
|
|
function goBack()
|
|
if turtle.back() then
|
|
_G.pos = _G.pos - vecOf[_G.facing]
|
|
savePos()
|
|
else
|
|
printError("failed to go backward")
|
|
printError(pos)
|
|
end
|
|
end
|
|
|
|
function stepTo(target)
|
|
local delta = target - _G.pos
|
|
-- print(delta)
|
|
if delta.y > 0 then
|
|
goUp()
|
|
elseif delta.y < 0 then
|
|
goDown()
|
|
elseif delta:dot(vecOf[_G.facing]) > 0 then
|
|
goForward()
|
|
elseif delta:dot(vecOf[_G.facing]:cross(up)) > 0 then
|
|
goRight()
|
|
else
|
|
goLeft()
|
|
end
|
|
end
|
|
|
|
function go_to(target, face)
|
|
while target ~= _G.pos do
|
|
stepTo(target)
|
|
-- print(_G.pos, _G.facing, target, face)
|
|
print(_G.pos, _G.facing)
|
|
end
|
|
if face and face ~= _G.facing then
|
|
if rightOf[_G.facing] == face then
|
|
goRight()
|
|
elseif leftOf[_G.facing] == face then
|
|
goLeft()
|
|
else
|
|
goRight()
|
|
goRight()
|
|
end
|
|
end
|
|
end
|