Оффтоп Максим Газизов
292

О технических нюансах реализации Wasteland Wars в Telegram

В закладки

Привет, дорогие друзья! На DTF пользователи просили рассказать о технической части игры. Сегодня я созрел поговорить об этих нюансах. Также хочу вам рассказать о том, как моё хобби стало масштабным проектом (которому без малого уже год).

Год назад я запустил собственную онлайн игру. Главная особенность проекта в том, что игра написана на движке бота в мессенджере Telegram.

Также я приготовил небольшой конкурс. Об этом в конце статьи.

Платформа для реализации игры

Вообще у меня не было вопроса о выборе платформы. Я загорелся идеей попробовать сделать игру именно на основе бота в Telegram, а затем уже под этот формат придумал Wasteland Wars. Мобильные приложения я и разрабатываю на основной работе. Мне кажется, нужно быть парнишей с большими странностями, чтобы во время отдыха от работы заниматься тем же. Это как если бы дальнобойщик после работы играл бы в компьютерную игру про дальнобойщиков.

Какое влияние проект может оказать на рынок таких игр

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

Наверное, есть одна вещь в моём проекте, которую я хотел бы увидеть в остальных игровых ботах. Для понимания потребуется зайти немного издалека. Я замахнулся делать свою Wasteland Wars с ориентиром на большие MMORPG для компьютеров, такие как Lineage 2 и WoW. Самому до сих пор сложно в это поверить, но так получилось, что сейчас мой игровой бот в Telegram функционирует на базе почти идентичной комплексным, большим играм ММО.

В ней есть:

• сюжетные квесты;

• лут;

• торговля;

• альянсы (здесь они называются бандами);

• битвы PvP и PvE;

• различные NPC;

• рейды на боссов;

• подземелья;

• большой открытый мир;

• глобальные события;

• и другие атрибуты больших игр.

И всё это так и осталось бы просто массой сложных механик, если бы я не выверял фанатично каждую кнопку игры, постоянно упрощая взаимодействие со всеми доступными в игре возможностями.

Всю сложность скелета игры скрывает за собой простой интерфейс, одинаково удобный и понятный даже в самых запутанных игровых механиках.

Когда просматриваешь профиль в игре

Я загорелся идеей глубокого симбиоза дизайна и скелета игры настолько сильно, что доходило до абсурда: проведя за проработкой интерфейса множество бессонных ночей, я ещё долго потом боролся с ним в кошмарах. Хочется, чтобы другие разработчики на этом рынке переняли у моего проекта именно эту особенность — детальную проработку дизайна игры.

Даже имея в основе массивные и тяжёлые механики, игра должна управляться просто и интуитивно, причём в каждом её аспекте. А для рынка Telegram-игр в целом я хочу показать ту планку качества и проработки игры, на которую разработчики могут равняться, понимая, что достичь этой планки можно даже в одиночку.

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

Дело жизни - разработка софта

На самом деле, за всё время своей активной деятельности я разрабатывал не только программную часть проектов, но и аппаратную. Этот момент я бы хотел опустить, если честно.

Если бы мне предстояло ответить на вопрос при посвящении в какой-нибудь хаббардистской школе на вопрос о деле жизни, я бы ответил - софт и игры. Почему же так? Программы создаются как минимум для упрощения жизни людей, а игры - для развлечения. Мне не всё равно, как любители компьютерных, консольных и мобильных игр проводят своё свободное время.

Вот и маски подъехали

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

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

Сегодня я вкладываю деньги в стабильное оборудование. Мне проще заплатить больше за стабильную работу сервера, чем я потеряю людей, которым нравится игра. Проще потерять деньги, чем спустить в унитаз отношения с игроками. Как я уже говорил, я делаю игру своей мечты, и пока в неё будут с удовольствием играть — я буду с удовольствием её развивать. Хобби? Ещё какое.

Бета-тест как способ привлечения игроков

В первые дни разработки было решено собрать фокус-группу из своих знакомых для теста игры. Как-никак, имея дело с ММО, тестировать в одиночку было проблематично. Так я запустил закрытый бета-тест игры, сделав доступ к боту по одноразовым ключам. Сгенерировав таких 10 штук, я разослал их своим знакомым в Telegram. Реферальная система уже была добавлена к этому моменту, хоть и не работала по факту в виду закрытости тестирования. Её суть в том, что за каждого зарегистрированного в игре человека по твоей реферальной ссылке, игрок получает +1 к максимальному запасу выносливости и немного крышек (местной валюты) на карманные расходы. Это привело к тому, что спустя 2 недели с начала закрытого бета-теста, в нём принимало участие уже 50 человек, а мои личные сообщения были забиты просьбами людей дать им еще 1-2-10 ключей для своих друзей. Вместо того, чтобы постоянно генерировать новые ключи, я принял решение сосредоточиться на исправлении найденных в тестировании багов и запустить открытый бета-тест, отменив регистрацию по ключам. За первый день открытого бета-теста в игре зарегистрировалось 120 человек. Спустя месяц суточный онлайн составлял 200-250 человек в день, а общее количество зарегистрированных игроков приближалось к 800. И всё это без каких-либо движений с моей стороны по пиару игры. Игра становилась известной исключительно благодаря сарафанному радио и реферальной системе.

