Game development
Development for Android
January 8 2014

Игра Какуро — Постмортем

Привет, Хабр! Хочу этим постом пополнить копилку невзлетевших инди-игр, оглянуться назад и посмотреть на свои косяки. Вот уже больше года прошло с релиза моей второй игры под Android. После рождественской распродажи я окончательно решил прекратить разработку и поддержку этой игры, а значит самое время подвести итоги прошедшего года. Под катом я поделюсь статистикой игры, финансовыми результатами и моим взглядом на причины произошедшего.


Идея

До Какуро я долго и упорно в свободное от работы время пилил игру Балда. За год мне это однообразие поднадоело, доход от рекламы все увереннее приближался к нулю, поэтому было принято решение наконец побороть лень и браться за что-нибудь новое. И на этот раз, желательно, писать это новое на игровом движке. С учетом прошлого опыта я решил наваять опять же головоломку. После неспешного изучения категории Logic puzzles в википедии я наконец дошел до буквы K и игры Какуро. Игра мне показалась замечательной, похожа на судоку (как же я ошибался) и что было намного важнее — существующие реализации в Google Play были плохими. Еще одним пунктом «за» было то, что в каждом отчете мобильной аналитики была информация о Японии и невероятном ARPU на японском рынке. Что же еще писать, если не игру с японскими корнями, которой наверняка должны заинтересоваться японские пользователи? В общем, на Какуро я и решил остановиться.

Уровни

Самой частой жалобой в комментариях к существующим Какуро была жалоба на несколько вариантов решения уровня (а по правилам он должен быть только один). Скорее всего это происходило из-за того, что уровни генерировались на лету. Чтобы оказаться лучше конкурентов, я решил использовать заранее заготовленные уровни, которые я бы проверил на уникальность решения.

После долгих поисков в интернете я нашел кучу PDF файлов с готовыми уровнями (1800 штук) с размерами поля от 5 х 5 до 15 х 15. С использованием Apache PDFBox написал утилиту, которая вытаскивает из этих PDF файлов уровни. Теперь было необходимо проверить сколько решений у каждого уровня. Для этого пришлось написать еще одну утилиту, которая решала все эти уровни и сохраняла верные решения. К сожалению, алгоритмы — не мой конек, поэтому тут много не расскажу. Все что могу сказать, так это то, что программа действительно решала уровни (и делала это быстро, после бессчетных оптимизаций) и я был уверен, что у каждого из 14 000 уровней действительно только одно решение и оно мне известно. Начал с полного перебора, а закончил (у меня есть такое подозрение) методом ветвей и границ.

Осталось определится, в каком формате хранить эти уровни, т. к. их получилось больше 14 000, а размер приложения не хотелось раздувать. Не хотелось изобретать велосипед и городить свой бинарный формат для этого (хотя в конце концов к этому я и пришел), поэтому после множества экспериментов с разными форматами я остановился на Google Protocol Buffers. При сериализации каждый уровень имел приемлемый размер (все 14 000 уровней весили 10.5 мегабайт) и десериализация происходила быстро. Все уровни были, конечно же, объединены в один файл (т. к. упаковывать каждый раз 14 000 файлов в APK при сборке немного накладно) и дополнительно был создан файл-манифест, в котором были прописаны смещения каждого уровня относительно начала файла и размер уровня.

Но получившийся пак уровней еще очень хорошо сжимался zip-ом до 3.4 мегабайт. Я нацелился на поддержку Android 2.2, а это значит использовать сжатый ресурс больше 1 мегабайта в приложении не получится и архивировать\разархивировать пак с уровнями придется самому. Каждый раз лезть в архив для загрузки уровня не хотелось, поэтому я решил хранить распакованный файл целиком в памяти для быстрого доступа к нему. Dalvik heap, к сожалению, не резиновый (на моем старом Galaxy S всего 24 мегабайта), поэтому я на всякий случай решил сделать эдакий off-heap storage. Тем более, после тестов оказалось, что распаковку архива с уровнями можно сделать быстрее при помощи NDK. Так и получилось, что уровни я стал распаковывать на уровне NDK с помощью libzip (пока мне еще ни разу не удалось написать игру под Android без использования NDK) и загружать пак уровней в нативную память. В общем, вышло как-то так:



В процессе игры java-код дергает через JNI нативный метод, передает ему смещение относительно начала файла и размер уровня, а в результате получает массив байт, который впоследствии десериализуется через google protobuf.

Дизайн

Итак, после всего этого у меня было два пакета травы, 75 ампул мескалина 14 тысяч уровней и libkakuro.so, загружающая все эти уровни. На это уже ушло несколько месяцев, т. к. занимался я этим в свободное время.

Но на игру это было совсем не похоже, поэтому я решил написать небольшой прототип:


Прототип был полностью рабочим и в него уже можно было играть. Если бы на этом этапе я дал бы поиграть кому-нибудь в этот прототип, я бы сэкономил кучу времени, но, к сожалению, история не знает сослагательного наклонения. И я приступил к написанию ТЗ и поиску дизайнера.

Я разместил заказ на нескольких биржах, русских и не очень, но так получилось, что на него откликнулась сербская дизайн-студия. За все 6 экранов они запросили 600$, что в принципе вполне укладывалось в мое представление о бюджете на разработку. У меня не было ни одной идеи, как должна выглядеть будущая игра, поэтому дизайнеру был выдан карт-бланш. Однако, после первого отрисованного экрана ко мне внезапно это виденье пришло и я полностью переделал ТЗ. После удачных и не очень попыток объяснить на словах и в картинках свои фантазии на тему как должен выглядеть фон и что куда будет поворачиваться, дизайнер принялся за дальнейшую работу. Спустя три недели произошли такие метаморфозы (на видео уже готовая игра, ссылку на Google Play из описания убрал):



По моей задумке фоновая текстура со зданиями должна была вращаться при переходе между экранами. Я попробовал вставить получившуюся текстуру разрешением 1000 х 1000 пикселей в ImageView и повернуть ее через RotateAnimation. На моем Galaxy S это выдавало где-то 5-7 FPS, поэтому я принялся за поиски движка. Искал, в принципе, недолго и остановился на AndEngine. Про него и так написано немало, поэтому ничего нового не скажу. Из плюсов отмечу низкий порог вхождения, из минусов — невысокая производительность, плохая оптимизация и жор батареи. Пользователи могут простить такой жор играм уровня Asphalt 8 и GTA, но никак не простой логической головоломке.

Но со своей задачей движок вполне справился. Игра выдавала более-менее стабильные 55 FPS, правда иногда спотыкалась об GC. Поэтому я решил вести дальнейшую разработку на AndEngine и сел нарезать PSD файлы и писать код. Спустя 3 месяца игра была готова.

Поиск издателя

Все уже знают, что без издателя не может быть успешной игры. По крайней мере, такое мнение они же настойчиво и навязывают. До этого я, конечно же, никогда не работал с издателями, поэтому очень хотелось попробовать сделать все по серьезному. Из 15 издателей мне ответили трое, и мне кажется, что это еще был очень хороший результат. У каждого издателя, как правило, есть своя специализация по жанрам (казуальные игры или аркады), поэтому издавать они возьмутся только игры такого жанра. Писать всем подряд смысла было немного.

С двумя из трех мое общение закончилось после вопроса "Is the game free to play?". Вполне закономерно, что издатели хотят работать только с f2p играми, ведь по последнему отчету от Distimo видно, что 98% Top Grossing приложений используют именно такую модель монетизации.

Как-то так вышло, что я все это время откладывал монетизацию «на потом» и в результате у меня была готовая игра и смутное представление о том, как мне ее монетизировать. Я рассчитывал на помощь издателя в этом непростом выборе. По какой-то причине один из издателей (wizQ Interactive ) не стал игнорировать мои письма, предложил несколько решений для монетизации и даже согласился издавать мою игру на японском рынке, но только после нового года. Так как на календаре был еще только ноябрь, я решил пока выпустить игру самостоятельно, заодно собрав статистику.

В монетизации я решил остановится на freemium — сделать игру бесплатной, но при этом доступными будут только уровни размером 5 х 5. Остальные уровни стоят 99 центов и разблокируются через in-app purchase. Такая версия игры увидела свет 17 ноября 2013.

