void CTableFrameSink::CheckXijin() { for (int i=0; i<GAME_PLAYER; i++) { IServerUserItem * pIServerUserItem = m_pITableFrame->GetServerUserItem(i); if (pIServerUserItem == NULL || pIServerUserItem->IsAndroidUser()) continue; if(m_GameLogic.GetBestCardType(m_cbHandCardData[i], MAX_COUNT) >= 10) { m_oLog.Log("玩家[%s]获得喜金座位[%d]身上携带筹码[%d]获得奖励元宝数[%d]",pIServerUserItem->GetAccounts(), pIServerUserItem->GetChairID(), pIServerUserItem->GetUserScore()->lBodyChip, m_lLikeIngot); m_pITableFrame->SendTableData(i,SUB_S_XIJIN,NULL,0); m_pITableFrame->WriteUserTask(i,1,1,m_lLikeIngot); } } }
bool CTableFrameSink::OnHurryCard( WORD wChairID , WORD cbWords ) { CMD_S_HurryCard hurryCard; ZeroMemory(&hurryCard ,sizeof(hurryCard)); hurryCard.wCurrentUser = wChairID; hurryCard.cbWords = cbWords; for (INT i=0 ; i<GAME_PLAYER; i++) { IServerUserItem *pServerItem = m_pITableFrame->GetServerUserItem(i); if(pServerItem == NULL || pServerItem->IsAndroidUser()) continue; m_pITableFrame->SendTableData(i , SUB_S_HURRY_CARD , &hurryCard , sizeof(CMD_S_HurryCard)); } return true; }
bool CTableFrameSink::CheckUserContribution( WORD wChairID , LONGLONG lBuffer ) { IServerUserItem *pServerUserItem = m_pITableFrame->GetServerUserItem(wChairID) ; if(pServerUserItem == NULL) return false; if(pServerUserItem->IsAndroidUser()) return false; const tagUserScore *pUserScore = pServerUserItem->GetUserScore(); if(pUserScore->lInfullContribution/200 < lBuffer || pUserScore->lIngotContribution/200 < lBuffer) { m_oLog.LogWithoutTimeMark("检查元宝贡献度:%s 充值贡献度%I64d/200 元宝贡献度%I64d/200 元宝累计%I64d 不满足",pServerUserItem->GetNickName(),pUserScore->lInfullContribution ,pUserScore->lIngotContribution, lBuffer); return false; } m_oLog.LogWithoutTimeMark("检查元宝贡献度:%s 充值贡献度%I64d/200 元宝贡献度%I64d/200 元宝累计%I64d 满足",pServerUserItem->GetNickName(),pUserScore->lInfullContribution ,pUserScore->lIngotContribution, lBuffer); 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 (((bLandScore>3)&&(bLandScore!=255))||(bLandScore<=m_bLandScore)) return false; //设置变量 if (bLandScore!=255) { m_bLandScore=bLandScore; m_wBankerUser=m_wCurrentUser; } m_bScoreInfo[wChairID]=bLandScore; //开始判断 if ((m_bLandScore==3)||(m_wFirstUser==(wChairID+1)%m_wPlayerCount)) { //重新发牌 if (m_bLandScore==0) { BYTE cbSendGoodCard = rand() % GOOD_CARD_PERCENT ; BYTE cbAndroidUserCount=0 ; WORD wAndroidUser[GAME_PLAYER]={0}; //重置变量 ZeroMemory(m_bScoreInfo, sizeof(m_bScoreInfo)) ; //机器人个数 for(WORD wChairID=0; wChairID<GAME_PLAYER; ++wChairID) { IServerUserItem *pServerUserItem = m_pITableFrame->GetServerUserItem(wChairID) ; if(pServerUserItem->IsAndroidUser()) { wAndroidUser[cbAndroidUserCount] = (wChairID) ; ++cbAndroidUserCount ; } } WORD wHaveGoodCardAndroidUser = INVALID_CHAIR ; if(cbAndroidUserCount>0) wHaveGoodCardAndroidUser = wAndroidUser[rand()%cbAndroidUserCount] ; //发送好牌 if( 0 == cbSendGoodCard && wHaveGoodCardAndroidUser!=INVALID_CHAIR) { //混乱扑克 BYTE bRandCard[54]; m_GameLogic.RandCardList(bRandCard,sizeof(bRandCard)/sizeof(bRandCard[0])); BYTE cbGoodCard[NORMAL_COUNT] ; m_GameLogic.GetGoodCardData(cbGoodCard) ; //抽取好牌 m_GameLogic.RemoveGoodCardData(cbGoodCard, NORMAL_COUNT, bRandCard, FULL_COUNT ) ; //分发扑克 CopyMemory(m_bHandCardData[wHaveGoodCardAndroidUser], cbGoodCard, NORMAL_COUNT) ; m_bCardCount[wHaveGoodCardAndroidUser]=17; for (WORD i=0, j=0;i<m_wPlayerCount;i++) { if(i!=wHaveGoodCardAndroidUser) { m_bCardCount[i]=17; CopyMemory(&m_bHandCardData[i],&bRandCard[j*17],sizeof(BYTE)*17); ++j ; } } CopyMemory(m_bBackCard,&bRandCard[34],sizeof(m_bBackCard)); m_GameLogic.SortCardList(m_bBackCard,3,ST_ORDER); } else { //混乱扑克 BYTE bRandCard[54]; m_GameLogic.RandCardList(bRandCard,sizeof(bRandCard)/sizeof(bRandCard[0])); //分发扑克 for (WORD i=0;i<m_wPlayerCount;i++) { m_bCardCount[i]=17; CopyMemory(&m_bHandCardData[i],&bRandCard[i*m_bCardCount[i]],sizeof(BYTE)*m_bCardCount[i]); } CopyMemory(m_bBackCard,&bRandCard[51],sizeof(m_bBackCard)); m_GameLogic.SortCardList(m_bBackCard,3,ST_ORDER); } //设置用户 m_wCurrentUser = rand() % GAME_PLAYER; m_wFirstUser=m_wCurrentUser; //发送扑克 CMD_S_SendAllCard SendAllCard ; SendAllCard.wCurrentUser = m_wCurrentUser ; //手上扑克 CopyMemory(SendAllCard.bCardData, m_bHandCardData, sizeof(m_bHandCardData)) ; //底牌扑克 CopyMemory(SendAllCard.bBackCardData, m_bBackCard, 3) ; for (WORD i=0;i<m_wPlayerCount;i++) { m_pITableFrame->SendTableData(i,SUB_S_SEND_CARD,&SendAllCard,sizeof(SendAllCard)); m_pITableFrame->SendLookonData(i,SUB_S_SEND_CARD,&SendAllCard,sizeof(SendAllCard)); } //排列扑克 for (WORD i=0;i<m_wPlayerCount;i++) { m_GameLogic.SortCardList(m_bHandCardData[i],m_bCardCount[i],ST_ORDER); } return true; } //设置变量 if (m_wBankerUser==INVALID_CHAIR) m_wBankerUser=m_wFirstUser; //设置状态 m_pITableFrame->SetGameStatus(GS_WK_PLAYING); //发送底牌 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_bTurnCardCount=0; m_wTurnWiner=m_wBankerUser; m_wCurrentUser=m_wBankerUser; //发送消息 CMD_S_GameStart GameStart; GameStart.wLandUser=m_wBankerUser; GameStart.bLandScore=m_bLandScore; GameStart.wCurrentUser=m_wCurrentUser; CopyMemory(GameStart.bBackCard,m_bBackCard,sizeof(m_bBackCard)); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_START,&GameStart,sizeof(GameStart)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_START,&GameStart,sizeof(GameStart)); return true; } //设置用户 m_wCurrentUser=(wChairID+1)%m_wPlayerCount; //发送消息 CMD_S_LandScore LandScore; LandScore.bLandUser=wChairID; LandScore.bLandScore=bLandScore; LandScore.wCurrentUser=m_wCurrentUser; LandScore.bCurrentScore=m_bLandScore; m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_LAND_SCORE,&LandScore,sizeof(LandScore)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_LAND_SCORE,&LandScore,sizeof(LandScore)); return true; }
//游戏开始 bool __cdecl CTableFrameSink::OnEventGameStart() { //设置状态 m_pITableFrame->SetGameStatus(GS_WK_SCORE); BYTE cbSendGoodCard = rand () % GOOD_CARD_PERCENT ; BYTE cbAndroidUserCount = 0 ; WORD wAndroidUser[ GAME_PLAYER ] = {0}; //机器人个数 for ( WORD wChairID = 0; wChairID < GAME_PLAYER; ++wChairID ) { IServerUserItem *pServerUserItem = m_pITableFrame->GetServerUserItem( wChairID ) ; if ( pServerUserItem->IsAndroidUser() ) { wAndroidUser[ cbAndroidUserCount ] = ( wChairID ) ; ++cbAndroidUserCount ; } } WORD wHaveGoodCardAndroidUser = INVALID_CHAIR ; if ( 0 < cbAndroidUserCount ) wHaveGoodCardAndroidUser = wAndroidUser[ rand() % cbAndroidUserCount ] ; //发送好牌 if ( 1 == cbSendGoodCard && wHaveGoodCardAndroidUser != INVALID_CHAIR ) { //混乱扑克 BYTE bRandCard[54]; m_GameLogic.RandCardList( bRandCard, sizeof( bRandCard ) / sizeof( bRandCard[ 0 ] ) ); BYTE cbGoodCard[ NORMAL_COUNT ] ; m_GameLogic.GetGoodCardData( cbGoodCard ) ; //抽取好牌 m_GameLogic.RemoveGoodCardData( cbGoodCard, NORMAL_COUNT, bRandCard, FULL_COUNT ) ; //分发扑克 CopyMemory( m_bHandCardData[ wHaveGoodCardAndroidUser ], cbGoodCard, NORMAL_COUNT ) ; m_bCardCount[ wHaveGoodCardAndroidUser ] = 17; for ( WORD i = 0, j = 0; i < m_wPlayerCount; i++ ) { if ( i != wHaveGoodCardAndroidUser ) { m_bCardCount[ i ] = 17; CopyMemory( &m_bHandCardData[ i ], &bRandCard[ j * 17 ], sizeof( BYTE ) * 17 ); ++j ; } } CopyMemory( m_bBackCard, &bRandCard[ 34 ], sizeof( m_bBackCard ) ); m_GameLogic.SortCardList( m_bBackCard, 3, ST_ORDER ); } else { //混乱扑克 BYTE bRandCard[ 54 ]; m_GameLogic.RandCardList( bRandCard, sizeof( bRandCard ) / sizeof( bRandCard[ 0 ] ) ); //分发扑克 for ( WORD i = 0; i < m_wPlayerCount; i++ ) { m_bCardCount[ i ] = 17; CopyMemory( &m_bHandCardData[ i ], &bRandCard[ i * m_bCardCount[ i ] ], sizeof( BYTE ) * m_bCardCount[ i ] ); } CopyMemory( m_bBackCard, &bRandCard[ 51 ], sizeof( m_bBackCard ) ); m_GameLogic.SortCardList( m_bBackCard, 3, ST_ORDER ); } //设置用户 m_wCurrentUser = rand() % GAME_PLAYER; m_wFirstUser=m_wCurrentUser; //发送扑克 CMD_S_SendAllCard SendAllCard ; SendAllCard.wCurrentUser = m_wCurrentUser ; //手上扑克 CopyMemory( SendAllCard.bCardData, m_bHandCardData, sizeof( m_bHandCardData ) ) ; //底牌扑克 CopyMemory( SendAllCard.bBackCardData, m_bBackCard, 3 ) ; for ( WORD i = 0; i < m_wPlayerCount; i++ ) { m_pITableFrame->SendTableData( i, SUB_S_SEND_CARD, &SendAllCard, sizeof( SendAllCard ) ); m_pITableFrame->SendLookonData( i, SUB_S_SEND_CARD, &SendAllCard, sizeof( SendAllCard ) ); } //排列扑克 for ( WORD i = 0; i < m_wPlayerCount; i++ ) { m_GameLogic.SortCardList( m_bHandCardData[ i ], m_bCardCount[ i ], ST_ORDER ); } return true; }
//游戏开始 void CTableFrameSink::GameStart() { m_oLog.Log("//////-------游戏开始--------////////"); for(int i=0; i<GAME_PLAYER; i++) { IServerUserItem * pIServerUserItem = m_pITableFrame->GetServerUserItem(i); if (pIServerUserItem == NULL) continue; if (!pIServerUserItem->IsAndroidUser()) { m_oLog.Log("玩家[%s] 带入筹码[%I64d]" , pIServerUserItem->GetAccounts() , pIServerUserItem->GetUserScore()->lBodyChip); } } CountDownTime(INVALID_CHAIR); CMD_S_GameStart GameStart; ZeroMemory(&GameStart,sizeof(GameStart)); //强发聚宝盆 //m_oLog.Log("强发状态:%s",m_bMeetConditions?"已经进行过强发,还未清除状态不能强发!":"未进行过强发,可以强发!"); bool bSuccess = false;//= ForceDispathCard(); //m_oLog.Log("1"); while (!bSuccess) { //m_oLog.Log("2"); bSuccess = DispathCard(); } //随机喜金牌 ZeroMemory(m_cbRewardCardData,sizeof(m_cbRewardCardData)); for (int i=0; i<GAME_PLAYER; i++) { if (m_cbPlayStatus[i] == FALSE) continue; m_GameLogic.RandCardList(m_cbRewardCardData[i],MAX_COUNT); } //测试配牌 if (m_bCheat) { for (int i=0; i<GAME_PLAYER; i++) { if (m_cbCheatCardData[i][0] == 0)continue; CopyMemory(m_cbHandCardData[i], m_cbCheatCardData[i],MAX_COUNT); } for (int i=0; i<GAME_PLAYER; i++) { if (m_cbCheatRewardCard[i][0] ==0)continue; { CopyMemory(m_cbRewardCardData[i], m_cbCheatRewardCard[i], MAX_COUNT); } } } m_oLog.Log("原始手牌:"); for(int i=0; i<GAME_PLAYER; i++) { //获取用户 IServerUserItem *pIServerUser=m_pITableFrame->GetServerUserItem(i); if(pIServerUser==NULL) continue; m_oLog.Log("%s手牌:[%s%s][%s%s][%s%s][%s%s][%s%s]---牌型为[%s]",pIServerUser->GetUserData()->szAccounts,cn(m_cbHandCardData[i][0]),vn(m_cbHandCardData[i][0]), cn(m_cbHandCardData[i][1]),vn(m_cbHandCardData[i][1]),cn(m_cbHandCardData[i][2]),vn(m_cbHandCardData[i][2]),cn(m_cbHandCardData[i][3]),vn(m_cbHandCardData[i][3]), cn(m_cbHandCardData[i][4]),vn(m_cbHandCardData[i][4]),CardTypeName(m_GameLogic.GetBestCardType(m_cbHandCardData[i],MAX_COUNT))); } m_oContral.ControlDispath(m_cbHandCardData, m_cbPlayStatus); m_oLog.Log("控制后手牌:"); for(int i=0; i<GAME_PLAYER; i++) { //获取用户 IServerUserItem *pIServerUser=m_pITableFrame->GetServerUserItem(i); if(pIServerUser==NULL) continue; m_oLog.Log("%s手牌:[%s%s][%s%s][%s%s][%s%s][%s%s]---牌型为[%s]",pIServerUser->GetUserData()->szAccounts,cn(m_cbHandCardData[i][0]),vn(m_cbHandCardData[i][0]), cn(m_cbHandCardData[i][1]),vn(m_cbHandCardData[i][1]),cn(m_cbHandCardData[i][2]),vn(m_cbHandCardData[i][2]),cn(m_cbHandCardData[i][3]),vn(m_cbHandCardData[i][3]), cn(m_cbHandCardData[i][4]),vn(m_cbHandCardData[i][4]),CardTypeName(m_GameLogic.GetBestCardType(m_cbHandCardData[i],MAX_COUNT))); } // //发送扑克 for (WORD i=0;i<m_wPlayerCount;i++) { if(m_cbPlayStatus[i]==FALSE)continue; CopyMemory(GameStart.cbPlayStatus, m_cbPlayStatus,sizeof(m_cbPlayStatus)); //派发扑克 CopyMemory(GameStart.cbCardData[i],m_cbHandCardData[i],MAX_COUNT); std::random_shuffle(GameStart.cbCardData[i], GameStart.cbCardData[i]+MAX_COUNT); //派发喜金扑克 CopyMemory(GameStart.cbRewardCardData[i], m_cbRewardCardData[i],MAX_COUNT); //发送数据 m_pITableFrame->SendTableData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart)); ZeroMemory(GameStart.cbCardData, sizeof(GameStart.cbCardData)); } m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_START,&GameStart,sizeof(GameStart)); }
void CTableFrameSink::WriteScore() { m_dwOverTime = GetTickCount(); DWORD temp_dwPlayTime = (m_dwOverTime - m_dwJettonTime)/1000; m_pITableFrame->KillGameTimer(IDI_WRITESCORE); //SendTaskIngot(); for (int i=0; i<GAME_PLAYER; i++) { if(m_cbPlayStatus[i] == FALSE) continue; m_lTotalWinScore[i] = m_lUserWinScore[i] - m_lDeskPay; } //聚宝盆 //SendTaskIngot(); LONGLONG lTotalRevenue = 0; for (WORD i=0;i<GAME_PLAYER;i++) { if (m_lTotalWinScore[i] != 0) { enScoreKind nScoreKind = enScoreKind_Draw; nScoreKind = (m_lUserWinScore[i] > 0 )?enScoreKind_Win:enScoreKind_Lost; IServerUserItem * pIServerUserItem = m_pITableFrame->GetServerUserItem(i); if(pIServerUserItem) { m_oLog.Log("玩家[%s] 写入积分[%I64d]" , pIServerUserItem->GetUserData()->szAccounts , m_lTotalWinScore[i]); if(!pIServerUserItem->IsAndroidUser()) { lTotalRevenue += m_lUserRevenue[i]; LONGLONG temp_SysEat=0; temp_SysEat += m_lDeskPay; if (m_lUserWinScore[i] < 0) { temp_SysEat += ((-m_lUserWinScore[i])*m_cbEateRate /100); } //写入积分 m_pITableFrame->WriteUserScore(i,m_lTotalWinScore[i],m_lUserRevenue[i],nScoreKind,temp_dwPlayTime,temp_SysEat,m_lMinbet); } else { //写入积分 m_pITableFrame->WriteUserScore(i,m_lTotalWinScore[i],m_lUserRevenue[i],nScoreKind); } } } } for(int i=0; i<GAME_PLAYER; i++) { IServerUserItem * pIServerUserItem = m_pITableFrame->GetServerUserItem(i); if (pIServerUserItem == NULL) continue; if (!pIServerUserItem->IsAndroidUser()) { m_oLog.Log("玩家[%s] 身上剩余[%I64d]" , pIServerUserItem->GetAccounts() , pIServerUserItem->GetUserScore()->lBodyChip); } } m_oLog.Log("将要写入放分池的系统输赢分[%I64d]" , m_lSysWinScore); //系统输赢放入放分池 m_oContral.ChangeBuffer(m_lSysWinScore); //放入聚宝盆 // if (m_lSysWinScore > 0) // { // AddBuffer(0,m_lSysWinScore*m_cbBufferRate/100); // } if(lTotalRevenue > 0) { // AddBuffer(BIG_BUFFER , lTotalRevenue); // AddBuffer(SMALL_BUFFER , lTotalRevenue); } //设置文件名 TCHAR szPath[MAX_PATH]=TEXT(""); TCHAR szConfigFileName[MAX_PATH]=TEXT(""); GetCurrentDirectory(sizeof(szPath),szPath); _snprintf_s(szConfigFileName,sizeof(szConfigFileName),TEXT("%s\\%d_RatiOx.ini"),szPath,m_pGameServiceOption->wServerID); m_oLog.Log("=============放分池数据[%I64d]写入配置文件[%s]=================" ,m_oContral.GetPoolScore(),szConfigFileName); CString strPoolScore; strPoolScore.Format("%I64d", m_oContral.GetPoolScore()); WritePrivateProfileString(TEXT("SCOREPOOL"), TEXT("ScorePool"),strPoolScore,szConfigFileName); ConcludeGame(); m_oLog.Log("////------------游戏结束----------------------////"); //结束游戏 }