multimaze/main.lua

159 lines
3.9 KiB
Lua

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
}
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])
end
end
if #settings.extras > 0 then
settings.mode = table.remove(settings.extras, 1)
end
local new_width = calculations.normalise_dimension(settings.width, settings.path_length, settings.path_width)
print("[normalise] width "..settings.width..""..new_width)
settings.width = new_width
local new_height = calculations.normalise_dimension(settings.height, settings.path_length, settings.path_width)
print("[normalise] height "..settings.height..""..new_height)
settings.height = new_height
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
]])
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
)
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(
setting.seed,
settings.width,
settings.height,
settings.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()