800 просмотров, спамблок и Хомяк-Богатырь: дневник разработчика Telegram-игры
Несколько недель назад я рассказал здесь про свою игру в Telegram. Статью посмотрели 800 раз, а реакций было ноль. Перечитал — и понял почему. Поэтому сегодня без «а ещё у нас есть». Только то, что пошло не так, и что я из этого вынес.
Если коротко, что за игра: Telemon живёт прямо в Telegram-чатах. Выращиваешь питомцев, сражаешься с друзьями, всей группой ходишь в рейды на боссов, а между делом играешь в кости в таверне. Делаю её один, без бюджета. Как и в прошлый раз, честно: код и модельки питомцев я собираю вместе с нейросетью, а от меня - идеи, геймдизайн, баланс и бесконечные тесты. Ниже будет видно, что нейросеть тоже ошибается, и иногда очень уверенно.
Первая статья была рекламным буклетом: перечень функций с картинками. Читать такое скучно, я бы и сам пролистал. Так что вторая - дневник. Шесть историй, в каждой что-то сломалось.
1. «Бот тормозит — значит, виноваты гифки»
В какой-то момент бот начал зависать. Нажимаешь кнопку - и тишина секунд на десять, а потом всё прилетает разом. Иногда не прилетает вовсе.
Версия была очевидная. Каждый бой, каждая эволюция, каждый бросок костей - это маленький ролик, который сервер рисует на лету. Рисовать видео на дешёвом сервере тяжело, значит, ролики и душат бота. Нейросеть со мной согласилась, и мы вынесли рисование в отдельный процесс с низким приоритетом, чтобы оно не мешало боту отвечать.
Не помогло. Тогда я наконец сделал то, с чего надо было начинать: открыл логи. Процессор скучал. Зато там было полно сообщений о том, что запрос к Telegram не дождался ответа. Бот был ни при чём - у него просто плохо получалось достучаться до самого Telegram. Мой сервер стоит в России, и связь с серверами Telegram оттуда работала через раз.
Переезжать на другой сервер я не хотел, поэтому пустил трафик бота к Telegram через прокси. С первой попытки, конечно, не вышло: бот ожил, проработал несколько минут и лёг снова - прокси упирался в права доступа к собственному файлу настроек. Со второй заработало, и бот снова отвечает мгновенно.
Что понял: сначала логи, потом гипотезы. Час, потраченный на «очевидную» причину, мог уйти на чтение одного файла. Хотя вынос рисования в фон всё равно пригодился - с ним сервер спокойнее переносит пиковые часы.
2. Две игры в одном чате
Первый баг от живых игроков. В групповом чате одновременно шли две партии в кости, и одна из них просто застыла: ни кнопок, ни результата.
Оказалось, у Telegram есть лимит, о котором я знал только в теории: сколько сообщений бот может отправить и отредактировать в одном чате за короткое время. Каждый бросок в костях - это ролик плюс несколько правок сообщения. Одна партия в лимит укладывается. Две - уже нет. Telegram отвечал «подожди немного», а бот молча терял это обновление. Партия оставалась без кнопок навсегда.
Исправлял в три слоя:
• Ждать, а не терять. Если Telegram просит подождать недолго, бот ждёт и повторяет запрос.
• «Горячий чат». Если Telegram пожаловался на частоту, бот на полторы минуты перестаёт показывать в этом чате анимации и сразу присылает результат. Красота уступает место скорости.
• Кнопка «разморозить». Если что-то всё-таки зависло, любой игрок партии может вернуть кнопки сам.
Что понял: в Telegram-игре дефицитный ресурс - не процессор, а количество сообщений в чате. Каждую анимацию нужно проектировать так, будто их в этом чате будет пять одновременно.
3. Где искать игроков (спойлер: не там, где я искал)
Это самая болезненная часть. Игра есть, а людей в ней нет. Я попробовал то, что советуют все:
• Пиар-группы и чаты взаимопиара. Ноль. Мои сообщения просто проигнорировали, а в одном месте предложили купить рекламу.
• Писать людям в личку. Когда я начал писать незнакомым людям, Telegram быстро ограничил мой аккаунт: писать можно только контактам. Самое смешное, что официальный бот проверки ограничений уверял, что всё в порядке. Урок усвоил, больше так не делаю - и вам не советую.
• Чаты про покемонов. Логично же: игра про питомцев. Собрал целый список, живых оказалось четыре, и почти все - про Pokémon GO, где людям интереснее рейды в парке, чем бот в чате.
А потом бота добавили в один обычный живой чат: около двухсот участников, из них человек тридцать реально переписываются. Оттуда пришли 32 игрока. Больше, чем изо всех предыдущих попыток вместе взятых. А живые игроки, кстати, первыми и находят баги - вроде того, с двумя партиями.
Под этот вывод я переделал саму игру. Админы групп теперь могут добавить свой чат в каталог «Чаты с рейдами» прямо в боте, а самый активный чат за неделю становится «чатом недели»: встаёт первым в каталоге и попадает в новости проекта. Игроки находят живые чаты, чаты получают новых людей. Если игра живёт в чатах, пусть чаты и приводят друг друга.
Что понял: один живой чат лучше десяти площадок для рекламы. Люди приходят не на рекламу, а за друзьями, которые уже играют.
4. Шестнадцать моделек без художника
Обычных видов было восемь - для игры про коллекционирование это мало. Я решил добавить ещё восемь, и у каждого по две эволюции: малыш, подросток и взрослая форма. Итого 24 новые модельки.
Напомню, как они сделаны. Художника нет, 3D-редактора тоже. Каждый питомец - это описание в коде: «вот эллипсоид-туловище, вот конусы-уши, вот голова чуть повёрнута». Программа складывает фигуры, сглаживает стыки и рендерит картинку. Это удобно - можно в любой момент поправить одну цифру. И коварно - ты не видишь, что получилось, пока не нарисуешь.
А получалось разное. Мои любимые провалы:
• Воздушный змей Ветролиса сначала выглядел как теннисная ракетка. Поправили - стал похож на рожок мороженого. Только с третьей попытки стал змеем.
• Шарф того же лиса развевался вперёд и выглядел как высунутый язык.
• Жук Самоцветик получил полоски на панцире и превратился в пчелу.
• Капсула для нового кейса вышла бело-красным шаром с кнопкой посередине - сами понимаете, на что похоже. Переделал в игрушечную капсулу из автомата: делать игру про питомцев и копировать чужой символ - так себе идея.
• Хомяк-Богатырь получил плащ размером с себя, Грозовая Летяга - крылья-забор, а Ураганный Лис - ноги жирафа.
Каждую модельку я смотрел глазами: в маленьком размере, в карточке, рядом с остальными. Половина правок - не про красоту, а про то, чтобы питомца можно было узнать по силуэту размером с ноготь в чате.
5. Симулятор, который нашёл имбу
Новые питомцы должны быть интересными, но не сильнее старых - иначе все бросят своих и побегут за новыми. Проверять это руками бесполезно, поэтому у меня есть симулятор: каждый вид дерётся с каждым на разных уровнях, больше 130 тысяч боёв за один прогон.
Первый прогон выдал две проблемы:
• Самоцветик, бронированный жук, на 40 уровне выигрывал 68% боёв. Высокая защита плюс фирменный луч, который ещё и снижает защиту врага, - классическая имба.
• Хомка на 8 уровне выигрывал 8% боёв, а на 40 - уже 60%. В начале у него только слабые атаки, зато потом появляется «Хомячий таран» - сильный и тоже снижающий защиту. Жалкий малыш, который вырастает в танк.
Ослабил Самоцветику характеристики и луч. Хомке дал сильную стартовую атаку и порезал таран. Быстрому Искрику поднял силу атаки. Вот что получилось:
Видно, что идеала нет: на высоких уровнях Плюх и Самоцветик всё ещё чуть сильнее старой компании, а Искрик по-прежнему внизу. И тут главный урок этой главы, который я пока не решил: в моей формуле боя скорость почти ничего не стоит. Быстрый питомец бьёт первым, но броня и здоровье оказываются важнее. Об этом - вопрос в конце.
6. Новичку нечего открыть
Последняя история - про экономику. Валюта в игре только зарабатывается: за бои, задания и ежедневный вход. Купить её нельзя, это принцип. Сундук с атаками стоит 400 искр. Для игрока, который играет неделю, это нормально. Для новичка в первый день - бесконечность. Человек проходит обучение и видит магазин, где ему ничего не по карману.
Решение - дешёвый кейс за 150 искр, «Капсула находок». Внутри одна вещь: чаще свиток с атакой или конфеты, иногда питомец. Чтобы не было обидно, есть гарант: редкий питомец выпадет не позже 25-й капсулы. Новичкам после обучения сразу дают две капсулы, ещё по одной - на 3-й и 7-й день ежедневной серии. И да, капсулы, как и всё остальное, только за заработанные искры.
Заодно у каждого питомца появилась сияющая форма - редкий окрас с шансом 2–5% из яиц и капсул. На силу не влияет, только на то, как сильно тебе будет завидовать чат.
Маленькая победа напоследок
Не всё ломалось. Однажды мне пришла в голову идея: когда ты вызываешь кого-то на бой, пусть в чат прилетает не сухой текст, а твой питомец, который выходит на арену. Сделали. Мелочь, но такое сообщение в ленте чата просто невозможно пролистать.
Что я понял
• Логи раньше гипотез. Особенно когда гипотеза «очевидная».
• В Telegram главный лимит - сообщения в чате, а не мощность сервера.
• Игроков приводят живые чаты, а не реклама. И точно не сообщения незнакомцам.
• Симулятор баланса окупается за один прогон. Без него я бы выпустил имбу и узнал об этом от злых игроков.
• Новичку нужно что-то открыть в первые пять минут. Иначе пятой минуты не будет.
• И статья-буклет никому не интересна. Посмотрим, как зайдёт дневник.
Два вопроса к вам
Первый - к тем, кто делал игры. Как сделать скорость полезной, если броня и здоровье почти всегда важнее? Давать быстрым шанс уклониться? Второй ход подряд? Я склоняюсь к уклонению, но боюсь, что бои станут лотереей.
Второй - ко всем. Где бы вы искали первых игроков для игры, которая живёт в чатах? Я понял, куда не надо, а вот куда надо — пока выясняю.
Если захочется посмотреть на всё это вживую, бот здесь: @pvpgame_app. А в следующем дневнике расскажу, что из ваших советов сработало.