Confused on Steam Play and Proton? Be sure to check out our guide.
Developing my FOSS retro adventure game, FreeMazes3D
nate 24 Sep
The project started out as a random maze generator. For testing purposes, I typed it out in JavaScript as a simple browser script with a very primitive visual representation combined with large servings of console.logs to make sure that it both "looked right" and that the underlying data for the mazes were correctly logging to my browser console. At that point I still had not decided what to actually use this thing for.

During the coronavirus lockdowns last year, I had played around with a couple 3D engines (BabylonJS and Godot). I decided to go with using BabylonJS. JavaScript is, by far, the language that I've spent the most time playing around with. I also like how I can actually "type out" an entire game project using only my text editor (Atom) and the playground.babylonjs.com online testing tool.

I had already experimented with BabylonJS. So using my random maze generator's data to quickly create some actual 3D, retro-style mazes was very easy. After doing that, I needed to actually make these mazes into a game – something more than just walking through them, which is boring. I first decided to add some keys and doors to the mazes. I was now no longer just walking from a maze's start point to its end point.

However, I still wanted there to be something else to this. Just collecting keys and opening doors was not enough. I did not want the project to be just another retro FPS – I would have used GZDoom for that. So I decided to add puzzles – a core gameplay element in most 'adventure' type games (think Myst).

I then had to come up with a good way to place puzzles in this project. So I devised a way to drop the puzzles into rooms that would appear inside the mazes at certain points that, in order to progress further, you must solve a puzzle. After tinkering with this on the random maze generator, I began the much longer task of actually creating the game's puzzle content.

Now I am quick to point out that I always sucked at these kind of puzzle games and always bought the thick strategy guide books for them back in the 1990s. I am also a terrible 3D modeler, so none of this was going to look even slightly beautiful. Using the playground.babylonjs.com online tool, I created my own little workshop for cranking out this content. I made a generic empty room with a single 'force-field' style exit. Then I start playing around with it, typing out a little scene using simple 3D shapes, trying things out, playing around, testing, cussing, reading up on various parts of the BabylonJS API, until finally I have a working puzzle that removes the force-field. Then I just start copying and pasting the new puzzle's functions into the bigger game project itself.

I should pause a moment and point out that the game itself is played as a traditional desktop application, made with the Electron framework. I test as many subdivisions of the project's code as possible as simple browser scripts or using playground.babylonjs.com before bundling it all up and launching the actual game. That really helps save time and reduce swearing.

Anyway, I eventually got enough content this spring where I actually did an initial 'release.' But I only had four puzzles to offer, so the mazes seemed much too similar to each other. I've now done three more releases and have 16 different puzzles that can spawn. Finally, these random mazes are actually starting to seem like distinct little gameplay experiences. I also added treasure, secret areas, achievements, and time-limited maps to help make the gameplay more interesting. It finally, to me, feels like somewhat of a game.

As for game assets, I typed out all the 3D models you will see in this game using simple shapes from BabylonJS. For sound and music, I used material freely available for projects like this one from OpenGameArt.org. I have also provided a carefully documented credits for anyone else that wants to use the same sound/music material.

Regarding where to go next with the project, well, at this point I am looking to have more people try it out. I will also definitely be thinking of more puzzle ideas for any future releases. But at this point I could use some tester/player feedback. ;-)

For now, the game is only available on my github. If you want to try it out, a native Linux version can be downloaded and played right away (no installation necessary):

https://github.com/neytjs/FreeMazes3D/releases

BTW, I have included a "guide" txt file in the game download that should answer any simple questions you may have about gameplay. Also, try checking the key controls in game if something does not make sense. The game is not meant to be super hard, but casual friendly.
Quoting: nateThe project started out as a random maze generator. For testing purposes, I typed it out in JavaScript as a simple browser script with a very primitive visual representation combined with large servings of console.logs to make sure that it both "looked right" and that the underlying data for the mazes were correctly logging to my browser console. At that point I still had not decided what to actually use this thing for.

During the coronavirus lockdowns last year, I had played around with a couple 3D engines (BabylonJS and Godot). I decided to go with using BabylonJS. JavaScript is, by far, the language that I've spent the most time playing around with. I also like how I can actually "type out" an entire game project using only my text editor (Atom) and the playground.babylonjs.com online testing tool.

I had already experimented with BabylonJS. So using my random maze generator's data to quickly create some actual 3D, retro-style mazes was very easy. After doing that, I needed to actually make these mazes into a game – something more than just walking through them, which is boring. I first decided to add some keys and doors to the mazes. I was now no longer just walking from a maze's start point to its end point.

However, I still wanted there to be something else to this. Just collecting keys and opening doors was not enough. I did not want the project to be just another retro FPS – I would have used GZDoom for that. So I decided to add puzzles – a core gameplay element in most 'adventure' type games (think Myst).

I then had to come up with a good way to place puzzles in this project. So I devised a way to drop the puzzles into rooms that would appear inside the mazes at certain points that, in order to progress further, you must solve a puzzle. After tinkering with this on the random maze generator, I began the much longer task of actually creating the game's puzzle content.

Now I am quick to point out that I always sucked at these kind of puzzle games and always bought the thick strategy guide books for them back in the 1990s. I am also a terrible 3D modeler, so none of this was going to look even slightly beautiful. Using the playground.babylonjs.com online tool, I created my own little workshop for cranking out this content. I made a generic empty room with a single 'force-field' style exit. Then I start playing around with it, typing out a little scene using simple 3D shapes, trying things out, playing around, testing, cussing, reading up on various parts of the BabylonJS API, until finally I have a working puzzle that removes the force-field. Then I just start copying and pasting the new puzzle's functions into the bigger game project itself.

