-
-
Notifications
You must be signed in to change notification settings - Fork 42
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 |
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 |