Postmortem

January 17, 2021 in Announcements

Since today marks one year since the release of Lenna’s Inception on Steam, it felt like a good time to look back over the game’s development and release. If you haven’t played Lenna’s Inception yet, feel free to read on without fear of spoilers. And if you don’t have Lenna’s Inception but like the sound of what you read here, you should know that both the game and the soundtrack are 50% off for today, and today only (edit: no longer)!

It’s hard not to be quite critical of past mistakes, but I don’t really have many major regrets. Over the period of time covered here, I learned a ton, made new friends, formed connections, and built up a new career. Making and releasing this game was definitely worthwhile.

In case you’ve come here from elsewhere and aren’t already acquainted with the game, Lenna’s Inception is a sort of metafictional, glitch-themed take on the Zelda series. After the hero dies in a glitch-related accident early in the game, the titular character Lenna, a schoolteacher who just wants to make sure her students are safe, is forced to take up the mantle. The game has multiple endings, procedurally generated maps, local co-op, tons of puns, and a set of challenge modes. We released the game on the 17th of January, 2020.

Initially, I (Tom) worked on Lenna’s Inception alone. From January 2015, Jay worked with me on art, playtesting, script edits, and boss design. He’s now my business partner and owns half of Bytten Studio. Since the release of Lenna’s Inception we’ve released one major content update for it, and announced our new project, Cassette Beasts.

Lenna’s Conception

Lenna’s Inception first started to take form in January 2012… For those who are too young to remember, 2012 was the year the world was supposed to end. It was also the year of Obama’s re-election, an era when the idea of Trump as president was a minor joke in an episode of the Simpsons. Which, yes, means that I worked on this game for a long time–over 8 years, in fact!

I’d been replaying the Zelda games from my childhood, including the Oracle games and Link’s Awakening, which had a fascinating screen-skipping glitch that let you explore out of bounds. The most recent Zelda game to release was Skyward Sword, which (at the time) hadn’t been received as well by fans. As far as I could tell, indies at the time weren’t making Zelda-style games either, so it seemed like a good niche to target–a fact that Anodyne later seemed to prove with its success in 2013 (a great game by the way).

Up until 2013, with the release of A Link Between Worlds, Zelda games generally used a pattern of locks and keys to control pacing: each item you collect works as a key that resolves some obstacle. Said obstacle then gives you access to new areas with new obstacles and a new key item. As a programmer, I love patterns because it means I can write code to automatically generate more.

So that’s where it began. Back in 2012, procedural generation was the hot new thing, there were no Zelda-style indie games, and I was captivated by weird glitches. This was not such a bad idea for the time! I’d identified a legitimate underserved audience in the market–although, of course, it wouldn’t stay that way for 8 years.

Sidenote: Some of you might point out that the Binding of Isaac was a 2011 procedurally generated Zelda-like game, but I’d argue it’s not really Zelda-like in a way that appeals to fans of Zelda. It’s a hardcore action-roguelike that is even more punishing than game development.

Part-time development

I started this project with a fair bit of experience programming, and some experience making little games as a hobby in my teens, but admittedly no knowledge of the games industry. So I did what seemed sensible to me, and kept my software development dayjob.

Treating my first indie game project as a part-time job is the number one reason it took so damn long to finish this game, but it also saved my ass in so many ways. Having a secure source of income while working on this took away the danger of going broke if my game failed, and it gave me time to learn what I was doing.

Eventually I did leave my software development job to work for an indie game publisher in 2015–one that had already found financial security. It was there that I met Jay, my current business partner. I learned a lot just being there: the language the industry uses (e.g. what a producer does), how the business works, what publishers like to see in games they look at, and so on. I stayed there until mid 2019, and through that time Lenna’s Inception remained a side-project.

It was an extremely valuable experience, and it’s because of that experience that I feel confident enough, and have the knowledge and contacts to be able to work on Cassette Beasts full time.

Sidenote: I’d be remiss not to mention that that publisher was also publishing Lenna’s Inception for a while. In the end, we parted ways before the game’s release.

