# 天九
## 定義表
### 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
}
```