Splodey Boats 2000 - Post Mortem

Splodey Boats 2000 was my entry into the 2021 Finally Finish Something jam. It's an update to a game I made for Ludum Dare #29 (way back in 2014) that adds new features and content.

Development Statistics

Source Files 123
Lines of Code 6,092
Entity components 27
Entity systems 42
Development Time 30:54

The last two weeks saw the most development time, but I paced things pretty well this time. The last day was spent packaging things up and writing documentation, rather than fixing bugs and panicking about missing features. That made a nice change.

What went right

It got done

The last game I released was back in March 2017, and even that was a half-hearted update to a flash game created in a couple of hours. Since then I've had a few tries but all have failed, so I was a little apprehensive about trying to release something this time.

Feature-wise I'm extremely happy with how things turned out. I would still like to add a fullscreen mode and an online score table, but everything else I wanted is in the game.

It got polished

Getting the core gameplay working early meant I could spend more time cleaning up the rough edges. Adding a title screen animation didn't make the game better, but I think it improved the experience and made it feel complete.

There are other little improvements like animated plants on the ocean floor, homing missiles from powerups, and a full morning-day-night cycle of backgrounds.

Entity component systems are really useful

Years ago I built an ECS for my game engine and it has been a huge time saver. Being able to modify the behaviour of a game entity by adding and removing components works really well, and keeping the actual behaviour code in systems makes it easier for me to organize things.

Data-driven entities are really useful too

At the start of the project a lot of data was hard-coded, but I slowly moved things to be loaded from template files. This had a couple of benefits:

  • It was much easier to test out new ideas - I could modify how may explosions come from a depth charge, how often submarines fire missiles, how fast the ship moves, and a whole bunch of other things, all without recompiling.
  • The template system uses inheritance - I created a base type of submarine that all others extend, so adding a new type of submarine could be done in a couple of minutes.
  • Balancing the game took much less time. I was able to tweak individual levels and play the results within seconds.

Getting rapid feedback makes balancing much easier, and it also encourages experimentation with gameplay elements. I'm much more likely to test an idea if I can create it, test it, and then remove it within a span of 5 minutes

What went wrong

Early decisions came back to bite me

A few days into development I noticed some weird behaviour with powerup crates; they were being spawned correctly, but the second crate that dropped would wobble erratically. Picking up one of these wobbly crates would grant two or more powerups, and they would explode multiple times.

After some digging I found the problem. It was a pretty fundamental one.

The ECS system I built stored system associations in a 32 bit variable. This made it extremely fast to check if an entity had a component as it could be done with a single bitwise check.

However, once system 33 was added the bit wrapped back to its initial position and things got weird. The powerup crate handler was system 33.

Fixing this bug took a couple of days and involved a rewrite of some pretty fundamental code.

When I wrote things originally I took an "I'll cross that bridge when I get to it". Well I got to that bridge and had to cross it, so thanks for nothing past me.

Hardware is hard

Adding controller support was a pain. The same controller gives different input values on Windows and Linux, so each system needs its own mapping. And of course different controller also needs a different maps.

I also spent a couple of hours trying (and failing) to get Microsoft Windows to recognize Microsoft hardware. Good times.

I'm still not happy with how this turned out and I think I'll give it another go in the future.

Nobody played it

Splodey Boats 2000 has received a whopping 12 views and 7 downloads on itch.io. Considering it was part of a game jam with nearly 400 entrants I'm pretty disappointed with these stats.

Lessons

Entity systems work really well

About a week from the deadline I decided to add boss submarines. I already had a health component for the player ship, so I added that to the base submarine entity and tweaked the collision system to use it. It was a quick change and it made me happy that it was so easy.

A small amount of customization goes a long way

Levels can choose which kinds of submarines they spawn, as well as how often and how many. These are all small variables, but it means I can have a level with 1 boss submarine, or a level with 10 speedy subs on screen at the same time. All with just a change of a level file.

Small amounts of polish go a long way

