Обычно мы делаем CRM, маркетплейсы, личные кабинеты. Но однажды к нам пришёл заказчик с необычным проектом — многопользовательской футбольной игрой в браузере. Игроки управляют футболистами на поле, каждый ход — 1,5 минуты, нужно координацию действий, чаты, таймеры, расчёт движения мяча.
Мы решили реализовать это на Falcon Space. Да, это не типичное применение, но платформа справилась. Проект занял 6 месяцев, бюджет — около 1,2 млн руб. Расскажу, как мы это сделали и почему даже нестандартные задачи можно решать на Falcon Space.
Заказчик хотел игру, где в каждой команде — несколько реальных игроков (людей). Каждый игрок управляет своим футболистом (одна позиция на поле). Вся игра разбита на ходы по 90 секунд. За ход каждый футболист перемещается на новую позицию (поле — сетка 10x10), отдаёт пас, бьёт по воротам. Бизнес-логика (движение мяча, взятие ворот) рассчитывается сервером в конце каждого хода.
Особенности:
Заказчик сначала хотел писать игру с нуля на Node.js + WebSockets, но потом обратился к нам — мы убедили попробовать Falcon Space.
Хранение состояния игры. Каждый матч — это таблица с полем positions (JSON), где хранятся координаты всех игроков на поле. Каждый ход — новая строка в таблице match_moves. Движение мяча — отдельная таблица.
Таймеры. Использовали встроенный механизм .NET Cron (плановые задачи). Запускается таймер на 90 секунд, после чего вызывается процедура, которая фиксирует ход, рассчитывает новое положение мяча и игроков, генерирует следующий таймер. Всё через SQL.
Координация игроков. Игроки отправляют свои действия (куда двигаться) через веб-форму. Действия сохраняются в БД. В конце хода процедура собирает все действия, применяет их и рассчитывает результат.
Чаты команд. Встроенный чат Falcon Space с привязкой к матчу и команде. Игроки обсуждают стратегию.
Проведение чемпионатов. Справочник команд, участников, расписание матчей. Система автоматически создаёт матчи по расписанию, запускает таймеры.
Самой сложной была логика расчёта движения мяча — это десятки условий (кто ближе к мячу, кто перехватил, удар, отскок). Написали это на SQL (T-SQL) с использованием временных таблиц и циклов. Работает за 0,2 секунды для одного хода.
WebSockets не понадобились. Обновление информации о матче происходит через AJAX-запросы раз в 2 секунды (браузер клиента спрашивает: «что изменилось?»). Это создаёт нагрузку на сервер, но мы протестировали — 100 одновременных игроков дают около 50 запросов в секунду, бюджетный VPS с 4 ядрами справляется.
Таймеры через SQL Server Agent. Запускаем задачу, которая при начале матча создаёт запись в таблице active_timers. Отдельный процесс раз в секунду проверяет, не истекло ли время, и запускает процедуру расчёта хода.
JSON для хранения позиций. MS SQL Server умеет работать с JSON: можно сохранить координаты в текстовом поле, а потом парсить. Это упростило хранение переменных данных.
Из отзыва заказчика (Startpack): «Делаем большой проект, интернет-игру, с помощью этого сервиса получилось намного сократить затраты и ускорить получение прототипа игры. Многие функции не пришлось делать новые, они уже были разработаны раньше. Команда разработчиков всегда на связи».
Цифры:
Заказчик планирует добавить 3D-визуализацию (через Three.js) и мобильное приложение, но серверная часть останется на Falcon Space.
Falcon Space создавался не для игр, но этот кейс доказывает: если ваша задача нестандартна (сложная бизнес-логика, таймеры, очереди, расчёты), платформа может справиться. Вам не придётся переходить на другой стек. Всё остаётся на SQL, а значит, вы сохраняете все преимущества:
Если у вас есть «нестандартная» задача, не спешите нанимать разработчиков на Java/Python. Приходите к нам, и мы обсудим, можно ли реализовать это на Falcon Space. Часто — да.