//定时器事件 bool __cdecl CTableFrameSink::OnTimerMessage(WORD wTimerID, WPARAM wBindParam) { switch (wTimerID) { case IDI_GAME_END: //游戏结束 { if (m_pITableFrame->GetGameStatus()==GS_PLAYING) { OnEventGameEnd(INVALID_CHAIR,NULL,m_cbGameEndReason); return true; } } case IDI_PASS_CARD: { if ((wBindParam==m_wCurrentUser)&&(m_wCurrentUser!=INVALID_CHAIR)) { //获取用户 IServerUserItem * pIServerUserItem=m_pITableFrame->GetServerUserItem(m_wCurrentUser); //用户判断 if ((pIServerUserItem!=NULL)&&(pIServerUserItem->GetUserStatus()!=US_OFFLINE)) { //OnUserGiveUp(m_wCurrentUser); //test m_pITableFrame->SetGameTimer(IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser); //end test } else m_pITableFrame->SetGameTimer(IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser); return true; } } } return false; }
//扣牌事件 bool CTableFrameSink::OnUserKouPai(WORD wChairID) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true; if (wChairID!=m_wCurrentUser) return false; //设置用户 for(BYTE i=1;i<GAME_PLAYER;i++) { m_wCurrentUser=(wChairID+i)%m_wPlayerCount; if(m_bXianPaiCompetency[m_wCurrentUser]) break; } ASSERT(i!=GAME_PLAYER); if(i>=GAME_PLAYER) m_wCurrentUser=m_wBankerUser; ASSERT(m_bKouPaiPlayerCount<=3); //设置掀牌资格 if(wChairID!=m_wBankerUser) m_bXianPaiCompetency[wChairID]=false; //发送消息 CMD_S_User_CouPai CouPai; CouPai.wCouPaiUserID=wChairID; CouPai.wCurrentUser=m_wCurrentUser; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_USER_COUPAI,&CouPai,sizeof(CouPai)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_USER_COUPAI,&CouPai,sizeof(CouPai)); //结束判断 if(m_wCurrentUser==m_wBankerUser) OnEventGameEnd(wChairID,NULL,GER_NORMAL); return true; }
//放弃事件 bool CTableFrameSink::OnUserGiveUp(WORD wChairID) { //重置状态 m_cbPlayStatus[wChairID]=FALSE; m_cbShowHand[wChairID]=FALSE; //发送消息 CMD_S_GiveUp GiveUp; GiveUp.wGiveUpUser=wChairID; GiveUp.lLost = -m_lTotalScore[wChairID]; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp)); //写入积分 m_pITableFrame->WriteUserScore(wChairID,-m_lTotalScore[wChairID],0,enScoreKind_Lost); //清空下注 m_lTableScore[wChairID] = 0L; //人数统计 WORD wPlayerCount=0; for (WORD i=0;i<m_wPlayerCount;i++) { if (m_cbPlayStatus[i]==TRUE) wPlayerCount++; } //判断结束 if (wPlayerCount>=2) { if (m_wCurrentUser==wChairID) OnUserAddScore(wChairID,0L,true); } else OnEventGameEnd(INVALID_CHAIR,NULL,GER_NO_PLAYER); return true; }
//放弃事件 bool CTableFrameSink::OnUserGiveUp(WORD wChairID) { //状态判断 GT_ASSERT(m_bPlayStatus[wChairID]==TRUE); if (m_bPlayStatus[wChairID]==FALSE) return false; //设置数据 m_bPlayStatus[wChairID]=FALSE; //m_bTableCardCount[wChairID]=0; //发送放弃消息 CMD_S_GiveUp GiveUp; GiveUp.wUserChairID=wChairID; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp)); //判断结束 WORD wPlayerCount=0; for (WORD i=0;i<m_wPlayerCount;i++) { if (m_bPlayStatus[i]==TRUE) wPlayerCount++; } if (wPlayerCount>=2) { if (m_wCurrentUser==wChairID) OnUserAddGold(wChairID,0L,true); } else OnEventGameEnd(INVALID_CHAIR,NULL,GER_NO_PLAYER); return true; }
//用户出牌 bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true; if (wChairID!=m_wCurrentUser) return false; //类型判断 BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount); if (bCardType==CT_ERROR) return false; //更随出牌 if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount; else if (m_GameLogic.CompareCard(m_bTurnCardData,bCardData,m_bTurnCardCount,bCardCount)==false) return false; //删除扑克 if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false; m_bCardCount[wChairID]-=bCardCount; //出牌记录 m_bTurnCardCount=bCardCount; m_bOutCardCount[wChairID]++; CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount); //炸弹判断 if ((bCardType==CT_BOMB_CARD)||(bCardType==CT_MISSILE_CARD)) { for(WORD i=0;i<m_wPlayerCount;i++)m_bScoreTimes[i]*=2; m_wOutBombCount++; } //切换用户 m_wTurnWiner=wChairID; if (m_bCardCount[wChairID]!=0) { if (bCardType!=CT_MISSILE_CARD) m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount; } else m_wCurrentUser=INVALID_CHAIR; //构造数据 CMD_S_OutCard OutCard; OutCard.bCardCount=bCardCount; OutCard.wOutCardUser=wChairID; OutCard.wCurrentUser=m_wCurrentUser; CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE)); //发送数据 WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); //出牌最大 if (bCardType==CT_MISSILE_CARD) m_bTurnCardCount=0; //结束判断 if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL); return true; }
//摊牌事件 bool CTableFrameSink::OnUserOpenCard( WORD wChairID, BYTE bOx ) { //状态效验 ASSERT (m_pITableFrame->GetGameStatus()==GS_OX_PLAY); if (m_pITableFrame->GetGameStatus()!=GS_OX_PLAY) return false; CountDownTime(wChairID , TRUE); IServerUserItem* pServerUserItem = m_pITableFrame->GetServerUserItem(wChairID); //m_oLog.Log("玩家[%s]摊牌。", pServerUserItem->GetUserData()->szAccounts); //效验数据 ASSERT(bOx==FALSE || bOx==TRUE); if(bOx!=FALSE && bOx!=TRUE)return false; //效验数据 if(bOx) { ASSERT(m_GameLogic.GetBestCardType(m_cbHandCardData[wChairID],MAX_COUNT)>=0); if(!(m_GameLogic.GetBestCardType(m_cbHandCardData[wChairID],MAX_COUNT)>=0))return false; } //牛牛数据 m_bOxCard[wChairID] = bOx; //摊牌人数 BYTE bUserCount=0; for(WORD i=0;i<m_wPlayerCount;i++) { if(m_bOxCard[i]<2 && m_cbPlayStatus[i]==TRUE)bUserCount++; else if(m_cbPlayStatus[i]==FALSE)bUserCount++; } //构造变量 CMD_S_Open_Card OpenCard; ZeroMemory(&OpenCard,sizeof(OpenCard)); //设置变量 OpenCard.bOpen=bOx; OpenCard.wPlayerID=wChairID; //发送数据 for (WORD i=0;i< m_wPlayerCount;i++) { if(m_cbPlayStatus[i]==FALSE)continue; m_pITableFrame->SendTableData(i,SUB_S_OPEN_CARD,&OpenCard,sizeof(OpenCard)); } m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OPEN_CARD,&OpenCard,sizeof(OpenCard)); //结束游戏 if(bUserCount == m_wPlayerCount) { return OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL); } return true; }
//用户放弃 bool CTableFrameSink::OnUserPassCard(WORD wChairID) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_RF_PLAYING) return false; //设置变量 BYTE i=wChairID+1; while(!m_bCardCount[(i%m_wPlayerCount)]) { i++; } //设置变量 m_wCurrentUser=i%m_wPlayerCount; m_wPassCount+=i-wChairID; if(m_wPassCount>=m_wPlayerCount-1) { ZeroMemory(m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount); m_bTurnCardCount=0; if(m_bResidualCardCount) RecruitCard(m_wCurrentUser); } //新一轮设置分数牌 if(!m_bTurnCardCount) for(BYTE i=0;i<m_bOneTurnScoreCard.GetSize();i++) m_UserScoreCard[m_wCurrentUser].Add(m_bOneTurnScoreCard.GetAt(i)); //清理一轮分值牌数组 m_bOneTurnScoreCard.RemoveAll(); m_bOneTurnScoreCard.FreeExtra(); //发送数据 CMD_S_PassCard PassCard; PassCard.wPassUser=wChairID; PassCard.wCurrentUser=m_wCurrentUser; PassCard.bNewTurn=(m_bTurnCardCount==0)?TRUE:FALSE; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_PASS_CARD,&PassCard,sizeof(PassCard)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_PASS_CARD,&PassCard,sizeof(PassCard)); //结束判断 BYTE bScoreCardCount=0; for(BYTE j=0;j<GAME_PLAYER;j++) { bScoreCardCount+=m_UserScoreCard[j].GetSize(); } if(bScoreCardCount==12) OnEventGameEnd(wChairID,NULL,GER_NORMAL); return true; }
//用户放弃 bool CTableFrameSink::OnUserPassCard(WORD wChairID) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true; if ((wChairID!=m_wCurrentUser)||(m_bTurnCardCount==0)) return false; ASSERT((wChairID==m_wCurrentUser)&&(m_bTurnCardCount)); //设置变量 bool bNewTurn=false; m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount; if(m_wCurrentUser==m_wFirstUser) { m_wCurrentUser=m_wBankerUser; m_wFirstUser=m_wBankerUser; for(BYTE i=0;i<m_bTurnCardCount;i++) m_bZhanPaiData[m_wBankerUser].Add(m_bTurnCardData[i]); bNewTurn=true; } //发送数据 CMD_S_PassCard PassCard; ZeroMemory(&PassCard,sizeof(CMD_S_PassCard)); if(bNewTurn) { CopyMemory(&PassCard.bZhanPaiData,m_bTurnCardData,sizeof(m_bTurnCardData)); PassCard.bZhanpaiUser=m_wBankerUser; ZeroMemory(m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount); m_bTurnCardCount=0; } PassCard.wPassUser=wChairID; PassCard.wCurrentUser=m_wCurrentUser; PassCard.bNewTurn=bNewTurn; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_PASS_CARD,&PassCard,sizeof(PassCard)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_PASS_CARD,&PassCard,sizeof(PassCard)); //判断结束 BYTE bZhanPaiCount=0; for(BYTE j=0;j<GAME_PLAYER;j++) { bZhanPaiCount+=m_bZhanPaiData[j].GetSize(); } if(bZhanPaiCount>=16) OnEventGameEnd(wChairID,NULL,GER_NORMAL); return true; }
//游戏开始 bool __cdecl CTableFrameSink::OnEventGameStart() { //设置状态 m_pITableFrame->SetGameStatus(GS_RF_PLAYING); //混乱扑克 BYTE bRandCard[52]; m_GameLogic.RandCardList(bRandCard,CountArray(bRandCard)); //分发扑克 for (WORD i=0;i<m_wPlayerCount;i++) { m_bCardCount[i]=13; CopyMemory(&m_bHandCardData[i],&bRandCard[i*m_bCardCount[i]],sizeof(BYTE)*m_bCardCount[i]); m_GameLogic.SortCardList(m_bHandCardData[i],m_bCardCount[i]); } ////////////////////////////////////////////////////////////////////////// //BYTE MyCardData[13]= //{ // //0x02,0x12,0x22,0x32,0x09,0x19,0x29,0x39,0x0d,0x1d,0x2d,0x3d,0x38 // 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03 //}; //CopyMemory(&m_bHandCardData[0],MyCardData,sizeof(BYTE)*13); //m_GameLogic.SortCardList(m_bHandCardData[0],13); ////////////////////////////////////////////////////////////////////////// //设置用户 if(m_wBankerUser!=INVALID_CHAIR) m_wCurrentUser=m_wBankerUser; else { m_wCurrentUser=rand()%m_wPlayerCount; } ////设置用户 //for (WORD i=0;i<m_wPlayerCount;i++) //{ // for (BYTE j=0;j<m_bCardCount[i];j++) // { // if (m_bHandCardData[i][j]==0x03) // { // //设置用户 // m_wBankerUser=i; // m_wCurrentUser=i; // goto SET_CURRENT_USER; // } // } //} ////错误判断 //ASSERT(FALSE); //SET_CURRENT_USER: //发送扑克 CMD_S_GameStart GameStart; GameStart.wBankerUser=m_wBankerUser; GameStart.wCurrentUser=m_wCurrentUser; for (WORD i=0;i<m_wPlayerCount;i++) { CopyMemory(GameStart.cbCardData,m_bHandCardData[i],sizeof(GameStart.cbCardData)); m_pITableFrame->SendTableData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart)); m_pITableFrame->SendLookonData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart)); } ////////////////////////////////////////////////////////////////////////// //检测全大全小 for (WORD i=0;i<GAME_PLAYER;i++) { if( m_GameLogic.IsAllSmall(m_bHandCardData[i],m_bCardCount[i]) ) { m_wAllBigOrSmallUser=i; OnEventGameEnd(i,NULL,GER_NORMAL); } } for (WORD i=0;i<GAME_PLAYER;i++) { if( m_GameLogic.IsAllBig(m_bHandCardData[i],4) ) { m_wAllBigOrSmallUser=i; OnEventGameEnd(i,NULL,GER_NORMAL); } } ////////////////////////////////////////////////////////////////////////// return true; }
//加注事件 bool CTableFrameSink::OnUserAddGold(WORD wChairID, DOUBLE fGold, bool bCancel) { WORD i = 0; //设置数据 if (bCancel==false) { //效验数据 GT_ASSERT(m_wCurrentUser==wChairID); if (m_wCurrentUser!=wChairID) return false; //计算限注 DOUBLE fMaxGold=0L; if (m_bSendCardCount<=2) { fMaxGold=m_fMaxGold/4L; if(fMaxGold <= m_pGameServiceOption->dwCellScore) { fMaxGold = m_pGameServiceOption->dwCellScore; } } else if (m_bSendCardCount==3) fMaxGold=m_fMaxGold/2L; else fMaxGold=m_fMaxGold; //计算剩下的金币 DOUBLE fLeaveGold=fMaxGold-m_fTableGold[wChairID*2+1]; m_fTableGold[wChairID*2]=__min(fLeaveGold,__max(fGold,m_fTurnBasicGold)); } //操作次数 bool bFinishTurn=false; WORD wNextUser=INVALID_CHAIR; for (i=0;i<m_wPlayerCount-1;i++) { m_wOperaCount++; wNextUser=(m_wCurrentUser+i+1)%m_wPlayerCount; if (m_bPlayStatus[wNextUser]==TRUE) break; } //判断下注 if (m_wOperaCount>=m_wPlayerCount) { DOUBLE fTableGold=0L; for (i=0;i<m_wPlayerCount;i++) { if (m_bPlayStatus[i]==TRUE) { fTableGold=m_fTableGold[i*2]; break; } } while (i<m_wPlayerCount) { if ((m_bPlayStatus[i]==TRUE)&&(m_fTableGold[i*2]!=fTableGold)) break; i++; } if (i==m_wPlayerCount) bFinishTurn=true; } //一轮判断 if (bFinishTurn==true) { //发送数据 CMD_S_AddGold GoldResult; GoldResult.fCurrentLessGold=0L; GoldResult.wLastChairID=wChairID; GoldResult.wCurrentUser=INVALID_CHAIR; GoldResult.fLastAddGold=m_fTableGold[wChairID*2]; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult)); //投注 tagBetScoreInfo BetScoreInfo; BetScoreInfo.wBetRegionIndex = 0; for(int i = 0; i < m_pGameServiceAttrib->wChairCount; i ++) { IServerUserItem * pIServerUserItem = m_pITableFrame->GetServerUserItem(i); if(pIServerUserItem != NULL) { BetScoreInfo.dwBetScore = m_fTableGold[i*2]; BetScoreInfo.pIServerUserItem = pIServerUserItem; if(m_pICalculateFrame->BetScore(pIServerUserItem, &BetScoreInfo, 1) == false) { GT_ASSERT(FALSE); return false; } } } //累计金币 for (WORD i=0;i<m_wPlayerCount;i++) { m_fTableGold[i*2+1]+=m_fTableGold[i*2]; m_fTableGold[i*2]=0L; } //开始一轮 if (m_bSendCardCount<5) { //设置变量 m_wOperaCount=0; m_bSendCardCount++; m_fTurnBasicGold=0L; m_wCurrentUser=DeduceWiner(1,m_bSendCardCount-1); //发送扑克 CMD_R_SendCard SendCard; for (WORD i=0;i<m_wPlayerCount;i++) { if (m_bPlayStatus[i]==TRUE) m_bTableCardCount[i]=m_bSendCardCount; SendCard.bUserCard[i]=m_bTableCardArray[i][m_bSendCardCount-1]; } //删除旧定时器 /*if (m_bTimeStation!=255) { KillTimer(m_bTimeStation); m_bTimeStation=255; }*/ //设置定时器 /*m_bTimeStation=TIME_PASS+m_wCurrentUser; SetTimer(m_bTimeStation,TIME_COUNT);*/ //发送消息 SendCard.wCurrentUser=m_wCurrentUser; SendCard.fMaxGold=(m_bSendCardCount!=3)?m_fMaxGold:m_fMaxGold/2L; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard)); } else OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL); } else { //设置变量 m_wCurrentUser=wNextUser; m_fTurnBasicGold=__max(m_fTableGold[wChairID*2],m_fTurnBasicGold); //发送数据 CMD_S_AddGold AddGold; AddGold.wLastChairID=wChairID; AddGold.wCurrentUser=m_wCurrentUser; AddGold.fCurrentLessGold=m_fTurnBasicGold; AddGold.fLastAddGold=m_fTableGold[wChairID*2]; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold)); //删除旧定时器 /*if (m_bTimeStation!=255) { KillTimer(m_bTimeStation); m_bTimeStation=255; } //设置定时器 m_bTimeStation=TIME_PASS+m_wCurrentUser; SetTimer(m_bTimeStation,TIME_COUNT);*/ } return true; }
//用户出牌 bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true; if (wChairID!=m_wCurrentUser) return false; //类型判断 BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount); if (bCardType==CT_INVALID) return false; //更随出牌 if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount; else if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false; //删除扑克 if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false; m_bCardCount[wChairID]-=bCardCount; //出牌记录 m_bTurnCardCount=bCardCount; m_bOutCardCount[wChairID]++; CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount); //切换用户 m_wTurnWiner=wChairID; if (m_bGameEnd[wChairID]<m_wPlayerCount-1) { if (bCardType!=CT_HAVE_D) { BYTE i = (m_wCurrentUser+1)%m_wPlayerCount; while(1) { if (i < GAME_PLAYER && m_bCardCount[i]>0) { m_wCurrentUser=i; break; } else i = (i++)%m_wPlayerCount; } } } else m_wCurrentUser=INVALID_CHAIR; m_PassIndex = 0; //构造数据 CMD_S_OutCard OutCard; OutCard.bCardCount=bCardCount; OutCard.wOutCardUser=wChairID; OutCard.wCurrentUser=m_wCurrentUser; CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE)); //发送数据 WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); //出牌最大 if (bCardType==CT_HAVE_D) m_bTurnCardCount=0; //结束判断 //if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL); if (m_bCardCount[wChairID] <= 0) { m_EndOrder++; m_bGameEnd[wChairID] = m_EndOrder; if (m_EndOrder >= m_wPlayerCount-1 || m_wCurrentUser == INVALID_CHAIR) { m_EndOrder = 0; OnEventGameEnd(wChairID,NULL,GER_NORMAL); } } return true; }
//叫分事件 bool CTableFrameSink::OnUserLandScore(WORD wChairID, BYTE bLandScore) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_WK_SCORE) return true; if (wChairID!=m_wCurrentUser) return false; //首叫状态 if(m_bBackCatchTag==FALSE && m_bLookCardTag==FALSE) { //效验参数 ASSERT(bLandScore==BACK_CATCH || bLandScore==LOOK_CARD); if(bLandScore!=BACK_CATCH && bLandScore!=LOOK_CARD)return false; //选择看牌 if(bLandScore==LOOK_CARD) { //设置变量 m_bLookCardTag=TRUE; //发送扑克 SendUserCard(); } //选择闷抓 else { //设置变量 m_bBackCatchTag=TRUE; //确定庄家 m_wBankerUser = wChairID; //积分翻倍 m_wBombTime*=2; //下位叫分 m_wCurrentUser=(wChairID+1)%m_wPlayerCount; } //继续询问 BYTE bCurrentState=((bLandScore==LOOK_CARD)?CALL_BANKER:CALL_SCORE); WORD wBankerUser=((bLandScore==LOOK_CARD)?INVALID_CHAIR:m_wBankerUser); SendUserInfoData(wChairID,bLandScore,m_wCurrentUser,bCurrentState,wBankerUser); } //叫庄状态 else if(m_wBankerUser==INVALID_CHAIR) { //效验参数 ASSERT(bLandScore==MING_CATCH || bLandScore==NULL); if(bLandScore!=MING_CATCH && bLandScore!=NULL)return false; //用户状态 ASSERT(m_bCallBanker[wChairID] == FALSE); if(m_bCallBanker[wChairID] != FALSE)return false; //设置变量 if(bLandScore==MING_CATCH)m_bCallBanker[wChairID] = 2*TRUE; else m_bCallBanker[wChairID] = TRUE; //判断次数 bool bFullTimes = false; WORD i=0; for(i=0;i<m_wPlayerCount;i++) if(m_bCallBanker[i] == FALSE) break; if(i==m_wPlayerCount)bFullTimes=true; //判断开始 if(bFullTimes || bLandScore==MING_CATCH) { //确定庄家 if(bLandScore==MING_CATCH) { m_wBankerUser = wChairID; //开始出牌 if(bFullTimes) { SendUserInfoData(wChairID,bLandScore,INVALID_CHAIR,0,m_wBankerUser); UserStartOutCard(); } //询问叫分 else { //插入底牌 m_bCardCount[m_wBankerUser]=20; CopyMemory(&m_bHandCardData[m_wBankerUser][17],m_bBackCard,sizeof(m_bBackCard)); m_GameLogic.SortCardList(m_bHandCardData[m_wBankerUser],m_bCardCount[m_wBankerUser],ST_ORDER); //开始叫分+客户端插入底牌 m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount; BYTE bCurrentState = 0x10+CALL_SCORE; SendUserInfoData(wChairID,bLandScore,m_wCurrentUser,bCurrentState,m_wBankerUser); } } else { //游戏结束 OnEventGameEnd(INVALID_CHAIR,NULL,GER_DISMISS); } return true; } //询问下位 m_wCurrentUser = (m_wCurrentUser+1)%m_wPlayerCount; ASSERT(m_bCallBanker[m_wCurrentUser] != TRUE); // oma add // TODO // 下一个用户闷抓或者看牌 //构造数据 CMD_S_CallBanker CallBanker; ZeroMemory(&CallBanker,sizeof(CallBanker)); CallBanker.wCurrentUser = m_wCurrentUser; m_bBackCatchTag = FALSE; // 复位闷抓看牌标志 m_bLookCardTag = FALSE; m_pITableFrame->SendTableData( INVALID_CHAIR, SUB_S_CHOICE_LOOK, &CallBanker, sizeof( CallBanker ) ); m_pITableFrame->SendLookonData( INVALID_CHAIR, SUB_S_CHOICE_LOOK, &CallBanker, sizeof( CallBanker ) ); // oma add ok // //继续询问 //SendUserInfoData(wChairID,bLandScore,m_wCurrentUser,CALL_BANKER,INVALID_CHAIR); } //叫分状态 else { //效验参数 ASSERT(m_bCallScoreTimes[wChairID]<MAX_CALL_TIMES); ASSERT(bLandScore==DOUBLE_SCORE || bLandScore==0); if(m_bCallScoreTimes[wChairID]>=MAX_CALL_TIMES)return false; if(bLandScore!=DOUBLE_SCORE && bLandScore!=0)return false; //设置变量 if(bLandScore==0)m_bCallScoreTag[wChairID] = TRUE; else m_bCallScoreTimes[wChairID]++; if(m_bCallScoreTimes[wChairID]==MAX_CALL_TIMES)m_bCallScoreTag[wChairID] = TRUE; //判断开始 bool bStartOut=(m_bCallScoreTag[m_wBankerUser]==TRUE)?true:false; if(!bStartOut && bLandScore==0 && m_wBankerUser!=wChairID) { WORD wUser1 = m_wPlayerCount-m_wBankerUser-wChairID; if(m_bCallScoreTag[wUser1]==TRUE && m_bCallScoreTimes[wUser1]<MAX_CALL_TIMES) bStartOut=true; WORD wUser2 = (m_wBankerUser+1)%m_wPlayerCount; if(!bStartOut && m_bLookCardTag==TRUE && wUser2==wChairID && m_bCallScoreTimes[wUser2]==0 && m_bCallBanker[wUser1]==TRUE) bStartOut=true; } //开始出牌 if(bStartOut) { if(bLandScore==DOUBLE_SCORE) { SendUserInfoData(wChairID,bLandScore,INVALID_CHAIR,0,INVALID_CHAIR); } //发送扑克 SendUserCard(); //开始出牌 UserStartOutCard(); return true; } //下位玩家 WORD wNextUser = INVALID_CHAIR; for(WORD i=1;i<m_wPlayerCount;i++) { wNextUser = (wChairID+i)%m_wPlayerCount; if(m_bCallScoreTag[wNextUser]!=TRUE)break; } //当前用户 ASSERT(wNextUser<m_wPlayerCount && m_bCallScoreTimes[wNextUser]<MAX_CALL_TIMES); m_wCurrentUser = wNextUser; //继续询问 BYTE bCallScoreState=((m_bCallScoreTimes[m_wCurrentUser]==0)?CALL_SCORE:CALL_TWO_SCORE); SendUserInfoData(wChairID,bLandScore,m_wCurrentUser,bCallScoreState,INVALID_CHAIR); } return true; }
//用户出牌 bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true; if (wChairID!=m_wCurrentUser) return false; //类型判断 BYTE bCardType; //是否有赖子 if(m_GameLogic.IsHadRoguishCard(bCardData,bCardCount)) { bCardType=m_GameLogic.GetMagicCardType(bCardData,bCardCount); //BYTE bTempCard[21]; //CopyMemory(bTempCard,bCardData,bCardCount); //for(int i=0;i<bCardCount;i++) //{ // if(bTempCard[i]==0x43) // bTempCard[i]=m_bMagicCard; //} //m_GameLogic.SortCardList(bTempCard,bCardCount); //更随出牌 //if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount; //else if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false; ////出牌记录 //m_bTurnCardCount=bCardCount; //m_bOutCardCount[wChairID]++; //CopyMemory(m_bTurnCardData,bTempCard,sizeof(BYTE)*bCardCount); //炸弹判断 //if ((bCardType==CT_BOMB_CARD)||(bCardType==CT_MISSILE_CARD)) m_wBombTime*=2; } else { bCardType=m_GameLogic.GetCardType(bCardData,bCardCount); } if (bCardType==CT_INVALID) return false; //更随出牌 if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount; else if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false; //出牌记录 m_bTurnCardCount=bCardCount; m_bOutCardCount[wChairID]++; //炸弹判断 if ((bCardType==CT_BOMB_CARD)||(bCardType==CT_MISSILE_CARD)) m_wBombTime*=4; if(bCardType==CT_BOMB_SOFT) m_wBombTime*=2; CopyMemory(m_bTurnCardData,bCardData,bCardCount); //删除扑克 if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false; m_bCardCount[wChairID]-=bCardCount; //出牌记录 m_bTurnCardCount=bCardCount; m_bOutCardCount[wChairID]++; CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount); //切换用户 m_wTurnWiner=wChairID; if (m_bCardCount[wChairID]!=0) { if (bCardType!=CT_MISSILE_CARD) m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount; } else m_wCurrentUser=INVALID_CHAIR; //构造数据 CMD_S_OutCard OutCard; OutCard.bCardCount=bCardCount; OutCard.wOutCardUser=wChairID; OutCard.wCurrentUser=m_wCurrentUser; CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE)); //发送数据 WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); //出牌最大 if (bCardType==CT_MISSILE_CARD) m_bTurnCardCount=0; //结束判断 if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL); return true; }
//用户出牌 bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_RF_PLAYING) return true; if (wChairID!=m_wCurrentUser) return false; //删除扑克 if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false; m_bCardCount[wChairID]-=bCardCount; //出牌记录 m_bTurnCardCount = bCardCount; CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount); m_sTurnCardType = m_GameLogic.GetCardType(m_bTurnCardData,m_bTurnCardCount); //切换用户 if(m_bCardCount[wChairID]==0&&(m_bCardCount[(wChairID+2)%m_wPlayerCount]==0)) { m_wCurrentUser=INVALID_CHAIR; } else { if(m_sTurnCardType!=(((short(17))<<8)|CT_FOUR_KING)) m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount; while(m_bCardCount[m_wCurrentUser]==0) m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount; } if(m_bCardCount[wChairID]==0) { m_bRanKing[m_bMark]=wChairID; m_bMark++; m_wTurnWiner=m_wCurrentUser; CMD_S_MESSAGE message; TCHAR *szBuffer[3]={"一","二","三"}; IServerUserItem * pIServerUserItem=m_pITableFrame->GetServerUserItem(wChairID); _sntprintf(message.szBuffer,sizeof(message.szBuffer), "%-s 第%s个出完牌",pIServerUserItem->GetUserData()->szAccounts,szBuffer[m_bMark-1]); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SYSTEM_MESSAGE,&message,sizeof(message)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SYSTEM_MESSAGE,&message,sizeof(message)); } else m_wTurnWiner=wChairID; //构造数据 CMD_S_OutCard OutCard; OutCard.bCardCount=bCardCount; OutCard.wOutCardUser=wChairID; OutCard.wCurrentUser=m_wCurrentUser; CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE)); //发送数据 WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); //发送对家扑克 if(m_bCardCount[wChairID]==0&&m_wCurrentUser!=INVALID_CHAIR) { CMD_S_CARD SCard; SCard.wFromUser=(wChairID+2)%m_wPlayerCount; SCard.bCardCount=m_bCardCount[SCard.wFromUser]; CopyMemory(SCard.bCardData,m_bHandCardData[SCard.wFromUser],SCard.bCardCount); m_pITableFrame->SendTableData(wChairID,SUB_S_CARD,&SCard,sizeof(SCard)); } if(m_bCardCount[(wChairID+2)%m_wPlayerCount]==0&&m_wCurrentUser!=INVALID_CHAIR) { CMD_S_CARD SCard; SCard.wFromUser=wChairID; SCard.bCardCount=m_bCardCount[SCard.wFromUser]; CopyMemory(SCard.bCardData,m_bHandCardData[wChairID],SCard.bCardCount); m_pITableFrame->SendTableData((wChairID+2)%m_wPlayerCount,SUB_S_CARD,&SCard,sizeof(SCard)); } //结束判断 if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL); return true; }
//用户出牌 bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount) { //效验状态 ASSERT(m_pITableFrame->GetGameStatus()==GS_WK_PLAYING); ASSERT(wChairID==m_wCurrentUser); if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true; if (wChairID!=m_wCurrentUser) return false; //类型判断 BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount); if (bCardType==CT_INVALID) return false; //庄家设置 m_wBankerUser=wChairID; //更随出牌 if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount; else if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false; //删除扑克 if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false; m_bCardCount[wChairID]-=bCardCount; //出牌记录 m_bTurnCardCount=bCardCount; CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount); //计分牌型统计 if(m_GameLogic.IsXi(m_bTurnCardData,m_bTurnCardCount)) m_bUserOutCardInfo[wChairID].bXiCard+=m_bTurnCardCount; if(m_GameLogic.IsOx(m_bTurnCardData,m_bTurnCardCount)) m_bUserOutCardInfo[wChairID].bOxCard+=m_bTurnCardCount; if(m_GameLogic.IsXiBaoLiang(m_bTurnCardData,m_bTurnCardCount)) m_bUserOutCardInfo[wChairID].bXiCard+=4; if(m_GameLogic.GetCardType(m_bTurnCardData,m_bTurnCardCount)==CT_LIANGZI) m_bUserOutCardInfo[wChairID].bLiangPai+=2; //////////////////////////////////////////////////////////////////// //切换用户 bool bNewTurn=false; if (m_bCardCount[wChairID]!=0) { m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount; if(m_wCurrentUser==m_wFirstUser) { m_wCurrentUser=m_wBankerUser; m_wFirstUser=m_wBankerUser; bNewTurn=true; for(BYTE i=0;i<m_bTurnCardCount;i++) m_bZhanPaiData[m_wBankerUser].Add(m_bTurnCardData[i]); } } //构造数据 CMD_S_OutCard OutCard; ZeroMemory(&OutCard,sizeof(CMD_S_OutCard)); if(bNewTurn) { CopyMemory(&OutCard.bZhanPaiData,m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount); CopyMemory(&OutCard.bCardData,m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount); ZeroMemory(m_bTurnCardData,sizeof(m_bTurnCardData)); m_bTurnCardCount=0; } else { CopyMemory(&OutCard.bCardData,m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount); } OutCard.bCardCount=bCardCount; OutCard.wOutCardUser=wChairID; OutCard.wCurrentUser=m_wCurrentUser; OutCard.bNewTurn=bNewTurn; //发送数据 WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); //判断结束 BYTE bZhanPaiCount=0; for(BYTE j=0;j<GAME_PLAYER;j++) { bZhanPaiCount+=m_bZhanPaiData[j].GetSize(); } if(bZhanPaiCount>=16) OnEventGameEnd(wChairID,NULL,GER_NORMAL); return true; }
//加注事件 bool CTableFrameSink::OnUserAddGold(WORD wChairID, LONG lGold, bool bCancel) { //效验 if( m_bGameEnd ) { m_pITableFrame->KillGameTimer(IDI_GAME_END); return OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL); } //设置数据 if (bCancel==false) { //效验数据 ASSERT(m_wCurrentUser==wChairID); if (m_wCurrentUser!=wChairID) return false; ASSERT( !m_bShowHand && lGold >= m_lTurnBasicGold && lGold <= m_lTurnMaxGold || lGold+m_lTableGold[wChairID*2+1]==m_lUserScore[wChairID] ); if( (m_bShowHand || lGold < m_lTurnBasicGold || lGold > m_lTurnMaxGold) && lGold+m_lTableGold[wChairID*2+1]!=m_lUserScore[wChairID] ) return false; m_lTableGold[wChairID*2]=lGold; if( !m_bShowHand && m_lTableGold[wChairID*2]+m_lTableGold[wChairID*2+1] == m_lUserScore[wChairID] ) m_bShowHand = true; } //操作次数 bool bFinishTurn=false; WORD wNextUser=INVALID_CHAIR; for (WORD i=0;i<m_wPlayerCount-1;i++) { m_wOperaCount++; wNextUser=(m_wCurrentUser+i+1)%m_wPlayerCount; if (m_cbPlayStatus[wNextUser]==TRUE) break; } //判断下注 if (m_wOperaCount>=m_wPlayerCount) { LONG lTableGold=0L; for (WORD i=0;i<m_wPlayerCount;i++) { if (m_cbPlayStatus[i]==TRUE) { lTableGold=m_lTableGold[i*2]; break; } } while (i<m_wPlayerCount) { if (m_cbPlayStatus[i]==TRUE) { if( !m_bShowHand&&m_lTableGold[i*2]!=lTableGold || m_bShowHand&&m_lTableGold[i*2]+m_lTableGold[i*2+1]<m_lUserScore[i] ) break; } i++; } if (i==m_wPlayerCount) bFinishTurn=true; } //一轮判断 if (bFinishTurn==true) { //发送数据 CMD_S_AddGold GoldResult; GoldResult.lCurrentLessGold=0L; GoldResult.wLastChairID=wChairID; GoldResult.wCurrentUser=INVALID_CHAIR; GoldResult.lLastAddGold=m_lTableGold[wChairID*2]; GoldResult.bShowHand = m_bShowHand; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult)); //累计金币 for (WORD i=0;i<m_wPlayerCount;i++) { m_lTableGold[i*2+1]+=m_lTableGold[i*2]; m_lTableGold[i*2]=0L; } //开始一轮 if (m_bSendCardCount<5) { //设置变量 m_wOperaCount=0; m_lTurnBasicGold=0L; WORD wLastMostUser = EstimateWinner(1,m_bSendCardCount-1); BYTE bySourceCount = m_bSendCardCount; if( m_bShowHand ) m_bSendCardCount = MAX_COUNT; else m_bSendCardCount++; //发送扑克 CMD_R_SendCard SendCard; ZeroMemory( &SendCard,sizeof(SendCard) ); for (WORD i=0;i<m_wPlayerCount;i++) { if (m_cbPlayStatus[i]==FALSE) continue; m_cbCardCount[i]=m_bSendCardCount; //派发扑克 for (BYTE j=0;j<(m_bSendCardCount-bySourceCount);j++) { ASSERT(j<CountArray(SendCard.bUserCard[i])); SendCard.bUserCard[i][j]=m_cbHandCardData[i][bySourceCount+j]; } } m_wCurrentUser=EstimateWinner(1,m_bSendCardCount-1); m_lTurnMaxGold = m_bSendCardCount>=3?m_lMaxGold:m_lMaxGold/2L; //发送消息 SendCard.wCurrentUser=(m_bShowHand?INVALID_CHAIR:m_wCurrentUser); SendCard.wStartChairId = wLastMostUser; SendCard.cbSendCardCount = m_bSendCardCount-bySourceCount; SendCard.lMaxGold=m_lTurnMaxGold; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard)); //结束游戏 if ( m_bSendCardCount == 5 && m_lMaxGold <= m_lTableGold[m_wCurrentUser*2+1] ) { m_bGameEnd = true; m_cbGameEndReason = GER_NORMAL; m_pITableFrame->SetGameTimer(IDI_GAME_END,3000,1,0); } } else { m_bGameEnd = true; m_cbGameEndReason = GER_NORMAL; m_pITableFrame->SetGameTimer(IDI_GAME_END,2000,1,0); } } else { //设置变量 m_wCurrentUser=wNextUser; m_lTurnBasicGold=__max(m_lTableGold[wChairID*2],m_lTurnBasicGold); //发送数据 CMD_S_AddGold AddGold; AddGold.wLastChairID=wChairID; AddGold.wCurrentUser=m_wCurrentUser; AddGold.lCurrentLessGold=m_lTurnBasicGold; AddGold.lLastAddGold=m_lTableGold[wChairID*2]; AddGold.bShowHand = m_bShowHand; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold)); } if( m_wCurrentUser != INVALID_CHAIR ) m_pITableFrame->SetGameTimer( IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser ); return true; }
//加注事件 bool CTableFrameSink::OnUserAddScore(WORD wChairID, LONG lScore, bool bGiveUp) { //校验用户 ASSERT(m_wCurrentUser==wChairID); if (m_wCurrentUser!=wChairID) return false; //校验金币 ASSERT((lScore +m_lTotalScore[wChairID])<= m_lUserMaxScore[wChairID]); if ((lScore+m_lTotalScore[wChairID])>m_lUserMaxScore[wChairID]) return false; ASSERT(lScore>=0L); if ((lScore<0)) return false; //累计金币 m_lTableScore[wChairID] += lScore; m_lTotalScore[wChairID] += lScore; //平衡下注 if(m_lTableScore[wChairID] > m_lBalanceScore ) { m_lBalanceScore = m_lTableScore[wChairID]; } //梭哈判断 if(m_lTotalScore[wChairID]==m_lUserMaxScore[wChairID]) { m_cbShowHand[wChairID] = TRUE; } //用户切换 WORD wNextPlayer=INVALID_CHAIR; for (WORD i=1;i<m_wPlayerCount;i++) { //设置变量 m_wOperaCount++; wNextPlayer=(m_wCurrentUser+i)%m_wPlayerCount; //继续判断 if ((m_cbPlayStatus[wNextPlayer]==TRUE) &&(m_cbShowHand[wNextPlayer] == FALSE)) break; } ASSERT(wNextPlayer < m_wPlayerCount); //完成判断 bool bFinishTurn=false; if (m_wOperaCount>=m_wPlayerCount) { WORD i=0; for ( i=0;i<m_wPlayerCount;i++) { //过滤未平衡 和未梭哈用户 if ((m_cbPlayStatus[i]==TRUE)&&(m_lTableScore[i]<m_lBalanceScore)&&(m_cbShowHand[i]==FALSE)) break; } if (i==m_wPlayerCount) bFinishTurn=true; } //A家show190,B放弃,C还选择? if(!bFinishTurn) { WORD wPlayCount = 0,wShowCount = 0; for (BYTE i=0;i<m_wPlayerCount;i++) { if(m_cbPlayStatus[i]==TRUE) { if(m_cbShowHand[i]==TRUE) { wShowCount++; } wPlayCount++; } } if(wPlayCount-1==wShowCount && m_lTableScore[wNextPlayer]>=m_lBalanceScore) bFinishTurn=true; } //继续加注 if (!bFinishTurn) { //当前用户 m_wCurrentUser=wNextPlayer; //最小值为平衡下注 -桌面下注 和 剩余金币中取小 可能梭哈 m_lTurnLessScore = min(m_lBalanceScore - m_lTableScore[m_wCurrentUser],m_lUserMaxScore[m_wCurrentUser] - m_lTotalScore[m_wCurrentUser]); m_lTurnMaxScore = m_lUserMaxScore[m_wCurrentUser]-m_lTotalScore[m_wCurrentUser]; if(m_lTotalScore[m_wCurrentUser]==m_lCellScore) { LONG bTemp = (m_lBalanceScore==m_lCellScore*2)?(m_lCellScore*2):((m_lBalanceScore-m_lCellScore*2)*2); m_lAddLessScore = m_lCellScore+bTemp; } else m_lAddLessScore = (m_lBalanceScore==0)?(2*m_lCellScore):(__max((m_lBalanceScore-m_lTableScore[m_wCurrentUser])*2,2L*m_lCellScore)); //构造数据 CMD_S_AddScore AddScore; ZeroMemory(&AddScore,sizeof(AddScore)); AddScore.lAddScoreCount=lScore; AddScore.wAddScoreUser=wChairID; AddScore.wCurrentUser=m_wCurrentUser; AddScore.lTurnLessScore=m_lTurnLessScore; AddScore.lTurnMaxScore = m_lTurnMaxScore; AddScore.lAddLessScore = m_lAddLessScore; //发送数据 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore)); return true; } //平衡次数 m_cbBalanceCount++; m_wOperaCount=0; //第1次下注平衡后就开始发给三张公牌 //第2次下注平衡后就开始发第四张公牌 //第3次下注平衡后就开始发第五张公牌 //第4次下注平衡后就结束游戏 //D家下注 WORD wDUser=m_wDUser; for(BYTE i=0;i<GAME_PLAYER;i++) { wDUser=(m_wDUser+i)%GAME_PLAYER; if(m_cbPlayStatus[wDUser]==TRUE && m_cbShowHand[wDUser]==FALSE) break; } //重值变量 m_lBalanceScore = 0L; m_lTurnLessScore = 0L; m_lTurnMaxScore = m_lUserMaxScore[wDUser]-m_lTotalScore[wDUser]; m_lAddLessScore = 2*m_lCellScore; //构造数据 CMD_S_AddScore AddScore; ZeroMemory(&AddScore,sizeof(AddScore)); AddScore.wAddScoreUser=wChairID; AddScore.wCurrentUser=INVALID_CHAIR; AddScore.lAddScoreCount=lScore; AddScore.lTurnLessScore=m_lTurnLessScore; AddScore.lTurnMaxScore = m_lTurnMaxScore; AddScore.lAddLessScore = m_lAddLessScore; //清理数据 ZeroMemory(m_lTableScore,sizeof(m_lTableScore)); m_lBalanceScore = 0L; //发送数据 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore)); //结束判断 if (m_cbBalanceCount == 4) { OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL); return true; } //梭哈用户统计 WORD wShowHandCount=0,wPlayerCount=0; for (WORD i=0;i<m_wPlayerCount;i++) { if (m_cbShowHand[i]==TRUE) wShowHandCount++; if (m_cbPlayStatus[i]==TRUE) wPlayerCount++; } //只剩一玩家没梭或者全梭 if((wShowHandCount >= wPlayerCount -1) && m_cbBalanceCount < 4) { //构造数据 CMD_S_SendCard SendCard; ZeroMemory(&SendCard,sizeof(SendCard)); SendCard.cbPublic = m_cbBalanceCount; SendCard.wCurrentUser = INVALID_CHAIR; SendCard.cbSendCardCount = MAX_CENTERCOUNT; CopyMemory(SendCard.cbCenterCardData,m_cbCenterCardData,sizeof(BYTE)*MAX_CENTERCOUNT); //发送数据 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard)); //结束游戏 OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL); return true; } //盲注玩家 for (WORD i=0;i<GAME_PLAYER;i++) { //临时变量 BYTE cbNextUser =(m_wDUser+i)%GAME_PLAYER; //获取用户 IServerUserItem * pIServerUserItem=m_pITableFrame->GetServerUserItem(cbNextUser); //无效用户 梭哈用户过滤 if (pIServerUserItem==NULL||m_cbPlayStatus[cbNextUser] == FALSE||m_cbShowHand[cbNextUser] == 1) continue; m_wCurrentUser = cbNextUser; break; } //构造数据 CMD_S_SendCard SendCard; ZeroMemory(&SendCard,sizeof(SendCard)); SendCard.cbPublic = 0; SendCard.wCurrentUser = m_wCurrentUser; SendCard.cbSendCardCount = 3 +(m_cbBalanceCount-1); CopyMemory(SendCard.cbCenterCardData,m_cbCenterCardData,sizeof(BYTE)*(SendCard.cbSendCardCount)); //发送数据 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard)); return true; }
//放弃事件 bool CTableFrameSink::OnUserGiveUp(WORD wChairID) { //状态判断 ASSERT(m_cbPlayStatus[wChairID]==TRUE); if (m_cbPlayStatus[wChairID]==FALSE) return false; //效验 if( m_bGameEnd ) { m_pITableFrame->KillGameTimer(IDI_GAME_END); return OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL); } //设置数据 m_cbPlayStatus[wChairID]=FALSE; m_cbCardCount[wChairID]=0; //重新获取最大下注 if( m_lUserScore[wChairID] == m_lMaxGold ) { for( WORD i = 0; i < GAME_PLAYER; i ++ ) { if( !m_cbPlayStatus[i] ) continue; m_lMaxGold = m_lUserScore[i]; break; } for( ; i < GAME_PLAYER; i++ ) { if( m_cbPlayStatus[i] ) m_lMaxGold = __min(m_lMaxGold,m_lUserScore[i]); } } m_lTurnMaxGold = m_bSendCardCount>=3?m_lMaxGold:m_lMaxGold/2L; //发送放弃消息 CMD_S_GiveUp GiveUp; GiveUp.wUserChairID=wChairID; GiveUp.lTurnMaxGold = m_lTurnMaxGold; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp)); //变量定义 LONG lScore=0; LONG lRevenue=0; enScoreKind ScoreKind; //设置变量 ScoreKind=enScoreKind_Lost; lScore=-m_lTableGold[wChairID*2]-m_lTableGold[wChairID*2+1]; //用户写分 m_pITableFrame->WriteUserScore(wChairID,lScore,lRevenue,ScoreKind); //判断结束 WORD wPlayerCount=0; for (WORD i=0;i<m_wPlayerCount;i++) { if (m_cbPlayStatus[i]==TRUE) wPlayerCount++; } if (wPlayerCount>=2) { if (m_wCurrentUser==wChairID) OnUserAddGold(wChairID,0L,true); } else OnEventGameEnd(INVALID_CHAIR,NULL,GER_NO_PLAYER); return true; }
//用户出牌 bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_RF_PLAYING) return true; if (wChairID!=m_wCurrentUser) return false; //类型判断 BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount); if (bCardType==CT_ERROR) return false; //首出判断 if ((wChairID==m_wBankerUser)&&(m_bCardCount[wChairID]==13)) { for (BYTE i=0;i<bCardCount;i++) { if (bCardData[i]==0x03) break; } if (i==bCardCount) return false; } //更随出牌 if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount; else if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false; //删除扑克 if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false; m_bCardCount[wChairID]-=bCardCount; //大牌判断 bool bMostest=false; if ((bCardCount<=3)&&(bCardData[0]==0x32)) bMostest=true; //出牌记录 m_bTurnCardCount=bCardCount; CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount); //切换用户 m_wTurnWiner=wChairID; if (m_bCardCount[wChairID]!=0) { if (bMostest==false) m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount; } else m_wCurrentUser=INVALID_CHAIR; //构造数据 CMD_S_OutCard OutCard; OutCard.bCardCount=bCardCount; OutCard.wOutCardUser=wChairID; OutCard.wCurrentUser=m_wCurrentUser; CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE)); //发送数据 WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); //出牌最大 if (bMostest==true) m_bTurnCardCount=0; //结束判断 if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL); return true; }
//定时器事件 bool __cdecl CTableFrameSink::OnTimerMessage(WORD wTimerID, WPARAM wBindParam) { switch (wTimerID) { case IDI_FREE: //空闲时间结束 { //开始游戏 m_pITableFrameControl->StartGame(); //启动下注计时器 m_pITableFrame->SetGameTimer(IDI_PLACE_JETTON,TIME_PLACE_JETTON*1000,1,0L); //设置游状态为下注阶段 m_pITableFrame->SetGameStatus(GS_PLACE_JETTON); return true; } case IDI_PLACE_JETTON: //下注时间结束 { //状态判断(防止强退重复设置) if (m_pITableFrame->GetGameStatus()!=GS_GAME_END) { //设置状态 m_pITableFrame->SetGameStatus(GS_GAME_END); //结束游戏 OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL); //设置时间 m_pITableFrame->SetGameTimer(IDI_GAME_END,TIME_GAME_END*1000,1,0L); } return true; } case IDI_GAME_END: //结束游戏 { //写入积分 for ( WORD wUserChairID = 0; wUserChairID < GAME_PLAYER; ++wUserChairID ) { IServerUserItem *pIServerUserItem = m_pITableFrame->GetServerUserItem(wUserChairID); if ( pIServerUserItem == NULL ) continue; //胜利类型 enScoreKind ScoreKind=(m_iUserWinScore[wUserChairID]>0L)?enScoreKind_Win:enScoreKind_Lost; //写入积分 if (m_iUserWinScore[wUserChairID]!=0L) m_pITableFrame->WriteUserScore(wUserChairID,m_iUserWinScore[wUserChairID], m_iUserRevenue[wUserChairID], ScoreKind); //坐庄条件判断。一轮游戏结束,玩家有输有赢。所以需要在申请上庄队列里把输了钱不在满足做庄的玩家清除掉 __int64 iUserScore=pIServerUserItem->GetUserScore()->lScore; if (wUserChairID!=m_wCurrentBanker && iUserScore<m_iApplyBankerCondition) { for (WORD i=0; i<m_ApplyUserArray.GetCount(); ++i) { if (wUserChairID!=m_ApplyUserArray[i]) continue; //从庄家队列删除不符合上庄的玩家 m_ApplyUserArray.RemoveAt(i); //发送消息 CMD_S_CancelBanker CancelBanker; ZeroMemory(&CancelBanker,sizeof(CancelBanker)); //设置变量 lstrcpyn(CancelBanker.szCancelUser,pIServerUserItem->GetAccounts(),CountArray(CancelBanker.szCancelUser)); //发送消息 m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_CANCEL_BANKER, &CancelBanker, sizeof(CancelBanker)); m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_CANCEL_BANKER, &CancelBanker, sizeof(CancelBanker)); //提示消息 TCHAR szTipMsg[128]; _sntprintf(szTipMsg,CountArray(szTipMsg),TEXT("由于你的金币数少于坐庄必须金币数(%I64d),你自动下庄!"),m_iApplyBankerCondition); SendGameMessage(wUserChairID,szTipMsg); break; } } } //结束游戏 m_pITableFrame->ConcludeGame(); //切换庄家 ChangeBanker(false); //设置时间 m_dwJettonTime=(DWORD)time(NULL); m_pITableFrame->SetGameTimer(IDI_FREE,TIME_FREE*1000,1,0L); //发送消息 CMD_S_GameFree GameFree; ZeroMemory(&GameFree,sizeof(GameFree)); GameFree.cbTimeLeave=TIME_FREE; GameFree.cbGameRecord = m_iGoalAnimal; GameFree.iGameTimes = m_iGameTimes; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_FREE,&GameFree,sizeof(GameFree)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_FREE,&GameFree,sizeof(GameFree)); return true; } } return false; }
//用户胡牌 bool CTableFrameSink::OnUserHu( WORD wChairID, const void *pDataBuffer) { //效验状态 if( m_pITableFrame->GetGameStatus() != GS_WK_PLAYING ) { MessageBox( NULL, "GS_WK_PLAYING", 0, 0 ); return false; } CMD_C_Hu *hu = ( CMD_C_Hu * )pDataBuffer; //权限效验 if( m_ActionRight[wChairID] < hu->nRight ) { return false; } m_strFang= new char[300]; int userCount = 0; //操作者数 for( int i=0; i<m_wPlayerCount; i++ ) { //跳过自已,和出牌者 if( i==wChairID || i==m_wCurrentUser ) continue; //if( m_ActionRight[i]>6 ) //{ // MessageBox( 0,"有一炮多响", 0, 0 ); // //break; // //等待,可能有多人胡 //} //胡处理 else { userCount ++; m_ActionRight[i] = 0; if( userCount == 2 ) { //玩家结算 m_wTurnWiner= wChairID; //赢家 //自摸 if( m_byHandMjs[wChairID][HAND_MJ_MAX-1] != 0 ) { //天胡 if(m_bTianHu) { strcpy(m_strFang, "天胡 +9番"); m_nFang[wChairID] = 9; return OnEventGameEnd( wChairID, NULL, GER_NORMAL ); } //地胡 if(m_bDiHu[wChairID]) { strcpy(m_strFang, "地胡 +9番"); m_nFang[wChairID] = 9; return OnEventGameEnd( wChairID, NULL, GER_NORMAL ); } m_bZiM= true; int huType = m_GameLogic.IsHu( m_byHandMjs[wChairID], m_byHandMjCount[wChairID]-1, m_byHandMjs[wChairID][HAND_MJ_MAX-1], m_hu[wChairID], &m_tempHu[wChairID]); if( huType== 1) { m_nFang[wChairID] = m_GameLogic.CheckGDHu( m_tempHu[wChairID], m_GameLogic.TransIDToFeng( wChairID, m_wBankerUser), m_wQFeng, m_strFang ); strcat( m_strFang, "自摸 +1番" ); //自摸 +1番 if( m_nFang[wChairID]<5) { m_nFang[wChairID]+= 1; } } else { //九莲灯 if( huType-20 == 9 ) { strcpy(m_strFang, "九莲宝灯 +9番,"); m_nFang[wChairID] = 9; } //十三幺 else if( huType-20== 13) { strcpy( m_strFang, "十三幺 +9番,"); m_nFang[wChairID] = 9; } } } //有人放炮 else { if(m_bRenHu[wChairID]) { strcpy(m_strFang, "人胡 +9番"); m_nFang[wChairID] = 9; return OnEventGameEnd( wChairID, NULL, GER_NORMAL ); } m_wLastUser= m_wCurrentUser; //输家 int huType = m_GameLogic.IsHu( m_byHandMjs[wChairID], m_byHandMjCount[wChairID], m_byOutMj, m_hu[wChairID], &m_tempHu[wChairID]); if( huType== 1) { m_nFang[wChairID] = m_GameLogic.CheckGDHu( m_tempHu[wChairID], m_GameLogic.TransIDToFeng( wChairID, m_wBankerUser), m_wQFeng, m_strFang ); } else { //九莲灯 if( huType-20 == 9 ) { strcpy(m_strFang, "九莲宝灯 +9番,"); m_nFang[wChairID] = 9; } //十三幺 else if( huType-20== 13) { strcpy( m_strFang, "十三幺 +9番,"); m_nFang[wChairID] = 9; } } } ////自摸 //if( m_byHandMjs[wChairID][HAND_MJ_MAX-1] != 0 ) //{ // // //for( int i=0; i<m_wPlayerCount; i++) // //{ // // if( i==wChairID) // // continue; // // else // // m_nFang[i] -= m_nFang[wChairID]; // //} //} ////有人放炮 //else //{ // // //m_nFang[m_wCurrentUser] -= m_nFang[wChairID]; //} //胡牌处理 return OnEventGameEnd( wChairID, NULL, GER_NORMAL ); } } } return true; }
//用户出牌 bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount) { //效验状态 if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true; if (wChairID!=m_wCurrentUser) return false; //类型判断 BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount); if (bCardType==CT_INVALID) return false; //更随出牌 if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount; else { //防作弊 //守八一 if(m_bCardCount[wChairID]>1) { if(m_bCardCount[wChairID]-bCardCount<1) return false; //最后一张不能为2 else if(m_bCardCount[wChairID]-bCardCount==2 || m_bCardCount[wChairID]-bCardCount==1) { if(m_GameLogic.IsCardTwoOwner(m_bHandCardData[wChairID],m_bCardCount[wChairID])) { if(!m_GameLogic.IsCardTwoOwner(bCardData,bCardCount)) return false; } } } if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false; } //删除扑克 if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false; m_bCardCount[wChairID]-=bCardCount; //出牌记录 m_bTurnCardCount=bCardCount; //报八一 if( m_bCardCount[wChairID]==1 ) { CMD_S_EightOne EightOne; EightOne.wEightOneUser=wChairID; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_EIGHT_ONE,&EightOne,sizeof(EightOne)); } m_bOutCardCount[wChairID]++; CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount); //炸弹判断 // if ((bCardType==CT_BOMB_CARD)||(bCardType==CT_MISSILE_CARD)) m_wBombTime*=2; //切换用户 m_wTurnWiner=wChairID; if (m_bCardCount[wChairID]!=0) { m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount; } else m_wCurrentUser=INVALID_CHAIR; //构造数据 CMD_S_OutCard OutCard; OutCard.bCardCount=bCardCount; OutCard.wOutCardUser=wChairID; OutCard.wCurrentUser=m_wCurrentUser; CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE)); //发送数据 WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); ////出牌最大 //if (bCardType==CT_MISSILE_CARD) m_bTurnCardCount=0; //结束判断 if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL); return true; }
//用户出牌 bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE cbCardData[], BYTE cbCardCount, bool bIsHandOut[],bool bIsAutoOut) { //效验状态 ASSERT(m_pITableFrame->GetGameStatus()==GS_UG_PLAY); if (m_pITableFrame->GetGameStatus()!=GS_UG_PLAY) return true; //效验用户 if(bIsHandOut[wChairID]==false) { ASSERT((wChairID==m_wCurrentUser)&&(cbCardCount<=MAX_COUNT)); if ((wChairID!=m_wCurrentUser)||(cbCardCount>MAX_COUNT)) return false; } else { ASSERT((cbCardCount<=MAX_COUNT)); if (cbCardCount>MAX_COUNT) return false; if (!bIsAutoOut) wChairID=(m_wBankerUser+2)%m_wPlayerCount; } //首出牌者 if (m_wFirstOutUser==wChairID) { //类型判断 BYTE cbCardType=m_GameLogic.GetCardType(cbCardData,cbCardCount); if (cbCardType==CT_ERROR||cbCardType!=CT_SINGLE) return false; } else { //数目判断 ASSERT(cbCardCount==m_cbOutCardCount[m_wFirstOutUser]); if (cbCardCount!=m_cbOutCardCount[m_wFirstOutUser]) return false; //出牌效验 if (m_GameLogic.EfficacyOutCard(cbCardData,cbCardCount,m_cbOutCardData[m_wFirstOutUser], m_cbOutCardCount[m_wFirstOutUser],m_cbHandCardData[wChairID],m_cbHandCardCount[wChairID])==false) { ASSERT(FALSE); return false; } } //删除扑克 if (m_GameLogic.RemoveCard(cbCardData,cbCardCount,m_cbHandCardData[wChairID],m_cbHandCardCount[wChairID])==false) return false; m_cbHandCardCount[wChairID]-=cbCardCount; //出牌记录 m_cbOutCardCount[wChairID]=cbCardCount; CopyMemory(m_cbOutCardData[wChairID],cbCardData,cbCardCount); //切换用户 m_wCurrentUser=(wChairID+1)%m_wPlayerCount; if (m_wCurrentUser==m_wFirstOutUser) m_wCurrentUser=INVALID_CHAIR; if (m_wCurrentUser!=INVALID_CHAIR) { //轮到明手出牌 if(m_wCurrentUser==(m_wBankerUser+2)%GAME_PLAYER) { bHandOutFlag[m_wBankerUser]=true; } } //构造数据 CMD_S_OutCard OutCard; OutCard.wOutCardUser=wChairID; OutCard.cbCardCount=cbCardCount; OutCard.wCurrentUser=m_wCurrentUser; OutCard.bHandOutCardCount=m_cbHandCardCount[(m_wBankerUser+2)%m_wPlayerCount]; //OutCard.bHandOutCardData=m_cbHandCardData[(m_wBankerUser+2)%m_wPlayerCount]; CopyMemory(OutCard.bHandOutCardData,m_cbHandCardData[(m_wBankerUser+2)%m_wPlayerCount],sizeof(m_cbHandCardData[(m_wBankerUser+2)%m_wPlayerCount])); CopyMemory(OutCard.cbCardData,cbCardData,cbCardCount*sizeof(BYTE)); CopyMemory(OutCard.bHandOutFlag,bHandOutFlag,sizeof(bHandOutFlag)); //发送数据 //WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.cbCardData)+OutCard.cbCardCount*sizeof(BYTE); //m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); //m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,sizeof(OutCard)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,sizeof(OutCard)); //一轮结算 if (m_wCurrentUser==INVALID_CHAIR) { //判断胜者 m_wTurnWinner=m_GameLogic.CompareCardArray(m_cbOutCardData,m_cbOutCardCount[0],m_wFirstOutUser); //计算得分 if ((m_wTurnWinner!=m_wBankerUser)&&((m_wTurnWinner+2)%m_wPlayerCount!=m_wBankerUser)) //庄家和对家 { m_cbValueOrder[1]+=1; } else { m_cbValueOrder[0]+=1; } //设置变量 if (m_cbHandCardCount[m_wTurnWinner]!=0) { m_wFirstOutUser=m_wTurnWinner; ZeroMemory(m_cbOutCardData,sizeof(m_cbOutCardData)); ZeroMemory(m_cbOutCardCount,sizeof(m_cbOutCardCount)); } ZeroMemory(bHandOutFlag,sizeof(bHandOutFlag)); //用户切换 m_wCurrentUser=(m_cbHandCardCount[m_wTurnWinner]==0)?INVALID_CHAIR:m_wTurnWinner; //设置明手 if (m_wCurrentUser!=INVALID_CHAIR) { //轮到明手出牌 if(m_wCurrentUser==(m_wBankerUser+2)%GAME_PLAYER) { bHandOutFlag[m_wBankerUser]=true; } } //构造数据 CMD_TurnBalance TurnBalance; TurnBalance.wTurnWinner=m_wTurnWinner; TurnBalance.wCurrentUser=m_wCurrentUser; TurnBalance.bBankerScore=m_cbValueOrder[0]; TurnBalance.bOtherScore=m_cbValueOrder[1]; CopyMemory(TurnBalance.bHandOutFlag,bHandOutFlag,sizeof(bHandOutFlag)); //发送数据 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_TURN_BALANCE,&TurnBalance,sizeof(TurnBalance)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_TURN_BALANCE,&TurnBalance,sizeof(TurnBalance)); } //结束判断 if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(m_wTurnWinner,NULL,GER_NORMAL); return true; }