//旁观状态 void CGameClientDlg::OnLookonChanged(bool bLookonUser, const void * pBuffer, WORD wDataSize) { //扑克控制 m_GameClientView.m_HandCardControl.SetDisplayItem(IsAllowLookon()); m_GameClientView.UpdateGameView(NULL); }
//旁观状态 void CGameClientDlg::OnLookonChanged(bool bLookonUser, const void * pBuffer, WORD wDataSize) { //控件控制 if(bLookonUser) { if(IsAllowLookon() ) m_GameClientView.m_CardControl[m_wViewChairID[GetMeChairID()]].SetDisplayFlag(true); else m_GameClientView.m_CardControl[m_wViewChairID[GetMeChairID()]].SetDisplayFlag(false); } return; }
//发牌消息 bool CGameClientDlg::OnSubSendCard(const void * pBuffer, WORD wDataSize) { //效验数据 if (wDataSize!=sizeof(CMD_S_SendCard)) return false; CMD_S_SendCard * pSendCard=(CMD_S_SendCard *)pBuffer; //删除定时器 KillGameTimer(IDI_NULLITY); m_GameClientView.SetWaitInvest(false); CopyMemory(m_cbHandCardData,pSendCard->cbCardData,sizeof(m_cbHandCardData)); WORD wMeChiarID=GetMeChairID(); WORD wViewChairID=m_wViewChairID[wMeChiarID]; if(IsAllowLookon() || !IsLookonMode()) { m_GameClientView.m_CardControl[wViewChairID].SetDisplayFlag(true); } //派发扑克 for(WORD i=0;i<MAX_COUNT;i++) { for (WORD j=m_wBankerUser;j<m_wBankerUser+GAME_PLAYER;j++) { WORD w=j%GAME_PLAYER; if (m_cbPlayStatus[w]==TRUE) { WORD wViewChairID=m_wViewChairID[w]; if(pSendCard->cbCardData[w][i]!=0) { m_GameClientView.DispatchUserCard(wViewChairID,m_cbHandCardData[w][i]); } } } } //结束动画-去掉发牌动画 m_GameClientView.FinishDispatchCard(); return true; }
//旁观状态 void CGameClientDlg::OnLookonChanged(bool bLookonUser, const void * pBuffer, WORD wDataSize) { //判断旁观 if(bLookonUser) { WORD wMeChiarID=GetMeChairID(); if(IsAllowLookon()) { m_GameClientView.m_CardControl[wMeChiarID].SetCardData(m_cbHandCardData[wMeChiarID],MAX_COUNT); m_GameClientView.m_CardControl[wMeChiarID].SetDisplayItem(true); } else { m_GameClientView.m_CardControl[wMeChiarID].SetCardData(NULL,0); m_GameClientView.m_CardControl[wMeChiarID].SetDisplayItem(false); } } return ; }
//游戏场景 bool CGameClientDlg::OnGameSceneMessage(BYTE cbGameStation, bool bLookonOther, const 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; //设置数据 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]=HEAP_FULL_COUNT-(((i==m_wBankerUser)||((i+2)%4==m_wBankerUser))?34:34); 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); SetGameTimer(GetMeChairID(),IDI_START_GAME,TIME_START_GAME); } //丢弃效果 m_GameClientView.SetDiscUser(INVALID_CHAIR); m_GameClientView.SetTimer(IDI_DISC_EFFECT,250,NULL); //更新界面 m_GameClientView.UpdateGameView(NULL); return true; } case GS_MJ_PLAY: //游戏状态 { //效验数据 if (wDataSize!=sizeof(CMD_S_StatusPlay)) return false; CMD_S_StatusPlay * pStatusPlay=(CMD_S_StatusPlay *)pBuffer; //设置变量 m_wBankerUser=pStatusPlay->wBankerUser; m_wCurrentUser=pStatusPlay->wCurrentUser; m_cbLeftCardCount=pStatusPlay->cbLeftCardCount; m_bStustee=pStatusPlay->bTrustee[GetMeChairID()]; //旁观 if( IsLookonMode()==true ) m_GameClientView.m_HandCardControl.SetDisplayItem(IsAllowLookon()||IsAllowUserLookon()); //托管设置 for (WORD i=0;i<GAME_PLAYER;i++) { m_GameClientView.SetTrustee(SwitchViewChairID(i),pStatusPlay->bTrustee[i]); } m_wTimeOutCount=0; if(pStatusPlay->bTrustee[GetMeChairID()]) m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_STOP_TRUSTEE,AfxGetInstanceHandle(),false); else m_GameClientView.m_btStusteeControl.SetButtonImage(IDB_BT_START_TRUSTEE,AfxGetInstanceHandle(),false); //听牌状态 WORD wMeChairID=GetMeChairID(); m_bHearStatus=(pStatusPlay->cbHearStatus[wMeChairID]==TRUE)?true: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(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 (pStatusPlay->cbHearStatus[i]==TRUE) { WORD wViewChairID=SwitchViewChairID(i); m_GameClientView.SetUserListenStatus(wViewChairID,true); } } //用户扑克 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); } //堆立扑克 for (WORD i=0;i<GAME_PLAYER;i++) { m_cbHeapCardInfo[i][0]=0; m_cbHeapCardInfo[i][1]=HEAP_FULL_COUNT-(((i==m_wBankerUser)||((i+2)%4==m_wBankerUser))?34:34); } //分发扑克 BYTE cbTakeCount=MAX_REPERTORY-m_cbLeftCardCount; BYTE cbSiceFirst=HIBYTE(pStatusPlay->wSiceCount); BYTE cbSiceSecond=LOBYTE(pStatusPlay->wSiceCount); WORD wTakeChairID=(m_wBankerUser+7-cbSiceFirst)%GAME_PLAYER; for (WORD i=0;i<GAME_PLAYER;i++) { //计算数目 BYTE cbValidCount=HEAP_FULL_COUNT-m_cbHeapCardInfo[wTakeChairID][1]-((i==0)?(cbSiceSecond-1)*2:0); BYTE cbRemoveCount=__min(cbValidCount,cbTakeCount); //提取扑克 cbTakeCount-=cbRemoveCount; m_cbHeapCardInfo[wTakeChairID][(i==0)?1:0]+=cbRemoveCount; //完成判断 if (cbTakeCount==0) { m_wHeapHand=wTakeChairID; m_wHeapTail=(m_wBankerUser+7-cbSiceFirst)%GAME_PLAYER; break; } //切换索引 wTakeChairID=(wTakeChairID+1)%GAME_PLAYER; } //堆立界面 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); } //操作界面 if ((IsLookonMode()==false)&&(pStatusPlay->cbActionMask!=WIK_NULL)) { //获取变量 BYTE cbActionMask=pStatusPlay->cbActionMask; BYTE cbActionCard=pStatusPlay->cbActionCard; //变量定义 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) SetGameTimer(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; if ((m_bHearStatus==true)&&(m_wCurrentUser==GetMeChairID())) wTimeCount=TIME_HEAR_STATUS; //ASSERT(FALSE); //设置时间 SetGameTimer(m_wCurrentUser,TIME_OPERATE_CARD,wTimeCount); } //丢弃效果 m_GameClientView.SetDiscUser(SwitchViewChairID(m_wOutCardUser)); m_GameClientView.SetTimer(IDI_DISC_EFFECT,250,NULL); //更新界面 m_GameClientView.UpdateGameView(NULL); return true; } } return false; }
//游戏场景 bool CGameClientDlg::OnGameSceneMessage(BYTE cbGameStation, bool bLookonOther, const void * pBuffer, WORD wDataSize) { if(IsLookonMode())m_GameClientView.m_bLookOnUser=true; switch (cbGameStation) { case GS_FREE: //空闲状态 { //效验数据 if (wDataSize!=sizeof(CMD_S_StatusFree)) return false; CMD_S_StatusFree * pStatusFree=(CMD_S_StatusFree *)pBuffer; //设置控件 if (IsLookonMode()==false) { SetGameTimer(GetMeChairID(),IDI_START_GAME,TIME_USER_START_GAME); m_GameClientView.m_btStart.ShowWindow(SW_SHOW); m_GameClientView.m_btStart.SetFocus(); } return true; } case GS_TK_CALL: // 叫庄状态 { //效验数据 if (wDataSize!=sizeof(CMD_S_StatusCall)) return false; CMD_S_StatusCall * pStatusCall=(CMD_S_StatusCall *)pBuffer; //用户信息 for (WORD i=0;i<GAME_PLAYER;i++) { //视图位置 m_wViewChairID[i]=SwitchViewChairID(i); //获取用户 const tagUserData * pUserData=GetUserData(i); if (pUserData==NULL) continue; //游戏信息 m_cbPlayStatus[i]=TRUE; //用户名字 lstrcpyn(m_szAccounts[i],pUserData->szName,CountArray(m_szAccounts[i])); } //始叫用户 if(!IsLookonMode() && pStatusCall->wCallBanker==GetMeChairID()) { //控件显示 //ActiveGameFrame(); m_GameClientView.m_btBanker.ShowWindow(SW_SHOW); m_GameClientView.m_btIdler.ShowWindow(SW_SHOW); } //等待标志 WORD wViewID=m_wViewChairID[pStatusCall->wCallBanker]; m_GameClientView.SetWaitCall((BYTE)wViewID); //实际定时器 if(pStatusCall->wCallBanker==GetMeChairID()) { SetGameTimer(pStatusCall->wCallBanker,IDI_CALL_BANKER,TIME_USER_CALL_BANKER); } else SetGameTimer(pStatusCall->wCallBanker,IDI_NULLITY,TIME_USER_CALL_BANKER); return true; } case GS_TK_SCORE: //下注状态 { //效验数据 if (wDataSize!=sizeof(CMD_S_StatusScore)) return false; CMD_S_StatusScore * pStatusScore=(CMD_S_StatusScore *)pBuffer; //设置变量 m_lTurnMaxScore=pStatusScore->lTurnMaxScore; m_wBankerUser=pStatusScore->wBankerUser; CopyMemory(m_lTableScore,pStatusScore->lTableScore,sizeof(m_lTableScore)); for (WORD i=0;i<GAME_PLAYER;i++) { //视图位置 m_wViewChairID[i]=SwitchViewChairID(i); //桌面筹码 if(m_lTableScore[i]>0L)m_GameClientView.SetUserTableScore(m_wViewChairID[i],m_lTableScore[i]); //获取用户 const tagUserData * pUserData=GetUserData(i); if (pUserData==NULL) continue; //游戏信息 m_cbPlayStatus[i]=TRUE; //用户名字 lstrcpyn(m_szAccounts[i],pUserData->szName,CountArray(m_szAccounts[i])); } //设置筹码 if (!IsLookonMode() && pStatusScore->lTurnMaxScore>0L && m_lTableScore[GetMeChairID()]==0L) { LONGLONG lUserMaxScore[GAME_PLAYER]; ZeroMemory(lUserMaxScore,sizeof(lUserMaxScore)); LONGLONG lTemp=m_lTurnMaxScore; for (WORD i=0;i<GAME_PLAYER;i++) { if(i>0)lTemp/=2; lUserMaxScore[i]=__max(lTemp,1L); } //更新控件 UpdateScoreControl(lUserMaxScore,SW_SHOW); //实际定时器 SetTimer(IDI_TIME_USER_ADD_SCORE,(TIME_USER_ADD_SCORE)*1000,NULL); } //庄家标志 WORD wID=m_wViewChairID[m_wBankerUser]; m_GameClientView.SetBankerUser(wID); //等待标志 m_GameClientView.SetWaitInvest(true); //辅助显示中心时钟 SetGameTimer(GetMeChairID(),IDI_NULLITY,TIME_USER_ADD_SCORE); return true; } case GS_TK_PLAYING: //游戏状态 { //效验数据 if (wDataSize!=sizeof(CMD_S_StatusPlay)) return false; CMD_S_StatusPlay * pStatusPlay=(CMD_S_StatusPlay *)pBuffer; //设置变量 m_lTurnMaxScore=pStatusPlay->lTurnMaxScore; m_wBankerUser=pStatusPlay->wBankerUser; CopyMemory(m_lTableScore,pStatusPlay->lTableScore,sizeof(m_lTableScore)); CopyMemory(m_bUserOxCard,pStatusPlay->bOxCard,sizeof(m_bUserOxCard)); for (WORD i=0;i<GAME_PLAYER;i++) { //视图位置 m_wViewChairID[i]=SwitchViewChairID(i); //桌面筹码 if(m_lTableScore[i]>0L)m_GameClientView.SetUserTableScore(m_wViewChairID[i],m_lTableScore[i]); //获取用户 const tagUserData * pUserData=GetUserData(i); if (pUserData==NULL) continue; //游戏信息 m_cbPlayStatus[i]=TRUE; //扑克数据 CopyMemory(m_cbHandCardData[i],pStatusPlay->cbHandCardData[i],MAX_COUNT); //用户名字 lstrcpyn(m_szAccounts[i],pUserData->szName,CountArray(m_szAccounts[i])); } //庄家标志 WORD wID=m_wViewChairID[m_wBankerUser]; m_GameClientView.SetBankerUser(wID); //左上信息 //m_GameClientView.SetScoreInfo(m_lTurnMaxScore,0); //设置界面 LONGLONG lTableScore=0L; for (WORD i=0;i<GAME_PLAYER;i++) { //设置位置 WORD wViewChairID=m_wViewChairID[i]; //设置扑克 if (m_cbPlayStatus[i]==TRUE) { m_GameClientView.m_CardControl[wViewChairID].SetCardData(pStatusPlay->cbHandCardData[i],MAX_COUNT); } } WORD wMeChiarID=GetMeChairID(); WORD wViewChairID=m_wViewChairID[wMeChiarID]; if(!IsLookonMode())m_GameClientView.m_CardControl[wViewChairID].SetPositively(true); if(IsAllowLookon() || !IsLookonMode()) { m_GameClientView.m_CardControl[wViewChairID].SetDisplayFlag(true); } //摊牌标志 for (WORD i=0;i<GAME_PLAYER;i++) { if(m_bUserOxCard[i]!=0xff) { m_GameClientView.ShowOpenCard(m_wViewChairID[i]); } } //控件处理 if(!IsLookonMode()) { //显示控件 if(m_bUserOxCard[wMeChiarID]==0xff) { OnSendCardFinish(0,0); } else { m_GameClientView.m_CardControl[wViewChairID].SetPositively(false); if(m_bUserOxCard[wMeChiarID]==TRUE)//牛牌分类 { //设置变量 BYTE bTemp[MAX_COUNT]; CopyMemory(bTemp,m_cbHandCardData[wMeChiarID],sizeof(bTemp)); //获取牛牌 m_GameLogic.GetOxCard(bTemp,MAX_COUNT); BYTE bCardValue=m_GameLogic.GetCardType(bTemp,MAX_COUNT); ASSERT(bCardValue>0); if(bCardValue<OX_THREE_SAME) { //设置控件 m_GameClientView.m_CardControl[wViewChairID].SetCardData(bTemp,3); m_GameClientView.m_CardControlOx[wViewChairID].SetCardData(&bTemp[3],2); } //显示点数 m_GameClientView.SetUserOxValue(wViewChairID,bCardValue); } else { //无牛 m_GameClientView.SetUserOxValue(wViewChairID,0); } } } return true; } } return false; }