www.pudn.com > mir112347628.rar > NPCTxtAnalysis.cpp


// NPCTxtAnalysis.cpp: implementation of the CNPCTxtAnalysis class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
 
#define LINE_DIVIDER				0x01			// Line Divider 
 
#define DEFAULT_TEXT_HEIGHT			16				// Default Text Height(as Pixel) 
#define DEFAULT_TEXT_WIDTH			16				// Default Text Width(as Pixel) 
 
#define	DEFAULT_TXT_COLOR			RGB(255,255,255)	// WHITE COLOR 
#define DEFAULT_BTN_COLOR			RGB(255,255,0)		// YELLOW COLOR 
#define DEFAULT_BTN_CLICK_COLOR		RGB(255,0,0)		// RED COLOR 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CNPCTxtAnalysis::CNPCTxtAnalysis() 
{ 
	m_pxBtn = NULL; 
	m_pxpTxt = NULL; 
	m_pSourceText = NULL; 
	m_bReady = FALSE; 
	m_bInited = FALSE; 
	m_pxGWND = NULL; 
} 
 
CNPCTxtAnalysis::~CNPCTxtAnalysis() 
{ 
	FreeAllMsg(); 
} 
 
BOOL CNPCTxtAnalysis::InitAnalysis(CTextButton *xpBtn,CPDLList*	pxpTxt,CWHDXGraphicWindow*	pxGWND) 
{ 
	m_pxBtn = xpBtn;									// Link to Text Button Class 
	m_pxpTxt = pxpTxt; 
	ZeroMemory(m_InnerResult,MAX_BUFFER_SIZE); 
	m_pxGWND=pxGWND; 
	m_bInited = TRUE; 
	return TRUE; 
} 
 
BOOL CNPCTxtAnalysis::FreeAllMsg(VOID) 
{ 
	if(m_bInited) 
	{ 
		m_pxpTxt->ClearAllNodes();							// ºÐ¼®µÈ ±Û ¸ðµÎ ³¯¸®±â 
		m_pxBtn->ReleaseButtons();							// »ý¼ºµÈ ´ÜÅõ ¸ðµÎ ³¯¸®±â 
	} 
 
	if(m_pSourceText!=NULL) 
	{ 
		delete[] m_pSourceText;								// ¹ÞÀº ¼Ò½ºµµ ¸ðµÎ ³¯¸®±â 
		m_pSourceText = NULL; 
	} 
 
	m_bReady = FALSE; 
	return TRUE; 
} 
 