Особенности проекта, понравившиеся игрокам

Игроки во время тестирования отмечали крайне необычный для такого формата жанр игры, полноценные PvP-сражения и систему прокачки игрока без классических очков навыков и системы level-up’ов. Но, что стало для меня неожиданностью – больше всего люди хвалили игровые тексты, особенно отмечая качество юмора, отсылки к массовой культуре и атмосферные ситуации, контрастирующие с чёрным юмором своей драматичностью.

Один из таких текстов

Визуальная часть в текстовой игре

Одной из ключевых особенностей Wasteland Wars относительно остальных похожих игр в Telegram стало введение визуальной части. В игру был добавлен интерактивный аватар персонажа, а так же визуальное отображение каждого элемента экипировки в игре. Как в полноразмерных РПГ на игровых платформах, игрок может одевать своего персонажа в разную броню, давать ему разное оружие, а затем видеть все изменения визуально. Чуть позже я развил эту идею, теперь при встрече другого игрока в игре выводится так же его аватар – так появляется возможность не зная прокачки противника, оценить его опасность по внешнему виду. Помимо экипировки, на аватаре так же отображаются «Маски» - их можно купить за донат, они не дают никакого преимущества игроку, но изменяют его вид в аватаре.

Кроме того, в игре появилась полноценная интерактивная карта. По мере нахождения какой-либо локации, она добавляется игроку на карту.

Все изображения выводятся в довольно низком разрешении, достаточном для понимания их контента. Это связано с тем, что аватары и карты собираются из множества разных элементов для каждого игрока, и при большом количестве одновременных запросов их сборка в высоком разрешении может существенно нагрузить игровой сервер.

Технические нюансы

Первые сложности, связанные с платформой Bot API, возникли в первые же дни разработки. У Telegram есть 2 основные системы для связи их ботов с вашим сервером: так называемые Long Polling и Webhooks. Первая подразумевает, что ваш сервер будет с определенным интервалом постоянно опрашивать Telegram на предмет наличия новых запросов, и при наличии таких - обрабатывать, возвращая ответ Bot API. Второй же чуть более сложен в реализации – он заключается в том, что ваш сервер как-бы говорит Telegram «если у тебя появятся какие-то запросы – кидай их вот на этот адрес». Соответственно, для реализации бота на технологии Webhooks необходим постоянный IP адрес и обязательно SSL-сертификат, хотя бы самоподписанный. Начав разработку на основе Long Polling, я в начале не заметил никаких проблем, связанных с этим методом. Однако спустя сутки беспрерывной работы, бот неожиданно упал. Telegram начал возвращать ошибку при получении запроса. Как оказалось, эта проблема преследует абсолютно все боты на основе Long Polling – мессенджер Telegram закрывает обработку запросов от бота спустя какое-то время, из-за чего приходится его постоянно перезагружать.

Код не мой, это просто картинка для иллюстрации абзаца. Спасибо Text100 за это.

Сперва я решил попробовать автоматизировать процесс «реанимации» бота, написав cron-скрипт для проверки пульса процесса и перезапуска. Однако этот процесс постоянных перезапусков доставлял неудобства игрокам, т.к. занимал какое-то время, а так же сбрасывал текущие таймеры в игре. В итоге проект был перенесен на Webhooks, и данная проблема сразу же исчезла. Дальше в плане сложностей от самого Bot API все было спокойно. До одного момента.

Проект набирал масштабы, наращивал аудиторию и постоянно развивался. В один момент бот неожиданно начал «подтупливать» при получении запроса. Точнее, появилась задержка в ответе бота игроку. Первым делом я полез на сервер, думая что он перестал справляться с растущим количеством запросов. Всё бы хорошо, но нет. Нагрузка на сервер не превышала 30% в пиковые моменты, не наблюдалось проблем со свободной памятью, не было никаких ошибок и предупреждений в логе системы. Тормоза продолжали расти.