Первый блин

После первых нескольких дней и пары сотен установок оказалось, что пользователи совсем не горят желанием покупать дополнительные уровни. Первая покупка в 0.99$ пришла только на третий день и это, очевидно, было полным провалом. Так получились начальные значения конверсии 0.5% и ARPPU в 66 центов.
Так я понял две вещи: во-первых, не любая модель монетизации может подойти игре; а во-вторых, о монетизации надо думать до того, как игра будет окончательна готова.

Единственный выход, который у меня оставался — это сделать харакири пивот и изменить модель монетизации. Я решил разделить приложение на 2 версии — бесплатную, с заблокированными уровнями, и платную, в которой все версии будут доступны. Платная версия вышла 12 декабря и с этих пор в Google Play у меня стало на еще одно приложение больше. Я поставил цену в 2.99$, так как игра явно не для массового пользователя и на большое количество установок я не рассчитывал. После такого разделения при цене 2.99$ конверсия получилась около 3%, что уже интереснее.

Продвижение

Для начала были закинуты символические 100$ на AdMob, которые дали 10 установок и CPI в 10$. После этого в сторону AdMob я больше не смотрю. Не уверен, то ли он так испортился, то ли я, но за год до этого у меня выходил CPI в 0.5$.
После этого я решил разместить описание игры на тематических форумах. После десятка постов никакого заметного результата я не увидел. Похоже, что на эти форумы заходят только такие же наивные инди-разработчики, желающие забесплатно продвинуть свои игры, других участников особо не было заметно. Единственный заметный результат дал пост на reddit, в этот день количество установок выросло с 200 до 400.

В общем время шло, а у игры было по-прежнему 100-300 установок в день и расти они никак не хотели. Как и количество отзывов и оценок, несмотря на просьбу оценить игру. Тут мне в голову пришел чрезвычайно хитрый план. Ведь можно не просто попросить пользователя поставить оценку, а как-то его простимулировать (не делайте так)! Да, конечно же, я не читал Google Play Developer Program Policies. Поэтому я добавил в бесплатную версию игры диалог, который предлагал поставить 5 звезд, а взамен разблокировал игровые уровни, которые доступны только в платной версии. После этого звезды посыпались как во время звездопада. Рейтинг приложения в результате поднялся до 4.8 при 1500 оценках и установки подросли до 400.

После издания игры в Google Play на почту стал сыпаться спам с предложением встроить какое-нибудь модное SDK или разместить рекламный обзор. На одно из таких заманчивых предложений я повелся и за 129$ сайт AppEggs сделал и разместил у себя видео-обзор игры. Обзор набрал какое-то смешное количество просмотров, не дал абсолютно никакого результата, но я его хотя бы разместил на странице приложения в Google Play.

В общем как-то так незаметно и бесславно приложение спокойно жило в Google Play, но приносило скромный стабильный доход и до августа 2013 года бесплатная версия набрала 87 тысяч установок.

Письмо счастья

В конце июля я заметил новую игру Какуро в Google Play. И если остальные реализации были откровенно хуже, то новая была хорошей и конкурентноспособной. Установки плавно пошли вниз, у пользователей наконец появился выбор. А в начале августа я получил письмо от гугла:
This is a notification that your application has been removed from the Google Play Store.
REASON FOR REMOVAL: Violation of the spam provisions of the Content Policy.

В отличие от меня, разработчик конкурирующего приложения правила читал. По-крайней мере, мне кажется эти два события совсем не совпадение и моя бесплатная версия игры была справедливо удалена из Google Play.

Я убрал диалог с предложением проголосовать и залил игру повторно с новым именем пакета, Google это разрешает. У свежезалитой версии дела пошли хуже, чем при отсутствии конкуренции, и к теперешнему моменту у нее только 15 тысяч установок и рейтинг 4.5 при 354 оценках.

Агония

После удаления приложения установки упали до 100-200 в сутки. Я пытался как-то исправить ситуацию и добавил обучение перед началом игры, в котором объяснялось, как нужно решать головоломки Какуро. Я решил попробовать использовать совет издателя насчет монетизации и продавать подсказки, но за все время подсказки купили только 2 человека. Я уменьшил размер игры с 9 до 7 мегабайт, но все это не дало никаких результатов.

