//// TEMPORARY float ShipDesign::Defense() const { // accumulate defense from defensive parts in design. double total_defense = 0.0; const PartTypeManager& part_manager = GetPartTypeManager(); std::vector<std::string> all_parts = Parts(); for (std::vector<std::string>::const_iterator it = all_parts.begin(); it != all_parts.end(); ++it) { const PartType* part = part_manager.GetPartType(*it); if (part && (part->Class() == PC_SHIELD || part->Class() == PC_ARMOUR)) total_defense += boost::get<float>(part->Stats()); } return total_defense; }
float ShipDesign::AdjustedAttack(float shield) const { // total damage against a target with the given shield. // accumulate attack stat from all weapon parts in design const PartTypeManager& manager = GetPartTypeManager(); float total_attack = 0.0f; std::vector<std::string> all_parts = Parts(); for (std::vector<std::string>::const_iterator it = all_parts.begin(); it != all_parts.end(); ++it) { const PartType* part = manager.GetPartType(*it); if (part && (part->Class() == PC_SHORT_RANGE || part->Class() == PC_POINT_DEFENSE || part->Class() == PC_MISSILES || part->Class() == PC_FIGHTERS)) { total_attack += std::max(0.0f, static_cast<float>(part->Capacity()) - shield); } } return total_attack; }
float ShipDesign::Attack() const { // accumulate attack stat from all weapon parts in design const PartTypeManager& manager = GetPartTypeManager(); float total_attack = 0.0f; std::vector<std::string> all_parts = Parts(); for (std::vector<std::string>::const_iterator it = all_parts.begin(); it != all_parts.end(); ++it) { const PartType* part = manager.GetPartType(*it); if (part) { if (part->Class() == PC_SHORT_RANGE || part->Class() == PC_POINT_DEFENSE) total_attack += boost::get<DirectFireStats>(part->Stats()).m_damage; else if (part->Class() == PC_MISSILES) total_attack += boost::get<LRStats>(part->Stats()).m_damage; else if (part->Class() == PC_FIGHTERS) total_attack += boost::get<FighterStats>(part->Stats()).m_anti_ship_damage; } } return total_attack; }
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 PartType* GetPartType(const std::string& name) { return GetPartTypeManager().GetPartType(name); }