Update to concurrency

This commit is contained in:
Dominic Zimmer 2020-07-05 00:13:59 +02:00
parent ccd433d454
commit 2e3bda8c69
2 changed files with 341 additions and 4 deletions

246
dominic/5 Normal file
View File

@ -0,0 +1,246 @@
args = {...}
function noop() end
function pair(x, y)
return math.floor((x + y) * (x + y + 1)/2 + y)
end
function unpairX(z)
local j = math.floor(math.sqrt(0.25 + 2*z) - 0.5)
return j - (z - j*(j+1)/2)
end
function unpairZ(z)
local j = math.floor(math.sqrt(0.25 + 2*z) - 0.5)
return z - j * (j+1)/2;
end
lookup = {4, 1, 3, 0, 2}
local function isDiggingSpot(x, y)
local val = lookup[(y % 5) + 1]
return (x % 5) == val
end
offset = 10
function ithSpot(i)
j = offset
while true do
x, z = unpairX(j), unpairZ(j)
if isDiggingSpot(x, z) then
if i <= 1 then
return x, z
else
i = i - 1
end
end
j = j + 1
end
end
function digTo(x, z)
print("Digging to rel. coord ("..tostring(x)..", "..tostring(z)..")")
while z > 0 do
turtle.dig()
turtle.forward()
turtle.digUp()
z = z - 1
end
turtle.turnRight()
while x > 0 do
turtle.dig()
turtle.forward()
turtle.digUp()
x = x - 1
end
end
-- If the block in front of the turtle is desired, take it.
function grabOres()
local status, block = turtle.inspect()
if status and block["name"]:lower():find("ore") then
turtle.dig()
end
end
-- dig all the way down to bedrock, collect ores
-- Parameters:
-- * moveAction: the **vertical** move action, eg turtle.down
-- * digAction: the **vertical** dig action, eg turtle.digDown
-- * inpectAction: the **vertical** inspect action, eg turtle.inspectDown
-- * limit: if >= 0 * the number of blocks to dig
-- * dig until bedrock is hit
--
--
-- Returns: the depth dug
function digDeep(moveAction, digAction, inspectAction, limit)
local depth = 0
grabOres()
while true do
-- termination condition:
-- * if limit != -1: limit > 0
-- * otherwise : bedrock beneath
if limit < 0 then
local status, nextblock = inspectAction()
if status and nextblock["name"] == "minecraft:bedrock" then
return depth
end
else
if limit == 0 then
return depth
end
end
-- Limit not reached: keep digging
depth = depth + 1
limit = limit - 1
digAction()
moveAction()
grabOres() -- inspect block in front of turtle, take if neccessary
end
end
function selectCobble()
for i = 1,16 do
turtle.select(i)
item = turtle.getItemDetail()
if item and item["name"] == "minecraft:cobblestone" then
break
end
end
end
function digShaft()
turtle.digDown()
selectCobble()
turtle.placeUp()
turtle.down()
print("Starting to dig shaft")
depth = digDeep(turtle.down, turtle.digDown, turtle.inspectDown, -1)
print("Dug the first shaft (depth = "..tostring(depth)..")")
turtle.turnLeft()
digDeep(turtle.up, noop, noop, depth)
turtle.turnLeft()
digDeep(turtle.down, noop, noop, depth)
turtle.turnLeft()
digDeep(turtle.up, noop, noop, depth)
selectCobble()
turtle.placeDown()
turtle.up()
turtle.digUp()
turtle.up()
end
function digTo(x, z)
print("Digging to rel. coord ("..tostring(x)..", "..tostring(z)..")")
while z > 0 do
turtle.dig()
turtle.forward()
turtle.digUp()
z = z - 1
end
turtle.turnRight()
while x > 0 do
turtle.dig()
turtle.forward()
turtle.digUp()
x = x - 1
end
end
-- move safely into the direction, not hurting other turtles, but freeing the path if needed.
function moveSafe(moveAction, inspectAction, digAction)
while true do
local status, block = inspectAction()
if status then
if block["name"]:lower():find("turtle") then
-- turtle in front of me. lets wait for it to move
sleep(0.6)
else
digAction()
end
else
-- nothing in the way, try to move
if moveAction() then
break
end
end
end
end
function goToSpawn(x, z)
turtle.digUp()
turtle.up()
while z > 0 do
moveSafe(turtle.forward, turtle.inspect, turtle.dig)
z = z - 1
end
turtle.turnRight()
while x > 0 do
moveSafe(turtle.forward, turtle.inspect, turtle.dig)
x = x - 1
end
end
function moveSafeForward()
moveSafe(turtle.forward, turtle.inspect, noop)
end
function goToBarrel()
moveSafe(turtle.forward, turtle.inspect, noop)
turtle.turnRight()
moveSafe(turtle.forward, turtle.inspect, noop)
turtle.turnLeft()
moveSafe(turtle.forward, turtle.inspect, noop)
moveSafe(turtle.forward, turtle.inspect, noop)
moveSafe(turtle.forward, turtle.inspect, noop)
moveSafe(turtle.down, turtle.inspectDown, noop)
end
function reportDuty(id)
turtle.turnRight()
moveSafeForward()
moveSafeForward()
moveSafeForward()
turtle.turnRight()
moveSafeForward()
turtle.turnRight()
moveSafe(turtle.down, turtle.inspectDown, noop)
moveSafe(turtle.down, turtle.inspectDown, noop)
moveSafe(turtle.down, turtle.inspectDown, noop)
moveSafeForward()
moveSafeForward()
moveSafeForward()
moveSafeForward()
moveSafeForward()
moveSafeForward()
moveSafeForward()
rednet.open("bottom")
rednet.broadcast(tostring(id), "imdone")
end
function enqueueTurtle()
moveSafe(turtle.up, turtle.inspectUp, noop)
moveSafe(turtle.up, turtle.inspectUp, noop)
moveSafe(turtle.up, turtle.inspectUp, noop)
turtle.turnLeft()
end
function emptyToBarrel()
for i = 1,16 do
select(i)
turtle.dropDown()
end
end
spotNum = tonumber(args[1])
if spotNum then
x, z = ithSpot(spotNum)
digTo(x,z)
digShaft()
goToSpawn(x, z)
goToBarrel()
emptyToBarrel()
reportDuty()
enqueueTurtle()
end

