Category Archives: Thoughts and Opinions

Bullet Heaven 2 Retrospective

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.

Creativity from Limitations

Hey guys, it’s been a long time since I was in the habit of writing longer blog posts.
Social media has made me very lazy, and now with AI generated slop taking over many platforms, I think it’s more important than ever to start making sincere and long-form content again. Maybe I can even turn some of my writing into YouTube videos later…

Anyway, it’s often said that “limitations breed creativity”, in the sense that various constraints on a project will force you to find creative solutions to problems with whatever resources you have available. You can see this quite well in a lot of indie games that can’t afford to do everything that AAA games do, so they focus on doing a few things very well, and if you’ve played retro games, you can see how hardware limitations of something like the NES console dictate the design of the games that run on it.

In my case, the games I work on are also designed around my personal limitations, rather than me trying to chase the coolest thing that’s trendy at the moment.

My earliest browser games – such as The Kitten Game, Mecha Dress Up Game, and Brawl Royale – were basically glorified PowerPoint presentations: You click a button, and an animation plays somewhere. There were a few variables keeping track of score and stuff like that, but for the most part, the state of the game was just tracked by whatever animations were currently playing. That’s all I knew how to make at the time, since I had some animation experience, but very little programming experience. All of these games were focused on having cool, catchy or even violently shocking animations, while the gameplay was very primitive. They were also all quick to make – about one month of work each. But it worked. That was enough to make fun web games at the time (around 2008). And even today you can still make games that are basically PowerPoints – such as visual novels – if you have an interesting premise and some good design skills.

The next step from there was to learn programming! While I was studying computer science at university, I was still making browser games in my free time. They taught as Java, which wasn’t too different from the ActionScript 2 and 3 languages that Flash uses, so it was just a case of me skimming through some textbooks to see how object oriented programming concepts were implemented in Flash’s languages. You can track my progress quite clearly in the first 3 Epic Battle Fantasy games – each game really pushed the limits of what I could program at the time. Making a Final Fantasy 6 style RPG was totally impossible for me – I could design one, but I still didn’t have the programming skills to pull it off. So each Epic Battle Fantasy game added a few more basic mechanics as I got better at programming: Starting with in-battle turn-order and move selection, then adding level-up perks and more character customization, to finally adding an explorable overworld and more detailed menus for item management.

Gradually ActionScript 2 fell out of favour for the newer, faster and stricter ActionScript 3. It was like going from JavaScript to cleaner Java code. I had to suddenly get serious about organising my code, since ActionScript 2 let you get away with some very sloppy coding practices. Anyway, my next few projects started to get more technical. Bullet Heaven and Adventure Story were action games now – not turn-based – so performance mattered. Animation quality was scaled down as I focused more energy into optimizing performance and testing the limits of what a little browser game could handle. I got to know Flash lot better – what the performance bottlenecks were, how to organise object classes neatly, and just generally getting comfortable with programming anything I wanted in ActionScript 3.

Epic Battle Fantasy 3 was at the very limit of what could be done with very sloppy, unprofessional code. So now that I had a bit more experience with good coding practices, I could make Epic Battle Fantasy 4 an even larger and more ambitious game. In fact, it was perhaps a bit too ambitious for the browser game market, which declined massively while I was working on the game, and mobile gaming took its place. Problems such as browsers deleting your save files and it being quite a large download also plagued the game. But eventually, and luckily, it was allowed to be published on Steam, and I saw more success there than I ever had before. So I was getting to the stage now where I really had to be aware of and consider what worked for each gaming platform.

Bullet Heaven 2 is a bullet-hell shoot-em-up, and it was an experiment in using Flash’s hardware-accelerated engine, called Stage3D. Flash graphics were generally rendered by the CPU, which is why they’re so slow, but it also makes working with them much easier. Using Stage3D meant you could do some very ambitious graphics using the GPU if you put in the effort to code them right. So I started this project by testing out how many bullets and other particles Flash could reasonably display on screen, and it turns out, a few thousand is no problem at all if I make correct use of spritesheets and a low number of GPU calls. So I built the game around that concept. I also learned a bunch about object-pooling, and other memory management practices, but unfortunately was too lazy to implement all of those correctly, so the game stutters occasionally when the garbage is collected. Overall, the game could have used more time in the oven, and it wasn’t my most successful one, but I learned a lot!

Something worth mentioning about all the EBF games is how Flash’s performance limitations influence their design. This is why there’s no dynamic camera moving around in battle, and why you’re permanently limited to 3 characters on your team. This is why the world map is broken up into small, dense sections like a GameBoy Zelda game. Regular Flash graphics works best if there’s only animation happening in a few parts of the screen at a time, and background stuff can just be cached in place. Most of the places where the games slow down are because I broke the rules and did some very inefficient effects. There are advantages of course – I don’t have to worry about memory management or asset resolutions, since Flash uses vector graphics. (more on that later)

