We launched Blue Revolver on the 11th of October, 2016. At the time, I had promised full Steam leaderboards, replay support and achievements. Now, about 8 and a half months later, the update is now live and everything seems to be working fine. But that’s a long time.
I’m not trying to write excuses here, the delay for players is inexcusable and the fault lies entirely with myself. But I’m writing this down to explain what happened and to share with other developers who might fall down the same hole.
Technicalities
The technical side was a little involved, but didn’t require any massive rethinking of the game, I was suprised (and relieved) to find.
- Replay files are a simple, fairly standard affair. Record the input state of the game on each frame as well as a number generated by the RNG. The number is to detect desync within the RNG. It also records the number of RNG calls each frame for debugging - this way, if there’s a desyncing replay, I can tell if it was recorded with random calls that don’t happen on my machine or if it’s the other way around.
- I wrote a sound manager for the game that would pool, select and limit audio channels (“sources”) for sound effects, in the hope of making certain things like machine guns sound more interesting. I wrote this very early on in the project and forgot about it. However, it would call math.random a lot, creating non-determinism in cases where lots of sounds are played.
- The timer library we use for delays/tweens/etc, HUMP.Timer, is non-deterministic if two functions are scheduled with the same delay.
- Game made plenty of sloppy calls to love.timer.getTime() for sin/sway effects etc, which is obviously non-deterministic.
- Integrating with Steam’s leaderboards/cloud API was done using FFI and was a complete ballache. The documentation for this stuff could really be a lot better, but it’s B2B stuff, I suppose.
- Other things like float math, Lua tables etc, all worked just fine. Neither are tools I was ready to throw away. I was constantly ready for some massive insurmountable technical hurdle like this, but it never came.
Of course, given the nature of replays, testing takes a pretty huge chunk of time, and it requires a thorough, investigatory mindset. It wasn’t a simple task, but no way should it have taken 8 months. So what was the problem?
Impostor syndrome
I am not the best player. I’ve collected an alright amount of 1CCs over the years, but I’m far, far from a superplayer. Compare with the developer of Crimzon Clover, aka Clover-TAC, who… actually is. My internal rule for balancing the difficulty was “Mae/Power/Lancer, can beat Normal mode without thinking, can beat Hyper mode on a good day, can consistently beat chunks of Parallel mode but can’t put it all together”. Either way, it’s been a long long time since I properly chased a score in a game, and I can’t beat my own game at the highest difficulty. What authority do I have to be sitting here, designing a game for starry-eyed STG gods?
And there are a lot of things I’m not happy with in the game. I don’t like to talk about this kind of thing because I feel like it might spoil the game for people. Sadly, it seems I’ve yet to leave the “polish” mindset where every little quibble or flaw of the game is something that needs work, especially when pushing a patch on Steam is so easy. And it’s hard to tell when we’ll be doing another STG.
So I get hit really hard with impostor syndrome. The creeping sensation that I earned none of the modest success this game achieved, and that just around the corner the game will be found out as just a bunch of PNGs moving on a screen. Working in a niche genre with a pretty tiny English-speaking following helps you feel like you don’t have the angry critics you deeply deserve.
I became convinced that in terms of the game/level/pattern design, I had completely pulled a fast one on STG fans the world over and just barely got away with it. And if I was to call attention and competition to the game with leaderboards and replays, inviting people to play at the highest level, the game would completely break down and I’d be shown up as a hack, a failure, a fraud.
I come from circles who are often very negative and cynical about games. This usually does come from a place of being passionate, and it’s the way I used to be. Often, criticism of a game turns into frustration, anger, mockery of the developer. I imagined people doing the whole Sean Murray thing with me for failing to deliver on a promise, or failing that; simply making a bad game.
So I got depressed; fell into a pretty grim place for a long while, sat on my hands, slept days away. Most days, I couldn’t stomach looking at anything about the game, much less work on it. And of course, the longer things went without any news or communication about leaderboards/replays, the more my weird concerns about being shown up as a fraud ended up turning me into an actual fraud.
I was really nervous about shipping this update, to the point of being physically sick, very afraid that the response would be “too little, too late, game over”. However, what I’ve seen has been very encouraging, and the Steam summer sale is doing alright for us so far. Not great, but alright. Right now, people may be breaking a lot of the carefully-designed bosses over their knee with the new toys we gave them, but I hope that for now they’re at least playing the game with a smile on their face. (Or a really focused expression, I guess!)
Going forward
Really don’t think I’ve made my peace with this yet. I still feel like people who like the game either simply don’t understand the game/genre, or are choosing to paper over the very real and fundamental problems for some reason. There is still money on the table for updating/refining the game (Steam make sure to incentivise big updates with visibility), which is nice. But I’m pretty sure no amount of work I do on the game is going to make this feeling go away. Will need to recognise when it’s time to stop.
Either way, I’m currently speccing out what we can do with Blue Revolver in the future. Any core game stuff to make the game more refined would have to come as part of a wholly comprehensive rebalance/rework package - a “black label”, and not too soon, either. Nobody wants to play a STG that’s constantly changing under them. But there’s extra modes, features, etc to consider too, in the interim.
If you’ve read this, I appreciate it. Like I said, I’m not trying to make excuses, just to explain what happened and maybe help other people in the same situation. Obligatory small teaser of something I’ve got sitting in my “experimental” branch: