Это был хороший урок на будущее для нашей команды, которая новичок в геймдеве: античит-система должна быть сильнее ☝️ Даже если игроки — это клиенты твоего продукта и вообще ничего плохого не хотели ?
Рассказываем: как придумывали объекты и персонажей, чтобы это было интересно пользователям онлайн-бухгалтерии, какой игровой движок попробовали, что о нём думаем и почему выбрали для разработки формат хакатона.
Идея, с которой всё началось
На день рождения принято дарить подарки, поэтому мы решили разыграть 5 лет бесплатной Эльбы и сделали для этого игру. Прямо в сервисе, который занимается серьёзными делами: заполняет декларации, уменьшает налоги и в целом берёт на себя почти всю бюрократию ИП.
Придумали простую механику: игрок управляет персонажем → собирает бонусы и уворачивается от неприятностей → набирает очки. Лучшая сессия идёт в зачёт, топ-5 участников по итогам месяца получают подарки.

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

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

Хакатон: несимметричная команда и движок, который никто не знал
Так как приоритетная работа наших программистов всё-таки связана с улучшением сервиса, игру они делали в формате хакатона — в свободное время свободными руками.
Мы с ребятами быстро поняли, что задача нестандартная, а значит, будет весело. Собрали команду из примерно десяти разработчиков, поделились на фронтенд и бэкенд, синхронизировались каждые пару часов и за два дня хакатона собрали первый рабочий прототип. С багами, конечно, но в него уже можно было играть.
Дальше началась долгая и нудная часть — доработка. Я смотрел на игру два месяца и успел её возненавидеть, но теперь снова люблю.
Если бы делал проект заново, сильнее бы защитил игру от читеров и добавил бы чуть больше порядка в организацию. В первый раз мы просто не знали, кто за что должен отвечать: работали без чёткого ТЗ, всю игровую механику, визуал и правила придумывали дизайнеры, а разработчики собирали игру без опыта в геймдеве. Но получилось всё равно классно.
Паша, разработчик и модератор хакатона

Основная сложность заключалась в том, что бэкендеров собралось заметно больше, чем фронтендеров, поэтому равномерно распределить задачи не получилось. Об этом не подумали заранее — хотелось, чтобы у всех была возможность поучаствовать.
А вот с незнакомым игровым движком проблем не возникло — из всех вариантов остановились на простом и мощном Phaser.js.
В отличие от чистого Canvas, где пришлось бы вручную реализовывать спрайты, анимации, коллизии и игровой цикл, Phaser предоставляет это всё «из коробки». При этом, освоить его в разы проще, чем собрать игровую логику на базе универсальных рендереров вроде PixiJS.
Важно и то, что Phaser отлично ложится в современный веб-стек: он полностью поддерживает TypeScript, легко интегрируется в React-приложение через хуки, а его производительности хватает даже для динамичных аркад.
Короче, Phaser — это «золотая середина». Он достаточно прост для быстрого старта, но при этом мощен и гибок для создания полноценных 2D-игр без изобретения велосипеда.
Боль в глазах тестировщиков
Когда игра была готова, её отдали тестировщикам, и для них это тоже был новый опыт. Искать баги в онлайн-бухгалтерии — одно, а в пиксельной аркаде с летающими монетками — совсем другое.
Над некоторыми вещами пришлось биться долго. Например, над тем, чтобы игра нормально работала на разных экранах: где-то вместо четырёх полос показывалось три, где-то молоток с первой полосы задевал тебя, когда бежишь по второй.
Много времени ушло и на то, чтобы настроить баланс сложности: тестировали разную скорость, меняли значения бонусов и вероятность их появления, добавили в игру паузу.
А ещё поправили баг со смешным наложением предметов. Такой свиной шляпы вы больше никогда не увидите.

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

Никто не ожидал, что участники будут писать ботов, чтобы победить в игре и забрать приз. Но на деле весь топ игроков в сентябре набрал какое-то нереальное количество очков. Это было видно даже моим невооружённым глазом, а у разработчиков и вовсе сомнений не было — сработала их система античита.
По-хорошему, надо было полностью перенести логику игры на сервер, чтобы он сам высчитывал скорость, столкновения и таймеры бонусов (сейчас это происходит по большей части на клиенте). Такой подход исключил бы возможность использования ботов: из браузера пользователя отправлялись бы только нажатия кнопок, а их просто так не хакнешь.
Мы не стали тратить ресурсы на перенос, потому что это сложно и требовательно к инфраструктуре и сети — любые лаги и обрывы соединения приведут к очень странному поведению с точки зрения пользователя. Например, персонаж будет откатываться или собирать те бонусы, которые не должен.
Было непонятно, что делать с читерами. С одной стороны, обидно за ребят, которые играли честно. Но с другой — предприниматели предприимчивы по определению. Неудивительно, что кто-то отправился искать уязвимости.
Забавно то, что некоторые хитрили только ради интереса.
Обойти вашу защиту было непросто, но в веб-играх всегда можно найти лазейки.
Я немного изменил настройки браузера — убрал все препятствия, оставил только монетки и запустил игру на ночь. Но хочу сказать, что для меня это был скорее эксперимент, а не попытка выиграть приз. Мы сами разрабатываем игры, и у нас тоже постоянно стоит вопрос, как защититься от находчивых пользователей.
Дмитрий, основатель студии F4
Наградили мы только честных участников, а героев-читеров порадовали утешительными призами — бесплатным кварталом Эльбы. Больше мы так делать не будем, но вся эта история лишний раз показала, какие у нас умные пользователи.
Если захотите оценить игру, нужно будет к нам присоединиться, потому что аркада доступна только в сервисе. Это бесплатно — у нас есть тестовые периоды, которые мы специально продлили для читателей Хабра. Регистрация по этой ссылке до конца ноября даст +3 месяца к нашим стандартным триалам (месяц для всех и год — для ИП младше 3 месяцев). Все остальные функции Эльбы тоже будут доступны. Вдруг пригодятся ?
Пишите, что думаете об этой истории, и делитесь, как поступили бы на нашем месте с читерами. Спорить не будем, но комментарии почитаем с удовольствием ?