Epic Battle Fantasy 5 was my first EBF game made specifically for Steam, and I was also a financially stable and experienced programmer now, so a lot of limits were off the table, and new opportunities arose. It was a question of how polished can I make the gameplay from previous games, in a reasonable amount of dev time? I figured I could put up with about 3 years of work before I went insane, so that’s what happened. Some new design goals were:
• Make the game polished enough so that people will be happy to pay up-front for it without needing to play a free version first. So this meant: polished, consistent graphics, a catchy trailer, and 98% positive Steam reviews.
• Fill it to the brim with content so that people can keep coming back to it for years, and no one can say that it was priced too expensive.
• Reboot the story in a way that new and existing fans will understand it.
• Take advantage of new social media platforms like Discord to really leverage community involvement: feature more fanart, get feedback on balance, support mod development, etc.
• Translate it to an ambitious 12 languages with the help of the fans!
(Chinese in particular turned out to be a really big deal)

All of that went very well, and the game was a huge success. The main issue is that I don’t know if I ever want to work on any project of that size ever again, because on top of those 3 years, I also spent another year making an update and then a mobile port. So in future, a new limitation will be to keep the work interesting for myself by doing as many things differently as I can.

Finally, the game I’m working on now – Matt’s Hidden Cats – is built mainly with two goals in mind: to take advantage of Ruffle’s strengths, and to be a casual game that anyone can play – including my parents and the children of my friends.

Ruffle (a Flash emulator) has been in the works for a few years, but only in the last couple of years has it become viable for running ActionScript 3 games. What Ruffle is exceptionally good at is rendering Flash’s vector art using the GPU, which is something that the original Flashplayer only did on mobile devices. Flashplayer on PC used the CPU, which you’ll know isn’t ideal for drawing graphics – it works okay in a small window for browser games, but really starts to slow down in HD resolutions. With Ruffle, I finally had access to a game engine that renders vector art very fast, even at high resolutions – I don’t think there’s anything else like it. And since I’ve been using Flash the whole time, I didn’t have to change my work flow very much.

What this allows me to do is to have tons of animations on screen with unlimited resolution, and a hidden object game can really take advantage of this, as the genre is known for having very detailed levels, and the ability to zoom in and out. Some of the hidden object games I’ve played have issues with graphics becoming a bit blurry or pixelated when fully zoomed-in, and this leads to a bad experience when trying to find very small items. You can overcome this by making all of your assets very high resolution, but that of course increases the hardware requirements for the game. Vector art doesn’t have this problem – it’s always sharp!

If you’re not familiar with vector art, you should know that it doesn’t use pixels – it’s not a bitmap. It’s a mathematical representation of how the computer should draw lines and shapes, and outside of Flash games, it’s pretty rare to see in 2D games. (it’s conceptually similar to how 3D shapes are drawn)
You’ve probably seen it used in map apps.

Anyway, the development of Ruffle opens up a lot of new possibilities and makes Flash games with vector art viable in the current year on modern hardware, which is pretty cool. And the tech is only going to keep getting better, since it’s a work-in-progress.

The second goal of Matt’s Hidden Cats is to be a good game that even non-gamers can easily pick up. I haven’t seen many good examples of this since the earlier PopCap stuff like Bejeweled, Peggle, and Zuma. Now that mobile gaming has taken over, most casual games are free-to-play and ruined by predatory micro-transactions, and are artificially designed to keep you coming back every day indefinitely. Matt’s Hidden Cats won’t insult your intelligence – you get a complete game with hand-made levels that you can play at your own pace.

I’m aiming to address a lot of the gameplay problems that other hidden object games have. Here’s some examples:
• A lot of them have very limited hint systems: sometimes you have to wait a frustratingly long time to receive a hint, or sometimes the hint just isn’t very helpful. In Matt’s Hidden Cats you’ll have options to change how often you can use hints, and the degree of helpfulness they offer, so you can make progress at whatever pace suits you.
• Often the games become more frustrating as you try to find the last one or two items in a level. To address this, items you’ve found remain circled, so you can clearly see in which parts of the level you haven’t found anything in, which really helps narrow down where the remaining items might be. It’s a subtle hint that players will probably feel smart about exploiting.
• There’s usually no difficulty options in these games! Most puzzle games go for a one-size-fits-all approach, which will exclude some players, and it also means that once you complete a level, there’s not much point in ever replaying it once you know the solution. In Matt’s Hidden Cats there are 3 difficulty options, with a different set of goals to find in each. Easy mode is for younger kids, Normal mode is not trivial but also not challenging, and Hard mode is for anyone who really wants to dig in deep and spend some time getting to know every nook and cranny in the game.

