Решили: сетевая модель кооператива — host-authoritative + репликация состояния. Бой считает только хост, клиент рисует присланное состояние и шлёт свои интенты командами. Один источник правды, поэтому рассинхрон невозможен by design.

Почему: отвергли детерминированный lockstep, и решающих аргументов два.

Первый — это кооп против ИИ, а не PvP. В соревновательной игре lockstep оправдан (защита от читов, сокрытие задержки каждый кадр — так делают RTS). У нас читом вредишь только себе и друзьям, задержка 100–200 мс на команду незаметна, потому что юниты ходят сами и игрок изредка ставит юнита или жмёт паузу, а игроков до четырёх.

Второй, убийственный — вся симуляция на float. Lockstep требует бит-в-бит идентичной математики на всех машинах, а sqrt/normalize расходятся между x86 и ARM, Mono и IL2CPP, настройками FPU. Честный lockstep означал бы переписать всю боевую математику на fixed-point — самый большой возможный взрыв скоупа ради бандвитча, который при четырёх игроках не нужен: ~40 юнитов дают ≈0.5 КБ на снапшот, при 15–20 Гц это 8–13 КБ/с на клиента. Вдобавок NGO сделан именно под host-authoritative (NetworkVariable, NetworkTransform, RPC, дельта-сжатие), и lockstep на нём — плыть против течения.

Честный контр-аргумент, чтобы решение не было верой: lockstep выиграл бы у соревновательного автобатлера с сотнями юнитов, где реплеи и анти-чит — фичи ядра. Тогда fixed-point-рерайт окупился бы минимальным трафиком и бесплатными реплеями. Это не наш случай.

Грабли: «lockstep отклонён» ≠ «детерминизм не нужен». Детерминизм остаётся ценным для одиночных реплеев, тестов и «тот же сид → тот же бой» — он просто перестаёт быть межмашинным требованием. Поэтому XorShiftRng, тиковая модель и ComputeChecksum остались как есть, а SimSyncProbe (сравнение checksum пиров) не удалён, а запаркован в Net/_Parked/: при host-auth второй симуляции нет, но для SP-реплеев инструмент пригодится.

NetworkCommandRelay тоже keeper, но с переработкой обвязки: путь «клиент → хост» нужен, а lockstep-широковещание «все применяют на одном тике» уходит.

Владелец правды: код Assets/_Project/Scripts/Net/ (транспорт — FacepunchTransportBootstrap, парковка — Net/_Parked/); состав работы Фазы MP — Meta - Tech Debt §4; дизайн кооперации — Coop - Overview.