Files
mixmaker/memory_bank/domain_model.md
lemintare 1239fcee08
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
CI / compose (push) Has been cancelled
Initialize project with basic structure, including Docker configuration, backend and frontend setup, environment configuration, and essential files for development.
2026-07-19 00:17:31 +03:00

115 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Предметная модель
## Основные сущности
### Player
Игрок связан с Discord-аккаунтом и имеет отображаемое имя и собственный Overwatch-ранг для каждой роли: Tank, Damage, Support. Лестница содержит 40 значений от Bronze 5 до Champion 1: Bronze, Silver, Gold, Platinum, Diamond, Master, Grandmaster, Champion, каждый с дивизионами 5 → 1. Для вычислений значения преобразуются в ordinal 140.
Игрок редактирует ранги самостоятельно; Admin может видеть время последнего изменения. Игрок выбирает любое число предпочитаемых ролей и до трёх желаемых союзников. Предпочтения являются мягкими пожеланиями, а не гарантией состава.
### Account
Учётная запись Discord с глобальной ролью Player или Admin. Admin назначается только другим Admin либо через начальный список Discord ID в конфигурации развёртывания. Изменение роли записывается в аудит.
### Event
Запланированный игровой вечер: название, дата и время, часовой пояс, описание, дедлайн регистрации, формат команд, регламент, турнир и текущее состояние.
### EventRegistration
Отметка игрока в календаре со статусом Going, Maybe или NotGoing. Игрок меняет собственный статус, а Admin может изменить его за игрока. Регистрация хранит автора и время последнего изменения, чтобы интерфейс явно показывал административное действие. В момент закрытия регистрации Admin подтверждает список участников; только Going-игроки по умолчанию попадают в балансировку.
### Team
Состав игроков, назначенный Admin капитан, цвет/название и рассчитанные показатели силы. Капитан должен входить в текущий состав команды; переназначение фиксируется в аудите.
- общий средний рейтинг;
- средний рейтинг по каждой роли;
- распределение игроков по ролям;
- оценка доверия к балансу.
### Ruleset
Версионируемый набор правил серии:
- формат Bo3;
- последовательность режимов;
- пулы карт по режимам;
- порядок банов карт и героев;
- лимиты банов по ролям;
- ограничения повторных банов в серии.
### Series
Матч двух команд в рамках события или турнирной сетки. Хранит жеребьёвку, порядок первого бана, карты, счёт, статус и итогового победителя.
### MapResult
Исход отдельной карты: победившая команда либо ничья, счёт/заметка при необходимости и автор фиксации. Результат карты обновляет счёт серии; завершённый Bo3 определяет победителя автоматически. Организатор может исправить ошибочный результат, при этом изменение попадает в аудит.
### MapDraft
Пошаговое исключение карт из пула выбранного режима до одной оставшейся карты. Для тайбрейкера ранее сыгранная Control-карта исключается.
### HeroDraft
Четыре бана перед картой в порядке A → B → A → B. Каждая команда выбирает двух героев разных ролей. Героя, которого команда уже банила в этой серии, она не может забанить снова; героя, ранее забаненного соперником, банить можно.
### Tournament
Формат и состояние турнирной сетки, участники, раунды, пары и продвижение победителей.
## Правила текущего регламента
### Карты
Базовая последовательность Bo3:
1. Control;
2. Hybrid или Escort;
3. Control-тайбрейкер, если счёт 1:1.
Альтернативная последовательность: Control → Push → Escort.
Первый бан определяется жеребьёвкой. Затем команды по очереди исключают карты внутри пула режима, пока не останется одна.
### Герои
- перед каждой картой банятся четыре героя;
- порядок: A → B → A → B;
- каждая команда банит двух героев разных ролей;
- один и тот же герой может быть забанен командой только один раз за серию;
- бан героя соперником не расходует собственную возможность забанить этого героя позже.
## Балансировка
Целевая функция должна учитывать не только близость общего среднего рейтинга команд, но и:
- разницу средних рейтингов по ролям;
- корректность состава 1 Tank / 2 Damage / 2 Support;
- назначение игроков на предпочитаемые роли;
- попадание выбранных игроком союзников в одну команду;
- запрет повторения составов при регулярных играх;
- заранее заданные пары или ограничения «вместе/раздельно».
Алгоритм должен возвращать не только составы, но и понятную оценку качества и причины оставшегося дисбаланса.
Жёсткие ограничения 1/2/2 и уникальности игроков всегда важнее предпочтений. Разница рейтингов имеет больший вес, чем пожелания. В MVP используется детерминированная эвристика: несколько начальных назначений, взвешенная целевая функция и локальные обмены игроков одной роли. Архитектура допускает замену на CP-SAT/MILP solver.
## Доменные события
- EventCreated;
- PlayerJoinedEvent;
- EventRegistrationChanged;
- TeamsBalanced;
- TeamCaptainAssigned;
- CoinTossResolved;
- MapBanned;
- MapSelected;
- HeroBanned;
- MapResultRecorded;
- MapResultCorrected;
- SeriesCompleted;
- BracketAdvanced.