257 lines
5.8 KiB
Lua
257 lines
5.8 KiB
Lua
compareSlotMax = 1 -- all slots up to this one are used for comparing, order the blocks in decreasing probability
|
|
|
|
xRelPos = 0 -- "positive = forward"
|
|
yRelPos = 0 -- "positive = right"
|
|
zRelPos = 0 -- "positive = upwards"
|
|
|
|
facing = {
|
|
x = 1,
|
|
y = 0
|
|
}
|
|
|
|
holeCounter = {
|
|
line = 0,
|
|
hole = 0
|
|
}
|
|
|
|
function printPos()
|
|
print("At (", xRelPos, ", ", yRelPos, ") facing (", facing.x, ", ", facing.y, ")")
|
|
end
|
|
|
|
-- helper functions for movement
|
|
function forward()
|
|
if turtle.forward() then
|
|
xRelPos = xRelPos + facing.x
|
|
yRelPos = yRelPos + facing.y
|
|
else
|
|
if not turtle.dig() then
|
|
turtle.attack()
|
|
end
|
|
end
|
|
end
|
|
|
|
function upwards()
|
|
if turtle.up() then
|
|
zRelPos = zRelPos + 1
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function downwards()
|
|
if turtle.down() then
|
|
zRelPos = zRelPos - 1
|
|
return true
|
|
end
|
|
return false
|
|
|
|
function turnRight()
|
|
turtle.turnRight()
|
|
if facing.x == 1 and facing.y == 0 then -- facing forward
|
|
facing.x = 0
|
|
facing.y = 1
|
|
elseif facing.x == 0 and facing.y == 1 then -- facing right
|
|
facing.x = -1
|
|
facing.y = 0
|
|
elseif facing.x == -1 and facing.y == 0 then -- facing backward
|
|
facing.x = 0
|
|
facing.y = -1
|
|
elseif facing.x == 0 and facing.y == -1 then -- facing left
|
|
facing.x = 1
|
|
facing.y = 0
|
|
else
|
|
print("turnRight: This should never happen")
|
|
end
|
|
end
|
|
|
|
function turnLeft()
|
|
turtle.turnLeft()
|
|
if facing.x == 1 and facing.y == 0 then -- facing forward
|
|
facing.x = 0
|
|
facing.y = -1
|
|
elseif facing.x == 0 and facing.y == 1 then -- facing right
|
|
facing.x = 1
|
|
facing.y = 0
|
|
elseif facing.x == -1 and facing.y == 0 then -- facing backward
|
|
facing.x = 0
|
|
facing.y = 1
|
|
elseif facing.x == 0 and facing.y == -1 then -- facing left
|
|
facing.x = -1
|
|
facing.y = 0
|
|
else
|
|
print("turnLeft: This should never happen")
|
|
end
|
|
end
|
|
|
|
function faceTo(x, y)
|
|
if (x == facing.x) and (y == facing.y) then
|
|
return
|
|
end
|
|
if (x == 1 and facing.x == -1) or (x == -1 and facing.x == 1) or (y == 1 and facing.y == -1) or (y == -1 and facing.y == 1) then
|
|
turnRight()
|
|
turnRight()
|
|
elseif (facing.y == -1 and x == 1) or (facing.y == 1 and x == -1) or (facing.x == 1 and y == 1) or (facing.x == -1 and y == -1) then
|
|
turnRight()
|
|
elseif (facing.y == -1 and x == -1) or (facing.y == 1 and x == 1) or (facing.x == 1 and y == -1) or (facing.x == -1 and y == 1) then
|
|
turnLeft()
|
|
else
|
|
print("faceTo: This should never happen")
|
|
end
|
|
end
|
|
|
|
function moveTo(x, y)
|
|
if (yRelPos > y) then
|
|
faceTo(0, -1)
|
|
while yRelPos > y do
|
|
forward()
|
|
end
|
|
elseif (yRelPos < y) then
|
|
faceTo(0, 1)
|
|
while yRelPos < y do
|
|
forward()
|
|
end
|
|
end
|
|
|
|
if (xRelPos > x) then
|
|
faceTo(-1, 0)
|
|
while xRelPos > x do
|
|
forward()
|
|
end
|
|
elseif (xRelPos < x) then
|
|
faceTo(1, 0)
|
|
while xRelPos < x do
|
|
forward()
|
|
end
|
|
end
|
|
end
|
|
|
|
function blockIsWorth()
|
|
|
|
for i = 1, compareSlotMax do
|
|
turtle.select(i)
|
|
if turtle.compare() then
|
|
return false
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function checkForItems(z)
|
|
|
|
dir = math.fmod(z, 2)
|
|
|
|
-- alternatingly check relative facing (left, forward, right) and (right, forward, left) blocks, so at the end we can face backwards when going up and check without turning at all
|
|
-- -> two turns per mined level
|
|
if (dir == 0) then
|
|
faceTo(0, -1) -- just to be safe, but this should never really do anything except for the first level
|
|
if blockIsWorth() then
|
|
turtle.dig()
|
|
end
|
|
turnRight()
|
|
if blockIsWorth() then
|
|
turtle.dig()
|
|
end
|
|
turnRight()
|
|
if blockIsWorth() then
|
|
turtle.dig()
|
|
end
|
|
else
|
|
faceTo(0, 1)
|
|
if blockIsWorth() then
|
|
turtle.dig()
|
|
end
|
|
turnLeft()
|
|
if blockIsWorth() then
|
|
turtle.dig()
|
|
end
|
|
turnLeft()
|
|
if blockIsWorth() then
|
|
turtle.dig()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Digs straight down right where it is, taking resources with it
|
|
function digHole()
|
|
z = 0
|
|
|
|
-- go down
|
|
turtle.digDown()
|
|
while downwards() do
|
|
z = z + 1
|
|
checkForItems(z)
|
|
turtle.digDown()
|
|
end
|
|
|
|
-- go back up
|
|
-- look at the remaining direction (-1, 0) and check blocks
|
|
faceTo(-1, 0)
|
|
while zRelPos < 0 do
|
|
if blockIsWorth() then
|
|
turtle.dig()
|
|
end
|
|
upwards()
|
|
end
|
|
end
|
|
|
|
function returnItems()
|
|
-- chest coordinates are -1, 0, so go to 0, 0 facing "backwards"
|
|
moveTo(0, 0)
|
|
|
|
faceTo(-1, 0)
|
|
|
|
-- already facing right direction, put items
|
|
for slot = compareSlotMax + 1, 16 do
|
|
turtle.select(slot)
|
|
turtle.drop()
|
|
end
|
|
end
|
|
|
|
function moveToNext()
|
|
xPos = 1
|
|
yPos = 1
|
|
|
|
-- find out where the next hole should be
|
|
for i = 1, holeCounter.line do
|
|
if math.fmod(i, 2) == 0 then
|
|
xPos = xPos + 2
|
|
yPos = 1
|
|
else
|
|
xPos = xPos + 3
|
|
yPos = 0
|
|
end
|
|
end
|
|
|
|
for i = 1, holeCounter.hole do
|
|
xPos = xPos - 1
|
|
yPos = yPos + 2
|
|
end
|
|
|
|
moveTo(xPos, yPos)
|
|
|
|
-- update holeCounter
|
|
-- if the xPos we calculated is 1 that means we need to start the next line
|
|
if xPos == 0 then
|
|
holeCounter.line = holeCounter.line + 1
|
|
holeCounter.hole = 0
|
|
else
|
|
holeCounter.hole = holeCounter.hole + 1
|
|
end
|
|
|
|
end
|
|
|
|
print("Starting...")
|
|
|
|
-- startup
|
|
while not xRelPos == 1 do
|
|
forward()
|
|
end
|
|
|
|
while true do
|
|
print("Digging Hole (", holeCounter.line, ", ", holeCounter.hole, ")")
|
|
moveToNext()
|
|
digHole()
|
|
returnItems()
|
|
end
|