• Nikitos's avatar
    Авторитарный мультиплеер: $.net — id, владение, снапшоты с дельтой
    · c8543872
    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