www.pudn.com > GameEngine_src.rar > CES_CmdPool.cpp


// CES_CmdPool.cpp: implementation of the CES_CmdPool class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "CES_CmdPool.h" 
#include "CES_Executor.h" 
#include "normal.h" 
#include "BaseUtil.h" 
#include  
#include  
 
 
extern CES_Executor		theES_Executor; 
 
	 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
CES_CmdPool::CES_CmdPool() 
{ 
	m_szBuf = NULL; 
} 
 
CES_CmdPool::~CES_CmdPool() 
{ 
	Free(); 
} 
 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_CmdPool::SetObj( void *pObj ) 
{ 
	theES_Executor.SetCurObj( pObj ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_CmdPool::Free() 
{ 
	SafeDeleteArray( m_szBuf ); 
} 
 
////////////////////////////////////////////////////////////////////// 
//从文件中载入脚本,成功返回载入后fp指针的偏移,失败返回0 
////////////////////////////////////////////////////////////////////// 
int CES_CmdPool::LoadESFromFile( FILE *fp, int offset ) 
{ 
	fseek( fp, offset, SEEK_SET ); 
 
	//read file head 
	ES_FILE_INFO efi; 
	fread( &efi, sizeof(efi), 1, fp ); 
 
	if ( efi.esFileType != ES_FILE ) 
	{ 
		debug_assert(false); 
		return 0; 
	} 
 
	m_CmdArray.Clear(); 
	SafeDeleteArray( m_szBuf ); 
 
	if ( efi.esSzBufferSize > 0 ) 
	{ 
		m_szBuf = new char[efi.esSzBufferSize]; 
		if ( m_szBuf == NULL ) 
		{ 
			debug_assert(false); 
			return 0; 
		} 
 
		memset( m_szBuf, 0, efi.esSzBufferSize ); 
		//m_BufSize = efi.esSzBufferSize; 
		fread( m_szBuf, efi.esSzBufferSize, 1, fp ); 
	} 
 
 
	for ( int i = 0; i < efi.esNumOfCmd; ++i ) 
	{ 
		ES_CMD cmd; 
		fread( &cmd, sizeof(ES_CMD), 1, fp ); 
		m_CmdArray.Add( cmd ); 
	} 
 
	LoadCmdHelp(); 
 
	return ( offset + sizeof(efi) + efi.esSzBufferSize + efi.esNumOfCmd * sizeof(ES_CMD) ); 
} 
 
 
////////////////////////////////////////////////////////////////////// 
//从文件中载入脚本,成功返回载入后指针的偏移,失败返回0 
////////////////////////////////////////////////////////////////////// 
int CES_CmdPool::LoadESFromMemory( char *pData, int offset ) 
{ 
	debug_assert( pData != NULL ); 
	char *buf = pData; 
	buf += offset; 
 
	ES_FILE_INFO efi; 
	efi = READ_MEMORY( buf, ES_FILE_INFO ); 
	buf += sizeof(ES_FILE_INFO); 
 
	if ( efi.esFileType != ES_FILE ) 
	{ 
		debug_assert(false); 
		return 0; 
	} 
 
	m_CmdArray.Clear(); 
	SafeDeleteArray( m_szBuf ); 
 
	if ( efi.esSzBufferSize > 0 ) 
	{ 
		m_szBuf = new char[efi.esSzBufferSize]; 
		if ( m_szBuf == NULL ) 
		{ 
			debug_assert(false); 
			return 0; 
		} 
 
		memset( m_szBuf, 0, efi.esSzBufferSize ); 
		//m_BufSize = efi.esSzBufferSize; 
		memcpy( m_szBuf, buf, efi.esSzBufferSize ); 
		buf += efi.esSzBufferSize; 
	} 
 
	for ( int i = 0; i < efi.esNumOfCmd; ++i ) 
	{ 
		ES_CMD cmd = READ_MEMORY( buf, ES_CMD ); 
		buf += sizeof(ES_CMD); 
		m_CmdArray.Add( cmd ); 
	} 
 
	LoadCmdHelp(); 
 
	return buf - pData; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_CmdPool::LoadCmdHelp() 
{ 
	/*for ( int i = 0; i < m_CmdArray.GetLength(); ++i ) 
	{ 
		ES_CMD &cmd = m_CmdArray[i]; 
		if ( cmd.param_1 == CHAR_PTR ) 
		{ 
			cmd.param_1 = (int)m_szBuf; 
		} 
		else if ( cmd.param_1 == OBJ_PTR ) 
		{ 
			cmd.param_1 = (int)m_ObjPtr; 
		} 
	}*/ 
} 
 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_CmdPool::RunCmd( int offset, int num ) 
{ 
	theES_Executor.SetSzBuf( m_szBuf ); 
	theES_Executor.RunCommand( m_CmdArray.GetPointer(), offset, num ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_CmdPool::RunCmd( int offset ) 
{ 
	theES_Executor.SetSzBuf( m_szBuf ); 
	theES_Executor.RunCommand( m_CmdArray.GetPointer(), offset, m_CmdArray.GetLength()-offset ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_CmdPool::RunCmdAll() 
{ 
	theES_Executor.SetSzBuf( m_szBuf ); 
	theES_Executor.RunCommand( m_CmdArray.GetPointer(), 0, m_CmdArray.GetLength() ); 
} 
 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_CmdPool::AddCmd( const ES_CMD &cmd ) 
{ 
	m_CmdArray.Add( cmd ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_CmdPool::AddCmd( ES_CMD *CmdBuf, int CmdNum ) 
{ 
	for ( int i = 0; i < CmdNum; ++i ) 
		AddCmd( CmdBuf[i] ); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
void CES_CmdPool::LoadCmdFromFile( FILE *fp, int cmdNum ) 
{ 
	for ( int i = 0; i < cmdNum; ++i ) 
	{ 
		ES_CMD cmd; 
		fread( &cmd, sizeof(cmd), 1, fp ); 
		m_CmdArray.Add( cmd ); 
	} 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
bool CES_CmdPool::LoadCmdBufFromFile( FILE *fp, int offset, ES_CMD *&pCmdBuf, int &CmdNum ) 
{ 
	fseek( fp, offset, SEEK_SET ); 
 
	ES_FILE_INFO efi; 
	fread( &efi, sizeof(efi), 1, fp ); 
 
	if ( efi.esFileType != ES_FILE ) 
	{ 
		debug_assert(false); 
		return false; 
	} 
 
	debug_assert( efi.esSzBufferSize == 0 );				//没有字符缓冲 
	debug_assert( efi.esNumOfCmd != 0 ); 
 
	pCmdBuf = new ES_CMD[efi.esNumOfCmd]; 
	if ( pCmdBuf == NULL ) 
	{ 
		debug_assert(false); 
		return false; 
	} 
 
	fread( pCmdBuf, efi.esNumOfCmd*sizeof(ES_CMD), 1, fp ); 
	CmdNum = efi.esNumOfCmd; 
	return true; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
bool CES_CmdPool::LoadCmdBufFromMemory( unsigned char *pData, int offset, ES_CMD *&pCmdBuf, int &CmdNum ) 
{ 
	pData += offset; 
	ES_FILE_INFO efi = READ_MEMORY( pData, ES_FILE_INFO ); 
	pData += sizeof(efi); 
 
	if ( efi.esFileType != ES_FILE ) 
	{ 
		debug_assert(false); 
		return false; 
	} 
 
	debug_assert( efi.esSzBufferSize == 0 && efi.esNumOfCmd != 0 );				//没有字符缓冲 
	pCmdBuf = new ES_CMD[efi.esNumOfCmd]; 
	if ( pCmdBuf == NULL ) 
	{ 
		debug_assert(false); 
		return false; 
	} 
 
	memcpy( pCmdBuf, pData, efi.esNumOfCmd * sizeof(ES_CMD) ); 
	CmdNum = efi.esNumOfCmd; 
	return true; 
}