Beispiel #1
0
/**
 * 同意用户离开
 * @param bDeskStation 玩家ID
 * @param pNetHead 参数基类
 * @param pData 网络数据包
 * @param uSize 数据包大小
 * @param uSocketID 参数基类
 * @param bWatchUser 是否旁观
 */
bool CServerGameDesk::H0011_UserBuZhen(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser)
{
	///if(bWatchUser)				return true;
	tagBuZhen * bz=(tagBuZhen *)pData;

	m_Logic.UserBuZhen (*bz);
	m_bBuzhen[bDeskStation]=true;
	for (int i=0;i<4;i++) SendGameData(i,bz,sizeof(*bz),MDM_GM_GAME_NOTIFY,ASS_BUZHEN,0);
	SendWatchData(m_bMaxPeople,bz,sizeof(*bz),MDM_GM_GAME_NOTIFY,ASS_BUZHEN,0);

	if(m_Logic.GetBuzhenCount() >= GetPlayerCount()&&GS_BUZHEN==m_bGameStation)
	{
		m_bGameStation=GS_PLAY_GAME;

		//发送开始消息
		tagNextStep s;

		s.station=m_Logic.m_iNowOutPeople;
		
		for (int i=0;i<4;i++) SendGameData(i,&s,sizeof(s),MDM_GM_GAME_NOTIFY,ASS_NEXT_STEP,0);
		SendWatchData(m_bMaxPeople,&s,sizeof(s),MDM_GM_GAME_NOTIFY,ASS_NEXT_STEP,0);

		KillTimer(TIME_USER_OUT_CARD) ;

		m_iTimerCount = m_iLessCount + 3 ; 
		SetTimer(TIME_USER_OUT_CARD ,1000) ;  
	}

	return true;
}
Beispiel #2
0
/**
 * 同意用户离开
 * @param bDeskStation 玩家ID
 * @param pNetHead 参数基类
 * @param pData 网络数据包
 * @param uSize 数据包大小
 * @param uSocketID 参数基类
 * @param bWatchUser 是否旁观
 */
bool CServerGameDesk::H048_ArgeeStopThing(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser)
{
			if(bWatchUser)
				return false;
			StopResultStruct * pStop=(StopResultStruct *)pData;
			if(pStop->bArgee==1)
			{
				//同意
				StopResultStruct stop;
				stop.bArgee=true;
				SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0);

				MessageStruct Mess;
				memset(&Mess,0,sizeof(Mess));
				lstrcpy(Mess.Message,"敌家经过商量,提前结束了本局!");
				SendGameData((bDeskStation+1)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);
				SendGameData((bDeskStation+3)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);

				memset(&Mess,0,sizeof(Mess));
				lstrcpy(Mess.Message,"拣分的双方经过商量,提前结束了本局!");
				SendWatchData(m_bMaxPeople,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);
				//结束游戏
				if (m_bGameStation==GS_PLAY_GAME) 
					GameFinish(bDeskStation, GF_PREEND);//提前结束
			}
			else
			{
				StopResultStruct stop;
				stop.bArgee=false;
				SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0);
			}
			return true;
}
Beispiel #3
0
///用户设置托管
///@param BYTE bDeskStation [in] 设置托管的玩家
///@param AutoCardStruct *bAuto [in] 托管信息结构
///@return 函数返回true
BOOL CServerGameDesk::UserAuto(BYTE bDeskStation,AutoCardStruct *bAuto)
{
	m_bIsAuto[bDeskStation] = bAuto->bAutoCard;
	bAuto->bDeskStation=bDeskStation;

	for(int i=0;i<m_bMaxPeople;i++)
	{
		SendGameData(i,bAuto,sizeof(AutoCardStruct),MDM_GM_GAME_NOTIFY,ASS_AUTO,0);
	}
	SendWatchData(m_bMaxPeople,bAuto,sizeof(AutoCardStruct),MDM_GM_GAME_NOTIFY,ASS_AUTO,0);

	return TRUE;
}
Beispiel #4
0
/**
 * 游戏开始
 */