The title screen animations aren't going to win any awards, but they made the game feel finished.

Spend time making your game easier to test

I added keyboard shortcuts to skip levels, spawn entities, and test different powerups. This saved a tonne of time when balancing later levels.

Splodey Boats 2000 can be downloaded from the Splodey Boats page, or from its itch.io page. If you download from itch please consider leaving a comment or review.


Splodey Boats 2000 released

Splodey Boats 2000

Splodey Boats 2000 has been released! This version contains everything from the original Flash version, along with new levels and powerups. The whole game has also been re-balanced, and new enemies have been added to keep things challenging.

This version was released as part of the 2021 Finally Finish Something Jam. There were 386 entries this year, compared to just 52 in the original jam. It's great to see so many new games being finished!

Splodey Boats 2000 can be downloaded from the Splodey Boats page, or from its itch.io page. If you download from itch please consider leaving a comment or review.


FFSJam 2021

Finally Finish Something 2021

This year I'm entering the 2021 Finally Finish Something Jam (FFSJam). It's a great jam that focuses on finishing off existing projects, something which I could always use help with.

My entry will be a finished version of Splodey Boats 2000. I started work on this a couple of years ago, but I didn't get around to adding things like powerups or a working high score table. There's also some extra polish I want to add, and I'd like to tweak the levels so that it's fun from the start.

You can see WIP screenshots and statistics on the Splodey Boats 2000 updates page.


New BlitzMax tools

I released a couple of BlitzMax tools in 2019:

blam
A build tool for BlitzMax. It's a rebuild of BlitzBuild and works on Windows and GNU/Linux. I use this to build and package all of my BlitzMax software.
blitzmax-mode
An Emacs major mode for editing BlitzMax files.
docgen
Extracts information from BlitzMax source files. Not particularly useful, but I'm hoping to turn this into a tool for automatically building documentation. Very much a work-in-progress.
MaxCop
A style checker for BlitzMax source code. Useful for ensuring source code all follows the same style and layout.

All tools are released under the GPL and can be freely shared and modified.


Tiny Tactics - Post Mortem

At the start of the year I set myself the target of making four games, with the plan to release one each quarter. Tiny Tactics was first game I started on and was due for release today. The big red "failed" label on the game page is a pretty good sign that things didn't go to plan.

What went right

Slim pickings here…

I got a lot of other things done

By mid-February I had a pretty good idea that things weren't going to work out. I kept going for another week, but my enthusiasm quickly disappeared so I turned my attention to other things.

I did manage to complete some game-related code:

  • Built a movement range calculator. This was quite fun to make, and the finished version supports multiple movement profiles and land types. This makes it possible to have characters that are fast on some types of terrain (such as paths) and slow on others (such as forests or sand).
  • Added autoloading of components to the Pangolin entity system. Previously components had to be declared in a configuration file, which was a pain when trying to quickly test things out. Component date can now be extract directly using reflection.
  • Built a tilemap and tileset converter for working with Tiled maps.
  • Created system for animating UI elements. This is something I've continuously struggled with, so I'm happy to have a slightly better way of doing things.
  • Created NPC's that walk around a map at random.

Still, I would have preferred a playable game at the end of everything.

What went wrong

Aiming too high

I haven't released an original game since "Mini Shinobi" at the start of 2017, but for some reason it seemed smart to try and build a collectible card game.

Not playing to my strengths

I can't draw. Collectible card games have a lot of art.

I can't design user interfaces. Collectible card games have a lot of UI.

It seems obvious when it's written down.

Not planning my time

With a 48-hour game jam, you have no option but to work hard and quickly. Three months seems like an eternity, but those hours quickly disappear if not properly scheduled.

Taking an "I'll work on it when I feel like it" approach was not successful.

Lessons for the future

Even though things didn't work out (at all), I still created some useful bits and pieces and learnt some new lessons. It's still a game I'd like to revisit, but next time I'd like to have a more complete plan.