I should pause a moment and point out that the game itself is played as a traditional desktop application, made with the Electron framework. I test as many subdivisions of the project's code as possible as simple browser scripts or using playground.babylonjs.com before bundling it all up and launching the actual game. That really helps save time and reduce swearing.

Anyway, I eventually got enough content this spring where I actually did an initial 'release.' But I only had four puzzles to offer, so the mazes seemed much too similar to each other. I've now done three more releases and have 16 different puzzles that can spawn. Finally, these random mazes are actually starting to seem like distinct little gameplay experiences. I also added treasure, secret areas, achievements, and time-limited maps to help make the gameplay more interesting. It finally, to me, feels like somewhat of a game.

As for game assets, I typed out all the 3D models you will see in this game using simple shapes from BabylonJS. For sound and music, I used material freely available for projects like this one from OpenGameArt.org. I have also provided a carefully documented credits for anyone else that wants to use the same sound/music material.

Regarding where to go next with the project, well, at this point I am looking to have more people try it out. I will also definitely be thinking of more puzzle ideas for any future releases. But at this point I could use some tester/player feedback. ;-)

For now, the game is only available on my github. If you want to try it out, a native Linux version can be downloaded and played right away (no installation necessary):

https://github.com/neytjs/FreeMazes3D/releases

BTW, I have included a "guide" txt file in the game download that should answer any simple questions you may have about gameplay. Also, try checking the key controls in game if something does not make sense. The game is not meant to be super hard, but casual friendly.

I'll try to give it a go when I can. I'll aslo see if I can spread the news around a bit. Thanks for making your game FOSS !
nate 25 Sep
Quoting: PublicNuisanceI'll try to give it a go when I can. I'll aslo see if I can spread the news around a bit. Thanks for making your game FOSS !

Thanks, I hope you like trying it out. I wanted to make it FOSS from the start. I have had a lot of fun trying out other people's FOSS games and free mods over the years, so I wanted to make my own minor contribution.

Last edited by nate on 25 September 2021 at 4:33 am UTC
Julius 25 Sep
Join us on FreeGameDev.net https://freegamedev.net/d/84-freemazes3d

(we are a community of open-source game developers and players)
nate 26 Sep
Quoting: JuliusJoin us on FreeGameDev.net https://freegamedev.net/d/84-freemazes3d

(we are a community of open-source game developers and players)
Thanks for the link, I'll check it out.
slembcke 3 days ago
It definitely has a nice classic maze puzzler feel to it. :) I finished a couple mazes over lunch.

Feedback:
* The mouse input has way too much smoothing. Make it feel really drunk/mushy.
* The game looses mouse focus if you switch away from it.
* Is it possible to use keyboard scancodes with Electron? This is super awkward to play on a non-qwerty keyboard.
* The solid color walls are very bland. A little shading, or at least outlines would give them a lot of extra depth.
nate 2 days ago
Quoting: slembckeIt definitely has a nice classic maze puzzler feel to it. :) I finished a couple mazes over lunch.

Feedback:
* The mouse input has way too much smoothing. Make it feel really drunk/mushy.
* The game looses mouse focus if you switch away from it.
* Is it possible to use keyboard scancodes with Electron? This is super awkward to play on a non-qwerty keyboard.
* The solid color walls are very bland. A little shading, or at least outlines would give them a lot of extra depth.
Glad you liked trying it! Thanks for the feedback. I will take this into account for future releases. I already found a fix for the ALT-TABing issue (it's just not on my github yet though).

BTW, what type of non-Qwerty keyboard do you use? I will look into adding support for this.
slembcke about 8 hours ago
Quoting: nateBTW, what type of non-Qwerty keyboard do you use? I will look into adding support for this.

I was being vague on purpose... hehe (sigh, mild rant incoming) People usually have an immediate reaction and tell me all their opinions based on an article they read once about keyboard myths when I tell them I use Dvorak. -_- I used to have terrible, and consistent wrist pain if typing for too long, and Dvorak fixed that immediately. Any other reason, myth based or otherwise is utterly unimportant to me. (end of rant)

Anyway, I'm pretty accustomed to switching layouts regularly for games. It's fine, just a mild annoyance. I've seen azerty (french keyboard layout) users mention it before too.

Many libraries (ex: SDL) use keyboard scancodes. USB keyboards actually all send the same code for keys located at the same physical positions, so regardless of the selected keyboard layout or labels printed on the keys. So what you think of as being WASD always send the same codes. I assume the reason for this is so any keyboard can trivially be compatible with any layout. If you can do use scancodes in Electron, it's generally going to be your best option, but it's not always supported. There has been an open feature request for Unity to do this for more than a decade now for example...

However, if all you need is WASD + a couple action keys there is an even easier solution. Just map multiple keys! It just so happens that there aren't conflicting keys for the most popular layouts so you can map all of them at the same time and the player probably won't notice. Worst case scenario they notice there are other keys that make them move for some reason. ;)

'WASD' on Dvorak is ',AOU' (that's a comma)
'WASD' on Azerty is 'ZQSD'

Last edited by slembcke on 25 October 2021 at 10:10 pm UTC
While you're here, please consider supporting GamingOnLinux on:

Patreon, Liberapay or PayPal Donation.

This ensures all of our main content remains totally free for everyone with no article paywalls. We also don't have tons of adverts, there's also no tracking and we respect your privacy. Just good, fresh content. Without your continued support, we simply could not continue!

You can find even more ways to support us on this dedicated page any time. If you already are, thank you!
Login / Register

Or login with...
Sign in with Steam Sign in with Twitter Sign in with Google
Social logins require cookies to stay logged in.

Livestreams & Videos
Community Livestreams
Latest Forum Posts