Как оказалось, бот стал упираться в лимит Bot API по количеству одновременных запросов к нему. В первое время, я успешно уменьшал и оптимизировал работу бота, чтобы снизить это количество. Однако по мере распространеия игры в массы, стало очевидно: очень скоро бот упрётся в этот потолок и никакие оптимизации с моей стороны не помогут. Тогда было решено написать в поддержку Telegram с просьбой увеличить лимиты конкретно для моего бота. И к моему огромному удивлению, они ответили уже на следующий день, а лимит был увеличен, хоть новый порог они и не назвали.

Кроме того, они сообщили мне, что бот упирается в лимит по конкретному типу запросов – Callback на т.н. Inline-кнопки. Это клавиатура в Telegram, которая отображается под конкретным сообщением. На текстовые запросы (в том числе и с обычных кнопок) лимит значительно выше, а так же нет ограничения в 15 секунд на ответ от сервера. Проблема была в том, что 70% интерфейса игры было построено на Inline-кнопках. Мне пришлось практически полностью его переработать, чтобы избавиться от этого зла, такого удобного и красивого.

Следующая проблема, с которой столкнулся проект, пряталась уже в моей среде разработки и коде. Конкретно, в Python 3 и в том, как он работает с потоками. Каждый новый поток в Python 3 создаётся вместе с переменными окружения, занимая большое количество памяти. В игре полно таймеров (2 минуты на переход между локациями, ожидание битвы и т.д.), и запуская их в отдельных потоках, создавалась утечка памяти. По мере роста онлайна игры, утечка достигла каких-то безумных масштабов, сжирая всю возможную оперативную память и подкачивая оставшуюся память SSD сервера. Разумеется, проблема была решена созданием очередей таймеров, обрабатывающихся в одном потоке для каждого типа.

Планы по развитию проекта

В данный момент игра переписывается на Go – этот язык, как оказалось, гораздо лучше подходит для разработки такого проекта. Наличие собственного веб-сервера в Go и его скорость работы позволила мне начать создание собственного API для проекта, чтобы отвязать его от одной единственной платформы в Telegram. API позволит получать и обрабатывать запросы с любого клиента, а вся логика будет обрабатываться только на сервере.

Таким образом, разработка клиента под любую платформу будет максимально простой, как и сам клиент, это позволит избежать многих ограничений Telegram, сложностей с его блокировкой, а так же привлечь большое количество новой аудитории в игру.

Что касается отвязки от Telegram, то она определённо нужна игре. Нет, я не собираюсь уходить из Telegram, но расширить спектр платформ всё-таки стоит. Сейчас в планах зайти на iOS, Android и браузерную платформу. Оценив ущерб от проблем с Telegram, я понимаю, что не стоит хранить все яйца в одной корзине. Собственно, в последнее время я и работаю над такой своего рода диверсификацией рисков пользовательского опыта.

Конкурс

Кстати, сейчас проходит конкурс на создание аватарки для Wasteland Wars. В конкурсе может принять участие любой желающий, но главное условие - понимать стилистику игры. Без стилистики решения рискуют быть поняты неправильно. От вас требуется творческое видение постапокалиптического мира, хардкора и веселья в целом. Это может быть иллюстрация пейзажа, либо логотип с названием игры. Если же это будет как-то совмещено, то это вдвойне здорово!

Творите, создавайте, делитесь с друзьями своими работами, а также присылайте их в @WWarsFeedbackBot для участия в конкурсе.

Итоги будут подведены 21 июня в 18:00 на праздничном стриме команды Wasteland Streamers

Авторы лучших творений получат ценные призы, включая эксклюзивные игровые предметы, и возможно, одна из работ будет на аватаре игры Wasteland Wars! Помимо всех прочих призов и возможностей победитель может рассчитывать на персональную маску!

#gamedev

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Максим Газизов", "author_type": "self", "tags": ["gamedev"], "comments": 2, "likes": 7, "favorites": 3, "is_advertisement": false, "subsite_label": "flood", "id": 20730, "is_wide": false, "is_ugc": true, "date": "Fri, 15 Jun 2018 15:18:01 +0300" }
{ "id": 20730, "author_id": 54270, "diff_limit": 1000, "urls": {"diff":"\/comments\/20730\/get","add":"\/comments\/20730\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/20730"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64955 }

2 комментария 2 комм.

Популярные

По порядку

0

В игре полно таймеров (2 минуты на переход между локациями, ожидание битвы и т.д.), и запуская их в отдельных потоках, создавалась утечка памяти.

Я не питонщик, можете подробнее? Эти таймеры тикают в рантайме? Вариант с записью времени начала события в базу не годился?

Ответить
0

Таймеры обрабатываются в одном потоке для каждого типа)

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
В Steam появилась функция продажи
подержанных цифровых копий игр
Подписаться на push-уведомления