Last active
August 27, 2024 04:18
-
-
Save MacChuck/4f68db3f5943015a8ae3c5e5487969f5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--{program="tClear",version="1.00",date="2021-03-28"} | |
--------------------------------------- | |
-- tClear by Kaikaku | |
-- 2021-03-28, v1.00 three-way digging | |
-- 2016-03-13, v0.90 dig on way back | |
-- 2014-09-27, v0.80 dig sand | |
-- 2013-09-01, v0.10 initial | |
--------------------------------------- | |
--------------------------------------- | |
---- DESCRIPTION ---------------------- | |
--------------------------------------- | |
-- Mining turtle digs specified cuboid | |
-- (x,y,z) without leaving the area, | |
-- using tripple dig :) | |
-- Incl. option to missus as strip miner. | |
--------------------------------------- | |
---- ASSUMPTIONS ---------------------- | |
--------------------------------------- | |
-- Requires a mininng turtle | |
--------------------------------------- | |
---- VARIABLES: template -------------- | |
--------------------------------------- | |
local cVersion ="v1.00" | |
local cPrgName ="tClear" | |
local cMinFuel =110 | |
local blnAskForParameters =true | |
local blnShowUsage =false | |
local blnDebugPrint =false--true | |
local blnTurtle | |
local isComputer =false | |
local baseColor=colors.blue | |
--------------------------------------- | |
---- VARIABLES: specific -------------- | |
--------------------------------------- | |
local slotFuel=16 | |
local digDeep=3 -- all but 0 are okay | |
local digWide=3 -- all but -1,0,1 -- if wide <=-1 then depth needs to be >=2 | |
local digHeight=1 -- all but 0 | |
local digWideOrg | |
local digDeepOrg | |
local blnLayerByLayer=false | |
local blnStartWithin =false | |
local blnStripMine =false | |
--------------------------------------- | |
---- Early UI functions --------------- | |
--------------------------------------- | |
local function swapColors() | |
local backColor=term.getBackgroundColor() | |
local textColor=term.getTextColor() | |
term.setBackgroundColor(textColor) | |
term.setTextColor(backColor) | |
end | |
local function printUI(strInput) | |
if strInput==ni then strInput="" end | |
if strInput=="header" then | |
term.write("") swapColors() print("") swapColors() | |
elseif strInput=="line" then | |
term.write("") swapColors() print("") swapColors() | |
elseif strInput=="footer" then | |
term.write("") print() | |
else | |
term.write("") | |
strInput=strInput.." " | |
term.write(string.sub(strInput,1,37)) | |
swapColors() print("") swapColors() | |
end | |
end | |
local function coloredTextAt(inputText,outputRow,outputCol,textColor,backColor) | |
-- writes and colors text to coordinates | |
local oldRow, oldCol = term.getCursorPos() | |
local oldTextColor=term.getTextColor() | |
local oldBackColor=term.getBackgroundColor() | |
if textColor==nil then textColor=term.getTextColor() end | |
if backColor==nil then backColor=term.getBackgroundColor() end | |
term.setTextColor(textColor) | |
term.setBackgroundColor(backColor) | |
term.setCursorPos(outputRow,outputCol) | |
term.write(inputText) | |
term.setCursorPos(oldRow, oldCol) | |
term.setTextColor(oldTextColor) | |
term.setBackgroundColor(oldBackColor) | |
end | |
--------------------------------------- | |
---- tArgs ---------------------------- | |
--------------------------------------- | |
local tArgs = {...} | |
term.clear() term.setCursorPos(1,1) | |
local parameterShowSleep=1 | |
if #tArgs~=0 then | |
-- header | |
blnAskForParameters=false | |
term.clear() term.setCursorPos(1,1) | |
printUI("header") | |
printUI(""..cPrgName..", "..cVersion..", by Kaikaku. Enjoy!") | |
printUI("line") | |
coloredTextAt(cPrgName,2,2,baseColor) | |
print("Starting...") | |
if tArgs[1]~=nil then | |
digDeep=math.floor(tonumber(tArgs[1])) | |
if digDeep<=0 then | |
print("Parameter correction (depths must be >=1)!") | |
sleep(2) | |
parameterShowSleep=parameterShowSleep+2 | |
digDeep=1 | |
end | |
end | |
if tArgs[2]~=nil then | |
digWide=math.floor(tonumber(tArgs[2])) | |
if digWide==0 or digWide==1 or digWide==-1 then | |
print("Parameter correction (width not 0 or 1)!") | |
sleep(2) | |
parameterShowSleep=parameterShowSleep+2 | |
digWide=2 | |
end | |
end | |
if tArgs[3]~=nil then | |
digHeight=math.floor(tonumber(tArgs[3])) | |
if digHeight==0 then | |
print("Parameter correction (height not 0)!") | |
sleep(2) | |
parameterShowSleep=parameterShowSleep+2 | |
digHeight=1 | |
end | |
end | |
--check combinations of min values | |
if digDeep==1 and digWide<0 then | |
error("Parameter combination not allowed: depth=1 with width<0! Hint: increase depths or move turtle to use positive width.") | |
end | |
-- further parameters 4+ | |
for i=4,#tArgs,1 do | |
if string.lower(tArgs[i])=="layerbylayer" or string.lower(tArgs[i])=="layer" or string.lower(tArgs[i])=="singlelayer" then | |
blnLayerByLayer=true | |
end | |
if string.lower(tArgs[i])=="startwithin" or string.lower(tArgs[i])=="within" or string.lower(tArgs[i])=="in" then | |
blnStartWithin=true | |
end | |
if string.lower(tArgs[i])=="stripmine" or string.lower(tArgs[i])=="strip" or string.lower(tArgs[i])=="mine" then | |
blnStripMine=true | |
end | |
end | |
-- show parameters | |
print("Clear depth = "..digDeep) | |
print("Clear width = "..digWide) | |
print("Clear height= "..digHeight) | |
term.write("Option LayerByLayert= ") if blnLayerByLayer then print("on") else print("off") end | |
term.write("Option StartWithin = ") if blnStartWithin then print("on") else print("off") end | |
term.write("Option StripMine = ") if blnStripMine then print("on") else print("off") end | |
sleep(parameterShowSleep) | |
end | |
if blnShowUsage then | |
term.clear() term.setCursorPos(1,1) | |
printUI("header") | |
printUI(""..cPrgName..", by Kaikaku") | |
printUI("footer") | |
print("Usage: ",cPrgName," depth, width [height ['LayerByLayer'] ['StartWithin'] ['StripMine']] ") | |
print() | |
print("If called with any parameter, then") | |
print(" there will be no info screen. Turtle") | |
print(" starts immediately.") | |
return | |
end | |
--------------------------------------- | |
-- basic functions for turtle control - | |
--------------------------------------- | |
-- 2021-03-28 partly tPos (from tClear) | |
-- 2021-03-20 arrangeArray, printArray (from tLoader) | |
-- 2021-03-13 askForNumber, pressKeyNoSpecials, checkInventory(u), getFirstEmptySlot, identifyTool, findModem, ensureModem | |
-- 2021-03-05 gfr - | |
-- 2021-02-06 select+place - | |
-- 2021-01-29 save turtle go func - | |
-- checkInventory w/ exit - | |
-- refuelManager - | |
--------------------------------------- | |
local function gf(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.forward() do end end end | |
local function gb(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.back() do end end end | |
local function gu(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.up() do end end end | |
local function gd(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.down() do end end end | |
local function gl(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.turnLeft() do end end end | |
local function gr(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.turnRight() do end end end | |
local function df() turtle.dig() end | |
local function du() turtle.digUp() end | |
local function dd() turtle.digDown() end | |
local function dfs() while turtle.dig() do end end | |
local function dus() while turtle.digUp() do end end | |
local function dds() while turtle.digDown() do end end | |
local function pf() return turtle.place() end | |
local function pu() return turtle.placeUp() end | |
local function pd() return turtle.placeDown() end | |
local function sf() turtle.suck() end | |
local function su() turtle.suckUp() end | |
local function sd() turtle.suckDown() end | |
local function Df() turtle.drop() end | |
local function Du(n) turtle.dropUp(n) end | |
local function Dd() turtle.dropDown() end | |
local function ss(s) turtle.select(s) end | |
local function gic(s) return turtle.getItemCount(s) end | |
local function gfs(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.forward() do df() end end end | |
local function gbs(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.back() do gl() gl() df() gr() gr() end end end | |
local function gus(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.up() do du() end end end | |
local function gds(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.down() do dd() end end end | |
local function pfs() df() turtle.place() end | |
local function pus() du() turtle.placeUp() end | |
local function pds() dd() turtle.placeDown() end | |
local function gfr() return turtle.forward() end | |
local function gbr() return turtle.back() end | |
local function gur() return turtle.up() end | |
local function gdr() return turtle.down() end | |
local tPos={} | |
local function glPos(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.turnLeft() do end end end --tPos[4]=(tPos[4]-1)%4 end end | |
local function grPos(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.turnRight() do end end end --tPos[4]=(tPos[4]+1)%4 end end | |
local function gfPos(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.forward() do df() end end end --pCF(1) end end | |
local function gbPos(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.back() do gl() gl() df() gr() gr() end end end--pCF(-1) end end | |
local function guPos(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.up() do du() end tPos[3]=tPos[3]+1 end end | |
local function gdPos(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.down() do dd() end tPos[3]=tPos[3]-1 end end | |
local function spd(s,blnForward) | |
if s==nil then s=turtle.currentSlot() end | |
if blnForward==nil then blnForward=true end | |
ss(s) pd() if blnForward then gf() end | |
end | |
local function spu(s,blnForward) | |
if s==nil then s=turtle.currentSlot() end | |
if blnForward==nil then blnForward=true end | |
ss(s) pu() if blnForward then gf() end | |
end | |
local function spf(s,blnBack) | |
if s==nil then s=turtle.currentSlot() end | |
if blnBack==nil then blnBack=true end | |
ss(s) pf() if blnBack then gb() end | |
end | |
local function waitKey(strText) | |
local event, scancode | |
write(strText) | |
event, scancode = os.pullEvent("key") | |
print() | |
end | |
local function askForInputText(textt) | |
local at="" | |
-- check prompting texts | |
if textt==nil then textt="Enter text:" end | |
-- ask for input | |
write(textt) | |
at=read() | |
return at | |
end | |
local function askForNumber(askText, minValue, maxValue) | |
-- gets entered data, ensures it's a number and returns it | |
-- keeps asking if entry is not a number | |
-- adapts to min and max values | |
-- allways writes in screen line 13 (last for turtles) | |
-- calls askForInputText | |
local blnReask=true | |
local returnNumber=nil | |
if minValue==nil then minValur=1 end | |
if maxValue==nil then maxValue=100 end | |
if askText==nil then askText="Key in number and press Enter: " end | |
while blnReask do | |
term.setCursorPos(1,13) | |
returnNumber=askForInputText(askText) | |
if returnNumber==nil then | |
blnReask=true | |
else | |
returnNumber=tonumber(returnNumber) | |
if returnNumber==nil then | |
blnReask=true | |
else | |
returnNumber=math.floor(returnNumber) | |
if returnNumber>maxValue then returnNumber=maxValue end | |
if returnNumber<minValue then returnNumber=minValue end | |
blnReask=false | |
end | |
end | |
end | |
return returnNumber | |
end | |
local function pressKeyNoSpecials(askText) | |
-- excludes ctrl / alt / shifts | |
-- catches windows | |
-- retruns the key number (if needed at all) | |
local tmpEvent, tmpKey | |
if askText==nil then askText="Press key to START! (stop w/ ctrl+t) " end | |
tmpKey=341 | |
while tmpKey>=340 and tmpKey<=346 do -- ctrls, alts, shifts | |
term.write(askText) tmpEvent, tmpKey = os.pullEvent("key") | |
if tmpKey==nil then tmpKey=341 end -- win | |
end | |
return tmpKey | |
end | |
local function checkFuel() | |
local tmp=turtle.getFuelLevel() | |
return tmp | |
end | |
local function checkTurtle(blnOnlyIdentify) | |
if blnOnlyIdentify==nil then blnOnlyIdentify=false end | |
-- turtle? | |
local turtleOk, turtleVal = pcall(checkFuel) | |
if not turtleOk then | |
blnTurtle=false | |
if not blnOnlyIdentify then | |
term.clear() term.setCursorPos(1,1) | |
printUI("header") | |
printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
printUI("line") | |
printUI("This is a turtle program.") | |
printUI(" Please, execute it with a turtle!") | |
printUI("footer") | |
coloredTextAt(cPrgName,2,2,baseColor) | |
error() | |
end | |
else | |
blnTurtle=true | |
end | |
end | |
local function sleepDots(sec, duration) | |
if sec==nil then sec=10 end | |
if sec<1 then return end | |
if duration==nil then duration=1 end -- shorten durtation for more dots | |
for i=1,sec-1 do | |
sleep(1*duration) | |
term.write(".") | |
end | |
sleep(1) | |
print(".") | |
end | |
local function checkInventory(s, nMin, nMax, textt, blnExitOnFalse, blnRepeat) | |
-- checks if in slot s are not less than nMin and not more than nMax items | |
-- returns true if okay | |
-- if not displays textt | |
-- blnExitOnFalse=true raises an error | |
-- blnRepeat=true repeatedly sks to put in the right number of items (overrides blnExitOnFalse) | |
local oldSlot = turtle.getSelectedSlot() | |
if s==nil then s=turtle.getSelectedSlot() end | |
if nMin==nil then nMin=0 end | |
if nMax==nil then nMax=64 end | |
if blnExitOnFalse==nil then blnExitOnFalse=false end | |
if blnRepeat==nil then blnRepeat=false end | |
if blnRepeat~=true then blnRepeat=false end | |
while true do | |
if turtle.getItemCount(s)<nMin or turtle.getItemCount(s)>nMax then | |
print(textt) | |
if not blnRepeat then | |
-- single check ends with this | |
if blnExitOnFalse then | |
error() | |
else | |
ss(oldSlot) return false | |
end | |
end | |
-- repeated check | |
ss(s) | |
sleepDots(3) | |
else | |
-- everything is fine | |
ss(oldSlot) return true | |
end | |
end | |
end | |
local function refuelFromSlot(s, n) -- slot, amount to consume | |
if s==nil then s=16 end | |
if n==nil then n=64 end | |
local currentSlot = turtle.getSelectedSlot() | |
local fuelItems = turtle.getItemCount(s) | |
local returnValue = false | |
if fuelItems>0 then | |
ss(s) | |
returnValue=turtle.refuel(n) | |
ss(currentSlot) | |
end | |
return returnValue | |
end | |
local function refuelManager(setMinFuel,setSlotFuel,waitTime) | |
local currentSlotSelected=turtle.getSelectedSlot() | |
ss(setSlotFuel) | |
while turtle.getFuelLevel()<setMinFuel do | |
print("Need more fuel ("..turtle.getFuelLevel().."/"..setMinFuel..").") | |
if not refuelFromSlot(setSlotFuel) then | |
-- unsucessfull try | |
print(" Please, put fuel items in slot "..setSlotFuel.."!") | |
term.write(" Sleeping "..waitTime.." seconds") | |
sleepDots(waitTime) | |
else | |
print("Refueled...") | |
end | |
end | |
ss(currentSlotSelected) | |
end | |
local function debugPrint(str) | |
if blnDebugPrint then print(str) end | |
end | |
local function inspectFor(blockArray, strDirection) -- <<-- from TreeFarm | |
if strDirection==nil then strDirection="f" end | |
local blnOk, data | |
-- inspect | |
if strDirection=="d" then blnOk, data = turtle.inspectDown() | |
elseif strDirection=="u" then blnOk, data = turtle.inspectUp() | |
elseif strDirection=="f" then blnOk, data = turtle.inspect() | |
else | |
print("Warning: Unknown direction '",strDirection,"' in inspectFor, taking (f)orward instead.") | |
strDirection="f" | |
blnOk, data = turtle.inspect() | |
end | |
if data.name~=nil then debugPrint("Found:"..string.lower(data.name)) end | |
-- compare | |
local i=1 | |
while blockArray[i]~=nil do | |
debugPrint("Compare to:"..string.lower(blockArray[i])) | |
if data.name~=nil then | |
if string.lower(data.name) == string.lower(blockArray[i]) then return true end | |
end | |
i=i+1 | |
end | |
return false -- reached a nil value | |
end | |
local function getFirstEmptySlot(startAt) | |
if startAt==nil then startAt=1 end | |
if startAt>16 or startAt<1 then return nil end | |
for i=startAt,16,1 do | |
if gic(i)==0 then return i end | |
end | |
for i=1,startAt,1 do | |
if gic(i)==0 then return i end | |
end | |
return nil | |
end | |
local function identifyTool(toolSide) | |
-- returns name of tool at side toolSide | |
-- returns no_tool if there is none | |
-- requires at least one empty slot for tool check (throws error) | |
if toolSide==nil then toolSide="right" end | |
if toolSide~="right" and toolSide~="r" then toolSide="left" end | |
local slotNumber = getFirstEmptySlot() | |
local slotSelected=turtle.getSelectedSlot() | |
local toolName="no_tool" | |
if slotNumber==nil then error("Couldn't find empty slot to check tool on side '"..toolSide.."'!") end | |
ss(slotNumber) | |
-- step 1: get name | |
if toolSide=="right" or toolSide=="r" then | |
turtle.equipRight() | |
else | |
turtle.equipLeft() | |
end | |
-- step 2: get name | |
local data = turtle.getItemDetail() | |
if data~=nil then toolName=data.name end | |
-- step 3: re-equipget name | |
if toolSide=="right" or toolSide=="r" then | |
turtle.equipRight() | |
else | |
turtle.equipLeft() | |
end | |
ss(slotSelected) | |
return toolName | |
end | |
local function findModem() -- <<-- delete if no modem used | |
for _, p in pairs( rs.getSides() ) do | |
if peripheral.isPresent(p) and peripheral.getType(p) == "modem" then return true,p end | |
end | |
return false,nil | |
end | |
------------------------------------------------------------------------------ | |
-- main: description --------------------------------------------------------- | |
------------------------------------------------------------------------------ | |
checkTurtle() | |
if blnAskForParameters then | |
term.clear() term.setCursorPos(1,1) | |
local iPage=0 | |
local iPageMax=5 | |
local event, key, isHeld | |
local blnLoop=true | |
term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
printUI("header") | |
printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
printUI("line") | |
-- 1234567890123456789012345678901234567 | |
printUI("Program features:") | |
printUI("* Quick: mines 3 layers in 1 go") | |
printUI("* Precise: mines and moves only ") | |
printUI(" within the specified area") | |
printUI("* Versatile: place turtle at any") | |
printUI(" corner or within corner to start") | |
printUI("* Lava sparing: with layer by layer") | |
printUI("* Stripmine: may be misused for this") | |
printUI("footer") | |
coloredTextAt(cPrgName,2,2,baseColor) | |
coloredTextAt("Quick",4,5,baseColor) | |
coloredTextAt("Precise",4,6,baseColor) | |
coloredTextAt("Versatile",4,8,baseColor) | |
coloredTextAt("Lava sparing",4,10,baseColor) | |
coloredTextAt("Stripmine",4,11,baseColor) | |
pressKeyNoSpecials("Press key to START! (stop w/ ctrl+t) ") | |
--- | |
term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
printUI("header") | |
printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
printUI("line") | |
-- 1234567890123456789012345678901234567 | |
printUI("Program mines all blocks of a") | |
printUI(" d * w * h cuboid. ") | |
printUI(" ") | |
printUI(" height="..digHeight) | |
printUI(" ¸ ") | |
printUI(" | / depth="..digDeep) | |
printUI(" |/ ") | |
printUI(" +---- width="..digWide) | |
printUI("footer") | |
term.write("Key in depth and press Enter: ") | |
coloredTextAt(cPrgName,2,2,baseColor) | |
coloredTextAt("<-- enter (d>=1)",18,9,baseColor) | |
event, key, isHeld = os.pullEvent("key") | |
digDeep=askForNumber("Key in depth and press Enter: ",1,999) | |
--- | |
term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
printUI("header") | |
printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
printUI("line") | |
-- 1234567890123456789012345678901234567 | |
printUI("Program mines all blocks of a") | |
printUI(" d * w * h cuboid. ") | |
printUI(" ") | |
printUI(" height="..digHeight) | |
printUI(" ¸ ") | |
printUI(" | / depth=") | |
printUI(" |/ ") | |
printUI(" +---- width="..digWide) | |
printUI("footer") | |
term.write("Key in width and press Enter: ") | |
coloredTextAt(cPrgName,2,2,baseColor) | |
coloredTextAt( "(w>=2 or",31,10,baseColor) | |
coloredTextAt("<-- enter w<=-2)",21,11,baseColor) | |
coloredTextAt(digDeep,14,9,baseColor) | |
event, key, isHeld = os.pullEvent("key") | |
digWide=askForNumber("Key in width and press Enter: ",-999,999) | |
if digWide==-1 or digWide==0 or digWide==1 then digWide=2 end | |
--- | |
term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
printUI("header") | |
printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
printUI("line") | |
-- 1234567890123456789012345678901234567 | |
printUI("Program mines all blocks of a") | |
printUI(" d * w * h cuboid. ") | |
printUI(" ") | |
printUI(" height="..digHeight) | |
printUI(" ¸ ") | |
printUI(" | / depth=") | |
printUI(" |/ ") | |
printUI(" +---- width=") | |
printUI("footer") | |
term.write("Key in height and press Enter: ") | |
coloredTextAt(cPrgName,2,2,baseColor) | |
coloredTextAt("<-- enter (h<>0)",15,7,baseColor) | |
coloredTextAt(digDeep,14,9,baseColor) | |
coloredTextAt(digWide,17,11,baseColor) | |
event, key, isHeld = os.pullEvent("key") | |
digHeight=askForNumber("Key in height and press Enter: ",-999,999) | |
if digHeight==0 then digHeight=1 end | |
--- | |
term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
printUI("header") | |
printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
printUI("line") | |
-- 1234567890123456789012345678901234567 | |
printUI("Program mines all blocks of a") | |
printUI(" d * w * h cuboid. ") | |
printUI(" ") | |
printUI(" height= Options:") | |
printUI(" ¸ layer by layer: ") | |
printUI(" | / depth= start within: ") | |
printUI(' |/ "strip mine": ') | |
printUI(" +---- width=") | |
printUI("footer") | |
term.write("Toggle options or ENTER to start: ") | |
coloredTextAt(cPrgName,2,2,baseColor) | |
coloredTextAt("Options:",18,7,baseColor) | |
coloredTextAt("l",20,8,baseColor) | |
coloredTextAt("w",26,9,baseColor) | |
coloredTextAt("m",27,10,baseColor) | |
coloredTextAt(digDeep,14,9,baseColor) | |
coloredTextAt(digWide,17,11,baseColor) | |
coloredTextAt(digHeight,11,7,baseColor) | |
while blnLoop do | |
-- color toggles | |
if blnLayerByLayer then | |
coloredTextAt("on ",36,8,baseColor) | |
else | |
coloredTextAt("off",36,8,colors.white) | |
end | |
if blnStartWithin then | |
coloredTextAt("on ",36,9,baseColor) | |
else | |
coloredTextAt("off",36,9,colors.white) | |
end | |
if blnStripMine then | |
coloredTextAt("on ",36,10,baseColor) | |
else | |
coloredTextAt("off",36,10,colors.white) | |
end | |
-- get key | |
event, key, isHeld = os.pullEvent("key") | |
-- evaluate key | |
if key~=nil then | |
if keys.getName(key)=="l" then | |
blnLayerByLayer= not blnLayerByLayer | |
elseif keys.getName(key)=="m" then | |
blnStripMine= not blnStripMine | |
elseif keys.getName(key)=="w" then | |
blnStartWithin = not blnStartWithin | |
elseif keys.getName(key)=="enter" then | |
blnLoop=false | |
end | |
end | |
end | |
end | |
--------------------------------------- | |
-- additional functions - | |
--------------------------------------- | |
local blnDigUp=false | |
local blnDigDown=false | |
local function digUpDown() | |
if blnDigUp then dus() end | |
if blnDigDown then dds() end | |
end | |
local function gfPosDig(n) | |
if n==nil then n=1 end | |
for i=1,n,1 do | |
gfPos() digUpDown() | |
end | |
end | |
------------------------------------------------------------------------------ | |
-- main: pre-main options ---------------------------------------------------- | |
------------------------------------------------------------------------------ | |
local selfCall="" | |
local selfLayer="" | |
if blnStripMine then | |
-- let's missuse this beautiful program for strip mining | |
-- srtip mine step 1: main corridor | |
if blnLayerByLayer then selfLayer=" LayerByLayer" end | |
selfCall="tClear "..digDeep.." -2 "..digHeight..selfLayer | |
if blnStripMine then selfCall=selfCall.." within" end | |
--print(selfCall) | |
shell.run(selfCall) | |
-- strip mine step 2: mining shafts right side | |
-- step inside | |
if not blnStartWithin then gfPos() end | |
-- mine shafts | |
for i=1,digDeep,4 do | |
-- get on position | |
if i>1 then | |
gfPos(4) | |
end | |
-- mining shafts | |
selfCall="tClear 1 "..(digWide+1).." "..digHeight.." within"..selfLayer | |
print(selfCall) | |
--sleep(3) | |
shell.run(selfCall) | |
end | |
-- strip mine step 3: mining shafts left side | |
-- get on position | |
gl() gfPos() gl() | |
-- mine shafts | |
for i=1,digDeep,4 do | |
-- get on position | |
if i>1 then | |
gfPos(4) | |
end | |
-- mining shafts | |
selfCall="tClear 1 "..(digWide+1).." "..digHeight.." within"..selfLayer | |
print(selfCall) | |
--sleep(3) | |
shell.run(selfCall) | |
end | |
-- strip mine step 4: return | |
-- to entrance | |
gl() gfPos() gl() | |
-- step outside | |
if not blnStartWithin then gbPos() end | |
-- done | |
return | |
end | |
------------------------------------------------------------------------------ | |
-- main: program ------------------------------------------------------------- | |
------------------------------------------------------------------------------ | |
term.clear() term.setCursorPos(1,1) | |
---- step 0: check fuel ---- | |
print("step 0: checking fuel...") | |
-- fuel | |
-- estimate consumption | |
if not blnLayerByLayer then | |
cMinFuel=math.floor(digHeight/3) | |
else | |
cMinFuel=math.floor(digHeight) | |
end | |
cMinFuel=cMinFuel*(math.abs(digDeep)+1)*(math.abs(digWide)+1)+(digHeight*2) | |
cMinFuel=math.floor(cMinFuel*1.1) + 20 -- extra | |
refuelManager(cMinFuel,slotFuel,10) | |
print("... done") | |
---- step 1: do deal with negative values ---- | |
term.write("step 1: deal with negative values...") | |
-- first dig block is 1,1,1 | |
tPos[1]=1 tPos[2]=0 tPos[3]=1 tPos[4]=0 -- starting position | |
-- save inital values for end report | |
digWideOrg=digWide | |
digDeepOrg=digDeep | |
--- check negative width | |
local blnNegativeWidth=false | |
if digWide<0 then | |
blnNegativeWidth=true | |
digWide=digDeepOrg | |
digDeep=-digWideOrg | |
end | |
--- check negative height | |
local blnNegativeHeight=false | |
local remainingDigHeight=digHeight | |
if digHeight<0 then | |
blnNegativeHeight=true | |
remainingDigHeight=-digHeight | |
end | |
print(" done") | |
---- step 2: enter and go up ---- | |
term.write("step 2: enter and go up...") | |
-- step inside area | |
if not blnStartWithin then | |
-- move into cuboid | |
gfPosDig() | |
else | |
-- I'm already there | |
tPos[2]=1 | |
end | |
-- positive or negative inital width? | |
if not blnNegativeWidth then | |
grPos() -- turn to show progress | |
else | |
-- orientation is already okay, due to negative inital width | |
end | |
print(" done") | |
-- step 3: starting height | |
term.write("step 3: starting height...") | |
if not blnLayerByLayer then | |
-- normal 3 layer dig mode | |
if digHeight>2 then | |
-- get to right inital digging height | |
guPos(digHeight-2) | |
elseif digHeight<-1 then | |
-- get to right inital negative digging height | |
gdPos(1) | |
end | |
else | |
-- layer by layer | |
if digHeight>1 then | |
-- go to very top | |
guPos(digHeight-1) | |
else | |
-- just stay where you are | |
end | |
end | |
print(" done") | |
while remainingDigHeight>0 do | |
-- step 4: set dig up/down | |
term.write("step 4: set dig up/down...") | |
if not blnLayerByLayer then | |
-- normal 3 layer dig mode | |
if not blnNegativeHeight then | |
-- positive dig height | |
if tPos[3]>1 then | |
-- gone up to tripple dig | |
blnDigUp=true | |
blnDigDown=true | |
elseif remainingDigHeight==2 then | |
blnDigUp=true | |
blnDigDown=false | |
else | |
blnDigUp=false | |
blnDigDown=false | |
end | |
else | |
-- negative dig hight | |
if tPos[3]>=digHeight+3 then | |
-- gone down to tripple dig | |
blnDigUp=true | |
blnDigDown=true | |
elseif remainingDigHeight==2 then | |
blnDigUp=true--false | |
blnDigDown=false--true | |
else | |
blnDigUp=false | |
blnDigDown=false | |
end | |
end | |
else | |
-- layer by layer mode | |
blnDigUp=false | |
blnDigDown=false | |
end | |
print(" done") | |
---- step 5: digging one level ---- | |
term.write("step 5: digging one level...") | |
for iy=1,digDeep,1 do | |
if iy==1 then | |
gfPosDig() -- step inside track | |
elseif iy%2==0 then | |
-- u-turn left | |
glPos() gfPosDig() glPos() | |
else | |
-- u-turn right | |
grPos() gfPosDig() grPos() | |
end | |
-- lane | |
gfPosDig(digWide-2) | |
if iy==digDeep then | |
-- return | |
if iy%2==1 then | |
-- uneven! lets return | |
glPos(2) gfPosDig(digWide-2) | |
end | |
-- dig lane y=1 back | |
gfPosDig() glPos() gfPosDig(digDeep-1) glPos() | |
end | |
end | |
print(" done") | |
---- step 6: change level ---- | |
term.write("step 6: change level...") | |
-- adjuste remainingDigHeight | |
remainingDigHeight=remainingDigHeight-1 | |
if blnDigUp then remainingDigHeight=remainingDigHeight-1 end | |
if blnDigDown then remainingDigHeight=remainingDigHeight-1 end | |
-- adjust layer if there's s.th. left to dig | |
if remainingDigHeight>0 then | |
if not blnLayerByLayer then | |
-- normal 3 layer dig mode | |
-- inital dig height pos or neg? | |
if not blnNegativeHeight then | |
-- inital dig height positive | |
-- get to next dig level | |
if remainingDigHeight>=2 then | |
gdPos(3) | |
else | |
gdPos(tPos[3]-1) | |
end | |
else | |
-- inital dig height negative | |
-- get to next dig level | |
if remainingDigHeight>=2 then | |
gdPos(3) | |
else | |
gdPos(-digHeight+tPos[3]-2) | |
end | |
end | |
else | |
-- layer by layer mode | |
gdPos(1) -- just the next one | |
end | |
end | |
print(" done") | |
end | |
---- step 7: return to floor ---- | |
term.write("step 7: return to floor...") | |
-- return to floor | |
if not blnNegativeHeight then | |
gdPos(tPos[3]-1) | |
else | |
guPos(-tPos[3]+1) | |
end | |
-- positive or negative inital width? | |
if not blnNegativeWidth then | |
glPos() -- turn to leave | |
else | |
-- orientation is already okay, due to negative inital width | |
end | |
-- step out of area | |
if not blnStartWithin then | |
-- move out of cuboid | |
gbPos() | |
else | |
-- I started there, so I'm already done | |
end | |
print(" done") | |
---- step 8: finishing stuff / report ---- | |
print("Done with tClear "..digDeep.." "..digWide.." "..digHeight) | |
print("That looks much cleaner now! !") ss(1) | |
--sleep(0.4) | |
printUI("header") | |
printUI("Check out YouTube for more videos") | |
printUI("and turtle programs by Kaikaku :)") | |
printUI("footer") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment