Example #1
0
//定时器事件
bool __cdecl CTableFrameSink::OnTimerMessage(WORD wTimerID, WPARAM wBindParam)
{
	switch (wTimerID)
	{
	case IDI_GAME_END:	//游戏结束
		{
			if (m_pITableFrame->GetGameStatus()==GS_PLAYING)
			{
				OnEventGameEnd(INVALID_CHAIR,NULL,m_cbGameEndReason);
				return true;
			}
		}
	case IDI_PASS_CARD:
		{
			if ((wBindParam==m_wCurrentUser)&&(m_wCurrentUser!=INVALID_CHAIR))
			{
				//获取用户
				IServerUserItem * pIServerUserItem=m_pITableFrame->GetServerUserItem(m_wCurrentUser);
				
				//用户判断
				if ((pIServerUserItem!=NULL)&&(pIServerUserItem->GetUserStatus()!=US_OFFLINE))
				{
					//OnUserGiveUp(m_wCurrentUser);
					//test
					m_pITableFrame->SetGameTimer(IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser);
					//end test
				}
				else m_pITableFrame->SetGameTimer(IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser);

				return true;
			}
		}
	}
	return false;
}
Example #2
0
//扣牌事件
bool CTableFrameSink::OnUserKouPai(WORD wChairID)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true;
	if (wChairID!=m_wCurrentUser) return false;


	//设置用户
	for(BYTE i=1;i<GAME_PLAYER;i++)
	{
		m_wCurrentUser=(wChairID+i)%m_wPlayerCount;				
		if(m_bXianPaiCompetency[m_wCurrentUser])
			break;

	}
	
	ASSERT(i!=GAME_PLAYER);
	if(i>=GAME_PLAYER) m_wCurrentUser=m_wBankerUser;
	ASSERT(m_bKouPaiPlayerCount<=3);
	
	//设置掀牌资格
	if(wChairID!=m_wBankerUser)
		m_bXianPaiCompetency[wChairID]=false;
	//发送消息
	CMD_S_User_CouPai CouPai;
	CouPai.wCouPaiUserID=wChairID;
	CouPai.wCurrentUser=m_wCurrentUser;
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_USER_COUPAI,&CouPai,sizeof(CouPai));
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_USER_COUPAI,&CouPai,sizeof(CouPai));
	//结束判断
	if(m_wCurrentUser==m_wBankerUser)
		OnEventGameEnd(wChairID,NULL,GER_NORMAL);	

	return true;
}
Example #3
0
//放弃事件
bool CTableFrameSink::OnUserGiveUp(WORD wChairID)
{
	//重置状态
	m_cbPlayStatus[wChairID]=FALSE;
	m_cbShowHand[wChairID]=FALSE;

	//发送消息
	CMD_S_GiveUp GiveUp;
	GiveUp.wGiveUpUser=wChairID;
	GiveUp.lLost = -m_lTotalScore[wChairID];
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp));
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp));

	//写入积分
	m_pITableFrame->WriteUserScore(wChairID,-m_lTotalScore[wChairID],0,enScoreKind_Lost);

	//清空下注
	m_lTableScore[wChairID] = 0L;

	//人数统计
	WORD wPlayerCount=0;
	for (WORD i=0;i<m_wPlayerCount;i++)
	{
		if (m_cbPlayStatus[i]==TRUE) wPlayerCount++;
	}

	//判断结束
	if (wPlayerCount>=2)
	{
		if (m_wCurrentUser==wChairID) OnUserAddScore(wChairID,0L,true);
	}
	else OnEventGameEnd(INVALID_CHAIR,NULL,GER_NO_PLAYER);

	return true;
}
Example #4
0
//放弃事件
bool CTableFrameSink::OnUserGiveUp(WORD wChairID)
{
	//状态判断
	GT_ASSERT(m_bPlayStatus[wChairID]==TRUE);
	if (m_bPlayStatus[wChairID]==FALSE) return false;

	//设置数据
	m_bPlayStatus[wChairID]=FALSE;
	//m_bTableCardCount[wChairID]=0;

	//发送放弃消息
	CMD_S_GiveUp GiveUp;
	GiveUp.wUserChairID=wChairID;
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp));
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp));


	//判断结束
	WORD wPlayerCount=0;
	for (WORD i=0;i<m_wPlayerCount;i++)
	{
		if (m_bPlayStatus[i]==TRUE) wPlayerCount++;
	}
	if (wPlayerCount>=2)
	{
		if (m_wCurrentUser==wChairID) OnUserAddGold(wChairID,0L,true);
	}
	else OnEventGameEnd(INVALID_CHAIR,NULL,GER_NO_PLAYER);

	return true;
}
Example #5
0
//用户出牌
bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true;
	if (wChairID!=m_wCurrentUser) return false;

	//类型判断
	BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount);
	if (bCardType==CT_ERROR) return false;

	//更随出牌
	if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount;
	else if (m_GameLogic.CompareCard(m_bTurnCardData,bCardData,m_bTurnCardCount,bCardCount)==false) return false;

	//删除扑克
	if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false;
	m_bCardCount[wChairID]-=bCardCount;

	//出牌记录
	m_bTurnCardCount=bCardCount;
	m_bOutCardCount[wChairID]++;
	CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount);

	//炸弹判断
	if ((bCardType==CT_BOMB_CARD)||(bCardType==CT_MISSILE_CARD)) 
	{
		for(WORD i=0;i<m_wPlayerCount;i++)m_bScoreTimes[i]*=2;
		m_wOutBombCount++;
	}
	
	//切换用户
	m_wTurnWiner=wChairID;
	if (m_bCardCount[wChairID]!=0)
	{
		if (bCardType!=CT_MISSILE_CARD) m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount;
	}
	else m_wCurrentUser=INVALID_CHAIR;

	//构造数据
	CMD_S_OutCard OutCard;
	OutCard.bCardCount=bCardCount;
	OutCard.wOutCardUser=wChairID;
	OutCard.wCurrentUser=m_wCurrentUser;
	CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE));

	//发送数据
	WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE);
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);

	//出牌最大
	if (bCardType==CT_MISSILE_CARD) m_bTurnCardCount=0;

	//结束判断
	if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL);

	return true;
}
Example #6
0
//摊牌事件
bool CTableFrameSink::OnUserOpenCard( WORD wChairID, BYTE bOx )
{
	//状态效验
	ASSERT (m_pITableFrame->GetGameStatus()==GS_OX_PLAY);
	if (m_pITableFrame->GetGameStatus()!=GS_OX_PLAY) return false;
	CountDownTime(wChairID , TRUE);
	IServerUserItem* pServerUserItem = m_pITableFrame->GetServerUserItem(wChairID);
	//m_oLog.Log("玩家[%s]摊牌。", pServerUserItem->GetUserData()->szAccounts);

	//效验数据
	ASSERT(bOx==FALSE || bOx==TRUE);
	if(bOx!=FALSE && bOx!=TRUE)return false;

	//效验数据
	if(bOx)
	{
		ASSERT(m_GameLogic.GetBestCardType(m_cbHandCardData[wChairID],MAX_COUNT)>=0);
		if(!(m_GameLogic.GetBestCardType(m_cbHandCardData[wChairID],MAX_COUNT)>=0))return false;
	}

	//牛牛数据
	m_bOxCard[wChairID] = bOx;

	//摊牌人数
	BYTE bUserCount=0;
	for(WORD i=0;i<m_wPlayerCount;i++)
	{
		if(m_bOxCard[i]<2 && m_cbPlayStatus[i]==TRUE)bUserCount++;
		else if(m_cbPlayStatus[i]==FALSE)bUserCount++;
	}

	//构造变量
	CMD_S_Open_Card OpenCard;
	ZeroMemory(&OpenCard,sizeof(OpenCard));

	//设置变量
	OpenCard.bOpen=bOx;
	OpenCard.wPlayerID=wChairID;

	//发送数据
	for (WORD i=0;i< m_wPlayerCount;i++)
	{
		if(m_cbPlayStatus[i]==FALSE)continue;
		m_pITableFrame->SendTableData(i,SUB_S_OPEN_CARD,&OpenCard,sizeof(OpenCard));
	}
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OPEN_CARD,&OpenCard,sizeof(OpenCard));	

	//结束游戏
	if(bUserCount == m_wPlayerCount)
	{
		return OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);
	}
	return true;
}
Example #7
0
//用户放弃
bool CTableFrameSink::OnUserPassCard(WORD wChairID)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_RF_PLAYING) return false;
	//设置变量
	BYTE i=wChairID+1;
	while(!m_bCardCount[(i%m_wPlayerCount)])
	{
		i++;
	}

	//设置变量
	m_wCurrentUser=i%m_wPlayerCount;
	m_wPassCount+=i-wChairID;

	if(m_wPassCount>=m_wPlayerCount-1)
	{
		ZeroMemory(m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount);
		m_bTurnCardCount=0;
		if(m_bResidualCardCount)
			RecruitCard(m_wCurrentUser);
	}
	//新一轮设置分数牌
	if(!m_bTurnCardCount)
		for(BYTE i=0;i<m_bOneTurnScoreCard.GetSize();i++)
			m_UserScoreCard[m_wCurrentUser].Add(m_bOneTurnScoreCard.GetAt(i));

	//清理一轮分值牌数组
	m_bOneTurnScoreCard.RemoveAll();
	m_bOneTurnScoreCard.FreeExtra();

	
	//发送数据
	CMD_S_PassCard PassCard;
	PassCard.wPassUser=wChairID;
	PassCard.wCurrentUser=m_wCurrentUser;
	PassCard.bNewTurn=(m_bTurnCardCount==0)?TRUE:FALSE;
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_PASS_CARD,&PassCard,sizeof(PassCard));
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_PASS_CARD,&PassCard,sizeof(PassCard));
	//结束判断
	BYTE bScoreCardCount=0;
	for(BYTE j=0;j<GAME_PLAYER;j++)
	{
		bScoreCardCount+=m_UserScoreCard[j].GetSize();

	}
	if(bScoreCardCount==12)
		OnEventGameEnd(wChairID,NULL,GER_NORMAL);

	return true;
}
Example #8
0
//用户放弃
bool CTableFrameSink::OnUserPassCard(WORD wChairID)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true;
	if ((wChairID!=m_wCurrentUser)||(m_bTurnCardCount==0)) return false;
	ASSERT((wChairID==m_wCurrentUser)&&(m_bTurnCardCount));

	//设置变量
	bool bNewTurn=false;
	m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount;
	if(m_wCurrentUser==m_wFirstUser)
	{
		m_wCurrentUser=m_wBankerUser;
		m_wFirstUser=m_wBankerUser;	
		for(BYTE i=0;i<m_bTurnCardCount;i++)
			m_bZhanPaiData[m_wBankerUser].Add(m_bTurnCardData[i]);
		bNewTurn=true;
	}		

	//发送数据
	CMD_S_PassCard PassCard;
	ZeroMemory(&PassCard,sizeof(CMD_S_PassCard));
	if(bNewTurn)
	{
		CopyMemory(&PassCard.bZhanPaiData,m_bTurnCardData,sizeof(m_bTurnCardData));
		PassCard.bZhanpaiUser=m_wBankerUser;
		ZeroMemory(m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount);
		m_bTurnCardCount=0;
	}
	PassCard.wPassUser=wChairID;
	PassCard.wCurrentUser=m_wCurrentUser;
	PassCard.bNewTurn=bNewTurn;
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_PASS_CARD,&PassCard,sizeof(PassCard));
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_PASS_CARD,&PassCard,sizeof(PassCard));
	//判断结束
	BYTE bZhanPaiCount=0;
	for(BYTE j=0;j<GAME_PLAYER;j++)
	{
		bZhanPaiCount+=m_bZhanPaiData[j].GetSize();
	}		

	if(bZhanPaiCount>=16)
					OnEventGameEnd(wChairID,NULL,GER_NORMAL);
	return true;
}
Example #9
0
//游戏开始
bool __cdecl CTableFrameSink::OnEventGameStart()
{
	//设置状态
	m_pITableFrame->SetGameStatus(GS_RF_PLAYING);

	//混乱扑克
	BYTE bRandCard[52];
	m_GameLogic.RandCardList(bRandCard,CountArray(bRandCard));

	//分发扑克
	for (WORD i=0;i<m_wPlayerCount;i++)
	{
		m_bCardCount[i]=13;
		CopyMemory(&m_bHandCardData[i],&bRandCard[i*m_bCardCount[i]],sizeof(BYTE)*m_bCardCount[i]);
		m_GameLogic.SortCardList(m_bHandCardData[i],m_bCardCount[i]);
	}

//////////////////////////////////////////////////////////////////////////

	//BYTE MyCardData[13]=
	//{
	//	//0x02,0x12,0x22,0x32,0x09,0x19,0x29,0x39,0x0d,0x1d,0x2d,0x3d,0x38
	//	0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03
	//};
	//CopyMemory(&m_bHandCardData[0],MyCardData,sizeof(BYTE)*13);
	//m_GameLogic.SortCardList(m_bHandCardData[0],13);
//////////////////////////////////////////////////////////////////////////

	//设置用户
	if(m_wBankerUser!=INVALID_CHAIR)
		m_wCurrentUser=m_wBankerUser;
	else
	{
		m_wCurrentUser=rand()%m_wPlayerCount;
	}

	////设置用户
	//for (WORD i=0;i<m_wPlayerCount;i++)
	//{
	//	for (BYTE j=0;j<m_bCardCount[i];j++)
	//	{
	//		if (m_bHandCardData[i][j]==0x03) 
	//		{
	//			//设置用户
	//			m_wBankerUser=i;
	//			m_wCurrentUser=i;

	//			goto SET_CURRENT_USER;
	//		}
	//	}
	//}

	////错误判断
	//ASSERT(FALSE);
	//SET_CURRENT_USER:

	//发送扑克
	CMD_S_GameStart GameStart;
	GameStart.wBankerUser=m_wBankerUser;
	GameStart.wCurrentUser=m_wCurrentUser;
	for (WORD i=0;i<m_wPlayerCount;i++)
	{
		CopyMemory(GameStart.cbCardData,m_bHandCardData[i],sizeof(GameStart.cbCardData));
		m_pITableFrame->SendTableData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart));
		m_pITableFrame->SendLookonData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart));
	}

	//////////////////////////////////////////////////////////////////////////
	//检测全大全小
	for (WORD i=0;i<GAME_PLAYER;i++)
	{	
		if( m_GameLogic.IsAllSmall(m_bHandCardData[i],m_bCardCount[i]) )
		{
			m_wAllBigOrSmallUser=i;
			OnEventGameEnd(i,NULL,GER_NORMAL);
		}
	}
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		if( m_GameLogic.IsAllBig(m_bHandCardData[i],4)  )
		{
			m_wAllBigOrSmallUser=i;
			OnEventGameEnd(i,NULL,GER_NORMAL);
		}
	}
	//////////////////////////////////////////////////////////////////////////
	return true;
}
Example #10
0
//加注事件
bool CTableFrameSink::OnUserAddGold(WORD wChairID, DOUBLE fGold, bool bCancel)
{
	WORD i = 0;
	//设置数据
	if (bCancel==false)
	{
		//效验数据
		GT_ASSERT(m_wCurrentUser==wChairID);
		if (m_wCurrentUser!=wChairID) return false;

		//计算限注
		DOUBLE fMaxGold=0L;
		if (m_bSendCardCount<=2)
		{
			fMaxGold=m_fMaxGold/4L;
			if(fMaxGold <= m_pGameServiceOption->dwCellScore)
			{
				fMaxGold = m_pGameServiceOption->dwCellScore;
			}
		}
		else if (m_bSendCardCount==3) fMaxGold=m_fMaxGold/2L;
		else fMaxGold=m_fMaxGold;
		
		//计算剩下的金币
		DOUBLE fLeaveGold=fMaxGold-m_fTableGold[wChairID*2+1];
		m_fTableGold[wChairID*2]=__min(fLeaveGold,__max(fGold,m_fTurnBasicGold));
	}

	//操作次数
	bool bFinishTurn=false;
	WORD wNextUser=INVALID_CHAIR;
	for (i=0;i<m_wPlayerCount-1;i++)
	{
		m_wOperaCount++;
		wNextUser=(m_wCurrentUser+i+1)%m_wPlayerCount;
		if (m_bPlayStatus[wNextUser]==TRUE) break;
	}
	
	//判断下注
	if (m_wOperaCount>=m_wPlayerCount)
	{
		DOUBLE fTableGold=0L;
		for (i=0;i<m_wPlayerCount;i++)
		{
			if (m_bPlayStatus[i]==TRUE)
			{
				fTableGold=m_fTableGold[i*2];
				break;
			}
		}
		while (i<m_wPlayerCount)
		{
			if ((m_bPlayStatus[i]==TRUE)&&(m_fTableGold[i*2]!=fTableGold)) break;
			i++;
		}
		if (i==m_wPlayerCount) bFinishTurn=true;
	}

	//一轮判断
	if (bFinishTurn==true)
	{
		//发送数据
		CMD_S_AddGold GoldResult;
		GoldResult.fCurrentLessGold=0L;
		GoldResult.wLastChairID=wChairID;
		GoldResult.wCurrentUser=INVALID_CHAIR;
		GoldResult.fLastAddGold=m_fTableGold[wChairID*2];
		m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult));
		m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult));

		//投注
		tagBetScoreInfo BetScoreInfo;
		BetScoreInfo.wBetRegionIndex = 0;
		for(int i = 0; i < m_pGameServiceAttrib->wChairCount; i ++)
		{
			IServerUserItem * pIServerUserItem = m_pITableFrame->GetServerUserItem(i);
			if(pIServerUserItem != NULL)
			{
				BetScoreInfo.dwBetScore = m_fTableGold[i*2];
				BetScoreInfo.pIServerUserItem = pIServerUserItem;

				if(m_pICalculateFrame->BetScore(pIServerUserItem, &BetScoreInfo, 1) == false)
				{
					GT_ASSERT(FALSE);
					return false;
				}
			}
		}
		//累计金币
		for (WORD i=0;i<m_wPlayerCount;i++)
		{
			m_fTableGold[i*2+1]+=m_fTableGold[i*2];
			m_fTableGold[i*2]=0L;
		}

		//开始一轮
		if (m_bSendCardCount<5) 
		{
			//设置变量
			m_wOperaCount=0;
			m_bSendCardCount++;
			m_fTurnBasicGold=0L;
			m_wCurrentUser=DeduceWiner(1,m_bSendCardCount-1);

			//发送扑克
			CMD_R_SendCard SendCard;
			for (WORD i=0;i<m_wPlayerCount;i++) 
			{
				if (m_bPlayStatus[i]==TRUE) m_bTableCardCount[i]=m_bSendCardCount;
				SendCard.bUserCard[i]=m_bTableCardArray[i][m_bSendCardCount-1];
			}

			//删除旧定时器
			/*if (m_bTimeStation!=255)
			{
			KillTimer(m_bTimeStation);
			m_bTimeStation=255;
			}*/

			//设置定时器
			/*m_bTimeStation=TIME_PASS+m_wCurrentUser;
			SetTimer(m_bTimeStation,TIME_COUNT);*/

			//发送消息
			SendCard.wCurrentUser=m_wCurrentUser;
			SendCard.fMaxGold=(m_bSendCardCount!=3)?m_fMaxGold:m_fMaxGold/2L;
			m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));
			m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));
		}
		else OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);
	}
	else
	{
		//设置变量
		m_wCurrentUser=wNextUser;
		m_fTurnBasicGold=__max(m_fTableGold[wChairID*2],m_fTurnBasicGold);

		//发送数据
		CMD_S_AddGold AddGold;
		AddGold.wLastChairID=wChairID;
		AddGold.wCurrentUser=m_wCurrentUser;
		AddGold.fCurrentLessGold=m_fTurnBasicGold;
		AddGold.fLastAddGold=m_fTableGold[wChairID*2];
		m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold));
		m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold));

		//删除旧定时器
		/*if (m_bTimeStation!=255)
		{
			KillTimer(m_bTimeStation);
			m_bTimeStation=255;
		}

		//设置定时器
		m_bTimeStation=TIME_PASS+m_wCurrentUser;
		SetTimer(m_bTimeStation,TIME_COUNT);*/
	}

	return true;
}
Example #11
0
//用户出牌
bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true;
	if (wChairID!=m_wCurrentUser) return false;

	//类型判断
	BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount);
	if (bCardType==CT_INVALID) return false;

	//更随出牌
	if (m_bTurnCardCount==0)
		m_bTurnCardCount=bCardCount;
	else if 
		(m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) 
		return false;

	//删除扑克
	if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) 
		return false;
	m_bCardCount[wChairID]-=bCardCount;

	//出牌记录
	m_bTurnCardCount=bCardCount;
	m_bOutCardCount[wChairID]++;
	CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount);
	
	//切换用户
	m_wTurnWiner=wChairID;
	if (m_bGameEnd[wChairID]<m_wPlayerCount-1)
	{
		if (bCardType!=CT_HAVE_D)
		{
			 BYTE i = (m_wCurrentUser+1)%m_wPlayerCount;
			while(1)
			{
				if (i < GAME_PLAYER && m_bCardCount[i]>0)
				{
					m_wCurrentUser=i;
					break;
				}
				else
					i = (i++)%m_wPlayerCount;
			}
		}
	}
	else 
		m_wCurrentUser=INVALID_CHAIR;

	m_PassIndex = 0;
	//构造数据
	CMD_S_OutCard OutCard;
	OutCard.bCardCount=bCardCount;
	OutCard.wOutCardUser=wChairID;
	OutCard.wCurrentUser=m_wCurrentUser;
	CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE));

	//发送数据
	WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE);
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);

	//出牌最大
	if (bCardType==CT_HAVE_D) m_bTurnCardCount=0;

	//结束判断
	//if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL);
	
	if (m_bCardCount[wChairID] <= 0)
	{
		m_EndOrder++;
		m_bGameEnd[wChairID] = m_EndOrder;
		if (m_EndOrder >= m_wPlayerCount-1 || m_wCurrentUser == INVALID_CHAIR)
		{
			m_EndOrder = 0;
			OnEventGameEnd(wChairID,NULL,GER_NORMAL);
		}
	}
	
	return true;
}
Example #12
0
//叫分事件
bool CTableFrameSink::OnUserLandScore(WORD wChairID, BYTE bLandScore)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_WK_SCORE) return true;
	if (wChairID!=m_wCurrentUser) return false;

	//首叫状态
	if(m_bBackCatchTag==FALSE && m_bLookCardTag==FALSE)
	{
		//效验参数
		ASSERT(bLandScore==BACK_CATCH || bLandScore==LOOK_CARD);
		if(bLandScore!=BACK_CATCH && bLandScore!=LOOK_CARD)return false;

		//选择看牌
		if(bLandScore==LOOK_CARD)
		{
			//设置变量
			m_bLookCardTag=TRUE;

			//发送扑克
			SendUserCard();
		}
		//选择闷抓
		else
		{
			//设置变量
			m_bBackCatchTag=TRUE;

			//确定庄家
			m_wBankerUser = wChairID;

			//积分翻倍
			m_wBombTime*=2;

			//下位叫分
			m_wCurrentUser=(wChairID+1)%m_wPlayerCount;
		}

		//继续询问
		BYTE bCurrentState=((bLandScore==LOOK_CARD)?CALL_BANKER:CALL_SCORE);
		WORD wBankerUser=((bLandScore==LOOK_CARD)?INVALID_CHAIR:m_wBankerUser);
		SendUserInfoData(wChairID,bLandScore,m_wCurrentUser,bCurrentState,wBankerUser);
	}
	//叫庄状态
	else if(m_wBankerUser==INVALID_CHAIR)
	{
		//效验参数
		ASSERT(bLandScore==MING_CATCH || bLandScore==NULL);
		if(bLandScore!=MING_CATCH && bLandScore!=NULL)return false;

		//用户状态
		ASSERT(m_bCallBanker[wChairID] == FALSE);
		if(m_bCallBanker[wChairID] != FALSE)return false;

		//设置变量
		if(bLandScore==MING_CATCH)m_bCallBanker[wChairID] = 2*TRUE;
		else m_bCallBanker[wChairID] = TRUE;

		//判断次数
		bool bFullTimes = false;
		WORD i=0;
		for(i=0;i<m_wPlayerCount;i++)
			if(m_bCallBanker[i] == FALSE)
			break;
		if(i==m_wPlayerCount)bFullTimes=true;

		//判断开始
		if(bFullTimes || bLandScore==MING_CATCH)
		{
			//确定庄家
			if(bLandScore==MING_CATCH)
			{
				m_wBankerUser = wChairID;

				//开始出牌
				if(bFullTimes)
				{
					SendUserInfoData(wChairID,bLandScore,INVALID_CHAIR,0,m_wBankerUser);
					UserStartOutCard();
				}
				//询问叫分
				else 
				{
					//插入底牌
					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_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount;
					BYTE bCurrentState = 0x10+CALL_SCORE;
					SendUserInfoData(wChairID,bLandScore,m_wCurrentUser,bCurrentState,m_wBankerUser);
				}
			}
			else
			{
				//游戏结束
				OnEventGameEnd(INVALID_CHAIR,NULL,GER_DISMISS);
 			}
			return true;
		}

		//询问下位
		m_wCurrentUser = (m_wCurrentUser+1)%m_wPlayerCount;
		ASSERT(m_bCallBanker[m_wCurrentUser] != TRUE);
 
		// oma add
		// TODO 
		// 下一个用户闷抓或者看牌

		//构造数据
		CMD_S_CallBanker CallBanker;
		ZeroMemory(&CallBanker,sizeof(CallBanker));
		CallBanker.wCurrentUser = m_wCurrentUser;

		m_bBackCatchTag = FALSE; // 复位闷抓看牌标志
		m_bLookCardTag = FALSE;

		m_pITableFrame->SendTableData( INVALID_CHAIR, SUB_S_CHOICE_LOOK, &CallBanker, sizeof( CallBanker ) );
		m_pITableFrame->SendLookonData( INVALID_CHAIR, SUB_S_CHOICE_LOOK, &CallBanker, sizeof( CallBanker ) );
 		// oma add ok
  		//	//继续询问
		//SendUserInfoData(wChairID,bLandScore,m_wCurrentUser,CALL_BANKER,INVALID_CHAIR);
	}
	//叫分状态
	else 
	{
		//效验参数
		ASSERT(m_bCallScoreTimes[wChairID]<MAX_CALL_TIMES);
		ASSERT(bLandScore==DOUBLE_SCORE || bLandScore==0);
		if(m_bCallScoreTimes[wChairID]>=MAX_CALL_TIMES)return false;
		if(bLandScore!=DOUBLE_SCORE && bLandScore!=0)return false;

		//设置变量
		if(bLandScore==0)m_bCallScoreTag[wChairID] = TRUE;
		else m_bCallScoreTimes[wChairID]++;
		if(m_bCallScoreTimes[wChairID]==MAX_CALL_TIMES)m_bCallScoreTag[wChairID] = TRUE;

		//判断开始
		bool bStartOut=(m_bCallScoreTag[m_wBankerUser]==TRUE)?true:false;
		if(!bStartOut && bLandScore==0 && m_wBankerUser!=wChairID)
		{
			WORD wUser1 = m_wPlayerCount-m_wBankerUser-wChairID;
			if(m_bCallScoreTag[wUser1]==TRUE && m_bCallScoreTimes[wUser1]<MAX_CALL_TIMES)
				bStartOut=true;
			WORD wUser2 = (m_wBankerUser+1)%m_wPlayerCount;
			if(!bStartOut && m_bLookCardTag==TRUE && wUser2==wChairID && m_bCallScoreTimes[wUser2]==0 && m_bCallBanker[wUser1]==TRUE)
				bStartOut=true;
		}

		//开始出牌
		if(bStartOut)
		{
			if(bLandScore==DOUBLE_SCORE)
			{
				SendUserInfoData(wChairID,bLandScore,INVALID_CHAIR,0,INVALID_CHAIR);
			}

			//发送扑克
			SendUserCard();

			//开始出牌
			UserStartOutCard();

			return true;
		}

		//下位玩家
		WORD wNextUser = INVALID_CHAIR;
		for(WORD i=1;i<m_wPlayerCount;i++)
		{
			wNextUser = (wChairID+i)%m_wPlayerCount;
			if(m_bCallScoreTag[wNextUser]!=TRUE)break;
		}

		//当前用户
		ASSERT(wNextUser<m_wPlayerCount && m_bCallScoreTimes[wNextUser]<MAX_CALL_TIMES);
		m_wCurrentUser = wNextUser;

		//继续询问
		BYTE bCallScoreState=((m_bCallScoreTimes[m_wCurrentUser]==0)?CALL_SCORE:CALL_TWO_SCORE);
		SendUserInfoData(wChairID,bLandScore,m_wCurrentUser,bCallScoreState,INVALID_CHAIR);
	}

	return true;
}
Example #13
0
//用户出牌
bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true;
	if (wChairID!=m_wCurrentUser) return false;

	//类型判断
	BYTE bCardType;
	
	//是否有赖子
	if(m_GameLogic.IsHadRoguishCard(bCardData,bCardCount))
	{
		bCardType=m_GameLogic.GetMagicCardType(bCardData,bCardCount);
		//BYTE bTempCard[21];
		//CopyMemory(bTempCard,bCardData,bCardCount);
		//for(int i=0;i<bCardCount;i++)
		//{
		//	if(bTempCard[i]==0x43)
		//		bTempCard[i]=m_bMagicCard;
		//}
		//m_GameLogic.SortCardList(bTempCard,bCardCount);
		//更随出牌
		//if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount;
		//else if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false;
		////出牌记录
		//m_bTurnCardCount=bCardCount;
		//m_bOutCardCount[wChairID]++;
		//CopyMemory(m_bTurnCardData,bTempCard,sizeof(BYTE)*bCardCount);
		//炸弹判断
		//if ((bCardType==CT_BOMB_CARD)||(bCardType==CT_MISSILE_CARD)) m_wBombTime*=2;
	}
	else
	{
		bCardType=m_GameLogic.GetCardType(bCardData,bCardCount);
	}
	if (bCardType==CT_INVALID) return false;
	//更随出牌
	if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount;
	else if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false;
	//出牌记录
	m_bTurnCardCount=bCardCount;
	m_bOutCardCount[wChairID]++;
	//炸弹判断
	if ((bCardType==CT_BOMB_CARD)||(bCardType==CT_MISSILE_CARD)) m_wBombTime*=4;
	if(bCardType==CT_BOMB_SOFT)	m_wBombTime*=2;
	CopyMemory(m_bTurnCardData,bCardData,bCardCount);
	//删除扑克
	if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false;
	m_bCardCount[wChairID]-=bCardCount;

	//出牌记录
	m_bTurnCardCount=bCardCount;
	m_bOutCardCount[wChairID]++;
	CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount);	
	//切换用户
	m_wTurnWiner=wChairID;
	if (m_bCardCount[wChairID]!=0)
	{
		if (bCardType!=CT_MISSILE_CARD) m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount;
	}
	else m_wCurrentUser=INVALID_CHAIR;

	//构造数据
	CMD_S_OutCard OutCard;
	OutCard.bCardCount=bCardCount;
	OutCard.wOutCardUser=wChairID;
	OutCard.wCurrentUser=m_wCurrentUser;
	CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE));

	//发送数据
	WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE);
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);

	//出牌最大
	if (bCardType==CT_MISSILE_CARD) m_bTurnCardCount=0;

	//结束判断
	if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL);

	return true;
}
Example #14
0
//用户出牌
bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_RF_PLAYING) return true;
	if (wChairID!=m_wCurrentUser) return false;



	//删除扑克
	if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false;
	m_bCardCount[wChairID]-=bCardCount;


	//出牌记录
	m_bTurnCardCount	=	bCardCount;
	CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount);
	m_sTurnCardType		=   m_GameLogic.GetCardType(m_bTurnCardData,m_bTurnCardCount);
    
	
	//切换用户
	if(m_bCardCount[wChairID]==0&&(m_bCardCount[(wChairID+2)%m_wPlayerCount]==0))
	{
		 m_wCurrentUser=INVALID_CHAIR;
	}
	else
	{
		if(m_sTurnCardType!=(((short(17))<<8)|CT_FOUR_KING))
		   m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount;
		while(m_bCardCount[m_wCurrentUser]==0)
		   m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount;
		

	}
   
	if(m_bCardCount[wChairID]==0)
	{
		m_bRanKing[m_bMark]=wChairID;
		m_bMark++;
		m_wTurnWiner=m_wCurrentUser;
		CMD_S_MESSAGE message;
		TCHAR  *szBuffer[3]={"一","二","三"};
		IServerUserItem * pIServerUserItem=m_pITableFrame->GetServerUserItem(wChairID);
		_sntprintf(message.szBuffer,sizeof(message.szBuffer),
			"%-s 第%s个出完牌",pIServerUserItem->GetUserData()->szAccounts,szBuffer[m_bMark-1]);
		m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SYSTEM_MESSAGE,&message,sizeof(message));
		m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SYSTEM_MESSAGE,&message,sizeof(message));
		
	}
	else
		m_wTurnWiner=wChairID;

	
	
	

	//构造数据
	CMD_S_OutCard OutCard;
	OutCard.bCardCount=bCardCount;
	OutCard.wOutCardUser=wChairID;
	OutCard.wCurrentUser=m_wCurrentUser;
	CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE));

	//发送数据
	WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE);
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	
	//发送对家扑克
	if(m_bCardCount[wChairID]==0&&m_wCurrentUser!=INVALID_CHAIR)
	{
		CMD_S_CARD SCard;
		SCard.wFromUser=(wChairID+2)%m_wPlayerCount;
		SCard.bCardCount=m_bCardCount[SCard.wFromUser];
		CopyMemory(SCard.bCardData,m_bHandCardData[SCard.wFromUser],SCard.bCardCount);
		m_pITableFrame->SendTableData(wChairID,SUB_S_CARD,&SCard,sizeof(SCard));
	}
	
	if(m_bCardCount[(wChairID+2)%m_wPlayerCount]==0&&m_wCurrentUser!=INVALID_CHAIR)
	{
		CMD_S_CARD SCard;
		SCard.wFromUser=wChairID;
		SCard.bCardCount=m_bCardCount[SCard.wFromUser];
		CopyMemory(SCard.bCardData,m_bHandCardData[wChairID],SCard.bCardCount);
		m_pITableFrame->SendTableData((wChairID+2)%m_wPlayerCount,SUB_S_CARD,&SCard,sizeof(SCard));
	}

	//结束判断
	if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL);

	return true;
}
Example #15
0
//用户出牌
bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount)
{
	//效验状态
	ASSERT(m_pITableFrame->GetGameStatus()==GS_WK_PLAYING);
	ASSERT(wChairID==m_wCurrentUser);
	if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true;
	if (wChairID!=m_wCurrentUser) return false;

	//类型判断
	BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount);
	if (bCardType==CT_INVALID) return false;
	//庄家设置
	m_wBankerUser=wChairID;

	//更随出牌
	if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount;
	else if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false;

	//删除扑克
	if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false;
	m_bCardCount[wChairID]-=bCardCount;

	//出牌记录
	m_bTurnCardCount=bCardCount;
	CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount);
	//计分牌型统计
	if(m_GameLogic.IsXi(m_bTurnCardData,m_bTurnCardCount))
		m_bUserOutCardInfo[wChairID].bXiCard+=m_bTurnCardCount;
	if(m_GameLogic.IsOx(m_bTurnCardData,m_bTurnCardCount))
		m_bUserOutCardInfo[wChairID].bOxCard+=m_bTurnCardCount;
	if(m_GameLogic.IsXiBaoLiang(m_bTurnCardData,m_bTurnCardCount))
		m_bUserOutCardInfo[wChairID].bXiCard+=4;
	if(m_GameLogic.GetCardType(m_bTurnCardData,m_bTurnCardCount)==CT_LIANGZI)
		m_bUserOutCardInfo[wChairID].bLiangPai+=2;

