Skip to content

Latest commit

 

History

History
632 lines (470 loc) · 8.37 KB

README.md

File metadata and controls

632 lines (470 loc) · 8.37 KB

协议相关

协议的定义

协议分为两类:http协议websocket协议

所有的请求类都通过http协议,心跳和推送类通过websocket协议

http协议

http协议全部采用POST请求,请求体和回包都采用json格式。

请求:

{
  "name": "login", // 协议名称,不含"_cs"或"_sc"
  "data": { // 协议内容,下文一一列举(如果协议体为空,则没有这个字段,以便减小协议大小)
    "name": "test01"
  }
}

返回:

{
  "code": 0, // 0表示成功,其它表示失败
  "msg": "ok", // 如果code不为0,则为错误信息,否则没有这个字段
  "data": { // 协议内容,下文一一列举(如果协议体为空,则没有这个字段,以便减小协议大小)
    "token": "xxxxx"
  }
}

websocket协议

也采用json格式,只有心跳和推送类两种,客户端to服务器和服务器to客户端的协议格式一致:

{
  "name": "heart_sc", // 协议名称,含"_sc"和"_cs"
  "data": {
    "now": 12345433342
  }
}

全部协议

心跳、登录相关

心跳请求

协议类型:websocket

示例:

{
  "name": "heart_cs",
}

心跳返回

协议类型:websocket

示例:

{
  "name": "heart_sc",
  "data": {
    "now": 12345433342 // 服务器当前时间戳,单位毫秒
  }
}

登录

协议类型:http

请求:

{
  "name": "login",
  "data": {
    "token": "xxxxx", // 客户端token,服务器是以token来判定唯一的用户
    "name": "test01" // 用户名
  }
}

返回:

{
  "code": 0,
  "data": {
    "rid": "test01" // 房间号,如果为null则表示没有房间
  }
}
房间配置

创建房间

协议类型:http

请求:

{
  "name": "create_room",
  "data": { // 下文很多协议的结构都和这个一样
    "rid": "test01", // 房间名
    "type": 1, // 1-标准赛,2-BP赛,3-link赛
    "solo": false, // 是否为无导播局
    "add_robot": false, // 是否为打机器人局
    "game_time": 30, // 游戏总时间(不含倒计时),单位:分
    "countdown": 5, // 倒计时,单位:秒
    "games": ["6", "7", "8"], // 含有哪些作品
    "ranks": ["L", "EX"], // 含有哪些游戏难度,也就是L卡和EX卡
    "need_win": 2, // 需要胜利的局数,例如2表示bo3
    "difficulty": 1, // 难度(影响不同星级的卡的分布),1对应E,2对应N,3对应L,其它对应随机
    "cd_time": 30, // 选卡cd,收卡后要多少秒才能选下一张卡
    "reserved_type": 1 // 纯客户端用的一个类型字段,服务器只负责透传
  }
}

返回:

{
  "code": 0,
  "data": {
    "rid": "10" // 房间名
  }
}

获取房间配置

协议类型:http

请求:

{
  "name": "get_room_config",
  "data": {
    "rid": "test01" // 房间名
  }
}

返回:

{
  "code": 0,
  "data": { // 和create_room结构一样
  }
}

修改房间配置

协议类型:http

请求:

{
  "name": "update_room_config",
  "data": { // 和create_room结构一样
  }
}

返回:

{
  "code": 0
}

推送房间配置更新

协议类型:websocket

示例:

{
  "name": "update_room_config_sc",
  "data": { // 和create_room结构一样
  }
}
房间状态

加入房间

协议类型:http

请求:

{
  "name": "join_room",
  "data": {
    "rid": "test01" // 房间名
  }
}

返回:

{
  "code": 0,
  "data": {
    "rid": "test01", // 房间名
    "type": 1, // 1-标准赛,2-BP赛,3-link赛
    "host": "test00", // 房主的名字
    "names": ["test01", "test02"], // 玩家名字列表,一定有2个,没有人则对应位置为空
    "change_card_count": [1, 2], // 换卡次数,一定有2个,和上面的names一一对应
    "started": false, // 是否已经开始
    "score": [1, 2], // 比分,一定有2个,和上面的names一一对应
    "watchers": ["test03", "test04"] // 观众名字列表,有几个就是几个
  }
}

离开房间

协议类型:http

请求:

{
  "name": "leave_room"
}

返回:

{
  "code": 0
}

观战(站起)

协议类型:http

请求:

{
  "name": "stand_up"
}

返回:

{
  "code": 0
}

作为选手(坐下)

协议类型:http

请求:

{
  "name": "sit_down"
}

返回:

{
  "code": 0
}

获取房间

协议类型:http

请求:

{
  "name": "get_room"
}

返回:

{
  "code": 0,
  "data": { // 和join_room结构一样
  }
}

推送房间状态更新

由于实时性要求非常高,考虑到websocket和http是两条信道,可能有并发问题,一律采用推送只推送发生了变化,客户端重新请求获取信息接口的方式

协议类型:websocket

示例:

{
  "name": "update_room_sc"
}
客户端透传协议

协议类型:websocket

请求:

{
  "name": "set_phase",
  "data": {
    "phase": 1
  }
}

返回:

{
  "code": 0
}

请求:

{
  "name": "get_phase"
}

返回:

{
  "code": 0,
  "data": {
    "phase": 1
  }
}
游戏相关

游戏开始

协议类型:http

请求:

{
  "name": "start_game"
}

返回:

{
  "code": 0
}

推送游戏开始

协议类型:websocket

示例:

{
  "name": "start_game_sc",
  "data": { // 和create_room结构一样,也就是房间配置,以防同步失败
  }
}

游戏结束

协议类型:http

请求:

{
  "name": "stop_game",
  "data": {
    "winner": -1 // -1表示平局,0表示左边,1表示右边
  }
}

返回:

{
  "code": 0
}

推送游戏结束

协议类型:websocket

示例:

{
  "name": "stop_game_sc",
  "data": {
    "winner": -1 // -1表示平局,0表示左边,1表示右边
  }
}

警告玩家

协议类型:http

请求:

{
  "name": "gm_warn_player",
  "data": {
    "name": "test01" // 玩家名
  }
}

返回:

{
  "code": 0
}

推送警告玩家

协议类型:websocket

示例:

{
  "name": "gm_warn_player_sc",
  "data": {
    "name": "test01" // 玩家名
  }
}

获取所有符卡

协议类型:http

请求:

{
  "name": "get_all_spells"
}

返回:

{
  "code": 0,
  "data": {
    "spells": [
      {
        "index": 1, // 符卡唯一ID
        "game": "6", // 作品
        "name": "", // 符卡名
        "rank": "L", // 难度
        "star": 3, // 星级
        "desc": "", // 符卡描述
        "id": 1, // 在对应作品里的id
        "fastest": 1.0, // AI参数
        "one": 1.0, // AI参数
        "two": 1.0, // AI参数
        "three": 1.0, // AI参数
        "final": 1.0, // AI参数
        "bonus_rate": 1.0 // AI参数
      }, // 有25个符卡
    ],
    "left_time": 1, // 倒计时剩余时间,单位:毫秒
    "status": 1, // 0-未开始,1-赛前倒计时中,2-开始,3-暂停中,4-结束
    "left_cd_time": 1 // 选卡cd剩余时间,单位:毫秒
  }
}

选卡

协议类型:http

请求:

{
  "name": "select_spell",
  "data": {
    "index": 1 // 第几张卡,0-24
  }
}

返回:

{
  "code": 0
}

收卡

协议类型:http

请求:

{
  "name": "finish_spell",
  "data": {
    "index": 1 // 第几张卡,0-24
  }
}

返回:

{
  "code": 0
}

房主修改卡

协议类型:http

请求:

{
  "name": "update_spell_status",
  "data": {}
}

返回:

{
  "code": 0
}

推送符卡状态

收到获取所有符卡协议之后一定会推送一个

协议类型:websocket

示例:

{
  "name": "update_spell_status_sc",
  "data": {
    "spells": [ // 有可能一次推送多个
      {
        "index": 1, // 第几张,0-24
        "status": [1, 2] // 0-未选,1-已选,2-已收,分别左右两人
      }
    ],
    "causer": "test01" // 造成这个状态变化的玩家(可能是房主)(如果是获取所有符卡后的全量推送,则这个字段为空)
  }
}