// Divider ´Â °¢ CHARº°·Î ¸ðµÎ °ËÃâÇÑ´Ù. 
// °á°ú´Â ¹Þ´Â Áï½Ã Memcpy¸¦ ÇÒ°Í.. ¾Æ´Ï¸é ¾²·¹±â °ªÀ¸ µÊ... 
CHAR* CNPCTxtAnalysis::GetValidStr(CHAR* szSource,CHAR* szDest,CHAR* Divider) 
{ 
	CHAR* szBuffer; 
	int nSrcLen; 
	int	nBuf_Count,nCount; 
	int nArrCount; 
 
	szBuffer = new CHAR[MAX_BUFFER_SIZE]; 
	nSrcLen = strlen(szSource); 
 
	nBuf_Count	=	0; 
	nCount		=	0; 
 
	if (nSrcLen >= MAX_BUFFER_SIZE - 1 )				// ÃÖ´ë ±æÀ̺¸´Ù ±æ¸é ½ÇÇàÀ» Ãë¼Ò ÇÑ´Ù. 
	{ 
		ZeroMemory(szDest,sizeof(szDest)); 
		delete[] szBuffer; 
		return NULL; 
	} 
 
	if (strlen(szSource)==0)						// ¼Ò½º Text°¡ ¾øÀ¸¸é ½ÇÇàÀ» Ãë¼Ò ÇÑ´Ù. 
	{ 
		ZeroMemory(szDest,sizeof(szDest)); 
		delete[] szBuffer; 
		return szDest; 
	} 
 
	nArrCount = strlen(Divider)/sizeof(char);		// DividerÀÇ ±æÀ̸¦ ±¸ÇÑ´Ù. 
 
	while(true) 
	{ 
		char Ch; 
 
		if( nCount <= nSrcLen ) 
		{ 
			Ch=szSource[nCount]; 
			for(int i = 0; i<= nArrCount-1;i++)		 
			{ 
				if(Ch == Divider[i])				// Divider °ËÃâ 
				{ 
					goto CATCH_DIV; 
				} 
			} 
		} 
		if(nCount > nSrcLen) 
		{ 
			CATCH_DIV: 
			if(nBuf_Count >0) 
			{ 
				if(nBuf_Count < MAX_BUFFER_SIZE -1) 
				{ 
					szBuffer[nBuf_Count] = '\0';	// End String (sz) 
					strcpy(szDest,szBuffer); 
					strncpy(m_InnerResult,szSource + nCount+1,nSrcLen-nCount); 
				} 
				break; 
			} 
			else 
			{ 
				if(nCount>nSrcLen) 
				{ 
					ZeroMemory(szDest,sizeof(szDest)); 
					strncpy(m_InnerResult,szSource +nCount+2,nSrcLen-1); 
					break; 
				} 
			} 
		} 
		else 
		{ 
			if(nBuf_Count< MAX_BUFFER_SIZE -1) 
			{ 
				szBuffer[nBuf_Count] = Ch; 
				nBuf_Count++; 
			} 
		} 
		nCount++; 
	} 
 
	delete[] szBuffer; 
	return m_InnerResult; 
} 
 
 
CHAR* CNPCTxtAnalysis::GetValidStr(CHAR* szSource,CHAR* szDest,CHAR Divider) 
{ 
	CHAR* szBuffer; 
	int nSrcLen; 
	int	nBuf_Count,nCount; 
 
	szBuffer = new CHAR[MAX_BUFFER_SIZE]; 
	nSrcLen = strlen(szSource); 
 
	nBuf_Count	=	0; 
	nCount		=	0; 
 
	if (nSrcLen >= MAX_BUFFER_SIZE - 1 )				// ÃÖ´ë ±æÀ̺¸´Ù ±æ¸é ½ÇÇàÀ» Ãë¼Ò ÇÑ´Ù. 
	{ 
		ZeroMemory(szDest,sizeof(szDest)); 
		delete[] szBuffer; 
		return NULL; 
	} 
 
	if (strlen(szSource)==0)							// ¼Ò½º Text°¡ ¾øÀ¸¸é ½ÇÇàÀ» Ãë¼Ò ÇÑ´Ù. 
	{ 
		ZeroMemory(szDest,sizeof(szDest)); 
		delete[] szBuffer; 
		return szDest; 
	} 
 
	while(true) 
	{ 
		char Ch; 
 
		if( nCount <= nSrcLen ) 
		{ 
			Ch=szSource[nCount]; 
			if(Ch == Divider)				// Divider °ËÃâ 
			{ 
				goto CATCH_DIV; 
			} 
		} 
		if(nCount > nSrcLen) 
		{ 
			CATCH_DIV: 
			if(nBuf_Count >0) 
			{ 
				if(nBuf_Count < MAX_BUFFER_SIZE -1) 
				{ 
					szBuffer[nBuf_Count] = '\0';	// End String (sz) 
					strcpy(szDest,szBuffer); 
					ZeroMemory(m_InnerResult,MAX_BUFFER_SIZE); 
					if(nSrcLen-nCount>0)  
						strncpy(m_InnerResult,szSource + nCount+1,nSrcLen-nCount); 
				} 
				break; 
			} 
			else 
			{ 
				if(nCount>nSrcLen) 
				{ 
					ZeroMemory(szDest,sizeof(szDest)); 
					ZeroMemory(m_InnerResult,MAX_BUFFER_SIZE); 
					if(nSrcLen-1>0) strncpy(m_InnerResult,szSource +nCount+2,nSrcLen-1); 
					break; 
				} 
			} 
		} 
		else 
		{ 
			if(nBuf_Count< MAX_BUFFER_SIZE -1) 
			{ 
				szBuffer[nBuf_Count] = Ch; 
				nBuf_Count++; 
			} 
		} 
		nCount++; 
	} 
	if(szBuffer!=NULL) 
	{ 
		delete[] szBuffer; 
		szBuffer = NULL; 
	} 
 
	return m_InnerResult; 
} 
 
CHAR* CNPCTxtAnalysis::GetValidStr(CHAR* szSource,INT nSrcLen,CHAR* szDest,INT nDestLen,CHAR Divider) 
{ 
	CHAR* szBuffer; 
	int	nBuf_Count,nCount; 
 
	szBuffer = new CHAR[MAX_BUFFER_SIZE]; 
 
	nBuf_Count	=	0; 
	nCount		=	0; 
 
	if (nSrcLen >= MAX_BUFFER_SIZE - 1 )				// ÃÖ´ë ±æÀ̺¸´Ù ±æ¸é ½ÇÇàÀ» Ãë¼Ò ÇÑ´Ù. 
	{ 
		ZeroMemory(szDest,nDestLen); 
		delete[] szBuffer; 
		return NULL; 
	} 
 
	if (strlen(szSource)==0)							// ¼Ò½º Text°¡ ¾øÀ¸¸é ½ÇÇàÀ» Ãë¼Ò ÇÑ´Ù. 
	{ 
		ZeroMemory(szDest,nDestLen); 
		delete[] szBuffer; 
		return szDest; 
	} 
 
	while(true) 
	{ 
		char Ch; 
 
		if( nCount <= nSrcLen ) 
		{ 
			Ch=szSource[nCount]; 
			if(Ch == Divider)				// Divider °ËÃâ 
			{ 
				goto CATCH_DIV; 
			} 
		} 
		if(nCount > nSrcLen) 
		{ 
			CATCH_DIV: 
			if(nBuf_Count >0) 
			{ 
				if(nBuf_Count < MAX_BUFFER_SIZE -1) 
				{ 
					szBuffer[nBuf_Count] = '\0';	// End String (sz) 
					memcpy(szDest,szBuffer,nBuf_Count); 
					ZeroMemory(m_InnerResult,MAX_BUFFER_SIZE); 
					if(nSrcLen-nCount>0)  
						strncpy(m_InnerResult,szSource + nCount+1,nSrcLen-nCount); 
				} 
				break; 
			} 
			else 
			{ 
				if(nCount>nSrcLen) 
				{ 
					ZeroMemory(szDest,nDestLen); 
					ZeroMemory(m_InnerResult,MAX_BUFFER_SIZE); 
					if(nSrcLen-1>0) strncpy(m_InnerResult,szSource +nCount+2,nSrcLen-1); 
					break; 
				} 
			} 
		} 
		else 
		{ 
			if(nBuf_Count< MAX_BUFFER_SIZE -1) 
			{ 
				szBuffer[nBuf_Count] = Ch; 
				nBuf_Count++; 
			} 
		} 
		nCount++; 
	} 
	if(szBuffer!=NULL) 
	{ 
		delete[] szBuffer; 
		szBuffer = NULL; 
	} 
 
	return m_InnerResult; 
} 
 
