void SpaceStationType::Init() { assert(s_lua == 0); if (s_lua != 0) return; s_lua = luaL_newstate(); lua_State *L = s_lua; LUA_DEBUG_START(L); pi_lua_open_standard_base(L); LuaVector::Register(L); LUA_DEBUG_CHECK(L, 0); lua_register(L, "define_orbital_station", define_orbital_station); lua_register(L, "define_surface_station", define_surface_station); namespace fs = FileSystem; for (fs::FileEnumerator files(fs::gameDataFiles, "stations", fs::FileEnumerator::Recurse); !files.Finished(); files.Next()) { const fs::FileInfo &info = files.Current(); if (ends_with_ci(info.GetPath(), ".lua")) { const std::string name = info.GetName(); s_currentStationFile = name.substr(0, name.size()-4); pi_lua_dofile(L, info.GetPath()); s_currentStationFile.clear(); } } LUA_DEBUG_END(L, 0); }
// XXX compatibility int pi_load_lua(lua_State *l) { const std::string path = luaL_checkstring(l, 1); FileSystem::FileInfo info = FileSystem::gameDataFiles.Lookup(path); lua_getglobal(l, "CurrentDirectory"); std::string currentDir = luaL_optstring(l, -1, ""); lua_pop(l, 1); if (info.IsDir()) { pi_lua_dofile_recursive(l, path); } else if (info.IsFile() && (path.size() > 4) && (path.substr(path.size() - 4) == ".lua")) { pi_lua_dofile(l, path); } else if (info.IsFile()) { return luaL_error(l, "load_lua('%s') called on a file without a .lua extension", path.c_str()); } else if (!info.Exists()) { return luaL_error(l, "load_lua('%s') called on a path that doesn't exist", path.c_str()); } else { return luaL_error(l, "load_lua('%s') called on a path that doesn't refer to a valid file", path.c_str()); } if (currentDir.empty()) lua_pushnil(l); else lua_pushlstring(l, currentDir.c_str(), currentDir.size()); lua_setglobal(l, "CurrentDirectory"); return 0; }
void pi_lua_dofile_recursive(lua_State *l, const std::string &basepath) { LUA_DEBUG_START(l); for (FileSystem::FileEnumerator files(FileSystem::gameDataFiles, basepath, FileSystem::FileEnumerator::IncludeDirs); !files.Finished(); files.Next()) { const FileSystem::FileInfo &info = files.Current(); const std::string &fpath = info.GetPath(); if (info.IsDir()) { pi_lua_dofile_recursive(l, fpath); } else { assert(info.IsFile()); if ((fpath.size() > 4) && (fpath.substr(fpath.size() - 4) == ".lua")) { // XXX kill CurrentDirectory lua_pushstring(l, basepath.empty() ? "." : basepath.c_str()); lua_setglobal(l, "CurrentDirectory"); RefCountedPtr<FileSystem::FileData> code = info.Read(); pi_lua_dofile(l, *code); } } LUA_DEBUG_CHECK(l, 0); } LUA_DEBUG_END(l, 0); }
static void LuaInit() { LuaObject<PropertiedObject>::RegisterClass(); LuaObject<Body>::RegisterClass(); LuaObject<Ship>::RegisterClass(); LuaObject<SpaceStation>::RegisterClass(); LuaObject<Planet>::RegisterClass(); LuaObject<Star>::RegisterClass(); LuaObject<Player>::RegisterClass(); LuaObject<Missile>::RegisterClass(); LuaObject<CargoBody>::RegisterClass(); LuaObject<ModelBody>::RegisterClass(); LuaObject<StarSystem>::RegisterClass(); LuaObject<SystemPath>::RegisterClass(); LuaObject<SystemBody>::RegisterClass(); LuaObject<Random>::RegisterClass(); LuaObject<Faction>::RegisterClass(); Pi::luaSerializer = new LuaSerializer(); Pi::luaTimer = new LuaTimer(); LuaObject<LuaSerializer>::RegisterClass(); LuaObject<LuaTimer>::RegisterClass(); LuaConstants::Register(Lua::manager->GetLuaState()); LuaLang::Register(); LuaEngine::Register(); LuaFileSystem::Register(); LuaGame::Register(); LuaComms::Register(); LuaFormat::Register(); LuaSpace::Register(); LuaShipDef::Register(); LuaMusic::Register(); LuaDev::Register(); LuaConsole::Register(); // XXX sigh UI::Lua::Init(); GameUI::Lua::Init(); SceneGraph::Lua::Init(); // XXX load everything. for now, just modules lua_State *l = Lua::manager->GetLuaState(); pi_lua_dofile(l, "libs/autoload.lua"); pi_lua_dofile_recursive(l, "ui"); pi_lua_dofile_recursive(l, "modules"); Pi::luaNameGen = new LuaNameGen(Lua::manager); }
void CustomSystem::Init() { lua_State *L = csLua = lua_open(); luaL_openlibs(L); OOLUA::setup_user_lua_state(L); PiLuaClasses::RegisterClasses(L); LuaConstants::Register(L); OOLUA::register_class<CustomSystem>(L); OOLUA::register_class<CustomSBody>(L); lua_register(L, "load_lua", pi_load_lua); pi_lua_dofile(L, "pisystems.lua"); lua_close(L); }
void Game::InitLua() { LuaObject<PropertiedObject>::RegisterClass(); LuaConstants::Register(Lua::manager->GetLuaState()); LuaLang::Register(); p3::LuaEngine::Register(); p3::LuaGame::Register(); LuaFileSystem::Register(); LuaConsole::Register(); UI::Lua::Init(); lua_State* l = Lua::manager->GetLuaState(); pi_lua_dofile(l, "libs/autoload.lua"); pi_lua_dofile_recursive(l, "ui"); pi_lua_dofile_recursive(l, "modules"); }
void pi_lua_dofile(lua_State *l, const std::string &path) { assert(l); LUA_DEBUG_START(l); RefCountedPtr<FileSystem::FileData> code = FileSystem::gameDataFiles.ReadFile(path); if (!code) { fprintf(stderr, "could not read Lua file '%s'\n", path.c_str()); } // XXX kill CurrentDirectory std::string dir = code->GetInfo().GetDir(); if (dir.empty()) { dir = "."; } lua_pushstring(l, dir.c_str()); lua_setglobal(l, "CurrentDirectory"); pi_lua_dofile(l, *code); // XXX kill CurrentDirectory lua_pushnil(l); lua_setglobal(l, "CurrentDirectory"); LUA_DEBUG_END(l, 0); }
void ShipType::Init() { static bool isInitted = false; if (isInitted) return; isInitted = true; // load all ship definitions namespace fs = FileSystem; for (fs::FileEnumerator files(fs::gameDataFiles, "ships", fs::FileEnumerator::Recurse); !files.Finished(); files.Next()) { const fs::FileInfo &info = files.Current(); if (ends_with_ci(info.GetPath(), ".json")) { const std::string id(info.GetName().substr(0, info.GetName().size()-5)); ShipType st = ShipType(id, info.GetPath()); types.insert(std::make_pair(st.id, st)); // assign the names to the various lists switch( st.tag ) { case TAG_SHIP: player_ships.push_back(id); break; case TAG_STATIC_SHIP: static_ships.push_back(id); break; case TAG_MISSILE: missile_ships.push_back(id); break; break; case TAG_NONE: default: break; } } } #if ALLOW_LUA_SHIP_DEF lua_State *l = luaL_newstate(); LUA_DEBUG_START(l); luaL_requiref(l, "_G", &luaopen_base, 1); luaL_requiref(l, LUA_DBLIBNAME, &luaopen_debug, 1); luaL_requiref(l, LUA_MATHLIBNAME, &luaopen_math, 1); lua_pop(l, 3); LuaConstants::Register(l); LuaVector::Register(l); LUA_DEBUG_CHECK(l, 0); // provide shortcut vector constructor: v = vector.new lua_getglobal(l, LuaVector::LibName); lua_getfield(l, -1, "new"); assert(lua_iscfunction(l, -1)); lua_setglobal(l, "v"); lua_pop(l, 1); // pop the vector library table LUA_DEBUG_CHECK(l, 0); // register ship definition functions lua_register(l, "define_ship", define_ship); lua_register(l, "define_static_ship", define_static_ship); lua_register(l, "define_missile", define_missile); LUA_DEBUG_CHECK(l, 0); // load all ship definitions namespace fs = FileSystem; for (fs::FileEnumerator files(fs::gameDataFiles, "ships", fs::FileEnumerator::Recurse); !files.Finished(); files.Next()) { const fs::FileInfo &info = files.Current(); if (ends_with_ci(info.GetPath(), ".lua")) { const std::string name = info.GetName(); s_currentShipFile = name.substr(0, name.size() - 4); if (ShipType::types.find(s_currentShipFile) == ShipType::types.end()) { pi_lua_dofile(l, info.GetPath()); s_currentShipFile.clear(); } } } LUA_DEBUG_END(l, 0); lua_close(l); #endif //remove unbuyable ships from player ship list ShipType::player_ships.erase( std::remove_if(ShipType::player_ships.begin(), ShipType::player_ships.end(), ShipIsUnbuyable), ShipType::player_ships.end()); if (ShipType::player_ships.empty()) Error("No playable ships have been defined! The game cannot run."); }
void ShipType::Init() { static bool isInitted = false; if (isInitted) return; isInitted = true; lua_State *l = luaL_newstate(); LUA_DEBUG_START(l); luaL_requiref(l, "_G", &luaopen_base, 1); luaL_requiref(l, LUA_DBLIBNAME, &luaopen_debug, 1); luaL_requiref(l, LUA_MATHLIBNAME, &luaopen_math, 1); lua_pop(l, 3); LuaConstants::Register(l); LuaVector::Register(l); LUA_DEBUG_CHECK(l, 0); // provide shortcut vector constructor: v = vector.new lua_getglobal(l, LuaVector::LibName); lua_getfield(l, -1, "new"); assert(lua_iscfunction(l, -1)); lua_setglobal(l, "v"); lua_pop(l, 1); // pop the vector library table LUA_DEBUG_CHECK(l, 0); // register ship definition functions lua_register(l, "define_ship", define_ship); lua_register(l, "define_static_ship", define_static_ship); lua_register(l, "define_missile", define_missile); LUA_DEBUG_CHECK(l, 0); // load all ship definitions namespace fs = FileSystem; for (fs::FileEnumerator files(fs::gameDataFiles, "ships", fs::FileEnumerator::Recurse); !files.Finished(); files.Next()) { const fs::FileInfo &info = files.Current(); if (ends_with_ci(info.GetPath(), ".lua")) { const std::string name = info.GetName(); s_currentShipFile = name.substr(0, name.size()-4); pi_lua_dofile(l, info.GetPath()); s_currentShipFile.clear(); } } LUA_DEBUG_END(l, 0); lua_close(l); //remove unbuyable ships from player ship list ShipType::player_ships.erase( std::remove_if(ShipType::player_ships.begin(), ShipType::player_ships.end(), ShipIsUnbuyable), ShipType::player_ships.end()); if (ShipType::player_ships.empty()) Error("No playable ships have been defined! The game cannot run."); //collect ships that can fit atmospheric shields for (std::vector<ShipType::Id>::const_iterator it = ShipType::player_ships.begin(); it != ShipType::player_ships.end(); ++it) { const ShipType &ship = ShipType::types[*it]; if (ship.equipSlotCapacity[Equip::SLOT_ATMOSHIELD] != 0) ShipType::playable_atmospheric_ships.push_back(*it); } if (ShipType::playable_atmospheric_ships.empty()) Error("No ships can fit atmospheric shields! The game cannot run."); }