Add event management features to API, including event cancellation, deletion, registration closure, and workflow balance generation. Introduce new roster management endpoints and enhance participant handling with avoided player preferences. Update database schema and service logic to support these changes.
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
Игрок связан с Discord-аккаунтом и имеет отображаемое имя и собственный Overwatch-ранг для каждой роли: Tank, Damage, Support. Лестница содержит 40 значений от Bronze 5 до Champion 1: Bronze, Silver, Gold, Platinum, Diamond, Master, Grandmaster, Champion, каждый с дивизионами 5 → 1. Для вычислений значения преобразуются в ordinal 1–40.
|
||||
|
||||
Игрок редактирует ранги самостоятельно; Admin может видеть время последнего изменения. Игрок выбирает любое число предпочитаемых ролей и до трёх желаемых союзников. Предпочтения являются мягкими пожеланиями, а не гарантией состава.
|
||||
Игрок редактирует ранги самостоятельно; Admin может видеть время последнего изменения. Игрок выбирает любое число предпочитаемых ролей, до трёх желаемых союзников и до трёх игроков для avoid. Предпочтения и avoid являются мягкими пожеланиями, а не гарантией состава; один игрок не может одновременно находиться в обоих списках.
|
||||
|
||||
### Account
|
||||
|
||||
@@ -20,6 +20,21 @@
|
||||
|
||||
Отметка игрока в календаре со статусом Going, Maybe или NotGoing. Игрок меняет собственный статус, а Admin может изменить его за игрока. Регистрация хранит автора и время последнего изменения, чтобы интерфейс явно показывал административное действие. В момент закрытия регистрации Admin подтверждает список участников; только Going-игроки по умолчанию попадают в балансировку.
|
||||
|
||||
### Жизненный цикл события
|
||||
|
||||
Событие проходит серверно контролируемые состояния:
|
||||
|
||||
1. `RegistrationOpen` — игроки меняют RSVP, Admin добавляет гостей;
|
||||
2. `RegistrationClosed` — список участников зафиксирован, обычные RSVP заблокированы;
|
||||
3. `Balancing` — создаются варианты команд и резерв;
|
||||
4. `RostersDraft` — Admin выбирает вариант, меняет игроков одной роли местами и заменяет их резервными;
|
||||
5. `RostersConfirmed` — составы 1/2/2 и капитаны проверены и заблокированы;
|
||||
6. `Live` — создана серия, разрешены только действия текущего шага жеребьёвки, банов или результата;
|
||||
7. `Completed` — серия или турнир завершены;
|
||||
8. `Cancelled` — Admin отменил событие; оно остаётся в календаре, но игровые действия заблокированы.
|
||||
|
||||
Переходы выполняются отдельными командами API с проверкой ожидаемой версии. Нельзя начать скрим без минимум двух полных команд, валидного состава 1/2/2 и капитана в каждой команде. После `RostersConfirmed` обычная перестановка запрещена. Аварийная замена во время `Live` доступна только Admin, должна сохранять ролевой состав и записывается в аудит. Полное удаление события является отдельной Admin-командой и каскадно удаляет его RSVP, составы, roster draft, серии, турнир и event-scoped аудит.
|
||||
|
||||
### Team
|
||||
|
||||
Состав игроков, назначенный Admin капитан, цвет/название и рассчитанные показатели силы. Капитан должен входить в текущий состав команды; переназначение фиксируется в аудите.
|
||||
@@ -50,7 +65,7 @@
|
||||
|
||||
### MapDraft
|
||||
|
||||
Пошаговое исключение карт из пула выбранного режима до одной оставшейся карты. Для тайбрейкера ранее сыгранная Control-карта исключается.
|
||||
Для первой карты — пошаговое исключение карт из пула до одной оставшейся. Вторую и последующие карты напрямую выбирает команда, проигравшая предыдущую карту; после ничьей право выбора получает команда, проигравшая начальный жребий. Ранее сыгранные карты исключаются.
|
||||
|
||||
### HeroDraft
|
||||
|
||||
@@ -72,7 +87,7 @@
|
||||
|
||||
Альтернативная последовательность: Control → Push → Escort.
|
||||
|
||||
Первый бан определяется жеребьёвкой. Затем команды по очереди исключают карты внутри пула режима, пока не останется одна.
|
||||
Первый бан первой карты определяется жеребьёвкой. Затем команды по очереди исключают карты внутри пула режима, пока не останется одна. После завершения карты FSM переходит в `MapPick`: проигравшая команда выбирает следующую доступную карту, после чего начинается hero draft.
|
||||
|
||||
### Герои
|
||||
|
||||
@@ -89,6 +104,7 @@
|
||||
- разницу средних рейтингов по ролям;
|
||||
- корректность состава 1 Tank / 2 Damage / 2 Support;
|
||||
- назначение игроков на предпочитаемые роли;
|
||||
- разведение по разным командам игроков из avoid-списков;
|
||||
- попадание выбранных игроком союзников в одну команду;
|
||||
- запрет повторения составов при регулярных играх;
|
||||
- заранее заданные пары или ограничения «вместе/раздельно».
|
||||
@@ -97,6 +113,8 @@
|
||||
|
||||
Жёсткие ограничения 1/2/2 и уникальности игроков всегда важнее предпочтений. Разница рейтингов имеет больший вес, чем пожелания. В MVP используется детерминированная эвристика: несколько начальных назначений, взвешенная целевая функция и локальные обмены игроков одной роли. Архитектура допускает замену на CP-SAT/MILP solver.
|
||||
|
||||
Ручная корректировка не изменяет исходные варианты балансировщика: выбранный вариант копируется в редактируемый roster draft. Обмен допускается только между слотами одинаковой роли. Замена из резерва назначает игрока в конкретный ролевой слот и пересчитывает показатели обеих команд и резерва.
|
||||
|
||||
## Доменные события
|
||||
|
||||
- EventCreated;
|
||||
|
||||
Reference in New Issue
Block a user