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

1819 lines
50 KiB

  1. #include "Stdafx.h"
  2. #include "GameClient.h"
  3. #include "GameOption.h"
  4. #include "GameClientEngine.h"
  5. //////////////////////////////////////////////////////////////////////////
  6. //游戏定时器
  7. #define IDI_START_GAME 200 //开始定时器
  8. #define IDI_OPERATE_CARD 201 //操作定时器
  9. //游戏定时器
  10. #define TIME_START_GAME 30 //开始定时器
  11. #define TIME_OPERATE_CARD 15 //操作定时器
  12. #define MAX_TIME_OUT 3 //最大超时次数
  13. //////////////////////////////////////////////////////////////////////////
  14. BEGIN_MESSAGE_MAP(CGameClientEngine, CGameFrameEngine)
  15. ON_MESSAGE(IDM_START,OnStart)
  16. ON_MESSAGE(IDM_OUT_CARD,OnOutCard)
  17. ON_MESSAGE(IDM_CARD_OPERATE,OnCardOperate)
  18. ON_MESSAGE(IDM_TRUSTEE_CONTROL,OnStusteeControl)
  19. ON_MESSAGE(IDM_SICE_TWO,OnSiceTwo)
  20. ON_MESSAGE(IDM_SICE_FINISH,OnSiceFinish)
  21. END_MESSAGE_MAP()
  22. //////////////////////////////////////////////////////////////////////////
  23. //构造函数
  24. CGameClientEngine::CGameClientEngine()
  25. {
  26. //游戏变量
  27. m_wBankerUser=INVALID_CHAIR;
  28. m_wCurrentUser=INVALID_CHAIR;
  29. m_cbUserAction = 0;
  30. m_lSiceCount = 0;
  31. //堆立变量
  32. m_wHeapHand=0;
  33. m_wHeapTail=0;
  34. ZeroMemory(m_cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
  35. //托管变量
  36. m_bStustee=false;
  37. m_wTimeOutCount =0;
  38. //出牌信息
  39. m_cbOutCardData=0;
  40. m_wOutCardUser=INVALID_CHAIR;
  41. ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
  42. ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
  43. //组合扑克
  44. ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount));
  45. ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
  46. //扑克变量
  47. m_cbLeftCardCount=0;
  48. ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex));
  49. return;
  50. }
  51. //析构函数
  52. CGameClientEngine::~CGameClientEngine()
  53. {
  54. }
  55. //初始函数
  56. bool CGameClientEngine::OnInitGameEngine()
  57. {
  58. //设置图标
  59. HICON hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
  60. m_pIClientKernel->SetGameAttribute(KIND_ID,GAME_PLAYER,VERSION_CLIENT,hIcon,GAME_NAME);
  61. SetIcon(hIcon,TRUE);
  62. SetIcon(hIcon,FALSE);
  63. //加载资源
  64. g_CardResource.LoadResource();
  65. //加载声音
  66. m_DirectSound.Create( TEXT("OUT_CARD") );
  67. return true;
  68. }
  69. //重置框架
  70. bool CGameClientEngine::OnResetGameEngine()
  71. {
  72. //游戏变量
  73. m_wBankerUser=INVALID_CHAIR;
  74. m_wCurrentUser=INVALID_CHAIR;
  75. m_cbUserAction = 0;
  76. m_lSiceCount = 0;
  77. //托管变量
  78. m_bStustee=false;
  79. m_wTimeOutCount =0;
  80. //堆立变量
  81. m_wHeapHand=0;
  82. m_wHeapTail=0;
  83. ZeroMemory(m_cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
  84. //出牌信息
  85. m_cbOutCardData=0;
  86. m_wOutCardUser=INVALID_CHAIR;
  87. ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
  88. ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
  89. //组合扑克
  90. ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount));
  91. ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
  92. //扑克变量
  93. m_cbLeftCardCount=0;
  94. ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex));
  95. return true;
  96. }
  97. //时钟删除
  98. bool CGameClientEngine::OnEventGameClockKill(WORD wChairID)
  99. {
  100. return true;
  101. }
  102. //时间消息
  103. bool CGameClientEngine::OnEventGameClockInfo(WORD wChairID, UINT nElapse, WORD wClockID)
  104. {
  105. switch (wClockID)
  106. {
  107. case IDI_START_GAME: //开始游戏
  108. {
  109. if( m_bStustee && nElapse < TIME_START_GAME )
  110. {
  111. OnStart(0,0);
  112. return true;
  113. }
  114. if (nElapse==0)
  115. {
  116. AfxGetMainWnd()->PostMessage(WM_CLOSE);
  117. return true;
  118. }
  119. if (nElapse<=5)
  120. {
  121. PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_WARN"));
  122. }
  123. return true;
  124. }
  125. case IDI_OPERATE_CARD: //操作定时器
  126. {
  127. //自动出牌
  128. bool bAutoOutCard=false;
  129. if ((bAutoOutCard==true)&&(m_GameClientView.m_ControlWnd.IsWindowVisible()))
  130. bAutoOutCard=false;
  131. if((bAutoOutCard==false)&&(m_bStustee==true))
  132. {
  133. bAutoOutCard=true;
  134. }
  135. //超时判断
  136. if ((IsLookonMode()==false)&&
  137. ( nElapse==0 || bAutoOutCard ||
  138. nElapse < TIME_OPERATE_CARD-1&&(m_cbUserAction&WIK_CHI_HU)&&m_cbLeftCardCount<4 )
  139. )
  140. {
  141. //获取位置
  142. WORD wMeChairID=GetMeChairID();
  143. //动作处理
  144. if (wChairID==wMeChairID)
  145. {
  146. if(m_bStustee==false && ++m_wTimeOutCount>=MAX_TIME_OUT )
  147. {
  148. m_wTimeOutCount = 0;
  149. OnStusteeControl(TRUE,0);
  150. if ( m_pIStringMessage )
  151. m_pIStringMessage->InsertSystemString(TEXT("由于您多次超时,切换为“系统托管”模式."));
  152. }
  153. if (m_wCurrentUser==wMeChairID)
  154. {
  155. if( m_cbLeftCardCount < 4 && (m_cbUserAction&WIK_CHI_HU) )
  156. {
  157. OnCardOperate( WIK_CHI_HU,0 );
  158. return true;
  159. }
  160. //获取扑克
  161. BYTE cbCardData=m_GameClientView.m_HandCardControl.GetCurrentCard();
  162. //出牌效验
  163. if (VerdictOutCard(cbCardData)==false)
  164. {
  165. for (BYTE i=0;i<MAX_INDEX;i++)
  166. {
  167. //出牌效验
  168. if (m_cbCardIndex[i]==0) continue;
  169. if (VerdictOutCard(m_GameLogic.SwitchToCardData(i))==false)
  170. continue;
  171. //设置变量
  172. cbCardData=m_GameLogic.SwitchToCardData(i);
  173. }
  174. }
  175. //出牌动作
  176. OnOutCard(cbCardData,cbCardData);
  177. }
  178. else if( m_cbLeftCardCount < 4 && (m_cbUserAction&WIK_CHI_HU) )
  179. OnCardOperate( WIK_CHI_HU,0 );
  180. else
  181. OnCardOperate(WIK_NULL,0);
  182. }
  183. return true;
  184. }
  185. //播放声音
  186. if ((nElapse<=3)&&(wChairID==GetMeChairID())&&(IsLookonMode()==false))
  187. {
  188. PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_WARN"));
  189. }
  190. return true;
  191. }
  192. }
  193. return true;
  194. }
  195. //旁观状态
  196. bool CGameClientEngine::OnEventLookonMode(VOID * pData, WORD wDataSize)
  197. {
  198. //扑克控制
  199. m_GameClientView.m_HandCardControl.SetDisplayItem(IsAllowLookon());
  200. m_GameClientView.InvalidGameView(0,0,0,0);
  201. return true;
  202. }
  203. //网络消息
  204. bool CGameClientEngine::OnEventGameMessage(WORD wSubCmdID, VOID * pBuffer, WORD wDataSize)
  205. {
  206. switch (wSubCmdID)
  207. {
  208. case SUB_S_GAME_START: //游戏开始
  209. {
  210. return OnSubGameStart(pBuffer,wDataSize);
  211. }
  212. case SUB_S_OUT_CARD: //用户出牌
  213. {
  214. return OnSubOutCard(pBuffer,wDataSize);
  215. }
  216. case SUB_S_SEND_CARD: //发牌消息
  217. {
  218. return OnSubSendCard(pBuffer,wDataSize);
  219. }
  220. case SUB_S_OPERATE_NOTIFY: //操作提示
  221. {
  222. return OnSubOperateNotify(pBuffer,wDataSize);
  223. }
  224. case SUB_S_OPERATE_RESULT: //操作结果
  225. {
  226. return OnSubOperateResult(pBuffer,wDataSize);
  227. }
  228. case SUB_S_GAME_END: //游戏结束
  229. {
  230. return OnSubGameEnd(pBuffer,wDataSize);
  231. }
  232. case SUB_S_TRUSTEE: //用户托管
  233. {
  234. return OnSubTrustee(pBuffer,wDataSize);
  235. }
  236. case SUB_S_CHI_HU:
  237. {
  238. return OnSubUserChiHu( pBuffer,wDataSize );
  239. }
  240. case SUB_S_GANG_SCORE: //
  241. {
  242. return OnSubGangScore(pBuffer,wDataSize);
  243. }
  244. }
  245. return true;
  246. }
  247. //游戏场景
  248. bool CGameClientEngine::OnEventSceneMessage(BYTE cbGameStation, bool bLookonOther, VOID * pBuffer, WORD wDataSize)
  249. {
  250. switch (cbGameStation)
  251. {
  252. case GS_MJ_FREE: //空闲状态
  253. {
  254. //效验数据
  255. if (wDataSize!=sizeof(CMD_S_StatusFree)) return false;
  256. CMD_S_StatusFree * pStatusFree=(CMD_S_StatusFree *)pBuffer;
  257. //是否启用声音
  258. if( !CGlobalUnits::GetInstance()->m_bAllowSound )
  259. {
  260. m_DirectSound.EnableSound(FALSE);
  261. }
  262. //设置数据
  263. m_wBankerUser=pStatusFree->wBankerUser;
  264. m_GameClientView.SetCellScore(pStatusFree->lCellScore);
  265. m_GameClientView.m_HandCardControl.SetDisplayItem(true);
  266. //托管设置
  267. for (WORD i=0;i<GAME_PLAYER;i++)
  268. {
  269. m_GameClientView.SetTrustee(SwitchViewChairID(i),pStatusFree->bTrustee[i]);
  270. }
  271. //设置界面
  272. for (WORD i=0;i<GAME_PLAYER;i++)
  273. {
  274. m_cbHeapCardInfo[i][0]=0;
  275. m_cbHeapCardInfo[i][1]=0;
  276. m_GameClientView.m_HeapCard[SwitchViewChairID(i)].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
  277. }
  278. //设置控件
  279. if (IsLookonMode()==false)
  280. {
  281. m_GameClientView.m_btStart.ShowWindow(SW_SHOW);
  282. m_GameClientView.m_btStart.SetFocus();
  283. m_GameClientView.m_btStusteeControl.EnableWindow(TRUE);
  284. SetGameClock(GetMeChairID(),IDI_START_GAME,TIME_START_GAME);
  285. }
  286. //丢弃效果
  287. m_GameClientView.SetDiscUser(INVALID_CHAIR);
  288. m_GameClientView.SetTimer(IDI_DISC_EFFECT,250,NULL);
  289. //更新界面
  290. m_GameClientView.InvalidGameView(0,0,0,0);
  291. return true;
  292. }
  293. case GS_MJ_PLAY: //游戏状态
  294. {
  295. //效验数据
  296. if (wDataSize!=sizeof(CMD_S_StatusPlay)) return false;
  297. CMD_S_StatusPlay * pStatusPlay=(CMD_S_StatusPlay *)pBuffer;
  298. //是否启用声音
  299. if( !CGlobalUnits::GetInstance()->m_bAllowSound )
  300. {
  301. m_DirectSound.EnableSound(FALSE);
  302. }
  303. WORD wMeChairID=GetMeChairID();
  304. //设置变量
  305. m_wBankerUser=pStatusPlay->wBankerUser;
  306. m_wCurrentUser=pStatusPlay->wCurrentUser;
  307. m_cbLeftCardCount=pStatusPlay->cbLeftCardCount;
  308. //旁观
  309. if( IsLookonMode()==true )
  310. m_GameClientView.m_HandCardControl.SetDisplayItem(IsAllowLookon());
  311. //托管设置
  312. for (WORD i=0;i<GAME_PLAYER;i++)
  313. {
  314. m_GameClientView.SetTrustee(SwitchViewChairID(i),pStatusPlay->bTrustee[i]);
  315. }
  316. if( pStatusPlay->bTrustee[wMeChairID] )
  317. {
  318. m_bStustee = true;
  319. OnStusteeControl(0,0);
  320. }
  321. m_wTimeOutCount=0;
  322. if(pStatusPlay->bTrustee[GetMeChairID()])
  323. m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_STOP_TRUSTEE,AfxGetInstanceHandle(),false,false);
  324. else
  325. m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_START_TRUSTEE,AfxGetInstanceHandle(),false,false);
  326. //历史变量
  327. m_wOutCardUser=pStatusPlay->wOutCardUser;
  328. m_cbOutCardData=pStatusPlay->cbOutCardData;
  329. CopyMemory(m_cbDiscardCard,pStatusPlay->cbDiscardCard,sizeof(m_cbDiscardCard));
  330. CopyMemory(m_cbDiscardCount,pStatusPlay->cbDiscardCount,sizeof(m_cbDiscardCount));
  331. if( pStatusPlay->wOutCardUser != INVALID_CHAIR )
  332. m_cbDiscardCard[pStatusPlay->wOutCardUser][m_cbDiscardCount[pStatusPlay->wOutCardUser]++] = pStatusPlay->cbOutCardData;
  333. //丢弃效果
  334. if(m_wOutCardUser != INVALID_CHAIR)
  335. m_GameClientView.SetDiscUser(SwitchViewChairID(m_wOutCardUser));
  336. m_GameClientView.SetTimer(IDI_DISC_EFFECT,250,NULL);
  337. //扑克变量
  338. CopyMemory(m_cbWeaveCount,pStatusPlay->cbWeaveCount,sizeof(m_cbWeaveCount));
  339. CopyMemory(m_WeaveItemArray,pStatusPlay->WeaveItemArray,sizeof(m_WeaveItemArray));
  340. m_GameLogic.SwitchToCardIndex(pStatusPlay->cbCardData,pStatusPlay->cbCardCount,m_cbCardIndex);
  341. //辅助变量
  342. WORD wViewChairID[GAME_PLAYER]={0,0,0,0};
  343. for (WORD i=0;i<GAME_PLAYER;i++) wViewChairID[i]=SwitchViewChairID(i);
  344. //界面设置
  345. m_GameClientView.SetCellScore(pStatusPlay->lCellScore);
  346. m_GameClientView.SetBankerUser(wViewChairID[m_wBankerUser]);
  347. //组合扑克
  348. BYTE cbWeaveCard[4]={0,0,0,0};
  349. for (WORD i=0;i<GAME_PLAYER;i++)
  350. {
  351. WORD wOperateViewID = SwitchViewChairID(i);
  352. for (BYTE j=0;j<m_cbWeaveCount[i];j++)
  353. {
  354. BYTE cbWeaveKind=m_WeaveItemArray[i][j].cbWeaveKind;
  355. BYTE cbCenterCard=m_WeaveItemArray[i][j].cbCenterCard;
  356. BYTE cbWeaveCardCount=m_GameLogic.GetWeaveCard(cbWeaveKind,cbCenterCard,cbWeaveCard);
  357. m_GameClientView.m_WeaveCard[wViewChairID[i]][j].SetCardData(cbWeaveCard,cbWeaveCardCount);
  358. if ((cbWeaveKind&WIK_GANG)&&(m_WeaveItemArray[i][j].wProvideUser==i))
  359. m_GameClientView.m_WeaveCard[wViewChairID[i]][j].SetDisplayItem(false);
  360. WORD wProviderViewID = SwitchViewChairID(m_WeaveItemArray[i][j].wProvideUser);
  361. m_GameClientView.m_WeaveCard[wOperateViewID][j].SetDirectionCardPos(3-(wOperateViewID-wProviderViewID+4)%4);
  362. }
  363. }
  364. //用户扑克
  365. if (m_wCurrentUser==GetMeChairID())
  366. {
  367. //调整扑克
  368. if (pStatusPlay->cbSendCardData!=0x00)
  369. {
  370. //变量定义
  371. BYTE cbCardCount=pStatusPlay->cbCardCount;
  372. BYTE cbRemoveCard[]={pStatusPlay->cbSendCardData};
  373. //调整扑克
  374. m_GameLogic.RemoveCard(pStatusPlay->cbCardData,cbCardCount,cbRemoveCard,1);
  375. pStatusPlay->cbCardData[pStatusPlay->cbCardCount-1]=pStatusPlay->cbSendCardData;
  376. }
  377. //设置扑克
  378. BYTE cbCardCount=pStatusPlay->cbCardCount;
  379. m_GameClientView.m_HandCardControl.SetCardData(pStatusPlay->cbCardData,cbCardCount-1,pStatusPlay->cbCardData[cbCardCount-1]);
  380. }
  381. else
  382. m_GameClientView.m_HandCardControl.SetCardData(pStatusPlay->cbCardData,pStatusPlay->cbCardCount,0);
  383. //扑克设置
  384. for (WORD i=0;i<GAME_PLAYER;i++)
  385. {
  386. //用户扑克
  387. if (i!=GetMeChairID())
  388. {
  389. BYTE cbCardCount=13-m_cbWeaveCount[i]*3;
  390. WORD wUserCardIndex=(wViewChairID[i]<2)?wViewChairID[i]:2;
  391. m_GameClientView.m_UserCard[wUserCardIndex].SetCardData(cbCardCount,(m_wCurrentUser==i));
  392. }
  393. //丢弃扑克
  394. WORD wViewChairID=SwitchViewChairID(i);
  395. m_GameClientView.m_DiscardCard[wViewChairID].SetCardData(m_cbDiscardCard[i],m_cbDiscardCount[i]);
  396. }
  397. //控制设置
  398. if (IsLookonMode()==false)
  399. {
  400. m_GameClientView.m_HandCardControl.SetPositively(true);
  401. m_GameClientView.m_HandCardControl.SetDisplayItem(true);
  402. m_GameClientView.m_btStusteeControl.EnableWindow(TRUE);
  403. }
  404. //堆立信息
  405. m_wHeapHand = pStatusPlay->wHeapHand;
  406. m_wHeapTail = pStatusPlay->wHeapTail;
  407. CopyMemory(m_cbHeapCardInfo,pStatusPlay->cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
  408. //堆立界面
  409. for (WORD i=0;i<GAME_PLAYER;i++)
  410. {
  411. m_GameClientView.m_HeapCard[wViewChairID[i]].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
  412. }
  413. //历史扑克
  414. if (m_wOutCardUser!=INVALID_CHAIR)
  415. {
  416. WORD wOutChairID=SwitchViewChairID(m_wOutCardUser);
  417. m_GameClientView.SetOutCardInfo(wOutChairID,m_cbOutCardData);
  418. }
  419. //名次状态
  420. for( WORD i = 0; i < CountArray(pStatusPlay->wWinOrder); i++ )
  421. {
  422. if( pStatusPlay->wWinOrder[i] != INVALID_CHAIR )
  423. {
  424. m_GameClientView.SetWinOrder( SwitchViewChairID(pStatusPlay->wWinOrder[i]),i+1 );
  425. }
  426. }
  427. //操作界面
  428. if ((IsLookonMode()==false)&&(pStatusPlay->cbActionMask!=WIK_NULL))
  429. {
  430. //获取变量
  431. BYTE cbActionMask=pStatusPlay->cbActionMask;
  432. BYTE cbActionCard=pStatusPlay->cbActionCard;
  433. m_cbUserAction = pStatusPlay->cbActionMask;
  434. //变量定义
  435. tagGangCardResult GangCardResult;
  436. ZeroMemory(&GangCardResult,sizeof(GangCardResult));
  437. //杠牌判断
  438. if ((cbActionMask&WIK_GANG)!=0)
  439. {
  440. //桌面杆牌
  441. if ((m_wCurrentUser==INVALID_CHAIR)&&(cbActionCard!=0))
  442. {
  443. GangCardResult.cbCardCount=1;
  444. GangCardResult.cbCardData[0]=cbActionCard;
  445. }
  446. //自己杆牌
  447. if ((m_wCurrentUser==GetMeChairID())||(cbActionCard==0))
  448. {
  449. WORD wMeChairID=GetMeChairID();
  450. m_GameLogic.AnalyseGangCard(m_cbCardIndex,m_WeaveItemArray[wMeChairID],m_cbWeaveCount[wMeChairID],GangCardResult);
  451. }
  452. }
  453. //设置界面
  454. if (m_wCurrentUser==INVALID_CHAIR)
  455. SetGameClock(GetMeChairID(),IDI_OPERATE_CARD,TIME_OPERATE_CARD);
  456. if (IsLookonMode()==false)
  457. m_GameClientView.m_ControlWnd.SetControlInfo(cbActionCard,cbActionMask,GangCardResult);
  458. }
  459. //设置时间
  460. if (m_wCurrentUser!=INVALID_CHAIR)
  461. {
  462. //计算时间
  463. WORD wTimeCount=TIME_OPERATE_CARD;
  464. //设置时间
  465. SetGameClock(m_wCurrentUser,TIME_OPERATE_CARD,wTimeCount);
  466. }
  467. //丢弃效果
  468. m_GameClientView.SetDiscUser(SwitchViewChairID(m_wOutCardUser));
  469. m_GameClientView.SetTimer(IDI_DISC_EFFECT,250,NULL);
  470. //更新界面
  471. m_GameClientView.InvalidGameView(0,0,0,0);
  472. return true;
  473. }
  474. }
  475. return false;
  476. }
  477. //游戏开始
  478. bool CGameClientEngine::OnSubGameStart(const void * pBuffer, WORD wDataSize)
  479. {
  480. //效验数据
  481. ASSERT(wDataSize==sizeof(CMD_S_GameStart));
  482. if (wDataSize!=sizeof(CMD_S_GameStart))
  483. return false;
  484. //变量定义
  485. CMD_S_GameStart * pGameStart=(CMD_S_GameStart *)pBuffer;
  486. //用户名称
  487. for( WORD i = 0; i < GAME_PLAYER; i++ )
  488. {
  489. IClientUserItem * pUserData = GetTableUserItem( i );
  490. if( pUserData == NULL )
  491. {
  492. m_szAccounts[i][0] = 0;
  493. continue;
  494. }
  495. lstrcpy( m_szAccounts[i],pUserData->GetNickName() );
  496. }
  497. //设置状态
  498. SetGameStatus(GS_MJ_PLAY);
  499. m_GameClientView.SetCurrentUser(INVALID_CHAIR);
  500. //设置变量
  501. m_wBankerUser=pGameStart->wBankerUser;
  502. m_wCurrentUser=pGameStart->wCurrentUser;
  503. m_cbLeftCardCount=pGameStart->cbLeftCardCount;
  504. m_cbUserAction = pGameStart->cbUserAction;
  505. m_lSiceCount = pGameStart->lSiceCount;
  506. //出牌信息
  507. m_cbOutCardData=0;
  508. m_wOutCardUser=INVALID_CHAIR;
  509. ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
  510. ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
  511. //组合扑克
  512. ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount));
  513. ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
  514. //设置扑克
  515. BYTE cbCardCount=(GetMeChairID()==m_wBankerUser)?MAX_COUNT:(MAX_COUNT-1);
  516. m_GameLogic.SwitchToCardIndex(pGameStart->cbCardData,cbCardCount,m_cbCardIndex);
  517. //旁观界面
  518. if (IsLookonMode()==true)
  519. {
  520. //设置界面
  521. m_GameClientView.SetDiscUser(INVALID_CHAIR);
  522. m_GameClientView.SetStatusFlag(false,false);
  523. m_GameClientView.SetBankerUser(INVALID_CHAIR);
  524. m_GameClientView.SetUserAction(INVALID_CHAIR,0);
  525. m_GameClientView.SetOutCardInfo(INVALID_CHAIR,0);
  526. m_GameClientView.SetWinOrder(INVALID_CHAIR,0);
  527. //扑克设置
  528. m_GameClientView.m_UserCard[0].SetCardData(0,false);
  529. m_GameClientView.m_UserCard[1].SetCardData(0,false);
  530. m_GameClientView.m_UserCard[2].SetCardData(0,false);
  531. m_GameClientView.m_HandCardControl.SetCardData(NULL,0,0);
  532. //扑克设置
  533. for (WORD i=0;i<GAME_PLAYER;i++)
  534. {
  535. m_GameClientView.m_ScoreControl[i].RestorationData();
  536. m_GameClientView.m_TableCard[i].SetCardData(NULL,0);
  537. m_GameClientView.m_DiscardCard[i].SetCardData(NULL,0);
  538. m_GameClientView.m_WeaveCard[i][0].SetCardData(NULL,0);
  539. m_GameClientView.m_WeaveCard[i][1].SetCardData(NULL,0);
  540. m_GameClientView.m_WeaveCard[i][2].SetCardData(NULL,0);
  541. m_GameClientView.m_WeaveCard[i][3].SetCardData(NULL,0);
  542. m_GameClientView.m_WeaveCard[i][0].SetGameEnd(false);
  543. m_GameClientView.m_WeaveCard[i][1].SetGameEnd(false);
  544. m_GameClientView.m_WeaveCard[i][2].SetGameEnd(false);
  545. m_GameClientView.m_WeaveCard[i][3].SetGameEnd(false);
  546. m_GameClientView.m_WeaveCard[i][0].SetDisplayItem(true);
  547. m_GameClientView.m_WeaveCard[i][1].SetDisplayItem(true);
  548. m_GameClientView.m_WeaveCard[i][2].SetDisplayItem(true);
  549. m_GameClientView.m_WeaveCard[i][3].SetDisplayItem(true);
  550. }
  551. //堆立扑克
  552. for (WORD i=0;i<GAME_PLAYER;i++)
  553. {
  554. m_cbHeapCardInfo[i][0]=0;
  555. m_cbHeapCardInfo[i][1]=0;
  556. m_GameClientView.m_HeapCard[SwitchViewChairID(i)].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
  557. }
  558. }
  559. //堆立信息
  560. m_wHeapHand = pGameStart->wHeapHand;
  561. m_wHeapTail = pGameStart->wHeapTail;
  562. CopyMemory(m_cbHeapCardInfo,pGameStart->cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
  563. //设置界面
  564. m_GameClientView.m_HandCardControl.SetPositively(false);
  565. //环境处理
  566. PlayGameSound(AfxGetInstanceHandle(),TEXT("DRAW_SICE"));
  567. //摇色子动画
  568. m_GameClientView.m_DrawSiceWnd.SetSiceInfo(m_GameClientView.GetDC(),200,(WORD)(pGameStart->lSiceCount>>16),(WORD)pGameStart->lSiceCount);
  569. m_GameClientView.m_DrawSiceWnd.ShowWindow(SW_SHOW);
  570. return true;
  571. }
  572. //用户出牌
  573. bool CGameClientEngine::OnSubOutCard(const void * pBuffer, WORD wDataSize)
  574. {
  575. //效验消息
  576. ASSERT(wDataSize==sizeof(CMD_S_OutCard));
  577. if (wDataSize!=sizeof(CMD_S_OutCard)) return false;
  578. //消息处理
  579. CMD_S_OutCard * pOutCard=(CMD_S_OutCard *)pBuffer;
  580. //变量定义
  581. WORD wMeChairID=GetMeChairID();
  582. WORD wOutViewChairID=SwitchViewChairID(pOutCard->wOutCardUser);
  583. //设置变量
  584. m_wCurrentUser=INVALID_CHAIR;
  585. m_wOutCardUser=pOutCard->wOutCardUser;
  586. m_cbOutCardData=pOutCard->cbOutCardData;
  587. //其他用户
  588. if ((IsLookonMode()==true)||(pOutCard->wOutCardUser!=wMeChairID))
  589. {
  590. //环境设置
  591. KillGameClock(IDI_OPERATE_CARD);
  592. //播放声音
  593. PlayCardSound(pOutCard->wOutCardUser,pOutCard->cbOutCardData);
  594. //出牌界面
  595. m_GameClientView.SetUserAction(INVALID_CHAIR,0);
  596. m_GameClientView.SetOutCardInfo(wOutViewChairID,pOutCard->cbOutCardData);
  597. //设置扑克
  598. if (wOutViewChairID==2)
  599. {
  600. //删除扑克
  601. BYTE cbCardData[MAX_COUNT];
  602. m_GameLogic.RemoveCard(m_cbCardIndex,pOutCard->cbOutCardData);
  603. //设置扑克
  604. BYTE cbCardCount=m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
  605. m_GameClientView.m_HandCardControl.SetCardData(cbCardData,cbCardCount,0);
  606. }
  607. else
  608. {
  609. WORD wUserIndex=(wOutViewChairID>2)?2:wOutViewChairID;
  610. m_GameClientView.m_UserCard[wUserIndex].SetCurrentCard(false);
  611. }
  612. }
  613. return true;
  614. }
  615. //发牌消息
  616. bool CGameClientEngine::OnSubSendCard(const void * pBuffer, WORD wDataSize)
  617. {
  618. //效验数据
  619. ASSERT(wDataSize==sizeof(CMD_S_SendCard));
  620. if (wDataSize!=sizeof(CMD_S_SendCard)) return false;
  621. //变量定义
  622. CMD_S_SendCard * pSendCard=(CMD_S_SendCard *)pBuffer;
  623. //设置变量
  624. WORD wMeChairID=GetMeChairID();
  625. m_wCurrentUser=pSendCard->wCurrentUser;
  626. //隐藏控件
  627. m_GameClientView.m_ControlWnd.ShowWindow( SW_HIDE );
  628. //删除定时器
  629. KillGameClock( IDI_OPERATE_CARD );
  630. //丢弃扑克
  631. if ((m_wOutCardUser!=INVALID_CHAIR)&&(m_cbOutCardData!=0))
  632. {
  633. //丢弃扑克
  634. WORD wOutViewChairID=SwitchViewChairID(m_wOutCardUser);
  635. m_GameClientView.m_DiscardCard[wOutViewChairID].AddCardItem(m_cbOutCardData);
  636. m_GameClientView.SetDiscUser(wOutViewChairID);
  637. //设置变量
  638. m_cbOutCardData=0;
  639. m_wOutCardUser=INVALID_CHAIR;
  640. }
  641. //发牌处理
  642. if (pSendCard->cbCardData!=0)
  643. {
  644. //取牌界面
  645. WORD wViewChairID=SwitchViewChairID(m_wCurrentUser);
  646. if (wViewChairID!=2)
  647. {
  648. WORD wUserIndex=(wViewChairID>2)?2:wViewChairID;
  649. m_GameClientView.m_UserCard[wUserIndex].SetCurrentCard(true);
  650. }
  651. else
  652. {
  653. m_cbCardIndex[m_GameLogic.SwitchToCardIndex(pSendCard->cbCardData)]++;
  654. m_GameClientView.m_HandCardControl.SetCurrentCard(pSendCard->cbCardData);
  655. }
  656. //扣除扑克
  657. DeductionTableCard(pSendCard->bTail==false);
  658. }
  659. //当前用户
  660. if ((IsLookonMode()==false)&&(m_wCurrentUser==wMeChairID))
  661. {
  662. //激活框架
  663. ActiveGameFrame();
  664. //动作处理
  665. if (pSendCard->cbActionMask!=WIK_NULL)
  666. {
  667. //获取变量
  668. BYTE cbActionCard=pSendCard->cbCardData;
  669. BYTE cbActionMask=pSendCard->cbActionMask;
  670. m_cbUserAction = pSendCard->cbActionMask;
  671. //变量定义
  672. tagGangCardResult GangCardResult;
  673. ZeroMemory(&GangCardResult,sizeof(GangCardResult));
  674. //杠牌判断
  675. if ((cbActionMask&WIK_GANG)!=0)
  676. {
  677. WORD wMeChairID=GetMeChairID();
  678. m_GameLogic.AnalyseGangCard(m_cbCardIndex,m_WeaveItemArray[wMeChairID],m_cbWeaveCount[wMeChairID],GangCardResult);
  679. }
  680. //设置界面
  681. m_GameClientView.m_ControlWnd.SetControlInfo(cbActionCard,cbActionMask,GangCardResult);
  682. }
  683. }
  684. //出牌提示
  685. m_GameClientView.SetStatusFlag((IsLookonMode()==false)&&(m_wCurrentUser==wMeChairID),false);
  686. //更新界面
  687. m_GameClientView.InvalidGameView(0,0,0,0);
  688. //计算时间
  689. WORD wTimeCount=TIME_OPERATE_CARD;
  690. //设置时间
  691. m_GameClientView.SetCurrentUser(SwitchViewChairID(m_wCurrentUser));
  692. SetGameClock(m_wCurrentUser,IDI_OPERATE_CARD,wTimeCount);
  693. return true;
  694. }
  695. //操作提示
  696. bool CGameClientEngine::OnSubOperateNotify(const void * pBuffer, WORD wDataSize)
  697. {
  698. //效验数据
  699. ASSERT(wDataSize==sizeof(CMD_S_OperateNotify));
  700. if (wDataSize!=sizeof(CMD_S_OperateNotify))
  701. return false;
  702. //变量定义
  703. CMD_S_OperateNotify * pOperateNotify=(CMD_S_OperateNotify *)pBuffer;
  704. //用户界面
  705. if ((IsLookonMode()==false)&&(pOperateNotify->cbActionMask!=WIK_NULL))
  706. {
  707. //获取变量
  708. WORD wMeChairID=GetMeChairID();
  709. BYTE cbActionMask=pOperateNotify->cbActionMask;
  710. BYTE cbActionCard=pOperateNotify->cbActionCard;
  711. m_cbUserAction = pOperateNotify->cbActionMask;
  712. //变量定义
  713. tagGangCardResult GangCardResult;
  714. ZeroMemory(&GangCardResult,sizeof(GangCardResult));
  715. //杠牌判断
  716. if ((cbActionMask&WIK_GANG)!=0)
  717. {
  718. //桌面杆牌
  719. if ((m_wCurrentUser==INVALID_CHAIR)&&(cbActionCard!=0))
  720. {
  721. GangCardResult.cbCardCount=1;
  722. GangCardResult.cbCardData[0]=cbActionCard;
  723. }
  724. //自己杆牌
  725. if ((m_wCurrentUser==wMeChairID)||(cbActionCard==0))
  726. {
  727. WORD wMeChairID=GetMeChairID();
  728. m_GameLogic.AnalyseGangCard(m_cbCardIndex,m_WeaveItemArray[wMeChairID],m_cbWeaveCount[wMeChairID],GangCardResult);
  729. }
  730. }
  731. //设置界面
  732. ActiveGameFrame();
  733. m_GameClientView.m_ControlWnd.SetControlInfo(cbActionCard,cbActionMask,GangCardResult);
  734. //设置时间
  735. m_GameClientView.SetCurrentUser(INVALID_CHAIR);
  736. SetGameClock(GetMeChairID(),IDI_OPERATE_CARD,TIME_OPERATE_CARD);
  737. }
  738. return true;
  739. }
  740. //操作结果
  741. bool CGameClientEngine::OnSubOperateResult(const void * pBuffer, WORD wDataSize)
  742. {
  743. //效验消息
  744. ASSERT(wDataSize==sizeof(CMD_S_OperateResult));
  745. if (wDataSize!=sizeof(CMD_S_OperateResult))
  746. return false;
  747. //消息处理
  748. CMD_S_OperateResult * pOperateResult=(CMD_S_OperateResult *)pBuffer;
  749. //变量定义
  750. BYTE cbPublicCard=TRUE;
  751. WORD wOperateUser=pOperateResult->wOperateUser;
  752. BYTE cbOperateCard=pOperateResult->cbOperateCard;
  753. WORD wOperateViewID=SwitchViewChairID(wOperateUser);
  754. WORD wProviderViewID = SwitchViewChairID(pOperateResult->wProvideUser);
  755. //出牌变量
  756. if (pOperateResult->cbOperateCode!=WIK_NULL)
  757. {
  758. m_cbOutCardData=0;
  759. m_wOutCardUser=INVALID_CHAIR;
  760. }
  761. //设置变量
  762. m_wCurrentUser=pOperateResult->wOperateUser;
  763. //设置组合
  764. if ((pOperateResult->cbOperateCode&WIK_GANG)!=0)
  765. {
  766. m_wCurrentUser = INVALID_CHAIR;
  767. //组合扑克
  768. BYTE cbWeaveIndex=0xFF;
  769. for (BYTE i=0;i<m_cbWeaveCount[wOperateUser];i++)
  770. {
  771. BYTE cbWeaveKind=m_WeaveItemArray[wOperateUser][i].cbWeaveKind;
  772. BYTE cbCenterCard=m_WeaveItemArray[wOperateUser][i].cbCenterCard;
  773. if ((cbCenterCard==cbOperateCard)&&(cbWeaveKind==WIK_PENG))
  774. {
  775. cbWeaveIndex=i;
  776. m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbPublicCard=TRUE;
  777. m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbWeaveKind=pOperateResult->cbOperateCode;
  778. m_WeaveItemArray[wOperateUser][cbWeaveIndex].wProvideUser=pOperateResult->wProvideUser;
  779. break;
  780. }
  781. }
  782. //组合扑克
  783. if (cbWeaveIndex==0xFF)
  784. {
  785. //暗杠判断
  786. cbPublicCard=(pOperateResult->wProvideUser==wOperateUser)?FALSE:TRUE;
  787. //设置扑克
  788. cbWeaveIndex=m_cbWeaveCount[wOperateUser]++;
  789. m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbPublicCard=cbPublicCard;
  790. m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbCenterCard=cbOperateCard;
  791. m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbWeaveKind=pOperateResult->cbOperateCode;
  792. m_WeaveItemArray[wOperateUser][cbWeaveIndex].wProvideUser=pOperateResult->wProvideUser;
  793. }
  794. //组合界面
  795. BYTE cbWeaveCard[4]={0,0,0,0},cbWeaveKind=pOperateResult->cbOperateCode;
  796. BYTE cbWeaveCardCount=m_GameLogic.GetWeaveCard(cbWeaveKind,cbOperateCard,cbWeaveCard);
  797. m_GameClientView.m_WeaveCard[wOperateViewID][cbWeaveIndex].SetCardData(cbWeaveCard,cbWeaveCardCount);
  798. m_GameClientView.m_WeaveCard[wOperateViewID][cbWeaveIndex].SetDisplayItem((cbPublicCard==TRUE)?true:false);
  799. //扑克设置
  800. if (GetMeChairID()==wOperateUser)
  801. {
  802. m_cbCardIndex[m_GameLogic.SwitchToCardIndex(pOperateResult->cbOperateCard)]=0;
  803. }
  804. //设置扑克
  805. if (GetMeChairID()==wOperateUser)
  806. {
  807. BYTE cbCardData[MAX_COUNT];
  808. BYTE cbCardCount=m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
  809. m_GameClientView.m_HandCardControl.SetCardData(cbCardData,cbCardCount,0);
  810. }
  811. else
  812. {
  813. WORD wUserIndex=(wOperateViewID>=3)?2:wOperateViewID;
  814. BYTE cbCardCount=MAX_COUNT-m_cbWeaveCount[wOperateUser]*3;
  815. m_GameClientView.m_UserCard[wUserIndex].SetCardData(cbCardCount-1,false);
  816. }
  817. }
  818. else if (pOperateResult->cbOperateCode!=WIK_NULL)
  819. {
  820. //设置组合
  821. BYTE cbWeaveIndex=m_cbWeaveCount[wOperateUser]++;
  822. m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbPublicCard=TRUE;
  823. m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbCenterCard=cbOperateCard;
  824. m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbWeaveKind=pOperateResult->cbOperateCode;
  825. m_WeaveItemArray[wOperateUser][cbWeaveIndex].wProvideUser=pOperateResult->wProvideUser;
  826. //组合界面
  827. BYTE cbWeaveCard[4]={0,0,0,0},cbWeaveKind=pOperateResult->cbOperateCode;
  828. BYTE cbWeaveCardCount=m_GameLogic.GetWeaveCard(cbWeaveKind,cbOperateCard,cbWeaveCard);
  829. m_GameClientView.m_WeaveCard[wOperateViewID][cbWeaveIndex].SetCardData(cbWeaveCard,cbWeaveCardCount);
  830. m_GameClientView.m_WeaveCard[wOperateViewID][cbWeaveIndex].SetDirectionCardPos(3-(wOperateViewID-wProviderViewID+4)%4);
  831. //删除扑克
  832. if (GetMeChairID()==wOperateUser)
  833. {
  834. VERIFY( m_GameLogic.RemoveCard(cbWeaveCard,cbWeaveCardCount,&cbOperateCard,1) );
  835. VERIFY( m_GameLogic.RemoveCard(m_cbCardIndex,cbWeaveCard,cbWeaveCardCount-1) );
  836. }
  837. //设置扑克
  838. if (GetMeChairID()==wOperateUser)
  839. {
  840. BYTE cbCardData[MAX_COUNT];
  841. BYTE cbCardCount=m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
  842. m_GameClientView.m_HandCardControl.SetCardData(cbCardData,cbCardCount-1,cbCardData[cbCardCount-1]);
  843. }
  844. else
  845. {
  846. WORD wUserIndex=(wOperateViewID>=3)?2:wOperateViewID;
  847. BYTE cbCardCount=MAX_COUNT-m_cbWeaveCount[wOperateUser]*3;
  848. m_GameClientView.m_UserCard[wUserIndex].SetCardData(cbCardCount-1,true);
  849. }
  850. }
  851. //设置界面
  852. m_GameClientView.SetOutCardInfo(INVALID_CHAIR,0);
  853. m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
  854. m_GameClientView.SetUserAction(wOperateViewID,pOperateResult->cbOperateCode);
  855. m_GameClientView.SetStatusFlag((IsLookonMode()==false)&&(m_wCurrentUser==GetMeChairID()),false);
  856. //更新界面
  857. m_GameClientView.InvalidGameView(0,0,0,0);
  858. //环境设置
  859. PlayActionSound(wOperateUser,pOperateResult->cbOperateCode);
  860. //设置时间
  861. if (m_wCurrentUser!=INVALID_CHAIR)
  862. {
  863. //计算时间
  864. WORD wTimeCount=TIME_OPERATE_CARD;
  865. //设置时间
  866. m_GameClientView.SetCurrentUser(SwitchViewChairID(m_wCurrentUser));
  867. SetGameClock(m_wCurrentUser,IDI_OPERATE_CARD,wTimeCount);
  868. }
  869. return true;
  870. }
  871. //游戏结束
  872. bool CGameClientEngine::OnSubGameEnd(const void * pBuffer, WORD wDataSize)
  873. {
  874. //效验数据
  875. ASSERT(wDataSize==sizeof(CMD_S_GameEnd));
  876. if (wDataSize!=sizeof(CMD_S_GameEnd)) return false;
  877. //消息处理
  878. CMD_S_GameEnd * pGameEnd=(CMD_S_GameEnd *)pBuffer;
  879. //设置状态
  880. SetGameStatus(GS_MJ_FREE);
  881. m_GameClientView.SetStatusFlag(false,false);
  882. //删除定时器
  883. KillGameClock(IDI_OPERATE_CARD);
  884. //设置控件
  885. m_GameClientView.SetStatusFlag(false,false);
  886. m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
  887. m_GameClientView.m_HandCardControl.SetPositively(false);
  888. //设置扑克
  889. for (WORD i=0;i<GAME_PLAYER;i++)
  890. {
  891. m_GameClientView.m_WeaveCard[i][0].SetGameEnd(true);
  892. m_GameClientView.m_WeaveCard[i][1].SetGameEnd(true);
  893. m_GameClientView.m_WeaveCard[i][2].SetGameEnd(true);
  894. m_GameClientView.m_WeaveCard[i][3].SetGameEnd(true);
  895. }
  896. //变量定义
  897. tagScoreInfo ScoreInfo;
  898. ZeroMemory(&ScoreInfo,sizeof(ScoreInfo));
  899. //设置积分
  900. CString strTemp ,strEnd;
  901. if( pGameEnd->wLeftUser != INVALID_CHAIR )
  902. {
  903. strEnd.AppendFormat( TEXT("玩家[]逃跑,将收回刮风下雨所得,并垫付其它玩家的刮风下雨,及未胡牌者花猪。"),
  904. m_szAccounts[pGameEnd->wLeftUser] );
  905. if ( m_pIStringMessage )
  906. m_pIStringMessage->InsertSystemString( strEnd );
  907. }
  908. strEnd = TEXT("\n本局结束,成绩统计:\r\n");
  909. for( WORD i = 0; i < GAME_PLAYER; i++ )
  910. {
  911. if( m_szAccounts[i][0] == 0 ) continue;
  912. lstrcpy( ScoreInfo.szUserName[SwitchViewChairID(i)],m_szAccounts[i] );
  913. strTemp.Format(TEXT("%s: %I64d\n"),m_szAccounts[i],pGameEnd->lGameScore[i]);
  914. strEnd += strTemp;
  915. }
  916. //消息积分
  917. if ( m_pIStringMessage )
  918. m_pIStringMessage->InsertSystemString((LPCTSTR)strEnd);
  919. //成绩变量
  920. for( WORD i = 0; i < GAME_PLAYER; i++ )
  921. {
  922. WORD wViewId = SwitchViewChairID(i);
  923. ScoreInfo.wMeChairId = wViewId;
  924. WORD j = 0;
  925. for( ; j < CountArray(pGameEnd->wWinOrder); j++ )
  926. {
  927. if( pGameEnd->wWinOrder[j] == i )
  928. {
  929. ScoreInfo.cbWinOrder = (BYTE)j+1;
  930. break;
  931. }
  932. }
  933. if( j == CountArray(pGameEnd->wWinOrder) ) ScoreInfo.cbWinOrder = 0;
  934. ScoreInfo.wProvideUser = SwitchViewChairID(pGameEnd->wProvideUser[i]);
  935. ScoreInfo.lGameScore = pGameEnd->lGameScore[i];
  936. ScoreInfo.lGameTax = pGameEnd->lGameTax[i];
  937. ScoreInfo.lGangScore = pGameEnd->lGangScore[i];
  938. ScoreInfo.cbGenCount = pGameEnd->cbGenCount[i];
  939. //CopyMemory( ScoreInfo.dwChiHuRight,&pGameEnd->dwChiHuRight[i],sizeof(DWORD)*MAX_RIGHT_COUNT );
  940. ZeroMemory( ScoreInfo.wLostFanShu,sizeof(ScoreInfo.wLostFanShu) );
  941. for( WORD j = 0; j < GAME_PLAYER; j++ )
  942. {
  943. if( j == i ) continue;
  944. ScoreInfo.wLostFanShu[SwitchViewChairID(j)] = pGameEnd->wLostFanShu[i][j];
  945. }
  946. m_GameClientView.m_ScoreControl[wViewId].SetScoreInfo( ScoreInfo );
  947. }
  948. //用户扑克
  949. for (WORD i=0;i<GAME_PLAYER;i++)
  950. {
  951. WORD wViewChairID=SwitchViewChairID(i);
  952. m_GameClientView.m_TableCard[wViewChairID].SetCardData(pGameEnd->cbCardData[i],pGameEnd->cbCardCount[i]);
  953. }
  954. //设置扑克
  955. m_GameClientView.m_UserCard[0].SetCardData(0,false);
  956. m_GameClientView.m_UserCard[1].SetCardData(0,false);
  957. m_GameClientView.m_UserCard[2].SetCardData(0,false);
  958. m_GameClientView.m_HandCardControl.SetCardData(NULL,0,0);
  959. //播放声音
  960. LONGLONG lScore=pGameEnd->lGameScore[GetMeChairID()];
  961. if (lScore>0L)
  962. {
  963. PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_WIN"));
  964. }
  965. else if (lScore<0L)
  966. {
  967. PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_LOST"));
  968. }
  969. else
  970. {
  971. PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_END"));
  972. }
  973. //设置界面
  974. if (IsLookonMode()==false)
  975. {
  976. m_GameClientView.m_btStart.ShowWindow(SW_SHOW);
  977. m_GameClientView.SetCurrentUser(INVALID_CHAIR);
  978. SetGameClock(GetMeChairID(),IDI_START_GAME,TIME_START_GAME);
  979. }
  980. //取消托管
  981. if(m_bStustee)
  982. OnStusteeControl(0,0);
  983. //更新界面
  984. m_GameClientView.InvalidGameView(0,0,0,0);
  985. return true;
  986. }
  987. //用户托管
  988. bool CGameClientEngine::OnSubTrustee(const void * pBuffer,WORD wDataSize)
  989. {
  990. //效验数据
  991. ASSERT(wDataSize==sizeof(CMD_S_Trustee));
  992. if (wDataSize!=sizeof(CMD_S_Trustee)) return false;
  993. //消息处理
  994. CMD_S_Trustee * pTrustee=(CMD_S_Trustee *)pBuffer;
  995. m_GameClientView.SetTrustee(SwitchViewChairID(pTrustee->wChairID),pTrustee->bTrustee);
  996. if ((IsLookonMode()==true)||(pTrustee->wChairID!=GetMeChairID()))
  997. {
  998. IClientUserItem * pUserData = GetTableUserItem(pTrustee->wChairID);
  999. TCHAR szBuffer[256];
  1000. if(pTrustee->bTrustee==true)
  1001. _sntprintf(szBuffer,sizeof(szBuffer),TEXT("玩家[%s]选择了托管功能."),pUserData->GetNickName());
  1002. else
  1003. _sntprintf(szBuffer,sizeof(szBuffer),TEXT("玩家[%s]取消了托管功能."),pUserData->GetNickName());
  1004. if ( m_pIStringMessage )
  1005. m_pIStringMessage->InsertSystemString(szBuffer);
  1006. }
  1007. return true;
  1008. }
  1009. //
  1010. bool CGameClientEngine::OnSubUserChiHu( const void *pBuffer,WORD wDataSize )
  1011. {
  1012. //效验消息
  1013. ASSERT(wDataSize==sizeof(CMD_S_ChiHu));
  1014. if (wDataSize!=sizeof(CMD_S_ChiHu)) return false;
  1015. //消息处理
  1016. CMD_S_ChiHu * pChiHu=(CMD_S_ChiHu *)pBuffer;
  1017. WORD wViewId = SwitchViewChairID( pChiHu->wChiHuUser );
  1018. //隐藏控件
  1019. m_GameClientView.m_ControlWnd.ShowWindow( SW_HIDE );
  1020. //删除定时器
  1021. KillGameClock( IDI_OPERATE_CARD );
  1022. BYTE cbCardData[MAX_COUNT];
  1023. ZeroMemory( cbCardData,sizeof(cbCardData) );
  1024. cbCardData[pChiHu->cbCardCount-1] = pChiHu->cbChiHuCard;
  1025. //设置扑克,名次
  1026. if( wViewId == 2 )
  1027. {
  1028. m_GameClientView.m_HandCardControl.SetPositively( false );
  1029. m_GameClientView.m_HandCardControl.SetCardData( NULL,0,0 );
  1030. m_GameClientView.m_TableCard[2].SetCardData( cbCardData,pChiHu->cbCardCount );
  1031. }
  1032. else
  1033. {
  1034. WORD wUserIndex=(wViewId>2)?2:wViewId;
  1035. m_GameClientView.m_UserCard[wUserIndex].SetCardData( 0,false );
  1036. m_GameClientView.m_TableCard[wViewId].SetCardData( cbCardData,pChiHu->cbCardCount );
  1037. }
  1038. m_GameClientView.SetWinOrder( wViewId,pChiHu->cbWinOrder );
  1039. ////提示消息
  1040. //TCHAR szBuffer[128] = TEXT("");
  1041. //_sntprintf( szBuffer,CountArray(szBuffer),TEXT("\n玩家[%s]胡牌,得分:%+I64d\n"),m_szAccounts[pChiHu->wChiHuUser],pChiHu->lGameScore );
  1042. //InsertSystemString( szBuffer );
  1043. //设置界面
  1044. m_GameClientView.SetOutCardInfo(INVALID_CHAIR,0);
  1045. WORD wAction = WIK_CHI_HU;
  1046. if( pChiHu->wChiHuUser == pChiHu->wProviderUser )
  1047. wAction |= WIK_ZI_MO;
  1048. m_GameClientView.SetUserAction(wViewId,wAction);
  1049. m_GameClientView.SetStatusFlag(false,false);
  1050. //更新界面
  1051. m_GameClientView.InvalidGameView(0,0,0,0);
  1052. //环境设置
  1053. PlayActionSound(pChiHu->wChiHuUser,WIK_CHI_HU);
  1054. return true;
  1055. }
  1056. //播放出牌声音
  1057. void CGameClientEngine::PlayCardSound(WORD wChairID, BYTE cbCardData)
  1058. {
  1059. if(m_GameLogic.IsValidCard(cbCardData) == false)
  1060. {
  1061. return;
  1062. }
  1063. if(wChairID < 0 || wChairID > 3)
  1064. {
  1065. return;
  1066. }
  1067. //判断性别
  1068. IClientUserItem * pUserData = GetTableUserItem(wChairID);
  1069. if(pUserData == 0)
  1070. {
  1071. assert(0 && "得不到玩家信息");
  1072. return;
  1073. }
  1074. bool bBoy = (pUserData->GetGender() == GENDER_FEMALE ? false : true);
  1075. BYTE cbType= (cbCardData & MASK_COLOR);
  1076. BYTE cbValue= (cbCardData & MASK_VALUE);
  1077. CString strSoundName;
  1078. switch(cbType)
  1079. {
  1080. case 0X30: //风
  1081. {
  1082. switch(cbValue)
  1083. {
  1084. case 1:
  1085. {
  1086. strSoundName = _T("F_1");
  1087. break;
  1088. }
  1089. case 2:
  1090. {
  1091. strSoundName = _T("F_2");
  1092. break;
  1093. }
  1094. case 3:
  1095. {
  1096. strSoundName = _T("F_3");
  1097. break;
  1098. }
  1099. case 4:
  1100. {
  1101. strSoundName = _T("F_4");
  1102. break;
  1103. }
  1104. case 5:
  1105. {
  1106. strSoundName = _T("F_5");
  1107. break;
  1108. }
  1109. case 6:
  1110. {
  1111. strSoundName = _T("F_6");
  1112. break;
  1113. }
  1114. case 7:
  1115. {
  1116. strSoundName = _T("F_7");
  1117. break;
  1118. }
  1119. default:
  1120. {
  1121. strSoundName=_T("BU_HUA");
  1122. }
  1123. }
  1124. break;
  1125. }
  1126. case 0X20: //筒
  1127. {
  1128. strSoundName.Format(_T("T_%d"), cbValue);
  1129. break;
  1130. }
  1131. case 0X10: //索
  1132. {
  1133. strSoundName.Format(_T("S_%d"), cbValue);
  1134. break;
  1135. }
  1136. case 0X00: //万
  1137. {
  1138. strSoundName.Format(_T("W_%d"), cbValue);
  1139. break;
  1140. }
  1141. }
  1142. if(bBoy)
  1143. {
  1144. strSoundName = _T("BOY_") +strSoundName;
  1145. }
  1146. else
  1147. {
  1148. strSoundName = _T("GIRL_") + strSoundName;
  1149. }
  1150. m_DirectSound.Play();
  1151. PlayGameSound(AfxGetInstanceHandle(), strSoundName);
  1152. }
  1153. //播放声音
  1154. void CGameClientEngine::PlayActionSound(WORD wChairID,BYTE cbAction)
  1155. {
  1156. //判断性别
  1157. IClientUserItem * pUserData = GetTableUserItem(wChairID);
  1158. if(pUserData == 0)
  1159. {
  1160. assert(0 && "得不到玩家信息");
  1161. return;
  1162. }
  1163. if(wChairID < 0 || wChairID > 3)
  1164. {
  1165. return;
  1166. }
  1167. bool bBoy = (pUserData->GetGender() == GENDER_FEMALE ? false : true);
  1168. switch (cbAction)
  1169. {
  1170. case WIK_NULL: //取消
  1171. {
  1172. if(bBoy)
  1173. PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_OUT_CARD"));
  1174. else
  1175. PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_OUT_CARD"));
  1176. break;
  1177. }
  1178. case WIK_LEFT:
  1179. case WIK_CENTER:
  1180. case WIK_RIGHT: //上牌
  1181. {
  1182. if(bBoy)
  1183. PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_CHI"));
  1184. else
  1185. PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_CHI"));
  1186. break;
  1187. }
  1188. case WIK_PENG: //碰牌
  1189. {
  1190. if(bBoy)
  1191. PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_PENG"));
  1192. else
  1193. PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_PENG"));
  1194. break;
  1195. }
  1196. case WIK_GANG: //杠牌
  1197. {
  1198. if(bBoy)
  1199. PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_GANG"));
  1200. else
  1201. PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_GANG"));
  1202. break;
  1203. }
  1204. case WIK_CHI_HU: //吃胡
  1205. {
  1206. if(bBoy)
  1207. PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_CHI_HU"));
  1208. else
  1209. PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_CHI_HU"));
  1210. break;
  1211. }
  1212. }
  1213. return;
  1214. }
  1215. //出牌判断
  1216. bool CGameClientEngine::VerdictOutCard(BYTE cbCardData)
  1217. {
  1218. return true;
  1219. }
  1220. //扣除扑克
  1221. void CGameClientEngine::DeductionTableCard(bool bHeadCard)
  1222. {
  1223. if (bHeadCard==true)
  1224. {
  1225. //切换索引
  1226. BYTE cbHeapCount=m_cbHeapCardInfo[m_wHeapHand][0]+m_cbHeapCardInfo[m_wHeapHand][1];
  1227. if (cbHeapCount==HEAP_FULL_COUNT)
  1228. m_wHeapHand=(m_wHeapHand+1)%CountArray(m_cbHeapCardInfo);
  1229. //减少扑克
  1230. m_cbLeftCardCount--;
  1231. m_cbHeapCardInfo[m_wHeapHand][0]++;
  1232. //堆立扑克
  1233. WORD wHeapViewID=SwitchViewChairID(m_wHeapHand);
  1234. WORD wMinusHeadCount=m_cbHeapCardInfo[m_wHeapHand][0];
  1235. WORD wMinusLastCount=m_cbHeapCardInfo[m_wHeapHand][1];
  1236. m_GameClientView.m_HeapCard[wHeapViewID].SetCardData(wMinusHeadCount,wMinusLastCount,HEAP_FULL_COUNT);
  1237. }
  1238. else
  1239. {
  1240. //切换索引
  1241. BYTE cbHeapCount=m_cbHeapCardInfo[m_wHeapTail][0]+m_cbHeapCardInfo[m_wHeapTail][1];
  1242. if (cbHeapCount==HEAP_FULL_COUNT)
  1243. m_wHeapTail=(m_wHeapTail+3)%CountArray(m_cbHeapCardInfo);
  1244. //减少扑克
  1245. m_cbLeftCardCount--;
  1246. m_cbHeapCardInfo[m_wHeapTail][1]++;
  1247. //堆立扑克
  1248. WORD wHeapViewID=SwitchViewChairID(m_wHeapTail);
  1249. WORD wMinusHeadCount=m_cbHeapCardInfo[m_wHeapTail][0];
  1250. WORD wMinusLastCount=m_cbHeapCardInfo[m_wHeapTail][1];
  1251. m_GameClientView.m_HeapCard[wHeapViewID].SetCardData(wMinusHeadCount,wMinusLastCount,HEAP_FULL_COUNT);
  1252. }
  1253. return;
  1254. }
  1255. //显示控制
  1256. bool CGameClientEngine::ShowOperateControl(BYTE cbUserAction, BYTE cbActionCard)
  1257. {
  1258. //变量定义
  1259. tagGangCardResult GangCardResult;
  1260. ZeroMemory(&GangCardResult,sizeof(GangCardResult));
  1261. //杠牌判断
  1262. if ((cbUserAction&WIK_GANG)!=0)
  1263. {
  1264. //桌面杆牌
  1265. if (cbActionCard!=0)
  1266. {
  1267. GangCardResult.cbCardCount=1;
  1268. GangCardResult.cbCardData[0]=cbActionCard;
  1269. }
  1270. //自己杆牌
  1271. if (cbActionCard==0)
  1272. {
  1273. WORD wMeChairID=GetMeChairID();
  1274. m_GameLogic.AnalyseGangCard(m_cbCardIndex,m_WeaveItemArray[wMeChairID],m_cbWeaveCount[wMeChairID],GangCardResult);
  1275. }
  1276. }
  1277. //显示界面
  1278. if (IsLookonMode()==false)
  1279. m_GameClientView.m_ControlWnd.SetControlInfo(cbActionCard,cbUserAction,GangCardResult);
  1280. return true;
  1281. }
  1282. //开始按钮
  1283. LRESULT CGameClientEngine::OnStart(WPARAM wParam, LPARAM lParam)
  1284. {
  1285. //环境设置
  1286. KillGameClock(IDI_START_GAME);
  1287. m_GameClientView.m_btStart.ShowWindow(SW_HIDE);
  1288. m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
  1289. //设置界面
  1290. m_GameClientView.SetDiscUser(INVALID_CHAIR);
  1291. m_GameClientView.SetStatusFlag(false,false);
  1292. m_GameClientView.SetBankerUser(INVALID_CHAIR);
  1293. m_GameClientView.SetUserAction(INVALID_CHAIR,0);
  1294. m_GameClientView.SetOutCardInfo(INVALID_CHAIR,0);
  1295. m_GameClientView.SetWinOrder(INVALID_CHAIR,0);
  1296. //扑克设置
  1297. m_GameClientView.m_UserCard[0].SetCardData(0,false);
  1298. m_GameClientView.m_UserCard[1].SetCardData(0,false);
  1299. m_GameClientView.m_UserCard[2].SetCardData(0,false);
  1300. m_GameClientView.m_HandCardControl.SetCardData(NULL,0,0);
  1301. //扑克设置
  1302. for (WORD i=0;i<GAME_PLAYER;i++)
  1303. {
  1304. m_GameClientView.m_ScoreControl[i].RestorationData();
  1305. m_GameClientView.m_TableCard[i].SetCardData(NULL,0);
  1306. m_GameClientView.m_DiscardCard[i].SetCardData(NULL,0);
  1307. m_GameClientView.m_WeaveCard[i][0].SetCardData(NULL,0);
  1308. m_GameClientView.m_WeaveCard[i][1].SetCardData(NULL,0);
  1309. m_GameClientView.m_WeaveCard[i][2].SetCardData(NULL,0);
  1310. m_GameClientView.m_WeaveCard[i][3].SetCardData(NULL,0);
  1311. m_GameClientView.m_WeaveCard[i][0].SetGameEnd(false);
  1312. m_GameClientView.m_WeaveCard[i][1].SetGameEnd(false);
  1313. m_GameClientView.m_WeaveCard[i][2].SetGameEnd(false);
  1314. m_GameClientView.m_WeaveCard[i][3].SetGameEnd(false);
  1315. m_GameClientView.m_WeaveCard[i][0].SetDisplayItem(true);
  1316. m_GameClientView.m_WeaveCard[i][1].SetDisplayItem(true);
  1317. m_GameClientView.m_WeaveCard[i][2].SetDisplayItem(true);
  1318. m_GameClientView.m_WeaveCard[i][3].SetDisplayItem(true);
  1319. }
  1320. //堆立扑克
  1321. for (WORD i=0;i<GAME_PLAYER;i++)
  1322. {
  1323. m_cbHeapCardInfo[i][0]=0;
  1324. m_cbHeapCardInfo[i][1]=0;
  1325. m_GameClientView.m_HeapCard[SwitchViewChairID(i)].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
  1326. }
  1327. //游戏变量
  1328. m_wCurrentUser=INVALID_CHAIR;
  1329. //出牌信息
  1330. m_cbOutCardData=0;
  1331. m_wOutCardUser=INVALID_CHAIR;
  1332. ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
  1333. ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
  1334. //组合扑克
  1335. ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount));
  1336. ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
  1337. //堆立扑克
  1338. m_wHeapHand=0;
  1339. m_wHeapTail=0;
  1340. ZeroMemory(m_cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
  1341. //扑克变量
  1342. m_cbLeftCardCount=0;
  1343. ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex));
  1344. //发送消息
  1345. SendUserReady(NULL,0);
  1346. return 0;
  1347. }
  1348. //出牌操作
  1349. LRESULT CGameClientEngine::OnOutCard(WPARAM wParam, LPARAM lParam)
  1350. {
  1351. //出牌判断
  1352. if ((IsLookonMode()==true)||(m_wCurrentUser!=GetMeChairID()))
  1353. return 0;
  1354. //听牌判断
  1355. if (VerdictOutCard((BYTE)wParam)==false)
  1356. {
  1357. if ( m_pIStringMessage )
  1358. m_pIStringMessage->InsertSystemString(TEXT("出此牌不符合游戏规则!"));
  1359. return 0;
  1360. }
  1361. //设置变量
  1362. m_cbUserAction = 0;
  1363. m_wCurrentUser=INVALID_CHAIR;
  1364. BYTE cbOutCardData=(BYTE)wParam;
  1365. m_GameLogic.RemoveCard(m_cbCardIndex,cbOutCardData);
  1366. //设置扑克
  1367. BYTE cbCardData[MAX_COUNT];
  1368. BYTE cbCardCount=m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
  1369. m_GameClientView.m_HandCardControl.SetCardData(cbCardData,cbCardCount,0);
  1370. //设置界面
  1371. KillGameClock(IDI_OPERATE_CARD);
  1372. m_GameClientView.InvalidGameView(0,0,0,0);
  1373. m_GameClientView.SetStatusFlag(false,false);
  1374. m_GameClientView.SetUserAction(INVALID_CHAIR,0);
  1375. m_GameClientView.SetOutCardInfo(2,cbOutCardData);
  1376. m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
  1377. //发送数据
  1378. CMD_C_OutCard OutCard;
  1379. OutCard.cbCardData=cbOutCardData;
  1380. SendSocketData(SUB_C_OUT_CARD,&OutCard,sizeof(OutCard));
  1381. //播放声音
  1382. PlayCardSound(GetMeChairID(),cbOutCardData);
  1383. return 0;
  1384. }
  1385. //扑克操作
  1386. LRESULT CGameClientEngine::OnCardOperate(WPARAM wParam, LPARAM lParam)
  1387. {
  1388. //变量定义
  1389. BYTE cbOperateCode=(BYTE)(wParam);
  1390. BYTE cbOperateCard=(BYTE)(LOWORD(lParam));
  1391. //状态判断
  1392. if ((m_wCurrentUser==GetMeChairID())&&(cbOperateCode==WIK_NULL))
  1393. {
  1394. m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
  1395. return 0;
  1396. }
  1397. //删除时间
  1398. KillGameClock(IDI_OPERATE_CARD);
  1399. m_cbUserAction = 0;
  1400. //环境设置
  1401. m_GameClientView.SetStatusFlag(false,true);
  1402. m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
  1403. //发送命令
  1404. CMD_C_OperateCard OperateCard;
  1405. OperateCard.cbOperateCode=cbOperateCode;
  1406. OperateCard.cbOperateCard=cbOperateCard;
  1407. SendSocketData(SUB_C_OPERATE_CARD,&OperateCard,sizeof(OperateCard));
  1408. return 0;
  1409. }
  1410. //拖管控制
  1411. LRESULT CGameClientEngine::OnStusteeControl(WPARAM wParam, LPARAM lParam)
  1412. {
  1413. //设置变量
  1414. m_wTimeOutCount=0;
  1415. //设置状态
  1416. if (m_bStustee ==true)
  1417. {
  1418. m_bStustee=false;
  1419. m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_START_TRUSTEE,AfxGetInstanceHandle(),false,false);
  1420. //if( FALSE == (BOOL)wParam )
  1421. if ( m_pIStringMessage )
  1422. m_pIStringMessage->InsertSystemString(_T("您取消了托管功能."));
  1423. CMD_C_Trustee Trustee;
  1424. Trustee.bTrustee = false;
  1425. SendSocketData(SUB_C_TRUSTEE,&Trustee,sizeof(Trustee));
  1426. }
  1427. else
  1428. {
  1429. m_bStustee=true;
  1430. m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_STOP_TRUSTEE,AfxGetInstanceHandle(),false,false);
  1431. //if( FALSE == (BOOL)wParam )
  1432. if ( m_pIStringMessage )
  1433. m_pIStringMessage->InsertSystemString(_T("您选择了托管功能."));
  1434. CMD_C_Trustee Trustee;
  1435. Trustee.bTrustee = true;
  1436. SendSocketData(SUB_C_TRUSTEE,&Trustee,sizeof(Trustee));
  1437. }
  1438. return 0;
  1439. }
  1440. //第二次摇色子消息
  1441. LRESULT CGameClientEngine::OnSiceTwo(WPARAM wParam, LPARAM lParam)
  1442. {
  1443. //环境处理
  1444. PlayGameSound(AfxGetInstanceHandle(),TEXT("DRAW_SICE"));
  1445. //设置界面
  1446. m_GameClientView.SetBankerUser(SwitchViewChairID(m_wBankerUser));
  1447. return 0;
  1448. }
  1449. //摇色子结束消息
  1450. LRESULT CGameClientEngine::OnSiceFinish(WPARAM wParam, LPARAM lParam)
  1451. {
  1452. //设置界面
  1453. m_GameClientView.m_DrawSiceWnd.ShowWindow(SW_HIDE);
  1454. bool bPlayerMode = (IsLookonMode()==false);
  1455. //扑克设置
  1456. for (WORD i=0;i<GAME_PLAYER;i++)
  1457. {
  1458. //变量定义
  1459. WORD wViewChairID=SwitchViewChairID(i);
  1460. //组合界面
  1461. m_GameClientView.m_WeaveCard[i][0].SetDisplayItem(true);
  1462. m_GameClientView.m_WeaveCard[i][1].SetDisplayItem(true);
  1463. m_GameClientView.m_WeaveCard[i][2].SetDisplayItem(true);
  1464. m_GameClientView.m_WeaveCard[i][3].SetDisplayItem(true);
  1465. m_GameClientView.m_HeapCard[wViewChairID].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
  1466. //旁观界面
  1467. if (bPlayerMode==false)
  1468. {
  1469. m_GameClientView.m_TableCard[wViewChairID].SetCardData(NULL,0);
  1470. m_GameClientView.m_DiscardCard[wViewChairID].SetCardData(NULL,0);
  1471. m_GameClientView.m_WeaveCard[wViewChairID][0].SetCardData(NULL,0);
  1472. m_GameClientView.m_WeaveCard[wViewChairID][1].SetCardData(NULL,0);
  1473. m_GameClientView.m_WeaveCard[wViewChairID][2].SetCardData(NULL,0);
  1474. m_GameClientView.m_WeaveCard[wViewChairID][3].SetCardData(NULL,0);
  1475. }
  1476. if( GetTableUserItem(i) == NULL ) continue;
  1477. //用户扑克
  1478. if (wViewChairID!=2)
  1479. {
  1480. WORD wIndex=(wViewChairID>=3)?2:wViewChairID;
  1481. m_GameClientView.m_UserCard[wIndex].SetCardData(MAX_COUNT-1,(i==m_wBankerUser));
  1482. }
  1483. else
  1484. {
  1485. BYTE cbCardData[MAX_COUNT];
  1486. m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
  1487. BYTE cbBankerCard= (i==m_wBankerUser?cbCardData[MAX_COUNT-1]:0);
  1488. m_GameClientView.m_HandCardControl.SetCardData(cbCardData,MAX_COUNT-1,cbBankerCard);
  1489. }
  1490. }
  1491. m_GameClientView.m_HandCardControl.SetPositively(bPlayerMode);
  1492. //出牌提示
  1493. if ((bPlayerMode==true)&&(m_wCurrentUser!=INVALID_CHAIR))
  1494. {
  1495. WORD wMeChairID=GetMeChairID();
  1496. if (m_wCurrentUser==wMeChairID) m_GameClientView.SetStatusFlag(true,false);
  1497. }
  1498. //动作处理
  1499. if ((bPlayerMode==true)&&(m_cbUserAction!=WIK_NULL))
  1500. {
  1501. ShowOperateControl(m_cbUserAction,0);
  1502. SetGameClock(GetMeChairID(),IDI_OPERATE_CARD,TIME_OPERATE_CARD);
  1503. }
  1504. //更新界面
  1505. m_GameClientView.InvalidGameView(0,0,0,0);
  1506. //激活框架
  1507. if (bPlayerMode==true)
  1508. ActiveGameFrame();
  1509. //设置时间
  1510. if (m_wCurrentUser!=INVALID_CHAIR)
  1511. {
  1512. m_GameClientView.SetCurrentUser(SwitchViewChairID(m_wCurrentUser));
  1513. SetGameClock(m_wCurrentUser,IDI_OPERATE_CARD,TIME_OPERATE_CARD);
  1514. }
  1515. //环境处理
  1516. PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_START"));
  1517. return 0;
  1518. }
  1519. //
  1520. bool CGameClientEngine::OnSubGangScore( const void *pBuffer, WORD wDataSize )
  1521. {
  1522. //效验消息
  1523. ASSERT(wDataSize==sizeof(CMD_S_GangScore));
  1524. if (wDataSize!=sizeof(CMD_S_GangScore)) return false;
  1525. //消息处理
  1526. CMD_S_GangScore * pGangScore=(CMD_S_GangScore *)pBuffer;
  1527. CString strTemp ,strEnd;
  1528. strEnd.Format( TEXT("\n----------%s----------\n"),pGangScore->cbXiaYu==TRUE?TEXT("下雨"):TEXT("刮风") );
  1529. //InsertGeneralString( strEnd,RGB(0,0,0),false );
  1530. strEnd = TEXT("");
  1531. for( WORD i = 0; i < GAME_PLAYER; i++ )
  1532. {
  1533. strTemp.Format(TEXT("%s: %I64d\n"),m_szAccounts[i],pGangScore->lGangScore[i]);
  1534. strEnd += strTemp;
  1535. }
  1536. //消息积分
  1537. //InsertGeneralString( strEnd,RGB(0,0,255),false);
  1538. strEnd = TEXT("------------------------\n");
  1539. //InsertGeneralString( strEnd,RGB(0,0,0),false );
  1540. //设置界面
  1541. LONGLONG lGangScore[GAME_PLAYER];
  1542. for( WORD i = 0; i < GAME_PLAYER; i++ )
  1543. lGangScore[SwitchViewChairID(i)] = pGangScore->lGangScore[i];
  1544. m_GameClientView.SetGangScore( SwitchViewChairID(pGangScore->wChairId),pGangScore->cbXiaYu,lGangScore );
  1545. return true;
  1546. }
  1547. //////////////////////////////////////////////////////////////////////////