Что в коопе одно на всех, а что личное. Док дизайнерский: он формулирует требования к ощущению, а как их выполнить — решает тех-вика (Journal - Host-Authoritative, Not Lockstep, host-authoritative, решено 2026-06-19).
Заведён 2026-07-30 по заметке Макса: «view у нас целиком просчитан заранее, там просто смотри мультик вместе как видео. А мышки и прочее — риалтайм». Эта мысль и есть ось дока: у разных сущностей разная природа синхронности, и путать их дорого.
Четыре класса синхронности
| Класс | Что сюда попадает | Природа | Что недопустимо |
|---|---|---|---|
| 1. Кино | бой | результат предпросчитан, воспроизводится у всех | у двух игроков разный исход одного боя |
| 2. Транзакции | траты казны, покупки, драфт, расстановка, голосование, найм | одна очередь, один авторитет | молчаливый откат того, что игрок уже увидел |
| 3. Присутствие | курсоры, наведение, драг, пинги, реакции | быстро и ненадёжно, потеря допустима | зависимость механики от жеста |
| 4. Локальный шум | камера, зум, тултипы, мелкий VFX, звук | не синхронизируется вовсе | навязывание своего кадра остальным |
Практическая польза деления: экономит и трафик, и споры. Класс 1 — один пакет на бой вместо потока состояний; класс 3 — поток мелких пакетов, которые можно терять; класс 4 — вообще не сеть.
Класс 1: бой как кино
Бой детерминирован и автономен: ввода во время сражения нет ни у кого (combat-system). Значит бой целиком определяется входом — расстановкой, составом, сидом. Отсюда дизайн-требования:
- Все смотрят один и тот же бой. Не «примерно тот же»: одинаковые тайминги, одинаковые смерти, одинаковый исход. Это условие того, что обсуждение боя вообще имеет смысл («видел, как он развернулся?» — да, видел то же самое).
- Пауза — общая, а скорости показа не существует вовсе. Пауза нужна, чтобы осмотреться и обсудить (controls); личная пауза сделала бы разговор невозможным, поэтому нажал один — встало у всех, и видно кто. Ускорения же нет ни личного, ни общего: фаст-форвард означал бы, что бой скучно смотреть, и ломал бы режиссуру, рассчитанную на нормальный темп (решение Макса 2026-07-29, зафиксировано в коде показа).
- Камера — личная, плюс добровольное «смотреть глазами игрока» (класс 4; принято 2026-07-30). Один смотрит крупно на берсерка, другой — на всю арену. Общего кадра не навязываем: это ровно та свобода, которая ничего не стоит. Подключиться к чужому кадру можно по своему желанию — «покажи, что ты видишь», — но никто не может навязать свой.
- Отстающий по показу догоняет, а не тормозит группу. Просадка кадров, поздний вход в бой, подтормаживание — игрок доезжает до текущей точки боя сам; «ожидаем игрока» посреди боя из-за лагов не бывает. Выпавший из сессии — другой случай, и он уже решён техами: дисконнект в бою ставит автопаузу с выбором «подождать / продолжить без него / выйти», Сосуды ушедшего продолжают драться по своему AI-профилю, а возобновление идёт от общего тика старта (Journal - Coop Session: Pause Is The Sync Window). Разница принципиальная: лаг — это про показ, дисконнект — про состав сессии, и ждать имеет смысл только во втором случае.
- Задержка перед боем допустима, задержка внутри — нет. Секунда на «раздачу» кино в начале незаметна и полезна; рывок в середине разрушает и джус, и совместность.
- Пока открыты ставки, «кино» не уходит игрокам. Ни целиком, ни фрагментом: бой считается вперёд, и раздача ленты до закрытия линии пари означала бы, что исход можно прочитать заранее (wagers §Ловушка предпросчёта).
Механизм наполовину уже есть — и это меняет вопрос. Локально «кино» реализовано: сим пишет боевую ленту, показ читает её с лагом; события лежат за весь бой, снимки состояния — кольцевым окном вокруг момента показа. То есть сим уже умеет уезжать хоть до конца боя.
Открытый тех-вопрос, не дизайнерский: как эту ленту раздавать по сети. Варианты — рассылать состояние каждый тик (как сейчас предполагает Journal - Host-Authoritative, Not Lockstep), рассылать события ленты одним пакетом (они дёшевы и уже хранятся целиком) или рассылать вход и сид, проигрывая бой у каждого локально. Последнее упирается в тот же
float, из-за которого отклонён lockstep, — но в отличие от lockstep расхождение здесь не «кошмар отладки», а всего лишь разные картинки без последствий для правил. Разбор и вердикт — за тех-викой; дизайн требует пунктов 1-6.Вопрос зарегистрирован у техов — Meta - Tech Debt §4.1 (там же сравнение трёх вариантов и перечень наших требований к любому из них).
Смежное: лаг подачи локальный — это часть показа, не сети, и в коопе он у каждого свой, лишь бы соблюдался пункт 1.
Класс 2: транзакции и правило непротиворечивого клика
Казна общая, гейта прав нет (2026-07-27/10) — значит два игрока могут потратить одни деньги в один момент, и один из них получит отказ. Дизайн-требование:
Отказ должен быть предсказан, а не показан после. Игрок обязан узнать о конкуренции до клика — мягкой меткой «кто-то уже смотрит эту позицию» (presence §Мягкая заявка на объект). Показать покупку, а потом её отобрать — обещание, взятое назад; это ощущается багом даже когда работает штатно.
Следствия:
- Порядок решает хост, и это нормально: соревнование за клик — часть кооп-хаоса, но оно должно быть видимым, а не тайным.
- Голосование — транзакция, не присутствие: голос нельзя потерять по дороге.
- Расстановка — транзакция с высокой частотой правок; здесь особенно важно, чтобы чужая правка не «телепортировала» юнита без объяснения (кто передвинул — видно, см. presence).
Класс 3: присутствие
Правила слоя целиком в presence. Здесь только сетевое следствие: ни одна механика не читает присутствие. Курсор, наведение и пинг — жесты; потерялись — забыли. Как только от жеста начинает что-то зависеть, он обязан переехать в класс 2 и стать транзакцией.
Класс 4: локальный шум
Камера, зум, тултипы, мелкие эффекты, звук — личные и по сети не ходят. Отдельно проговорено, потому что соблазн «показать всем то же, что вижу я» велик, а цена высока: чужой кадр отбирает у игрока единственную личную свободу в фазе, где всё остальное общее.
Исключение — режим «смотреть глазами игрока»: добровольная функция «покажи, что ты видишь». Не навязывание кадра, а осознанное подключение к чужому. Принято 2026-07-30 вместе с решением о личной камере.