//绘画界面
void CGameClientView::DrawGameView(CDC * pDC, int nWidth, int nHeight)
{
	//绘画背景
	DrawViewImage(pDC,m_ImageViewFill,enMode_Spread);
	DrawViewImage(pDC,m_ImageViewBack,enMode_Centent);

	//绘画用户
	TCHAR szBuffer[64]=TEXT("");
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		//变量定义
		WORD wUserTimer=GetUserTimer(i);
		const tagUserData * pUserData=GetUserInfo(i);
		//test
		//WORD wUserTimer = 30;
		//tagUserData *pUserData = new tagUserData;
		//lstrcpy(pUserData->szName,TEXT("测试玩家"));
		//pUserData->lScore = 10000L;
		//pUserData->cbUserStatus = US_READY;

		//绘画用户
		if (pUserData!=NULL)
		{
			//用户名字
			pDC->SetTextAlign(((i==0)||(i==1))?TA_RIGHT:TA_LEFT);
			DrawTextString(pDC,pUserData->szName,RGB(255,255,255),RGB(0,0,0),m_ptName[i].x,m_ptName[i].y);

			//用户金币
			LONG lLeaveScore=pUserData->lScore-((pUserData->cbUserStatus==US_PLAY)?m_lTableScore[i]:0);
			_snprintf(szBuffer,CountArray(szBuffer),TEXT("%ld"),lLeaveScore);
			DrawTextString(pDC,szBuffer,RGB(255,255,255),RGB(0,0,0),m_ptName[i].x,m_ptName[i].y+16);
			//当前下注
			if( m_lTableScore[i] > 0L )
			{
				if( i == 2 ) pDC->SetTextAlign(TA_RIGHT);
				_snprintf(szBuffer,CountArray(szBuffer),TEXT("已下注%ld"),m_lTableScore[i]);
				DrawTextString(pDC,szBuffer,RGB(255,255,255),RGB(0,0,0),m_ptTableScore[i].x,m_ptTableScore[i].y);
			}

			//其他信息
			if (wUserTimer!=0) DrawUserTimer(pDC,m_ptTimer[i].x,m_ptTimer[i].y,wUserTimer);
			if (pUserData->cbUserStatus==US_READY) DrawUserReady(pDC,m_ptReady[i].x,m_ptReady[i].y);
			DrawUserFace(pDC,pUserData,m_ptFace[i].x,m_ptFace[i].y,pUserData->cbUserStatus==US_OFFLINE);
		}
		//delete pUserData;

		//玩家筹码
		m_PlayerJeton[i].DrawJettonControl(pDC);
		//筹码数字
		LONG lJetonScore = m_PlayerJeton[i].GetScore();
		if( lJetonScore > 0L )
		{
			CPoint pt = m_PlayerJeton[i].GetBenchmarkPos();
			CRect rcDraw(pt.x-50,pt.y+15,pt.x+50,pt.y+27);
			_snprintf(szBuffer,CountArray(szBuffer),TEXT("%ld"),lJetonScore);
			pDC->SetTextAlign(TA_LEFT);
			DrawTextString(pDC,szBuffer,RGB(255,255,85),RGB(0,0,0),&rcDraw);
		}
	}
	m_PlayerJeton[GAME_PLAYER].DrawJettonControl(pDC);

	//绘画扑克
	if (m_SendCardItemArray.GetCount()>0)
	{
		//变量定义
		CImageHandle HandleCard(&m_ImageCard);
		tagSendCardItem * pSendCardItem=&m_SendCardItemArray[0];

		//获取大小
		int nItemWidth=m_ImageCard.GetWidth()/13;
		int nItemHeight=m_ImageCard.GetHeight()/5;

		//绘画扑克
		m_ImageCard.AlphaDrawImage(pDC,m_SendCardCurPos.x,m_SendCardCurPos.y,nItemWidth,nItemHeight,nItemWidth*2,nItemHeight*4,RGB(255,0,255));
	}
	//test
	//CImageHandle HandleCard(&m_ImageCard);
	//m_ImageCard.AlphaDrawImage(pDC,m_SendCardPos.x,m_SendCardPos.y,m_ImageCard.GetWidth()/13,m_ImageCard.GetHeight()/5,
	//	m_ImageCard.GetWidth()/13*2,m_ImageCard.GetHeight()/5*4,RGB(255,0,255));

	INT nNumberWidth = m_PngNumber.GetWidth()/10;
	INT nNumberHeight = m_PngNumber.GetHeight();
	//底注信息
	if( m_lCellScore > 0L )
	{
		INT nXPos;
		INT nYPos = nHeight/2-325;
		int nCellCount = 0;
		BYTE byCell[10];
		LONG lCellScore = m_lCellScore;
		while( lCellScore > 0L )
		{
			byCell[nCellCount++] = (BYTE)(lCellScore-lCellScore/10*10);
			lCellScore /= 10;
			if( nCellCount == 10 ) break;
		}
		nXPos = nWidth/2-200-nCellCount*nNumberWidth/2;
		for( int j = nCellCount-1; j >= 0; j-- )
		{
			m_PngNumber.DrawImage(pDC,nXPos,nYPos,nNumberWidth,nNumberHeight,byCell[j]*nNumberWidth,0);
			nXPos += nNumberWidth;
		}
	}
	//计算总注
	LONG lTableScore=0L;
	//注:包括正在下注在内
	for(int i = 0; i < GAME_PLAYER; i++ )
		lTableScore += m_PlayerJeton[i].GetScore();
	lTableScore+=m_PlayerJeton[GAME_PLAYER].GetScore();
	//test
	//lTableScore = 1234567L;
	//总注信息
	if (lTableScore>0L)
	{
		INT nXPos = nWidth/2+18;
		INT nYPos = nHeight/2-295;
		int nCellCount = 0;
		BYTE byCell[10];
		while( lTableScore > 0L )
		{
			byCell[nCellCount++] = (BYTE)(lTableScore-lTableScore/10*10);
			lTableScore /= 10;
			if( nCellCount == 10 ) break;
		}
		for( int j = nCellCount-1; j >= 0; j-- )
		{
			m_PngNumber.DrawImage(pDC,nXPos,nYPos,nNumberWidth,nNumberHeight,byCell[j]*nNumberWidth,0);
			nXPos += nNumberWidth;
		}
	}

	return;
}
//显示倍数
void CGameClientView::DrawLandTime(CDC *pDC, INT nViewWidth, INT nViewHeight)
{
	//图片信息
	INT nDigitWidth = m_ImageLandTimes.GetWidth() / 11;
	INT nDigitHeight = m_ImageLandTimes.GetHeight();

	//设置变量
	bool bBrightStart = false;
	for ( WORD wChairID = 0; wChairID < GAME_PLAYER; ++wChairID )
	{
		//存在判断
		tagUserData const *pUserData = GetUserInfo( wChairID );
		if ( pUserData == NULL )  m_bBrightStart[wChairID] = false;
	}
	for ( WORD wChairID = 0; wChairID < GAME_PLAYER; ++wChairID )
		if ( m_bBrightStart[wChairID] ) bBrightStart = true;

	//重置变量
	WORD wCardCount = m_bCardCount[0] + m_bCardCount[1] + m_bCardCount[2];
	if ( ! bBrightStart && wCardCount == 0 ) m_cbBrightTime = 0;

	//翻倍计算
	WORD wDrawTimes=(WORD)m_lBaseScore;
	for (WORD i=1;i<m_cbLandScore;i++) wDrawTimes*=2;

	//总共倍数
	WORD wLandTime = 0;
	if ( m_cbBrightTime != 0 && wDrawTimes == 0 ) wLandTime = m_cbBrightTime;
	else if ( m_cbBrightTime == 0 && wDrawTimes != 0 ) wLandTime = wDrawTimes;
	else if ( m_cbBrightTime != 0 && wDrawTimes != 0 ) wLandTime = m_cbBrightTime * wDrawTimes;

	//大小过滤
	if ( wLandTime <= m_lBaseScore ) return ;

	//数字个数
	INT nDigitCount = 0;
	INT nTmpTime = wLandTime;
	while( 1 <= nTmpTime )
	{
		nDigitCount++;
		nTmpTime /= 10;
	}

	if ( 1 <= nDigitCount )
	{
		//总共长度
		INT nTotalLen = ( nDigitCount +1 ) * nDigitWidth;

		//位置信息
		INT nXPos = 0; 
		INT nYPos = 0;

		nXPos = ( nViewWidth - nTotalLen ) / 2 ;
		nYPos = 150;

		//绘画乘号
		m_ImageLandTimes.DrawImage(pDC, nXPos, nYPos, nDigitWidth, nDigitHeight, 10 * nDigitWidth, 0);

		//开始绘画
		while( 0 < nDigitCount )
		{
			//计算位置
			nXPos += nDigitWidth;

			//计算倍数
			--nDigitCount;
			INT nMutiple = (INT)pow( 10, nDigitCount );

			//绘画数字
			INT nDrawDigit = (INT)(wLandTime / nMutiple) ;
			m_ImageLandTimes.DrawImage(pDC, nXPos, nYPos, nDigitWidth, nDigitHeight, nDrawDigit * nDigitWidth, 0);

			//计算变量
			wLandTime -= ( nMutiple * nDrawDigit );
		}
	}
}
//绘画界面
void CGameClientView::DrawGameView(CDC * pDC, int nWidth, int nHeight)
{
	//地震效果
	if(m_bFalsh)
	{
		CImageHandle ImageHandleBack(&m_ImageViewBack);
		int xValue=rand()%ROCK;
		int yValue=rand()%ROCK;
		if(xValue%2==0)xValue*=(-1);
		if(yValue%2==0)yValue*=(-1);
		m_ImageViewBack.AlphaDrawImage(pDC,(nWidth/2-512)+xValue,(nHeight/2-397)+yValue,
			m_ImageViewBack.GetWidth(),m_ImageViewBack.GetHeight(),0,0,RGB(255,0,255));
	}
	else 
	{
		CImageHandle ImageHandleBack(&m_ImageViewBack);
		m_ImageViewBack.AlphaDrawImage(pDC,(nWidth/2-512+6),(nHeight/2-383),
			m_ImageViewBack.GetWidth(),m_ImageViewBack.GetHeight(),0,0,RGB(255,0,255));

		//绘画背景
		//DrawViewImage(pDC,m_ImageViewCenter,enMode_Spread);//用于最大化窗口
		//DrawViewImage(pDC,m_ImageViewBack,enMode_Centent);
	}

	if(!m_bStopDraw)
	{
		//绘画用户
		for (WORD i=0;i<GAME_PLAYER;i++)
		{
			//变量定义
			WORD wUserTimer=GetUserTimer(i);
			const tagUserData * pUserData=GetUserInfo(i);

#ifdef _DEBUG
			////测试代码
			//tagUserData Obj;
			//Obj.cbGender = 1;
			//_sntprintf(Obj.szName,sizeof(Obj.szName),TEXT("用户的名字"));
			//Obj.cbUserStatus=US_READY;
			////Obj.wFaceID = 2;
			//pUserData = &Obj;

			////庄家标志
			//CImageHandle ImageHandleBanker(&m_ImageBanker);
			//m_ImageBanker.AlphaDrawImage(pDC,m_PointBanker[i].x,m_PointBanker[i].y,m_ImageBanker.GetWidth(),m_ImageBanker.GetHeight(),0,0,RGB(255,0,255));
#endif
			//绘画用户
			if (pUserData!=NULL)
			{
				//用户名字
				pDC->SetTextAlign(TA_CENTER);
				pDC->SetTextColor((wUserTimer>0)?RGB(250,250,250):RGB(220,220,220));
				DrawTextString(pDC,pUserData->szName,RGB(255,255,255),RGB(0,0,0),m_ptFace[i].x+15,m_ptFace[i].y+35);

				//用户金币
				TCHAR szBuffer[64]=TEXT("");
				LONG lLeaveScore=pUserData->lScore-((m_ScoreView.IsWindowVisible()==TRUE)?(0):(m_lTableScore[i]));//;
				if(m_lStopUpdataScore[i]>0)lLeaveScore=m_lStopUpdataScore[i]-m_lTableScore[i];
				_snprintf(szBuffer,sizeof(szBuffer),TEXT("¥%ld"),lLeaveScore);
				DrawTextString(pDC,szBuffer,RGB(255,255,255),RGB(0,0,0),m_ptFace[i].x+10,m_ptFace[i].y+48);

				//其他信息
				//wUserTimer =1;
				if (wUserTimer!=0) 
				{
					if(m_CardControl[MY_SELF_CHAIRID].GetCardCount()==0)
						DrawUserTimer(pDC,m_ptFace[i].x+m_nXFace/2,m_ptTimer[i].y+90,wUserTimer);
					else DrawUserTimer(pDC,m_ptTimer[i].x,m_ptTimer[i].y,wUserTimer);
				}

				//准备标志
				if (pUserData->cbUserStatus==US_READY) 
				{
					DrawUserReady(pDC,m_ptReady[i].x,m_ptReady[i].y);
				}
				DrawUserFace(pDC,pUserData,m_ptFace[i].x,m_ptFace[i].y,pUserData->cbUserStatus==US_OFFLINE);
			}
		}

		//计算总注
		LONG lTableScore=0L;
		for (WORD i=0;i<GAME_PLAYER;i++) lTableScore+=m_lTableScore[i];

		//总注信息
		if (lTableScore>0L)
		{	
			CImageHandle ImageHandle3(&m_ImageNumber);
			int iCount=0;
			LONG lCell[11];
			ZeroMemory(lCell,sizeof(lCell));
			while(lTableScore>0L)
			{
				LONG lScore=lTableScore%10;
				lCell[iCount++] = lScore;
				lTableScore=lTableScore/10;
			}
			int iTemp=0;
			int iX=m_ImageNumber.GetWidth();
			for (int i=iCount-1;i>=0;i--)
			{
				m_ImageNumber.AlphaDrawImage(pDC,nWidth/2+39+(iX/10)*(iTemp++),nHeight/2-296,
					iX/10,m_ImageNumber.GetHeight(),iX/10*lCell[i],0,RGB(255,0,255));
			}
		}

		//庄家信息
		if (m_wBankerUser!=INVALID_CHAIR)
		{
			//庄家标志
			CImageHandle ImageHandleBanker(&m_ImageBanker);
			m_ImageBanker.AlphaDrawImage(pDC,m_PointBanker[m_wBankerUser].x,m_PointBanker[m_wBankerUser].y,m_ImageBanker.GetWidth(),m_ImageBanker.GetHeight(),0,0,RGB(255,0,255));
		}

		//不存在个数
		for (BYTE i=0;i<GAME_PLAYER;i++)	
		{
			//绘画判断
			//m_lCurrentScore[i] = 100000;
			if (m_lCurrentScore[i]==0L) continue;
			LONG lTemp=m_lCurrentScore[i];
			LONG lTimes[]={10,20,50,100,200,500,1000,2000,5000,10000,20000,50000,100000,200000,500000};
			for (BYTE k=CountArray(lTimes)-1;;k--)
			{
				if(lTemp>=lTimes[k])
				{
					//绘画信息
					tagGoldMes tagTemp;
					tagTemp.lDrawCount = (lTemp/lTimes[k]);
					tagTemp.lGoldType = k;
					m_lDrawGold[i].Add(tagTemp);

					while((tagTemp.lDrawCount--)>0)
					{
						//随机位置
						int xTemp=rand();
						int yTemp=rand();
						int bRandX=nWidth/2-25+xTemp%60*((xTemp%2==0)?1:(-1));
						int bRandY=nHeight/2-70+yTemp%60*((yTemp%2==0)?1:(-1));

						//保存随机位置
						CPoint ptTemp;
						ptTemp.SetPoint(bRandX,bRandY);
						m_ptKeepJeton[i].Add(ptTemp);
					}

					lTemp%=lTimes[k];
					if(lTemp==0)break;
				}
			}
			m_lCurrentScore[i]=0L;
		}

		//绘画筹码
		for (BYTE i=0;i<GAME_PLAYER;i++)
		{
			//m_lTableScore[i] = 100000;
			if (m_lTableScore[i]==0L ) continue;
			CImageHandle HandleJeton(&m_ImageJeton);

			//固定位置输出
			int Count=0;
			for(int j=0;j<(m_lDrawGold[i].GetCount());j++)
			{
				LONG lDrawCount = m_lDrawGold[i].GetAt(j).lDrawCount;
				while((lDrawCount--)>0)
				{
					CPoint cpTemp=m_ptKeepJeton[i].GetAt(Count++);
					m_ImageJeton.AlphaDrawImage(pDC,cpTemp.x,cpTemp.y,m_ImageJeton.GetWidth()/15,
						m_ImageJeton.GetHeight(),m_ImageJeton.GetWidth()/15*(m_lDrawGold[i].GetAt(j).lGoldType),0,RGB(255,0,255));
					if(Count==100)break;
				}
				if(Count==100)break;
			}

			//绘画数目
			TCHAR szBuffer[64];
			_snprintf(szBuffer,CountArray(szBuffer),TEXT("$:%ld"),m_lTableScore[i]);

			//计算位置
			CRect rcDrawRect;
			rcDrawRect.top=m_CardControl[i].GetCardPos().y;
			rcDrawRect.left=m_CardControl[i].GetCardPos().x+((i>2)?(135):(-50));
			rcDrawRect.right=rcDrawRect.left+30;
			rcDrawRect.bottom=rcDrawRect.top+12;

			//创建字体
			CFont ViewFont;
			ViewFont.CreateFont(-14,0,0,0,700,0,0,0,134,3,2,1,2,TEXT("宋体"));

			//设置字体
			CFont * pOldFont=pDC->SelectObject(&ViewFont);

			//绘画数目
			pDC->SetTextAlign(TA_LEFT);
			pDC->SetTextColor(RGB(250,200,40));
			pDC->DrawText(szBuffer,lstrlen(szBuffer),&rcDrawRect,DT_CENTER|DT_VCENTER|DT_NOCLIP|DT_SINGLELINE);

			//清理字体
			pDC->SelectObject(pOldFont);
		}

		//绘画信息
		if(m_lCellScore>0)
		{
			//创建字体
			CFont ViewFont;
			ViewFont.CreateFont(-12,0,0,0,700,0,0,0,134,3,2,1,2,TEXT("宋体"));

			//设置字体
			CFont * pOldFont=pDC->SelectObject(&ViewFont);

			pDC->SetTextAlign(TA_LEFT);
			pDC->SetTextColor(RGB(0,0,0));

			//计算位置
			CRect rcDrawRect;

			//绘画数目
			TCHAR szBuffer[64];
			_snprintf(szBuffer,CountArray(szBuffer),TEXT("封顶:%ld"),m_lMaxCellScore);
			rcDrawRect.top=nHeight/2-338;
			rcDrawRect.left=nWidth/2-233;
			rcDrawRect.right=rcDrawRect.left+50;
			rcDrawRect.bottom=rcDrawRect.top+12;
			pDC->DrawText(szBuffer,lstrlen(szBuffer),&rcDrawRect,DT_CENTER|DT_VCENTER|DT_NOCLIP|DT_SINGLELINE);

			_snprintf(szBuffer,CountArray(szBuffer),TEXT("单注:%ld"),m_lCellScore);
			rcDrawRect.top=nHeight/2-318;
			rcDrawRect.left=nWidth/2-230;
			rcDrawRect.right=rcDrawRect.left+50;
			rcDrawRect.bottom=rcDrawRect.top+12;
			pDC->DrawText(szBuffer,lstrlen(szBuffer),&rcDrawRect,DT_CENTER|DT_VCENTER|DT_NOCLIP|DT_SINGLELINE);

			//清理字体
			pDC->SelectObject(pOldFont);		
		}

		//选比标志
		if(m_bCompareCard)
		{
			for (int i=0;i<GAME_PLAYER;i++)
			{
				if(m_bCompareUser[i]==TRUE)
				{
					CPoint cPost=m_CardControl[i].GetCardPos();
					CImageHandle ImageArrowhead(&m_ImageArrowhead);
					m_ImageArrowhead.AlphaDrawImage(pDC,cPost.x,cPost.y-m_ImageArrowhead.GetHeight(),
						m_ImageArrowhead.GetWidth(),m_ImageArrowhead.GetHeight(),0,0,RGB(255,0,255));
				}
			}
		}
	}

	//发牌绘画
	if (m_SendCardItemArray.GetCount()>0)
	{
		//变量定义
		CImageHandle HandleCard(&m_ImageCard);
		tagSendCardItem * pSendCardItem=&m_SendCardItemArray[0];

		//获取大小
		int nItemWidth=m_ImageCard.GetWidth()/13;
		int nItemHeight=m_ImageCard.GetHeight()/5;

		//绘画扑克
		int nXPos=m_SendCardPos.x-nItemWidth/2;
		int nYPos=m_SendCardPos.y-nItemHeight/2+10;
		m_ImageCard.AlphaDrawImage(pDC,nXPos,nYPos,nItemWidth,nItemHeight,nItemWidth*2,nItemHeight*4,RGB(255,0,255));
	}

	//比牌扑克
	if (m_wLoserUser!=INVALID_CHAIR)
	{
		//送牌状态
		if (m_wConmareIndex<m_wConmareCount)
		{
			//绘画扑克
			for (BYTE i=0;i<2;i++)
			{
				//变量定义
				CPoint PointCard;
				CPoint PointStart=m_ptUserCard[m_wCompareChairID[i]];

				//计算位置
				INT nQuotiety=(i==0)?-1:1;
				PointCard.y=PointStart.y+(m_ptUserCompare.y-PointStart.y)*m_wConmareIndex/m_wConmareCount;
				PointCard.x=PointStart.x+(m_ptUserCompare.x-PointStart.x+COMPARE_RADII*nQuotiety)*m_wConmareIndex/m_wConmareCount;

				//绘画扑克
				DrawCompareCard(pDC,PointCard.x,PointCard.y,false);
			}
		}

		//比牌状态
		if ((m_wConmareIndex>=m_wConmareCount)&&((m_wConmareIndex<m_wConmareCount+VSCARD_COUNT*VSCARD_TIME)))
		{
			//绘画扑克
			for (BYTE i=0;i<2;i++)
			{
				//变量定义
				CPoint PointCard;
				CPoint PointStart=m_ptUserCard[m_wCompareChairID[i]];

				//计算位置
				INT nQuotiety=(i==0)?-1:1;
				PointCard.y=m_ptUserCompare.y;
				PointCard.x=m_ptUserCompare.x+COMPARE_RADII*nQuotiety;

				//绘画扑克
				DrawCompareCard(pDC,PointCard.x,PointCard.y,false);
			}

			//比牌标志
			CSize SizeVSCard;
			CPngImage ImageVSCard;
			ImageVSCard.LoadImage(AfxGetInstanceHandle(),TEXT("VS_CARD"));
			SizeVSCard.SetSize(ImageVSCard.GetWidth()/VSCARD_COUNT,ImageVSCard.GetHeight());

			//绘画标志
			INT nImageIndex=(m_wConmareIndex-m_wConmareCount)%VSCARD_COUNT;
			ImageVSCard.DrawImage(pDC,m_ptUserCompare.x-SizeVSCard.cx/2,m_ptUserCompare.y-SizeVSCard.cy/2,
				SizeVSCard.cx,SizeVSCard.cy,nImageIndex*SizeVSCard.cx,0);

			//声音效果
			CGameClientDlg * pGameClientDlg=CONTAINING_RECORD(this,CGameClientDlg,m_GameClientView);
			pGameClientDlg->PlayGameSound(AfxGetInstanceHandle(),TEXT("COMPARE_CARD"));

		}

		//回牌状态
		if (m_wConmareIndex>=m_wConmareCount+VSCARD_COUNT*VSCARD_TIME)
		{
			//变量定义
			WORD wConmareIndex=m_wConmareIndex-m_wConmareCount-VSCARD_COUNT*VSCARD_TIME;

			//绘画扑克
			for (BYTE i=0;i<2;i++)
			{
				//变量定义
				CPoint PointCard;
				CPoint PointStart=m_ptUserCard[m_wCompareChairID[i]];

				//计算位置
				INT nQuotiety=(i==0)?-1:1;
				PointCard.y=m_ptUserCompare.y+(PointStart.y-m_ptUserCompare.y)*wConmareIndex/m_wConmareCount;
				PointCard.x=m_ptUserCompare.x+COMPARE_RADII*nQuotiety+(PointStart.x-m_ptUserCompare.x-COMPARE_RADII*nQuotiety)*wConmareIndex/m_wConmareCount;

				//绘画扑克
				DrawCompareCard(pDC,PointCard.x,PointCard.y,(m_wLoserUser==m_wCompareChairID[i])?true:false);
			}

			//声音效果
			if(m_wConmareIndex==m_wConmareCount+VSCARD_COUNT*VSCARD_TIME)
			{
				CGameClientDlg * pGameClientDlg=CONTAINING_RECORD(this,CGameClientDlg,m_GameClientView);
				pGameClientDlg->PlayGameSound(AfxGetInstanceHandle(),TEXT("CENTER_SEND_CARD"));
			}
		}
	}

	//等待选择
	if(m_wWaitUserChoice!=INVALID_CHAIR)
	{
		TCHAR szBuffer[64]=TEXT("");

		//创建字体
		CFont ViewFont;
		ViewFont.CreateFont(-15,0,0,0,700,0,0,0,134,3,2,1,2,TEXT("宋体"));

		//设置字体
		CFont * pOldFont=pDC->SelectObject(&ViewFont);
		pDC->SetTextAlign(TA_CENTER);

		//输出信息
		if(m_wWaitUserChoice==TRUE)_sntprintf(szBuffer,sizeof(szBuffer),TEXT("等待玩家选择比牌"));
		else _sntprintf(szBuffer,sizeof(szBuffer),TEXT("请选择玩家进行比牌"));
		DrawTextString(pDC,szBuffer,RGB(50,50,50),RGB(0,170,0),nWidth/2+10,nHeight/2+45);

		//清理字体
		pDC->SelectObject(pOldFont);
	}

	return;
}
//绘画界面
void CGameClientView::DrawGameView(CDC * pDC, int nWidth, int nHeight)
{
	//绘画背景
	DrawViewImage(pDC,m_ImageBack,enMode_Spread);
	DrawViewImage(pDC,m_ImageCenter,enMode_Centent);

	//绘画用户
	TCHAR szBuffer[32];
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		//变量定义
		WORD wUserTimer=GetUserTimer(i);
		const tagUserData * pUserData=GetUserInfo(i);

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

		//tagUserData *pUserData = new tagUserData;
		//strcpy( (char*)pUserData->szName, "dkjfdkfjdkfj" );
		//pUserData->cbUserStatus = US_READY;
		//wUserTimer = 10;
		//m_ImageLand.DrawImage(pDC,m_ptLand[i].x,m_ptLand[i].y);
		//m_wBombTime = 2;
		///////////////////////////////////////////////////////

		//绘画用户
		if (pUserData!=NULL)
		{
			//用户名字
			pDC->SetTextAlign( ( ( i == 2 && ! m_bDeasilOrder ) || ( i == 0 && m_bDeasilOrder ) ) ? TA_RIGHT : TA_LEFT );
			pDC->SetTextColor((wUserTimer>0)?RGB(250,250,250):RGB(220,220,220));
			DrawTextString( pDC, pUserData->szName, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_ptName[i].x,m_ptName[i].y );

			//剩余扑克
		//	if (i!=1)
			{
				_snprintf(szBuffer,sizeof(szBuffer),TEXT("剩余:%d 张"),m_bCardCount[i]);
				DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_ptName[i].x,m_ptName[i].y+18 );
			}

			//其他信息
			if (wUserTimer!=0) DrawUserTimer(pDC,m_ptTimer[i].x,m_ptTimer[i].y,wUserTimer);
			if (pUserData->cbUserStatus==US_READY) DrawUserReady(pDC,m_ptReady[i].x,m_ptReady[i].y);
			DrawUserFace(pDC,pUserData,m_ptFace[i].x,m_ptFace[i].y,pUserData->cbUserStatus==US_OFFLINE);
		}
	}

	//叫分标志
	int nXImagePos,nImageWidth=m_ImageScore.GetWidth(),nImageHeight=m_ImageScore.GetHeight();
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		if ((m_bScore[i]!=0)||(m_bPass[i]==true))
		{
			if ( m_bPass[i]==true ) nXImagePos=m_ImageScore.GetWidth()*4/5;
			else if ( m_bScore[i]==255 ) nXImagePos=m_ImageScore.GetWidth()*3/5;
			else nXImagePos=(m_bScore[i]-1)*m_ImageScore.GetWidth()/5;
			m_ImageScore.DrawImage(pDC,m_ptScore[i].x,m_ptScore[i].y,nImageWidth/5,nImageHeight,nXImagePos,0);
		}
	}

	//庄家位置
	if (m_wLandUser!=INVALID_CHAIR)
	{
		//获取用户
		const tagUserData * pUserData=GetUserInfo(m_wLandUser);
		if (pUserData!=NULL)
		{
			//变量定义
			TCHAR szBuffer[64];

			//设置 DC
			pDC->SetTextAlign(TA_LEFT|TA_TOP);
			pDC->SetTextColor(RGB(250,250,250));

			//绘画信息
			m_ImageLand.DrawImage(pDC,m_ptLand[m_wLandUser].x,m_ptLand[m_wLandUser].y);
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("地主:%s"),pUserData->szName);
			pDC->TextOut(m_nXBorder+m_nXFace+10,m_nYBorder+8,szBuffer,lstrlen(szBuffer));

			//绘画头像
			DrawUserFace(pDC,pUserData,m_nXBorder+5,m_nYBorder+5,false);

			//叫牌分数
			LONG lScore=m_cbLandScore*m_lBaseScore;
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("分数:%ld 分"),lScore);
			DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_nXBorder+m_nXFace+10,m_nYBorder+25 );
		}
	}

	//绘画爆炸
	if (m_bBombEffect==true)
	{
		//加载资源
		CImageHandle HandleBombEffect(&m_ImageBombEffect);

		//绘画效果
		INT nImageHeight=m_ImageBombEffect.GetHeight();
		INT nImageWidth=m_ImageBombEffect.GetWidth()/BOMB_EFFECT_COUNT;
		m_ImageBombEffect.AlphaDrawImage(pDC,(nWidth-nImageWidth)/2,0,nImageWidth,nImageHeight,
			nImageWidth*(m_cbBombFrameIndex%BOMB_EFFECT_COUNT),0,RGB(255,0,255));
	}

	//炸弹倍数
	if (m_wBombTime>1)
	{
		//炸弹标志
		CImageHandle ImageHandle(&m_ImageBomb);
		m_ImageBomb.AlphaDrawImage(pDC,m_nXBorder+5,nHeight-m_nYBorder-m_ImageBomb.GetHeight()-5,RGB(255,0,255));

		//设置 DC
		pDC->SetTextColor(RGB(250,250,250));
		pDC->SetTextAlign(TA_LEFT|TA_TOP);

		//炸弹倍数
		TCHAR szBuffer[64];
		_snprintf(szBuffer,sizeof(szBuffer),TEXT("炸弹翻倍:%d"),m_wBombTime);
		DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_nXBorder+m_ImageBomb.GetWidth()+10,nHeight-m_nYBorder-20 );
	//	pDC->TextOut(m_nXBorder+m_ImageBomb.GetWidth()+10,nHeight-m_nYBorder-20,szBuffer,lstrlen(szBuffer));
	}

	//描述信息
	if (m_bLandTitle==true)
	{
		//创建资源
		CFont InfoFont;
		InfoFont.CreateFont(-36,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("黑体"));

		//设置 DC
		pDC->SetTextColor(RGB(201,229,133));
		pDC->SetTextAlign(TA_CENTER|TA_TOP);
		CFont * pOldFont=pDC->SelectObject(&InfoFont);

		//绘画信息
		pDC->TextOut(nWidth/2,200,"正等待用户叫分");

		//清理资源
		pDC->SelectObject(pOldFont);
		InfoFont.DeleteObject();
	}

	//托管标识
	for ( WORD wChairID = 0; wChairID < GAME_PLAYER; ++wChairID ) {
		
		const tagUserData * pUserData=GetUserInfo( wChairID );
		if ( pUserData == NULL ) m_bUserTrustee[ wChairID ] = false;

		if ( m_bUserTrustee[ wChairID ] ) {
			if ( wChairID == 1 )
				m_ImageUserTrustee.DrawImage( pDC, m_ptLand[ wChairID ].x + 40, m_ptLand[ wChairID ].y - 1 );
			else
				m_ImageUserTrustee.DrawImage( pDC, m_ptLand[ wChairID ].x + 40, m_ptLand[ wChairID ].y - 1 );
		}
	}

	//历史积分
	if (m_bShowScore==true)
	{
		//积分背景
		CImageHandle HandleHistoryScore(&m_ImageHistoryScore);
		m_ImageHistoryScore.BitBlt(pDC->m_hDC,nWidth-m_ImageHistoryScore.GetWidth()-5,27);

		//计算位置
		INT nYBenchmark=27;
		INT nXBenchmark=nWidth-m_ImageHistoryScore.GetWidth()-5;
		UINT nFormat=DT_SINGLELINE|DT_END_ELLIPSIS|DT_VCENTER|DT_CENTER;

		//绘画属性
		pDC->SetTextAlign(TA_LEFT|TA_TOP);
		pDC->SetTextColor(RGB(254,247,137));

		//绘画信息
		for (WORD i=0;i<GAME_PLAYER;i++)
		{
			//获取用户
			const tagUserData * pUserData=GetUserInfo(i);
			if ((pUserData==NULL)||(m_pHistoryScore[i]==NULL)) continue;

			//位置计算
			CRect rcAccounts(nXBenchmark+2,nYBenchmark+24+i*19,nXBenchmark+73,nYBenchmark+42+i*19);
			CRect rcTurnScore(nXBenchmark+74,nYBenchmark+24+i*19,nXBenchmark+127,nYBenchmark+42+i*19);
			CRect rcCollectScore(nXBenchmark+128,nYBenchmark+24+i*19,nXBenchmark+197,nYBenchmark+42+i*19);

			//构造信息
			TCHAR szTurnScore[16]=TEXT(""),szCollectScore[16]=TEXT("");
			_sntprintf(szTurnScore,CountArray(szTurnScore),TEXT("%I64d"),m_pHistoryScore[i]->lTurnScore);
			_sntprintf(szCollectScore,CountArray(szCollectScore),TEXT("%I64d"),m_pHistoryScore[i]->lCollectScore);

			//绘画信息
			TCHAR strAccounts[64];
			_sntprintf(strAccounts,CountArray(strAccounts),TEXT("%s"),pUserData->szName);
			pDC->DrawText(strAccounts,lstrlen(strAccounts),&rcAccounts,nFormat);
			pDC->DrawText(szTurnScore,lstrlen(szTurnScore),&rcTurnScore,nFormat);
			pDC->DrawText(szCollectScore,lstrlen(szCollectScore),&rcCollectScore,nFormat);
		}
	}
	return;
}
HRESULT ArchiverSession::CreateArchiveStore(const tstring& strUserName, const tstring& strServerName, LPMDB *lppArchiveStore)
{
	HRESULT hr = hrSuccess;
	MsgStorePtr ptrRemoteAdminStore;
	ECServiceAdminPtr ptrRemoteServiceAdmin;
	abentryid_t userId;
	ULONG cbStoreId = 0;
	EntryIdPtr ptrStoreId;
	ULONG cbRootId = 0;
	EntryIdPtr ptrRootId;
	MsgStorePtr ptrArchiveStore;
	MAPIFolderPtr ptrRoot;
	ULONG ulType;
	MAPIFolderPtr ptrIpmSubtree;
	SPropValuePtr ptrIpmSubtreeId;

	hr = GetUserInfo(strUserName, &userId, NULL, NULL);
	if (hr != hrSuccess)
		goto exit;

	hr = HrGetRemoteAdminStore(m_ptrSession, m_ptrAdminStore, strServerName.c_str(), fMapiUnicode, &ptrRemoteAdminStore);
	if (hr != hrSuccess)
		goto exit;

	hr = ptrRemoteAdminStore.QueryInterface(ptrRemoteServiceAdmin);
	if (hr != hrSuccess)
		goto exit;

	hr = ptrRemoteServiceAdmin->CreateEmptyStore(ECSTORE_TYPE_ARCHIVE, userId.size(), userId, EC_OVERRIDE_HOMESERVER, &cbStoreId, &ptrStoreId, &cbRootId, &ptrRootId);
	if (hr != hrSuccess)
		goto exit;

	// The entryids returned from CreateEmptyStore are unwrapped and unusable from external client code. So
	// we'll resolve the correct entryids through GetArchiveStoreEntryID.
	hr = ptrRemoteServiceAdmin->GetArchiveStoreEntryID(strUserName.c_str(), strServerName.c_str(), fMapiUnicode, &cbStoreId, &ptrStoreId);
	if (hr != hrSuccess)
		goto exit;

	hr = m_ptrSession->OpenMsgStore(0, cbStoreId, ptrStoreId, &ptrArchiveStore.iid, MDB_WRITE, &ptrArchiveStore);
	if (hr != hrSuccess)
		goto exit;

	hr = ptrArchiveStore->OpenEntry(0, NULL, &ptrRoot.iid, MAPI_MODIFY, &ulType, &ptrRoot);
	if (hr != hrSuccess)
		goto exit;

	hr = ptrRoot->CreateFolder(FOLDER_GENERIC, _T("IPM_SUBTREE"), _T(""), &IID_IMAPIFolder, fMapiUnicode, &ptrIpmSubtree);
	if (hr != hrSuccess)
		goto exit;

	hr = HrGetOneProp(ptrIpmSubtree, PR_ENTRYID, &ptrIpmSubtreeId);
	if (hr != hrSuccess)
		goto exit;

	ptrIpmSubtreeId->ulPropTag = PR_IPM_SUBTREE_ENTRYID;
	
	hr = ptrArchiveStore->SetProps(1, ptrIpmSubtreeId, NULL);
	if (hr != hrSuccess)
		goto exit;

	hr = ptrArchiveStore->QueryInterface(IID_IMsgStore, (LPVOID*)lppArchiveStore);

exit:
	return hr;
}
Exemple #6
0
//网络消息
bool CClientKernel::OnIPCSocket(const IPC_Head * pHead, const void * pIPCBuffer, WORD wDataSize, HWND hWndSend)
{
	ASSERT(pHead->wMainCmdID==IPC_MAIN_SOCKET);
	switch (pHead->wSubCmdID)
	{
	case IPC_SUB_SOCKET_RECV:	//数据接收
		{
			//效验数据
			ASSERT(wDataSize>=sizeof(CMD_Command));
			if (wDataSize<sizeof(CMD_Command)) return false;

			//提取数据
			WORD wPacketSize=wDataSize-sizeof(CMD_Command);
			IPC_SocketPackage * pSocketPackage=(IPC_SocketPackage *)pIPCBuffer;

			//特殊处理
			bool bHandle=false;
			ASSERT(m_pIClientKernelSink!=NULL);
			if (m_pIClientKernelSink==NULL) return true;
			if (wPacketSize==0)	bHandle=m_pIClientKernelSink->OnEventSocket(pSocketPackage->Command,NULL,0);
			else bHandle=m_pIClientKernelSink->OnEventSocket(pSocketPackage->Command,pSocketPackage->cbBuffer,wPacketSize);
			
			//框架消息
			if ((bHandle==false)&&(pSocketPackage->Command.wMainCmdID==MDM_GF_FRAME))
			{
				switch (pSocketPackage->Command.wSubCmdID)
				{
				case SUB_GF_OPTION:			//游戏配置
					{
						//效验参数
						ASSERT(wPacketSize==sizeof(CMD_GF_Option));
						if (wPacketSize!=sizeof(CMD_GF_Option)) return false;

						//消息处理
						CMD_GF_Option * pOption=(CMD_GF_Option *)pSocketPackage->cbBuffer;
						m_bGameStatus=pOption->bGameStatus;
						m_bAllowLookon=pOption->bAllowLookon?true:false;

						return true;
					}
				case SUB_GF_SCENE:			//游戏场景
					{
						return m_pIClientKernelSink->OnEventGameScene(m_bGameStatus,m_bLookonMode,pSocketPackage->cbBuffer,wPacketSize);
					}
				case SUB_GF_LOOKON_CONTROL:	//旁观控制
					{
						//效验参数
						ASSERT(wPacketSize==sizeof(CMD_GF_LookonControl));
						if (wPacketSize!=sizeof(CMD_GF_LookonControl)) return false;

						//消息处理
						if (IsLookonMode()==true)
						{
							//变量定义
							CMD_GF_LookonControl * pLookonControl=(CMD_GF_LookonControl *)pSocketPackage->cbBuffer;

							//事件处理
							m_bAllowLookon=(pLookonControl->bAllowLookon==TRUE)?true:false;

							//旁观处理
							m_pIClientKernelSink->OnEventLookonChanged(true,NULL,0);

							//提示消息
							if (m_bAllowLookon==true) m_pIMessageProxy->InsertSystemString(TEXT("您被允许观看玩家游戏"),0);
							else m_pIMessageProxy->InsertSystemString(TEXT("您被禁止观看玩家游戏"),0);
						}

						return true;
					}
				case SUB_GF_USER_CHAT:		//聊天信息
					{
						//效验参数
						CMD_GF_UserChat * pUserChat=(CMD_GF_UserChat *)pSocketPackage->cbBuffer;
						ASSERT(wPacketSize>=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)));
						ASSERT(wPacketSize==(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength));
						if (wPacketSize<(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage))) return false;
						if (wPacketSize!=(sizeof(CMD_GF_UserChat)-sizeof(pUserChat->szChatMessage)+pUserChat->wChatLength)) return false;

						//寻找用户
						tagUserData * pRecvUserData=NULL;
						tagUserData * pSendUserData=SearchUserItem(pUserChat->dwSendUserID);
						if (pSendUserData==NULL) return true;
						if (pUserChat->dwTargetUserID!=0L) pRecvUserData=SearchUserItem(pUserChat->dwTargetUserID);

						//消息过滤
						if ((pUserChat->dwSendUserID!=m_dwUserID)&&(pSendUserData->cbCompanion==enCompanion_Detest)) return true;

						//显示消息
						m_pIClientKernelSink->OnUserChatMessage(pSendUserData,pRecvUserData,pUserChat->szChatMessage,pUserChat->crFontColor);

						return true;
					}
				case SUB_GF_MESSAGE:		//系统消息
					{
						//效验参数
						CMD_GF_Message * pMessage=(CMD_GF_Message *)pSocketPackage->cbBuffer;
						ASSERT(wDataSize>(sizeof(CMD_GF_Message)-sizeof(pMessage->szContent)));
						if (wDataSize<=(sizeof(CMD_GF_Message)-sizeof(pMessage->szContent))) return false;

						//消息处理
						WORD wHeadSize=sizeof(CMD_GF_Message)-sizeof(pMessage->szContent);
						ASSERT(wPacketSize==(wHeadSize+pMessage->wMessageLength*sizeof(TCHAR)));
						if (wPacketSize!=(wHeadSize+pMessage->wMessageLength*sizeof(TCHAR))) return false;
						pMessage->szContent[pMessage->wMessageLength-1]=0;

						//中断判断
						if (pMessage->wMessageType&SMT_CLOSE_GAME) 
						{
							KillGameTimer(m_nTimerID);
							m_ChannelServiceHelper->CloseChannel(true,true);
						}

						//显示消息
						if (pMessage->wMessageType&SMT_INFO) m_pIMessageProxy->InsertSystemString(pMessage->szContent,MS_NORMAL);
						if (pMessage->wMessageType&SMT_EJECT) ShowMessageBox(pMessage->szContent,MB_ICONINFORMATION);

						//关闭房间
						if (pMessage->wMessageType&SMT_CLOSE_GAME)
						{
							m_bInquire=false;
							m_pIClientKernelSink->CloseGameFrame(true);
						}

						return true;
					}
				}
			}

			//礼物消息
			if ((bHandle==false)&&(pSocketPackage->Command.wMainCmdID==MDM_GF_PRESENT))
			{
				switch (pSocketPackage->Command.wSubCmdID)
				{
				case SUB_GF_FLOWER:			//赠送鲜花
					{
						//效验参数
						ASSERT(wPacketSize==sizeof(CMD_GF_GiftNotify));
						if (wPacketSize!=sizeof(CMD_GF_GiftNotify)) return false;

						//变量定义
						CMD_GF_GiftNotify * pGiftNotify=(CMD_GF_GiftNotify *)pSocketPackage->cbBuffer;
						if(pGiftNotify->cbSendLocation!=LOCATION_GAME_ROOM)return true;

						//获取玩家
						tagUserData const *pSendUserData = NULL;
						tagUserData const *pRcvUserData = NULL;
						for ( WORD wChairID = 0; wChairID < MAX_CHAIR; ++wChairID )
						{
							tagUserData const *pUserData = GetUserInfo( wChairID );
							if ( pUserData == NULL ) continue;

							if (pUserData->dwUserID == pGiftNotify->dwSendUserID )
							{
								pSendUserData = pUserData ;

								//自己判断
								if ( pGiftNotify->dwSendUserID == pGiftNotify->dwRcvUserID ) pRcvUserData = pSendUserData;
							}
							else if ( pUserData->dwUserID == pGiftNotify->dwRcvUserID ) pRcvUserData = pUserData;

							//中断判断
							if ( pSendUserData != NULL && pRcvUserData != NULL ) break;
						}

						//旁观搜索
						if ( pSendUserData == NULL || pRcvUserData == NULL )
						{
							for (INT_PTR i=0;i<m_UserItemLookon.GetCount();i++)
							{
								tagUserData *pLookonUserData = m_UserItemLookon[i];
								if ( pLookonUserData->dwUserID == pGiftNotify->dwSendUserID )
								{
									pSendUserData = pLookonUserData;

									//自己判断
									if ( pGiftNotify->dwSendUserID == pGiftNotify->dwRcvUserID ) pRcvUserData = pSendUserData;
								}
								else if ( pLookonUserData->dwUserID == pGiftNotify->dwRcvUserID ) pRcvUserData = pLookonUserData;

								//中断判断
								if ( pSendUserData != NULL && pRcvUserData != NULL ) break;
							}
						}

						//结果判断
						ASSERT( pSendUserData != NULL );
						ASSERT( pRcvUserData != NULL );
						if ( pSendUserData == NULL || pRcvUserData == NULL ) return true;
						ASSERT( pGiftNotify->wGiftID < FLOWER_COUNT ) ;
						if ( pGiftNotify->wGiftID >= FLOWER_COUNT ) return true;

						//构造消息
						CString strGiftMsg;
						int nFlowerID = pGiftNotify->wGiftID;

						//获取指针
						CSkinRichEdit *pSkinRichEdit = m_pIMessageProxy->GetRichEdit();

						pSkinRichEdit->InsertHyperLink(pSendUserData->szName, RGB(253,253,253));

						strGiftMsg = g_FlowerDescribe[nFlowerID].szAction;
						m_pIMessageProxy->InsertShtickString(strGiftMsg,RGB(255,0,255), strGiftMsg.GetLength(), false);

						pSkinRichEdit->InsertHyperLink(pRcvUserData->szName, RGB(253,253,253));

						strGiftMsg = g_FlowerDescribe[nFlowerID].szQuantifier1;
						m_pIMessageProxy->InsertShtickString(strGiftMsg,RGB(255,0,255), strGiftMsg.GetLength(), false);

						//插入图片
						CBitmap Bitmap;
						AfxSetResourceHandle(g_GlobalOption.m_PlatformResourceModule->GetResInstance());
						if ( Bitmap.LoadBitmap(g_GlobalOption.m_ChatExpViewImage.uChatGift[nFlowerID]) )
						{
							m_pIMessageProxy->InsertImage(&Bitmap);
							Bitmap.DeleteObject();
						}
						AfxSetResourceHandle(GetModuleHandle(NULL));

						WORD wFlowerCount = pGiftNotify->wFlowerCount;
						strGiftMsg.Format(TEXT(",共%d%s%s[ %s ]"), pGiftNotify->wFlowerCount, g_FlowerDescribe[nFlowerID].szQuantifier2,
							g_FlowerDescribe[nFlowerID].szResult, pRcvUserData->szName);
						m_pIMessageProxy->InsertShtickString(strGiftMsg,RGB(255,0,255), strGiftMsg.GetLength(), false);	

						strGiftMsg.Format(g_FlowerDescribe[nFlowerID].szCharmResult, wFlowerCount * abs(CPropertyBar::m_FlowerInfo[nFlowerID].lRcvUserCharm));
						m_pIMessageProxy->InsertShtickString(strGiftMsg,RGB(255,0,255), strGiftMsg.GetLength(), true);	

						//鲜花效果
						m_pIClientKernelSink->OnEventFlower(pSendUserData, pRcvUserData, nFlowerID, nFlowerID*2);

						return true;
					}
				case SUB_GF_RESIDUAL_PROPERTY:	//剩余道具
					{
						////效验参数
						//ASSERT(wPacketSize==sizeof(CMD_GF_ResidualProperty));
						//if (wPacketSize!=sizeof(CMD_GF_ResidualProperty)) return false;

						////变量定义
						//CMD_GF_ResidualProperty * ResidualProperty=(CMD_GF_ResidualProperty *)pSocketPackage->cbBuffer;

						////设置道具
						//for ( WORD wPropID = 0; wPropID < PROPERTY_COUNT; ++wPropID )
						//{
						//	m_pMeUserItem->dwPropResidualTime[wPropID] = ResidualProperty->dwResidualTime[wPropID];
						//}

						return true;
					}
				case SUB_GF_PROP_ATTRIBUTE:		//道具属性
					{
						//校验参数
						ASSERT( wPacketSize % sizeof(tagPropertyInfo) == 0 );
						if ( wPacketSize % sizeof(tagPropertyInfo) != 0 ) return true;

						//类型转换
						int nInfoCount = wPacketSize / sizeof(tagPropertyInfo);
						tagPropertyInfo *pPropertyInfo = (tagPropertyInfo*)pSocketPackage->cbBuffer;

						//设置属性
						m_pIClientKernelSink->OnEventInitProperty(pPropertyInfo, nInfoCount);

						return true;
					}
				case SUB_GF_FLOWER_ATTRIBUTE:	//鲜花属性
					{
						//校验参数
						ASSERT( wPacketSize % sizeof(tagFlowerInfo) == 0 );
						if ( wPacketSize % sizeof(tagFlowerInfo) != 0 ) return true;

						//类型转换
						int nInfoCount = wPacketSize / sizeof(tagFlowerInfo);
						tagFlowerInfo *pFlowerInfo= (tagFlowerInfo*)pSocketPackage->cbBuffer;

						//设置属性
						m_pIClientKernelSink->OnEventInitFlower(pFlowerInfo, nInfoCount);

						return true;
					}
				case SUB_GF_PROP_BUGLE:			//喇叭消息
					{
						ASSERT( sizeof(CMD_GF_BugleProperty) == wPacketSize );
						if ( sizeof(CMD_GF_BugleProperty) != wPacketSize ) return false;

						//类型转换
						CMD_GF_BugleProperty *pBugleProperty = (CMD_GF_BugleProperty*)pSocketPackage->cbBuffer;

						//喇叭图片
						CBitmap Bitmap;
						AfxSetResourceHandle(g_GlobalOption.m_PlatformResourceModule->GetResInstance());
						if ( Bitmap.LoadBitmap(g_GlobalOption.m_ChatExpViewImage.uChatBugle) )
						{
							m_pIMessageProxy->InsertImage(&Bitmap);
							Bitmap.DeleteObject();
						}
						AfxSetResourceHandle(GetModuleHandle(NULL));

						//喇叭内容
						m_pIMessageProxy->InsertUserChat(pBugleProperty->szUserName,pBugleProperty->szContext,pBugleProperty->crText,MS_NORMAL);

						return true;
					}
				}
			}

			return bHandle;
		}
	}

	return false;
}
Exemple #7
0
int dSocketCheck( )
{
	int     dSfd;
	int		dRecvLen = 0;
	int		dSelRet;
	int		dRet, dRet1, i, j;
	int		dAdminIdx;
	int		dSocketChkFlag = 0;
	char	szTcpRmsg[MAX_MNG_PKT_BUFSIZE];

	fd_set  stRd;
	fd_set	stWd;
	struct  timeval		timeout;

	memcpy((char*)&stRd, (char*)&gstReadfds, sizeof(fd_set));
	memcpy((char*)&stWd, (char*)&gstWritefds, sizeof(fd_set));

	timeout.tv_sec = 0;
	timeout.tv_usec = 10000;

	dSelRet = select( gdNumfds+1, &stRd, &stWd, (fd_set*)NULL, &timeout );
	if( dSelRet < 0 ) {
		if( errno != EINTR ) {
			/*
			* SELECT UNEXPECTED ERROR
			*/
			log_print(LOGN_CRI, "[ERROR] SELECT CRITICAL ERROR INVOKE [%d] [%s]",
							 errno, strerror(errno) );
			FinishProgram();
		}
		return 0;
	}
	else if( dSelRet > 0 ) {					/*** EVENT INVOKE ***/

		if( FD_ISSET( gdSvrSfd, &stRd ) ) {		/*** NEW CLIENT CONNECT ***/

			log_print(LOGN_DEBUG, "[SOCKET] NEW CLIENT CONNECT TRIAL SVRPORT[%d]",
							   gdPortNo );
			dSocketChkFlag++;

			dRet = dAcceptClient();
			if( dRet < 0 ) {
				log_print( LOGN_CRI, "FAIL IN FUNCTION dAcceptClient()");
			}
		}

		for( i=0; i<gdClient; i++ )	{
			if( stConTbl[i].dSfd < 0 )
				continue;

			log_print(LOGN_DEBUG, "[SOCKET] stConTbl IDX[%d] SFD[%d] dSetRet[%d] IP[%s]",
							   i, stConTbl[i].dSfd, dSelRet, util_cvtipaddr(NULL, stConTbl[i].uiCliIP) );

			dSfd = stConTbl[i].dSfd;
			if(FD_ISSET( dSfd, &stRd)) {		/*** EXIST CLIENT EVENT ***/
				log_print(LOGN_DEBUG, "[SOCKET] EXIST CLIENT EVENT IDX[%d] Sfd[%d] IP[%s]",
					i, dSfd, util_cvtipaddr(NULL, stConTbl[i].uiCliIP) );
				dSocketChkFlag++;

				dRecvLen = 0;

				dRet = dRecvMessage(dSfd, &szTcpRmsg[0], &dRecvLen );
				if( dRet < 0 ) {
					log_print(LOGN_CRI, "[SOCKET] [CLOSE  ] CONNECTION CLOSE IDX[%d] SFD[%d] IP[%s]",
									  	i, dSfd, util_cvtipaddr(NULL, stConTbl[i].uiCliIP) );

					close(dSfd);
					FD_CLR( dSfd, &gstReadfds );

					log_print(LOGN_DEBUG, "GDCLIENT INFO : [%d]", gdClient );

					if( gdClient == 1 ) {
                        gdClient--;
						gdNumfds = gdSvrSfd;
					}
                    else if( (gdClient-1) == i ) {
                        gdClient--;

                        while(1) {
                            if( stConTbl[gdClient-1].dSfd > 0 ) {
								gdNumfds = dGetMaxFds();
                                break;
							}
                            else {
                                gdClient--;

                                if( gdClient == 0 ) {
									log_print(LOGN_DEBUG, "GDNumfds INFO 4 : [%d]", gdNumfds );
									gdNumfds = gdSvrSfd;
                                    break;
								}
                            }
                        }
                    }

					/*
					* ADD 2003.05.13.
					* CLEAR WRITE FD_SET FOR SOCKET FD
					*/
            		memcpy((char*)&stWd, (char*)&gstWritefds, sizeof(fd_set));
            		if( FD_ISSET( dSfd, &stWd ) ) {
                		log_print(LOGN_DEBUG, "CLEAR WRITEFDS FOR SOCKET CLOSE SFD[%d]", dSfd );

                		FD_CLR( dSfd, &gstWritefds );

                		gdNumWfds--;
                		stConTbl[i].cSockBlock = 0x00;
            		}

					log_print(LOGN_DEBUG, "GDCLIENT INFO : [%d]", gdClient );

					stConTbl[i].dSfd = -1;
					stConTbl[i].dBufLen = 0;
					stConTbl[i].uiCliIP = 0;
					stConTbl[i].cRetryCnt = 0;

					dAdminIdx = GetUserInfo( stConTbl[i].adminid, 1 );
					stAdmin.dConnectFlag[dAdminIdx] = 0;

					stConTbl[i].adminid[0] = 0x00;

					for( j=0 ; j < MAX_TMR_REC ; j++ ) {
						if( dSfd == run_tbl->sfd[j] ) {
							clear_my_tmr( j );
						}
					}
				}
				else if(dRecvLen > 0) {
					log_print( LOGN_DEBUG, "RECV SOCK SIZE[%d]", dRecvLen );

					dRet = dMergeBuffer( i, dSfd, szTcpRmsg, dRecvLen );
					if( dRet < 0 ) {
						log_print(LOGN_CRI,
							"[SOCKET] [CLOSE  ] PACKET MERGE ERR->CONNECTION CLOSE IDX[%d] sfd[%d] Ret[%d] IP[%s]",
							i, dSfd, dRet, util_cvtipaddr(NULL, stConTbl[i].uiCliIP) );

						close(dSfd);
						FD_CLR( dSfd, &gstReadfds );

						log_print(LOGN_DEBUG, "GDCLIENT INFO : [%d]", gdClient );

						if( gdClient == 1 ) {
                            gdClient--;
							log_print(LOGN_DEBUG, "GDNumfds INFO : [%d]", gdNumfds );
							gdNumfds = gdSvrSfd;
						}
                        else if( (gdClient-1) == i ) {
                            gdClient--;

                            while(1) {
                                if( stConTbl[gdClient-1].dSfd > 0 ) {
									gdNumfds = dGetMaxFds();
                                    break;
								}
                                else {
                                    gdClient--;

                                    if( gdClient == 0 ) {
										log_print(LOGN_DEBUG, "GDNumfds INFO 2 : [%d]", gdNumfds );
										gdNumfds = gdSvrSfd;
                                        break;
									}
                                }
                            }
                        }

						/*
						* ADD 2003.05.13.
						*/
            			memcpy((char*)&stWd, (char*)&gstWritefds, sizeof(fd_set));
            			if( FD_ISSET( dSfd, &stWd ) ) {
                			log_print(LOGN_DEBUG,"CLEAR WRITEFDS FOR SOCKET CLOSE SFD[%d]", dSfd );

                			FD_CLR( dSfd, &gstWritefds );

                			gdNumWfds--;
                			stConTbl[i].cSockBlock = 0x00;
            			}

						log_print(LOGN_DEBUG, "GDCLIENT INFO : [%d]", gdClient );

						stConTbl[i].dSfd = -1;
						stConTbl[i].dBufLen = 0;
						stConTbl[i].uiCliIP = 0;
						stConTbl[i].cRetryCnt = 0;

						dAdminIdx = GetUserInfo( stConTbl[i].adminid, 1 );
						stAdmin.dConnectFlag[dAdminIdx] = 0;

						stConTbl[i].adminid[0] = 0x00;
						for( j=0 ; j < MAX_TMR_REC ; j++ ) {
							if( dSfd == run_tbl->sfd[j] ) {
								clear_my_tmr( j );
							}
						}
					}
				}
			}
		}

		/*
		* CHECK WRITE FD_SET
		*/
		if( gdNumWfds > 0 ) {
			for( i=0; i<gdClient; i++ ) {
				if( stConTbl[i].dSfd < 0  )
					continue;

				if( stConTbl[i].cSockBlock == 0x00 )
					continue;

				dSocketChkFlag++;
				dSfd = stConTbl[i].dSfd ;

				if( FD_ISSET( dSfd, &stWd ) ) {
					log_print(LOGN_DEBUG,"WriteFds Event Invoke SFD[%d]", dSfd );

					FD_CLR( dSfd, &gstWritefds );

					gdNumWfds--;
					stConTbl[i].cSockBlock = 0x00;

					/*
					* SEND SENDBUFFER DATA
					*/
					if( stConTbl[i].dBufLen > 0 ) {
						dRet = dSendBlockMessage( dSfd, stConTbl[i].dBufLen, &stConTbl[i].szSendBuffer[0], i );
						dRet1 = dSetSockBlock( dRet, dSfd, i );
					}
				}
			}
		}

		if( dSocketChkFlag == 0 && dSelRet > 0 ) {
			log_print( LOGN_INFO,
				"CHECK SOCKET SELECT dSelRet[%d] gdNumWfds[%d]",
				dSelRet, gdNumWfds);
			sleep(1);
		}
	}
	else if( dSelRet == 0 ) {
		/*
		* NO EVENT
		*/
	}

	return 0;
}
Exemple #8
0
int main (int argc, char *argv[]) {
	int c;
	unsigned long hostaddr;
	FILE *cmdfile;
	char *cmdline = NULL;
	char *cmdtok = NULL;
	char *filename = NULL;
	char line[MAXLEN];
	char tmpcmd[MAXLEN];
	debug=0;verbose=0;errpause=0;skiperr=0;allocpty=0;envfl=0;
	timeout=5;
	enable_trace=0;
	tracelvl=0;
	errfile=NULL;
	envfilenm=NULL;
	appname = basename(argv[0]);
	while ((c = getopt (argc, argv, "dhpvP :c:f:t:s:e:T:")) != -1) {
		switch (c) {
			case 'c':
				cmdline = optarg;
				break;
				
			case 'd':
				debug++;
				break;
				
			case 'f':
				filename = optarg;
				break;
				
			case 'h':
				PrintUsage();
				break;
				
			case 'p':
				errpause++;
				break;
				
			case 'P':
				allocpty++;
				break;
				
			case 'e':
				envfl++;
				envfilenm = optarg;
				break;
				
			case 's':
				skiperr++;
				errfile = optarg;
				break;
				
			case 't':
				timeout = (int) strtol(optarg, (char **)NULL, 10);
				break;
				
			case 'T':
				enable_trace++;
				tracelvl = (int) strtol(optarg, (char **)NULL, 10);
				break;
				
			case 'v':
				verbose++;
				break;
				
			case '?':
				PrintUsage();
				break;
		}
	}
	
	ValidateOptions(cmdline,filename);
	
	if ((argc - optind) == 1) {
		hostaddr = GetHostInfo((char *)argv[optind]);
	} else {
        fprintf(stderr, "Hostname or IP is required\n\n");
        PrintUsage();
	}
	
	/* Get Username from effecive user id running the program */
	GetUserInfo();
	
	/* Initialize the Session */
	InitSession(hostaddr);
	
	if (cmdline != NULL) {
		RunCommand(cmdline);
	} else {
		if ((cmdfile = fopen(filename, "r")) == 0) {
			fprintf(stderr, "Could not open file %s:%s\n",
					filename ,strerror(errno));
			exit(-1);
		}
		
		strcpy(tmpcmd,"");
		while (fgets(line, sizeof(line), cmdfile) != NULL) {
			cmdtok = strdup(line);
			if (CheckLine(trim(cmdtok))) {
				sprintf(tmpcmd,"%s%s",tmpcmd,cmdtok);
			} else {
				if ( strcmp(tmpcmd,"") != 0 ) {
					sprintf(tmpcmd,"%s%s",tmpcmd,cmdtok);
					free(cmdtok);
					cmdtok = strdup(tmpcmd);
				}
				if (strlen(cmdtok) > 1 && SkipComments(cmdtok) ) {
					RunCommand(cmdtok);
				}
				strcpy(tmpcmd,"");
			}
			free(cmdtok);
		}
		if (strcmp(tmpcmd,"") != 0) {
			RunCommand(tmpcmd);
			strcpy(tmpcmd,"");
		}
	}
	CleanupSession(session,username);
	return 0;
}
Exemple #9
0
/**
 *	Implement func.
 */
