diff --git a/libs/turtleutils.lua b/libs/turtleutils.lua index 76d7689..000f5db 100644 --- a/libs/turtleutils.lua +++ b/libs/turtleutils.lua @@ -3,12 +3,62 @@ local M = {} local logger = require("libs.logger") -- Optional external status setter (set via M.setStatusCallback) +-- Status callback local statusCallback = nil +function M.setStatusCallback(fn) statusCallback = fn end -function M.setStatusCallback(fn) - statusCallback = fn +-- Position tracking state for manual mode +local manualPos = { x = 0, y = 0, z = 0 } +local directions = {"north", "east", "south", "west"} +local facing = 1 + + +-- GPS attempt +local function tryGPS() + local x, y, z = gps.locate(2) -- 2 second timeout + if x and y and z then + return { x = math.floor(x), y = math.floor(y), z = math.floor(z) } + end + return nil end +-- Manual position update helpers +local function updatePositionOnMove(direction) + if direction == "forward" then + if directions[facing] == "north" then manualPos.z = manualPos.z - 1 + elseif directions[facing] == "south" then manualPos.z = manualPos.z + 1 + elseif directions[facing] == "east" then manualPos.x = manualPos.x + 1 + elseif directions[facing] == "west" then manualPos.x = manualPos.x - 1 end + elseif direction == "back" then + if directions[facing] == "north" then manualPos.z = manualPos.z + 1 + elseif directions[facing] == "south" then manualPos.z = manualPos.z - 1 + elseif directions[facing] == "east" then manualPos.x = manualPos.x - 1 + elseif directions[facing] == "west" then manualPos.x = manualPos.x + 1 end + elseif direction == "up" then manualPos.y = manualPos.y + 1 + elseif direction == "down" then manualPos.y = manualPos.y - 1 end +end + +local function updateFacingLeft() + facing = facing - 1 + if facing < 1 then facing = 4 end +end + +local function updateFacingRight() + facing = facing + 1 + if facing > 4 then facing = 1 end +end + +-- Public function to get current position (GPS or manual) +function M.getPosition() + local gpsPos = tryGPS() + if gpsPos then + return gpsPos.x, gpsPos.y, gpsPos.z, true + else + return manualPos.x, manualPos.y, manualPos.z, false + end +end + + -- Minimum fuel required to proceed with one movement local MIN_FUEL = 1 -- you can raise this if you want a safety margin @@ -77,23 +127,44 @@ local function try(actionFn, times, name) return false end --- Basic movement +-- Movement wrappers that update manual position function M.forward() - return try(turtle.forward) + if turtle.forward() then + updatePositionOnMove("forward") + return true + else + return false + end end function M.back() - return try(turtle.back) + if turtle.back() then + updatePositionOnMove("back") + return true + else + return false + end end function M.up() - return try(turtle.up) + if turtle.up() then + updatePositionOnMove("up") + return true + else + return false + end end function M.down() - return try(turtle.down) + if turtle.down() then + updatePositionOnMove("down") + return true + else + return false + end end + -- Digging with movement function M.digForward() while turtle.detect() do @@ -143,18 +214,22 @@ function M.inspectDown() if success then return data else return nil end end --- Turning +-- Turning functions that update facing direction function M.turnLeft() turtle.turnLeft() + updateFacingLeft() end function M.turnRight() turtle.turnRight() + updateFacingRight() end function M.turnAround() turtle.turnLeft() turtle.turnLeft() + updateFacingLeft() + updateFacingLeft() end return M