Решили: у игры появился один шов, чтобы сказать игроку что угодно, — NoticeRequest (вид
Info / Warning / Error) и BusyRequest (ожидание, снимаемое токеном заказчика). Оба идут через
MessagePipe тем же путём, что диалог разрыва связи. Вид собирается КОДОМ, без UXML.
Почему: сообщать было нечем. Каждое сообщение либо заводило себе персональный экран (разрыв связи, подтверждение), либо не показывалось вовсе — и вход в чужое лобби падал молча. Игрок видел только то, что игра не началась.
Кодом, а не разметкой — потому что UXML требует сериализованной ссылки в сцене, то есть редактора, а шов нужен раньше своего облика. Классы берутся из темы, поэтому окно уже выглядит своим, а переезд на UXML не тронет ни одного вызывающего. Это ВРЕМЕННО и заказано временным.
Публикует презентер сеанса, а не сама сессия: сеть не знает про окна игрока и знать не должна.
В CoopDisconnectPresenter для этого уже было всё — и состояние, и причина.
Сказано: «Все. Но очень в ранней версии. Просто ВРЕМЕННЫЙ экран загрузки, Система окон-предупреждений + ВРЕМЕННЫЙ дизайн и честный текст ошибок» (09.08.2026, сессия eab27015). Раньше, о симптоме: «Щас не понятно, что произошло, почему не смогли подключиться к пвп … Не хватает UI загрузки» (08.08.2026).
Честный текст — отдельное решение. «Хост не ответил» назначалось по СОСТОЯНИЮ Connecting, а не
по причине разрыва, и приходило даже когда хост отвечал исправно. Теперь текст описывает
наблюдаемое («Соединение закрылось, не дойдя до рукопожатия»), а подробность системы едет отдельным
полем Details и НЕ локализуется: перевести чужую диагностику нельзя, а потерять — значит снова
оставить игрока без ответа «почему».
Грабли: обе дисциплины проекта поймали меня тестами, и это ровно то, ради чего они стоят.
UiLocalizationCoverageTests — пять новых ключей не заведены в таблице; UssDeadCodeTests — четыре
класса используются в коде, но не описаны в теме. Ни одну из этих ошибок не видно ни глазами, ни
компилятором.
Долг: имя CoopDisconnectPresenter теперь врёт — класс отвечает за сеанс целиком, а не только за
разрыв. Переименование не сделано намеренно: дерево общее, а правка задела бы регистрацию в скоупе.
Не проверено: окна никто не видел. Вид собран кодом, тестами покрыт шов, а не облик; в билд это ещё не уезжало.
Владелец правды: Core/Flow/NoticeMessages.cs, UI/NoticeDialogView.cs,
MenuRouter.ShowNotice/ShowBusy, CoopDisconnectPresenter.ReportFailedJoin.