# 牛牛 ## 定義表 ### cardstyle 牌型對照 | 牌型|代號 |-|- |無牛|0 |牛1|1 |牛2|2 |牛3|3 |牛4|4 |牛5|5 |牛6|6 |牛7|7 |牛8|8 |牛9|9 |牛牛|10 |五牛|11 ## client -> server 为cli端请求srv端的cmd, 透过 cbId 做消息配对, 响应后c端先判断 err 字段是否为空作例外处理. ### RoomStatus 请求参数: { "svr": "niuniu", // <string> 游戏名 "route": "niuniu.roomStatus", // <string> 游戏名.的cmd "args": null, // <any> "cbId": 3 } 返回数据: <table> <thead class="ant-table-thead"> <tr> <th key="name" style="width: 500px">名称</th> <th key="type">类型</th> <th key="required">是否必须</th> <th key="default">默认值</th> <th key="desc">备注</th> <th key="sub">其他信息</th> </tr> </thead> <tbody className="ant-table-tbody"> <tr key="0-0"> <td key="0"> <span style="padding-left: 0px" ><span style="color: #8c8a8a"></span> svr</span > </td> <td key="1"><span>string</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap"></span></td> <td key="5"></td> </tr> <tr key="0-1"> <td key="0"> <span style="padding-left: 0px" ><span style="color: #8c8a8a"></span> route</span > </td> <td key="1"><span>string</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap"></span></td> <td key="5"></td> </tr> <tr key="0-2"> <td key="0"> <span style="padding-left: 0px" ><span style="color: #8c8a8a"></span> cbId</span > </td> <td key="1"><span>number</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap"></span></td> <td key="5"></td> </tr> <tr key="0-3"> <td key="0"> <span style="padding-left: 0px" ><span style="color: #8c8a8a"></span> args</span > </td> <td key="1"><span>object</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap"></span></td> <td key="5"></td> </tr> <tr key="0-3-0"> <td key="0"> <span style="padding-left: 20px" ><span style="color: #8c8a8a">├-</span> 1</span > </td> <td key="1"><span>object</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap"></span></td> <td key="5"></td> </tr> <tr key="0-3-0-0"> <td key="0"> <span style="padding-left: 40px" ><span style="color: #8c8a8a">├─</span> id</span > </td> <td key="1"><span>number</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap"></span></td> <td key="5"></td> </tr> <tr key="0-3-0-1"> <td key="0"> <span style="padding-left: 40px" ><span style="color: #8c8a8a">├─</span> name</span > </td> <td key="1"><span>string</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap">房间标题</span></td> <td key="5"></td> </tr> <tr key="0-3-0-2"> <td key="0"> <span style="padding-left: 40px" ><span style="color: #8c8a8a">├─</span> gametype_name</span > </td> <td key="1"><span>string</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap">游戏代号</span></td> <td key="5"></td> </tr> <tr key="0-3-0-3"> <td key="0"> <span style="padding-left: 40px" ><span style="color: #8c8a8a">├─</span> from_wallet</span > </td> <td key="1"><span>string</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap">钱包 from</span></td> <td key="5"></td> </tr> <tr key="0-3-0-4"> <td key="0"> <span style="padding-left: 40px" ><span style="color: #8c8a8a">├─</span> to_wallet</span > </td> <td key="1"><span>string</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap">钱包 to</span></td> <td key="5"></td> </tr> <tr key="0-3-0-5"> <td key="0"> <span style="padding-left: 40px" ><span style="color: #8c8a8a">├─</span> bet_level</span > </td> <td key="1"><span>number []</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap">筹码 下注阵列</span></td> <td key="5"> <p key="3"> <span style="font-weight: '700'">item 类型: </span><span>number</span> </p> </td> </tr> <tr key="array-1"> <td key="0"> <span style="padding-left: 60px" ><span style="color: #8c8a8a">├─</span> </span> </td> <td key="1"><span></span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"> <span style="white-space: pre-wrap">筹码 比值 1: 10000</span> </td> <td key="5"></td> </tr> <tr key="0-3-0-6"> <td key="0"> <span style="padding-left: 40px" ><span style="color: #8c8a8a">├─</span> player_bet_upper_limit</span > </td> <td key="1"><span>number []</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"> <span style="white-space: pre-wrap">个人上限 比值 1: 10000</span> </td> <td key="5"> <p key="3"> <span style="font-weight: '700'">item 类型: </span><span>number</span> </p> </td> </tr> <tr key="array-2"> <td key="0"> <span style="padding-left: 60px" ><span style="color: #8c8a8a">├─</span> </span> </td> <td key="1"><span></span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"> <span style="white-space: pre-wrap" >[庄1,庄2,庄3,闲1,闲2,闲3] 比值 1: 10000</span > </td> <td key="5"></td> </tr> <tr key="0-3-0-7"> <td key="0"> <span style="padding-left: 40px" ><span style="color: #8c8a8a">├─</span> player_bet_lower_limit</span > </td> <td key="1"><span>number []</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"> <span style="white-space: pre-wrap">个人下限 比值 1: 10000</span> </td> <td key="5"> <p key="3"> <span style="font-weight: '700'">item 类型: </span><span>number</span> </p> </td> </tr> <tr key="array-3"> <td key="0"> <span style="padding-left: 60px" ><span style="color: #8c8a8a">├─</span> </span> </td> <td key="1"><span></span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"> <span style="white-space: pre-wrap" >[庄1,庄2,庄3,闲1,闲2,闲3] 比值 1: 10000</span > </td> <td key="5"></td> </tr> <tr key="0-3-0-8"> <td key="0"> <span style="padding-left: 40px" ><span style="color: #8c8a8a">├─</span> area_bet_upper_limit</span > </td> <td key="1"><span>number []</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"> <span style="white-space: pre-wrap">单区上限 比值 1: 10000</span> </td> <td key="5"> <p key="3"> <span style="font-weight: '700'">item 类型: </span><span>number</span> </p> </td> </tr> <tr key="array-4"> <td key="0"> <span style="padding-left: 60px" ><span style="color: #8c8a8a">├─</span> </span> </td> <td key="1"><span></span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"> <span style="white-space: pre-wrap" >[庄1,庄2,庄3,闲1,闲2,闲3] 比值 1: 10000</span > </td> <td key="5"></td> </tr> <tr key="0-4"> <td key="0"> <span style="padding-left: 0px" ><span style="color: #8c8a8a"></span> err</span > </td> <td key="1"><span>string</span></td> <td key="2">必须</td> <td key="3"></td> <td key="4"><span style="white-space: pre-wrap">错误提示</span></td> <td key="5"></td> </tr> </tbody> </table> { "svr": "", "route": "", "cbId": 3, "args": { "1": { "id": 1, "name": "乳牛场", "gametype_name": "牛牛", "from_wallet": "TCTfPcF1wTRDK1qFAb7w2zGjF11WE9v8DA", "to_wallet": "TRCJhQw5u4F3wZ1PkY199p3jm2XN4WjKYR", "bet_level": [ 100000, 300000, 500000, 1000000, 3000000, 5000000 ], "player_bet_upper_limit": [ 1000000000, 1000000000, 1000000000, 1000000000, 1000000000, 1000000000 ], "player_bet_lower_limit": [ 100000, 100000, 100000, 100000, 100000, 100000 ], "area_bet_upper_limit": [ 100000000000, 100000000000, 100000000000, 100000000000, 100000000000, 100000000000 ] } }, "err": "" } ### JoinGame 请求参数: { "svr": "niuniu", "route": "niuniu.joinGame", "args": { "room_id":1 }, "cbId": 3 } 返回数据: { "svr": "", "route": "", "cbId": 3, "args": { "info": { "id": 1, "name": "B101", "gametype_name": "超级牛牛", "from_wallet": "TCTfPcF1wTRDK1qFAb7w2zGjF11WE9v8DA", "to_wallet": "TRCJhQw5u4F3wZ1PkY199p3jm2XN4WjKYR", "bet_level": [ 100000, 200000, 300000, 400000, 500000, 600000 ], "player_bet_upper_limit": [ 900000, 900000, 900000, 900000, 900000, 900000 ], "player_bet_lower_limit": [ 100000, 100000, 100000, 100000, 100000, 100000 ], "area_bet_upper_limit": [ 100000000000, 100000000000, 100000000000, 100000000000, 100000000000, 100000000000 ] }, "self": { "id": 2989999, "nickname": "A06" }, "cards": [], // 發牌區的牌 "player_count": 1, "history": { // 歷史資料 "history": [ { "banker_style": 5, "player_style": [ 6, 7, 6 ], "player_win": [ 1, 1, 1 ] }, { "banker_style": 7, "player_style": [ 8, 2, 7 ], "player_win": [ 1, -1, -1 ] }, . . . { "banker_style": 0, "player_style": [ 0, 6, 0 ], "player_win": [ 1, 1, 1 ] } ], "count_win": [ 17, 19, 14 ] } }, "err": "" } ### Leave 请求参数: { "svr": "niuniu", "route": "niuniu.leave", "args": {}, "cbId": 3 } 返回数据: { "svr": "", "route": "", "cbId": 3, "args": "成功啦", "err": "" } ### Bet 请求参数: { "svr": "niuniu", "route": "niuniu.bet", "args": { "bets":[100000,0,0,0,0,0], // 庄1,庄2,庄3,闲1,闲2,闲3 "room_id":1 }, "cbId": 3 } 返回数据: { "svr": "", "route": "", "cbId": 3, "args": { "room_chips": [ 100000, 0, 0, 0, 0, 0 ], "room_remain_chips": [ 99999900000, 100000000000, 100000000000, 100000000000, 100000000000, 100000000000 ], "my_bets": [ 100000, 0, 0, 0, 0, 0 ], "before_balance": 1012327480000, "after_balance": 1012326380000 }, "err": "" } ## server -> client ### RestStage 推送时间: 休息阶段开始 route:"niuniu.restStage" { "svr": "", "route": "niuniu.restStage", "cbId": 0, "args": { "cd": 5, "cd_max": 5, "msg": "等待開局", "round_uuid": "BNN-B101-220718172402-0000-0005" }, "err": "" } ### RestStageMid 推送时间: 中途加入休息阶段 route:"niuniu.restStageMid" { "svr": "", "route": "niuniu.restStageMid", "cbId": 0, "args": { "cd": 2, "cd_max": 5, "msg": "等待開局" }, "err": "" } ### BetStage 推送时间: 下注阶段开始 route:"niuniu.restStage" { "svr": "", "route": "niuniu.betStage", "cbId": 0, "args": { "cd": 10, "cd_max": 25, "msg": "開始下注" }, "err": "" } ### BetStageMid 推送时间: 中途加入下注阶段 route:"niuniu.restStageMid" { { "svr": "", "route": "niuniu.betStageMid", "cbId": 0, "args": { "cd": 23, "cd_max": 25, "msg": "開放下注" }, "err": "" } ### ShuffleStage 推送时间: 下注阶段结束后, 洗牌阶段会送 route: "niuniu.shuffleStage" { "svr": "", "route": "niuniu.shuffleStage", "cbId": 0, "args": { "cd": 10, "cd_max": 10, "msg": "洗牌完成", "cards": [ { "code": 50, "color": 4, "point": 12, "value": 10 }, { "code": 30, "color": 3, "point": 5, "value": 5 }, . . . 省略 . . { "code": 40, "color": 4, "point": 2, "value": 2 }, { "code": 15, "color": 2, "point": 3, "value": 3 } ] }, "err": "" } ### ShuffleStageMid route: "niuniu.shuffleStageMid" 推送时间: 中途加入洗牌阶段 { "svr": "", "route": "niuniu.shuffleStageMid", "cbId": 0, "args": { "cd_max": 10, "cd": 0, "msg": "洗牌完成" }, "err": "" } ### HashStage 推送时间: 開始取得哈希 route:"niuniu.restStage" { "svr": "", "route": "niuniu.hashStage", "cbId": 0, "args": { "cd": 30, "cd_max": 30, "msg": "等待哈希值" }, "err": "" } ### HashStageMid 推送时间: 中途加入取哈希阶段 route:"niuniu.restStageMid" { "svr": "", "route": "niuniu.hashStageMid", "cbId": 0, "args": { "cd": 6, "cd_max": 30, "msg": "等待哈希值" }, "err": "" } ### SettleStage 推送时间: 結算 { "svr": "", "route": "niuniu.settleStage", "cbId": 0, "args": { "cd": 10, "cd_max": 10, "msg": "結算階段", "block_hash": "00000000018e932c643beab956e25030354ebc186b03e9ec80d00641be597bd2", "block_number": 26121004, "block_tx_id": "02d411599431e8d44419f9add49aa6c00cbd8ca68e0334e3f9b46e59bb9c63e2", "index": 30, "banker_cards": { "cards": [ { "code": 51, "color": 4, "point": 13, "value": 10 }, { "code": 4, "color": 1, "point": 5, "value": 5 }, { "code": 19, "color": 2, "point": 7, "value": 7 }, { "code": 33, "color": 3, "point": 8, "value": 8 }, { "code": 3, "color": 1, "point": 4, "value": 4 } ], "style": 4, "style_name": "牛4" }, "player_cards": [ { "cards": [ { "code": 28, "color": 3, "point": 3, "value": 3 }, { "code": 26, "color": 3, "point": 1, "value": 1 }, { "code": 9, "color": 1, "point": 10, "value": 10 }, { "code": 18, "color": 2, "point": 6, "value": 6 }, { "code": 42, "color": 4, "point": 4, "value": 4 } ], "style": 4, "style_name": "牛4" }, { "cards": [ { "code": 25, "color": 2, "point": 13, "value": 10 }, { "code": 22, "color": 2, "point": 10, "value": 10 }, { "code": 17, "color": 2, "point": 5, "value": 5 }, { "code": 8, "color": 1, "point": 9, "value": 9 }, { "code": 45, "color": 4, "point": 7, "value": 7 } ], "style": 0, "style_name": "無牛" }, { "cards": [ { "code": 16, "color": 2, "point": 4, "value": 4 }, { "code": 21, "color": 2, "point": 9, "value": 9 }, { "code": 1, "color": 1, "point": 2, "value": 2 }, { "code": 37, "color": 3, "point": 12, "value": 10 }, { "code": 40, "color": 4, "point": 2, "value": 2 } ], "style": 0, "style_name": "無牛" } ], "win_area": [ // 庄1,庄2,庄3,闲1,闲2,闲3 1, 1, 1, -1, -1, -1 ] }, "err": "" } ### SettleStageMid 推送时间: 中途加入結算階段 { "svr": "", "route": "niuniu.settleStageMid", "cbId": 0, "args": { "cd": 9, "cd_max": 10, "msg": "结算完成", "block_hash": "00000000018e932c643beab956e25030354ebc186b03e9ec80d00641be597bd2", "block_number": 26121004, "block_tx_id": "02d411599431e8d44419f9add49aa6c00cbd8ca68e0334e3f9b46e59bb9c63e2", "index": 38, "banker_cards": { "cards": [ { "code": 0, "color": 1, "point": 1, "value": 1 }, { "code": 19, "color": 2, "point": 7, "value": 7 }, { "code": 10, "color": 1, "point": 11, "value": 10 }, { "code": 5, "color": 1, "point": 6, "value": 6 }, { "code": 9, "color": 1, "point": 10, "value": 10 } ], "style": 0, "style_name": "無牛" }, "player_cards": [ { "cards": [ { "code": 1, "color": 1, "point": 2, "value": 2 }, { "code": 21, "color": 2, "point": 9, "value": 9 }, { "code": 41, "color": 4, "point": 3, "value": 3 }, { "code": 30, "color": 3, "point": 5, "value": 5 }, { "code": 28, "color": 3, "point": 3, "value": 3 } ], "style": 2, "style_name": "牛2" }, { "cards": [ { "code": 2, "color": 1, "point": 3, "value": 3 }, { "code": 16, "color": 2, "point": 4, "value": 4 }, { "code": 37, "color": 3, "point": 12, "value": 10 }, { "code": 17, "color": 2, "point": 5, "value": 5 }, { "code": 12, "color": 1, "point": 13, "value": 10 } ], "style": 0, "style_name": "無牛" }, { "cards": [ { "code": 18, "color": 2, "point": 6, "value": 6 }, { "code": 31, "color": 3, "point": 6, "value": 6 }, { "code": 25, "color": 2, "point": 13, "value": 10 }, { "code": 36, "color": 3, "point": 11, "value": 10 }, { "code": 49, "color": 4, "point": 11, "value": 10 } ], "style": 2, "style_name": "牛2" } ], "win_area": [ -1, -1, -1, 1, 1, 1 ], "count_win": [ 50, 50, 50 ] }, "err": "" } ### RoomPlayerCounter 推送时间: 每n秒同步給房內玩家 route: "niuniu.roomPlayerCounter" { "svr": "", "route": "niuniu.roomPlayerCounter", "cbId": 0, "args": 1, // 人數 "err": "" } ### ChangeStage 推送时间: 加入观察者后, 每局切换都以这个做路子 route: "niuniu.changeStage" { "svr": "", "route": "niuniu.changeStage", "cbId": 0, "args": { "id": 1, "stage": 1, "stage_name": "下注階段", "cd": 24, "cd_max": 25, "history": { "history": [ { "banker_style": 10, "player_style": [ 0, 7, 0 ], "player_win": [ -1, -1, -1 ] } ], "count_win": [ 0, 0, 0 ] }, "player_count": 0 }, "err": "" } ### RoomPlayerBet { "svr": "", "route": "niuniu.roomPlayerBet", "cbId": 0, "args": { "room_chips": [ // 庄1,庄2,庄3,闲1,闲2,闲3 0, 0, 0, 0, 0, 100000 ], "player_id": 4637343, // 內部id "nickname": "A10", // 玩家暱稱 "bets": [ 0, 0, 0, 0, 0, 100000 ], "room_remain_chips": [ 100000000000, 100000000000, 100000000000, 100000000000, 100000000000, 99999900000 ] }, "err": "" } ### SettleReport { "svr": "", "route": "niuniu.settleReport", "cbId": 0, "args": { "id": "TEST-BNN-1656575639", "round_mix": "", "game_type": 15, "game_code": "BNN", "game_name": "超级牛牛", "room_id": 1, "round": 0, "sub_round": 0, "player_id": 2989999, "dealer_id": 0, "total_bet": 900000, "you_xiao_tou_zhu": 0, "you_xiao_ying_fen": 0, "total_winlose": -900000, "bets": [ // 庄1,庄2,庄3,闲1,闲2,闲3 900000, 0, 0, 0, 0, 0 ], "prepay": 9000000, "bet_result": "", "winloses": [ -900000, 0, 0, 0, 0, 0 ], "win_result": [ -1, -1, -1, 1, 1, 1 ], "date": "", "created_at": "2022-06-30T15:53:59.279798083+08:00", "type": 1, "status": 1 }, "err": "" }