bool CServerGameDesk::H001_GameBegin(BYTE bBeginFlag)
{
	if (__super::GameBegin(bBeginFlag)==false) 
		return false;
	//设置状态
	m_bQueryQuit=false;
	m_iBeenPlayGame++;
	m_bGameStation=GS_BUZHEN;
	//发送开始消息
	BeginGameStruct BeginMessage;
	BeginMessage.iPlayCount=m_iBeenPlayGame;	
	for (int i=0;i<4;i++) SendGameData(i,&BeginMessage,sizeof(BeginMessage),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0);
	SendWatchData(m_bMaxPeople,&BeginMessage,sizeof(BeginMessage),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0);
	return TRUE;
}
Beispiel #5
0
bool CServerGameDesk::H021_UserPass(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser)
{
	//发送开始消息
	m_Logic.m_iNowOutPeople=m_Logic.GetNextStation (bDeskStation);
	tagNextStep s;
	s.station=m_Logic.m_iNowOutPeople;
	for (int i=0;i<4;i++) SendGameData(i,&s,sizeof(s),MDM_GM_GAME_NOTIFY,ASS_NEXT_STEP,0);
	SendWatchData(m_bMaxPeople,&s,sizeof(s),MDM_GM_GAME_NOTIFY,ASS_NEXT_STEP,0);

	KillTimer(TIME_USER_OUT_CARD) ; 

	m_iTimerCount = m_iLessCount + 3 ; 
	SetTimer(TIME_USER_OUT_CARD ,1000) ;  
	
	return true;
}
Beispiel #6
0
/**
 * 游戏开始
 */
BOOL CServerGameDesk::BeginPlayUpGrade()
{
	//设置数据
	m_bGameStation=GS_PLAY_GAME;
//	m_iBaseOutCount=0;
//	m_Logic.m_iOutCardPeople=m_Logic.m_iUpGradePeople;
//	m_iFirstOutPeople=m_Logic.m_iUpGradePeople;
//	m_iGamePoint=0;
//	::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));

	//排列扑克
	///for (int i=0;i<4;i++) m_Logic.SortCard(m_iUserCard[i],NULL,m_iUserCardCount[i]);

	//发送游戏开始消息
	BeginPlayStruct Begin;
//	Begin.iOutDeskStation=m_Logic.m_iOutCardPeople;
	for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&Begin,sizeof(Begin),MDM_GM_GAME_NOTIFY,ASS_GAME_PLAY,0);
	SendWatchData(m_bMaxPeople,&Begin,sizeof(Begin),MDM_GM_GAME_NOTIFY,ASS_GAME_PLAY,0);

	return TRUE;
}
Beispiel #7
0
//--------------------------------------------------------------------------------
//处理玩家摊牌动作;
void CServerGameDesk::HandTanPaiAction(BYTE byDStation,BYTE byDownCard[])
{
	//安全判断
	if(!m_bIsInGame[byDStation] || NULL == byDownCard || m_bHaveBaiPai[byDStation] || m_bGameStation != GS_PLAY_GAME)
	{
		return;
	}

	::CopyMemory(m_bBullCard[byDStation],byDownCard,sizeof(BYTE)*USER_HAND_CARD);		//摆牌数据

	m_byCardShape[byDStation] = m_Logic.GetShape(m_byUCard[byDStation],m_iUCCount[byDStation],byDownCard);

	TanPaiStruct tanpai;
	
	tanpai.byStaiton = byDStation;
	tanpai.byShape = m_byCardShape[byDStation];

	if(m_bWatchOther[byDStation])
	{
		::CopyMemory(tanpai.byDownCard,m_bBullCard[byDStation],sizeof(m_bBullCard[byDStation]));
	}
		
	for (int i = 0; i < PLAY_COUNT; ++i)
	{
		if(m_pUserInfo[i])
		{
			SendGameData(i,&tanpai,sizeof(tanpai),MDM_GM_GAME_NOTIFY,ASS_TAN_PAI,0);
		}
	}
	SendWatchData(m_bMaxPeople,&tanpai,sizeof(tanpai),MDM_GM_GAME_NOTIFY,ASS_TAN_PAI,0);

	m_bHaveBaiPai[byDStation] = true;

	//检测是否所有人都已摊牌
	if(CheckTanPaiFinish())
	{
		GameFinish(byDStation,GF_NORMAL);
	}
}
Beispiel #8
0
//框架消息处理函数
bool CServerGameDesk::HandleFrameMessage(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser)
{
	DebugPrintf("接收到框架消息 位置=【%d】 ID=【%d】",bDeskStation,pNetHead->bAssistantID);

	switch(pNetHead->bAssistantID)
	{
	case ASS_GM_FORCE_QUIT:		//强行退出//安全退出
		{
			char cKey[10];
			CString sPath=CBcfFile::GetAppPath();
			int iResult = 1;
			if (CBcfFile::IsFileExist(sPath + "SpecialRule.bcf"))
			{
				CBcfFile fsr( sPath + "SpecialRule.bcf");
				sprintf(cKey, "%d", NAME_ID);
				iResult = fsr.GetKeyVal (_T("ForceQuitAsAuto"), cKey, 0);
			}

			if(iResult == 0)
			{
				UserQuitStruct s_UserQuit;
				s_UserQuit.bDeskStation = bDeskStation;
				for(int i = 0; i < PLAY_COUNT; ++i)
				{
					if(i != bDeskStation);
					{
						SendGameData(i,&s_UserQuit,sizeof(UserQuitStruct),MDM_GM_GAME_NOTIFY,ASS_USER_QUIT_GAME,0);
					}
				}
				SendWatchData(m_bMaxPeople,&s_UserQuit,sizeof(UserQuitStruct),MDM_GM_GAME_NOTIFY,ASS_USER_QUIT_GAME,0);

				return __super::HandleFrameMessage( bDeskStation,  pNetHead,  pData,  uSize,  uSocketID,  bWatchUser); 
			}

			return true;
		}
	}
	return __super::HandleFrameMessage( bDeskStation,  pNetHead,  pData,  uSize,  uSocketID,  bWatchUser);
}
Beispiel #9
0
/**
 * 用户设置游戏
 */