I estimate I spent an average of 10-15 hours on Lenna’s Inception each week, which means if I had been working on it full time, it would have taken between 2 and 3 years to develop. With a release in 2014 / 2015, it might have sold more copies. But I don’t think I’d have been able to turn it into the start of a career without meeting the people I met, and learning the things I learned working at an already successful company in the industry.

I’m not sure that I can comfortably recommend working on a game in evenings and weekends for years on end. It’s a little like long-term crunch and has all the same negative health and social life effects, but at least it’s you who gets the benefit of the work, not your boss! If you’re someone with no experience who is desperate to dive into indie game development, I feel I can more comfortably recommend working at a small game studio for a while to learn how the industry works, if you can, before staking your livelihood on it.

Sharing early work

Keeping the same side-project for 8 years is pretty tough. Sharing early screenshots and keeping a blog definitely helped with staying motivated, but it can be a bit of a double-edged sword. It’s common indie folk wisdom to show your work off constantly, and as early as possible, but there are two important caveats that you’re never told:

  1. You only get one first impression
  2. Google Images never forgets

Make sure your game looks good and polished before you show it to the Internet! I can’t count the number of times an embarrassingly old screenshot has shown up in an article about the game.

And hello to you too, 2012!

In 2014, I launched a paid public alpha for Lenna’s Inception on itch.io. While it wasn’t a complete disaster, and I received no complaints about it, I do regret this. Getting feedback from people playing (and enjoying) the game did help with the motivation to keep going, and the bug reports definitely helped, but I honestly feel bad that my players had to suffer an unfinished game for so long. A buggy alpha gives bad first impressions.

Although this wasn’t a problem with Lenna’s Inception, I know from several other projects I’ve had hands in that players can sometimes object to changes necessitated in the course of a game’s development. So my advice to other indies is not to do any kind of early access unless you literally have no other option.

Have a plan!

This is probably the number two reason the game took so long to finish. I can’t find many of my notes from back in 2012. I definitely didn’t have a design doc or a script. The nearest thing I can find to a design can be more accurately described as a shopping list of features that would be cool in a game. This is not how games are designed.

While it’s true that design docs have been becoming unpopular among game developers for a long time now, if you’re an indie you probably have a very small budget, which means it’s even more important to spend time and money on only the things that will matter. You can do that if you know what the end product will look like, not if you’re just working on whatever seems coolest next.

This is going beyond the scope of the post a bit, but for Cassette Beasts, after some initial concepting and prototyping, we designed and planned out everything before committing our savings and starting production. That meant writing a design document (just for us, not for anyone else!) so we knew what the end product would look like, then breaking that down into each task, estimating each task, and figuring out a schedule that will get everything done. This doesn’t mean we’re committed to the design we wrote up at the start of development (which is why devs say they hate design docs), or to a particular date, it’s just so we know when we’re changing the design and can see how it affects our schedule, our release date, and ultimately our cashflow.

In the case of Lenna’s Inception, since the design resembled an already existing game, the biggest problems caused by the lack of a plan affected the story. The script ended up going through several major rewrites. Each time it required content in the game to be pulled out and replaced, because like a dummy I was putting it into the game before I had a complete story I was happy with. This cost probably 2 years.

The advice I would give to indies new to writing dialogue would be to first figure out what you want to say with your game–what is the message going to be, what are the themes? Then figure out your characters, and how those characters relate to one another. Only when you have your message, themes, and characters can you start to think about a plot and write your dialogue.

While on the subject of the story, I’d also say avoid doing parody. Not everyone is familiar with the tropes you’re making fun of, and in any case it’s too easily mistaken for imitation. The story in Lenna’s Inception might be quite different from the Legend of Zelda, but it still has to spend time at the beginning establishing the tropes that it plays with later on. Some people just play the beginning and think that’s it.

One of the big selling points for Lenna’s Inception was, by release, the presence of “two art styles”. This wasn’t originally intended for the project! For the first several years of development, I was drawing the Game Boy-inspired 8-Bit pixel art myself. In the first playable version of the game on itch.io, this was how the game looked. When Jay joined the project, his proposition was redrawing all of the existing assets in a second “Game Boy Advance” inspired art style that look more modern and therefore be more commercially viable in the indie market of 2015. The player would then be able to choose which art style they preferred, and it could be a marketing gimmick.