Amazon AppStore

Вместе с изданием игры в Google Play я решил загрузить ее и в Amazon AppStore. Загружать я решил только платную версию. По началу по количеству установок Amazon даже обгонял Google Play. Спустя пол-года мне пришло письмо от Amazon с предложением поучаствовать в их аукционе неслыханной щедрости — Free App Of The Day. Смысл его в том, что Amazon делает игру бесплатной на день, ее качает множество пользователей, она поднимается в рейтинге и остается в топах еще несколько дней. Так как это был практически единственный инструмент продвижения в Amazon AppStore, то я согласился. От меня они в свою очередь потребовали вырезать Scoreloop и интегрировать их Amazon GameCircle. Несколько дней работы, допиливание лидербордов и Amazon наконец одобрил мою игру и назначил дату Free App Of The Day.



За этот день игру скачало 76 тысяч человек. На следующий день в статистике я увидел практически столько же активных пользователей, сколько их было позавчера. На 76 тысяч установок пришлось приблизительно 76 тысяч удалений. Два дня игра действительно провисела с высоким рейтингом. За несколько потраченных дней на интеграцию SDK и доработку лидербордов я получил около 50$. Не самый лучший способ потратить свободное время.

А как же издатель?

Да, действительно, был же еще и издатель. В феврале издатель все-таки связался со мной и мы начали готовиться к покорению японского рынка. Они занялись переводом игры на японский язык, а я занялся интеграцией их SDK, через которое должны происходит внутреигровые покупки. Пожалуй, это самое странное SDK, что я видел в своей жизни. Написано оно было на JS + нативный код. При, допустим, логине у них открывалась WebView из которого javascript дергал через JNI нативные методы, которые выполняли какую-то работу. Багов в этом было много и, в целом, больше это походило на тестирование их SDK и продолжалось до апреля. В апреле игра наконец вышла на платформе Mobage. Два месяца после релиза они присылали мне отчеты о продажах: за месяц выходило где-то 5 покупок, что совпадало с данными встроенной мною статистики. Спустя два месяца отчеты присылать перестали и после этого я от них ничего не слышал. Хотя тут и так все понятно.

Итого

В результате за год игра набрала в Google Play суммарно 102 тысячи установок и заработала $6 153. В Amazon AppStore получилось 77 тысяч установок и $2 369 денег. С издателем, к сожалению, ничего не получилось. Если отнять от этого суммы затраченные на дизайн и попытки продвинуть игру, то получается $7 693 чистой прибыли за год. Однако, при потраченных 4 месяцах на разработку (пусть и в свободное время, но его было много) и столько же суммарно на поддержку и доработки, получается негусто. На фрилансе за это время можно было бы заработать больше.

Почему так получилось?

Игра получилась слишком нишевая и сложная, приходится много считать в уме и много думать. Вполне логично, что такая игра не собрала много установок. Когда я пытался рекламировать игру в Facebook, то Facebook Ads Manager посчитал, что целевая аудитория рекламы (определенные страны и наличие в интересах Какуро или Судоку) составляет приблизительно 150 тысяч человек. Это недалеко от того, сколько установок набрала игра.

Я наивно рассчитывал сделать игру, которая может быть будет интересна в Японии. Уже потом я посмотрел на скрины игр из вершин японских чартов и понял, что мне бы в голову не пришло сделать дизайн игры вот таким вот странным. Наверное, слишком уж мы разные.

Но есть же и плюсы? Есть, не без этого. Я понял, насколько важна правильная монетизация и что не любая монетизация подойдет для игры. Я поработал с издателем и понял, что не все издатели одинаково полезны, не стоит соглашаться сотрудничать с любым из них и что наличие издателя вообще ничего не гарантирует. Я понял, почему издатели хотят только free-to-play игры. Важная вещь, которой я так и не воспользовался — если проект уже пахнет, его нужно закапывать, а не пытаться воскресить.

Ну и как несомненный плюс — я сделал игру, которая мне нравится и в которую мне самом интересно играть.
+99
52k 205
Comments 43
Top of the day