From 15e4373d0e088adfca08e69fc507613729ac333c Mon Sep 17 00:00:00 2001 From: Guillaume ARM Date: Sun, 31 May 2026 03:36:31 +0200 Subject: [PATCH] feat(goo): improve mining flow and top-side traversal --- programs/goo.lua | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/programs/goo.lua b/programs/goo.lua index 0d87f8e..55b8f18 100644 --- a/programs/goo.lua +++ b/programs/goo.lua @@ -1,4 +1,4 @@ -local _VERSION = '0.1.2'; +local _VERSION = '0.2.0'; local args = table.pack(...); local command = args[1]; @@ -133,6 +133,22 @@ local function waitForInventory(message) os.pullEvent('turtle_inventory'); end +local function hasFreeSlot() + for slot = 1, 16 do + if turtle.getItemCount(slot) == 0 then + return true; + end + end + + return false; +end + +local function ensureMiningSpace() + while not hasFreeSlot() do + waitForInventory('Inventory is full. Remove items to keep mining.'); + end +end + local function getFuelLevel() local fuelLevel = turtle.getFuelLevel(); @@ -326,6 +342,7 @@ local function workTarget(inspectFn, digFn, placeFn, gooTier, targetName) end print('Mining processed ' .. targetName .. ' block: ' .. tostring(inspected.name)); + ensureMiningSpace(); return digFn(); end @@ -365,19 +382,25 @@ local function workHorizontalSides(gooTier) return changed; end +-- Returns `changed, reachedTop`. `reachedTop` is true only once we have actually +-- climbed above the goo and inspected its top face, so the caller can stop trying +-- the remaining sides; it stays false when this side is blocked or unclimbable. local function workTopFromCurrentSide(gooTier) if not turtle.forward() then - return false; + return false, false; end + -- Only the presence of a block above matters here; ignore the inspect metadata. local sideOccupied = turtle.inspectUp(); local changed = false; + local reachedTop = false; if not sideOccupied then if turtle.up() then if turtle.up() then turnAround(); changed = workTarget(turtle.inspect, turtle.dig, turtle.place, gooTier, 'top'); + reachedTop = true; turnAround(); if not turtle.down() then @@ -399,15 +422,20 @@ local function workTopFromCurrentSide(gooTier) error('could not return below the goo after top side check'); end - return changed; + return changed, reachedTop; end local function workTop(gooTier) local changed = false; + local done = false; + -- Iterate all four sides so the four turnRight calls net to zero (facing is + -- restored), but skip the climb once the single top face has been handled. for _ = 1, 4 do - if not changed then - changed = workTopFromCurrentSide(gooTier); + if not done then + local sideChanged, reachedTop = workTopFromCurrentSide(gooTier); + changed = sideChanged or changed; + done = sideChanged or reachedTop; end turtle.turnRight(); @@ -458,6 +486,9 @@ local function workBottom() local changed = false; + -- The bottom face is worked as one atomic round-trip (place -> wait -> mine -> + -- return) rather than fire-and-forget like the other faces, because the turtle + -- must vacate and then reclaim its home cell within a single pass. while true do local ok, inspected = turtle.inspect(); @@ -494,6 +525,7 @@ local function workBottom() error('unexpected goo block in the turtle center position'); else print('Mining processed bottom block: ' .. tostring(inspected.name)); + ensureMiningSpace(); if turtle.dig() then changed = true; @@ -517,6 +549,8 @@ while true do ensureRuntimeFuel(); local gooTier = ensureGooAlive(); + -- Also relied on for its side effect: emits the "requires goo tier X" warnings + -- for blocks the current tier cannot process yet. local hasEligibleBlocks = findEligibleProcessSlot(gooTier) ~= nil; local changed = false;