Skip to content

SIGame communication protocol

Vladimir Khil edited this page Jan 5, 2024 · 3 revisions

Данный протокол используется при взаимодействии участников игры: движка игры (далее - Игра), ведущего, игроков и зрителей. Каждый участник имеет уникальное имя. Зная имя участника, можно отправлять ему сообщения. Имя игры - "@".

Общение между участниками асинхронное.

Транспорт

В игре используются два транспорта для взаимодействия:

  • TCP для сетевой игры: в этом случае сообщения сериализуются в XML; перед отправкой каждого сериализованного сообщения отправляется число, равное размеру сообщения в байтах;
  • SignalR при подключении к Игровому серверу: сообщение сериализуется встроенным механизмом SignalR.

Сообщение

Базовым объектом взаимодействия является сообщение. Это объект, содержащий следующие поля:

  • IsSystem: является ли сообщение служебным. Значение по умолчанию - true. Если сообщение не служебное, то это сообщение в игровой чат (оно не влияет на ход игры);
  • IsPrivate: является ли сообщение приватным. Значение по умолчанию - false. Поле зарезервировано на будущее; в настоящий момент не используется;
  • Sender: уникальное имя отправителя сообщения;
  • Receiver: уникальное имя получателя сообщения. Допускается имя "*" для отправки сообщения всем участникам;
  • Text: основное содержимое сообщения. Представляет собой набор аргументов, разделённых символом '\n'. Первый аргумент называется типом сообщения. Такой формат передачи аргументов сложился исторически. Например, чтобы передать участнику информацию об идентификаторе текущей игры (например, 1024), сервер отправляет ему сообщение "GAME\n1024". Задача клиента - разбить текст сообщения на отдельные аргументы и понять суть сообщения.

Протокол взаимодействия описывает варианты передаваемых типов сообщений, их значения и порядок появления в игре.

Игроки и ведущий, помимо своих сообщений, обрабатывают все сообщения адресованные зрителям (т.е. являются подклассами зрителей).

Сообщения для зрителя

