void CustomSystem::Init() { lua_State *L = luaL_newstate(); LUA_DEBUG_START(L); pi_lua_open_standard_base(L); LuaVector::Register(L); LuaFixed::Register(L); LuaConstants::Register(L); // create a shortcut f = fixed.new lua_getglobal(L, LuaFixed::LibName); lua_getfield(L, -1, "new"); assert(lua_iscfunction(L, -1)); lua_setglobal(L, "f"); lua_pop(L, 1); // pop the fixed table // 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 table LUA_DEBUG_CHECK(L, 0); RegisterCustomSystemsAPI(L); LUA_DEBUG_CHECK(L, 0); pi_lua_dofile_recursive(L, "systems"); LUA_DEBUG_END(L, 0); lua_close(L); }
static unsigned interpret_star_types(int *starTypes, lua_State *L, int idx) { LUA_DEBUG_START(L); luaL_checktype(L, idx, LUA_TTABLE); lua_pushvalue(L, idx); unsigned i; for (i = 0; i < 4; ++i) { int ty = SystemBody::TYPE_GRAVPOINT; lua_rawgeti(L, -1, i + 1); if (lua_type(L, -1) == LUA_TSTRING) { ty = LuaConstants::GetConstantFromArg(L, "BodyType", -1); if ((ty < SystemBody::TYPE_STAR_MIN || ty > SystemBody::TYPE_STAR_MAX) && ty != SystemBody::TYPE_GRAVPOINT) { luaL_error(L, "system star %d does not have a valid star type", i+1); // unreachable (longjmp in luaL_error) } } else if (!lua_isnil(L, -1)) { luaL_error(L, "system star %d is not a string constant", i+1); } lua_pop(L, 1); LUA_DEBUG_CHECK(L, 1); starTypes[i] = ty; if (ty == SystemBody::TYPE_GRAVPOINT) break; } lua_pop(L, 1); LUA_DEBUG_END(L, 0); return i; }
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); }
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 _add_children_to_sbody(lua_State *L, CustomSystemBody *sbody) { lua_checkstack(L, 5); // grow the stack if necessary LUA_DEBUG_START(L); int i = 0; while (true) { // first there's a body lua_rawgeti(L, -1, ++i); if (lua_isnil(L, -1)) { lua_pop(L, 1); break; } LUA_DEBUG_CHECK(L, 1); CustomSystemBody **csptr = l_csb_check_ptr(L, -1); CustomSystemBody *kid = *csptr; *csptr = 0; lua_pop(L, 1); LUA_DEBUG_CHECK(L, 0); // then there are any number of sub-tables containing direct children while (true) { lua_rawgeti(L, -1, i+1); LUA_DEBUG_CHECK(L, 1); if (!lua_istable(L, -1)) break; _add_children_to_sbody(L, kid); lua_pop(L, 1); LUA_DEBUG_CHECK(L, 0); ++i; } lua_pop(L, 1); LUA_DEBUG_CHECK(L, 0); //Output("add-children-to-body adding %s to %s\n", kid->name.c_str(), sbody->name.c_str()); sbody->children.push_back(kid); } //Output("add-children-to-body done for %s\n", sbody->name.c_str()); LUA_DEBUG_END(L, 0); }
//static void Faction::Init() { lua_State *L = luaL_newstate(); LUA_DEBUG_START(L); pi_lua_open_standard_base(L); LuaConstants::Register(L); LUA_DEBUG_CHECK(L, 0); RegisterFactionsAPI(L); LUA_DEBUG_CHECK(L, 0); pi_lua_dofile_recursive(L, "factions"); LUA_DEBUG_END(L, 0); lua_close(L); printf("Number of factions added: " SIZET_FMT "\n", s_factions.size()); StarSystem::ShrinkCache(); // clear the star system cache of anything we used for faction generation }
void FactionsDatabase::Init() { lua_State *L = luaL_newstate(); LUA_DEBUG_START(L); pi_lua_open_standard_base(L); LuaConstants::Register(L); LUA_DEBUG_CHECK(L, 0); RegisterFactionsAPI(L); LUA_DEBUG_CHECK(L, 0); pi_lua_dofile_recursive(L, "factions"); LUA_DEBUG_END(L, 0); lua_close(L); Output("Number of factions added: " SIZET_FMT "\n", m_factions.size()); ClearHomeSectors(); Pi::FlushCaches(); // clear caches of anything we used for faction generation while (!m_missingFactionsMap.empty()) { const std::string& factionName = m_missingFactionsMap.begin()->first; std::list<CustomSystem*>& csl = m_missingFactionsMap.begin()->second; while (!csl.empty()) { CustomSystem* cs = csl.front(); // FIXME: How to signal missing faction? fprintf(stderr, "Custom system %s referenced unknown faction %s\n", cs->name.c_str(), factionName.c_str()); csl.pop_front(); } m_missingFactionsMap.erase(m_missingFactionsMap.begin()); } m_initialized = true; SetHomeSectors(); }
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."); }
static void push_bindings(lua_State *l, const KeyBindings::BindingPrototype *protos) { LUA_DEBUG_START(l); lua_newtable(l); // [-1] bindings lua_pushnil(l); // [-2] bindings, [-1] group (no current group) assert(!protos[0].function); // first entry should be a group header int group_idx = 1; int binding_idx = 1; for (const KeyBindings::BindingPrototype *proto = protos; proto->label; ++proto) { if (! proto->function) { // start a new named binding group // [-2] bindings, [-1] group lua_pop(l, 1); // [-1] bindings lua_newtable(l); lua_pushstring(l, proto->label); lua_setfield(l, -2, "label"); // [-2] bindings, [-1] group lua_pushvalue(l, -1); // [-3] bindings, [-2] group, [-1] group copy lua_rawseti(l, -3, group_idx); ++group_idx; binding_idx = 1; } else { // key or axis binding prototype // [-2] bindings, [-1] group lua_createtable(l, 0, 5); // [-3] bindings, [-2] group, [-1] binding // fields are: type ('KEY' or 'AXIS'), id ('BindIncreaseSpeed'), label ('Increase Speed'), binding ('Key13'), bindingDescription ('') lua_pushstring(l, (proto->kb ? "KEY" : "AXIS")); lua_setfield(l, -2, "type"); lua_pushstring(l, proto->function); lua_setfield(l, -2, "id"); lua_pushstring(l, proto->label); lua_setfield(l, -2, "label"); if (proto->kb) { const KeyBindings::KeyBinding kb1 = proto->kb->binding1; if (kb1.Enabled()) { lua_pushstring(l, kb1.ToString().c_str()); lua_setfield(l, -2, "binding1"); lua_pushstring(l, kb1.Description().c_str()); lua_setfield(l, -2, "bindingDescription1"); } const KeyBindings::KeyBinding kb2 = proto->kb->binding2; if (kb2.Enabled()) { lua_pushstring(l, kb2.ToString().c_str()); lua_setfield(l, -2, "binding2"); lua_pushstring(l, kb2.Description().c_str()); lua_setfield(l, -2, "bindingDescription2"); } } else if (proto->ab) { const KeyBindings::AxisBinding &ab = *proto->ab; lua_pushstring(l, ab.ToString().c_str()); lua_setfield(l, -2, "binding1"); lua_pushstring(l, ab.Description().c_str()); lua_setfield(l, -2, "bindingDescription1"); } else { assert(0); // invalid prototype binding } // [-3] bindings, [-2] group, [-1] binding lua_rawseti(l, -2, binding_idx); ++binding_idx; } LUA_DEBUG_CHECK(l, 2); // [-2] bindings, [-1] group } // pop the group table (which should already have been put in the bindings table) lua_pop(l, 1); LUA_DEBUG_END(l, 1); }
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."); }