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") local settings = { mode = "help", extras = {}, width = 11, height = 11, depth = 7, seed = os.time(), filename = "maze.scad", scale = 5, inverted = true, path_length = 2, path_width = 1, path_depth = 1 } for i=1,#arg do if not strings.starts_with(arg[i], "-") then table.insert(settings.extras, arg[i]) 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] == "--seed" or arg[i] == "-s" then i = i + 1 settings.seed = tonumber(arg[i]) elseif arg[i] == "--filename" or arg[i] == "-f" then i = i + 1 settings.filename = arg[i] elseif arg[i] == "--scale" then i = i + 1 settings.scale = tonumber(arg[i]) elseif arg[i] == "--no-invert" then settings.inverted = false elseif arg[i] == "--path-length" then i = i + 1 settings.path_length = tonumber(arg[i]) elseif arg[i] == "--path-width" then i = i + 1 settings.path_width = tonumber(arg[i]) elseif arg[i] == "--path-depth" 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 help() print([[ multimaze: Multidimensional maze generator By Starbeamrainbowlabs Usage: lua main.lua {mode} [{options}] Modes: help Displays this message maze Generates a 2d maze maze3d Generates a 3d maze maze3d_openscad Generates a 3d maze as an openscad file Options: -w --width {int} Sets the width of the maze -h --height {int} Sets the height of the maze -d --depth {int} Sets the depth of the maze [3d only] -s --seed {string} Sets the seed -f --filename {string} Sets the output filename --no-invert Don't invert the output [openscad output only] --scale {int} Sets the scale of the output [openscad output only] --path-length {int} Sets the path length --path-width {int} Sets the path width --path-depth {int} Sets the path depth [3d only] ]]) end local function maze_text() local world, time = maze2d.generate_maze( settings.seed, settings.width, settings.height, settings.path_length, settings.path_width ) maze2d.printspace(world, settings.width, settings.height) print("Generation completed in " .. time .. "ms.") 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 ) maze3d.printspace(world, settings.width, settings.height, settings.depth) print("Generation completed in " .. time .. "ms.") 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 ) 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 "..settings.filename) end local mode_functions = { ["help"] = help, ["maze"] = maze_text, ["maze3d"] = maze3d_text, ["maze3d_openscad"] = maze3d_openscad } local selection = mode_functions[settings.mode] if not selection then print("Error: Unrecognised mode '"..settings.mode.."'") selection = mode_functions["help"] end selection()