-
Nikitos создал
Задача §2 из порядка §12. Решение проекта: в `$` есть ТОЛЬКО авторитарная модель — один узел хост-сервер, его симуляция всегда права, клиенты присылают ввод и рисуют подтверждённое. Peer-to-peer и «у каждого своя правда» не выставляются. Сделана ВСЯ модель, кроме транспорта: * стабильные сетевые id: один узел — один номер, номера НЕ переиспользуются (иначе клиент сопоставит чужую сущность со своей); прямой и обратный поиск; * овнершип: узел принадлежит игроку, ввод применяется только к телу владельца; объявлять репликацию может ТОЛЬКО сервер (на клиенте отказ); * снапшоты с дельтой: в дельту попадают лишь изменившиеся поля, удалённые помечены null, первый снапшот полный; числа сравниваются с допуском, потому что позиции «дрожат»; * клиентское состояние: подтверждённое и предыдущее (для интерполяции), интерполяция чужих между двумя снапшотами, своё берётся как есть; * ввод по номерам: повтор и переупорядочивание игнорируются, пропуск (потерянный пакет) не догоняется — ввод уже неактуален; на клиенте приём авторитетного ввода отклоняется; * инвариант «клиент не пишет авторитетное» проверен тестом: ввод клиента не меняет подтверждённое состояние; * транспорт подключается снаружи ($.net.attach: listen/connect/send/poll/close): модель, снапшоты и дельта от сокетов не зависят. Тесты нашли ошибку: $.net.reset() не чистил стол авторитета — после сброса оставались игроки (проверка это поймала). ЧЕСТНО, чего ещё нет (записано в net.md и в §12): транспорт src/net.{h,c} на SDL3_net, предсказание локального игрока с откатом шага, лаг-компенсация хитов, шаг симуляции отдельно от кадра, агентские команды net/net-peer, сжатие. Проверка: tests/js/net_test.mjs (20 проверок), полный набор qjs, bsp и агентских тестов зелёный.c8543872