////////////////////////////////////////////////////////////////////

	//切换用户
	bool bNewTurn=false;
	if (m_bCardCount[wChairID]!=0)
	{
		m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount;
		if(m_wCurrentUser==m_wFirstUser)
		{
			m_wCurrentUser=m_wBankerUser;
			m_wFirstUser=m_wBankerUser;
			bNewTurn=true;
			for(BYTE i=0;i<m_bTurnCardCount;i++)
				m_bZhanPaiData[m_wBankerUser].Add(m_bTurnCardData[i]);		
		}
	}
	//构造数据
	CMD_S_OutCard OutCard;
	ZeroMemory(&OutCard,sizeof(CMD_S_OutCard));
	if(bNewTurn)
	{
		CopyMemory(&OutCard.bZhanPaiData,m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount);
		CopyMemory(&OutCard.bCardData,m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount);
		ZeroMemory(m_bTurnCardData,sizeof(m_bTurnCardData));
		m_bTurnCardCount=0;
	}
	else
	{
		CopyMemory(&OutCard.bCardData,m_bTurnCardData,sizeof(BYTE)*m_bTurnCardCount);

	}
	OutCard.bCardCount=bCardCount;
	OutCard.wOutCardUser=wChairID;
	OutCard.wCurrentUser=m_wCurrentUser;
	OutCard.bNewTurn=bNewTurn;
	//发送数据
	WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE);
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	//判断结束
	BYTE bZhanPaiCount=0;
	for(BYTE j=0;j<GAME_PLAYER;j++)
	{
		bZhanPaiCount+=m_bZhanPaiData[j].GetSize();
	}
	if(bZhanPaiCount>=16)
		OnEventGameEnd(wChairID,NULL,GER_NORMAL);


	return true;
}
Example #16
0
//加注事件
bool CTableFrameSink::OnUserAddGold(WORD wChairID, LONG lGold, bool bCancel)
{
	//效验
	if( m_bGameEnd ) 
	{
		m_pITableFrame->KillGameTimer(IDI_GAME_END);
		return OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);
	}

	//设置数据
	if (bCancel==false)
	{
		//效验数据
		ASSERT(m_wCurrentUser==wChairID);
		if (m_wCurrentUser!=wChairID) return false;

		ASSERT( !m_bShowHand && lGold >= m_lTurnBasicGold && lGold <= m_lTurnMaxGold
			|| lGold+m_lTableGold[wChairID*2+1]==m_lUserScore[wChairID] );
		if( (m_bShowHand || lGold < m_lTurnBasicGold || lGold > m_lTurnMaxGold)
			&& lGold+m_lTableGold[wChairID*2+1]!=m_lUserScore[wChairID] ) 
			return false;

		m_lTableGold[wChairID*2]=lGold;

		if( !m_bShowHand && m_lTableGold[wChairID*2]+m_lTableGold[wChairID*2+1] == m_lUserScore[wChairID] ) 
			m_bShowHand = true;
	}

	//操作次数
	bool bFinishTurn=false;
	WORD wNextUser=INVALID_CHAIR;
	for (WORD i=0;i<m_wPlayerCount-1;i++)
	{
		m_wOperaCount++;
		wNextUser=(m_wCurrentUser+i+1)%m_wPlayerCount;
		if (m_cbPlayStatus[wNextUser]==TRUE) break;
	}
	
	//判断下注
	if (m_wOperaCount>=m_wPlayerCount)
	{
		LONG lTableGold=0L;
		for (WORD i=0;i<m_wPlayerCount;i++)
		{
			if (m_cbPlayStatus[i]==TRUE)
			{
				lTableGold=m_lTableGold[i*2];
				break;
			}
		}
		while (i<m_wPlayerCount)
		{
			if (m_cbPlayStatus[i]==TRUE) 
			{
				if( !m_bShowHand&&m_lTableGold[i*2]!=lTableGold ||
					m_bShowHand&&m_lTableGold[i*2]+m_lTableGold[i*2+1]<m_lUserScore[i] )
					break;
			}
			i++;
		}
		if (i==m_wPlayerCount) bFinishTurn=true;
	}

	//一轮判断
	if (bFinishTurn==true)
	{
		//发送数据
		CMD_S_AddGold GoldResult;
		GoldResult.lCurrentLessGold=0L;
		GoldResult.wLastChairID=wChairID;
		GoldResult.wCurrentUser=INVALID_CHAIR;
		GoldResult.lLastAddGold=m_lTableGold[wChairID*2];
		GoldResult.bShowHand = m_bShowHand;
		m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult));
		m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&GoldResult,sizeof(GoldResult));

		//累计金币
		for (WORD i=0;i<m_wPlayerCount;i++)
		{
			m_lTableGold[i*2+1]+=m_lTableGold[i*2];
			m_lTableGold[i*2]=0L;
		}

		//开始一轮
		if (m_bSendCardCount<5) 
		{
			//设置变量
			m_wOperaCount=0;
			m_lTurnBasicGold=0L;
			WORD wLastMostUser = EstimateWinner(1,m_bSendCardCount-1);

			BYTE bySourceCount = m_bSendCardCount;
			if( m_bShowHand ) m_bSendCardCount = MAX_COUNT;
			else m_bSendCardCount++;

			//发送扑克
			CMD_R_SendCard SendCard;
			ZeroMemory( &SendCard,sizeof(SendCard) );
			for (WORD i=0;i<m_wPlayerCount;i++) 
			{
				if (m_cbPlayStatus[i]==FALSE) continue;

				m_cbCardCount[i]=m_bSendCardCount;

				//派发扑克
				for (BYTE j=0;j<(m_bSendCardCount-bySourceCount);j++)
				{
					ASSERT(j<CountArray(SendCard.bUserCard[i]));
					SendCard.bUserCard[i][j]=m_cbHandCardData[i][bySourceCount+j];
				}
			}

			m_wCurrentUser=EstimateWinner(1,m_bSendCardCount-1);
			m_lTurnMaxGold = m_bSendCardCount>=3?m_lMaxGold:m_lMaxGold/2L;

			//发送消息
			SendCard.wCurrentUser=(m_bShowHand?INVALID_CHAIR:m_wCurrentUser);
			SendCard.wStartChairId = wLastMostUser;
			SendCard.cbSendCardCount = m_bSendCardCount-bySourceCount;
			SendCard.lMaxGold=m_lTurnMaxGold;
			m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));
			m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));

			//结束游戏
			if ( m_bSendCardCount == 5 && m_lMaxGold <= m_lTableGold[m_wCurrentUser*2+1] ) 
			{
				m_bGameEnd = true;
				m_cbGameEndReason = GER_NORMAL;
				m_pITableFrame->SetGameTimer(IDI_GAME_END,3000,1,0);
			}
		}
		else 
		{
			m_bGameEnd = true;
			m_cbGameEndReason = GER_NORMAL;
			m_pITableFrame->SetGameTimer(IDI_GAME_END,2000,1,0);
		}
	}
	else
	{
		//设置变量
		m_wCurrentUser=wNextUser;
		m_lTurnBasicGold=__max(m_lTableGold[wChairID*2],m_lTurnBasicGold);

		//发送数据
		CMD_S_AddGold AddGold;
		AddGold.wLastChairID=wChairID;
		AddGold.wCurrentUser=m_wCurrentUser;
		AddGold.lCurrentLessGold=m_lTurnBasicGold;
		AddGold.lLastAddGold=m_lTableGold[wChairID*2];
		AddGold.bShowHand = m_bShowHand;
		m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold));
		m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_GOLD,&AddGold,sizeof(AddGold));
	}

	if( m_wCurrentUser != INVALID_CHAIR )
		m_pITableFrame->SetGameTimer( IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser );

	return true;
}
Example #17
0
//加注事件 
bool CTableFrameSink::OnUserAddScore(WORD wChairID, LONG lScore, bool bGiveUp)
{
	//校验用户
	ASSERT(m_wCurrentUser==wChairID);
	if (m_wCurrentUser!=wChairID) return false; 

	//校验金币
	ASSERT((lScore +m_lTotalScore[wChairID])<= m_lUserMaxScore[wChairID]);	
	if ((lScore+m_lTotalScore[wChairID])>m_lUserMaxScore[wChairID]) return false;
	ASSERT(lScore>=0L);
	if ((lScore<0)) return false;

	//累计金币
	m_lTableScore[wChairID] += lScore;
	m_lTotalScore[wChairID] += lScore;

	//平衡下注
	if(m_lTableScore[wChairID] > m_lBalanceScore )
	{
		m_lBalanceScore = m_lTableScore[wChairID];
	}

	//梭哈判断
	if(m_lTotalScore[wChairID]==m_lUserMaxScore[wChairID])
	{
		m_cbShowHand[wChairID] = TRUE;
	}

	//用户切换
	WORD wNextPlayer=INVALID_CHAIR;
	for (WORD i=1;i<m_wPlayerCount;i++)
	{
		//设置变量
		m_wOperaCount++;
		wNextPlayer=(m_wCurrentUser+i)%m_wPlayerCount;

		//继续判断
		if ((m_cbPlayStatus[wNextPlayer]==TRUE) &&(m_cbShowHand[wNextPlayer] == FALSE)) break;
	}
	ASSERT(wNextPlayer < m_wPlayerCount);

	//完成判断
	bool bFinishTurn=false;
	if (m_wOperaCount>=m_wPlayerCount)
	{
		WORD i=0;
		for ( i=0;i<m_wPlayerCount;i++)
		{
			//过滤未平衡 和未梭哈用户
			if ((m_cbPlayStatus[i]==TRUE)&&(m_lTableScore[i]<m_lBalanceScore)&&(m_cbShowHand[i]==FALSE)) 
				break;
		}
		if (i==m_wPlayerCount) 
			bFinishTurn=true;
	}

	//A家show190,B放弃,C还选择?
	if(!bFinishTurn)
	{
		WORD wPlayCount = 0,wShowCount = 0;
		for (BYTE i=0;i<m_wPlayerCount;i++)
		{
			if(m_cbPlayStatus[i]==TRUE)
			{
				if(m_cbShowHand[i]==TRUE)
				{
					wShowCount++;
				}
				wPlayCount++;
			}
		}
		if(wPlayCount-1==wShowCount && m_lTableScore[wNextPlayer]>=m_lBalanceScore) bFinishTurn=true;
	}

	//继续加注
	if (!bFinishTurn)
	{
		//当前用户
		m_wCurrentUser=wNextPlayer;

		//最小值为平衡下注 -桌面下注  和 剩余金币中取小 可能梭哈
		m_lTurnLessScore = min(m_lBalanceScore - m_lTableScore[m_wCurrentUser],m_lUserMaxScore[m_wCurrentUser] - m_lTotalScore[m_wCurrentUser]);
		m_lTurnMaxScore = m_lUserMaxScore[m_wCurrentUser]-m_lTotalScore[m_wCurrentUser];
		if(m_lTotalScore[m_wCurrentUser]==m_lCellScore)
		{
			LONG bTemp = (m_lBalanceScore==m_lCellScore*2)?(m_lCellScore*2):((m_lBalanceScore-m_lCellScore*2)*2);
			m_lAddLessScore = m_lCellScore+bTemp;
		}
		else m_lAddLessScore = (m_lBalanceScore==0)?(2*m_lCellScore):(__max((m_lBalanceScore-m_lTableScore[m_wCurrentUser])*2,2L*m_lCellScore));

		//构造数据
		CMD_S_AddScore AddScore;
		ZeroMemory(&AddScore,sizeof(AddScore));
		AddScore.lAddScoreCount=lScore;
		AddScore.wAddScoreUser=wChairID;
		AddScore.wCurrentUser=m_wCurrentUser;
		AddScore.lTurnLessScore=m_lTurnLessScore;
		AddScore.lTurnMaxScore = m_lTurnMaxScore;
		AddScore.lAddLessScore = m_lAddLessScore;

		//发送数据
		m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore));
		m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore));

		return true;
	}

	//平衡次数
	m_cbBalanceCount++;
	m_wOperaCount=0;

	//第1次下注平衡后就开始发给三张公牌
	//第2次下注平衡后就开始发第四张公牌
	//第3次下注平衡后就开始发第五张公牌
	//第4次下注平衡后就结束游戏 

	//D家下注
	WORD wDUser=m_wDUser;
	for(BYTE i=0;i<GAME_PLAYER;i++)
	{
		wDUser=(m_wDUser+i)%GAME_PLAYER;		
		if(m_cbPlayStatus[wDUser]==TRUE && m_cbShowHand[wDUser]==FALSE) break;
	}

	//重值变量
	m_lBalanceScore = 0L;
	m_lTurnLessScore = 0L;
	m_lTurnMaxScore = m_lUserMaxScore[wDUser]-m_lTotalScore[wDUser];
	m_lAddLessScore = 2*m_lCellScore;

	//构造数据
	CMD_S_AddScore AddScore;
	ZeroMemory(&AddScore,sizeof(AddScore));
	AddScore.wAddScoreUser=wChairID;
	AddScore.wCurrentUser=INVALID_CHAIR;
	AddScore.lAddScoreCount=lScore;
	AddScore.lTurnLessScore=m_lTurnLessScore;
	AddScore.lTurnMaxScore = m_lTurnMaxScore;
	AddScore.lAddLessScore = m_lAddLessScore;

	//清理数据
	ZeroMemory(m_lTableScore,sizeof(m_lTableScore));
	m_lBalanceScore = 0L;

	//发送数据
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore));
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore));

	//结束判断
	if (m_cbBalanceCount == 4) 
	{
		OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);
		return true;
	}

	//梭哈用户统计
	WORD wShowHandCount=0,wPlayerCount=0;
	for (WORD i=0;i<m_wPlayerCount;i++)
	{
		if (m_cbShowHand[i]==TRUE)	wShowHandCount++;
		if (m_cbPlayStatus[i]==TRUE) wPlayerCount++;
	}

	//只剩一玩家没梭或者全梭
	if((wShowHandCount >= wPlayerCount -1) && m_cbBalanceCount < 4)
	{
		//构造数据
		CMD_S_SendCard SendCard;
		ZeroMemory(&SendCard,sizeof(SendCard));
		SendCard.cbPublic = m_cbBalanceCount;
		SendCard.wCurrentUser = INVALID_CHAIR;
		SendCard.cbSendCardCount = MAX_CENTERCOUNT;
		CopyMemory(SendCard.cbCenterCardData,m_cbCenterCardData,sizeof(BYTE)*MAX_CENTERCOUNT);

		//发送数据
		m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));
		m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));

		//结束游戏
		OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);

		return true;
	}

	//盲注玩家
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		//临时变量
		BYTE cbNextUser =(m_wDUser+i)%GAME_PLAYER;

		//获取用户
		IServerUserItem * pIServerUserItem=m_pITableFrame->GetServerUserItem(cbNextUser);

		//无效用户 梭哈用户过滤
		if (pIServerUserItem==NULL||m_cbPlayStatus[cbNextUser] == FALSE||m_cbShowHand[cbNextUser] == 1) 
			continue;

		m_wCurrentUser = cbNextUser;
		break;
	}

	//构造数据
	CMD_S_SendCard SendCard;
	ZeroMemory(&SendCard,sizeof(SendCard));
	SendCard.cbPublic = 0;
	SendCard.wCurrentUser = m_wCurrentUser;
	SendCard.cbSendCardCount = 3 +(m_cbBalanceCount-1);
	CopyMemory(SendCard.cbCenterCardData,m_cbCenterCardData,sizeof(BYTE)*(SendCard.cbSendCardCount));

	//发送数据
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));

	return true;
}
Example #18
0
//放弃事件
bool CTableFrameSink::OnUserGiveUp(WORD wChairID)
{
	//状态判断
	ASSERT(m_cbPlayStatus[wChairID]==TRUE);
	if (m_cbPlayStatus[wChairID]==FALSE) return false;

	//效验
	if( m_bGameEnd ) 
	{
		m_pITableFrame->KillGameTimer(IDI_GAME_END);
		return OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);
	}

	//设置数据
	m_cbPlayStatus[wChairID]=FALSE;
	m_cbCardCount[wChairID]=0;

	//重新获取最大下注
	if( m_lUserScore[wChairID] == m_lMaxGold )
	{
		for( WORD i = 0; i < GAME_PLAYER; i ++ )
		{
			if( !m_cbPlayStatus[i] ) continue;
			m_lMaxGold = m_lUserScore[i];
			break;
		}
		for( ; i < GAME_PLAYER; i++ )
		{
			if( m_cbPlayStatus[i] )
				m_lMaxGold = __min(m_lMaxGold,m_lUserScore[i]);
		}
	}
	m_lTurnMaxGold = m_bSendCardCount>=3?m_lMaxGold:m_lMaxGold/2L;

	//发送放弃消息
	CMD_S_GiveUp GiveUp;
	GiveUp.wUserChairID=wChairID;
	GiveUp.lTurnMaxGold = m_lTurnMaxGold;
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp));
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GIVE_UP,&GiveUp,sizeof(GiveUp));

	//变量定义
	LONG lScore=0;
	LONG lRevenue=0;
	enScoreKind ScoreKind;

	//设置变量
	ScoreKind=enScoreKind_Lost;
	lScore=-m_lTableGold[wChairID*2]-m_lTableGold[wChairID*2+1];

	//用户写分
	m_pITableFrame->WriteUserScore(wChairID,lScore,lRevenue,ScoreKind);

	//判断结束
	WORD wPlayerCount=0;
	for (WORD i=0;i<m_wPlayerCount;i++)
	{
		if (m_cbPlayStatus[i]==TRUE) wPlayerCount++;
	}
	if (wPlayerCount>=2)
	{
		if (m_wCurrentUser==wChairID) OnUserAddGold(wChairID,0L,true);
	}
	else OnEventGameEnd(INVALID_CHAIR,NULL,GER_NO_PLAYER);

	return true;
}
Example #19
0
//用户出牌
bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_RF_PLAYING) return true;
	if (wChairID!=m_wCurrentUser) return false;

	//类型判断
	BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount);
	if (bCardType==CT_ERROR) return false;

	//首出判断
	if ((wChairID==m_wBankerUser)&&(m_bCardCount[wChairID]==13))
	{
		for (BYTE i=0;i<bCardCount;i++)
		{
			if (bCardData[i]==0x03) break;
		}
		if (i==bCardCount) return false;
	}

	//更随出牌
	if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount;
	else if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false;

	//删除扑克
	if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false;
	m_bCardCount[wChairID]-=bCardCount;

	//大牌判断
	bool bMostest=false;
	if ((bCardCount<=3)&&(bCardData[0]==0x32)) bMostest=true;

	//出牌记录
	m_bTurnCardCount=bCardCount;
	CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount);

	//切换用户
	m_wTurnWiner=wChairID;
	if (m_bCardCount[wChairID]!=0)
	{
		if (bMostest==false) m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount;
	}
	else m_wCurrentUser=INVALID_CHAIR;

	//构造数据
	CMD_S_OutCard OutCard;
	OutCard.bCardCount=bCardCount;
	OutCard.wOutCardUser=wChairID;
	OutCard.wCurrentUser=m_wCurrentUser;
	CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE));

	//发送数据
	WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE);
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);

	//出牌最大
	if (bMostest==true) m_bTurnCardCount=0;

	//结束判断
	if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL);

	return true;
}
Example #20
0
//定时器事件
bool __cdecl CTableFrameSink::OnTimerMessage(WORD wTimerID, WPARAM wBindParam)
{
	switch (wTimerID)
	{
	case IDI_FREE:		//空闲时间结束
		{
			//开始游戏
			m_pITableFrameControl->StartGame();

			//启动下注计时器
			m_pITableFrame->SetGameTimer(IDI_PLACE_JETTON,TIME_PLACE_JETTON*1000,1,0L);

			//设置游状态为下注阶段
			m_pITableFrame->SetGameStatus(GS_PLACE_JETTON);

			return true;
		}
	case IDI_PLACE_JETTON:		//下注时间结束
		{
			//状态判断(防止强退重复设置)
			if (m_pITableFrame->GetGameStatus()!=GS_GAME_END)
			{
				//设置状态
				m_pITableFrame->SetGameStatus(GS_GAME_END);			

				//结束游戏
				OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);

				//设置时间
				m_pITableFrame->SetGameTimer(IDI_GAME_END,TIME_GAME_END*1000,1,0L);			
			}

			return true;
		}
	case IDI_GAME_END:			//结束游戏
		{
			//写入积分
			for ( WORD wUserChairID = 0; wUserChairID < GAME_PLAYER; ++wUserChairID )
			{
				IServerUserItem *pIServerUserItem = m_pITableFrame->GetServerUserItem(wUserChairID);
				if ( pIServerUserItem == NULL ) 
					continue;

				//胜利类型
				enScoreKind ScoreKind=(m_iUserWinScore[wUserChairID]>0L)?enScoreKind_Win:enScoreKind_Lost;

				//写入积分
				if (m_iUserWinScore[wUserChairID]!=0L) 
					m_pITableFrame->WriteUserScore(wUserChairID,m_iUserWinScore[wUserChairID], m_iUserRevenue[wUserChairID], ScoreKind);

				//坐庄条件判断。一轮游戏结束,玩家有输有赢。所以需要在申请上庄队列里把输了钱不在满足做庄的玩家清除掉
				__int64 iUserScore=pIServerUserItem->GetUserScore()->lScore;
				if (wUserChairID!=m_wCurrentBanker && iUserScore<m_iApplyBankerCondition)
				{
					for (WORD i=0; i<m_ApplyUserArray.GetCount(); ++i)
					{
						if (wUserChairID!=m_ApplyUserArray[i]) continue;

						//从庄家队列删除不符合上庄的玩家
						m_ApplyUserArray.RemoveAt(i);

						//发送消息
						CMD_S_CancelBanker CancelBanker;
						ZeroMemory(&CancelBanker,sizeof(CancelBanker));

						//设置变量
						lstrcpyn(CancelBanker.szCancelUser,pIServerUserItem->GetAccounts(),CountArray(CancelBanker.szCancelUser));

						//发送消息
						m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_CANCEL_BANKER, &CancelBanker, sizeof(CancelBanker));
						m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_CANCEL_BANKER, &CancelBanker, sizeof(CancelBanker));

						//提示消息
						TCHAR szTipMsg[128];
						_sntprintf(szTipMsg,CountArray(szTipMsg),TEXT("由于你的金币数少于坐庄必须金币数(%I64d),你自动下庄!"),m_iApplyBankerCondition);
						SendGameMessage(wUserChairID,szTipMsg);

						break;
					}
				}
			}

			//结束游戏
			m_pITableFrame->ConcludeGame();

			//切换庄家
			ChangeBanker(false);

			//设置时间
			m_dwJettonTime=(DWORD)time(NULL);
			m_pITableFrame->SetGameTimer(IDI_FREE,TIME_FREE*1000,1,0L);

			//发送消息
			CMD_S_GameFree GameFree;
			ZeroMemory(&GameFree,sizeof(GameFree));
			GameFree.cbTimeLeave=TIME_FREE;
			GameFree.cbGameRecord = m_iGoalAnimal;
			GameFree.iGameTimes = m_iGameTimes;
			m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_FREE,&GameFree,sizeof(GameFree));
			m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_FREE,&GameFree,sizeof(GameFree));

			return true;
		}
	}

	return false;
}
Example #21
0
//用户胡牌
bool CTableFrameSink::OnUserHu( WORD wChairID, const void *pDataBuffer)
{
	//效验状态
	if( m_pITableFrame->GetGameStatus() != GS_WK_PLAYING )	
	{
		MessageBox( NULL, "GS_WK_PLAYING", 0, 0 );
		return false;
	}

	CMD_C_Hu *hu = ( CMD_C_Hu * )pDataBuffer;
	//权限效验
	if( m_ActionRight[wChairID] < hu->nRight )
	{
		return false;
	}
	m_strFang= new char[300];
	int userCount = 0;		//操作者数
	for( int i=0; i<m_wPlayerCount; i++ )
	{
		//跳过自已,和出牌者
		if( i==wChairID || i==m_wCurrentUser )
			continue;

		//if( m_ActionRight[i]>6 )
		//{
		//	MessageBox( 0,"有一炮多响", 0, 0 );
		//	//break;
		//	//等待,可能有多人胡
		//}
		//胡处理
		else 
		{
			userCount ++;
			m_ActionRight[i] = 0;
			if( userCount == 2 )
			{
				//玩家结算
				m_wTurnWiner= wChairID;				//赢家
				//自摸
				if( m_byHandMjs[wChairID][HAND_MJ_MAX-1] != 0 )
				{
					//天胡
					if(m_bTianHu)
					{
						strcpy(m_strFang, "天胡 +9番");
						m_nFang[wChairID] = 9;	
						return  OnEventGameEnd( wChairID, NULL, GER_NORMAL );
					}
					//地胡
					if(m_bDiHu[wChairID])
					{
						strcpy(m_strFang, "地胡 +9番");
						m_nFang[wChairID] = 9;
						return  OnEventGameEnd( wChairID, NULL, GER_NORMAL );
					}
					m_bZiM= true;
					int huType = m_GameLogic.IsHu( m_byHandMjs[wChairID], m_byHandMjCount[wChairID]-1, m_byHandMjs[wChairID][HAND_MJ_MAX-1], m_hu[wChairID], &m_tempHu[wChairID]);
					if(  huType== 1)
					{
						m_nFang[wChairID] = m_GameLogic.CheckGDHu( m_tempHu[wChairID], m_GameLogic.TransIDToFeng( wChairID, m_wBankerUser), m_wQFeng, m_strFang );
						strcat( m_strFang, "自摸 +1番" );
						//自摸 +1番
						if( m_nFang[wChairID]<5)
						{
							m_nFang[wChairID]+= 1;
						}
					}
					else
					{
						//九莲灯
						if( huType-20 == 9 )
						{
							strcpy(m_strFang, "九莲宝灯 +9番,");
							m_nFang[wChairID] = 9;							
						}
						//十三幺
						else if( huType-20== 13)
						{
							strcpy( m_strFang, "十三幺 +9番,");
							m_nFang[wChairID] = 9;
						}
					}
				}
				//有人放炮
				else
				{
					if(m_bRenHu[wChairID])
					{
						strcpy(m_strFang, "人胡 +9番");
						m_nFang[wChairID] = 9;	
						return  OnEventGameEnd( wChairID, NULL, GER_NORMAL );
					}
					m_wLastUser= m_wCurrentUser;		//输家
					int huType = m_GameLogic.IsHu( m_byHandMjs[wChairID], m_byHandMjCount[wChairID], m_byOutMj, m_hu[wChairID], &m_tempHu[wChairID]);
					if(  huType== 1)
					{
						m_nFang[wChairID] = m_GameLogic.CheckGDHu( m_tempHu[wChairID], m_GameLogic.TransIDToFeng( wChairID, m_wBankerUser), m_wQFeng, m_strFang );
					}
					else
					{
						//九莲灯
						if( huType-20 == 9 )
						{
							strcpy(m_strFang, "九莲宝灯 +9番,");
							m_nFang[wChairID] = 9;							
						}
						//十三幺
						else if( huType-20== 13)
						{
							strcpy( m_strFang, "十三幺 +9番,");
							m_nFang[wChairID] = 9;
						}
					}
				}
				////自摸
				//if( m_byHandMjs[wChairID][HAND_MJ_MAX-1] != 0 )
				//{
				//	
				//	//for( int i=0; i<m_wPlayerCount; i++)
				//	//{
				//	//	if( i==wChairID)
				//	//		continue;
				//	//	else
				//	//		m_nFang[i] -= m_nFang[wChairID];
				//	//}
				//}
				////有人放炮
				//else
				//{
				//
				//	//m_nFang[m_wCurrentUser] -= m_nFang[wChairID];
				//}
				//胡牌处理
				 return  OnEventGameEnd( wChairID, NULL, GER_NORMAL );
			}
		}
	}
	return true;
}
Example #22
0
//用户出牌
bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE bCardData[], BYTE bCardCount)
{
	//效验状态
	if (m_pITableFrame->GetGameStatus()!=GS_WK_PLAYING) return true;
	if (wChairID!=m_wCurrentUser) return false;

	//类型判断
	BYTE bCardType=m_GameLogic.GetCardType(bCardData,bCardCount);
	if (bCardType==CT_INVALID) return false;

	//更随出牌
	if (m_bTurnCardCount==0) m_bTurnCardCount=bCardCount;
	else 
	{
		//防作弊
		//守八一
		if(m_bCardCount[wChairID]>1)
		{
			if(m_bCardCount[wChairID]-bCardCount<1)
				return false;
			//最后一张不能为2
			else if(m_bCardCount[wChairID]-bCardCount==2  || m_bCardCount[wChairID]-bCardCount==1)
			{
				if(m_GameLogic.IsCardTwoOwner(m_bHandCardData[wChairID],m_bCardCount[wChairID]))
				{
					if(!m_GameLogic.IsCardTwoOwner(bCardData,bCardCount))
						return false;
				}
			}
		}
		if (m_GameLogic.CompareCard(bCardData,m_bTurnCardData,bCardCount,m_bTurnCardCount)==false) return false;
	}

	//删除扑克
	if (m_GameLogic.RemoveCard(bCardData,bCardCount,m_bHandCardData[wChairID],m_bCardCount[wChairID])==false) return false;
	m_bCardCount[wChairID]-=bCardCount;

	//出牌记录
	m_bTurnCardCount=bCardCount;
	//报八一
	if( m_bCardCount[wChairID]==1 )
	{
		CMD_S_EightOne EightOne;
		EightOne.wEightOneUser=wChairID;
		m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_EIGHT_ONE,&EightOne,sizeof(EightOne));
	}
	m_bOutCardCount[wChairID]++;
	CopyMemory(m_bTurnCardData,bCardData,sizeof(BYTE)*bCardCount);

	//炸弹判断
