诸暨麻将添加redis
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

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