-- platform_builder.lua
-- Improved version - builds platforms and returns for more blocks
local t = turtle
-- === Settings ===
local CHECK_FUEL = true -- whether to check fuel
local REFUEL_LEVEL = 50 -- minimum fuel level
-- === State ===
local x, y = 0, 0 -- current position
local direction = 0 -- 0=east, 1=north, 2=west, 3=south
-- === Movement ===
local function turnLeft()
t.turnLeft()
direction = (direction + 1) % 4
end
local function turnRight()
t.turnRight()
direction = (direction + 3) % 4
end
local function face(targetDir)
while direction ~= targetDir do
if (direction - targetDir) % 4 == 1 then
turnRight()
else
turnLeft()
end
end
end
local function forwardStep()
-- Check fuel
if CHECK_FUEL and t.getFuelLevel() < REFUEL_LEVEL then
print("⛽ Low fuel! Trying to refuel...")
for slot = 1, 16 do
t.select(slot)
if t.refuel(0) then -- Check if item can be used as fuel
t.refuel(1) -- Refuel with one item
print("✅ Refueled from slot " .. slot)
break
end
end
end
-- Move forward
local attempts = 0
while attempts < 5 do -- Max 5 attempts
if t.forward() then
-- Update coordinates
if direction == 0 then x = x + 1
elseif direction == 1 then y = y + 1
elseif direction == 2 then x = x - 1
else y = y - 1 end
return true
elseif t.detect() then
t.dig()
else
sleep(0.5)
end
attempts = attempts + 1
end
print("❌ Cannot move forward!")
return false
end
local function moveTo(targetX, targetY)
-- First move along X, then along Y
local dx = targetX - x
local dy = targetY - y
if dx > 0 then
face(0)
for i = 1, dx do forwardStep() end
elseif dx < 0 then
face(2)
for i = 1, -dx do forwardStep() end
end
if dy > 0 then
face(1)
for i = 1, dy do forwardStep() end
elseif dy < 0 then
face(3)
for i = 1, -dy do forwardStep() end
end
end
local function goHome()
print("🔄 Returning home...")
moveTo(0, 0)
face(0) -- Face east by default
end
-- === Block management ===
local function countBlocks()
local total = 0
for slot = 1, 16 do
total = total + t.getItemCount(slot)
end
return total
end
local function selectAnyBlock()
for slot = 1, 16 do
if t.getItemCount(slot) > 0 then
t.select(slot)
return true
end
end
return false
end
local function waitForBlocks()
print("📦 Blocks exhausted! Returning for resupply...")
local savedX, savedY, savedDir = x, y, direction
goHome()
print("⏳ Waiting for blocks to be added...")
while countBlocks() == 0 do
print("📦 No blocks in inventory! Waiting...")
sleep(3)
end
print("✅ Blocks available! Returning to work...")
moveTo(savedX, savedY)
face(savedDir)
end
local function placeBlockDown()
if not t.detectDown() then
if not selectAnyBlock() then
waitForBlocks()
selectAnyBlock() -- Select block after resupply
end
if not t.placeDown() then
print("❌ Cannot place block! Trying again...")
sleep(0.5)
return false
end
end
return true
end
-- === Building functions ===
local function buildSquare(size, fill)
print("🟦 Building square " .. size .. "x" .. size)
local half = math.floor(size / 2)
for row = -half, half - (size % 2 == 0 and 1 or 0) do
moveTo(-half, row)
face(0) -- Face east
for col = -half, half - (size % 2 == 0 and 1 or 0) do
if fill or col == -half or col == half or row == -half or row == half then
placeBlockDown()
end
if col < half - (size % 2 == 0 and 1 or 0) then
forwardStep()
end
end
end
goHome()
end
local function buildRectangle(width, height, fill)
print("🟦 Building rectangle " .. width .. "x" .. height)
local halfW = math.floor(width / 2)
local halfH = math.floor(height / 2)
for row = -halfH, halfH - (height % 2 == 0 and 1 or 0) do
moveTo(-halfW, row)
face(0)
for col = -halfW, halfW - (width % 2 == 0 and 1 or 0) do
if fill or col == -halfW or col == halfW or row == -halfH or row == halfH then
placeBlockDown()
end
if col < halfW - (width % 2 == 0 and 1 or 0) then
forwardStep()
end
end
end
goHome()
end
local function buildCircle(radius, fill)
print("🔵 Building circle with radius " .. radius)
for row = -radius, radius do
local width = math.floor(math.sqrt(radius * radius - row * row))
if width > 0 then
moveTo(-width, row)
face(0)
for col = -width, width do
local distance = math.sqrt(col * col + row * row)
if fill or (distance >= radius - 0.5 and distance <= radius + 0.5) then
placeBlockDown()
end
if col < width then
forwardStep()
end
end
end
end
goHome()
end
-- === Simple interface ===
local function main()
print("=== 🏗️ PLATFORM BUILDER ===")
print("Available shapes:")
print("1 - Square")
print("2 - Rectangle")
print("3 - Circle")
print("========================")
-- Shape selection
local choice
while true do
print("Choose shape (1-3):")
choice = tonumber(read())
if choice and choice >= 1 and choice <= 3 then
break
end
print("❌ Invalid choice! Try again.")
end
-- Fill option
local fill = false
print("Fill completely? (y/n):")
local fillInput = read()
if fillInput and string.lower(fillInput) == "y" then
fill = true
end
-- Building parameters
if choice == 1 then
print("Square side size:")
local size = tonumber(read())
if size and size > 0 then
buildSquare(size, fill)
else
print("❌ Invalid size!")
end
elseif choice == 2 then
print("Rectangle width:")
local width = tonumber(read())
print("Rectangle height:")
local height = tonumber(read())
if width and height and width > 0 and height > 0 then
buildRectangle(width, height, fill)
else
print("❌ Invalid dimensions!")
end
elseif choice == 3 then
print("Circle radius:")
local radius = tonumber(read())
if radius and radius > 0 then
buildCircle(radius, fill)
else
print("❌ Invalid radius!")
end
end
print("✅ Construction completed!")
print("📍 Turtle returned to start position")
end
-- Start program
main()