Category Archives: Bullet Heaven 3

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.

Summary of 2021

As is my yearly tradition, here is a summary of important or interesting events in my life this year, including a bunch of news about my games that you might have missed.

• I refurbished my two NES consoles, which included deep cleaning and replacing the silicone springs in the controllers. I bought a couple more homebrew games that were released recently, and tried messing around in NES Maker. Here’s some mockup art and stages I made, that run in an emulator. I also bought an Everdrive, which allows me to put the entire NES library (and cool mods and homebrews too) on one cartridge – and it has save states too! Micro Mages and D-Pad Hero 2 are fantastic modern NES games to check out, to name just two.

• Early this year Flashplayer was finally killed off in browsers, with every website trying something different to keep Flash games running. Ruffle is a Flashplayer emulator that can run many Flash games in browsers without the need for any plugins, and I’ve started hosting a collection of Flash games on my website which show how well it works. It’s still a work-in-progress though, and mostly runs older ActionScript 2 games.

• Newgrounds.com hosted the Flash Forward Game Jam to encourage developers to make new Flash games for Ruffle. I made Bullet Heaven 3 [Prototype] to try out some new art and mechanics, but the reception was a bit mediocre as some features were missing and the controls were not as intuitive as those in the previous Bullet Heaven games.

• Until Ruffle is finished, the best way to play Flash games at the moment is BlueMaxima’s Flashpoint. I’ve been supporting the project with donations and by doing an interview with Blue. I will eventually publish my older games on Steam – that should have happened this year, but it didn’t.

• I’ve started buying high quality furniture that I expect to keep for a very long time, starting with a solid oak bed and sets of drawers. Previously I’ve been buying the cheapest furniture that gets the job done and looks passable. Luckily, our dog is small and isn’t capable of destroying furniture, and we also don’t have kids.

• I bought a few homebrew Game Boy games, and customized my Game Boy SP with a new SNES-style shell. Next year I plan to design and print my own Game Boy shell, and maybe try making a Game Boy game!

• I pushed out an important update to Epic Battle Fantasy 4, which fixed some serious issues such as memory leaks and poor balancing, and added some new quality-of-life features, and a new cheats and challenges menu. If you haven’t played EBF4 in a while, this is a very good reason to play it again. See the link for the full list of changes – there’s a lot! (You have to opt-into this version in the Steam betas tab)

• I’ve been learning a lot of DIY stuff, such as re-doing the silicone sealant in the bathrooms, installing shelves, and building simple garden furniture such as planters and a firewood rack. I’ve collected a lot of power tools, including some that scared me until recently (circular saws), and plan to put them to good use as soon as the sun comes back – I don’t have a garage, so I gotta work outside for now!

• My brother bought a house, so I’ve been helping him renovate it a bit. I helped install new laminate floors and Ronja helped with painting. Next year we’re also going to extend the garden fence – but timber prices are super high in the UK at the moment!

• I went kayaking for the first time! Good thing Beat Saber kept my arms in decent shape this year.

• Speaking of which, I still can’t beat Spin Eternally and Ghost on Expert+, but I’m slowly getting closer…

• A lot of effort this year went into training our new dog, Ethel. She knows a lot of tricks, and is very well behaved around guests. What she fails at is behaving around other dogs, and being walked in new areas – she gets nervous and starts making a scene. We tried to introduce her to my parent’s dog, and she seemed to be making progress until she flipped out and took a nice big bite out of the other dog. We got some personal training lessons for her, and while her temperament somewhat improved, she’s still not allowed near dogs.

• Ethel also had some mysterious health problems for a few months – sudden exercise or excitement would cause her to start breathing strangely and faint for a few seconds. One time she did this and had seizure symptoms, including paddling her feet. The vet couldn’t find anything wrong with her, and the symptoms gradually got milder, and now she seems totally fine.

• I finally started playing Smash Ultimate! I sat on this one for a long time because the lockdowns made it difficult to invite friends around. I’ve got a lot of complaints about the Switch hardware and Smash Ultimate user experience… but in the end it’s still darn fun to play. Another party game I’ve played a lot with friends is Overcooked 2.

• My dad’s car was totalled in an accident! Luckily no one was hurt, but him and his passengers (including my mum) were a bit shaken up. My dad went on to buy the exact same car again, a Seat Alhambra, his 4th one.

• I finished decorating my office, which involved getting an ergonomic office chair, framing some new posters, and building a 220cm desk out of a kitchen worktop. This does little for productivity, but it looks cool.

• I got an ultrawide monitor… and well, it’s great for first-person games, but for everything else it feels like a gimmick, and most people would probably be better off with two monitors instead, which are more versatile and easier to transport. The worst part for me is that it is not curved enough to see the edges comfortably. I might actually replace it sooner rather than later… but it does look beautiful on my new desk!

• I’ve been playing a lot of retro style first-person-shooters this year, including DUSK, HROT, Amid Evil, Dread Templar, and Ion Fury. I got into them thanks to the new Doom games.

• Age of Empires 2 is still taking up a lot of my gaming time. I’ve finished all of the campaigns on hard!

