Это был хороший урок на будущее для нашей команды, которая новичок в геймдеве: античит-система должна быть сильнее ☝️ Даже если игроки — это клиенты твоего продукта и вообще ничего плохого не хотели ?

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

Идея, с которой всё началось

На день рождения принято дарить подарки, поэтому мы решили разыграть 5 лет бесплатной Эльбы и сделали для этого игру. Прямо в сервисе, который занимается серьёзными делами: заполняет декларации, уменьшает налоги и в целом берёт на себя почти всю бюрократию ИП.

Придумали простую механику: игрок управляет персонажем → собирает бонусы и уворачивается от неприятностей → набирает очки. Лучшая сессия идёт в зачёт, топ-5 участников по итогам месяца получают подарки.

Когда решали, какие объекты будут попадаться на пути героя, ассоциативно привязывали всё к бизнесу: монетки, пачки денег, лайки и гениальные идеи с одной стороны. Штрафы, налоговые проверки и расходы на рекламу — с другой. Дизайнеры даже придумали и нарисовали свинью, которую могут «подложить» конкуренты. 

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

Настя, автор всей визуальной части, во многом вдохновлялась своим мужем-предпринимателем

Чтобы игра не была бесконечной, ввели два геймовера — долговую яму и судейский молоток. А ещё суперобъекты, которые усложняют или упрощают игровой процесс. Кофе, например, удваивает количество зарабатываемых очков, а звонок клиента замедляет человечка — он отвлекается на дела. 

Нашего маскота Эльбика тоже добавили — с ним персонаж не тратит время на налоги и отчёты и может спокойно заниматься бизнесом. Это даёт много денежек — аж целых 50 очков за раз.

Хакатон: несимметричная команда и движок, который никто не знал

Так как приоритетная работа наших программистов всё-таки связана с улучшением сервиса, игру они делали в формате хакатона — в свободное время свободными руками.

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

Дальше началась долгая и нудная часть — доработка. Я смотрел на игру два месяца и успел её возненавидеть, но теперь снова люблю. 

Если бы делал проект заново, сильнее бы защитил игру от читеров и добавил бы чуть больше порядка в организацию. В первый раз мы просто не знали, кто за что должен отвечать: работали без чёткого ТЗ, всю игровую механику, визуал и правила придумывали дизайнеры, а разработчики собирали игру без опыта в геймдеве. Но получилось всё равно классно.

Паша, разработчик и модератор хакатона

Основная сложность заключалась в том, что бэкендеров собралось заметно больше, чем фронтендеров, поэтому равномерно распределить задачи не получилось. Об этом не подумали заранее — хотелось, чтобы у всех была возможность поучаствовать.  

А вот с незнакомым игровым движком проблем не возникло — из всех вариантов остановились на простом и мощном Phaser.js. 

В отличие от чистого Canvas, где пришлось бы вручную реализовывать спрайты, анимации, коллизии и игровой цикл, Phaser предоставляет это всё «из коробки». При этом, освоить его в разы проще, чем собрать игровую логику на базе универсальных рендереров вроде PixiJS.

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

Короче, Phaser — это «золотая середина». Он достаточно прост для быстрого старта, но при этом мощен и гибок для создания полноценных 2D-игр без изобретения велосипеда.

Боль в глазах тестировщиков

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

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

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

А ещё поправили баг со смешным наложением предметов. Такой свиной шляпы вы больше никогда не увидите. 

У меня болели глаза от быстрого перемещения предметов по горизонтали, но в остальном было интересно. Всегда хотел поучаствовать в тестировании игр — мечта детства сбылась. 

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

Семён, тестировал игру

Релиз и проблемы с читерами

После тестирования игру заценил весь офис, и акция запустилась. Теперь пользователи могут бороться за призы до самой зимы: в конце каждого месяца рейтинг обнуляется и соревнование начинается заново, а мы награждаем победителей тура. 

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

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

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

Мы не стали тратить ресурсы на перенос, потому что это сложно и требовательно к инфраструктуре и сети — любые лаги и обрывы соединения приведут к очень странному поведению с точки зрения пользователя. Например, персонаж будет откатываться или собирать те бонусы, которые не должен.

Было непонятно, что делать с читерами. С одной стороны, обидно за ребят, которые играли честно. Но с другой — предприниматели предприимчивы по определению. Неудивительно, что кто-то отправился искать уязвимости. 

Забавно то, что некоторые хитрили только ради интереса.

Обойти вашу защиту было непросто, но в веб-играх всегда можно найти лазейки.

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

Дмитрий, основатель студии F4

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

Если захотите оценить игру, нужно будет к нам присоединиться, потому что аркада доступна только в сервисе. Это бесплатно — у нас есть тестовые периоды, которые мы специально продлили для читателей Хабра. Регистрация по этой ссылке до конца ноября даст +3 месяца к нашим стандартным триалам (месяц для всех и год — для ИП младше 3 месяцев). Все остальные функции Эльбы тоже будут доступны. Вдруг пригодятся ?

Пишите, что думаете об этой истории, и делитесь, как поступили бы на нашем месте с читерами. Спорить не будем, но комментарии почитаем с удовольствием ?

Комментарии (0)