364 lines
6.6 KiB
Plaintext
364 lines
6.6 KiB
Plaintext
--[[
|
|
Allows a turtle to keep track of it's
|
|
location using a coordinate system.
|
|
|
|
Use the commands goForward(), goRight(),
|
|
goLeft(), goUp(), and goDown() to
|
|
control the turtle while adding to
|
|
the coordinates.
|
|
|
|
goHome() will send the turtle back to
|
|
it's origin and will point it north:
|
|
the direction it was originally facing.
|
|
|
|
A turtle always faces north when it is placed down
|
|
]]--
|
|
|
|
x = 0
|
|
y = 0
|
|
z = 0
|
|
|
|
saveX = 0
|
|
saveY = 0
|
|
saveZ = 0
|
|
saveDirection = NORTH
|
|
global map = {}
|
|
|
|
NORTH = 1
|
|
EAST = 2
|
|
SOUTH = 3
|
|
WEST = 4
|
|
|
|
UP = 5
|
|
DOWN = 6
|
|
|
|
RIGHT = 7
|
|
LEFT = 8
|
|
|
|
direction = NORTH
|
|
|
|
--[[sends a turtle forward 1 block
|
|
and adds to it's X coordinate]]--
|
|
function goForward()
|
|
if turtle.forward() then
|
|
addToCoords(direction)
|
|
return true
|
|
else return false
|
|
end
|
|
end
|
|
|
|
--[[sends a turtle up 1 block
|
|
and adds to it's Z coordinate]]--
|
|
function goUp()
|
|
if turtle.up() then
|
|
addToCoords(UP)
|
|
return true
|
|
else return false
|
|
end
|
|
end
|
|
|
|
--[[sends a turtle down 1 block
|
|
and subtracts from it's Z coordinate]]--
|
|
function goDown()
|
|
if turtle.down() then
|
|
addToCoords(DOWN)
|
|
return true
|
|
else return false
|
|
end
|
|
end
|
|
|
|
--[[turns a turtle right and changes
|
|
it's direction accordingly]]--
|
|
function goRight()
|
|
turtle.turnRight()
|
|
changeDirection(RIGHT)
|
|
end
|
|
|
|
--[[turns a turtle left and changes
|
|
it's direction accordingly]]--
|
|
function goLeft()
|
|
turtle.turnLeft()
|
|
changeDirection(LEFT)
|
|
end
|
|
|
|
--[[digs the block in front of the turtle and
|
|
sends it forward, keeping track of it's coordinates]]--
|
|
function goDig()
|
|
turtle.dig()
|
|
goForward()
|
|
end
|
|
|
|
--[[digs the block above the turtle and sends it
|
|
up, keeping track of the coordinates]]--
|
|
function goDigUp()
|
|
turtle.digUp()
|
|
goUp()
|
|
end
|
|
|
|
--[[digs the block below the turtle and sends it
|
|
down, keeping track of it's coordinates]]--
|
|
function goDigDown()
|
|
turtle.digDown()
|
|
goUp()
|
|
end
|
|
|
|
--[[sends a turtle home and refuels it from a chest
|
|
below it's origin]]--
|
|
function goRefuel()
|
|
goHome()
|
|
turtle.suckDown(64)
|
|
turtle.select(1)
|
|
turtle.refuel()
|
|
end
|
|
|
|
--[[moves a turtle forward a specified number of blocks]]--
|
|
function move(distance)
|
|
for i=1,distance do
|
|
goForward()
|
|
end
|
|
end
|
|
|
|
--[[moves a turtle up a specified number of blocks]]--
|
|
function moveUp(distance)
|
|
for i=1,distance do
|
|
goUp()
|
|
end
|
|
end
|
|
|
|
--[[moves a turtle down a specified number of blocks]]--
|
|
function moveDown(distance)
|
|
for i=1,distance do
|
|
goDown()
|
|
end
|
|
end
|
|
|
|
function autoGoForward()
|
|
distanceHome = math.abs(x)+math.abs(y)+math.abs(z)
|
|
if distanceHome < turtle.getFuelLevel()-1 then
|
|
goForward()
|
|
else saveAndFuel() end
|
|
end
|
|
|
|
function autoGoUp()
|
|
distanceHome = math.abs(x)+math.abs(y)+math.abs(z)
|
|
if distanceHome < turtle.getFuelLevel()-1 then
|
|
goUp()
|
|
else saveAndFuel() end
|
|
end
|
|
|
|
function autoGoDown()
|
|
distanceHome = math.abs(x)+math.abs(y)+math.abs(z)
|
|
if distanceHome < turtle.getFuelLevel()-1 then
|
|
goDown()
|
|
else saveAndFuel() end
|
|
end
|
|
|
|
function autoMove(distance)
|
|
for i=1,distance do
|
|
autoGoForward()
|
|
end
|
|
end
|
|
|
|
function autoMoveUp(distance)
|
|
for i=1,distance do
|
|
autoGoUp()
|
|
end
|
|
end
|
|
|
|
function autoMoveDown(distance)
|
|
for i=1,distance do
|
|
autoGoDown()
|
|
end
|
|
end
|
|
|
|
--[[takes the direction of the turtle and adds 1
|
|
to the appropriate coordinate based on that direction]]--
|
|
function addToCoords(direction)
|
|
if direction == NORTH then
|
|
x = x+1
|
|
elseif direction == EAST then
|
|
y = y+1
|
|
elseif direction == SOUTH then
|
|
x = x-1
|
|
elseif direction == WEST then
|
|
y = y-1
|
|
elseif direction == UP then
|
|
z = z+1
|
|
else
|
|
z = z-1
|
|
end
|
|
end
|
|
|
|
--[[takes a direction turned (right or left) and changes the
|
|
direction of the turtle to north, south, east, or west]]--
|
|
function changeDirection(turned)
|
|
if turned == RIGHT then
|
|
if direction == NORTH then
|
|
direction = EAST
|
|
elseif direction == EAST then
|
|
direction = SOUTH
|
|
elseif direction == SOUTH then
|
|
direction = WEST
|
|
else
|
|
direction = NORTH
|
|
end
|
|
else
|
|
if direction == NORTH then
|
|
direction = WEST
|
|
elseif direction == WEST then
|
|
direction = SOUTH
|
|
elseif direction == SOUTH then
|
|
direction = EAST
|
|
else
|
|
direction = NORTH
|
|
end
|
|
end
|
|
end
|
|
|
|
--[[takes a direction (north, east, south, or west) and turns
|
|
the turtle in that direction]]--
|
|
function setDirection(newDirect)
|
|
while true do
|
|
if newDirect == direction then
|
|
break
|
|
end
|
|
goRight()
|
|
end
|
|
end
|
|
|
|
--[[based on the current coordinates of a turtle, send the turtle
|
|
back on the x axis, then the y axis, then the z axis]]--
|
|
function goHome()
|
|
moved = false
|
|
attempts = 0
|
|
rightDirection = true
|
|
leftDirection = false
|
|
while x~=0 or y~=0 or z~=0 do
|
|
|
|
if x > 0 then
|
|
setDirection(SOUTH)
|
|
else
|
|
setDirection(NORTH)
|
|
end
|
|
while math.abs(x) > 0 and not turtle.detect() do
|
|
goForward()
|
|
moved = true
|
|
end
|
|
|
|
if y > 0 then
|
|
setDirection(WEST)
|
|
else
|
|
setDirection(EAST)
|
|
end
|
|
while math.abs(y) > 0 and not turtle.detect() do
|
|
goForward()
|
|
moved = true
|
|
end
|
|
|
|
while z > 0 and not turtle.detectDown() do
|
|
goDown()
|
|
end
|
|
while z < 0 and not turtle.detectUp() do
|
|
goUp()
|
|
moved = true
|
|
end
|
|
|
|
if moved == false then
|
|
mazeSolve()
|
|
end
|
|
|
|
moved = false
|
|
end
|
|
setDirection(NORTH)
|
|
end
|
|
|
|
function saveAndFuel()
|
|
saveCoords()
|
|
goRefuel()
|
|
returnToCoords()
|
|
end
|
|
|
|
function saveCoords()
|
|
saveX = x
|
|
saveY = y
|
|
saveZ = z
|
|
saveDirection = direction
|
|
end
|
|
|
|
function returnToCoords()
|
|
x = -saveX
|
|
y = -saveY
|
|
z = -saveZ
|
|
goHome()
|
|
setDirection(saveDirection)
|
|
x = saveX
|
|
y = saveY
|
|
z = saveZ
|
|
end
|
|
|
|
--[[write the main code down here]]--
|
|
|
|
--[[solves mazes]]--
|
|
function mazeSolve()
|
|
layer = 1
|
|
while not returned() do
|
|
try(map(layer,map))
|
|
layer = layer + 1
|
|
end
|
|
end
|
|
|
|
--[[saves a map of the world around the turtle based on spaces away from the
|
|
turtle. all the empty spaces will be marked as true and the spaces blocked
|
|
by a block will be marked as false]]--
|
|
function map(layer, map)
|
|
|
|
print("made it")
|
|
|
|
for i=1,layer do
|
|
|
|
print("made it")
|
|
|
|
saveCoords()
|
|
move(layer)
|
|
map[layer][direction] = turtle.detect()
|
|
returnToCoords()
|
|
goRight()
|
|
end
|
|
|
|
for i=1,layer do
|
|
saveCoords()
|
|
moveUp(layer)
|
|
map[layer][UP] = turtle.detectUp()
|
|
returnToCoords()
|
|
end
|
|
|
|
for i=1,layer do
|
|
saveCoords()
|
|
moveDown(layer)
|
|
map[layer][DOWN] = turtle.detectDown()
|
|
returnToCoords()
|
|
end
|
|
return map
|
|
end
|
|
|
|
--[[tries a layer to see if a turtle can go home by unsticking itself]]--
|
|
function try(map)
|
|
for i=1,4 do
|
|
if map[layer][direction] then
|
|
move(layer)
|
|
goHome()
|
|
if returned() then break end
|
|
end
|
|
end
|
|
end
|
|
|
|
function returned()
|
|
return x==0 and y==0 and z==0
|
|
end
|
|
|
|
autoMove(15)
|
|
goRight()
|
|
autoMove(30)
|
|
autoMoveUp(15)
|
|
goHome()
|