诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1458 lines
53 KiB

  1. #ifndef CMD_SPARROW_HEAD_FILE
  2. #define CMD_SPARROW_HEAD_FILE
  3. #include <strsafe.h>
  4. #pragma pack(1)
  5. //////////////////////////////////////////////////////////////////////////
  6. //公共宏定义
  7. #define KIND_ID 302 //游戏 I D
  8. //组件属性
  9. #define SAN_ZHANG 3 //换牌数--换三张
  10. #define GAME_PLAYER 4 //游戏人数
  11. #define GAME_PLAY 3 //
  12. #define VERSION_SERVER PROCESS_VERSION(6,0,3) //程序版本
  13. #define VERSION_CLIENT PROCESS_VERSION(6,0,3) //程序版本
  14. #define GAME_NAME TEXT("松滋晃晃") //游戏名字
  15. #define GAME_GENRE (GAME_GENRE_SCORE|GAME_GENRE_MATCH|GAME_GENRE_GOLD) //游戏类型
  16. //游戏状态
  17. #define GS_MJ_FREE GAME_STATUS_FREE //空闲状态
  18. #define GS_MJ_PLAY (GAME_STATUS_PLAY+1) //游戏状态
  19. //常量定义
  20. #define MAX_WEAVE 4 //最大组合
  21. #define MAX_INDEX 27 //最大索引 27
  22. #define MAX_COUNT 14 //最大数目
  23. #define MAX_JIYI 28 //最大记忆牌数据
  24. #define MAX_REPERTORY 108 //最大库存
  25. #define MAX_REPERTORY_SRLF 72 //三人两房最大库存
  26. #define MAX_WEAVE_HUA 8 //花牌最大组合
  27. #define MAX_INDEX_HUA 23 //花牌最大索引 23
  28. #define MAX_COUNT_HUA 26 //花牌最大数目
  29. #define MAX_REPERTORY_HUA 110 //花牌最大库存
  30. #define MAX_REPERTORY_HUA_ONE 111 //花牌最大库存
  31. #define MAX_REPERTORY_HUA_TWO 112 //花牌最大库存
  32. #define EXCHANGE 3 //默认换三张
  33. #define MAX_TING 10 //最大听牌数
  34. #define MAX_CHANGE_SCORE 20 //最大积分变动次数
  35. //扑克定义
  36. #define HEAP_FULL_COUNT 26 //堆立全牌
  37. #define MAX_RIGHT_COUNT 1 //最大权位DWORD个数
  38. #define TEMP_MAX_SCORE 1000 //最大临时积分
  39. #define GAME_TIMEOUT 10 //玩家出牌超时时间
  40. //////////////////////////////////////////////////////////////////////////
  41. //组合子项
  42. struct CMD_WeaveItem
  43. {
  44. INT cbWeaveKind; //组合类型
  45. BYTE cbCenterCard; //中心扑克
  46. BYTE cbPublicCard; //公开标志
  47. WORD wProvideUser; //供应用户
  48. BYTE cbMargicOffset[4]; //如果有财神参与组合,财神的位置 1-4 ,该位置存储实际是那张财神的index
  49. };
  50. struct CMD_WeaveItem_Hua
  51. {
  52. INT cbWeaveKind; //组合类型
  53. BYTE cbCenterCard; //中心扑克
  54. BYTE cbPublicCard; //公开标志
  55. WORD wProvideUser; //供应用户
  56. BYTE cbMargicOffset[4]; //组合花牌个数
  57. };
  58. //////////////////////////////////////////////////////////////////////////
  59. //服务器命令结构
  60. //#define SUB_S_SEND_LAIZIGANG 97 //癞子杠
  61. //#define SUB_S_SEND_LAIZIPI 98 //癞子皮
  62. //#define SUB_S_GAME_READING 99 //游戏准备
  63. //#define SUB_S_SEND_TINGPAI 99 //听牌数据
  64. #define SUB_S_GAME_START 100 //游戏开始
  65. #define SUB_S_OUT_CARD 101 //出牌命令
  66. #define SUB_S_SEND_CARD 102 //发送扑克
  67. #define SUB_S_TING_CARD 103 //听牌单独协议
  68. #define SUB_S_OPERATE_NOTIFY 104 //操作提示
  69. #define SUB_S_OPERATE_RESULT 105 //操作命令
  70. #define SUB_S_GAME_END 106 //游戏结束
  71. #define SUB_S_TRUSTEE 107 //用户托管
  72. #define SUB_S_CHI_HU 108 //胡牌
  73. #define SUB_S_XUELIU_END 109 //血流单局游戏结束协议
  74. #define SUB_S_GANG_SCORE 110 //
  75. #define SUB_S_DIGNQUE 120 //定缺
  76. #define SUB_S_HUAN_SAN_ZHANG 121 //换三张
  77. #define SUB_S_GAME_NOTIFY 122 //游戏事件通知(1定缺,2换三张)现在用来发送换牌标示
  78. #define SUB_S_PANGGUAN 200 //旁观者登陆游戏
  79. #define SUB_S_GAME_START_HUA 150 //游戏开始
  80. #define SUB_S_OUT_CARD_HUA 151 //出牌命令
  81. #define SUB_S_SEND_CARD_HUA 152 //发送扑克
  82. #define SUB_S_QINGTONG_NOTIFY_HUA 153 //请统操作提示
  83. #define SUB_S_OPERATE_NOTIFY_HUA 154 //操作提示
  84. #define SUB_S_OPERATE_RESULT_HUA 155 //花牌操作命令
  85. #define SUB_S_GAME_END_HUA 156 //花牌游戏结束
  86. #define SUB_S_TRUSTEE_HUA 157 //花牌用户托管
  87. #define SUB_S_CHI_HU_HUA 158 //花牌胡牌
  88. #define SUB_S_PANGGUAN_HUA 159 //花牌旁观者登陆游戏
  89. #define SUB_S_YI_WEI_HUA 160 //玩家移位广播
  90. #define LEN_PRIVATE_TABLE_ID 11
  91. #define LEN_NICKNAME 32
  92. #define LEN_HEAD_URL 256
  93. enum MahJongType
  94. {
  95. xzdd = 0, //一脚癞油
  96. xlch, //无赖到底
  97. srlf, //半癞
  98. cxz = 3, //戳瞎子一脚赖油
  99. cxz2 = 4, //戳瞎子无赖到底
  100. cxz3 = 5, //戳瞎子半癞
  101. xueliu = 10,//血流+4 6 12 番
  102. xueliu2 = 11,//血流+6 8 14 番
  103. xueliu3 = 12,//血流+6 8 14 番
  104. huapai = 14,//花牌+双杠
  105. huapai2 = 15,//花牌+单杠
  106. huapai3 = 16,//花牌+无杠
  107. count = 20, //总数
  108. };
  109. enum CMRule_zimo
  110. {
  111. zimojiadi = 0, //自摸加底
  112. zimojiafan, //自摸加番
  113. };
  114. enum CMRule_dgh
  115. {
  116. dgh_fp = 0, //点杠花当放炮
  117. dgh_zm, //点杠话当自摸
  118. };
  119. enum CMRule_other
  120. {
  121. yaojiujiangdui = 0x001, //带幺九、将对
  122. huansanzhang = 0x002, //换三张
  123. menqing = 0x004, //门清中张
  124. daxiaoyu = 0x008, //大小雨
  125. tiandihu = 0x010, //天地胡
  126. emax_other,
  127. };
  128. enum DDH_Rule
  129. {
  130. dianpao, //点炮胡
  131. zimo, //自摸胡
  132. };
  133. enum CMRule_MaxFan
  134. {
  135. max_two = 2,
  136. max_three = 3,
  137. max_four = 4,
  138. };
  139. enum MahJong_JuShu
  140. {
  141. ju_two = 2,
  142. ju_four = 4,
  143. ju_eight = 8,
  144. };
  145. struct tagChihuList
  146. {
  147. WORD chihuCount;
  148. DWORD chihuRightData[10]; //用户吃胡列表,最多显示10个;
  149. BYTE chihuCardData[10]; //用户吃胡牌的列表,最多显示10个;
  150. BYTE wProvideUser[10]; //用户吃胡牌的提供者列表,最多显示10个;
  151. };
  152. struct CMD_S_GameConfig
  153. {
  154. WORD wSubGameID; //一脚癞油,无赖到底,半癞 血流 花牌//翻型
  155. int wDiScore; //底分
  156. WORD wFanFei; //房费(0房间创建者,1打牌者平摊)
  157. WORD wIpLimit; //IP限制(0限制,1不限制);
  158. WORD wPlayCountRule; //一次玩的局数(8局?16局?)
  159. WORD RoomId; //房间ID
  160. WORD IsOwner; //是否房主
  161. WORD wHadPlayCount; //当前局数
  162. TCHAR sPrivateTableID[7];
  163. BYTE GameScoreType; //算分方式(0,传统得 1,算胡玩法)
  164. WORD tmp2; //备
  165. BYTE temp3;
  166. int temp4;
  167. bool ToString(TCHAR* pBuffer, int iLen)
  168. {
  169. if (sizeof(CMD_S_GameConfig) * 16 > iLen) return false;
  170. #ifdef _UNICODE
  171. _snwprintf(pBuffer, iLen, TEXT("游戏配置->游戏类型:%d,游戏低分:%d,房费扣出方式:%d,IP地址限制:%d,玩的局数:%d,是否为房主:%d,当前局数:%d,房间号码:%d")
  172. , wSubGameID, wDiScore, wFanFei, wIpLimit, wPlayCountRule, IsOwner, wHadPlayCount, sPrivateTableID);
  173. #else
  174. _snwprintf(pBuffer, iLen, TEXT("游戏配置->游戏类型:%d,游戏低分:%d,房费扣出方式:%d,IP地址限制:%d,玩的局数:%d,是否为房主:%d,当前局数:%d,房间号码:%d")
  175. , wSubGameID, wDiScore, wFanFei, wIpLimit, wPlayCountRule, IsOwner, wHadPlayCount, sPrivateTableID);
  176. #endif
  177. //mylog::ToSet(pBuffer, iLen);
  178. return true;
  179. }
  180. };
  181. //游戏状态
  182. struct CMD_S_StatusFree
  183. {
  184. CMD_S_GameConfig gameConfig; //游戏基本配置
  185. INT lUserTmpScore[GAME_PLAYER]; //临时积分。在私有桌子中不使用自身的积分或金币,使用临时积分。
  186. BYTE leftTime; //未开始设置 255
  187. WORD wchairId; //发起人座位号
  188. BYTE options[GAME_PLAYER]; // 0 未决定 1 tongy 2jj
  189. BYTE UserStat; //玩家当前状态
  190. };
  191. //旁观者断线重连
  192. struct CMD_S_PangGuan
  193. {
  194. CMD_S_GameConfig gameConfig;
  195. INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分
  196. //游戏变量
  197. BYTE GameStatus; //0等待开始,1游戏中
  198. BYTE cbTotalCardCount; //游戏总牌数
  199. BYTE cbLeftCardCount; //单局游戏剩余牌数
  200. WORD wBankerUser; //本局游戏庄家
  201. BYTE lSiZi[4]; //色子1,2,皮子,癞子
  202. DWORD dwOwnerID; //房主ID
  203. BYTE bWanLaiZi[GAME_PLAYER]; //每个打出玩家癞子数
  204. //当前状态
  205. WORD wCurrentUser; //当前用户
  206. BYTE bPutCardData[GAME_PLAYER]; //最后一张牌打出的人和牌值
  207. BYTE totalOptTime; //总操作时间10秒
  208. BYTE leftOptTime; //还剩多少时间0
  209. BYTE cbDiscardCount[GAME_PLAYER]; //丢弃数目
  210. BYTE cbDiscardCard[GAME_PLAYER][55]; //丢弃记录
  211. BYTE cbCardCount[GAME_PLAYER]; //每个玩家扑克数目
  212. //组合扑克
  213. BYTE cbWeaveCount[GAME_PLAYER]; //组合数目
  214. CMD_WeaveItem WeaveItemArray[GAME_PLAYER][MAX_WEAVE]; //组合扑克
  215. BYTE bOutCardCout; //可以打出的牌就听牌的个数 血流 改为是否为换牌状态(0,表示非换牌状态.1,表示换牌状态,但是你已经选好牌了.2,表示换牌状态,但是还没有选牌)
  216. BYTE bTingCardCount[GAME_PLAYER]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数 血流 最后一个牌是打出值胡牌值
  217. BYTE bTingCardData[GAME_PLAYER][MAX_INDEX]; //具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据 血流 每个玩家胡牌数据ChiHuCard[4][20]掩码,里面涵盖胡牌数据来源
  218. };
  219. //旁观者花牌断线重连
  220. struct CMD_S_PangGuan_Hua
  221. {
  222. CMD_S_GameConfig gameConfig;
  223. INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分
  224. //游戏变量
  225. BYTE GameStatus; //0等待开始,1游戏中
  226. BYTE cbTotalCardCount; //游戏总牌数
  227. BYTE cbLeftCardCount; //单局游戏剩余牌数
  228. WORD wBankerUser; //本局游戏庄家
  229. BYTE lSiZi[4]; //玩家统的个数
  230. //当前状态
  231. WORD wCurrentUser; //当前用户
  232. BYTE bPutCardData[GAME_PLAY]; //最后一张牌打出的人和牌值
  233. BYTE totalOptTime; //总操作时间10秒
  234. BYTE leftOptTime; //还剩多少时间0
  235. BYTE cbDiscardCount[GAME_PLAY]; //丢弃数目
  236. BYTE cbDiscardCard[GAME_PLAY][15]; //丢弃记录
  237. BYTE cbCardCount[GAME_PLAY]; //每个玩家扑克数目
  238. //组合扑克
  239. BYTE cbWeaveCount[GAME_PLAY]; //组合数目
  240. CMD_WeaveItem_Hua WeaveItemArray[GAME_PLAY][MAX_WEAVE_HUA]; //组合扑克
  241. BYTE GameScore[GAME_PLAY];
  242. };
  243. //游戏状态,断线重连
  244. struct CMD_S_StatusPlay
  245. {
  246. CMD_S_GameConfig gameConfig;
  247. INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分
  248. BYTE leftTime; // 255未开始
  249. WORD wchairId; // 解散申请人
  250. BYTE options[GAME_PLAYER]; // 在坐玩家 解散状态 0 未决定 1 tongy 2jj
  251. //游戏变量
  252. BYTE cbTotalCardCount; //游戏总牌数
  253. BYTE cbLeftCardCount; //单局游戏剩余牌数
  254. WORD wBankerUser; //本局游戏庄家
  255. BYTE lSiZi[4]; //色子1,2,皮子,癞子
  256. DWORD dwOwnerID; //房主ID
  257. BYTE bWanLaiZi[GAME_PLAYER]; //每个打出玩家癞子数/改称玩家胡牌次数
  258. //当前状态
  259. WORD wCurrentUser; //当前用户
  260. BYTE bPutCardData[GAME_PLAYER]; //最后一张牌打出的人和牌值
  261. BYTE totalOptTime; //总操作时间10秒
  262. BYTE leftOptTime; //还剩多少时间0
  263. BYTE cbDiscardCount[GAME_PLAYER]; //丢弃数目
  264. BYTE cbDiscardCard[GAME_PLAYER][55]; //丢弃记录
  265. BYTE cbCardCount[GAME_PLAYER]; //每个玩家扑克数目
  266. //组合扑克
  267. BYTE cbWeaveCount[GAME_PLAYER]; //组合数目
  268. CMD_WeaveItem WeaveItemArray[GAME_PLAYER][MAX_WEAVE]; //组合扑克
  269. BYTE cbCardData[MAX_COUNT]; //当前玩家手牌
  270. //断线玩家数据就是当前牌权玩家
  271. INT cbActionMask; //操作掩码
  272. BYTE gangCards[3]; //当有杠的时候这里面有牌
  273. BYTE bOutCardCout; //可以打出的牌就听牌的个数 血流 改为是否为换牌状态(0,表示非换牌状态.1,表示换牌状态,但是你已经选好牌了.2,表示换牌状态,但是还没有选牌)
  274. BYTE bOutCardData[MAX_COUNT]; //具体打哪几张牌 血流 (1.时,存的是换牌的牌,2,存的是我默认推送的牌)
  275. BYTE bTingCardCount[MAX_COUNT]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数 血流 最后一个牌是打出值胡牌值
  276. BYTE bTingCardData[MAX_COUNT][MAX_INDEX]; //具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据 血流 每个玩家胡牌数据ChiHuCard[4][20]掩码,里面涵盖胡牌数据来源
  277. bool ToString(TCHAR* pBuffer, int iLen)
  278. {
  279. if (sizeof(CMD_S_StatusPlay) * 16 > iLen) return false;
  280. #ifdef _UNICODE
  281. _snwprintf(pBuffer, iLen, TEXT("断线重连命令->重连用户:%d,最后的出牌:[%d][%d][%d][%d],玩家手牌数量:[%d][%d][%d][%d],玩家牌值:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d]")
  282. , wCurrentUser, bPutCardData[0], bPutCardData[1], bPutCardData[3], bPutCardData[3], cbCardCount[0], cbCardCount[1], cbCardCount[2], cbCardCount[3], cbCardData[0], cbCardData[1], cbCardData[2], cbCardData[3]
  283. , cbCardData[4], cbCardData[5], cbCardData[6], cbCardData[7] ,cbCardData[8], cbCardData[9], cbCardData[10], cbCardData[11],cbCardData[12], cbCardData[13]);
  284. #else
  285. _snwprintf(pBuffer, iLen, TEXT("断线重连命令->重连用户:%d,最后的出牌:[%d][%d][%d][%d],玩家手牌数量:[%d][%d][%d][%d],玩家牌值:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d]")
  286. , wCurrentUser, bPutCardData[0], bPutCardData[1], bPutCardData[3], bPutCardData[3], cbCardCount[0], cbCardCount[1], cbCardCount[2], cbCardCount[3], cbCardData[0], cbCardData[1], cbCardData[2], cbCardData[3]
  287. , cbCardData[4], cbCardData[5], cbCardData[6], cbCardData[7], cbCardData[8], cbCardData[9], cbCardData[10], cbCardData[11], cbCardData[12], cbCardData[13]);
  288. #endif
  289. return true;
  290. }
  291. };
  292. //游戏状态,断线重连
  293. struct CMD_S_StatusPlay_ZhuJi
  294. {
  295. CMD_S_GameConfig gameConfig;
  296. INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分
  297. BYTE leftTime; //255未开始
  298. WORD wchairId; //解散申请人
  299. BYTE options[GAME_PLAYER]; //在坐玩家 解散状态 0 未决定 1 tongy 2jj
  300. //游戏变量
  301. BYTE cbTotalCardCount; //游戏总牌数
  302. BYTE cbLeftCardCount; //单局游戏剩余牌数
  303. WORD wBankerUser; //本局游戏庄家
  304. BYTE lSiZi[4]; //色子1,2,皮子,癞子
  305. DWORD dwOwnerID; //房主ID //包家ID 6位 包家台数6位 每5位一个玩家台数
  306. //WORD bWanLaiZi[GAME_PLAYER]; //每个玩家打出癞子数(低四位是癞子,中四位是红中杠的个数,高四位就是发财杠的个数)
  307. //当前状态
  308. WORD wCurrentUser; //当前用户
  309. BYTE bPutCardData[GAME_PLAYER]; //最后一张牌打出的人和牌值
  310. BYTE totalOptTime; //总操作时间10秒
  311. BYTE leftOptTime; //还剩多少时间0
  312. BYTE cbDiscardCount[GAME_PLAYER]; //丢弃数目
  313. BYTE cbDiscardCard[GAME_PLAYER][40]; //丢弃记录
  314. BYTE cbCardCount[GAME_PLAYER]; //每个玩家扑克数目
  315. //组合扑克
  316. BYTE cbWeaveCount[GAME_PLAYER]; //组合数目
  317. CMD_WeaveItem WeaveItemArray[GAME_PLAYER][MAX_WEAVE]; //组合扑克
  318. BYTE cbCardData[MAX_COUNT]; //当前玩家手牌
  319. //断线玩家数据就是当前牌权玩家
  320. INT cbActionMask; //操作掩码
  321. WORD gangCards[6]; //当有杠的时候这里面有牌
  322. bool ToString(TCHAR* pBuffer, int iLen)
  323. {
  324. if (sizeof(CMD_S_StatusPlay) * 16 > iLen) return false;
  325. CString outCards;
  326. for (int i = 0; i < 4; i++)
  327. {
  328. CString tmp;
  329. tmp.Format(_T(" 玩家%d手牌 |\r\n"), i);
  330. outCards += tmp;
  331. for (int j = 0; i < cbDiscardCount[i]; j++)
  332. {
  333. CString strTmp;
  334. strTmp.Format(_T("0x%x "), cbDiscardCard[i][j]);
  335. outCards += strTmp;
  336. }
  337. outCards += _T(" |\r\n");
  338. }
  339. OutputDebugString(outCards);
  340. TCHAR tempcard[1024 * 2] = { 0 };
  341. #ifdef _UNICODE
  342. _snwprintf(tempcard, iLen, TEXT("断线重连命令->重连用户:%d,最后的出牌:[%d][%d][%d][%d],玩家手牌数量:[%d][%d][%d][%d],玩家牌值:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d],包家[%d],台数[%d] 打出的牌=%s ")
  343. , wCurrentUser, bPutCardData[0], bPutCardData[1], bPutCardData[3], bPutCardData[3], cbCardCount[0], cbCardCount[1], cbCardCount[2], cbCardCount[3], cbCardData[0], cbCardData[1], cbCardData[2], cbCardData[3]
  344. , cbCardData[4], cbCardData[5], cbCardData[6], cbCardData[7], cbCardData[8], cbCardData[9], cbCardData[10], cbCardData[11], cbCardData[12], cbCardData[13], (dwOwnerID & 0x3f), ((dwOwnerID >> 6) & 0x3f), outCards.GetBuffer()
  345. );
  346. #else
  347. _snwprintf(tempcard, iLen, TEXT("断线重连命令->重连用户:%d,最后的出牌:[%d][%d][%d][%d],玩家手牌数量:[%d][%d][%d][%d],玩家牌值:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d],包家[%d],台数[%d]")
  348. , wCurrentUser, bPutCardData[0], bPutCardData[1], bPutCardData[3], bPutCardData[3], cbCardCount[0], cbCardCount[1], cbCardCount[2], cbCardCount[3], cbCardData[0], cbCardData[1], cbCardData[2], cbCardData[3]
  349. , cbCardData[4], cbCardData[5], cbCardData[6], cbCardData[7], cbCardData[8], cbCardData[9], cbCardData[10], cbCardData[11], cbCardData[12], cbCardData[13]
  350. (dwOwnerID & 0x3f), ((dwOwnerID >> 6) & 0x3f)
  351. );
  352. #endif
  353. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  354. return true;
  355. }
  356. };
  357. //游戏状态,断线重连
  358. struct CMD_S_StatusPlay_Hua
  359. {
  360. CMD_S_GameConfig gameConfig;
  361. INT lUserTmpScore[GAME_PLAYER]; //临时积分。本轮玩家的积分
  362. BYTE leftTime; //255未开始
  363. WORD wchairId; //解散申请人
  364. BYTE options[GAME_PLAYER]; //在坐玩家 解散状态 0 未决定 1 tongy 2jj
  365. //游戏变量
  366. BYTE cbTotalCardCount; //游戏总牌数
  367. BYTE cbLeftCardCount; //单局游戏剩余牌数
  368. WORD wBankerUser; //本局游戏庄家
  369. BYTE lSiZi[4]; //记录玩家0,1,2统的个数
  370. //当前状态
  371. WORD wCurrentUser; //当前用户
  372. BYTE bPutCardData[GAME_PLAY]; //最后一张牌打出的人和牌值
  373. BYTE totalOptTime; //总操作时间10秒
  374. BYTE leftOptTime; //还剩多少时间0
  375. BYTE cbDiscardCount[GAME_PLAY]; //丢弃数目
  376. BYTE cbDiscardCard[GAME_PLAY][15]; //丢弃记录
  377. BYTE cbCardCount[GAME_PLAY]; //每个玩家扑克数目
  378. //组合扑克
  379. BYTE cbWeaveCount[GAME_PLAY]; //组合数目
  380. CMD_WeaveItem_Hua WeaveItemArray[GAME_PLAY][MAX_WEAVE_HUA]; //组合扑克
  381. BYTE cbCardData[9][9]; //当前玩家手牌
  382. //断线玩家数据就是当前牌权玩家
  383. INT cbActionMask; //操作掩码
  384. BYTE gangCards[6]; //当有杠的时候这里面有牌
  385. BYTE GameScore[GAME_PLAY]; //落地胡数
  386. BYTE HuShu; //胡数
  387. BYTE PaPoShu; //爬坡数
  388. };
  389. //游戏开始
  390. struct CMD_S_GameStart
  391. {
  392. WORD wBankerUser; //庄家用户
  393. WORD wCurrentUser; //当前用户
  394. INT cbUserAction; //用户动作(0:没操作,0x08:碰牌,0x10:杠,0x80:自摸等)
  395. BYTE ActionCard[3]; //动作所对应的牌
  396. BYTE cbCardData[MAX_COUNT*GAME_PLAYER]; //扑克列表
  397. BYTE cbSiceLaiZi[4]; //色子1,2,皮子,癞子
  398. BYTE cbLeftCardCount; //剩余牌
  399. BYTE cbTotalCardCount; //总麻将数
  400. BYTE cbOptTime; //操作时间(秒)
  401. BYTE cbCurrPlay; //当前局数
  402. bool ToString(TCHAR* pBuffer, int iLen)
  403. {
  404. if (sizeof(CMD_S_GameStart) * 16 > iLen) return false;
  405. TCHAR tempcard[2000];
  406. TCHAR tempActionCard[2000];
  407. ZeroMemory(tempcard, 2000 * sizeof(TCHAR));
  408. ZeroMemory(tempActionCard, 2000 * sizeof(TCHAR));
  409. for (BYTE i = MAX_COUNT*wCurrentUser; i < MAX_COUNT*(wCurrentUser + 1); i++)
  410. {
  411. SwitchToStringCard(cbCardData[i], tempcard, 2000);
  412. }
  413. for (BYTE i =0; i < 3; i++)
  414. {
  415. SwitchToStringCard(ActionCard[i], tempActionCard, 2000);
  416. }
  417. tempcard[1999] = 0;
  418. tempActionCard[1999] = 0;
  419. #ifdef _UNICODE
  420. _snwprintf(pBuffer, iLen, TEXT("游戏开始->庄家用户:%d,当前用户:%d,用户动作:%d,动作所对应的牌:%s,扑克列表:%s,色子1:%d,色子2:%d,皮子:%d,癞子:%d,剩余牌数:%d,总麻将数:%d,操作时间:%d,当前局数:%d")
  421. , wBankerUser, wCurrentUser, cbUserAction, tempActionCard, tempcard, cbSiceLaiZi[0], cbSiceLaiZi[1], cbSiceLaiZi[2], cbSiceLaiZi[3], cbLeftCardCount, cbTotalCardCount, cbOptTime, cbCurrPlay);
  422. #else
  423. _snwprintf(pBuffer, iLen, TEXT("游戏开始->庄家用户:%d,当前用户:%d,用户动作:%d,动作所对应的牌:%s,扑克列表:%s,色子1:%d,色子2:%d,皮子:%d,癞子:%d,剩余牌数:%d,总麻将数:%d,操作时间:%d,当前局数:%d")
  424. , wBankerUser, wCurrentUser, cbUserAction, tempActionCard, tempcard, cbSiceLaiZi[0], cbSiceLaiZi[1], cbSiceLaiZi[2], cbSiceLaiZi[3], cbLeftCardCount, cbTotalCardCount, cbOptTime, cbCurrPlay);
  425. #endif
  426. //mylog::ToSet(pBuffer, iLen);
  427. return true;
  428. }
  429. bool SwitchToStringCard(BYTE bData, TCHAR pBuffer[], int iLen)
  430. {
  431. if (wcslen(pBuffer) > 1980 + iLen)
  432. {
  433. return false;
  434. }
  435. BYTE iHuaSe = (bData & 0xF0) >> 4;
  436. BYTE bValue = (bData & 0x0F);
  437. TCHAR szTemp[8];
  438. ZeroMemory(szTemp, 8*sizeof(TCHAR));
  439. switch (iHuaSe)
  440. {
  441. case 0:
  442. {
  443. switch (bValue)
  444. {
  445. case 1:
  446. {
  447. StringCchCat(szTemp, 16, _T("一万~"));
  448. break;
  449. }
  450. case 2:
  451. {
  452. StringCchCat(szTemp, 16, _T("二万~"));
  453. break;
  454. }
  455. case 3:
  456. {
  457. StringCchCat(szTemp, 16, _T("三万~"));
  458. break;
  459. }
  460. case 4:
  461. {
  462. StringCchCat(szTemp, 16, _T("四万~"));
  463. break;
  464. }
  465. case 5:
  466. {
  467. StringCchCat(szTemp, 16, _T("五万~"));
  468. break;
  469. }
  470. case 6:
  471. {
  472. StringCchCat(szTemp, 16, _T("六万~"));
  473. break;
  474. }
  475. case 7:
  476. {
  477. StringCchCat(szTemp, 16, _T("七万~"));
  478. break;
  479. }
  480. case 8:
  481. {
  482. StringCchCat(szTemp, 16, _T("八万~"));
  483. break;
  484. }
  485. case 9:
  486. {
  487. StringCchCat(szTemp, 16, _T("九万~"));
  488. break;
  489. }
  490. default:
  491. break;
  492. }
  493. break;
  494. }
  495. case 1:
  496. switch (bValue)
  497. {
  498. case 1:
  499. {
  500. StringCchCat(szTemp, 16, _T("一条~"));
  501. break;
  502. }
  503. case 2:
  504. {
  505. StringCchCat(szTemp, 16, _T("二条~"));
  506. break;
  507. }
  508. case 3:
  509. {
  510. StringCchCat(szTemp, 16, _T("三条~"));
  511. break;
  512. }
  513. case 4:
  514. {
  515. StringCchCat(szTemp, 16, _T("四条~"));
  516. break;
  517. }
  518. case 5:
  519. {
  520. StringCchCat(szTemp, 16, _T("五条~"));
  521. break;
  522. }
  523. case 6:
  524. {
  525. StringCchCat(szTemp, 16, _T("六条~"));
  526. break;
  527. }
  528. case 7:
  529. {
  530. StringCchCat(szTemp, 16, _T("七条~"));
  531. break;
  532. }
  533. case 8:
  534. {
  535. StringCchCat(szTemp, 16, _T("八条~"));
  536. break;
  537. }
  538. case 9:
  539. {
  540. StringCchCat(szTemp, 16, _T("九条~"));
  541. break;
  542. }
  543. default:
  544. break;
  545. }
  546. break;
  547. case 2:
  548. switch (bValue)
  549. {
  550. case 1:
  551. {
  552. StringCchCat(szTemp, 16, _T("一筒~"));
  553. break;
  554. }
  555. case 2:
  556. {
  557. StringCchCat(szTemp, 16, _T("二筒~"));
  558. break;
  559. }
  560. case 3:
  561. {
  562. StringCchCat(szTemp, 16, _T("三筒~"));
  563. break;
  564. }
  565. case 4:
  566. {
  567. StringCchCat(szTemp, 16, _T("四筒~"));
  568. break;
  569. }
  570. case 5:
  571. {
  572. StringCchCat(szTemp, 16, _T("五筒~"));
  573. break;
  574. }
  575. case 6:
  576. {
  577. StringCchCat(szTemp, 16, _T("六筒~"));
  578. break;
  579. }
  580. case 7:
  581. {
  582. StringCchCat(szTemp, 16, _T("七筒~"));
  583. break;
  584. }
  585. case 8:
  586. {
  587. StringCchCat(szTemp, 16, _T("八筒~"));
  588. break;
  589. }
  590. case 9:
  591. {
  592. StringCchCat(szTemp, 16, _T("九筒~"));
  593. break;
  594. }
  595. default:
  596. break;
  597. }
  598. break;
  599. default:
  600. break;
  601. }
  602. StringCchCat(pBuffer, iLen, szTemp);
  603. return true;
  604. }
  605. };
  606. //花牌游戏开始
  607. struct CMD_S_GameStart_Hua
  608. {
  609. WORD wBankerUser; //庄家用户
  610. WORD wCurrentUser; //当前用户
  611. INT cbUserAction; //用户动作(0:没操作,0x08:碰牌,0x10:杠,0x80:自摸等)
  612. BYTE ActionCard[6]; //动作所对应的牌
  613. BYTE cbCardData[9][9]; //扑克列表
  614. BYTE cbLeftCardCount; //剩余牌
  615. BYTE cbTotalCardCount; //总花牌数
  616. BYTE cbOptTime; //操作时间(秒)
  617. BYTE cbCurrPlay; //当前局数
  618. bool ToString(TCHAR* pBuffer, int iLen)
  619. {
  620. if (sizeof(CMD_S_GameStart_Hua) * 16 > iLen) return false;
  621. BYTE TempCardData[26] = { 0 };
  622. BYTE TempCount = 0;
  623. for (BYTE i = 0; i < 9; i++)
  624. {
  625. for (BYTE j = 0; j < 9; j++)
  626. {
  627. if (cbCardData[i][j] == 0)
  628. {
  629. break;
  630. }
  631. TempCardData[TempCount++] = cbCardData[i][j];
  632. }
  633. if (TempCount == 26)
  634. {
  635. break;
  636. }
  637. }
  638. #ifdef _UNICODE
  639. _snwprintf(pBuffer, iLen, TEXT("游戏开始->庄家用户:%d,当前用户:%d,用户动作:%d,操作牌值:[%d][%d][%d][%d][%d][%d],扑克列表:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d],剩余牌数:%d,总麻将数:%d,操作时间:%d,当前局数:%d")
  640. , wBankerUser, wCurrentUser, cbUserAction, ActionCard[0], ActionCard[1], ActionCard[2], ActionCard[3], ActionCard[4], ActionCard[5], TempCardData[0], TempCardData[1], TempCardData[2], TempCardData[3], TempCardData[4], TempCardData[5], TempCardData[6], TempCardData[7], TempCardData[8], TempCardData[9], TempCardData[10], TempCardData[11], TempCardData[12], TempCardData[13], TempCardData[14], TempCardData[15], TempCardData[16], TempCardData[17], TempCardData[18], TempCardData[19], TempCardData[20], TempCardData[21], TempCardData[22], TempCardData[23], TempCardData[24], TempCardData[25], cbLeftCardCount, cbTotalCardCount, cbOptTime, cbCurrPlay);
  641. #else
  642. _snwprintf(pBuffer, iLen, TEXT("游戏开始->庄家用户:%d,当前用户:%d,用户动作:%d,操作牌值:[%d][%d][%d][%d][%d][%d],扑克列表:[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d],剩余牌数:%d,总麻将数:%d,操作时间:%d,当前局数:%d")
  643. , wBankerUser, wCurrentUser, cbUserAction, ActionCard[0], ActionCard[1], ActionCard[2], ActionCard[3], ActionCard[4], ActionCard[5], TempCardData[0], TempCardData[1], TempCardData[2], TempCardData[3], TempCardData[4], TempCardData[5], TempCardData[6], TempCardData[7], TempCardData[8], TempCardData[9], TempCardData[10], TempCardData[11], TempCardData[12], TempCardData[13], TempCardData[14], TempCardData[15], TempCardData[16], TempCardData[17], TempCardData[18], TempCardData[19], TempCardData[20], TempCardData[21], TempCardData[22], TempCardData[23], TempCardData[24], TempCardData[25], cbLeftCardCount, cbTotalCardCount, cbOptTime, cbCurrPlay);
  644. #endif
  645. return true;
  646. }
  647. };
  648. //出牌命令
  649. struct CMD_S_OutCard
  650. {
  651. WORD wOutCardUser; //出牌用户,座位号
  652. BYTE bOptType; //操作类型(0,表示普通出牌,1,表示癞子杠)
  653. BYTE cbOutCardData; //出牌扑克
  654. bool ToString(TCHAR* pBuffer, int iLen)
  655. {
  656. if (sizeof(CMD_S_OutCard) * 16 > iLen) return false;
  657. #ifdef _UNICODE
  658. _snwprintf(pBuffer, iLen, TEXT("出牌命令->出牌用户:%d,操作类型(0表示普通出牌,1表示癞子杠):%d,出牌数据:%d")
  659. , wOutCardUser, bOptType, cbOutCardData);
  660. #else
  661. _snwprintf(pBuffer, iLen, TEXT("出牌命令->出牌用户:%d,操作类型(0表示普通出牌,1表示癞子杠):%d,出牌数据:%d")
  662. , wOutCardUser, bOptType, cbOutCardData);
  663. #endif
  664. //mylog::ToSet(pBuffer, iLen);
  665. return true;
  666. }
  667. };
  668. //听牌数据单独协议
  669. struct CMD_S_TingCard
  670. {
  671. BYTE bOutCardCout; //可以打出的牌就听牌的个数
  672. BYTE bOutCardData[MAX_COUNT]; //具体打哪几张牌
  673. BYTE bTingCardCount[MAX_COUNT]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数
  674. WORD bTingCardData[MAX_COUNT][MAX_TING];//具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据
  675. };
  676. //发送扑克
  677. struct CMD_S_SendCard
  678. {
  679. BYTE cbCardData; //发牌扑克数据
  680. INT cbActionMask; //动作掩码(0:没操作,0x08:碰牌,0x10:杠,0x80:自摸)
  681. BYTE cbActionCard[3]; //操作扑克(杠的时候才有数据,多杠时,补杠,暗杠,朝天才有数据)
  682. WORD wCurrentUser; //当前用户
  683. BYTE bTail; //末尾发牌(0:正常发牌,1:末尾)
  684. BYTE bLeftCardCount; //剩余牌数
  685. BYTE bOutCardCout; //可以打出的牌就听牌的个数
  686. BYTE bOutCardData[MAX_COUNT]; //具体打哪几张牌
  687. BYTE bTingCardCount[MAX_COUNT]; //相对应打出牌可听牌个数,索引表示第几张,值是对应对应的听牌个数
  688. BYTE bTingCardData[MAX_COUNT][MAX_INDEX];//具体听牌数据,一维索引表示打出牌的第几个,二维索引表示听牌的第几个,值表示牌数据
  689. bool ToString(TCHAR* pBuffer, int iLen)
  690. {
  691. if (sizeof(CMD_S_SendCard) * 8 > iLen) return false;
  692. TCHAR tempcard[2550];
  693. TCHAR sbOutCardData[2550] = { 0 };
  694. ZeroMemory(tempcard, 2550 * sizeof(TCHAR));
  695. ZeroMemory(sbOutCardData, 2550 * sizeof(TCHAR));
  696. for (BYTE i = 0; i < bOutCardCout; i++)
  697. {
  698. SwitchToStringCard(bOutCardData[i], sbOutCardData, 2550);
  699. for (BYTE j = 0; j < bTingCardCount[i]; j++)
  700. {
  701. BYTE tempCardData = bTingCardData[i][j] & 0x3f;
  702. SwitchToStringCard(tempCardData, tempcard, 2550);
  703. }
  704. StringCchCat(tempcard, 2550, _T("##~"));
  705. }
  706. #ifdef _UNICODE
  707. _snwprintf(pBuffer, iLen, TEXT("派发麻将->麻将数据:%d,动作掩码(0没操作 8碰牌 16杠 128自摸):%d,当前用户:%d,操作牌值:[%d][%d][%d],打出的牌就听牌的个数:%d,打牌数据:%s,相对应听牌数:[%d][%d][%d][%d][%d][%d],相对应听牌数据:%s,听牌位置1:[%d][%d][%d][%d][%d][%d][%d][%d],听牌位置2:[%d][%d][%d][%d][%d][%d],听牌位置3:[%d][%d][%d],听牌位置4:[%d][%d][%d],听牌位置5:[%d][%d][%d],听牌位置6:[%d][%d][%d],听牌位置7:[%d][%d][%d],听牌位置8[%d][%d][%d],听牌位置9:[%d][%d][%d],听牌位置10:[%d][%d][%d],听牌位置11:[%d][%d][%d],听牌位置12:[%d][%d][%d],听牌位置13:[%d][%d][%d],听牌位置14:[%d][%d][%d]")
  708. , cbCardData, cbActionMask, wCurrentUser, cbActionCard[0], cbActionCard[1], cbActionCard[2], bOutCardCout, sbOutCardData, bTingCardCount[0], bTingCardCount[1], bTingCardCount[2], bTingCardCount[3], bTingCardCount[4], bTingCardCount[5], tempcard, bTingCardData[0][0], bTingCardData[0][1], bTingCardData[0][2], bTingCardData[0][3], bTingCardData[0][4], bTingCardData[0][5], bTingCardData[0][6], bTingCardData[0][7], bTingCardData[1][0], bTingCardData[1][1], bTingCardData[1][2], bTingCardData[1][3], bTingCardData[1][4], bTingCardData[1][5]
  709. , bTingCardData[2][0], bTingCardData[2][1], bTingCardData[2][2], bTingCardData[3][0], bTingCardData[3][1], bTingCardData[3][2], bTingCardData[4][0], bTingCardData[4][1], bTingCardData[4][2]
  710. , bTingCardData[5][0], bTingCardData[5][1], bTingCardData[5][2], bTingCardData[6][0], bTingCardData[6][1], bTingCardData[6][2], bTingCardData[7][0], bTingCardData[7][1], bTingCardData[7][2]
  711. , bTingCardData[8][0], bTingCardData[8][1], bTingCardData[8][2], bTingCardData[9][0], bTingCardData[9][1], bTingCardData[9][2], bTingCardData[10][0], bTingCardData[10][1], bTingCardData[10][2]
  712. , bTingCardData[11][0], bTingCardData[11][1], bTingCardData[11][2], bTingCardData[12][0], bTingCardData[12][1], bTingCardData[12][2], bTingCardData[13][0], bTingCardData[13][1], bTingCardData[13][2]);
  713. #else
  714. _snwprintf(pBuffer, iLen, TEXT("派发麻将->麻将数据:%d,动作掩码(0没操作 8碰牌 16杠 128自摸):%d,当前用户:%d,操作牌值:%d,操作牌值:%d,操作牌值:%d,打出的牌就听牌的个数:%d,打牌数据:%s,相对应听牌数:[%d][%d][%d][%d][%d][%d],相对应听牌数据:%s,听牌位置1:[%d][%d][%d][%d][%d][%d][%d][%d],听牌位置2:[%d][%d][%d][%d][%d][%d],听牌位置3:[%d][%d][%d],听牌位置4:[%d][%d][%d],听牌位置5:[%d][%d][%d],听牌位置6:[%d][%d][%d],听牌位置7:[%d][%d][%d],听牌位置8[%d][%d][%d],听牌位置9:[%d][%d][%d],听牌位置10:[%d][%d][%d],听牌位置11:[%d][%d][%d],听牌位置12:[%d][%d][%d],听牌位置13:[%d][%d][%d],听牌位置14:[%d][%d][%d]")
  715. , cbCardData, cbActionMask, wCurrentUser, cbActionCard[0], cbActionCard[1], cbActionCard[2], bOutCardCout, sbOutCardData, bTingCardCount[0], bTingCardCount[1], bTingCardCount[2], bTingCardCount[3], bTingCardCount[4], bTingCardCount[5], tempcard, bTingCardData[0][0], bTingCardData[0][1], bTingCardData[0][2], bTingCardData[0][3], bTingCardData[0][4], bTingCardData[0][5], bTingCardData[0][6], bTingCardData[0][7], bTingCardData[1][0], bTingCardData[1][1], bTingCardData[1][2], bTingCardData[1][3], bTingCardData[1][4], bTingCardData[1][5]
  716. , bTingCardData[2][0], bTingCardData[2][1], bTingCardData[2][2], bTingCardData[3][0], bTingCardData[3][1], bTingCardData[3][2], bTingCardData[4][0], bTingCardData[4][1], bTingCardData[4][2]
  717. , bTingCardData[5][0], bTingCardData[5][1], bTingCardData[5][2], bTingCardData[6][0], bTingCardData[6][1], bTingCardData[6][2], bTingCardData[7][0], bTingCardData[7][1], bTingCardData[7][2]
  718. , bTingCardData[8][0], bTingCardData[8][1], bTingCardData[8][2], bTingCardData[9][0], bTingCardData[9][1], bTingCardData[9][2], bTingCardData[10][0], bTingCardData[10][1], bTingCardData[10][2]
  719. , bTingCardData[11][0], bTingCardData[11][1], bTingCardData[11][2], bTingCardData[12][0], bTingCardData[12][1], bTingCardData[12][2], bTingCardData[13][0], bTingCardData[13][1], bTingCardData[13][2]);
  720. #endif
  721. //mylog::ToSet(pBuffer, iLen);
  722. return true;
  723. }
  724. bool SwitchToStringCard(BYTE bData, TCHAR pBuffer[], int iLen)
  725. {
  726. if (wcslen(pBuffer) > 1980 + iLen)
  727. {
  728. return false;
  729. }
  730. BYTE iHuaSe = (bData & 0xF0) >> 4;
  731. BYTE bValue = (bData & 0x0F);
  732. TCHAR szTemp[8];
  733. ZeroMemory(szTemp, 8 * sizeof(TCHAR));
  734. switch (iHuaSe)
  735. {
  736. case 0:
  737. {
  738. switch (bValue)
  739. {
  740. case 1:
  741. {
  742. StringCchCat(szTemp, 16, _T("一万~"));
  743. break;
  744. }
  745. case 2:
  746. {
  747. StringCchCat(szTemp, 16, _T("二万~"));
  748. break;
  749. }
  750. case 3:
  751. {
  752. StringCchCat(szTemp, 16, _T("三万~"));
  753. break;
  754. }
  755. case 4:
  756. {
  757. StringCchCat(szTemp, 16, _T("四万~"));
  758. break;
  759. }
  760. case 5:
  761. {
  762. StringCchCat(szTemp, 16, _T("五万~"));
  763. break;
  764. }
  765. case 6:
  766. {
  767. StringCchCat(szTemp, 16, _T("六万~"));
  768. break;
  769. }
  770. case 7:
  771. {
  772. StringCchCat(szTemp, 16, _T("七万~"));
  773. break;
  774. }
  775. case 8:
  776. {
  777. StringCchCat(szTemp, 16, _T("八万~"));
  778. break;
  779. }
  780. case 9:
  781. {
  782. StringCchCat(szTemp, 16, _T("九万~"));
  783. break;
  784. }
  785. default:
  786. break;
  787. }
  788. break;
  789. }
  790. case 1:
  791. switch (bValue)
  792. {
  793. case 1:
  794. {
  795. StringCchCat(szTemp, 16, _T("一条~"));
  796. break;
  797. }
  798. case 2:
  799. {
  800. StringCchCat(szTemp, 16, _T("二条~"));
  801. break;
  802. }
  803. case 3:
  804. {
  805. StringCchCat(szTemp, 16, _T("三条~"));
  806. break;
  807. }
  808. case 4:
  809. {
  810. StringCchCat(szTemp, 16, _T("四条~"));
  811. break;
  812. }
  813. case 5:
  814. {
  815. StringCchCat(szTemp, 16, _T("五条~"));
  816. break;
  817. }
  818. case 6:
  819. {
  820. StringCchCat(szTemp, 16, _T("六条~"));
  821. break;
  822. }
  823. case 7:
  824. {
  825. StringCchCat(szTemp, 16, _T("七条~"));
  826. break;
  827. }
  828. case 8:
  829. {
  830. StringCchCat(szTemp, 16, _T("八条~"));
  831. break;
  832. }
  833. case 9:
  834. {
  835. StringCchCat(szTemp, 16, _T("九条~"));
  836. break;
  837. }
  838. default:
  839. break;
  840. }
  841. break;
  842. case 2:
  843. switch (bValue)
  844. {
  845. case 1:
  846. {
  847. StringCchCat(szTemp, 16, _T("一筒~"));
  848. break;
  849. }
  850. case 2:
  851. {
  852. StringCchCat(szTemp, 16, _T("二筒~"));
  853. break;
  854. }
  855. case 3:
  856. {
  857. StringCchCat(szTemp, 16, _T("三筒~"));
  858. break;
  859. }
  860. case 4:
  861. {
  862. StringCchCat(szTemp, 16, _T("四筒~"));
  863. break;
  864. }
  865. case 5:
  866. {
  867. StringCchCat(szTemp, 16, _T("五筒~"));
  868. break;
  869. }
  870. case 6:
  871. {
  872. StringCchCat(szTemp, 16, _T("六筒~"));
  873. break;
  874. }
  875. case 7:
  876. {
  877. StringCchCat(szTemp, 16, _T("七筒~"));
  878. break;
  879. }
  880. case 8:
  881. {
  882. StringCchCat(szTemp, 16, _T("八筒~"));
  883. break;
  884. }
  885. case 9:
  886. {
  887. StringCchCat(szTemp, 16, _T("九筒~"));
  888. break;
  889. }
  890. default:
  891. break;
  892. }
  893. break;
  894. default:
  895. break;
  896. }
  897. StringCchCat(pBuffer, iLen, szTemp);
  898. return true;
  899. }
  900. };
  901. //花牌发送
  902. struct CMD_S_SendCard_Hua
  903. {
  904. BYTE cbCardData; //发牌扑克数据
  905. INT cbActionMask; //动作掩码()
  906. BYTE cbActionCard[6]; //操作扑克(杠的时候才有数据,多杠时,补杠,暗杠,朝天才有数据)
  907. WORD wCurrentUser; //当前用户
  908. BYTE bTail; //末尾发牌(0:正常发牌,1:末尾)
  909. BYTE bLeftCardCount; //剩余牌数
  910. BYTE HuShu; //胡数
  911. BYTE PaPoShu; //爬坡数
  912. bool ToString(TCHAR* pBuffer, int iLen)
  913. {
  914. if (sizeof(CMD_S_SendCard_Hua) * 8 > iLen) return false;
  915. //TCHAR tempcard[1024 * 2] = { 0 };
  916. //ZeroMemory(tempcard, 1024 * 2 * sizeof(TCHAR));
  917. #ifdef _UNICODE
  918. _snwprintf(pBuffer, iLen, TEXT("派发麻将->麻将数据:%d,动作掩码:%d,当前用户:%d,操作牌值:[%d][%d][%d][%d][%d][%d],是否是统抓牌:%d,剩余牌个数:%d,胡数:%d,爬坡数:%d")
  919. , cbCardData, cbActionMask, wCurrentUser, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5], bTail, bLeftCardCount, HuShu, PaPoShu);
  920. #else
  921. _snwprintf(pBuffer, iLen, TEXT("派发麻将->麻将数据:%d,动作掩码:%d,当前用户:%d,操作牌值:[%d][%d][%d][%d][%d][%d],是否是统抓牌:%d,剩余牌个数:%d,胡数:%d,爬坡数:%d")
  922. , cbCardData, cbActionMask, wCurrentUser, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5], bTail, bLeftCardCount, HuShu, PaPoShu);
  923. #endif
  924. //StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  925. return true;
  926. }
  927. };
  928. //操作提示
  929. struct CMD_S_OperateNotify
  930. {
  931. WORD wResumeUser; //还原用户
  932. INT cbActionMask; //动作掩码()
  933. BYTE cbActionCard; //动作扑克
  934. bool ToString(TCHAR* pBuffer, int iLen)
  935. {
  936. //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false;
  937. TCHAR tempcard[255] = { 0 };
  938. ZeroMemory(tempcard, 255 * sizeof(TCHAR));
  939. #ifdef _UNICODE
  940. _snwprintf(tempcard, 255, TEXT("操作提示->还原用户:%d,动作掩码:%d,动作扑克:%d"), wResumeUser, cbActionMask, cbActionCard);
  941. #else
  942. _snprintf(tempcard, 255, TEXT("操作提示->还原用户:%d,动作掩码:%d,动作扑克:%d")
  943. , wResumeUser, cbActionMask, cbActionCard);
  944. #endif
  945. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  946. return true;
  947. }
  948. };
  949. //花牌操作提示
  950. struct CMD_S_OperateNotify_Hua
  951. {
  952. WORD wResumeUser; //还原用户
  953. INT cbActionMask; //动作掩码()
  954. BYTE cbActionCard; //动作扑克
  955. BYTE HuShu; //胡数
  956. BYTE PaPo; //爬了几坡
  957. bool ToString(TCHAR* pBuffer, int iLen)
  958. {
  959. //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false;
  960. TCHAR tempcard[255] = { 0 };
  961. ZeroMemory(tempcard, 255 * sizeof(TCHAR));
  962. #ifdef _UNICODE
  963. _snwprintf(tempcard, 255, TEXT("操作提示->还原用户:%d,动作掩码:%d,动作扑克:%d,胡数:%d,爬坡数:%d"), wResumeUser, cbActionMask, cbActionCard, HuShu, PaPo);
  964. #else
  965. _snwprintf(tempcard, 255, TEXT("操作提示->还原用户:%d,动作掩码:%d,动作扑克:%d,胡数:%d,爬坡数:%d"), wResumeUser, cbActionMask, cbActionCard, HuShu, PaPo);
  966. #endif
  967. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  968. return true;
  969. }
  970. };
  971. //请统提示
  972. struct CMD_S_QingTongNotify
  973. {
  974. WORD OperatorUser; //操作用户
  975. INT cbActionMask; //操作码
  976. BYTE cbActionCard[6]; //动作扑克
  977. bool ToString(TCHAR* pBuffer, int iLen)
  978. {
  979. TCHAR tempcard[255] = { 0 };
  980. ZeroMemory(tempcard, 255 * sizeof(TCHAR));
  981. #ifdef _UNICODE
  982. _snwprintf(tempcard, 255, TEXT("操作提示->操作用户:%d,动作掩码:%d,动作扑克:[%d][%d][%d][%d][%d][%d]"), OperatorUser, cbActionMask, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5]);
  983. #else
  984. _snwprintf(tempcard, 255, TEXT("操作提示->操作用户:%d,动作掩码:%d,动作扑克:[%d][%d][%d][%d][%d][%d]"), OperatorUser, cbActionMask, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5]);
  985. #endif
  986. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  987. return true;
  988. }
  989. };
  990. //操作命令
  991. struct CMD_S_OperateResult
  992. {
  993. WORD wOperateUser; //操作用户
  994. WORD wProvideUser; //供应用户
  995. INT cbOperateCode; //操作代码
  996. BYTE cbOperateCard; //操作扑克
  997. INT cbActionMask; //动作
  998. BYTE cbActionCard[3]; //动作牌值
  999. BYTE bOutCardCout; //可以打出的牌就听牌的出牌个数
  1000. BYTE bOutCardData[MAX_COUNT]; //具体打哪几张牌
  1001. BYTE bTingCardCount[MAX_COUNT]; //相对应打出牌的可听牌个数,索引表示打出牌索引,值表示可听牌数
  1002. BYTE bTingCardData[MAX_COUNT][MAX_INDEX];//具体听牌数据,索引表示打出牌索引,值表示具体牌数据,根据上面值就知道这个有几个值
  1003. bool ToString(TCHAR* pBuffer, int iLen)
  1004. {
  1005. //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false;
  1006. TCHAR tempcard[1024*2] = { 0 };
  1007. ZeroMemory(tempcard, 1024 * 2 * sizeof(TCHAR));
  1008. #ifdef _UNICODE
  1009. _snwprintf(tempcard, iLen / sizeof(TCHAR), TEXT("操作命令->操作用户:%d,供应用户:%d,操作代码:%d,操作扑克:%d,可打出牌个数:%d,具体牌值:[%d][%d][%d],听牌位置1:[%d][%d][%d][%d][%d][%d][%d],听牌位置2:[%d][%d][%d][%d][%d][%d],听牌位置3:[%d][%d][%d],听牌位置4:[%d][%d][%d],听牌位置5:[%d][%d][%d],听牌位置6:[%d][%d][%d],听牌位置7:[%d][%d][%d],听牌位置8[%d][%d][%d],听牌位置9:[%d][%d][%d],听牌位置10:[%d][%d][%d],听牌位置11:[%d][%d][%d],听牌位置12:[%d][%d][%d],听牌位置13:[%d][%d][%d],听牌位置14:[%d][%d][%d]")
  1010. , wOperateUser, wProvideUser, cbOperateCode, cbOperateCard, bOutCardCout, bOutCardData[0], bOutCardData[1], bOutCardData[2], bTingCardData[0][0], bTingCardData[0][1], bTingCardData[0][2], bTingCardData[0][3], bTingCardData[0][4], bTingCardData[0][5], bTingCardData[0][6], bTingCardData[1][0], bTingCardData[1][1], bTingCardData[1][2], bTingCardData[1][3], bTingCardData[1][4], bTingCardData[1][5]
  1011. , bTingCardData[2][0], bTingCardData[2][1], bTingCardData[2][2], bTingCardData[3][0], bTingCardData[3][1], bTingCardData[3][2], bTingCardData[4][0], bTingCardData[4][1], bTingCardData[4][2]
  1012. , bTingCardData[5][0], bTingCardData[5][1], bTingCardData[5][2], bTingCardData[6][0], bTingCardData[6][1], bTingCardData[6][2], bTingCardData[7][0], bTingCardData[7][1], bTingCardData[7][2]
  1013. , bTingCardData[8][0], bTingCardData[8][1], bTingCardData[8][2], bTingCardData[9][0], bTingCardData[9][1], bTingCardData[9][2], bTingCardData[10][0], bTingCardData[10][1], bTingCardData[10][2]
  1014. , bTingCardData[11][0], bTingCardData[11][1], bTingCardData[11][2], bTingCardData[12][0], bTingCardData[12][1], bTingCardData[12][2], bTingCardData[13][0], bTingCardData[13][1], bTingCardData[13][2]);
  1015. #else
  1016. _snwprintf(tempcard, iLen / sizeof(TCHAR), TEXT("操作命令->操作用户:%d,供应用户:%d,操作代码:%d,操作扑克:%d,可打出牌个数:%d,具体牌值:[%d][%d][%d],听牌位置1:[%d][%d][%d][%d][%d][%d][%d],听牌位置2:[%d][%d][%d][%d][%d][%d],听牌位置3:[%d][%d][%d],听牌位置4:[%d][%d][%d],听牌位置5:[%d][%d][%d],听牌位置6:[%d][%d][%d],听牌位置7:[%d][%d][%d],听牌位置8[%d][%d][%d],听牌位置9:[%d][%d][%d],听牌位置10:[%d][%d][%d],听牌位置11:[%d][%d][%d],听牌位置12:[%d][%d][%d],听牌位置13:[%d][%d][%d],听牌位置14:[%d][%d][%d]")
  1017. , wOperateUser, wProvideUser, cbOperateCode, cbOperateCard, bOutCardCout, bOutCardData[0], bOutCardData[1], bOutCardData[2], bTingCardData[0][0], bTingCardData[0][1], bTingCardData[0][2], bTingCardData[0][3], bTingCardData[0][4], bTingCardData[0][5], bTingCardData[0][6], bTingCardData[1][0], bTingCardData[1][1], bTingCardData[1][2], bTingCardData[1][3], bTingCardData[1][4], bTingCardData[1][5]
  1018. , bTingCardData[2][0], bTingCardData[2][1], bTingCardData[2][2], bTingCardData[3][0], bTingCardData[3][1], bTingCardData[3][2], bTingCardData[4][0], bTingCardData[4][1], bTingCardData[4][2]
  1019. , bTingCardData[5][0], bTingCardData[5][1], bTingCardData[5][2], bTingCardData[6][0], bTingCardData[6][1], bTingCardData[6][2], bTingCardData[7][0], bTingCardData[7][1], bTingCardData[7][2]
  1020. , bTingCardData[8][0], bTingCardData[8][1], bTingCardData[8][2], bTingCardData[9][0], bTingCardData[9][1], bTingCardData[9][2], bTingCardData[10][0], bTingCardData[10][1], bTingCardData[10][2]
  1021. , bTingCardData[11][0], bTingCardData[11][1], bTingCardData[11][2], bTingCardData[12][0], bTingCardData[12][1], bTingCardData[12][2], bTingCardData[13][0], bTingCardData[13][1], bTingCardData[13][2]);
  1022. #endif
  1023. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  1024. return true;
  1025. }
  1026. };
  1027. //
  1028. struct CMD_S_OperateResult_Hua
  1029. {
  1030. WORD wOperateUser; //操作用户
  1031. WORD wProvideUser; //供应用户
  1032. INT cbOperateCode; //操作代码
  1033. BYTE cbOperateCard; //操作扑克
  1034. BYTE cbHuaGangCard[4]; //操作扑克
  1035. INT cbActionMask; //动作
  1036. BYTE cbActionCard[6]; //动作牌值
  1037. BYTE cbOperateScore; //胡数
  1038. bool ToString(TCHAR* pBuffer, int iLen)
  1039. {
  1040. TCHAR tempcard[1024 * 2] = { 0 };
  1041. ZeroMemory(tempcard, 1024 * 2 * sizeof(TCHAR));
  1042. #ifdef _UNICODE
  1043. _snwprintf(tempcard, iLen / sizeof(TCHAR), TEXT("操作命令->操作用户:%d,供应用户:%d,操作代码:%d,操作扑克:%d,附加操作扑克:[%d][%d][%d][%d],返回操作码:%d,具体牌值:[%d][%d][%d][%d][%d][%d]"), wOperateUser, wProvideUser, cbOperateCode, cbOperateCard, cbHuaGangCard[0], cbHuaGangCard[1], cbHuaGangCard[2], cbHuaGangCard[3], cbActionMask, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5]);
  1044. #else
  1045. _snwprintf(tempcard, iLen / sizeof(TCHAR), TEXT("操作命令->操作用户:%d,供应用户:%d,操作代码:%d,操作扑克:%d,附加操作扑克:[%d][%d][%d][%d],返回操作码:%d,具体牌值:[%d][%d][%d][%d][%d][%d]"), wOperateUser, wProvideUser, cbOperateCode, cbOperateCard, cbHuaGangCard[0], cbHuaGangCard[1], cbHuaGangCard[2], cbHuaGangCard[3], cbActionMask, cbActionCard[0], cbActionCard[1], cbActionCard[2], cbActionCard[3], cbActionCard[4], cbActionCard[5]);
  1046. #endif
  1047. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  1048. return true;
  1049. }
  1050. };
  1051. //血流game结束
  1052. struct CMD_S_XueLiuEnd
  1053. {
  1054. BYTE bFinish;//是否结束本轮。0表示否,1表示是
  1055. BYTE cbCardData[GAME_PLAYER][MAX_COUNT]; //玩家手牌
  1056. BYTE checkHuazhu[GAME_PLAYER]; //默认0 1查叫 2花猪
  1057. int checkCoin[GAME_PLAYER]; // 查花猪 或查叫的积分变化值
  1058. int DangJu[GAME_PLAYER]; //单局积分
  1059. int leftCoin[GAME_PLAYER]; //玩家积分
  1060. BYTE winScoreNum; //积分变化次数
  1061. BYTE winScoreType[MAX_CHANGE_SCORE]; //类型
  1062. BYTE winScoreRate[MAX_CHANGE_SCORE]; //倍数
  1063. int winScore[MAX_CHANGE_SCORE]; //分数
  1064. BYTE winProvider[MAX_CHANGE_SCORE]; //关连玩家 0表示3家 1下家 2对家 3上家
  1065. BYTE winFanType[MAX_CHANGE_SCORE]; //番型
  1066. };
  1067. //游戏结束
  1068. struct CMD_S_GameEnd
  1069. {
  1070. BYTE bOptType; //1操作类型(1胡牌结束,2黄庄,3解散)1
  1071. WORD bWanJiaId; //2玩家座位号 3
  1072. BYTE cbCardData[GAME_PLAYER][MAX_COUNT]; //62玩家手牌值 59
  1073. INT cbWanJiaScore[GAME_PLAYER]; //66玩家目前所拥有积分 75
  1074. BYTE bZimo[GAME_PLAYER]; //70每位玩家胡牌次数 79
  1075. BYTE bFinish; //71是否结束本轮。0表示否,1表示是 80
  1076. DWORD dwOwnerID; //75房主ID 84
  1077. BYTE bLeftCardCount; //76剩余牌数 85
  1078. BYTE bLeftCardDada[54]; //130剩余牌值 139
  1079. BYTE playGameNum; //打到第几局了 140
  1080. INT lGameScoreDetail[16 * GAME_PLAYER]; //195流水详情 204
  1081. };
  1082. //花牌游戏结束
  1083. struct CMD_S_GameEnd_Hua
  1084. {
  1085. BYTE bOptType; //1操作类型(1胡牌结束,2黄庄,3解散)
  1086. WORD bWanJiaId; //2玩家座位号(胡牌玩家)
  1087. BYTE bHuPaiCard; //1玩家座位号(胡牌牌值)(自摸牌值为零,点炮才有值)
  1088. BYTE YingJiaCard[9][5]; //45赢家手牌排列
  1089. BYTE ZhuGold; //1主经
  1090. BYTE HuShu; //1胡数
  1091. BYTE cbCardIndex[GAME_PLAY][28]; //84玩家手牌值
  1092. INT cbBianDongScore[GAME_PLAY]; //12玩家积分变动
  1093. INT cbWanJiaScore[GAME_PLAY]; //12玩家目前所拥有积分
  1094. BYTE bZimo[GAME_PLAY]; //3每位玩家胡牌次数
  1095. BYTE bFinish; //1是否结束本轮。0表示否,1表示是 163
  1096. BYTE bLeftCardCount; //1剩余牌数 164
  1097. BYTE bLeftCardDada[47]; //130剩余牌值
  1098. BYTE playGameNum; //打到第几局了
  1099. INT lGameScoreDetail[16 * GAME_PLAY]; //195流水详情
  1100. };
  1101. //用户准备
  1102. struct CMD_S_Reading
  1103. {
  1104. BYTE bReading;
  1105. WORD wChairID;
  1106. };
  1107. //用户托管
  1108. struct CMD_S_Trustee
  1109. {
  1110. bool bTrustee; //是否托管
  1111. WORD wChairID; //托管用户
  1112. };
  1113. //
  1114. struct CMD_S_ChiHu
  1115. {
  1116. //WORD wChiHuUser[3]; //胡牌人
  1117. BYTE wChiHuUser[GAME_PLAYER]; //下标胡牌人,值胡牌次数
  1118. WORD wProviderUser; //放炮人,只有自摸
  1119. BYTE cbChiHuCard; //胡牌数据
  1120. //BYTE TingPaiCard[MAX_COUNT]; //听牌数据
  1121. };
  1122. //积分变动
  1123. struct CMD_S_GangScore
  1124. {
  1125. WORD wChairId; //用户
  1126. int cbOperateCode; //操作代码
  1127. int lGangScore[GAME_PLAYER]; //杠积分算法,存得是每个用户积分变动情况
  1128. int cbWanJiaScore[GAME_PLAYER]; //玩家目前所拥有积分
  1129. };
  1130. struct CMD_S_DIGNQUE
  1131. {
  1132. BYTE cbDingQue[GAME_PLAYER];
  1133. };
  1134. struct CMD_S_HuanSanZhang
  1135. {
  1136. BYTE cbSice;
  1137. BYTE cbCard1[GAME_PLAYER];
  1138. BYTE cbCard2[GAME_PLAYER];
  1139. BYTE cbCard3[GAME_PLAYER];
  1140. WORD wChairID[GAME_PLAYER];
  1141. INT cbUserAction; //用户动作(0:没操作,0x08:碰牌,0x10:杠,0x80:自摸等)
  1142. BYTE ActionCard[3]; //动作所对应的牌
  1143. };
  1144. //游戏回放回放
  1145. struct GameRecordPacket
  1146. {
  1147. WORD wChairID;
  1148. WORD wMainCmdID;
  1149. WORD wSubCmdID;
  1150. WORD wSize;
  1151. void* pData;
  1152. };
  1153. struct ChairRecord
  1154. {
  1155. WORD wChairId; //椅子号
  1156. UINT32 dwUserId; //用户id
  1157. TCHAR userName[LEN_NICKNAME];//用户名
  1158. TCHAR headUrl[LEN_HEAD_URL]; //头像
  1159. };
  1160. struct CMD_GR_ReplayRecordResp
  1161. {
  1162. UINT32 m_UUID; //回放唯一ID
  1163. UINT32 m_tableID; //公开桌子号
  1164. UINT32 m_startTime; //游戏开始时间
  1165. UINT32 m_endTime; //游戏结束时间
  1166. UINT32 m_UserId; //用户ID
  1167. CMD_S_GameConfig m_gameconfig; //游戏基本配置
  1168. ChairRecord m_chairList[GAME_PLAYER]; //游戏椅子玩家信息
  1169. UINT16 m_recordCount; //回放数据记录数
  1170. char pData[0]; //回放记录列表(尾拖数据)
  1171. };
  1172. struct CMD_S_GameNotify
  1173. {
  1174. WORD m_wChairID; //
  1175. //UINT32 m_notifyType; //通知类型。1表示定缺,2表示换三张
  1176. };
  1177. struct CMD_S_YIWEI_HUA
  1178. {
  1179. BYTE bFlag;//表示是否成功(1表示成功,2表示牌值有问题,3表示开始位置失败,4表示开始成功结束失败)
  1180. BYTE StarIpOne;
  1181. BYTE StarIpTwo;
  1182. BYTE EndIpOne;
  1183. BYTE EndIpTwo;
  1184. BYTE CardData;
  1185. bool ToString(TCHAR* pBuffer, int iLen)
  1186. {
  1187. //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false;
  1188. TCHAR tempcard[255] = { 0 };
  1189. ZeroMemory(tempcard, 255 * sizeof(TCHAR));
  1190. #ifdef _UNICODE
  1191. _snwprintf(tempcard, 255, TEXT("移动牌命令->1成功2牌值问题3开始失败4结束失败:%d,开始位置:[%d][%d],结束位置:[%d][%d],牌值:%d"), bFlag, StarIpOne, StarIpTwo, EndIpOne, EndIpTwo, CardData);
  1192. #else
  1193. _snwprintf(tempcard, 255, TEXT("移动牌命令->1成功2牌值问题3开始失败4结束失败:%d,开始位置:[%d][%d],结束位置:[%d][%d],牌值:%d"), bFlag, StarIpOne, StarIpTwo, EndIpOne, EndIpTwo, CardData);
  1194. #endif
  1195. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  1196. return true;
  1197. }
  1198. };
  1199. //////////////////////////////////////////////////////////////////////////
  1200. //客户端命令结构
  1201. #define SUB_C_OUT_CARD 1 //出牌命令
  1202. #define SUB_C_OPERATE_CARD 3 //操作扑克
  1203. #define SUB_C_TRUSTEE 4 //用户托管
  1204. //#define SUB_C_QINGTONG 5 //请统操作
  1205. #define SUB_C_REPLAY 6 //回放
  1206. //#define SUB_C_DIGNQUE 5 //定缺,一脚耐油用不到
  1207. //#define SUB_C_READING 99 //用户准备
  1208. //#define SUB_C_TINGPAI 2 //听牌按钮
  1209. #define SUB_C_HUAN_SAN_ZHANG 7 //换三张,一脚耐油用不到
  1210. #define SUB_C_OUT_CARD_HUA 11 //花牌出牌命令
  1211. #define SUB_C_OPERATE_CARD_HUA 13 //花牌操作扑克
  1212. #define SUB_C_TRUSTEE_HUA 14 //花牌用户托管
  1213. #define SUB_C_YIWEI_HUA 15 //花牌手牌移位操作
  1214. #define SUB_C_REPLAY_HUA 16 //花牌回放
  1215. //出牌命令
  1216. struct CMD_C_OutCard
  1217. {
  1218. BYTE cbCardData; //扑克数据
  1219. bool ToString(TCHAR* pBuffer, int iLen)
  1220. {
  1221. //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false;
  1222. TCHAR tempcard[255] = { 0 };
  1223. ZeroMemory(tempcard, 255 * sizeof(TCHAR));
  1224. #ifdef _UNICODE
  1225. _snwprintf(tempcard, 255, TEXT("出牌命令->出牌牌值:%d"), cbCardData);
  1226. #else
  1227. _snwprintf(tempcard, 255, TEXT("出牌命令->出牌牌值:%d"), cbCardData);
  1228. #endif
  1229. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  1230. return true;
  1231. }
  1232. };
  1233. //出牌命令
  1234. struct CMD_C_OutCard_Hua
  1235. {
  1236. BYTE cbCardData; //扑克数据
  1237. BYTE cbCardWeiZhi; //起始位置
  1238. bool ToString(TCHAR* pBuffer, int iLen)
  1239. {
  1240. //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false;
  1241. TCHAR tempcard[255] = { 0 };
  1242. ZeroMemory(tempcard, 255 * sizeof(TCHAR));
  1243. #ifdef _UNICODE
  1244. _snwprintf(tempcard, 255, TEXT("出牌命令->出牌牌值:%d,位置%d"), cbCardData, cbCardWeiZhi);
  1245. #else
  1246. _snwprintf(tempcard, 255, TEXT("出牌命令->出牌牌值:%d,位置%d"), cbCardData, cbCardWeiZhi);
  1247. #endif
  1248. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  1249. return true;
  1250. }
  1251. };
  1252. //操作命令
  1253. struct CMD_C_OperateCard
  1254. {
  1255. INT cbOperateCode; //操作代码
  1256. BYTE cbOperateCard; //操作扑克
  1257. bool ToString(TCHAR* pBuffer, int iLen)
  1258. {
  1259. //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false;
  1260. TCHAR tempcard[255] = { 0 };
  1261. ZeroMemory(tempcard, 255 * sizeof(TCHAR));
  1262. #ifdef _UNICODE
  1263. _snwprintf(tempcard, 255, TEXT("操作命令->操作代码:%d,操作扑克:%d"), cbOperateCode, cbOperateCard);
  1264. #else
  1265. _snprintf(tempcard, 255, TEXT("操作命令->操作代码:%d,操作扑克:%d"), cbOperateCode, cbOperateCard);
  1266. #endif
  1267. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  1268. return true;
  1269. }
  1270. };
  1271. struct CMD_C_OperateCard_Hua
  1272. {
  1273. INT cbOperateCode; //操作代码
  1274. BYTE cbOperateCard; //操作扑克
  1275. BYTE cbHuaCard[4]; //前2 花牌 后2 别杠
  1276. bool ToString(TCHAR* pBuffer, int iLen)
  1277. {
  1278. //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false;
  1279. TCHAR tempcard[255] = { 0 };
  1280. ZeroMemory(tempcard, 255 * sizeof(TCHAR));
  1281. #ifdef _UNICODE
  1282. _snwprintf(tempcard, 255, TEXT("操作命令->操作代码:%d,操作扑克:%d,%d,%d,%d,%d"), cbOperateCode, cbOperateCard, cbHuaCard[0], cbHuaCard[1], cbHuaCard[2], cbHuaCard[3]);
  1283. #else
  1284. _snwprintf(tempcard, 255, TEXT("操作命令->操作代码:%d,操作扑克:%d,%d,%d,%d,%d"), cbOperateCode, cbOperateCard, cbHuaCard[0], cbHuaCard[1], cbHuaCard[2], cbHuaCard[3]);
  1285. #endif
  1286. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  1287. return true;
  1288. }
  1289. };
  1290. //用户托管
  1291. struct CMD_C_Trustee
  1292. {
  1293. bool bTrustee; //是否托管
  1294. };
  1295. enum Huase
  1296. {
  1297. Huase_wan = 0, //万字
  1298. Huase_tiao, //1条子
  1299. Huase_tong, //2筒字
  1300. };
  1301. //操作命令
  1302. struct CMD_C_DingQue
  1303. {
  1304. BYTE cbHuaSeCode; //花色代码 (0万子,1条 子,2筒字)
  1305. };
  1306. //花牌移位操作
  1307. struct CMD_C_YIWEI_HUA
  1308. {
  1309. BYTE cbStartIp; //从左到右,0-8个位置
  1310. BYTE cbEndIp; //从左到右,0-8个位置
  1311. BYTE cbOperateCard; //操作扑克
  1312. bool ToString(TCHAR* pBuffer, int iLen)
  1313. {
  1314. //if(sizeof(CMD_S_OperateNotify) * 8 > iLen) return false;
  1315. TCHAR tempcard[255] = { 0 };
  1316. ZeroMemory(tempcard, 255 * sizeof(TCHAR));
  1317. #ifdef _UNICODE
  1318. _snwprintf(tempcard, 255, TEXT("移位命令->开始位置:%d,结束位置:%d,操作扑克:%d"), cbStartIp, cbEndIp, cbOperateCard);
  1319. #else
  1320. _snwprintf(tempcard, 255, TEXT("移位命令->开始位置:%d,结束位置:%d,操作扑克:%d"), cbStartIp, cbEndIp, cbOperateCard);
  1321. #endif
  1322. StringCchCat(pBuffer, iLen / sizeof(TCHAR), tempcard);
  1323. return true;
  1324. }
  1325. };
  1326. //出牌命令
  1327. struct CMD_C_RePlay
  1328. {
  1329. UINT32 m_UUID; //回放记录ID
  1330. };
  1331. struct CMD_C_HuanSanZhang
  1332. {
  1333. byte cbCard1;
  1334. byte cbCard2;
  1335. byte cbCard3;
  1336. };
  1337. //////////////////////////////////////////////////////////////////////////
  1338. #pragma pack()
  1339. #endif