CHAR* CNPCTxtAnalysis::ArrestString(CHAR* szSource,CHAR SearchAfter,CHAR AssertBefore,CHAR* AssertStr) 
{ 
	int Src_Len; 
	bool Right_Data,Fin; 
 
	ZeroMemory(AssertStr,strlen(AssertStr)); 
	ZeroMemory(m_InnerResult,MAX_BUFFER_SIZE); 
 
	if(strlen(szSource)==0) 
	{ 
		ZeroMemory(AssertStr,sizeof(AssertStr)); 
		return m_InnerResult; 
	} 
	int n; 
	Src_Len = strlen(szSource); 
	Right_Data = false; 
	if(Src_Len >=2) 
	{ 
		if(szSource[0] == SearchAfter) 
		{ 
			strncpy(szSource,szSource+1,Src_Len-1); 
			szSource[Src_Len-1]=NULL; 
			Src_Len = strlen(szSource); 
			Right_Data = true; 
		} 
		else 
		{ 
			n= FindChr(szSource,SearchAfter); 
			if(n>=0) 
			{ 
				strncpy(szSource,szSource+n,Src_Len - (n)); 
				Src_Len = strlen(szSource); 
				Right_Data = true; 
			} 
		} 
 
		Fin = false; 
 
		if(Right_Data) 
		{ 
			n = FindChr(szSource,AssertBefore); 
			if(n>=0) 
			{ 
				strncpy(AssertStr,szSource,n); 
				strncpy(m_InnerResult,szSource+n,Src_Len - n); 
			} 
			else 
			{ 
				strncat(m_InnerResult,&SearchAfter,1); 
				strcat(m_InnerResult,szSource); 
			} 
		} 
		else 
		{ 
			for(int i = 0; i< Src_Len;i++) 
			{ 
				if(szSource[i] == SearchAfter) 
				{ 
 
					strncpy(m_InnerResult,szSource+i,Src_Len-i+2); 
					break; 
				} 
			} 
		} 
	} 
	return m_InnerResult; 
} 
 
 
CHAR* CNPCTxtAnalysis::UpperCase(CHAR* szStr) 
{ 
	int Len; 
	ZeroMemory(m_InnerResult,MAX_BUFFER_SIZE); 
	Len = strlen(szStr); 
	for(int i = 0;i'a' && szStr[i]<'z') 
		{ 
			m_InnerResult[i] = szStr[i]-32; 
		} 
		else 
		{ 
			m_InnerResult[i] = szStr[i]; 
		} 
	} 
	return m_InnerResult; 
} 
 
CHAR CNPCTxtAnalysis::UpperCase(CHAR chr) 
{ 
	char szResult; 
	szResult=0x00; 
 
	szResult = (chr>'a' && chr<'z') ? chr-32:chr; 
 
	return szResult; 
} 
 
int CNPCTxtAnalysis::FindChr(CHAR* szstr,CHAR ch) 
{ 
	int Count = 0; 
	bool Conditions=true; 
	while(Conditions && Count<((int)strlen(szstr))) 
	{ 
		if(szstr[Count]==ch) 
			Conditions = false; 
		Count++; 
	} 
 
	if(!Conditions) return Count; 
	else return -1; 
} 
 
