#include "stdafx.h" #include ".\luadelegate.h" #include #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif // µð¹ö±× ºôµå ½Ã¿¡¸¸ µð¹ö±× ÄÜ¼Ö Ã¢À» ¶ç¿ìµµ·Ï ÇÑ´Ù. #if defined (_DEBUG) | (DEBUG) #include "LuaDebugger.h" #endif CLuaDelegate& LuaDelegate_Singleton( void ) { static CLuaDelegate LuaDelegate; return LuaDelegate; } CLuaDelegate::CLuaDelegate(void) : m_pErrorHandler( NULL ), m_pLuaState( NULL ) { // Lua State ¸¦ ¿¬´Ù. m_pLuaState = lua_open(); luaL_openlibs( m_pLuaState ); //luaopen_base( m_pLuaState ); //luaopen_io( m_pLuaState ); //luaopen_string( m_pLuaState ); //luaopen_math( m_pLuaState ); //luaopen_debug( m_pLuaState ); //luaopen_table( m_pLuaState ); } CLuaDelegate::~CLuaDelegate(void) { // µð¹ö±× ÄÜ¼Ö Á¾·á #if defined (_DEBUG) | (DEBUG) CLuaDebugger::StopConsole(); #endif // Lua State ¸¦ ´Ý´Â´Ù. if( m_pLuaState ) lua_close( m_pLuaState ); } #if defined (_DEBUG) | (DEBUG) void DefaultErrorHandler(const char *pError) { CLuaDebugger::Write(pError); OutputDebugStringA( pError ); BringWindowToTop( CLuaDebugger::GetConsoleHWND() ); } void CLuaDelegate::StartDebugConsole( HINSTANCE hInst ) { CLuaDebugger::StartConsole( hInst, m_pLuaState ); m_pErrorHandler = DefaultErrorHandler; } #endif void CLuaDelegate::_ConvertProperFileExt( IN OUT string& strFileName ) { FILE* pf = NULL; fopen_s( &pf, strFileName.c_str(), "r" ); // ÆÄÀÏÀ» ã¾ÒÀ» °æ¿ì. if( NULL != pf ) { fclose( pf ); return; } else // ÅØ½ºÆ® ÆÄÀÏ·Î ¾È ¿­·Á¼­ ¸ø ã¾ÒÀ» °æ¿ì. { strFileName = strFileName.substr( 0, strFileName.find_first_of( '.', 0 ) ); strFileName.append( ".lub" ); fopen_s( &pf, strFileName.c_str(), "rb" ); if( NULL != pf ) { fclose( pf ); return; } } // °á±¹ ÆÄÀÏ ¸ø ã¾ÒÀ½. ¿¡¶ó°¡ ¶ã °ÍÀÓ return; } bool CLuaDelegate::RunScript( const char* pFileName ) { bool bResult = true; string strFileName( pFileName ); _ConvertProperFileExt( strFileName ); if( 0 != luaL_loadfile( m_pLuaState, strFileName.c_str() ) ) { if( m_pErrorHandler ) { char buf[ 256 ]; sprintf_s( buf, "Lua Error - Script Load\nScript Name:%s\nError Message:%s\n", strFileName.c_str(), luaL_checkstring( m_pLuaState, -1 ) ); m_pErrorHandler( buf ); } bResult = false; } if( 0 != lua_pcall( m_pLuaState, 0, LUA_MULTRET, 0 ) ) { if( m_pErrorHandler ) { char buf[ 256 ]; sprintf_s( buf, "Lua Error - Script Run\nScript Name:%s\nError Message:%s\n", strFileName.c_str(), luaL_checkstring( m_pLuaState, -1 ) ); m_pErrorHandler( buf ); } bResult = false; } return bResult; } bool CLuaDelegate::RunString( const char* pCommand ) { bool bResult = true; if( 0 != luaL_loadbuffer( m_pLuaState, pCommand, strlen(pCommand), NULL ) ) { if( m_pErrorHandler ) { char buf[ 256 ]; sprintf_s( buf, "Lua Error - String Load\nString:%s\nError Message:%s\n", pCommand, luaL_checkstring( m_pLuaState, -1 ) ); m_pErrorHandler( buf ); } bResult = false; } if( 0 != lua_pcall( m_pLuaState, 0, LUA_MULTRET, 0 ) ) { if( m_pErrorHandler ) { char buf[ 256 ]; sprintf_s( buf, "Lua Error - Script Run\nScript Name:%s\nError Message:%s\n", pCommand, luaL_checkstring( m_pLuaState, -1 ) ); m_pErrorHandler( buf ); } bResult = false; } return bResult; } const char* CLuaDelegate::GetErrorString( void ) { return luaL_checkstring( m_pLuaState, -1 ); } bool CLuaDelegate::AddFunction( const char* pFunctionName, LuaFunctionType pFunc ) { lua_register( m_pLuaState, pFunctionName, pFunc ); return true; } const char* CLuaDelegate::GetStringArgument( int iNum, const char* pDefault ) { return luaL_optstring( m_pLuaState, iNum, pDefault ); } double CLuaDelegate::GetNumberArgument( int iNum, double dDefault ) { return luaL_optnumber( m_pLuaState, iNum, dDefault ); } void CLuaDelegate::PushString( const char* pString ) { lua_pushstring( m_pLuaState, pString ); } void CLuaDelegate::PushNumber( double dValue ) { lua_pushnumber( m_pLuaState, dValue ); } void CLuaDelegate::SetErrorHandler( void(*pErrorHandler)(const char* pError) ) { m_pErrorHandler = pErrorHandler; } lua_State* CLuaDelegate::GetLuaState( void ) { return m_pLuaState; } double CLuaDelegate::GetNumber( const char* pVarName ) { lua_pushstring( m_pLuaState, pVarName ); lua_gettable( m_pLuaState, LUA_GLOBALSINDEX ); double dResult = lua_tonumber( m_pLuaState, -1 ); lua_pop( m_pLuaState, -1 ); return dResult; } const char* CLuaDelegate::GetString( const char* pVarName ) { lua_pushstring( m_pLuaState, pVarName ); lua_gettable( m_pLuaState, LUA_GLOBALSINDEX ); const char* pResult =lua_tostring( m_pLuaState, -1 ); lua_pop( m_pLuaState, -1 ); return pResult; } void CLuaDelegate::SetNumber( const char* pVarName, double dNumber ) { lua_pushnumber( m_pLuaState, dNumber ); lua_setglobal( m_pLuaState, pVarName ); lua_pop( m_pLuaState, -1 ); } void CLuaDelegate::SetString( const char* pVarName, const char* pString ) { lua_pushstring( m_pLuaState, pString ); lua_setglobal( m_pLuaState, pVarName ); lua_pop( m_pLuaState, -1 ); } int CLuaDelegate::GetTable( const char* pTableName ) { lua_pushstring( m_pLuaState, pTableName ); lua_gettable( m_pLuaState, LUA_GLOBALSINDEX ); int iTableIndex = lua_gettop( m_pLuaState ); lua_pushnil( m_pLuaState ); return iTableIndex; } void CLuaDelegate::AddToTable( int iTableIndex, const char* pStrKey, const char* pStrValue ) { lua_pushstring( m_pLuaState, pStrKey ); lua_pushstring( m_pLuaState, pStrValue ); lua_settable( m_pLuaState, iTableIndex ); } void CLuaDelegate::AddToTable( int iTableIndex, const char* pStrKey, lua_Number NumericValue ) { lua_pushstring( m_pLuaState, pStrKey ); lua_pushnumber( m_pLuaState, NumericValue ); lua_settable( m_pLuaState, iTableIndex ); } void CLuaDelegate::GetField( const char* pStrKey, string& strValue ) { lua_pushstring( m_pLuaState, pStrKey ); lua_gettable( m_pLuaState, -2 ); if( lua_isstring( m_pLuaState, -1 ) ) { const char* pStrValue = lua_tostring( m_pLuaState, -1 ); strValue.assign( pStrValue ); } lua_pop( m_pLuaState, 1 ); } lua_Number CLuaDelegate::GetField( const char* pStrKey ) { lua_Number result = 0; lua_pushstring( m_pLuaState, pStrKey ); lua_gettable( m_pLuaState, -2 ); if( lua_isnumber( m_pLuaState, -1 ) ) { result = lua_tonumber( m_pLuaState, -1 ); } lua_pop( m_pLuaState, 1 ); return result; }