This is a read-only snapshot of the ComputerCraft forums, taken in April 2020.
Cloxaau's profile picture

Code Explanation

Started by Cloxaau, 06 May 2013 - 06:18 PM
Cloxaau #1
Posted 06 May 2013 - 08:18 PM
[left]Sorry if I made you shriek because of the title, it's not as bad as it sounds. I'd just like for someone to give me a boost into the programming world by helping me understand the excavate program.

If, by chance, you cannot pull it out of your game files, I'll do it here:
Spoiler

local tArgs = { ... }
if #tArgs ~= 1 then
print( "Usage: excavate <diameter>" )
return
end
-- Mine in a quarry pattern until we hit something we can't dig
local size = tonumber( tArgs[1] )
if size < 1 then
print( "Excavate diameter must be positive" )
return
end

local depth = 0
local unloaded = 0
local collected = 0
local xPos,zPos = 0,0
local xDir,zDir = 0,1
local goTo -- Filled in further down
local refuel -- Filled in further down

local function unload( _bKeepOneFuelStack )
print( "Unloading items..." )
for n=1,16 do
  local nCount = turtle.getItemCount(n)
  if nCount > 0 then
   turtle.select(n)  
   local bDrop = true
   if _bKeepOneFuelStack and turtle.refuel(0) then
	bDrop = false
	_bKeepOneFuelStack = false
   end  
   if bDrop then
	turtle.drop()
	unloaded = unloaded + nCount
   end
  end
end
collected = 0
turtle.select(1)
end
local function returnSupplies()
local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
print( "Returning to surface..." )
goTo( 0,0,0,0,-1 )

local fuelNeeded = 2*(x+y+z) + 1
if not refuel( fuelNeeded ) then
  unload( true )
  print( "Waiting for fuel" )
  while not refuel( fuelNeeded ) do
   sleep(1)
  end
else
  unload( true )
end

print( "Resuming mining..." )
goTo( x,y,z,xd,zd )
end
local function collect()
local bFull = true
local nTotalItems = 0
for n=1,16 do
  local nCount = turtle.getItemCount(n)
  if nCount == 0 then
   bFull = false
  end
  nTotalItems = nTotalItems + nCount
end

if nTotalItems > collected then
  collected = nTotalItems
  if math.fmod(collected + unloaded, 50) == 0 then
   print( "Mined "..(collected + unloaded).." items." )
  end
end

if bFull then
  print( "No empty slots left." )
  return false
end
return true
end
function refuel( ammount )
local fuelLevel = turtle.getFuelLevel()
if fuelLevel == "unlimited" then
  return true
end

local needed = ammount or (xPos + zPos + depth + 1)
if turtle.getFuelLevel() < needed then
  local fueled = false
  for n=1,16 do
   if turtle.getItemCount(n) > 0 then
	turtle.select(n)
	if turtle.refuel(1) then
	 while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
	  turtle.refuel(1)
	 end
	 if turtle.getFuelLevel() >= needed then
	  turtle.select(1)
	  return true
	 end
	end
   end
  end
  turtle.select(1)
  return false
end

return true
end
local function tryForwards()
if not refuel() then
  print( "Not enough Fuel" )
  returnSupplies()
end

while not turtle.forward() do
  if turtle.detect() then
   if turtle.dig() then
	if not collect() then
	 returnSupplies()
	end
   else
	return false
   end
  elseif turtle.attack() then
   if not collect() then
	returnSupplies()
   end
  else
   sleep( 0.5 )
  end
end

xPos = xPos + xDir
zPos = zPos + zDir
return true
end
local function tryDown()
if not refuel() then
  print( "Not enough Fuel" )
  returnSupplies()
end

while not turtle.down() do
  if turtle.detectDown() then
   if turtle.digDown() then
	if not collect() then
	 returnSupplies()
	end
   else
	return false
   end
  elseif turtle.attackDown() then
   if not collect() then
	returnSupplies()
   end
  else
   sleep( 0.5 )
  end
end
depth = depth + 1
if math.fmod( depth, 10 ) == 0 then
  print( "Descended "..depth.." metres." )
end
return true
end
local function turnLeft()
turtle.turnLeft()
xDir, zDir = -zDir, xDir
end
local function turnRight()
turtle.turnRight()
xDir, zDir = zDir, -xDir
end
function goTo( x, y, z, xd, zd )
while depth > y do
  if turtle.up() then
   depth = depth - 1
  elseif turtle.digUp() or turtle.attackUp() then
   collect()
  else
   sleep( 0.5 )
  end
end
if xPos > x then
  while xDir ~= -1 do
   turnLeft()
  end
  while xPos > x do
   if turtle.forward() then
	xPos = xPos - 1
   elseif turtle.dig() or turtle.attack() then
	collect()
   else
	sleep( 0.5 )
   end
  end
elseif xPos < x then
  while xDir ~= 1 do
   turnLeft()
  end
  while xPos < x do
   if turtle.forward() then
	xPos = xPos + 1
   elseif turtle.dig() or turtle.attack() then
	collect()
   else
	sleep( 0.5 )
   end
  end
