115 lines
7.6 KiB
Markdown
115 lines
7.6 KiB
Markdown
# Предметная модель
|
||
|
||
## Основные сущности
|
||
|
||
### Player
|
||
|
||
Игрок связан с Discord-аккаунтом и имеет отображаемое имя и собственный Overwatch-ранг для каждой роли: Tank, Damage, Support. Лестница содержит 40 значений от Bronze 5 до Champion 1: Bronze, Silver, Gold, Platinum, Diamond, Master, Grandmaster, Champion, каждый с дивизионами 5 → 1. Для вычислений значения преобразуются в ordinal 1–40.
|
||
|
||
Игрок редактирует ранги самостоятельно; 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.
|