Ever Tried to Herd Cats? — How I Have Created and Published My First Game
In October 2017 I have released my first, completely self-designed, programmed and published computer game called Cats Make You Smarter! on the App Store, the Google Play Store and on Steam, so I’m taking the opportunity to review this very interesting adventure now.
Let’s Go… But Where?
During the last few years I’ve read stories about self-published mobile games becoming life changing experiences for their creators, generating miraculous revenues and maybe even granting immortality. So, I have eventually decided to jump on the bandwagon to try my luck with game development.
I didn’t have any specific game idea, nor did I have any clue about the available frameworks or technologies — I just wanted to see if I could create a mobile game at all. I have been a professional web developer for many years so I had experience in programming but I haven’t yet built anything for the desktop or mobile platforms. As for the not-so technical aspects of this endeavour I wrote and had published a complete cyberpunk pen-and-paper role playing game back in the 1990s but beyond that I haven’t got any more experince in designing games.
Since I only knew that “mobile” is the fountainhead of success, first I needed to find the technology to use, after all, learning new programming languages and frameworks will surely help me understand the possible scope, the complexity of a game that I should be able to complete on my own.
Why NOT Unity?
As I did not have any deadline to meet (I haven’t left my daily job), by being completely free to experiment my investigations lead me to Unity and learned that it’s a cross-platform system that can be used for free by agreeing to display a splash screen. Splendid, thought I, and spent a few months experimenting with this game engine and completed a couple of its tutorials, learning the core concepts of coding computer games as well.
My primary target hardware was my Nexus 5 Android phone which, at that time, was a sufficiently advanced phone, and my ancient iPad2, and later on also purchased an iPod Touch. To my surprise, even a very simple test application that only rotated an image has caused my Nexus to get noticably warm quickly. I figured it was because Unity had to manage a complete 3D environment all the time, and since I definitely wasn’t going to start with such a complex game that required 3D, I looked for alternatives.
While listening to a Roguelike Radio podcast a game called Hoplite was mentioned. I’ve downloaded it to see if it also causes a fever in my Nexus. But it was working beautifully. Its credits page said that the game was developed in Java using the LibGDX framework which is nothing like Unity, but thanks to YouTube tutorial creators like Brent Aureli, Dermetfan and Conner Anderson I have managed to pick up the basics of LibGDX and was ready to figure out the nature of my first game itself.
Ever Tried to Herd Cats?
A very good friend of mine, Győző Dudás is an exceptionally talented artist who specializes in funny comics. Once he had a hobby project on Facebook: he’s drawn a funny cat every day for months just to entertain his friends and acquaintances. There were lots of cats, and I realized that a memory matching game genre is ideal for a first project. With my friend’s kind permission I’ve picked 50 of his drawings and began to think about the next steps.
Well, I have learned it the hard way that creating a game is — surprise! — a very complex procedure, even if it’s “just” a memory matching game. It’s not just programming at all! A game has a lot of things that need to be precisely defined and working in harmony, such as game rules, various screens of menus and info gadgets (e.g. HUD elements like score or remaining time), animations, streaming music, sound effects, logic to handle the game’s presentation, timers, orchestrating asynchronous events, and of course the game had to be somehow displayed on almost any mobile device (with various screen sizes, orientations and aspect ratios) and had to accept input from the player.
While initially I had hoped to finish during the spring of 2017, it took a lot more time than that. The hardest part was probably figuring out what makes a game fun, but it was also very challenging to avoid feature creep, to decide which ideas to keep and which ones to discard.
I’ll talk about the game a bit later — first I’d like to take a look at the technology I’ve used.
Choosing LibGDX
Working with LibGDX is great. It’s just you and the code editor. It feels like developing a serious application, and it takes a lot of time — not just because it’s primarily Java, a notoriously verbose language, but since there’s no GUI, any idea you have must be properly implemented before you discover that it wasn’t a great idea at all. Documentation was occasionally too technical for me so I had to stop and do extra research, and it felt outdated and incomplete occasionally. I’m definitely not complaining though, just stating the obvious: it’s much more fun to write code than the documentation — and especially keeping documentation up to date surely feels like a chore rather than a creative process. Without dedicated technical writers it’s very hard for a developer to write a manual that’s easily digestible and thorough. On the other hand, as with the best open source projects, community help is very good and I’ve often consulted the official LibGDX message board and received efficient guidance for my problems.
I’m not going to use LibGDX for my next game though. Why? Even the development of a boring menu screen took me days, because I didn’t have a clear picture in mind about what I wanted to see or have it do, so I had to experiment a lot. When you need to code everything by hand, your imagination is bound by things like language syntax and resource management. Even though code refactoring is a breeze in Java with a good IDE like Android Studio, tinkering is much faster with some visual editor like Unity or Godot, and if you’re not working on some cutting-edge eye candy game, the performance of these or similar game engines is most likely more than enough.
However, I definitely do not regret choosing LibGDX for my first game. Yes, it was a lot of work, but this way I was forced to familiarize myself with structural and programmatical concepts of game development, and have actually seen those patterns emerging that I have read and heard about earlier from books like Clean Code or Game Programming Patterns.
Java Peculiarities
It’s very important to test on every device and platform, as often as possible, regularly avoiding the “happy path” and trying to voluntarily “torture” the game to find its weaknesses. It does happen during development that everything is working perfectly — except on a single device under certain conditions. Testing all the time, everywhere can help you catch lurking errors which could cause issues later on and make you pull out all your hair before hiding in a corner and crying yourself to sleep in dispair. (It never happened.)
Let me just mention two cases that, on the other hand, did happen to me.
The game was working well on desktop, but as I deployed it to my Android device, it crashed. It turned out that on the device I had Java 7, and on the PC I had Java 8. The language’s developers have decided that something as basic as splitting a string to an array should be changed between these versions. Easy to fix — once you know about it.
The other mystery was uncovered after the game had been published. It was reported on Steam that two achievements were unlockable for certain 2 players, but nobody else had any issues with achievements, so I was truly puzzled. I’d like to mention here it’s hard to receive meaningful error report from end-users, since they don’t care about the countless things a developer needs to know before they can even start investigating and trying to reproduce the error — of course gamers only want to play, and rightfully so. It was almost just pure luck that I’ve found the problem and fixed it in an hour. I’ve noticed that both players were unable to unlock the same achievements. Both achievements’ technical identifiers had an “i” character while other achievement identifiers did not. Because — being a rookie publisher — I have accidentally defined achievements on Steam with uppercased identifiers but had these values all lowercase in my code, I simply used the String.toUpperCase
method to convert them. I knew that one of the players were from Turkey, and I knew it just by random luck that in the Turkish alphabet the uppercase “i” is not “I” as you’d expect, but it retains its dot: “İ” (the dotless I is a separate Turkish letter which also lacks the dot in the lowercase form). I have suspected both players had Turkish Windows, and thus my game was probably trying to unlock invalid achievements for some reason. I didn’t know then, but have learned since, that in Java the toUpperCase
method takes an optional Locale argument, without which it uses the default locale setting, which, for my two players was Turkish. The solution was to pass the Locale.ROOT
constant to the method which have fixed this issue, but of course the most important lesson here is that you shouldn’t do any kind of “wizardry” anywhere, because it will bite you later.
Learning Curve as a Dev, and as a Game Designer
Completing a game to the point that it could be published in stores teaches much more than one would imagine. I encourage everyone who entertains the idea of developing games by following tutorials to don’t stop where the tutorial ends. Continue working on your game by adding menu screens, help pages, game tutorials, and look into integrating 3rd party services like leaderboards, achievements, advertisements or in-app purchases, because it’s not always trivial to add such features to your game, moreover, being aware of these things definitely help you make the right architectural decisions while working on the code.
On the design aspect, especially if you’re a “one man army”, you must be able to answer to yourself: what makes your game fun. There are lots of research on this subject alone, but be sure to study the works of Raph Koster and read Level Up! by Scott Rogers and check out speakers like Rami Ismail and keep your finger on the industry’s pulse by following GameFromScratch.
Don’t be surprised to learn that games are seldom “done” when you think they’re done. Ideas never stop emerging, even after the game has been shipped. Actually, a reviewer on Steam — the first negative review — had a small misunderstanding regarding a game mode, which made me really want to implement the thing he/she was describing, but if I yielded to the temptation I would have never been able to move on to my next game project.
About the Game
Cats Make You Smarter! is a memory matching game. You get some tiles laid out for you, you flip over 2 at a time to see its face depicting a cartoon cat. The tiles are then flipped back and you continue flipping up tiles until both tiles show the same cat. Once all cats are found a new, larger board of tiles commences.
To add some flavor, depending on the difficulty level 2, 3, 4 or 5 tiles can be flipped, and there are also 5 game modes, each building on the same idea with some twists.
Sometimes cats have a Patience point which decreases each time its tile is flipped. Once a cat loses its Patience, becomes annoyed and when it’s flipped back it will push the row or column of tiles in a random direction making it harder for you to remember identified cats’ positions. Sometimes a single pair (or triplet, quadruplet, etc.) of cats are chosen to be the “Monster” which has 0 Patience and can only be matched only after all other cats have been matched. An interesting game mode — that was invented during debugging — shows all the cats but there’s an extreme time limit, so it almost becomes an action game. And of course, as a tribute to the Austin Powers and Godfather movies we have vengeful psychedelic cats whose chaotic ways should be experienced really (by the way the game is free, with no ads or any kind of trickery).
More information can be found about the individual cats if you tap/click on their uncovered tiles. I’ve spent a substantial time naming and finding fitting quotes for the cats, but it was certainly worth it.
I’m fully aware that a bunch of other features and ideas could have been added, but it was a project for learning, and the objective — shipping a complete game — has actually been achieved, so I’m quite happy about it.
Choosing a Business Model
Yep, I knew I haven’t created a revolutionary, exceptionally good game. It is nice, sure, and I have tested it a lot on various devices, but to tell the truth I was getting somewhat bored by playing it for the zillionth time so I wanted to finish it. After some hesitation the decision was made: it should be completely free, and because I despise ads in games I will not put in any, and to reduce complexity I will not even use in-app purchase. Even though for this project I have spent a considerable amount of money on self-education, on hardware, software, licenses, fees and resources like sound effects, I will accept these as investments in myself. Another aspect of publishing a free game is not having to deal with taxes which is a nice thing unless your revenue justifies the effort.
Marketing? What Marketing?
Designing and coding a game is probably only half of the big picture. Truly. People need to know about your game, and they need to be able to get it somehow too.
Informing and enabling people is what’s behind the loathed word: “marketing.”
For my project I had to learn to create a video trailer: both the structure/considerations and the required technology.
I had to create and upload a support web page to my own website, and also had to set up similar content for all the platforms I was about to publish the game to. For these shop pages I had to write descriptions and feature lists, and create graphics assets in more resolutions and aspect ratios than I could recall.
At this point I should have began contacting magazines and YouTube and Twitch channels convincing them to promote my game, but I have simply forgotten about it — which was no doubt a severe oversight, but at that point I really was mentally exhausted by the months of hard work and wanted to take a break.
Publishing to Platforms
When I thought the game was ready and I couldn’t find any more bugs, it was time to move ahead and publish it on the platforms I wanted to target: Apple Store, Google Play Store and Steam.
I’d like to remind you that I haven’t done anything like this before, so take the following as a newbie’s experiences.
iOS, Apple Store
It was an unpleasant experience. Even enrolling as developer wasn’t easy. I couldn’t get past the last registration form but received no error message. After a few days Apple Support has somehow realized I had my phone number wrong on the form — but I was receiving SMS for the 2-step auth (which has happened way too often) so they had my correct number somewhere —, but even then, why didn’t their page display an error message at all?
Then, I was unable to deploy the game on a physical device with the command line Gradle (a build process LibGDX uses). With some struggle I have managed to generate an .ipa
, but I didn’t know how to upload it to my device. Then, I was unable to figure out how to tell Gradle which dev id and provisioning profile it should be using. Eventually I have discovered that Android Studio had all the necessary commands in the menu, right from the start, but this wasn’t mentioned in any documentation or guide (and I assumed everything should be done via Gradle in the terminal, because a process like preparing for releasing the game has to be painful :).
Then, after uploading the .ipa
(on the “n"th attempt) a rejection email has arrived not 1 minute later. I had to re-create all the app icons, because Apple have decided to change its requirements during the time I was busy with developing my game, so a different set of icons and splash screens had to be created. Thankfully, the solution was already waiting for me as a LibGDX pull request, so since LibGDX 1.9.7 the framework should be up to date again, at least for the time being.
I have submitted the final version around midnight. The next morning at 6:30 an email has announced that my game was published on the App Store.
I felt perplexed. I have reached a milestone, I have achieved something utterly new: I have published my first game. But I still had to do it for Android and also for Steam.
Android, Google Play
A piece of cake. Best experience, hands down. The fact that becoming a registered developer only requires a one-time fee of 35 USD makes it extremely accessible to even the poorest developers. No wonder the Play Store is so popular — which isn’t as good a thing as it may sound at first. It’s so saturated now that it’s very-very hard to get attention. Still, in case you are targeting the mobile platform and/or your game has touchscreen support, there isn’t probably any reason to avoid the Android platform.
Windows, Steam
Registering as a Steam developer required me to complete a questionnaire and to send a photograph of my passport. The verification only took about 2 days, and soon I could log in to the Steam developer website and started learning about the publishing process. The technical documentation and the web interface felt seriously outdated, but I have seen mentions of a new, modern system coming up, so I hope when my next game is ready I won’t have to retrace my steps in this labyrinth.
To keep complexity to a manageable level I have decided to only support Windows, even though I own a Mac too, and I could have created a dual-boot for Linux or used an old laptop for compiling an executable — but I felt it would have been too much for me at that time. Supporting a single operating system can be tricky enough, since as I’ve mentioned, getting technical feedback from players isn’t exactly easy.
When I have uploaded my first build to Steam, it was rejected because the achievements weren’t configured properly, but the message also mentioned a possible issue with a failed virus check. Another unexpected, unpleasant surpise. I was fairly sure my development environment was clean, so what should I check? Luckily, the Steamworks4j developer was amazingly helpful and assured me that it’s most likely a false alarm, which it was. Still, all the LibGDX games I have tested were caught “pants down” by virustotal.com, and it wasn’t even Packr’s fault (Packr is a tool which packages a Java game so it could be installed without requiring the player having to do anything else), since Launch4j (another tool for packaging a Java application) has also produced an executable which was flagged too. This is another reason for me to try a different game engine/framework.
Uploading achievements was the trickiest part, especially because of the confusing and outdated Steam UI.
Impressions After Releases
Several months have passed since I’ve shipped my first game, and it has been most interesting to keep an eye on any news, user reviews and feedback on all three platforms.
Apple Store
No visible reviews. Under 100 downloads. Crickets.
Google Play
11 star ratings (all 5s), 3 reviews (from people I know personally, but I think they were honest), about 100 downloads. Also pretty hopeless.
Steam
Wow. There’s life here! Hundreds of downloads in the first day. The game has received player feedback, has an active players’ community, and someone has even written a guide for unlocking the achievements the very same day the game was released. I’ve also seen YouTube reviews… Absolutely impressive!
To be honest I should mention here that the Steam version offers 50 achievements (unlocked for each cat when their pause/profile screen is first seen), because I was curious about the achievement system, so perhaps this alone could explain why there was much better reception at Steam as opposed to the mobile platforms.
While mobile platforms seem to be completely dead after a few days, the Steam install counter continues to rise. After a few months people are still downloading and playing the game, there are still new reviews coming in (currently 54 of which only 5 is negative, so the actual opinion is “very positive”) and there isn’t any sign of declining interest which suggests Steam is probably a good place to publish games, despite the alarmingly increasing number of shovelware crap getting published there after they’ve changed their business model and opened the flood gates.
Beware of Scammers
Just a quick note: what you might have heard about dishonest people on the internet is true. Even though my game is and has always been completely free, I have received numerous emails from various “famous people” asking for Steam keys and messages from “prestigious” publishing/marketing firms noticing my success and offering to enhance it further.
What’s next?
I’m, of course, already working on a new game. I’m experimenting with several game engines, and the new idea is an ambitious adventure/word puzzle game which has a couple of rather interesting features so I’m hoping it will be well received in the near future.
Currently I don’t think I should focus on mobile, unless I can perform some miracle on the marketing/promoting front which isn’t too likely as I’m not even a novice in those fields.
Prototyping is very important, especially creating prototypes in different languages and frameworks. This way it’s guaranteed that you cannot just evolve a prototype, full of hacks and ugly tweaks, to become the final game. For Cats Make You Smarter! I’ve written proof of concepts in Python and plain Java, and for my new game project I’ve built several prototypes using the Vue.js framework as frontend and Express or Buffalo as backend, and more complex tests using Godot Engine and Unity. Yes, it’s a lot of work, but not being bound by the characteristics of a specific language or tool allows my imagination to work on the game instead of its implementation: I should see the game with my mind’s eye first, and only then should I start thinking about its technical details.