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("////------------游戏结束----------------------////"); //结束游戏 }
//游戏结束 bool __cdecl CTableFrameSink::OnEventGameEnd( WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason ) { switch ( cbReason ) { case GER_DISMISS: //游戏解散 { //效验参数 //ASSERT( pIServerUserItem != NULL ); //ASSERT( wChairID < m_wPlayerCount ); //构造数据 CMD_S_GameEnd GameEnd; memset( &GameEnd, 0, sizeof( GameEnd ) ); CopyMemory(GameEnd.bBackCard,m_bBackCard,sizeof(m_bBackCard)); //剩余扑克 BYTE bCardPos = 0; for ( WORD i = 0; i < m_wPlayerCount; i++ ) { GameEnd.bCardCount[ i ] = m_bCardCount[ i ]; CopyMemory( &GameEnd.bCardData[ bCardPos ], m_bHandCardData[ i ], m_bCardCount[ i ] * sizeof( BYTE ) ); bCardPos += m_bCardCount[ i ]; } //发送信息 m_pITableFrame->SendTableData( INVALID_CHAIR, SUB_S_GAME_END, &GameEnd, sizeof( GameEnd ) ); m_pITableFrame->SendLookonData( INVALID_CHAIR, SUB_S_GAME_END, &GameEnd, sizeof( GameEnd ) ); //结束游戏 m_pITableFrame->ConcludeGame(); return true; } case GER_NORMAL: //常规结束 { //定义变量 CMD_S_GameEnd GameEnd; ZeroMemory( &GameEnd, sizeof( GameEnd ) ); CopyMemory(GameEnd.bBackCard,m_bBackCard,sizeof(m_bBackCard)); //剩余扑克 BYTE bCardPos = 0; for (WORD i=0;i<m_wPlayerCount;i++) { GameEnd.bCardCount[i]=m_bCardCount[i]; CopyMemory(&GameEnd.bCardData[bCardPos],m_bHandCardData[i],m_bCardCount[i]*sizeof(BYTE)); bCardPos+=m_bCardCount[i]; } //变量定义 LONG lCellScore=m_pGameServiceOption->lCellScore; bool bLandWin =(m_bCardCount[m_wBankerUser]==0)?true:false; //春天判断 WORD wBombTime=1; if(wChairID==m_wBankerUser) { WORD wUser1=(m_wBankerUser+1)%GAME_PLAYER; WORD wUser2=(m_wBankerUser+2)%GAME_PLAYER; if((m_bOutCardCount[wUser1]==0)&&(m_bOutCardCount[wUser2]==0))wBombTime*=2; } else { if(m_bOutCardCount[m_wBankerUser]==1)wBombTime*=2; } //炸弹限制 //wBombTime= __min( wBombTime, 16 ); //游戏积分 LONG lScore=0; LONG lRevenue=0; enScoreKind ScoreKind; //统计积分 for ( WORD i = 0; i < m_wPlayerCount; i++ ) { lScore=0; lRevenue=0; //统计积分 if ( i == m_wBankerUser ) { WORD wUser1=(m_wBankerUser+1)%m_wPlayerCount,wUser2=(m_wBankerUser+2)%m_wPlayerCount; //lScore=(m_bScoreTimes[wUser1]+m_bScoreTimes[wUser2])*wBombTime*lCellScore*((bLandWin==true)?1:-1); // 3番满 lScore=(m_bScoreTimes[wUser1]+m_bScoreTimes[wUser2])*wBombTime*lCellScore; int fullscore = (int)pow(2.0,MAX_SCORE)*lCellScore*2; lScore = lScore>fullscore?fullscore:lScore; lScore*=((bLandWin==true)?1:-1); GameEnd.lGameScore[i]=lScore; } else { //lScore = m_bScoreTimes[i] * wBombTime * lCellScore * ( ( bLandWin == true ) ? -1 : 1 ); lScore = m_bScoreTimes[i] * wBombTime * lCellScore; int fullscore = (int)pow(2.0,MAX_SCORE)*lCellScore; lScore = lScore>fullscore?fullscore:lScore; lScore*=((bLandWin==true)?-1:1); GameEnd.lGameScore[i] = lScore; } //防止负分 IServerUserItem *pUserItem = m_pITableFrame->GetServerUserItem(i); if( GAME_GENRE_SCORE==m_pGameServiceOption->wServerType &&GameEnd.lGameScore[i] < 0L && -GameEnd.lGameScore[i] > pUserItem->GetUserScore()->lScore ) { // 负分情况 GameEnd.lGameScore[i] = -pUserItem->GetUserScore()->lScore; } if( GAME_GENRE_GOLD==m_pGameServiceOption->wServerType &&GameEnd.lGameScore[i] < 0L && -GameEnd.lGameScore[i] > pUserItem->GetUserScore()->lGameGold ) // { // 负分情况,不应该允许这种情况发生 GameEnd.lGameScore[i] = -pUserItem->GetUserScore()->lGameGold; } //胜利类型 ScoreKind=(GameEnd.lGameScore[i]>0L)?enScoreKind_Win:enScoreKind_Lost; //计算税收 //if (m_pGameServiceOption->wServerType==GAME_GENRE_GOLD)GAME_GENRE_SCORE if (m_pGameServiceOption->wServerType==GAME_GENRE_SCORE || m_pGameServiceOption->wServerType==GAME_GENRE_GOLD) { //if (GameEnd.lGameScore[i]>=100L) if (GameEnd.lGameScore[i]>0L) { //计算税收 GameEnd.lGameTax+= (GameEnd.lGameScore[i]*m_pGameServiceOption->wRevenue/100L); lRevenue = (GameEnd.lGameScore[i]*m_pGameServiceOption->wRevenue/100L); //积分调整 lScore=lScore-lRevenue; GameEnd.lGameScore[i]=GameEnd.lGameScore[i]-lRevenue; } } //修改分数 m_pITableFrame->WriteUserScore(i,GameEnd.lGameScore[i],lRevenue,ScoreKind); } // oma add for (int k = 0;k<GAME_PLAYER;k++) { IServerUserItem *pUserItem = m_pITableFrame->GetServerUserItem(k); // 计算当局结束后分数 LONG totalScore = pUserItem->GetUserScore()->lScore; TCHAR printmsg[512] = TEXT(""); _snprintf(printmsg,sizeof(printmsg),TEXT("当局游戏结束后用户分数:%ld ,当前送分次:%d 游戏类型:%d "), totalScore,pUserItem->GetUserScore()->lGrantCount,m_pGameServiceOption->wServerType); CTraceService::TraceString(printmsg,TraceLevel_Debug); // 非金币类型送分 //if( GAME_GENRE_SCORE == m_pGameServiceOption->wServerType // && totalScore < START_GRANT_SCORE_BASE // && pUserItem->GetUserScore()->lGrantCount > 0 ) if( GAME_GENRE_SCORE == m_pGameServiceOption->wServerType && totalScore < m_pGameServiceOption->lLessScore && pUserItem->GetUserScore()->lGrantCount > 0 ) { int leftcount = --pUserItem->GetUserData()->UserScoreInfo.lGrantCount; // 送分,每次送 GRANT_SCORE_VALUE 分 int grantscore = GRANT_SCORE_VALUE;//m_pGameServiceOption->lCellScore*pow(2.0,4); CMD_S_Message msg; _snprintf(msg.message,sizeof(msg.message),TEXT("你当前的积分是%d 不足 %d, 这是第 %ld 次送 %ld 分 (每天 %ld 次)"), totalScore,m_pGameServiceOption->lLessScore,GRANT_SCORE_COUNT-leftcount,grantscore,GRANT_SCORE_COUNT); CTraceService::TraceString(msg.message,TraceLevel_Debug); //totalScore+= GRANT_SCORE_VALUE; // 通知客户端用户 m_pITableFrame->SendTableData(k,SUB_S_GRANT_SCORE,&msg,sizeof(CMD_S_Message)); //写入积分 m_pITableFrame->WriteUserScore(k,GRANT_SCORE_VALUE,0,enScoreKind_Present);// 扣税0 } else { CTraceService::TraceString(TEXT("没有送分啊"),TraceLevel_Debug); } } // oma add end //发送信息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); //切换用户 m_wFirstUser=wChairID; //结束游戏 m_pITableFrame->ConcludeGame(); return true; } case GER_USER_LEFT: //用户强退 { //效验参数 ASSERT(pIServerUserItem!=NULL); ASSERT(wChairID<m_wPlayerCount); //构造数据 CMD_S_GameEnd GameEnd; ZeroMemory(&GameEnd,sizeof(GameEnd)); CopyMemory(GameEnd.bBackCard,m_bBackCard,sizeof(m_bBackCard)); //剩余扑克 BYTE bCardPos=0; for (WORD i=0;i<m_wPlayerCount;i++) { GameEnd.bCardCount[i]=m_bCardCount[i]; CopyMemory(&GameEnd.bCardData[bCardPos],m_bHandCardData[i],m_bCardCount[i]*sizeof(BYTE)); bCardPos+=m_bCardCount[i]; } //炸弹限制 //WORD wBombTime = 1; //wBombTime=__min(wBombTime,16); //最少赔率 for (WORD i=0;i<m_wPlayerCount;i++) { m_bScoreTimes[i] = __max(m_bScoreTimes[i],1); } //修改积分 for (WORD i=0;i<m_wPlayerCount;i++) { //游戏积分 LONG lScore=0; LONG lRevenue=0; enScoreKind ScoreKind=enScoreKind_Draw; //构造变量 if (i==wChairID) { ScoreKind=enScoreKind_Flee; WORD wUser1=(i+1)%m_wPlayerCount; WORD wUser2=(i+2)%m_wPlayerCount; lScore=(m_bScoreTimes[wUser1]+m_bScoreTimes[wUser2])*m_pGameServiceOption->lCellScore*(-2); GameEnd.lGameScore[i]=lScore; } else if (m_pGameServiceOption->wServerType==GAME_GENRE_GOLD) { //统计积分 ScoreKind=enScoreKind_Win; lScore=m_bScoreTimes[i]*m_pGameServiceOption->lCellScore*2; GameEnd.lGameScore[i]=lScore; //计算税收 //if (lScore>=100L) if (lScore>0) { //计算税收 GameEnd.lGameTax+=GameEnd.lGameScore[i]*m_pGameServiceOption->wRevenue/100L; lRevenue = GameEnd.lGameScore[i]*m_pGameServiceOption->wRevenue/100L; //积分调整 lScore=lScore-lRevenue ; GameEnd.lGameScore[i]=GameEnd.lGameScore[i]-lRevenue ; } } //写入积分 m_pITableFrame->WriteUserScore(i,lScore,lRevenue,ScoreKind); } //发送信息 m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd)); //结束游戏 m_pITableFrame->ConcludeGame(); return true; } } ASSERT(FALSE); return false; }