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 ] [--height ] [--seed ] [--path-length ] [--path-width ] [--branching-factor ] --lua main.lua ]]..a.item("maze3d")..[[ [--width ] [--height ] [--depth ] [--seed ] [--path-length ] [--path-width ] [--path-depth ] [--branching-factor ] 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()