Решили: подключение к чужой игре показывается полноэкранной заслонкой (BusyRequest.TakesOver),
держится ДО первого доехавшего снимка забега, а не до рукопожатия, и по дороге меняет строку этапа
отдельным сообщением BusyStageChanged.
Почему: ожидание снималось по CoopSessionState.Connected, но Connected — это принятое
рукопожатие, а не вход в игру: сеанс гостя открывается позже, и только потом он просит у хозяина
состояние забега (GuestRunState, GuestActivityFollower, GuestSessionStage шлют запросы из
своих Start). Между этими моментами игрок сидел на пустом экране без единого признака, что
что-то происходит. Теперь экран живёт до RunPartyReadyEvent — сигнала «первый снимок пришёл».
Этап меняется отдельным сообщением, а не повторным BusyRequest: повторный заказ пересобрал бы
экран, и кольцо дёрнулось бы с начала — продвижение читалось бы как мигание.
Сказано: «Полноэкранное подключение к лобби» и «Этапы строкой (рекоменд.)» (21.08.2026, сессия
26182ec4); решение о полноэкранном виде принято днём раньше — см. journal-adr.md §2026-08-21.
Грабли:
- Между Connecting и Connected сигнал есть, но наружу не выходит.
SteamNetTransportподнимаетPeerConnected,CoopSessionна него шлётSayHello— и всё: состояние сессии не меняется, публикаций нет, след только вDiag.Log. Поэтому этапов у экрана два, а не три: показывать «соединились» до рукопожатия нечем, и выдумывать третий этап по таймеру нельзя — это анимация прогресса, которая врёт заметнее всего там, где связь встала. - Потолка по времени у ожидания нет намеренно. Вход посреди боя законно длится до 30 с
(
MidBattleJoinHold), и таймаут-страховка резала бы честное ожидание. Выход у игрока есть — кнопка отмены, которая делает настоящее дело (Leave), а не просто снимает картинку. - Строка ожидания на пустом кадре не должна лежать строкой. В окне кольцо стоит слева от текста;
на всём кадре та же композиция центрируется целиком, а глаз ищет ось по тексту — кнопка под ней
выглядит съехавшей. Лечится колонкой (
.gm-busy--takeover .gm-wait).
Владелец правды: Assets/_Project/Scripts/Game/Session/CoopSessionPresenter.cs,
Assets/_Project/Scripts/Core/Flow/NoticeMessages.cs, Assets/_Project/UI/Theme/components/notice.uss.