Hey guys, it’s been nearly 10 years since Bullet Heaven 2 released, and I’ve never written any sort of retrospective about the game, so I figure now is as good as any a time to do so.
If you haven’t played it, Bullet Heaven 2 is a bullet-hell shoot-em-up in the style of Japanese games like Touhou. It looks like this:

It’s a game that I return to every once in a while to see how it plays on different hardware – I’ve tested it out on a Steam Deck, a Samsung Note 8, and with a lot of different controllers. It’s a project that started off as an experiment in using the Starling game engine, which builds on Flash’s Stage3D capabilities for hardware accelerated graphics. Flash has a reputation for poor performance, but games made with these tools could run super fast – and I learned a lot about optimising code and graphics. It was my first time using texture atlases (similar to spritesheets), a skeletal animation tool called Dragon Bones, and a lot of other tools which are probably long defunct by now.
The biggest performance benefit came from making as little GPU calls as possible, and this mostly came about by sorting the layers in the game so that the GPU would draw all objects of a type in one call – all the bullets, then all the enemies, then all the background stuff, etc. The game could easily handle 5,000 bullets on screen at a time, along with all sorts of particle effects and other animations. So I was pretty happy with what I had achieved.
But there’s a LOT of things I did wrong, and over the years I’ve been thinking about those things, and now I’m finally writing about them.
Bullet Heaven 2 had a somewhat rushed development – after the success of Epic Battle Fantasy 4 on Steam, I wanted my new game to also have enough content in it to merit a Steam release, but I didn’t want to spend more than one year on it, so I spent most of my effort trying to cram a lot of content into the game rather than focusing on quality. I’m very happy with the amount of playtime the game offers – and it’s also quite fun and addictive – but I wish I had spent more time nailing the core concepts down before making all the levels.
Here’s some regrets I have:
The game uses a lot of mechanics from hardcore Japanese shoot-em-ups that are familiar to fans of those genres, but not to many other gamers. For example: when you take damage you have a short period of time to cancel it by using a bomb, using bombs is generally discouraged except as a last resort, you can get extra points for “grazing” enemy bullets by going near them, etc. I feel like I didn’t do a great job at explaining some of these mechanics to casual players, and in many cases I wish I had designed new systems that were more intuitive and original.
The wave system and scoring mechanics are pretty basic. Each level has the same number of 10 waves, plus up to 3 bonus ones at the end if the player did well. It’s easy to understand, but I’m sure I could have come up with more interesting level pacing if I tried just a little bit harder. The scoring system relies mainly on completing waves perfectly to increase your score multiplier. The downside of this is that it’s very punishing if you make a mistake on any of the 13 waves. If I had made the game today, I would make sure the scoring system takes more factors into consideration. For example: the order in which enemies are killed could matter, waves could be broken up into multiple groups of enemies with each group giving a bonus when killed, grazing enemy bullets could charge some sort of resource, and so on. Basically, routing a path through a level to earn a high score should be more interesting than just “kill everything and don’t get hit”.
In terms of optimising performance, a big thing I overlooked was “object pooling”, which means to recycle objects in a game rather than clearing up their memory and creating new objects. By the time I learned about this concept I was too far into development and just didn’t feel like trying to implement it. The result is that the game stutters every few minutes when the garbage collection kicks in. It’s not too bad, but it is noticeable and annoying.
Bullet Heaven 1 had permanent upgrades which could be obtained by grinding, where as this sequel does not and requires only skill to progress. I wish I had made two game modes – one with upgrades and one without, and players could just choose which style of gameplay they preferred, without needing to complete both modes. The hardest achievements would have been for completing the same final boss either way, so this option need not take too much away from the challenge.
The writing was not great. It was just silly banter between the main characters at the start and end of each level, and if the player skipped all of it they wouldn’t have missed much. Some players still appreciated it more than having no dialogue at all, but I feel like I could have done more with it to make it more interesting, even if all I did was add a very basic Mario or Zelda style plot.
And finally… I just don’t like the graphics. They’re similar to my other games, but the way I did the shading took a long time and just doesn’t look great. I should have went with a cleaner style like what I tried out in the Bullet Heaven 3 Prototype. (which will never be finished, in case you hadn’t heard) (also, pictured)

On the other hand, there are many things I am proud of:
Bullet Heaven 2 supports 3 control schemes: mouse, keyboard and controller. Not many shoot-em-ups support that many options, and this makes the game quite accessible. In my opinion, the mouse controls are the most precise for higher difficulties, but many people are used to the other methods from playing similar games.
It supports 4-player co-op! I’m sure not a lot of people tried this out, but the ones who did were quite vocally appreciative of it.
There’s a lot of content and the bosses’ attack patterns look really pretty!
There’s optional cheats and handicaps that make the game easier or harder and effect your score accordingly. This doesn’t disable achievements, so trying to find a combination of cheats and handicaps that works best for the player turned into a strategic element that was quite unique.
The short levels and 3 difficulty options make the game more approachable. The ranking system is designed so that you get in-game recognition for beating levels perfectly, but none of the Steam achievements require you to go that far. It’s an overall satisfying game to try to complete 100%.
And, as was the original goal, the game demonstrates how a Flash game can run in an HD resolution at 60fps with thousands of objects on screen. I don’t know exactly what the recommended hardware requirements should have been, but they certainly weren’t very high, so I generally did a good job in this area.
Finally…
In terms of sales, the game didn’t do great during the first year, and I earned somewhere around (the UK) minimum wage from it. I was lucky to still get some sponsorship money from Kongregate, as the browser game market was dying at the time, and this was an appreciated boost. Thanks, Greg.
But over time, sales on Steam kept trickling in (probably largely due to it being bundled with my more popular Epic Battle Fantasy games) and nowadays the total income from the game is 4 or 5 times higher than that first year. The game currently sits on 447 reviews on Steam, which are 98% positive.
So things turned out alright financially, and in the end I just regret not spending a few more months working on some of the issues I mentioned. I easily could have afforded it, just self-doubt made me want to finish the game faster. Oh well.
It would still be viable to port the game to mobile to bring it some new life – the PC version almost works on phones as it is. I reckon it would be enough to tone down the difficulty a bit, simplify the controls, fix the object pooling issue, and rearrange the UI a little bit. But porting to mobile has been tedious work for me so I don’t think I’ll ever do it, unless maybe some publisher offered me really good money up front, haha.
I don’t see myself tackling the shoot-em-up genre again any time soon, but if I did I think I could make a fantastic game with all of these lessons in mind.