| @@ -37,6 +37,38 @@ class WorldData | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int LuaDoFile(lua_State *L) | |||||
| { | |||||
| if (lua_isnoneornil(L, 1)) | |||||
| return LUA_ERRFILE; | |||||
| char const *filename = lua_tostring(L, 1); | |||||
| int status = LUA_ERRFILE; | |||||
| Array<String> pathlist = System::GetPathList(filename); | |||||
| File f; | |||||
| for (int i = 0; i < pathlist.Count(); ++i) | |||||
| { | |||||
| f.Open(pathlist[i], FileAccess::Read); | |||||
| if (f.IsValid()) | |||||
| { | |||||
| String s = f.ReadString(); | |||||
| f.Close(); | |||||
| Log::Debug("loading Lua file %s\n", pathlist[i].C()); | |||||
| status = luaL_dostring(L, s.C()); | |||||
| break; | |||||
| } | |||||
| } | |||||
| if (status == LUA_ERRFILE) | |||||
| Log::Error("could not find Lua file %s\n", filename); | |||||
| lua_pop(L, 1); | |||||
| return status; | |||||
| } | |||||
| lua_State *m_lua_state; | lua_State *m_lua_state; | ||||
| }; | }; | ||||
| @@ -49,9 +81,14 @@ World g_world; | |||||
| World::World() | World::World() | ||||
| { | { | ||||
| /* Initialise the Lua engine */ | |||||
| g_world_data.m_lua_state = luaL_newstate(); | g_world_data.m_lua_state = luaL_newstate(); | ||||
| lua_atpanic(g_world_data.m_lua_state, WorldData::LuaPanic); | lua_atpanic(g_world_data.m_lua_state, WorldData::LuaPanic); | ||||
| luaL_openlibs(g_world_data.m_lua_state); | luaL_openlibs(g_world_data.m_lua_state); | ||||
| /* Override dofile() */ | |||||
| lua_pushcfunction(g_world_data.m_lua_state, WorldData::LuaDoFile); | |||||
| lua_setglobal(g_world_data.m_lua_state, "dofile"); | |||||
| } | } | ||||
| World::~World() | World::~World() | ||||
| @@ -61,24 +98,9 @@ World::~World() | |||||
| bool World::ExecLua(String const &lua) | bool World::ExecLua(String const &lua) | ||||
| { | { | ||||
| Array<String> pathlist = System::GetPathList(lua); | |||||
| File f; | |||||
| for (int i = 0; i < pathlist.Count(); ++i) | |||||
| { | |||||
| f.Open(pathlist[i], FileAccess::Read); | |||||
| if (f.IsValid()) | |||||
| { | |||||
| String s = f.ReadString(); | |||||
| f.Close(); | |||||
| luaL_dostring(g_world_data.m_lua_state, s.C()); | |||||
| Log::Debug("loaded Lua file %s\n", pathlist[i].C()); | |||||
| return true; | |||||
| } | |||||
| } | |||||
| Log::Error("could not find Lua file %s\n", lua.C()); | |||||
| return false; | |||||
| lua_pushstring(g_world_data.m_lua_state, lua.C()); | |||||
| int status = WorldData::LuaDoFile(g_world_data.m_lua_state); | |||||
| return status == 0; | |||||
| } | } | ||||
| double World::GetLuaNumber(String const &var) | double World::GetLuaNumber(String const &var) | ||||