809 lines
31 KiB
Lua
809 lines
31 KiB
Lua
|
--[[Updated Version by Silvamord]]--
|
||
|
--[[For questions and support go to https://discord.gg/thegrindspot]]--
|
||
|
--[[Copyright PrinceTommen - Script developed for Cyepicx (twitch.tv/cyepicx)]]--
|
||
|
--[[You are all allowed to use it as long as you don't pretend it's yours]]--
|
||
|
--[[Have fun !]]--
|
||
|
version =" 3.6"
|
||
|
--[[
|
||
|
Release Note:
|
||
|
3.6: Updated to work with tweaked.cc
|
||
|
os.pullEvent calls filtered to "keys" only
|
||
|
key compares from pullEvent now use the keys enum instead of magic numbers.
|
||
|
3.5: Added: Multiple item slots system, including the items to throw (suggested by Portsanta and Cyepicx)
|
||
|
Major interface enhancements to make the configuration faster in spite of the new options
|
||
|
Enhanced item shortage security, supporting the multiple slots
|
||
|
New functions to manage I/O in a more compact way (suggested by Niseg)
|
||
|
3.41: Fixed: Important glitch when the turtle returned to its starting position with a certain configuration
|
||
|
Displaying issues
|
||
|
3.4: Added: Favorite configuration system
|
||
|
Ability to choose the direction of the series of parallel tunnels (right or left)
|
||
|
Support of execution without torches or chests (will not try to place them)
|
||
|
Security that stops the turtle when it runs out of chests or torches (suggested by Cyepicx)
|
||
|
Chests and torches status updated automatically
|
||
|
Security that requires the user to press enter before the turtle starts (suggested by Cyepicx)
|
||
|
The turtle now returns to its starting position after it finishes
|
||
|
New rotation function as well a a specific torch placing function
|
||
|
Fixed: The turtle will now properly finish the hub after mining an odd number of tunnels
|
||
|
The torch placement has been modified to avoid conflicts with chests
|
||
|
3.3: Added: Enderchest Support (suggested by Niseg and Daniteh)
|
||
|
Release note
|
||
|
3.2: Fixed: Very important chest placing issue (only appeared in 3.1)
|
||
|
3.1: Added: New mining pattern for more efficiency (suggested by Niseg)
|
||
|
Smarter fuel management: Will now consume the "stored" fuel before refueling
|
||
|
Can now consume any type of fuel supported by turtles (check the wiki)
|
||
|
Fuel type can be changed while the turtle is mining
|
||
|
Optimized the mining of 3 blocks high tunnels
|
||
|
Better interface, instructions remain visible and a line is dedicated to the fuel status (updated automatically)
|
||
|
Option to throw cobblestone automatically (suggested by Niseg)
|
||
|
Fixed: Refueling issue in certain circumstances (reported by Cyepicx)
|
||
|
]]--
|
||
|
function resetScreen()
|
||
|
term.clear()
|
||
|
term.setCursorPos(14,1)
|
||
|
write("Mining Turtle")
|
||
|
term.setCursorPos(5,2)
|
||
|
write("For CyanideEpic and his friends")
|
||
|
term.setCursorPos(1,13)
|
||
|
write("By PrinceTommen, version "..version)
|
||
|
term.setCursorPos(1,4)
|
||
|
end
|
||
|
function textOutput(output_message, x_screen_pos, z_screen_pos, clear_area)
|
||
|
term.setCursorPos(x_screen_pos,z_screen_pos)
|
||
|
if clear_area == 0 then
|
||
|
clear_area = string.len(output_message)
|
||
|
end
|
||
|
write(output_message..string.rep(" ", (clear_area - string.len(output_message))))
|
||
|
end
|
||
|
function securedInput(x_screen_pos, z_screen_pos, nature, lower_value, upper_value, example1, example2)
|
||
|
example = {example1, example2}
|
||
|
local function shortExample(example_int, example, boolStringPart)
|
||
|
tableShortExample = {}
|
||
|
tableShortExample[example_int] = example[example_int].." ("..string.sub(string.lower(example[example_int]), 1, 1)..") "
|
||
|
if boolStringPart then
|
||
|
return string.sub(string.lower(example[example_int]), 1, 1)
|
||
|
else
|
||
|
return tableShortExample[example_int]
|
||
|
end
|
||
|
end
|
||
|
incipit = shortExample(1, example, false).."/ "..shortExample(2, example, false)..": "
|
||
|
if nature == "text" then
|
||
|
repeat
|
||
|
textOutput(incipit, x_screen_pos, z_screen_pos, 39)
|
||
|
term.setCursorPos(string.len(incipit)+1,z_screen_pos)
|
||
|
user_input = string.sub(string.lower(read()), 1, 1)
|
||
|
until (user_input == shortExample(1, example, true) or user_input == shortExample(2, example, true))
|
||
|
elseif nature == "integer" then
|
||
|
repeat
|
||
|
textOutput(" ", x_screen_pos, z_screen_pos, (39 - x_screen_pos))
|
||
|
term.setCursorPos(x_screen_pos,z_screen_pos)
|
||
|
user_input = tonumber(read())
|
||
|
until (user_input >= lower_value and user_input <= upper_value)
|
||
|
end
|
||
|
return user_input
|
||
|
end
|
||
|
function clearLines(firstLine, lastLine)
|
||
|
a = 1
|
||
|
for a=1, (lastLine-firstLine+1) do
|
||
|
textOutput("", 1, (firstLine+a-1), 40)
|
||
|
end
|
||
|
end
|
||
|
function convertToBool(var, boolTrue)
|
||
|
if var == boolTrue then
|
||
|
var = true
|
||
|
else
|
||
|
var = false
|
||
|
end
|
||
|
return var
|
||
|
end
|
||
|
function turn(FacingAngle, Bool_rotation, Rotation_integer)
|
||
|
if Bool_rotation then
|
||
|
for u=1, Rotation_integer do
|
||
|
turtle.turnRight()
|
||
|
end
|
||
|
FacingAngle = FacingAngle + Rotation_integer
|
||
|
else
|
||
|
for u=1, Rotation_integer do
|
||
|
turtle.turnLeft()
|
||
|
end
|
||
|
FacingAngle = FacingAngle - Rotation_integer
|
||
|
end
|
||
|
FacingAngle = math.abs((FacingAngle - 1)%4+1)
|
||
|
return FacingAngle
|
||
|
end
|
||
|
local function refuel()
|
||
|
turtle.select(torches_slots+current_slot[2])
|
||
|
while not(turtle.refuel(1)) do
|
||
|
for f=1, fuel_slots do
|
||
|
current_slot[2], shortage[2] = rotateSlot(2, torches_slots+1, fuel_slots)
|
||
|
turtle.select(torches_slots+current_slot[2])
|
||
|
if turtle.refuel(1) then
|
||
|
boolRefuel = true
|
||
|
break
|
||
|
else
|
||
|
boolRefuel = false
|
||
|
end
|
||
|
end
|
||
|
if not(boolRefuel) then
|
||
|
textOutput("No Fuel -", 1, 11, 0)
|
||
|
current_slot[2], shortage[2] = manageShortage(2, torches_slots+1, torches_slots+fuel_slots)
|
||
|
end
|
||
|
end
|
||
|
refuel_count = 80 - turtle.getFuelLevel()
|
||
|
textOutput("Fuel OK -", 1, 11, 0)
|
||
|
return refuel_count
|
||
|
end
|
||
|
function moveForward(FacingAngle, Boolfb, moving_integer, digUpBool, digDownBool, refuel_count)
|
||
|
local moving_count = 1
|
||
|
for moving_count=1,moving_integer do
|
||
|
if (refuel_count == 80) then
|
||
|
refuel_count = refuel()
|
||
|
end
|
||
|
Bool1 = false
|
||
|
while not(Bool1) do
|
||
|
if (Boolfb) then
|
||
|
turtle.dig()
|
||
|
Bool1 = turtle.forward()
|
||
|
if (digUpBool) then
|
||
|
turtle.digUp()
|
||
|
end
|
||
|
if (digDownBool) then
|
||
|
turtle.digDown()
|
||
|
end
|
||
|
else
|
||
|
Bool1 = turtle.back()
|
||
|
if not(Bool1) then
|
||
|
turn(FacingAngle, true, 2)
|
||
|
turtle.dig()
|
||
|
turn(FacingAngle, false, 2)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
moving_count = moving_count + 1
|
||
|
refuel_count = refuel_count + 1
|
||
|
end
|
||
|
return refuel_count
|
||
|
end
|
||
|
function moveUp(Boolud, moving_integer, refuel_count, Bool_DigFront)
|
||
|
local moving_count = 1
|
||
|
for moving_count=1, moving_integer do
|
||
|
if (refuel_count == 80) then
|
||
|
refuel_count = refuel()
|
||
|
end
|
||
|
Bool2 = false
|
||
|
if Bool_DigFront then
|
||
|
turtle.dig()
|
||
|
end
|
||
|
while not(Bool2) do
|
||
|
if (Boolud) then
|
||
|
turtle.digUp()
|
||
|
Bool2 = turtle.up()
|
||
|
else
|
||
|
turtle.digDown()
|
||
|
Bool2 = turtle.down()
|
||
|
end
|
||
|
end
|
||
|
moving_count = moving_count + 1
|
||
|
refuel_count = refuel_count + 1
|
||
|
end
|
||
|
return refuel_count
|
||
|
end
|
||
|
function manageShortage(managedItem, initial_item_slot, final_item_slot)
|
||
|
textOutput("The turtle has used all the "..(itemNames[managedItem+3]).." intitially given. Have you refilled all the "..(itemNames[managedItem+3]).." slots ?", 1, 4, 0)
|
||
|
textOutput("Press enter if all the "..(itemNames[managedItem+3]).." slots are refilled (slots "..(initial_item_slot).." to "..(final_item_slot)..").", 1, 7, 0)
|
||
|
repeat
|
||
|
turn(FacingAngle, true, 4)
|
||
|
os.startTimer(1)
|
||
|
press, key = os.pullEvent("key")
|
||
|
until (key == keys.enter)
|
||
|
clearLines(4,10)
|
||
|
current_slot[managedItem] = 1
|
||
|
shortage[managedItem] = false
|
||
|
return current_slot[managedItem], shortage[managedItem]
|
||
|
end
|
||
|
function rotateSlot(managedItem, control_slot, rotation_controler)
|
||
|
if (turtle.getItemCount(control_slot) == 0) or (managedItem == 2) then
|
||
|
if current_slot[managedItem]==rotation_controler and (managedItem ~= 2) then
|
||
|
shortage[managedItem] = true
|
||
|
else
|
||
|
current_slot[managedItem]=((current_slot[managedItem])%rotation_controler)+1
|
||
|
end
|
||
|
end
|
||
|
return current_slot[managedItem], shortage[managedItem]
|
||
|
end
|
||
|
function inventoryManagement(refuel_count,Right_or_Left,throw_cobble)
|
||
|
function fullInventory(n)
|
||
|
n = m + 1
|
||
|
repeat
|
||
|
item_count = turtle.getItemCount(n)
|
||
|
if (item_count ~= 0) then
|
||
|
boolSlotOccupied = true
|
||
|
n = n + 1
|
||
|
else
|
||
|
boolSlotOccupied = false
|
||
|
end
|
||
|
until (boolSlotOccupied == false) or (n == 17)
|
||
|
return n
|
||
|
end
|
||
|
if Chest_approval then
|
||
|
m = torches_slots + chests_slots + fuel_slots + garbage_slots
|
||
|
thrown_slots = 0
|
||
|
if (turtle.getItemCount(16) ~= 0) and (m~=16) then
|
||
|
if fullInventory(m)==17 then
|
||
|
if throw_stuff then
|
||
|
for k=1, garbage_slots do
|
||
|
for j=1, (16-m) do
|
||
|
turtle.select(m - garbage_slots + k)
|
||
|
Bool_match_stuff = turtle.compareTo(m+j)
|
||
|
if Bool_match_stuff then
|
||
|
thrown_slots = thrown_slots + 1
|
||
|
turtle.select(m+j)
|
||
|
turtle.drop()
|
||
|
end
|
||
|
end
|
||
|
turtle.select(m - garbage_slots + k)
|
||
|
turtle.drop(turtle.getItemCount(m - garbage_slots + k)-1)
|
||
|
end
|
||
|
for z = (m+1), 16 do
|
||
|
for u = (z+1), 16 do
|
||
|
if turtle.getItemCount(u)~=0 then
|
||
|
turtle.select(u)
|
||
|
turtle.transferTo(z)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if not(throw_stuff) or ((thrown_slots <= 2) and (fullInventory(n)>15)) then
|
||
|
if shortage[3] then
|
||
|
textOutput("No Chests", 24, 11, 0)
|
||
|
current_slot[3], shortage[3] = manageShortage(3, torches_slots+fuel_slots+1, torches_slots+fuel_slots+chests_slots)
|
||
|
end
|
||
|
textOutput("Chests OK", 24, 11, 0)
|
||
|
if (Right_or_Left == "left") then
|
||
|
FacingAngle = turn(FacingAngle, true, 1)
|
||
|
else
|
||
|
FacingAngle = turn(FacingAngle, false, 1)
|
||
|
end
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, false, true, refuel_count)
|
||
|
turtle.select(torches_slots+fuel_slots+current_slot[3])
|
||
|
turtle.digDown()
|
||
|
turtle.placeDown()
|
||
|
for u=(m+1),16 do
|
||
|
if turtle.getItemCount(u)~=0 then
|
||
|
turtle.select(u)
|
||
|
turtle.dropDown()
|
||
|
end
|
||
|
end
|
||
|
if enderchest then
|
||
|
turtle.select(torches_slots+fuel_slots+1)
|
||
|
turtle.drop()
|
||
|
turtle.digDown()
|
||
|
end
|
||
|
current_slot[3], shortage[3] = rotateSlot(3, torches_slots+fuel_slots+current_slot[3], chests_slots)
|
||
|
refuel_count = moveForward(FacingAngle, false, 1, false, false, refuel_count)
|
||
|
if (Right_or_Left == "left") then
|
||
|
FacingAngle = turn(FacingAngle, false, 1)
|
||
|
else
|
||
|
FacingAngle = turn(FacingAngle, true, 1)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
turtle.select(1)
|
||
|
return refuel_count
|
||
|
end
|
||
|
function placeTorch(Position)
|
||
|
if Torch_approval then
|
||
|
if shortage[1] then
|
||
|
textOutput("No Torches -", 11, 11, 0)
|
||
|
current_slot[1], shortage[1] = manageShortage(1, 1, torches_slots)
|
||
|
end
|
||
|
textOutput("Torches OK -", 11, 11, 0)
|
||
|
turtle.select(current_slot[1])
|
||
|
if Position == "front" then
|
||
|
turtle.dig()
|
||
|
turtle.place()
|
||
|
elseif Position == "below" then
|
||
|
turtle.digDown()
|
||
|
turtle.placeDown()
|
||
|
elseif Position == "up" then
|
||
|
turtle.digUp()
|
||
|
turtle.placeUp()
|
||
|
end
|
||
|
current_slot[1], shortage[1] = rotateSlot(1, current_slot[1], torches_slots)
|
||
|
end
|
||
|
end
|
||
|
function digVerticalLayer(refuel_count, FacingAngle, Width, Height, Height_Position, Bool_Torches, Right_or_Left)
|
||
|
if Right_or_Left then
|
||
|
Right_or_Left = "left"
|
||
|
else
|
||
|
Right_or_Left = "right"
|
||
|
end
|
||
|
done_columns = 0
|
||
|
if (Height_Position == "up") then
|
||
|
for columns=1, math.floor(Width/4) do
|
||
|
turtle.digUp()
|
||
|
if (Height > 3) then
|
||
|
refuel_count = moveUp(true, 1, refuel_count, false)
|
||
|
turtle.dig()
|
||
|
refuel_count = moveUp(false, (Height-2), refuel_count, true)
|
||
|
turtle.digDown()
|
||
|
end
|
||
|
refuel_count = moveForward(FacingAngle, true, 2, true, true, refuel_count)
|
||
|
refuel_count = inventoryManagement(refuel_count, Right_or_Left, throw_cobble)
|
||
|
if (Height > 3) then
|
||
|
refuel_count = moveUp(false, 1, refuel_count, false)
|
||
|
turtle.dig()
|
||
|
refuel_count = moveUp(true, (Height-2), refuel_count, true)
|
||
|
turtle.digUp()
|
||
|
end
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
done_columns = done_columns + 1
|
||
|
if (Width - 4*done_columns ~= 0) then
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
end
|
||
|
end
|
||
|
if ((Width - 4*math.floor(Width/4)) == 0) then
|
||
|
Height_Position = "up"
|
||
|
elseif ((Width - 4*math.floor(Width/4)) == 1) then
|
||
|
turtle.digUp()
|
||
|
refuel_count = moveUp(false, (Height-3), refuel_count, false)
|
||
|
turtle.digDown()
|
||
|
refuel_count = inventoryManagement(refuel_count, Right_or_Left, throw_cobble)
|
||
|
Height_Position = "down"
|
||
|
elseif ((Width - 4*math.floor(Width/4)) >= 2) then
|
||
|
if (Height > 3) then
|
||
|
refuel_count = moveUp(true, 1, refuel_count, false)
|
||
|
turtle.dig()
|
||
|
refuel_count = moveUp(false, (Height-2), refuel_count, true)
|
||
|
turtle.digDown()
|
||
|
end
|
||
|
turtle.digUp()
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
refuel_count = inventoryManagement(refuel_count, Right_or_Left, throw_cobble)
|
||
|
Height_Position = "down"
|
||
|
if ((Width - 4*math.floor(Width/4)) == 3) then
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
refuel_count = moveUp(true, (Height - 3), refuel_count, false)
|
||
|
turtle.digUp()
|
||
|
Height_Position = "up"
|
||
|
end
|
||
|
end
|
||
|
elseif (Height_Position == "down") then
|
||
|
for columns=1, math.floor(Width/4) do
|
||
|
turtle.digDown()
|
||
|
if (Height > 3) then
|
||
|
refuel_count = moveUp(false, 1, refuel_count, false)
|
||
|
turtle.dig()
|
||
|
refuel_count = moveUp(true, (Height - 2), refuel_count, true)
|
||
|
turtle.digUp()
|
||
|
end
|
||
|
refuel_count = moveForward(FacingAngle, true, 2, true, true, refuel_count)
|
||
|
if (Height > 3) then
|
||
|
refuel_count = moveUp(true, 1, refuel_count, false)
|
||
|
turtle.dig()
|
||
|
refuel_count = moveUp(false, (Height - 2), refuel_count, true)
|
||
|
turtle.digDown()
|
||
|
end
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
done_columns = done_columns + 1
|
||
|
if (Width - 4*done_columns ~= 0) then
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
end
|
||
|
refuel_count = inventoryManagement(refuel_count, Right_or_Left, throw_cobble)
|
||
|
if (done_columns%2 == 0) and Bool_Torches then
|
||
|
FacingAngle = turn(FacingAngle,true , 1)
|
||
|
placeTorch("front")
|
||
|
FacingAngle = turn(FacingAngle, false, 1)
|
||
|
end
|
||
|
end
|
||
|
if ((Width - 4*math.floor(Width/4)) == 0) then
|
||
|
Height_Position = "down"
|
||
|
elseif ((Width - 4*math.floor(Width/4)) == 1) then
|
||
|
turtle.digDown()
|
||
|
refuel_count = moveUp(true, (Height - 3), refuel_count, false)
|
||
|
turtle.digUp()
|
||
|
Height_Position = "up"
|
||
|
elseif ((Width - 4*math.floor(Width/4)) >= 2) then
|
||
|
if (Height > 3) then
|
||
|
refuel_count = moveUp(false, 1, refuel_count, false)
|
||
|
turtle.dig()
|
||
|
refuel_count = moveUp(true, (Height - 2), refuel_count, true)
|
||
|
turtle.digUp()
|
||
|
end
|
||
|
turtle.digDown()
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
Height_Position = "up"
|
||
|
if ((Width - 4*math.floor(Width/4)) == 3) then
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
refuel_count = moveUp(false, (Height - 3), refuel_count, false)
|
||
|
turtle.digDown()
|
||
|
refuel_count = inventoryManagement(refuel_count, Right_or_Left, throw_cobble)
|
||
|
Height_Position = "down"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return refuel_count, Height_Position
|
||
|
end
|
||
|
|
||
|
enderchest, throw_stuff, Chest_approval, Torch_approval, Chest_mismatch, Torch_mismatch = false, false, false, false, false, false
|
||
|
shortage, itemNames = {false, false, false}, {"torch", "fuel", "chest", "torches", "fuel", "chests"}
|
||
|
|
||
|
resetScreen()
|
||
|
if (io.open("favorite", "r") ~= nil) then
|
||
|
resetScreen()
|
||
|
textOutput("Do you wish to use your favorite configuration ?", 1, 4, 0)
|
||
|
Favorite_approval = securedInput(1, 6, "text", 0, 0, "Yes", "No")
|
||
|
if (Favorite_approval == "y") then
|
||
|
handle = fs.open("favorite", "r")
|
||
|
input = handle.readAll()
|
||
|
handle.close()
|
||
|
favorite = textutils.unserialize(input)
|
||
|
tunnels_integer = favorite.tunnels_integer
|
||
|
Width = favorite.Width
|
||
|
Height = favorite.Height
|
||
|
Length = favorite.Length
|
||
|
tunnels_separation = favorite.tunnels_separation
|
||
|
throw_stuff = favorite.throw_stuff
|
||
|
enderchest = favorite.enderchest
|
||
|
Torch_approval = favorite.Torch_approval
|
||
|
Chest_approval = favorite.Chest_approval
|
||
|
end
|
||
|
end
|
||
|
if (io.open("favorite", "r") == nil) or ((io.open("favorite", "r") ~= nil) and (Favorite_approval == "n")) then
|
||
|
resetScreen()
|
||
|
textOutput("Number of parallel tunnels ? ", 1, 4, 0)
|
||
|
tunnels_integer = securedInput(37, 4, "integer", 1, 1000, " ", " ")
|
||
|
textOutput("Width of the tunnels ? ", 1, 5, 0)
|
||
|
Width = securedInput(37, 5, "integer", 1, 1000, " ", " ")
|
||
|
term.setCursorPos(1,6)
|
||
|
textOutput("Height of the tunnels ? ", 1, 6, 0)
|
||
|
Height = securedInput(37, 6, "integer", 1, 200, " ", " ")
|
||
|
if (Height < 3) then
|
||
|
Height = 3
|
||
|
end
|
||
|
term.setCursorPos(1,7)
|
||
|
textOutput("Length of the tunnels ? ", 1, 7, 0)
|
||
|
Length = securedInput(37, 7, "integer", 1, 100000, " ", " ")
|
||
|
if (tunnels_integer > 1) then
|
||
|
term.setCursorPos(1,8)
|
||
|
textOutput("Separating blocks between tunnels ? ", 1, 8, 0)
|
||
|
tunnels_separation = securedInput(37, 8, "integer", 1, 1000, " ", " ")
|
||
|
else
|
||
|
tunnels_separation = 0
|
||
|
end
|
||
|
|
||
|
resetScreen()
|
||
|
textOutput("To use regular chests, press c", 1, 4, 0)
|
||
|
textOutput("To use an enderchest, press e", 1, 5, 0)
|
||
|
textOutput("To use torches, press t", 1, 6, 0)
|
||
|
textOutput("To throw away specific items, press p", 1, 7, 0)
|
||
|
textOutput("Press enter once you have chosen all the options you wanted to activate.", 1, 11, 0)
|
||
|
while true do
|
||
|
press, key = os.pullEvent("key")
|
||
|
if press == "key" and key == keys.enter then
|
||
|
break
|
||
|
elseif key == keys.c then
|
||
|
if Chest_approval then
|
||
|
Chest_approval = false
|
||
|
textOutput("", 10, 9, 11)
|
||
|
else
|
||
|
Chest_approval = true
|
||
|
textOutput("Chests,", 10, 9, 11)
|
||
|
end
|
||
|
elseif key == keys.e then
|
||
|
if enderchest then
|
||
|
enderchest = not(enderchest)
|
||
|
textOutput("", 10, 9, 11)
|
||
|
else
|
||
|
Chest_approval = true
|
||
|
enderchest = true
|
||
|
textOutput("Enderchest,", 10, 9, 11)
|
||
|
end
|
||
|
elseif key == keys.t then
|
||
|
if Torch_approval then
|
||
|
Torch_approval = false
|
||
|
textOutput("", 1, 9, 8)
|
||
|
else
|
||
|
Torch_approval = true
|
||
|
textOutput("Torches,", 1, 9, 8)
|
||
|
end
|
||
|
elseif key == keys.p then
|
||
|
if throw_stuff then
|
||
|
throw_stuff = not(throw_stuff)
|
||
|
textOutput("", 22, 9, 12)
|
||
|
else
|
||
|
throw_stuff = true
|
||
|
textOutput("Throw items.", 22, 9, 12)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
resetScreen()
|
||
|
|
||
|
textOutput("Do you want to save this configuration as your favorite ?", 1, 4, 0)
|
||
|
New_favorite = securedInput(1, 6, "text", 0, 0, "Yes", "No")
|
||
|
|
||
|
if (New_favorite == "y") then
|
||
|
favorite = {}
|
||
|
favorite.tunnels_integer = tunnels_integer
|
||
|
favorite.Width = Width
|
||
|
favorite.Height = Height
|
||
|
favorite.Length = Length
|
||
|
favorite.tunnels_separation = tunnels_separation
|
||
|
favorite.Torch_approval = Torch_approval
|
||
|
favorite.Chest_approval = Chest_approval
|
||
|
favorite.throw_stuff = throw_stuff
|
||
|
favorite.enderchest = enderchest
|
||
|
output = textutils.serialize(favorite)
|
||
|
handle = fs.open("favorite", "w")
|
||
|
handle.write(output)
|
||
|
handle.close()
|
||
|
end
|
||
|
end
|
||
|
resetScreen()
|
||
|
textOutput("To manage extra slots, press s", 1, 4, 0)
|
||
|
textOutput("This option allows you to have several torches/fuel/chests slots, as well as different items to throw", 1, 6, 0)
|
||
|
textOutput("Else, press enter to skip this step.", 1, 10, 0)
|
||
|
torches_slots, chests_slots, garbage_slots = 0, 0, 0
|
||
|
while true do
|
||
|
press, key = os.pullEvent("key")
|
||
|
if press == "key" and key == keys.enter then
|
||
|
fuel_slots = 1
|
||
|
break
|
||
|
elseif key == keys.s then
|
||
|
repeat
|
||
|
turtle.select(1)
|
||
|
resetScreen()
|
||
|
textOutput("Number of fuel slots ? ", 1, 4, 0)
|
||
|
fuel_slots = securedInput(29, 4, "integer", 1, 16, " ", " ")
|
||
|
slot_total = fuel_slots
|
||
|
if Torch_approval then
|
||
|
textOutput("Number of torches slots ? ", 1, 5, 0)
|
||
|
torches_slots = securedInput(29, 5, "integer", 1, 16, " ", " ")
|
||
|
slot_total = slot_total + torches_slots
|
||
|
end
|
||
|
if Chest_approval and not(enderchest) then
|
||
|
textOutput("Number of chests slots ? ", 1, 6, 0)
|
||
|
chests_slots = securedInput(29, 6, "integer", 1, 16, " ", " ")
|
||
|
slot_total = slot_total + chests_slots
|
||
|
end
|
||
|
if throw_stuff then
|
||
|
textOutput("Number of undesired items ? ", 1, 7, 0)
|
||
|
garbage_slots = securedInput(29, 7, "integer", 1, 16, " ", " ")
|
||
|
slot_total = slot_total + garbage_slots
|
||
|
end
|
||
|
until (slot_total < 16)
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
resetScreen()
|
||
|
if (tunnels_integer > 1) then
|
||
|
textOutput("The first tunnel will be in front of the turtle. Do you want the tunnels to be dug on the right or on the left of the first tunnel (They will be parallel to the first one) ?", 1, 4, 0)
|
||
|
Bool_direction = securedInput(1, 9, "text", 0, 0, "Right", "Left")
|
||
|
end
|
||
|
if (tunnels_integer == 1) and (Width > 1) then
|
||
|
textOutput("In front of the turtle will be one side of the tunnel. Do you want it to mine the rest on the left or on the right ?", 1, 4, 0)
|
||
|
Bool_direction = securedInput(1, 9, "text", 0, 0, "Right", "Left")
|
||
|
end
|
||
|
resetScreen()
|
||
|
if Torch_approval then
|
||
|
if torches_slots > 1 then
|
||
|
textOutput("Torches in the slots 1 to "..torches_slots, 1, 4, 0)
|
||
|
else
|
||
|
torches_slots = 1
|
||
|
textOutput("Torches in the slot 1", 1, 4, 0)
|
||
|
end
|
||
|
end
|
||
|
if fuel_slots > 1 then
|
||
|
textOutput("Fuel in the slots "..(torches_slots+1).." to "..(torches_slots+fuel_slots), 1, 5, 0)
|
||
|
else
|
||
|
fuel_slots = 1
|
||
|
textOutput("Fuel in the slot "..(torches_slots+1), 1, 5, 0)
|
||
|
end
|
||
|
if Chest_approval and not(enderchest) then
|
||
|
if chests_slots > 1 then
|
||
|
textOutput("Chests in the slots "..(torches_slots+fuel_slots+1).." to "..(torches_slots+fuel_slots+chests_slots), 1, 6, 0)
|
||
|
else
|
||
|
chests_slots = 1
|
||
|
textOutput("Chests in the slot "..(torches_slots+fuel_slots+1), 1, 6, 0)
|
||
|
end
|
||
|
end
|
||
|
if enderchest then
|
||
|
textOutput("The enderchest in the slot "..(torches_slots+fuel_slots+1), 1, 6, 0)
|
||
|
chests_slots = 1
|
||
|
end
|
||
|
if throw_stuff then
|
||
|
if garbage_slots > 1 then
|
||
|
textOutput("Please make sure there are samples of the items to throw in the slots "..(torches_slots+fuel_slots+chests_slots+1).." to "..(torches_slots+fuel_slots+chests_slots+garbage_slots), 1, 8, 0)
|
||
|
else
|
||
|
garbage_slots = 1
|
||
|
textOutput("Please make sure there is a sample of the item to throw in the slot "..(torches_slots+fuel_slots+chests_slots+1), 1, 8, 0)
|
||
|
end
|
||
|
end
|
||
|
if (Bool_direction == "r") then
|
||
|
Bool_direction = true
|
||
|
else
|
||
|
Bool_direction = false
|
||
|
end
|
||
|
textOutput("Press enter to start", 1, 11, 0)
|
||
|
while true do
|
||
|
press, key = os.pullEvent("key")
|
||
|
if press == "key" and key == keys.enter then
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
resetScreen()
|
||
|
textOutput("", 1, 11, 20)
|
||
|
if Torch_approval and (turtle.getItemCount(1) == 0) then
|
||
|
textOutput("The torches slot is empty. Are you sure you want to use torches ?", 1, 4, 0)
|
||
|
Torch_approval = convertToBool(securedInput(1, 6, "text", 0, 0, "Yes", "No"), "y")
|
||
|
elseif Torch_approval and (turtle.getItemCount(1) ~= 0) then
|
||
|
for u = 1, torches_slots-1 do
|
||
|
turtle.select(u+1)
|
||
|
if not(turtle.compareTo(1)) then
|
||
|
Torch_mismatch = true
|
||
|
end
|
||
|
end
|
||
|
if Torch_mismatch then
|
||
|
resetScreen()
|
||
|
textOutput("All the slots dedicated to the torches have not been set up correctly. Are you sure you want to use torches ?", 1, 4, 0)
|
||
|
Torch_approval = convertToBool(securedInput(1, 7, "text", 0, 0, "Yes", "No"), "y")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if Chest_approval and (turtle.getItemCount(torches_slots + fuel_slots + 1) == 0) then
|
||
|
resetScreen()
|
||
|
textOutput("The chests slot is empty. Are you sure you want to use chests ?", 1, 4, 0)
|
||
|
Chest_approval = convertToBool(securedInput(1, 6, "text", 0, 0, "Yes", "No"), "y")
|
||
|
elseif Chest_approval and (turtle.getItemCount(torches_slots + fuel_slots + 1) ~= 0) then
|
||
|
for u = 1, chests_slots-1 do
|
||
|
turtle.select(torches_slots + fuel_slots + u + 1)
|
||
|
if not(turtle.compareTo(torches_slots + fuel_slots + 1)) then
|
||
|
Chest_mismatch = true
|
||
|
end
|
||
|
end
|
||
|
if Chest_mismatch then
|
||
|
resetScreen()
|
||
|
textOutput("All the slots dedicated to the chests have not been set up correctly. Are you sure you want to use chests ?", 1, 4, 0)
|
||
|
Chest_approval = convertToBool(securedInput(1, 7, "text", 0, 0, "Yes", "No"), "y")
|
||
|
end
|
||
|
end
|
||
|
if Torch_approval then
|
||
|
empty_torches_slots = 0
|
||
|
for u = 1, torches_slots do
|
||
|
if turtle.getItemCount(u) == 0 then
|
||
|
empty_torches_slots = empty_torches_slots + 1
|
||
|
end
|
||
|
end
|
||
|
if empty_torches_slots == torches_slots then
|
||
|
shortage[1] = true
|
||
|
end
|
||
|
textOutput("No Torches -", 11, 11, 0)
|
||
|
end
|
||
|
if Torch_approval and (turtle.getItemCount(1) ~= 0) then
|
||
|
shortage[1] = false
|
||
|
textOutput("Torches OK -", 11, 11, 0)
|
||
|
end
|
||
|
if Chest_approval then
|
||
|
empty_chests_slots = 0
|
||
|
for u = 1, chests_slots do
|
||
|
if turtle.getItemCount(torches_slots + fuel_slots + u) == 0 then
|
||
|
empty_chests_slots = empty_chests_slots + 1
|
||
|
end
|
||
|
end
|
||
|
if empty_chests_slots == chests_slots then
|
||
|
shortage[3] = true
|
||
|
end
|
||
|
textOutput("No Chests -", 24, 11, 0)
|
||
|
end
|
||
|
if Chest_approval and (turtle.getItemCount(torches_slots + fuel_slots + 1) ~= 0) then
|
||
|
shortage[3] = false
|
||
|
textOutput("Chests OK -", 24, 11, 0)
|
||
|
end
|
||
|
textOutput("Fuel OK -", 1, 11, 0)
|
||
|
refuel_count = 80 - turtle.getFuelLevel()
|
||
|
FacingAngle, tunnel_forth, current_slot= 0, true, {1, 1, 1}
|
||
|
refuel_count = moveUp(true, 1, refuel_count, false)
|
||
|
if (Width == 1) then
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
end
|
||
|
for done_tunnels=1, tunnels_integer do
|
||
|
if (Width >= 2) then
|
||
|
for done_layers=1, math.ceil(Length/2) do
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 1)
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, Width, Height, "down", false, Bool_direction)
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 1)
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 1)
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, Width, Height, Height_Position, false, not(Bool_direction))
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 1)
|
||
|
if (done_layers%4 == 0) then
|
||
|
refuel_count = moveUp(false, 1, refuel_count, false)
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 1)
|
||
|
placeTorch("front")
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 1)
|
||
|
refuel_count = moveUp(true, 1, refuel_count, false)
|
||
|
end
|
||
|
end
|
||
|
elseif (Width == 1) then
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, 2*math.ceil(Length/2), Height, "down", true, Bool_direction)
|
||
|
end
|
||
|
if (Height_Position == "up") then
|
||
|
refuel_count = moveUp(false, (Height - 3), refuel_count, false)
|
||
|
Height_Position = "down"
|
||
|
end
|
||
|
if tunnel_forth and (tunnels_integer - done_tunnels >= 1) then
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 1)
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, ((2*Width)+tunnels_separation), Height, "down", false, not(Bool_direction))
|
||
|
if (Height_Position == "up") then
|
||
|
refuel_count = moveUp(false, (Height - 3), refuel_count, false)
|
||
|
Height_Position = "down"
|
||
|
end
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 1)
|
||
|
placeTorch("below")
|
||
|
elseif not(tunnel_forth) then
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, false, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 1)
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, ((2*Width)-1+tunnels_separation), Height, "down", false, Bool_direction)
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 1)
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 1)
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, ((2*Width)-1+tunnels_separation), Height, Height_Position, false, not(Bool_direction))
|
||
|
if (Height_Position == "up") then
|
||
|
refuel_count = moveUp(false, (Height - 3), refuel_count, false)
|
||
|
Height_Position = "down"
|
||
|
end
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 2)
|
||
|
refuel_count = moveForward(FacingAngle, true, (Width-2), true, true, refuel_count)
|
||
|
placeTorch("front")
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 2)
|
||
|
refuel_count = moveForward(FacingAngle, true, (Width-2), true, true, refuel_count)
|
||
|
if (tunnels_integer - done_tunnels ~= 0) then
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, (tunnels_separation+1), Height, Height_Position, false, Bool_direction)
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 1)
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 1)
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, (tunnels_separation+1), Height, Height_Position, false, not(Bool_direction))
|
||
|
refuel_count = moveForward(FacingAngle, false, tunnels_separation, true, true, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 1)
|
||
|
placeTorch("front")
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 2)
|
||
|
end
|
||
|
end
|
||
|
if tunnel_forth and (tunnels_integer - done_tunnels == 0) and (Width > 1) then
|
||
|
refuel_count = moveForward(FacingAngle, false, 2*math.ceil(Length/2), false, false, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 1)
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, false, false, refuel_count)
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, (Width - 1), Height, Height_Position, false, Bool_direction)
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 1)
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, false, false, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 1)
|
||
|
refuel_count, Height_Position = digVerticalLayer(refuel_count, FacingAngle, (Width - 1), Height, Height_Position, false, not(Bool_direction))
|
||
|
if (Height_Position == "up") then
|
||
|
refuel_count = moveUp(false, (Height - 3), refuel_count, false)
|
||
|
Height_Position = "down"
|
||
|
end
|
||
|
refuel_count = moveForward(FacingAngle, false, (Width - 2), false, false, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, Bool_direction, 2)
|
||
|
end
|
||
|
if (Width == 1) and (tunnels_integer - done_tunnels ~= 0) then
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, true, true, refuel_count)
|
||
|
elseif (Width == 1) and (tunnels_integer - done_tunnels == 0) and tunnel_forth then
|
||
|
refuel_count = moveForward(FacingAngle, false, (2*math.ceil(Length/2)), false, false, refuel_count)
|
||
|
end
|
||
|
tunnel_forth = not(tunnel_forth)
|
||
|
end
|
||
|
refuel_count = moveUp(false, 1, refuel_count, false)
|
||
|
if (Width == 1) and not(tunnel_forth) then
|
||
|
refuel_count = moveForward(FacingAngle, false, 1, false, false, refuel_count)
|
||
|
turn(FacingAngle, Bool_direction, 1)
|
||
|
end
|
||
|
refuel_count = moveForward(FacingAngle, false, ((tunnels_integer*Width) - 1 + (tunnels_separation*(tunnels_integer - 1))), false, false, refuel_count)
|
||
|
FacingAngle = turn(FacingAngle, not(Bool_direction), 1)
|
||
|
refuel_count = moveForward(FacingAngle, true, 1, false, false, refuel_count)
|
||
|
resetScreen()
|
||
|
write("Done. I hope I worked well !")
|
||
|
term.setCursorPos(1,8)
|