Labyrinth is a very short game, with really only two core files:
- init.lua
returns a single function called GenMaze (init.lua name)
- maze.lua
game formspecs, global style registration function, win functions, map cleanup
The 5 styles that come with the game are in the styles/
folder, and provide examples for how to generate your own mazes using the API.
maze.lua implements my own version of Wilson's algorithm. This maze generation algorithm is randomly slow (statistically impossible, but it could run indefinitely), but generates truly random mazes that always have a solution, hence my selection of it.
This file purely defines the core GenMaze() function provided to init.lua. This cannot be overwritten, but should you want to use your own map generation algorithm, you can provide one when you register your style
Here's everything init.lua does:
- override the player look and hand
- Registers an invisible block for the player to land on when they win a maze or are in the main menu
- Defines the global style registration function
laby_register_style
- Loads the 5 default
styles/files.lua
- defines a player setup function that calls
GenMaze()
, and sets thecleanup()
function for the selected style, then fades the music appropriately - Defines the
main_menu()
formspec (not overridable) - Defines the
pause_menu()
formspec (technically overridable as it's the player_inventory formspec, which is only set in the on_join_player at startup) - Defines the
OnReceiveFields()
to handle the two formspecs - Defines a
safe_clear()
function for cleaning up any old map data when the game is first loaded from the Minetest main menu - Registers an
on_joinplayer
to call the normal menu formspec and other housekeeping - Registers a globalstep that allows the player to win when they reach any height below -10. (which calls cleanup, and shows the normal menu)
That's it, thats the entire game functionality. Now, lets talk about actually registering your own style, which is probably why you are here:
There is a single global function provided by this game: laby_register_style
, which takes five parameters:
- name the name of your style
- music_name: music file name
- map_from_maze => function(maze, player)
- maze is a table generated from GenMaze()
- player is the player_ref to allow you to place them at the start of the maze
- cleanup => function(maze_w, maze_h) you must provide a function to cleanup the map, maze_w and maze_h are provided from the main menu selection screen
- genMaze is an optional arguement to provide your own algorithm for this style to generate maps with instead of the default GenMaze. See maze.lua for example
It will return a table like below:
{
["width"] = gwidth --global based on main menu values rounded up to the nearest odd number, see init.lua
["height"] = gheight
[1] = {0,1,0,1,0},
[2] = {0,1,0,1,0},
[3] = {0,1,0,1,0},
[n] = {0,1,0,1,0},
}
---Where 1's are for path and 0's for walls.
Note that my GenMaze function can only handle odd numbered sizes. I'm sure you'll notice that if you attempt different small custom sizes. Feel free to fix it for me ;) and make a PR.
To see how maps are generated and cleaned up, use styles/glass.lua
as an example, it is the simplest and has a lot of comments to explain the process