multimaze/main.lua

245 lines
7.2 KiB
Lua

local a = require("./utils/ansi")
local strings = require("./utils/strings")
local debug = require("./utils/print_r")
local calculations = require("./utils/calculations")
local maze2d = require("./maze")
local maze3d = require("./maze3d")
local openscad = require("./openscad")
-- ANSI escape sequence helpers
function a.header(str) return a.fblue(a.hicol(str)) end
function a.item(str) return a.fyellow(str) end
function a.value(str) return a.fgreen(str) end
local settings = {
mode = "help",
extras = {},
width = 11,
height = 11,
depth = 7,
branching_factor = nil, -- Depends on the mode - nil will cause the engine to pick the default mode instead
seed = os.time(),
-- TODO: Add branching factor setting here & associated CLI argument
filename = nil,
scale = 5,
inverted = true,
colour = "#6495ED", -- Cornflower blue :D (if you get the reference, get in touch for a virtual cookie :D)
path_length = 2,
path_width = 1,
path_depth = 1
}
local function help()
--lua main.lua ]]..a.item("maze")..[[ [--width <int:11>] [--height <int:11>] [--seed <string>] [--path-length <int:2>] [--path-width <int:1>] [--branching-factor <int:6>]
--lua main.lua ]]..a.item("maze3d")..[[ [--width <int:11>] [--height <int:11>] [--depth <int:7>] [--seed <string>] [--path-length <int:2>] [--path-width <int:1>] [--path-depth <int:1>] [--branching-factor <int:6>]
print([[
]]..a.fgreen(a.hicol("multimaze: "))..a.fyellow(a.hicol("Multidimensional maze generator"))..[[
]]..a.locol("By Starbeamrainbowlabs")..[[
]]..a.header("Usage:")..[[
lua main.lua ]]..a.item("{mode} [{options}]")..[[
]]..a.header("Modes:")..[[
]]..a.item("help")..[[ Displays this message
]]..a.item("maze")..[[ Generates a 2d maze
]]..a.item("maze_svg")..[[ Generates a 2d maze as an SVG file
]]..a.item("maze3d")..[[ Generates a 3d maze
]]..a.item("maze3d_openscad")..[[ Generates a 3d maze as an openscad file
]]..a.header("Options:")..[[
]]..a.item("--help")..[[ Shows this message
]]..a.item("-w --width")..a.value(" {int}")..[[ Sets the width of the maze
]]..a.item("-h --height")..a.value(" {int}")..[[ Sets the height of the maze
]]..a.item("-d --depth")..a.value(" {int}")..[[ Sets the depth of the maze ]]..a.locol("[3d only]")..[[
]]..a.item("-s --seed")..a.value(" {string}")..[[ Sets the seed
]]..a.item("-f --filename")..a.value(" {string}")..[[ Sets the output filename
]]..a.item("--toggle-invert")..[[ Toggle inversion of the output ]]..a.locol("[maze_svg, maze3d_openscad only]")..[[
]]..a.item("-m --scale")..a.value(" {int}")..[[ Sets the scale of the output ]]..a.locol("[maze_svg, openscad output only]")..[[
]]..a.item("-l --path-length")..a.value(" {int}")..[[ Sets the path length
]]..a.item("-y --path-width")..a.value(" {int}")..[[ Sets the path width
]]..a.item("-z --path-depth")..a.value(" {int}")..[[ Sets the path depth ]]..a.locol("[3d only]")..[[
]]..a.item("-b --branching-factor")..a.value(" {int}")..[[Sets the path branching factor (higher = fewer branching paths, default: 6 for 2D, 3 for 3D)
]]..a.item("--colour")..a.value(" {string}")..[[ Sets the colour ]]..a.locol("[maze_svg only]")..[[
]]..a.header("Environment Variables:")..[[
]]..a.item("NO_COLOR")..[[ Disable ANSI escape sequences (aka coloured output)
]])
end
for i=1,#arg do
if not strings.starts_with(arg[i], "-") then
table.insert(settings.extras, arg[i])
elseif arg[i] == "--help" then
help()
os.exit()
elseif arg[i] == "--width" or arg[i] == "-w" then
i = i + 1
settings.width = tonumber(arg[i])
elseif arg[i] == "--height" or arg[i] == "-h" then
i = i + 1
settings.height = tonumber(arg[i])
elseif arg[i] == "--depth" or arg[i] == "-d" then
i = i + 1
settings.depth = tonumber(arg[i])
elseif arg[i] == "--branching-factor" or arg[i] == "-b" then
i = i + 1
settings.branching_factor = tonumber(arg[i])
elseif arg[i] == "--seed" or arg[i] == "-s" then
i = i + 1
settings.seed = strings.makeseed(arg[i])
elseif arg[i] == "--filename" or arg[i] == "-f" then
i = i + 1
settings.filename = arg[i]
elseif arg[i] == "--colour" then
i = i + 1
settings.colour = arg[i]
elseif arg[i] == "--scale" or arg[i] == "-m" then
i = i + 1
settings.scale = tonumber(arg[i])
elseif arg[i] == "--toggle-invert" then
settings.inverted = false
elseif arg[i] == "--path-length" or arg[i] == "-l" then
i = i + 1
settings.path_length = tonumber(arg[i])
elseif arg[i] == "--path-width" or arg[i] == "-y" then
i = i + 1
settings.path_width = tonumber(arg[i])
elseif arg[i] == "--path-depth" or arg[i] == "-z" then
i = i + 1
settings.path_depth = tonumber(arg[i])
end
end
if #settings.extras > 0 then
settings.mode = table.remove(settings.extras, 1)
end
-------------------------------------------------------------------------------
local function maze_text()
local world, time = maze2d.generate_maze(
settings.seed,
settings.width,
settings.height,
settings.path_length,
settings.path_width,
settings.branching_factor
)
maze2d.printspace(world, settings.width, settings.height)
print("Generation completed in " .. time .. "ms with seed "..settings.seed..".")
end
local function maze_svg()
local world, time = maze2d.generate_maze(
settings.seed,
settings.width,
settings.height,
settings.path_length,
settings.path_width,
settings.branching_factor
)
local svg_settings = {
scale = settings.scale,
colour = settings.colour,
inverted = settings.inverted
}
local svg = maze2d.make_svg(world, settings.width, settings.height, svg_settings)
if not settings.filename then
print(svg)
else
local out = io.open(settings.filename, "w")
out:write(svg)
out:close()
print("Generation completed in "..time.."ms with seed "..settings.seed..".")
end
end
local function maze3d_text()
local world, time = maze3d.generate_maze(
settings.seed,
settings.width,
settings.height,
settings.depth,
settings.path_length,
settings.path_width,
settings.path_depth,
settings.branching_factor
)
maze3d.printspace(world, settings.width, settings.height, settings.depth)
print("Generation completed in " .. time .. "ms with seed "..settings.seed..".")
end
local function maze3d_openscad()
local world, time = maze3d.generate_maze(
settings.seed,
settings.width,
settings.height,
settings.depth,
settings.path_length,
settings.path_width,
settings.path_depth,
settings.branching_factor
)
if not settings.filename then
print(a.fred(a.hicol("Error: No output filename specified.")))
return false
end
local openscad_settings = {
scale = settings.scale,
inverted = settings.inverted
}
openscad.write3d(
world,
settings.width, settings.height, settings.depth,
settings.filename,
openscad_settings
)
print("Maze written to "..a.fgreen(a.hicol(settings.filename)))
end
local mode_functions = {
["help"] = help,
["maze"] = maze_text,
["maze_svg"] = maze_svg,
["maze3d"] = maze3d_text,
["maze3d_openscad"] = maze3d_openscad
}
local selection = mode_functions[settings.mode]
if not selection then
print(a.fred(a.hicol("Error: Unrecognised mode '"..a.FBLE..settings.mode..a.FRED.."'")))
print()
selection = mode_functions["help"]
end
selection()