int main(int argc, char *argv[])
{
	int			dRet, i, loopCnt;
	int			dNmsIndex;
	//st_MsgQ  	stMsg;
	pst_MsgQ	pstMsg;				/* msgq ==> gifo */
	pst_MsgQSub pstMsgQSub;
	int			dWarnOutCnt = 0;	/* 20040923,poopee */
	char		szCommand[64];
    time_t		tCurTime, tCheckTime, tClientCheck, tLastPingMySQL;
	OFFSET		offset;

	SetUpSignal();

	gdStopFlag = 1;
	gdNumfds = 0;
	gdNumWfds = 0;

	log_init(S_SSHM_LOG_LEVEL, getpid(), SEQ_PROC_MMCD, LOG_PATH"/MMCD", "MMCD");

	/*
	AppLogInit(getpid(), SEQ_PROC_MMCD, MMCD_LOG, "MMCD");
	dRet = dInitLogShm();
	if( dRet < 0 )
		exit(dRet);

	dRet = Init_shm_common();
    if(dRet < 0)
    {
        log_print( LOGN_CRI,"MAIN : Failed in Init_shm_common dRet[%d][%s]", dRet, strerror(errno));
        exit(1);

	*/

	if((dRet = get_db_conf(FILE_MYSQL_CONF, szIP, szName, szPass, szAlias)) < 0)
	{
		log_print(LOGN_CRI, "F=%s:%s.%d: ERROR IN get_db_conf() dRet[%d]", __FILE__, __FUNCTION__, __LINE__, dRet);
		exit(-5);
	}

	if((dRet = db_conn(&stMySQL, szIP, szName, szPass, szAlias)) < 0)
	{
			log_print(LOGN_CRI, "F=%s:%s.%d: ERROR IN db_conn() dRet[%d]", __FILE__, __FUNCTION__, __LINE__, dRet);
		exit(-6);
	}

	/*
	if( (dRet = dInitialMysqlEnvironment(&stConnInfo)) < 0)
	{
		log_print(LOGN_CRI, "F=%s:%s.%d: ERROR IN dInitialMysqlEnvironment() dRet[%d]",
			__FILE__, __FUNCTION__, __LINE__, dRet);
		exit(-2);
	}

	if( (dRet = dConnectMySQL(&stMySQL, &stConnInfo)) < 0)
	{
		log_print(LOGN_CRI, "F=%s:%s.%d: ERROR IN dConnectMySQL() dRet[%d]",
			__FILE__, __FUNCTION__, __LINE__, dRet);
		exit(-3);
	}
	*/

	/*
	* INITIALIZE FOR MMC COMMAND
	*/
	dRet = init_mmc_server();
	if( dRet < 0 ) {
		log_print(LOGN_CRI, "[ERROR] INIT_MMC_SERVER RET[%d]\n", dRet );
		FinishProgram();
		exit(0);
	}
	/*
	* INITIALIZE FOR SHARED MEMORY FIDB
	*/
/*
	dRet = Init_Fidb();
    if( dRet < 0 ) {
        log_print(LOGN_CRI,"[ERROR] FIDB INIT [%d]\n", dRet );
        FinishProgram();
        exit(0);
    }
*/

	/*
	* INITIALIZE SOCKET
	*/
	dRet = dTcpSvrModeInit();
	if( dRet < 0 ) {
		FinishProgram();
		exit(0);
	}

	/*
	* INITIALIZE FOR SOCKET CONNECTION TABLE
	*/
	for( i = 0 ; i < MAX_FDSET2	; i++ ) {
		stConTbl[i].dSfd = -1;
		stConTbl[i].uiCliIP = 0;
		stConTbl[i].dBufLen = 0;
        stConTbl[i].szSendBuffer[0] = 0;
        stConTbl[i].cSockBlock = 0x00;
		gstMsgBuf[i].dWidx = 0;
		gstMsgBuf[i].dRidx = 0;
		memset( gstMsgBuf[i].szBuf, 0x00, sizeof(MAX_MNG_PKT_BUFSIZE) );
	}

	/*
	* GET MESSAGE QUEUE ID USING IN MMCD
	*/
    dRet = dInitIPCs();
	if( dRet < 0 ) {
		log_print(LOGN_CRI,"[ERROR] MyQid GET RET[%d]", dRet );
		FinishProgram();
		exit(0);
	}

	/* moved from init_mmc_server() */
	/* CLEAN UP ALL WARN-OUT DATA */
	for(;;) 
	{

/* msgq ==> gifo */
#if 0
		dRet = msgrcv(gdMyQid, &stMsg, sizeof(st_MsgQ) - sizeof(long int), 0, IPC_NOWAIT | MSG_NOERROR);
		if( dRet <= 0) break;
		else dWarnOutCnt++;
#endif
		offset = gifo_read(gpRECVMEMS, pCIFO, SEQ_PROC_MMCD);
		if(offset <= 0)
		{
			usleep(0);
			break;
		}
		else
		{
			dWarnOutCnt++;
			//pstMsg = (pst_MsgQ)nifo_get_value(gpRECVMEMS, DEF_MSGQ_NUM, offset);
			nifo_node_delete(gpRECVMEMS, nifo_ptr(gpRECVMEMS, offset));
		}	
	}
	log_print(LOGN_INFO, "INITIAL MESSAGE QUEUE WARN-OUT COUNT : [%d]", dWarnOutCnt );

	gdIndex = 0;
	dNmsIndex = GetUserInfo("ntasnms", 1 );

	time(&tCurTime);
	tClientCheck = tCheckTime = tCurTime;

	if( (dRet = set_version(S_SSHM_VERSION, SEQ_PROC_MMCD, vERSION)) < 0)
	{
		log_print(LOGN_WARN, "set_version error(ret=%d,idx=%d,ver=%s)\n", dRet, SEQ_PROC_MMCD, vERSION);
	}
	log_print(LOGN_CRI, "MMCD %s Started", vERSION);

	/*
	* MAIN WHILE LOOP
	*/
	while(gdStopFlag)
	{

		loopCnt = 0;
		while(1)
		{
			/* msgq ==> gifo */
			if( (dRet = dIsRcvedMessage(&pstMsg)) > 0)
			{
				pstMsgQSub	= (pst_MsgQSub)&pstMsg->llMType;
				log_print(LOGN_INFO, "RECEIVED MSGQ: Type[%d] SvcID[%d] MsgID[%d] usBodyLen[%d]", pstMsgQSub->usType, pstMsgQSub->usSvcID, pstMsgQSub->usMsgID, pstMsg->usBodyLen);
				if( (pstMsgQSub->usSvcID == SID_PATCH) && (pstMsgQSub->usMsgID == MID_SMNG_START))
				{
					sprintf(szCommand, "/WNTAMAPP/BIN/StartMC -b S_MNG");
					system(szCommand);
					log_print(LOGN_INFO, "S_MNG START MESSAGE GET");
					continue;
				}
				SendToOMP( (dbm_msg_t*)&pstMsg->szBody[0], pstMsg->usBodyLen);
				
				// TODO 제대로 된 코드인지 확인 필요
				nifo_node_delete(gpRECVMEMS, nifo_ptr(gpRECVMEMS, nifo_get_offset_node(gpRECVMEMS, (U8*)pstMsg)));
			}
			else
			{
				usleep(0);
				loopCnt++;
				if( loopCnt > 100 ){
					break;
				}
			}

#if 0
			memset(&stMsg, 0x00, sizeof(st_MsgQ));
			if( (dRet = dIsRcvedMessage(&stMsg)) > 0)
			{
				pstMsgQSub	= (pst_MsgQSub)&stMsg.llMType;
				log_print(LOGN_INFO, "RECEIVED MSGQ: Type[%d] SvcID[%d] MsgID[%d] usBodyLen[%d]", pstMsgQSub->usType, pstMsgQSub->usSvcID, pstMsgQSub->usMsgID, stMsg.usBodyLen);
				if( (pstMsgQSub->usSvcID == SID_PATCH) && (pstMsgQSub->usMsgID == MID_SMNG_START))
				{
					sprintf(szCommand, "/WNTAMAPP/BIN/StartMC -b S_MNG");
					system(szCommand);
					log_print(LOGN_INFO, "S_MNG START MESSAGE GET");
					continue;
				}
				SendToOMP( (dbm_msg_t*)&stMsg.szBody[0], stMsg.usBodyLen);

				
				
				nifo_node_delete(gpRECVMEMS, nifo_ptr(gpRECVMEMS, offset));
			}
			else if(dRet < 0)
			{
				log_print(LOGN_CRI, "[ERROR] dIsRcvedMessage PROGRAM FINISHED");
				exit(0);
			}
			else
				break;
#endif

		}

		/*
		* MAIN SOCKET CHECK
		*/
		dRet = dSocketCheck();

		/*
		* CHECK COMMAND TIMEOUT
		*/
		time(&tCurTime);

		if(abs(tCurTime-tCheckTime) >= 1)
		{
			Timer(tCurTime);
			tCheckTime = tCurTime;
		}

		/*
		* CHECK CLIENT FOR UNUSUAL CLOSE : CLIENT_CHECK_TIME(10)
		*/
		if(abs(tCurTime-tClientCheck) > CLIENT_CHECK_TIME)
		{
			CheckClient(0);
			tClientCheck = tCurTime;
		}

		if( (tCurTime - tLastPingMySQL) > SEC_OF_HOUR)
		{
			//if( (dRet = dPingMySQL(&stMySQL)) < 0)
			if((dRet = db_check_alive(&stMySQL)) < 0)
			{
				log_print(LOGN_CRI,"F=%s:%s.%d: ERROR IN dPingMySQL() dRet[%d]", __FILE__, __FUNCTION__, __LINE__, dRet);
				return -16;
			}
			tLastPingMySQL = tCurTime;
		}
	}
	FinishProgram();
	log_print(LOGN_CRI, "[EXIT] PROGRAM END !!!\n");

	return 0;
}
Exemple #10
0
int dInsert_MMCD_Result(st_MngPkt *pstMngPkt, short tmrID, char *szBuf, int dSockfd)
{
	int					dRet;
	size_t				szLen;
	st_SysMMCDMsg		stData;
	struct sockaddr_in	sa;
	socklen_t			sock_len;

	memcpy(stData.szUserName, pstMngPkt->head.userName, MAX_USER_NAME-1);
	stData.szUserName[MAX_USER_NAME-1] = 0x00;
	stData.uiTime = time(NULL);
	g_usSeq++;

	stData.usSeq = g_usSeq;

	if(g_usSeq >= 999)
		g_usSeq = 0;

	strcpy( (char*)stData.szCommand, g_cmd_line);
	szLen = strlen(szBuf);
	if(szLen >= MAX_MMCD_MSG_SIZE)
	{
		log_print(LOGN_WARN, "MMCD RESULT DB INSERT BUFFER OVERFLOW MAX:%d CUR=%ld", MAX_MMCD_MSG_SIZE, szLen);
		szLen = MAX_MMCD_MSG_SIZE - 1;
	}

	memcpy(stData.szMessage, szBuf, szLen);
	stData.szMessage[szLen] = 0x00;

	if(pstMngPkt->head.usResult > 0)
		stData.usResult = 1;
	else
		stData.usResult = 0;

	if(dSockfd != 0)
	{
	    /* get a informations of this clients.	*/
	    sock_len = (socklen_t)sizeof(sa);
	    if(getpeername(dSockfd, (struct sockaddr*)&sa, &sock_len) == -1)
	    {
			if(strcasestr(stData.szCommand, "USER-LOGOUT") == NULL)
			{
				log_print(LOGN_CRI, "F=%s:%s.%d: FAILED IN getpeername(run_tbl->sfd[%hd][%d]) errno[%d-%s]", __FILE__, __FUNCTION__, __LINE__,
					tmrID, dSockfd, errno, strerror(errno));
				return -1;
			}
			else
				stData.uiUserBIP = stAdmin.stUserList[GetUserInfo(stData.szUserName,1)].lLastLoginIP;
	    }
	    stData.uiUserBIP	= htonl(sa.sin_addr.s_addr);
	}
	else
		stData.uiUserBIP	= 0;

	if( (dRet = dInsert_MMCDMsg(&stMySQL, &stData)) < 0)
	{
		if(dRet == -1)
		{
			if( (dRet = dCreate_MMCDMsg(&stMySQL)) < 0)
			{
				log_print(LOGN_CRI, "F=%s:%s.%d: FAILED IN dCreate_MMCDMsg() dRet[%d]", __FILE__, __FUNCTION__, __LINE__, dRet);
				return -2;
			}

			if( (dRet = dInsert_MMCDMsg(&stMySQL, &stData)) < 0)
			{
				log_print(LOGN_CRI, "F=%s:%s.%d: FAILED IN dInsert_MMCDMsg() dRet[%d]", __FILE__, __FUNCTION__, __LINE__, dRet);
				return -3;
			}
		}
		else if(dRet == -2)
		{
			log_print(LOGN_CRI, "F=%s:%s.%d: FAILED IN dInsert_MMCDMsg() dRet[%d-DB_STOP]", __FILE__, __FUNCTION__, __LINE__, dRet);
			exit(1);
		}
		else
			log_print(LOGN_DEBUG, "F=%s:%s.%d: FAILED IN dInsert_MMCDMsg() dRet[%d]", __FILE__, __FUNCTION__, __LINE__, dRet);
	}

	return 0;
}
Exemple #11
0
int out_print(char *outbuf, dbm_msg_t *msg, unsigned short usLen, short tmrID, short sRet, short cont_flag)
{
	short		CurCount, TotCount;
	int			dRet, dRet1, dNmsSfd, dNmsUserIdx, dConTblIdx, dLen;
	char		szTempBuf[MAX_MMCD_MSG_SIZE*2];
	st_MngPkt	output;

	memset(&output, 0x00, sizeof(st_MngPkt));

	if(run_tbl->ucbinflag[tmrID] == 0x00)
	{
		if(cont_flag == DBM_CONTINUE)
			sprintf(szTempBuf, "\n%s %s\n%s\nCONTINUED\n", SmsName, (char*)ComposeHead(), outbuf);
		else
			sprintf(szTempBuf, "\n%s %s\n%s\nCOMPLETED\n", SmsName, (char*)ComposeHead(), outbuf);
		output.head.usBodyLen = strlen(szTempBuf);
	}
	else
	{
		if(sRet < 0)
		{
			if(cont_flag == DBM_CONTINUE)
				sprintf(szTempBuf, "\n%s %s\n%s\nCONTINUED\n", SmsName, (char*)ComposeHead(), outbuf);
			else
				sprintf(szTempBuf, "\n%s %s\n%s\nCOMPLETED\n", SmsName, (char*)ComposeHead(), outbuf);
			output.head.usBodyLen = strlen(szTempBuf);
		}
		else
		{
			memcpy(szTempBuf, &outbuf[0], usLen);
			output.head.usBodyLen = usLen;
		}
	}

	if(output.head.usBodyLen >= MAX_MNGPKT_BODY_SIZE)
	{
		log_print(LOGN_WARN, "MMCD OUTPUT PRINT BODY MESSAGE OVER FLOW MAX=%d CUR=%d", MAX_MMCD_MSG_SIZE, output.head.usBodyLen);
		output.head.usBodyLen = MAX_MNGPKT_BODY_SIZE - 1;
	}

	memcpy(output.data, szTempBuf, output.head.usBodyLen);
	output.data[output.head.usBodyLen] = 0x00;
	if( (run_tbl->ucbinflag[tmrID]==1) && (sRet >= 0))
		log_print(LOGN_DEBUG, "BinResult=%d BODYLEN=%d BINARY FORMAT", run_tbl->ucbinflag[tmrID], output.head.usBodyLen);
	else
		log_print(LOGN_DEBUG, "BinResult=%d BODYLEN=%d BODY=[%s]", run_tbl->ucbinflag[tmrID], output.head.usBodyLen, output.data);

	output.head.ucBinFlag		= run_tbl->ucbinflag[tmrID];
	output.head.llMagicNumber	= MAGIC_NUMBER;
	output.head.llIndex			= run_tbl->llIndex[tmrID];

	/*** STATISTIC INFORMATION FOR NMS ****************************************/
	output.head.usTotPage	= msg->common.TotPage;
	output.head.usCurPage	= msg->common.CurPage;
	output.head.usStatFlag	= msg->common.StatFlag;

	if(sRet == DBM_SUCCESS)
		output.head.usResult = cont_flag;
	else
		output.head.usResult = sRet;

	output.head.usTotLen = output.head.usBodyLen+MNG_PKT_HEAD_SIZE;

	output.head.usSrcProc = run_tbl->inv_proc[tmrID];
	memcpy(output.head.TimeStamp, run_tbl->time_stamp[tmrID], sizeof(run_tbl->time_stamp[tmrID]));
	memcpy(output.head.userName, run_tbl->user_name[tmrID], 24);

	output.head.ucSvcID = SID_MML;
	output.head.ucMsgID = MID_MML_RST;
	memcpy(&output.head.ucmmlid[0], &run_tbl->usmmlid[tmrID], sizeof(unsigned short));

	log_print(LOGN_DEBUG, "**********TOTAL=%d BODY=%d", output.head.usTotLen, output.head.usBodyLen);

	dConTblIdx = dGetConTblIdx(run_tbl->sfd[tmrID]);

	dRet	= dSendMessage(run_tbl->sfd[tmrID], output.head.usTotLen, (char*)&output, dConTblIdx);
	dRet1	= dSetSockBlock(dRet, run_tbl->sfd[tmrID], dConTblIdx);

	// If This CMD for Binary Format, This Message will be maden for String MSG
	if( (run_tbl->ucbinflag[tmrID]==1) && (sRet>=0))
	{
		strcpy(szTempBuf, (char*)ComposeHead());
		dLen = strlen(szTempBuf);
		if(lib_tbl[msg->head.msg_id%MAX_LIB_TABLE].mmc_res != NULL)
		{
			sprintf(szTempBuf+dLen, "M%04d  %s", lib_tbl[msg->head.msg_id%MAX_LIB_TABLE].mcode, lib_tbl[msg->head.msg_id%MAX_LIB_TABLE].msg_header);

			CurCount = run_tbl->stat_cur_cnt[tmrID];
			TotCount = run_tbl->stat_tot_cnt[tmrID];

			(*lib_tbl[msg->head.msg_id%MAX_LIB_TABLE].mmc_res)(szTempBuf+dLen, msg, &CurCount, &TotCount);
		}

		if(cont_flag == DBM_CONTINUE)
			strcat(szTempBuf, "\nCONTINUED\n");
		else
			strcat(szTempBuf, "\nCOMPLETED\n");

		output.head.usBodyLen = strlen(szTempBuf);
		if(output.head.usBodyLen >= MAX_MMCD_MSG_SIZE)
		{
			log_print(LOGN_WARN, "MMCD OUTPUT PRINT BIN to TEXT BODY MESSAGE OVER FLOW MAX=%d CUR=%d", MAX_MMCD_MSG_SIZE, output.head.usBodyLen);
			output.head.usBodyLen = MAX_MMCD_MSG_SIZE - 1;
		}
		memcpy(output.data, szTempBuf, output.head.usBodyLen);
		output.data[output.head.usBodyLen] = 0x00;
		output.head.usTotLen = output.head.usBodyLen+MNG_PKT_HEAD_SIZE;
		log_print(LOGN_INFO, "BINARY FORMAT to STRING FORMAT BODYLEN=[%d][%s]", output.head.usBodyLen, output.data);
	}

	dNmsSfd = dGetNMSsfd();
	dNmsUserIdx = GetUserInfo("nmsnms", 1);
	log_print(LOGN_DEBUG, "NMS SFD:[%d] CURRENT SFD:[%d]", dNmsSfd, run_tbl->sfd[tmrID]);
	if( (dNmsSfd>0) && (dNmsSfd!=run_tbl->sfd[tmrID]) && (stAdmin.dConnectFlag[dNmsUserIdx]==1))
	{
		log_print(LOGN_INFO, "[INFO] SEND RESULT MESSAGE TO NMS Len=%d[%s]", output.head.usBodyLen, output.data);

		dConTblIdx	= dGetConTblIdx(dNmsSfd);
		dRet		= dSendMessage(dNmsSfd, output.head.usTotLen, (char*)&output, dConTblIdx);
		dRet1		= dSetSockBlock(dRet, dNmsSfd, dConTblIdx);
	}
	dRet = dInsert_MMCD_Result(&output, tmrID, outbuf, run_tbl->sfd[tmrID]);

	return 0;
}
//绘画界面
void CGameClientView::DrawGameView(CDC * pDC, int nWidth, int nHeight)
{
	//绘画背景
	DrawViewImage(pDC,m_ImageBack,enMode_Spread);

	//装饰位图
	CImageHandle DecorateHandle(&m_ImageDecorate);
	m_ImageDecorate.BitBlt(pDC->m_hDC,m_nXBorder+10,m_nYBorder+5);

	//用户区域
	CImageHandle UserInfoHandle(&m_ImageUserInfo);
	int nXPos=m_nXBorder+5;
	int nYPos=(nHeight-m_UserInfoSize.cy)/2-30;
	m_ImageUserInfo.BitBlt(pDC->m_hDC,nXPos,nYPos);

	//棋子标志
	if (m_wBlackUser!=INVALID_CHAIR)
	{
		CImageHandle FlagHandle(&m_ImageFlag);
		m_ImageFlag.BitBlt(pDC->m_hDC,m_ChessFlagPoint[0].x,m_ChessFlagPoint[0].y,m_ImageFlag.GetWidth()/2,m_ImageFlag.GetHeight(),
			(m_wBlackUser==0)?0:m_ImageFlag.GetWidth()/2,0);
		m_ImageFlag.BitBlt(pDC->m_hDC,m_ChessFlagPoint[1].x,m_ChessFlagPoint[1].y,m_ImageFlag.GetWidth()/2,m_ImageFlag.GetHeight(),
			(m_wBlackUser==1)?0:m_ImageFlag.GetWidth()/2,0);
	}

	//绘画用户
	WORD wUserTimer=0;
	pDC->SetTextColor(RGB(255,255,255));
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		//变量定义
		CRect rcName;
		const tagUserData * pUserData=GetUserInfo(i);
		if (pUserData!=NULL)
		{
			//用户区域
			rcName.top=m_ptName[i].y;
			rcName.left=m_ptName[i].x;
			rcName.right=m_ptName[i].x+102;
			rcName.bottom=m_ptName[i].y+12;
			pDC->DrawText(pUserData->szName,lstrlen(pUserData->szName),&rcName,DT_SINGLELINE|DT_END_ELLIPSIS);

			//用户时间
			DrawUserClock(pDC,m_ptTimer[i].x,m_ptTimer[i].y,m_wGameClock);
			DrawUserClock(pDC,m_ptTimer[i].x,m_ptTimer[i].y+27,m_wLeftClock[i]);

			wUserTimer = GetUserTimer(i);
			if ( 0 < wUserTimer )
				DrawUserTimer( pDC, m_ptReady[i].x, m_ptReady[i].y, wUserTimer );

			//其他信息
						if (pUserData->cbUserStatus==US_READY) DrawUserReady(pDC,m_ptReady[i].x,m_ptReady[i].y);
			DrawUserFace(pDC,pUserData,m_ptFace[i].x,m_ptFace[i].y,pUserData->cbUserStatus==US_OFFLINE);
		}
	}

	//按钮底图
	CImageHandle ButtonBackHandle(&m_ImageButtonBack);
	nYPos=nHeight-m_nYBorder-m_ButtonBackSize.cy-5;
	nXPos=m_UserInfoSize.cx+(nWidth-m_UserInfoSize.cx-m_ButtonBackSize.cx)/2;
	m_ImageButtonBack.BitBlt(pDC->m_hDC,nXPos,nYPos);

	return;
}
//绘画界面
void CGameClientView::DrawGameView(CDC * pDC, int nWidth, int nHeight)
{
	//绘画背景
	DrawViewImage(pDC,m_ImageFill,enMode_Spread);
	DrawViewImage(pDC,m_ImageBack,enMode_Centent);

	
	//绘画用户
	TCHAR szBuffer[32];
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		//变量定义
		WORD wUserTimer=GetUserTimer(i);
		const tagUserData * pUserData=GetUserInfo(i);

		///////////////////////////////////////////////
		////test
//		WORD wUserTimer = 30;
//		tagUserData *pUserData = new tagUserData;
//		lstrcpy(pUserData->szName,TEXT("测试玩家"));
//		pUserData->lScore = 10000L;
//		pUserData->cbUserStatus = US_PLAY;
//		m_wLandUser=1;
//		m_bOutBombCount[1]=2;
//		m_bMaxBombCountShow=1;
//		m_bScore[i]=1;
//		m_bPass[i]=true;
//		m_bCardCount[i]=30;
		///////////////////////////////////////////////

		//绘画用户
		if (pUserData!=NULL)
		{
			//用户名字
			pDC->SetTextColor((wUserTimer>0)?RGB(250,250,250):RGB(220,220,220));
			pDC->SetTextAlign(((i==1)&&(m_bDeasilOrder==true))||((i==3)&&(m_bDeasilOrder==false))?TA_RIGHT:TA_LEFT);
			pDC->TextOut(m_ptName[i].x,m_ptName[i].y,pUserData->szName,lstrlen(pUserData->szName));

			//剩余扑克
			if (pUserData->cbUserStatus>=US_PLAY)
			{
				_snprintf(szBuffer,sizeof(szBuffer),TEXT("(%ld 张)"),m_bCardCount[i]);
				
				if(i==0)	pDC->TextOut(m_ptName[i].x,m_ptName[i].y+20,szBuffer,lstrlen(szBuffer));
				if(i==1)	
				{
#ifdef VIDEO_GAME
					pDC->TextOut(m_ptName[i].x+5,m_ptName[i].y-20,szBuffer,lstrlen(szBuffer));
#else
					pDC->TextOut(m_ptName[i].x+5,m_ptName[i].y+15,szBuffer,lstrlen(szBuffer));
#endif
				}
				if(i==2)	pDC->TextOut(m_ptName[i].x,m_ptName[i].y-20,szBuffer,lstrlen(szBuffer));
				if(i==3)	
				{
#ifdef VIDEO_GAME
					pDC->TextOut(m_ptName[i].x+5,m_ptName[i].y-20,szBuffer,lstrlen(szBuffer));
#else
					pDC->TextOut(m_ptName[i].x,m_ptName[i].y+15,szBuffer,lstrlen(szBuffer));
#endif
				}

				if(m_bMaxBombCountShow)
				{
					//if(i==2 || i== 0){
					if(m_bMaxBombCount[i] !=255){

						//_snprintf(szBuffer,sizeof(szBuffer),TEXT("%s(可以出%ld个炸弹)"),szBuffer, m_bMaxBombCount[i]);
						//炸弹标志
						CImageHandle ImageHandle(&m_ImageBomb);
						m_ImageBomb.AlphaDrawImage(pDC,m_ptBomb[i].x,m_ptBomb[i].y,RGB(255,0,255));

						//设置 DC
						pDC->SetTextColor(RGB(255,255,0));
						pDC->SetTextAlign(TA_LEFT|TA_TOP);

						//炸弹倍数
						TCHAR szBuffer[8];
						_snprintf(szBuffer,sizeof(szBuffer),TEXT("%d"),m_bMaxBombCount[i]-m_bOutBombCount[i]);
						pDC->TextOut(m_ptBomb[i].x+30,m_ptBomb[i].y+10,szBuffer,lstrlen(szBuffer));
					}
					//} 
				}

				//if(m_bMaxBombCountShow){
				//	if(i==1 || i ==3){
				//		if(m_bMaxBombCount[i] ==255){
				//			_snprintf(szBuffer,sizeof(szBuffer),TEXT("(可以"));
				//		} else{
				//			_snprintf(szBuffer,sizeof(szBuffer),TEXT("(可以") );
				//		}
				//		pDC->TextOut(m_ptName[i].x,m_ptName[i].y+18+18,szBuffer,lstrlen(szBuffer));
				//		if(m_bMaxBombCount[i] ==255){
				//			_snprintf(szBuffer,sizeof(szBuffer),TEXT("任意出"));
				//		} else{
				//			_snprintf(szBuffer,sizeof(szBuffer),TEXT("(出%ld个"), m_bMaxBombCount[i]);
				//		}
				//		pDC->TextOut(m_ptName[i].x,m_ptName[i].y+18+18+18,szBuffer,lstrlen(szBuffer));
				//		if(m_bMaxBombCount[i] ==255){
				//			_snprintf(szBuffer,sizeof(szBuffer),TEXT("炸弹)"));
				//		} else{
				//			_snprintf(szBuffer,sizeof(szBuffer),TEXT("炸弹)"));
				//		}
				//		pDC->TextOut(m_ptName[i].x,m_ptName[i].y+18+18+18+18,szBuffer,lstrlen(szBuffer));
				//	}
				//}
			}


			//其他信息
			if (wUserTimer!=0) DrawUserTimer(pDC,m_ptTimer[i].x,m_ptTimer[i].y,wUserTimer);
			if (pUserData->cbUserStatus==US_READY) DrawUserReady(pDC,m_ptReady[i].x,m_ptReady[i].y);
			DrawUserFace(pDC,pUserData,m_ptFace[i].x,m_ptFace[i].y,pUserData->cbUserStatus==US_OFFLINE);
		}
		
	}

	//叫分标志
	CPngImage ImageScore;
	ImageScore.LoadImage(AfxGetInstanceHandle(),TEXT("SCORE"));
	int nXImagePos,nImageWidth=ImageScore.GetWidth(),nImageHeight=ImageScore.GetHeight();
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		if ((m_bScore[i]!=0))
		{
			if ((m_bPass[i]==true)||(m_bScore[i]==255)) nXImagePos=ImageScore.GetWidth()*3/5;
			else nXImagePos=(m_bScore[i]-1)*ImageScore.GetWidth()/5;
			ImageScore.DrawImage(pDC,m_ptScore[i].x,m_ptScore[i].y,nImageWidth/5,nImageHeight,nXImagePos,0);
		}
		if(m_bPass[i]==true)
		{
			if ((m_bPass[i]==true)||(m_bScore[i]==255)) nXImagePos=ImageScore.GetWidth()*4/5;
			else nXImagePos=(m_bScore[i]-1)*ImageScore.GetWidth()/5;
			ImageScore.DrawImage(pDC,m_ptScore[i].x,m_ptScore[i].y,nImageWidth/5,nImageHeight,nXImagePos,0);	
		}
	}

	//test
	//tagUserData *pUserData = new tagUserData;
	//lstrcpy(pUserData->szName,TEXT("测试玩家"));
	//pUserData->lScore = 10000L;
	//pUserData->cbUserStatus = US_READY;


	//庄家位置
	if (m_wLandUser!=INVALID_CHAIR)
	{
		//获取用户
		const tagUserData * pUserData=GetUserInfo(m_wLandUser);
		if (pUserData!=NULL)
		{
			//变量定义
			TCHAR szBuffer[64];
			CPngImage ImageLand;
			ImageLand.LoadImage(AfxGetInstanceHandle(),TEXT("BANKER"));

			//设置 DC
			pDC->SetTextAlign(TA_LEFT|TA_TOP);
			pDC->SetTextColor(RGB(250,250,250));

			//绘画信息
			ImageLand.DrawImage(pDC,m_ptLand[m_wLandUser].x,m_ptLand[m_wLandUser].y);
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("地主:%s"),pUserData->szName);
			pDC->TextOut(m_nXBorder+m_nXFace+10,m_nYBorder+8,szBuffer,lstrlen(szBuffer));
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("倍数:%d 倍"),m_cbLandScore);
			pDC->TextOut(m_nXBorder+m_nXFace+10,m_nYBorder+25,szBuffer,lstrlen(szBuffer));
			DrawUserFace(pDC,pUserData,m_nXBorder+5,m_nYBorder+5,false);
		}
	}

	//炸弹倍数
	//if (m_wBombTime>1)
	//{
	//	//炸弹标志
	//	CImageHandle ImageHandle(&m_ImageBomb);
	//	m_ImageBomb.AlphaDrawImage(pDC,m_nXBorder+5,nHeight-m_nYBorder-m_ImageBomb.GetHeight()-5,RGB(255,0,255));

	//	//设置 DC
	//	pDC->SetTextColor(RGB(250,250,250));
	//	pDC->SetTextAlign(TA_LEFT|TA_TOP);

	//	//炸弹倍数
	//	TCHAR szBuffer[64];
	//	_snprintf(szBuffer,sizeof(szBuffer),TEXT("已出炸弹:%d"),m_wBombTime);
	//	pDC->TextOut(m_nXBorder+m_ImageBomb.GetWidth()+10,nHeight-m_nYBorder-20,szBuffer,lstrlen(szBuffer));
	//}

	//描述信息
	if (m_bLandTitle==true)
	{
		//创建资源
		CFont InfoFont;
		InfoFont.CreateFont(-36,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("黑体"));

		//设置 DC
		pDC->SetTextColor(RGB(201,229,133));
		pDC->SetTextAlign(TA_CENTER|TA_TOP);
		CFont * pOldFont=pDC->SelectObject(&InfoFont);

		//绘画信息
		pDC->TextOut(nWidth/2,200,"正等待用户叫分");

		//清理资源
		pDC->SelectObject(pOldFont);
		InfoFont.DeleteObject();
	}

	return;
}
//绘画界面
void CGameClientView::DrawGameView(CDC * pDC, int nWidth, int nHeight)
{
	//绘画背景
	DrawViewImage(pDC,m_ImageBack,enMode_Spread);
	DrawViewImage(pDC,m_ImageCenter,enMode_Centent);	

	//绘画用户
	TCHAR szBuffer[32];
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		//变量定义
		WORD wUserTimer=GetUserTimer(i);
		const tagUserData * pUserData=GetUserInfo(i);

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

		//tagUserData *pUserData = new tagUserData;
		//strcpy( (char*)pUserData->szName, "dkjfdkfjdkfj" );
		//pUserData->cbUserStatus = US_READY;
		//wUserTimer = 10;
		//m_ImageLand.DrawImage(pDC,m_ptLand[i].x,m_ptLand[i].y);
		//m_wBombTime = 2;
		//m_bShowWarming[i]=true;
		//m_bCardCount[i] = 2;
		//m_cbCallScorePhase=5;
		//m_bScore[i] = 3;
		//m_bPass[i]=false;

		//m_wLandUser = 2;
		//m_wBombTime=4;
		///////////////////////////////////////////////////////

		//绘画用户
		if (pUserData!=NULL)
		{
			//用户名字
			pDC->SetTextAlign( ( ( i == 2 && ! m_bDeasilOrder ) || ( i == 0 && m_bDeasilOrder ) ) ? TA_RIGHT : TA_LEFT );
			pDC->SetTextColor((wUserTimer>0)?RGB(250,250,250):RGB(220,220,220));
			DrawTextString( pDC, pUserData->szName, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_ptName[i].x,m_ptName[i].y );

			//剩余扑克
		//	if (i!=1)
			{
				_snprintf(szBuffer,sizeof(szBuffer),TEXT("剩余:%d 张"),m_bCardCount[i]);
				DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_ptName[i].x,m_ptName[i].y+18 );
			}

			//其他信息
			if (wUserTimer!=0) DrawUserTimer(pDC,m_ptTimer[i].x,m_ptTimer[i].y,wUserTimer);
			if (pUserData->cbUserStatus==US_READY) DrawUserReady(pDC,m_ptReady[i].x,m_ptReady[i].y);
			DrawUserFace(pDC,pUserData,m_ptFace[i].x,m_ptFace[i].y,pUserData->cbUserStatus==US_OFFLINE);

			//报牌信息
			if(m_bShowWarming[i])
			{
				//创建资源
				CFont InfoFont;
				InfoFont.CreateFont(-40,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("黑体"));

				//设置 DC
				pDC->SetTextColor(RGB(255,0,0));
				pDC->SetTextAlign(TA_CENTER|TA_TOP);
				CFont * pOldFont=pDC->SelectObject(&InfoFont);

				//绘画信息
				if ( i == 0 || i == 2)
				{
					if ( m_bCardCount[i] == 1)
						m_ImageOnecardWarming.DrawImage(pDC, m_ptWarmingCard[i].x,  m_ptWarmingCard[i].y);
					else if(m_bCardCount[i] == 2 )
						m_ImageTwoCardWarming.DrawImage(pDC, m_ptWarmingCard[i].x,  m_ptWarmingCard[i].y);
				}					


				//清理资源
				pDC->SelectObject(pOldFont);
				InfoFont.DeleteObject();			

			}

			//亮牌信息
			if ( m_bBrightStart[i] )
			{
				BYTE const SECTION_COUNT = 11; 
				INT nInfoWidth = m_ImageScore.GetWidth() / SECTION_COUNT;
				INT nInfoHeight = m_ImageScore.GetHeight();
				INT nXPos = nInfoWidth * 8 ;
				m_ImageScore.DrawImage(pDC, m_ptBrightStart[i].x, m_ptBrightStart[i].y, nInfoWidth, nInfoHeight, nXPos, 0 );
			}
		}
	}

	//显示倍数
	//if ( m_cbCallScorePhase >= CSD_SNATCHLAND && m_cbLandScore > 1 )
	//{
	//	//位置信息
	//	INT const LAND_TIMES_COUNT = 5;
	//	INT nXPos = 0;
	//	INT nNumWidth = m_ImageLandTimes.GetWidth() / LAND_TIMES_COUNT;
	//	INT nNumHeight = m_ImageLandTimes.GetHeight();
	//	if ( m_cbLandScore == 2 ) nXPos = 0;
	//	else if ( m_cbLandScore == 3 ) nXPos = nNumWidth;
	//	else if ( m_cbLandScore == 4 ) nXPos = 2 * nNumWidth;
	//	else if ( m_cbLandScore == 5 ) nXPos = 3 * nNumWidth;

	//	INT nSpace = 10;
	//	INT nXStartPos = ( nWidth - ( 2 * nNumWidth - nSpace ) ) / 2;
	//	INT nYStartPos = 250;

	//	//绘画图片
	//	m_ImageLandTimes.DrawImage( pDC, nXStartPos, nYStartPos, nNumWidth, nNumHeight, nNumWidth * 4, 0 );
	//	m_ImageLandTimes.DrawImage( pDC, nXStartPos+nNumWidth-nSpace, nYStartPos, nNumWidth, nNumHeight, nXPos, 0 );
	//}

	//叫分标志
	int nXImagePos,nImageWidth=m_ImageScore.GetWidth(),nImageHeight=m_ImageScore.GetHeight();
	for (WORD i=0;i<3;i++)
	{
		if ((m_bScore[i]!=0)||(m_bPass[i]==true) || m_bDoubleScore[i]==true)
		{
			BYTE const SECTION_COUNT = 11; 
			if ( m_bPass[i]==true ) nXImagePos=m_ImageScore.GetWidth()*4/SECTION_COUNT;
			else if ( m_bScore[i]==255 && m_cbUserPhase[i] == CSD_SNATCHLAND ) nXImagePos=m_ImageScore.GetWidth()*6/SECTION_COUNT;
			else if ( m_bScore[i]==255 && m_cbUserPhase[i] == CSD_BRIGHTCARD ) nXImagePos=m_ImageScore.GetWidth()*10/SECTION_COUNT;
			else if ( m_bScore[i]==255 ) nXImagePos=m_ImageScore.GetWidth()*3/SECTION_COUNT;
			else if (m_bScore[i]==4) nXImagePos=7*m_ImageScore.GetWidth()/SECTION_COUNT;
			else if ( m_bDoubleScore[i]==true ) nXImagePos=5*m_ImageScore.GetWidth()/SECTION_COUNT;
			else nXImagePos=9*m_ImageScore.GetWidth()/SECTION_COUNT;
			m_ImageScore.DrawImage(pDC,m_ptScore[i].x,m_ptScore[i].y,nImageWidth/SECTION_COUNT,nImageHeight,nXImagePos,0);
		}
	}

	//庄家位置
	if (m_wLandUser!=INVALID_CHAIR && m_cbCallScorePhase == CSD_GAMESTART)
	{
		//获取用户
		const tagUserData * pUserData=GetUserInfo(m_wLandUser);
		if (pUserData!=NULL)
		{
			//变量定义
			TCHAR szBuffer[64];
			INT nXStartPos = m_nXFace + m_nXBorder + 15;
			INT nYStartPos = m_nYBorder+10;
			INT nSpace = 20;

			//设置DC
			pDC->SetTextAlign( DT_LEFT );

			//绘画信息
			m_ImageLand.DrawImage(pDC,m_ptLand[m_wLandUser].x,m_ptLand[m_wLandUser].y);
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("地主:%s"),pUserData->szName);
			DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), nXStartPos,nYStartPos );

			//绘画头像
			DrawUserFace(pDC,pUserData,m_nXBorder+5,m_nYBorder+5,false);

			//叫牌分数
			LONG lScore=m_cbLandScore*m_lBaseScore;
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("底分:%ld "),m_lBaseScore);
			DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), nXStartPos,nYStartPos + nSpace  );

			//翻倍计算
			WORD wDrawTimes=(WORD)m_lBaseScore;
			for (WORD i=1;i<m_cbLandScore;i++) wDrawTimes*=2;

			//总共倍数
			WORD wLandTime = 0;
			if ( m_cbBrightTime != 0 && wDrawTimes == 0 ) wLandTime = m_cbBrightTime;
			else if ( m_cbBrightTime == 0 && wDrawTimes != 0 ) wLandTime = wDrawTimes;
			else if ( m_cbBrightTime != 0 && wDrawTimes != 0 ) wLandTime = m_cbBrightTime * wDrawTimes;
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("倍数:%ld"),wLandTime );
			DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), nXStartPos,nYStartPos + nSpace * 2 );

			//炸弹倍数
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("炸弹翻倍:%d"),m_wBombTime);
			DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), nXStartPos,nYStartPos + nSpace * 3);
		}
	}

	//绘画爆炸
	if (m_bBombEffect==true)
	{
		//加载资源
		CImageHandle HandleBombEffect(&m_ImageBombEffect);

		//绘画效果
		INT nImageHeight=m_ImageBombEffect.GetHeight();
		INT nImageWidth=m_ImageBombEffect.GetWidth()/BOMB_EFFECT_COUNT;
		m_ImageBombEffect.AlphaDrawImage(pDC,(nWidth-nImageWidth)/2,0,nImageWidth,nImageHeight,
			nImageWidth*(m_cbBombFrameIndex%BOMB_EFFECT_COUNT),0,RGB(255,0,255));
	}

	//描述信息
	if (m_bLandTitle==true)
	{
		//创建资源
		CFont InfoFont;
		InfoFont.CreateFont(-36,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("黑体"));

		//设置 DC
		pDC->SetTextColor(RGB(201,229,133));
		pDC->SetTextAlign(TA_CENTER|TA_TOP);
		CFont * pOldFont=pDC->SelectObject(&InfoFont);

		//绘画信息
		pDC->TextOut(nWidth/2,200,"正等待用户叫分");

		//清理资源
		pDC->SelectObject(pOldFont);
		InfoFont.DeleteObject();
	}

	//托管标识
	for ( WORD wChairID = 0; wChairID < GAME_PLAYER; ++wChairID ) {
		
		const tagUserData * pUserData=GetUserInfo( wChairID );
		if ( pUserData == NULL ) m_bUserTrustee[ wChairID ] = false;

		if ( m_bUserTrustee[ wChairID ] ) {
			if ( wChairID == 1 )
				m_ImageUserTrustee.DrawImage( pDC, m_ptLand[ wChairID ].x + 40, m_ptLand[ wChairID ].y - 1 );
			else if ( wChairID == 0 && !m_bDeasilOrder || wChairID == 2 && m_bDeasilOrder )
				m_ImageUserTrustee.DrawImage( pDC, m_ptFace[ wChairID ].x + m_nXFace + 8, m_ptFace[ wChairID ].y + m_nYFace -
				m_ImageUserTrustee.GetHeight() + 3 );
			else 
				m_ImageUserTrustee.DrawImage( pDC, m_ptFace[ wChairID ].x - m_nXFace - 8, m_ptFace[ wChairID ].y + m_nYFace -
				m_ImageUserTrustee.GetHeight() + 3 );
		}
	}

	//绘画倍数
	if ( m_bShowLandTime ) DrawLandTime(pDC, nWidth, nHeight);

	return;
}
//绘画界面
void CGameClientView::DrawGameView(CDC * pDC, int nWidth, int nHeight)
{
	//绘画背景
	DrawViewImage(pDC,m_ImageBack,enMode_Spread);
	DrawViewImage(pDC,m_ImageCenter,enMode_Centent);

	CImageHandle HandleHeadBg(&m_ImageHeadBg);
	

	//绘画用户
	TCHAR szBuffer[32];
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		//变量定义
		WORD wUserTimer=GetUserTimer(i);
		const tagUserData * pUserData=GetUserInfo(i);

		//绘画用户
		if (pUserData!=NULL)
		{
			//m_ImageHeadBg.BitBlt(pDC->m_hDC,m_ptFace[i].x-2,m_ptFace[i].y-2);
			//用户名字
			pDC->SetTextColor((wUserTimer>0)?RGB(250,250,250):RGB(220,220,220));
			pDC->SetTextAlign(((i==0)&&(m_bDeasilOrder==true))||((i==2)&&(m_bDeasilOrder==false))?TA_RIGHT:TA_LEFT);
			pDC->TextOut(m_ptName[i].x,m_ptName[i].y,pUserData->szName,lstrlen(pUserData->szName));

			//剩余扑克
			if (pUserData->cbUserStatus>=US_PLAY)
			{
				_snprintf(szBuffer,sizeof(szBuffer),TEXT("(%ld 张)"),m_bCardCount[i]);
				pDC->TextOut(m_ptName[i].x,m_ptName[i].y+18,szBuffer,lstrlen(szBuffer));
			}

			//其他信息
			if (wUserTimer!=0) DrawUserTimer(pDC,m_ptTimer[i].x,m_ptTimer[i].y,wUserTimer);
			if (pUserData->cbUserStatus==US_READY) DrawUserReady(pDC,m_ptReady[i].x,m_ptReady[i].y);
			DrawUserFace(pDC,pUserData,m_ptFace[i].x,m_ptFace[i].y,pUserData->cbUserStatus==US_OFFLINE);
		}
	}

	////叫分标志
	//CImageHandle ImageHnadleScore(&m_ImageScore);
	//int nXImagePos,nImageWidth=m_ImageScore.GetWidth(),nImageHeight=m_ImageScore.GetHeight();
	//for (WORD i=0;i<3;i++)
	//{
	//	if ((m_bScore[i]!=0)||(m_bPass[i]==true))
	//	{
	//		if ((m_bPass[i]==true)||(m_bScore[i]==255)) nXImagePos=m_ImageScore.GetWidth()*3/4;
	//		else nXImagePos=(m_bScore[i]-1)*m_ImageScore.GetWidth()/4;
	//		m_ImageScore.AlphaDrawImage(pDC,m_ptScore[i].x,m_ptScore[i].y,nImageWidth/4,nImageHeight,nXImagePos,0,RGB(255,0,255));
	//	}
	//}

	////庄家位置
	//if (m_wLandUser!=INVALID_CHAIR)
	//{
	//	//获取用户
	//	const tagUserData * pUserData=GetUserInfo(m_wLandUser);
	//	if (pUserData!=NULL)
	//	{
	//		//变量定义
	//		TCHAR szBuffer[64];
	//		CImageHandle ImageHandleLand(&m_ImageLand);

	//		//设置 DC
	//		pDC->SetTextAlign(TA_LEFT|TA_TOP);
	//		pDC->SetTextColor(RGB(250,250,250));

	//		//绘画信息
	//		m_ImageLand.AlphaDrawImage(pDC,m_ptLand[m_wLandUser].x,m_ptLand[m_wLandUser].y,RGB(255,0,255));
	//		_snprintf(szBuffer,sizeof(szBuffer),TEXT("地主:%s"),pUserData->szName);
	//		pDC->TextOut(m_nXBorder+m_nXFace+10,m_nYBorder+8,szBuffer,lstrlen(szBuffer));
	//		_snprintf(szBuffer,sizeof(szBuffer),TEXT("底分:%d 分"),m_cbLandScore);
	//		pDC->TextOut(m_nXBorder+m_nXFace+10,m_nYBorder+25,szBuffer,lstrlen(szBuffer));
	//		DrawUserFace(pDC,pUserData->wFaceID,m_nXBorder+5,m_nYBorder+5,false);
	//	}
	//}

	////炸弹倍数
	//if (m_wBombTime>1)
	//{
	//	//炸弹标志
	//	CImageHandle ImageHandle(&m_ImageBomb);
	//	m_ImageBomb.AlphaDrawImage(pDC,m_nXBorder+5,nHeight-m_nYBorder-m_ImageBomb.GetHeight()-5,RGB(255,0,255));

	//	//设置 DC
	//	pDC->SetTextColor(RGB(250,250,250));
	//	pDC->SetTextAlign(TA_LEFT|TA_TOP);

	//	//炸弹倍数
	//	TCHAR szBuffer[64];
	//	_snprintf(szBuffer,sizeof(szBuffer),TEXT("炸弹翻倍:%d"),m_wBombTime);
	//	pDC->TextOut(m_nXBorder+m_ImageBomb.GetWidth()+10,nHeight-m_nYBorder-20,szBuffer,lstrlen(szBuffer));
	//}

	////描述信息
	//if (m_bLandTitle==true)
	//{
	//	//创建资源
	//	CFont InfoFont;
	//	InfoFont.CreateFont(-36,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("黑体"));

	//	//设置 DC
	//	pDC->SetTextColor(RGB(201,229,133));
	//	pDC->SetTextAlign(TA_CENTER|TA_TOP);
	//	CFont * pOldFont=pDC->SelectObject(&InfoFont);

	//	//绘画信息
	//	pDC->TextOut(nWidth/2,200,"正等待用户叫分");

	//	//清理资源
	//	pDC->SelectObject(pOldFont);
	//	InfoFont.DeleteObject();
	//}

	return;
}
Exemple #16
0
/*
 * Svc_Connect
 *
 * A connection request that did not come from the master.
 */
