void IApp::StartBackgroundParsing() { const auto& rdir = GetResourceDir(); GetBuildingTypeManager().SetBuildingTypes(Pending::StartParsing(parse::buildings, rdir / "scripting/buildings")); GetEncyclopedia().SetArticles(Pending::StartParsing(parse::encyclopedia_articles, rdir / "scripting/encyclopedia")); GetFieldTypeManager().SetFieldTypes(Pending::StartParsing(parse::fields, rdir / "scripting/fields")); GetSpecialsManager().SetSpecialsTypes(Pending::StartParsing(parse::specials, rdir / "scripting/specials")); GetSpeciesManager().SetSpeciesTypes(Pending::StartParsing(parse::species, rdir / "scripting/species")); GetPartTypeManager().SetPartTypes(Pending::StartParsing(parse::ship_parts, rdir / "scripting/ship_parts")); GetHullTypeManager().SetHullTypes(Pending::StartParsing(parse::ship_hulls, rdir / "scripting/ship_hulls")); GetPredefinedShipDesignManager().SetShipDesignTypes( Pending::StartParsing(parse::ship_designs, rdir / "scripting/ship_designs")); GetPredefinedShipDesignManager().SetMonsterDesignTypes( Pending::StartParsing(parse::ship_designs, rdir / "scripting/monster_designs")); GetGameRules().Add(Pending::StartParsing(parse::game_rules, rdir / "scripting/game_rules.focs.txt")); GetTechManager().SetTechs(Pending::StartParsing(parse::techs<TechManager::TechParseTuple>, rdir / "scripting/techs")); InitEmpireColors(rdir / "empire_colors.xml"); }
bool ShipDesign::ValidDesign(const std::string& hull, const std::vector<std::string>& parts) { // ensure hull type exists and has exactly enough slots for passed parts const HullType* hull_type = GetHullTypeManager().GetHullType(hull); if (!hull_type) { Logger().debugStream() << "ShipDesign::ValidDesign: hull not found: " << hull; return false; } unsigned int size = parts.size(); if (size > hull_type->NumSlots()) { Logger().debugStream() << "ShipDesign::ValidDesign: given " << size << " parts for hull with " << hull_type->NumSlots() << " slots"; return false; } const std::vector<HullType::Slot>& slots = hull_type->Slots(); // ensure all passed parts can be mounted in slots of type they were passed for const PartTypeManager& part_manager = GetPartTypeManager(); for (unsigned int i = 0; i < size; ++i) { const std::string& part_name = parts[i]; if (part_name.empty()) continue; // if part slot is empty, ignore - doesn't invalidate design const PartType* part = part_manager.GetPartType(part_name); if (!part) { Logger().debugStream() << "ShipDesign::ValidDesign: part not found: " << part_name; return false; } // verify part can mount in indicated slot ShipSlotType slot_type = slots[i].type; if (!(part->CanMountInSlotType(slot_type))) { Logger().debugStream() << "ShipDesign::ValidDesign: part " << part_name << " can't be mounted in " << boost::lexical_cast<std::string>(slot_type) << " slot"; return false; } } return true; }
const HullType* GetHullType(const std::string& name) { return GetHullTypeManager().GetHullType(name); }