Esempio n. 1
0
/**
 * 游戏结束
 * @param bDeskStation 玩家ID
 * @param bCloseFlag 结束类型
 */
bool CServerGameDesk::GameFinish(BYTE bDeskStation, BYTE bCloseFlag)
{
	KillTimer(TIME_USER_OUT_CARD) ; 
	//得到最小数的金币
	long m_dwMaxPoint=0;
	bool bSetMaxMoney=false;
	/*for (BYTE i=0;i<m_bMaxPeople;i++)
	{
		if (m_pUserInfo[i]!=NULL)
		{
			if (bSetMaxMoney==false)
			{
				bSetMaxMoney=true;
				m_dwMaxPoint=(long int)m_pUserInfo[i]->m_UserData.dwPoint-1;
			}
			else 
				m_dwMaxPoint=__min(m_dwMaxPoint,(long int)m_pUserInfo[i]->m_UserData.dwPoint-1);
		}
	}
	if(m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME && m_dwMaxPoint<0)
	{
		TRACE("出现错误,四国军棋金币或比赛游戏中,玩家的金币数为负数.");
		return false;
	}*/

	//编写代码
	switch (bCloseFlag)
	{
	case GF_PREEND:     //提前结束
	case GF_NORMAL:		//游戏正常结束
		{
			int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数
			//计算得分
			//游戏结束
			GameEndStruct GameEnd;
			::memset(&GameEnd,0,sizeof(GameEnd));
            
			m_Logic.CountFen(GameEnd.iTurePoint);

			if (GF_PREEND == bCloseFlag)//提前结束
			{
				GameEnd.iTurePoint[bDeskStation] = GameEnd.iTurePoint[(bDeskStation+2)%4] = -2;//提出提前结束的一方
				GameEnd.iTurePoint[(bDeskStation+1)%4] = GameEnd.iTurePoint[(bDeskStation+3)%4] = 2;//另一方
			}


			//设置基本分begin
			m_pDataManage->m_InitData.uBasePoint = 1;
			int base=-1;
			int temp;
			for(int i=1;i<m_bMaxPeople;i++)
			{
				if (m_pUserInfo[i]==NULL)
					continue;
				temp=m_Logic.GetBaseFen(m_pUserInfo[i]->m_UserData.dwPoint);
				if(base>temp||-1==base)
					base=temp;
			}

			for(int i=0; i<m_bMaxPeople; i++)
			{
				if(NULL == m_pUserInfo[i])
				{
					GameEnd.iTurePoint[i] = 0;
					continue;
				}
				GameEnd.iTurePoint[i]*=base;					
			}
			//设置基本分end
			//设置数据 
				m_bGameStation=GS_WAIT_ARGEE;
				for (int i=0;i<m_bMaxPeople;i++)
				{
					if (m_pUserInfo[i]!=NULL) 
						m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING;
				}
				/*if (m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME)
				{
					GameEnd.iTurePoint[0]*=iBasePoint;
					GameEnd.iTurePoint[1]*=iBasePoint;
					GameEnd.iTurePoint[2]*=iBasePoint;
					GameEnd.iTurePoint[3]*=iBasePoint;
					for (BYTE i=0;i<m_bMaxPeople;i++)
					{
						if(GameEnd.iTurePoint[i]>0)
							GameEnd.iTurePoint[i]=__min(m_dwMaxPoint,GameEnd.iTurePoint[i]);
						if(GameEnd.iTurePoint[i]<0)
							GameEnd.iTurePoint[i]=__max(-m_dwMaxPoint,GameEnd.iTurePoint[i]);
						if (GameEnd.iTurePoint[i]>=100)
						{
							if(m_pDataManage->m_InitData.uComType!=SUP_MATCH_GAME)
								GameEnd.iTurePoint[i]=GameEnd.iTurePoint[i]*49L/50L;
						}
					}
				}*/
			
				//写入数据库				
			/*	bool temp_cut[PLAY_COUNT];
				memset(temp_cut,0,sizeof(temp_cut));
				ChangeUserPoint(GameEnd.iTurePoint, temp_cut);
				__super::RecoderGameInfo(GameEnd.iChangeMoney);*/
			//写入数据库				
				bool temp_cut[4];
				memset(temp_cut,0,sizeof(temp_cut));
				ChangeUserPoint(GameEnd.iTurePoint, temp_cut);
				__super::RecoderGameInfo(GameEnd.iChangeMoney);
				GameEnd.iDoublePointEffect = GetDoublePointEffect();//20081125

				bool bNotCostPoint = (m_pDataManage->m_InitData.dwRoomRule & GRR_NOT_COST_POINT) > 0; /// 金币场不扣积分    add by wys 2010-11-1
				if (true == bNotCostPoint)
				{
					memset(GameEnd.iTurePoint,0,sizeof(GameEnd.iTurePoint));
				}
				//发送数据
				for (int i=0;i<m_bMaxPeople;i++) 
					SendGameData(i,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);
				SendWatchData(m_bMaxPeople,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);

				
				ReSetGameState(bCloseFlag);
				__super::GameFinish(bDeskStation,GF_SALE);
				return true;



		}
	case GF_SALE:			//游戏安全结束
	case GFF_FORCE_FINISH:		//用户断线离开
		{
			int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数
			//计算得分
//			int iTurePoint=GetUpGrade(m_iGamePoint,m_iPlayCardCount);
			//设置数据
			m_bGameStation=GS_WAIT_ARGEE;

			for (int i=0;i<m_bMaxPeople;i++)
			{
				if (m_pUserInfo[i]!=NULL) 
					m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING;
			}
			GameCutStruct CutEnd;
			CutEnd.bDeskStation=bDeskStation;
			if(bCloseFlag==GF_SALE)
			{
				CutEnd.iTurePoint[bDeskStation]=0;
				CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
				CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
				CutEnd.iTurePoint[(bDeskStation+3)%4]=0;
			}
			else
			{
				//设置分数
				CutEnd.iTurePoint[bDeskStation]=0-m_pDataManage->m_InitData.uRunPublish;;
				CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
				CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
				CutEnd.iTurePoint[(bDeskStation+3)%4]=0;

			}

			//发送信息
			if (bCloseFlag==GF_SALE)
			{
				for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0);
				SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0);
			}
			else
			{
				//计算金币类和比赛类的实得分
				/*if (m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME)
				{
					CutEnd.iTurePoint[0]*=iBasePoint;
					CutEnd.iTurePoint[1]*=iBasePoint;
					CutEnd.iTurePoint[2]*=iBasePoint;
					CutEnd.iTurePoint[3]*=iBasePoint;
					for (BYTE i=0;i<m_bMaxPeople;i++)
					{
						if(CutEnd.iTurePoint[i]>0)
							CutEnd.iTurePoint[i]=__min(m_dwMaxPoint,CutEnd.iTurePoint[i]);
						if(CutEnd.iTurePoint[i]<0)
							CutEnd.iTurePoint[i]=__max(-m_dwMaxPoint,CutEnd.iTurePoint[i]);
						if (CutEnd.iTurePoint[i]>=100)
						{
							if(m_pDataManage->m_InitData.uComType!=SUP_MATCH_GAME)
								CutEnd.iTurePoint[i]=CutEnd.iTurePoint[i]*49L/50L;
						}
					}
				}*/
				
			/*	bool temp_cut[PLAY_COUNT];
				memset(temp_cut,0,sizeof(temp_cut));
				for (int i=0;i<PLAY_COUNT;i++)
				{
					temp_cut[i]=(bDeskStation==i && CutEnd.iTurePoint[i]<0);
				}
				ChangeUserPoint(CutEnd.iTurePoint, temp_cut);
				__super::RecoderGameInfo(CutEnd.iChangeMoney);*/
				//写入数据库				
				bool temp_cut[4];
				memset(temp_cut,0,sizeof(temp_cut));
				for (int i=0;i<m_bMaxPeople;i++)
				{
					temp_cut[i]=(bDeskStation==i && CutEnd.iTurePoint[i]<0);
				}
				ChangeUserPoint(CutEnd.iTurePoint, temp_cut);
				__super::RecoderGameInfo(CutEnd.iChangeMoney);

				bool bNotCostPoint = (m_pDataManage->m_InitData.dwRoomRule & GRR_NOT_COST_POINT) > 0; /// 金币场不扣积分    add by wys 2010-11-1
				if (true == bNotCostPoint)
				{
					memset(CutEnd.iTurePoint,0,sizeof(CutEnd.iTurePoint));
				}

				for (int i=0;i<m_bMaxPeople;i++)
					SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0);
				SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0);
			}

			bCloseFlag=GFF_FORCE_FINISH;

			ReSetGameState(bCloseFlag);
			__super::GameFinish(bDeskStation,bCloseFlag);
			return true;
		}
	}

	//重置数据
	ReSetGameState(bCloseFlag);
	__super::GameFinish(bDeskStation,bCloseFlag);

	return true;
}
Esempio n. 2
0
//------------------------------------------------------------------------------------
//游戏结束
bool CServerGameDesk::GameFinish(BYTE bDeskStation, BYTE bCloseFlag)
{

	DebugPrintf("happy landowner GameFinish 结束玩家【%d】,结束类型【%d】",bDeskStation,bCloseFlag);

	KillAllTimer();
	
	GameEndStruct s_gameend;

	switch (bCloseFlag)
	{
	case GF_NORMAL:		//游戏正常结束
		{
			CountResultScore(bDeskStation,&s_gameend,GF_NORMAL);	//计算得分

			m_bGameStation = GS_WAIT_ARGEE;

			break;
		}
	case GFF_FORCE_FINISH:	//强制退出结束
		{
			CountResultScore(bDeskStation,&s_gameend,GFF_FORCE_FINISH);	//计算得分

			m_bGameStation = GS_WAIT_ARGEE;	//游戏状态 等待下一盘开始

			bCloseFlag = GF_SALE;

			break;
		}
	case GF_SALE:			//游戏安全结束
		{
			m_bGameStation = GS_WAIT_ARGEE;

			break;
		}

	default:break;
	}
	memcpy(s_gameend.bIsPrepare,m_bIsPrepare,sizeof(s_gameend.bIsPrepare));
	//发送数据
	for (int i=0; i<PLAY_COUNT; ++i) 
	{
		if(NULL == m_pUserInfo[i])
			continue;

		SendGameData(i,&s_gameend,sizeof(GameEndStruct),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);
	}
	SendWatchData(m_bMaxPeople,&s_gameend,sizeof(GameEndStruct),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);

	ReSetGameState(bCloseFlag);	//重置数据

	__super::GameFinish(bDeskStation,bCloseFlag);

	for(int i = 0; i < PLAY_COUNT; ++i)
	{
		if(NULL == m_pUserInfo[i])
		{
			m_bIsAuto[i] = false;
		}
	}
	
	return true;
}