Решили: BattleStagePresence снова поднимается СРАЗУ при старте фона меню, а ожидание первого
кадра с бойцами переехало в CameraModeController: он держит вход в слежение, пока
CombatFocusTarget.HasUnits ложно, и входит (с мгновенным кадром) на первом кадре с бойцами.
Отменяет решение из записи 2026-08-04-the-stage-goes-up-when-there-is-something-to-frame, где
ждать первого кадра поручалось директору меню. Причина отмены: сигнал сцены читает не только камера —
по нему же являет себя арена (ArenaStagePresenter), и её опоздание оставляло на переходе со сплеша в
меню голый задник без арены. Диагноз того захода («камера не должна ехать к цели, которой нет»)
остаётся верным — неверным был адресат ожидания.
Почему так: ждать нужно ровно тому, кому есть чего ждать. Арене цель слежения безразлична, она статична и обязана быть на месте к моменту появления меню. Камере, наоборот, ехать не к кому, пока в фокусе нет точек. Один сигнал по-прежнему один — просто его потребители реагируют по-разному, и это их право, а не повод расщеплять сигнал надвое.
Сказано: «При переходе из сплеша в меню - есть момент когда арены еще нет. И это выглядит плохо очень» (04.08.2026, сессия 78678294).
Грабли: починка одного потребителя общего сигнала сломала другого, причём молча — арена не жалуется, она просто появляется позже. Общий сигнал стоит трогать только на стороне того, кто его читает; сдвигая сам сигнал, двигаешь всех подписчиков разом.
Владелец правды: Presentation/Camera/CameraModeController.cs (_stageAwaitingFocus,
OnStageChanged → EnterStageFraming), Game/Flow/MenuBattleDirector.cs (поднимает сцену в StartNext).