诸暨麻将添加redis
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

4132 lignes
135 KiB

  1. #include "StdAfx.h"
  2. #include "TableFrameSinkZhiPai.h"
  3. //构造函数
  4. TableFrameSinkZhiPai::TableFrameSinkZhiPai():m_GameLogic(this)
  5. {
  6. //游戏变量
  7. m_wBankerUser=INVALID_CHAIR;
  8. ZeroMemory(m_cbCardIndex, sizeof(m_cbCardIndex));
  9. ZeroMemory(m_cbHuaCardIndex, sizeof(m_cbHuaCardIndex));
  10. ZeroMemory(m_cbCardIndex_Tong, sizeof(m_cbCardIndex_Tong));//用户扑克,保存统的手牌
  11. ZeroMemory(m_cbHuaCardIndex_Tong, sizeof(m_cbHuaCardIndex_Tong));//三个用户手中各花牌的个数--不同局中,必须清空其值,保存统的手牌
  12. ZeroMemory(m_cbHuaWeaveCardIndex_Tong, sizeof(m_cbHuaWeaveCardIndex_Tong));//保存统组合的花牌
  13. ZeroMemory(m_cbGamePlayerHandCard, sizeof(m_cbGamePlayerHandCard));
  14. ZeroMemory(&m_gameConfig, sizeof(m_gameConfig));
  15. ZeroMemory(m_cbTongCount, sizeof(m_cbTongCount));//操作显示的分数
  16. ZeroMemory(m_cbOperateScore, sizeof(m_cbOperateScore));//操作显示的分数
  17. ZeroMemory(m_cbHuaWeaveCardIndex, sizeof(m_cbHuaWeaveCardIndex));
  18. ZeroMemory(m_bTrustee,sizeof(m_bTrustee));
  19. ZeroMemory( m_bPlayStatus,sizeof(m_bPlayStatus) );
  20. ZeroMemory(m_lGameScore, sizeof(m_lGameScore));
  21. ZeroMemory(m_lGameTatolScore, sizeof(m_lGameTatolScore));
  22. ZeroMemory(b_QingTong, sizeof(b_QingTong));
  23. ZeroMemory(m_cbDuiOperator, sizeof(m_cbDuiOperator));
  24. //出牌信息
  25. m_cbOutCardData=0;
  26. m_cbOutCardCount=0;
  27. m_wOutCardUser=INVALID_CHAIR;
  28. ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
  29. ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
  30. ZeroMemory(m_cbLastDisCardData, sizeof(m_cbLastDisCardData));
  31. ZeroMemory(m_cbLastDisCount, sizeof(m_cbLastDisCount));
  32. //发牌信息
  33. m_cbSendCardData=0;
  34. m_cbSendCardCount=0;
  35. m_cbLeftCardCount=0;
  36. ZeroMemory(m_cbRepertoryCard,sizeof(m_cbRepertoryCard));
  37. ZeroMemory(m_cbRepertoryCard_Two, sizeof(m_cbRepertoryCard_Two));
  38. ZeroMemory(m_cbRepertoryCard_One, sizeof(m_cbRepertoryCard_One));
  39. //运行变量
  40. m_cbProvideCard=0;
  41. m_wResumeUser=INVALID_CHAIR;
  42. m_wCurrentUser=INVALID_CHAIR;
  43. m_wProvideUser=INVALID_CHAIR;
  44. //状态变量
  45. m_bSendStatus=false;
  46. //用户状态
  47. ZeroMemory(m_bResponse,sizeof(m_bResponse));
  48. ZeroMemory(m_cbUserAction,sizeof(m_cbUserAction));
  49. ZeroMemory(m_cbOperateCard, sizeof(m_cbOperateCard));
  50. ZeroMemory(m_cbOperateCard_FuJia, sizeof(m_cbOperateCard_FuJia));
  51. ZeroMemory(m_cbPerformAction,sizeof(m_cbPerformAction));
  52. ZeroMemory(EsponseHuShu, sizeof(EsponseHuShu));//胡数
  53. ZeroMemory(EsponsePaPoShu, sizeof(EsponsePaPoShu));//爬坡数
  54. //组合扑克
  55. ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
  56. ZeroMemory(m_cbWeaveItemCount,sizeof(m_cbWeaveItemCount));
  57. ZeroMemory(m_cbWeaveItemCount_HuPai, sizeof(m_cbWeaveItemCount_HuPai));
  58. ZeroMemory(m_WeaveItemArray_HuPai, sizeof(m_WeaveItemArray_HuPai));
  59. ZeroMemory(&ChiHu, sizeof(ChiHu));
  60. //结束信息
  61. ZeroMemory(m_HuPai, sizeof(m_HuPai));
  62. ZeroMemory(m_HuPaiLiuShui, sizeof(m_HuPaiLiuShui));
  63. //组件变量
  64. m_pITableFrame=NULL;
  65. m_pGameServiceOption=NULL;
  66. //m_bReduceBean = false;
  67. for (int i = 0; i < GAME_PLAY; ++i)
  68. {
  69. m_lUserTmpScore[i] = TEMP_MAX_SCORE; //用户临时积分
  70. }
  71. bIsHuang = false;
  72. m_IsHu = false;
  73. return;
  74. }
  75. //析构函数
  76. TableFrameSinkZhiPai::~TableFrameSinkZhiPai(void)
  77. {
  78. }
  79. //接口查询
  80. void * TableFrameSinkZhiPai::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  81. {
  82. if ((Guid == IID_ITableFrameSink) && (InterfaceVersionCompare(dwQueryVer, VER_ITableFrameSinkZhiPai)))
  83. return static_cast<ITableFrameSink *>(this);
  84. QUERYINTERFACE(ITableUserAction, Guid, dwQueryVer);
  85. if ((Guid == IID_IUnknownEx) && (InterfaceVersionCompare(dwQueryVer, VER_IUnknownEx)))
  86. return static_cast<IUnknownEx *>(static_cast<ITableFrameSink *>(this));
  87. return NULL;
  88. }
  89. //初始化
  90. bool TableFrameSinkZhiPai::Initialization(IUnknownEx * pIUnknownEx)
  91. {
  92. //查询接口
  93. ASSERT(pIUnknownEx!=NULL);
  94. m_pITableFrame=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,ITableFrame);
  95. if (m_pITableFrame==NULL)
  96. return false;
  97. //获取参数
  98. m_pGameServiceOption=m_pITableFrame->GetGameServiceOption();
  99. ASSERT(m_pGameServiceOption!=NULL);
  100. //开始模式
  101. m_pITableFrame->SetStartMode(START_MODE_FULL_READY);
  102. return true;
  103. }
  104. //复位桌子
  105. VOID TableFrameSinkZhiPai::RepositionSink()
  106. {
  107. //游戏变量
  108. ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex));
  109. ZeroMemory(m_cbHuaCardIndex, sizeof(m_cbHuaCardIndex));
  110. ZeroMemory(m_cbCardIndex_Tong, sizeof(m_cbCardIndex_Tong));//用户扑克,保存统的手牌
  111. ZeroMemory(m_cbHuaCardIndex_Tong, sizeof(m_cbHuaCardIndex_Tong));//三个用户手中各花牌的个数--不同局中,必须清空其值,保存统的手牌
  112. ZeroMemory(m_cbHuaWeaveCardIndex_Tong, sizeof(m_cbHuaWeaveCardIndex_Tong));//保存统组合的花牌
  113. ZeroMemory(m_cbGamePlayerHandCard, sizeof(m_cbGamePlayerHandCard));
  114. ZeroMemory(m_cbHuaWeaveCardIndex, sizeof(m_cbHuaWeaveCardIndex));
  115. ZeroMemory(m_bTrustee,sizeof(m_bTrustee));
  116. ZeroMemory( m_lGameScore,sizeof(m_lGameScore) );
  117. ZeroMemory( m_bPlayStatus,sizeof(m_bPlayStatus) );
  118. ZeroMemory(b_QingTong, sizeof(b_QingTong));//请统
  119. ZeroMemory(m_cbDuiOperator, sizeof(m_cbDuiOperator));
  120. ZeroMemory(m_cbOperateScore, sizeof(m_cbOperateScore));//操作显示的分数
  121. ZeroMemory(m_cbTongCount, sizeof(m_cbTongCount));//操作显示的分数
  122. ZeroMemory(EsponseHuShu, sizeof(EsponseHuShu));//胡数
  123. ZeroMemory(EsponsePaPoShu, sizeof(EsponsePaPoShu));//爬坡数
  124. //出牌信息
  125. m_cbOutCardData=0;
  126. m_cbOutCardCount=0;
  127. m_wOutCardUser=INVALID_CHAIR;
  128. ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
  129. ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
  130. ZeroMemory(m_cbLastDisCardData, sizeof(m_cbLastDisCardData));
  131. ZeroMemory(m_cbLastDisCount, sizeof(m_cbLastDisCount));
  132. //发牌信息
  133. m_cbSendCardData=0;
  134. m_cbSendCardCount=0;
  135. m_cbLeftCardCount=0;
  136. ZeroMemory(m_cbRepertoryCard,sizeof(m_cbRepertoryCard));
  137. ZeroMemory(m_cbRepertoryCard_Two, sizeof(m_cbRepertoryCard_Two));
  138. ZeroMemory(m_cbRepertoryCard_One, sizeof(m_cbRepertoryCard_One));
  139. //运行变量
  140. m_cbProvideCard=0;
  141. m_wResumeUser=INVALID_CHAIR;
  142. m_wCurrentUser=INVALID_CHAIR;
  143. m_wProvideUser=INVALID_CHAIR;
  144. m_wBankerUser = INVALID_CHAIR;
  145. //状态变量
  146. m_bSendStatus=false;
  147. //用户状态
  148. ZeroMemory(m_bResponse,sizeof(m_bResponse));
  149. ZeroMemory(m_cbUserAction,sizeof(m_cbUserAction));
  150. ZeroMemory(m_cbOperateCard,sizeof(m_cbOperateCard));
  151. ZeroMemory(m_cbOperateCard_FuJia, sizeof(m_cbOperateCard_FuJia));
  152. ZeroMemory(m_cbPerformAction,sizeof(m_cbPerformAction));
  153. //组合扑克
  154. ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
  155. ZeroMemory(m_cbWeaveItemCount,sizeof(m_cbWeaveItemCount));
  156. ZeroMemory(m_cbWeaveItemCount_HuPai, sizeof(m_cbWeaveItemCount_HuPai));
  157. ZeroMemory(m_WeaveItemArray_HuPai, sizeof(m_WeaveItemArray_HuPai));
  158. ZeroMemory(&ChiHu, sizeof(ChiHu));
  159. //结束信息
  160. bIsHuang = false;
  161. m_IsHu = false;
  162. }
  163. bool TableFrameSinkZhiPai::RepayRecordStart()
  164. {
  165. m_bReplayRecordStart = true;
  166. for (GameRecordPacket grp : m_UserReplayRecord)
  167. {
  168. delete[] grp.pData;
  169. grp.pData = nullptr;
  170. }
  171. m_UserReplayRecord.clear();//不会释放内存
  172. m_UserReplayRecord.shrink_to_fit();//释放内存
  173. return true;
  174. }
  175. bool TableFrameSinkZhiPai::RepayRecordEnd()
  176. {
  177. if (!m_bReplayRecordStart)
  178. return false;
  179. m_bReplayRecordStart = false;
  180. CMD_GR_ReplayRecordResp urr;
  181. ZeroMemory(&urr, sizeof(CMD_GR_ReplayRecordResp));
  182. urr.m_UUID = 0;
  183. urr.m_UserId = 0;
  184. urr.m_startTime = time(0);
  185. urr.m_endTime = time(0);
  186. urr.m_gameconfig = m_gameConfig;
  187. //urr.m_UserId = pIServerUserItem->GetUserID();
  188. for (int j = 0; j < GAME_PLAY; ++j)
  189. {
  190. IServerUserItem * pIServerUserItem = m_pITableFrame->GetTableUserItem(j);
  191. if ((pIServerUserItem == NULL) /*|| (pIServerUserItem->IsClientReady() == false)*/)
  192. continue;
  193. auto& chairInfo = urr.m_chairList[j];
  194. chairInfo.dwUserId = pIServerUserItem->GetUserID();
  195. chairInfo.wChairId = pIServerUserItem->GetChairID();
  196. lstrcpy(chairInfo.userName, pIServerUserItem->GetNickName());
  197. lstrcpy(chairInfo.headUrl, pIServerUserItem->GetUserInfo ()->szHeadUrl);
  198. }
  199. urr.m_recordCount = m_UserReplayRecord.size();
  200. int GameRecordPacketSize = sizeof(GameRecordPacket) - sizeof(void*);//每条记录头长度
  201. int totalSize = sizeof(CMD_GR_ReplayRecordResp);//总记录头长度
  202. for (GameRecordPacket grp : m_UserReplayRecord)
  203. totalSize += (GameRecordPacketSize + grp.wSize);
  204. char* replyRecordData = new char[totalSize];
  205. ZeroMemory(replyRecordData, totalSize);
  206. CopyMemory(replyRecordData, &urr, sizeof(CMD_GR_ReplayRecordResp));
  207. int nOffset = sizeof(CMD_GR_ReplayRecordResp);
  208. for (GameRecordPacket grp : m_UserReplayRecord)
  209. {
  210. CopyMemory(replyRecordData + nOffset, &grp, GameRecordPacketSize);
  211. nOffset += GameRecordPacketSize;
  212. CopyMemory(replyRecordData + nOffset, grp.pData, grp.wSize);
  213. nOffset += grp.wSize;
  214. }
  215. m_pITableFrame->SaveReplayRecord(replyRecordData, totalSize);
  216. //delete replyRecordData;不能删除,已托管给SaveReplayRecord函数
  217. return true;
  218. }
  219. bool TableFrameSinkZhiPai::RepayRecord(WORD wChairID, WORD wSubCmdId, void* pData, WORD wSize)
  220. {
  221. //获取用户
  222. //char* pNewData = new char[wSize + sizeof(GameRecordPacket)];
  223. //memcpy(pNewData, pData, wSize); //修改BYJN 疑似内存溢出
  224. GameRecordPacket record;
  225. record.wSize = wSize;
  226. record.wChairID = wChairID;
  227. record.wSubCmdID = wSubCmdId;
  228. record.wMainCmdID = MDM_GF_GAME;
  229. record.pData = new char[wSize];
  230. CopyMemory(record.pData, pData, wSize);
  231. m_UserReplayRecord.push_back(record);
  232. return true;
  233. }
  234. //游戏开始
  235. bool TableFrameSinkZhiPai::OnEventGameStart()
  236. {
  237. //椅子数量
  238. WORD wChairCount = m_pITableFrame->GetChairCount();
  239. //开始记录回放数据
  240. RepayRecordStart();
  241. //重置发牌状态
  242. m_isCanOutCard = false;
  243. //重置掉线玩家列表
  244. m_offlineUsers.clear();
  245. //设置状态
  246. m_pITableFrame->SetGameStatus(GS_MJ_PLAY);
  247. m_gameConfig.wHadPlayCount++;
  248. if (1 == m_gameConfig.wHadPlayCount || m_wNextBankerUser == INVALID_CHAIR)
  249. {
  250. m_wBankerUser = 0;
  251. }
  252. else
  253. {
  254. m_wBankerUser = m_wNextBankerUser;
  255. }
  256. m_wNextBankerUser = INVALID_CHAIR;
  257. //分发扑克
  258. switch (bGameType)
  259. {
  260. case huapai:
  261. {
  262. m_cbLeftCardCount = m_GameLogic.RandCardData(m_cbRepertoryCard_Two, bGameType);
  263. BYTE byTest[112] = { 0 };
  264. if (m_GameLogic.PeiPai(byTest, MAX_REPERTORY_HUA_TWO))
  265. CopyMemory(m_cbRepertoryCard_Two, byTest, sizeof(byTest));
  266. for (WORD i = 0; i < GAME_PLAY; i++)
  267. {
  268. m_bPlayStatus[i] = true;
  269. m_cbLeftCardCount -= (MAX_COUNT_HUA - 1);//每一个玩家都发出去25张牌,还剩多少
  270. m_cbSendCardCount += (MAX_COUNT_HUA - 1);//每个玩家加25张牌
  271. m_GameLogic.SwitchToCardIndex(&m_cbRepertoryCard_Two[m_cbLeftCardCount], MAX_COUNT_HUA - 1, m_cbCardIndex[i]);
  272. //从牌数据数组中得到花牌个数
  273. m_GameLogic.GetHuaCard(&m_cbRepertoryCard_Two[m_cbLeftCardCount], MAX_COUNT_HUA - 1, m_cbHuaCardIndex[i]);
  274. }
  275. //发送扑克,庄家摸牌
  276. m_cbSendCardCount++;
  277. m_cbSendCardData = m_cbRepertoryCard_Two[--m_cbLeftCardCount];
  278. break;
  279. }
  280. case huapai2:
  281. {
  282. m_cbLeftCardCount = m_GameLogic.RandCardData(m_cbRepertoryCard_One, bGameType);
  283. BYTE byTest[111] = { 0 };
  284. if (m_GameLogic.PeiPai(byTest, MAX_REPERTORY_HUA_ONE))
  285. CopyMemory(m_cbRepertoryCard_One, byTest, sizeof(byTest));
  286. for (WORD i = 0; i < GAME_PLAY; i++)
  287. {
  288. m_bPlayStatus[i] = true;
  289. m_cbLeftCardCount -= (MAX_COUNT_HUA - 1);//每一个玩家都发出去25张牌,还剩多少
  290. m_cbSendCardCount += (MAX_COUNT_HUA - 1);//每个玩家加25张牌
  291. m_GameLogic.SwitchToCardIndex(&m_cbRepertoryCard_One[m_cbLeftCardCount], MAX_COUNT_HUA - 1, m_cbCardIndex[i]);
  292. //从牌数据数组中得到花牌个数
  293. m_GameLogic.GetHuaCard(&m_cbRepertoryCard_One[m_cbLeftCardCount], MAX_COUNT_HUA - 1, m_cbHuaCardIndex[i]);
  294. }
  295. //发送扑克,庄家摸牌
  296. m_cbSendCardCount++;
  297. m_cbSendCardData = m_cbRepertoryCard_One[--m_cbLeftCardCount];
  298. break;
  299. }
  300. case huapai3:
  301. {
  302. m_cbLeftCardCount = m_GameLogic.RandCardData(m_cbRepertoryCard, bGameType);
  303. BYTE byTest[110] = { 0 };
  304. if (m_GameLogic.PeiPai(byTest, MAX_REPERTORY_HUA))
  305. CopyMemory(m_cbRepertoryCard, byTest, sizeof(byTest));
  306. for (WORD i = 0; i < GAME_PLAY; i++)
  307. {
  308. m_bPlayStatus[i] = true;
  309. m_cbLeftCardCount -= (MAX_COUNT_HUA - 1);//每一个玩家都发出去25张牌,还剩多少
  310. m_cbSendCardCount += (MAX_COUNT_HUA - 1);//每个玩家加25张牌
  311. m_GameLogic.SwitchToCardIndex(&m_cbRepertoryCard[m_cbLeftCardCount], MAX_COUNT_HUA - 1, m_cbCardIndex[i]);
  312. //从牌数据数组中得到花牌个数
  313. m_GameLogic.GetHuaCard(&m_cbRepertoryCard[m_cbLeftCardCount], MAX_COUNT_HUA - 1, m_cbHuaCardIndex[i]);
  314. }
  315. //发送扑克,庄家摸牌
  316. m_cbSendCardCount++;
  317. m_cbSendCardData = m_cbRepertoryCard[--m_cbLeftCardCount];
  318. break;
  319. }
  320. default:
  321. return false;
  322. break;
  323. }
  324. BYTE TempIndex = m_GameLogic.SwitchToCardIndex(m_cbSendCardData);
  325. m_cbCardIndex[m_wBankerUser][TempIndex]++;//加入手牌
  326. //如果庄家牌是花牌,保存到庄家花牌索引数组中
  327. if ((m_cbSendCardData & 0x10) == 0x10)
  328. {
  329. m_cbHuaCardIndex[m_wBankerUser][TempIndex / 2]++;
  330. ASSERT(m_cbHuaCardIndex[m_wBankerUser][TempIndex / 2] <= 2);
  331. }
  332. ////分析三家的统,泛牌情况
  333. BYTE ActionCard[GAME_PLAY][6] = { 0 };
  334. tagGangCardResult_Hua GangCardResult[GAME_PLAY];
  335. ZeroMemory(&GangCardResult, sizeof(GangCardResult));
  336. WORD TempShangJia = ((m_wBankerUser + 2) % GAME_PLAY);
  337. for (WORD i = 0; i < GAME_PLAY; i++)
  338. {
  339. b_QingTong[TempShangJia] = true;
  340. m_cbUserAction[TempShangJia] |= m_GameLogic.AnalyseGangCard(m_cbCardIndex[TempShangJia], m_cbHuaCardIndex[TempShangJia], NULL, 0, GangCardResult[TempShangJia]);
  341. for (BYTE j = 0; j < GangCardResult[TempShangJia].cbCardCount; j++)
  342. {
  343. ActionCard[TempShangJia][j] = GangCardResult[TempShangJia].cbCardData[j];
  344. b_QingTong[TempShangJia] = false;
  345. }
  346. if (b_QingTong[TempShangJia] == false)
  347. {
  348. break;
  349. }
  350. if (TempShangJia == 0)
  351. {
  352. TempShangJia = 2;
  353. }
  354. else
  355. {
  356. TempShangJia--;
  357. }
  358. }
  359. //设置变量
  360. m_wProvideUser = m_wBankerUser;
  361. m_wCurrentUser = m_wBankerUser;
  362. m_cbProvideCard = m_cbSendCardData;
  363. m_wResumeUser = m_wCurrentUser;
  364. //构造数据
  365. CMD_S_GameStart_Hua GameStart;
  366. ZeroMemory(&GameStart, sizeof(GameStart));
  367. GameStart.wBankerUser = m_wBankerUser;
  368. GameStart.cbLeftCardCount = m_cbLeftCardCount;
  369. GameStart.cbTotalCardCount = bGameType == huapai3 ? MAX_REPERTORY_HUA : (bGameType == huapai2 ? MAX_REPERTORY_HUA_ONE : MAX_REPERTORY_HUA_TWO);
  370. GameStart.cbCurrPlay = m_gameConfig.wHadPlayCount;
  371. GameStart.cbOptTime = GAME_TIMEOUT;
  372. bool bAllHuanSanZhang = true;
  373. for (bool bSend : b_QingTong)
  374. {
  375. if (0 == bSend)
  376. {
  377. bAllHuanSanZhang = false;
  378. break;
  379. }
  380. }
  381. if (bAllHuanSanZhang || TempShangJia == m_wBankerUser)//起牌所有人都没有统,庄家可以出牌了,且庄家判断胡牌
  382. {
  383. //庄家可以出牌了
  384. m_cbUserAction[m_wBankerUser] |= WIK_BH_WJCP;
  385. // 胡牌判断
  386. tagHuCardResult chr;
  387. m_cbUserAction[m_wBankerUser] |= m_GameLogic.AnalyseHuCard(m_cbCardIndex[m_wBankerUser], m_cbHuaCardIndex[m_wBankerUser], 0, NULL, 0, m_cbHuaWeaveCardIndex[m_wBankerUser], 0, chr);
  388. }
  389. else
  390. {
  391. m_wCurrentUser = TempShangJia;
  392. if (TempShangJia == m_wBankerUser)
  393. {
  394. m_cbUserAction[m_wBankerUser] |= WIK_BH_WJCP;
  395. }
  396. }
  397. //发送数据
  398. for (WORD i = 0; i < GAME_PLAY; i++)
  399. {
  400. //设置变量
  401. GameStart.wCurrentUser = i;
  402. GameStart.cbUserAction = m_cbUserAction[i];
  403. CopyMemory(GameStart.ActionCard, ActionCard[i], sizeof(ActionCard[i]));
  404. GetPaiQiang(i, m_cbGamePlayerHandCard[i]);
  405. ZeroMemory(GameStart.cbCardData, sizeof(GameStart.cbCardData));
  406. CopyMemory(GameStart.cbCardData, m_cbGamePlayerHandCard[i], sizeof(m_cbGamePlayerHandCard[i]));
  407. //发送数据
  408. m_pITableFrame->SendTableData(i, SUB_S_GAME_START_HUA, &GameStart, sizeof(GameStart));
  409. }
  410. //用户回放
  411. ZeroMemory(GameStart.cbCardData, sizeof(GameStart.cbCardData));
  412. //清手牌 旁观只能发一次
  413. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_GAME_START_HUA, &GameStart, sizeof(GameStart));
  414. //记录回放
  415. for (BYTE i = 0; i < GAME_PLAY; i++)
  416. {
  417. m_GameLogic.SwitchToCardData(m_cbCardIndex[i], GameStart.cbCardData[i * 3], m_cbHuaCardIndex[i]);
  418. }
  419. RepayRecord(INVALID_CHAIR, SUB_S_GAME_START_HUA, &GameStart, sizeof(GameStart));
  420. if (!bAllHuanSanZhang)
  421. {
  422. CMD_S_QingTongNotify QingTong;
  423. ZeroMemory(&QingTong, sizeof(QingTong));
  424. QingTong.OperatorUser = TempShangJia;
  425. QingTong.cbActionMask = m_cbUserAction[TempShangJia];
  426. CopyMemory(QingTong.cbActionCard, ActionCard[TempShangJia], sizeof(ActionCard[TempShangJia]));
  427. //发送数据
  428. m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  429. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  430. }
  431. return true;
  432. }
  433. void TableFrameSinkZhiPai::DeletePrivateTable(bool bSendState)
  434. {
  435. tagScoreInfo ScoreInfoArray[GAME_PLAY];
  436. ZeroMemory(&ScoreInfoArray, sizeof(ScoreInfoArray));
  437. WORD wChairCount = m_pITableFrame->GetChairCount();
  438. for (int i = 0; i < wChairCount; ++i)
  439. {
  440. IServerUserItem *pIUserItem = m_pITableFrame->GetTableUserItem(i);
  441. if (pIUserItem == NULL)
  442. continue;
  443. ScoreInfoArray[i].cbType = SCORE_TYPE_END;
  444. ScoreInfoArray[i].lScore = m_lUserTmpScore[i] - TEMP_MAX_SCORE; //记录临时分
  445. }
  446. m_pITableFrame->WriteTableScore(ScoreInfoArray, CountArray(ScoreInfoArray));
  447. ConcludeGame(GAME_STATUS_DELETE, bSendState);
  448. m_pITableFrame->DeletePrivateTableNow();
  449. }
  450. //游戏结束
  451. bool TableFrameSinkZhiPai::OnEventGameConclude(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason, bool bSendState)
  452. {
  453. bool bFinish = (m_gameConfig.wHadPlayCount >= m_gameConfig.wPlayCountRule) ? 1 : 0;
  454. bool bDelete = false;
  455. switch (cbReason)
  456. {
  457. case GER_DELETE_PRIVATE:
  458. bFinish = 1;
  459. bDelete = true;
  460. if (!m_pITableFrame->IsGameStarted())
  461. {
  462. DeletePrivateTable(bSendState);
  463. return true;
  464. }
  465. //return true;
  466. //下坠
  467. case GER_NORMAL: //常规结束
  468. {
  469. CMD_S_GameEnd_Hua GameEnd;
  470. ZeroMemory(&GameEnd, sizeof(GameEnd));
  471. GameEnd.bFinish = bFinish;//1……
  472. GameEnd.bWanJiaId = wChairID;
  473. if (m_cbLeftCardCount == 0 || bDelete)//荒庄了或者海底捞月,怎么定义荒庄,
  474. {
  475. if (!bDelete)
  476. {
  477. GameEnd.bOptType = (bIsHuang == true ? 2 : 1);//庄荒了,需要返回信息
  478. }
  479. else
  480. GameEnd.bOptType = 3;
  481. if (GameEnd.bOptType == 1)
  482. {
  483. int TempDiScore = m_gameConfig.GameScoreType == 0 ? ((((ChiHu.bHuPoint - 17) / 5) + 2)*m_gameConfig.wDiScore) : (ChiHu.bHuPoint*m_gameConfig.wDiScore);
  484. GameEnd.HuShu = ChiHu.bHuPoint;
  485. GameEnd.ZhuGold = m_GameLogic.SwitchToCardData(ChiHu.bRealGold);
  486. BYTE TempWanJiaCardCount = 0;
  487. m_wNextBankerUser = wChairID;
  488. if (m_wProvideUser == wChairID)//自摸海底捞月
  489. {
  490. for (BYTE i = 0; i < GAME_PLAY; i++)
  491. {
  492. if (i == wChairID)continue;
  493. GameEnd.cbBianDongScore[i] = -TempDiScore;
  494. m_lGameScore[i] += GameEnd.cbBianDongScore[i];
  495. m_lGameTatolScore[i] += GameEnd.cbBianDongScore[i];
  496. }
  497. GameEnd.cbBianDongScore[wChairID] = 2 * TempDiScore;
  498. m_lGameScore[wChairID] += GameEnd.cbBianDongScore[wChairID];
  499. m_lGameTatolScore[wChairID] += GameEnd.cbBianDongScore[wChairID];
  500. }
  501. else//海底炮
  502. {
  503. GameEnd.bHuPaiCard = m_cbProvideCard;
  504. int TempScore = 0;
  505. for (BYTE i = 0; i < GAME_PLAY; i++)
  506. {
  507. if (i == wChairID)continue;
  508. if (i == m_wProvideUser)
  509. {
  510. GameEnd.cbBianDongScore[i] = - TempDiScore;
  511. m_lGameScore[i] += GameEnd.cbBianDongScore[i];
  512. m_lGameTatolScore[i] += GameEnd.cbBianDongScore[i];
  513. }
  514. else
  515. {
  516. GameEnd.cbBianDongScore[i] = (m_gameConfig.GameScoreType == 0 ? (-(TempDiScore - m_gameConfig.wDiScore)) : 0);
  517. m_lGameTatolScore[i] += GameEnd.cbBianDongScore[i];
  518. m_lGameScore[i] += GameEnd.cbBianDongScore[i];
  519. }
  520. TempScore -= GameEnd.cbBianDongScore[i];
  521. }
  522. GameEnd.cbBianDongScore[wChairID] = TempScore;
  523. m_lGameScore[wChairID] += GameEnd.cbBianDongScore[wChairID];
  524. m_lGameTatolScore[wChairID] += GameEnd.cbBianDongScore[wChairID];
  525. m_cbCardIndex[wChairID][m_GameLogic.SwitchToCardIndex(m_cbProvideCard)]++;
  526. if ((m_cbProvideCard & 0x10) == 0x10)
  527. {
  528. m_cbHuaCardIndex[wChairID][m_GameLogic.SwitchToCardIndex(m_cbProvideCard) / 2]++;
  529. ASSERT(m_cbHuaCardIndex[wChairID][m_GameLogic.SwitchToCardIndex(m_cbProvideCard) / 2] <= 2);
  530. }
  531. }
  532. for (WORD i = 0; i < GAME_PLAY; i++)
  533. {
  534. GameEnd.cbWanJiaScore[i] = m_lGameTatolScore[i];//各玩家积分3…………
  535. if (i == wChairID && m_wProvideUser == wChairID)continue;
  536. m_GameLogic.HeBingCardIndex(m_cbCardIndex[i], m_cbCardIndex_Tong[i], m_cbHuaCardIndex[i], m_cbHuaCardIndex_Tong[i]);
  537. GetGameEndCardIndex(i, GameEnd.cbCardIndex[i]);
  538. //m_GameLogic.SwitchToCardData(m_cbCardIndex[i], GameEnd.cbCardData[i], m_cbHuaCardIndex[i]);
  539. }
  540. if (m_wProvideUser == wChairID)
  541. {
  542. m_GameLogic.HeBingCardIndex(m_cbCardIndex[wChairID], m_cbCardIndex_Tong[wChairID], m_cbHuaCardIndex[wChairID], m_cbHuaCardIndex_Tong[wChairID]);
  543. GetGameEndCardIndex(wChairID, GameEnd.cbCardIndex[wChairID]);
  544. }
  545. GetGameEndPaiQiang(wChairID, GameEnd.YingJiaCard);
  546. }
  547. else
  548. {
  549. m_wNextBankerUser = (m_wBankerUser + 1) % GAME_PLAY;
  550. //if (wChairID == INVALID_CHAIR)
  551. // m_wNextBankerUser = m_wProvideUser;
  552. //黄庄了
  553. //统计玩家积分,牌值
  554. for (WORD i = 0; i < GAME_PLAY; i++)
  555. {
  556. GameEnd.cbWanJiaScore[i] = m_lGameTatolScore[i];//各玩家积分4…………
  557. m_GameLogic.HeBingCardIndex(m_cbCardIndex[i], m_cbCardIndex_Tong[i], m_cbHuaCardIndex[i], m_cbHuaCardIndex_Tong[i]);
  558. GetGameEndCardIndex(i, GameEnd.cbCardIndex[i]);
  559. }
  560. }
  561. }
  562. else //正常胡牌
  563. {
  564. GameEnd.bOptType = 1;
  565. BYTE TempWanJiaCardCount = 0;
  566. m_wNextBankerUser = wChairID;
  567. int TempDiScore = (m_gameConfig.GameScoreType == 0 ? ((((ChiHu.bHuPoint - 17) / 5) + 2)*m_gameConfig.wDiScore) : (ChiHu.bHuPoint*m_gameConfig.wDiScore));
  568. //int TempDiScore = (((ChiHu.bHuPoint - 17) / 5) + 2)*m_gameConfig.wDiScore;
  569. GameEnd.HuShu = ChiHu.bHuPoint;
  570. GameEnd.ZhuGold = m_GameLogic.SwitchToCardData(ChiHu.bRealGold);
  571. if (m_wProvideUser == wChairID)//自摸
  572. {
  573. for (BYTE i = 0; i < GAME_PLAY; i++)
  574. {
  575. if (i == wChairID)continue;
  576. GameEnd.cbBianDongScore[i] = -TempDiScore;
  577. m_lGameScore[i] += GameEnd.cbBianDongScore[i];
  578. m_lGameTatolScore[i] += GameEnd.cbBianDongScore[i];
  579. }
  580. GameEnd.cbBianDongScore[wChairID] = 2 * TempDiScore;
  581. m_lGameScore[wChairID] += GameEnd.cbBianDongScore[wChairID];
  582. m_lGameTatolScore[wChairID] += GameEnd.cbBianDongScore[wChairID];
  583. }
  584. else//炮
  585. {
  586. GameEnd.bHuPaiCard = m_cbProvideCard;
  587. int TempScore = 0;
  588. for (BYTE i = 0; i < GAME_PLAY; i++)
  589. {
  590. if (i == wChairID)continue;
  591. if (i == m_wProvideUser)
  592. {
  593. GameEnd.cbBianDongScore[i] = - TempDiScore;
  594. m_lGameScore[i] += GameEnd.cbBianDongScore[i];
  595. m_lGameTatolScore[i] += GameEnd.cbBianDongScore[i];
  596. }
  597. else
  598. {
  599. GameEnd.cbBianDongScore[i] = (m_gameConfig.GameScoreType == 0 ? (-(TempDiScore - m_gameConfig.wDiScore)) : 0); //-(TempDiScore - m_gameConfig.wDiScore);
  600. m_lGameTatolScore[i] += GameEnd.cbBianDongScore[i];
  601. m_lGameScore[i] += GameEnd.cbBianDongScore[i];
  602. }
  603. TempScore -= GameEnd.cbBianDongScore[i];
  604. }
  605. GameEnd.cbBianDongScore[wChairID] = TempScore;
  606. m_lGameScore[wChairID] += GameEnd.cbBianDongScore[wChairID];
  607. m_lGameTatolScore[wChairID] += GameEnd.cbBianDongScore[wChairID];
  608. m_cbCardIndex[wChairID][m_GameLogic.SwitchToCardIndex(m_cbProvideCard)]++;
  609. if ((m_cbProvideCard & 0x10) == 0x10)
  610. {
  611. m_cbHuaCardIndex[wChairID][m_GameLogic.SwitchToCardIndex(m_cbProvideCard) / 2]++;
  612. ASSERT(m_cbHuaCardIndex[wChairID][m_GameLogic.SwitchToCardIndex(m_cbProvideCard) / 2] <= 2);
  613. }
  614. }
  615. //积分总变动
  616. for (BYTE i = 0; i < GAME_PLAY; i++)
  617. {
  618. GameEnd.cbWanJiaScore[i] = m_lGameTatolScore[i];//各玩家积分3…………
  619. if (i == wChairID && m_wProvideUser == wChairID)continue;
  620. m_GameLogic.HeBingCardIndex(m_cbCardIndex[i], m_cbCardIndex_Tong[i], m_cbHuaCardIndex[i], m_cbHuaCardIndex_Tong[i]);
  621. GetGameEndCardIndex(i, GameEnd.cbCardIndex[i]);
  622. }
  623. if (m_wProvideUser == wChairID)
  624. {
  625. m_GameLogic.HeBingCardIndex(m_cbCardIndex[wChairID], m_cbCardIndex_Tong[wChairID], m_cbHuaCardIndex[wChairID], m_cbHuaCardIndex_Tong[wChairID]);
  626. GetGameEndCardIndex(wChairID, GameEnd.cbCardIndex[wChairID]);
  627. }
  628. GetGameEndPaiQiang( wChairID, GameEnd.YingJiaCard);
  629. }
  630. CopyMemory(GameEnd.bZimo, m_HuPai, sizeof(m_HuPai));//玩家胡牌次数
  631. GameEnd.bLeftCardCount = m_cbLeftCardCount;//剩余牌输量
  632. switch (bGameType)
  633. {
  634. case huapai:
  635. {
  636. CopyMemory(GameEnd.bLeftCardDada, m_cbRepertoryCard_Two, m_cbLeftCardCount);//剩余牌值
  637. break;
  638. }
  639. case huapai2:
  640. {
  641. CopyMemory(GameEnd.bLeftCardDada, m_cbRepertoryCard_One, m_cbLeftCardCount);//剩余牌值
  642. break;
  643. }
  644. case huapai3:
  645. {
  646. CopyMemory(GameEnd.bLeftCardDada, m_cbRepertoryCard, m_cbLeftCardCount);//剩余牌值
  647. break;
  648. }
  649. default:
  650. ASSERT(false);
  651. break;
  652. }
  653. GameEnd.playGameNum = m_gameConfig.wHadPlayCount;//得到第几局了,
  654. for (BYTE i = 0; i < GAME_PLAY; i++)
  655. {
  656. m_HuPaiLiuShui[(m_gameConfig.wHadPlayCount - 1) * 3 + i] = m_lGameScore[i];
  657. }
  658. CopyMemory(GameEnd.lGameScoreDetail, m_HuPaiLiuShui, sizeof(m_HuPaiLiuShui));//游戏流水,10…………
  659. //数据处理
  660. int iSendLen = 0;
  661. CMD_S_GameEnd_Hua GameEndBuffer;
  662. BYTE *pOutData = (BYTE *)&GameEndBuffer;
  663. BYTE *pInData = (BYTE *)&GameEnd;
  664. ZeroMemory(&GameEndBuffer, sizeof(GameEndBuffer));
  665. CopyMemory(pOutData, &GameEnd, 164);
  666. iSendLen = iSendLen + 164;
  667. pInData = pInData + 164;
  668. pOutData = pOutData + 164;
  669. BYTE *pData = (BYTE *)&GameEnd;
  670. BYTE bNum = GameEnd.bLeftCardCount;
  671. CopyMemory(pOutData, pInData, bNum);
  672. iSendLen = iSendLen + bNum;
  673. pOutData = pOutData + bNum;
  674. pInData = pInData + CountArray(GameEnd.bLeftCardDada);
  675. bNum = GameEnd.playGameNum;
  676. pOutData[0] = bNum;
  677. pInData++;
  678. pOutData++;
  679. iSendLen = iSendLen + bNum * 4 * GAME_PLAY + 1;
  680. CopyMemory(pOutData, pInData, bNum * 4 * GAME_PLAY);
  681. m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_GAME_END_HUA, &GameEndBuffer, iSendLen);
  682. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_GAME_END_HUA, &GameEndBuffer, iSendLen);
  683. for (BYTE i = 0; i < GAME_PLAY; i++)
  684. {
  685. GameEndBuffer.cbWanJiaScore[i] = m_lGameScore[i];
  686. }
  687. RepayRecord(INVALID_CHAIR, SUB_S_GAME_END_HUA, &GameEndBuffer, iSendLen);
  688. //发送结束信息
  689. tagScoreInfo ScoreInfoArray[GAME_PLAY];
  690. ZeroMemory(&ScoreInfoArray, sizeof(ScoreInfoArray));
  691. for (WORD i = 0; i < GAME_PLAY; i++)
  692. {
  693. IServerUserItem *pUserItem = m_pITableFrame->GetTableUserItem(i);
  694. if (NULL == pUserItem) continue;
  695. BYTE ScoreKind;
  696. if (m_lGameScore[i] > 0L) ScoreKind = SCORE_TYPE_WIN;
  697. else if (m_lGameScore[i] < 0L) ScoreKind = SCORE_TYPE_LOSE;
  698. else ScoreKind = SCORE_TYPE_DRAW;
  699. ScoreInfoArray[i].lScore = m_lGameScore[i];
  700. ScoreInfoArray[i].cbType = ScoreKind;
  701. }
  702. m_pITableFrame->WriteTableScore(ScoreInfoArray, CountArray(ScoreInfoArray));
  703. ConcludeGame(GS_MJ_FREE);
  704. if (!bDelete)
  705. {
  706. if (bFinish)
  707. {
  708. DeletePrivateTable(true);
  709. }
  710. }
  711. else
  712. {
  713. if (bFinish)
  714. {
  715. DeletePrivateTable(bSendState);
  716. }
  717. }
  718. return true;
  719. }
  720. case GER_DISMISS: //游戏解散
  721. {
  722. //变量定义
  723. CMD_S_GameEnd_Hua GameEnd;
  724. ZeroMemory(&GameEnd, sizeof(GameEnd));
  725. GameEnd.bFinish = 1;
  726. GameEnd.bOptType = 3;
  727. CopyMemory(GameEnd.bZimo, m_HuPai, sizeof(m_HuPai));
  728. CopyMemory(GameEnd.cbWanJiaScore, m_lGameTatolScore, sizeof(m_lGameTatolScore));
  729. //GameEnd.dwOwnerID = m_pITableFrame->GetPrivateTableOwnerID();
  730. GameEnd.playGameNum = m_gameConfig.wHadPlayCount;
  731. CopyMemory(GameEnd.lGameScoreDetail, m_HuPaiLiuShui, sizeof(m_HuPaiLiuShui));
  732. RepayRecord(INVALID_CHAIR, SUB_S_GAME_END_HUA, &GameEnd, sizeof(GameEnd));
  733. //发送信息
  734. m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_GAME_END_HUA, &GameEnd, sizeof(GameEnd));
  735. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_GAME_END_HUA, &GameEnd, sizeof(GameEnd));
  736. ConcludeGame(GS_MJ_FREE);
  737. return true;
  738. }
  739. case GER_NETWORK_ERROR: //网络错误
  740. case GER_USER_LEAVE: //用户强退
  741. {
  742. DWORD dwUserID = pIServerUserItem->GetUserID();
  743. m_offlineUsers.push_back(dwUserID);
  744. return true;
  745. }
  746. }
  747. //错误断言
  748. ASSERT(FALSE);
  749. return false;
  750. }
  751. //发送场景duanxian
  752. bool TableFrameSinkZhiPai::OnEventSendGameScene(WORD wChiarID, IServerUserItem * pIServerUserItem, BYTE cbGameStatus, bool bSendSecret)
  753. {
  754. if (wChiarID > 2)return false;
  755. switch (cbGameStatus)
  756. {
  757. case GS_MJ_FREE: //空闲状态
  758. {
  759. //变量定义
  760. CMD_S_StatusFree StatusFree;
  761. memset(&StatusFree, 0, sizeof(StatusFree));
  762. //游戏房主基础配置
  763. CopyMemory(&StatusFree.gameConfig, &m_gameConfig, sizeof(CMD_S_GameConfig));
  764. for (int i = 0; i < GAME_PLAY; i++)
  765. {
  766. StatusFree.lUserTmpScore[i] = (INT)m_lGameTatolScore[i];
  767. }
  768. StatusFree.gameConfig.IsOwner = m_pITableFrame->GetPrivateTableOwnerID() == pIServerUserItem->GetUserID() ? 1 : 0;
  769. //构造数据
  770. StatusFree.UserStat = pIServerUserItem->GetUserInfo()->cbUserStatus;
  771. //发送场景
  772. return m_pITableFrame->SendGameScene(pIServerUserItem, &StatusFree, sizeof(StatusFree));
  773. }
  774. case GS_MJ_PLAY: //游戏状态
  775. {
  776. //变量定义
  777. CMD_S_StatusPlay_Hua StatusPlay;
  778. memset(&StatusPlay, 0, sizeof(StatusPlay));
  779. //游戏房主基础配置
  780. CopyMemory(&StatusPlay.gameConfig, &m_gameConfig, sizeof(CMD_S_GameConfig));
  781. CopyMemory(StatusPlay.lUserTmpScore, m_lGameTatolScore, sizeof(m_lGameTatolScore));
  782. switch (bGameType)
  783. {
  784. case(huapai) :
  785. {
  786. StatusPlay.cbTotalCardCount = MAX_REPERTORY_HUA_TWO;
  787. break;
  788. }
  789. case(huapai2) :
  790. {
  791. StatusPlay.cbTotalCardCount = MAX_REPERTORY_HUA_ONE;
  792. break;
  793. }
  794. case(huapai3) :
  795. {
  796. StatusPlay.cbTotalCardCount = MAX_REPERTORY_HUA;
  797. break;
  798. }
  799. default:break;
  800. }
  801. StatusPlay.cbLeftCardCount = m_cbLeftCardCount;
  802. StatusPlay.gameConfig.IsOwner = m_pITableFrame->GetPrivateTableOwnerID() == pIServerUserItem->GetUserID() ? 1 : 0;
  803. //游戏变量
  804. StatusPlay.wBankerUser = m_wBankerUser;
  805. CopyMemory(StatusPlay.cbDiscardCard, m_cbDiscardCard, sizeof(StatusPlay.cbDiscardCard));
  806. CopyMemory(StatusPlay.cbDiscardCount, m_cbDiscardCount, sizeof(StatusPlay.cbDiscardCount));
  807. CopyMemory(StatusPlay.GameScore, m_cbOperateScore, sizeof(m_cbOperateScore));
  808. StatusPlay.totalOptTime = 10;
  809. StatusPlay.leftOptTime = 0;
  810. //组合扑克
  811. for (BYTE i = 0; i < GAME_PLAY; i++)
  812. {
  813. StatusPlay.lSiZi[i] = m_cbTongCount[i];
  814. if (i == wChiarID)
  815. {
  816. CopyMemory(StatusPlay.WeaveItemArray[i], m_WeaveItemArray[i], sizeof(m_WeaveItemArray[i]));
  817. StatusPlay.cbWeaveCount[i] = m_cbWeaveItemCount[i];
  818. }
  819. else
  820. {
  821. CopyMemory(StatusPlay.WeaveItemArray[i], m_WeaveItemArray_HuPai[i], sizeof(m_WeaveItemArray_HuPai[i]));
  822. StatusPlay.cbWeaveCount[i] = m_cbWeaveItemCount_HuPai[i];
  823. }
  824. }
  825. for (BYTE i = 0; i < GAME_PLAY; i++)
  826. {
  827. StatusPlay.cbCardCount[i] = m_GameLogic.GetCardCount(m_cbCardIndex[i]);
  828. }
  829. if (IsEqual(wChiarID))//手牌数据
  830. {
  831. CopyMemory(StatusPlay.cbCardData, m_cbGamePlayerHandCard[wChiarID], sizeof(m_cbGamePlayerHandCard[wChiarID]));
  832. }
  833. else
  834. {
  835. if (GetPaiQiang(wChiarID, StatusPlay.cbCardData))
  836. CopyMemory(m_cbGamePlayerHandCard[wChiarID], StatusPlay.cbCardData, sizeof(StatusPlay.cbCardData));
  837. else
  838. CopyMemory(StatusPlay.cbCardData, m_cbGamePlayerHandCard[wChiarID], sizeof(m_cbGamePlayerHandCard[wChiarID]));
  839. }
  840. StatusPlay.cbActionMask = m_cbUserAction[wChiarID]; //需要用到操作码
  841. if (StatusPlay.cbActionMask&(WIK_ZI_MO | WIK_CHI_HU))
  842. {
  843. StatusPlay.HuShu = EsponseHuShu[wChiarID];
  844. StatusPlay.PaPoShu = EsponsePaPoShu[wChiarID];
  845. }
  846. if (m_cbUserAction[wChiarID])
  847. {
  848. tagGangCardResult_Hua GangCardResult;
  849. ZeroMemory(&GangCardResult, sizeof(GangCardResult));
  850. m_GameLogic.AnalyseGangCard(m_cbCardIndex[wChiarID], m_cbHuaCardIndex[wChiarID], m_WeaveItemArray[wChiarID], m_cbWeaveItemCount[wChiarID], GangCardResult);
  851. for (BYTE i = 0; i < GangCardResult.cbCardCount; i++)
  852. {
  853. StatusPlay.gangCards[i] = GangCardResult.cbCardData[i];
  854. }
  855. }
  856. //当前到谁家
  857. StatusPlay.wCurrentUser = (m_wCurrentUser == INVALID_CHAIR ? m_wProvideUser : m_wCurrentUser);
  858. BYTE OldUser = INVALID_CHAIR;//定义一个最后出牌用户
  859. if (m_cbOutCardCount == 0 && m_wCurrentUser != m_wProvideUser)
  860. {
  861. //发送场景
  862. if (m_wCurrentUser == wChiarID&&wChiarID == m_wBankerUser)
  863. {
  864. StatusPlay.cbActionMask |= WIK_BH_WJCP;
  865. }
  866. return m_pITableFrame->SendGameScene(pIServerUserItem, &StatusPlay, sizeof(StatusPlay));
  867. }
  868. if (m_cbOutCardCount == 0 && m_wCurrentUser == m_wProvideUser)
  869. {
  870. if (m_wCurrentUser == wChiarID && wChiarID == m_wBankerUser && m_cbUserAction[wChiarID] == WIK_NULL)
  871. {
  872. StatusPlay.cbActionMask |= WIK_BH_WJCP;
  873. }
  874. //发送场景
  875. return m_pITableFrame->SendGameScene(pIServerUserItem, &StatusPlay, sizeof(StatusPlay));
  876. }
  877. else
  878. {
  879. if (m_wProvideUser == m_wCurrentUser&&m_wOutCardUser == INVALID_CHAIR)//牌权是摸牌得且没出牌
  880. {
  881. if (m_wProvideUser == 0)
  882. {
  883. OldUser = 2;
  884. }
  885. else
  886. OldUser = m_wProvideUser - 1;
  887. BYTE TempIndex = 0;
  888. for (BYTE i = 0; i < 15; i++)
  889. {
  890. if (m_cbDiscardCard[OldUser][i] == 0)
  891. {
  892. TempIndex = i - 1;
  893. break;
  894. }
  895. }
  896. if (TempIndex >= 15)TempIndex = 0;
  897. StatusPlay.bPutCardData[OldUser] = m_cbDiscardCard[OldUser][TempIndex];
  898. }
  899. if (m_wProvideUser == m_wOutCardUser && m_wCurrentUser == INVALID_CHAIR)//当有人可以碰且没有碰时候
  900. {
  901. StatusPlay.bPutCardData[m_wProvideUser] = m_cbProvideCard;
  902. StatusPlay.cbDiscardCard[m_wProvideUser][StatusPlay.cbDiscardCount[m_wProvideUser]++] = m_cbProvideCard;
  903. }
  904. if (wChiarID == StatusPlay.wCurrentUser&&m_wCurrentUser != INVALID_CHAIR&&m_wCurrentUser != m_wProvideUser)//表示当前牌权就在断线玩家手里,且是轮到他出牌(牌权碰来得)
  905. {
  906. StatusPlay.cbActionMask |= WIK_BH_WJCP;
  907. }
  908. if (wChiarID == StatusPlay.wCurrentUser && m_wCurrentUser != INVALID_CHAIR && m_wCurrentUser == m_wProvideUser)//牌权是轮到他抓牌,未打出
  909. {
  910. StatusPlay.cbActionMask |= WIK_BH_WJCP;
  911. //ZeroMemory(StatusPlay.cbCardData, sizeof(StatusPlay.cbCardData));
  912. //BYTE TempCardData[MAX_INDEX_HUA];
  913. //BYTE TempCardHuaData[5];
  914. //CopyMemory(TempCardData, m_cbCardIndex[wChiarID], sizeof(TempCardData));
  915. //CopyMemory(TempCardHuaData, m_cbHuaCardIndex[wChiarID], sizeof(TempCardHuaData));
  916. //BYTE TempCardIndex = m_GameLogic.SwitchToCardIndex(m_cbProvideCard);
  917. //if (m_cbCardIndex[wChiarID][TempCardIndex] == 0)
  918. //{
  919. // ASSERT(false);
  920. // return false;
  921. //}
  922. //if ((m_cbProvideCard & 0x10) == 0x10)
  923. //{
  924. // if (m_cbHuaCardIndex[wChiarID][TempCardIndex / 2] == 0)
  925. // {
  926. // ASSERT(false);
  927. // return false;
  928. // }
  929. // TempCardHuaData[TempCardIndex / 2]--;
  930. //}
  931. //TempCardData[TempCardIndex]--;
  932. //BYTE cardNum = m_GameLogic.SwitchToCardData(TempCardData, StatusPlay.cbCardData, TempCardHuaData);
  933. //StatusPlay.cbCardData[cardNum] = m_cbProvideCard;//处理得到最后一张牌数据放最后
  934. }
  935. //发送场景
  936. return m_pITableFrame->SendGameScene(pIServerUserItem, &StatusPlay, sizeof(StatusPlay));
  937. }
  938. }
  939. default:return false;
  940. }
  941. return false;
  942. }
  943. //定时器事件
  944. bool TableFrameSinkZhiPai::OnTimerMessage(DWORD wTimerID, WPARAM wBindParam)
  945. {
  946. return false;
  947. }
  948. //游戏消息处理
  949. void TableFrameSinkZhiPai::SetGameConfig(VOID * pDataBuffer, WORD wDataSize, std::wstring sPrivateRoomId)
  950. {
  951. tagGameConfig* ppConfig = (tagGameConfig*)pDataBuffer;
  952. m_gameConfig.wSubGameID = ppConfig->wSubGameID;
  953. m_gameConfig.wDiScore = ppConfig->wPlayRule;
  954. m_gameConfig.wFanFei = ppConfig->wMaxFanRule;
  955. m_gameConfig.wIpLimit = ppConfig->wMaxScore;
  956. m_gameConfig.wPlayCountRule = ppConfig->wPlayCountRule;
  957. m_gameConfig.RoomId = ppConfig->wHadPlayCount;
  958. m_gameConfig.wHadPlayCount = 0;
  959. lstrcpy(m_gameConfig.sPrivateTableID, sPrivateRoomId.c_str());
  960. bGameType = m_gameConfig.wSubGameID;
  961. m_gameConfig.GameScoreType = ppConfig->bDuoLai;
  962. m_pITableFrame->SetChairCount(GAME_PLAY);
  963. ASSERT(m_gameConfig.wSubGameID >= 0 && m_gameConfig.wSubGameID < MahJongType::count);
  964. }
  965. //游戏消息处理
  966. bool TableFrameSinkZhiPai::OnGameMessage(WORD wSubCmdID, VOID* pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
  967. {
  968. switch (wSubCmdID)
  969. {
  970. case SUB_C_OUT_CARD_HUA: //出牌消息
  971. {
  972. //效验消息
  973. /*ASSERT(wDataSize == sizeof(CMD_C_OutCard));
  974. if (wDataSize != sizeof(CMD_C_OutCard)) return false;*/
  975. //用户效验
  976. if (pIServerUserItem->GetUserStatus() != US_PLAYING) return true;
  977. //消息处理
  978. CMD_C_OutCard_Hua * pOutCard = (CMD_C_OutCard_Hua *)pDataBuffer;
  979. return OnUserOutCard(pIServerUserItem->GetChairID(), pOutCard->cbCardData, pOutCard->cbCardWeiZhi);
  980. }
  981. case SUB_C_OPERATE_CARD_HUA: //操作消息
  982. {
  983. //效验消息
  984. ASSERT(wDataSize == sizeof(CMD_C_OperateCard_Hua));
  985. if (wDataSize != sizeof(CMD_C_OperateCard_Hua)) return false;
  986. //用户效验
  987. if (pIServerUserItem->GetUserStatus() != US_PLAYING) return true;
  988. //消息处理
  989. CMD_C_OperateCard_Hua * pOperateCard = (CMD_C_OperateCard_Hua *)pDataBuffer;
  990. return OnUserOperateCard(pIServerUserItem->GetChairID(), pOperateCard->cbOperateCode, pOperateCard->cbOperateCard, pOperateCard->cbHuaCard);
  991. }
  992. case SUB_C_TRUSTEE_HUA: //托管
  993. {
  994. CMD_C_Trustee *pTrustee = (CMD_C_Trustee *)pDataBuffer;
  995. if (wDataSize != sizeof(CMD_C_Trustee)) return false;
  996. m_bTrustee[pIServerUserItem->GetChairID()] = pTrustee->bTrustee;
  997. CMD_S_Trustee Trustee;
  998. Trustee.bTrustee = pTrustee->bTrustee;
  999. Trustee.wChairID = pIServerUserItem->GetChairID();
  1000. RepayRecord(INVALID_CHAIR, SUB_S_TRUSTEE, &Trustee, sizeof(Trustee));
  1001. m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_TRUSTEE, &Trustee, sizeof(Trustee));
  1002. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_TRUSTEE, &Trustee, sizeof(Trustee));
  1003. return true;
  1004. }
  1005. case SUB_C_YIWEI_HUA: //玩家手牌移位操作
  1006. {
  1007. //效验消息
  1008. ASSERT(wDataSize == sizeof(CMD_C_YIWEI_HUA));
  1009. if (wDataSize != sizeof(CMD_C_YIWEI_HUA)) return false;
  1010. WORD wChairID = pIServerUserItem->GetChairID();
  1011. if (wChairID > 3)return false;
  1012. CMD_C_YIWEI_HUA * pYiWei = (CMD_C_YIWEI_HUA *)pDataBuffer;
  1013. BYTE TempStartIndex = 0xFF;
  1014. BYTE TempEndIndex = 0xFF;
  1015. if (!m_GameLogic.IsValidCard(pYiWei->cbOperateCard))
  1016. {
  1017. CMD_S_YIWEI_HUA YIWEI;
  1018. YIWEI.bFlag = 2;
  1019. YIWEI.StarIpOne = pYiWei->cbStartIp;
  1020. YIWEI.StarIpTwo = TempStartIndex;
  1021. YIWEI.EndIpOne = pYiWei->cbEndIp;
  1022. YIWEI.EndIpTwo = TempEndIndex;
  1023. YIWEI.CardData = pYiWei->cbOperateCard;
  1024. m_pITableFrame->SendTableData(wChairID, SUB_S_YI_WEI_HUA, &YIWEI, sizeof(YIWEI));
  1025. ASSERT(false);
  1026. return false;
  1027. }
  1028. for (BYTE i = 0; i < 9; i++)
  1029. {
  1030. if (m_cbGamePlayerHandCard[wChairID][pYiWei->cbStartIp][i] == pYiWei->cbOperateCard)
  1031. {
  1032. if (i == 8)
  1033. {
  1034. m_cbGamePlayerHandCard[wChairID][pYiWei->cbStartIp][i] = 0;
  1035. }
  1036. else
  1037. {
  1038. for (BYTE j = i; j < 8; j++)
  1039. {
  1040. m_cbGamePlayerHandCard[wChairID][pYiWei->cbStartIp][j] = m_cbGamePlayerHandCard[wChairID][pYiWei->cbStartIp][j + 1];
  1041. if (m_cbGamePlayerHandCard[wChairID][pYiWei->cbStartIp][8] != 0 && j == 7)
  1042. {
  1043. m_cbGamePlayerHandCard[wChairID][pYiWei->cbStartIp][8] = 0;
  1044. }
  1045. }
  1046. }
  1047. TempStartIndex = i;
  1048. break;
  1049. }
  1050. }
  1051. if (TempStartIndex == 0xFF)
  1052. {
  1053. CMD_S_YIWEI_HUA YIWEI;
  1054. YIWEI.bFlag = 3;
  1055. YIWEI.StarIpOne = pYiWei->cbStartIp;
  1056. YIWEI.StarIpTwo = TempStartIndex;
  1057. YIWEI.EndIpOne = pYiWei->cbEndIp;
  1058. YIWEI.EndIpTwo = TempEndIndex;
  1059. YIWEI.CardData = pYiWei->cbOperateCard;
  1060. m_pITableFrame->SendTableData(wChairID, SUB_S_YI_WEI_HUA, &YIWEI, sizeof(YIWEI));
  1061. ASSERT(false);
  1062. return false;
  1063. }
  1064. for (BYTE i = 0; i < 9; i++)
  1065. {
  1066. if (m_cbGamePlayerHandCard[wChairID][pYiWei->cbEndIp][i] == 0)
  1067. {
  1068. m_cbGamePlayerHandCard[wChairID][pYiWei->cbEndIp][i] = pYiWei->cbOperateCard;
  1069. TempEndIndex = i;
  1070. break;
  1071. }
  1072. }
  1073. if (TempEndIndex == 0xFF)
  1074. {
  1075. for (BYTE i = 0; i < 9; i++)
  1076. {
  1077. if (m_cbGamePlayerHandCard[wChairID][pYiWei->cbStartIp][i] == 0)
  1078. {
  1079. m_cbGamePlayerHandCard[wChairID][pYiWei->cbStartIp][i] = pYiWei->cbOperateCard;
  1080. break;
  1081. }
  1082. }
  1083. CMD_S_YIWEI_HUA YIWEI;
  1084. YIWEI.bFlag = 4;
  1085. YIWEI.StarIpOne = pYiWei->cbStartIp;
  1086. YIWEI.StarIpTwo = TempStartIndex;
  1087. YIWEI.EndIpOne = pYiWei->cbEndIp;
  1088. YIWEI.EndIpTwo = TempEndIndex;
  1089. YIWEI.CardData = pYiWei->cbOperateCard;
  1090. m_pITableFrame->SendTableData(wChairID, SUB_S_YI_WEI_HUA, &YIWEI, sizeof(YIWEI));
  1091. ASSERT(false);
  1092. return false;
  1093. }
  1094. else
  1095. {
  1096. CMD_S_YIWEI_HUA YIWEI;
  1097. YIWEI.bFlag = 1;
  1098. YIWEI.StarIpOne = pYiWei->cbStartIp;
  1099. YIWEI.StarIpTwo = TempStartIndex;
  1100. YIWEI.EndIpOne = pYiWei->cbEndIp;
  1101. YIWEI.EndIpTwo = TempEndIndex;
  1102. YIWEI.CardData = pYiWei->cbOperateCard;
  1103. m_pITableFrame->SendTableData(wChairID, SUB_S_YI_WEI_HUA, &YIWEI, sizeof(YIWEI));
  1104. return true;
  1105. }
  1106. }
  1107. return false;
  1108. }
  1109. return false;
  1110. }
  1111. //框架消息处理
  1112. bool TableFrameSinkZhiPai::OnFrameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
  1113. {
  1114. return false;
  1115. }
  1116. //用户断线重连
  1117. bool TableFrameSinkZhiPai::OnActionUserConnect(WORD wChairID, IServerUserItem * pIServerUserItem)
  1118. {
  1119. auto dwUserID = pIServerUserItem->GetUserID();
  1120. auto iter = std::find(m_offlineUsers.begin(), m_offlineUsers.end(), dwUserID);
  1121. //if (m_TabbOutCardCout[wChairID] > 0)
  1122. // HttpTingCard(wChairID);
  1123. if (iter != end(m_offlineUsers))
  1124. {
  1125. m_offlineUsers.erase(iter); //玩家重新上线
  1126. return true;
  1127. }
  1128. return true;
  1129. }
  1130. //用户坐下
  1131. bool TableFrameSinkZhiPai::OnActionUserSitDown(WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser)
  1132. {
  1133. return true;
  1134. }
  1135. //游戏中途旁观进入
  1136. bool TableFrameSinkZhiPai::PerformLookonLogin(IServerUserItem * pIServerUserItem)
  1137. {
  1138. CMD_S_PangGuan_Hua StatusPlay;
  1139. memset(&StatusPlay, 0, sizeof(StatusPlay));
  1140. //游戏房主基础配置
  1141. CopyMemory(&StatusPlay.gameConfig, &m_gameConfig, sizeof(CMD_S_GameConfig));
  1142. CopyMemory(StatusPlay.lUserTmpScore, m_lGameTatolScore, sizeof(m_lGameTatolScore));
  1143. //CopyMemory(StatusPlay.bPiaoVal, m_wPiaoFen, sizeof(m_wPiaoFen));
  1144. switch (bGameType)
  1145. {
  1146. case(huapai) :
  1147. {
  1148. StatusPlay.cbTotalCardCount = MAX_REPERTORY_HUA_TWO;
  1149. break;
  1150. }
  1151. case(huapai2) :
  1152. {
  1153. StatusPlay.cbTotalCardCount = MAX_REPERTORY_HUA_ONE;
  1154. break;
  1155. }
  1156. case(huapai3) :
  1157. {
  1158. StatusPlay.cbTotalCardCount = MAX_REPERTORY_HUA;
  1159. break;
  1160. }
  1161. default:break;
  1162. }
  1163. StatusPlay.cbLeftCardCount = m_cbLeftCardCount;
  1164. StatusPlay.gameConfig.IsOwner = m_pITableFrame->GetPrivateTableOwnerID() == pIServerUserItem->GetUserID() ? 1 : 0;
  1165. StatusPlay.GameStatus = m_pITableFrame->IsDrawStarted();
  1166. if (StatusPlay.GameStatus)
  1167. {
  1168. //游戏变量
  1169. StatusPlay.wBankerUser = m_wBankerUser;
  1170. for (BYTE i = 0; i < GAME_PLAY; i++)
  1171. {
  1172. StatusPlay.lSiZi[i] = m_cbTongCount[i];
  1173. StatusPlay.cbCardCount[i] = m_GameLogic.GetCardCount(m_cbCardIndex[i]);
  1174. }
  1175. CopyMemory(StatusPlay.cbDiscardCard, m_cbDiscardCard, sizeof(StatusPlay.cbDiscardCard));
  1176. CopyMemory(StatusPlay.cbDiscardCount, m_cbDiscardCount, sizeof(StatusPlay.cbDiscardCount));
  1177. CopyMemory(StatusPlay.GameScore, m_cbOperateScore, sizeof(m_cbOperateScore));
  1178. //组合扑克
  1179. CopyMemory(StatusPlay.WeaveItemArray, m_WeaveItemArray_HuPai, sizeof(m_WeaveItemArray_HuPai));
  1180. CopyMemory(StatusPlay.cbWeaveCount, m_cbWeaveItemCount_HuPai, sizeof(m_cbWeaveItemCount_HuPai));
  1181. StatusPlay.totalOptTime = 10;
  1182. StatusPlay.leftOptTime = 0;
  1183. //当前到谁家
  1184. StatusPlay.wCurrentUser = (m_wCurrentUser == INVALID_CHAIR ? m_wProvideUser : m_wCurrentUser);
  1185. WORD OldUser = 0;//定义一个最后出牌用户
  1186. if (m_cbOutCardCount == 0 )
  1187. {
  1188. return m_pITableFrame->SendUserItemData(pIServerUserItem, SUB_S_PANGGUAN_HUA, &StatusPlay, sizeof(StatusPlay));
  1189. }
  1190. else
  1191. {
  1192. if (m_wProvideUser == m_wCurrentUser&&m_wOutCardUser == INVALID_CHAIR)//牌权是摸牌得且没出牌
  1193. {
  1194. if (m_wProvideUser == 0)
  1195. {
  1196. OldUser = 2;
  1197. }
  1198. else
  1199. OldUser = m_wProvideUser - 1;
  1200. BYTE TempIndex = 0;
  1201. for (BYTE i = 0; i < 15; i++)
  1202. {
  1203. if (m_cbDiscardCard[OldUser][i] == 0)
  1204. {
  1205. TempIndex = i - 1;
  1206. break;
  1207. }
  1208. }
  1209. if (TempIndex == 255)TempIndex = 0;
  1210. StatusPlay.bPutCardData[OldUser] = m_cbDiscardCard[OldUser][TempIndex];
  1211. }
  1212. if (m_wProvideUser == m_wOutCardUser&& m_wCurrentUser == INVALID_CHAIR)//当有人可以碰且没有碰时候
  1213. {
  1214. OldUser = m_wProvideUser;
  1215. StatusPlay.bPutCardData[m_wProvideUser] = m_cbProvideCard;
  1216. StatusPlay.cbDiscardCard[OldUser][StatusPlay.cbDiscardCount[OldUser]++] = m_cbProvideCard;
  1217. }
  1218. }
  1219. }
  1220. return m_pITableFrame->SendUserItemData(pIServerUserItem, SUB_S_PANGGUAN_HUA, &StatusPlay, sizeof(StatusPlay));
  1221. }
  1222. //用户起来
  1223. bool TableFrameSinkZhiPai::OnActionUserStandUp(WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser)
  1224. {
  1225. //庄家设置
  1226. //if (bLookonUser == false && !QueryUseTemporaryScore())
  1227. //{
  1228. // m_bTrustee[wChairID]=false;
  1229. // CMD_S_Trustee Trustee;
  1230. // Trustee.bTrustee=false;
  1231. // Trustee.wChairID = wChairID;
  1232. // RepayRecord(INVALID_CHAIR, SUB_S_TRUSTEE, &Trustee, sizeof(Trustee));
  1233. // m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_TRUSTEE,&Trustee,sizeof(Trustee));
  1234. // m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_TRUSTEE,&Trustee,sizeof(Trustee));
  1235. //}
  1236. return true;
  1237. }
  1238. //用户出牌
  1239. bool TableFrameSinkZhiPai::OnUserOutCard(WORD wChairID, BYTE cbCardData, BYTE cbWeiZhi)
  1240. {
  1241. //效验状态
  1242. ASSERT(m_pITableFrame->GetGameStatus() == GS_MJ_PLAY);
  1243. if (m_pITableFrame->GetGameStatus() != GS_MJ_PLAY) return true;
  1244. //错误断言
  1245. ASSERT(wChairID == m_wCurrentUser);
  1246. ASSERT(m_GameLogic.IsValidCard(cbCardData) == true);
  1247. //效验参数
  1248. if (wChairID != m_wCurrentUser) return false;
  1249. if (m_GameLogic.IsValidCard(cbCardData) == false) return false;
  1250. //删除牌墙
  1251. BYTE TempWeiZhi = 0xFF;
  1252. if (cbWeiZhi == 0 || cbWeiZhi > 8)
  1253. {
  1254. for (BYTE i = 0; i < 9; i++)
  1255. {
  1256. for (BYTE j = 0; j < 9; j++)
  1257. {
  1258. if (m_cbGamePlayerHandCard[m_wCurrentUser][i][j] == cbCardData)
  1259. {
  1260. for (BYTE k = j; k < 8; k++)
  1261. {
  1262. m_cbGamePlayerHandCard[m_wCurrentUser][i][k] = m_cbGamePlayerHandCard[m_wCurrentUser][i][k + 1];
  1263. }
  1264. TempWeiZhi = j;
  1265. break;
  1266. }
  1267. }
  1268. if (TempWeiZhi != 0xFF)
  1269. {
  1270. break;
  1271. }
  1272. }
  1273. if (TempWeiZhi == 0xFF)
  1274. {
  1275. return false;
  1276. }
  1277. }
  1278. else
  1279. {
  1280. for (BYTE j = 0; j < 9; j++)
  1281. {
  1282. if (m_cbGamePlayerHandCard[m_wCurrentUser][cbWeiZhi][j] == cbCardData)
  1283. {
  1284. for (BYTE k = j; k < 8; k++)
  1285. {
  1286. m_cbGamePlayerHandCard[m_wCurrentUser][cbWeiZhi][k] = m_cbGamePlayerHandCard[m_wCurrentUser][cbWeiZhi][k + 1];
  1287. }
  1288. TempWeiZhi = j;
  1289. break;
  1290. }
  1291. }
  1292. if (TempWeiZhi == 0xFF)
  1293. {
  1294. for (BYTE i = 0; i < 9; i++)
  1295. {
  1296. for (BYTE j = 0; j < 9; j++)
  1297. {
  1298. if (m_cbGamePlayerHandCard[m_wCurrentUser][i][j] == cbCardData)
  1299. {
  1300. for (BYTE k = j; k < 8; k++)
  1301. {
  1302. m_cbGamePlayerHandCard[m_wCurrentUser][i][k] = m_cbGamePlayerHandCard[m_wCurrentUser][i][k + 1];
  1303. }
  1304. TempWeiZhi = j;
  1305. break;
  1306. }
  1307. }
  1308. if (TempWeiZhi != 0xFF)
  1309. {
  1310. break;
  1311. }
  1312. }
  1313. if (TempWeiZhi == 0xFF)
  1314. {
  1315. return false;
  1316. }
  1317. }
  1318. }
  1319. //删除扑克
  1320. if (m_GameLogic.RemoveCard(m_cbCardIndex[wChairID], cbCardData) == false)
  1321. {
  1322. ASSERT(FALSE);
  1323. return false;
  1324. }
  1325. if ((cbCardData & 0x10) == 0x10)
  1326. {
  1327. BYTE TempIndex = m_GameLogic.SwitchToCardIndex(cbCardData);
  1328. ASSERT(m_cbHuaCardIndex[m_wCurrentUser][TempIndex / 2] > 0);
  1329. if (m_cbHuaCardIndex[m_wCurrentUser][TempIndex / 2] == 0)
  1330. {
  1331. ASSERT(false);
  1332. return false;
  1333. }
  1334. m_cbHuaCardIndex[m_wCurrentUser][TempIndex / 2]--;
  1335. }
  1336. ZeroMemory(&m_cbLastDisCardData[wChairID], sizeof(m_cbLastDisCardData[wChairID]));//本玩家记忆库数据清零
  1337. m_cbLastDisCount[wChairID] = 0;
  1338. //出牌记录
  1339. m_cbOutCardCount++;
  1340. m_wOutCardUser = wChairID; //记录出牌人
  1341. m_cbOutCardData = cbCardData; //记录出牌数据
  1342. //构造数据
  1343. CMD_S_OutCard OutCard;
  1344. OutCard.wOutCardUser = wChairID;
  1345. OutCard.cbOutCardData = cbCardData;
  1346. OutCard.bOptType = 0;
  1347. RepayRecord(INVALID_CHAIR, SUB_S_OUT_CARD_HUA, &OutCard, sizeof(OutCard));
  1348. //发送消息
  1349. m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_OUT_CARD_HUA, &OutCard, sizeof(OutCard));
  1350. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_OUT_CARD_HUA, &OutCard, sizeof(OutCard));
  1351. m_wProvideUser = wChairID;
  1352. m_cbProvideCard = cbCardData;
  1353. //用户切换
  1354. m_wCurrentUser = (wChairID + 1) % GAME_PLAY;
  1355. m_cbUserAction[wChairID] = WIK_NULL;
  1356. m_cbPerformAction[wChairID] = WIK_NULL;
  1357. //响应判断
  1358. bool bAroseAction = EstimateUserRespond(wChairID, cbCardData, EstimatKind_OutCard);
  1359. //派发扑克
  1360. if (bAroseAction == false)
  1361. {
  1362. DispatchCardData(m_wCurrentUser);
  1363. }
  1364. return true;
  1365. }
  1366. //用户操作,
  1367. bool TableFrameSinkZhiPai::OnUserOperateCard(WORD wChairID, int cbOperateCode, BYTE cbOperateCard, BYTE cbHuaCard[])
  1368. {
  1369. //效验状态
  1370. ASSERT(m_pITableFrame->GetGameStatus() == GS_MJ_PLAY);
  1371. if (m_pITableFrame->GetGameStatus() != GS_MJ_PLAY)
  1372. return true;
  1373. //反馈动作
  1374. int FanKuiAction = WIK_NULL;
  1375. tagGangCardResult_Hua GangCardResult;
  1376. ZeroMemory(&GangCardResult, sizeof(GangCardResult));
  1377. //被动动作
  1378. //表示有人出牌后,下一个人还未摸牌这段时间内,有人对上一张出牌有吃胡、杠、碰等操作
  1379. if (m_wCurrentUser == INVALID_CHAIR && wChairID != m_wProvideUser)
  1380. {
  1381. //效验状态
  1382. if (m_bResponse[wChairID] == true)
  1383. return true;
  1384. //效验操作 -- 操作码不为空,并且当前用户不可执行该操作
  1385. if ((cbOperateCode != WIK_NULL) && ((m_cbUserAction[wChairID] & cbOperateCode) == 0))
  1386. return true;
  1387. //变量定义
  1388. WORD wTargetUser = wChairID;
  1389. int cbTargetAction = cbOperateCode;
  1390. //设置变量
  1391. m_bResponse[wChairID] = true;
  1392. m_cbPerformAction[wChairID] = cbOperateCode;
  1393. m_cbOperateCard[wChairID] = cbOperateCard;
  1394. CopyMemory(m_cbOperateCard_FuJia[wChairID], cbHuaCard, sizeof(m_cbOperateCard_FuJia[wChairID]));
  1395. if (cbOperateCode == WIK_NULL)
  1396. {
  1397. m_cbLastDisCardData[wChairID][m_cbLastDisCount[wChairID]++] = m_cbProvideCard;
  1398. }
  1399. OperatorPriority(m_wProvideUser, wTargetUser, cbTargetAction);
  1400. //操作优先级最高用户还未操作,
  1401. if (m_bResponse[wTargetUser] == false)
  1402. {
  1403. return true;
  1404. }
  1405. //放弃操作
  1406. if (cbOperateCode == WIK_NULL &&cbTargetAction == WIK_NULL)
  1407. {
  1408. ZeroMemory(m_bResponse, sizeof(m_bResponse));
  1409. ZeroMemory(m_cbUserAction, sizeof(m_cbUserAction));
  1410. ZeroMemory(m_cbOperateCard, sizeof(m_cbOperateCard));
  1411. ZeroMemory(m_cbOperateCard_FuJia, sizeof(m_cbOperateCard_FuJia));
  1412. ZeroMemory(m_cbPerformAction, sizeof(m_cbPerformAction));
  1413. ZeroMemory(EsponseHuShu, sizeof(EsponseHuShu));//胡数
  1414. ZeroMemory(EsponsePaPoShu, sizeof(EsponsePaPoShu));//爬坡数
  1415. if (m_wCurrentUser == INVALID_CHAIR)
  1416. {
  1417. DispatchCardData(m_wResumeUser);
  1418. }
  1419. return true;
  1420. }
  1421. //变量定义
  1422. BYTE cbTargetCard = m_cbOperateCard[wTargetUser];
  1423. //校验前端传过来的牌值是否和后台一致
  1424. if ( cbTargetCard != m_cbProvideCard)
  1425. {
  1426. m_bResponse[wTargetUser] = false;
  1427. return false;
  1428. }
  1429. //出牌变量
  1430. m_cbOutCardData = 0;
  1431. m_bSendStatus = true;
  1432. m_wOutCardUser = INVALID_CHAIR;
  1433. //组合扑克
  1434. if (!(cbTargetAction&(WIK_CHI_HU)))
  1435. {
  1436. ASSERT(m_cbWeaveItemCount[wTargetUser] < 8);
  1437. if (m_cbWeaveItemCount[wTargetUser] > 8)return false;
  1438. /*WORD wIndex = m_cbWeaveItemCount[wTargetUser]++;
  1439. m_WeaveItemArray[wTargetUser][wIndex].cbPublicCard = TRUE;
  1440. m_WeaveItemArray[wTargetUser][wIndex].cbCenterCard = cbTargetCard;
  1441. m_WeaveItemArray[wTargetUser][wIndex].cbWeaveKind = cbTargetAction;
  1442. m_WeaveItemArray[wTargetUser][wIndex].wProvideUser = (m_wProvideUser == INVALID_CHAIR) ? wTargetUser : m_wProvideUser;*/
  1443. }
  1444. BYTE wIndex = 0;
  1445. BYTE TempCount_Hu = 0;
  1446. //删除扑克
  1447. switch (cbTargetAction)
  1448. {
  1449. case WIK_DUI: //碰牌操作
  1450. {
  1451. BYTE TempCardData[2] = { 0 };
  1452. //删除扑克
  1453. BYTE TempIndex = m_GameLogic.SwitchToCardIndex(cbTargetCard);
  1454. if (m_cbCardIndex[wTargetUser][TempIndex] >= 2)
  1455. {
  1456. wIndex = m_cbWeaveItemCount[wTargetUser]++;
  1457. m_WeaveItemArray[wTargetUser][wIndex].cbPublicCard = TRUE;
  1458. m_WeaveItemArray[wTargetUser][wIndex].cbCenterCard = (cbTargetCard & 0xEF);
  1459. m_WeaveItemArray[wTargetUser][wIndex].cbWeaveKind = WIK_DUI;
  1460. m_WeaveItemArray[wTargetUser][wIndex].wProvideUser = (m_wProvideUser == INVALID_CHAIR) ? wTargetUser : m_wProvideUser;
  1461. TempCount_Hu = m_cbWeaveItemCount_HuPai[wTargetUser]++;
  1462. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbPublicCard = TRUE;
  1463. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbCenterCard = (cbTargetCard & 0xEF);
  1464. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbWeaveKind = WIK_DUI;
  1465. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].wProvideUser = (m_wProvideUser == INVALID_CHAIR) ? wTargetUser : m_wProvideUser;
  1466. ASSERT(m_cbCardIndex[wTargetUser][TempIndex] >= 2);
  1467. m_cbCardIndex[wTargetUser][TempIndex] -= 2;
  1468. if ((cbTargetCard & 0x10) == 0x10)//别人打了个花牌
  1469. {
  1470. if (m_cbOperateCard_FuJia[wTargetUser][0] == cbTargetCard)//手牌有一个花牌
  1471. {
  1472. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[0] = m_cbOperateCard_FuJia[wTargetUser][0];
  1473. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[0] = m_cbOperateCard_FuJia[wTargetUser][0];
  1474. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1475. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1476. ASSERT(m_cbHuaCardIndex[wTargetUser][TempIndex / 2] > 0);
  1477. m_cbHuaCardIndex[wTargetUser][TempIndex / 2]--;
  1478. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[1] = cbTargetCard;
  1479. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[1] = cbTargetCard;
  1480. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1481. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1482. TempCardData[0] = cbTargetCard;
  1483. TempCardData[1] = (cbTargetCard & 0x0F);
  1484. }
  1485. else//手牌没有花牌
  1486. {
  1487. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[0] = cbTargetCard;
  1488. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[0] = cbTargetCard;
  1489. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1490. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1491. TempCardData[0] = (cbTargetCard & 0x0F);
  1492. TempCardData[1] = (cbTargetCard & 0x0F);
  1493. }
  1494. }
  1495. else//打了个普通牌
  1496. {
  1497. if (m_cbOperateCard_FuJia[wTargetUser][0] != 0 && (m_cbOperateCard_FuJia[wTargetUser][0] & 0x10 == 0x10))//手牌有一个花牌
  1498. {
  1499. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[0] = m_cbOperateCard_FuJia[wTargetUser][0];
  1500. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[0] = m_cbOperateCard_FuJia[wTargetUser][0];
  1501. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1502. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1503. ASSERT(m_cbHuaCardIndex[wTargetUser][TempIndex / 2] > 0);
  1504. m_cbHuaCardIndex[wTargetUser][TempIndex / 2]--;
  1505. TempCardData[0] = (cbTargetCard | 0x10);
  1506. }
  1507. if (m_cbOperateCard_FuJia[wTargetUser][1] != 0 && (m_cbOperateCard_FuJia[wTargetUser][1] & 0x10 == 0x10))//手牌有两个个花牌
  1508. {
  1509. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[1] = m_cbOperateCard_FuJia[wTargetUser][1];
  1510. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[1] = m_cbOperateCard_FuJia[wTargetUser][1];
  1511. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1512. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1513. ASSERT(m_cbHuaCardIndex[wTargetUser][TempIndex / 2] > 0);
  1514. m_cbHuaCardIndex[wTargetUser][TempIndex / 2]--;
  1515. TempCardData[1] = (cbTargetCard | 0x10);
  1516. }
  1517. if (TempCardData[0] == 0)
  1518. {
  1519. TempCardData[0] = cbTargetCard;
  1520. }
  1521. if (TempCardData[1] == 0)
  1522. {
  1523. TempCardData[1] = cbTargetCard;
  1524. }
  1525. }
  1526. }
  1527. else
  1528. {
  1529. m_bResponse[wTargetUser] = false;
  1530. return false;
  1531. }
  1532. m_cbDuiOperator[wTargetUser]++;
  1533. if (!DeleteHandCardData(wTargetUser, TempCardData, 2))
  1534. {
  1535. m_bResponse[wTargetUser] = false;
  1536. return false;
  1537. }
  1538. m_cbOperateScore[wTargetUser] += GetOperatorScore(WIK_DUI, TempIndex, m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset);
  1539. /*if (m_cbLeftCardCount > 0)
  1540. {
  1541. FanKuiAction |= m_GameLogic.AnalyseGangCard(m_cbCardIndex[wTargetUser], m_cbHuaCardIndex[wTargetUser], m_WeaveItemArray[wTargetUser],
  1542. m_cbWeaveItemCount[wTargetUser], m_WeaveItemArray_AnTong[wTargetUser], m_cbWeaveItemCount_AnTong[wTargetUser], GangCardResult, b_wIsGangTing[wTargetUser]);
  1543. }*/
  1544. //TingCard(wTargetUser);
  1545. break;
  1546. }
  1547. case WIK_SAN_ZHAO: //明补操作 -- 补张后不可将该牌再用于组合。补张的牌其他玩家不可吃、碰,可以胡。
  1548. {
  1549. BYTE TempCardData[3] = { 0 };
  1550. BYTE TempIndex = m_GameLogic.SwitchToCardIndex(cbTargetCard);
  1551. if (m_cbCardIndex[wTargetUser][TempIndex] >= 3)
  1552. {
  1553. wIndex = m_cbWeaveItemCount[wTargetUser]++;
  1554. m_WeaveItemArray[wTargetUser][wIndex].cbPublicCard = TRUE;
  1555. m_WeaveItemArray[wTargetUser][wIndex].cbCenterCard = (cbTargetCard & 0xEF);
  1556. m_WeaveItemArray[wTargetUser][wIndex].cbWeaveKind = WIK_SAN_ZHAO;
  1557. m_WeaveItemArray[wTargetUser][wIndex].wProvideUser = (m_wProvideUser == INVALID_CHAIR) ? wTargetUser : m_wProvideUser;
  1558. TempCount_Hu = m_cbWeaveItemCount_HuPai[wTargetUser]++;
  1559. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbPublicCard = TRUE;
  1560. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbCenterCard = (cbTargetCard & 0xEF);
  1561. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbWeaveKind = WIK_SAN_ZHAO;
  1562. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].wProvideUser = (m_wProvideUser == INVALID_CHAIR) ? wTargetUser : m_wProvideUser;
  1563. ASSERT(m_cbCardIndex[wTargetUser][TempIndex] >= 3);
  1564. m_cbCardIndex[wTargetUser][TempIndex] -= 3;
  1565. if ((cbTargetCard & 0x10) == 0x10)//别人打了个花牌
  1566. {
  1567. if (m_cbOperateCard_FuJia[wTargetUser][0] == cbTargetCard)//手牌有一个花牌
  1568. {
  1569. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[0] = m_cbOperateCard_FuJia[wTargetUser][0];
  1570. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[0] = m_cbOperateCard_FuJia[wTargetUser][0];
  1571. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1572. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1573. ASSERT(m_cbHuaCardIndex[wTargetUser][TempIndex / 2] > 0);
  1574. m_cbHuaCardIndex[wTargetUser][TempIndex / 2]--;
  1575. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[1] = cbTargetCard;
  1576. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[1] = cbTargetCard;
  1577. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1578. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1579. TempCardData[0] = cbTargetCard;
  1580. TempCardData[1] = (cbTargetCard & 0x0F);
  1581. TempCardData[2] = (cbTargetCard & 0x0F);
  1582. }
  1583. else
  1584. {
  1585. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[0] = cbTargetCard;
  1586. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[0] = cbTargetCard;
  1587. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1588. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1589. TempCardData[0] = (cbTargetCard & 0x0F);
  1590. TempCardData[1] = (cbTargetCard & 0x0F);
  1591. TempCardData[2] = (cbTargetCard & 0x0F);
  1592. }
  1593. }
  1594. else
  1595. {
  1596. if (m_cbOperateCard_FuJia[wTargetUser][0] != 0 && (m_cbOperateCard_FuJia[wTargetUser][0] & 0x10 == 0x10))//手牌有一个花牌
  1597. {
  1598. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[0] = m_cbOperateCard_FuJia[wTargetUser][0];
  1599. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[0] = m_cbOperateCard_FuJia[wTargetUser][0];
  1600. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1601. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1602. ASSERT(m_cbHuaCardIndex[wTargetUser][TempIndex / 2] > 0);
  1603. m_cbHuaCardIndex[wTargetUser][TempIndex / 2]--;
  1604. TempCardData[0] = (cbTargetCard | 0x10);
  1605. }
  1606. if (m_cbOperateCard_FuJia[wTargetUser][1] != 0 && (m_cbOperateCard_FuJia[wTargetUser][1] & 0x10 == 0x10))//手牌有两个个花牌
  1607. {
  1608. m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset[1] = m_cbOperateCard_FuJia[wTargetUser][1];
  1609. m_WeaveItemArray_HuPai[wTargetUser][TempCount_Hu].cbMargicOffset[1] = m_cbOperateCard_FuJia[wTargetUser][1];
  1610. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2]++;
  1611. m_cbHuaWeaveCardIndex_Tong[wTargetUser][TempIndex / 2]++;
  1612. ASSERT(m_cbHuaCardIndex[wTargetUser][TempIndex / 2] > 0);
  1613. m_cbHuaCardIndex[wTargetUser][TempIndex / 2]--;
  1614. TempCardData[1] = (cbTargetCard | 0x10);
  1615. }
  1616. if (TempCardData[0] == 0)
  1617. {
  1618. TempCardData[0] = cbTargetCard;
  1619. }
  1620. if (TempCardData[1] == 0)
  1621. {
  1622. TempCardData[1] = cbTargetCard;
  1623. }
  1624. TempCardData[2] = cbTargetCard;
  1625. }
  1626. }
  1627. else
  1628. {
  1629. m_bResponse[wTargetUser] = false;
  1630. return false;
  1631. }
  1632. if (!DeleteHandCardData(wTargetUser, TempCardData, 3))
  1633. {
  1634. m_bResponse[wTargetUser] = false;
  1635. return false;
  1636. }
  1637. m_cbOperateScore[wTargetUser] += GetOperatorScore(WIK_SAN_ZHAO, TempIndex, m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset);
  1638. //BYTE cbRemoveCard[] = { cbTargetCard, cbTargetCard, cbTargetCard };
  1639. //VERIFY(m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser], cbRemoveCard, CountArray(cbRemoveCard)));
  1640. //m_MingBuNum[wTargetUser]++;
  1641. break;
  1642. }
  1643. case WIK_CHI_HU:
  1644. {
  1645. int TempAction = WIK_NULL;
  1646. BYTE TempCardIndex[MAX_INDEX_HUA] = { 0 };
  1647. BYTE TempHuaCardIndex[5] = { 0 };
  1648. CopyMemory(TempCardIndex, m_cbCardIndex[wTargetUser], sizeof(TempCardIndex));
  1649. CopyMemory(TempHuaCardIndex, m_cbHuaCardIndex[wTargetUser], sizeof(TempHuaCardIndex));
  1650. m_GameLogic.HeBingCardIndex(TempCardIndex, m_cbCardIndex_Tong[wTargetUser], TempHuaCardIndex, m_cbHuaCardIndex_Tong[wTargetUser]);
  1651. TempAction |= m_GameLogic.AnalyseHuCard(TempCardIndex, TempHuaCardIndex, m_cbProvideCard, m_WeaveItemArray_HuPai[wTargetUser], m_cbWeaveItemCount_HuPai[wTargetUser], m_cbHuaWeaveCardIndex[wTargetUser], m_cbTongCount[wTargetUser], ChiHu);
  1652. if (TempAction == WIK_NULL)
  1653. {
  1654. return false;
  1655. }
  1656. m_HuPai[wTargetUser]++;
  1657. CMD_S_OperateResult_Hua OperateResult;
  1658. ZeroMemory(&OperateResult, sizeof(OperateResult));
  1659. OperateResult.wOperateUser = wTargetUser;
  1660. OperateResult.cbOperateCard = cbTargetCard;
  1661. OperateResult.cbOperateCode = cbTargetAction;
  1662. OperateResult.wProvideUser = (m_wProvideUser == INVALID_CHAIR) ? wTargetUser : m_wProvideUser;
  1663. //RepayRecord(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  1664. //发送消息
  1665. m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  1666. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  1667. RepayRecord(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  1668. //结束
  1669. OnEventGameConclude(wTargetUser, NULL, GER_NORMAL);
  1670. return true;
  1671. }
  1672. case WIK_SI_ZHAO:
  1673. {
  1674. BYTE TempCardData[4] = { 0 };
  1675. BYTE TempIndex = m_GameLogic.SwitchToCardIndex(cbTargetCard);
  1676. if (TempIndex == 0 || TempIndex == 2 || TempIndex == 4 || TempIndex == 6 || TempIndex == 8)
  1677. {
  1678. for (BYTE i = 0; i < m_cbWeaveItemCount[wTargetUser]; i++)
  1679. {
  1680. if (m_WeaveItemArray[wTargetUser][i].cbWeaveKind == WIK_SI_TONG && ((m_WeaveItemArray[wTargetUser][i].cbCenterCard & 0x0F) == (cbTargetCard & 0x0F)) && m_WeaveItemArray[wTargetUser][i].cbCenterCard < 0x20)
  1681. {
  1682. if ((cbTargetCard & 0x10) == 0x10)
  1683. {
  1684. m_WeaveItemArray[wTargetUser][i].cbMargicOffset[1] = cbTargetCard;
  1685. ASSERT(m_cbCardIndex_Tong[wTargetUser][TempIndex] >= 4);
  1686. ASSERT(m_cbHuaCardIndex_Tong[wTargetUser][TempIndex / 2] >= 1);
  1687. m_cbCardIndex_Tong[wTargetUser][TempIndex] -= 4;
  1688. m_cbHuaCardIndex_Tong[wTargetUser][TempIndex / 2] --;
  1689. TempCardData[0] = cbTargetCard;
  1690. TempCardData[1] = (cbTargetCard & 0x0F);
  1691. TempCardData[2] = (cbTargetCard & 0x0F);
  1692. TempCardData[3] = (cbTargetCard & 0x0F);
  1693. }
  1694. else
  1695. {
  1696. ASSERT(m_cbCardIndex_Tong[wTargetUser][TempIndex] >= 4);
  1697. ASSERT(m_cbHuaCardIndex_Tong[wTargetUser][TempIndex / 2] >= 2);
  1698. m_cbCardIndex_Tong[wTargetUser][TempIndex] -= 4;
  1699. m_cbHuaCardIndex_Tong[wTargetUser][TempIndex / 2] -= 2;
  1700. TempCardData[0] = cbTargetCard;
  1701. TempCardData[1] = cbTargetCard;
  1702. TempCardData[2] = (cbTargetCard | 0x10);
  1703. TempCardData[3] = (cbTargetCard | 0x10);
  1704. }
  1705. m_WeaveItemArray[wTargetUser][i].cbWeaveKind = WIK_SI_ZHAO;
  1706. m_WeaveItemArray_HuPai[wTargetUser][m_cbWeaveItemCount_HuPai[wTargetUser]].cbCenterCard = (cbTargetCard & 0x0F);
  1707. m_WeaveItemArray_HuPai[wTargetUser][m_cbWeaveItemCount_HuPai[wTargetUser]].cbWeaveKind = WIK_SI_ZHAO;
  1708. m_WeaveItemArray_HuPai[wTargetUser][m_cbWeaveItemCount_HuPai[wTargetUser]].cbMargicOffset[0] = (cbTargetCard | 0x10);
  1709. m_WeaveItemArray_HuPai[wTargetUser][m_cbWeaveItemCount_HuPai[wTargetUser]].cbMargicOffset[1] = (cbTargetCard | 0x10);
  1710. m_cbWeaveItemCount_HuPai[wTargetUser]++;
  1711. break;
  1712. }
  1713. }
  1714. m_cbHuaWeaveCardIndex[wTargetUser][TempIndex / 2] += 2;
  1715. }
  1716. else
  1717. {
  1718. for (BYTE i = 0; i < m_cbWeaveItemCount[wTargetUser]; i++)
  1719. {
  1720. if (m_WeaveItemArray[wTargetUser][i].cbWeaveKind == WIK_SI_TONG && m_WeaveItemArray[wTargetUser][i].cbCenterCard == cbTargetCard)
  1721. {
  1722. ASSERT(m_cbCardIndex_Tong[wTargetUser][TempIndex] >= 4);
  1723. m_cbCardIndex_Tong[wTargetUser][TempIndex] -= 4;
  1724. TempCardData[0] = cbTargetCard;
  1725. TempCardData[1] = cbTargetCard;
  1726. TempCardData[2] = cbTargetCard;
  1727. TempCardData[3] = cbTargetCard;
  1728. m_WeaveItemArray[wTargetUser][i].cbWeaveKind = WIK_SI_ZHAO;
  1729. m_WeaveItemArray_HuPai[wTargetUser][m_cbWeaveItemCount_HuPai[wTargetUser]].cbCenterCard = cbTargetCard;
  1730. m_WeaveItemArray_HuPai[wTargetUser][m_cbWeaveItemCount_HuPai[wTargetUser]].cbWeaveKind = WIK_SI_ZHAO;
  1731. m_cbWeaveItemCount_HuPai[wTargetUser]++;
  1732. break;
  1733. }
  1734. }
  1735. }
  1736. if (!DeleteHandCardData(wTargetUser, TempCardData, 4))
  1737. {
  1738. m_bResponse[wTargetUser] = false;
  1739. return false;
  1740. }
  1741. m_cbOperateScore[wTargetUser] += GetOperatorScore(WIK_SI_ZHAO, TempIndex, m_WeaveItemArray[wTargetUser][wIndex].cbMargicOffset);
  1742. m_cbTongCount[wTargetUser]--;
  1743. break;
  1744. }
  1745. default:
  1746. ASSERT(FALSE);
  1747. return false;
  1748. }
  1749. //用户状态
  1750. ZeroMemory(m_bResponse, sizeof(m_bResponse));
  1751. ZeroMemory(m_cbUserAction, sizeof(m_cbUserAction));
  1752. ZeroMemory(m_cbOperateCard, sizeof(m_cbOperateCard));
  1753. ZeroMemory(m_cbPerformAction, sizeof(m_cbPerformAction));
  1754. ZeroMemory(EsponseHuShu, sizeof(EsponseHuShu));//胡数
  1755. ZeroMemory(EsponsePaPoShu, sizeof(EsponsePaPoShu));//爬坡数
  1756. //构造结果
  1757. CMD_S_OperateResult_Hua OperateResult;
  1758. OperateResult.wOperateUser = wTargetUser;
  1759. OperateResult.cbOperateCard = cbTargetCard;
  1760. OperateResult.cbOperateCode = cbTargetAction;
  1761. OperateResult.wProvideUser = (m_wProvideUser == INVALID_CHAIR) ? wTargetUser : m_wProvideUser;
  1762. OperateResult.cbActionMask = FanKuiAction | WIK_BH_WJCP;
  1763. OperateResult.cbOperateScore = m_cbOperateScore[wTargetUser];
  1764. CopyMemory(OperateResult.cbHuaGangCard, m_cbOperateCard_FuJia[wTargetUser], sizeof(OperateResult.cbHuaGangCard));
  1765. ZeroMemory(m_cbOperateCard_FuJia, sizeof(m_cbOperateCard_FuJia));
  1766. ZeroMemory(OperateResult.cbActionCard, sizeof(OperateResult.cbActionCard));
  1767. if (FanKuiAction != WIK_NULL)
  1768. {
  1769. m_cbUserAction[wTargetUser] = FanKuiAction;
  1770. OperateResult.cbActionMask = FanKuiAction;
  1771. for (BYTE i = 0; i < GangCardResult.cbCardCount; i++)
  1772. {
  1773. OperateResult.cbActionCard[i] = GangCardResult.cbCardData[i];
  1774. }
  1775. }
  1776. //RepayRecord(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  1777. //发送消息
  1778. m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  1779. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  1780. RepayRecord(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  1781. //设置用户
  1782. m_wCurrentUser = wTargetUser;
  1783. //杠牌处理
  1784. if (cbTargetAction == WIK_SAN_ZHAO || cbTargetAction == WIK_SI_ZHAO)
  1785. {
  1786. DispatchCardData(wTargetUser);
  1787. }
  1788. return true;
  1789. }
  1790. //主动动作
  1791. if (m_wCurrentUser==wChairID) //如果是摸牌用户的操作,比如自摸或者自杠
  1792. {
  1793. if (cbOperateCode == WIK_NULL)
  1794. {
  1795. if (m_cbOutCardCount == 0 && (m_cbUserAction[wChairID]&(WIK_SI_TONG|WIK_WU_TONG)))
  1796. {
  1797. ZeroMemory(m_bResponse, sizeof(m_bResponse));
  1798. ZeroMemory(m_cbUserAction, sizeof(m_cbUserAction));
  1799. ZeroMemory(m_cbOperateCard, sizeof(m_cbOperateCard));
  1800. ZeroMemory(m_cbOperateCard_FuJia, sizeof(m_cbOperateCard_FuJia));
  1801. ZeroMemory(m_cbPerformAction, sizeof(m_cbPerformAction));
  1802. ZeroMemory(EsponseHuShu, sizeof(EsponseHuShu));//胡数
  1803. ZeroMemory(EsponsePaPoShu, sizeof(EsponsePaPoShu));//爬坡数
  1804. b_QingTong[wChairID] = true;
  1805. if (wChairID != m_wBankerUser)
  1806. {
  1807. WORD TempNextUser = INVALID_CHAIR;
  1808. if (wChairID == 0)
  1809. {
  1810. TempNextUser = 2;
  1811. }
  1812. else
  1813. {
  1814. TempNextUser = wChairID-1;
  1815. }
  1816. b_QingTong[TempNextUser] = true;
  1817. tagGangCardResult_Hua GangCardResult;
  1818. ZeroMemory(&GangCardResult, sizeof(GangCardResult));
  1819. m_cbUserAction[TempNextUser] = m_GameLogic.AnalyseGangCard(m_cbCardIndex[TempNextUser], m_cbHuaCardIndex[TempNextUser], m_WeaveItemArray[TempNextUser], m_cbWeaveItemCount[TempNextUser], GangCardResult);
  1820. if (m_cbUserAction[TempNextUser] & WIK_SI_TONG)
  1821. {
  1822. b_QingTong[TempNextUser] = false;
  1823. if (TempNextUser == m_wBankerUser)
  1824. {
  1825. m_cbUserAction[TempNextUser] |= WIK_BH_WJCP;
  1826. }
  1827. CMD_S_QingTongNotify QingTong;
  1828. ZeroMemory(&QingTong, sizeof(QingTong));
  1829. QingTong.OperatorUser = TempNextUser;
  1830. //*QingTong.cbActionMask = m_cbUserAction[TempNextUser];
  1831. for (BYTE i = 0; i < GAME_PLAY; i++)
  1832. {
  1833. if (i == TempNextUser)
  1834. {
  1835. QingTong.cbActionMask = m_cbUserAction[TempNextUser];
  1836. CopyMemory(QingTong.cbActionCard, GangCardResult.cbCardData, sizeof(GangCardResult.cbCardData));
  1837. m_pITableFrame->SendTableData(TempNextUser, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  1838. }
  1839. else
  1840. {
  1841. QingTong.cbActionMask = WIK_NULL;
  1842. ZeroMemory(QingTong.cbActionCard, sizeof(QingTong.cbActionCard));
  1843. m_pITableFrame->SendTableData(i, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  1844. }
  1845. }
  1846. m_wCurrentUser = TempNextUser;
  1847. return true;
  1848. }
  1849. if (TempNextUser != m_wBankerUser)
  1850. {
  1851. if (TempNextUser == 0)
  1852. {
  1853. TempNextUser = 2;
  1854. }
  1855. else
  1856. {
  1857. TempNextUser--;
  1858. }
  1859. ASSERT(TempNextUser == m_wBankerUser);
  1860. b_QingTong[TempNextUser] = true;
  1861. tagGangCardResult_Hua GangCardResultBank;
  1862. ZeroMemory(&GangCardResultBank, sizeof(GangCardResultBank));
  1863. m_cbUserAction[TempNextUser] = m_GameLogic.AnalyseGangCard(m_cbCardIndex[TempNextUser], m_cbHuaCardIndex[TempNextUser], m_WeaveItemArray[TempNextUser], m_cbWeaveItemCount[TempNextUser], GangCardResultBank);
  1864. m_cbUserAction[TempNextUser] |= WIK_BH_WJCP;
  1865. CMD_S_QingTongNotify QingTong;
  1866. ZeroMemory(&QingTong, sizeof(QingTong));
  1867. QingTong.OperatorUser = TempNextUser;
  1868. for (BYTE i = 0; i < GAME_PLAY; i++)
  1869. {
  1870. if (i == TempNextUser)
  1871. {
  1872. QingTong.cbActionMask = m_cbUserAction[TempNextUser];
  1873. CopyMemory(QingTong.cbActionCard, GangCardResultBank.cbCardData, sizeof(GangCardResultBank.cbCardData));
  1874. m_pITableFrame->SendTableData(TempNextUser, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  1875. }
  1876. else
  1877. {
  1878. QingTong.cbActionMask = WIK_NULL;
  1879. ZeroMemory(QingTong.cbActionCard, sizeof(QingTong.cbActionCard));
  1880. m_pITableFrame->SendTableData(i, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  1881. }
  1882. }
  1883. m_wCurrentUser = TempNextUser;
  1884. return true;
  1885. }
  1886. else
  1887. {
  1888. CMD_S_QingTongNotify TongZhi;
  1889. ZeroMemory(&TongZhi, sizeof(TongZhi));
  1890. TongZhi.OperatorUser = m_wBankerUser;
  1891. m_cbUserAction[m_wBankerUser] = WIK_BH_WJCP;
  1892. TongZhi.cbActionMask = m_cbUserAction[m_wBankerUser];
  1893. m_pITableFrame->SendTableData(m_wBankerUser, SUB_S_QINGTONG_NOTIFY_HUA, &TongZhi, sizeof(TongZhi));
  1894. m_wCurrentUser = m_wBankerUser;
  1895. return true;
  1896. }
  1897. }
  1898. else if (wChairID == m_wBankerUser)
  1899. {
  1900. CMD_S_QingTongNotify TongZhi;
  1901. ZeroMemory(&TongZhi, sizeof(TongZhi));
  1902. TongZhi.OperatorUser = m_wBankerUser;
  1903. m_cbUserAction[m_wBankerUser] = WIK_BH_WJCP;
  1904. TongZhi.cbActionMask = m_cbUserAction[m_wBankerUser];
  1905. m_pITableFrame->SendTableData(m_wBankerUser, SUB_S_QINGTONG_NOTIFY_HUA, &TongZhi, sizeof(TongZhi));
  1906. m_wCurrentUser = m_wBankerUser;
  1907. return true;
  1908. }
  1909. return true;
  1910. }
  1911. //用户状态
  1912. ZeroMemory(m_bResponse, sizeof(m_bResponse));
  1913. ZeroMemory(m_cbUserAction, sizeof(m_cbUserAction));
  1914. ZeroMemory(m_cbOperateCard, sizeof(m_cbOperateCard));
  1915. ZeroMemory(m_cbOperateCard_FuJia, sizeof(m_cbOperateCard_FuJia));
  1916. ZeroMemory(m_cbPerformAction, sizeof(m_cbPerformAction));
  1917. return true;
  1918. }
  1919. //效验操作
  1920. if ((cbOperateCode==WIK_NULL)||((m_cbUserAction[wChairID]&cbOperateCode)==0))
  1921. return true;
  1922. //设置变量
  1923. m_bSendStatus=true;
  1924. //m_bEnjoinChiHu[m_wCurrentUser]=true;
  1925. //m_cbUserAction[m_wCurrentUser]=WIK_NULL;
  1926. //m_cbPerformAction[m_wCurrentUser]=WIK_NULL;
  1927. bool bPublic=false;
  1928. //执行动作
  1929. switch (cbOperateCode)
  1930. {
  1931. case WIK_SI_TONG: //四筒
  1932. {
  1933. //扑克效验
  1934. ASSERT((cbOperateCode == WIK_SI_TONG) || (m_GameLogic.IsValidCard(cbOperateCard) == true));
  1935. if ((cbOperateCode != WIK_SI_TONG) && (m_GameLogic.IsValidCard(cbOperateCard) == false))
  1936. return false;
  1937. //变量定义
  1938. BYTE cbWeaveIndex = 0xFF;
  1939. BYTE cbCardIndex = m_GameLogic.SwitchToCardIndex(cbOperateCard);
  1940. BYTE TempCount = 0;
  1941. //杠牌处理
  1942. if (cbCardIndex == 0 || cbCardIndex == 2 || cbCardIndex == 4 || cbCardIndex == 6 || cbCardIndex == 8)
  1943. {
  1944. if ((cbCardIndex == 0 || cbCardIndex == 8) && m_cbCardIndex[wChairID][cbCardIndex] >= 4)
  1945. {
  1946. bPublic = false;
  1947. cbWeaveIndex = m_cbWeaveItemCount[wChairID]++;
  1948. m_WeaveItemArray[wChairID][cbWeaveIndex].cbPublicCard = FALSE;
  1949. m_WeaveItemArray[wChairID][cbWeaveIndex].wProvideUser = wChairID;
  1950. m_WeaveItemArray[wChairID][cbWeaveIndex].cbWeaveKind = cbOperateCode;
  1951. m_WeaveItemArray[wChairID][cbWeaveIndex].cbCenterCard = (cbOperateCard & 0xEF);
  1952. CopyMemory(m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset, cbHuaCard, sizeof(m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset));
  1953. if (cbHuaCard[0] != 0 && (cbHuaCard[0] & 0x10) == 0x10)
  1954. {
  1955. ASSERT(m_cbHuaCardIndex[wChairID][cbCardIndex / 2] > 0);
  1956. m_cbHuaCardIndex[wChairID][cbCardIndex / 2]--;
  1957. m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  1958. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  1959. ASSERT(m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2] <= 2);
  1960. }
  1961. if (cbHuaCard[1] != 0 && (cbHuaCard[1] & 0x10) == 0x10)
  1962. {
  1963. ASSERT(m_cbHuaCardIndex[wChairID][cbCardIndex / 2] > 0);
  1964. m_cbHuaCardIndex[wChairID][cbCardIndex / 2]--;
  1965. m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  1966. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  1967. ASSERT(m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2] <= 2);
  1968. }
  1969. }
  1970. else if ((cbCardIndex == 2 || cbCardIndex == 4 || cbCardIndex == 6) && (m_cbCardIndex[wChairID][cbCardIndex] + m_cbCardIndex[wChairID][22]) >= 4)
  1971. {
  1972. bPublic = false;
  1973. cbWeaveIndex = m_cbWeaveItemCount[wChairID]++;
  1974. m_WeaveItemArray[wChairID][cbWeaveIndex].cbPublicCard = FALSE;
  1975. m_WeaveItemArray[wChairID][cbWeaveIndex].wProvideUser = wChairID;
  1976. m_WeaveItemArray[wChairID][cbWeaveIndex].cbWeaveKind = cbOperateCode;
  1977. m_WeaveItemArray[wChairID][cbWeaveIndex].cbCenterCard = (cbOperateCard & 0xEF);
  1978. CopyMemory(m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset, cbHuaCard, sizeof(m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset));
  1979. if (cbHuaCard[0] != 0 && (cbHuaCard[0] & 0x10) == 0x10)
  1980. {
  1981. ASSERT(m_cbHuaCardIndex[wChairID][cbCardIndex / 2] > 0);
  1982. m_cbHuaCardIndex[wChairID][cbCardIndex / 2]--;
  1983. m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  1984. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  1985. ASSERT(m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2] <= 2);
  1986. }
  1987. if (cbHuaCard[1] != 0 && (cbHuaCard[1] & 0x10) == 0x10)
  1988. {
  1989. ASSERT(m_cbHuaCardIndex[wChairID][cbCardIndex / 2] > 0);
  1990. m_cbHuaCardIndex[wChairID][cbCardIndex / 2]--;
  1991. m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  1992. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  1993. ASSERT(m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2] <= 2);
  1994. }
  1995. if (cbHuaCard[2] == 0x2D)
  1996. {
  1997. ASSERT(m_cbCardIndex[wChairID][22] > 0);
  1998. m_cbCardIndex[wChairID][22]--;
  1999. m_cbCardIndex_Tong[wChairID][22]++;
  2000. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2001. TempCount++;
  2002. }
  2003. if (cbHuaCard[3] == 0x2D)
  2004. {
  2005. ASSERT(m_cbCardIndex[wChairID][22] > 0);
  2006. m_cbCardIndex[wChairID][22]--;
  2007. m_cbCardIndex_Tong[wChairID][22]++;
  2008. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2009. TempCount++;
  2010. }
  2011. }
  2012. else
  2013. {
  2014. ASSERT(false);
  2015. return false;
  2016. }
  2017. }
  2018. else if (m_cbCardIndex[wChairID][cbCardIndex] >= 4)
  2019. {
  2020. //设置变量
  2021. bPublic = false;
  2022. cbWeaveIndex = m_cbWeaveItemCount[wChairID]++;
  2023. m_WeaveItemArray[wChairID][cbWeaveIndex].cbPublicCard = FALSE;
  2024. m_WeaveItemArray[wChairID][cbWeaveIndex].wProvideUser = wChairID;
  2025. m_WeaveItemArray[wChairID][cbWeaveIndex].cbWeaveKind = cbOperateCode;
  2026. m_WeaveItemArray[wChairID][cbWeaveIndex].cbCenterCard = cbOperateCard;
  2027. //CopyMemory(m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset, cbHuaCard, sizeof(m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset));
  2028. }
  2029. else
  2030. {
  2031. ASSERT(false);
  2032. return false;
  2033. }
  2034. m_cbUserAction[m_wCurrentUser]=WIK_NULL;
  2035. m_cbPerformAction[m_wCurrentUser]=WIK_NULL;
  2036. //删除扑克
  2037. ASSERT(m_cbCardIndex[wChairID][cbCardIndex] >= (4 - TempCount));
  2038. m_cbCardIndex[wChairID][cbCardIndex] -= (4 - TempCount);
  2039. m_cbCardIndex_Tong[wChairID][cbCardIndex] += (4 - TempCount);
  2040. m_cbTongCount[wChairID]++;
  2041. //m_wDianGangUser = wChairID;
  2042. //构造结果
  2043. CMD_S_OperateResult_Hua OperateResult;
  2044. OperateResult.wOperateUser = wChairID;
  2045. OperateResult.wProvideUser = wChairID;
  2046. OperateResult.cbOperateCode = cbOperateCode;
  2047. OperateResult.cbOperateCard = cbOperateCard;
  2048. OperateResult.cbActionMask = WIK_NULL;
  2049. OperateResult.cbOperateScore = m_cbOperateScore[wChairID];
  2050. CopyMemory(OperateResult.cbHuaGangCard, m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset, sizeof(OperateResult.cbHuaGangCard));
  2051. ZeroMemory(OperateResult.cbActionCard, sizeof(OperateResult.cbActionCard));
  2052. //发送消息
  2053. for (BYTE i = 0; i < GAME_PLAY; i++)
  2054. {
  2055. if (i == wChairID)
  2056. {
  2057. OperateResult.cbOperateCard = cbOperateCard;
  2058. CopyMemory(OperateResult.cbHuaGangCard, m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset, sizeof(OperateResult.cbHuaGangCard));
  2059. m_pITableFrame->SendTableData(i, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2060. }
  2061. else
  2062. {
  2063. OperateResult.cbOperateCard = 0;
  2064. ZeroMemory(OperateResult.cbHuaGangCard, sizeof(OperateResult.cbHuaGangCard));
  2065. m_pITableFrame->SendTableData(i, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2066. }
  2067. }
  2068. OperateResult.cbOperateCard = 0;
  2069. ZeroMemory(OperateResult.cbHuaGangCard, sizeof(OperateResult.cbHuaGangCard));
  2070. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2071. OperateResult.cbOperateCard = cbOperateCard;
  2072. CopyMemory(OperateResult.cbHuaGangCard, m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset, sizeof(OperateResult.cbHuaGangCard));
  2073. RepayRecord(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2074. if (m_cbOutCardCount == 0 && wChairID != m_wBankerUser)
  2075. {
  2076. DispatchCardData(wChairID, true);
  2077. }
  2078. else
  2079. {
  2080. DispatchCardData(wChairID);
  2081. }
  2082. return true;
  2083. }
  2084. case WIK_WU_TONG: //五统
  2085. {
  2086. //扑克效验
  2087. ASSERT((cbOperateCode == WIK_NULL) || (cbOperateCode == WIK_WU_TONG) || (m_GameLogic.IsValidCard(cbOperateCard) == true));
  2088. if ((cbOperateCode != WIK_WU_TONG) && (m_GameLogic.IsValidCard(cbOperateCard) == false))
  2089. return false;
  2090. BYTE cbWeaveIndex = 0xFF;
  2091. BYTE cbCardIndex = m_GameLogic.SwitchToCardIndex(cbOperateCard);
  2092. //寻找组合
  2093. for (BYTE i = 0; i < m_cbWeaveItemCount[wChairID]; i++)
  2094. {
  2095. BYTE cbWeaveKind = m_WeaveItemArray[wChairID][i].cbWeaveKind;
  2096. BYTE cbCenterCard = m_WeaveItemArray[wChairID][i].cbCenterCard;
  2097. if (cbWeaveKind == WIK_SI_TONG)
  2098. {
  2099. if (((cbOperateCard & 0x20) == 0x20) && ((cbCenterCard & 0x20) == 0x20))
  2100. {
  2101. if (cbCenterCard == cbOperateCard)
  2102. {
  2103. bPublic = true;
  2104. cbWeaveIndex = i;
  2105. break;
  2106. }
  2107. }
  2108. else
  2109. {
  2110. if ((cbCenterCard & 0x0F) == (cbOperateCard & 0x0F))
  2111. {
  2112. bPublic = true;
  2113. cbWeaveIndex = i;
  2114. break;
  2115. }
  2116. }
  2117. }
  2118. }
  2119. //效验动作
  2120. ASSERT(cbWeaveIndex != 0xFF);
  2121. if (cbWeaveIndex == 0xFF) return false;
  2122. //删除扑克
  2123. if (cbCardIndex == 2 || cbCardIndex == 4 || cbCardIndex == 6)
  2124. {
  2125. if (cbHuaCard[2] == 0x2D)
  2126. {
  2127. m_cbCardIndex[wChairID][22]--;
  2128. m_cbCardIndex_Tong[wChairID][22]++;
  2129. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2130. if (m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[2] == cbOperateCard)
  2131. {
  2132. m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[3] == cbOperateCard;
  2133. }
  2134. else
  2135. {
  2136. m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[2] == cbOperateCard;
  2137. }
  2138. }
  2139. else if (cbHuaCard[0] == cbOperateCard)
  2140. {
  2141. ASSERT(m_cbCardIndex[wChairID][cbCardIndex] > 0);
  2142. m_cbCardIndex[wChairID][cbCardIndex] --;
  2143. ASSERT(m_cbHuaCardIndex[wChairID][cbCardIndex / 2] > 0);
  2144. m_cbHuaCardIndex[wChairID][cbCardIndex / 2]--;
  2145. m_cbCardIndex_Tong[wChairID][cbCardIndex]++;
  2146. m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2147. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2148. ASSERT(m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2] <= 2);
  2149. if (m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[0] == cbOperateCard)
  2150. {
  2151. m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[1] == cbOperateCard;
  2152. }
  2153. else
  2154. {
  2155. ASSERT(false);
  2156. m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[0] == cbOperateCard;
  2157. }
  2158. }
  2159. else if (m_cbCardIndex[wChairID][cbCardIndex] >= 1)
  2160. {
  2161. if (m_cbHuaCardIndex[wChairID][cbCardIndex / 2] >= 1)
  2162. {
  2163. ASSERT(m_cbCardIndex[wChairID][cbCardIndex] > 0);
  2164. m_cbCardIndex[wChairID][cbCardIndex] --;
  2165. ASSERT(m_cbHuaCardIndex[wChairID][cbCardIndex / 2] > 0);
  2166. m_cbHuaCardIndex[wChairID][cbCardIndex / 2]--;
  2167. m_cbCardIndex_Tong[wChairID][cbCardIndex]++;
  2168. m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2169. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2170. ASSERT(m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2] <= 2);
  2171. if (m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[0] == cbHuaCard[0])
  2172. {
  2173. m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[1] == cbHuaCard[0];
  2174. }
  2175. else
  2176. {
  2177. ASSERT(false);
  2178. }
  2179. }
  2180. else
  2181. {
  2182. ASSERT(m_cbCardIndex[wChairID][cbCardIndex] > 0);
  2183. m_cbCardIndex[wChairID][cbCardIndex] --;
  2184. m_cbCardIndex_Tong[wChairID][cbCardIndex]++;
  2185. }
  2186. }
  2187. else
  2188. {
  2189. ASSERT(false);
  2190. return false;
  2191. }
  2192. }
  2193. else
  2194. {
  2195. if (m_cbCardIndex[wChairID][cbCardIndex] >= 1)//表示续杠类型
  2196. {
  2197. if (cbOperateCard == cbHuaCard[0])
  2198. {
  2199. ASSERT(m_cbCardIndex[wChairID][cbCardIndex] > 0);
  2200. m_cbCardIndex[wChairID][cbCardIndex] --;
  2201. ASSERT(m_cbHuaCardIndex[wChairID][cbCardIndex / 2] > 0);
  2202. m_cbHuaCardIndex[wChairID][cbCardIndex / 2]--;
  2203. m_cbCardIndex_Tong[wChairID][cbCardIndex]++;
  2204. m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2205. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2206. ASSERT(m_cbHuaCardIndex_Tong[wChairID][cbCardIndex / 2] <= 2);
  2207. if (m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[0] == cbOperateCard)
  2208. {
  2209. m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[1] == cbOperateCard;
  2210. }
  2211. else
  2212. {
  2213. m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[0] == cbOperateCard;
  2214. }
  2215. }
  2216. else
  2217. {
  2218. m_cbCardIndex[wChairID][cbCardIndex] --;
  2219. m_cbCardIndex_Tong[wChairID][cbCardIndex]++;
  2220. }
  2221. }
  2222. else
  2223. {
  2224. ASSERT(false);
  2225. return false;
  2226. }
  2227. }
  2228. //组合扑克
  2229. m_WeaveItemArray[wChairID][cbWeaveIndex].cbPublicCard = TRUE;
  2230. m_WeaveItemArray[wChairID][cbWeaveIndex].wProvideUser = wChairID;
  2231. m_WeaveItemArray[wChairID][cbWeaveIndex].cbWeaveKind = cbOperateCode;
  2232. m_WeaveItemArray[wChairID][cbWeaveIndex].cbCenterCard = cbOperateCard;
  2233. m_cbUserAction[m_wCurrentUser] = WIK_NULL;
  2234. m_cbPerformAction[m_wCurrentUser] = WIK_NULL;
  2235. m_cbTongCount[wChairID]++;
  2236. //构造结果
  2237. CMD_S_OperateResult_Hua OperateResult;
  2238. OperateResult.wOperateUser = wChairID;
  2239. OperateResult.wProvideUser = wChairID;
  2240. OperateResult.cbOperateCode = cbOperateCode;
  2241. //OperateResult.cbOperateCard = cbOperateCard;
  2242. OperateResult.cbActionMask = WIK_NULL;
  2243. OperateResult.cbOperateScore = m_cbOperateScore[wChairID];
  2244. ZeroMemory(OperateResult.cbActionCard, sizeof(OperateResult.cbActionCard));
  2245. //CopyMemory(OperateResult.cbHuaGangCard, m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset, sizeof(OperateResult.cbHuaGangCard));
  2246. //发送消息
  2247. for (BYTE i = 0; i < GAME_PLAY; i++)
  2248. {
  2249. if (i == wChairID)
  2250. {
  2251. OperateResult.cbOperateCard = cbOperateCard;
  2252. CopyMemory(OperateResult.cbHuaGangCard, cbHuaCard, sizeof(OperateResult.cbHuaGangCard));
  2253. m_pITableFrame->SendTableData(i, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2254. }
  2255. else
  2256. {
  2257. OperateResult.cbOperateCard = 0;
  2258. ZeroMemory(OperateResult.cbHuaGangCard, sizeof(OperateResult.cbHuaGangCard));
  2259. m_pITableFrame->SendTableData(i, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2260. }
  2261. }
  2262. OperateResult.cbOperateCard = 0;
  2263. ZeroMemory(OperateResult.cbHuaGangCard, sizeof(OperateResult.cbHuaGangCard));
  2264. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2265. OperateResult.cbOperateCard = cbOperateCard;
  2266. CopyMemory(OperateResult.cbHuaGangCard, cbHuaCard, sizeof(OperateResult.cbHuaGangCard));
  2267. RepayRecord(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2268. //派发扑克
  2269. if (m_cbOutCardCount == 0 && wChairID != m_wBankerUser)
  2270. {
  2271. DispatchCardData(m_wCurrentUser,true);
  2272. return true;
  2273. }
  2274. else
  2275. {
  2276. DispatchCardData(m_wCurrentUser);
  2277. return true;
  2278. }
  2279. return true;
  2280. }
  2281. case WIK_SI_ZHAO: //补招,泛
  2282. {
  2283. //扑克效验
  2284. ASSERT((cbOperateCode == WIK_NULL) || (cbOperateCode == WIK_SI_ZHAO) || (m_GameLogic.IsValidCard(cbOperateCard) == true));
  2285. if ((cbOperateCode != WIK_SI_ZHAO) && (m_GameLogic.IsValidCard(cbOperateCard) == false))
  2286. return false;
  2287. BYTE cbWeaveIndex = 0xFF;
  2288. BYTE cbWeaveIndex_Hu = 0xFF;
  2289. BYTE TempScore = 0;
  2290. BYTE cbCardIndex = m_GameLogic.SwitchToCardIndex(cbOperateCard);
  2291. //杠牌处理
  2292. if (m_cbCardIndex[wChairID][cbCardIndex] == 1)//表示续杠类型
  2293. {
  2294. //寻找组合
  2295. for (BYTE i = 0; i < m_cbWeaveItemCount[wChairID]; i++)
  2296. {
  2297. BYTE cbWeaveKind = m_WeaveItemArray[wChairID][i].cbWeaveKind;
  2298. BYTE cbCenterCard = m_WeaveItemArray[wChairID][i].cbCenterCard;
  2299. if ((cbWeaveKind == WIK_SAN_ZHAO) && (m_GameLogic.SwitchToCardIndex(cbCenterCard) == cbCardIndex))
  2300. {
  2301. bPublic = true;
  2302. cbWeaveIndex = i;
  2303. break;
  2304. }
  2305. }
  2306. //效验动作
  2307. ASSERT(cbWeaveIndex != 0xFF);
  2308. if (cbWeaveIndex == 0xFF) return false;
  2309. TempScore = GetOperatorScore(WIK_SAN_ZHAO, cbCardIndex, m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset);
  2310. //组合扑克
  2311. m_WeaveItemArray[wChairID][cbWeaveIndex].cbPublicCard = TRUE;
  2312. m_WeaveItemArray[wChairID][cbWeaveIndex].wProvideUser = wChairID;
  2313. m_WeaveItemArray[wChairID][cbWeaveIndex].cbWeaveKind = cbOperateCode;
  2314. m_WeaveItemArray[wChairID][cbWeaveIndex].cbCenterCard = (cbOperateCard & 0xEF);
  2315. for (BYTE i = 0; i < m_cbWeaveItemCount_HuPai[wChairID]; i++)
  2316. {
  2317. BYTE cbWeaveKind = m_WeaveItemArray_HuPai[wChairID][i].cbWeaveKind;
  2318. BYTE cbCenterCard = m_WeaveItemArray_HuPai[wChairID][i].cbCenterCard;
  2319. if ((cbWeaveKind == WIK_SAN_ZHAO) && (m_GameLogic.SwitchToCardIndex(cbCenterCard) == cbCardIndex))
  2320. {
  2321. bPublic = true;
  2322. cbWeaveIndex_Hu = i;
  2323. break;
  2324. }
  2325. }
  2326. ASSERT(cbWeaveIndex_Hu != 0xFF);
  2327. if (cbWeaveIndex_Hu == 0xFF) return false;
  2328. //组合扑克
  2329. m_WeaveItemArray_HuPai[wChairID][cbWeaveIndex_Hu].cbPublicCard = TRUE;
  2330. m_WeaveItemArray_HuPai[wChairID][cbWeaveIndex_Hu].cbCenterCard = (cbOperateCard & 0xEF);
  2331. m_WeaveItemArray_HuPai[wChairID][cbWeaveIndex_Hu].cbWeaveKind = cbOperateCode;
  2332. m_WeaveItemArray_HuPai[wChairID][cbWeaveIndex_Hu].wProvideUser = wChairID;
  2333. if (cbOperateCard & 0x10)
  2334. {
  2335. ASSERT(m_cbHuaCardIndex[wChairID][cbCardIndex / 2] > 0);
  2336. m_cbHuaCardIndex[wChairID][cbCardIndex / 2]--;
  2337. m_cbHuaWeaveCardIndex[wChairID][cbCardIndex / 2]++;
  2338. //m_cbHuaWeaveCardIndex_Tong[wChairID][cbCardIndex / 2]++;
  2339. m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset[1] = cbOperateCard;
  2340. m_WeaveItemArray_HuPai[wChairID][cbWeaveIndex_Hu].cbMargicOffset[1] = cbOperateCard;
  2341. }
  2342. }
  2343. else
  2344. return false;
  2345. BYTE TempCardData[1] = { cbOperateCard };
  2346. if(!DeleteHandCardData(wChairID, TempCardData, 1))
  2347. {
  2348. return false;
  2349. }
  2350. //删除扑克
  2351. ASSERT(m_cbCardIndex[wChairID][cbCardIndex] > 0);
  2352. m_cbCardIndex[wChairID][cbCardIndex]--;
  2353. m_cbOperateScore[wChairID] += GetOperatorScore(WIK_SI_ZHAO, cbCardIndex, m_WeaveItemArray[wChairID][cbWeaveIndex].cbMargicOffset);
  2354. m_cbOperateScore[wChairID] -= TempScore;
  2355. //m_wDianGangUser = wChairID;
  2356. m_cbUserAction[m_wCurrentUser] = WIK_NULL;
  2357. m_cbPerformAction[m_wCurrentUser] = WIK_NULL;
  2358. //构造结果
  2359. CMD_S_OperateResult_Hua OperateResult;
  2360. OperateResult.wOperateUser = wChairID;
  2361. OperateResult.wProvideUser = wChairID;
  2362. OperateResult.cbOperateCode = cbOperateCode;
  2363. OperateResult.cbOperateCard = cbOperateCard;
  2364. OperateResult.cbOperateScore = m_cbOperateScore[wChairID];
  2365. OperateResult.cbActionMask = WIK_NULL;
  2366. CopyMemory(OperateResult.cbHuaGangCard, cbHuaCard, sizeof(OperateResult.cbHuaGangCard));
  2367. ZeroMemory(OperateResult.cbActionCard, sizeof(OperateResult.cbActionCard));
  2368. RepayRecord(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2369. //发送消息
  2370. m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2371. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2372. DispatchCardData(m_wCurrentUser);
  2373. return true;
  2374. }
  2375. case WIK_ZI_MO: //自摸和牌
  2376. {
  2377. int TempAction = WIK_NULL;
  2378. BYTE TempCardIndex[MAX_INDEX_HUA] = { 0 };
  2379. BYTE TempHuaCardIndex[5] = { 0 };
  2380. CopyMemory(TempCardIndex, m_cbCardIndex[wChairID], sizeof(TempCardIndex));
  2381. CopyMemory(TempHuaCardIndex, m_cbHuaCardIndex[wChairID], sizeof(TempHuaCardIndex));
  2382. m_GameLogic.HeBingCardIndex(TempCardIndex, m_cbCardIndex_Tong[wChairID], TempHuaCardIndex, m_cbHuaCardIndex_Tong[wChairID]);
  2383. TempAction |= m_GameLogic.AnalyseHuCard(TempCardIndex, TempHuaCardIndex, 0, m_WeaveItemArray_HuPai[wChairID], m_cbWeaveItemCount_HuPai[wChairID], m_cbHuaWeaveCardIndex[wChairID], m_cbTongCount[wChairID], ChiHu);
  2384. if (TempAction == WIK_NULL)
  2385. {
  2386. return false;
  2387. }
  2388. m_HuPai[wChairID]++;
  2389. CMD_S_OperateResult_Hua OperateResult;
  2390. ZeroMemory(&OperateResult, sizeof(OperateResult));
  2391. OperateResult.wOperateUser = wChairID;
  2392. OperateResult.cbOperateCard = m_cbProvideCard;
  2393. OperateResult.cbOperateCode = WIK_ZI_MO;
  2394. OperateResult.wProvideUser = wChairID;
  2395. RepayRecord(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2396. //发送消息
  2397. m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2398. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_OPERATE_RESULT_HUA, &OperateResult, sizeof(OperateResult));
  2399. //结束
  2400. OnEventGameConclude(wChairID, NULL, GER_NORMAL);
  2401. return true;
  2402. }
  2403. default:
  2404. ASSERT(FALSE);
  2405. return false;
  2406. }
  2407. return true;
  2408. }
  2409. return true;
  2410. }
  2411. //发送操作
  2412. bool TableFrameSinkZhiPai::SendOperateNotify()
  2413. {
  2414. //发送提示
  2415. for (WORD i=0;i<GAME_PLAY;i++)
  2416. {
  2417. if (m_cbUserAction[i]!=WIK_NULL)
  2418. {
  2419. //构造数据
  2420. CMD_S_OperateNotify_Hua OperateNotify;
  2421. ZeroMemory(&OperateNotify, sizeof(OperateNotify));
  2422. OperateNotify.wResumeUser=m_wResumeUser;
  2423. OperateNotify.cbActionCard=m_cbProvideCard;
  2424. OperateNotify.cbActionMask=m_cbUserAction[i];
  2425. if (OperateNotify.cbActionMask&WIK_CHI_HU)
  2426. {
  2427. OperateNotify.HuShu = EsponseHuShu[i];
  2428. OperateNotify.PaPo = EsponsePaPoShu[i];
  2429. }
  2430. //发送数据
  2431. m_pITableFrame->SendTableData(i, SUB_S_OPERATE_NOTIFY_HUA, &OperateNotify, sizeof(OperateNotify));
  2432. }
  2433. }
  2434. return true;
  2435. }
  2436. //派发扑克,wCurrentUser表示给哪个用户,bTail表示是末尾拿牌还是不是,true表示末尾
  2437. bool TableFrameSinkZhiPai::DispatchCardData(WORD wCurrentUser, bool bTail)
  2438. {
  2439. //状态效验
  2440. ASSERT(wCurrentUser != INVALID_CHAIR);
  2441. if (wCurrentUser == INVALID_CHAIR)
  2442. return false;
  2443. //丢弃扑克
  2444. if ((m_wOutCardUser != INVALID_CHAIR) && (m_cbOutCardData != 0))
  2445. {
  2446. m_cbDiscardCount[m_wOutCardUser]++;
  2447. m_cbDiscardCard[m_wOutCardUser][m_cbDiscardCount[m_wOutCardUser] - 1] = m_cbOutCardData;
  2448. }
  2449. //荒庄结束
  2450. if (m_cbLeftCardCount == 0)
  2451. {
  2452. m_wProvideUser = (wCurrentUser + 1) % GAME_PLAY;
  2453. bIsHuang = true;
  2454. OnEventGameConclude(INVALID_CHAIR, NULL, GER_NORMAL);
  2455. return true;
  2456. }
  2457. //设置变量
  2458. m_cbOutCardData = 0;
  2459. m_wCurrentUser = wCurrentUser; //当前玩家
  2460. m_wOutCardUser = INVALID_CHAIR; //置空上次出牌用户的索引
  2461. BYTE ActionCard[6] = { 0 }; //操作牌值
  2462. //发送扑克
  2463. DWORD timet = GetTickCount();
  2464. m_cbSendCardCount++;
  2465. switch (bGameType)
  2466. {
  2467. case huapai:
  2468. {
  2469. m_cbSendCardData = m_cbRepertoryCard_Two[--m_cbLeftCardCount];
  2470. break;
  2471. }
  2472. case huapai2:
  2473. {
  2474. m_cbSendCardData = m_cbRepertoryCard_One[--m_cbLeftCardCount];
  2475. break;
  2476. }
  2477. case huapai3:
  2478. {
  2479. m_cbSendCardData = m_cbRepertoryCard[--m_cbLeftCardCount];
  2480. break;
  2481. }
  2482. default:
  2483. {
  2484. ASSERT(false);
  2485. break;
  2486. }
  2487. }
  2488. //加牌
  2489. m_cbCardIndex[wCurrentUser][m_GameLogic.SwitchToCardIndex(m_cbSendCardData)]++;
  2490. if ((m_cbSendCardData & 0x10) == 0x10)
  2491. {
  2492. BYTE TempIndex = m_GameLogic.SwitchToCardIndex(m_cbSendCardData);
  2493. m_cbHuaCardIndex[wCurrentUser][TempIndex / 2]++;
  2494. }
  2495. BYTE TempWeiZhi = 0xff;
  2496. for (BYTE i = 0; i < 9; i++)
  2497. {
  2498. if (m_cbGamePlayerHandCard[wCurrentUser][8][i] == 0)
  2499. {
  2500. m_cbGamePlayerHandCard[wCurrentUser][8][i] = m_cbSendCardData;
  2501. TempWeiZhi = i;
  2502. break;
  2503. }
  2504. }
  2505. if (TempWeiZhi == 0xff)
  2506. {
  2507. for (BYTE i = 0; i < 9; i++)
  2508. {
  2509. if (m_cbGamePlayerHandCard[wCurrentUser][7][i] == 0)
  2510. {
  2511. m_cbGamePlayerHandCard[wCurrentUser][7][i] = m_cbSendCardData;
  2512. TempWeiZhi = i;
  2513. break;
  2514. }
  2515. }
  2516. }
  2517. ZeroMemory(m_cbUserAction, sizeof(m_cbUserAction));
  2518. if (bTail == false)
  2519. {
  2520. tagHuCardResult chr;
  2521. BYTE TempCardIndex[MAX_INDEX_HUA] = { 0 };
  2522. BYTE TempHuaCardIndex[5] = { 0 };
  2523. CopyMemory(TempCardIndex, m_cbCardIndex[wCurrentUser], sizeof(TempCardIndex));
  2524. CopyMemory(TempHuaCardIndex, m_cbHuaCardIndex[wCurrentUser], sizeof(TempHuaCardIndex));
  2525. m_GameLogic.HeBingCardIndex(TempCardIndex, m_cbCardIndex_Tong[wCurrentUser], TempHuaCardIndex, m_cbHuaCardIndex_Tong[wCurrentUser]);
  2526. m_cbUserAction[wCurrentUser] |= m_GameLogic.AnalyseHuCard(TempCardIndex, TempHuaCardIndex, 0, m_WeaveItemArray_HuPai[wCurrentUser], m_cbWeaveItemCount_HuPai[wCurrentUser], m_cbHuaWeaveCardIndex[wCurrentUser], m_cbTongCount[wCurrentUser], chr);
  2527. if (m_cbUserAction[wCurrentUser] & WIK_ZI_MO)
  2528. {
  2529. EsponseHuShu[wCurrentUser] = chr.bHuPoint;
  2530. if (m_gameConfig.GameScoreType == 0)
  2531. {
  2532. EsponsePaPoShu[wCurrentUser] = (chr.bHuPoint - 17) / 5 + 1;
  2533. }
  2534. }
  2535. }
  2536. //设置变量
  2537. m_wProvideUser = wCurrentUser; //提供人,
  2538. m_cbProvideCard = m_cbSendCardData; //提供牌,
  2539. //杠牌判断
  2540. tagGangCardResult_Hua GangCardResult;
  2541. ZeroMemory(&GangCardResult, sizeof(GangCardResult));
  2542. if (m_cbLeftCardCount > 0)
  2543. {
  2544. m_cbUserAction[wCurrentUser] |= m_GameLogic.AnalyseGangCard(m_cbCardIndex[wCurrentUser], m_cbHuaCardIndex[wCurrentUser],
  2545. m_WeaveItemArray[wCurrentUser], m_cbWeaveItemCount[wCurrentUser], GangCardResult);
  2546. }
  2547. WORD TempNextUser = INVALID_CHAIR;//临时用户,记录当前用户的下一个可以请统用户
  2548. if (bTail&&m_cbOutCardCount == 0 && m_cbUserAction[wCurrentUser] == WIK_NULL&&wCurrentUser != m_wBankerUser)//当前用户五统了,进行下一家判断
  2549. {
  2550. if (wCurrentUser == 0)
  2551. {
  2552. TempNextUser = 2;
  2553. }
  2554. else
  2555. {
  2556. TempNextUser = wCurrentUser - 1;
  2557. }
  2558. m_cbUserAction[TempNextUser] |= m_GameLogic.AnalyseGangCard(m_cbCardIndex[TempNextUser], m_cbHuaCardIndex[TempNextUser],
  2559. m_WeaveItemArray[TempNextUser], m_cbWeaveItemCount[TempNextUser], GangCardResult);
  2560. if (TempNextUser != m_wBankerUser && m_cbUserAction[TempNextUser] == WIK_NULL)
  2561. {
  2562. if (TempNextUser == 0)
  2563. {
  2564. TempNextUser = 2;
  2565. }
  2566. else
  2567. {
  2568. TempNextUser--;
  2569. }
  2570. m_cbUserAction[TempNextUser] |= m_GameLogic.AnalyseGangCard(m_cbCardIndex[TempNextUser], m_cbHuaCardIndex[TempNextUser],
  2571. m_WeaveItemArray[TempNextUser], m_cbWeaveItemCount[TempNextUser], GangCardResult);
  2572. }
  2573. }
  2574. DWORD t2 = GetTickCount();
  2575. DWORD hh = t2 - timet;
  2576. CString csTemp;
  2577. //csTemp.Format(L"时间:%d \r\n", hh);
  2578. OutputDebugString(csTemp);
  2579. //构造数据.
  2580. CMD_S_SendCard_Hua SendCard;
  2581. ZeroMemory(&SendCard, sizeof(SendCard));
  2582. SendCard.wCurrentUser = wCurrentUser;
  2583. SendCard.bTail = bTail;
  2584. SendCard.bLeftCardCount = m_cbLeftCardCount;
  2585. m_cbUserAction[wCurrentUser] |= (bTail == false ? WIK_BH_WJCP : WIK_NULL);
  2586. SendCard.cbCardData = m_cbSendCardData;
  2587. RepayRecord(INVALID_CHAIR, SUB_S_SEND_CARD_HUA, &SendCard, sizeof(SendCard));
  2588. //发送数据
  2589. for (int i = 0; i < GAME_PLAY; i++)
  2590. {
  2591. if (i == m_wCurrentUser)
  2592. {//发送给摸牌玩家的数据,附带麻将牌面数据
  2593. for (BYTE j = 0; j < GangCardResult.cbCardCount; j++)
  2594. SendCard.cbActionCard[j] = GangCardResult.cbCardData[j];
  2595. SendCard.cbCardData = m_cbSendCardData;
  2596. SendCard.cbActionMask = m_cbUserAction[wCurrentUser];
  2597. if (SendCard.cbActionMask & WIK_ZI_MO)
  2598. {
  2599. SendCard.HuShu = EsponseHuShu[i];
  2600. SendCard.PaPoShu = EsponsePaPoShu[i];
  2601. }
  2602. m_pITableFrame->SendTableData(i, SUB_S_SEND_CARD_HUA, &SendCard, sizeof(SendCard));
  2603. }
  2604. else
  2605. {//发送给其他玩家的数据,没有麻将牌面数据(防止客户端作弊)
  2606. ZeroMemory(SendCard.cbActionCard, sizeof(SendCard.cbActionCard));
  2607. SendCard.cbCardData = 0x00;
  2608. SendCard.cbActionMask = m_cbUserAction[i];
  2609. SendCard.HuShu = 0;
  2610. SendCard.PaPoShu = 0;
  2611. m_pITableFrame->SendTableData(i, SUB_S_SEND_CARD_HUA, &SendCard, sizeof(SendCard));
  2612. }
  2613. }
  2614. SendCard.cbActionMask = 0;
  2615. SendCard.cbCardData = 0;
  2616. ZeroMemory(SendCard.cbActionCard, sizeof(SendCard.cbActionCard));
  2617. //给旁观者的抓牌动作
  2618. m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_SEND_CARD_HUA, &SendCard, sizeof(SendCard));
  2619. if (bTail&&m_cbOutCardCount == 0 && TempNextUser != INVALID_CHAIR && (m_cbUserAction[TempNextUser] == WIK_SI_TONG))
  2620. {
  2621. CMD_S_QingTongNotify QingTong;
  2622. ZeroMemory(&QingTong, sizeof(QingTong));
  2623. QingTong.OperatorUser = TempNextUser;
  2624. for (BYTE i = 0; i < GAME_PLAY; i++)
  2625. {
  2626. if (i == TempNextUser)
  2627. {
  2628. if (i == m_wBankerUser)
  2629. {
  2630. m_cbUserAction[TempNextUser] |= WIK_BH_WJCP;
  2631. }
  2632. QingTong.cbActionMask = m_cbUserAction[TempNextUser];
  2633. CopyMemory(QingTong.cbActionCard, GangCardResult.cbCardData, sizeof(GangCardResult.cbCardData));
  2634. m_pITableFrame->SendTableData(TempNextUser, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  2635. m_wCurrentUser = TempNextUser;
  2636. }
  2637. else
  2638. {
  2639. QingTong.cbActionMask = WIK_NULL;
  2640. ZeroMemory(QingTong.cbActionCard, sizeof(QingTong.cbActionCard));
  2641. m_pITableFrame->SendTableData(i, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  2642. }
  2643. }
  2644. m_wCurrentUser = TempNextUser;
  2645. return true;
  2646. }
  2647. if (bTail&&m_cbOutCardCount == 0 && TempNextUser == m_wBankerUser && m_cbUserAction[TempNextUser] == WIK_NULL)
  2648. {
  2649. CMD_S_QingTongNotify QingTong;
  2650. ZeroMemory(&QingTong, sizeof(QingTong));
  2651. QingTong.OperatorUser = TempNextUser;
  2652. for (BYTE i = 0; i < GAME_PLAY; i++)
  2653. {
  2654. if (i == TempNextUser)
  2655. {
  2656. m_cbUserAction[TempNextUser] = WIK_BH_WJCP;
  2657. QingTong.cbActionMask = WIK_BH_WJCP;
  2658. m_pITableFrame->SendTableData(TempNextUser, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  2659. }
  2660. else
  2661. {
  2662. QingTong.cbActionMask = WIK_NULL;
  2663. m_pITableFrame->SendTableData(i, SUB_S_QINGTONG_NOTIFY_HUA, &QingTong, sizeof(QingTong));
  2664. }
  2665. }
  2666. m_wCurrentUser = m_wBankerUser;
  2667. }
  2668. return true;
  2669. //if (m_TabbOutCardCout[m_wCurrentUser] > 0)//有听牌就发一个听牌协议
  2670. //{
  2671. // HttpTingCard(m_wCurrentUser);
  2672. //}
  2673. //if (b_wIsGangTing[wCurrentUser] && m_cbUserAction[wCurrentUser] == WIK_NULL)//上面是发完起牌动作,开始判断是否是听牌
  2674. //{
  2675. // m_pITableFrame->SetGameTimer(13, 1000, -1, wCurrentUser);//调用定时器,自动出牌
  2676. //}
  2677. }
  2678. //响应判断
  2679. bool TableFrameSinkZhiPai::EstimateUserRespond(WORD wCenterUser, BYTE cbCenterCard, enEstimatKind EstimatKind)
  2680. {
  2681. //变量定义
  2682. bool bAroseAction[GAME_PLAY] = { false };
  2683. bool mbAroseAction = false;
  2684. //用户状态
  2685. ZeroMemory(m_bResponse, sizeof(m_bResponse));
  2686. ZeroMemory(m_cbUserAction, sizeof(m_cbUserAction));
  2687. ZeroMemory(m_cbPerformAction, sizeof(m_cbPerformAction));
  2688. ZeroMemory(EsponseHuShu, sizeof(EsponseHuShu));//胡数
  2689. ZeroMemory(EsponsePaPoShu, sizeof(EsponsePaPoShu));//爬坡数
  2690. if (cbCenterCard == 0x2D)return false;
  2691. //动作判断
  2692. for (WORD i = 0; i < GAME_PLAY; i++)
  2693. {
  2694. //用户过滤
  2695. if (wCenterUser == i)
  2696. continue;
  2697. //出牌类型
  2698. if (EstimatKind == EstimatKind_OutCard)
  2699. {
  2700. tagHuCardResult chr;
  2701. BYTE TempCardIndex[MAX_INDEX_HUA] = { 0 };
  2702. BYTE TempHuaCardIndex[5] = { 0 };
  2703. CopyMemory(TempCardIndex, m_cbCardIndex[i], sizeof(TempCardIndex));
  2704. CopyMemory(TempHuaCardIndex, m_cbHuaCardIndex[i], sizeof(TempHuaCardIndex));
  2705. m_GameLogic.HeBingCardIndex(TempCardIndex, m_cbCardIndex_Tong[i], TempHuaCardIndex, m_cbHuaCardIndex_Tong[i]);
  2706. int wAction = m_GameLogic.AnalyseHuCard(TempCardIndex, TempHuaCardIndex, cbCenterCard, m_WeaveItemArray_HuPai[i], m_cbWeaveItemCount_HuPai[i], m_cbHuaWeaveCardIndex[i], m_cbTongCount[i], chr);
  2707. if (wAction != WIK_NULL)
  2708. {
  2709. m_cbUserAction[i] = WIK_CHI_HU;
  2710. EsponseHuShu[i] = chr.bHuPoint;
  2711. EsponsePaPoShu[i] = (chr.bHuPoint - 17) / 5 + 1;
  2712. }
  2713. if (m_cbDuiOperator[i] < 2)
  2714. {
  2715. //碰牌判断
  2716. m_cbUserAction[i] |= m_GameLogic.EstimatePengCard(m_cbCardIndex[i], cbCenterCard);
  2717. }
  2718. if (m_cbLeftCardCount > 0)//杠牌判断
  2719. {
  2720. m_cbUserAction[i] |= m_GameLogic.EstimateGangCard(m_cbCardIndex[i], cbCenterCard, m_WeaveItemArray[i], m_cbWeaveItemCount[i]);
  2721. }
  2722. }
  2723. //结果判断
  2724. if (m_cbUserAction[i] != WIK_NULL)
  2725. {
  2726. bAroseAction[i] = true;
  2727. if (m_cbUserAction[i] & (WIK_CHI_HU | WIK_DUI))
  2728. {
  2729. //记忆牌有多少张
  2730. for (BYTE j = 0; j < m_cbLastDisCount[i]; j++)
  2731. {
  2732. //如果在一圈中 记忆2个一样的牌 则不能操作
  2733. if (m_cbLastDisCardData[i][j] == cbCenterCard)
  2734. {
  2735. m_cbUserAction[i] = m_cbUserAction[i] & (~(WIK_CHI_HU | WIK_DUI));
  2736. if (m_cbUserAction[i] == WIK_NULL)
  2737. bAroseAction[i] = false;
  2738. }
  2739. }
  2740. }
  2741. }
  2742. }//动作判断for结束
  2743. for (int i = 0; i < GAME_PLAY; i++)
  2744. {
  2745. if (bAroseAction[i] == true)
  2746. {
  2747. mbAroseAction = true;
  2748. break;
  2749. }
  2750. }
  2751. if (mbAroseAction)
  2752. {
  2753. m_wProvideUser = wCenterUser;
  2754. m_cbProvideCard = cbCenterCard;
  2755. m_wResumeUser = m_wCurrentUser;
  2756. m_wCurrentUser = INVALID_CHAIR;
  2757. SendOperateNotify();
  2758. return mbAroseAction;
  2759. }
  2760. return mbAroseAction;
  2761. }
  2762. //操作优先级
  2763. //优先级判断
  2764. bool TableFrameSinkZhiPai::OperatorPriority(WORD TempUser, WORD &wTargetUser, int &cbTargetAction)
  2765. {
  2766. if (wTargetUser == (TempUser + 1) % GAME_PLAY)
  2767. {
  2768. WORD TempUser1 = (TempUser + 2) % GAME_PLAY;
  2769. //获取动作
  2770. int cbUserAction = (m_bResponse[TempUser1] == false) ? m_cbUserAction[TempUser1] : m_cbPerformAction[TempUser1];
  2771. //优先级别
  2772. BYTE cbUserActionRank = m_GameLogic.GetUserActionRank(cbUserAction);
  2773. BYTE cbTargetActionRank = m_GameLogic.GetUserActionRank(cbTargetAction);
  2774. //动作判断
  2775. if (cbUserActionRank > cbTargetActionRank)
  2776. {
  2777. wTargetUser = TempUser1;
  2778. cbTargetAction = cbUserAction;
  2779. return true;
  2780. }
  2781. }
  2782. else if (wTargetUser == (TempUser + 2) % GAME_PLAY)
  2783. {
  2784. WORD TempUser1 = (TempUser + 1) % GAME_PLAY;
  2785. //获取动作
  2786. int cbUserAction1 = (m_bResponse[TempUser1] == false) ? m_cbUserAction[TempUser1] : m_cbPerformAction[TempUser1];
  2787. //优先级别
  2788. BYTE cbUserActionRank1 = m_GameLogic.GetUserActionRank(cbUserAction1);
  2789. BYTE cbTargetActionRank = m_GameLogic.GetUserActionRank(cbTargetAction);
  2790. //动作判断
  2791. if (cbUserActionRank1 > cbTargetActionRank)
  2792. {
  2793. wTargetUser = TempUser1;
  2794. cbTargetAction = cbUserAction1;
  2795. return true;
  2796. }
  2797. if (cbUserActionRank1 == cbTargetActionRank && cbUserActionRank1 == 5 && m_bResponse[TempUser1] == false)
  2798. {
  2799. wTargetUser = TempUser1;
  2800. cbTargetAction = cbUserAction1;
  2801. return true;
  2802. }
  2803. if (cbUserActionRank1 == cbTargetActionRank && cbUserActionRank1 ==2 && m_bResponse[TempUser1] == false)
  2804. {
  2805. wTargetUser = TempUser1;
  2806. cbTargetAction = cbUserAction1;
  2807. return true;
  2808. }
  2809. }
  2810. return true;
  2811. }
  2812. bool TableFrameSinkZhiPai::GetGameEndPaiQiang(WORD wChairID, BYTE GameEndCard[9][5])
  2813. {
  2814. BYTE TempCount = 0;
  2815. BYTE TempCardIndex[MAX_INDEX_HUA] = { 0 };//手牌
  2816. BYTE TempHuaCardIndex[5] = { 0 };
  2817. //BYTE TempCardIndex_Tong[MAX_INDEX_HUA] = { 0 };//捅出去的手牌
  2818. //BYTE TempHuaCardIndex_Tong[5] = { 0 };
  2819. CopyMemory(TempCardIndex, m_cbCardIndex[wChairID], sizeof(TempCardIndex));
  2820. CopyMemory(TempHuaCardIndex, m_cbHuaCardIndex[wChairID], sizeof(TempHuaCardIndex));
  2821. //m_GameLogic.HeBingCardIndex(TempCardIndex, m_cbCardIndex_Tong[wChairID], TempHuaCardIndex, m_cbHuaCardIndex_Tong[wChairID]);
  2822. //CopyMemory(TempCardIndex_Tong, m_cbCardIndex_Tong[wChairID], sizeof(TempCardIndex_Tong));
  2823. //CopyMemory(TempHuaCardIndex_Tong, m_cbHuaCardIndex_Tong[wChairID], sizeof(TempHuaCardIndex_Tong));
  2824. //bool IsTongXiangDui = false;//false统的个数没变了,true表示统的个数变了
  2825. //BYTE TongNum = 0;
  2826. //
  2827. //for (BYTE i = 0; i < m_cbWeaveItemCount[wChairID]; i++)//扫描我们的统组合是否存在游戏结束里面,如果存在就不管了,如果不存在,就需要把统组合里面的牌值回归给手牌里面
  2828. //{
  2829. // if (m_WeaveItemArray[wChairID][i].cbWeaveKind==WIK_SI_TONG)
  2830. // {
  2831. // bool IsHupaiZuHe = false;//false表示胡牌组合里面没有这个行牌组合
  2832. // for (BYTE j = 0; j < 8; j++)
  2833. // {
  2834. // if (ChiHu.AnalyseItem.cbWeaveKind[j]==WIK_SI_TONG && ChiHu.AnalyseItem.cbCenterCard[j] == m_GameLogic.SwitchToCardIndex(m_WeaveItemArray[wChairID][i].cbCenterCard))
  2835. // {
  2836. // IsHupaiZuHe = true;
  2837. // break;
  2838. // }
  2839. // if (ChiHu.AnalyseItem.cbWeaveKind[j] == WIK_DUI && ChiHu.AnalyseItem.cbCenterCard[j] == m_GameLogic.SwitchToCardIndex(m_WeaveItemArray[wChairID][i].cbCenterCard))
  2840. // {
  2841. // if (ChiHu.AnalyseItem.cbCenterCard[j] == 2 || ChiHu.AnalyseItem.cbCenterCard[j] == 4 || ChiHu.AnalyseItem.cbCenterCard[j] == 6)
  2842. // {
  2843. // }
  2844. // IsHupaiZuHe = true;
  2845. // break;
  2846. // }
  2847. // }
  2848. // if (IsHupaiZuHe)
  2849. // {
  2850. // continue;
  2851. // }
  2852. // }
  2853. // if (m_WeaveItemArray[wChairID][i].cbWeaveKind == WIK_WU_TONG)
  2854. // {
  2855. // }
  2856. //}
  2857. //if (TongNum < m_WeaveItemArray[wChairID] - m_WeaveItemArray_HuPai[wChairID])
  2858. //{
  2859. // IsTongXiangDui = true;
  2860. //}
  2861. for (BYTE i = 0; i < 8; i++)
  2862. {
  2863. BYTE TempIndex = ChiHu.AnalyseItem.cbCenterCard[i];
  2864. BYTE TempCardData = m_GameLogic.SwitchToCardData(TempIndex);
  2865. switch (ChiHu.AnalyseItem.cbWeaveKind[i])
  2866. {
  2867. case WIK_QI_TA:
  2868. {
  2869. if (ChiHu.AnalyseItem.cbCenterCard[i] < (10 - 2))//连牌
  2870. {
  2871. for (BYTE j = 0; j < 3; j++)
  2872. {
  2873. if (TempCardData == 1 || TempCardData == 3 || TempCardData == 5 || TempCardData == 7 || TempCardData == 9)
  2874. {
  2875. if (TempCardData == 3 || TempCardData == 5 || TempCardData == 7)
  2876. {
  2877. if (TempHuaCardIndex[TempIndex / 2] > 0)
  2878. {
  2879. GameEndCard[TempCount][j] = (TempCardData | 0x10);
  2880. ASSERT(TempCardIndex[TempIndex] > 0);
  2881. TempCardIndex[TempIndex]--;
  2882. ASSERT(TempHuaCardIndex[TempIndex / 2] > 0);
  2883. TempHuaCardIndex[TempIndex / 2]--;
  2884. }
  2885. else if (TempCardIndex[TempIndex] == 0 && TempCardIndex[22] > 0)
  2886. {
  2887. GameEndCard[TempCount][j] = 0x2D;
  2888. ASSERT(TempCardIndex[22] > 0);
  2889. TempCardIndex[22]--;
  2890. }
  2891. else if (TempCardIndex[TempIndex] > 0)
  2892. {
  2893. GameEndCard[TempCount][j] = TempCardData;
  2894. ASSERT(TempCardIndex[TempIndex] > 0);
  2895. TempCardIndex[TempIndex]--;
  2896. }
  2897. }
  2898. else
  2899. {
  2900. if (TempHuaCardIndex[TempIndex / 2] > 0)
  2901. {
  2902. GameEndCard[TempCount][j] = (TempCardData | 0x10);
  2903. ASSERT(TempCardIndex[TempIndex] > 0);
  2904. TempCardIndex[TempIndex]--;
  2905. ASSERT(TempHuaCardIndex[TempIndex / 2] > 0);
  2906. TempHuaCardIndex[TempIndex / 2]--;
  2907. }
  2908. else
  2909. {
  2910. GameEndCard[TempCount][j] = TempCardData;
  2911. ASSERT(TempCardIndex[TempIndex] > 0);
  2912. TempCardIndex[TempIndex]--;
  2913. }
  2914. }
  2915. }
  2916. else
  2917. {
  2918. GameEndCard[TempCount][j] = TempCardData;
  2919. ASSERT(TempCardIndex[TempIndex] > 0);
  2920. TempCardIndex[TempIndex]--;
  2921. }
  2922. TempCardData++;
  2923. TempIndex++;
  2924. }
  2925. TempCount++;
  2926. continue;
  2927. }
  2928. //孔乙已:孔
  2929. if (ChiHu.AnalyseItem.cbCenterCard[i] == 10)
  2930. {
  2931. ASSERT(TempCardIndex[10] > 0);
  2932. TempCardIndex[10]--;
  2933. GameEndCard[TempCount][0] = TempCardData;
  2934. if (TempHuaCardIndex[0] > 0)
  2935. {
  2936. GameEndCard[TempCount][1] = 0x11;
  2937. ASSERT(TempCardIndex[0] > 0);
  2938. ASSERT(TempHuaCardIndex[0] > 0);
  2939. TempCardIndex[0]--;
  2940. TempHuaCardIndex[0]--;
  2941. }
  2942. else
  2943. {
  2944. ASSERT(TempCardIndex[0] > 0);
  2945. TempCardIndex[0]--;
  2946. GameEndCard[TempCount][1] = 1;
  2947. }
  2948. ASSERT(TempCardIndex[11] > 0);
  2949. TempCardIndex[11]--;
  2950. GameEndCard[TempCount][2] = TempCardData + 1;
  2951. TempCount++;
  2952. continue;
  2953. }
  2954. //上大人:上
  2955. if (ChiHu.AnalyseItem.cbCenterCard[i] == 12)
  2956. {
  2957. ASSERT(TempCardIndex[12] > 0);
  2958. TempCardIndex[12]--;
  2959. ASSERT(TempCardIndex[13] > 0);
  2960. TempCardIndex[13]--;
  2961. ASSERT(TempCardIndex[14] > 0);
  2962. TempCardIndex[14]--;
  2963. GameEndCard[TempCount][0] = TempCardData;
  2964. GameEndCard[TempCount][1] = TempCardData + 1;
  2965. GameEndCard[TempCount][2] = TempCardData + 2;
  2966. TempCount++;
  2967. continue;
  2968. }
  2969. //七十土:土
  2970. if (ChiHu.AnalyseItem.cbCenterCard[i] == 15)
  2971. {
  2972. if (TempHuaCardIndex[3] > 0)
  2973. {
  2974. ASSERT(TempCardIndex[6] > 0);
  2975. TempCardIndex[6]--;
  2976. ASSERT(TempHuaCardIndex[3] > 0);
  2977. TempHuaCardIndex[3]--;
  2978. GameEndCard[TempCount][0] = 0x17;
  2979. }
  2980. else if (TempCardIndex[22] > 0 && TempCardIndex[6] == 0)
  2981. {
  2982. GameEndCard[TempCount][0] = 0x2D;
  2983. ASSERT(TempCardIndex[22] > 0);
  2984. TempCardIndex[22]--;
  2985. }
  2986. else
  2987. {
  2988. ASSERT(TempCardIndex[6] > 0);
  2989. TempCardIndex[6]--;
  2990. GameEndCard[TempCount][0] = 7;
  2991. }
  2992. ASSERT(TempCardIndex[9] > 0);
  2993. TempCardIndex[9]--;
  2994. GameEndCard[TempCount][1] = 10;
  2995. ASSERT(TempCardIndex[15] > 0);
  2996. TempCardIndex[15]--;
  2997. GameEndCard[TempCount][2] = TempCardData;
  2998. TempCount++;
  2999. continue;
  3000. }
  3001. //化三千:化
  3002. if (ChiHu.AnalyseItem.cbCenterCard[i] == 16)
  3003. {
  3004. ASSERT(TempCardIndex[16] > 0);
  3005. TempCardIndex[16]--;
  3006. GameEndCard[TempCount][0] = TempCardData;
  3007. if (TempHuaCardIndex[1] > 0)
  3008. {
  3009. ASSERT(TempCardIndex[2] > 0);
  3010. TempCardIndex[2]--;
  3011. ASSERT(TempHuaCardIndex[1] > 0);
  3012. TempHuaCardIndex[1]--;
  3013. GameEndCard[TempCount][1] = 0x13;
  3014. }
  3015. else if (TempCardIndex[22] > 0 && TempCardIndex[2] == 0)
  3016. {
  3017. GameEndCard[TempCount][1] = 0x2D;
  3018. ASSERT(TempCardIndex[22] > 0);
  3019. TempCardIndex[22]--;
  3020. }
  3021. else
  3022. {
  3023. ASSERT(TempCardIndex[2] > 0);
  3024. TempCardIndex[2]--;
  3025. GameEndCard[TempCount][1] = 3;
  3026. }
  3027. ASSERT(TempCardIndex[17] > 0);
  3028. TempCardIndex[17]--;
  3029. GameEndCard[TempCount][2] = TempCardData + 1;
  3030. TempCount++;
  3031. continue;
  3032. }
  3033. //可知礼
  3034. if (ChiHu.AnalyseItem.cbCenterCard[i] == 18)
  3035. {
  3036. ASSERT(TempCardIndex[18] > 0);
  3037. TempCardIndex[18]--;
  3038. ASSERT(TempCardIndex[19] > 0);
  3039. TempCardIndex[19]--;
  3040. ASSERT(TempCardIndex[20] > 0);
  3041. TempCardIndex[20]--;
  3042. GameEndCard[TempCount][0] = TempCardData;
  3043. GameEndCard[TempCount][1] = TempCardData + 1;
  3044. GameEndCard[TempCount][2] = TempCardData + 2;
  3045. TempCount++;
  3046. continue;
  3047. }
  3048. //八九子
  3049. if (ChiHu.AnalyseItem.cbCenterCard[i] == 21)
  3050. {
  3051. ASSERT(TempCardIndex[7] > 0);
  3052. TempCardIndex[7]--;
  3053. GameEndCard[TempCount][0] = 8;
  3054. if (TempHuaCardIndex[4] > 0)
  3055. {
  3056. ASSERT(TempCardIndex[8] > 0);
  3057. TempCardIndex[8]--;
  3058. ASSERT(TempHuaCardIndex[4] > 0);
  3059. TempHuaCardIndex[4]--;
  3060. GameEndCard[TempCount][1] = 0x19;
  3061. }
  3062. else
  3063. {
  3064. ASSERT(TempCardIndex[8] > 0);
  3065. TempCardIndex[8]--;
  3066. GameEndCard[TempCount][1] = 9;
  3067. }
  3068. ASSERT(TempCardIndex[21] > 0);
  3069. TempCardIndex[21]--;
  3070. GameEndCard[TempCount][2] = TempCardData;
  3071. TempCount++;
  3072. continue;
  3073. }
  3074. break;
  3075. }
  3076. case WIK_SI_TONG:
  3077. {
  3078. if (TempIndex == 2 || TempIndex == 4 || TempIndex == 6)
  3079. {
  3080. for (BYTE j = 0; j < 4; j++)
  3081. {
  3082. if (TempHuaCardIndex[TempIndex / 2] > 0)
  3083. {
  3084. ASSERT(TempCardIndex[TempIndex] > 0);
  3085. TempCardIndex[TempIndex] --;
  3086. ASSERT(TempHuaCardIndex[TempIndex / 2] > 0);
  3087. TempHuaCardIndex[TempIndex / 2] --;
  3088. GameEndCard[TempCount][j] = (TempCardData | 0x10);
  3089. }
  3090. else if (TempCardIndex[TempIndex] > 0)
  3091. {
  3092. ASSERT(TempCardIndex[TempIndex] > 0);
  3093. TempCardIndex[TempIndex] --;
  3094. GameEndCard[TempCount][j] = TempCardData;
  3095. }
  3096. else if (TempCardIndex[22] > 0)
  3097. {
  3098. ASSERT(TempCardIndex[22] > 0);
  3099. TempCardIndex[22] --;
  3100. GameEndCard[TempCount][j] = 0x2D;
  3101. }
  3102. else
  3103. {
  3104. ASSERT(false);
  3105. }
  3106. }
  3107. }
  3108. else
  3109. {
  3110. for (BYTE j = 0; j < 4; j++)
  3111. {
  3112. if (TempIndex == 8 || TempIndex == 0)
  3113. {
  3114. if (TempHuaCardIndex[TempIndex / 2] > 0)
  3115. {
  3116. ASSERT(TempCardIndex[TempIndex] > 0);
  3117. TempCardIndex[TempIndex]--;
  3118. ASSERT(TempHuaCardIndex[TempIndex / 2] > 0);
  3119. TempHuaCardIndex[TempIndex / 2]--;
  3120. GameEndCard[TempCount][j] = (TempCardData | 0x10);
  3121. }
  3122. else if (TempCardIndex[TempIndex / 2] > 0)
  3123. {
  3124. ASSERT(TempCardIndex[TempIndex] > 0);
  3125. TempCardIndex[TempIndex]--;
  3126. GameEndCard[TempCount][j] = TempCardData;
  3127. }
  3128. else
  3129. {
  3130. ASSERT(false);
  3131. }
  3132. }
  3133. else
  3134. {
  3135. ASSERT(TempCardIndex[TempIndex] > 0);
  3136. TempCardIndex[TempIndex]--;
  3137. GameEndCard[TempCount][j] = TempCardData;
  3138. }
  3139. }
  3140. }
  3141. TempCount++;
  3142. break;
  3143. }
  3144. case WIK_WU_TONG:
  3145. {
  3146. if (TempIndex == 2 || TempIndex == 4 || TempIndex == 6)
  3147. {
  3148. for (BYTE j = 0; j < 5; j++)
  3149. {
  3150. if (TempHuaCardIndex[TempIndex / 2] > 0)
  3151. {
  3152. ASSERT(TempCardIndex[TempIndex] > 0);
  3153. TempCardIndex[TempIndex] --;
  3154. ASSERT(TempHuaCardIndex[TempIndex / 2] > 0);
  3155. TempHuaCardIndex[TempIndex / 2] --;
  3156. GameEndCard[TempCount][j] = (TempCardData | 0x10);
  3157. }
  3158. else if (TempCardIndex[TempIndex] > 0)
  3159. {
  3160. ASSERT(TempCardIndex[TempIndex] > 0);
  3161. TempCardIndex[TempIndex] --;
  3162. GameEndCard[TempCount][j] = TempCardData;
  3163. }
  3164. else if (TempCardIndex[22] > 0)
  3165. {
  3166. ASSERT(TempCardIndex[22] > 0);
  3167. TempCardIndex[22] --;
  3168. GameEndCard[TempCount][j] = 0x2D;
  3169. }
  3170. else
  3171. {
  3172. ASSERT(false);
  3173. }
  3174. }
  3175. }
  3176. else
  3177. {
  3178. for (BYTE j = 0; j < 5; j++)
  3179. {
  3180. if (TempIndex == 8 || TempIndex == 0)
  3181. {
  3182. if (TempHuaCardIndex[TempIndex / 2] > 0)
  3183. {
  3184. ASSERT(TempCardIndex[TempIndex] > 0);
  3185. TempCardIndex[TempIndex]--;
  3186. ASSERT(TempHuaCardIndex[TempIndex / 2] > 0);
  3187. TempHuaCardIndex[TempIndex / 2]--;
  3188. GameEndCard[TempCount][j] = (TempCardData | 0x10);
  3189. }
  3190. else if (TempCardIndex[TempIndex / 2] > 0)
  3191. {
  3192. ASSERT(TempCardIndex[TempIndex] > 0);
  3193. TempCardIndex[TempIndex]--;
  3194. GameEndCard[TempCount][j] = TempCardData;
  3195. }
  3196. else
  3197. {
  3198. ASSERT(false);
  3199. }
  3200. }
  3201. else
  3202. {
  3203. ASSERT(TempCardIndex[TempIndex] > 0);
  3204. TempCardIndex[TempIndex]--;
  3205. GameEndCard[TempCount][j] = TempCardData;
  3206. }
  3207. }
  3208. }
  3209. TempCount++;
  3210. break;
  3211. }
  3212. case WIK_DUI:
  3213. {
  3214. if ((TempIndex == 2 || TempIndex == 4 || TempIndex == 6) && (TempCardIndex[22] + TempCardIndex[TempIndex]) >= 3)
  3215. {
  3216. for (BYTE j = 0; j < 3; j++)
  3217. {
  3218. if (TempHuaCardIndex[TempIndex / 2] > 0)
  3219. {
  3220. ASSERT(TempCardIndex[TempIndex] > 0);
  3221. TempCardIndex[TempIndex] --;
  3222. ASSERT(TempHuaCardIndex[TempIndex / 2] > 0);
  3223. TempHuaCardIndex[TempIndex / 2] --;
  3224. GameEndCard[TempCount][j] = (TempCardData | 0x10);
  3225. }
  3226. else if (TempCardIndex[TempIndex] > 0)
  3227. {
  3228. ASSERT(TempCardIndex[TempIndex] > 0);
  3229. TempCardIndex[TempIndex] --;
  3230. GameEndCard[TempCount][j] = TempCardData;
  3231. }
  3232. else if (TempCardIndex[22] > 0)
  3233. {
  3234. ASSERT(TempCardIndex[22] > 0);
  3235. TempCardIndex[22] --;
  3236. GameEndCard[TempCount][j] = 0x2D;
  3237. }
  3238. else
  3239. {
  3240. ASSERT(false);
  3241. }
  3242. }
  3243. TempCount++;
  3244. break;
  3245. }
  3246. else if (TempCardIndex[TempIndex] >= 3)
  3247. {
  3248. for (BYTE j = 0; j < 3; j++)
  3249. {
  3250. if (TempIndex == 8 || TempIndex == 0)
  3251. {
  3252. if (TempHuaCardIndex[TempIndex / 2] > 0)
  3253. {
  3254. ASSERT(TempCardIndex[TempIndex] > 0);
  3255. TempCardIndex[TempIndex]--;
  3256. ASSERT(TempHuaCardIndex[TempIndex / 2] > 0);
  3257. TempHuaCardIndex[TempIndex / 2]--;
  3258. GameEndCard[TempCount][j] = (TempCardData | 0x10);
  3259. }
  3260. else if (TempCardIndex[TempIndex] > 0)
  3261. {
  3262. ASSERT(TempCardIndex[TempIndex] > 0);
  3263. TempCardIndex[TempIndex]--;
  3264. GameEndCard[TempCount][j] = TempCardData;
  3265. }
  3266. else
  3267. {
  3268. ASSERT(false);
  3269. }
  3270. }
  3271. else
  3272. {
  3273. ASSERT(TempCardIndex[TempIndex] > 0);
  3274. TempCardIndex[TempIndex]--;
  3275. GameEndCard[TempCount][j] = TempCardData;
  3276. }
  3277. }
  3278. TempCount++;
  3279. break;
  3280. }
  3281. break;
  3282. }
  3283. case WIK_SAN_ZHAO:
  3284. {
  3285. break;
  3286. }
  3287. case WIK_SI_ZHAO:
  3288. {
  3289. break;
  3290. }
  3291. default:
  3292. break;
  3293. }
  3294. }
  3295. if (ChiHu.AnalyseItem.cbCardEye[0] == 2 || ChiHu.AnalyseItem.cbCardEye[0] == 4 || ChiHu.AnalyseItem.cbCardEye[0] == 6)
  3296. {
  3297. if (TempHuaCardIndex[ChiHu.AnalyseItem.cbCardEye[0] / 2] > 0)
  3298. {
  3299. GameEndCard[TempCount][0] = ((ChiHu.AnalyseItem.cbCardEye[0] + 1) | 0X10);
  3300. TempHuaCardIndex[ChiHu.AnalyseItem.cbCardEye[0] / 2]--;
  3301. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[0]]--;
  3302. }
  3303. else if (TempCardIndex[ChiHu.AnalyseItem.cbCardEye[0]] > 0)
  3304. {
  3305. GameEndCard[TempCount][0] = ChiHu.AnalyseItem.cbCardEye[0] + 1;
  3306. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[0]]--;
  3307. }
  3308. else if (TempCardIndex[22] > 0)
  3309. {
  3310. GameEndCard[TempCount][0] = 0x2D;
  3311. TempCardIndex[22]--;
  3312. }
  3313. else
  3314. {
  3315. ASSERT(false);
  3316. GameEndCard[TempCount][0] = ChiHu.AnalyseItem.cbCardEye[0] + 1;
  3317. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[0]]--;
  3318. }
  3319. }
  3320. else
  3321. {
  3322. if (ChiHu.AnalyseItem.cbCardEye[0] == 0 || ChiHu.AnalyseItem.cbCardEye[0] == 8)
  3323. {
  3324. if (TempHuaCardIndex[ChiHu.AnalyseItem.cbCardEye[0] / 2] > 0)
  3325. {
  3326. GameEndCard[TempCount][0] = ((ChiHu.AnalyseItem.cbCardEye[0] + 1) | 0X10);
  3327. TempHuaCardIndex[ChiHu.AnalyseItem.cbCardEye[0] / 2]--;
  3328. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[0]]--;
  3329. }
  3330. else
  3331. {
  3332. GameEndCard[TempCount][0] = ChiHu.AnalyseItem.cbCardEye[0] + 1;
  3333. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[0]]--;
  3334. }
  3335. }
  3336. else
  3337. {
  3338. GameEndCard[TempCount][0] = m_GameLogic.SwitchToCardData(ChiHu.AnalyseItem.cbCardEye[0]);
  3339. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[0]]--;
  3340. }
  3341. }
  3342. if (ChiHu.AnalyseItem.cbCardEye[1] == 2 || ChiHu.AnalyseItem.cbCardEye[1] == 4 || ChiHu.AnalyseItem.cbCardEye[1] == 6)
  3343. {
  3344. if (TempHuaCardIndex[ChiHu.AnalyseItem.cbCardEye[1] / 2] > 0)
  3345. {
  3346. GameEndCard[TempCount][0] = ((ChiHu.AnalyseItem.cbCardEye[1] + 1) | 0X10);
  3347. TempHuaCardIndex[ChiHu.AnalyseItem.cbCardEye[1] / 2]--;
  3348. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[1]]--;
  3349. }
  3350. else if (TempCardIndex[ChiHu.AnalyseItem.cbCardEye[1]] > 0)
  3351. {
  3352. GameEndCard[TempCount][1] = ChiHu.AnalyseItem.cbCardEye[1] + 1;
  3353. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[1]]--;
  3354. }
  3355. else if (TempCardIndex[22] > 0)
  3356. {
  3357. GameEndCard[TempCount][1] = 0x2D;
  3358. TempCardIndex[22]--;
  3359. }
  3360. else
  3361. {
  3362. ASSERT(false);
  3363. GameEndCard[TempCount][1] = ChiHu.AnalyseItem.cbCardEye[1] + 1;
  3364. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[1]]--;
  3365. }
  3366. }
  3367. else
  3368. {
  3369. if (ChiHu.AnalyseItem.cbCardEye[1] == 0 || ChiHu.AnalyseItem.cbCardEye[1] == 8)
  3370. {
  3371. if (TempHuaCardIndex[ChiHu.AnalyseItem.cbCardEye[1] / 2] > 0)
  3372. {
  3373. GameEndCard[TempCount][1] = ((ChiHu.AnalyseItem.cbCardEye[1] + 1) | 0X10);
  3374. TempHuaCardIndex[ChiHu.AnalyseItem.cbCardEye[1] / 2]--;
  3375. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[1]]--;
  3376. }
  3377. else
  3378. {
  3379. GameEndCard[TempCount][1] = ChiHu.AnalyseItem.cbCardEye[1] + 1;
  3380. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[1]]--;
  3381. }
  3382. }
  3383. else
  3384. {
  3385. GameEndCard[TempCount][1] = m_GameLogic.SwitchToCardData(ChiHu.AnalyseItem.cbCardEye[1]);
  3386. TempCardIndex[ChiHu.AnalyseItem.cbCardEye[1]]--;
  3387. }
  3388. }
  3389. TempCount++;
  3390. for (BYTE i = 0; i < m_cbWeaveItemCount_HuPai[wChairID]; i++)
  3391. {
  3392. switch (m_WeaveItemArray_HuPai[wChairID][i].cbWeaveKind)
  3393. {
  3394. case WIK_DUI:
  3395. {
  3396. BYTE CountFour = 0;
  3397. if (m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[0] != 0)
  3398. {
  3399. GameEndCard[TempCount][CountFour] = m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[0];
  3400. CountFour++;
  3401. }
  3402. if (m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[1] != 0)
  3403. {
  3404. GameEndCard[TempCount][CountFour] = m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[1];
  3405. CountFour++;
  3406. }
  3407. for (BYTE k = CountFour; k < 3; k++)
  3408. {
  3409. GameEndCard[TempCount][k] = m_WeaveItemArray_HuPai[wChairID][i].cbCenterCard;
  3410. }
  3411. TempCount++;
  3412. break;
  3413. }
  3414. case WIK_SAN_ZHAO:
  3415. {
  3416. BYTE CountFour = 0;
  3417. if (m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[0] != 0)
  3418. {
  3419. GameEndCard[TempCount][CountFour] = m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[0];
  3420. CountFour++;
  3421. }
  3422. if (m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[1] != 0)
  3423. {
  3424. GameEndCard[TempCount][CountFour] = m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[1];
  3425. CountFour++;
  3426. }
  3427. for (BYTE k = CountFour; k < 4; k++)
  3428. {
  3429. GameEndCard[TempCount][k] = m_WeaveItemArray_HuPai[wChairID][i].cbCenterCard;
  3430. }
  3431. TempCount++;
  3432. break;
  3433. }
  3434. case WIK_SI_ZHAO:
  3435. {
  3436. BYTE CountFour = 0;
  3437. if (m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[0] != 0)
  3438. {
  3439. GameEndCard[TempCount][CountFour] = m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[0];
  3440. CountFour++;
  3441. }
  3442. if (m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[1] != 0)
  3443. {
  3444. GameEndCard[TempCount][CountFour] = m_WeaveItemArray_HuPai[wChairID][i].cbMargicOffset[1];
  3445. CountFour++;
  3446. }
  3447. for (BYTE k = CountFour; k < 5; k++)
  3448. {
  3449. GameEndCard[TempCount][k] = m_WeaveItemArray_HuPai[wChairID][i].cbCenterCard;
  3450. }
  3451. TempCount++;
  3452. break;
  3453. }
  3454. default:
  3455. break;
  3456. }
  3457. }
  3458. ASSERT(TempCount <= 9);
  3459. return true;
  3460. }
  3461. bool TableFrameSinkZhiPai::GetGameEndCardIndex(WORD wChairID, BYTE TempCardIndex[28])
  3462. {
  3463. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  3464. {
  3465. if (m_cbCardIndex[wChairID][i] != 0)
  3466. {
  3467. if (i == 0 || i == 2 || i == 4 || i == 6 || i == 8)
  3468. {
  3469. for (BYTE k = 0; k < m_cbHuaCardIndex[wChairID][i / 2]; k++)
  3470. {
  3471. TempCardIndex[MAX_INDEX_HUA + i / 2]++;
  3472. }
  3473. for (BYTE k = 0; k < (m_cbCardIndex[wChairID][i] - m_cbHuaCardIndex[wChairID][i / 2]); k++)
  3474. {
  3475. TempCardIndex[i]++;
  3476. }
  3477. }
  3478. else
  3479. {
  3480. TempCardIndex[i] = m_cbCardIndex[wChairID][i];
  3481. }
  3482. }
  3483. }
  3484. return true;
  3485. }
  3486. bool TableFrameSinkZhiPai::GetPaiQiang(WORD wChairID, BYTE HandCardData[9][9])
  3487. {
  3488. ZeroMemory(HandCardData, sizeof(HandCardData));
  3489. BYTE Line = 0;//行
  3490. BYTE Row = 0;//列
  3491. BYTE TempCardIndex[MAX_INDEX_HUA] = { 0 };
  3492. BYTE TempHuaCardIndex[5] = { 0 };
  3493. CopyMemory(TempCardIndex, m_cbCardIndex[wChairID], sizeof(TempCardIndex));
  3494. CopyMemory(TempHuaCardIndex, m_cbHuaCardIndex[wChairID], sizeof(TempHuaCardIndex));
  3495. m_GameLogic.HeBingCardIndex(TempCardIndex, m_cbCardIndex_Tong[wChairID], TempHuaCardIndex, m_cbHuaCardIndex_Tong[wChairID]);
  3496. if (wChairID == m_wBankerUser && m_cbOutCardCount == 0)
  3497. {
  3498. BYTE TempIndex = m_GameLogic.SwitchToCardIndex(m_cbSendCardData);
  3499. ASSERT(TempCardIndex[TempIndex] > 0);
  3500. if (TempCardIndex[TempIndex] > 0 && TempCardIndex[TempIndex] < 6)
  3501. {
  3502. TempCardIndex[TempIndex]--;
  3503. if ((m_cbSendCardData & 0x10) == 0x10)
  3504. {
  3505. ASSERT(TempHuaCardIndex[TempIndex / 2] > 0);
  3506. if (TempHuaCardIndex[TempIndex / 2] > 0 && TempHuaCardIndex[TempIndex / 2] < 3)
  3507. {
  3508. TempHuaCardIndex[TempIndex / 2]--;
  3509. }
  3510. else
  3511. {
  3512. TempHuaCardIndex[TempIndex / 2] = 0;
  3513. return false;
  3514. }
  3515. }
  3516. }
  3517. else
  3518. {
  3519. TempCardIndex[TempIndex] = 0;
  3520. return false;
  3521. }
  3522. }
  3523. //m_GameLogic.HeBingCardIndex(TempCardIndex, m_cbCardIndex_Tong[wChairID], TempHuaCardIndex, m_cbHuaCardIndex_Tong[wChairID]);
  3524. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  3525. {
  3526. if (TempCardIndex[i] == 5)
  3527. {
  3528. if (i == 0 || i == 2 || i == 4 || i == 6 || i == 8)
  3529. {
  3530. if (TempHuaCardIndex[i / 2] < 3)
  3531. {
  3532. //将花牌数组中花牌个数保存到牌数据中
  3533. for (BYTE k = 0; k < TempHuaCardIndex[i / 2]; k++)
  3534. {
  3535. HandCardData[Line][Row++] = 0x10 | (i + 1);
  3536. }
  3537. //将剩下的画白皮的
  3538. for (BYTE j = 0; j < (TempCardIndex[i] - TempHuaCardIndex[i / 2]); j++)
  3539. {
  3540. HandCardData[Line][Row++] = 0x00 | (i + 1);
  3541. }
  3542. Line++;
  3543. Row = 0;
  3544. TempHuaCardIndex[i / 2] = 0;
  3545. }
  3546. else
  3547. {
  3548. return false;
  3549. }
  3550. }
  3551. //普通牌处理
  3552. else
  3553. {
  3554. for (BYTE j = 0; j<TempCardIndex[i]; j++)
  3555. {
  3556. HandCardData[Line][Row++] = m_GameLogic.SwitchToCardData(i);
  3557. }
  3558. Line++;
  3559. Row = 0;
  3560. }
  3561. TempCardIndex[i] = 0;
  3562. }
  3563. }
  3564. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  3565. {
  3566. if (TempCardIndex[i] == 4)
  3567. {
  3568. if (i == 0 || i == 2 || i == 4 || i == 6 || i == 8)
  3569. {
  3570. if (TempHuaCardIndex[i / 2] < 3)
  3571. {
  3572. //将花牌数组中花牌个数保存到牌数据中
  3573. for (BYTE k = 0; k < TempHuaCardIndex[i / 2]; k++)
  3574. {
  3575. HandCardData[Line][Row++] = 0x10 | (i + 1);
  3576. }
  3577. //将剩下的画白皮的
  3578. for (BYTE j = 0; j < (TempCardIndex[i] - TempHuaCardIndex[i / 2]); j++)
  3579. {
  3580. HandCardData[Line][Row++] = 0x00 | (i + 1);
  3581. }
  3582. Line++;
  3583. Row = 0;
  3584. TempHuaCardIndex[i / 2] = 0;
  3585. }
  3586. else
  3587. {
  3588. return false;
  3589. }
  3590. }
  3591. //普通牌处理
  3592. else
  3593. {
  3594. for (BYTE j = 0; j<TempCardIndex[i]; j++)
  3595. {
  3596. HandCardData[Line][Row++] = m_GameLogic.SwitchToCardData(i);
  3597. }
  3598. Line++;
  3599. Row = 0;
  3600. }
  3601. TempCardIndex[i] = 0;
  3602. }
  3603. }
  3604. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  3605. {
  3606. if (TempCardIndex[i] == 3)
  3607. {
  3608. if (i == 0 || i == 2 || i == 4 || i == 6 || i == 8)
  3609. {
  3610. if (TempHuaCardIndex[i / 2] < 3)
  3611. {
  3612. //将花牌数组中花牌个数保存到牌数据中
  3613. for (BYTE k = 0; k < TempHuaCardIndex[i / 2]; k++)
  3614. {
  3615. HandCardData[Line][Row++] = 0x10 | (i + 1);
  3616. }
  3617. //将剩下的画白皮的
  3618. for (BYTE j = 0; j < (TempCardIndex[i] - TempHuaCardIndex[i / 2]); j++)
  3619. {
  3620. HandCardData[Line][Row++] = 0x00 | (i + 1);
  3621. }
  3622. Line++;
  3623. Row = 0;
  3624. TempHuaCardIndex[i / 2] = 0;
  3625. }
  3626. else
  3627. {
  3628. return false;
  3629. }
  3630. }
  3631. //普通牌处理
  3632. else
  3633. {
  3634. for (BYTE j = 0; j<TempCardIndex[i]; j++)
  3635. {
  3636. HandCardData[Line][Row++] = m_GameLogic.SwitchToCardData(i);
  3637. }
  3638. Line++;
  3639. Row = 0;
  3640. }
  3641. TempCardIndex[i] = 0;
  3642. }
  3643. }
  3644. if (TempCardIndex[12] != 0 || TempCardIndex[13] != 0 || TempCardIndex[14] != 0)
  3645. {
  3646. if (TempCardIndex[12] < 6 && TempCardIndex[13] < 6 && TempCardIndex[14] < 6)
  3647. {
  3648. for (BYTE j = 0; j < TempCardIndex[12]; j++)
  3649. {
  3650. HandCardData[Line][Row++] = 0x23;
  3651. }
  3652. for (BYTE j = 0; j < TempCardIndex[13]; j++)
  3653. {
  3654. HandCardData[Line][Row++] = 0x24;
  3655. }
  3656. for (BYTE j = 0; j < TempCardIndex[14]; j++)
  3657. {
  3658. HandCardData[Line][Row++] = 0x25;
  3659. }
  3660. Line++;
  3661. Row = 0;
  3662. TempCardIndex[12] = 0;
  3663. TempCardIndex[13] = 0;
  3664. TempCardIndex[14] = 0;
  3665. }
  3666. else
  3667. {
  3668. return false;
  3669. }
  3670. }
  3671. if (TempCardIndex[18] != 0 || TempCardIndex[19] != 0 || TempCardIndex[20] != 0)
  3672. {
  3673. if (TempCardIndex[18] < 6 && TempCardIndex[19] < 6 && TempCardIndex[20] < 6)
  3674. {
  3675. for (BYTE j = 0; j < TempCardIndex[18]; j++)
  3676. {
  3677. HandCardData[Line][Row++] = 0x29;
  3678. }
  3679. for (BYTE j = 0; j < TempCardIndex[19]; j++)
  3680. {
  3681. HandCardData[Line][Row++] = 0x2A;
  3682. }
  3683. for (BYTE j = 0; j < TempCardIndex[20]; j++)
  3684. {
  3685. HandCardData[Line][Row++] = 0x2B;
  3686. }
  3687. Line++;
  3688. Row = 0;
  3689. TempCardIndex[18] = 0;
  3690. TempCardIndex[19] = 0;
  3691. TempCardIndex[20] = 0;
  3692. ASSERT(Line <= 9);
  3693. }
  3694. else
  3695. {
  3696. return false;
  3697. }
  3698. }
  3699. if (Line >= 8)
  3700. {
  3701. ASSERT(Line == 8);
  3702. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  3703. {
  3704. if (TempCardIndex[i] > 0)
  3705. {
  3706. if (TempCardIndex[i] < 6)
  3707. {
  3708. if (i == 0 || i == 2 || i == 4 || i == 6 || i == 8)
  3709. {
  3710. if (TempHuaCardIndex[i / 2] < 3)
  3711. {
  3712. //将花牌数组中花牌个数保存到牌数据中
  3713. for (BYTE k = 0; k < TempHuaCardIndex[i / 2]; k++)
  3714. {
  3715. HandCardData[Line][Row++] = 0x10 | (i + 1);
  3716. }
  3717. //将剩下的画白皮的
  3718. for (BYTE j = 0; j < (TempCardIndex[i] - TempHuaCardIndex[i / 2]); j++)
  3719. {
  3720. HandCardData[Line][Row++] = 0x00 | (i + 1);
  3721. }
  3722. TempHuaCardIndex[i / 2] = 0;
  3723. }
  3724. else
  3725. {
  3726. return false;
  3727. }
  3728. }
  3729. //普通牌处理
  3730. else
  3731. {
  3732. for (BYTE j = 0; j < TempCardIndex[i]; j++)
  3733. {
  3734. HandCardData[Line][Row++] = m_GameLogic.SwitchToCardData(i);
  3735. }
  3736. }
  3737. TempCardIndex[i] = 0;
  3738. }
  3739. else
  3740. {
  3741. return false;
  3742. }
  3743. }
  3744. ASSERT(Row <= 9);
  3745. }
  3746. //Line++;
  3747. //Row = 0;
  3748. }
  3749. else
  3750. {
  3751. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  3752. {
  3753. if (TempCardIndex[i] > 0)
  3754. {
  3755. if (TempCardIndex[i] < 6)
  3756. {
  3757. if (Row > 3 && Line < 8)
  3758. {
  3759. Line++;
  3760. Row = 0;
  3761. }
  3762. if (i == 0 || i == 2 || i == 4 || i == 6 || i == 8)
  3763. {
  3764. if (TempHuaCardIndex[i / 2] < 3)
  3765. {
  3766. //将花牌数组中花牌个数保存到牌数据中
  3767. for (BYTE k = 0; k < TempHuaCardIndex[i / 2]; k++)
  3768. {
  3769. HandCardData[Line][Row++] = 0x10 | (i + 1);
  3770. }
  3771. //将剩下的画白皮的
  3772. for (BYTE j = 0; j < (TempCardIndex[i] - TempHuaCardIndex[i / 2]); j++)
  3773. {
  3774. HandCardData[Line][Row++] = 0x00 | (i + 1);
  3775. }
  3776. TempHuaCardIndex[i / 2] = 0;
  3777. }
  3778. else
  3779. {
  3780. return false;
  3781. }
  3782. }
  3783. //普通牌处理
  3784. else
  3785. {
  3786. for (BYTE j = 0; j < TempCardIndex[i]; j++)
  3787. {
  3788. HandCardData[Line][Row++] = m_GameLogic.SwitchToCardData(i);
  3789. }
  3790. }
  3791. TempCardIndex[i] = 0;
  3792. }
  3793. else
  3794. {
  3795. return false;
  3796. }
  3797. }
  3798. ASSERT(Row <= 9);
  3799. }
  3800. }
  3801. if (wChairID == m_wBankerUser && m_cbOutCardCount == 0)
  3802. {
  3803. if (Line >= 8)
  3804. {
  3805. HandCardData[Line][Row++] = m_cbSendCardData;
  3806. }
  3807. else
  3808. {
  3809. HandCardData[8][0] = m_cbSendCardData;
  3810. }
  3811. }
  3812. ASSERT(Line <= 9);
  3813. if (Line <= 9)
  3814. return true;
  3815. else
  3816. return false;
  3817. }
  3818. bool TableFrameSinkZhiPai::DeleteHandCardData(WORD wChairID, BYTE CardData[], BYTE CardCount)
  3819. {
  3820. for (BYTE i = 0; i < CardCount; i++)
  3821. {
  3822. BYTE TempBreakIndex = 0xFF;
  3823. for (BYTE m = 0; m < 9; m++)
  3824. {
  3825. for (BYTE h = 0; h < 9; h++)
  3826. {
  3827. if (m_cbGamePlayerHandCard[wChairID][m][h] == 0)
  3828. {
  3829. break;
  3830. }
  3831. if (m_cbGamePlayerHandCard[wChairID][m][h] == CardData[i])
  3832. {
  3833. for (BYTE j = h; j < 8; j++)
  3834. {
  3835. m_cbGamePlayerHandCard[wChairID][m][j] = m_cbGamePlayerHandCard[wChairID][m][j + 1];
  3836. }
  3837. TempBreakIndex = h;
  3838. break;
  3839. }
  3840. }
  3841. if (TempBreakIndex != 0xFF)
  3842. {
  3843. break;
  3844. }
  3845. }
  3846. if (TempBreakIndex == 0xFF)
  3847. {
  3848. return false;
  3849. }
  3850. }
  3851. return true;
  3852. }
  3853. BYTE TableFrameSinkZhiPai::GetOperatorScore(INT OperatorCode, BYTE OperatorCardIndex,BYTE HuaCard[4])
  3854. {
  3855. BYTE TempScore = 0;
  3856. switch (OperatorCode)
  3857. {
  3858. case WIK_DUI:
  3859. {
  3860. if (OperatorCardIndex == 2 || OperatorCardIndex == 4 || OperatorCardIndex == 6)
  3861. {
  3862. TempScore += 5;
  3863. for (BYTE i = 0; i < 4;i++)
  3864. {
  3865. if (HuaCard[i] != 0)
  3866. {
  3867. TempScore++;
  3868. }
  3869. }
  3870. }
  3871. else if (OperatorCardIndex == 12 || OperatorCardIndex == 13 || OperatorCardIndex == 14 || OperatorCardIndex == 18 || OperatorCardIndex == 19 || OperatorCardIndex == 20)
  3872. {
  3873. TempScore++;
  3874. }
  3875. else if (OperatorCardIndex == 0 || OperatorCardIndex == 8)
  3876. {
  3877. for (BYTE i = 0; i < 4; i++)
  3878. {
  3879. if (HuaCard[i] != 0)
  3880. {
  3881. TempScore++;
  3882. }
  3883. }
  3884. }
  3885. return TempScore;
  3886. }
  3887. case WIK_SAN_ZHAO:
  3888. {
  3889. if (OperatorCardIndex == 2 || OperatorCardIndex == 4 || OperatorCardIndex == 6 )
  3890. {
  3891. TempScore = 12;
  3892. if (HuaCard[1] != 0)
  3893. {
  3894. TempScore = 14;
  3895. }
  3896. }
  3897. else if (OperatorCardIndex == 12 || OperatorCardIndex == 13 || OperatorCardIndex == 14 || OperatorCardIndex == 18 || OperatorCardIndex == 19 || OperatorCardIndex == 20)
  3898. {
  3899. TempScore += 4;
  3900. }
  3901. else if (OperatorCardIndex == 0 || OperatorCardIndex == 8)
  3902. {
  3903. TempScore += 2;
  3904. for (BYTE i = 0; i < 4; i++)
  3905. {
  3906. if (HuaCard[i] != 0)
  3907. {
  3908. TempScore++;
  3909. }
  3910. }
  3911. }
  3912. else
  3913. {
  3914. TempScore += 2;
  3915. }
  3916. return TempScore;
  3917. }
  3918. case WIK_SI_ZHAO:
  3919. {
  3920. if (OperatorCardIndex == 2 || OperatorCardIndex == 4 || OperatorCardIndex == 6)
  3921. {
  3922. TempScore = 28;
  3923. }
  3924. else if (OperatorCardIndex == 12 || OperatorCardIndex == 13 || OperatorCardIndex == 14 || OperatorCardIndex == 18 || OperatorCardIndex == 19 || OperatorCardIndex == 20)
  3925. {
  3926. TempScore = 8;
  3927. }
  3928. else if (OperatorCardIndex == 0 || OperatorCardIndex == 8)
  3929. {
  3930. TempScore =6;
  3931. }
  3932. else
  3933. {
  3934. TempScore = 4;
  3935. }
  3936. return TempScore;
  3937. }
  3938. default:
  3939. break;
  3940. }
  3941. }
  3942. bool TableFrameSinkZhiPai::IsEqual(WORD wChairID)
  3943. {
  3944. BYTE TempCardShouIndex[MAX_INDEX_HUA] = { 0 };
  3945. CopyMemory(TempCardShouIndex, m_cbCardIndex[wChairID], sizeof(m_cbCardIndex[wChairID]));
  3946. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  3947. {
  3948. TempCardShouIndex[i] += m_cbCardIndex_Tong[wChairID][i];
  3949. }
  3950. BYTE TempCardShouCount1 = m_GameLogic.GetCardCount(TempCardShouIndex);
  3951. BYTE TempCardShouCount2 = 0;
  3952. for (BYTE i = 0; i < 9; i++)
  3953. {
  3954. for (BYTE j = 0; j < 9; j++)
  3955. {
  3956. if (m_cbGamePlayerHandCard[wChairID][i][j] == 0)
  3957. {
  3958. break;
  3959. }
  3960. TempCardShouCount2++;
  3961. }
  3962. }
  3963. return TempCardShouCount1 == TempCardShouCount2 ? true : false;
  3964. }