BOOL CServerGameDesk::UserSetGame(UserArgeeGame * pGameSet)
{
	//效验数据
	if (m_bGameStation!=GS_WAIT_SETGAME) return FALSE;

	//效验数据
	if (((pGameSet->iPlayCount<=0)||(pGameSet->iPlayCount>99)))
		return FALSE;

	//设置数据
	m_iLessCount=pGameSet->iPlayCount;
//	m_iPlayCardCount=1;//(pGameSet->iCardCount&1)?1:2;//2:3;
	m_iBeenPlayGame=0;
	m_bGameStation=GS_WAIT_ARGEE;

	//发送消息
	UserArgeeGame Agree;
	Agree.iPlayCount=m_iLessCount;
//	Agree.iCardCount=m_iPlayCardCount;
	for (int i=0;i<4;i++) SendGameData(i,&Agree,sizeof(Agree),MDM_GM_GAME_NOTIFY,ASS_UG_USER_SET,0);
	SendWatchData(m_bMaxPeople,&Agree,sizeof(Agree),MDM_GM_GAME_NOTIFY,ASS_UG_USER_SET,0);

	return TRUE;
}
Beispiel #10
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;
}
Beispiel #11
0
/**
 * 用户出牌
 * @param bDeskStation 玩家ID
 * @param pNetHead 参数基类
 * @param pData 网络数据包
 * @param uSize 数据包大小
 * @param uSocketID 参数基类
 * @param bWatchUser 是否旁观
 */