This aspect of game design applies to all of my other games too – I look at games in the genre, take mechanics that I like, and change things that I think should be done differently. Maybe this won’t lead to a completely groundbreaking and innovative game, but it means that my games will be familiar to fans of whichever genre, and the mechanics have already been proven to work in other titles, so I don’t have to reinvent the wheel and spend a lot of time trying out completely new concepts.

You’ll probably have seen by now that a lot of indie game projects out there fail because the team doesn’t have the experience or resources to pull off what they had envisioned. It seems kind of obvious, but I think you should strive to design a game based around what experience and resources you currently have, rather than trying to make your dream idea work at any cost. And even if a project doesn’t turn out how you wanted, there should still be a meaningful place for it in your portfolio of work. For me, even if a game doesn’t turn out to be financially successful, at least it was a good learning experience.

Anyway, that’s all I’ve got to share for now.

What is Marketing

Hey guys. For the last year or two I’ve been considering paying for advertising, which is something I’ve never done before, but it seems like a way to keep sales up in the years that I’m not publishing anything new. (And it also helps with accounting shenanigans, as I could reduce my tax bill by investing in future sales, blah blah)

But the more I think about it the more challenging it seems.

First of all, for it to pay off, you’d need to have a fairly high revenue per user, which is why I guess you see it the most with micro-transaction-plagued mobile games, and big AAA games. But I’ve also seen it with some medium-sized indie games, who presumably have publishers who know what they’re doing – and I don’t. I’d have to learn quite a bit to figure out how to measure if the advertising was worthwhile or not.

Secondly, I haven’t really felt the need for it other than curiosity. The store algorithms on Steam and Google Play do most of the user acquisition work for me, and I’m paying them a share of the profits regardless of whether they find the new users or if I do. So it seems like a poor deal to pay to send users to one of these platforms. On Google Play for example, I reckon less than 10% of the 500k EBF5 downloads are from my social media efforts, and the rest are from Google Play randomly showing the game to people. (my characters being recognisable definitely helps a lot, but that’s really hard to measure)

Thirdly, I just really hate the idea of giving more money to awful, monopolising companies like Google and Facebook.

I guess a lot of those problems also apply to paying “influencers” like gaming livestreamers. I don’t regularly watch any and my games don’t seem like the flashiest to show off in that form, so I don’t know if it’s a good fit. Plus it’s always a joy to see people streaming my games just because they want to, and it would feel weird to pay others to do it.

So now I’m thinking, what if I commission really popular artists to do art of my characters, and give my games a little shout-out on social media? It seems less dirty than more direct marketing – I support a micro business and get some cool art out of it. I don’t see a lot of examples of this sort of thing though, so I guess I’d have to try it to see if it works. It also feels weird to pay someone for art when my games already get tons of fanart organically.

I guess the most elegant solution would be for me to be the influencer, but I’m just not cool enough. All of my clout has always just come from my games doing well on gaming platforms, due to good reviews and recognizable characters. And I guess that’s fine too.

So the conclusion is that I may just end up doing nothing with any of this. But maybe I’ll commission a few art pieces to see if any traffic comes from that. Thoughts?


On Palestine & Israel

I try to keep politics to Twitter, but felt the need to say something on Palestine/Israel, in case there’s still any fence sitters reading this.

For anyone out of the loop, there’s an ongoing genocide in Gaza being done by Israel, in response to a major terrorist attack on October 7th in which 1,000 Israeli civilians and tourists were killed. So far, nearly 20,000 have been killed in Gaza, the majority of which are women and children, and almost all civilians. Infrastructure in Gaza has been destroyed – hospitals, universities, utilities – so around two million people are displaced without food, water or medical care for over 2 months now.

There’s a lot of history and details there that I’m not qualified to talk about (this has been ongoing for 75 years, after the UK apparently promised the land to both sides), but this scale of devastation hasn’t been seen in decades. The important thing to note is that Israel holds 90% of the power in this conflict (as you may be able to tell by the death counts) and is fully supported by the USA, with the UK government also being supportive. With that advantage, most of what they’ve accomplished has been to kill and displace civilians and take land, instead of any “self defense” goals.

I feel the need to speak up since the UK government (and the opposition party too) are complicit in this.

In my opinion, the invasion of Iraq was the worst thing the UK government has done in my lifetime, and this feels like a similarly awful foreign policy blunder. I’ve been attending ceasefire marches to absolve me of my shitty government’s actions, for whatever that’s worth. I also chipped in £500 to Medical Aid for Palestinians and £500 to Doctors Without Borders.

Humanitarian organizations are saying that their medical staff are being targeted by Israeli forces, so I respect any work they manage to do in these circumstances.

Anyway, this all sucks, and I would like to see a ceasefire and negotiations for long term solutions.