Тип сообщения Аргументы Значение
ADS text Рекламное сообщение
APELLATION_ENABLES +/- Are appellations enabled in the game
ATOM atomType, [atomText]|[URI, atomUri] Current question fragment. Atom type could be text, partialText, oral, image, voice, video and html. The second argument is text for text/partialText/oral types and URI for other types
ATOM_HINT text Additional text that should be displayed over current atom content and disappear after some time
ATOM_SECOND atomType, URI, atomUri Дополнительный звуковой фрагмент при наличии основного беззвучного фрагмента текущего вопроса
BUTTON_BLOCKING_TIME time Time in seconds for blocking game button after press
CHOICE themeIndex, questionIndex Выбран вопрос questionIndex в теме themeIndex
CONFIG (сложный набор параметров) Изменился состав участников игры
CONNECTED role, index, name, sex К игре подключился новый участник с именем name, полом sex (m или f), с ролью role и индексом index (индекс имеет смысл только для роли игрока)
CONTENT placement (layoutId, contentType, value)+ Defines game content. Placement could be screen, replic or background. After that a list of content items could be provided. For common item layoutId is 0; for answer option layoutId is equal to option index + 1
CONTENT_APPEND placement, layoutId contentType, value Appends content value to existing content defined by placement and layoutId
CONTENT_SHAPE placement, layoutId, contentType, value Sets shape for content defined by placement and layoutId. For text this is a text with replaced characters
CONTENT_STATE placement, layoutId, state Defines state of content defined by placement and layoutId
DISCONNECT - Соединение с хостом игры разорвалось
DISCONNECTED name Участник с именем name отключился от игры
ENDTRY [playerIndex] [A]
INFO2 (сложный набор параметров) Поступила полная информация о текущей игре
FALSESTART falseStart Разрешены ли фальстарты (+) или нет (-)
FINALROUND inGame[] Начат финальный раунд (указано, кто из игроков принимает в нём участие)
FINALSTAKE - Нужно сделать ставку в финале
FINALTHINK - Началось время размышления над финальным вопросом
GAMETHEMES gameTheme Темы игры
LAYOUT layoutName, ...args Table layout name. Only ANSWER_OPTIONS is currently supported. ANSWER_OPTIONS: table contains answer options. Additional args are: questionHasScreenContent (+ if question contains content besides options and - otherwise) and list of content types (image or text) for each answer option
OUT themeIndex Удалена тема с индексом themeIndex в финальном раунде
PACKAGEID packageId Идентификатор текущего пакета
PACKAGELOGO packageLogoUri Адрес логотипа текущего пакета
PASS playerIndex Игрок с индексом playerIndex спасовал на вопросе
PAUSE (сложный набор параметров) Включение или отключение режима паузы в игре и актуальных значениях игровых таймеров
PERSON result, playerIndex, sum Игрок с индексом playerIndex выиграл (result = '+') или проиграл (result = '-') сумму sum
PERSONFINALANSWER playerIndex Игрок с индексом playerIndex дал ответ в финальном раунде
PERSONAPELLATED playerIndex Игрок с индексом playerIndex принял решение по апелляции
PERSONFINALSTAKE playerIndex Игрок с индексом playerIndex сделал ставку в финале
PERSONSTAKE playerIndex, stakeType, stakeSum Игрок с индексом playerIndex сделал ставку (тип stakeType и стоимость stakeSum)
PICTURE playerName, playerAvatarUri Игрок playerName использует аватар по адресу playerAvatarUri
PRINT text Текст, который нужно вывести, в том числе и о репликах участников. Сейчас приходит в формате XML. Планируется переход на более дружелюбный для веб-клиентов формат сообщения
QTYPE questionType Тип текущего вопроса
QUESTION price Текущяа стоимость вопроса (для упрощённой версии игры)
READY name, isReady Готовность (isReady = '+') или неготовность (isReady = '-') к игре участника под именем name
RESUME - Команда продолжить показ текущего мультимедиа-фрагмента вопроса после остановки
RIGHTANSWER _, answer Правильный ответе на текущий вопрос
READINGSPEED readingSpeed Скорость чтения вопроса будет равна readingSpeed символов в секунду
ROUNDCONTENT uri[] List of media URIs that could be preloaded for the game round
ROUNDTHEMES print, roundThemes[] Темы раунда и указании о том, следует ли печатать темы раунда
SETCHOOSER playerIndex Игрок с индексом playerIndex будет выбирать следующий вопрос
SHOWTABLO - Команда показать игровое табло
STAGE stageType, name Переход игры в стадию stageType (с именем name для стадии раунда)
STOP - Завершён текущий раунд
STUDIA studiaUri Адрес фоновой картинки студии (в настоящий момент не используется)
SUMS sum[] Суммы участников игры
TABLO2 price[] Стоимости вопросов в темах (пустые аргументы разделяют вопросы одной темы)
TEXTSHAPE text Форма текущего вопроса (для вопросов, выводимых частично). Эта информация позволяет корректно отрендерить вопрос по мере его появляения на экране
THEME themeName Текущая тема игры (для упрощённой версии игры)
TIMEOUT - Закончилось время раунда
TIMER (сложный набор параметров) Изменение режима работы игровых таймеров
TRY [NF] Можно нажимать на кнопку для ответа на вопрос. Параметр NF разрешает не показывать рамку при этом
WINNER playerIndex Игрок с индексом playerIndex стал победителем игры
WRONGTRY playerIndex Игрок с индексом playerIndex проиграл кнопку

Сообщения для игрока

Тип сообщения Аргументы Значение
CANCEL - Отмена ожидания решения
CHOOSE [1] [2]
YOUTRY - Можно нажимать на кнопку
ANSWER - Нужно дать ответ
CAT playerFlag[] Нужно выбрать игрока для передачи ему вопроса (допускается выбирать из игроков, помеченных флагом '+')
CATCOST min, max, step Нужно сделать ставку на вопросе с секретом (от min до max с шагом step)
STAKE nominal, stake, pass, allIn, min Нужно сделать ставку (можно поставить номинал, ставку с суммой от min и выше, пас или ва-банк)
REPORT report Можно отправить отчёт об игре
VALIDATION name, answer, isRight, rightCount, right[], wrong[] Asks for validation of answer answer of person name which is considered to be isRight. Right and wrong versions for current question are provided

Сообщения для ведущего

Тип сообщения Аргументы Значение
CANCEL - Отмена ожидания решения
FIRST playerFlag[] Нужно выбрать игрока для выбора вопроса (допускается выбирать из игроков, помеченных флагом '+')
FIRSTSTAKE playerFlag[] Нужно выбрать игрока для ставки (допускается выбирать из игроков, помеченных флагом '+')
FIRSTDELETE playerFlag[] Нужно выбрать игрока для удаления темы (допускается выбирать из игроков, помеченных флагом '+')
HINT hint Подсказка
VALIDATION name, answer, isRight, rightCount, right[], wrong[] Asks for validation of answer answer of person name which is considered to be isRight. Right and wrong versions for current question are provided