Решили: мероприятие получает вид — ActivityKind (None / Campaign / ProvingGrounds) плюс
ActivitySetup с двумя ограничениями площадки. Вид называется при входе (ActivityHost.Open(setup))
и читается через IActivityView. Интерфейс спрашивает «где мы» у мероприятия и по этому ответу
показывает панель забега, панель площадки и кнопку «Начать».
Сказано: «А зачем вообще testZoneActive? Или что это? Это не костыль? … По логике тест бои наши - это просто прегены для ристалища.» (02.08.2026, сессия f24f0cc4).
Почему: место игрока выводилось из двух косвенных признаков — run == null && _testZoneActive, —
и владелец второго (DeploymentController) живёт внутри боевого скоупа. Пока бой был вечным,
владелец всегда отвечал. Когда бой стал рождаться по требованию (фаза 1), интент «включи площадку»
стало некому обработать: на входе боя ещё нет, а когда он появился, событие уже улетело — шина
истории не хранит. Итог: UI считал, что мы нигде, и прятал панель вместе с кнопкой «Начать», хотя бой
шёл и фаза Deployment до интерфейса доходила.
Три решения Макса, закрывшие развилки: PvP — это Ристалище с двумя флагами (скрыть чужой строй, двигать только своих), а не отдельный вид; дев-арены как вида больше нет — тест-бои это прегены состава для Ристалища; сессия будет рождаться в меню («Создать» / «Присоединиться»), а не на буте (последнее — следующий шаг).
Что из этого следует в коде:
- Площадка открывается вместе с ареной:
ActivityHost.Open(ProvingGrounds)сразу зовётBattleHost.OpenEmpty(). Забег арену не поднимает — там её заказывает узел. BattleHost.OpenEmpty()— своя дверь, а неOpen(null): пустой пресет вOpenэто ошибка вызова («бой заказали, а чем — не сказали»), а на площадке пустота и есть смысл.GameFlow.ShowProvingGroundsAsyncоткрывает мероприятие и закрывает его вfinally, а интент серой зоны публикует уже внутри — теперь ему есть кому ответить._testZoneActiveвUiRootBootstrapудалён. Событие тест-зоны осталось, но только про экран боя: «серая зона включена» — это не «мы на Ристалище».
Владелец правды: Data/Definitions/Activity.cs, Game/Activity/ActivityHost.cs,
Game/Flow/BattleHost.OpenEmpty, тесты ActivitySetupTests.