麻将协议图

玩家发AskOut

graph LR; 玩家AskOut -- IsForce=true -->强制出牌; 玩家AskOut -- IsForce=false -->非强制出牌; 强制出牌 -- action=0 -->出一张牌; 强制出牌 -- action=2 -->暗补杠[暗杠
补杠]; 强制出牌 -- action=3 -->主动胡[天胡
自模
杠上花
]; 强制出牌 -- action=5 -->取消杠/胡; 非强制出牌 -- action=1 -->碰; 非强制出牌 -- action=2 -->直杠; 非强制出牌 -- action=3 -->被动胡[地胡
点炮胡
抢杠胡
]; 非强制出牌 -- action=4 -->过[玩家不出];

系统派牌的出牌HINTOUT

graph LR; 出牌[系统派牌的
出牌HINTOUT] -->|IsForce|必出[必须为true,客户端提示玩家必须
从出牌/杠/胡中选择一个操作,
可以取消杠/胡]; 出牌-->|CanHu|可胡[若CanHu的值为true
则填写下一步内容]; 可胡-->HuPai[HuPai:胡的牌
HuMask:胡牌类型
HuTypeNum:胡牌番型]; 出牌-->|CanGang|可杠[若CanGang的值为true
则填写下一步内容]; 可杠-->杠牌表[GangList手牌中所有
可杠牌的列表]; 出牌-->|CanPeng|碰[必须为false]; 碰-->碰牌[Pengpai:无效]; 出牌-->|HasAddPai|派牌[必须为true]; 派牌-->派的牌[AddPai:必须为
有效的系统派牌]; 出牌-->|CursorSeatId|指向[牌桌风向标:必须为活动
玩家的座位号,这里为
被派牌玩家座位号]; 出牌-->|QiangNum|墙牌[必须填,用于桌面上展示
派牌后牌墙剩余的牌数量]; 出牌-->|SeatId|座位号[必填,用于回放使用
这里为被派牌玩家座位号]; 出牌-->|CanOut|是否最后一张牌[最后一张派牌流局时
可以为false否则
派牌后必须为true];

碰牌后的出牌HINTOUT

graph LR; 出牌[碰牌后的
出牌HINTOUT] -->|IsForce|必出[必须为true,客户端提
示玩家必须从出牌/杠中
选择一个操作,可以取消杠]; 出牌-->|CanGang|杠[CanGang的值为true
则填写下一步内容]; 杠-->杠list[GangList杠牌列表,
所有可以杠的牌]; 出牌-->|CanOut|CanOut[必须为true,
碰完后一定可以出牌]; 出牌-->|CursorSeatId|CursorSeatId[必填,牌桌风向标:指向活动玩家
这里为当前出牌玩家座位号]; 出牌-->|QiangNum|QiangNum[必填,用于桌面上展示剩余的牌]; 出牌-->|SeatId|SeatId[必填,回放使用,这里为
当前出牌玩家的座位号]; 出牌-->|CanPeng|碰[必须为false]; 碰-->碰牌[Pengpai:无效]; 出牌-->|CanHu|胡[必须为false]; 胡-->HuPai[HuPai:无效
HuMask:无效
HuTypeNum:无效]; 出牌-->|HasAddPai|派牌[必须为false]; 派牌-->AddPai[AddPai:无效];

碰/杠/(点炮)胡HINTOUT

graph LR; 胡HINTOUT[碰/杠/胡HINTOUT]-->|IsForce|必出[必须为false,其他玩
家出牌后才会出现碰杠胡]; 胡HINTOUT-->|CanPeng|碰[若CanPeng的值为true
则填写下一步内容]; 碰-->碰牌[Pengpai:可碰的牌
即出牌玩家出的牌]; 胡HINTOUT-->|CanGang|杠[若CanGang的值为true
则填写下一步内容]; 杠-->杠list[GangList:可以杠的牌]; 胡HINTOUT -->|CanHu|胡[CanHu的值为true
则填写下一步内容]; 胡-->胡牌[HuPai:胡的牌
HuMask:胡类型
HuTypeNum:胡牌番型]; 胡HINTOUT --> |QiangNum|QiangNum[必填,用于桌面上展示
剩余的牌数量]; 胡HINTOUT --> |CursorSeatId| CursorSeatId[必填,牌桌风向标:指向活动玩家
这里为出牌玩家座位号]; 胡HINTOUT-->|HasAddPai|派牌[必须为false]; 派牌-->AddPai[AddPai:无效]; 胡HINTOUT --> |SeatId|SeatId[必填,回放使用,当前可以
碰/杠/胡的玩家的座位号]; 胡HINTOUT-->|CanOut|出牌[必须为false];