end

if zPos > z then
  while zDir ~= -1 do
   turnLeft()
  end
  while zPos > z do
   if turtle.forward() then
	zPos = zPos - 1
   elseif turtle.dig() or turtle.attack() then
	collect()
   else
	sleep( 0.5 )
   end
  end
elseif zPos < z then
  while zDir ~= 1 do
   turnLeft()
  end
  while zPos < z do
   if turtle.forward() then
	zPos = zPos + 1
   elseif turtle.dig() or turtle.attack() then
	collect()
   else
	sleep( 0.5 )
   end
  end
end

while depth < y do
  if turtle.down() then
   depth = depth + 1
  elseif turtle.digDown() or turtle.attackDown() then
   collect()
  else
   sleep( 0.5 )
  end
end

while zDir ~= zd or xDir ~= xd do
  turnLeft()
end
end
if not refuel() then
print( "Out of Fuel" )
return
end
print( "Excavating..." )
local reseal = false
turtle.select(1)
if turtle.digDown() then
reseal = true
end
local alternate = 0
local done = false
while not done do
for n=1,size do
  for m=1,size-1 do
   if not tryForwards() then
	done = true
	break
   end
  end
  if done then
   break
  end
  if n<size then
   if math.fmod(n + alternate,2) == 0 then
	turnLeft()
	if not tryForwards() then
	 done = true
	 break
	end
	turnLeft()
   else
	turnRight()
	if not tryForwards() then
	 done = true
	 break
	end
	turnRight()
   end
  end
end
if done then
  break
end

if size > 1 then
  if math.fmod(size,2) == 0 then
   turnRight()
  else
   if alternate == 0 then
	turnLeft()
   else
	turnRight()
   end
   alternate = 1 - alternate
  end
end

if not tryDown() then
  done = true
  break
end
end
print( "Returning to surface..." )
-- Return to where we started
goTo( 0,0,0,0,-1 )
unload( false )
goTo( 0,0,0,0,1 )
-- Seal the hole
if reseal then
turtle.placeDown()
end
print( "Mined "..(collected + unloaded).." items total." )
I'd like for someone (or several people) to explain each different part of it; explaining what it is (like a variable), what it does (giving a long or complex line of code a shorter alias) and, if possible, how it relates to Java (both have variables but different ways of creating them), among other things, like where else I can find it in the program.

I know it's a massive task to ask someone to do, but, I swear, you'd really be helping me out. I'm being sort of selfish by not trying to accomplish it on my own, but such an action would take me a really, really long time to complete by myself. By helping me out, you could start a chain reaction where I help others understand code.
Also, if I ever make a modification to a game or- God forbid- a game itself, I would put whoever does this in the credits.

You know what? I'd be grateful for someone just helping me understand a sizable chunk of the code (in proportion to the size of the program itself), rather than the whole thing.

Thanks in advance![/left]
Cloxaau #2
Posted 06 May 2013 - 08:25 PM
///// Agh, I have a horrible habit of reading the rules after doing things. Could someone move this?
Lyqyd #3
Posted 06 May 2013 - 08:28 PM
Moved to Ask a Pro.
Cloxaau #4
Posted 06 May 2013 - 08:34 PM
Moved to Ask a Pro.
Thank you!
Bubba #5
Posted 07 May 2013 - 02:19 PM
Yeah this is a pretty big undertaking and would be more suited for a full-blown tutorial than an AaP topic. I'm not sure why you would need it anyway considering all of the resources available to you between the Tutorial section, the wiki, and other Lua resources on the net (more specifically, the Lua PIL - check it out, it is the premier resource for Lua).

Not trying to sound mean, but I doubt that anyone is going to go through this entire program for you and explain it. Try starting with the simple stuff - find out what a variable is, and what different types are available to you. From there move on to functions, and then on to those things which are ComputerCraft specific (the wiki is an excellent resource for that).

As for how Lua relates to Java here, I doubt most would be able to tell you what's going on behind the hood of LuaJ, which is the Java implementation of a Lua interpreter used by ComputerCraft.
Cloxaau #6
Posted 07 May 2013 - 04:38 PM
Yeah this is a pretty big undertaking and would be more suited for a full-blown tutorial than an AaP topic. I'm not sure why you would need it anyway considering all of the resources available to you between the Tutorial section, the wiki, and other Lua resources on the net (more specifically, the Lua PIL - check it out, it is the premier resource for Lua).

Not trying to sound mean, but I doubt that anyone is going to go through this entire program for you and explain it. Try starting with the simple stuff - find out what a variable is, and what different types are available to you. From there move on to functions, and then on to those things which are ComputerCraft specific (the wiki is an excellent resource for that).

As for how Lua relates to Java here, I doubt most would be able to tell you what's going on behind the hood of LuaJ, which is the Java implementation of a Lua interpreter used by ComputerCraft.
Ah, fair enough.
Thanks!