예제 #1
0
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("////------------游戏结束----------------------////");
	//结束游戏
}
예제 #2
0
//游戏结束
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;
}