diff options
| -rw-r--r-- | cactus.lua | 33 | 
1 files changed, 23 insertions, 10 deletions
@@ -37,6 +37,7 @@ local function moveby_y(delta)  	local fn = turtle.up  	if delta < 0 then fn = turtle.down  delta = -delta  end  	for i=1,delta do fn() end +	POS.y = POS.y + delta  end  local function rotatev(v,nq) @@ -60,21 +61,33 @@ end  local function turn_to_face(newfacing)  	if newfacing == FACING then return -	elseif newfacing == -FACING then turtle.turnRight() turtle.turnRight() -	elseif newfacing == rotatev(FACING,1) then turtle.turnRight() -	elseif newfacing == rotatev(FACING,-1) then turtle.turnLeft() +	elseif newfacing == -FACING then turn_right() turn_right() +	elseif newfacing == rotatev(FACING,1) then turn_right() +	elseif newfacing == rotatev(FACING,-1) then turn_left()  	else error("invalid facing "..tostring(newfacing),2)  	end  end +local function move_linear(n) +	local dir = turtle.forward +	if n < 0 then dir = turtle.back end +	for i = 1,math.abs(n) do dir() end +	POS = POS + n*FACING +end +  local function moveby_xz(dv) -	if dv.x ~= 0 then -		turn_to_face(vector.new(numutil.sign(dv.x), 0, 0)) -		for i=1,math.abs(dv.x) do turtle.forward() end -	end -	if dv.z ~= 0 then -		turn_to_face(vector.new(0, 0, numutil.sign(dv.z))) -		for i=1,math.abs(dv.z) do turtle.forward() end +	if FACING.x ~= 0 then +		move_linear(dv.x) +		if dv.z ~= 0 then +			turn_to_face(0,0,numutil.sign(dv.z)) +			move_linear(math.abs(dv.z)) +		end +	elseif FACING.z ~= 0 then +		move_linear(dv.z) +		if dv.x ~= 0 then +			turn_to_face(numutil.sign(dv.x),0,0) +			move_linear(math.abs(dv.x)) +		end  	end  end  | 