Unsurprisingly, this turned out to be more work than expected. The game wasn’t close to feature complete at that point, so the amount of art to redraw increased at around the same pace it was being drawn. In some later additions, such as several boss designs, Jay drew the initial design and I instead drew the 8-bit variant based on his sprites.

Our composer Joel joined the project at a late stage (around the middle of 2019) to produce a soundtrack. To match the dual art styles of the game, each music track in the game has a “32-bit” or “8-bit” version. Despite joining with 6 or so months left to release, Joel managed to produce 26 compositions each with a 32-bit and 8-bit variant, leaving us over 50 tracks in the final game. I feel like much of Lenna’s Inception’s final “identity” is tied to its soundtrack now.

Ultimately, the “dual art style” aspect of Lenna’s Inception is something I probably wouldn’t want to attempt again. Not only was it twice the work to actually draw the assets, but it also affected how art would be implemented, or what could or could not be done with the game’s graphics. If it was planned from the start it could have been a feature incorporated into the gameplay itself (something multiple games have done in the past several years) then it might have been a worthwhile endeavour. Cassette Beasts, unsurprisingly, will feature one set of art assets.

On engines and programmers

Don’t do what I did and roll your own engine in Java. I feel embarrassed about it, honestly.

This has made porting Lenna’s Inception to consoles all but impossible, and if you’re an indie game dev in 2020/2021, getting your game on consoles is absolutely vital to your success!

OK, putting aside the choice of language, there are sometimes times to make your own engine. But absolutely not if you’re new to game development, if you want to make a game, or if you like your sanity. Not even if you’re a hotshot genius programmer. I’ve been programming almost as long as I’ve been able to talk, I have a degree in Computer Science from the top university in the UK (Cambridge, not Oxford!), and I worked for years on compiler backends and optimisations–clever stuff, but I still made every damn mistake imaginable. Nobody’s intellect compares to the collective hive mind of the games industry, to knowledge earned through decades of thousands of developers making mistakes and then doing better next time. Stuff like that you can only learn by using tools made by the wise.

In any case, programmers are the absolute worst people to design game engines. We overestimate the importance of “hard” technical problems and underestimate the importance of the “soft” non-technical problems (design, art, business, etc.). I think we do this because we like to imagine the only important problems are the ones that have solutions, and thus we can control our own destinies / successes. The reality is that the stuff that really matters can’t be quantified–sometimes all you can do is feel out the options and make an intuitive judgement. Nobody cares that your engine can render two extra polygons each frame, if your gameplay sucks because the engine didn’t give the designers the flexibility to make things feel better!

Programmers are also prone to ideological dedication to 3-letter acronyms (FSM, MVC, ECS, OOP, etc.). TLAs give you ways to simplify complex problems to invocations of said acronyms. It can be several years before you realise that your chosen acronym simplifies the problems, not the solutions, and by that time your framework has turned into a metal cage and you’re trapped inside! Aaaarghh!

Seriously though, if you end up working in a team, most of your engine’s users will not be programmers anyway. So it’s pretty important that they’re able to understand and use it. If your engine or build system presumes knowledge of the arcane, it’s a bust.

The one upside that came out of this mess of an engine was that while messing around with JVM languages (Scala in particular) I realised delimited continuations can be used to do everything behavior trees do in a way that is far more natural and flexible. I ended up using this to control cutscenes and monster behaviors once I knew finite state machines wouldn’t cut it. Coroutine combinators don’t seem to be in wide use in the industry (as far as I know only myself and one other seem to have used them for this), so it would make a good topic for a blog post another time.

I use Godot for projects now. It’s open source, so I still have the flexibility to modify it myself, but it’s made by people much smarter and more knowledgeable than me, so I rarely need to.

How did the release go?

