Бэк-офис для игр.
1. Концепция и общее описание
Значительное количество компьютерных online игр требуют сохранения результатов игр, ранжирования игроков, обращения игровой валюты. Игроки получают, выигрывают, проигрывают и расходуют игровые ресурсы.
Организуются разного вида соревнования. Игроки общаются между собой, используя внутри игровой чат. Периодически огранизуются соревнования, отличающиеся друг от друга структурой и параметрами.
Как правило, разработчики таких игр создают собственные WEB службы для обеспечения этого функционала.
Бэк-офис для игр предоставляет универсальный сервис для произвольной игры, предъявляющей подобные требования, полностью абстрагируясь от содержательной части игры.
WEB интерфейс системы обеспечивает разработчику и администратору игр регистрацию, настройку и управление игрой.
WEB API системы предоставляет игровым программам полный доступ к сущностям игры,
фиксацию результатов игровых событий, обеспечивает общение между игроками и администратором игры в режиме online.
Все запросы к WEB API начинаются с префикса https://[url сервера]/Api/Data/[method]
− Понятия, используемые в системе.
Server. Сервер
системы. WEB сервер, обеспечивающий выполнение заявленные сервисы системы.
Client. Клиент.
Игровая программа, использующая ресурсы системы.
SuperAdmin. Администратор системы. Уникальная
роль в системе. На данный момент это автор системы. Его функции:
- Общее управление системой
- Просмотр содержимого объектов системы
- Поддержка разработчиков (администраторов) игр.
- Консультации и помощь в отладке игр.
- Экспорт аккаунтов разработчиков (администраторов) игр из тестовой системы в рабочую
- Публикация отлаженных на тестовой системе разработчиком игр в рабочей системе.
- Блокировка/разблокировка разработчиков и/или их игр по тем или иным причинам.
- Общение с администраторами игр в чате или посредством электронной почты.
- Внутрисистемный арбитраж. Разрешение спорных вопросов. Решение SuperAdmin‘а – закон.
- Установка и изменение курсов виртуальной «валюты» системы для каждого из администратора игр.
GameAdmin. Администратор (разработчик) игр. Уникальная
роль в конкретной игре. Может быть владельцем нескольких игр. Его функции:
- Создание и регистация игр
- Блокировка/разблокировка игроков
- Определение стартовых ресурсов для новых игроков.
- Настройка параметров игр.
- Организация и ведение соревнований.
- Установка курсов игровых валют.
- Регулирование цен (в игровой валюте) на игровые ресурсы.
- Внутриигровой арбитраж. Разрешение спорных вопросов на уровне собственных игр.
Gamer. Игрок
Обязанностей не имеет кроме как играть в созданную разработчиком игр игру.
Имеет логин, е-мейл, игровую валюту, рейтинг и определенные разработчиком игр игровые ресурсы. Имея единственную (в системе) учетную запись, может играть в разные игры разных авторов.
Game. Игра
Ограничивает общепринятое понятие игры следующим определением:
«Игра есть совокупность параметров, ресурсов, игроков и их активов полученных или выигранных игроками в процессе соревнований». Собственные обязательные свойства:
- Название игры
- Название игровой валюты
- стартовая сумма в единицах этой валюты при регистрации игрока в игре (стартовый бонус)
GameParam. Параметр игры
Некий произвольный
параметр, определяющий течение игры. Целое число.
Разработчик имеет полную свободу назначения параметров. Параметры игры и их значения «по умолчанию» наследуются соревнованиями.
Собственные обязательные (при создании) свойства:
- Название
- Значение по умолчанию, целое
Системой определен один фиксированный параметр, обязательный для всех соревнований.
Это «Количество фреймов в матче». Удалять его или создавать параметр с таким же названием нельзя, допускается только изменять его значение в конкретных соревнованиях.
Этот параметр автоматически создается при создании новой игры. Кроме того, разработчик может добавить единственный на игру
параметр с признаком "Рейтинг". Этот параметр используется
в соревнованиях как награда от администратора игры победителям, увеличивая их игровой рейтинг.
GameResourceType. Тип игрового ресурса
Опеределяет перечень игровых ресурсов.
Может принимать только два значения: "Число" и "Список". Ресурс со списочным типом полезен для группировки ресурсов с числовым типом по категориям. Присутствие списочного типа необязательно.
GameResource. Игровой ресурс
Произвольное значение, получаемое, выигрываемое, покупаемое у администратора игры
или у других игроков, продаваемое другим игрокам. Цена ресурса номинируется администратором игры в единицах игровой валюты, или на «бирже» игроком – продавцом. Целое число.
SystemCurrency. Системная валюта
Дублоны ( D).
Курс системной валюты устанавливается администратором системы для каждого администратора игр отдельно. Получается администратором игр при регистрациии. Покупается у администратора системы.
Расходуется при внутри игровых операциях в качестве комиссионных.
GameCurrency. Игровая валюта (¤)
Специальный вид ресурса. Отличается тем, что может обмениваться на другие ресурсы.
Получается игроком при регистрации в игре. Может покупаться у администратора игр за реальные деньги. Расходуется при покупке игровых ресурсов у администратора игры или на бирже у других игроков.
GamerRating. Рейтинг игрока
Особый вид ресурса игрока в игре. Не покупается, не продается,
только получается при регистрации в игре и зарабатывается/теряется в процессе соревнований. Вычисление изменений рейтинга выполняется игровой программой по результатам сыгранных
игроком игр. Стартовый рейтинг равен 100.
Competition. Соревнование
Непосредственный акт игры нескольких (более одного) игроков с
параметрами настраиваемыми администратором игры. Параметры соревнования есть параметры игры с измененными значениями. Соревнования определены 3
видов: Чемпионат, Турнир, Первенство.
Кроме соревнований разработчик может реализовать произвольный акт игры нескольких игроков с установкой значений параметров, определенных в игре
(Свободный матч) одним из игроков.
Система фиксирует
состояние игрока относительно соревнования.
Frame. Фрейм
Минимальный игровой акт. Фрейм является неделимой единицей структуры любого соревнования.
Match. Матч
Совокупность фреймов. Матч может состоять из одного или более фреймов. Иначе говоря, online встреча фиксированного состава игроков.
Round. Раунд
Применим только к турниру. Совокупность матчей, проводимых «на одном уровне»
Tournament. Турнир
Пирамидальная последовательность раундов.
В каждом из матчей может быть только один победитель, выходящий в следующий раунд.
Победитель матча определяется по вычисленным игровой программой результатам фреймов матча.
Параметры могут изменяться от раунда к раунду.
Собственные свойства:
- Название
- Количество партнеров в матче (NP). От 2 до 10.
- Количество раундов (NR). От 2 до 10. Важно: NPNR — общее количество игроков турнира не рекомендуется делать большим, чем 256.
- Дата окончания подписки. Регистрация игроков для участия в турнире заканчивается не позднее истечения этой даты.
- Дата начала. Турнир начинается не ранее этой даты.
- Вступительный взнос. Целое. Сумма в единицах игровой валюты, уплачиваемая игроком при подписке.
- Вступительный рейтинг. Игрок с меньшим рейтингом не может участвовать в турнире.
- Стимул от Автора. Параметр в целых единицах игровой валюты. По умолчанию – 0.
- Количество фреймов в матче. Устанавливаемое значение наследуется параметрами раундов. Количество фреймов в матче не должно быть меньше чем количество партнеров в матче
Championship. Чемпионат
Соревнование, в котором каждый игрок играет в матче каждый с каждым. В матче участвуют только два игрока.
Места по окончанию чемпионата определяются игровой програмой. Допустима ничья в каждом из матчей. Собственные свойства:
- Название
- Количество игроков. Не рекомендуется делать большим, чем 256.
- Дата окончания подписки. Регистрация игроков для участия в чемпионате заканчивается не позднее истечения этой даты.
- Дата начала. Чемпионат начинается не ранее этой даты.
- Вступительный взнос. Целое. Сумма в единицах игровой валюты, уплачиваемая игроком при подписке.
- Вступительный рейтинг. Игрок с меньшим рейтингом не может участвовать в турнире.
- Стимул от Автора. Параметр в целых единицах игровой валюты. По умолчанию – 0.
- Количество фреймов в матче.
Anteriority. Первенство.
Игроки, участвующие в первенстве не состязаются друг с другом непосредственно. Выполняя некоторые, определяемые игрой,
задания, игроки показывают результаты, по которым определяется победитель. Собственные свойства те же, что и у чемпионата.
FreeMatch. Свободный матч.
Не регламентируемые администратором игры матчи между игроками. Значения параметров, определенных в игре, устанавливаются самими игроками.
Chat. Чат.
Система предоставляет сервис мгновенных сообщений как между администратором игры и игроками, так и между игроками. Возможно отправлять сообщения группам игроков.
Группы в чате напрямую соответствуют играм. Администратор игр состоит во всех группах, соответствующих принадлежащим ему играм.
Игрок состоит во всех группах, соответствующих играм, в которых он зарегистрирован.
− Активы системы
− Валюты. Система курсов.
Система имеет два уровня валют: Валюта системы и валюты игр. Валюта системы находится под управлением администратора системы и является активом администраторов игр.
Валюта системы с позиции администратора системы имеет неограниченный объем. Иначе говоря, администратор системы имеет бесконечное количество единиц валюты системы
Администраторы игр получают стартовый капитал в валюте системы во время регистрации в системе. Размер стартового капитала может меняться системным администратором.
Валюта системы расходуется администраторами игр при разблокировании игры (на время или навсегда) и при регистрации нового игрока (последнее только на рабочем сайте). Суммы этих
комиссий зафиксированы в валюте системы D. Кроме того, на рабочем сайте системой взимается налог на операции обмена внутри игровой валюты (в %% от объема, но не менее 1 D).
Администраторы игр имеют возможности приобретать валюту системы за рубли РФ.
Администраторы игр управляют своими внутри игровыми валютами. Называют валюту, назначают стартовую сумму валюты (при регистрации игры), которую получают игроки при регистрации в игре,
Игровая валюта с позиции администратора игр имеет неограниченный объем. Иначе говоря, администратор игр имеет бесконечное количество единиц валюты каждой из своих игр.
изменяют курс валюты игры, изменяют комиссионные ставки за операции покупки или конвертации валюты.
Система курсов. Представляет собой дерево, вершиной которого является валюта системы. Узлы первого уровня - адинистраторы игр.
Несмотря на то, что администратор игры не имеет собственной валюты, существует курс администратора игры. Узлы второго - валюты игр.
При регистрации администратора игр его курс по отношению к валюте системы, устанавливается в 1. Администратор системы имеет возможность изменять этот курс.
При регистрации игры администратором игр, валюте этой игры присваивается курс по отношению к курсу администратора игры, равный 1.
Администраторы игр могут изменять курсы валют своих игр. Функционирование системы курсов проще пояснить на примерах.
Пример 1. Игрок игры G1 c валютой V1 и курсом
K1 хочет обменять сумму S1 на сумму S2 в валюте
V2 с курсом K2 игры G2 того же администратора A1.
То есть, продать валюту V1 и купить валюту V2. При этом сумма продажи S1
будет уменьшена на величину комиссии С. Комиссия вычисляется по установленной администратором игр процентной ставке, но не более чем фиксированное значение, также
устанавливаемое администратором игр. В этом случае игрок получит S2 = (S1-С)*K1/K2 единиц валюты V2.
Пример 2. То же, что и в примере 1, но V2 это курс K2
игры G2 другого администратора A2. При этом курс администратора A1 - KA1, а
курс администратора A2 - KA2. В этом случае игрок получит S2 = (S1-С)*K1*KA1/(K2*KA2) единиц валюты V2.
− Ресурсы. Биржа.
Ресурсы (активы игрока, за исключением игровой валюты) игры используются игроком в процессе собственно игры. Допускается, но не рекомендуется использовать тот или иной ресурс в качестве приза соревнования. Для этого существует
игровая валюта. Кроме расходования и покупки у администратора игры, ресурс может быть куплен или продан на бирже.
− Чат.
Все участники системы: администратор системы, администраторы игр и игроки имеют возможность общаться друг с другом с помощью встроенной системы мгновенных сообщений. При этом администратор
системы видит и общается только с администраторами игр, администраторы игр с администратором системы, игроками, зарегистрированными в его играх и с группами игроков. Группа в чате однозначно
соответствует (и копирует название) игре. Игроки могут общаться с администраторами игр, группами игроков, в которых они зарегистрированы, а также персонально с каждым из игроков, зарегистрированным
в той же игре, что и он.
− Игрок: Операции в браузере.
Игрок выполняет большинство своих действий непосредственно в игровой программе. Кроме собственно игровых актов, игрок может покупать игровые активы и продавать их на бирже.
WEBAPI предоставляет такую возможность, описанную ниже. Исключением является операция оплаты покупки игровой валюты, которая может выполняться только в браузере.
Это требование Яндекс кошелька.
Браузерная покупка игроком активов показана здесь.
Биржевые операции состоят из выставления на продажу или покупки "лотов". Каждый лот включает один или несколько игровых ресурсов, принадлежащих игроку, выставляющего лот.
Ресурс, выставленный на продажу в составе лота, исключается из активов игрока. Например, игрок имел 10 "жизней", а выставил 5. У него осталось 5 жизней для использования в игре.
Игрок, выставляющий лот на продажу может назначать цену по каждому ресурсу, включенному в лот, а также изменять количество и цену ресурса. Соответственно изменению количества ресурса
изменяется и количество этого ресурса, доступного для использования. Эти действия возможны до тех пор, пока лот не будет куплен целиком другим игроком. Покупка оплачивается игровой валютой.
В приведенном примере покупатель -- qwerty2, продавец -- qwerty0.
− Сценарий разработчика/администратора игр.
После ознакомления с настоящим руководством, разработчику (а в дальнейшем под этим логином и администратор) игры, использующей сервисы, представляемые системой,
рекомендуется тщательно продумать набор необходимых параметров игр и ресурсов в них используемых. При этом необходимо иметь ввиду, что использование (либо не использование)
тех или иных параметров непосредственно в соревновании, никак не регламентируется системой, а только самой игровой програмой.
Если нужный параметр или ресурс отсутствует в списке зарегистрированных в системе, он не может быть учтен системой. В то же время возможны ситуации,
когда тот или иной параметр фрейма не может быть задан явно, например расклад карт в карточной игре. Система предоставляет механизм для хранения такой произвольной информации в
виде JSON строки.
Неизбежно, в процессе разработки игровой программы у разработчика возникнет необходимость тестировать её, с возможностью оперативного изменения состава и значений параметров и ресурсов
игры, удаления/добавления соревнований, их результатов и многое другое. Для этого система имеет тестовый сайт https://gamebackoffice.ru ,
на котором и выполняется тестирование программ.
Только на тестовом сайте разработчик имеет возможность зарегистрироваться сам и зарегистрировать свою игру. На рабочем сайте https://gamebackoffice.ru
эти действия невозможны. Во избежание использования тестового сайта в качестве рабочего, учетная запись разработчика игр на нем блокируется через 180 дней и, соответственно,
использование игр становится невозможным. Этот период отсчитывается с момента регистрации разработчика/администратора игр. Разблокировать учетную запись разработчика/администратора игр может
только администратор системы.
После окончания отладки игровой программы, Администратор системы по согласованию с разработчиком игры экспортирует
логин
администратора и/или его
программы
на рабочий сайт.
Через 60 дней после экспорта отлаженной игры на рабочий сайт она блокируется (на рабочем сайте). Этот бесплатный период предоставляется администратору игр для привлечения игроков.
По истечении этого срока администратор игры может разблокировать игру самостоятельно на срок
60,
365,
730 дней или
навсегда.
Все платежи администраторов игр администратору системы осуществляются в системной валюте (D).
При регистрации
разработчика/администратора игр в системе он указывает кроме логина и пароля также и e-mail, для подтверждения которого, ему отправляется электронное письмо
с ссылкой на страницу подтверждения регистрации. Настоятельно рекомендуется установить признак "Использовать Юmoney кошелек", и ввести номер Яндекс кошелька
в соответствующее поле. Яндекс кошелек используется на рабочем сайте системы для платежей администраторов игр администратору системы, а также при покупке игровой валюты игроками.
Отказ от использования Яндекс кошелька существенно затруднит эти расчеты.
При выборе признака "Использовать Яндекс кошелек" будет предложено настроить HTTP уведомления
на сайте Юmoney.
Это необходимо для автоматизации учета платежей игроков.
На тестовом сайте платежи через Яндекс-деньги эмулируются, реально они выполняются только на рабочем сайте.
Разработчик игр может зарегистрировать неограниченное количество игр. Регистрация игры выполняется в соответствующей форме.
Все поля — обязательны.
После регистрации игры слева появляется дерево ссылок настроек игры.
Настройка параметров игры. Пример:
Разработчик имеет полную свободу в наименовании параметров игры и установки их значений по умолчанию,
за исключением параметра «Количество фреймов в матче», который автоматически создается при регистрации игры с значением по умолчанию, равным 3.
Параметр игры может быть видимым игроку в игровой программе (в примере параметр "Сложность") и изменяемый игроком в свободных матчах или анализируемый игроком
при выборе участия или не участия в соревнованиях, назначенных администратором игры, а также невидимым (в примере параметр "Коэффициент 1"),
используемым в некоторых внутри игровых вычислениях. Названия параметров должны быть уникальными в масштабе игры.
Удаление параметров возможно только для параметров, созданных разработчиком игры только на тестовом сайте.
Настройка типов ресурсов игры. Пример:
Названия ресурсов должны быть уникальными в масштабе игры.
Создание ресурса с типом "Список" является опциональным и может оказаться полезным в случае, если необходимо группирование ресурсов по некоторому признаку.
Удаление и создание нового ресурса возможно только на тестовом сайте и только если к игре не подключился ни один из игроков и игра не имеет оформленных соревнований.
Настройка значений числовых ресурсов игры. Пример:
Настройка значений списочных ресурсов игры. Пример:
Комиссионные ставки. Операции в игре или в целом в системе сопровождаются комиссионными сборами и налогами.
Пример:
Системные ставки
устанавиливаются администратором системы и могут отличаться от игры к игре. Внутри игровые ставки
могут изменяться
администратором игр.
− Настройка соревнований
Общим для всех видов соревнований является необходимость для администратора игр создавать и настраивать соревнования.
− Турнир
Создание турнира.
Исключая очевидный атрибут "Название", остальные атрибуты требуют некоторых пояснений.
-
Количество партнеров в матче. В матче могут участвовать 2 (например шахматы) или более (например карточная игра) игроков одновременно.
-
Количество раундов. Общее количество участников турнира равно количеству партнеров в матче в степени количества раундов. Эта величина ограничена значением 256.
-
Дата начала и дата окончания подписки. Общим для турниров и чемпионатов является сочетание двух факторов: необходимость организации со стороны администратора игр и
тем, что игровой процесс происходит во время непосредственной встречи нескольких игроков (Матч). Из этого вытекает необходимость фиксации состава
игроков в соревновании (а в случае турнира еще и распределения игроков по матчам). Для этого введен параметр "дата окончания подписки", до истечения которой игрок может
подписаться на участие в соревновании или отписаться от него. После окончания даты окончания подписки администратору игры необходим промежуток времени в течении которого
от распределяет игроков и закрывает "подписку". Только после закрытия подписки и после начала "даты начала" игроки могут приступить к игре. Дата начала всегда больше
даты окончания подписки. Точность -- день.
-
Вступительный взнос. Сумма в игровой валюте, выплачиваемая игроком для участия в соревновании. Удержание суммы происходит в момент "подписки" игрока, и возвращается в момент "отписки". ≥ 0
-
Вступительный рейтинг. Минимальное значение рейтинга игрока, начиная с которого он может подписаться на участие в турнире. ≥ 0
-
Стимул от автора. Количество единиц игровой валюты, назначаемой администратором игры для стимулирования участников. ≥ 0
-
Количество фреймов в матче. ≥ 3
Настройка параметров турнира. Для каждого из раундов турнира параметры настраиваются индивидуально,
при этом значения по умолчанию берутся из настроенных параметров игры.
Сразу после создания турнира становится доступным турнирная таблица.
Игроки могут подписываться на турнир. Когда подпишутся все, либо после даты окончания подписки появится возможность
"посеять" игроков по матчам первого раунда.Турнир с "посеянными"
игроками выглядит следущим образом: Распределение игроков по матчам
не регламентируется системой и администратор игр имеет полную свободу выбора того, как распределить игроков. Очевидно, что не следует соединять в одном и том же матче игроков с высоким рейтингом.
Администратору игр не нужно дожидаться, когда на турнир подпишется всё допустимое количество игроков. При этом игрок(ки) (уже во время турнира), не встретившие в текущем раунде партнеров, автоматически перемещаются вверх
по турнирной таблице до тех пор, пока не окажутся в том месте, где уже есть или может появиться партнер(партнеры). Закрытие подписки завершает настройку и сопровождение турнира.
− Чемпионат
Создание и настройка чемпионата мало отличается от создания и настройки турнира. Отсутствует параметр "Количество раундов" (неприменимо) и настройка параметров матчей относится ко всему
чемпионату в целом.
Также, в отличие от турнира отсутствует необходимость для администратора игр выполнять распределение игроков по матчам. Подписывающийся игрок сразу попадает в одно из свободных
мест таблицы чемпионата.
− Первенство
Создание и настройка первенства не предполагает процедуры подписывания игроков на участие в первенстве, их распеределения по местам и др. Поэтому вместо
даты окончания подписки указывается просто дата окончания. Игрок может выполнить игровое задание начиная с даты начала первенства и заканчивая датой окончания. Разработчик
игры может использовать дату окончания для запрета вступать в это соревнование после нее, но может и игнорировать ее. Настройки параметров те же, что и у чемпионата.
− Регистрация игрока, вход в игру и аутентификация
Для использования игровой программы игрок должен (при первом запуске) зарегистрироваться в системе. Если игрок впервые регистрируется в любой (в том числе от разных авторов) игре системы,
создается его учетная запись в системе и он регистрируется в игре. В дальнейшем он просто регистрируется в игре.
Каждая регистрация игрока в игре сопровождается взиманием комиссии с администратора игр в валюте системы (только на рабочем сервере). Взимание комиссии отражается в браузере адмиисратора игр.
Регистрация: POST метод. В WebSocket не реализован.
method = register
request body:
{
- "Name":"логин", -- обязательное, уникальное в системе. Допустимы только буквы (латиница и кириллица) и цифры. От 4 до 20. Первый символ обязательно буква
- "Password":"пароль", -- обязательное, сложность не контролируется. Допустимы только буквы (латиница и кириллица) и цифры. Минимальная длина пароля 6 символов.
- "Email":"email", -- обязательное
- "Grant_type":"register" -- обязательное, фиксированное при регистрации,
- "Gameid":"Id игры", -- обязательное, получается разработчиком игры при регистрации игры
- "PhoneNumber":"Номер телефона" -- необязательное
}
responce:
ERROR
{
- WRONGREQUEST -- отсутствует или неверный тип запроса Grant_type, должен быть "register",
- COMMONERROR -- неизвестная ошибка,
- GAMENOTEXISTS -- отсутствует или неверный Id игры,
- WRONGPASSWORD -- игрок с таким именем уже зарегистрирован в системе, но пароль не его
- WRONGEMAILFORMAT -- отсутствует или неверный формат e-mail
- USERINGAME -- игрок уже зарегистрирован в игре,
- NOERROR -- успешная регистрация
}
Игрок, зарегистрированный в игре, должен выполнить вход в игру. Для этого вызывается
POST метод: В WebSocket не реализован.
method = token,
request body:
{
- "Name":"логин", -- обязательное, уникальное в системе. Допустимы только буквы (латиница и кириллица) и цифры. От 4 до 20. Первый символ обязательно буква
- "Password":"пароль", -- обязательное, сложность не контролируется. Допустимы только буквы (латиница и кириллица) и цифры. Минимальная длина пароля 6 символов.
- "Grant_type":"password" -- обязательное, фиксированное при логине,
- "DeviceId":"DeviceId" -- обязательное, произвольная (до 40 символов строка, уникальная для устройства, используемого игроком) строка. При невозможности обеспечить галичие или уникальность
устройства можно использовать Guid (UUid) и запоминать его в устройстве. Использование DeviceId описано ниже.
- "Gameid":"Id игры", -- обязательное, получается разработчиком игры при регистрации игры
- "TimeOffset":"3" -- Часовой пояса игрока, целое, часов. Необходимо для корректной передачи дат.
}
responce:
ERROR
{
- WRONGREQUEST -- отсутствует или неверный тип запроса Grant_type, должен быть "password",
- COMMONERROR -- неизвестная ошибка,
- USERNOTEXISTS -- пользователь с таким именем не существует,
- USERLOCKED -- игрок заблокирован администратором игры
- WRONGPASSWORD -- неверный пароль
- GAMELOCKED -- игра заблокирована,
- GAMEADMINLOCKED -- администратор игры и, соответственно его игры, заблокирован администратором системы
- DOUBLEENTERPERMITS -- выполнена попытка второго входа игрока в игру. Повторные входы запрещены системой.,
- NOERROR -- успешный вход в систему,
}
При успешном входе в систему ответ имеет другую структуру:
responce:
{
- Error:ERROR.NOERROR -- успешный вход в систему,
- Message:"OK"
- access_token:"access_token"
- refresh_token:"refresh_token"
- wsacess_token:"wsacess_token"
- refreshtimeout:refreshtimeout
- userid:userid
- connectid:connectid
}
Подробнее о значениях возвращаемых параметрах. Токены доступа:
access_token, refresh_token и wsacess_token. После успешного входа игрока по логину и паролю, доступ к методам системы
контролируется jwt токенами. Первый токен,
access_token предназначен собственно для контроля доступа к GET и POST методам, а второй,
refresh_token для обновления access_token. Токены
access_token и
refresh_token должны быть обновлены возможно быстрее сразу после выполненного входа,
по крайней мере не позже чем через
refreshtimeout секунд. На данный момент
первый (после логина)
refreshtimeout = 60 сек.
По истечении этого времени токены становятся не актуальны.
Обновление
access_token-а выполняется POST методом method = RefreshToken.
В заголовки запроса должен быть добавлен заголовок "Authorization", формата:
"Bearer [refresh_token]" (пробел обязателен!).
При успешном обновлении токенов
access_token и
refresh_token:
responce:
{
- Error:ERROR.NOERROR
- Message:"OK"
- access_token:"access_token"
- refresh_token:"refresh_token"
- wsacess_token"wsacess_tokenn"
- userid:"userid"
- refreshtimeout:"refreshtimeout"
- connectid:connectid
}
Здесь уже
refreshtimeout = 86 400 000 сек. (сутки).
Параметры
userid и
connectid могут быть полезны для игровой программы. Например для фильтрации данных.
Различие между этими параметрами состоит в том, что
userid есть идентификатор игрока в целом в системе, в то время как
connectid
– идентификатор подключения игрока к системе в конкретной игре.
Клиент может запоминать и безопасно хранить access_token с помощью которого выполнять последующие входы в системы без логина и пароля.
Для этого используется POST метод method = TryLogin,
request body:
{
- "deviceid":"Идентификатор устройства клиента",
}
После успешного входа в систему получения и обмена необходимых токенов игровая программа должна подключиться к WebSocket. и отправить WebSocket команду GameConnect().
Первое подключение к WebSocket предваряется HTTP POST запросом по адресу [Url системы]/SR/negotiate?negotiateVersion=1 с пустым телом и
заголовоком Authorization, формата: "Bearer [wsacess_token]" (пробел обязателен!).
Сразу за этим необходимо отправить WebSocket команду GameConnect() для сопоставления системой ID WebSocket соединения с внутрисистемным ID подключения клиента
(в дальнейшем упоминается как ssfconnectid. Ssfconnectid Фактически уникальный ключ сетевого соединения клиента, его ID регистрации (UserId) и ID игры).
Необходимость существования дополнительного ID подключения клиента одновременно с ID WebSocket соединения обусловлена тем, что при кратковременных потерях связи и
восстановлении её, ID WebSocket соединения меняется, а системе необходимо знать, что это тот же клиент, а не новый.
Здесь необходимо более детальное описание механизма восстановления связи при кратковременных потерях связи клиента с системой.
Имеет место сочетание следующих обстоятельств:
- Система не допускает множественные подключения одного и того же игрока к одной и той же игре.
- При обрыве соединения клиента и сервера, клиент узнает об этом примерно на 20 секунд позднее, чем сервер.
- Необходимо сохранить состояние клиента в игре при кратковременных потерях связи.
- Необходимо обеспечить переподключение игрока к игре при более длительных обрывах связи или некорректных отключениях.
При "штатном" отключении клиента по WebSocket сигналу GameDisconnect, система удаляет информацию о подключении клиента из памяти сервера,
и игрок может вновь подключиться к игре даже с другого устройства. В тоже время, если игрок все еще подключен к игре необходимо, запретить второе и следующие подключения.
Это обеспечивается за счет того, что, хотя повторное подключение и предоставляет те же логин и пароль, оно отличается другим значением строки deviceid.
Если же отключение произошло по причине обрыва связи или ошибки игровой программы, информация о подключении клиента продолжает храниться на сервере и, во первых, отклонит
переподключение того же клиента, а во вторых может ввести в заблуждение других участников игры.
Такое поведение исключается за счет паузы в 60 - 80 секунд, в течение которых сервер хранит состояние клиента (и игрок, запускающий игровую программу
с того же устройства, а значит с тем же deviceid) свободно входит в систему в сохраненное состояние. С другой стороны, после истечения этой паузы игрок уже может подключиться к игре и с другого устройства,
но уже без сохраненного на сервере состояния. Переподключение клиента после восстановления подключения к Интернет должно выполняться с помощью следующей последовательности операций:
- Запросить у сервера информацию о том, сохранено ли его состояние на сервере. Для этого выполняется GET запрос CheckConnect.
Получение ответа 200 (ОК) означает, что состояние хранится на сервере и повторный релогин не требуется
-
Ответ 401 (Unauthorized) означает, что сервер очистил данные о подключении клиента. В этом случае клиент должен выполнить повторный вход в систему с помощью метода TryLogin и access_token,
и, в случае неудачи, вход с использованием логина и пароля.
Предложенный ниже программный компонент
GBOClientStd использует пакет
Microsoft.AspNetCore.SignalR.Client версии 3.1.9 и обеспечивает необходимый протокол
переподключений.
Начиная с момента входа в игру, игрок должен выбрать тип соревнования, в котором он намерен играть и информировать о своем
выборе систему. Это необходимо для корректной маршрутизации сообщений клиентам системы о событиях в самой системе и действиях игроков. Выбор типа соревнования выполняется методом
EntersToCompType. Отказ от выбора — LeaveCompType.
После выбора типа соревнования, игрок выбирает собственно соревнование, в котором он намерен принять участие. Список доступных для выбора соревнований а также методы для его получения
зависят от типа соревнования и описаны ниже. Для изменения выбора соревнования используется метод EnterToCompetition. Состояние подключения игрока: UserInCompState
устанавливается в READY. Отказ от выбора — LeaveCompetition, Состояние игрока —> UNDEFINED.
Здесь "выбор" соревнования означает только намерение игрока, но не начало собственно участия в соревновании. Возможность начала матча может зависеть от наличия подключившихся к игре других игроков,
выбора ими того же соревнования.
При выполнении всех (определяемых игровой программой) условий, соревнование начинается со старта первого фрейма.
− Жизненный цикл соревнований.
− Фрейм
Именно во фрейме игровой программой реализуется внириигровой процесс, будь то ходы в шахматах, удары в биллиарде, решение головоломки.
Игровая программа с подачи игрока вызывает метод GamerStartsFrame, который передает Id матча игрока, и его CustomParams.
Сервер изменяет и запоминает состояние игрока в матче: UserInCompState, (переводит его в состояние INCOMP).
Это необходимо для корректного обслуживания запросов и маршрутизации сообщений игроков во время фрейма. На протяжении фрейма возможен обмен произвольными данными между игроками с использованием метода
InvokeNeigborMethod.
JSON строка CustomParams запоминается сервером для каждого фрейма и по каждому из игроков. Основное предназначение этой строки — некоторые внутри фреймовые параметры, например, карточный расклад.
Собственно фрейм стартует либо когда все участники стартовали методом GamerStartsFrame, либо по окончании ожидания опоздавших. Это определяется игровой программой.
Принципиально фрейм может окончиться в следующих случаях:
- первый из участников выполнил игровое задание
- все участники выполнили игровое задание
- некоторые участники выполнили игровое задание и истекло время ожидания отключившихся/опоздавших игроков
Подсчет очков (голов, секунд, других произвольных характеристик игры), а также определение факта окончания фрейма, целиком и полностью — ответственность игровой программы.
Исходными данными для этого являются как собственные действия игрока, так и информация, полученная от его партнеров по матчу.
Рузультаты фрейма отправляются на сервер только одним из участников.
Методы для записи результатов и последующего получения общих резельтатов специфичны для каждого типа соревнований и описываются ниже.
− Жизненный цикл турнира
Как уже было отмечено, после настройки турнира игроки начинают подписываться для участия в турнире. Список турниров, доступных для того чтобы
подписаться на участие в них, или начать/продолжить участие в них доступен с использованием методов Tournaments.
В список попадают турниры, для которых выполняется следующее условие:
- В турнире еще остались "места" для того, чтобы игрок мог подписаться на участие в турнире, либо игрок уже подписался. Если срок окончания подписки не истек.
- Турнир начался и игрок присутствует в одном из не завершенных матчей.
Игрок выбирает турнир и подписывается на участие в нем с помощью метода
SubscribeToTournir. После того, как игроки подпишутся на участие в турнире и срок окончания подписки истечет,
администратор игры выполняет "посев" игроков и (обязательно) закрывает подписку. После наступления даты начала турнира игроки могут приступать к игре.
Особенностью турниров, как типа соревнования, является то, что окончание каждого матча выявляет единственного игрока — победителя, который переходит в следующий раунд. И так вплоть до победы в
финале, который выявляет победителя турнира. Из этого следует запрет на понятие "ничья", возможность досрочной победы в матче, случай, при котором требуется дополнительый фрейм, отсутствие необходимости учитывать внутри фреймовые
результаты (например, количество забитых голов) при определении победителя турнира.
Окончание фрейма.
При наступлении события окончания фрейма один из участников (игровая программа) записывает результаты фрейма и, одновременно получает данные по всем сыгранным фреймам матча с помощью метода
WriteFrameReadMatchResults. Игровая программа использует полученные данные для определения факта окончания матча и победителя в матче.
Определившая факт окончания матча игровая программа (непременно одна из участвующих в матче) вызывает метод сервера
EndOfRound. Сервер запоминает победителя в матча, переводит его в следующий раунд и оповещает об этом все игровые программы, игроки которых выбрали данный турнир и участвуют в нем.
Если же матч не закончен, игровая программа оповещает других участников матча, используя метод свободных сообщений InvokeNeigborMethod.
Фиксированный состав участников матча турнира (определенный "сеянием" турнира) требует синхронизации времени старта матча. О конкретном времени старта игроки могут договориться между собой
с помощью чата, но установить его должен только один из них. Для этого предусмотрен метод SetTournRoundStart. Также это позволяет обработать ситуацию "опоздавшего"
или "передумавшего" игрока и начать матч без него. Отсутствие такого механизма может привести к блокировке турнира целиком. При установке времени старта матча, кроме оповещения через WEB Socket интерфейс,
можно указать необходимость оповещения участников матча через e-mail (опционально, включает e-mail напоминание за 6 часов до назначенного времени старта).
Вполне возможна ситуация, когда количество подписавшихся на участие в турнире игроков окажется меньше общего количества игроков, в результате чего в самом младшем раунде в одном или нескольких
матчах окажется по одному игроку. В таком случае исключается необходимость синхронизации времени старта и собственно разыгрывания фреймов. Здесь достаточно игровой программе
вызвать метод EndOfRound, после чего игрок перемещается вверх по турнирной пирамиде до раунда, в котором уже есть или могут появится другие участники турнира. Вызывать метод
GamerStartsFrame при этом не обязательно.
− Жизненный цикл чемпионата
Список чемпионатов, доступных для того чтобы подписаться на участие в них, или начать/продолжить участие в них доступен с использованием методов Champs.
В список попадают чемпионаты, дата окончания которых больше чем текущая дата и сыграны не все матчи.
Игрок выбирает чемпионат и подписывается на участие в нем с помощью метода SubscribeToChamp. Поскольку в чемпионате каждый игрок встречается с каждым,
процедура "сеяния" игроков не имеет смысла, подписавшиеся игроки могут начинать матч сразу после наступления времени начала чемпионата. В матче чемпионата всегда ровно два игрока.
В чемпионате отпадает необходимость фиксации времени старта конкретного матча. Игрок может начать игру с любым игроком чемпионата не занятом игрой с другими игроками. Это
не запрещает игрокам предварительно договориться о времени их встречи. По окончанию фрейма игровые программы участников матча записывает результаты фрейма методом
WriteFrameResults. Это может выполнить либо каждая из обеих программ (записать результаты своего игрока), либо одна из них (записать результаты обоих игроков).
Здесь же игровая программ определяет победителя во фрейме и (строго одна из двух) увеличивает количество выигранных победителем фреймов на 1 методом WriteChampFrameScore.
Одновременно с этим определяется факт окончания матча на основе данных по сыгранным фреймам, получаемым методом GetMatchResultsDetail.
Если матч окончен, одна из двух программ вычисляет распределение рейтинга между участниками матча, записывает результаты вычисления рейтинга и счет по очкам в матче
(например: победа 3:0, ничья 2:2 - дело вкуса разработчика) и сообщает системе об окончании матча методом WriteChampPlaceScore. Матч окончен.
В ответ система отправляет участникам матча сообщение о факте окончания чемпионата. Если при этом окончился и чемпионат, одна из двух программ вычисляет и записывает итоговые результаты
чемпионата в целом, а также распределяет места, призы и рейтинговый бонус (если есть) среди участников чемпионата, записывая результаты чемпионата методом WriteChampPrefs.
Чемпионат, как вид соревнования, допускает, что к моменту окончания не все матчи будут сыграны и, соответсвенно, не будут выявлены чемпионы и распределены призы и рейтинговый бонус. Для этого предусмотрена возможность
для администратора игр принудительно распределить призы и рейтинговый бонус среди участников чемпионата. Для этого должны выполняться два условия: Дата окончания чемпионата закончилась и не все
матчи чемпионата сыграны. Распределение призов и рейтингового бонуса выполняется из таблицы чемпионата.
− Жизненный цикл первенства
Список первенств, доступных для участия в них предоставляется методами GetAnteriors.
Из этого списка исключаются первенства, дата начала которых больше текущей, дата окончания меньше текущей, вступительный взнос больше капитала игрока
и вступительный рейтинг больше рейтинга игрока.
Клиент начинает фрейм первенства отправляя серверу команду StartAnterFrame. Сервер транслирует эту команду игрокам, принимающим
участие в данном первенстве.
По завершении фрейма клиент записывает свои результаты сыгранного фрейма WriteFrameResult.
В то время как турниры предоставляют однозначный формальный признак победы игрока в матче, первенства не имеют этого призака.
В связи с этим возникает проблема распределения мест победителей первенства и распределения призов и рейтинга.
Возможны два способа решения этой проблемы. Можно выполнять такое распределение средствами самой игровой программы в момент
когда последний из игроков первенства закончит свой матч. Этот способ имеет существенный недостаток: Количество участников
первенства может изменяться в течении первенства, и, следовательно точно определить "последнего" невозможно. Отбросим этот способ.
Можно выполнять такое распределение каждый раз, когда игрок заканчивает матч первенства. То есть результаты будут переопределяться
в течении первенства. Этот способ представляется допустимым, несмотря на то, что рейтинг и сумма игровой валюты уже сыгравших свои
матчи в первенстве будут изменяться без их участия (1). И последний способ -- администратор игры выполнит такое распределение принудительно, после окончания
первенства (2). Выбор между (1) и (2) способом разработчик игры может жестко запрограммировать либо организовать специальный параметр.
По окончании матча клиент получает текущие результаты первенства по всем матчам с помощью метода GetAnterResultsDetail,
исследует содержимое поля Results всех полученных FrameResult, определяет текущее распределение победителей и записывает результаты
выполнив метод WriteAnterPrefs. Для реализации способа (2) необходимо поля Prize и Rate
в каждом из AnterResult метода WriteAnterPrefs установить в 0.
− 2. API.
Система предоставляет API для взаимодействие с играми, созданными и зарегистрированными в системе. API состоит из двух технологий: REST API и WebSocket.
В REST API используются GET и POST http запросы, WebSocket -- для передачи событий от сервера к клиентским программам, а также для обработки и маршрутизации команд между клиентскими программами одной
и той-же игры. Кроме того, все методы (кроме получения и обновления токенов доступа) REST API имеют двойников в API WebSocket.
При описании API методов системы методы REST API и API WebSocket будут описываться вместе.
Для упрощения интеграции игровой программы с системой, автором системы создан и рекомендуется для использования и свободно распространяемый программный компонент
GBOClientStd на платформе .NET Standart 2.0. Разработчик игр может
свободно использовать и локально редактировать этот компонент.
Этот компонент предоставляет класс Connector, обеспечивающий связь с системой и классы моделей данных. Модели данных описываются далее по мере необходимости.
Класс Connector реализует паттерн soliton, получить инстанс класса: Connector.Instance(gameID, gboUrl, Action<string> updateAccessToken) или
(при повторном получении инстанса: public static Connector Instance()). Здесь string gameID Id игры в системе, string gboUrl
URL системы updateAccessToken метод, вызываемый Connector-ом после обновления access_token и передающий его игровой программе для запоминания . Формат URL REST API запросов: https://www.[домен системы]/Api/Data/[method], MIME-тип application/json, кодировка - utf8.
− Методы API
Префикс для всех URL методов REST API: [Url системы]/API/Data. POST методы могут вызывать WebSocket методы у клиентов.
WebSocket методы.
Системой определены 2 вида WebSocket методов:
-
Target: "имя метода сервера" (ServerMethodName), Arguments: (список аргументов (от 1 до 4-х)), string requestid. Здесь строка requestid должна быть уникальной (UUID).
Предназначение requestid состоит в необходимости организовать CallBack вызовы методов сервера, при котором клиент не слушает непрерывно соответствующий ответ сервера, но
ожидает ответ только на конкретный вызов. Сервер отвечает вызовом метода ServerMethodName{requestid} у клиента. Ответ может содержать данные.
В GBOClientStd таким WebSocket методам соответсыуют методы с постфиксом CallBack. Пример: метод GetActiveDetails.
-
То же, что и предыдущий, но requestid отсутствует. Сервер не отвечает непосредственно на вызов, но может отправить клиенту(клиентам) одну или несколько команд.
Клиент постоянно слушает команды сервера, инициированные таким методом. Пример: чат. Один вызывает, все слушают.
В GBOClientStd таким WebSocket методам соответсвуют методы с постфиксом WebSock. Пример: метод SendMessageWebSock.
− Общие методы
-
basedate. Получение даты и времени сервера. Может быть полезным для синхронизации действий игроков.
HTTP GET: prefix/basedate. Возвращает: Дата и время сервера
WebSocket: Target: "Basedate", Ответ: Target: "Basedate" Возвращает: Дата и время сервера.
GBOClientStd.Connector регулярно (1 раз в час) обноволяет public поле SyncServerDate.
-
getactives. Получение списка активов игрока в игре.
HTTP POST: prefix/getactives, body: [Дата и время].
GBOClientStd.Connector: public SsfActionResult GetActives(DateTime date, out List<GamerActive> result).
WebSocket: Target: "GetActives", Arguments: [Дата и время]; Ответ: Target: "Basedate" Возвращает: [список
GamerActive].
GBOClientStd.Connector: public void GetActivesCallBack(DateTime date, Action<List<GamerActive]>> action)
-
GetCurrencyName. Получение названия валюты игры.
HTTP Get: prefix/getcname
GBOClientStd.Connector: public string GetCurrencyName().
WebSocket: Target: "GetCurrencyName", Ответ: Target: "GetCurrencyName" Возвращает: [строка]
GBOClientStd.Connector: public void GetCurrencyNameCallBack(Action<string> action).
-
BuyActive. Покупка актива игры. Кроме игровой валюты.
HTTP POST: prefix/BuyActive , body: {
Order} Responce: строка: "Недостаточно средств для покупки." или "" в случае успеха.
GBOClientStd.Connector: public SsfActionResult BuyActive(string Id, int volume).
WebSocket: Target: "BuyActive", Arguments: {
Order}; Ответ: Target: "BuyActive" Возвращает: [строка "Недостаточно средств для покупки." или "" в случае успеха.]
GBOClientStd.Connector: public void BuyActiveCallBack(string Id, int volume, Action<string> action).
Замечание. При выполнении обоих методов сервер отправляет команду WebSocket:
Target: "GameActVolChanged" Возвращает: List<Order> из двух Order, один из которых (валютный, IsCurrency = 1 )
отправляется всем игрокам игры, включая вызвавшего метод клиента, а второй (игровой актив, IsCurrency = 0 ) только вызвавшему метод клиенту.
-
GetActiveDetails. История движений актива за период.
HTTP GET: prefix/getactivedetails/id/datestringstart/datestringend,
-
id − string, Иденитификатор актива игрока.
-
datestringstart − string, Дата начала периода в формате YYYYMMDD.
-
datestringend − string, Дата окончания периода в формате YYYYMMDD.
Список измененных ресурсов. Responce: IEnumerable<
UserInGameActiveMoving>.
GBOClientStd.Connector: public IEnumerable<UserInGameActiveMoving> GetActiveDetails(string activeid, DateTime start, DateTime end)).
WebSocket: Target: "GetActiveDetails", Arguments: string id, string datestringstart, string datestringend};
Ответ: Target: "GetActiveDetails" IEnumerable<
UserInGameActiveMoving>.
GBOClientStd.Connector: public void GetActiveDetailsCallBack(string id, string datestringstart, string datestringend, Action<IEnumerable<UserInGameActiveMoving>> action).
-
AddOrder. Приход/Расход игрового актива игрока (включая игровую валюту).
HTTP POST: prefix/AddOrder , body: {
Order} Responce: Отсутствует.
GBOClientStd.Connector: public SsfActionResult AddOrderToActivity(string Id, int volume, string comment).
WebSocket: Target: "AddOrder", Arguments: {
Order }; Ответ: Отсутствует.
GBOClientStd.Connector: public void AddOrderToActivityWebSock(string Id, int volume, string comment).
Замечание. При выполнении обоих методов сервер отправляет WebSocket:
Target: "GameActVolChanged" Возвращает: List<Order> состоящий из одного (того же Order, что и при вызове метода).
Если входящий Order валютный (IsCurrency = 1), то он отправляется всем клиентам игры, иначе только вызвавшему метод клиенту.
-
GetOffers. Получить список биржевых предложений (лотов).
HTTP GET: prefix/GetOffers , Responce:List<
Offer>.
GBOClientStd.Connector: public List<Offer> GetOffers().
WebSocket: Target: "GetOffers", Ответ: Target: "GetOffers" List<
Offer>.
GBOClientStd.Connector: public void GetOffersCallBack(Action<List<Offer>> action).
Замечание. Кроме списка уже выставленных лотов на продажу, в ответе присутствует также и шаблон для создания нового.
-
FindOffers. Найти лоты, в которых есть ресурсы (по или) из списка. Если список пустой,
выводятся все лоты.
HTTP POST: prefix/FindOffers , body: {List<string>} Список Id ресурсов для поиска. Responce:List<
Offer>.
GBOClientStd.Connector: public SsfActionResult FindOffers(List<string> goodids, out List<Offer> result).
WebSocket: Target: "FindOffers", Arguments: { List<string> }; Ответ: Target: "FindOffers" List<
Offer>.
GBOClientStd.Connector: public void FindOffersCallBack(List<string> goodids, Action<List<Offer>> action).
Замечание. Кроме списка уже выставленных лотов на продажу, в ответе присутствует также и шаблон для создания нового.
-
ChangeOffer. Изменение/добавление нового лота. Изменяются кол-во и/или цена ресурсов, принадлежащих лоту.
HTTP POST: prefix/ChangeOffer , body: List<
Good> Список измененных ресурсов. Responce:List<
Good>.
GBOClientStd.Connector: public SsfActionResult ChangeOffer(List<Good> ChangeOffer, out List<Goods> result).
WebSocket: Target: "ChangeOffer", Arguments: {List<
Good> ChangeOffer}; Ответ: Target: "ChangeOffer" List<
Good>.
GBOClientStd.Connector: public void ChangeOfferCallBack(List<Good> ChangeOffer, Action<List<Good>> action)
Замечание. При выполнении обоих методов сервер отправляет:
-
всем игрокам игры, включая вызвавшего метод клиенту: WebSocket Target: "OffersChanged" Возвращает: Offer измененный лот.
-
вызвавшему метод клиенту: WebSocket Target: "ChangeOffer" Возвращает: List<Good> изменившийся список содержимого лота.
-
вызвавшему метод клиенту: WebSocket Target: "GameActVolChanged" Возвращает: List<Order> список остатков активов игрока.
-
GetNewOfferActives. Получение списка ресурсов доступных для добавления в текщий лот
HTTP GET: prefix/GetNewOfferActives/offerid, Список измененных ресурсов. Responce: List<
ActiveType>.
GBOClientStd.Connector: public List<ActiveType> GetNewOfferActives(string oid).
WebSocket: Target: "GetNewOfferActives", Arguments: {string oid}; Ответ: Target: "GetNewOfferActives" List<
ActiveType>.
GBOClientStd.Connector: public void GetNewOfferActivesCallBack(string oid, Action<List<ActiveType>> action).
-
BuyOffer. Покупка лота. При успешном завершении операции возвращается ID лота и пустая строка при ошибке.
HTTP POST: prefix/BuyOffer, body: {string offerid}. Возвращает: offerid
GBOClientStd.Connector: public SsfActionResult BuyOffer(string offerid, out string offid).
WebSocket: Target: "BuyOffer", Arguments: {string offid}; Ответ: Target: "BuyOffer" {string offerid}.
GBOClientStd.Connector: public void BuyOfferCallBack(string offid, Action<string> action)
Замечание. При выполнении обоих методов сервер отправляет:
-
всем игрокам игры, включая вызвавшего метод клиенту: WebSocket Target: "OfferBuyed" Возвращает: string offid Id купленного лота.
-
всем игрокам игры, кроме вызвавшего метод клиенту: WebSocket Target: "GameActVolChanged" Возвращает: List<Order> Единственный Order,
изменение остатка игровой валюты покупателя.
-
вызвавшему метод клиенту: WebSocket Target: "GameActVolChanged" Возвращает: List<Order> список остатков активов игрока.
-
GetExchangeEntities. Получение списка валют для обмена.
HTTP GET: prefix/GetExchangeEntities. Возвращает: List<
ExchangeEntity>.
GBOClientStd.Connector: public List<ExchangeEntity> GetExchangeEntities().
WebSocket: Target: "GetExchangeEntities" Ответ: Target: "GetExchangeEntities" List<
ExchangeEntity>.
GBOClientStd.Connector: public void GetExchangeEntitiesCallBack(Action<List<ExchangeEntity>> action)
-
DoExchange. Выполнение операции обмена.
HTTP POST: prefix/DoExchange. body:
ExchangeOrder
GBOClientStd.Connector: public void DoExchangeCallBack(ExchangeOrder exchangeOrder).
WebSocket: Target: "DoExchange" Ответ: Target: "DoExchange" Boolean true — успех, false — ошибка.
GBOClientStd.Connector: public void DoExchangeCallBack(ExchangeOrder exchangeOrder, Action<bool> action)
-
InvokeNeigborMethod.
Вызов метода у клиента(ов) системы. Фактически система выполняет функции маршрутизатора произвольных команд от одного клиента к другим.
Система не фиксирует факт прохождения команды и не обрабатывает ее содержимое.
HTTP POST: Неприменимо.
WebSocket: Target: "InvokeNeigborMethod",
GBOClientStd.Connector: public void InvokeNeigborMethodWebSock(string[] SsfConnectIds, bool needBack, string methodname, FreeMesssage methodparams).
Arguments:
{
-
Список строк: Id получателей команды. Внутрисистемные ID подключения клиента (ssfconnectid)
-
Boolean: Признак необходимости включения в список получателей отправителя.
-
Строка: Имя метода получателя. Важно чтобы у получателей такой метод был.
-
FreeMesssage: Обьект, инкапсулирующий параметры метода, вызываемого у получателей.
}
Ответ: Отсутствует
-
InvokeNeigborsSCaS.
Аналогично InvokeNeigborMethod. За исключения того, что список получателей выбирается сервером из числа клиентов в
той же игре, том же типе соревнования и с тем же состоянием
-
InvokeNeigborsSTCaS.
Аналогично InvokeNeigborMethod. За исключения того, что список получателей выбирается сервером из числа клиентов в
той же игре, том же соревновании и с тем же состоянием
− Методы чата
-
GetInterlocutors. Получение списка собеседников. В список
входят администратор игры и игроки игры.
HTTP GET: prefix/GetInterlocutors. Возвращает: List<
Interlocutor>.
GBOClientStd.Connector: public List<Interlocutor> GetInterlocutors().
WebSocket: Target: "GetInterlocutors" Ответ: Target: "GetInterlocutors" List<
Interlocutor>.
GBOClientStd.Connector: public void GetInterlocutorsCallBack(Action<IEnumerable<Interlocutor>> action)
-
GetChatHist. Получение списка сообщений от собеседника.
HTTP GET: prefix/GetChatHist/neghbid. neghbid — UserId отправителя Возвращает: IEnumerable<
ChatMess>.
GBOClientStd.Connector: public IEnumerable<ChatMess> GetChat(string neghbid).
WebSocket: Target: "GetChatHist", Arguments: {string neghbid}; Ответ: Target: "GetChatHist" IEnumerable<
ChatMess>.
GBOClientStd.Connector: public void GetChatCallBack(string neghbid, Action<IEnumerable<ChatMess>> action).
-
GetAllChatCount. Получение количества непрочитанных сообщений.
HTTP GET: prefix/GetAllChatCount. Возвращает: integer.
GBOClientStd.Connector: public int GetAllChatCount().
WebSocket: Target: GetAllChatCount() Ответ: Target: "GetAllChatCount" Возвращает: integer.
GBOClientStd.Connector: public void GetAllChatCountCallBack(Action<int> action).
-
SetMessReaded. Фиксация факта прочитанности сообщений от собеседника.
HTTP POST: prefix/SetMessReaded Body: string neghbid — UserId собеседника.
GBOClientStd.Connector: public void SetMessReaded(string messid).
WebSocket: Target: SetMessReaded Arguments: {string neghbid}; .
GBOClientStd.Connector: public void SetMessReadedWebSock(string messid).
-
TransMessageFC. Отправка сообщения собеседнику.
HTTP POST: Неприменимо.
WebSocket: Target: SendMessageWebSock Arguments: {string recipientId, string text}.
GBOClientStd.Connector: public void SendMessageWebSock(string recipientId, string text).
Замечание. Ответы:
Target "NewMessage" Возвращает: ChatMess отправителю и получателю.
Target "ChatCountChanged" Возвращает получателю: string UserId отправителя, integer кол-во сообщений от отправителя - получателю, не прочитанных получателем.
− Методы соревнований
-
− Общие методы
- EntersToCompType. Выбор типа соревнования.
WebSocket: Target: "EntersToCompType". Arguments:
comptype Тип соревнования. Ответ:
Target: "ParnterChooseComp" Arguments: string UserId,
— ID игрока в системе; string ConnectId — ID подключения игрока,
comptype Тип соревнования.
GBOClientStd.Connector: public void ChooseCompetitionWebSock(comptype)
Ответ отправляется online игрокам игры, выбравшим тот же тип соревнования, что и отправитель, исключая самого отправителя.
- LeaveCompType. Отказ от выбора типа соревнования.
WebSocket: Target: "LeaveCompetition". Arguments:
comptype Тип соревнования. Ответ:
Target: "ParnterOutOfChooseComp" Arguments: string UserId,
— ID игрока в системе; string ConnectId — ID подключения игрока,
comptype Тип соревнования.
GBOClientStd.Connector: public void LeaveCompTypeWebSock(comptype)
Ответ отправляется online игрокам игры, выбравшим тот же тип соревнования, что и отправитель, исключая самого отправителя.
- EnterToCompetition. Выбор игроком соревнования.
WebSocket: Target: "EntersToCompType". Arguments: string cid — ID соревнования. Ответы:
-
Target: "PartnerEntersLeavesCompet" Arguments: CompApplicant,
— Подписавшийся игрок; string — ID соревнования, "покинутого" игроком;
boolean — призак "выбранности" = false
-
Target: "PartnerEntersLeavesCompet" Arguments: CompApplicant,
— Подписавшийся игрок; string — ID соревнования, "выбранного" игроком;
boolean — призак "выбранности" = true
GBOClientStd.Connector: public void EnterToCompetitionWebSock(string cid)
Ответ отправляется online игрокам игры, выбравшим то же соревнование, что и отправитель, включая самого отправителя.
- LeaveCompetition. Покидание игроком соревнования.
WebSocket: Target: "LeaveCompetition". Arguments: string cid — ID соревнования. Ответ:
Target: "PartnerEntersLeavesCompet" Arguments:
CompApplicant,
— Подписавшийся игрок; string — ID соревнования, "покинутого" игроком;
boolean — призак "выбранности" = false
GBOClientStd.Connector: public void LeaveCompetitionWebSock(string cid)
Ответ отправляется online игрокам игры, выбравшим то же соревнование, что и отправитель, исключая самого отправителя.
- GamerStartsFrame. Старт фрейма.
WebSocket: Target: "GamerStartsFrame". Arguments:
{
- string placeid — ID матча.
- string customParams — произвольная строка параметров начинающегося фрейма
}
Ответ:
Target: "FrameStarted" Arguments:
CompApplicant
{
- Name = user.Name (user - игрок, стартовавший фрейм)
- Id = user.Id
- CompId = user.CompId (Id соревнования, выбранное игроком)
- ConnectId = user.ssfconnectid
- CustomParams = customParams
}
Ответ отправляется игрокам того же матча, что и у отправителя.
-
WriteFrameResult. Запись результатов фрейма одного игрока
HTTP POST: prefix/WriteFrameResults. body:
FrameResult.
GBOClientStd.Connector: public SsfActionResult WriteFrameResults(FrameResult frameresults).
WebSocket: Target: "WriteFrameResults" Arguments:
FrameResult frameresults.
GBOClientStd.Connector: public void WriteFrameResultWebSock(FrameResult frameresults)
-
WriteFrameResults. Запись результатов фрейма нескольких игроков.
HTTP POST: prefix/WriteFrameResults. body: List<
FrameResult> .
GBOClientStd.Connector: public SsfActionResult WriteFrameResults(List<FrameResult> frameresults).
WebSocket: Target: "WriteFrameResults" Arguments: List<
FrameResult> frameresults.
GBOClientStd.Connector: public void WriteFrameResultsWebSock(List<FrameResult> frameresults)
-
WriteAnterPrefs. Запись результатов фрейма нескольких игроков.
HTTP POST: prefix/WriteAnterPrefs. body: List<
AnterResult> .
GBOClientStd.Connector: public SsfActionResult WriteAnterPrefs(List<AnterResult> results).
WebSocket: Target: "WriteAnterPrefs" Arguments: List<
AnterResult> results.
GBOClientStd.Connector: public void WriteAnterPrefsWebSock(List<AnterResult> results)
-
− Турниры
-
Tournaments. Получение списка турниров.
HTTP GET: prefix/Tournaments. Возвращает: List<
Tournament>.
GBOClientStd.Connector: public List<Tournament>GetTournaments().
WebSocket: Target: "Tournaments" Ответ: Target: "Tournaments" List<
Tournament>.
GBOClientStd.Connector: public void GetTournamentsCallBack(Action<List<Tournament>> action)
-
SubscribeToTournir. Подписывание игрока на участие в соревновании.
WebSocket: Target: "SubscribeToTournir". Arguments: string id — ID турнира.
Ответ: Target: "PartnerSubscribeToTournir" Arguments:
- string ID турнира.
- CompApplicant Подписавшийся участник сорквнования.
GBOClientStd.Connector: public void SubscribeToTournirWebSock(string id)
Ответ отправляется online игрокам игры, выбравшим тот же турнир, что и отправитель, включая самого отправителя.
-
WriteFrameReadMatchResults. Запись результатов фрейма и получение
результатов матча турнира.
WebSocket: Target: "WriteFrameReadMatchResults". Arguments: List<
FrameResult> frameresults
Ответ: Target: "WriteFrameReadMatchResults{requestid}" Arguments: List<
FrameResult> frameresults.
GBOClientStd.Connector: public void WriteFrameReadMatchResultsCallBack(List<FrameResult> frameresults, Action<List<FrameResult>> action)
Ответ отправляется online игрокам игры, участвующим в том же соревновании, что и отправитель, включая самого отправителя.
-
EndOfRound. Окончание матча в турнире.
WebSocket: Target: "EndOfRound". Arguments: string placeid — ID матча, string winnerid — ID игрока − победителя.
Ответ: Target: "EndOfRound" Arguments:
NextRoundPlace.
GBOClientStd.Connector: public void EndOfRoundWebSock(string placeid, string winnerid)
Ответ отправляется online игрокам игры, участвующим в том же соревновании, что и отправитель, включая самого отправителя.
-
SetTournRoundStart. Установка даты и времени старта матча турнира.
WebSocket: Target: "SetTournRoundStart". Arguments:
RoundStart roundStart.
Ответ: Target: "TournRoundStartSetted" Arguments:
RoundStart roundStart.
GBOClientStd.Connector:public void SetTournRoundStartWebSock(RoundStart start)
Ответ отправляется online игрокам игры, участвующим в том же соревновании и матче, что и отправитель, включая самого отправителя.
-
− Чемпионаты
-
Champs. Получение списка чемпионатов.
HTTP GET: prefix/Champs. Возвращает: List<
Champ>.
GBOClientStd.Connector: public List<Champ>GetChamps().
WebSocket: Target: "Champs" Ответ: Target: "Champs" List<
Champ>.
GBOClientStd.Connector: public void GetChampsCallBack(Action<List<Champ>> action)
-
SubscribeToChamp. Подписывание игрока на участие в соревновании.
WebSocket: Target: "SubscribeToChamp". Arguments: string id — ID турнира. Ответ: Target: "PartnerSubscribeToChamp" Arguments:
CompApplicant,
— Подписавшийся игрок, string id — ID турнира.
GBOClientStd.Connector: public void SubscribeToChampWebSock(string id)
Ответ отправляется online игрокам игры, выбравшим тот же турнир, что и отправитель, включая самого отправителя.
- WriteChampFrameScore. Запись результатов фрейма
HTTP POST: prefix/WriteChampFrameScore. body: string[ ] {userid, pid}. Здесь userid − Id игрока победителя во фрейме, pid − Id матча, которому принадлежит фрейм.
GBOClientStd.Connector: public SsfActionResult WriteChampFrameScore(string userid, string pid).
WebSocket: Target: "WriteChampFrameScore" Arguments: string userid, string pid.
GBOClientStd.Connector: public void WriteChampFrameScoreWebSock(string userid, string pid)
- GetMatchResultsDetail. Получение результатов матча
HTTP GET: prefix/GetMatchResultsDetail/matchid. matchid — Id матча. Возвращает: IEnumerable<
FrameResult>
GBOClientStd.Connector: public IEnumerable<FrameResult>(string matchid).
WebSocket: Target: "GetMatchResultsDetail". Arguments: string matchid. Ответ: Target: "GetMatchResultsDetail" Arguments:IEnumerable<
FrameResult>
Ответ направляется запросившему данные.
GBOClientStd.Connector: public void GetMatchResultsDetailCallBack(string matchid, Action<IEnumerable<FrameResult>> action)
-
WriteChampPlaceScore. Запись результатов матча чемпионата
HTTP POST: prefix/WriteChampPlaceScore. body:
ChampPlaceScore. Возвращает:
SsfActionResult
GBOClientStd.Connector: public void WriteChampPlaceScore(ChampPlaceScore matchid).
WebSocket: Target: "WriteChampPlaceScore". Arguments:
ChampPlaceScore.
GBOClientStd.Connector: public void WriteChampPlaceScoreWebSock(ChampPlaceScore champPlaceScore)
Каждый из методов отправляет WebSocket сообщение: Target: "ChampEnded" Arguments: bool isend — признак окончания чемпионата.
-
− Первенства
-
GetAnteriors. Получение списка первенств.
HTTP GET: prefix/GetAnteriors. Возвращает: List<
Anterior>.
WebSocket: Target: "Champs" Ответ: Target: "GetAnteriors" List<
Anterior>.
GBOClientStd.Connector: public List<Anterior> GetAnteriors()
GBOClientStd.Connector: public Task<List<Anterior>> GetAnteriorsAsync()
GBOClientStd.Connector: public void GetAnteriorsCallBack(Action<List<Anterior>> action)
-
StartAnterFrame. Запись результатов матча чемпионата
HTTP POST: prefix/StartAnterFrame. body: string compid. Возвращает:
AnterApplicant
WebSocket: Target: "StartAnterFrame". Arguments: string compid. Ответ Target: "StartAnterFrame". Arguments:
AnterApplicant
Оба метода отправляют WebSocket команду "StartAnterFrame" с Arguments: AnterApplicant игрокам, в том же первенстве.
GBOClientStd.Connector: public AnterApplicant StartAnterFrame(string compid)
GBOClientStd.Connector: public async Task<AnterApplicant> StartAnterFrameAsync(string compid)
GBOClientStd.Connector: public void StartAnterFrameWebSock(string compid)
-
GetAnterResultsDetail. Запись результатов матча чемпионата
GET POST: prefix/GetAnterResultsDetail/{compid}. Где compid — Id первенства. Возвращает: List<
FrameResult>
WebSocket: Target: "GetAnterResultsDetail". Arguments: string compid. Ответ Target: "GetAnterResultsDetail". Arguments: List<
FrameResult>
GBOClientStd.Connector: public List<FrameResult> GetAnterResultsDetail(string compid)
GBOClientStd.Connector: public async Task<List<FrameResult>> GetAnterResultsDetailAsync(string compid)
GBOClientStd.Connector: public void GetAnterResultsDetailCallBack(string compid, Action<List<FrameResult>> action)
-
− Свободные матчи
− Модели данных
-
enum ERROR
- - NOERROR = 0,
- - USERNOTEXISTS,
- - WRONGPASSWORD,
- - USERNAMEEXISTS,
- - USEREMAILEXISTS,
- - USERNOTINGAME,
- - USERINGAMELOCKED,
- - GAMELOCKED,
- - USERINGAME,
- - WRONGREQUEST,
- - COMMONERROR,
- - WRONGEMAILFORMAT,
- - GAMENOTEXISTS,
- - USERLOCKED,
- - UNAUTHORIZED,
- - DOUBLEENTERPERMITS,
- - GAMELOCKEDBYAUTHOR,
- - GAMEADMINLOCKED
-
class SsfActionResult
- - ERROR Error,
- - string Message
-
enum UserInCompState
- - UNDEFINED = -1,
- - READY, — игрок выбрал матч, но еще не стартовал фрейм
- - INCOMP, — стартовал
- - WAITFOREOF — ожидает окончания фрейма
- - WAITFORSTART — ожидает старта фрейма партнерами по матчу
-
enum COMPTYPE
- - UNDEFINED = -1,
- - CHAMP,
- - TOURNIR,
- - FREEMATHCH,
- - ANTERIORITY
-
class GamerActive
- - string ActiveName — название актива,
- - string Id — ID актива клиента в игре,
- - string Category — название категории актива,
- - int Volume — кол-во единиц актива,
- - int IsCurrency — признак валюты 1 - валюта 0 - нет,
- - decimal Cost — текущая цена актива в валюте игры,
-
class ChangeRatingRequest
- - string Uid — Id игрока,
- - int Value — величина изменения,
- - string Comment — Комментарий,
-
class Order
- - string Id — Id актива игрока,
- - string UserId — Id актива игрока, активу которого принадлежит операция.
- - string Comment — Комментарий к операции (не более 100 символов),
- - int Value — кол-во единиц актива
- - int IsCurrency — Признак валюты. 1 − игровая валюта, 0 − другой актив.
-
class FreeMesssage
- - string FromId — ssfconnectid отправителя, при отправке сообщения не обязателен, подставляется сервером
- - string MethodJsonParams — Произвольная строка сообщения. Рекомендуется использовать как json строку произвольного игрового обьекта.
-
class Offer
- - string OfferId — Id биржевого предложения (лота)
- - string OfferNum — Номер лота.
- - string SellerId — Id игрока выставившего лот на продажу (продавца)
- - string SellerName — Имя продавца
- - decimal FullCost — Полная стоимость лота (по ценам продавца)
- - DateTime? CreateDate — Дата выставления лота (при создании нового — null)
- - bool IsNew — Признак "новый"
- - int Editable — Редактируемость. 1 — редактируемый (новый + свой), 0 — чужой.
-
class Good
- - string GoodId — Id элемента лота. Соответствует ID игрового ресурса
- - string OfferId — Id лота.
- - string ActiveId — Id игрового ресурса
- - string ActiveName — Имя игрового ресурса
- - int Volume — Кол-во единиц игрового ресурса
- - int MaxVol — Максимальное кол-во единиц игрового ресурса, которое можно выставить на продажу.
- - decimal Cost — Цена, определенная продавцом.
- - ActiveType ActiveType — Игровой ресурс
- - List<ActiveType> ActiveTypes — Список игровых ресурсов (для нового элемента)
- - bool IsNew — Признак добавляемого элемента.
-
class ActiveType
- - string Id — Id игрового ресурса.
- - string TypeName — Имя игрового ресурса.
- - int MaxVol — Максимальное кол-во единиц игрового ресурса, которое можно выставить на продажу.
-
class ExchangeOrder
- - string GameSellId — Id игры, валюта которого продается.
- - string GameBuyId — Id игры, валюта которого покупается.
- - string SellCurrId — Id продаваемой валюты.
- - string BuyCurrId — Id покупаемой валюты.
- - int BuyVolume — Кол-в покупаемой валюты.
-
class ExchangeEntity
- - string CurrId — Id валюты.
- - string CurrName — Имя валюты.
- - string GameName — Имя игры.
- - decimal Rate — Курс валюты.
- - int Volume — Кол-во единиц валюты.
- - int MaxVolume — Максимальное кол-во единиц валюты, доступное для обмена.
- - decimal Komiss — Комиссионная ставка.
- - int FullKomiss — Комиссия в единицах валюты.
-
class Interlocutor
- - string Id — Id игрока.
- - string Name — Имя игрока.
- - string SrConnectID — Id подключения игрока (ssfconnectid).
- - int MessCount — Кол-во непрочитанных сообщений от игрока
-
class ChatMess
- - int Dir — Направление сообщения 0 — входящее, 1 — исходящее
- - string MessageId — ID сообщения.
- - string senderid — Id отправителя (UserId).
- - DateTime MessageDateTime — Дата собщения
- - string Message — Само собщение
-
class CompApplicant
- - string Id — ID (UserId) участника соревнования.
- - string ConnectId — ID подключения участника соревнования. (ssfconnectid).
- - string Name —Имя участника соревнования.
- - int Score — Очки участника соревнования.
- - int Rating — Рейтинг участника соревнования.
- - int Capital — Остаток игровой валюты участника соревнования.
- - string PlaceId — ID матча (места) соревнования.
- - string InPlaceId — ID матча (места) соревнования, выбранного игроком. ТОлько для чемпионатов.
- - string NextPlaceId — ID следующего матча (места) турнира. Только для турниров.
- - string CompId — ID соревнования.
- - bool IsSubscribed — Признак подписанности игрока на участие в соревновании.
- - UserInCompState InCompState — Состояние игрока в текущем матче соревнования
- - string CustomParams — Строка произвольных параметров участника соревнования в текущем фрейме. Рекомендуется использовать как json строку произвольного игрового обьекта.
-
class AnterApplicant. Наследует CompApplicant
- - List<string> CompResult —Список результатов игрока в матче первенства.
- - int FrameNum — Текущий номер фрейма игрока в матче первенства.
-
class CompParameter
- - string Id — ID параметра.
- - string ParamName — Имя параметра.
- - int Value — Значение параметра.
-
class Competition
- - string Id — ID соревнования.
- - string Name — Название соревнования.
- - DateTime Start — Дата и время старта соревнования.
- - int Ante —Ставка соревнования.
- - int Cenz — Вступительный рейтинг.
- - int AuthorGift — Стимул от администратора игры в валюте игры.
- - int NumberOfMembers —Количество игроков в соревновании.
-
class Tournament. Наследует Competition
- - List<CompApplicant> Subscribed — Список подписавшихся участников турнира.
- - DateTime EndOfSubscribe — Последний день для подписки.
- - List<TournRound> Rounds — Список раундов турнира.
- - int MembersInRound —Количество игроков в одном матче.
- - bool IsSeeded —Признак "посеенности" турнира.
- - int PlaceFutureCount — Количество партнеров, с которыми участнику турнира предстоит встретиться в следующих раундах
-
class Champ. Наследует Competition
- - DateTime End — Дата и время окончания чемпионата.
- - List<CompPlace> Places — Матчи чемпионата.
- - List<CompParameter> Parameters — Параметры чемпионата.
-
class Anterior. Наследует Competition
- - DateTime End — Дата и время окончания первенства.
- - List<AnterApplicant> Places — Участники первенства.
- - List<CompParameter> Parameters — Параметры первенства.
-
class TournRound
- - string Id — ID раунда.
- - string RoundNum — Номер раунда. "1" - финал, "2" - полуфинал и т.д.
- - IEnumerable<RoundPlace> RoundPlaces — Матчи раунда.
- - IEnumerable<CompParameter> Parameters — Параметры раунда.
-
class CompPlace
- - string Id — ID матча.
- - List<CompApplicant> Applicants — Список участников матча.
- - DateTime? Start — Дата и время старта матча. Для не начавшегося матча — null.
- - DateTime? End — Дата и время окончание матча. Для не окончившегося матча — null.
- - int FrameNum — Номер текущего фрейма (внутри матча).
-
class RoundPlace наследует CompPlace
- - Собственные свойства:
- - string FromPlaceId — ID предыдущего матча (при перемещении вверх по турнирной пирамиде).
- - bool Finished — Признак закончившегося матча. Хотя бы один из игроков закончил матч. Допустима ситуация, когда для старта матча не обязательно ожидать всех игроков.
- - bool PathToUpExists — Возможность продолжать борьбу в турнире. False если игрок победил в турнире, либо хотя бы один матч в предполагаемом
пути игрока вверх по турнирной пирамиде уже сыгран.
-
class NextRoundPlace
- - Представляет данные о переходе в следующий раунд турнира.
- - string FromPlaceId — ID предыдущего матча (при перемещении вверх по турнирной пирамиде).
- - string ToPlaceID — ID следующего матча (при перемещении вверх по турнирной пирамиде).
- - string RoundNum — Номер раунда. "1" - финал, "2" - полуфинал и т.д.
- - string GamerId — ID игрока, переходящего в следующий раунд.
- - int FuturePartners — Количество партнеров, которые перешли или могут перейти в тот же раунд, что и перешедший игрок. FuturePartners == 0 означает,
что игрок уже не встретит партнеров в своем пути вверх по турнирной пирамиде, то есть при старте матча, он сразу становится победителем турнира. Кроме того, может быть полезным
при определении размеров призов на промежуточных раундах.
- - bool PathToUpExists — Возможность продолжать борьбу в турнире. False если игрок победил в турнире, либо хотя бы один матч в предполагаемом
пути игрока вверх по турнирной пирамиде уже сыгран.
-
class FrameResult
- - string CompId — ID соревнования.
- - string UserId — ID игрока.
- - string MatchId — ID матча.
- - int FrameNum — Номер фрейма.
- - string Results — Произвольная строка. Рекомендуется использовать как json строку произвольного игрового обьекта.
- - int Points — Очки, назначенные игроку за победу в матче чемпионата.
- - int WinFrames — Количество выигранных фреймов.
- - int LoosFrames — Количество проигранных фреймов.
- - DateTime? Ended — Дата и время (до миллисекунд) окончания фрейма игроком.
-
class ChampPref
- - string CompId — ID первенства.
- - string UserId — ID игрока.
- - int PlaceNum — Место, занятое игроком в соревновании.
- - int Prize — Сумма выигрыша в валюте игры.
- - int Rate — Изменение рейтинга игрока.
-
class AnterResult. Наследует ChampPref
- - decimal Score — Сводный результат игрока в первенстве.
-
class RoundStart
- - string Pid — ID матча.
- - DateTime Start — Дата и время старта.
- - bool SendEmail — Признак необходимости отправки e-mail.
-
class ChampPlaceScore
- - string PlaceId — ID матча.
- - List<GamerPoints> GamerPoints — очки за победу в матче чемпионата
- - List<Order> Rateord — распределение рейтинга между участниками матча.
-
class GamerPoints
- - string UserId — ID участника матча чемпионата.
- - int Points — количество очков за победу в матче чемпионата