Skip to content

Latest commit

 

History

History
98 lines (80 loc) · 6.73 KB

HPW LAN tasks.md

File metadata and controls

98 lines (80 loc) · 6.73 KB

ПЛАН H.P.W LAN

Инфа о том как сделать сетевую игру, какие менюшки должны быть и как это всё должно работать по сети

Тестовые приложения с GUI:
  • отображение соединений с серваком и клиентами при бродкасте
  • отображение факта нажатия на кнопку у сетевых игроков - все в таблице и подсвечивается кто что нажал
Меню создания сервера:
  • включить фоновую рассылку инфы о сервере
  • показать интерфейс настройки сервера
  • при готовности привязаться к клиентам и начать с ними игру
Подключение к серверу:
  • искать рассылки сервера в фоновом режиме
  • показать интерфейс чтобы выйти
  • если будут найдены рассылки, законектиться к серверу и показать лобби для клиента
Подключение по адресу:
  • пытаться законнектиться в фоновом режиме, если получится, перейти в лобби для клиента
  • показать кнопку на отмену или замену адреса
Лобби клиента/сервера:
  • кнопка на голосование о готовности
  • кнопка чата
  • кнопки на выход
  • другие кнопки соответствующие клиенту или серверу (это всё одна и та же сцена, но с разной выдачей кнопок)
  • если клиент подключился после сбоя, то его сразу отправляю в игру и он ожидает синхронизации
Игра запущена:
  • записывать в стек нажатых кнопок свои кнопки и предсказанные кнопки других игроков
  • пытаться получить фоном кнопки других игроков и команды
  • если кнопки не совпали, откатиться назад до правильных кнопок и в ускоренном виде с правильными кнопками игроков обновить игру до текущего состояния
  • если не удался ролбэк или история кнопок не совпала с принятыми пакетами, то разослать сигнал синхронизации. Сервер будет высылать данные игры для синхронизации
  • неправильные пакеты надо игнорить
  • если инфа о кнопках в определённых фреймах не была получена, то выслать сигнал серверу на получение кнопок этого фрейма
  • если клиент отрубился от сервера, его игрок удаляется, а в предсказаниях кнопок жмётся бездействие
  • если игрок вылетел, серверу предложится ожидать переподключение игрока. Если адрес игрока совпадёт, то его можно подключить заново и начать синхронизацию игры.
  • в реплей пишется всё, даже инфа о вылетах и какие игроки играли. В меню запуска реплеев игра сама определит сетевая ли это была игра
Кнопка паузы сервера:
  • начать синхронизацию игры
  • можно выгнать игрока
  • писать в чат
  • завершить игру
Кнопка паузы клиента:
  • писать в чат
  • завершить игру
Какие вещи сохраняются для ролбека:
  • все объекты игры
  • текущий номер фрейма
  • текущие нажатые клавиши
  • текущая сцена
  • позиция уровня
  • текущая задача уровня
  • текущий глобальный эффект/задача
  • контрольная сумма данных текущего ролбека
  • вся игра должна уметь сохранять и загружать любое своё состояние
  • текущие данные сида рандома xoroshiro
Какие пакеты нужны:
  • Server broadcast - его смотрит клиент, когда ищет сервер или заходит в лобби по адресу

    • short name: char32[max_nick]
    • num connected players: u16
    • game ver: bytes
  • Client connect

  • Ping - при его получении меняют флаг ресенд и возвращают. Принявшая сторона вычисляет пинг

    • receive time: double
    • resend me: bool
  • Need sync - есть таймаут игрового кадра, при котором не учитывается этот пакет, если же проверка проходится, начинается синхронизация по tcp

    • game frame
  • Buttons - этим перекидываются игроки

    • game frame
    • buttons struct
  • pause - запрос паузы. После возврата в игру запускается синхронизация. В паузе инпуты кнопок не отправляются

    • game frame
  • Chat msg - на размер текста лимит 8К символов

    • game frame
    • text len: u32
    • chars: u32
  • Player leave - игрок отключается сам

    • tag only
Что написать игрокам в инфе для подключения:
  • Если не знаете какой IP поставить себе, ставьте 0 или тот что у вас в Radmin/Hamachi
  • Для подключение в другому игроку введите его белый IP или IP из Radmin/Hamachi
  • Если хотите подключиться к самому себе, то настройте свой IP как 127.0.0.2, а IP сервера как 127.0.0.1