void Planet::Reset() { PopCenter::Reset(); ResourceCenter::Reset(); GetMeter(METER_SUPPLY)->Reset(); GetMeter(METER_MAX_SUPPLY)->Reset(); GetMeter(METER_SHIELD)->Reset(); GetMeter(METER_MAX_SHIELD)->Reset(); GetMeter(METER_DEFENSE)->Reset(); GetMeter(METER_MAX_DEFENSE)->Reset(); GetMeter(METER_DETECTION)->Reset(); GetMeter(METER_REBEL_TROOPS)->Reset(); if (m_is_about_to_be_colonized && !OwnedBy(ALL_EMPIRES)) { for (int building_id : m_buildings) if (auto building = GetBuilding(building_id)) building->Reset(); } m_just_conquered = false; m_is_about_to_be_colonized = false; m_is_about_to_be_invaded = false; m_is_about_to_be_bombarded = false; SetOwner(ALL_EMPIRES); }
void Planet::Reset() { PopCenter::Reset(); ResourceCenter::Reset(); GetMeter(METER_SUPPLY)->Reset(); GetMeter(METER_MAX_SUPPLY)->Reset(); GetMeter(METER_SHIELD)->Reset(); GetMeter(METER_MAX_SHIELD)->Reset(); GetMeter(METER_DEFENSE)->Reset(); GetMeter(METER_MAX_DEFENSE)->Reset(); GetMeter(METER_DETECTION)->Reset(); GetMeter(METER_REBEL_TROOPS)->Reset(); if (m_is_about_to_be_colonized && !OwnedBy(ALL_EMPIRES)) { for (std::set<int>::const_iterator it = m_buildings.begin(); it != m_buildings.end(); ++it) if (TemporaryPtr<Building> building = GetBuilding(*it)) building->Reset(); } m_just_conquered = false; m_is_about_to_be_colonized = false; m_is_about_to_be_invaded = false; m_is_about_to_be_bombarded = false; SetOwner(ALL_EMPIRES); }
const std::string& Fleet::PublicName(int empire_id) const { // Disclose real fleet name only to fleet owners. Rationale: a player might become suspicious if the incoming // foreign fleet is called "Decoy" if (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || OwnedBy(empire_id)) return Name(); else if (Unowned() && HasMonsters()) return UserString("MONSTERS"); else if (Unowned()) return UserString("FW_ROGUE_FLEET"); else return UserString("FW_FOREIGN_FLEET"); }
bool Planet::HostileToEmpire(int empire_id) const { if (OwnedBy(empire_id)) return false; // Empire owned planets are hostile to ALL_EMPIRES if (empire_id == ALL_EMPIRES) return !Unowned(); // Unowned planets are only considered hostile if populated auto pop_meter = GetMeter(METER_TARGET_POPULATION); if (Unowned()) return pop_meter && (pop_meter->Current() != 0.0f); // both empires are normal empires return Empires().GetDiplomaticStatus(Owner(), empire_id) == DIPLO_WAR; }
const std::string& Ship::PublicName(int empire_id) const { // Disclose real ship name only to fleet owners. Rationale: a player who // doesn't know the design for a particular ship can easily guess it if the // ship's name is "Scout" // An exception is made for unowned monsters. if (GetUniverse().AllObjectsVisible() || empire_id == ALL_EMPIRES || OwnedBy(empire_id) || (IsMonster() && Owner() == ALL_EMPIRES)) return Name(); const ShipDesign* design = Design(); if (design) return design->Name(); else if (IsMonster()) return UserString("SM_MONSTER"); else if (!Unowned()) return UserString("FW_FOREIGN_SHIP"); else if (Unowned() && GetVisibility(empire_id) > VIS_NO_VISIBILITY) return UserString("FW_ROGUE_SHIP"); else return UserString("OBJ_SHIP"); }
bool Planet::Colonize(int empire_id, const std::string& species_name, double population) { const Species* species = nullptr; // if desired pop > 0, we want a colony, not an outpost, so we need to do some checks if (population > 0.0) { // check if specified species exists and get reference species = GetSpecies(species_name); if (!species) { ErrorLogger() << "Planet::Colonize couldn't get species already on planet with name: " << species_name; return false; } // check if specified species can colonize this planet if (EnvironmentForSpecies(species_name) < PE_HOSTILE) { ErrorLogger() << "Planet::Colonize: can't colonize planet already populated by species " << species_name; return false; } } // reset the planet to unowned/unpopulated if (!OwnedBy(empire_id)) { Reset(); } else { PopCenter::Reset(); for (int building_id : m_buildings) if (auto building = GetBuilding(building_id)) building->Reset(); m_just_conquered = false; m_is_about_to_be_colonized = false; m_is_about_to_be_invaded = false; m_is_about_to_be_bombarded = false; SetOwner(ALL_EMPIRES); } // if desired pop > 0, we want a colony, not an outpost, so we have to set the colony species if (population > 0.0) SetSpecies(species_name); // find a default focus. use first defined available focus. // AvailableFoci function should return a vector of all names of // available foci. std::vector<std::string> available_foci = AvailableFoci(); if (species && !available_foci.empty()) { bool found_preference = false; for (const std::string& focus : available_foci) { if (!focus.empty() && focus == species->PreferredFocus()) { SetFocus(focus); found_preference = true; break; } } if (!found_preference) SetFocus(*available_foci.begin()); } else { DebugLogger() << "Planet::Colonize unable to find a focus to set for species " << species_name; } // set colony population GetMeter(METER_POPULATION)->SetCurrent(population); GetMeter(METER_TARGET_POPULATION)->SetCurrent(population); BackPropagateMeters(); // set specified empire as owner SetOwner(empire_id); // if there are buildings on the planet, set the specified empire as their owner too for (auto& building : Objects().FindObjects<Building>(BuildingIDs())) { building->SetOwner(empire_id); } return true; }