海南麻将接口
<h1>海南麻将协议</h1>
<p>[TOC]</p>
<h2>协议基本说明</h2>
<pre><code>按Unix换行符(\r\n)分隔socket流,每条协议都为json格式
json数据的固定格式为:{cmd:345, msg:{...}}
msg可以没有</code></pre>
<h2>平台ID</h2>
<p>固定为<strong>1</strong></p>
<hr />
<h2>麻将牌的定义</h2>
<pre><code class="language-python">
DONG_FENG = 42
XI_FENG = 44
NAN_FENG = 46
BEI_FENG = 48
HONG_ZHONG = 51
FA = 53
BAI = 55
CHUN = 62
XIA = 64
QIU = 66
DONG = 68
MEI = 72
LAN = 74
ZHU = 76
JU = 78
FENG_PAI = (DONG_FENG, XI_FENG, NAN_FENG, BEI_FENG)
JIAN_PAI = (HONG_ZHONG, FA, BAI)
HUA_PAI = (CHUN, XIA, QIU, DONG, MEI, LAN, ZHU, JU)
ALL_PAPER_CARDS = (
11, 12, 13, 14, 15, 16, 17, 18, 19, # 万字: 1~9
21, 22, 23, 24, 25, 26, 27, 28, 29, # 线条: 1~9
31, 32, 33, 34, 35, 36, 37, 38, 39, # 筒子:1~9
DONG_FENG, XI_FENG, NAN_FENG, BEI_FENG, # 东西南北
HONG_ZHONG, FA, BAI, # 中发白
CHUN, XIA, QIU, DONG, MEI, LAN, ZHU, JU
)
</code></pre>
<h3>游戏中的常量定义</h3>
<p>ACTION_TYPE_CHU = 1
ACTION_TYPE_CHI = 2
ACTION_TYPE_PENG = 3
ACTION_TYPE_GONG_GANG = 4
ACTION_TYPE_AN_GANG = 5
ACTION_TYPE_MING_GANG = 6
ACTION_TYPE_BU = 7
ACTION_TYPE_GUO = 8
ACTION_TYPE_HU = 9
ACTION_TYPE_ZI_MO = 10
ACTION_TYPE_ZHUA_NIAO = 11
ACTION_TYPE_QIANG_GANG_HU = 12</p>
<p>T_IDLE = 0 # 空闲中
T_READY = 1 # 准备中
T_PLAYING = 2 # 游戏中
T_CHECK_OUT = 3 # 结算中</p>
<p>T_IN_IDLE = 0 # 无状态
T_IN_CHU_PAI = 1 # 在出牌中
T_IN_PUBLIC_OPRATE = 2 # 公共操作过程中
T_IN_MO_PAI = 3 # 在摸牌中暗(未公示)
T_IN_MO_PAI_CALL = 4 # 在摸牌后的呼叫中
T_IN_MING_GANG_PAI_CALL = 5 # 抢杠胡判断流程
T_IN_GONG_GANG_PAI_CALL = 6 # 抢杠胡判断流程
T_IN_AN_GANG_PAI_CALL = 7 # 抢杠胡判断流程
T_IN_GANG_PAI_CALL = 8 # 杠牌操作流程
T_IN_OTHER_GANG_PAI_CALL = 9 # 杠牌后自己不可操作别人的操作流程
T_IN_WILL_BEGIN_OPTION = 10 # 开局前的玩家操作选项
T_IN_TIAN_HU = 12 # 庄家天胡
T_IN_TIAN_HU_AN_GANG_MO_PAI = 13 # 天胡暗杠摸牌
T_IN_DI_HU_CHU_PAI = 13 # 庄家天胡结束出牌 地胡判断阶段</p>
<p>PASS_SECONDS = 1 # 过场时间
TIAN_HU_SECONDS = 10 # 天胡时间
CALL_SECONDS = 10 # 等待玩家响应的秒数
ATTACK_SECONDS = 10 # 出牌等待时间
FIRST_CALL_SECONDS = 10 # 第一位玩家的等待时间
CHECKOUT_SECONDS = 10
OPEARATE_SECONDS = 120
HEART_BEAT_SECONDS = 10 # 玩家端的心跳超时时间</p>
<h3>通讯中的错误码</h3>
<pre><code class="language-python"># 服务端错误码列表
OK = 0 # 请求正常
DATA_BROKEN = -1 # 客户端请求数据错误,不符合即定格式
TOKEN_ERROR = -2 # TOKEN错误
SYSTEM_ERROR = -3 # 系统错误
DUPLICATE_LOGIN = -4 # 客户端收到通知,账号已在别处登陆
SEAT_FULL = -5 # 坐位已满
TABLE_NOT_EXIST = -6 # 桌子不存在
USER_NOT_EXIST = -7 # 玩家数据不存在
RULE_ERROR = -8 # 出牌不符合规则
NOT_YOUR_TURN = -9 # 当前循问的玩家不是你
CARD_NOT_EXIST = -10 # 所出牌不存在
IN_OTHER_ROOM = -11 # 玩家当前已在其它房间中
TABLE_FULL = -12 # 桌子已满
NOT_YOUR_ROOM = -13 # 不是你的桌子无法解散
COMMAND_DENNY = -14 # 命令不允许被执行</code></pre>
<h2>协议列表--非游戏过程</h2>
<h3>心跳协议</h3>
<p>命令号: <strong>101</strong>
心跳时间约定为<strong>5</strong>秒</p>
<pre><code class="language-js">// 请求
{
timestamp : 123232323.33 //发起消息的心跳时间
}
// 应答
{
timestamp : 123232323.33 //转发客户端消息的心跳时间,客户端凭此时间的对比值来确定网络质量
}</code></pre>
<hr />
<h3>停服命令</h3>
<p>命令号: <strong>103</strong>
必须是指定IP地址的WEB发送消息过来</p>
<pre><code class="language-js">// 请求
{
key : fdafdsafdsa, // 简单密钥
isForce: true | false, // 是否强制, 必须先发送非强制,并等待一段时间后才可以强制结束
}
// 应答
{
server_id: 123, // 服务器ID
in_stop: true | false, // 停机状态
}</code></pre>
<hr />
<h3>网关认证</h3>
<p>命令号:<strong>201</strong></p>
<pre><code class="language-js">// 请求
{
uid : 22, // 玩家ID
key : abcabc, // 认证key 登录返回的token
platformID : 1, // 游戏平台ID 不是子游戏类型
}
// 应答
{
code : 0 //0正确 1校验失败
DATA_BROKEN = -1 # 客户端请求数据错误,不符合即定格式
TOKEN_ERROR = -2 # token错误
}</code></pre>
<hr />
<h3>换服通知</h3>
<p>命令号:<strong>105</strong></p>
<pre><code class="language-js">// 服务器广播消息,不需要请求
{
host: 11.1.1.1, // 新的服务器地址
port: 8889, // 新的服务器端口
}</code></pre>
<h3>请求进入房间</h3>
<p>命令号:<strong>202</strong></p>
<pre><code class="language-js">// 请求
{
roomID : 222333,
x: 333.212, // 经度
y: 12.323, // 纬度
data : xxx //客户端自定义的转发型数据
},
// 响应
// 如果进房间成功,后面接着下发房间内的玩家信息,以及房间配置信息
{
code : 0, // 错误码请上面的 《服务端错误码列表》
如果code为0,则有以下属性
roomID : 111111
},
TABLE_NOT_EXIST = -6 # 桌子不存在
NOT_CLUB_MEMBER = -27 # 不是俱乐部成员
FORBIDDEN = -29 # 禁止加入
NOT_OWNER_FRIEND = -58 # 非房主好友</code></pre>
<h3>801下发进入房间</h3>
<p>命令号:<strong>801</strong></p>
<pre><code class="language-js">// 请求
{
},
// 如果进房间成功,后面接着下发房间内的玩家信息,以及房间配置信息
{
code : 0, // 错误码请上面的 《服务端错误码列表》
如果code为0,则有以下属性
roomID : 111111
gameType: 8
},</code></pre>
<hr />
<h3>842同步房间信息</h3>
<p>命令号:<strong>842</strong></p>
<pre><code class="language-js">// 请求
{
},
// 如果进房间成功,后面接着下发房间内的玩家信息,以及房间配置信息
{
code : 0, // 错误码请上面的 《服务端错误码列表》
如果code为0,则有以下属性
},</code></pre>
<hr />
<h3>请求退出房间 退出房间 以及其他玩家退出也用这个</h3>
<p>命令号:<strong>802</strong></p>
<pre><code class="language-js">// 请求
{
}
// 返回,如果成功则此消息为广播消息
{
uid: 0, // 玩家ID
code : 1, // 0普通离开 1房间解散 2被踢 3全部游戏结束导致解散房间
kickTime : 30 // code为2时用到
}</code></pre>
<hr />
<h3>下发玩家进入房间</h3>
<p>命令号:<strong>804</strong></p>
<pre><code class="language-js">{
uid : 22,
data : xxx, // 客户端自定义的属性
score : -3, // 积分
IP : '222.222.222.222', // 登录IP
seatID : 2, // 坐位ID
isPrepare : 1, // 1已准备 0未准备
status: 1, // 0空闲中,1等待中,2游戏中
shouPai : [31,32,33,21], // 手牌,只有自己有此属性
offline: true|false, // 玩家离线标志
shangGa:-1|0~5 , //玩家是否上嘎 -1 标识本局没上嘎 0~5为上嘎分
shangGaScore:1,//上嘎分,每局不清,下次上嘎不能小于本值
countCard:5,//剩余手牌数量
tuoGuan:1,//托管状态
chengPai: [{cards: [13, 14, 15], actType: 2}, {cards: [13, 14, 15], actType: 2}], // 桌牌列表 [[牌型, 牌1, 牌2, 牌3,], ] 如果有暗杠 仅自己可见暗杠牌
outCards: [], // 自己的出牌记录
buHuaCards:[]//补花牌
louHuCards : [11,12], //漏胡的列表
isLockCard : 1, //是否为锁定手牌状态
handCards:[] //手牌仅自己可见
operates:[] //可进行操作仅自己可见
lock_cards:[]//锁定出牌 用于天听情况下 只能出锁定牌
louHu:0 //是否漏胡尽自己可见
},</code></pre>
<h3>下发房间信息</h3>
<p>客户端据此获取房间配置、以及游戏当前进展的信息。参数定义参见PHP跟游戏服的接口[createRoom]
命令号:<strong>803</strong></p>
<pre><code class="language-js">//回应
{
config : {
gameType : 8, //游戏类型ID
totalRound : 8, //设置局数
ruleType: 1, // 子规则类型,如果大类型需要细分小类型通过此字段标识
huType : 2, //胡牌类型
zhuangXian : 0, //庄闲 0是不选择 1是选择
isSevenPairs : 1, //可胡七对
isHongZhong : 0, //是否开启癞子
limitScore: 20, // 分封顶
maxPlayer : 0, // 最大玩家数
ruleDetails: {}, // 附加规则
isFan:0, // 有无番
tuoGuan:0, //托管
lianKai:0, //连开
lianZhuang:0, //连庄
shangGa:0, //上嘎
liuJuSuanFen:0, //流局算分
huaHu:0, //花胡
fangGouJiao:0, //防勾脚
wuZiPai:0, //无字牌
haiDiBaoPai:0, //海底包牌
jiaoLing:0, //叫令
},
creator : 22, //创建者
status: 0, // 房间状态 0 空闲中 1 准备中 2 游戏中 3 结算中, 只有游戏中才有以下数据
inFlow:1, // 所处游戏流程标记,参考最下面的游戏流程通知消息查看具体表述
roundIndex : 1, // 正在进行的局数索引
leftCount: 10, // 牌墙剩余牌张,在游戏中有此数据
dealer : 2, //庄家
shang_ga_list:[1,2,3,4,5] ,//可上嘎列表
curr_feng_ling:1, // 桌子当前风令 打到什么风令了 固定显示
feng_ling:1,//首局确定的风令 庄家为东风令 客户端根据此项确定玩家对应风位置
remainSeconds: 30, // 当前玩家所剩余的时间秒数
lastSeatID : 2, //上一个操作的座位。公共操作时用到。开局时为空
lastAct : 1, // 总共包括 ACTION_TYPE
lastCard : 21,
turn: 1, // 轮到某人
};</code></pre>
<p>{
'winInfo': [],
'seats': [{
'buHuaCards': [],
'seatID': 1,
'handCards': [25],
'totalScore': 0,
'scoreFrom': {
'score': 0
},
'score': 0,
'tableCards': [
[2, 17, 18, 19, 4],
[2, 39, 37, 38, 4],
[3, 11, 11, 11, 3],
[3, 14, 14, 14, 4]
]
}, {
'buHuaCards': [],
'seatID': 2,
'handCards': [19, 38, 18, 39, 37, 17, 33],
'totalScore': 0,
'scoreFrom': {
'score': 0
},
'score': 0,
'tableCards': [
[3, 13, 13, 13, 4],
[2, 23, 22, 21, 1]
]
}, {
'buHuaCards': [],
'seatID': 3,
'handCards': [15, 15, 15, 39],
'totalScore': 0,
'scoreFrom': {
'score': 0
},
'score': 0,
'tableCards': [
[2, 24, 25, 23, 2],
[2, 27, 28, 29, 2],
[2, 37, 36, 35, 2]
]
}, {
'buHuaCards': [],
'seatID': 4,
'handCards': [12, 34, 11, 16, 16, 34, 13],
'totalScore': 0,
'scoreFrom': {
'score': 0
},
'score': 0,
'tableCards': [
[2, 26, 27, 28, 3],
[2, 31, 32, 33, 3]
]
}],
'finishType': 0,
'hasNextRound': True,
'rate': 1,
'isHuangZhuang': 1,
'leftCards': [33, 36, 25, 12, 17, 15, 35, 16, 27, 16, 23, 19, 34, 21, 36],
'seq': 0
}</p>
<hr />
<h3>下发玩家离开房间</h3>
<p>命令号:<strong>805</strong></p>
<pre><code class="language-js">{
seatID: 1 // 座位号
},</code></pre>
<hr />
<h3>解散房间[房主专用]</h3>
<p>命令号:<strong>805</strong>
房主专用,且一旦房间游戏已经开始,则不可解散</p>
<pre><code class="language-js">// 请求
{
},
// 响应,此回应为广播消息
{
code : 0 // 0成功 1失败
reason: 0 // 解散原因
},</code></pre>
<hr />
<h3>申请解散房间</h3>
<p>命令号:<strong>810</strong></p>
<pre><code class="language-js">// 请求 关于解散房间的消息
{
agree : true | false, // 同意或不同意解散
},
// 响应[广播消息] 每次有人同意或拒绝都会广播
{
configTime : 300, // 固定配置,单位秒
remainTime : 290, // 剩余时间
yesSeatIDs : [3,1], // 第一个是申请人
noSeatIDs : [2],
result : true | false, // 为空是尚无结论 true 解散 false 继续
},</code></pre>
<hr />
<h3>准备</h3>
<p>命令号:<strong>811</strong>
(坐下时系统会自动准备。一局结束后,玩家要手动准备)</p>
<pre><code class="language-js">// 请求
{
},
// 响应[广播]
{
seatID : 2,
isPrepare: true | false, // 是否已经准备,当未开局时收到未准备的消息,则要检查同IP问题
code : 0 // 0 成功 其它:失败
},</code></pre>
<hr />
<h3>玩家连接状态改变[掉线或重进]</h3>
<p>命令号:<strong>824</strong></p>
<pre><code class="language-js">// 响应[广播]
{
uid : 22,
seatID : 2,
IP : 8.8.8.8,
offline: true | false, // 离线标志
},</code></pre>
<hr />
<h3>设置麻将牌[debug模式下专用]</h3>
<p>命令号:<strong>829</strong></p>
<pre><code class="language-js">// 请求,注意请求设置的牌必须是合法值,且不得是5个小一这种错误的数据,
// 每一个玩家的牌都可以单独设置,但不得超过20张,剩余牌也不能超过20张
// 如果只想设其中某一个玩家的牌,可以单独指定项数据并把其它数据留空
{
cards: [
[102, 103, 104], // 坐位ID1的手牌
[102, 103, 104], // 坐位ID2的手牌
[102, 103, 104], // 坐位ID3的手牌
[102, 103, 104], // 坐位ID4的手牌
[102, 103, 104], // 剩余牌
],
dealer: 1, // 庄家位置
}
// 响应
{
code: 0, // 返回状态码
},</code></pre>
<hr />
<hr />
<h3>客户端请求房间内广播 用于聊天信息</h3>
<p>命令号:<strong>825</strong></p>
<pre><code class="language-js">// 请求
{
data : xxx
}
// 响应,此返回为广播消息
{
uid : 22,
data: xxx
}</code></pre>
<hr />
<h3>831通知开局位置信息</h3>
<p>命令号:<strong>831</strong></p>
<pre><code class="language-js">// 收到此消息可进行如下操作,[退出房间、解散房间(房主)、开始游戏(即准备)]
{
distances: [
[10888, 28282, 88484],// 玩家1与2,3,4的距离
[10888, 28282],// 玩家2与3,4的距离
[10888],// 玩家3与4的距离
],
}</code></pre>
<h3>832请求定位信息</h3>
<p>命令号:<strong>832</strong></p>
<pre><code class="language-js">//请求
{}
//响应
{
distances: [
[10888, 28282, 88484],// 玩家1与2,3,4的距离
[10888, 28282],// 玩家2与3,4的距离
[10888],// 玩家3与4的距离
],
}</code></pre>
<h2>协议列表--游戏过程</h2>
<h3>806房间游戏开始</h3>
<p>命令号:<strong>806</strong></p>
<pre><code class="language-js">// 广播
{
"tid": 111 , 房间号
"club_id": 111, 俱乐部ID 为0 标识没有
"rule_type": 小规则ID 暂默认为1
code: 0, // 0 成功 其它 失败
}</code></pre>
<hr />
<h3>807房间游戏结束</h3>
<p>命令号:<strong>807</strong></p>
<pre><code class="language-js">{
gid : 1, //牌组ID
seats : [
{
"seatID": 1
"totalScore": 1
"zhuangCount": 1
"winCount": 1
"dianPaoCount": 1
"ziMoCount": 1
"chiHuCount": 1
"mingGangCount": 1
"anGangCount": 1
"fangGangCount": 1
"mingTangCount": 1
"roundMaxScore": 1
"mingTangList": []
},
{},
{},
{}
]
},
``
***
### 一局游戏开始
命令号:**808**
```js
{
seq: 1, // 牌局序号,比如1表示这组牌局中的第1局
dealerSeatID: 2, // 庄家坐位ID
},</code></pre>
<hr />
<h3>一局游戏结束</h3>
<p>命令号:<strong>809</strong></p>
<pre><code class="language-js">{
rate: 1, 倍率 暂时默认为1
winInfo: {
"rate": 1,
"huCards": [],
"lastSeat": 1
"huPath": []
"birdList": []
"fanList": [],
"huCardIndex": 1,
"winner":1,
"handCardIndex": len(winner.zhuo_pai) + 1,
},
winner: [] 麻将可能出现多个赢家,但是海南只会有一个,
seq : 8, //牌组子序号,比如8表示这组牌局中的第8局
hasNextRound: true | false, // 是否还有下一局,如果是解散房间就直接结束的
finishType: 0|1, // 结束类型,0正常结束 1房间解散结束
isHuangZhuang: 0|1, // 流局
birdList: [21, 22, 23, 24], //鸟牌 无用
leftCards: [102, 102, ...], // 剩余的牌
seats : [
{
seatID : 1,
handCards : [1], //按摸牌时间顺序,后摸的牌在右边
tableCards:[], //碰杠的牌
huType : 0|1, //0自摸1接炮,胡牌者才有此属性
dianPaoCount : 1, //点炮总数,一炮多响时大于1,点炮者才有此属性
score : 0, //得分
totalScore : 0 //总分
shangGaScore:1
scoreFrom: []
}
},
{},
{},
{}
],
},
示例:
{
'''玩家座位列表'''
'seats': [{
'seatID': 1,
'tableCards': [
[3, 11, 11, 11, 3],
[3, 44, 44, 44, 4]
],
'scoreFrom': {
'score_ming_xi': {
0: 1,
33: -2,
2: 3,
29: 1,
34: 3,
31: 18
},
'score': 24,
'fan_xing': [6]
},
'handCards': [17, 33, 16, 34, 35, 18, 51],
'buHuaCards': [74],
'score': 24,
'totalScore': 24
}, {
'seatID': 2,
'tableCards': [
[5, 12, 12, 12, 12, 2]
],
'scoreFrom': {
'score_ming_xi': {
33: 6,
2: -1,
34: -1,
31: -6
},
'score': -2
},
'handCards': [28, 25, 39, 42, 42, 27, 27, 55, 39, 53],
'buHuaCards': [64, 76],
'score': -2,
'totalScore': -2
}, {
'seatID': 3,
'tableCards': [
[3, 13, 13, 13, 4],
[2, 35, 34, 33, 2]
],
'scoreFrom': {
'score_ming_xi': {
0: -1,
33: -2,
2: -1,
31: -6,
34: -1,
29: -1
},
'score': -12
},
'handCards': [38, 28, 29, 31, 39, 33, 27],
'buHuaCards': [78],
'score': -12,
'totalScore': -12
}, {
'seatID': 4, 座位ID
'tableCards': [桌牌列表 第一位是类型 最后一位是fromseatid
[2, 36, 37, 38, 3],
[2, 35, 36, 37, 3]
],
'scoreFrom': {分数来源
'score_ming_xi': {分数明细
33: -2,
2: -1,
34: -1,
31: -6
},
'score': -10
},
'handCards': [31, 51, 55, 42, 42, 55, 32],手牌
'buHuaCards': [72, 68],补花的牌
'score': -10,
'totalScore': -10 总分
}],
'hasNextRound': True, 是否有下局
'finishType': 0, '''0是正常结束, 1是解散结束'''
'winInfo': [{
'fanList': [], 番型列表
'lastSeat': 3, 最后座位
'winner': 1, 赢家座位ID
'huPath': [ 胡牌路径
[16, 17, 18],
[33, 34, 35],
[51, 51]
],
'handCardIndex': 3, '''桌牌组数+1 这里如果用不上可无视'''
'rate': 1,
'huCardIndex': 1, '''固定为1 不需要可无视'''
'bao_pai_seat_id': 0, '''包赔 为0则没有'''
'huCards': [51], 胡的牌
'bao_pai_reason': 0,包赔原因
'birdList': [] 鸟列表此处不会用到
}],
'rate': 1,
'winner': [1],
'isHuangZhuang': 0,
'seq': 0,
'leftCards': [14, 14, 53, 32, 23, 29, 53, 15, 19, 48, 26, 14, 22, 38, 11, 29, 46, 36, 46, 36, 66, 19, 26, 26, 28, 34, 16, 24, 62, 37, 17, 21, 22, 32, 23, 24, 18, 24, 19, 37, 35, 25, 44, 25, 48, 17, 25, 46, 18, 24, 16, 22, 22, 21, 15, 28, 18, 23, 15, 38, 46];//桌面上剩下的牌
}</code></pre>
<hr />
<h3>830 PLAYER_SHANG_GA_BEGIN 玩家上嘎流程开始</h3>
<p>命令号:<strong>830</strong></p>
<pre><code class="language-js">// 无请求 服务器下发
{
}
// 响应,此返回为广播消息
{
"can_shang_list": [1,2,3,4,5]
}</code></pre>
<h3>833玩家上嘎</h3>
<p>命令号: PLAYER_SHANG_GA<strong>833</strong></p>
<pre><code class="language-js">// 无请求 服务器下发
{
"shangGa":1
}
// 响应,此返回为广播消息
{
"shangGa":1
}</code></pre>
<hr />
<h3>818发牌</h3>
<p>命令号: <strong>818</strong></p>
<pre><code class="language-js">{
seatID : 3,
dealerSeatID:1
remainCards:55 剩余张数 牌墙
handCards : [21,...],手牌 发的牌
};</code></pre>
<hr />
<h3>812 下发 轮到玩家出牌</h3>
<p>命令号: <strong>812</strong></p>
<pre><code class="language-js">{
seatID : 3,
canTianTing:True|False //是否可选天听,是的话显示天听,不能天听的话没有此字段
lockCards: [31,32] //锁定出牌列表,天听情况下出现,不是天听没有此字段,可能有多张,及单张情况
remainTime : 99 // 倒计时剩余秒
cmdSeatID:1
},</code></pre>
<hr />
<h3>836 下发 公共操作开始</h3>
<p>命令号: <strong>836</strong></p>
<pre><code class="language-js">{
card: 33, // 公共牌
seatID: 3, // 出牌者
seconds: 33, // 等待时间
operates: [2,3,5], // 可做的操作列表
cards:33 //当前出的牌
leftCount:33 //牌墙剩余
}</code></pre>
<hr />
<h3>846 下发 天胡流程操作开始</h3>
<p>命令号: <strong>846</strong></p>
<pre><code class="language-js">{
seconds: 33, // 等待时间
operates: [2,3,5], // 可做的操作列表
leftCount:33 //牌墙剩余
}</code></pre>
<hr />
<h3>813出牌</h3>
<p>命令号: <strong>813</strong></p>
<pre><code class="language-js">{ // 请求
cards : [22]
}
{ // 响应
code : 0 //0成功 1失败
"seatID": ,5
"cards": ,5
"seconds": f,5
"leftCount":,55
"tuoGuan": ,1
}</code></pre>
<hr />
<h3>820摸牌</h3>
<p>命令号: <strong>820</strong></p>
<pre><code class="language-js">{ // 响应
seatID:1
leftCount: 55
seconds: 20, // 剩余多少秒
card: 22, // 摸到的牌 自己看的到
operates: [2,3], // 自己能做的操作列表自己看的到
}</code></pre>
<hr />
<h3>822 碰牌</h3>
<p>命令号:<strong>822</strong></p>
<pre><code class="language-js">// 请求
{}
// 推送消息
{
seatID: 1, // 坐位ID
isFinish: 0|1, // 是否是动作确认完成,0:已记录,1:动作成功
}</code></pre>
<hr />
<h3>817杠牌</h3>
<p>明杠|暗杠怎么表达?
命令号:<strong>817</strong></p>
<pre><code class="language-js">// 请求
{
gangType: 4|5|6, // 放杠|暗杠|明杠
card: 33, // 所杠的牌
}
// 推送消息
{
seatID: 1, // 坐位ID
act: 4|5|6, // 放杠|暗杠|明杠
fromSeatID: 1
card: 33, // 所杠的牌
isFinish: 0|1, // 是否是动作确认完成,0:已记录,1:动作成功
}</code></pre>
<hr />
<h3>821吃牌</h3>
<p>命令号:<strong>821</strong></p>
<pre><code class="language-js">// 请求
{
chiPai: [21, 22], // 吃口
}
// 响应[广播]
{
seatID: 1, // 坐位ID
chiPai: ... // 同请求
isFinish: 0|1, // 是否是动作确认完成,0:已记录,1:动作成功
}</code></pre>
<hr />
<h3>814过牌</h3>
<p>命令号:<strong>814</strong></p>
<pre><code class="language-js">// 请求
{
},
// 响应
{
seatID: 2, // 坐位ID
}</code></pre>
<hr />
<h3>826胡牌</h3>
<p>命令号:<strong>826</strong></p>
<pre><code class="language-js">// 请求 如果有多种胡法另行设计
{}
// 响应[广播]
{
huInfo{
seatID: 1, // 坐位ID
isFinish: 0|1, // 是否是动作确认完成,0:已记录,1:动作成功
}
}</code></pre>
<hr />
<h3>834天听 上下都是一个命令</h3>
<p>命令号:<strong>834</strong></p>
<pre><code class="language-js">// 请求 玩家选择是否天听
{
isTianTing: 0|1, // 是否天听,-1: 放弃天听,1:确定天听 ps:跟此处有关的说明,tianting状态为0时则尚未选择,这里只传-1 跟1
}
{}
// 响应[广播不带锁定牌, 单独给天听用户发锁定出牌,如果是放弃天听,只有天听玩家接收消息,不广播]
{
tianTing: -1||1, // 是否天听,-1: 放弃天听,1:确定天听
seatID: 1~4 // 天听玩家座位ID
lockCards:[31,32,33],// 锁定出牌列表,标识只能出锁定牌 此项只有天听用户,切选择了天听之后收得到
}</code></pre>
<h3>850补花</h3>
<p>命令号:<strong>850</strong></p>
<pre><code class="language-js">// 下行 无需请求
{
}
{}
// 响应[]
{
bu_hua_cards: [31,32], // 补花后的牌 仅补花玩家能接收
bei_bu_hua_cards:[72,74] //被补花的牌
seatID: 1~4 // 补花玩家座位ID
handCards:[31,32,33],// 补花后手牌, 仅补花玩家能接收 看需要,不需要可移除此字段
leftCount: 33, //补花后牌堆剩余张数
}</code></pre>
<h3>839玩家风令改变</h3>
<p>命令号:PLAYER_FENG_LING_CHANGE<strong>839</strong></p>
<pre><code class="language-js">// 下行 无需请求
{
}
{}
// 响应[]
{
seatID,//玩家座位ID
feng_ling, // 当前游戏风令 取值 1.2.3.4 分别对应东南西北风 风牌牌值为42,44, 46, 48 取末位/2 与风令对应
}</code></pre>
<h3>840风令改变</h3>
<p>命令号:FENG_LING_CHANGE<strong>40</strong></p>
<pre><code class="language-js">// 下行 无需请求
{
}
{}
// 响应[]
{
curr_feng_ling:1, // 桌子当前风令 打到什么风令了 固定显示
feng_ling:1,//首局确定的风令 庄家为东风令 客户端根据此项确定玩家对应风位置
}</code></pre>
<p>2020/1/8 新增</p>
<h3>501赠送钻石接口</h3>
<p>命令号:GIVE_DIAMOND<strong>501</strong></p>
<pre><code class="language-js">
// 下行
{
acceptUid: 赠送对象UID
give_diamond_count:赠送钻石数量
}
{
可能出现错误码:
DATA_BROKEN = -1 # 客户端请求数据错误,不符合即定格式
DIAMOND_NOT_ENOUGHT = -29 # 钻石数量不够(已开房有锁定钻石计算在内)
}
// 响应[]
{
“left_diamond":1 剩余钻石数量
}
### 502接收赠送钻石接口
命令号:RECEIVE_DIAMOND**207**
```js
// 下行
{
msgid: 消息ID
}
{
可能出现错误码:
DATA_BROKEN = -1 # 客户端请求数据错误,不符合即定格式 参数不对,或查询不到该记录 或记录对应操作人不对等
DIAMOND_NOT_ENOUGHT = -29 # 钻石数量不够(已开房有锁定钻石计算在内)
SYSTEM_ERROR = 3 # 系统错误,校验成功,但是操作失败返回此项
MSG_STATUS_DIAMOND_RECEIVE = 2 # 已领取
MSG_STATUS_DIAMOND_BACK = 3 #已退回
}
// 响应[]
{
“left_diamond":1 剩余钻石数量
}
### 503领回赠送钻石接口
命令号:BACK_DIAMOND**503**
```js
// 下行
{
msgid: 消息ID
}
{
可能出现错误码:
DATA_BROKEN = -1 # 客户端请求数据错误,不符合即定格式 参数不对,或查询不到该记录 或记录对应操作人不对等
SYSTEM_ERROR = 3 # 系统错误,校验成功,但是操作失败返回此项
MSG_STATUS_DIAMOND_RECEIVE = 2 # 已领取
MSG_STATUS_DIAMOND_BACK = 3 #已退回
}
// 响应[]
{
“left_diamond":1 剩余钻石数量
}
### 504 添加好友接口
命令号:ADD_FRIEND**504**
```js
// 下行
{
addUid: 消息ID
}
{
可能出现错误码:
DATA_BROKEN = -1 # 客户端请求数据错误,不符合即定格式 参数不对,或查询不到该记录 或记录对应操作人不对等
SYSTEM_ERROR = 3 # 系统错误,校验成功,但是操作失败返回此项
MSG_STATUS_DIAMOND_RECEIVE = 2 # 已领取
MSG_STATUS_DIAMOND_BACK = 3 #已退回
}
// 响应[]
{
“left_diamond":1 剩余钻石数量
}
### 2370 添加好友接口
命令号:CLUB_RECHARGE_JI_JIN**2370**
```js
// 下行
{
clubID:亲友圈ID,
diamond: 1,房卡数量
}
{
可能出现错误码:
DATA_BROKEN = -1 # 客户端请求数据错误,不符合即定格式 参数不对,或查询不到该记录 或记录对应操作人不对等(此接口参数没有的时候返回)
SYSTEM_ERROR = 3 # 系统错误,校验成功,但是操作失败返回此项(此接口的时候,如果减玩家房卡,或者增加亲友圈基金失败的时候会返回)
DIAMOND_NOT_ENOUGHT = -29 房卡不够
}
// 响应[]
{
“left_diamond":1 剩余钻石数量
}</code></pre>