# 天九 ## 定義表 ### cardstyle 牌型對照 | 牌型|代號 |-|- |烏龍|0 |地九|1 |天九|2 |地槓|3 |天槓|4 |天王|5 |雜5|6 |雜7|7 |雜8|8 |雜9|9 |雙零霖|10 |雙高腳|11 |雙紅頭|12 |雙斧頭|13 |雙板凳|14 |雙長三|15 |雙梅|16 |雙鵝|17 |雙人|18 |雙地|19 |雙天|20 |至尊|21 ## client -> server 为cli端请求srv端的cmd, 透过 cbId 做消息配对, 响应后c端先判断 err 字段是否为空作例外处理. ### RoomStatus 请求参数: { "svr": "tiengow", // <string> 游戏名 "route": "tiengow.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> ``` }, "22": { "id": 22, "name": "T122", "gametype_name": "哈希天九", "from_wallet": "TCTfPcF1wTRDK1qFAb7w2zGjF11WE9v8DA", "to_wallet": "TRCJhQw5u4F3wZ1PkY199p3jm2XN4WjKYR", "bet_level": [ 100000000, 500000000, 1000000000, 2000000000, 5000000000, 10000000000 ], "player_bet_upper_limit": [ 10000000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000 ], "player_bet_lower_limit": [ 100000000, 100000000, 100000000, 100000000, 100000000, 100000000 ], "area_bet_upper_limit": [ 1000000000000, 1000000000000, 1000000000000, 1000000000000, 1000000000000, 1000000000000 ], "tmp_bet_balance_limit": 100000000000 } }, "err": null } ``` ### JoinGame 请求参数: ``` { "svr": "tiengow", "route": "tiengow.joinGame", "args": { "room_id":22 }, "cbId": 3 } ``` 返回数据: ``` { "svr": "", "route": "", "cbId": 3, "args": { "info": { "id": 22, "name": "T122", "gametype_name": "哈希天九", "from_wallet": "TCTfPcF1wTRDK1qFAb7w2zGjF11WE9v8DA", "to_wallet": "TRCJhQw5u4F3wZ1PkY199p3jm2XN4WjKYR", "bet_level": [ 100000000, 500000000, 1000000000, 2000000000, 5000000000, 10000000000 ], "player_bet_upper_limit": [ 10000000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000 ], "player_bet_lower_limit": [ 100000000, 100000000, 100000000, 100000000, 100000000, 100000000 ], "area_bet_upper_limit": [ 1000000000000, 1000000000000, 1000000000000, 1000000000000, 1000000000000, 1000000000000 ], "tmp_bet_balance_limit": 100000000000 }, "self": { "id": 9896316, "nickname": "666666" }, "cards": [], "player_count": 1, "history": { "history": [ { "banker_style": 0, "player_style": [ 3, 0, 0 ], "banker_win": [ -1, 1, 1 ], "player_win": [ 1, -1, -1 ], "banker_point": [ 4 ], "Player1_point": [ 0 ], "Player2_point": [ 3 ], "Player3_point": [ 2 ] }, { "banker_style": 0, "player_style": [ 0, 0, 0 ], "banker_win": [ -1, -1, 1 ], "player_win": [ 1, 1, -1 ], "banker_point": [ 3 ], "Player1_point": [ 8 ], "Player2_point": [ 4 ], "Player3_point": [ 2 ] }, } ], "count_win": [ 8, 14, 10 ], "good_road": 1, "good_road_name": "連莊通殺" }, "room_chips": [ 0, 0, 0, 0, 0, 0 ], "bets": [ 0, 0, 0, 0, 0, 0 ], "room_remain_chips": [ 1000000000000, 1000000000000, 1000000000000, 1000000000000, 1000000000000, 1000000000000 ], "round_uuid": "BTGT1222210270009" }, "err": null } ``` ### Leave 请求参数: { "svr": "tiengow", "route": "tiengow.leave", "args": {}, "cbId": 3 } 返回数据: { "svr": "", "route": "", "cbId": 3, "args": "成功啦", "err": "" } ### Bet 请求参数: { "svr": "tiengow", "route": "tiengow.bet", "args": { "bets":[100000,0,0,0,0,0], // 庄1,庄2,庄3,初1,川2,尾3 "room_id":1 }, "cbId": 21 } 返回数据: ``` { "svr": "", "route": "", "cbId": 3, "args": { "room_id": 21, "room_chips": [ 100000000, 0, 0, 0, 0, 0 ], "room_remain_chips": [ 499900000000, 500000000000, 500000000000, 500100000000, 500000000000, 500000000000 ], "my_bets": [ 100000000, 0, 0, 0, 0, 0 ], "before_balance": 118692500000, "after_balance": 118592500000 }, "err": null } ``` ## server -> client ### RestStage 推送时间: 休息阶段开始 route:"tiengow.restStage" { "svr": "", "route": "tiengow.restStage", "cbId": 0, "args": { "cd": 5, "cd_max": 5, "msg": "等待開局", "round_uuid": "BNN-B101-220718172402-0000-0005" }, "err": "" } ### RestStageMid 推送时间: 中途加入休息阶段 route:"tiengow.restStageMid" { "svr": "", "route": "tiengow.restStageMid", "cbId": 0, "args": { "cd": 2, "cd_max": 5, "msg": "等待開局" }, "err": "" } ### BetStage 推送时间: 下注阶段开始 route:"tiengow.restStage" { "svr": "", "route": "tiengow.betStage", "cbId": 0, "args": { "cd": 10, "cd_max": 25, "msg": "開始下注" }, "err": "" } ### BetStageMid 推送时间: 中途加入下注阶段 route:"tiengow.restStageMid" { { "svr": "", "route": "tiengow.betStageMid", "cbId": 0, "args": { "cd": 23, "cd_max": 25, "msg": "開放下注" }, "err": "" } ### ShuffleStage 推送时间: 下注阶段结束后, 洗牌阶段会送 route: "tiengow.shuffleStage" ``` { "svr": "", "route": "tiengow.shuffleStage", "cbId": 0, "args": { "cd": 4, "cd_max": 4, "msg": "洗牌完成", "cards": [ { "level": 15, "code": 26, "point": 7, "value": 2 }, { "level": 6, "code": 12, "point": 4, "value": 4 }, { "level": 14, "code": 25, "point": 8, "value": 2 }, { "level": 20, "code": 31, "point": 3, "value": 1 }, { "level": 9, "code": 19, "point": 7, "value": 3 }, { "level": 17, "code": 28, "point": 5, "value": 2 }, { "level": 4, "code": 9, "point": 10, "value": 4 }, { "level": 0, "code": 0, "point": 12, "value": 8 }, { "level": 13, "code": 24, "point": 8, "value": 2 }, { "level": 8, "code": 16, "point": 10, "value": 3 }, { "level": 6, "code": 13, "point": 4, "value": 4 }, { "level": 10, "code": 21, "point": 6, "value": 3 }, { "level": 18, "code": 29, "point": 5, "value": 2 }, { "level": 3, "code": 6, "point": 4, "value": 5 }, { "level": 2, "code": 4, "point": 8, "value": 6 }, { "level": 0, "code": 1, "point": 12, "value": 8 }, { "level": 10, "code": 20, "point": 6, "value": 3 }, { "level": 5, "code": 10, "point": 6, "value": 4 }, { "level": 8, "code": 17, "point": 10, "value": 3 }, { "level": 19, "code": 30, "point": 6, "value": 1 }, { "level": 11, "code": 22, "point": 9, "value": 2 }, { "level": 1, "code": 2, "point": 2, "value": 7 }, { "level": 4, "code": 8, "point": 10, "value": 4 }, { "level": 9, "code": 18, "point": 7, "value": 3 }, { "level": 7, "code": 15, "point": 11, "value": 3 }, { "level": 3, "code": 7, "point": 4, "value": 5 }, { "level": 7, "code": 14, "point": 11, "value": 3 }, { "level": 1, "code": 3, "point": 2, "value": 7 }, { "level": 16, "code": 27, "point": 7, "value": 2 }, { "level": 2, "code": 5, "point": 8, "value": 6 }, { "level": 12, "code": 23, "point": 9, "value": 2 }, { "level": 5, "code": 11, "point": 6, "value": 4 } ] }, "err": null } ``` ### ShuffleStageMid route: "tiengow.shuffleStageMid" 推送时间: 中途加入洗牌阶段 { "svr": "", "route": "tiengow.shuffleStageMid", "cbId": 0, "args": { "cd_max": 10, "cd": 0, "msg": "洗牌完成" }, "err": "" } ### HashStage 推送时间: 開始取得哈希 route:"tiengow.restStage" { "svr": "", "route": "tiengow.hashStage", "cbId": 0, "args": { "cd": 30, "cd_max": 30, "msg": "等待哈希值" }, "err": "" } ### HashStageMid 推送时间: 中途加入取哈希阶段 route:"tiengow.restStageMid" { "svr": "", "route": "tiengow.hashStageMid", "cbId": 0, "args": { "cd": 6, "cd_max": 30, "msg": "等待哈希值" }, "err": "" } ### SettleStage 推送时间: 結算 ``` { "svr": "", "route": "tiengow.settleStage", "cbId": 0, "args": { "cd": 1, "cd_max": 40, "msg": "结算完成", "block_hash": "0000000001b4d33e76620ce828d6040582d56bc163fbae495725bf8f222f44ca", "block_number": 28627774, "block_tx_id": "d91d69bb0fa74ba5773b19864e19bd96d0788c461a1f1d6af63fdef55283e5b0", "index": 24, "banker_cards": { "cards": [ { "level": 6, "code": 13, "point": 4, "value": 4 }, { "level": 13, "code": 24, "point": 8, "value": 2 } ], "style": 0, "style_name": "烏龍" }, "player_cards": [ { "cards": [ { "level": 3, "code": 6, "point": 4, "value": 5 }, { "level": 8, "code": 17, "point": 10, "value": 3 } ], "style": 0, "style_name": "烏龍" }, { "cards": [ { "level": 0, "code": 1, "point": 12, "value": 8 }, { "level": 4, "code": 9, "point": 10, "value": 4 } ], "style": 0, "style_name": "烏龍" }, { "cards": [ { "level": 3, "code": 7, "point": 4, "value": 5 }, { "level": 10, "code": 20, "point": 6, "value": 3 } ], "style": 0, "style_name": "烏龍" } ], "banker_Point": 2, "player1_Point": 4, "player2_Point": 2, "player3_Point": 0, "win_area": [ -1, -1, 1, 1, 1, -1 ], "count_win": [ 10, 16, 10 ] }, "err": null } ``` ### SettleStageMid 推送时间: 中途加入結算階段 ``` { "svr": "", "route": "tiengow.settleStageMid", "cbId": 0, "args": { "cd": 1, "cd_max": 40, "msg": "结算完成", "block_hash": "0000000001b4d33e76620ce828d6040582d56bc163fbae495725bf8f222f44ca", "block_number": 28627774, "block_tx_id": "d91d69bb0fa74ba5773b19864e19bd96d0788c461a1f1d6af63fdef55283e5b0", "index": 24, "banker_cards": { "cards": [ { "level": 6, "code": 13, "point": 4, "value": 4 }, { "level": 13, "code": 24, "point": 8, "value": 2 } ], "style": 0, "style_name": "烏龍" }, "player_cards": [ { "cards": [ { "level": 3, "code": 6, "point": 4, "value": 5 }, { "level": 8, "code": 17, "point": 10, "value": 3 } ], "style": 0, "style_name": "烏龍" }, { "cards": [ { "level": 0, "code": 1, "point": 12, "value": 8 }, { "level": 4, "code": 9, "point": 10, "value": 4 } ], "style": 0, "style_name": "烏龍" }, { "cards": [ { "level": 3, "code": 7, "point": 4, "value": 5 }, { "level": 10, "code": 20, "point": 6, "value": 3 } ], "style": 0, "style_name": "烏龍" } ], "banker_Point": 2, "player1_Point": 4, "player2_Point": 2, "player3_Point": 0, "win_area": [ -1, -1, 1, 1, 1, -1 ], "count_win": [ 10, 16, 10 ] }, "err": null } ``` ### RoomPlayerCounter 推送时间: 每n秒同步給房內玩家 route: "niuniu.roomPlayerCounter" { "svr": "", "route": "niuniu.roomPlayerCounter", "cbId": 0, "args": 1, // 人數 "err": "" } ### ChangeStage 推送时间: 加入观察者后, 每局切换都以这个做路子 route: "tiengow.changeStage" { "svr": "", "route": "tiengow.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": "tiengow.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": "tiengow.settleReport", "cbId": 0, "args": { "id": "BTGT1212210270008-09896316", "round_uuid": "BTGT1212210270008", "game_type": 22, "game_code": "BTG", "game_name": "哈希天九", "room_id": 21, "round": 8, "sub_round": 0, "player_id": 9896316, "dealer_id": 0, "total_bet": 100000000, "you_xiao_tou_zhu": 0, "you_xiao_ying_fen": 0, "total_winlose": 0, "bets": [ 100000000, 0, 0, 0, 0, 0 ], "total_real_bet": 0, "prepay": 0, "winloses": [ 0, 0, 0, 0, 0, 0 ], "date": "", "created_at": "2022-10-27T16:58:16.72735684+08:00", "type": 1, "status": 1, "currency": "TWD" }, "err": null } ```