#include "StdAfx.h" #include "TableFrameSink.h" ////////////////////////////////////////////////////////////////////////////////// #define IDI_CHECK_TABLE 1 //检查桌子 #define IDI_USER_OUT_TIME 6 //玩家超时 //构造函数 CTableFrameSink::CTableFrameSink() { //组件变量 m_pITableFrame=NULL; m_pGameCustomRule=NULL; m_pGameServiceOption=NULL; m_pGameServiceAttrib=NULL; m_bOffLineTrustee = false; //炸弹变量 m_wFirstUser=INVALID_CHAIR; m_wBankerUser=INVALID_CHAIR; m_wCurrentUser=INVALID_CHAIR; ZeroMemory(m_cbOutCardCount,sizeof(m_cbOutCardCount)); for (byte i = 0; i < GAME_PLAYER; i++) { m_bUserTrustee[i] = false; } //游戏变量 m_wTimerControl=0; m_cbBombCount=0; ZeroMemory(m_cbEachBombCount,sizeof(m_cbEachBombCount)); ZeroMemory(m_aryOverTime, sizeof(m_aryOverTime)); //叫分信息 m_cbBankerScore=0; ZeroMemory(m_cbScoreInfo,sizeof(m_cbScoreInfo)); m_cbCallScoreCount=0; //出牌信息 m_cbTurnCardCount=0; m_wTurnWiner=INVALID_CHAIR; ZeroMemory(m_cbTurnCardData,sizeof(m_cbTurnCardData)); //扑克信息 ZeroMemory(m_cbBankerCard,sizeof(m_cbBankerCard)); ZeroMemory(m_cbHandCardData,sizeof(m_cbHandCardData)); ZeroMemory(m_cbHandCardCount,sizeof(m_cbHandCardCount)); //服务控制 m_hControlInst = NULL; m_pServerControl = NULL; m_hControlInst = LoadLibrary(TEXT("LandServerControl.dll")); if ( m_hControlInst ) { typedef void * (*CREATE)(); CREATE ServerControl = (CREATE)GetProcAddress(m_hControlInst,"CreateServerControl"); if ( ServerControl ) { m_pServerControl = static_cast(ServerControl()); } } ZeroMemory(&m_PrivateEndInfo, sizeof(CMD_S_Private_End_Info)); return; } //析构函数 CTableFrameSink::~CTableFrameSink() { if( m_pServerControl ) { delete m_pServerControl; m_pServerControl = NULL; } if( m_hControlInst ) { FreeLibrary(m_hControlInst); m_hControlInst = NULL; } } //接口查询 VOID * CTableFrameSink::QueryInterface(REFGUID Guid, DWORD dwQueryVer) { QUERYINTERFACE(ITableFrameSink,Guid,dwQueryVer); QUERYINTERFACE(ITableUserAction,Guid,dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(ITableFrameSink,Guid,dwQueryVer); return NULL; } //复位桌子 VOID CTableFrameSink::RepositionSink() { //游戏变量 m_cbBombCount=0; m_wBankerUser=INVALID_CHAIR; m_wCurrentUser=INVALID_CHAIR; ZeroMemory(m_cbOutCardCount,sizeof(m_cbOutCardCount)); ZeroMemory(m_cbEachBombCount,sizeof(m_cbEachBombCount)); ZeroMemory(m_aryOverTime, sizeof(m_aryOverTime)); for (byte i = 0; i < GAME_PLAYER; i++) { m_bUserTrustee[i] = false; } //叫分信息 m_cbBankerScore=0; ZeroMemory(m_cbScoreInfo,sizeof(m_cbScoreInfo)); m_cbCallScoreCount=0; //出牌信息 m_cbTurnCardCount=0; m_wTurnWiner=INVALID_CHAIR; ZeroMemory(m_cbTurnCardData,sizeof(m_cbTurnCardData)); //扑克信息 ZeroMemory(m_cbBankerCard,sizeof(m_cbBankerCard)); ZeroMemory(m_cbHandCardData,sizeof(m_cbHandCardData)); ZeroMemory(m_cbHandCardCount,sizeof(m_cbHandCardCount)); return; } //配置桌子 bool CTableFrameSink::Initialization(IUnknownEx * pIUnknownEx) { //查询接口 m_pITableFrame=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,ITableFrame); //错误判断 if (m_pITableFrame==NULL) { CTraceService::TraceString(TEXT("游戏桌子 CTableFrameSink 查询 ITableFrame 接口失败"),TraceLevel_Exception); return false; } //开始模式 m_pITableFrame->SetStartMode(START_MODE_FULL_READY); //游戏配置 m_pGameServiceAttrib=m_pITableFrame->GetGameServiceAttrib(); m_pGameServiceOption=m_pITableFrame->GetGameServiceOption(); //自定规则 ASSERT(m_pITableFrame->GetCustomRule()!=NULL); m_pGameCustomRule=(tagCustomRule *)m_pITableFrame->GetCustomRule(); m_bOffLineTrustee = CServerRule::IsAllowOffLineTrustee(m_pGameServiceOption->dwServerRule); return true; } //消费能力 SCORE CTableFrameSink::QueryConsumeQuota(IServerUserItem * pIServerUserItem) { return 0L; } //最少积分 SCORE CTableFrameSink::QueryLessEnterScore(WORD wChairID, IServerUserItem * pIServerUserItem) { return 0L; } //游戏开始 bool CTableFrameSink::OnEventGameStart() { //出牌信息 m_cbTurnCardCount=0; m_wTurnWiner=INVALID_CHAIR; ZeroMemory(m_cbTurnCardData,sizeof(m_cbTurnCardData)); //设置状态 m_pITableFrame->SetGameStatus(GAME_SCENE_CALL); srand(GetTickCount() + m_pITableFrame->GetTableID()); //混乱扑克 BYTE cbRandCard[FULL_COUNT]; m_GameLogic.RandCardList(cbRandCard,CountArray(cbRandCard)); // #ifdef _DEBUG //0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D, 方块 //0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D, 梅花 //0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D, 红桃 //0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D, 黑桃 //BYTE cbTempRandCard[FULL_COUNT]= //{ // 0x11,0x11,0x1D,0x0C,0x0B,0x0A,0x0A,0x09,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05, //0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, //0x29,0x2A,0x2B,0x2C,0x2D,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, //0x05,0x05,0x04, //}; //CopyMemory(cbRandCard, cbTempRandCard, sizeof(cbRandCard)); #endif //比赛房间随机第一个随机叫分 if ((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)!=0 ) { m_wFirstUser = INVALID_CHAIR; } //抽取明牌 BYTE cbValidCardData=0; BYTE cbValidCardIndex=0; WORD wStartUser=m_wFirstUser; WORD wCurrentUser=m_wFirstUser; //抽取玩家 if (wStartUser==INVALID_CHAIR) { //抽取扑克 cbValidCardIndex=rand()%DISPATCH_COUNT; cbValidCardData=cbRandCard[cbValidCardIndex]; //设置用户 wStartUser=m_GameLogic.GetCardValue(cbValidCardData)%GAME_PLAYER; wCurrentUser=(wStartUser+cbValidCardIndex/NORMAL_COUNT)%GAME_PLAYER; } #ifdef DEBUG //WORD wChairID = INVALID_CHAIR; ////找到作弊玩家的位置 //for (BYTE i = 0; i < GAME_PLAYER; i++) //{ // //获取玩家信息 // IServerUserItem *pServerUserItem = m_pITableFrame->GetTableUserItem(i); // if (pServerUserItem != NULL && pServerUserItem->GetGameID()==100984) // { // wChairID = i; // break; // } //} //if (wChairID != INVALID_CHAIR) //{ // //获取好牌 // BYTE cbGoodCard[NORMAL_COUNT] = { 0 }; // m_GameLogic.GetGoodCardData(cbGoodCard); // //先把牌库中的牌删除 // bool bRemoveSuccess = m_GameLogic.RemoveCardEx(cbGoodCard, NORMAL_COUNT, cbRandCard, CountArray(cbRandCard)); // if (bRemoveSuccess ) // { // memmove(&cbRandCard[(wChairID + 1)*NORMAL_COUNT], &cbRandCard[wChairID*NORMAL_COUNT], FULL_COUNT - (wChairID + 1)*NORMAL_COUNT); // CopyMemory(&cbRandCard[wChairID*NORMAL_COUNT], cbGoodCard, NORMAL_COUNT); // } //} #endif // DEBUG //机器人数据 CMD_S_AndroidCard AndroidCard ; ZeroMemory(&AndroidCard, sizeof(AndroidCard)) ; //用户扑克 for (WORD i=0;i=m_cbHandCardCount[i]); CopyMemory(GameStart.cbCardData,m_cbHandCardData[i],sizeof(BYTE)*m_cbHandCardCount[i]); //发送数据 IServerUserItem *pServerUserItem = m_pITableFrame->GetTableUserItem(i) ; if(!pServerUserItem->IsAndroidUser()) { m_pITableFrame->SendTableData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart)); m_pITableFrame->SendLookonData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart)); } else { m_pITableFrame->SendTableData(i,SUB_S_GAME_START,&AndroidCard,sizeof(AndroidCard)); m_pITableFrame->SendLookonData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart)); } } // 录像开始; starGameRecord(); // 记录开始消息; CMD_Record_GameStart recordStart; recordStart.wStartUser = wStartUser; recordStart.wCurrentUser = wCurrentUser; addGameRecordAction(SUB_S_GAME_START, &recordStart, sizeof(CMD_Record_GameStart)); //WB改 SendCheatCard(); //排列扑克 for (WORD i=0;iKillGameTimer(IDI_USER_OUT_TIME); switch (cbReason) { case GER_NORMAL: //常规结束 { //变量定义 CMD_S_GameConclude GameConclude; ZeroMemory(&GameConclude,sizeof(GameConclude)); //设置变量 GameConclude.cbBankerScore=m_cbBankerScore; GameConclude.lCellScore=m_pITableFrame->GetCellScore(); //炸弹信息 GameConclude.cbBombCount=m_cbBombCount; CopyMemory(GameConclude.cbEachBombCount,m_cbEachBombCount,sizeof(GameConclude.cbEachBombCount)); //用户扑克 BYTE cbCardIndex=0; for (WORD i=0;iwMaxScoreTimes,lScoreTimes); if (IsHasGameRule(eDDZRuleEnum_LimitMultiple8)) { lScoreTimes = __min(8, lScoreTimes); } //农民托管数量 WORD wTrusteeCount=0; if ((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)!=0) { for(WORD i = 0; i < GAME_PLAYER; i++) { if (i!=m_wBankerUser) { if (m_bUserTrustee[i]) { wTrusteeCount++; } } } } //积分变量 tagScoreInfo ScoreInfoArray[GAME_PLAYER]; ZeroMemory(&ScoreInfoArray,sizeof(ScoreInfoArray)); //统计积分 for (WORD i=0;iGetCellScore(); bool bTrusteeUser = m_bUserTrustee[i]; //积分基数 if (i==m_wBankerUser) { lUserScore=(m_cbHandCardCount[m_wBankerUser]==0)?2L:-2L; } else { if (m_cbHandCardCount[m_wBankerUser]==0) { if (wTrusteeCount>0) lUserScore=(bTrusteeUser==true)?(-2L/wTrusteeCount):0L; else lUserScore=-1L; } else { if (wTrusteeCount>0) lUserScore=(bTrusteeUser==true)?0L:(2L/wTrusteeCount); else lUserScore=1L; } } //计算积分 ScoreInfoArray[i].lScore=lUserScore*lCellScore*lScoreTimes; ScoreInfoArray[i].cbType=(ScoreInfoArray[i].lScore>=0L)?SCORE_TYPE_WIN:SCORE_TYPE_LOSE; //计算税收 ScoreInfoArray[i].lRevenue=m_pITableFrame->CalculateRevenue(i,ScoreInfoArray[i].lScore); if (ScoreInfoArray[i].lRevenue>0L) ScoreInfoArray[i].lScore-=ScoreInfoArray[i].lRevenue; //设置积分 GameConclude.lGameScore[i]=ScoreInfoArray[i].lScore; //历史积分 m_HistoryScore.OnEventUserScore(i,GameConclude.lGameScore[i]); } for (WORD i = 0; i < GAME_PLAYER; i++) { // 总积分; IServerUserItem* pServerUserItem = m_pITableFrame->GetTableUserItem(i); if (pServerUserItem) { GameConclude.lAllScore[i] = pServerUserItem->GetUserScore() + GameConclude.lGameScore[i]; } } //发送数据 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_CONCLUDE,&GameConclude,sizeof(GameConclude)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_CONCLUDE,&GameConclude,sizeof(GameConclude)); // 记录游戏结束消息; addGameRecordAction(SUB_S_GAME_CONCLUDE, &GameConclude, sizeof(GameConclude)); /********************************私人场统计****************************************/ tagPrivateFrameRecordInfo* pPrivateRecord = m_pITableFrame->GetPrivateFrameRecord(); BYTE cbFinishCout = pPrivateRecord->cbFinishCout; //统计积分明细 for (WORD i = 0; i < GAME_PLAYER; i++) { if (cbFinishCout < 16) { m_PrivateEndInfo.lDetails[i][cbFinishCout] = GameConclude.lGameScore[i]; } } // 完成局数 m_PrivateEndInfo.cbFinishCout = cbFinishCout + 1; m_pITableFrame->addPrivatePlayCout(1); /********************************私人场统计****************************************/ //牌局结束后,每8局增加一点经验值; if (IsPrivateEnd()) { tagPrivateFrameParameter* pPrivateFrame = m_pITableFrame->GetPrivateFrameInfo(); SCORE lGrade = pPrivateFrame->dwPlayCost; for (WORD i = 0; i < GAME_PLAYER; i++) { ScoreInfoArray[i].lGrade = lGrade; } } //写入积分; DataStream kDataStream; m_kGameRecord.StreamValue(kDataStream, true); m_pITableFrame->WriteTableScore(ScoreInfoArray, CountArray(ScoreInfoArray), kDataStream); //切换用户 m_wFirstUser=wChairID; //结束游戏 m_pITableFrame->ConcludeGame(GAME_SCENE_FREE); return true; } case GER_DISMISS: //游戏解散 { //变量定义 CMD_S_GameConclude GameConclude; ZeroMemory(&GameConclude,sizeof(GameConclude)); //用户扑克 BYTE cbCardIndex=0; for (WORD i=0;iGetTableUserItem(i); if (pServerUserItem) { GameConclude.lAllScore[i] = pServerUserItem->GetUserScore() + GameConclude.lGameScore[i]; } } //发送信息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_CONCLUDE,&GameConclude,sizeof(GameConclude)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_CONCLUDE,&GameConclude,sizeof(GameConclude)); //结束游戏 m_pITableFrame->ConcludeGame(GAME_SCENE_FREE); return true; } case GER_USER_LEAVE: //用户强退 case GER_NETWORK_ERROR: //网络中断 { if ((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)!=0) { if(m_bOffLineTrustee) { IsOfflineTrustee(); return true; } } //变量定义 CMD_S_GameConclude GameConclude; ZeroMemory(&GameConclude,sizeof(GameConclude)); //设置变量 GameConclude.cbBankerScore=m_cbBankerScore; GameConclude.lCellScore=m_pITableFrame->GetCellScore(); //炸弹信息 GameConclude.cbBombCount=m_cbBombCount; CopyMemory(GameConclude.cbEachBombCount,m_cbEachBombCount,sizeof(GameConclude.cbEachBombCount)); //用户扑克 BYTE cbCardIndex=0; for (WORD i=0;iwMaxScoreTimes,lScoreTimes); //积分变量 tagScoreInfo ScoreInfoArray[GAME_PLAYER]; ZeroMemory(&ScoreInfoArray,sizeof(ScoreInfoArray)); //变量定义 SCORE lCellScore=m_pITableFrame->GetCellScore(); SCORE lUserScore = lCellScore*m_pGameCustomRule->wFleeScoreTimes; //SCORE lUserScore=lCellScore*__max(lScoreTimes,m_pGameCustomRule->wFleeScoreTimes); ////金币平衡 //if ((m_pGameServiceOption->wServerType&SCORE_GENRE_POSITIVE)!=0 || (m_pGameServiceOption->wServerType&(GAME_GENRE_GOLD|GAME_GENRE_EDUCATE))!=0) //{ // lUserScore=__min(pIServerUserItem->GetUserScore(),lUserScore); //} //逃跑罚分 ScoreInfoArray[wChairID].lScore=-lUserScore; ScoreInfoArray[wChairID].cbType=SCORE_TYPE_FLEE; //分享罚分 if (m_pGameCustomRule->cbFleeScorePatch==TRUE) { for (WORD i=0;iCalculateRevenue(i,ScoreInfoArray[i].lScore); if (ScoreInfoArray[i].lRevenue>0L) ScoreInfoArray[i].lScore-=ScoreInfoArray[i].lRevenue; } } //历史积分 for (WORD i=0;iGetTableUserItem(i); if (pServerUserItem) { GameConclude.lAllScore[i] = pServerUserItem->GetUserScore() + GameConclude.lGameScore[i]; } } //发送信息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_CONCLUDE,&GameConclude,sizeof(GameConclude)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_CONCLUDE,&GameConclude,sizeof(GameConclude)); // 记录游戏结束消息; addGameRecordAction(SUB_S_GAME_CONCLUDE, &GameConclude, sizeof(GameConclude)); //写入积分; DataStream kDataStream; m_kGameRecord.StreamValue(kDataStream, true); m_pITableFrame->WriteTableScore(ScoreInfoArray, CountArray(ScoreInfoArray), kDataStream); //结束游戏 m_pITableFrame->ConcludeGame(GAME_SCENE_FREE); return true; } } //错误断言 ASSERT(FALSE); return false; } //发送场景 bool CTableFrameSink::OnEventSendGameScene(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbGameStatus, bool bSendSecret) { switch (cbGameStatus) { case GAME_SCENE_FREE: //空闲状态 { //构造数据 CMD_S_StatusFree StatusFree; ZeroMemory(&StatusFree,sizeof(StatusFree)); //设置变量 StatusFree.lCellScore=m_pITableFrame->GetCellScore(); //自定规则 StatusFree.cbTimeOutCard=m_pGameCustomRule->cbTimeOutCard; StatusFree.cbTimeCallScore=m_pGameCustomRule->cbTimeCallScore; StatusFree.cbTimeStartGame=m_pGameCustomRule->cbTimeStartGame; StatusFree.cbTimeHeadOutCard=m_pGameCustomRule->cbTimeHeadOutCard; //历史积分 for (WORD i=0;ilTurnScore; StatusFree.lCollectScore[i]=pHistoryScore->lCollectScore; } //发送场景 return m_pITableFrame->SendGameScene(pIServerUserItem,&StatusFree,sizeof(StatusFree)); } case GAME_SCENE_CALL: //叫分状态 { //构造数据 CMD_S_StatusCall StatusCall; ZeroMemory(&StatusCall,sizeof(StatusCall)); //单元积分 StatusCall.lCellScore=m_pITableFrame->GetCellScore(); //自定规则 StatusCall.cbTimeOutCard=m_pGameCustomRule->cbTimeOutCard; StatusCall.cbTimeCallScore=m_pGameCustomRule->cbTimeCallScore; StatusCall.cbTimeStartGame=m_pGameCustomRule->cbTimeStartGame; StatusCall.cbTimeHeadOutCard=m_pGameCustomRule->cbTimeHeadOutCard; //游戏信息 StatusCall.wCurrentUser=m_wCurrentUser; StatusCall.cbBankerScore=m_cbBankerScore; CopyMemory(StatusCall.cbScoreInfo,m_cbScoreInfo,sizeof(m_cbScoreInfo)); CopyMemory(StatusCall.cbHandCardData,m_cbHandCardData[wChairID],m_cbHandCardCount[wChairID]*sizeof(BYTE)); //历史积分 for (WORD i=0;ilTurnScore; StatusCall.lCollectScore[i]=pHistoryScore->lCollectScore; } //发送场景 bool bSendResult = m_pITableFrame->SendGameScene(pIServerUserItem,&StatusCall,sizeof(StatusCall)); if(pIServerUserItem) { //作弊用户 if (CUserRight::IsGameCheatUser(pIServerUserItem->GetUserRight())) { OnCheatCard(pIServerUserItem); } } return bSendResult; } case GAME_SCENE_PLAY: //游戏状态 { //构造数据 CMD_S_StatusPlay StatusPlay; ZeroMemory(&StatusPlay,sizeof(StatusPlay)); //单元积分 StatusPlay.lCellScore=m_pITableFrame->GetCellScore(); //游戏变量 StatusPlay.cbBombCount=m_cbBombCount; StatusPlay.wBankerUser=m_wBankerUser; StatusPlay.wCurrentUser=m_wCurrentUser; StatusPlay.cbBankerScore=m_cbBankerScore; //自定规则 StatusPlay.cbTimeOutCard=m_pGameCustomRule->cbTimeOutCard; StatusPlay.cbTimeCallScore=m_pGameCustomRule->cbTimeCallScore; StatusPlay.cbTimeStartGame=m_pGameCustomRule->cbTimeStartGame; StatusPlay.cbTimeHeadOutCard=m_pGameCustomRule->cbTimeHeadOutCard; //出牌信息 StatusPlay.wTurnWiner=m_wTurnWiner; StatusPlay.cbTurnCardCount=m_cbTurnCardCount; CopyMemory(StatusPlay.cbTurnCardData,m_cbTurnCardData,m_cbTurnCardCount*sizeof(BYTE)); //扑克信息 CopyMemory(StatusPlay.cbBankerCard,m_cbBankerCard,sizeof(m_cbBankerCard)); CopyMemory(StatusPlay.cbHandCardCount,m_cbHandCardCount,sizeof(m_cbHandCardCount)); CopyMemory(StatusPlay.cbHandCardData,m_cbHandCardData[wChairID],sizeof(BYTE)*m_cbHandCardCount[wChairID]); //历史积分 for (WORD i=0;ilTurnScore; StatusPlay.lCollectScore[i]=pHistoryScore->lCollectScore; } //发送场景 bool bSendResult = m_pITableFrame->SendGameScene(pIServerUserItem,&StatusPlay,sizeof(StatusPlay)); if(pIServerUserItem) { //作弊用户 if(CUserRight::IsGameCheatUser(pIServerUserItem->GetUserRight())) { OnCheatCard(pIServerUserItem); } } return bSendResult; } } //错误断言 ASSERT(FALSE); return false; } //时间事件 bool CTableFrameSink::OnTimerMessage(DWORD wTimerID, WPARAM wBindParam) { if (!m_bOffLineTrustee) { return false; } if (wTimerID == IDI_USER_OUT_TIME) { m_pITableFrame->KillGameTimer(IDI_USER_OUT_TIME); if (m_wCurrentUser == INVALID_CHAIR) return true; bool bTrusteeUser = m_bUserTrustee[m_wCurrentUser]; if ((!bTrusteeUser)&&(++m_aryOverTime[m_wCurrentUser] >= m_pGameCustomRule->cbOverTimeTrustee)) { OnUserTrustee(m_wCurrentUser, true); } BYTE cbGameStatus = m_pITableFrame->GetGameStatus(); switch (cbGameStatus) { case GAME_SCENE_CALL: { if (m_cbBankerScore == 0) OnUserCallScore(m_wCurrentUser, 0x01); else OnUserCallScore(m_wCurrentUser, 0xFF); break; } case GAME_SCENE_PLAY: { if (m_cbTurnCardCount == 0) { tagSearchCardResult SearchCardResult; m_GameLogic.SearchOutCard(m_cbHandCardData[m_wCurrentUser], m_cbHandCardCount[m_wCurrentUser], NULL, 0, &SearchCardResult); if (SearchCardResult.cbCardCount > 0) { OnUserOutCard(m_wCurrentUser, SearchCardResult.cbResultCard[0], SearchCardResult.cbCardCount[0]); } else { ASSERT(FALSE); } } else { OnUserPassCard(m_wCurrentUser); } break; } } return true; } return false; } //数据事件 bool CTableFrameSink::OnDataBaseMessage(WORD wRequestID, VOID * pData, WORD wDataSize) { return false; } //积分事件 bool CTableFrameSink::OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason) { return false; } //游戏消息 bool CTableFrameSink::OnGameMessage(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem) { m_cbWaitTime=0; switch (wSubCmdID) { case SUB_C_CALL_SCORE: //用户叫分 { //效验数据 ASSERT(wDataSize==sizeof(CMD_C_CallScore)); if (wDataSize!=sizeof(CMD_C_CallScore)) return false; //状态效验 //ASSERT(m_pITableFrame->GetGameStatus()==GAME_SCENE_CALL); if (m_pITableFrame->GetGameStatus()!=GAME_SCENE_CALL) return true; //用户效验 //ASSERT(pIServerUserItem->GetUserStatus()==US_PLAYING); if (pIServerUserItem->GetUserStatus()!=US_PLAYING) return true; //变量定义 CMD_C_CallScore * pCallScore=(CMD_C_CallScore *)pData; //消息处理 WORD wChairID=pIServerUserItem->GetChairID(); return OnUserCallScore(wChairID,pCallScore->cbCallScore); } case SUB_C_OUT_CARD: //用户出牌 { //变量定义 CMD_C_OutCard * pOutCard=(CMD_C_OutCard *)pData; WORD wHeadSize=sizeof(CMD_C_OutCard)-sizeof(pOutCard->cbCardData); //效验数据 ASSERT((wDataSize>=wHeadSize)&&(wDataSize==(wHeadSize+pOutCard->cbCardCount*sizeof(BYTE)))); if ((wDataSizecbCardCount*sizeof(BYTE)))) return false; //状态效验 //ASSERT(m_pITableFrame->GetGameStatus()==GAME_SCENE_PLAY); if (m_pITableFrame->GetGameStatus()!=GAME_SCENE_PLAY) return true; //用户效验 //ASSERT(pIServerUserItem->GetUserStatus()==US_PLAYING); if (pIServerUserItem->GetUserStatus()!=US_PLAYING) return true; //消息处理 WORD wChairID=pIServerUserItem->GetChairID(); return OnUserOutCard(wChairID,pOutCard->cbCardData,pOutCard->cbCardCount); } case SUB_C_PASS_CARD: //用户放弃 { //状态效验 //ASSERT(m_pITableFrame->GetGameStatus()==GAME_SCENE_PLAY); if (m_pITableFrame->GetGameStatus()!=GAME_SCENE_PLAY) return true; //用户效验 //ASSERT(pIServerUserItem->GetUserStatus()==US_PLAYING); if (pIServerUserItem->GetUserStatus()!=US_PLAYING) return true; //消息处理 return OnUserPassCard(pIServerUserItem->GetChairID()); } case SUB_C_TRUSTEE: { //效验数据 ASSERT(wDataSize==sizeof(CMD_C_TRUSTEE)); if (wDataSize!=sizeof(CMD_C_TRUSTEE)) return false; CMD_C_TRUSTEE* pCTrustee = (CMD_C_TRUSTEE*)pData; WORD wChairID = pIServerUserItem->GetChairID(); if (!pCTrustee->bTrustee) { m_aryOverTime[wChairID] = 0; } return OnUserTrustee(wChairID, pCTrustee->bTrustee); } } return false; } //框架消息 bool CTableFrameSink::OnFrameMessage(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem) { return false; } //重置私人场结束信息 void CTableFrameSink::ResetPrivateEndInfo() { ZeroMemory(&m_PrivateEndInfo, sizeof(CMD_S_Private_End_Info)); } //获得私人场结束信息流 void CTableFrameSink::GetPrivateEndInfo(DataStream &kDataStream, bool bSend) { for (WORD i = 0; i < GAME_PLAYER; i++) { // 总积分 IServerUserItem* pServerUserItem = m_pITableFrame->GetTableUserItem(i); if (pServerUserItem) { m_PrivateEndInfo.lAllScore[i] = pServerUserItem->GetUserScore(); } } m_PrivateEndInfo.StreamValue(kDataStream, bSend); } //判断私人场是否结束 bool CTableFrameSink::IsPrivateEnd() { ASSERT(m_pITableFrame != nullptr); if (m_pITableFrame == nullptr) return false; tagPrivateFrameParameter* pPrivateFrame = m_pITableFrame->GetPrivateFrameInfo(); tagPrivateFrameRecordInfo* pPrivateRecord = m_pITableFrame->GetPrivateFrameRecord(); if ((pPrivateFrame == nullptr) || (pPrivateRecord == nullptr)) return false; if (pPrivateFrame->cbGameCout <= pPrivateRecord->cbFinishCout) { return true; } return false; } bool CTableFrameSink::IsHasGameRule(eDDZRuleEnum eType) { ASSERT(m_pITableFrame != nullptr); if (m_pITableFrame == nullptr) return false; const tagPrivateFrameParameter* pPrivateFrame = m_pITableFrame->GetPrivateFrameInfo(); if (nullptr == pPrivateFrame) return false; return (pPrivateFrame->dwGameRule & eType)>0; } //用户断线 bool CTableFrameSink::OnActionUserOffLine(WORD wChairID, IServerUserItem * pIServerUserItem) { if(m_bOffLineTrustee && wChairID == m_wCurrentUser) { IsOfflineTrustee(); } return true; } //用户重入 bool CTableFrameSink::OnActionUserConnect(WORD wChairID, IServerUserItem * pIServerUserItem) { if(m_bOffLineTrustee) { if (((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)!=0)&&(pIServerUserItem->GetChairID()==m_wCurrentUser)) { m_pITableFrame->KillGameTimer(IDI_USER_OUT_TIME); } } return true; } //用户坐下 bool CTableFrameSink::OnActionUserSitDown(WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser) { //历史积分 if (bLookonUser==false) { ASSERT(wChairID!=INVALID_CHAIR); m_HistoryScore.OnEventUserEnter(wChairID); } return true; } //用户起立 bool CTableFrameSink::OnActionUserStandUp(WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser) { //历史积分 if (bLookonUser==false) { ASSERT(wChairID!=INVALID_CHAIR); m_HistoryScore.OnEventUserLeave(wChairID); } m_bUserTrustee[wChairID] = false; return true; } //用户托管; bool CTableFrameSink::OnUserTrustee(WORD wChairID, bool bTrustee) { CMD_S_TRUSTEE pSTrustee; pSTrustee.wTrusteeUser = wChairID; pSTrustee.bTrustee = bTrustee; m_bUserTrustee[wChairID] = bTrustee; m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_TRUSTEE, &pSTrustee, sizeof(CMD_S_TRUSTEE)); m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_TRUSTEE, &pSTrustee, sizeof(CMD_S_TRUSTEE)); return true; } //用户放弃 bool CTableFrameSink::OnUserPassCard(WORD wChairID) { //效验状态 ASSERT((wChairID==m_wCurrentUser)&&(m_cbTurnCardCount!=0)); if ((wChairID!=m_wCurrentUser)||(m_cbTurnCardCount==0)) return true; //设置变量 m_wCurrentUser=(m_wCurrentUser+1)%GAME_PLAYER; if (m_wCurrentUser == m_wTurnWiner) { m_cbTurnCardCount = 0; } //构造消息 CMD_S_PassCard PassCard; PassCard.wPassCardUser=wChairID; PassCard.wCurrentUser=m_wCurrentUser; PassCard.cbTurnOver=(m_cbTurnCardCount==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)); // 记录用户放弃消息; addGameRecordAction(SUB_S_PASS_CARD, &PassCard, sizeof(PassCard)); IsOfflineTrustee(); return true; } //用户叫分 bool CTableFrameSink::OnUserCallScore(WORD wChairID, BYTE cbCallScore) { //效验状态 ASSERT(wChairID==m_wCurrentUser); if (wChairID!=m_wCurrentUser) return true; //效验参数 //ASSERT(((cbCallScore>=1)&&(cbCallScore<=3)&&(cbCallScore>m_cbBankerScore))||(cbCallScore==255)); if (((cbCallScore<1)||(cbCallScore>3)||(cbCallScore<=m_cbBankerScore))&&(cbCallScore!=255)) cbCallScore = 255; //设置状态 if (cbCallScore!=0xFF) { m_cbBankerScore=cbCallScore; m_wBankerUser=m_wCurrentUser; } //设置叫分 m_cbScoreInfo[wChairID]=cbCallScore; //设置用户 if ((m_cbBankerScore==3)||(m_wFirstUser==(wChairID+1)%GAME_PLAYER)) { m_wCurrentUser=INVALID_CHAIR; } else { m_wCurrentUser=(wChairID+1)%GAME_PLAYER; } //构造变量 CMD_S_CallScore CallScore; CallScore.wCallScoreUser=wChairID; CallScore.wCurrentUser=m_wCurrentUser; CallScore.cbUserCallScore=cbCallScore; CallScore.cbCurrentScore=m_cbBankerScore; //发送消息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_CALL_SCORE,&CallScore,sizeof(CallScore)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_CALL_SCORE,&CallScore,sizeof(CallScore)); // 记录用户叫分消息; addGameRecordAction(SUB_S_CALL_SCORE, &CallScore, sizeof(CallScore)); //开始判断 if ((m_cbBankerScore==3)||(m_wFirstUser==(wChairID+1)%GAME_PLAYER)) { //无人叫分 if ( m_cbBankerScore == 0 ) { //if ((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)==0) //{ // if(m_cbCallScoreCount<2) // { // m_cbCallScoreCount++; // return OnEventGameStart(); // } //} if (TRUE==m_pGameCustomRule->cbAllNotCallResend) { return OnEventGameStart(); } m_wBankerUser=m_wFirstUser; m_cbBankerScore=1; } //设置状态 m_pITableFrame->SetGameStatus(GAME_SCENE_PLAY); //设置变量 if (m_cbBankerScore==0) m_cbBankerScore=1; if (m_wBankerUser==INVALID_CHAIR) m_wBankerUser=m_wFirstUser; m_cbCallScoreCount=0; //发送底牌 m_cbHandCardCount[m_wBankerUser]+=CountArray(m_cbBankerCard); CopyMemory(&m_cbHandCardData[m_wBankerUser][NORMAL_COUNT],m_cbBankerCard,sizeof(m_cbBankerCard)); //排列扑克 m_GameLogic.SortCardList(m_cbHandCardData[m_wBankerUser],m_cbHandCardCount[m_wBankerUser],ST_ORDER); //设置用户 m_wTurnWiner=m_wBankerUser; m_wCurrentUser=m_wBankerUser; //发送消息 CMD_S_BankerInfo BankerInfo; BankerInfo.wBankerUser=m_wBankerUser; BankerInfo.wCurrentUser=m_wCurrentUser; BankerInfo.cbBankerScore=m_cbBankerScore; CopyMemory(BankerInfo.cbBankerCard,m_cbBankerCard,sizeof(m_cbBankerCard)); //发送消息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_BANKER_INFO,&BankerInfo,sizeof(BankerInfo)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_BANKER_INFO,&BankerInfo,sizeof(BankerInfo)); // 记录用户叫分完成消息; addGameRecordAction(SUB_S_BANKER_INFO, &BankerInfo, sizeof(BankerInfo)); } IsOfflineTrustee(); return true; } //用户出牌 bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE cbCardData[], BYTE cbCardCount) { //效验状态 ASSERT(wChairID==m_wCurrentUser); if (wChairID!=m_wCurrentUser) return true; //获取类型 BYTE cbCardType=m_GameLogic.GetCardType(cbCardData,cbCardCount); //类型判断 if (cbCardType==CT_ERROR) { ASSERT(FALSE); return false; } //出牌判断 if (m_cbTurnCardCount!=0) { //对比扑克 if (m_GameLogic.CompareCard(m_cbTurnCardData,cbCardData,m_cbTurnCardCount,cbCardCount)==false) { ASSERT(FALSE); return false; } } //删除扑克 if (m_GameLogic.RemoveCardList(cbCardData,cbCardCount,m_cbHandCardData[wChairID],m_cbHandCardCount[wChairID])==false) { ASSERT(FALSE); return false; } //出牌变量 m_cbOutCardCount[wChairID]++; //设置变量 m_cbTurnCardCount=cbCardCount; m_cbHandCardCount[wChairID]-=cbCardCount; CopyMemory(m_cbTurnCardData,cbCardData,sizeof(BYTE)*cbCardCount); //炸弹判断 if ((cbCardType==CT_BOMB_CARD)||(cbCardType==CT_MISSILE_CARD)) { m_cbBombCount++; m_cbEachBombCount[wChairID]++; } //切换用户 m_wTurnWiner=wChairID; if (m_cbHandCardCount[wChairID]!=0) { if (cbCardType!=CT_MISSILE_CARD) { m_wCurrentUser=(m_wCurrentUser+1)%GAME_PLAYER; } } else { m_wCurrentUser = INVALID_CHAIR; } //构造数据 CMD_S_OutCard OutCard; OutCard.wOutCardUser=wChairID; OutCard.cbCardCount=cbCardCount; OutCard.wCurrentUser=m_wCurrentUser; CopyMemory(OutCard.cbCardData,m_cbTurnCardData,m_cbTurnCardCount*sizeof(BYTE)); //发送数据 WORD wHeadSize=sizeof(OutCard)-sizeof(OutCard.cbCardData); WORD wSendSize=wHeadSize+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); // 记录用户出牌消息; addGameRecordAction(SUB_S_OUT_CARD, &OutCard, wSendSize); //出牌最大 if (cbCardType == CT_MISSILE_CARD) { m_cbTurnCardCount = 0; } //结束判断 if (m_wCurrentUser == INVALID_CHAIR) { OnEventGameConclude(wChairID, NULL, GER_NORMAL); } else { IsOfflineTrustee(); } return true; } //作弊用户 bool CTableFrameSink::OnCheatCard(IServerUserItem * pIServerUserItem) { if(m_pServerControl) { CMD_S_CheatCard CheatCard ; ZeroMemory(&CheatCard, sizeof(CheatCard)); for(WORD i = 0; i < GAME_PLAYER; i++) { CheatCard.wCardUser[CheatCard.cbUserCount] = i; CheatCard.cbCardCount[CheatCard.cbUserCount] = m_cbHandCardCount[i]; CopyMemory(CheatCard.cbCardData[CheatCard.cbUserCount++],m_cbHandCardData[i],sizeof(BYTE)*m_cbHandCardCount[i]); } //发送作弊 //WB改 这里这样发包存在BUG //m_pITableFrame->SendTableData(wChairID,SUB_S_CHEAT_CARD,&CheatCard,sizeof(CheatCard)); //m_pITableFrame->SendLookonData(wChairID,SUB_S_CHEAT_CARD,&CheatCard,sizeof(CheatCard)); m_pServerControl->ServerControl(&CheatCard, m_pITableFrame, pIServerUserItem); } return true; } //发送作弊信息 void CTableFrameSink::SendCheatCard() { if(m_pServerControl) { CMD_S_CheatCard CheatCard ; ZeroMemory(&CheatCard, sizeof(CheatCard)); for(WORD i = 0; i < GAME_PLAYER; i++) { CheatCard.wCardUser[CheatCard.cbUserCount] = i; CheatCard.cbCardCount[CheatCard.cbUserCount] = m_cbHandCardCount[i]; CopyMemory(CheatCard.cbCardData[CheatCard.cbUserCount++],m_cbHandCardData[i],sizeof(BYTE)*m_cbHandCardCount[i]); } m_pServerControl->ServerControl(&CheatCard, m_pITableFrame); } return; } //设置基数 void CTableFrameSink::SetGameBaseScore(LONG lBaseScore) { //发送数据 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SET_BASESCORE,&lBaseScore,sizeof(lBaseScore)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SET_BASESCORE,&lBaseScore,sizeof(lBaseScore)); } //是否托管 bool CTableFrameSink::IsOfflineTrustee() { ////非比赛模式 //if((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)==0) return false; //非常规座位 if(m_wCurrentUser==INVALID_CHAIR) return false; //允许代打 if (m_bOffLineTrustee) { //删除超时定时器 m_pITableFrame->KillGameTimer(IDI_USER_OUT_TIME); //变量定义 bool bTrusteeUser = m_bUserTrustee[m_wCurrentUser]; DWORD dwTimerTime=3; if (bTrusteeUser==true) { dwTimerTime+=(rand()%3); } else { BYTE cbGameStatus=m_pITableFrame->GetGameStatus(); if (cbGameStatus==GAME_SCENE_CALL) { dwTimerTime=m_pGameCustomRule->cbTimeCallScore; } if (cbGameStatus==GAME_SCENE_PLAY) { if (m_cbTurnCardCount==0) dwTimerTime=m_pGameCustomRule->cbTimeHeadOutCard; else dwTimerTime=m_pGameCustomRule->cbTimeOutCard; } dwTimerTime+=(rand()%3+5); } m_pITableFrame->SetGameTimer(IDI_USER_OUT_TIME,dwTimerTime*1000,-1,NULL); return true; } return false; } /////////////////////////////// 游戏录像 /////////////////////////////////////////// void CTableFrameSink::addGameRecordAction(WORD wSubCmdID, void* pSubMessage, int nMessageSize) { tagGameRecordOperateResult kOperateRecord; kOperateRecord.wSubCmdID = wSubCmdID; kOperateRecord.subMessageData.pushValue(pSubMessage, nMessageSize); m_kGameRecord.actionVec.push_back(kOperateRecord); } void CTableFrameSink::starGameRecord() { m_kGameRecord = tagGameRecord(); m_kGameRecord.wBankerUser = m_wBankerUser; m_kGameRecord.wEastUser = 0; for (WORD i = 0; i < GAME_PLAYER; i++) { IServerUserItem* pUserItem = m_pITableFrame->GetTableUserItem(i); tagUserInfo* pUserInfo = pUserItem->GetUserInfo(); if (pUserItem == NULL || NULL == pUserInfo) { continue; } tagGameRecordPlayer kReocrdPlayer; kReocrdPlayer.dwUserID = pUserItem->GetUserID(); kReocrdPlayer.dwGameID = pUserItem->GetGameID(); kReocrdPlayer.wChairID = pUserItem->GetChairID(); kReocrdPlayer.cbSex = pUserItem->GetGender(); kReocrdPlayer.lScore = pUserItem->GetUserScore(); kReocrdPlayer.strHead = pUserInfo->szHeadHttp; kReocrdPlayer.strNickName = pUserItem->GetNickName(); for (BYTE j = 0; j < NORMAL_COUNT; j++) { kReocrdPlayer.cbCardData.push_back(m_cbHandCardData[i][j]); } m_kGameRecord.playersVec.push_back(kReocrdPlayer); } } //////////////////////////////////////////////////////////////////////////