# Предметная модель ## Основные сущности ### 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.