It went about how we expected! To date, just over 6800 copies on itch.io and Steam (excluding sales from the itch.io Bundle for Racial Justice and Equality). That doesn’t sound like a whole lot, but it is above average for an indie game these days. Mike Rose of No More Robots puts the average number of copies sold (in 2019) at just 1500.

6800 copies works out to less than the UK’s minimum wage per estimated hour worked, so I do feel my decision to work only part-time was justified.

There were some pleasant surprises too: 88% of Steam reviews were positive! I think because I’d been working on it so long I began to hate it, and assumed everyone else would too.

Also of note is that 5% of copies were bought by Linux users, which is a lot more than the average for games on Steam. I think this comes down to several factors:

  1. The low number of total copies sold means that not many extra Linux users in absolute terms have to find the game to push the relative-terms figure up.
  2. Actually reaching out to Linux-specific gaming press and treating Linux as a first-class platform. I do think that indies have yet to really figure out how to market to Linux gamers, who often get ignored or lied to by larger studios. There are more than enough Linux gamers out there to make your indie game a success; the difficulty, as with all platforms, is in reaching them. The difference is that nobody seems to be marketing specifically to Linux gamers. The first to actually succeed at this could maybe double their sales figures or more.

I did all the coding for Lenna’s Inception on Linux (I like a good terminal), so officially supporting the platform has been almost free. Linux gamers are also very good at fixing your bugs for you!

The figure for Mac was a lot lower: .8%. Most likely because we dropped official Mac support prior to release because continuing to support it became a huge burden.

22% of purchases happened on itch.io rather than Steam (not including even the Bundle for Racial Justice and Equality). I think this is several factors again:

  1. The earlier paid public alpha in 2014 may have been better timed than the eventual release in 2020. There are a lot more indie games releasing every day in 2020/2021!
  2. People underestimate itch.io. Steam might have a larger overall audience, but only a fraction of Steam users are actively looking for indie games, while almost everyone on itch.io is! Itch.io also has better curation, etc.

If you’re considering putting your indie game on itch.io, just do it. It takes almost no time to set up a page. Pushing updates is as simple as using a web form. Or if you like to automate deployment, it has an upload tool called butler that is far superior to any other store’s.

We saw a lot of interest from Germany, France and Japan. If the strings were actually in a different damn file and we could localise the game we might have been able to get a factor of two improvement on sales figures. Oops!

A few interesting things happened several months after release. Here’s our units sold graph from Steam over the course of 2020 (itch.io is similar, but with lower numbers):

I’ve marked on this graph in yellow where we saw a significant jump in sales, and in red the major events.

The first major event was obviously its release. We saw about a third of our first year sales in the first week, in January 2020.

The 11th of May was when we announced our new game Cassette Beasts. The trailer we dropped saw 110k views over Youtube and Twitter, so it’s maybe not so surprising a few people would check out our other game in the weeks following, even though it’s in a totally different genre.

In June we put Lenna’s Inception into the itch.io Bundle for Racial Justice and Equality. This was a bundle offered during the 2020 Black Lives Matter protests where all proceeds were donated to the NAACP Legal Defense and Community Bail Funds. Developers got none of the revenue from the bundle, and we knew this was going to be a popular one, so we expected this to wipe out our future sales. Even so, Jay and I felt strongly about using the game for a good cause, so we went ahead. 814,525 people bought this bundle and now have Lenna’s Inception in their library.

In the weeks following the bundle we experienced effectively a second launch week. The complete opposite of what we expected! Given the time delay between the end of the bundle and the start of that big week I suspect (without evidence) that it’s mostly attributable to one or two large streamers and the word-of-mouth that followed. A lot of streamers and youtubers were playing the bundle’s games during that period, and Lenna’s Inception was lucky enough to be fairly visible, high up on the list.

Streamers picking up and raving about the game might have been a more common occurrence if they could actually stream the game. For some reason, OBS and Discord like to turn the game into a slideshow, or just straight-up crash! I think this may be because the engine is unusual (Discord at least is injecting itself into the game’s memory space, not just recording video output), but since the issue is in someone else’s code I literally can’t do anything about it.