bool CServerGameDesk::H020_UserOutCard(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser)
{
	//GameFinish(bDeskStation,GF_NORMAL);//*shingo*
	//return true;
	if (bWatchUser) return FALSE;
	if(m_bGameStation!=GS_PLAY_GAME)
		return true;
	if (uSize!=sizeof(tagMove)) return FALSE;
	if(bDeskStation!=m_Logic.m_iNowOutPeople)
		return false;
	tagMove * pOutCard=(tagMove *)pData;
	tagMoveResult   m;
	memset(m.cPath, 255, sizeof(m.cPath));
	/*if(pOutCard->m_iStartI==-1)
	{//有玩家无子可下了
	m.station=bDeskStation;
	m.loseColor=m_Logic.GetColorFromStation(bDeskStation);
	m.m_iStartI=-1;
	m_Logic.ClearColorAllQiZi(m.loseColor);
	int *p=new int;
	*p=bDeskStation;
	bool cor[4];
	m_Logic.GetDeadPeople(cor);
	m_Logic.mLoseStationList.AddTail(p);
	for(int i=0; i<4; i++)
	{

	if(i == *p)
	continue;
	if(!cor[i])
	{
	TCHAR sz[100];
	wsprintf(sz,"lose color %d",i);
	Testlog(sz);
	int *p1=new int;
	*p1=bDeskStation;
	m_Logic.mLoseStationList.AddTail(p1);
	}
	}
	m.nextstation=m_Logic.GetNextStation(m.station);
	}
	else
	{*/
	m.station=bDeskStation;
	m_Logic.UserMove(*pOutCard,m);
	//}
	if(m_Logic.IsFinish())
		m.nextstation=-1;
	m_Logic.m_iNowOutPeople=m.nextstation;
	m.iStep = pOutCard->iStep;
	memcpy(m.cPath, pOutCard->cPath, sizeof(m.cPath));

	for (int i=0;i<m_bMaxPeople;i++) 
		SendGameData(i,&m,sizeof(m),MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);
	SendWatchData(m_bMaxPeople,&m,sizeof(m),MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);

	KillTimer(TIME_USER_OUT_CARD) ;

	m_iTimerCount = m_iLessCount + 3 ; 
	SetTimer(TIME_USER_OUT_CARD ,1000) ;

	if(m.loseColor >= 0)//m_Logic.IsStationLose(bDeskStation))
	{
		tagNextStep N;
		if(pOutCard->m_iStartI==-1)
			N.station =bDeskStation;
		else
			N.station=m_Logic.GetStationFromColor(m.loseColor);
		N.station2=m_Logic.GetStationFromColor(m.loseColor2);
		for (int i=0;i<4;i++) 
			SendGameData(i,&N,sizeof(N),MDM_GM_GAME_NOTIFY,ASS_LOSE,0);
		SendWatchData(m_bMaxPeople,&N,sizeof(N),MDM_GM_GAME_NOTIFY,ASS_LOSE,0);
	}

	if(m_Logic.IsFinish())
	{
		m_bGameStation=GS_PLAY_GAME;
		SetTimer(TIME_GAME_FINISH,2000);
	}
	return true;
}
Beispiel #12
0
//发送扑克给用户
BOOL CServerGameDesk::SendCard()
{
	int iCardPos = 0;	//当前发牌位置;
	//20121204DWJ 没有机器人就不去控制了;
	bool bAllUser = true;//全是玩家在那玩就不控制了;
	bool bALLAi	  = true;//全是机器人;
	for (int i =0 ;i< PLAY_COUNT ; i++)
	{
		if(NULL != m_pUserInfo[i] && m_pUserInfo[i]->m_UserData.isVirtual > 0 )
		{// 有机器人存在,就去控制;
			bAllUser = false;
			break;
		}
		
	}
	for (int i =0 ;i< PLAY_COUNT ; i++)
	{
		if (NULL != m_pUserInfo[i] && m_pUserInfo[i]->m_UserData.isVirtual < 1)
		{//全是机器人,有玩家存在,就去控制;
			bALLAi	= false;
			break;
		}
	}

	if (m_bSuperSet)
	{
		SuperSet();
		//每局只设置完后初始化
		m_bSuperSet       = false;
		m_iSuperSet[0]    = 255;
		m_iSuperSet[1]    = 0;
	}
	else if (m_bAIWinAndLostAutoCtrl && !m_bSuperSet && !bAllUser && !bALLAi)
	{//机器人控制输赢 dwj 20121203 机器人控制输赢了且 没有超端控制、有机器人在里面玩;
		IAWinAutoCtrl();
	}

	for(int i = 0; i < PLAY_COUNT; ++i)
	{
		if(!m_bIsInGame[i])
			continue;

		::CopyMemory(m_byUCard[i],&m_iTotalCard[iCardPos],sizeof(BYTE)*USER_HAND_CARD);

		m_iUCCount[i] = USER_HAND_CARD;

		iCardPos += USER_HAND_CARD;
	}
	
	//dddwwwjjj;
	//BYTE byTemp1[PLAY_COUNT][USER_HAND_CARD] = {{0x03,0x3C,0x29,0x02,0x07},{0x0D,0x0C,0x0A,0x15,0x3A},{0x4e,0x03,0x3d,0x08,0x0b},
	//											{0x07,0x01,0x4f,0x17,0x06},{0x32,0x14,0x26,0x18,0x38},{0x16,0x24,0x0B,0x2A,0x09}};
	//for(int i = 0; i < PLAY_COUNT; ++i)
	//{
	//	if(NULL == m_pUserInfo[i])
	//		continue;
	//	
	//	::CopyMemory(m_byUCard[i],byTemp1[i],sizeof(BYTE)*USER_HAND_CARD);
	//}

	SendCardStruct  sCardData;
	::CopyMemory(sCardData.iUCCount,m_iUCCount,sizeof(m_iUCCount));

	for(int i = 0; i < PLAY_COUNT; ++i)
	{
		if(NULL == m_pUserInfo[i])
			continue;

		::CopyMemory(sCardData.byUCard[i],m_byUCard[i],sizeof(m_byUCard[i]));
		
		SendGameData(i,&sCardData,sizeof(sCardData),MDM_GM_GAME_NOTIFY,ASS_SEND_CARD,0);

		//不充许 旁观
		if(!m_bWatchOther[i])
		{
			::memset(sCardData.byUCard[i],0x4D,sizeof(sCardData.byUCard[i]));	
		}
	
		SendWatchData(i,&sCardData,sizeof(sCardData),MDM_GM_GAME_NOTIFY,ASS_SEND_CARD,0);

		::ZeroMemory(sCardData.byUCard[i],sizeof(sCardData.byUCard[i]));	
	}

	SetGameTimer(TIME_WAIT_THINK,1250,false);		//加上客户端发牌时间

	return TRUE;
}
Beispiel #13
0
//游戏开始
bool CServerGameDesk::GameBegin(BYTE bBeginFlag)
{
	
	if (__super::GameBegin(bBeginFlag)==false) 
	{
		GameFinish(0,GF_SALE);
		return false;
	}

	m_bGameStation = GS_SEND_CARD;				//游戏状态

	//-ADD--BY---DWJ-20121203
	//这里每盘根据房间ID读取下配置文件中的ReSetAIHaveWinMoney 参数 设定下机器人赢了多少钱;
	GetAIContrlSetFromIni(m_pDataManage->m_InitData.uRoomID);

	//牛牛玩家人数
	m_byCowUserNum = 0;
	//是否牛牛玩家
	memset(m_bIsCowUser, false, sizeof(m_bIsCowUser));

	for (int i = 0; i < PLAY_COUNT; ++i) 
	{
		if(m_pUserInfo[i])
		{
			m_bIsInGame[i] = true;
		}
	}

	//分发扑克
	m_Logic.RandCard(m_iTotalCard,m_iAllCardCount,m_bHaveKing);
	int temp = rand()%100;

	//洗到好牌
	if (temp < m_iGoodCard)
	{
		for (int i=0; i<20; i++)
		{
			if (GetMaxCardShape(m_iTotalCard,m_iAllCardCount) > UG_BULL_SEVEN)
			{
				break;
			}

			m_Logic.RandCard(m_iTotalCard,m_iAllCardCount,m_bHaveKing);
		}
	}

	srand(GetTickCount());

	m_bGameStation = GS_SEND_CARD;

	BeginUpgradeStruct begindata;

	::CopyMemory(begindata.bIsInGame,m_bIsInGame,sizeof(m_bIsInGame));

	for(int i = 0; i < PLAY_COUNT; ++i)
	{
		if(NULL == m_pUserInfo[i])
			continue;
	
		SendGameData(i,&begindata,sizeof(BeginUpgradeStruct),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0);
	}
	SendWatchData(m_bMaxPeople,&begindata,sizeof(BeginUpgradeStruct),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0);

	SendCard();

	DebugPrintf("游戏开始__ happy landowner gamebing end!");

	return true;
}
Beispiel #14
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;
}