//	if ((bCardType==CT_BOMB_CARD)||(bCardType==CT_MISSILE_CARD)) m_wBombTime*=2;
	
	//切换用户
	m_wTurnWiner=wChairID;
	if (m_bCardCount[wChairID]!=0)
	{
		m_wCurrentUser=(m_wCurrentUser+1)%m_wPlayerCount;
	}
	else m_wCurrentUser=INVALID_CHAIR;

	//构造数据
	CMD_S_OutCard OutCard;
	OutCard.bCardCount=bCardCount;
	OutCard.wOutCardUser=wChairID;
	OutCard.wCurrentUser=m_wCurrentUser;
	CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE));

	//发送数据
	WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE);
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);

	////出牌最大
	//if (bCardType==CT_MISSILE_CARD) m_bTurnCardCount=0;

	//结束判断
	if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(wChairID,NULL,GER_NORMAL);

	return true;
}
Example #23
0
//用户出牌
bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE cbCardData[], BYTE cbCardCount, bool bIsHandOut[],bool bIsAutoOut)
{
	//效验状态
	ASSERT(m_pITableFrame->GetGameStatus()==GS_UG_PLAY);
	if (m_pITableFrame->GetGameStatus()!=GS_UG_PLAY) return true;

	//效验用户
	if(bIsHandOut[wChairID]==false)
	{
		ASSERT((wChairID==m_wCurrentUser)&&(cbCardCount<=MAX_COUNT));
		if ((wChairID!=m_wCurrentUser)||(cbCardCount>MAX_COUNT)) return false;
	}
	else
	{
		ASSERT((cbCardCount<=MAX_COUNT));
		if (cbCardCount>MAX_COUNT) return false;
		if (!bIsAutoOut) wChairID=(m_wBankerUser+2)%m_wPlayerCount;
	}
	//首出牌者
	if (m_wFirstOutUser==wChairID)
	{
		//类型判断
		BYTE cbCardType=m_GameLogic.GetCardType(cbCardData,cbCardCount);
		if (cbCardType==CT_ERROR||cbCardType!=CT_SINGLE) return false;
	}
	else
	{
		//数目判断
		ASSERT(cbCardCount==m_cbOutCardCount[m_wFirstOutUser]);
		if (cbCardCount!=m_cbOutCardCount[m_wFirstOutUser]) return false;

		//出牌效验
		if (m_GameLogic.EfficacyOutCard(cbCardData,cbCardCount,m_cbOutCardData[m_wFirstOutUser],
			m_cbOutCardCount[m_wFirstOutUser],m_cbHandCardData[wChairID],m_cbHandCardCount[wChairID])==false)
		{
			ASSERT(FALSE);
			return false;
		}
	}

	//删除扑克
	if (m_GameLogic.RemoveCard(cbCardData,cbCardCount,m_cbHandCardData[wChairID],m_cbHandCardCount[wChairID])==false) return false;
	m_cbHandCardCount[wChairID]-=cbCardCount;
	
	//出牌记录
	m_cbOutCardCount[wChairID]=cbCardCount;
	CopyMemory(m_cbOutCardData[wChairID],cbCardData,cbCardCount);

	//切换用户
	m_wCurrentUser=(wChairID+1)%m_wPlayerCount;
	if (m_wCurrentUser==m_wFirstOutUser) m_wCurrentUser=INVALID_CHAIR;

	

	if (m_wCurrentUser!=INVALID_CHAIR)
	{
		//轮到明手出牌
		if(m_wCurrentUser==(m_wBankerUser+2)%GAME_PLAYER)
		{
			bHandOutFlag[m_wBankerUser]=true;
		}
	}

	//构造数据
	CMD_S_OutCard OutCard;
	OutCard.wOutCardUser=wChairID;
	OutCard.cbCardCount=cbCardCount;
	OutCard.wCurrentUser=m_wCurrentUser;
	OutCard.bHandOutCardCount=m_cbHandCardCount[(m_wBankerUser+2)%m_wPlayerCount];
	//OutCard.bHandOutCardData=m_cbHandCardData[(m_wBankerUser+2)%m_wPlayerCount];
	CopyMemory(OutCard.bHandOutCardData,m_cbHandCardData[(m_wBankerUser+2)%m_wPlayerCount],sizeof(m_cbHandCardData[(m_wBankerUser+2)%m_wPlayerCount]));
	CopyMemory(OutCard.cbCardData,cbCardData,cbCardCount*sizeof(BYTE));
	CopyMemory(OutCard.bHandOutFlag,bHandOutFlag,sizeof(bHandOutFlag));

	//发送数据
	//WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.cbCardData)+OutCard.cbCardCount*sizeof(BYTE);
	//m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	//m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
	m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,sizeof(OutCard));
	m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,sizeof(OutCard));

	//一轮结算
	if (m_wCurrentUser==INVALID_CHAIR)
	{
		//判断胜者
		m_wTurnWinner=m_GameLogic.CompareCardArray(m_cbOutCardData,m_cbOutCardCount[0],m_wFirstOutUser);

		//计算得分
		if ((m_wTurnWinner!=m_wBankerUser)&&((m_wTurnWinner+2)%m_wPlayerCount!=m_wBankerUser)) //庄家和对家
		{
			m_cbValueOrder[1]+=1;
		}
		else
		{
			m_cbValueOrder[0]+=1;
		}

		//设置变量
		if (m_cbHandCardCount[m_wTurnWinner]!=0)
		{
			m_wFirstOutUser=m_wTurnWinner;
			ZeroMemory(m_cbOutCardData,sizeof(m_cbOutCardData));
			ZeroMemory(m_cbOutCardCount,sizeof(m_cbOutCardCount));
		}

		ZeroMemory(bHandOutFlag,sizeof(bHandOutFlag));
		//用户切换
		m_wCurrentUser=(m_cbHandCardCount[m_wTurnWinner]==0)?INVALID_CHAIR:m_wTurnWinner;

		//设置明手
		if (m_wCurrentUser!=INVALID_CHAIR)
		{
			//轮到明手出牌
			if(m_wCurrentUser==(m_wBankerUser+2)%GAME_PLAYER)
			{
				bHandOutFlag[m_wBankerUser]=true;
			}
		}

		//构造数据
		CMD_TurnBalance TurnBalance;
		TurnBalance.wTurnWinner=m_wTurnWinner;
		TurnBalance.wCurrentUser=m_wCurrentUser;
		TurnBalance.bBankerScore=m_cbValueOrder[0];
		TurnBalance.bOtherScore=m_cbValueOrder[1];
		CopyMemory(TurnBalance.bHandOutFlag,bHandOutFlag,sizeof(bHandOutFlag));


		//发送数据
		m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_TURN_BALANCE,&TurnBalance,sizeof(TurnBalance));
		m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_TURN_BALANCE,&TurnBalance,sizeof(TurnBalance));
	}

	//结束判断
	if (m_wCurrentUser==INVALID_CHAIR) OnEventGameEnd(m_wTurnWinner,NULL,GER_NORMAL);

	return true;
}