int CNPCTxtAnalysis::FindChr(CHAR* szStr,CHAR* ch) 
{ 
	int Count = 0; 
	int nLenObject; 
	bool Conditions=true; 
 
	nLenObject = strlen(ch); 
 
	while(Conditions && Count <((int)strlen(szStr))) 
	{ 
		if(szStr[Count]==ch[0]) 
		{ 
			int nChk=0; 
			for(int i = 0 ; (i * pxpTxt,INT nLineMax) 
{ 
	BOOL	DrawCenter = FALSE; 
	CHAR*	szTemp; 
	CHAR*	CmdStr; 
	CHAR*	CmdParamStr; 
	CHAR*	szStr; 
 
	INT	nPosX = 20;; 
	INT nLineCount = 0; 
	COLORREF	cColor = RGB(1,1,1); 
 
	SIZE	tSize; 
 
	if(m_bInited) 
	{ 
 
		// Init Buffers 
		CmdParamStr	=	new CHAR[MAX_BUFFER_SIZE]; 
		CmdStr		=	new CHAR[MAX_BUFFER_SIZE]; 
		szStr		=	new CHAR[MAX_BUFFER_SIZE]; 
 
		ZeroMemory(CmdStr,MAX_BUFFER_SIZE); 
		ZeroMemory(szStr,MAX_BUFFER_SIZE); 
 
		pxpTxt->MoveCurrentToTop(); 
		while(true) 
		{ 
			if(nLineMax<=nLineCount)  
				break; 
			strcpy(szStr,*pxpTxt->GetCurrentData());	//	Line Divide 
 
			if(strlen(szStr)!=0) 
			{ 
 
				while((FindChr(szStr,'<')>0)&&(FindChr(szStr,'>')>0) && (strlen(szStr)!=0)) 
				{ 
					CHAR*	Fdata; 
					Fdata	=	new CHAR[MAX_BUFFER_SIZE]; 
					ZeroMemory(Fdata,MAX_BUFFER_SIZE); 
					// <>Tag ºÐ¸® Text Button »ý¼º 
					if((szStr[0])!='<') 
					{ 
						szTemp =  GetValidStr(szStr,Fdata,'<'); 
						strcpy(szStr,"<"); 
						strcat(szStr,szTemp);				 
					}	// endif 
 
					// <>¾È¿¡ ÀÖ´Â ³»¿ë CmdStr·Î 
					szTemp = ArrestString(szStr,'<','>',CmdStr); 
					strcpy(szStr,szTemp); 
					szTemp = NULL; 
					 
					if(strlen(CmdStr)!=0) 
					{ 
						switch(UpperCase(CmdStr[0])) 
						{ 
							case '0':		// <0> Àϰæ¿ì ±ÛÀÚ»ö BLACK 
							{ 
								cColor = RGB(0,0,0); 
							} 
							break; 
							case '1':		// <1> Àϰæ¿ì ±ÛÀÚ»ö RED 
							{ 
								cColor = RGB(255,0,0); 
							} 
							break; 
							case '2':		// <2> Àϰæ¿ì ±ÛÀÚ»ö GREEN 
							{ 
								cColor = RGB(0,128,0); 
							} 
							break; 
							case '3':		// <3> Àϰæ¿ì ±ÛÀÚ»ö Olive 
							{ 
								cColor = RGB(128,128,0); 
							} 
							break; 
							case '4':		// <4> Àϰæ¿ì ±ÛÀÚ»ö GRAY 
							{ 
								cColor = RGB(128,128,128); 
							} 
							break; 
							case '5':		// <5> Àϰæ¿ì ±ÛÀÚ»ö Maroon 
							{ 
								cColor = RGB(128,0,0); 
							} 
							break; 
							case '6':		// <6> Àϰæ¿ì ±ÛÀÚ»ö Teal 
							{ 
								cColor = RGB(0,128,128); 
							} 
							break; 
							case '7':		// <7> Àϰæ¿ì ±ÛÀÚ»ö Navy 
							{ 
								cColor = RGB(0,0,128); 
							} 
							break; 
							case '8':		// <8> Àϰæ¿ì ±ÛÀÚ»ö Silver 
							{ 
								cColor = RGB(192,192,192); 
							} 
							break; 
							case '9':		// <9> Àϰæ¿ì ±ÛÀÚ»ö Purple 
							{ 
								cColor = RGB(128,0,128); 
							} 
							break; 
							case 'A':		//  Àϰæ¿ì ±ÛÀÚ»ö Lime 
							{ 
								cColor = RGB(0,255,0); 
							} 
							break; 
							case 'B':		//  Àϰæ¿ì ±ÛÀÚ»ö Blue 
							{ 
								cColor = RGB(0,0,255); 
							} 
							break; 
							case 'C':		//  Àϰæ¿ì ±ÛÀÚ»ö White 
							{ 
								cColor = RGB(255,255,255); 
							} 
							break; 
							case 'D':		//  Àϰæ¿ì ±ÛÀÚ»ö Fuchsia 
							{ 
								cColor = RGB(255,0,255); 
							} 
							break; 
							case 'E':		//  Àϰæ¿ì ±ÛÀÚ»ö Aqua 
							{ 
								cColor = RGB(0,255,255); 
							} 
							break; 
							case 'F':		//  Àϰæ¿ì ±ÛÀÚ»ö Yellow 
							{ 
								cColor = RGB(255,255,0); 
							} 
							break; 
							case 'X':		//  Àϰæ¿ì ±ÛÀÚ»ö Default 
							{ 
								cColor = RGB(1,1,1); 
							} 
							break; 
						} // endswitch 
						szTemp = NULL; 
						szTemp = GetValidStr(CmdStr,CmdStr,'/'); 
						ZeroMemory(CmdParamStr,MAX_BUFFER_SIZE); 
						if(szTemp[0]!=NULL) 
							strncpy(CmdParamStr,szTemp,strlen(szTemp)-1); 
						szTemp = NULL; 
 
					}  // endif 
					else 
					{ 
						// Á¾°á <> °¡ ÀÖÀ¸¸é Á¾·á 
					}  // endifelse 
 
					if(strlen(Fdata)!=0)		// '<' Àü¿¡ ÀÖ´Â Text¸¦ ÀÏ¹Ý Text¿¡ Ãß°¡ 
					{	// ÀÏ¹Ý Text Ãß°¡ 
						CMText* pxTmpTxt; 
						pxTmpTxt = new CMText; 
						pxTmpTxt->pText = new CHAR[strlen(Fdata)+1]; 
						// Text ¼³Á¤ 
						pxTmpTxt->bDrawCenter = DrawCenter; 
						pxTmpTxt->fColor =	cColor!=RGB(1,1,1) ? cColor : DEFAULT_TXT_COLOR;		// »öÀº Tag¿¡ ÀÇÇØ °áÁ¤ÇØ ÁÖ¾î¾ßÇÔ. 
						pxTmpTxt->nLine = nLineCount; 
						pxTmpTxt->nPosx = nPosX; 
						strcpy(pxTmpTxt->pText,Fdata); 
						m_pxpTxt->AddNode(pxTmpTxt); 
						tSize = m_pxGWND->GetStrLength(NULL,NULL,"%s",Fdata); 
						nPosX=nPosX+tSize.cx; 
						delete[] Fdata; 
						Fdata = NULL; 
						cColor = RGB(1,1,1); 
					} // endif 
 
					if(strlen(CmdParamStr)!=0)//CmdStr)!=0) 
					{ 
						RECT tRect; 
						tRect.top =0; 
						tRect.left = nPosX; 
 
						tSize = m_pxGWND->GetStrLength(NULL,NULL,"%s",CmdStr); 
						tRect.right = tSize.cx;					 
						tRect.bottom = tSize.cy; 
 
						// Text ¹öư »ý¼º 
						m_pxBtn->AddButton(CmdStr,tRect,nLineCount,CmdParamStr,(cColor!=RGB(1,1,1) ? cColor : DEFAULT_BTN_COLOR),DEFAULT_BTN_CLICK_COLOR); 
 
						nPosX=nPosX+tSize.cx; 
 
					}	// Text Button  // endif 
					if(Fdata!=NULL) 
					{ 
						delete[] Fdata; 
						Fdata = NULL; 
					} 
				} // end while 
				// '>'µÞºÎºÐ ȤÀº '<','>' ¾ø´Â ±â³É TextÀÏ °æ¿ì 
				if(strlen(szStr)!=0) 
				{ 
					do 
					{ 
						// Line À» ³ª´©°í ±× °á°ú¸¦ Text List ¿¡ ³Ö´Â´Ù. 
						CHAR  *szTemp1=NULL,*szTemp2=NULL; 
						szTemp1 = new CHAR[MAX_BUFFER_SIZE]; 
						ZeroMemory(szTemp1,MAX_BUFFER_SIZE); 
 
						// Line Divider 
						szTemp2 =  GetValidStr(szStr,szTemp1,LINE_DIVIDER);	 
						strcpy(szStr,szTemp2); 
						 
						// Text »ý¼º 
						CMText* pxTmpTxt; 
						pxTmpTxt = new CMText; 
						pxTmpTxt->pText = new CHAR[strlen(szTemp1)+1]; 
 
						// Text ¼³Á¤ 
						pxTmpTxt->bDrawCenter = DrawCenter; 
						pxTmpTxt->fColor =	cColor!=RGB(1,1,1) ? cColor : DEFAULT_TXT_COLOR;			// Àӽà Tag¿¡ ÀÇÇÏ¿© »öº¯È¯ 
						pxTmpTxt->nLine = nLineCount; 
						pxTmpTxt->nPosx = nPosX; 
						strcpy(pxTmpTxt->pText,szTemp1); 
						m_pxpTxt->AddNode(pxTmpTxt); 
 
						tSize = m_pxGWND->GetStrLength(NULL,NULL,"%s",szTemp1); 
						nPosX=nPosX+tSize.cx; 
 
						delete[] szTemp1; 
					}while(strlen(szStr)!=0); 
					// Draw Normal Text 
				} // endif 
			}	// endif 
			// Line Feed 
			nLineCount ++; 
			nPosX = 20;		//½ÃÀÛÀº 20 pixel ºÎÅÍ 
			pxpTxt->MoveNextNode(); 
		} // end while 
		delete[] CmdParamStr; 
		delete[] CmdStr; 
		delete[] szStr; 
		m_bReady = TRUE; 
	} // endif 
	else 
	{ 
		m_bReady = FALSE; 
	} // end ifelse 
} 
 
 
void CNPCTxtAnalysis::AnalySisText(CHAR* Msg) 
{ 
	BOOL	DrawCenter = FALSE; 
	CHAR*	szTemp; 
	CHAR*	CmdStr; 
	CHAR*	CmdParamStr; 
	CHAR*	szStr; 
 
	INT	nPosX =0; 
	INT nLineCount = 0; 
	COLORREF	cColor = 0; 
 
	SIZE	tSize; 
 
	if(m_bInited) 
	{ 
 
		// Init Buffers 
		CmdParamStr	=	new CHAR[MAX_BUFFER_SIZE]; 
		CmdStr		=	new CHAR[MAX_BUFFER_SIZE]; 
		szStr		=	new CHAR[MAX_BUFFER_SIZE]; 
 
 
		ZeroMemory(CmdParamStr,MAX_BUFFER_SIZE); 
		ZeroMemory(CmdStr,MAX_BUFFER_SIZE); 
		ZeroMemory(szStr,MAX_BUFFER_SIZE); 
 
 
		while(true) 
		{ 
			if(strlen(Msg)==0) break; 
 
			szTemp =  GetValidStr(Msg,szStr,LINE_DIVIDER);				// Line Divider 
			strcpy(Msg,szTemp); 
 
			if(strlen(szStr)!=0) 
			{ 
 
				while((FindChr(szStr,'<')>0)&&(FindChr(szStr,'>')>0) && (strlen(szStr)!=0)) 
				{ 
					CHAR*	Fdata; 
					Fdata	=	new CHAR[MAX_BUFFER_SIZE]; 
					ZeroMemory(Fdata,MAX_BUFFER_SIZE); 
					// <>Tag ºÐ¸® Text Button »ý¼º 
					if((szStr[0])!='<') 
					{ 
						szTemp =  GetValidStr(szStr,Fdata,'<'); 
						strcpy(szStr,"<"); 
						strcat(szStr,szTemp);				 
					} 
 
					// <>¾È¿¡ ÀÖ´Â ³»¿ë CmdStr·Î 
					szTemp = ArrestString(szStr,'<','>',CmdStr); 
					strcpy(szStr,szTemp); 
					szTemp = NULL; 
					 
					if(strlen(CmdStr)!=0) 
					{ 
						switch(UpperCase(CmdStr[0])) 
						{ 
							case '0':		// <0> Àϰæ¿ì ±ÛÀÚ»ö BLACK 
							{ 
								cColor = RGB(0,0,0); 
								continue; 
							} 
							break; 
							case '1':		// <1> Àϰæ¿ì ±ÛÀÚ»ö RED 
							{ 
								cColor = RGB(255,0,0); 
								continue; 
							} 
							break; 
							case '2':		// <2> Àϰæ¿ì ±ÛÀÚ»ö GREEN 
							{ 
								cColor = RGB(0,128,0); 
								continue; 
							} 
							break; 
							case '3':		// <3> Àϰæ¿ì ±ÛÀÚ»ö Olive 
							{ 
								cColor = RGB(128,128,0); 
								continue; 
							} 
							break; 
							case '4':		// <4> Àϰæ¿ì ±ÛÀÚ»ö GRAY 
							{ 
								cColor = RGB(128,128,128); 
								continue; 
							} 
							break; 
							case '5':		// <5> Àϰæ¿ì ±ÛÀÚ»ö Maroon 
							{ 
								cColor = RGB(128,0,0); 
								continue; 
							} 
							break; 
							case '6':		// <6> Àϰæ¿ì ±ÛÀÚ»ö Teal 
							{ 
								cColor = RGB(0,128,128); 
								continue; 
							} 
							break; 
							case '7':		// <7> Àϰæ¿ì ±ÛÀÚ»ö Navy 
							{ 
								cColor = RGB(0,0,128); 
								continue; 
							} 
							break; 
							case '8':		// <8> Àϰæ¿ì ±ÛÀÚ»ö Silver 
							{ 
								cColor = RGB(192,192,192); 
								continue; 
							} 
							break; 
							case '9':		// <9> Àϰæ¿ì ±ÛÀÚ»ö Purple 
							{ 
								cColor = RGB(128,0,128); 
								continue; 
							} 
							break; 
							case 'A':		//  Àϰæ¿ì ±ÛÀÚ»ö Lime 
							{ 
								cColor = RGB(0,255,0); 
								continue; 
							} 
							break; 
							case 'B':		//  Àϰæ¿ì ±ÛÀÚ»ö Blue 
							{ 
								cColor = RGB(0,0,255); 
								continue; 
							} 
							break; 
							case 'C':		//  Àϰæ¿ì ±ÛÀÚ»ö White 
							{ 
								cColor = RGB(255,255,255); 
								continue; 
							} 
							break; 
							case 'D':		//  Àϰæ¿ì ±ÛÀÚ»ö Fuchsia 
							{ 
								cColor = RGB(255,0,255); 
								continue; 
							} 
							break; 
							case 'E':		//  Àϰæ¿ì ±ÛÀÚ»ö Aqua 
							{ 
								cColor = RGB(0,255,255); 
								continue; 
							} 
							break; 
							case 'F':		//  Àϰæ¿ì ±ÛÀÚ»ö Yellow 
							{ 
								cColor = RGB(255,255,0); 
								continue; 
							} 
							break; 
							case 'X':		//  Àϰæ¿ì ±ÛÀÚ»ö Default 
							{ 
 
								cColor = RGB(1,1,1); 
								continue; 
							} 
							break; 
						} 
 
/*						szTemp = new CHAR[2]; 
						strncpy(szTemp,CmdStr,2); 
						szTemp = UpperCase(szTemp); 
						if(strncmp(szTemp,"/C",2)==0)		//  ÀÏ °æ¿ì °¡¿îµ¥ Âï±â ³¡ 
						{ 
							DrawCenter = FALSE; 
							delete[] szTemp; 
							szTemp = NULL; 
							continue; 
						} 
						delete[] szTemp; 
*/						szTemp = NULL; 
						szTemp = GetValidStr(CmdStr,CmdStr,'/'); 
						strcpy(CmdParamStr,szTemp); 
						szTemp = NULL; 
 
					} 
					else 
					{ 
						// Á¾°á <> °¡ ÀÖÀ¸¸é Á¾·á 
					} 
 
					if(strlen(Fdata)!=0)		// '<' Àü¿¡ ÀÖ´Â Text¸¦ ÀÏ¹Ý Text¿¡ Ãß°¡ 
					{	// ÀÏ¹Ý Text Ãß°¡ 
						CMText* pxTmpTxt; 
						pxTmpTxt = new CMText; 
						pxTmpTxt->pText = new CHAR[strlen(Fdata)+1]; 
						// Text ¼³Á¤ 
						pxTmpTxt->bDrawCenter = DrawCenter; 
						pxTmpTxt->fColor =	cColor!=RGB(1,1,1) ? cColor : DEFAULT_TXT_COLOR;		// »öÀº Tag¿¡ ÀÇÇØ °áÁ¤ÇØ ÁÖ¾î¾ßÇÔ. 
						pxTmpTxt->nLine = nLineCount; 
						pxTmpTxt->nPosx = nPosX; 
						strcpy(pxTmpTxt->pText,Fdata); 
 
						m_pxpTxt->AddNode(pxTmpTxt); 
						tSize = m_pxGWND->GetStrLength(NULL,NULL,"%s",Fdata); 
						nPosX=nPosX+tSize.cx; 
					} 
 
					if(strlen(CmdStr)!=0) 
					{ 
						RECT tRect; 
						tRect.top =0; 
						tRect.left = nPosX; 
 
						tSize = m_pxGWND->GetStrLength(NULL,NULL,"%s",CmdStr); 
						tRect.right = tSize.cx;					 
						tRect.bottom = tSize.cy; 
 
						// Text ¹öư »ý¼º 
						m_pxBtn->AddButton(CmdStr,tRect,nLineCount,CmdParamStr,(cColor!=RGB(1,1,1) ? cColor : DEFAULT_BTN_COLOR),DEFAULT_BTN_CLICK_COLOR); 
 
						nPosX=nPosX+tSize.cx; 
 
					}	// Text Button 
				} 
				// '>'µÞºÎºÐ ȤÀº '<','>' ¾ø´Â ±â³É TextÀÏ °æ¿ì 
				if(strlen(szStr)!=0) 
				{ 
					do 
					{ 
						// Line À» ³ª´©°í ±× °á°ú¸¦ Text List ¿¡ ³Ö´Â´Ù. 
						CHAR  *szTemp1=NULL,*szTemp2=NULL; 
						szTemp1 = new CHAR[MAX_BUFFER_SIZE]; 
						ZeroMemory(szTemp1,MAX_BUFFER_SIZE); 
 
						// Line Divider 
						szTemp2 =  GetValidStr(szStr,szTemp1,LINE_DIVIDER);	 
						strcpy(szStr,szTemp2); 
						 
						// Text »ý¼º 
						CMText* pxTmpTxt; 
						pxTmpTxt = new CMText; 
						pxTmpTxt->pText = new CHAR[strlen(szTemp1)+1]; 
 
						// Text ¼³Á¤ 
						pxTmpTxt->bDrawCenter = DrawCenter; 
						pxTmpTxt->fColor =	cColor!=RGB(1,1,1) ? cColor : DEFAULT_TXT_COLOR;			// Àӽà Tag¿¡ ÀÇÇÏ¿© »öº¯È¯ 
						pxTmpTxt->nLine = nLineCount; 
						pxTmpTxt->nPosx = nPosX; 
						strcpy(pxTmpTxt->pText,szTemp1); 
						m_pxpTxt->AddNode(pxTmpTxt); 
 
						tSize = m_pxGWND->GetStrLength(NULL,NULL,"%s",szTemp1); 
						nPosX=nPosX+tSize.cx; 
 
						delete[] szTemp1; 
 
						nPosX = 20;		// ½ÃÀÛÀº 20 pixel ºÎÅÍ 
						nLineCount ++;	// Line Feed 
					}while(strlen(szStr)!=0); 
					// Draw Normal Text 
				} 
			} 
			// Line Feed 
			nLineCount ++; 
			nPosX = 20;		//½ÃÀÛÀº 20 pixel ºÎÅÍ 
		} 
		delete CmdParamStr; 
		delete CmdStr; 
		delete szStr; 
		m_bReady = TRUE; 
	} 
	else 
	{ 
		m_bReady = FALSE; 
	} 
} 
 
BOOL CNPCTxtAnalysis::IsReadyToDisplay(VOID) 
{ 
	return m_bReady; 
} 
 
BOOL CNPCTxtAnalysis::IsInitialized(VOID) 
{ 
	return m_bInited; 
} 
 
// ¿ë±â 
BOOL CNPCTxtAnalysis::StringDivide(INT nDivideWidth, INT& nDividedLine, CHAR* szSrc,CDLList* m_pxpStr) 
{ 
	CHAR szTmpCheck[MAX_PATH]; 
	CHAR szResult[MAX_PATH]; 
	 
	nDividedLine = 1; 
 
	INT nStartLen	= 0; 
	INT nEndLen		= 0; 
	INT nResultLen	= 0; 
	INT nWordCheck	= 0; 
 
	if ( szSrc[0] != NULL ) 
	{ 
		ZeroMemory(szResult,MAX_PATH); 
 
		for ( INT nCnt = 0; nCnt < (INT)strlen(szSrc); nCnt++) 
		{ 
			ZeroMemory(szTmpCheck, MAX_PATH); 
			nEndLen = nCnt+1; 
 
			// ÇöÀçºÎºÐ±îÁöÀÇ ¹®ÀÚ¿­À» Àд´Ù. 
			memcpy(&szTmpCheck, &szSrc[nStartLen], nEndLen-nStartLen); 
			SIZE sizeLen; 
			sizeLen = m_pxGWND->GetStrLength(NULL,NULL, szTmpCheck); 
 
			// ÇöÀç±îÁö Àоî¿Â ºÎºÐÀÌ Çã¿ë³ÐÀ̸¦ ³Ñ¾î¼¹À»¶§. 
			if ( sizeLen.cx > nDivideWidth ) 
			{ 
				// ÇöÀç 2¹ÙÀÌÆ® ¹®ÀÚ¶ó¸é.  
				if ( szSrc[nEndLen-1] < 0 ) 
				{ 
					// ÇöÀç ¾Õ¿¡¹®ÀÚ°¡ 2¹ÙÀÌÆ® ¹®ÀÚ°¡ ¾Æ´Ï¶ó¸é 
					if ( !(nWordCheck%2) ) 
					{ 
						nStartLen += strlen(szTmpCheck)-1; 
						nCnt--; 
						CHAR* pszNewLine; 
						pszNewLine = new CHAR[nResultLen+1]; 
						memcpy(pszNewLine,szResult,nResultLen); 
						pszNewLine[nResultLen]=NULL; 
						m_pxpStr->AddNode(pszNewLine); 
						nResultLen = 0; 
						nDividedLine++; 
					} 
					else 
					{ 
						nStartLen += strlen(szTmpCheck)-2; 
						nCnt -= 2; 
						CHAR* pszNewLine; 
						pszNewLine = new CHAR[nResultLen]; 
						memcpy(pszNewLine,szResult,nResultLen-1); 
						pszNewLine[nResultLen-1]=NULL; 
						m_pxpStr->AddNode(pszNewLine); 
						nResultLen = 0; 
						nDividedLine++; 
						nWordCheck--; 
					} 
				} 
				// 1¹ÙÀÌÆ® ¹®ÀÚ.  
				// ÇöÀ纸´Ù ÇѹÙÀÌÆ®¾ÕºÎºÐ±îÁö¸¸ °í·ÁÇØÁÖ¸é µÈ´Ù. 
				else 
				{ 
					nStartLen += strlen(szTmpCheck)-1; 
					nCnt--; 
					CHAR* pszNewLine; 
					pszNewLine = new CHAR[nResultLen+1]; 
					memcpy(pszNewLine,szResult,nResultLen); 
					pszNewLine[nResultLen]=NULL; 
					m_pxpStr->AddNode(pszNewLine); 
					nResultLen=0; 
					nDividedLine++; 
				} 
			} 
			else if(szSrc[nEndLen-1]=='\n')	// °­Á¦°³Çà     \nÀ¸·ÎÇÏ¸é  Error ???? 
			{ 
				nStartLen += strlen(szTmpCheck)-1; 
				CHAR* pszNewLine; 
				pszNewLine = new CHAR[nResultLen+1]; 
				memcpy(pszNewLine,szResult,nResultLen); 
				pszNewLine[nResultLen]=NULL; 
				m_pxpStr->AddNode(pszNewLine); 
				nResultLen=0; 
				nDividedLine++; 
			} 
			else 
			{ 
				if ( szSrc[nEndLen-1] < 0 ) 
					nWordCheck++; 
 
				szResult[nResultLen] = szSrc[nEndLen-1]; 
				nResultLen++; 
			} 
		} 
		if(nResultLen!=0) 
		{ 
			CHAR* pszNewLine; 
			pszNewLine = new CHAR[nResultLen+1]; 
			memcpy(pszNewLine,szResult,nResultLen); 
			pszNewLine[nResultLen]=NULL; 
			m_pxpStr->AddNode(pszNewLine); 
			nDividedLine++; 
			nResultLen=0; 
		} 
		return TRUE; 
	} 
	return FALSE; 
}