commit
f53bbf0684
@ -0,0 +1,123 @@
|
||||
local robot = require('robot')
|
||||
local sides = require('sides')
|
||||
local nav = require('nav')
|
||||
local io = require('io')
|
||||
|
||||
local filename, mode = ...
|
||||
|
||||
if not filename or not mode then
|
||||
print('Usage: build <filename> <corner|center>')
|
||||
print('Top of the blueprint file will be where the robot is facing')
|
||||
return 1
|
||||
end
|
||||
|
||||
|
||||
---Read file line by line and split lines to characters and parse numbers
|
||||
---@param f file*
|
||||
---@return table grid
|
||||
local function parse_file(f)
|
||||
local grid = {}
|
||||
|
||||
local line = f:read("*l")
|
||||
|
||||
while line do
|
||||
local index = 1
|
||||
local row = {}
|
||||
for c in string.gmatch(line, ".") do
|
||||
if c ~= '.' and c ~= ' ' then
|
||||
local n = tonumber(c)
|
||||
if n then
|
||||
row[index] = n
|
||||
else
|
||||
row[index] = 0
|
||||
end
|
||||
else
|
||||
row[index] = 0
|
||||
end
|
||||
|
||||
index = index + 1
|
||||
end
|
||||
|
||||
grid[#grid + 1] = row
|
||||
|
||||
line = f:read("*l")
|
||||
end
|
||||
|
||||
return grid
|
||||
end
|
||||
|
||||
---Move the robot from the center of the grid to the top left corner
|
||||
---Begins facing "up" and ends facing "up"
|
||||
---@param grid table 2d array
|
||||
local function move_to_corner(grid)
|
||||
local x = math.floor(#grid / 2)
|
||||
nav.forward(x)
|
||||
robot.turnLeft()
|
||||
local z = math.floor(#(grid[1]) / 2)
|
||||
nav.forward(z)
|
||||
robot.turnRight()
|
||||
end
|
||||
|
||||
---Move the robot from the bottom left corner of the grid to the center
|
||||
---Begins facing "up" and ends facing "up"
|
||||
---@param grid table 2d array
|
||||
local function move_back_to_center(grid)
|
||||
local x = math.floor(#grid / 2)
|
||||
nav.forward(x)
|
||||
robot.turnRight()
|
||||
local z = math.floor(#(grid[1]) / 2)
|
||||
nav.forward(z)
|
||||
robot.turnLeft()
|
||||
end
|
||||
|
||||
---Move the robot from the bottom left corner of the grid to the center
|
||||
---Begins facing "up" and ends facing "up"
|
||||
---@param grid table 2d array
|
||||
local function move_back_to_top_corner(grid)
|
||||
nav.forward(#grid - 1)
|
||||
end
|
||||
|
||||
---Build the blueprint
|
||||
---Robot begins facing up
|
||||
---@param grid table 2d array
|
||||
local function build(grid)
|
||||
robot.turnRight()
|
||||
for _, row in ipairs(grid) do
|
||||
for _, block in ipairs(row) do
|
||||
if block ~= 0 then
|
||||
robot.select(block)
|
||||
robot.placeDown(sides.down)
|
||||
end
|
||||
nav.forward(1)
|
||||
end
|
||||
robot.turnRight()
|
||||
nav.forward(1)
|
||||
robot.turnRight()
|
||||
nav.forward(#row)
|
||||
robot.turnAround()
|
||||
end
|
||||
robot.turnLeft()
|
||||
nav.forward()
|
||||
end
|
||||
|
||||
|
||||
local file = io.open(filename, 'r')
|
||||
|
||||
if not file then
|
||||
print('File not found')
|
||||
return 2
|
||||
end
|
||||
|
||||
local grid = parse_file(file)
|
||||
|
||||
if mode == 'center' then
|
||||
move_to_corner(grid)
|
||||
end
|
||||
|
||||
build(grid)
|
||||
|
||||
if mode == 'center' then
|
||||
move_back_to_center(grid)
|
||||
else
|
||||
move_back_to_top_corner(grid)
|
||||
end
|
Loading…
Reference in new issue