View File

@ -116,7 +116,7 @@ function digShaft()
turtle.placeUp()
turtle.down()
print("Starting to dig shaft")
depth = digDeep(turtle.down, turtle.digDown, turtle.inspectDown, -1)
depth = digDeep(turtle.down, turtle.digDown, turtle.inspectDown, 3)
print("Dug the first shaft (depth = "..tostring(depth)..")")
turtle.turnLeft()
digDeep(turtle.up, noop, noop, depth)
@ -182,6 +182,10 @@ function goToSpawn(x, z)
end
end
function moveSafeForward()
moveSafe(turtle.forward, turtle.inspect, noop)
end
function goToBarrel()
moveSafe(turtle.forward, turtle.inspect, noop)
turtle.turnRight()
@ -191,21 +195,108 @@ function goToBarrel()
moveSafe(turtle.forward, turtle.inspect, noop)
moveSafe(turtle.forward, turtle.inspect, noop)
moveSafe(turtle.down, turtle.inspectDown, noop)
end
function reportDuty(id)
turtle.turnRight()
moveSafeForward()
moveSafeForward()
moveSafeForward()
turtle.turnRight()
moveSafeForward()
turtle.turnRight()
moveSafe(turtle.down, turtle.inspectDown, noop)
moveSafe(turtle.down, turtle.inspectDown, noop)
moveSafe(turtle.down, turtle.inspectDown, noop)
moveSafeForward()
moveSafeForward()
moveSafeForward()
moveSafeForward()
moveSafeForward()
moveSafeForward()
moveSafeForward()
rednet.open("bottom")
rednet.broadcast(tostring(id), "jobcomplete")
while true do
sender, message, proto = rednet.receive("jobcomplete")
if message == "thanks" then
break
else
sleep(1)
end
end
end
function enqueueTurtle()
moveSafe(turtle.up, turtle.inspectUp, noop)
moveSafe(turtle.up, turtle.inspectUp, noop)
moveSafe(turtle.up, turtle.inspectUp, noop)
turtle.turnLeft()
moveSafeForward()
moveSafeForward()
moveSafeForward()
turtle.turnRight()
while true do
local status, block = turtle.inspectDown()
if not status then
if turtle.down() then
break -- we moved in line
else
if turtle.forward() then
-- pass, thats ok
else
local status, block = turtle.inspect()
if status and not block["name"]:lower():find("turtle") then
turtle.dig()
turtle.forward()
turtle.digUp()
turtle.digDown()
end
end
end
end
-- we moved into line
turtle.turnLeft()
turtle.turnLeft()
end
function goToJob()
moveSafeForward()
moveSafeForward()
moveSafeForward()
moveSafeForward()
end
function waitForJob()
while true do
status, block = turtle.inspectDown()
if status and block["name"] == "computercraft:wired_modem_full" then
break
else
moveSafeForward()
end
end
rednet.open("bottom")
rednet.broadcast("Gimme gimme gimme", "needajob")
return tonumber(rednet.receive("newjob"))
end
function emptyToBarrel()
for i = 1,16 do
select(i)
turtle.dropDown()
end
end
spotNum = tonumber(args[1])
if spotNum then
x, z = ithSpot(spotNum)
while true do
thejob = waitForJob()
goToJob()
x, z = ithSpot(thejob)
digTo(x,z)
digShaft()
goToSpawn(x, z)
goToBarrel()
emptyToBarrel()
reportDuty(thejob)
enqueueTurtle()
end