• Got all of my covid vaccines this year, and the booster. So far, only the second dose has had serious side effects, and I was totally out of action for a whole 24 hours, with bad headaches, nausea, and chills. I think we’re all gonna get some variant of covid sooner or later, so getting vaccinated is the best we can hope for when it comes to mitigating the damage.

• Our garden is more or less finished – we finished decorating with some outdoor art and more patio furniture. We bought a gazebo to sit under, and a large firepit, so even if the weather isn’t great, it’s still comfortable to sit out there. I’m still learning how to chop firewood correctly though.

• I spent a lot of this year working on the EBF5 mobile port, but got kind of burned out working on it, so it’s still not completely finished. The game runs quite smoothly now and in-app purchases finally work. I’ve learned a lot about mobile development with Flash/AIR, but Google’s developer console is a nightmare to use, and I hear Apple’s isn’t much better. It’s a shame that the mobile ecosystem is so terrible, because getting games running on mobile devices is very satisfying otherwise.

• I’ve been working with a Chinese mobile games publisher, which is one reason I’ve been focusing on mobile games. They offered me very good terms, and the deal doesn’t affect anything outside of China, so all you guys get out of this is that I’m porting my games to mobile. Working with a publisher has been a new experience for me – I’ve been doing a lot more documentation work than usual!

• I quickly ported and published Mecha Dress Up Game, Brawl Royale, Cat Cafe v2, and Epic Battle Fantasy 1 on Android! They work well but are very simple games compared to my new stuff, so didn’t make much of a splash when they landed. You can’t currently buy them because of some ID verification problems with my Google account – I’ll need to get that sorted ASAP!

• I’ve been going on short road trips with my dad. This year we’ve visited Dundee, Newcastle and Dunbarr. We’ve got to start planning things better so that all of the attractions aren’t closed by the time we arrive. Covid isn’t making it easy either. The most exciting destination so far was the Holy Island Lindisfarne, which is accessed by a causeway road. We went during a storm, and had an incredibly wet and windy time at the castle.

• My brother soon planned a slightly longer road trip – we stayed at The Park Ecovillage near the town of Findhorn, and visited some nearby attractions, including Bow Fiddle Rock (a large natural arch in the sea), the Captain’s Table (seaside bar and restaurant), and Findlater Castle (a cool ruin on a steep cliffside). We stopped for fish and chips in the town of Cullen, which also had some very quirky antique shops. The Ecovillage itself was some sort of spiritual/druid community, where driving was discouraged, waste was recycled, and many of the buildings were hobbit-style.

• Me and Ronja put a ton of effort into Halloween this year. I put up a terrifying scarecrow on the driveway, and bought a ridiculously creepy mask. We’re getting a reputation as having the scariest house in the area, and 100 kids showed up despite covid. Some kids even showed up in Friday Night Funkin’ costumes!

• I started transitioning into being a vegetarian. I started off by avoiding very unhealthy meat like bacon and sausages, eventually realizing that I can probably manage without meat in my diet, and it’s been fun trying new food at restaurants. I think I’ll keep eating fish and other meat on special occasions, but I’ll try to stick to the higher quality stuff.

• Me and Ronja went on a road trip to Glen Lyon, stopping by in Aberfeldy and Pitlochry along the way. We stayed two nights in a small wooden cabin on a farm, which had a very comfy log burner, and three dogs and a bunch of chickens roaming around outside. We did a little bit of hiking, stopped at a garden centre, saw some monuments, and drove on some very narrow and bendy roads. I also played Scrabble for the first time. I can now understand the appeal.

• Christmas decorating got interesting this year, as I tried making wreaths for the first time. My brother joined me. It’s actually not hard and you don’t need a lot of supplies – as long as you have access to a garden. I will definitely make a yearly activity out of this. Christmas Eve dinner with the family was pretty normal – eating fish while dogs made noise in the background. A covid scare stopped us from having more dinners over the next few days.

• This year’s Christmas Steam Key Giveaway was the most popular one ever! I will definitely keep doing these…. even though I skipped it last year. I’ll try to think of other seasonal events too, such as fanart competitions, etc.

And that’s all. Here’s some highlights in picture form… click on the image for a larger version!

Happy New Year, everybody!

Flash Forward Game Jam

Hey guys, the Newgrounds Flash Forward Game Jam is over, so I’m making this post to feature some of my favourite games from it. This jam was all about making browser Flash games that work in Ruffle – no Flashplayer plugin required. Ruffle is an open-source Flashplayer that works natively in browsers, mobile, and desktop, and currently runs ActionScript 2 games, with ActionScript 3 being worked on now.

One of the coolest features of Ruffle so far is that Flash games now run very well in fullscreen – just right click to go into fullscreen mode in any of these games!

You can play more games from the Game Jam here on Newgrounds.

Bullet Heaven 3 [Prototype]
Throw Rocks at Shit
AshBelt
Brain Toasting Dungeon
Spot & Click
Drop Cannon

BH3: Medals

Achievements and leaderboards are done! Bullet Heaven 3 [Prototype] should be finished in a day or two. I’ll put it up on my website first, and then on Newgrounds a day or two later, which is where the leaderboards will be viewable.

The game will be playable on mobile if you have a stylus, but will probably be quite laggy. You definitely want to play this on a PC with a mouse for the best experience.