Когда игрок открывает браузерную игру, ему совершенно не важно, на каком языке написан сервер, где хранятся данные и какая технология отвечает за обновление экрана.
Ему важно другое.
Чтобы бой не зависал в самый неподходящий момент. Чтобы действия соперника появлялись сразу, а не после обновления страницы. Чтобы чат работал в реальном времени. Чтобы инвентарь не думал несколько секунд после каждого действия. Чтобы при большом онлайне игра продолжала работать так же быстро, как при ста игроках.
Поэтому сегодня впервые заглянем немного глубже внутрь BK Wars и расскажем, на каких технологиях строится игра и зачем мы выбрали именно их.
И нет, превращать дневник разработчиков в лекцию по программированию мы не собираемся.
Попробуем объяснить всё человеческим языком.
BK Wars — браузерная игра, но не браузерная игра из 2000-х
Для многих игроков словосочетание «браузерная RPG» до сих пор ассоциируется со страницами, которые постоянно перезагружаются после каждого действия.
Нажал кнопку.
Подождал.
Страница обновилась.
Сделал следующий ход.
Снова подождал.
Когда-то это было нормой. Сегодня — уже нет.
BK Wars изначально строится как современное веб-приложение. Браузер для нас — это способ запустить игру практически с любого устройства, а не ограничение, заставляющее использовать технологии двадцатилетней давности.
И особенно хорошо это видно по архитектуре проекта.
Python и FastAPI — сердце серверной части
Основная серверная часть BK Wars создаётся на Python с использованием FastAPI.
Если совсем просто, сервер — это та часть игры, которая находится «за экраном» и решает, что происходит на самом деле.
Игрок отправил заявку на бой. Надел предмет. Получил опыт. Перешёл в другую локацию. Купил вещь. Использовал свиток.
Все эти действия должны быть проверены, обработаны и сохранены.
FastAPI хорошо подходит для систем, где одновременно происходит большое количество различных запросов и часть процессов должна обрабатываться асинхронно.
Для BK Wars это особенно важно: перед нами не обычный информационный сайт, а постоянно меняющийся игровой мир.
PostgreSQL — память игрового мира
Основной базой данных используется PostgreSQL.
Здесь будет храниться постоянная информация игрового мира: персонажи, предметы и множество связанных с ними данных.
Игровые системы сильно связаны между собой.
У персонажа есть характеристики. У него есть вещи. Вещи могут быть надеты или находиться в инвентаре. У предметов существуют собственные параметры. Персонаж взаимодействует с другими персонажами и игровыми системами.
И всё это должно оставаться целостным.
Условно говоря, нельзя допустить ситуацию, когда игрок продал меч, получил за него деньги, а сам меч из-за ошибки одновременно остался у него в инвентаре.
Поэтому надёжная работа с игровыми данными для нас не менее важна, чем красивый интерфейс.
Redis — когда ждать базу данных слишком долго
Но далеко не каждую информацию нужно постоянно записывать в основную базу.
Во время боя состояние меняется очень быстро.
Кто сейчас делает ход? Сколько времени осталось? Каково текущее состояние боя? Какие активные процессы происходят прямо сейчас?
Для таких быстро меняющихся данных в архитектуре BK Wars используется Redis.
Он позволяет работать с информацией непосредственно в оперативной памяти и получать её очень быстро.
Для игрока вся эта техническая кухня должна выражаться в одном простом результате:
нажал — игра отреагировала.
WebSocket — бои и чат без постоянного обновления страницы
А вот это уже технология, результат которой игрок сможет почувствовать особенно хорошо.
BK Wars использует WebSocket для обмена данными в реальном времени.
В старой модели браузер обычно спрашивал сервер:
— Что-нибудь изменилось?
Получал ответ.
Через некоторое время спрашивал снова.
WebSocket позволяет держать постоянное соединение между игрой и сервером.
Произошло событие — сервер может сразу передать его игроку.
Именно поэтому эта технология особенно важна для боёв и игрового чата.
Действия участников сражения, изменения состояния боя и новые сообщения могут появляться без необходимости постоянно перезагружать страницу.
Браузерная игра при этом начинает ощущаться гораздо ближе к полноценному игровому клиенту.
Фоновые процессы тоже работают отдельно
В игре постоянно существуют процессы, которые должны происходить сами по себе.
Например, восстановление ресурсов персонажа, контроль времени отсутствия активности и другие периодические операции.
Для подобных задач в нашей архитектуре используется связка Celery + Redis.
Главный смысл опять же не в названии технологии.
Смысл в том, чтобы не заставлять основные игровые процессы заниматься работой, которую можно спокойно выполнить отдельно.
Игровой сервер должен заниматься игроком тогда, когда это действительно необходимо, а фоновые процессы — жить своей жизнью.
React + TypeScript — то, что непосредственно видит игрок
Если серверная часть является мозгом BK Wars, то клиентская — это всё, с чем взаимодействует игрок.
Интерфейс игры создаётся на React + TypeScript.
Перед нами довольно сложная задача.
На одном экране одновременно могут находиться персонаж, его характеристики, экипировка, список других игроков, чат, навигация, различные действия и множество изменяющихся состояний.
А во время боя интерфейс становится ещё динамичнее.
Поэтому мы строим его не как набор отдельных статичных страниц, а как систему взаимосвязанных компонентов, которые могут обновляться независимо друг от друга.
Изменилось одно значение — нет необходимости заново загружать весь экран.
Zustand и Effector — чтобы игра понимала своё текущее состояние
В обычном сайте состояние страницы относительно простое.
В игре всё веселее.
Открыт инвентарь. Пришло сообщение. Изменилось состояние персонажа. Начался бой. Появился новый участник. Изменился таймер. Игрок переключил элемент интерфейса.
Клиент должен постоянно понимать, что происходит прямо сейчас.
Для управления такими состояниями мы используем Zustand и Effector.
Игрок этих названий никогда не увидит.
И это прекрасно.
Если архитектура работает хорошо, игрок вообще не должен задумываться о её существовании.
Tailwind CSS — единый интерфейс вместо сотни разных экранов
Для построения визуальной части используется Tailwind CSS.
Но здесь для нас важна не скорость написания стилей сама по себе.
BK Wars предстоит получить большое количество экранов и элементов интерфейса. Они должны выглядеть как части одной игры, а не как страницы, которые в разное время делали разные люди.
Поэтому параллельно формируется единая система интерфейсных компонентов.
Кнопка должна оставаться кнопкой BK Wars независимо от того, находится она в инвентаре, анкете персонажа или другом разделе игры.
Зачем всё это игроку?
Можно было вообще не рассказывать названия технологий.
Но нам кажется важным показать одно принципиальное отличие BK Wars.
Мы хотим вернуть атмосферу классической браузерной RPG, а не её технические ограничения.
Поэтому под знакомыми игрокам персонажами, предметами, боями, чатами и локациями находится уже совершенно другая технологическая основа.
FastAPI обрабатывает серверную логику.
PostgreSQL хранит постоянный игровой мир.
Redis помогает работать с быстро меняющимися состояниями.
WebSocket обеспечивает взаимодействие в реальном времени.
React + TypeScript отвечают за современный игровой интерфейс.
А дополнительные инструменты связывают всё это в единую систему.
Игроку совершенно необязательно знать эти названия.
Ему достаточно почувствовать результат.
А дальше — уже сама игра
Технологический фундамент — только средство.
В конечном счёте никого из нас не заставит провести вечер в BK Wars удачно выбранная база данных.
Это должны сделать бои, развитие персонажа, предметы, противостояние игроков, кланы, общение и сам игровой мир.
И вот о них мы начнём рассказывать в следующих выпусках дневника разработчиков.
Причём теперь уже не только о том, что мы планируем сделать, а начнем рассказывать о том, что в BK Wars уже реализовано.
Продолжение следует.