One thing that did work well with the streamers who could play it was remotely messing with their games, live on stream. Prior to release, I set up a way for the game to check with a server for dialogue files written for a specific seed. That way if we spot someone streaming the game, we can take the seed, write some dialogue uniquely tailored for that streamer, and have it played back on the stream minutes later. Like live coding, it’s a bit of a high-risk high-reward strategy, because any bug could crash the game in front of thousands of people. But based on the reactions it seems to have gone down well!

https://twitter.com/TheNo1Alex/status/1217835488817512449

We released a big content update at the end of August, which did nothing to our sales. It perhaps might have if it had been sooner. But I could also theorise that word of mouth is more effective the bigger your audience is, and that therefore if your audience is small you’ll get more word of mouth by courting other, larger audiences–the set of people interested in Cassette Beasts, for instance.

The most surprising thing one year after release is that the community is still active! For this I thank the speedrunners–shout outs to PetePlaysTheGames, Soocy, Linkshot, QuantumZari and everyone else! I’m sorry I can’t name you all here! I understand that there are in fact some streams planned for the one year anniversary today, so do check out our Discord community or the #LennasInception hashtag for the links!

Lenna’s Inception seems to be an interesting one for speedrunning. The procedural generation means that to get a better time you can either try to improve your run on a fixed seed, or you can try to search for a better seed that makes the critical path shorter, which refreshes things whenever a new seed is found. It’s similar in some ways to the Link to the Past Randomizer, which came out in 2016. I’m still not sure whether ALTTPR’s earlier release has helped or hurt our game, but I would assume it has overall helped in a small way by having already created interest in this sort of thing.

Once we realised there was interest in speedrunning we did a few things to support the growing community:

  1. Based on community feedback, we added an in-game timer that counts frames, so that your time is unaffected by what hardware you use, low framerates, etc.
  2. Leaving their preferred skips and sequence breaks in the game. Some devs remove them and I don’t know why. Games and speedrunning are both ultimately about having fun. If a skip is fun to use what’s the problem?
  3. Responding quickly to things they’d like fixed.

Conclusion

Lenna’s Inception wasn’t a commercial success, but it was extremely valuable in terms of gaining experience and making inroads to the industry. Treating it as a part-time job kept me financially secure while I networked, made friends, and learned a ton (often the hard way).

I have a few personal thoughts on the game itself. In terms of design and gameplay, I feel like procedural generation held it back more than anything, although it did gel pretty nicely with the multiple endings. The world being different makes it less annoying when you play it a second time to reach another story branch. In the story, the parts I’m most proud of are the (too few and far between) heartfelt and earnest character-driven moments. No wait, I mean the puns.

If I’m to give some final, random and unsorted advice to new indies:

  1. Set your expectations low, and don’t quit your dayjob.
  2. Marketing is important, and it starts right at the beginning, long before any publisher is involved. By this, I mean that market research should be a major factor of any commercial game’s concept phase. Pick an underserved target audience, and scope your game so that you can release before the market changes and the opportunity is gone. That means choosing a release window, which also requires:
  3. Have a plan, know what your finished game will look like, and when it will be done. Even if you don’t tell anyone else!
  4. Make sure your game looks good before sharing screenshots and videos, and finish your damn game before you sell it.
  5. If you’re a programmer, know that game development is harder than any other software development. I don’t care if you’re Linus Torvalds, Bjarne Stroustrup, or Satoshi effing Nakamoto–if you’re new to games, don’t make your own engine! At least take the time to learn what other engine developers have learned first.
  6. Don’t sleep on Linux, itch.io, consoles or localisation. They’re important!
  7. Do a press release when you announce a game, when you announce a release date, and when you release. It’ll take a day or two each time but it more than pays for itself.
  8. Take part in charity bundles. The exchange rate on karma to money is apparently pretty decent?

If you read this far in the hopes of earning some prize, let me just remind you that Lenna’s Inception is currently 50% off (edit: no longer)! Be sure to check out our other game Cassette Beasts and wishlist that too! And join our Discord community for both games!

Will Lenna return some day? Wait and see!