Well, it's been a long run, but our game is finally close to being finished! Before I continue and talk about what we have achieved in the time since the last blogpost I want to offer the apologies of our group for missing our biweekly blogpost this week. We were just too preoccupied with getting the promotional material ready and finishing our game that we completely forgot about it. Luckily though, we remembered in time before the final deadline tomorrow afternoon.
With that out of the way we can take a look at what we've achieved in these last two weeks. Well, first and foremost, we've added three more bosses!
On the far left is our first boss, the Worm Boss, with updated looks and a new homing fireball attack. To his immediate right is the Scarab Boss who has a shield it can restore over time and has a myriad of complicated attacks that increase in complexity when his health gets below a certain level.
Another place to the right is the Butterfly Boss, who can switch colors, which causes it to be immune to and even enables it to recover health from all bullets of that color, with the trade-off that all bullets it fires itself that are of that color can't do any damage either. It has very powerful attacks to counterbalance this though, and some can only be avoided by putting yourself in the path of the bullets that won't deal any damage.
Finally on the far right is the Bee Boss. Although its attacks aren't very powerful compared to the other bosses' attacks it makes up for it with minions that constantly buzz around the screen and a kamikaze-attack where it will attempt to crash into your ship directly, instantly killing you. The sprites of the minions are reaching the completion stage, but unfortunately they weren't ready yet as of this blogpost being written.
Another major thing we've added is particles. What this basically means is that we can create all sorts of neat effects, such as explosion animations for the enemies that are never exactly the same twice, trails for some kinds of bullets such as the Fireball the worm boss fires. We haven't used them too extensively though, in fear of the players confusing them with small bullets or bullets that actually leave a trail of other bullets behind as they go. Nevertheless, the explosion when an enemy dies has been long overdue so even just for that it was definitely worth it to add them.
Also, the shop and the upgrades are finally fully functional! You may have noticed the brown thing circling around the ship in the screenshots – this is one of the drones, and the large, blue bullets on the screen are explosive bullets it fires that can be detonated by pressing the Z key. We've added several other drones, each with unique characteristics and attacks. And the best thing of all is that upgrading them finally works without a hitch. See below for a screenshot of the completed shop.
We've also added many small things, including but not limited to:
A shield bar for the player to keep track of how much shield power he has left
A small number appearing above an enemy when it is killed, indicating how much points that earned the player
A display on the side of the playing field indicating all the upgrades the player has activated
Music and sound effects
Three new enemies that have been ready for some time but weren't actually implemented until recently
A functional title menu
Oh, before I forget it, the dynamic difficulty has finally been implemented! The algorithm for it, that had been ready before we even had a moving ship, had to be rewritten completely because it simply didn't work, but eventually we got it to run just fine. What this means is that, in the final version, you can basically play the game at any difficulty level you want without having to make manual adjustments – the game will determine how skilled you are and constantly adjust its difficulty level to fit your skill level. This also means that the game will remain challenging even as you get better at it.
For the tech-savvy among you, the old algorithm kept track of the 50 previous difficulty levels and used this data to calculate how consistent the player was playing. For example, if the previous difficulty levels vary between 0.69 and 0.71 you're playing pretty consistently, while if they vary between 0.2 and 0.8 you're not playing very consistently at all. The algorithm would then adjust the rate of change to the difficulty level to how consistent you are playing - if you're playing very consistently then obviously it has almost nailed how good you are and should thus refrain from making huge changes to the difficulty level, whereas if you are not playing very consistently at all it'll have to make big changes in order to get close to your actual skill level faster. The idea was nice, but it failed in practice because the way it calculated the consistency and used it to adjust the rate of difficulty increase/decrease was completely botched. Eventually it turned out that it was easier to switch to a different algorithm altogether than to try and fix this system. So, here's what we came up with for the new algorithm:
The difficulty level constantly but slowly increases every second. However, the longer you play perfectly (which currently means 'without getting hit') the faster the difficulty level will increase. When you ultimately get hit because the game is getting too hard for you the difficulty immediately drops by a set amount (say, 10%) and the rate of increase halves. Now the difficulty is slightly below your actual difficulty level since the rate of increase will never reach as ridiculously high as 10% per second, but the rate of increase is much lower than the last time the difficulty was at that point. Now the difficulty will increase at a slower rate until it again hits the point where it gets too hard for the player, lowers the difficulty and halves the rate of increase again. This process then continues, continuously trying to find at which difficulty level the game is too hard for you and then diving a bit below that and starting the slow increase again. This way the player will be constantly challenged (since the highest difficulty setting possible is basically impossible) while still not being too challenged. It may sound a bit wonky, but in practice this works really well - in fact, this is an adaption of an algorithm that is used in networking to determine how much data can be sent until the transmission line gets congested with data.
With that bit of technobabble I'd like to conclude this final blogpost. We hope that those of you who read this found it to be interesting (or at least amusing) and we hope to see you at the symposium on the 31st of January from 13:30 to 15:30, with the award ceremony for best game afterwards from 15:30 to 16:30.
On behalf of the entire Thunderstruck team, we hope to see you there!