Hi, Habr! I want this post to replenish the piggy bank of unarmed indie games, look back and look at my shoals. Already more than a year has passed since the release of my second game for Android. After the Christmas sale, I finally decided to stop developing and supporting this game, which means it's time to take stock of the past year. Under the cut, I will share the statistics of the game, financial results and my view on the causes of the incident.
Idea
Until Kakuro, I long and hard in my spare time sawed the game Balda . For a year I was fed up with this monotony, advertising income was getting closer to zero, so it was decided to finally overcome laziness and take on something new. And this time, it is desirable to write this new on the game engine. Given the past experience, I decided to make a puzzle again. After a leisurely study of the category Logic puzzles in Wikipedia, I finally got to the letter K and the game Kakuro . The game seemed to me wonderful, similar to sudoku (how wrong I was) and what was more important - the existing implementations on Google Play were bad. Another point “for” was that each mobile analytics report contained information about Japan and incredible ARPU in the Japanese market. What else to write, if not a game with Japanese roots, which Japanese users must be interested in? In general, I decided to stop at Kakuro.
Levels
The most frequent complaint in the comments to existing Kakuro was a complaint about several level solutions (and according to the rules it should be only one). Most likely this was due to the fact that the levels were generated on the fly. In order to be better than competitors, I decided to use pre-prepared levels, which I would check for the uniqueness of the solution. ')
After a long search on the Internet, I found a bunch of PDF files with ready-made levels (1800 pieces) with field sizes from 5 x 5 to 15 x 15. Using Apache, PDFBox wrote a utility that pulls levels out of these PDF files. Now it was necessary to check how many solutions each level had. To do this, I had to write another utility that solved all these levels and kept the right decisions. Unfortunately, the algorithms are not my thing, so I won’t tell you much here. All I can say is that the program really solved the levels (and did it quickly, after numerous optimizations) and I was sure that each of the 14,000 levels really had only one solution and I knew it. I started with a complete brute force, and I finished (I have such a suspicion) the method of branches and borders.
It remains to be determined in which format to store these levels, since they turned out to be more than 14,000, and the size of the application did not want to be inflated. I didn’t want to reinvent the wheel and build my own binary format for this (although I finally came to this), so after a lot of experiments with different formats I stopped at Google Protocol Buffers . During serialization, each level had an acceptable size (all 14,000 levels weighed 10.5 megabytes) and deserialization occurred quickly. All levels were, of course, combined into one file (since packaging 14,000 files in the APK each time is a little expensive) and an additional manifest file was created in which the offsets of each level relative to the beginning of the file and the size of the level were written. .
But the resulting pack of levels is still very well compressed zip-ohm to 3.4 megabytes. I aimed at supporting Android 2.2, which means using a compressed resource of more than 1 megabyte in the application will not work and you will have to archive / unzip the pack with levels yourself. Each time I didn’t want to go to the archive to download the level, so I decided to keep the unpacked file in memory for quick access to it. Dalvik heap, unfortunately, is not rubber (on my old Galaxy S only 24 megabytes), so I just in case decided to do some kind of off-heap storage. Moreover, after the tests, it turned out that unpacking the archive with levels can be done faster with the help of NDK. So it turned out that I began to unpack the levels at the NDK level using libzip (while I still could not write the game for Android without using the NDK) and load the pack levels into the native memory. In general, something happened like this:
During the game, the java-code jerks the native method through JNI, passes it an offset from the beginning of the file and the size of the level, and as a result receives an array of bytes, which is subsequently deserialized through google protobuf.
Design
So, after all this, I had two packs of grass, 75 ampoules of mescaline 14 thousand levels and libkakuro.so, loading all these levels. This has already taken several months, since I did it in my spare time.
But it didn't look like a game at all, so I decided to write a small prototype:
The prototype was completely working and it was already possible to play. If at this stage I would give someone to play this prototype, I would save a lot of time, but, unfortunately, the story does not know the subjunctive mood. And I started to write TK and search for a designer.
I placed an order on several exchanges, Russian and not so much, but it so happened that the Serbian design studio responded to it. For all 6 screens, they requested $ 600, which basically fit into my understanding of the development budget. I had no idea what the future game should look like, so the designer was given a blank check. However, after the first drawn screen, suddenly this vision came to me and I completely redid the TK. After successful and not very good attempts to explain, in words and in pictures, my fantasies on how the background should look and what will be turned, the designer set about further work. Three weeks later, such metamorphosis occurred (the video was already finished, the link to Google Play was removed from the description):
According to my idea, the background texture with the buildings should have rotated when switching between screens. I tried to insert the resulting texture with a resolution of 1000 x 1000 pixels in the ImageView and rotate it through RotateAnimation. On my Galaxy S, it gave out about 5-7 FPS, so I began searching for the engine. I was searching, in principle, not for long and stopped at AndEngine . Much has been written about him, so I will not say anything new. Of the advantages, I note the low threshold of entry, of the minuses - low performance, poor optimization and battery power. Users can forgive such a game of Asphalt 8 and GTA, but not a simple logical puzzle.
But the engine completely coped with its task. The game gave out more or less stable 55 FPS, although sometimes I stumbled over GC. Therefore, I decided to conduct further development on AndEngine and sat down to cut PSD files and write code. After 3 months the game was ready.
Publisher Search
Everyone already knows that without a publisher there can be no successful game. At least, such an opinion they are aggressively and impose. Before that, of course, I had never worked with publishers, so I really wanted to try to do everything seriously. Three of the 15 publishers answered me, and it seems to me that this was still a very good result. Each publisher, as a rule, has its own specialization in genres (casual games or arcades), so they will only publish games of this genre. There was little point in writing to everyone.
With two out of three, my communication ended after the question " Is the game free to play? ". It is quite natural that publishers want to work only with f2p games, because according to the latest report from Distimo, it is clear that 98% of Top Grossing applications use just such a monetization model.
Somehow it happened that all this time I was postponing monetization “for later” and as a result I had a ready game and a vague idea of ​​how I should monetize it. I was counting on the help of the publisher in this difficult choice. For some reason, one of the publishers ( wizQ Interactive ) did not ignore my letters, offered several solutions for monetization, and even agreed to publish my game in the Japanese market, but only after the new year. Since the calendar was still only November, I decided to release the game myself on my own at the same time collecting statistics.
In monetization, I decided to stop at freemium - to make the game free, but only levels 5 x 5 in size will be available. The remaining levels cost 99 cents and are unlocked through in-app purchase. This version of the game saw the light of November 17, 2013.
First pancake
After the first few days and a couple of hundred installations, it turned out that users are not at all eager to buy additional levels. The first purchase at $ 0.99 came only on the third day and it was obviously a complete failure. This is how the initial conversion values ​​of 0.5% and ARPPU of 66 cents were obtained. So I understood two things: first, not any monetization model can fit the game; and secondly, it is necessary to think about monetization before the game is finally ready.
The only solution that I had left was to make harakiri pivot and change the monetization model. I decided to divide the application into 2 versions - free, with locked levels, and paid, in which all versions will be available. The paid version was released on December 12th and from that time on Google Play I got another application more. I set the price at $ 2.99, since the game is clearly not for the mass user and I did not count on a large number of installations. After this separation, at a price of $ 2.99, the conversion turned out to be about 3%, which is more interesting.
Promotion
To begin with, a symbolic $ 100 on the AdMob was thrown, which gave 10 installations and a CPI of $ 10. After that, I no longer look towards AdMob. I am not sure whether it has deteriorated so badly, or whether I, but a year before that, I had a CPI of $ 0.5. After that, I decided to post a description of the game on the thematic forums. After a dozen posts, I did not see any noticeable result. It seems that only the same naive indie developers who want to promote their games for free go to these forums, the other participants were not particularly noticeable. The only noticeable result was given by the post on reddit, on this day the number of installations increased from 200 to 400.
In general, as time went on, the game still had 100-300 installations per day and they did not want to grow at all. As the number of reviews and ratings, despite the request to evaluate the game. Then an extremely cunning plan came to my mind. After all, you can not just ask the user to rate, but somehow stimulate him (do not do this)! Yes, of course, I did not read the Google Play Developer Program Policies. Therefore, I added a dialogue to the free version of the game, which suggested putting 5 stars, and in return unlocked the game levels, which are available only in the paid version. After that, the stars fell down like during a star-fall. The rating of the application as a result rose to 4.8 with 1500 estimates and the installation grew to 400.
After the release of the game on Google Play, spam began to roll into the mail with the proposal to build in some fashionable SDK or to place an advertising review. I fell for one of such attractive offers and for $ 129, AppEggs made and hosted a video review of the game. The review scored some ridiculous number of views, absolutely no result, but at least I posted it on the application page on Google Play.
In general, the application lived so quietly and ingloriously on Google Play, but brought a modest steady income and until August 2013 the free version gained 87 thousand installations.
Letter of happiness
In late July, I noticed a new game Kakuro on Google Play. And if the other implementations were frankly worse, then the new one was good and competitive. Installations went down smoothly, users finally got a choice. And in early August, I received a letter from Google:
This is a notification that your application has been removed from the Google Play Store. REASON FOR REMOVAL: Violation of the spam.
Unlike me, the developer of a competing application read the rules. At least, it seems to me that these two events are not at all a coincidence, and my free version of the game was rightly removed from Google Play.
I removed the dialogue with the proposal to vote and re-flooded the game with a new package name, Google allows it. In the new version, things went worse than in the absence of competition, and by the present moment it has only 15 thousand installations and a rating of 4.5 with 354 estimates.
Agony
After removing the application, the installation dropped to 100-200 per day. I tried to somehow fix the situation and added training before starting the game, which explained how to solve the Kakuro puzzles. I decided to try using the publisher's advice on monetization and sell tips, but for all the tips, only 2 people have bought tips. I reduced the size of the game from 9 to 7 megabytes, but all this did not produce any results.
Amazon AppStore
With the release of the game on Google Play, I decided to upload it to the Amazon AppStore. I decided to download only the paid version. At first, by the number of installations Amazon even overtook Google Play. After half a year I received a letter from Amazon with an offer to participate in their auction of unheard of generosity - Free App Of The Day. Its meaning is that Amazon makes the game free for the day, a lot of users shake it, it rises in the ranking and remains in the tops for a few more days. Since this was practically the only promotion tool in the Amazon AppStore, I agreed. They, in turn, demanded from me to cut Scoreloop and integrate them with Amazon GameCircle. A few days of work, finishing the leaderboards and Amazon finally approved my game and set the date for the Free App Of The Day.
For this day, the game downloaded 76 thousand people. The next day, in statistics, I saw almost as many active users as there were the day before. 76 thousand installations had approximately 76 thousand deletions. Two days the game really hung with a high rating. For the few days spent on integrating the SDK and finalizing the leaderboards, I received about $ 50. Not the best way to spend your free time.
What about the publisher?
Yes, indeed, there was also a publisher. In February, the publisher still contacted me and we began to prepare for the conquest of the Japanese market. They started translating the game into Japanese, and I started integrating their SDK, through which the in-game purchases should take place. This is probably the strangest SDK I've ever seen in my life. It was written in JS + native code. When, say, a login they opened a WebView from which javascript pulled through JNI native methods that did some work. There were a lot of bugs in it and, in general, it was more like testing their SDK and lasted until April. In April, the game finally came out on the Mobage platform. Two months after the release, they sent me sales reports: for a month, there were about 5 purchases, which coincided with the statistics of my own statistics. Two months later, the reports were no longer sent, and after that I did not hear anything from them. Although everything is clear here.
Total
As a result, for the year, the game scored on Google Play a total of 102 thousand installations and earned $ 6,153 . In the Amazon AppStore got 77 thousand installations and $ 2,369 money. With the publisher, unfortunately, nothing happened. If you take away from this amount spent on the design and attempts to promote the game, it turns out $ 7,693 of net profit for the year. However, with 4 months spent on development (albeit in free time, but there were a lot of it) and the same amount in total for support and refinement, it turns out sparsely. On freelancing during this time could earn more.
Why did this happen?
The game was too niche and difficult, you have to count a lot in your mind and think a lot. It is logical that this game did not collect a lot of installations. When I tried to advertise the game on Facebook, the Facebook Ads Manager considered that the target audience for advertising (certain countries and availability was in the interests of Kakuro or Sudoku) was about 150 thousand people. This is not far from how many installations the game scored.
I naively hoped to make a game that might be interesting in Japan. Later, I looked at the screenshots of games from the tops of the Japanese charts and realized that it would have occurred to me to make the design of the game such an odd one. Probably we are too different.
But there are also pluses? There is, not without it. I realized how important monetization is, and that not any monetization is suitable for the game. I worked with the publisher and realized that not all publishers are equally useful, you should not agree to cooperate with any of them and that the existence of a publisher does not guarantee anything at all. I understood why publishers want only free-to-play games. The important thing that I never took advantage of is that if the project already smells, you need to bury it, and not try to resurrect it.
Well, as a definite plus - I made a game that I like and which is interesting for me to play.