|
- #include "Stdafx.h"
- #include "GameClient.h"
- #include "GameOption.h"
- #include "GameClientEngine.h"
-
- //////////////////////////////////////////////////////////////////////////
-
- //游戏定时器
- #define IDI_START_GAME 200 //开始定时器
- #define IDI_OPERATE_CARD 201 //操作定时器
-
- //游戏定时器
- #define TIME_START_GAME 30 //开始定时器
- #define TIME_OPERATE_CARD 15 //操作定时器
-
- #define MAX_TIME_OUT 3 //最大超时次数
-
- //////////////////////////////////////////////////////////////////////////
-
- BEGIN_MESSAGE_MAP(CGameClientEngine, CGameFrameEngine)
- ON_MESSAGE(IDM_START,OnStart)
- ON_MESSAGE(IDM_OUT_CARD,OnOutCard)
- ON_MESSAGE(IDM_CARD_OPERATE,OnCardOperate)
- ON_MESSAGE(IDM_TRUSTEE_CONTROL,OnStusteeControl)
- ON_MESSAGE(IDM_SICE_TWO,OnSiceTwo)
- ON_MESSAGE(IDM_SICE_FINISH,OnSiceFinish)
- END_MESSAGE_MAP()
-
- //////////////////////////////////////////////////////////////////////////
-
- //构造函数
- CGameClientEngine::CGameClientEngine()
- {
- //游戏变量
- m_wBankerUser=INVALID_CHAIR;
- m_wCurrentUser=INVALID_CHAIR;
- m_cbUserAction = 0;
- m_lSiceCount = 0;
-
- //堆立变量
- m_wHeapHand=0;
- m_wHeapTail=0;
- ZeroMemory(m_cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
-
- //托管变量
- m_bStustee=false;
- m_wTimeOutCount =0;
-
- //出牌信息
- m_cbOutCardData=0;
- m_wOutCardUser=INVALID_CHAIR;
- ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
- ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
-
- //组合扑克
- ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount));
- ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
-
- //扑克变量
- m_cbLeftCardCount=0;
- ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex));
-
- return;
- }
-
- //析构函数
- CGameClientEngine::~CGameClientEngine()
- {
- }
-
- //初始函数
- bool CGameClientEngine::OnInitGameEngine()
- {
- //设置图标
- HICON hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
- m_pIClientKernel->SetGameAttribute(KIND_ID,GAME_PLAYER,VERSION_CLIENT,hIcon,GAME_NAME);
- SetIcon(hIcon,TRUE);
- SetIcon(hIcon,FALSE);
-
- //加载资源
- g_CardResource.LoadResource();
-
- //加载声音
- m_DirectSound.Create( TEXT("OUT_CARD") );
-
- return true;
- }
-
- //重置框架
- bool CGameClientEngine::OnResetGameEngine()
- {
- //游戏变量
- m_wBankerUser=INVALID_CHAIR;
- m_wCurrentUser=INVALID_CHAIR;
- m_cbUserAction = 0;
- m_lSiceCount = 0;
-
- //托管变量
- m_bStustee=false;
- m_wTimeOutCount =0;
-
- //堆立变量
- m_wHeapHand=0;
- m_wHeapTail=0;
- ZeroMemory(m_cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
-
- //出牌信息
- m_cbOutCardData=0;
- m_wOutCardUser=INVALID_CHAIR;
- ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
- ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
-
- //组合扑克
- ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount));
- ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
-
- //扑克变量
- m_cbLeftCardCount=0;
- ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex));
-
- return true;
- }
-
- //时钟删除
- bool CGameClientEngine::OnEventGameClockKill(WORD wChairID)
- {
- return true;
- }
-
- //时间消息
- bool CGameClientEngine::OnEventGameClockInfo(WORD wChairID, UINT nElapse, WORD wClockID)
- {
- switch (wClockID)
- {
- case IDI_START_GAME: //开始游戏
- {
- if( m_bStustee && nElapse < TIME_START_GAME )
- {
- OnStart(0,0);
- return true;
- }
- if (nElapse==0)
- {
- AfxGetMainWnd()->PostMessage(WM_CLOSE);
- return true;
- }
- if (nElapse<=5)
- {
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_WARN"));
- }
-
- return true;
- }
- case IDI_OPERATE_CARD: //操作定时器
- {
- //自动出牌
- bool bAutoOutCard=false;
- if ((bAutoOutCard==true)&&(m_GameClientView.m_ControlWnd.IsWindowVisible()))
- bAutoOutCard=false;
- if((bAutoOutCard==false)&&(m_bStustee==true))
- {
- bAutoOutCard=true;
- }
-
- //超时判断
- if ((IsLookonMode()==false)&&
- ( nElapse==0 || bAutoOutCard ||
- nElapse < TIME_OPERATE_CARD-1&&(m_cbUserAction&WIK_CHI_HU)&&m_cbLeftCardCount<4 )
- )
- {
- //获取位置
- WORD wMeChairID=GetMeChairID();
-
- //动作处理
- if (wChairID==wMeChairID)
- {
- if(m_bStustee==false && ++m_wTimeOutCount>=MAX_TIME_OUT )
- {
- m_wTimeOutCount = 0;
- OnStusteeControl(TRUE,0);
- if ( m_pIStringMessage )
- m_pIStringMessage->InsertSystemString(TEXT("由于您多次超时,切换为“系统托管”模式."));
- }
-
- if (m_wCurrentUser==wMeChairID)
- {
- if( m_cbLeftCardCount < 4 && (m_cbUserAction&WIK_CHI_HU) )
- {
- OnCardOperate( WIK_CHI_HU,0 );
- return true;
- }
-
- //获取扑克
- BYTE cbCardData=m_GameClientView.m_HandCardControl.GetCurrentCard();
-
- //出牌效验
- if (VerdictOutCard(cbCardData)==false)
- {
- for (BYTE i=0;i<MAX_INDEX;i++)
- {
- //出牌效验
- if (m_cbCardIndex[i]==0) continue;
- if (VerdictOutCard(m_GameLogic.SwitchToCardData(i))==false)
- continue;
-
- //设置变量
- cbCardData=m_GameLogic.SwitchToCardData(i);
- }
- }
-
- //出牌动作
- OnOutCard(cbCardData,cbCardData);
- }
- else if( m_cbLeftCardCount < 4 && (m_cbUserAction&WIK_CHI_HU) )
- OnCardOperate( WIK_CHI_HU,0 );
- else
- OnCardOperate(WIK_NULL,0);
- }
-
- return true;
- }
-
- //播放声音
- if ((nElapse<=3)&&(wChairID==GetMeChairID())&&(IsLookonMode()==false))
- {
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_WARN"));
- }
-
- return true;
- }
- }
-
- return true;
- }
-
- //旁观状态
- bool CGameClientEngine::OnEventLookonMode(VOID * pData, WORD wDataSize)
- {
- //扑克控制
- m_GameClientView.m_HandCardControl.SetDisplayItem(IsAllowLookon());
- m_GameClientView.InvalidGameView(0,0,0,0);
-
- return true;
- }
-
- //网络消息
- bool CGameClientEngine::OnEventGameMessage(WORD wSubCmdID, VOID * pBuffer, WORD wDataSize)
- {
- switch (wSubCmdID)
- {
- case SUB_S_GAME_START: //游戏开始
- {
- return OnSubGameStart(pBuffer,wDataSize);
- }
- case SUB_S_OUT_CARD: //用户出牌
- {
- return OnSubOutCard(pBuffer,wDataSize);
- }
- case SUB_S_SEND_CARD: //发牌消息
- {
- return OnSubSendCard(pBuffer,wDataSize);
- }
- case SUB_S_OPERATE_NOTIFY: //操作提示
- {
- return OnSubOperateNotify(pBuffer,wDataSize);
- }
- case SUB_S_OPERATE_RESULT: //操作结果
- {
- return OnSubOperateResult(pBuffer,wDataSize);
- }
- case SUB_S_GAME_END: //游戏结束
- {
- return OnSubGameEnd(pBuffer,wDataSize);
- }
- case SUB_S_TRUSTEE: //用户托管
- {
- return OnSubTrustee(pBuffer,wDataSize);
- }
- case SUB_S_CHI_HU:
- {
- return OnSubUserChiHu( pBuffer,wDataSize );
- }
- case SUB_S_GANG_SCORE: //
- {
- return OnSubGangScore(pBuffer,wDataSize);
- }
- }
-
- return true;
- }
-
- //游戏场景
- bool CGameClientEngine::OnEventSceneMessage(BYTE cbGameStation, bool bLookonOther, VOID * pBuffer, WORD wDataSize)
- {
- switch (cbGameStation)
- {
- case GS_MJ_FREE: //空闲状态
- {
- //效验数据
- if (wDataSize!=sizeof(CMD_S_StatusFree)) return false;
- CMD_S_StatusFree * pStatusFree=(CMD_S_StatusFree *)pBuffer;
-
- //是否启用声音
- if( !CGlobalUnits::GetInstance()->m_bAllowSound )
- {
- m_DirectSound.EnableSound(FALSE);
- }
-
- //设置数据
- m_wBankerUser=pStatusFree->wBankerUser;
- m_GameClientView.SetCellScore(pStatusFree->lCellScore);
- m_GameClientView.m_HandCardControl.SetDisplayItem(true);
- //托管设置
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- m_GameClientView.SetTrustee(SwitchViewChairID(i),pStatusFree->bTrustee[i]);
- }
-
- //设置界面
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- m_cbHeapCardInfo[i][0]=0;
- m_cbHeapCardInfo[i][1]=0;
- m_GameClientView.m_HeapCard[SwitchViewChairID(i)].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
- }
-
- //设置控件
- if (IsLookonMode()==false)
- {
- m_GameClientView.m_btStart.ShowWindow(SW_SHOW);
- m_GameClientView.m_btStart.SetFocus();
- m_GameClientView.m_btStusteeControl.EnableWindow(TRUE);
- SetGameClock(GetMeChairID(),IDI_START_GAME,TIME_START_GAME);
- }
-
- //丢弃效果
- m_GameClientView.SetDiscUser(INVALID_CHAIR);
- m_GameClientView.SetTimer(IDI_DISC_EFFECT,250,NULL);
-
- //更新界面
- m_GameClientView.InvalidGameView(0,0,0,0);
-
- return true;
- }
- case GS_MJ_PLAY: //游戏状态
- {
- //效验数据
- if (wDataSize!=sizeof(CMD_S_StatusPlay)) return false;
- CMD_S_StatusPlay * pStatusPlay=(CMD_S_StatusPlay *)pBuffer;
-
- //是否启用声音
- if( !CGlobalUnits::GetInstance()->m_bAllowSound )
- {
- m_DirectSound.EnableSound(FALSE);
- }
-
- WORD wMeChairID=GetMeChairID();
-
- //设置变量
- m_wBankerUser=pStatusPlay->wBankerUser;
- m_wCurrentUser=pStatusPlay->wCurrentUser;
- m_cbLeftCardCount=pStatusPlay->cbLeftCardCount;
-
- //旁观
- if( IsLookonMode()==true )
- m_GameClientView.m_HandCardControl.SetDisplayItem(IsAllowLookon());
-
- //托管设置
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- m_GameClientView.SetTrustee(SwitchViewChairID(i),pStatusPlay->bTrustee[i]);
- }
-
- if( pStatusPlay->bTrustee[wMeChairID] )
- {
- m_bStustee = true;
- OnStusteeControl(0,0);
- }
-
- m_wTimeOutCount=0;
- if(pStatusPlay->bTrustee[GetMeChairID()])
- m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_STOP_TRUSTEE,AfxGetInstanceHandle(),false,false);
- else
- m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_START_TRUSTEE,AfxGetInstanceHandle(),false,false);
-
- //历史变量
- m_wOutCardUser=pStatusPlay->wOutCardUser;
- m_cbOutCardData=pStatusPlay->cbOutCardData;
- CopyMemory(m_cbDiscardCard,pStatusPlay->cbDiscardCard,sizeof(m_cbDiscardCard));
- CopyMemory(m_cbDiscardCount,pStatusPlay->cbDiscardCount,sizeof(m_cbDiscardCount));
- if( pStatusPlay->wOutCardUser != INVALID_CHAIR )
- m_cbDiscardCard[pStatusPlay->wOutCardUser][m_cbDiscardCount[pStatusPlay->wOutCardUser]++] = pStatusPlay->cbOutCardData;
-
- //丢弃效果
- if(m_wOutCardUser != INVALID_CHAIR)
- m_GameClientView.SetDiscUser(SwitchViewChairID(m_wOutCardUser));
- m_GameClientView.SetTimer(IDI_DISC_EFFECT,250,NULL);
-
- //扑克变量
- CopyMemory(m_cbWeaveCount,pStatusPlay->cbWeaveCount,sizeof(m_cbWeaveCount));
- CopyMemory(m_WeaveItemArray,pStatusPlay->WeaveItemArray,sizeof(m_WeaveItemArray));
- m_GameLogic.SwitchToCardIndex(pStatusPlay->cbCardData,pStatusPlay->cbCardCount,m_cbCardIndex);
-
- //辅助变量
- WORD wViewChairID[GAME_PLAYER]={0,0,0,0};
- for (WORD i=0;i<GAME_PLAYER;i++) wViewChairID[i]=SwitchViewChairID(i);
-
- //界面设置
- m_GameClientView.SetCellScore(pStatusPlay->lCellScore);
- m_GameClientView.SetBankerUser(wViewChairID[m_wBankerUser]);
-
- //组合扑克
- BYTE cbWeaveCard[4]={0,0,0,0};
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- WORD wOperateViewID = SwitchViewChairID(i);
- for (BYTE j=0;j<m_cbWeaveCount[i];j++)
- {
- BYTE cbWeaveKind=m_WeaveItemArray[i][j].cbWeaveKind;
- BYTE cbCenterCard=m_WeaveItemArray[i][j].cbCenterCard;
- BYTE cbWeaveCardCount=m_GameLogic.GetWeaveCard(cbWeaveKind,cbCenterCard,cbWeaveCard);
- m_GameClientView.m_WeaveCard[wViewChairID[i]][j].SetCardData(cbWeaveCard,cbWeaveCardCount);
- if ((cbWeaveKind&WIK_GANG)&&(m_WeaveItemArray[i][j].wProvideUser==i))
- m_GameClientView.m_WeaveCard[wViewChairID[i]][j].SetDisplayItem(false);
- WORD wProviderViewID = SwitchViewChairID(m_WeaveItemArray[i][j].wProvideUser);
- m_GameClientView.m_WeaveCard[wOperateViewID][j].SetDirectionCardPos(3-(wOperateViewID-wProviderViewID+4)%4);
-
- }
- }
-
- //用户扑克
- if (m_wCurrentUser==GetMeChairID())
- {
- //调整扑克
- if (pStatusPlay->cbSendCardData!=0x00)
- {
- //变量定义
- BYTE cbCardCount=pStatusPlay->cbCardCount;
- BYTE cbRemoveCard[]={pStatusPlay->cbSendCardData};
-
- //调整扑克
- m_GameLogic.RemoveCard(pStatusPlay->cbCardData,cbCardCount,cbRemoveCard,1);
- pStatusPlay->cbCardData[pStatusPlay->cbCardCount-1]=pStatusPlay->cbSendCardData;
- }
- //设置扑克
- BYTE cbCardCount=pStatusPlay->cbCardCount;
- m_GameClientView.m_HandCardControl.SetCardData(pStatusPlay->cbCardData,cbCardCount-1,pStatusPlay->cbCardData[cbCardCount-1]);
-
- }
- else
- m_GameClientView.m_HandCardControl.SetCardData(pStatusPlay->cbCardData,pStatusPlay->cbCardCount,0);
-
- //扑克设置
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- //用户扑克
- if (i!=GetMeChairID())
- {
- BYTE cbCardCount=13-m_cbWeaveCount[i]*3;
- WORD wUserCardIndex=(wViewChairID[i]<2)?wViewChairID[i]:2;
- m_GameClientView.m_UserCard[wUserCardIndex].SetCardData(cbCardCount,(m_wCurrentUser==i));
- }
-
- //丢弃扑克
- WORD wViewChairID=SwitchViewChairID(i);
- m_GameClientView.m_DiscardCard[wViewChairID].SetCardData(m_cbDiscardCard[i],m_cbDiscardCount[i]);
- }
-
- //控制设置
- if (IsLookonMode()==false)
- {
- m_GameClientView.m_HandCardControl.SetPositively(true);
- m_GameClientView.m_HandCardControl.SetDisplayItem(true);
- m_GameClientView.m_btStusteeControl.EnableWindow(TRUE);
- }
-
- //堆立信息
- m_wHeapHand = pStatusPlay->wHeapHand;
- m_wHeapTail = pStatusPlay->wHeapTail;
- CopyMemory(m_cbHeapCardInfo,pStatusPlay->cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
-
- //堆立界面
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- m_GameClientView.m_HeapCard[wViewChairID[i]].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
- }
-
- //历史扑克
- if (m_wOutCardUser!=INVALID_CHAIR)
- {
- WORD wOutChairID=SwitchViewChairID(m_wOutCardUser);
- m_GameClientView.SetOutCardInfo(wOutChairID,m_cbOutCardData);
- }
-
- //名次状态
- for( WORD i = 0; i < CountArray(pStatusPlay->wWinOrder); i++ )
- {
- if( pStatusPlay->wWinOrder[i] != INVALID_CHAIR )
- {
- m_GameClientView.SetWinOrder( SwitchViewChairID(pStatusPlay->wWinOrder[i]),i+1 );
- }
- }
-
- //操作界面
- if ((IsLookonMode()==false)&&(pStatusPlay->cbActionMask!=WIK_NULL))
- {
- //获取变量
- BYTE cbActionMask=pStatusPlay->cbActionMask;
- BYTE cbActionCard=pStatusPlay->cbActionCard;
-
- m_cbUserAction = pStatusPlay->cbActionMask;
-
- //变量定义
- tagGangCardResult GangCardResult;
- ZeroMemory(&GangCardResult,sizeof(GangCardResult));
-
- //杠牌判断
- if ((cbActionMask&WIK_GANG)!=0)
- {
- //桌面杆牌
- if ((m_wCurrentUser==INVALID_CHAIR)&&(cbActionCard!=0))
- {
- GangCardResult.cbCardCount=1;
- GangCardResult.cbCardData[0]=cbActionCard;
- }
-
- //自己杆牌
- if ((m_wCurrentUser==GetMeChairID())||(cbActionCard==0))
- {
- WORD wMeChairID=GetMeChairID();
- m_GameLogic.AnalyseGangCard(m_cbCardIndex,m_WeaveItemArray[wMeChairID],m_cbWeaveCount[wMeChairID],GangCardResult);
- }
- }
-
- //设置界面
- if (m_wCurrentUser==INVALID_CHAIR)
- SetGameClock(GetMeChairID(),IDI_OPERATE_CARD,TIME_OPERATE_CARD);
- if (IsLookonMode()==false)
- m_GameClientView.m_ControlWnd.SetControlInfo(cbActionCard,cbActionMask,GangCardResult);
- }
-
- //设置时间
- if (m_wCurrentUser!=INVALID_CHAIR)
- {
- //计算时间
- WORD wTimeCount=TIME_OPERATE_CARD;
-
- //设置时间
- SetGameClock(m_wCurrentUser,TIME_OPERATE_CARD,wTimeCount);
- }
-
- //丢弃效果
- m_GameClientView.SetDiscUser(SwitchViewChairID(m_wOutCardUser));
- m_GameClientView.SetTimer(IDI_DISC_EFFECT,250,NULL);
-
- //更新界面
- m_GameClientView.InvalidGameView(0,0,0,0);
-
- return true;
- }
- }
-
- return false;
- }
-
- //游戏开始
- bool CGameClientEngine::OnSubGameStart(const void * pBuffer, WORD wDataSize)
- {
- //效验数据
- ASSERT(wDataSize==sizeof(CMD_S_GameStart));
- if (wDataSize!=sizeof(CMD_S_GameStart))
- return false;
-
- //变量定义
- CMD_S_GameStart * pGameStart=(CMD_S_GameStart *)pBuffer;
-
- //用户名称
- for( WORD i = 0; i < GAME_PLAYER; i++ )
- {
- IClientUserItem * pUserData = GetTableUserItem( i );
- if( pUserData == NULL )
- {
- m_szAccounts[i][0] = 0;
- continue;
- }
- lstrcpy( m_szAccounts[i],pUserData->GetNickName() );
- }
-
- //设置状态
- SetGameStatus(GS_MJ_PLAY);
- m_GameClientView.SetCurrentUser(INVALID_CHAIR);
-
- //设置变量
- m_wBankerUser=pGameStart->wBankerUser;
- m_wCurrentUser=pGameStart->wCurrentUser;
- m_cbLeftCardCount=pGameStart->cbLeftCardCount;
- m_cbUserAction = pGameStart->cbUserAction;
- m_lSiceCount = pGameStart->lSiceCount;
-
- //出牌信息
- m_cbOutCardData=0;
- m_wOutCardUser=INVALID_CHAIR;
- ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
- ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
-
- //组合扑克
- ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount));
- ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
-
- //设置扑克
- BYTE cbCardCount=(GetMeChairID()==m_wBankerUser)?MAX_COUNT:(MAX_COUNT-1);
- m_GameLogic.SwitchToCardIndex(pGameStart->cbCardData,cbCardCount,m_cbCardIndex);
-
- //旁观界面
- if (IsLookonMode()==true)
- {
- //设置界面
- m_GameClientView.SetDiscUser(INVALID_CHAIR);
- m_GameClientView.SetStatusFlag(false,false);
- m_GameClientView.SetBankerUser(INVALID_CHAIR);
- m_GameClientView.SetUserAction(INVALID_CHAIR,0);
- m_GameClientView.SetOutCardInfo(INVALID_CHAIR,0);
- m_GameClientView.SetWinOrder(INVALID_CHAIR,0);
-
- //扑克设置
- m_GameClientView.m_UserCard[0].SetCardData(0,false);
- m_GameClientView.m_UserCard[1].SetCardData(0,false);
- m_GameClientView.m_UserCard[2].SetCardData(0,false);
- m_GameClientView.m_HandCardControl.SetCardData(NULL,0,0);
-
- //扑克设置
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- m_GameClientView.m_ScoreControl[i].RestorationData();
- m_GameClientView.m_TableCard[i].SetCardData(NULL,0);
- m_GameClientView.m_DiscardCard[i].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][0].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][1].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][2].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][3].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][0].SetGameEnd(false);
- m_GameClientView.m_WeaveCard[i][1].SetGameEnd(false);
- m_GameClientView.m_WeaveCard[i][2].SetGameEnd(false);
- m_GameClientView.m_WeaveCard[i][3].SetGameEnd(false);
- m_GameClientView.m_WeaveCard[i][0].SetDisplayItem(true);
- m_GameClientView.m_WeaveCard[i][1].SetDisplayItem(true);
- m_GameClientView.m_WeaveCard[i][2].SetDisplayItem(true);
- m_GameClientView.m_WeaveCard[i][3].SetDisplayItem(true);
- }
-
- //堆立扑克
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- m_cbHeapCardInfo[i][0]=0;
- m_cbHeapCardInfo[i][1]=0;
- m_GameClientView.m_HeapCard[SwitchViewChairID(i)].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
- }
- }
-
- //堆立信息
- m_wHeapHand = pGameStart->wHeapHand;
- m_wHeapTail = pGameStart->wHeapTail;
- CopyMemory(m_cbHeapCardInfo,pGameStart->cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
-
- //设置界面
- m_GameClientView.m_HandCardControl.SetPositively(false);
-
- //环境处理
- PlayGameSound(AfxGetInstanceHandle(),TEXT("DRAW_SICE"));
-
- //摇色子动画
- m_GameClientView.m_DrawSiceWnd.SetSiceInfo(m_GameClientView.GetDC(),200,(WORD)(pGameStart->lSiceCount>>16),(WORD)pGameStart->lSiceCount);
- m_GameClientView.m_DrawSiceWnd.ShowWindow(SW_SHOW);
-
- return true;
- }
-
- //用户出牌
- bool CGameClientEngine::OnSubOutCard(const void * pBuffer, WORD wDataSize)
- {
- //效验消息
- ASSERT(wDataSize==sizeof(CMD_S_OutCard));
- if (wDataSize!=sizeof(CMD_S_OutCard)) return false;
-
- //消息处理
- CMD_S_OutCard * pOutCard=(CMD_S_OutCard *)pBuffer;
-
- //变量定义
- WORD wMeChairID=GetMeChairID();
- WORD wOutViewChairID=SwitchViewChairID(pOutCard->wOutCardUser);
-
- //设置变量
- m_wCurrentUser=INVALID_CHAIR;
- m_wOutCardUser=pOutCard->wOutCardUser;
- m_cbOutCardData=pOutCard->cbOutCardData;
-
- //其他用户
- if ((IsLookonMode()==true)||(pOutCard->wOutCardUser!=wMeChairID))
- {
- //环境设置
- KillGameClock(IDI_OPERATE_CARD);
- //播放声音
- PlayCardSound(pOutCard->wOutCardUser,pOutCard->cbOutCardData);
-
- //出牌界面
- m_GameClientView.SetUserAction(INVALID_CHAIR,0);
- m_GameClientView.SetOutCardInfo(wOutViewChairID,pOutCard->cbOutCardData);
-
- //设置扑克
- if (wOutViewChairID==2)
- {
- //删除扑克
- BYTE cbCardData[MAX_COUNT];
- m_GameLogic.RemoveCard(m_cbCardIndex,pOutCard->cbOutCardData);
-
- //设置扑克
- BYTE cbCardCount=m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
- m_GameClientView.m_HandCardControl.SetCardData(cbCardData,cbCardCount,0);
- }
- else
- {
- WORD wUserIndex=(wOutViewChairID>2)?2:wOutViewChairID;
- m_GameClientView.m_UserCard[wUserIndex].SetCurrentCard(false);
- }
- }
-
- return true;
- }
-
- //发牌消息
- bool CGameClientEngine::OnSubSendCard(const void * pBuffer, WORD wDataSize)
- {
- //效验数据
- ASSERT(wDataSize==sizeof(CMD_S_SendCard));
- if (wDataSize!=sizeof(CMD_S_SendCard)) return false;
-
- //变量定义
- CMD_S_SendCard * pSendCard=(CMD_S_SendCard *)pBuffer;
-
- //设置变量
- WORD wMeChairID=GetMeChairID();
- m_wCurrentUser=pSendCard->wCurrentUser;
-
- //隐藏控件
- m_GameClientView.m_ControlWnd.ShowWindow( SW_HIDE );
- //删除定时器
- KillGameClock( IDI_OPERATE_CARD );
-
- //丢弃扑克
- if ((m_wOutCardUser!=INVALID_CHAIR)&&(m_cbOutCardData!=0))
- {
- //丢弃扑克
- WORD wOutViewChairID=SwitchViewChairID(m_wOutCardUser);
- m_GameClientView.m_DiscardCard[wOutViewChairID].AddCardItem(m_cbOutCardData);
- m_GameClientView.SetDiscUser(wOutViewChairID);
-
- //设置变量
- m_cbOutCardData=0;
- m_wOutCardUser=INVALID_CHAIR;
- }
-
- //发牌处理
- if (pSendCard->cbCardData!=0)
- {
- //取牌界面
- WORD wViewChairID=SwitchViewChairID(m_wCurrentUser);
- if (wViewChairID!=2)
- {
- WORD wUserIndex=(wViewChairID>2)?2:wViewChairID;
- m_GameClientView.m_UserCard[wUserIndex].SetCurrentCard(true);
- }
- else
- {
- m_cbCardIndex[m_GameLogic.SwitchToCardIndex(pSendCard->cbCardData)]++;
- m_GameClientView.m_HandCardControl.SetCurrentCard(pSendCard->cbCardData);
- }
-
- //扣除扑克
- DeductionTableCard(pSendCard->bTail==false);
- }
-
- //当前用户
- if ((IsLookonMode()==false)&&(m_wCurrentUser==wMeChairID))
- {
- //激活框架
- ActiveGameFrame();
-
- //动作处理
- if (pSendCard->cbActionMask!=WIK_NULL)
- {
- //获取变量
- BYTE cbActionCard=pSendCard->cbCardData;
- BYTE cbActionMask=pSendCard->cbActionMask;
-
- m_cbUserAction = pSendCard->cbActionMask;
-
- //变量定义
- tagGangCardResult GangCardResult;
- ZeroMemory(&GangCardResult,sizeof(GangCardResult));
-
- //杠牌判断
- if ((cbActionMask&WIK_GANG)!=0)
- {
- WORD wMeChairID=GetMeChairID();
- m_GameLogic.AnalyseGangCard(m_cbCardIndex,m_WeaveItemArray[wMeChairID],m_cbWeaveCount[wMeChairID],GangCardResult);
- }
-
- //设置界面
- m_GameClientView.m_ControlWnd.SetControlInfo(cbActionCard,cbActionMask,GangCardResult);
- }
- }
-
- //出牌提示
- m_GameClientView.SetStatusFlag((IsLookonMode()==false)&&(m_wCurrentUser==wMeChairID),false);
-
- //更新界面
- m_GameClientView.InvalidGameView(0,0,0,0);
-
- //计算时间
- WORD wTimeCount=TIME_OPERATE_CARD;
-
- //设置时间
- m_GameClientView.SetCurrentUser(SwitchViewChairID(m_wCurrentUser));
- SetGameClock(m_wCurrentUser,IDI_OPERATE_CARD,wTimeCount);
-
- return true;
- }
-
- //操作提示
- bool CGameClientEngine::OnSubOperateNotify(const void * pBuffer, WORD wDataSize)
- {
- //效验数据
- ASSERT(wDataSize==sizeof(CMD_S_OperateNotify));
- if (wDataSize!=sizeof(CMD_S_OperateNotify))
- return false;
-
- //变量定义
- CMD_S_OperateNotify * pOperateNotify=(CMD_S_OperateNotify *)pBuffer;
-
- //用户界面
- if ((IsLookonMode()==false)&&(pOperateNotify->cbActionMask!=WIK_NULL))
- {
- //获取变量
- WORD wMeChairID=GetMeChairID();
- BYTE cbActionMask=pOperateNotify->cbActionMask;
- BYTE cbActionCard=pOperateNotify->cbActionCard;
-
- m_cbUserAction = pOperateNotify->cbActionMask;
-
- //变量定义
- tagGangCardResult GangCardResult;
- ZeroMemory(&GangCardResult,sizeof(GangCardResult));
-
- //杠牌判断
- if ((cbActionMask&WIK_GANG)!=0)
- {
- //桌面杆牌
- if ((m_wCurrentUser==INVALID_CHAIR)&&(cbActionCard!=0))
- {
- GangCardResult.cbCardCount=1;
- GangCardResult.cbCardData[0]=cbActionCard;
- }
-
- //自己杆牌
- if ((m_wCurrentUser==wMeChairID)||(cbActionCard==0))
- {
- WORD wMeChairID=GetMeChairID();
- m_GameLogic.AnalyseGangCard(m_cbCardIndex,m_WeaveItemArray[wMeChairID],m_cbWeaveCount[wMeChairID],GangCardResult);
- }
- }
-
- //设置界面
- ActiveGameFrame();
- m_GameClientView.m_ControlWnd.SetControlInfo(cbActionCard,cbActionMask,GangCardResult);
-
- //设置时间
- m_GameClientView.SetCurrentUser(INVALID_CHAIR);
- SetGameClock(GetMeChairID(),IDI_OPERATE_CARD,TIME_OPERATE_CARD);
- }
-
- return true;
- }
-
- //操作结果
- bool CGameClientEngine::OnSubOperateResult(const void * pBuffer, WORD wDataSize)
- {
- //效验消息
- ASSERT(wDataSize==sizeof(CMD_S_OperateResult));
- if (wDataSize!=sizeof(CMD_S_OperateResult))
- return false;
-
- //消息处理
- CMD_S_OperateResult * pOperateResult=(CMD_S_OperateResult *)pBuffer;
-
- //变量定义
- BYTE cbPublicCard=TRUE;
- WORD wOperateUser=pOperateResult->wOperateUser;
- BYTE cbOperateCard=pOperateResult->cbOperateCard;
- WORD wOperateViewID=SwitchViewChairID(wOperateUser);
- WORD wProviderViewID = SwitchViewChairID(pOperateResult->wProvideUser);
-
- //出牌变量
- if (pOperateResult->cbOperateCode!=WIK_NULL)
- {
- m_cbOutCardData=0;
- m_wOutCardUser=INVALID_CHAIR;
- }
-
- //设置变量
- m_wCurrentUser=pOperateResult->wOperateUser;
-
- //设置组合
- if ((pOperateResult->cbOperateCode&WIK_GANG)!=0)
- {
- m_wCurrentUser = INVALID_CHAIR;
-
- //组合扑克
- BYTE cbWeaveIndex=0xFF;
- for (BYTE i=0;i<m_cbWeaveCount[wOperateUser];i++)
- {
- BYTE cbWeaveKind=m_WeaveItemArray[wOperateUser][i].cbWeaveKind;
- BYTE cbCenterCard=m_WeaveItemArray[wOperateUser][i].cbCenterCard;
- if ((cbCenterCard==cbOperateCard)&&(cbWeaveKind==WIK_PENG))
- {
- cbWeaveIndex=i;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbPublicCard=TRUE;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbWeaveKind=pOperateResult->cbOperateCode;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].wProvideUser=pOperateResult->wProvideUser;
- break;
- }
- }
-
- //组合扑克
- if (cbWeaveIndex==0xFF)
- {
- //暗杠判断
- cbPublicCard=(pOperateResult->wProvideUser==wOperateUser)?FALSE:TRUE;
-
- //设置扑克
- cbWeaveIndex=m_cbWeaveCount[wOperateUser]++;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbPublicCard=cbPublicCard;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbCenterCard=cbOperateCard;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbWeaveKind=pOperateResult->cbOperateCode;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].wProvideUser=pOperateResult->wProvideUser;
- }
-
- //组合界面
- BYTE cbWeaveCard[4]={0,0,0,0},cbWeaveKind=pOperateResult->cbOperateCode;
- BYTE cbWeaveCardCount=m_GameLogic.GetWeaveCard(cbWeaveKind,cbOperateCard,cbWeaveCard);
- m_GameClientView.m_WeaveCard[wOperateViewID][cbWeaveIndex].SetCardData(cbWeaveCard,cbWeaveCardCount);
- m_GameClientView.m_WeaveCard[wOperateViewID][cbWeaveIndex].SetDisplayItem((cbPublicCard==TRUE)?true:false);
-
- //扑克设置
- if (GetMeChairID()==wOperateUser)
- {
- m_cbCardIndex[m_GameLogic.SwitchToCardIndex(pOperateResult->cbOperateCard)]=0;
- }
-
- //设置扑克
- if (GetMeChairID()==wOperateUser)
- {
- BYTE cbCardData[MAX_COUNT];
- BYTE cbCardCount=m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
- m_GameClientView.m_HandCardControl.SetCardData(cbCardData,cbCardCount,0);
- }
- else
- {
- WORD wUserIndex=(wOperateViewID>=3)?2:wOperateViewID;
- BYTE cbCardCount=MAX_COUNT-m_cbWeaveCount[wOperateUser]*3;
- m_GameClientView.m_UserCard[wUserIndex].SetCardData(cbCardCount-1,false);
- }
- }
- else if (pOperateResult->cbOperateCode!=WIK_NULL)
- {
- //设置组合
- BYTE cbWeaveIndex=m_cbWeaveCount[wOperateUser]++;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbPublicCard=TRUE;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbCenterCard=cbOperateCard;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbWeaveKind=pOperateResult->cbOperateCode;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].wProvideUser=pOperateResult->wProvideUser;
-
- //组合界面
- BYTE cbWeaveCard[4]={0,0,0,0},cbWeaveKind=pOperateResult->cbOperateCode;
- BYTE cbWeaveCardCount=m_GameLogic.GetWeaveCard(cbWeaveKind,cbOperateCard,cbWeaveCard);
- m_GameClientView.m_WeaveCard[wOperateViewID][cbWeaveIndex].SetCardData(cbWeaveCard,cbWeaveCardCount);
- m_GameClientView.m_WeaveCard[wOperateViewID][cbWeaveIndex].SetDirectionCardPos(3-(wOperateViewID-wProviderViewID+4)%4);
-
- //删除扑克
- if (GetMeChairID()==wOperateUser)
- {
- VERIFY( m_GameLogic.RemoveCard(cbWeaveCard,cbWeaveCardCount,&cbOperateCard,1) );
- VERIFY( m_GameLogic.RemoveCard(m_cbCardIndex,cbWeaveCard,cbWeaveCardCount-1) );
- }
-
- //设置扑克
- if (GetMeChairID()==wOperateUser)
- {
- BYTE cbCardData[MAX_COUNT];
- BYTE cbCardCount=m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
- m_GameClientView.m_HandCardControl.SetCardData(cbCardData,cbCardCount-1,cbCardData[cbCardCount-1]);
- }
- else
- {
- WORD wUserIndex=(wOperateViewID>=3)?2:wOperateViewID;
- BYTE cbCardCount=MAX_COUNT-m_cbWeaveCount[wOperateUser]*3;
- m_GameClientView.m_UserCard[wUserIndex].SetCardData(cbCardCount-1,true);
- }
- }
-
- //设置界面
- m_GameClientView.SetOutCardInfo(INVALID_CHAIR,0);
- m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
- m_GameClientView.SetUserAction(wOperateViewID,pOperateResult->cbOperateCode);
- m_GameClientView.SetStatusFlag((IsLookonMode()==false)&&(m_wCurrentUser==GetMeChairID()),false);
-
- //更新界面
- m_GameClientView.InvalidGameView(0,0,0,0);
-
- //环境设置
- PlayActionSound(wOperateUser,pOperateResult->cbOperateCode);
-
- //设置时间
- if (m_wCurrentUser!=INVALID_CHAIR)
- {
- //计算时间
- WORD wTimeCount=TIME_OPERATE_CARD;
-
- //设置时间
- m_GameClientView.SetCurrentUser(SwitchViewChairID(m_wCurrentUser));
- SetGameClock(m_wCurrentUser,IDI_OPERATE_CARD,wTimeCount);
- }
-
- return true;
- }
-
- //游戏结束
- bool CGameClientEngine::OnSubGameEnd(const void * pBuffer, WORD wDataSize)
- {
- //效验数据
- ASSERT(wDataSize==sizeof(CMD_S_GameEnd));
- if (wDataSize!=sizeof(CMD_S_GameEnd)) return false;
-
- //消息处理
- CMD_S_GameEnd * pGameEnd=(CMD_S_GameEnd *)pBuffer;
-
- //设置状态
- SetGameStatus(GS_MJ_FREE);
- m_GameClientView.SetStatusFlag(false,false);
-
- //删除定时器
- KillGameClock(IDI_OPERATE_CARD);
-
- //设置控件
- m_GameClientView.SetStatusFlag(false,false);
- m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
- m_GameClientView.m_HandCardControl.SetPositively(false);
-
- //设置扑克
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- m_GameClientView.m_WeaveCard[i][0].SetGameEnd(true);
- m_GameClientView.m_WeaveCard[i][1].SetGameEnd(true);
- m_GameClientView.m_WeaveCard[i][2].SetGameEnd(true);
- m_GameClientView.m_WeaveCard[i][3].SetGameEnd(true);
- }
-
- //变量定义
- tagScoreInfo ScoreInfo;
- ZeroMemory(&ScoreInfo,sizeof(ScoreInfo));
-
- //设置积分
- CString strTemp ,strEnd;
- if( pGameEnd->wLeftUser != INVALID_CHAIR )
- {
- strEnd.AppendFormat( TEXT("玩家[]逃跑,将收回刮风下雨所得,并垫付其它玩家的刮风下雨,及未胡牌者花猪。"),
- m_szAccounts[pGameEnd->wLeftUser] );
- if ( m_pIStringMessage )
- m_pIStringMessage->InsertSystemString( strEnd );
- }
- strEnd = TEXT("\n本局结束,成绩统计:\r\n");
- for( WORD i = 0; i < GAME_PLAYER; i++ )
- {
- if( m_szAccounts[i][0] == 0 ) continue;
-
- lstrcpy( ScoreInfo.szUserName[SwitchViewChairID(i)],m_szAccounts[i] );
- strTemp.Format(TEXT("%s: %I64d\n"),m_szAccounts[i],pGameEnd->lGameScore[i]);
- strEnd += strTemp;
- }
- //消息积分
- if ( m_pIStringMessage )
- m_pIStringMessage->InsertSystemString((LPCTSTR)strEnd);
-
- //成绩变量
- for( WORD i = 0; i < GAME_PLAYER; i++ )
- {
- WORD wViewId = SwitchViewChairID(i);
- ScoreInfo.wMeChairId = wViewId;
- WORD j = 0;
- for( ; j < CountArray(pGameEnd->wWinOrder); j++ )
- {
- if( pGameEnd->wWinOrder[j] == i )
- {
- ScoreInfo.cbWinOrder = (BYTE)j+1;
- break;
- }
- }
- if( j == CountArray(pGameEnd->wWinOrder) ) ScoreInfo.cbWinOrder = 0;
- ScoreInfo.wProvideUser = SwitchViewChairID(pGameEnd->wProvideUser[i]);
- ScoreInfo.lGameScore = pGameEnd->lGameScore[i];
- ScoreInfo.lGameTax = pGameEnd->lGameTax[i];
- ScoreInfo.lGangScore = pGameEnd->lGangScore[i];
- ScoreInfo.cbGenCount = pGameEnd->cbGenCount[i];
- //CopyMemory( ScoreInfo.dwChiHuRight,&pGameEnd->dwChiHuRight[i],sizeof(DWORD)*MAX_RIGHT_COUNT );
- ZeroMemory( ScoreInfo.wLostFanShu,sizeof(ScoreInfo.wLostFanShu) );
- for( WORD j = 0; j < GAME_PLAYER; j++ )
- {
- if( j == i ) continue;
- ScoreInfo.wLostFanShu[SwitchViewChairID(j)] = pGameEnd->wLostFanShu[i][j];
- }
-
- m_GameClientView.m_ScoreControl[wViewId].SetScoreInfo( ScoreInfo );
- }
-
- //用户扑克
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- WORD wViewChairID=SwitchViewChairID(i);
- m_GameClientView.m_TableCard[wViewChairID].SetCardData(pGameEnd->cbCardData[i],pGameEnd->cbCardCount[i]);
- }
-
- //设置扑克
- m_GameClientView.m_UserCard[0].SetCardData(0,false);
- m_GameClientView.m_UserCard[1].SetCardData(0,false);
- m_GameClientView.m_UserCard[2].SetCardData(0,false);
- m_GameClientView.m_HandCardControl.SetCardData(NULL,0,0);
-
- //播放声音
- LONGLONG lScore=pGameEnd->lGameScore[GetMeChairID()];
- if (lScore>0L)
- {
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_WIN"));
- }
- else if (lScore<0L)
- {
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_LOST"));
- }
- else
- {
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_END"));
- }
- //设置界面
- if (IsLookonMode()==false)
- {
- m_GameClientView.m_btStart.ShowWindow(SW_SHOW);
- m_GameClientView.SetCurrentUser(INVALID_CHAIR);
- SetGameClock(GetMeChairID(),IDI_START_GAME,TIME_START_GAME);
- }
-
- //取消托管
- if(m_bStustee)
- OnStusteeControl(0,0);
-
- //更新界面
- m_GameClientView.InvalidGameView(0,0,0,0);
-
- return true;
- }
-
- //用户托管
- bool CGameClientEngine::OnSubTrustee(const void * pBuffer,WORD wDataSize)
- {
- //效验数据
- ASSERT(wDataSize==sizeof(CMD_S_Trustee));
- if (wDataSize!=sizeof(CMD_S_Trustee)) return false;
-
- //消息处理
- CMD_S_Trustee * pTrustee=(CMD_S_Trustee *)pBuffer;
- m_GameClientView.SetTrustee(SwitchViewChairID(pTrustee->wChairID),pTrustee->bTrustee);
- if ((IsLookonMode()==true)||(pTrustee->wChairID!=GetMeChairID()))
- {
- IClientUserItem * pUserData = GetTableUserItem(pTrustee->wChairID);
- TCHAR szBuffer[256];
- if(pTrustee->bTrustee==true)
- _sntprintf(szBuffer,sizeof(szBuffer),TEXT("玩家[%s]选择了托管功能."),pUserData->GetNickName());
- else
- _sntprintf(szBuffer,sizeof(szBuffer),TEXT("玩家[%s]取消了托管功能."),pUserData->GetNickName());
- if ( m_pIStringMessage )
- m_pIStringMessage->InsertSystemString(szBuffer);
- }
-
- return true;
- }
-
- //
- bool CGameClientEngine::OnSubUserChiHu( const void *pBuffer,WORD wDataSize )
- {
- //效验消息
- ASSERT(wDataSize==sizeof(CMD_S_ChiHu));
- if (wDataSize!=sizeof(CMD_S_ChiHu)) return false;
-
- //消息处理
- CMD_S_ChiHu * pChiHu=(CMD_S_ChiHu *)pBuffer;
-
- WORD wViewId = SwitchViewChairID( pChiHu->wChiHuUser );
-
- //隐藏控件
- m_GameClientView.m_ControlWnd.ShowWindow( SW_HIDE );
- //删除定时器
- KillGameClock( IDI_OPERATE_CARD );
-
- BYTE cbCardData[MAX_COUNT];
- ZeroMemory( cbCardData,sizeof(cbCardData) );
- cbCardData[pChiHu->cbCardCount-1] = pChiHu->cbChiHuCard;
-
- //设置扑克,名次
- if( wViewId == 2 )
- {
- m_GameClientView.m_HandCardControl.SetPositively( false );
- m_GameClientView.m_HandCardControl.SetCardData( NULL,0,0 );
- m_GameClientView.m_TableCard[2].SetCardData( cbCardData,pChiHu->cbCardCount );
- }
- else
- {
- WORD wUserIndex=(wViewId>2)?2:wViewId;
- m_GameClientView.m_UserCard[wUserIndex].SetCardData( 0,false );
-
- m_GameClientView.m_TableCard[wViewId].SetCardData( cbCardData,pChiHu->cbCardCount );
- }
- m_GameClientView.SetWinOrder( wViewId,pChiHu->cbWinOrder );
-
- ////提示消息
- //TCHAR szBuffer[128] = TEXT("");
- //_sntprintf( szBuffer,CountArray(szBuffer),TEXT("\n玩家[%s]胡牌,得分:%+I64d\n"),m_szAccounts[pChiHu->wChiHuUser],pChiHu->lGameScore );
- //InsertSystemString( szBuffer );
-
- //设置界面
- m_GameClientView.SetOutCardInfo(INVALID_CHAIR,0);
- WORD wAction = WIK_CHI_HU;
- if( pChiHu->wChiHuUser == pChiHu->wProviderUser )
- wAction |= WIK_ZI_MO;
- m_GameClientView.SetUserAction(wViewId,wAction);
- m_GameClientView.SetStatusFlag(false,false);
-
- //更新界面
- m_GameClientView.InvalidGameView(0,0,0,0);
-
- //环境设置
- PlayActionSound(pChiHu->wChiHuUser,WIK_CHI_HU);
-
- return true;
- }
-
- //播放出牌声音
- void CGameClientEngine::PlayCardSound(WORD wChairID, BYTE cbCardData)
- {
- if(m_GameLogic.IsValidCard(cbCardData) == false)
- {
- return;
- }
- if(wChairID < 0 || wChairID > 3)
- {
- return;
- }
-
- //判断性别
- IClientUserItem * pUserData = GetTableUserItem(wChairID);
- if(pUserData == 0)
- {
- assert(0 && "得不到玩家信息");
- return;
- }
- bool bBoy = (pUserData->GetGender() == GENDER_FEMALE ? false : true);
- BYTE cbType= (cbCardData & MASK_COLOR);
- BYTE cbValue= (cbCardData & MASK_VALUE);
- CString strSoundName;
- switch(cbType)
- {
- case 0X30: //风
- {
- switch(cbValue)
- {
- case 1:
- {
- strSoundName = _T("F_1");
- break;
- }
- case 2:
- {
- strSoundName = _T("F_2");
- break;
- }
- case 3:
- {
- strSoundName = _T("F_3");
- break;
- }
- case 4:
- {
- strSoundName = _T("F_4");
- break;
- }
- case 5:
- {
- strSoundName = _T("F_5");
- break;
- }
- case 6:
- {
- strSoundName = _T("F_6");
- break;
- }
- case 7:
- {
- strSoundName = _T("F_7");
- break;
- }
- default:
- {
- strSoundName=_T("BU_HUA");
- }
-
- }
- break;
- }
- case 0X20: //筒
- {
- strSoundName.Format(_T("T_%d"), cbValue);
- break;
- }
-
- case 0X10: //索
- {
- strSoundName.Format(_T("S_%d"), cbValue);
- break;
- }
- case 0X00: //万
- {
- strSoundName.Format(_T("W_%d"), cbValue);
- break;
- }
- }
-
- if(bBoy)
- {
- strSoundName = _T("BOY_") +strSoundName;
- }
- else
- {
- strSoundName = _T("GIRL_") + strSoundName;
- }
- m_DirectSound.Play();
- PlayGameSound(AfxGetInstanceHandle(), strSoundName);
- }
-
- //播放声音
- void CGameClientEngine::PlayActionSound(WORD wChairID,BYTE cbAction)
- {
- //判断性别
- IClientUserItem * pUserData = GetTableUserItem(wChairID);
- if(pUserData == 0)
- {
- assert(0 && "得不到玩家信息");
- return;
- }
- if(wChairID < 0 || wChairID > 3)
- {
- return;
- }
- bool bBoy = (pUserData->GetGender() == GENDER_FEMALE ? false : true);
-
- switch (cbAction)
- {
- case WIK_NULL: //取消
- {
- if(bBoy)
- PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_OUT_CARD"));
- else
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_OUT_CARD"));
- break;
- }
- case WIK_LEFT:
- case WIK_CENTER:
- case WIK_RIGHT: //上牌
- {
- if(bBoy)
- PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_CHI"));
- else
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_CHI"));
- break;
- }
- case WIK_PENG: //碰牌
- {
- if(bBoy)
- PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_PENG"));
- else
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_PENG"));
- break;
- }
- case WIK_GANG: //杠牌
- {
- if(bBoy)
- PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_GANG"));
- else
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_GANG"));
- break;
- }
- case WIK_CHI_HU: //吃胡
- {
-
- if(bBoy)
- PlayGameSound(AfxGetInstanceHandle(),TEXT("BOY_CHI_HU"));
- else
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GIRL_CHI_HU"));
- break;
- }
- }
-
- return;
- }
- //出牌判断
- bool CGameClientEngine::VerdictOutCard(BYTE cbCardData)
- {
- return true;
- }
-
- //扣除扑克
- void CGameClientEngine::DeductionTableCard(bool bHeadCard)
- {
- if (bHeadCard==true)
- {
- //切换索引
- BYTE cbHeapCount=m_cbHeapCardInfo[m_wHeapHand][0]+m_cbHeapCardInfo[m_wHeapHand][1];
- if (cbHeapCount==HEAP_FULL_COUNT)
- m_wHeapHand=(m_wHeapHand+1)%CountArray(m_cbHeapCardInfo);
-
- //减少扑克
- m_cbLeftCardCount--;
- m_cbHeapCardInfo[m_wHeapHand][0]++;
-
- //堆立扑克
- WORD wHeapViewID=SwitchViewChairID(m_wHeapHand);
- WORD wMinusHeadCount=m_cbHeapCardInfo[m_wHeapHand][0];
- WORD wMinusLastCount=m_cbHeapCardInfo[m_wHeapHand][1];
- m_GameClientView.m_HeapCard[wHeapViewID].SetCardData(wMinusHeadCount,wMinusLastCount,HEAP_FULL_COUNT);
- }
- else
- {
- //切换索引
- BYTE cbHeapCount=m_cbHeapCardInfo[m_wHeapTail][0]+m_cbHeapCardInfo[m_wHeapTail][1];
- if (cbHeapCount==HEAP_FULL_COUNT)
- m_wHeapTail=(m_wHeapTail+3)%CountArray(m_cbHeapCardInfo);
-
- //减少扑克
- m_cbLeftCardCount--;
- m_cbHeapCardInfo[m_wHeapTail][1]++;
-
- //堆立扑克
- WORD wHeapViewID=SwitchViewChairID(m_wHeapTail);
- WORD wMinusHeadCount=m_cbHeapCardInfo[m_wHeapTail][0];
- WORD wMinusLastCount=m_cbHeapCardInfo[m_wHeapTail][1];
- m_GameClientView.m_HeapCard[wHeapViewID].SetCardData(wMinusHeadCount,wMinusLastCount,HEAP_FULL_COUNT);
- }
-
- return;
- }
-
- //显示控制
- bool CGameClientEngine::ShowOperateControl(BYTE cbUserAction, BYTE cbActionCard)
- {
- //变量定义
- tagGangCardResult GangCardResult;
- ZeroMemory(&GangCardResult,sizeof(GangCardResult));
-
- //杠牌判断
- if ((cbUserAction&WIK_GANG)!=0)
- {
- //桌面杆牌
- if (cbActionCard!=0)
- {
- GangCardResult.cbCardCount=1;
- GangCardResult.cbCardData[0]=cbActionCard;
- }
-
- //自己杆牌
- if (cbActionCard==0)
- {
- WORD wMeChairID=GetMeChairID();
- m_GameLogic.AnalyseGangCard(m_cbCardIndex,m_WeaveItemArray[wMeChairID],m_cbWeaveCount[wMeChairID],GangCardResult);
- }
- }
-
- //显示界面
- if (IsLookonMode()==false)
- m_GameClientView.m_ControlWnd.SetControlInfo(cbActionCard,cbUserAction,GangCardResult);
-
- return true;
- }
-
- //开始按钮
- LRESULT CGameClientEngine::OnStart(WPARAM wParam, LPARAM lParam)
- {
- //环境设置
- KillGameClock(IDI_START_GAME);
- m_GameClientView.m_btStart.ShowWindow(SW_HIDE);
- m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
-
- //设置界面
- m_GameClientView.SetDiscUser(INVALID_CHAIR);
- m_GameClientView.SetStatusFlag(false,false);
- m_GameClientView.SetBankerUser(INVALID_CHAIR);
- m_GameClientView.SetUserAction(INVALID_CHAIR,0);
- m_GameClientView.SetOutCardInfo(INVALID_CHAIR,0);
- m_GameClientView.SetWinOrder(INVALID_CHAIR,0);
-
- //扑克设置
- m_GameClientView.m_UserCard[0].SetCardData(0,false);
- m_GameClientView.m_UserCard[1].SetCardData(0,false);
- m_GameClientView.m_UserCard[2].SetCardData(0,false);
- m_GameClientView.m_HandCardControl.SetCardData(NULL,0,0);
-
- //扑克设置
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- m_GameClientView.m_ScoreControl[i].RestorationData();
- m_GameClientView.m_TableCard[i].SetCardData(NULL,0);
- m_GameClientView.m_DiscardCard[i].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][0].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][1].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][2].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][3].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[i][0].SetGameEnd(false);
- m_GameClientView.m_WeaveCard[i][1].SetGameEnd(false);
- m_GameClientView.m_WeaveCard[i][2].SetGameEnd(false);
- m_GameClientView.m_WeaveCard[i][3].SetGameEnd(false);
- m_GameClientView.m_WeaveCard[i][0].SetDisplayItem(true);
- m_GameClientView.m_WeaveCard[i][1].SetDisplayItem(true);
- m_GameClientView.m_WeaveCard[i][2].SetDisplayItem(true);
- m_GameClientView.m_WeaveCard[i][3].SetDisplayItem(true);
- }
-
- //堆立扑克
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- m_cbHeapCardInfo[i][0]=0;
- m_cbHeapCardInfo[i][1]=0;
- m_GameClientView.m_HeapCard[SwitchViewChairID(i)].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
- }
-
- //游戏变量
- m_wCurrentUser=INVALID_CHAIR;
-
- //出牌信息
- m_cbOutCardData=0;
- m_wOutCardUser=INVALID_CHAIR;
- ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
- ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
-
- //组合扑克
- ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount));
- ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
-
- //堆立扑克
- m_wHeapHand=0;
- m_wHeapTail=0;
- ZeroMemory(m_cbHeapCardInfo,sizeof(m_cbHeapCardInfo));
-
- //扑克变量
- m_cbLeftCardCount=0;
- ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex));
-
- //发送消息
- SendUserReady(NULL,0);
-
- return 0;
- }
-
- //出牌操作
- LRESULT CGameClientEngine::OnOutCard(WPARAM wParam, LPARAM lParam)
- {
- //出牌判断
- if ((IsLookonMode()==true)||(m_wCurrentUser!=GetMeChairID()))
- return 0;
-
- //听牌判断
- if (VerdictOutCard((BYTE)wParam)==false)
- {
- if ( m_pIStringMessage )
- m_pIStringMessage->InsertSystemString(TEXT("出此牌不符合游戏规则!"));
- return 0;
- }
-
- //设置变量
- m_cbUserAction = 0;
- m_wCurrentUser=INVALID_CHAIR;
- BYTE cbOutCardData=(BYTE)wParam;
- m_GameLogic.RemoveCard(m_cbCardIndex,cbOutCardData);
-
- //设置扑克
- BYTE cbCardData[MAX_COUNT];
- BYTE cbCardCount=m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
- m_GameClientView.m_HandCardControl.SetCardData(cbCardData,cbCardCount,0);
-
- //设置界面
- KillGameClock(IDI_OPERATE_CARD);
- m_GameClientView.InvalidGameView(0,0,0,0);
- m_GameClientView.SetStatusFlag(false,false);
- m_GameClientView.SetUserAction(INVALID_CHAIR,0);
- m_GameClientView.SetOutCardInfo(2,cbOutCardData);
- m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
-
- //发送数据
- CMD_C_OutCard OutCard;
- OutCard.cbCardData=cbOutCardData;
- SendSocketData(SUB_C_OUT_CARD,&OutCard,sizeof(OutCard));
-
- //播放声音
- PlayCardSound(GetMeChairID(),cbOutCardData);
-
- return 0;
- }
-
- //扑克操作
- LRESULT CGameClientEngine::OnCardOperate(WPARAM wParam, LPARAM lParam)
- {
- //变量定义
- BYTE cbOperateCode=(BYTE)(wParam);
- BYTE cbOperateCard=(BYTE)(LOWORD(lParam));
-
- //状态判断
- if ((m_wCurrentUser==GetMeChairID())&&(cbOperateCode==WIK_NULL))
- {
- m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
- return 0;
- }
-
- //删除时间
- KillGameClock(IDI_OPERATE_CARD);
-
- m_cbUserAction = 0;
-
- //环境设置
- m_GameClientView.SetStatusFlag(false,true);
- m_GameClientView.m_ControlWnd.ShowWindow(SW_HIDE);
-
- //发送命令
- CMD_C_OperateCard OperateCard;
- OperateCard.cbOperateCode=cbOperateCode;
- OperateCard.cbOperateCard=cbOperateCard;
- SendSocketData(SUB_C_OPERATE_CARD,&OperateCard,sizeof(OperateCard));
-
- return 0;
- }
- //拖管控制
- LRESULT CGameClientEngine::OnStusteeControl(WPARAM wParam, LPARAM lParam)
- {
- //设置变量
- m_wTimeOutCount=0;
-
- //设置状态
- if (m_bStustee ==true)
- {
- m_bStustee=false;
- m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_START_TRUSTEE,AfxGetInstanceHandle(),false,false);
- //if( FALSE == (BOOL)wParam )
- if ( m_pIStringMessage )
- m_pIStringMessage->InsertSystemString(_T("您取消了托管功能."));
- CMD_C_Trustee Trustee;
- Trustee.bTrustee = false;
- SendSocketData(SUB_C_TRUSTEE,&Trustee,sizeof(Trustee));
-
- }
- else
- {
- m_bStustee=true;
- m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_STOP_TRUSTEE,AfxGetInstanceHandle(),false,false);
- //if( FALSE == (BOOL)wParam )
- if ( m_pIStringMessage )
- m_pIStringMessage->InsertSystemString(_T("您选择了托管功能."));
- CMD_C_Trustee Trustee;
- Trustee.bTrustee = true;
- SendSocketData(SUB_C_TRUSTEE,&Trustee,sizeof(Trustee));
-
- }
-
- return 0;
- }
-
- //第二次摇色子消息
- LRESULT CGameClientEngine::OnSiceTwo(WPARAM wParam, LPARAM lParam)
- {
- //环境处理
- PlayGameSound(AfxGetInstanceHandle(),TEXT("DRAW_SICE"));
-
- //设置界面
- m_GameClientView.SetBankerUser(SwitchViewChairID(m_wBankerUser));
-
- return 0;
- }
-
- //摇色子结束消息
- LRESULT CGameClientEngine::OnSiceFinish(WPARAM wParam, LPARAM lParam)
- {
- //设置界面
- m_GameClientView.m_DrawSiceWnd.ShowWindow(SW_HIDE);
-
- bool bPlayerMode = (IsLookonMode()==false);
-
- //扑克设置
- for (WORD i=0;i<GAME_PLAYER;i++)
- {
- //变量定义
- WORD wViewChairID=SwitchViewChairID(i);
-
- //组合界面
- m_GameClientView.m_WeaveCard[i][0].SetDisplayItem(true);
- m_GameClientView.m_WeaveCard[i][1].SetDisplayItem(true);
- m_GameClientView.m_WeaveCard[i][2].SetDisplayItem(true);
- m_GameClientView.m_WeaveCard[i][3].SetDisplayItem(true);
- m_GameClientView.m_HeapCard[wViewChairID].SetCardData(m_cbHeapCardInfo[i][0],m_cbHeapCardInfo[i][1],HEAP_FULL_COUNT);
-
- //旁观界面
- if (bPlayerMode==false)
- {
- m_GameClientView.m_TableCard[wViewChairID].SetCardData(NULL,0);
- m_GameClientView.m_DiscardCard[wViewChairID].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[wViewChairID][0].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[wViewChairID][1].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[wViewChairID][2].SetCardData(NULL,0);
- m_GameClientView.m_WeaveCard[wViewChairID][3].SetCardData(NULL,0);
- }
-
- if( GetTableUserItem(i) == NULL ) continue;
-
- //用户扑克
- if (wViewChairID!=2)
- {
- WORD wIndex=(wViewChairID>=3)?2:wViewChairID;
- m_GameClientView.m_UserCard[wIndex].SetCardData(MAX_COUNT-1,(i==m_wBankerUser));
- }
- else
- {
- BYTE cbCardData[MAX_COUNT];
- m_GameLogic.SwitchToCardData(m_cbCardIndex,cbCardData);
- BYTE cbBankerCard= (i==m_wBankerUser?cbCardData[MAX_COUNT-1]:0);
- m_GameClientView.m_HandCardControl.SetCardData(cbCardData,MAX_COUNT-1,cbBankerCard);
- }
- }
-
- m_GameClientView.m_HandCardControl.SetPositively(bPlayerMode);
-
- //出牌提示
- if ((bPlayerMode==true)&&(m_wCurrentUser!=INVALID_CHAIR))
- {
- WORD wMeChairID=GetMeChairID();
- if (m_wCurrentUser==wMeChairID) m_GameClientView.SetStatusFlag(true,false);
- }
-
- //动作处理
- if ((bPlayerMode==true)&&(m_cbUserAction!=WIK_NULL))
- {
- ShowOperateControl(m_cbUserAction,0);
- SetGameClock(GetMeChairID(),IDI_OPERATE_CARD,TIME_OPERATE_CARD);
- }
-
- //更新界面
- m_GameClientView.InvalidGameView(0,0,0,0);
-
- //激活框架
- if (bPlayerMode==true)
- ActiveGameFrame();
-
- //设置时间
- if (m_wCurrentUser!=INVALID_CHAIR)
- {
- m_GameClientView.SetCurrentUser(SwitchViewChairID(m_wCurrentUser));
- SetGameClock(m_wCurrentUser,IDI_OPERATE_CARD,TIME_OPERATE_CARD);
- }
-
- //环境处理
- PlayGameSound(AfxGetInstanceHandle(),TEXT("GAME_START"));
-
- return 0;
- }
-
- //
- bool CGameClientEngine::OnSubGangScore( const void *pBuffer, WORD wDataSize )
- {
- //效验消息
- ASSERT(wDataSize==sizeof(CMD_S_GangScore));
- if (wDataSize!=sizeof(CMD_S_GangScore)) return false;
-
- //消息处理
- CMD_S_GangScore * pGangScore=(CMD_S_GangScore *)pBuffer;
-
- CString strTemp ,strEnd;
- strEnd.Format( TEXT("\n----------%s----------\n"),pGangScore->cbXiaYu==TRUE?TEXT("下雨"):TEXT("刮风") );
- //InsertGeneralString( strEnd,RGB(0,0,0),false );
- strEnd = TEXT("");
- for( WORD i = 0; i < GAME_PLAYER; i++ )
- {
- strTemp.Format(TEXT("%s: %I64d\n"),m_szAccounts[i],pGangScore->lGangScore[i]);
- strEnd += strTemp;
- }
- //消息积分
- //InsertGeneralString( strEnd,RGB(0,0,255),false);
- strEnd = TEXT("------------------------\n");
- //InsertGeneralString( strEnd,RGB(0,0,0),false );
-
- //设置界面
- LONGLONG lGangScore[GAME_PLAYER];
- for( WORD i = 0; i < GAME_PLAYER; i++ )
- lGangScore[SwitchViewChairID(i)] = pGangScore->lGangScore[i];
- m_GameClientView.SetGangScore( SwitchViewChairID(pGangScore->wChairId),pGangScore->cbXiaYu,lGangScore );
-
- return true;
- }
-
- //////////////////////////////////////////////////////////////////////////
|