The first Devastro game had been released in Russia, fully localized. I thought it should be easy to localize the new game as well.
I added support for localization of all texts, including menu items and cutscene dialogs. Texts that had previously been hardcoded are now extracted into an external, easily editable text file and language can be switched at runtime.
Based on the environment moodboards, I created the first batch of models for the farm/countryside environment.
I then wasted an entire evening trying to properly import them into the game. My Blender render script was broken and it took me a while to figure out what was wrong.
Now that I have the assets available in the level editor, I’m going to try them out and adjust the scale for each model. I can do this interactively by resizing the sprites directly in-game. When the scale is dialed in I’ll adjust the model size in Blender and do a new render.
I’m also going to extend the render script in a similar way the character animation export works – render multiple angles to add variety and let me reuse models more often.
Devastro 2 is going to be a twin stick shooter, so I thought it would be appropriate to add support for game controllers.
I purchased the XBox One Wireless controller for testing. Also ordered the Steam Controller while it was on sale for $5, even though it has zero sticks.
My first implementation used the native game controller API built into macOS but later I switched to the SDL interface. The only major difference is that SDL doesn’t handle dead zones and gives raw readings. It wasn’t too hard to take care of that.
Controlling my game character using the gamepad works really well. I will tweak the button mapping (weapon switch, dash) after some more playtesting.
Menu navigation was a little tricky. All menu items are now linked with next / previous pointers to support DPAD navigation. I’m going to add left / right links as well to better support more complex menus, such as level selection.
Boxes, boxes everywhere. The only shape a game object could have was a box. Looking at some of the buildings and objects I’m going to be putting into the game, I thought it would be good to add support for arbitrary polygon shapes. With Box2D it should be easy, right?
First thing I had to do was refactor the way objects are added into the Box2D world. This was also a good opportunity to finally change the player and enemy shapes to circles. Sneaking around corners just got a lot smoother.
Second, I had to actually get some shapes. But how? Use the Blender models and generate the shapes by making cross-cuts? While technically an elegant solution, such a tight fit might not be ideal for gameplay.
So I made a shape editor. Each object gets a box by default. Click and drag on any edge to add a new vertex. Right click to remove a vertex. Vertices snap to a grid, holding CTRL turns snapping off for extra precision when needed.
It is time to start building the environments. I’ve been collecting lots of inspiration all over the web. I had folders with hundreds of images that I found interesting and wanted to keep as inspiration for the game.
Last week I sorted through it all and selected what’s going to become my template for making actual game art.
I was hesitant to invest time into this at first, given that none of the images will go into the game. It’s just stuff for inspiration, right? After a while though, the overall tone started getting under my skin and looking at the result, I felt very inspired and motivated.
Here’s a moodboard for the first environment. It is based on US rural areas of the 50s and 60s.
I’m going to use it to make a list of models to create, do a first pass of blocking out the rough shapes and add them to the game for testing. Next step is to dial in the color palette and fill in the details and textures.
New debug feature added to the game: recording inputs during gameplay and playing them back later.
This helps me reproduce a given scenario with a single button press. I can also do a Quake-style “timedemo” recording and use it as a performance benchmark.
To make replay work properly, I had to set a constant seed in my random number generator and make sure all entities were using it. The storage format is not optimal. Recording a long session would probably use more disk space than necessary. But we’re still talking a few kilobytes per minute, so it’s fine.