I’ve been working for the last 9 months on a new point&click adventure game. Actually, the work started already on 2016 when I spent a couple of months writing the script and designing the puzzles. However, creation of assets and code happened in 2017, and still continues.
I plan to write a couple of in-depth articles explaining the workflow to create assets and the core design of the engine (which I created myself). However, I want to share a couple of high level decisions I took during development and turned out to work quite well for me:
I used Blender for the graphics. The game is 2D, like the old-school point&click titles, however, I pre-render backgrounds and sprites from Blender. I would love to use pixel art instead, but that’s much harder, and I’m unable to do pixel art. However, I managed to get quite comfortable with Blender over the years, and I already created another game using this software (Egg Savior), although the genre is really different.
I use a really simple and clean style for all the shapes, mainly because I don’t have the time it would take to tackle lots of detail, but I render with cycles to get nice gradients and realistic lighting, which looks quite good.
For audio, I have to admit I’m a total noob, however, I got lots of feedback that audio was missing when I shared an alpha version with friends. I went to Freesound and edited a bunch of samples with Audacity.
The game runs directly in the browser (using HTML5/Canvas).
As I mentioned, I created my own engine. The reason is simple: writing game engines is the one thing I enjoy the most, and creating a game using an engine written by someone else would take away most the fun for me. I coded everything using Typescript, because I also love strongly typed languages.
After running the typescript compiler, I also run the closure compiler. That optimizes the code significantly, to the point that the game changes from being unplayable to running smoothly on old phones.
For state management, I considered a few options, and ended using Redux. I use it in a slightly non-conventional way, but I still get many of its benefits:
- I get savegames almost for free, because all the state is always in a pure JSON tree.
- I don’t have to think about which things to update first and which ones later. On every frame, the new state is created fresh from the state on the previous frame and whichever actions were performed. No state mutations ever happen. In fact, since I use typescript, I mark all the state as read-only.
- I can create a full graph of all the possible states of the game, and run graph algorithms to figure out if the player can ever get stuck, and what’s the shortest path from beginning to end, to see if there is a possible shortcut that I didn’t intend. I can, but it is really expensive to compute, so I stopped doing that once the logic got complex enough to produce millions of states.
The game is currently in Beta. I’m collecting feedback before the final launch. You can play it here. Once the beta finishes and I fix all the remaining things, it will be hosted on itch.io. I’ll post again once it is fully launched.
If you play the beta, please leave a comment letting me know what you think.