From 2e3bda8c69df2810c0ba3d1fef5d6a70d1039870 Mon Sep 17 00:00:00 2001 From: Dominic Zimmer Date: Sun, 5 Jul 2020 00:13:59 +0200 Subject: [PATCH] Update to concurrency --- dominic/5 | 246 +++++++++++++++++++++++++++++++++++++++++++ dominic/canemine.lua | 99 ++++++++++++++++- 2 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 dominic/5 diff --git a/dominic/5 b/dominic/5 new file mode 100644 index 0000000..2a06bc3 --- /dev/null +++ b/dominic/5 @@ -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 diff --git a/dominic/canemine.lua b/dominic/canemine.lua index d89c837..048d885 100644 --- a/dominic/canemine.lua +++ b/dominic/canemine.lua @@ -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