Как мы сервер для flappy bird писали
Привет, хабр! Эта статья о том, как мы делали очередной клон flappy bird, как придумывали новые фичи, чтобы завлечь пользователей и что из этого вышло. Хочется поделиться опытом того, как у нас получилось увеличить время сессии одиночной игры в два раза, при этом не ломая основного геймплея. Эта статья предназначена в первую очередь для тех, кто неравнодушен к геймдеву во всех его проявлениях и любит поизучать поведение игроков. В общем,
ПредысторияЭта история началась в феврале, когда случился бум Flappy bird игр. Уже успев наиграться в эту незамысловатую игру и насмотревшись на её клоны, мы с друзьями решили тоже попытать свое счастье — на коленке быстро сделать свою копию. Игра была сделана по вечерам после работы за четыре дня и 18 февраля уже появилась в Google Play, одновременно с этим мы отправили игру на апрув в App Store. Допиливая игру в течение следующих пары недель, мы поправили косяки баланса, полностью заменили интерфейс и в целом сделали много всего для того, чтобы было интересно играть.
Например, респавн птенца в основной игре У нас здорово шли установки за счет общего интереса к игре, но все же мы понимали, что нам нужна своя киллер-фича.У flappy bird очень низкий порог вхождения — это её главная фича. Очевидно, основной геймплей нарушать нельзя, надо добавлять что-то другое. Поскольку мы все в команде технари (читай: тупо не умеем рисовать) и любители соревнований, мы решили сделать турниры. Количество добавляемого арта будет небольшим, а играть станет намного интереснее.
Ок, делаем турниры! Как будут взаимодействовать игроки? Есть несколько вариантов:
Прямое синхронное взаимодействие. Чистый онлайн в MMORPG понимании — игроки играют одновременно и постоянно видят прогресс друг друга (фантомов других игроков) Непрямое синхронное взаимодействие. Игроки должны собраться вместе в одно время, но они видят только результаты друг друга Непрямое асинхронное взаимодействие. Игрокам не обязательно собираться вместе. Они видят финальный результат через промежуток времени Мы выбрали третий вариант для реализации. В чем заключается непрямое асинхронное взаимодействие: каждый новый игрок регистрируется в турнире и может делать бесконечное количество попыток в течение заданного времени, в перерывах между попытками видит результаты своих соперников.
Почему мы остановились именно на этом варианте:
Играть здесь и сейчас. Игрок не будет ждать пока соберется комната. Он хочет играть сразу. Если игрок будет ждать больше 20 секунд, скорее всего он уйдет играть во что-то другое Несколько попыток для получения лучшего результата. В таких хардкорных играх это действительно важно Можно играть в турнире независимо от качества интернет соединения. Если качество плохое, то просто более поздняя синхронизация Скорость реализации. Этот вариант можно было сделать быстрее чем первый, и примерно так же по времени как второй, а плюсов он давал больше Конечно, у данного подхода есть свои минусы:
Если игра не популярна, то большая вероятность играть одному. Конечно, частично этот вопрос решают боты, о которых речь пойдет ниже Игроку нужно ждать, когда придут последние результаты других товарищей по комнате. (Тут мы жестко огребли. Мы нигде про это не указали — как следствие, игроки не видели сразу награду, страдали, жаловались, ставили единички, кричали «Разраб, верни галду» — в общем, вели себя как всегда). Нет такого же ощущения присутствия других игроков, как при онлайн взаимодействии Хорошо, теперь вопрос: как мотивировать игрока играть в турнире? Все очень просто: помимо номинальной награды в виде медальки и общего признания, игрок получал виртуальную валюту (как раз ту, за которую он мог возрождаться в одиночном турнире).Для входа в турнир он также тратил игровую валюту. Из шести мест первые три были призовыми
Как в конечном итоге как это происходит для игрока:
Игрок заходит в турниры. Игра снимает с игрока количество валюты, необходимое для участия в турнире. Запускается таймер на две минуты Начинается игра. Игрок должен сделать свой лучший результат. Читай: пролететь как можно дальше Завершилась игра. Показали игроку окно с результатами. Игрок видит свой результат и результаты других игроков, если они есть Игрок начинает игру снова… Возвращаемся на шаг 2 Так происходит до тех пор, пока таймер турнира не станет равен 0. Игра показывает результаты турнира в последний раз. После этого игрок идет в главное меню Через некоторое время (не более, чем длина турнира * количество участников) игрок получает награду, если он вошел в тройку победителей Поскольку игроков в день у нас было намного меньше, чем у оригинала и ближайших клонов, мы не ожидали большой нагрузки, поэтому решили не париться и подняли http-сервер, написанный на коленке на php. Технически сервер умел делать три вещи:
регистрировать пользователя в комнате, где есть свободное место. Если мест нет, то создать комнату и зарегистрировать сохранять результаты пользователя в комнате отображать результаты всех пользователей в комнате Боты У нас была не самая большая дневная аудитория, а уж тем более онлайн. Соревноваться самому с собой не очень интересно. Поэтому мы решили добавить самых ботов.Логика работы ботов до безобразия проста. Если в комнату к игроку никто не заходит в течение первой минуты, сервер добавляем к нему в комнату ботов с результатами случайным образом отличающимися от текущего результата игрока на некоторую дельту. Нам эта система казалась до ужаса палевной, но даже наши коллеги злились на «неизвестных чувачков, обогнавших их на эпсилон очков», совершенно не подозревая, что играют с ботами :)Игровые ники Следующий вопрос для решения — игровые ники. Самоидентификация очень важна. Мы знали, что без игровых ников не обойтись. Но как только подумали о том, что пользователи будут сами добавлять ники, вписывать их на арабском, китайском, матерном английском и других языках, нам становилось дурно. Поэтому опять поступили максимально быстро — сделали сами подборку из прикольных ников и добавили их на сервер. И теперь, когда игрок заходил в турнир, он получал один из случайных ников из списка. Казалось бы, самое простое и лучшее решение.Финал Что мы получили в итоге:
Сделали то, что нам понастоящему нравится! Мне кажется, мы игрались в эти турниры больше чем наши игроки :) Мы получили опыт введения сервера в сингл-плеер игру. Собрали грабли Лично я осознал очень важный факт: в большинстве мобильных игр (одиночных) не нужен сервер, несмотря на то, что манагеры-геймдизы считают его мастхевом и суют во все тз. Но правильно прикрученный простейший сервер, позволяющий меряться очками, не нарушающий основной геймплей может легко увеличить время сессии, а также хорошо повлиять на ретеншн
P.S. Перед выкладкой обновления с турнирами, Google удалил нашего дракончика и мы потеряли 1.5к установок в день. По сообщению саппорта, приложение было забанено за чрезмерное использование поисковой потимизации, хотя подобными способами пользовалось большинство разработчиков. Мы перевыложились уже с турнирами, но динамику установок восстановить не могли. Время было упущено. Как потом выяснилось, мы не единственные кого удалил Google, причем его банхаммер работает очень выборочно, из-за чего становится не понятно, почему удаляют одних, но оставляют похожих.