Решили: у игры одно окно на всё, что она говорит игроку. NoticeRequest получил СПИСОК ответов
(NoticeOption), и в него схлопнулись оба прежних диалога: разрыв связи и подтверждение
необратимого. Заодно на нём же сделано новое окно — приглашение в чужую игру.
Почему: число кнопок оказалось параметром, а не видом окна.
Сказано: «Это ведь тоже “окно-уведомление” и все. Просто вариация с двумя кнопками. Даже “эх, хост вылетел” и варианты - это тоже окно уведомления с разным количеством кнопок. Ты согласна? Не стоит ли это все делать из одного источника?» и «Любое окно закрывается только кноппкой. Т.е. это вид окна. Если чет иначе будет -я скажу потом. Пока все требует кнопки» (09.08.2026, сессия eab27015).
Второе решение убрало поле, которое я собиралась заводить. Я считала главной осью «можно ли закрыть окно, не ответив»: у подтверждения снос = «нет», у разрыва связи безопасного умолчания нет. Макс снял вопрос целиком — раз закрыть нельзя ничем, различать нечего, и у окна всегда есть хотя бы один ответ. Модель стала проще, чем предлагал я.
Что снесено: PeerLostRequest, PeerLostDialogView, PeerLostDialog.uxml, ConfirmDialog.uxml,
screens/confirm.uss, поля _peerLostDialog и _confirmDialog вместе с параметрами Initialize.
Три почти одинаковых экрана были ровно той формой, из-за которой в этот же день разъезжались экраны
узла, только в UI: правка текста или отступа попадала в один и минула два.
Приглашение в игру — новое. SteamMatchmaking.OnLobbyInvite (Action<Friend, Lobby>) приходит,
когда друг зовёт, а игра уже запущена; раньше мы слушали только OnGameLobbyJoinRequested, то есть
уже данное согласие. Теперь приглашение поднимается вопросом, и войти можно не отрываясь от игры.
Грабли:
Адрес берём у пригласившего, а не у лобби. Lobby.Owner читается из данных комнаты, а до входа
в неё их нет — вернулся бы ноль. Пригласить может только тот, кто в комнате сидит, и для релея нужен
именно его SteamId.
Steam покажет своё уведомление параллельно, отключить нельзя. Наше окно не заменяет системное, а даёт ответить в игре. Это принято сознательно, а не упущено.
Дважды поймали тесты покрытия — пять лок-ключей и четыре осиротевших USS-класса от снесённого диалога. Ни то, ни другое не видно ни глазами, ни компилятором.
Не проверено: окна никто не видел, и приглашение вживую не приходило — колбэк проверяется только на двух машинах со Steam. Покрыт шов, а не облик и не сеть.
Владелец правды: Core/Flow/NoticeMessages.cs, UI/NoticeDialogView.cs,
CoopSessionPresenter.OnInvited, SteamLobbyService.HandleInvited, CoopSession.AcceptInvite.