bool CLuaEngine::Init(int stacksize/* = 51200 */) { if( m_pLuaState ) return true; m_pLuaState = lua_open(); //创建一个Lua状态机的实例 if( !m_pLuaState ) { DEBUG_STROUT("[CLuaEngine] lua_open error..."); return false; } #ifdef USE_STANDARAD_LUA_LIBS luaL_openlibs(m_pLuaState); //加载Lua的基本库 #else OpenLuaLibs(m_pLuaState); #endif if( !lua_checkstack(m_pLuaState, stacksize) ) //增加Lua的堆栈大小,防止因为堆栈过小而死机 { DEBUG_STROUT("[CLuaEngine] check lua stack size error(stacksize=%d, top=%d, base=%d)", stacksize, m_pLuaState->top, m_pLuaState->base); return false; } //#ifdef _DEBUG // lua_sethook( m_pLuaState, Lua_Trace, LUA_MASKLINE , 0); //#endif lua_register(m_pLuaState, "print", Lua_print); //注册常用函数 return true; }
bool AI::initSpawnEnemies(string scriptName) { spawnScript = lua_open(); OpenLuaLibs(spawnScript); if(luaL_dofile(spawnScript, scriptName.c_str())) //spawning return false; lua_getglobal(spawnScript,"init"); convertNodesToInt(); sendArray(nodesInt, mapSize ,spawnScript); lua_pushnumber(spawnScript,enemiesPerMin); lua_pushnumber(spawnScript,difficulty); lua_pcall(spawnScript, 3, 1, 0); int a = (int)lua_tonumber(spawnScript, -1); lua_pop(spawnScript, 1); cout << "output: " << a << endl; return true; }
bool AI::initFindTarget(string scriptName) { targetScript = lua_open(); OpenLuaLibs(targetScript); if(luaL_dofile(targetScript, scriptName.c_str())) return false; lua_getglobal(targetScript, "init"); lua_pushnumber(targetScript, mapSize); lua_pcall(targetScript, 1, 1, 0); int a = (int)lua_tonumber(targetScript, -1); lua_pop(targetScript, 1); return true; }
bool AI::initFindPath(string scriptName) { pathScript = lua_open(); OpenLuaLibs(pathScript); if(luaL_dofile(pathScript, scriptName.c_str()))//pathfinding return false; lua_getglobal(pathScript, "init"); convertNodesToInt(); sendArray(nodesInt, mapSize, pathScript); lua_pushnumber(pathScript, mapSize); lua_pcall(pathScript, 2, 0, 0); return true; }