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; }