static void Svc_Connect(void) {
	char user_info[MAX_USER_INFO_STRING];
	sv_client_t *cl, *client;
	net_addr_t addr;
	int version;
	byte qport;
	unsigned int challenge;
	int i;

	Com_Debug("Svc_Connect()\n");

	addr = net_from;

	version = atoi(Cmd_Argv(1));

	// resolve protocol
	if (version != PROTOCOL) {
		Netchan_OutOfBandPrint(NS_SERVER, addr,
				"print\nServer is version %d.\n", PROTOCOL);
		return;
	}

	qport = strtoul(Cmd_Argv(2), NULL, 0) & 0xff;

	challenge = strtoul(Cmd_Argv(3), NULL, 0);

	//copy user_info, leave room for ip stuffing
	strncpy(user_info, Cmd_Argv(4), sizeof(user_info) - 1 - 25);
	user_info[sizeof(user_info) - 1] = 0;

	if (*user_info == '\0') { // catch empty user_info
		Com_Print("Empty user_info from %s\n", Net_NetaddrToString(addr));
		Netchan_OutOfBandPrint(NS_SERVER, addr, "print\nConnection refused.\n");
		return;
	}

	if (strchr(user_info, '\xFF')) { // catch end of message in string exploit
		Com_Print("Illegal user_info contained xFF from %s\n",
				Net_NetaddrToString(addr));
		Netchan_OutOfBandPrint(NS_SERVER, addr, "print\nConnection refused.\n");
		return;
	}

	if (strlen(GetUserInfo(user_info, "ip"))) { // catch spoofed ips
		Com_Print("Illegal user_info contained ip from %s\n",
				Net_NetaddrToString(addr));
		Netchan_OutOfBandPrint(NS_SERVER, addr, "print\nConnection refused.\n");
		return;
	}

	if (!ValidateUserInfo(user_info)) { // catch otherwise invalid user_info
		Com_Print("Invalid user_info from %s\n", Net_NetaddrToString(addr));
		Netchan_OutOfBandPrint(NS_SERVER, addr, "print\nConnection refused.\n");
		return;
	}

	// force the ip so the game can filter on it
	SetUserInfo(user_info, "ip", Net_NetaddrToString(addr));

	// enforce a valid challenge to avoid denial of service attack
	for (i = 0; i < MAX_CHALLENGES; i++) {
		if (Net_CompareClientNetaddr(addr, svs.challenges[i].addr)) {
			if (challenge == svs.challenges[i].challenge) {
				svs.challenges[i].challenge = 0;
				break; // good
			}
			Netchan_OutOfBandPrint(NS_SERVER, addr, "print\nBad challenge.\n");
			return;
		}
	}
	if (i == MAX_CHALLENGES) {
		Netchan_OutOfBandPrint(NS_SERVER, addr,
				"print\nNo challenge for address.\n");
		return;
	}

	// resolve the client slot
	client = NULL;

	// first check for an ungraceful reconnect (client crashed, perhaps)
	for (i = 0, cl = svs.clients; i < sv_max_clients->integer; i++, cl++) {

		const net_chan_t *ch = &cl->netchan;

		if (cl->state == SV_CLIENT_FREE) // not in use, not interested
			continue;

		// the base address and either the qport or real port must match
		if (Net_CompareClientNetaddr(addr, ch->remote_address) &&
				(qport == ch->qport || ch->remote_address.port == addr.port)) {
			client = cl;
			break;
		}
	}

	// otherwise, treat as a fresh connect to a new slot
	if (!client) {
		for (i = 0, cl = svs.clients; i < sv_max_clients->integer; i++, cl++) {
			if (cl->state == SV_CLIENT_FREE) { // we have a free one
				client = cl;
				break;
			}
		}
	}

	// no soup for you, next!!
	if (!client) {
		Netchan_OutOfBandPrint(NS_SERVER, addr, "print\nServer is full.\n");
		Com_Debug("Rejected a connection.\n");
		return;
	}

	// give the game a chance to reject this connection or modify the user_info
	if (!(svs.game->ClientConnect(client->edict, user_info))) {

		if (*GetUserInfo(user_info, "rejmsg")) {
			Netchan_OutOfBandPrint(NS_SERVER, addr,
					"print\n%s\nConnection refused.\n",
					GetUserInfo(user_info, "rejmsg"));
		} else {
			Netchan_OutOfBandPrint(NS_SERVER, addr,
					"print\nConnection refused.\n");
		}

		Com_Debug("Game rejected a connection.\n");
		return;
	}

	// parse some info from the info strings
	strncpy(client->user_info, user_info, sizeof(client->user_info) - 1);
	Sv_UserInfoChanged(client);

	// send the connect packet to the client
	Netchan_OutOfBandPrint(NS_SERVER, addr, "client_connect %s",
			sv_download_url->string);

	Netchan_Setup(NS_SERVER, &client->netchan, addr, qport);

	Sb_Init(&client->datagram, client->datagram_buf,
			sizeof(client->datagram_buf));
	client->datagram.allow_overflow = true;

	client->last_message = svs.real_time; // don't timeout

	client->state = SV_CLIENT_CONNECTED;
}
//绘画界面
void CGameClientView::DrawGameView(CDC * pDC, int nWidth, int nHeight)
{
	//绘画背景
	DrawViewImage(pDC,m_ImageBack,enMode_Spread);
	DrawViewImage(pDC,m_ImageCenter,enMode_Centent);

	//绘画用户
	TCHAR szBuffer[32];
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		//变量定义
		WORD wUserTimer=GetUserTimer(i);
		const tagUserData * pUserData=GetUserInfo(i);

		//绘画用户
		if (pUserData!=NULL)
		{
			//用户名字
			pDC->SetTextAlign( ( ( i == 3 && ! m_bDeasilOrder ) || ( i == 0 && m_bDeasilOrder ) ) ? TA_RIGHT : TA_LEFT );
			pDC->SetTextColor((wUserTimer>0)?RGB(250,250,250):RGB(220,220,220));
			DrawTextString( pDC, pUserData->szName, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_ptName[i].x,m_ptName[i].y );

			//剩余扑克
			{
				_snprintf(szBuffer,sizeof(szBuffer),TEXT("剩余:%d 张"),m_bCardCount[i]);
				DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_ptName[i].x,m_ptName[i].y+18 );
			}

			//CImageHandle HandleCard(&m_Imagetime);
			//m_Imagetime.AlphaDrawImage(pDC,m_ptTimer[i].x,m_ptTimer[i].y,/*nWidth/2-465, nHeight/2-355,*/RGB(255,0,255));

			//其他信息
			if (wUserTimer!=0)
			{ 
				DrawUserTimer(pDC,m_ptTimer[i].x,m_ptTimer[i].y,wUserTimer);
				//CImageHandle HandleCard(&m_Imagetimech);
				//for(int i=wUserTimer-2; i>=0; i--)
				//m_Imagetimech.AlphaDrawImage(pDC,nWidth/2-396+(i*10), nHeight/2-350,RGB(255,0,255));
			}
			if (pUserData->cbUserStatus==US_READY) DrawUserReady(pDC,m_ptReady[i].x,m_ptReady[i].y);
			DrawUserFace(pDC,pUserData,m_ptFace[i].x,m_ptFace[i].y,pUserData->cbUserStatus==US_OFFLINE);

			//托管标识
			if ( m_bUserTrustee[ i ] ) {
			if ( i == ME_VIEW_CHAIR )
				m_ImageUserTrustee.DrawImage( pDC, m_ptLand[ i ].x + 40, m_ptLand[ i ].y - 1 );
			else if ( i == 0 )
				m_ImageUserTrustee.DrawImage( pDC, m_ptLand[ i ].x + 40, m_ptFace[ i ].y + m_nYFace -
				m_ImageUserTrustee.GetHeight() + 3 );
			else if ( i == 1 )
				m_ImageUserTrustee.DrawImage( pDC, m_ptFace[ i ].x + m_nXFace + 8, m_ptFace[ i ].y + m_nYFace -
				m_ImageUserTrustee.GetHeight() + 3 );
			else
				m_ImageUserTrustee.DrawImage( pDC, m_ptFace[ i ].x - m_nXFace - 8, m_ptFace[ i ].y + m_nYFace -
				m_ImageUserTrustee.GetHeight() + 3 );
		}
		}
	}

	//叫分标志
	int nXImagePos,nImageWidth=m_ImageScore.GetWidth(),nImageHeight=m_ImageScore.GetHeight();
	for (WORD i=0;i<GAME_PLAYER;i++)
	{
		if ((m_bScore[i]!=0)||(m_bPass[i]==true))
		{
			if ( m_bPass[i]==true ) nXImagePos=m_ImageScore.GetWidth()*4/5;
			else if ( m_bScore[i]==255 ) nXImagePos=m_ImageScore.GetWidth()*3/5;
			else nXImagePos=(m_bScore[i]-1)*m_ImageScore.GetWidth()/5;
			m_ImageScore.DrawImage(pDC,m_ptScore[i].x,m_ptScore[i].y,nImageWidth/5,nImageHeight,nXImagePos,0);
		}
	}

	//庄家位置
	if (m_wLandUser!=INVALID_CHAIR)
	{
		//获取用户
		const tagUserData * pUserData=GetUserInfo(m_wLandUser);
		//tagUserData *pUserData = new tagUserData;
		//strcpy( (char*)pUserData->szName, "dkjfdkfjdkfj" );
		if (pUserData!=NULL)
		{
			//变量定义
			TCHAR szBuffer[64];

			//设置 DC
			pDC->SetTextAlign(TA_LEFT|TA_TOP);
			pDC->SetTextColor(RGB(250,250,250));

			//扑克高度
			CRect CardRect;
			//m_BackCardControl.GetWindowRect( &CardRect );
			ScreenToClient( &CardRect );

			//绘画信息
			m_ImageLand.DrawImage(pDC,m_ptLand[m_wLandUser].x,m_ptLand[m_wLandUser].y);
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("地主:%s"),pUserData->szName);
			DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_nXBorder+10,CardRect.bottom+10 );

			//绘画头像
		//	DrawUserFace(pDC,pUserData->wFaceID,m_nXBorder+5,m_nYBorder+5,false);

			//叫牌分数
			LONG lScore=m_cbLandScore*m_lBaseScore;
			_snprintf(szBuffer,sizeof(szBuffer),TEXT("分数:%ld 分"),lScore);
			DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_nXBorder+10,CardRect.bottom+30 );
		}
	}

	//绘画爆炸
	if (m_bBombEffect==true)
	{
		//加载资源
		CImageHandle HandleBombEffect(&m_ImageBombEffect);

		//绘画效果
		INT nImageHeight=m_ImageBombEffect.GetHeight();
		INT nImageWidth=m_ImageBombEffect.GetWidth()/BOMB_EFFECT_COUNT;
		m_ImageBombEffect.AlphaDrawImage(pDC,(nWidth-nImageWidth)/2,0,nImageWidth,nImageHeight,
			nImageWidth*(m_cbBombFrameIndex%BOMB_EFFECT_COUNT),0,RGB(255,0,255));
	}

	//炸弹倍数
	if (m_wBombTime>1)
	{
		//扑克高度
		CRect CardRect;
		//m_BackCardControl.GetWindowRect( &CardRect );
		ScreenToClient( &CardRect );

		//炸弹标志
		CImageHandle ImageHandle(&m_ImageBomb);
		m_ImageBomb.AlphaDrawImage(pDC,m_nXBorder+5,50+CardRect.bottom,RGB(255,0,255));

		//设置 DC
		pDC->SetTextColor(RGB(250,250,250));
		pDC->SetTextAlign(TA_LEFT|TA_TOP);

		//炸弹倍数
		TCHAR szBuffer[64];
		_snprintf(szBuffer,sizeof(szBuffer),TEXT("炸弹翻倍:%d"),m_wBombTime);
		DrawTextString( pDC, szBuffer, RGB( 255, 255, 255 ), RGB( 0, 0, 0 ), m_nXBorder+m_ImageBomb.GetWidth()+10,CardRect.bottom+60 );
	}

	//描述信息
	if (m_bLandTitle==true)
	{
		//创建资源
		CFont InfoFont;
		InfoFont.CreateFont(-36,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("黑体"));

		//设置 DC
		pDC->SetTextColor(RGB(201,229,133));
		pDC->SetTextAlign(TA_CENTER|TA_TOP);
		CFont * pOldFont=pDC->SelectObject(&InfoFont);

		//绘画信息
		pDC->TextOut(nWidth/2,200,"正等待用户叫分");

		//清理资源
		pDC->SelectObject(pOldFont);
		InfoFont.DeleteObject();
	}

	return;
}