等待WAITOUT

graph LR; 等待[等待WAITOUT] --> |CursorSeatId|出牌玩家[必填,风向标指向出牌的玩家]; 等待-->|HasAddPai|派牌[是否是有系统派牌,
有则填写下一步内容]; 派牌-->派牌玩家[AddPaiSeatId:
被派牌玩家的座位号]; 等待-->|QiangNum|牌墙[必填,用于桌面展示剩余牌的数量]; 等待-->|IsKeep|IsKeep[玩家做出一个操作后,
还需要等待其他玩家操作,
则IsKeep=true];

发牌/同步当前桌子手牌信息

graph LR; 发牌[发牌PBAssignPai]-->|PaiList|手牌[手牌不能为空,不包含已经杠/碰的牌,
若是开局后系统发牌则一定为13张]; 发牌-->|Hint|出牌[Hint不为空,则为当前玩家出牌,与Wait互斥]; 发牌-->|Wait|等待[Wait不为空,则等待庄家出牌,与Hint互斥]; 发牌-->|leftPaiNum|左边牌数[给每个玩家发完牌后,起摸点左边
剩余的牌,通过骰子获得]; 发牌-->|rightPaiNum|右边牌数[给每个玩家发完牌后,起摸点右边
剩余的牌,通过骰子获得]; 发牌-->|syncNumList|牌数量[必填,同步每个玩家的手牌数量,
展示其他玩家的牌数量]; 发牌-->|zhuangSeat|庄家[必填,庄家座位号,标识庄家];

小局结算

graph LR; 结算[小局结算
PBSmallSettlement]-->|ID|ID[当前游戏的房间号]; 结算-->|status|房间状态[结算时的房间状态,
小局结算时状态为小局结束]; 结算-->|now|当前局数[进行小局结算时的当前局数]; 结算-->|next|下局局数[下局局数,已结束则为0
客户端判断是否继续准备]; 结算-->|total|总局数[展示总局数]; 结算-->|name|玩法名称[当前游戏的名称]; 结算-->|doc|玩法描述[游戏玩法的具体描述]; 结算-->|time|时间[展示结束时的时间]; 结算-->|baseScore|房间底分[展示当前游戏的底分] 结算-->|overReason|结束原因[结束原因:解散/结束/局数打满/
玩家退出等,用于展示相应提示或动画] 结算-->|overDoc|结束说明[结束文字说明:玩家发起解散/
超过局数解散/玩家退出等] 结算-->|dataValid|数据是否有效[数据是否有效,结算前状
态不是游戏中,则数据无效] 结算-->|isFlow|是否流局 结算-->|prizeHorseList|奖马[奖马:摸到的奖马牌及是否是马] 结算-->|players|玩家情况[展示每个
玩家的数据]

结算的players玩家数据

graph LR; 玩家[players玩家数据]-->|userId|id[玩家ID,用于展示
玩家的信息] 玩家-->|NickName|NickName[玩家昵称,用于
展示玩家的信息] 玩家-->|WinScore|WinScore[展示本局输赢分数
赢为正数,输为负数] 玩家-->|IsBanker|IsBanker[标识是否是庄家] 玩家-->|IsPao|IsPao[标识是否是放炮] 玩家-->|IsHu|IsHu[如果这个玩家是胡牌玩家
则填写下一步内容] IsHu-->HuType[HuPai:胡的牌
HuType:展示胡牌类型
HuTypeNum:胡牌番型] WinScore-->HuScore[HuScore:总胡牌分数
GangScore:总的杠分数
PrizeHorseScore:
总奖/杀马分数] 玩家-->|HandPaiList|HandPaiList[玩家的手牌] 玩家-->|GangList|GangList[展示玩家所有杠的牌列表] 玩家-->|PengList|PengList[展示玩家所有碰的牌列表]