Архитектура¶
По историческим причинам «Сказка» — монолитный проект с сильной связанностью, это начало усложнять реализацию новых фич. Поэтому сейчас он переписывается на микросервисы. Пока идёт активная фаза рефакторинга, сервисы выделяются логически, но не выносятся из основного репозитория (ложаться в соседние каталоги). Когда крупные изменения закончатся, сервисы будут разнесены в разные репозитории.
На этой странице описана архитектура игры, какой она должна стать.
Базовая структура¶

Стрелками указано использование сервисами друг друга.¶
Все сервисы игры можно разделить на две группы:
- frontend — сервисы, с которыми так или иначе взаимодействуют пользователи.
- backend — сервисы, не доступные напрямую для пользователей.
Frontend сервисы проверяют права доступа и используют backend сервисы для получения данных и инициации изменений. Backend сервисы реализуют специализированные куски логики и не делают неспецифичных проверок (например, не проверяют права доступа).
Backend сервисы недоступны извне, доверяют всем клиентам и не реализуют GUI (предоставляют только API).
Коммуникация сервисов происходит через передачу сообщений в формате Protocol Buffers 3 по протоколу HTTP.
Существующие сервисы¶
Текущий список сервисов.
- the_tale — сайт игры (сейчас содержит и основную логику);
- tt_diary — хранилище сообщений в дневнике героя;
- tt_market — рынок;
- tt_personal_messages — личные сообщения;
- tt_storage — хранилище предметов игрока (в рамках Сказки, карты судьбы).
- tt_bank — хранилище игровой валюты с поддержкой транзакций.
- tt_timers — управление таймерами (например, на получение карты), по истечении таймера делает заданные http запрос.
- tt_impacts — учёт численных «воздействий» одних сущностей на другие. Например, влияние героев на Мастеров.
- tt_events_log — хранилище истории игровых событий с привязкой к «тегам» и фильтром по ним.
- tt_effects — хранилище эффектов, действующих на объекты игры.
- tt_matchmaker — простой сервис поиска соперника для pvp и отслеживания активных боёв.
- tt_properties — хранилище свойств объектов, нужных в частных случаях логики (например, флаг «разрешить приглашать игрока в клан»).
- tt_uniquer — сервис выделения уникальных целочисленных идентификаторов для строк.
the_tale¶
Вся функциональность игры: как логика, так и инфраструктура (форум, регистрация, лингквистика, etc).
По мере рефакторинга в этом компоненте останется только сам сайт.
tt_market¶
Реализация рынка торговли предметами.
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- выставление предмета на продажу;
- возвращение предмета с продажи;
- покупка предмета;
- получение информации о выставленных предметах;
- получение списка выставленных предметов конкретного типа.
- логирование всех операций.
tt_personal_messages¶
Личные сообщения игроков.
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- создание сообщений;
- удаление сообщений;
- получение списка сообщений (входящих/исходящих, по фильтру);
- поиск сообщений;
tt_storage¶
Предметы игрока. Используется для хранения карт судьбы.
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- помещение предмета в хранилище;
- удаление предмета из хранилища;
- передача предмета другому игроку;
- перемещение предмета между «карманами» хранилища;
- логирование всех операций.
tt_bank¶
Хранилище игровой валюты с поддержкой транзакций.
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- болучение баланса аккаунта в каждой валюте;
- транзакции: начал, окончание, откат;
tt_timers¶
Управление таймерами (например, на получение карты или постройки здания), по истечении таймера делает заданные http запрос.
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- создание таймера с заданными параметрами;
- изменение скорости выполнения таймера;
- http запрос по истечению таймера;
- автопродление таймера.
tt_impacts¶
Учёт численных «воздействий» одних сущностей на другие. Например, влияние героев на Мастеров, учёт известности героев, учёт голосов за запись в Книге Судеб, etc.
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- добавление воздействия;
- получение списка последних воздействий;
- получение суммарных воздействий на перечисленные сущности;
- получение суммарных воздействий от указанной сущнсти на сущности переданных типов;
- получение рейтинга сущностей, больше всего повлиявших на указанные сущности;
- скалирование итоговых сумм воздействий (например, чтобы уменьшать их со временем).
tt_events_log¶
Хранилище истории игровых событий с привязкой к «тегам» и фильтром по ним. Позволяет организовать отображение такую функиональность как «последние события в гильдии».
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- добавить событие;
- получить события по фильтру;
- получить последние события;
tt_effects¶
Хранилище эффектов, действующих на объекты игры. Предполагается, что эффекты могут вешаться на объекты из разных мест игры. Чтобы унифицировать этот процесс, все они шлются в этот сервис, из которого уже выбираются соответствующими объектами (по таймеру или по команде).
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- зарегистрировать эффект;
- удалить эффект;
- изменить эффект;
- получить список эффектов;
tt_matchmaker¶
Простой сервис поиска соперника для pvp и отслеживания активных боёв.
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- создать запрос на битву;
- отменить запрос на битву;
- принять запрос на битву;
- создать битву;
- получить список запросов на битву;
- получить текущую статисику (количество битв, количество запросов);
- завершить битву;
- получить список участников битвы;
tt_properties¶
Хранилище свойств объектов, нужных в частных случаях логики (например, флаг «разрешить приглашать игрока в клан»). Позволяет избежать раздувания основных объектов игры (аккаунт, герой, гильдия, etc).
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- установить свойства;
- получить свойства;
tt_uniquer¶
Сервис выделения (и хранения) уникальных целочисленных идентификаторов для строк.
Не привязан к логике игры, может быть использован отдельно.
Функциональность:
- получить уникальный идентификатор по строке;
Планируемые сервисы¶
- HTTP API 2.0;
- Галерея изображений;
- Фольклор;
- Сервис генерации информеров;
- Сервис выдачи краткой информации по объектам игры;
- Форум;
- Регистрация (плюс поддержка авторизации через популярные OAuth провайдеры);
- Кланы;
- Достижения;
- Друзья;
- Приём платежей от XSolla;
- Сервис рассылки сообщений на почту игроков;
- Статистика;
- Игровая логика (разобьётся на несколько сервисов);
- Карта — ландшафт;
- Карта — логика (города, дороги, etc).